[{"data":1,"prerenderedAt":6345},["ShallowReactive",2],{"docs:/docs/sdks/javascript":3},{"id":4,"title":5,"body":6,"description":6338,"extension":6339,"meta":6340,"navigation":64,"path":6341,"seo":6342,"stem":6343,"__hash__":6344},"docs/docs/sdks/javascript.md","JavaScript SDK",{"type":7,"value":8,"toc":6312},"minimark",[9,13,17,22,104,108,366,411,415,423,541,556,559,563,780,784,903,907,1406,1419,1423,1438,1661,1665,1978,1982,2241,2257,2261,2264,2597,2625,2629,2632,2921,2934,2938,2941,3117,3121,3225,3229,3232,3414,3419,3422,3586,3611,3615,3752,3764,3768,3775,3896,3908,3912,3915,4559,4563,4566,5124,5128,5160,5550,5554,5736,5740,6255,6259,6308],[10,11,5],"h1",{"id":12},"javascript-sdk",[14,15,16],"p",{},"The official NoLag SDK for JavaScript and TypeScript. Full TypeScript support\nwith comprehensive type definitions.",[18,19,21],"h2",{"id":20},"installation","Installation",[23,24,25],"code-tabs",{},[26,27,33],"pre",{"className":28,"code":29,"filename":30,"language":31,"meta":32,"style":32},"language-bash shiki shiki-themes github-light github-dark","# npm\nnpm install @nolag/js-sdk\n\n# yarn\nyarn add @nolag/js-sdk\n\n# pnpm\npnpm add @nolag/js-sdk\n","Terminal","bash","",[34,35,36,45,59,66,72,83,88,94],"code",{"__ignoreMap":32},[37,38,41],"span",{"class":39,"line":40},"line",1,[37,42,44],{"class":43},"sJ8bj","# npm\n",[37,46,48,52,56],{"class":39,"line":47},2,[37,49,51],{"class":50},"sScJk","npm",[37,53,55],{"class":54},"sZZnC"," install",[37,57,58],{"class":54}," @nolag/js-sdk\n",[37,60,62],{"class":39,"line":61},3,[37,63,65],{"emptyLinePlaceholder":64},true,"\n",[37,67,69],{"class":39,"line":68},4,[37,70,71],{"class":43},"# yarn\n",[37,73,75,78,81],{"class":39,"line":74},5,[37,76,77],{"class":50},"yarn",[37,79,80],{"class":54}," add",[37,82,58],{"class":54},[37,84,86],{"class":39,"line":85},6,[37,87,65],{"emptyLinePlaceholder":64},[37,89,91],{"class":39,"line":90},7,[37,92,93],{"class":43},"# pnpm\n",[37,95,97,100,102],{"class":39,"line":96},8,[37,98,99],{"class":50},"pnpm",[37,101,80],{"class":54},[37,103,58],{"class":54},[18,105,107],{"id":106},"quick-start","Quick Start",[23,109,110],{},[26,111,116],{"className":112,"code":113,"filename":114,"language":115,"meta":32,"style":32},"language-typescript shiki shiki-themes github-light github-dark","import { NoLag } from '@nolag/js-sdk'\n\n// Create client with access token\nconst client = NoLag('your-access-token')\n\n// Connect to NoLag\nawait client.connect()\n\n// Scope to an app and a room. APP_SLUG is the slug returned when you\n// created the app (slugs carry a random suffix, e.g. 'chat-a3f9').\nconst room = client.setApp(APP_SLUG).setRoom('general')\n\n// Subscribe to a topic in the room\nroom.subscribe('messages')\n\n// Listen for messages\nroom.on('messages', (data, meta) => {\n  console.log('Received:', data)\n})\n\n// Publish a message\nroom.emit('messages', { text: 'Hello!' })\n","TypeScript","typescript",[34,117,118,134,138,143,167,171,176,190,194,200,206,239,244,250,266,271,277,311,328,334,339,345],{"__ignoreMap":32},[37,119,120,124,128,131],{"class":39,"line":40},[37,121,123],{"class":122},"szBVR","import",[37,125,127],{"class":126},"sVt8B"," { NoLag } ",[37,129,130],{"class":122},"from",[37,132,133],{"class":54}," '@nolag/js-sdk'\n",[37,135,136],{"class":39,"line":47},[37,137,65],{"emptyLinePlaceholder":64},[37,139,140],{"class":39,"line":61},[37,141,142],{"class":43},"// Create client with access token\n",[37,144,145,148,152,155,158,161,164],{"class":39,"line":68},[37,146,147],{"class":122},"const",[37,149,151],{"class":150},"sj4cs"," client",[37,153,154],{"class":122}," =",[37,156,157],{"class":50}," NoLag",[37,159,160],{"class":126},"(",[37,162,163],{"class":54},"'your-access-token'",[37,165,166],{"class":126},")\n",[37,168,169],{"class":39,"line":74},[37,170,65],{"emptyLinePlaceholder":64},[37,172,173],{"class":39,"line":85},[37,174,175],{"class":43},"// Connect to NoLag\n",[37,177,178,181,184,187],{"class":39,"line":90},[37,179,180],{"class":122},"await",[37,182,183],{"class":126}," client.",[37,185,186],{"class":50},"connect",[37,188,189],{"class":126},"()\n",[37,191,192],{"class":39,"line":96},[37,193,65],{"emptyLinePlaceholder":64},[37,195,197],{"class":39,"line":196},9,[37,198,199],{"class":43},"// Scope to an app and a room. APP_SLUG is the slug returned when you\n",[37,201,203],{"class":39,"line":202},10,[37,204,205],{"class":43},"// created the app (slugs carry a random suffix, e.g. 'chat-a3f9').\n",[37,207,209,211,214,216,218,221,223,226,229,232,234,237],{"class":39,"line":208},11,[37,210,147],{"class":122},[37,212,213],{"class":150}," room",[37,215,154],{"class":122},[37,217,183],{"class":126},[37,219,220],{"class":50},"setApp",[37,222,160],{"class":126},[37,224,225],{"class":150},"APP_SLUG",[37,227,228],{"class":126},").",[37,230,231],{"class":50},"setRoom",[37,233,160],{"class":126},[37,235,236],{"class":54},"'general'",[37,238,166],{"class":126},[37,240,242],{"class":39,"line":241},12,[37,243,65],{"emptyLinePlaceholder":64},[37,245,247],{"class":39,"line":246},13,[37,248,249],{"class":43},"// Subscribe to a topic in the room\n",[37,251,253,256,259,261,264],{"class":39,"line":252},14,[37,254,255],{"class":126},"room.",[37,257,258],{"class":50},"subscribe",[37,260,160],{"class":126},[37,262,263],{"class":54},"'messages'",[37,265,166],{"class":126},[37,267,269],{"class":39,"line":268},15,[37,270,65],{"emptyLinePlaceholder":64},[37,272,274],{"class":39,"line":273},16,[37,275,276],{"class":43},"// Listen for messages\n",[37,278,280,282,285,287,289,292,296,299,302,305,308],{"class":39,"line":279},17,[37,281,255],{"class":126},[37,283,284],{"class":50},"on",[37,286,160],{"class":126},[37,288,263],{"class":54},[37,290,291],{"class":126},", (",[37,293,295],{"class":294},"s4XuR","data",[37,297,298],{"class":126},", ",[37,300,301],{"class":294},"meta",[37,303,304],{"class":126},") ",[37,306,307],{"class":122},"=>",[37,309,310],{"class":126}," {\n",[37,312,314,317,320,322,325],{"class":39,"line":313},18,[37,315,316],{"class":126},"  console.",[37,318,319],{"class":50},"log",[37,321,160],{"class":126},[37,323,324],{"class":54},"'Received:'",[37,326,327],{"class":126},", data)\n",[37,329,331],{"class":39,"line":330},19,[37,332,333],{"class":126},"})\n",[37,335,337],{"class":39,"line":336},20,[37,338,65],{"emptyLinePlaceholder":64},[37,340,342],{"class":39,"line":341},21,[37,343,344],{"class":43},"// Publish a message\n",[37,346,348,350,353,355,357,360,363],{"class":39,"line":347},22,[37,349,255],{"class":126},[37,351,352],{"class":50},"emit",[37,354,160],{"class":126},[37,356,263],{"class":54},[37,358,359],{"class":126},", { text: ",[37,361,362],{"class":54},"'Hello!'",[37,364,365],{"class":126}," })\n",[367,368,370],"callout",{"type":369},"info",[14,371,372,376,377,380,381,384,385,388,389,392,393,398,399,402,403,406,407,410],{},[373,374,375],"strong",{},"Topics live inside rooms."," The only hierarchy is ",[34,378,379],{},"app/room/topic",": the room context above addresses ",[34,382,383],{},"chat-a3f9/general/messages",". Topic names are single tokens (",[34,386,387],{},"[a-zA-Z0-9_:-]",", no ",[34,390,391],{},"/","). Rooms never exist implicitly: create them via the ",[394,395,397],"a",{"href":396},"#rest-api-client","REST API"," or the portal first, or subscribing returns ",[34,400,401],{},"unknown_topic"," (42940). App slugs always get a random 4-hex suffix, so read ",[34,404,405],{},"slug"," from the create response and pass that to ",[34,408,409],{},"setApp()",".",[18,412,414],{"id":413},"browser-authentication-token-provider","Browser Authentication (Token Provider)",[14,416,417,418,422],{},"In a browser, pass an async token provider instead of an access token string. The SDK calls it on every connect and reconnect, so each attempt authenticates with a fresh short-lived ",[394,419,421],{"href":420},"/docs/client-tokens","client token"," minted by your backend:",[23,424,425],{},[26,426,428],{"className":112,"code":427,"filename":114,"language":115,"meta":32,"style":32},"import { NoLag } from '@nolag/js-sdk'\n\nconst client = NoLag(async () => {\n  const res = await fetch('/api/nolag-token')\n  const { token } = await res.json()\n  return token\n})\n\nawait client.connect()\n",[34,429,430,440,444,466,489,515,523,527,531],{"__ignoreMap":32},[37,431,432,434,436,438],{"class":39,"line":40},[37,433,123],{"class":122},[37,435,127],{"class":126},[37,437,130],{"class":122},[37,439,133],{"class":54},[37,441,442],{"class":39,"line":47},[37,443,65],{"emptyLinePlaceholder":64},[37,445,446,448,450,452,454,456,459,462,464],{"class":39,"line":61},[37,447,147],{"class":122},[37,449,151],{"class":150},[37,451,154],{"class":122},[37,453,157],{"class":50},[37,455,160],{"class":126},[37,457,458],{"class":122},"async",[37,460,461],{"class":126}," () ",[37,463,307],{"class":122},[37,465,310],{"class":126},[37,467,468,471,474,476,479,482,484,487],{"class":39,"line":68},[37,469,470],{"class":122},"  const",[37,472,473],{"class":150}," res",[37,475,154],{"class":122},[37,477,478],{"class":122}," await",[37,480,481],{"class":50}," fetch",[37,483,160],{"class":126},[37,485,486],{"class":54},"'/api/nolag-token'",[37,488,166],{"class":126},[37,490,491,493,496,499,502,505,507,510,513],{"class":39,"line":74},[37,492,470],{"class":122},[37,494,495],{"class":126}," { ",[37,497,498],{"class":150},"token",[37,500,501],{"class":126}," } ",[37,503,504],{"class":122},"=",[37,506,478],{"class":122},[37,508,509],{"class":126}," res.",[37,511,512],{"class":50},"json",[37,514,189],{"class":126},[37,516,517,520],{"class":39,"line":85},[37,518,519],{"class":122},"  return",[37,521,522],{"class":126}," token\n",[37,524,525],{"class":39,"line":90},[37,526,333],{"class":126},[37,528,529],{"class":39,"line":96},[37,530,65],{"emptyLinePlaceholder":64},[37,532,533,535,537,539],{"class":39,"line":196},[37,534,180],{"class":122},[37,536,183],{"class":126},[37,538,186],{"class":50},[37,540,189],{"class":126},[14,542,543,544,547,548,551,552,555],{},"Import from ",[34,545,546],{},"@nolag/js-sdk",", the same entry point you use on the server. The package\ndeclares a ",[34,549,550],{},"browser"," export condition, so bundlers such as Vite, webpack, Next.js,\nand Rollup resolve the browser build automatically. There is no ",[34,553,554],{},"@nolag/js-sdk/browser","\nsubpath to import.",[14,557,558],{},"When the resolved token is a JWT, the SDK renews it in place shortly before expiry: a fresh token is minted by your provider and applied over the live connection, so nothing disconnects and token rotation is invisible to your application code. Older brokers fall back to a quick reconnect with server-side subscription restore.",[18,560,562],{"id":561},"connection-options","Connection Options",[23,564,565],{},[26,566,568],{"className":112,"code":567,"filename":114,"language":115,"meta":32,"style":32},"const client = NoLag('your-access-token', {\n  // Connection\n  url: 'wss://broker.nolag.app/ws',  // WebSocket URL (default)\n  reconnect: true,                    // Auto-reconnect (default: true)\n  reconnectInterval: 5000,            // Initial reconnect delay ms (default: 5000)\n\n  // Messaging\n  qos: 1,                             // Default QoS level: 0, 1, or 2 (default: 1)\n\n  // Load Balancing\n  loadBalance: false,                 // Enable load balancing (default: false)\n  loadBalanceGroup: 'worker-pool',    // Load balance group name\n\n  // Worker identity (agent and orchestrator actors only)\n  clientId: 'worker-1',               // Names this client instance\n\n  // Browser-specific\n  disconnectOnHidden: false,          // Disconnect when tab hidden (default: false)\n  heartbeatInterval: 30000,           // Heartbeat interval ms (default: 30000, 0 to disable)\n\n  // Debugging\n  debug: false,                       // Enable debug logging (default: false)\n})\n",[34,569,570,587,592,606,620,634,638,643,657,661,666,680,694,698,703,717,721,726,739,753,757,762,775],{"__ignoreMap":32},[37,571,572,574,576,578,580,582,584],{"class":39,"line":40},[37,573,147],{"class":122},[37,575,151],{"class":150},[37,577,154],{"class":122},[37,579,157],{"class":50},[37,581,160],{"class":126},[37,583,163],{"class":54},[37,585,586],{"class":126},", {\n",[37,588,589],{"class":39,"line":47},[37,590,591],{"class":43},"  // Connection\n",[37,593,594,597,600,603],{"class":39,"line":61},[37,595,596],{"class":126},"  url: ",[37,598,599],{"class":54},"'wss://broker.nolag.app/ws'",[37,601,602],{"class":126},",  ",[37,604,605],{"class":43},"// WebSocket URL (default)\n",[37,607,608,611,614,617],{"class":39,"line":68},[37,609,610],{"class":126},"  reconnect: ",[37,612,613],{"class":150},"true",[37,615,616],{"class":126},",                    ",[37,618,619],{"class":43},"// Auto-reconnect (default: true)\n",[37,621,622,625,628,631],{"class":39,"line":74},[37,623,624],{"class":126},"  reconnectInterval: ",[37,626,627],{"class":150},"5000",[37,629,630],{"class":126},",            ",[37,632,633],{"class":43},"// Initial reconnect delay ms (default: 5000)\n",[37,635,636],{"class":39,"line":85},[37,637,65],{"emptyLinePlaceholder":64},[37,639,640],{"class":39,"line":90},[37,641,642],{"class":43},"  // Messaging\n",[37,644,645,648,651,654],{"class":39,"line":96},[37,646,647],{"class":126},"  qos: ",[37,649,650],{"class":150},"1",[37,652,653],{"class":126},",                             ",[37,655,656],{"class":43},"// Default QoS level: 0, 1, or 2 (default: 1)\n",[37,658,659],{"class":39,"line":196},[37,660,65],{"emptyLinePlaceholder":64},[37,662,663],{"class":39,"line":202},[37,664,665],{"class":43},"  // Load Balancing\n",[37,667,668,671,674,677],{"class":39,"line":208},[37,669,670],{"class":126},"  loadBalance: ",[37,672,673],{"class":150},"false",[37,675,676],{"class":126},",                 ",[37,678,679],{"class":43},"// Enable load balancing (default: false)\n",[37,681,682,685,688,691],{"class":39,"line":241},[37,683,684],{"class":126},"  loadBalanceGroup: ",[37,686,687],{"class":54},"'worker-pool'",[37,689,690],{"class":126},",    ",[37,692,693],{"class":43},"// Load balance group name\n",[37,695,696],{"class":39,"line":246},[37,697,65],{"emptyLinePlaceholder":64},[37,699,700],{"class":39,"line":252},[37,701,702],{"class":43},"  // Worker identity (agent and orchestrator actors only)\n",[37,704,705,708,711,714],{"class":39,"line":268},[37,706,707],{"class":126},"  clientId: ",[37,709,710],{"class":54},"'worker-1'",[37,712,713],{"class":126},",               ",[37,715,716],{"class":43},"// Names this client instance\n",[37,718,719],{"class":39,"line":273},[37,720,65],{"emptyLinePlaceholder":64},[37,722,723],{"class":39,"line":279},[37,724,725],{"class":43},"  // Browser-specific\n",[37,727,728,731,733,736],{"class":39,"line":313},[37,729,730],{"class":126},"  disconnectOnHidden: ",[37,732,673],{"class":150},[37,734,735],{"class":126},",          ",[37,737,738],{"class":43},"// Disconnect when tab hidden (default: false)\n",[37,740,741,744,747,750],{"class":39,"line":330},[37,742,743],{"class":126},"  heartbeatInterval: ",[37,745,746],{"class":150},"30000",[37,748,749],{"class":126},",           ",[37,751,752],{"class":43},"// Heartbeat interval ms (default: 30000, 0 to disable)\n",[37,754,755],{"class":39,"line":336},[37,756,65],{"emptyLinePlaceholder":64},[37,758,759],{"class":39,"line":341},[37,760,761],{"class":43},"  // Debugging\n",[37,763,764,767,769,772],{"class":39,"line":347},[37,765,766],{"class":126},"  debug: ",[37,768,673],{"class":150},[37,770,771],{"class":126},",                       ",[37,773,774],{"class":43},"// Enable debug logging (default: false)\n",[37,776,778],{"class":39,"line":777},23,[37,779,333],{"class":126},[18,781,783],{"id":782},"connection-management","Connection Management",[23,785,786],{},[26,787,789],{"className":112,"code":788,"filename":114,"language":115,"meta":32,"style":32},"// Connect to NoLag\nawait client.connect()\n\n// Check connection status\nconsole.log(client.status)     // 'disconnected' | 'connecting' | 'connected' | 'reconnecting'\nconsole.log(client.connected)  // true or false\n\n// Disconnect (prevents auto-reconnect)\nclient.disconnect()\n\n// Access client info (available after connect)\nconsole.log(client.actorId)    // Your actor token ID\nconsole.log(client.actorType)  // 'device' | 'user' | 'service' | 'session' | 'agent' | 'orchestrator' | 'observer'\nconsole.log(client.projectId)  // Project ID\n",[34,790,791,795,805,809,814,827,839,843,848,858,862,867,879,891],{"__ignoreMap":32},[37,792,793],{"class":39,"line":40},[37,794,175],{"class":43},[37,796,797,799,801,803],{"class":39,"line":47},[37,798,180],{"class":122},[37,800,183],{"class":126},[37,802,186],{"class":50},[37,804,189],{"class":126},[37,806,807],{"class":39,"line":61},[37,808,65],{"emptyLinePlaceholder":64},[37,810,811],{"class":39,"line":68},[37,812,813],{"class":43},"// Check connection status\n",[37,815,816,819,821,824],{"class":39,"line":74},[37,817,818],{"class":126},"console.",[37,820,319],{"class":50},[37,822,823],{"class":126},"(client.status)     ",[37,825,826],{"class":43},"// 'disconnected' | 'connecting' | 'connected' | 'reconnecting'\n",[37,828,829,831,833,836],{"class":39,"line":85},[37,830,818],{"class":126},[37,832,319],{"class":50},[37,834,835],{"class":126},"(client.connected)  ",[37,837,838],{"class":43},"// true or false\n",[37,840,841],{"class":39,"line":90},[37,842,65],{"emptyLinePlaceholder":64},[37,844,845],{"class":39,"line":96},[37,846,847],{"class":43},"// Disconnect (prevents auto-reconnect)\n",[37,849,850,853,856],{"class":39,"line":196},[37,851,852],{"class":126},"client.",[37,854,855],{"class":50},"disconnect",[37,857,189],{"class":126},[37,859,860],{"class":39,"line":202},[37,861,65],{"emptyLinePlaceholder":64},[37,863,864],{"class":39,"line":208},[37,865,866],{"class":43},"// Access client info (available after connect)\n",[37,868,869,871,873,876],{"class":39,"line":241},[37,870,818],{"class":126},[37,872,319],{"class":50},[37,874,875],{"class":126},"(client.actorId)    ",[37,877,878],{"class":43},"// Your actor token ID\n",[37,880,881,883,885,888],{"class":39,"line":246},[37,882,818],{"class":126},[37,884,319],{"class":50},[37,886,887],{"class":126},"(client.actorType)  ",[37,889,890],{"class":43},"// 'device' | 'user' | 'service' | 'session' | 'agent' | 'orchestrator' | 'observer'\n",[37,892,893,895,897,900],{"class":39,"line":252},[37,894,818],{"class":126},[37,896,319],{"class":50},[37,898,899],{"class":126},"(client.projectId)  ",[37,901,902],{"class":43},"// Project ID\n",[18,904,906],{"id":905},"client-events","Client Events",[23,908,909],{},[26,910,912],{"className":112,"code":911,"filename":114,"language":115,"meta":32,"style":32},"// Connection established\nclient.on('connect', () => {\n  console.log('Connected to NoLag')\n})\n\n// Connection lost\nclient.on('disconnect', (reason) => {\n  console.log('Disconnected:', reason)\n})\n\n// Reconnection starting\nclient.on('reconnect', () => {\n  console.log('Attempting to reconnect...')\n})\n\n// Error occurred: NoLagServerError | NoLagEncodeError | Error (see Error Handling)\nclient.on('error', (error) => {\n  console.error('Error:', error.message)\n})\n\n// Hydration: with a hydration webhook configured on the app, the broker\n// sends the webhook's response body once per subscribe.\n// `topic` is the bare topic name, e.g. 'messages'.\nclient.on('hydration', ({ topic, data }) => {\n  console.log(`Initial state for ${topic}:`, data)\n})\n\n// Replay events: fired around a replay of queued messages. Replay only\n// happens for load-balanced worker groups whose actors hold a persistent\n// session. An ordinary reconnect restores subscriptions and replays nothing.\nclient.on('replay:start', (event) => {\n  // event: { count, oldestTimestamp?, newestTimestamp? }\n  console.log(`Replaying ${event.count} queued messages...`)\n})\n\nclient.on('replay:end', (event) => {\n  // event: { replayed }\n  console.log(`Replay complete: ${event.replayed} messages`)\n})\n\n// During replay, individual messages have meta.isReplay = true\nroom.on('messages', (data, meta) => {\n  if (meta.isReplay) {\n    console.log('Replayed message:', data)\n  } else {\n    console.log('Live message:', data)\n  }\n})\n",[34,913,914,919,937,950,954,958,963,985,999,1003,1007,1012,1029,1042,1046,1050,1055,1077,1091,1095,1099,1104,1109,1114,1143,1162,1167,1172,1178,1184,1190,1213,1219,1243,1248,1253,1275,1281,1305,1310,1315,1321,1346,1355,1370,1381,1395,1401],{"__ignoreMap":32},[37,915,916],{"class":39,"line":40},[37,917,918],{"class":43},"// Connection established\n",[37,920,921,923,925,927,930,933,935],{"class":39,"line":47},[37,922,852],{"class":126},[37,924,284],{"class":50},[37,926,160],{"class":126},[37,928,929],{"class":54},"'connect'",[37,931,932],{"class":126},", () ",[37,934,307],{"class":122},[37,936,310],{"class":126},[37,938,939,941,943,945,948],{"class":39,"line":61},[37,940,316],{"class":126},[37,942,319],{"class":50},[37,944,160],{"class":126},[37,946,947],{"class":54},"'Connected to NoLag'",[37,949,166],{"class":126},[37,951,952],{"class":39,"line":68},[37,953,333],{"class":126},[37,955,956],{"class":39,"line":74},[37,957,65],{"emptyLinePlaceholder":64},[37,959,960],{"class":39,"line":85},[37,961,962],{"class":43},"// Connection lost\n",[37,964,965,967,969,971,974,976,979,981,983],{"class":39,"line":90},[37,966,852],{"class":126},[37,968,284],{"class":50},[37,970,160],{"class":126},[37,972,973],{"class":54},"'disconnect'",[37,975,291],{"class":126},[37,977,978],{"class":294},"reason",[37,980,304],{"class":126},[37,982,307],{"class":122},[37,984,310],{"class":126},[37,986,987,989,991,993,996],{"class":39,"line":96},[37,988,316],{"class":126},[37,990,319],{"class":50},[37,992,160],{"class":126},[37,994,995],{"class":54},"'Disconnected:'",[37,997,998],{"class":126},", reason)\n",[37,1000,1001],{"class":39,"line":196},[37,1002,333],{"class":126},[37,1004,1005],{"class":39,"line":202},[37,1006,65],{"emptyLinePlaceholder":64},[37,1008,1009],{"class":39,"line":208},[37,1010,1011],{"class":43},"// Reconnection starting\n",[37,1013,1014,1016,1018,1020,1023,1025,1027],{"class":39,"line":241},[37,1015,852],{"class":126},[37,1017,284],{"class":50},[37,1019,160],{"class":126},[37,1021,1022],{"class":54},"'reconnect'",[37,1024,932],{"class":126},[37,1026,307],{"class":122},[37,1028,310],{"class":126},[37,1030,1031,1033,1035,1037,1040],{"class":39,"line":246},[37,1032,316],{"class":126},[37,1034,319],{"class":50},[37,1036,160],{"class":126},[37,1038,1039],{"class":54},"'Attempting to reconnect...'",[37,1041,166],{"class":126},[37,1043,1044],{"class":39,"line":252},[37,1045,333],{"class":126},[37,1047,1048],{"class":39,"line":268},[37,1049,65],{"emptyLinePlaceholder":64},[37,1051,1052],{"class":39,"line":273},[37,1053,1054],{"class":43},"// Error occurred: NoLagServerError | NoLagEncodeError | Error (see Error Handling)\n",[37,1056,1057,1059,1061,1063,1066,1068,1071,1073,1075],{"class":39,"line":279},[37,1058,852],{"class":126},[37,1060,284],{"class":50},[37,1062,160],{"class":126},[37,1064,1065],{"class":54},"'error'",[37,1067,291],{"class":126},[37,1069,1070],{"class":294},"error",[37,1072,304],{"class":126},[37,1074,307],{"class":122},[37,1076,310],{"class":126},[37,1078,1079,1081,1083,1085,1088],{"class":39,"line":313},[37,1080,316],{"class":126},[37,1082,1070],{"class":50},[37,1084,160],{"class":126},[37,1086,1087],{"class":54},"'Error:'",[37,1089,1090],{"class":126},", error.message)\n",[37,1092,1093],{"class":39,"line":330},[37,1094,333],{"class":126},[37,1096,1097],{"class":39,"line":336},[37,1098,65],{"emptyLinePlaceholder":64},[37,1100,1101],{"class":39,"line":341},[37,1102,1103],{"class":43},"// Hydration: with a hydration webhook configured on the app, the broker\n",[37,1105,1106],{"class":39,"line":347},[37,1107,1108],{"class":43},"// sends the webhook's response body once per subscribe.\n",[37,1110,1111],{"class":39,"line":777},[37,1112,1113],{"class":43},"// `topic` is the bare topic name, e.g. 'messages'.\n",[37,1115,1117,1119,1121,1123,1126,1129,1132,1134,1136,1139,1141],{"class":39,"line":1116},24,[37,1118,852],{"class":126},[37,1120,284],{"class":50},[37,1122,160],{"class":126},[37,1124,1125],{"class":54},"'hydration'",[37,1127,1128],{"class":126},", ({ ",[37,1130,1131],{"class":294},"topic",[37,1133,298],{"class":126},[37,1135,295],{"class":294},[37,1137,1138],{"class":126}," }) ",[37,1140,307],{"class":122},[37,1142,310],{"class":126},[37,1144,1146,1148,1150,1152,1155,1157,1160],{"class":39,"line":1145},25,[37,1147,316],{"class":126},[37,1149,319],{"class":50},[37,1151,160],{"class":126},[37,1153,1154],{"class":54},"`Initial state for ${",[37,1156,1131],{"class":126},[37,1158,1159],{"class":54},"}:`",[37,1161,327],{"class":126},[37,1163,1165],{"class":39,"line":1164},26,[37,1166,333],{"class":126},[37,1168,1170],{"class":39,"line":1169},27,[37,1171,65],{"emptyLinePlaceholder":64},[37,1173,1175],{"class":39,"line":1174},28,[37,1176,1177],{"class":43},"// Replay events: fired around a replay of queued messages. Replay only\n",[37,1179,1181],{"class":39,"line":1180},29,[37,1182,1183],{"class":43},"// happens for load-balanced worker groups whose actors hold a persistent\n",[37,1185,1187],{"class":39,"line":1186},30,[37,1188,1189],{"class":43},"// session. An ordinary reconnect restores subscriptions and replays nothing.\n",[37,1191,1193,1195,1197,1199,1202,1204,1207,1209,1211],{"class":39,"line":1192},31,[37,1194,852],{"class":126},[37,1196,284],{"class":50},[37,1198,160],{"class":126},[37,1200,1201],{"class":54},"'replay:start'",[37,1203,291],{"class":126},[37,1205,1206],{"class":294},"event",[37,1208,304],{"class":126},[37,1210,307],{"class":122},[37,1212,310],{"class":126},[37,1214,1216],{"class":39,"line":1215},32,[37,1217,1218],{"class":43},"  // event: { count, oldestTimestamp?, newestTimestamp? }\n",[37,1220,1222,1224,1226,1228,1231,1233,1235,1238,1241],{"class":39,"line":1221},33,[37,1223,316],{"class":126},[37,1225,319],{"class":50},[37,1227,160],{"class":126},[37,1229,1230],{"class":54},"`Replaying ${",[37,1232,1206],{"class":126},[37,1234,410],{"class":54},[37,1236,1237],{"class":126},"count",[37,1239,1240],{"class":54},"} queued messages...`",[37,1242,166],{"class":126},[37,1244,1246],{"class":39,"line":1245},34,[37,1247,333],{"class":126},[37,1249,1251],{"class":39,"line":1250},35,[37,1252,65],{"emptyLinePlaceholder":64},[37,1254,1256,1258,1260,1262,1265,1267,1269,1271,1273],{"class":39,"line":1255},36,[37,1257,852],{"class":126},[37,1259,284],{"class":50},[37,1261,160],{"class":126},[37,1263,1264],{"class":54},"'replay:end'",[37,1266,291],{"class":126},[37,1268,1206],{"class":294},[37,1270,304],{"class":126},[37,1272,307],{"class":122},[37,1274,310],{"class":126},[37,1276,1278],{"class":39,"line":1277},37,[37,1279,1280],{"class":43},"  // event: { replayed }\n",[37,1282,1284,1286,1288,1290,1293,1295,1297,1300,1303],{"class":39,"line":1283},38,[37,1285,316],{"class":126},[37,1287,319],{"class":50},[37,1289,160],{"class":126},[37,1291,1292],{"class":54},"`Replay complete: ${",[37,1294,1206],{"class":126},[37,1296,410],{"class":54},[37,1298,1299],{"class":126},"replayed",[37,1301,1302],{"class":54},"} messages`",[37,1304,166],{"class":126},[37,1306,1308],{"class":39,"line":1307},39,[37,1309,333],{"class":126},[37,1311,1313],{"class":39,"line":1312},40,[37,1314,65],{"emptyLinePlaceholder":64},[37,1316,1318],{"class":39,"line":1317},41,[37,1319,1320],{"class":43},"// During replay, individual messages have meta.isReplay = true\n",[37,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342,1344],{"class":39,"line":1323},42,[37,1325,255],{"class":126},[37,1327,284],{"class":50},[37,1329,160],{"class":126},[37,1331,263],{"class":54},[37,1333,291],{"class":126},[37,1335,295],{"class":294},[37,1337,298],{"class":126},[37,1339,301],{"class":294},[37,1341,304],{"class":126},[37,1343,307],{"class":122},[37,1345,310],{"class":126},[37,1347,1349,1352],{"class":39,"line":1348},43,[37,1350,1351],{"class":122},"  if",[37,1353,1354],{"class":126}," (meta.isReplay) {\n",[37,1356,1358,1361,1363,1365,1368],{"class":39,"line":1357},44,[37,1359,1360],{"class":126},"    console.",[37,1362,319],{"class":50},[37,1364,160],{"class":126},[37,1366,1367],{"class":54},"'Replayed message:'",[37,1369,327],{"class":126},[37,1371,1373,1376,1379],{"class":39,"line":1372},45,[37,1374,1375],{"class":126},"  } ",[37,1377,1378],{"class":122},"else",[37,1380,310],{"class":126},[37,1382,1384,1386,1388,1390,1393],{"class":39,"line":1383},46,[37,1385,1360],{"class":126},[37,1387,319],{"class":50},[37,1389,160],{"class":126},[37,1391,1392],{"class":54},"'Live message:'",[37,1394,327],{"class":126},[37,1396,1398],{"class":39,"line":1397},47,[37,1399,1400],{"class":126},"  }\n",[37,1402,1404],{"class":39,"line":1403},48,[37,1405,333],{"class":126},[14,1407,1408,1409,1413,1414,1418],{},"See ",[394,1410,1412],{"href":1411},"/docs/concepts/replay","Replay"," for when messages are queued, and\n",[394,1415,1417],{"href":1416},"/docs/concepts/webhooks","Webhooks"," for configuring hydration.",[18,1420,1422],{"id":1421},"subscribing-to-topics","Subscribing to Topics",[14,1424,1425,1426,1429,1430,1433,1434,1437],{},"Call ",[34,1427,1428],{},"subscribe()"," after ",[34,1431,1432],{},"connect()"," has resolved: on a disconnected client the\ncallback receives a ",[34,1435,1436],{},"Not connected"," error and nothing is sent. Subscriptions are\npersisted server-side and restored on reconnect.",[23,1439,1440],{},[26,1441,1443],{"className":112,"code":1442,"filename":114,"language":115,"meta":32,"style":32},"const room = client.setApp(APP_SLUG).setRoom('general')\n\n// Basic subscription\nroom.subscribe('messages')\n\n// With options\nroom.subscribe('messages', {\n  qos: 2,                        // Override default QoS\n  loadBalance: true,             // Enable load balancing for this topic\n  loadBalanceGroup: 'workers',   // Specific load balance group\n})\n\n// With acknowledgment callback\nroom.subscribe('messages', (error) => {\n  if (error) {\n    console.error('Subscribe failed:', error)\n  } else {\n    console.log('Subscribed successfully')\n  }\n})\n\n// Client-level equivalent: pass the full app/room/topic path yourself\nclient.subscribe(`${APP_SLUG}/general/messages`)\n",[34,1444,1445,1471,1475,1480,1492,1496,1501,1513,1526,1538,1551,1555,1559,1564,1584,1591,1605,1613,1626,1630,1634,1638,1643],{"__ignoreMap":32},[37,1446,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469],{"class":39,"line":40},[37,1448,147],{"class":122},[37,1450,213],{"class":150},[37,1452,154],{"class":122},[37,1454,183],{"class":126},[37,1456,220],{"class":50},[37,1458,160],{"class":126},[37,1460,225],{"class":150},[37,1462,228],{"class":126},[37,1464,231],{"class":50},[37,1466,160],{"class":126},[37,1468,236],{"class":54},[37,1470,166],{"class":126},[37,1472,1473],{"class":39,"line":47},[37,1474,65],{"emptyLinePlaceholder":64},[37,1476,1477],{"class":39,"line":61},[37,1478,1479],{"class":43},"// Basic subscription\n",[37,1481,1482,1484,1486,1488,1490],{"class":39,"line":68},[37,1483,255],{"class":126},[37,1485,258],{"class":50},[37,1487,160],{"class":126},[37,1489,263],{"class":54},[37,1491,166],{"class":126},[37,1493,1494],{"class":39,"line":74},[37,1495,65],{"emptyLinePlaceholder":64},[37,1497,1498],{"class":39,"line":85},[37,1499,1500],{"class":43},"// With options\n",[37,1502,1503,1505,1507,1509,1511],{"class":39,"line":90},[37,1504,255],{"class":126},[37,1506,258],{"class":50},[37,1508,160],{"class":126},[37,1510,263],{"class":54},[37,1512,586],{"class":126},[37,1514,1515,1517,1520,1523],{"class":39,"line":96},[37,1516,647],{"class":126},[37,1518,1519],{"class":150},"2",[37,1521,1522],{"class":126},",                        ",[37,1524,1525],{"class":43},"// Override default QoS\n",[37,1527,1528,1530,1532,1535],{"class":39,"line":196},[37,1529,670],{"class":126},[37,1531,613],{"class":150},[37,1533,1534],{"class":126},",             ",[37,1536,1537],{"class":43},"// Enable load balancing for this topic\n",[37,1539,1540,1542,1545,1548],{"class":39,"line":202},[37,1541,684],{"class":126},[37,1543,1544],{"class":54},"'workers'",[37,1546,1547],{"class":126},",   ",[37,1549,1550],{"class":43},"// Specific load balance group\n",[37,1552,1553],{"class":39,"line":208},[37,1554,333],{"class":126},[37,1556,1557],{"class":39,"line":241},[37,1558,65],{"emptyLinePlaceholder":64},[37,1560,1561],{"class":39,"line":246},[37,1562,1563],{"class":43},"// With acknowledgment callback\n",[37,1565,1566,1568,1570,1572,1574,1576,1578,1580,1582],{"class":39,"line":252},[37,1567,255],{"class":126},[37,1569,258],{"class":50},[37,1571,160],{"class":126},[37,1573,263],{"class":54},[37,1575,291],{"class":126},[37,1577,1070],{"class":294},[37,1579,304],{"class":126},[37,1581,307],{"class":122},[37,1583,310],{"class":126},[37,1585,1586,1588],{"class":39,"line":268},[37,1587,1351],{"class":122},[37,1589,1590],{"class":126}," (error) {\n",[37,1592,1593,1595,1597,1599,1602],{"class":39,"line":273},[37,1594,1360],{"class":126},[37,1596,1070],{"class":50},[37,1598,160],{"class":126},[37,1600,1601],{"class":54},"'Subscribe failed:'",[37,1603,1604],{"class":126},", error)\n",[37,1606,1607,1609,1611],{"class":39,"line":279},[37,1608,1375],{"class":126},[37,1610,1378],{"class":122},[37,1612,310],{"class":126},[37,1614,1615,1617,1619,1621,1624],{"class":39,"line":313},[37,1616,1360],{"class":126},[37,1618,319],{"class":50},[37,1620,160],{"class":126},[37,1622,1623],{"class":54},"'Subscribed successfully'",[37,1625,166],{"class":126},[37,1627,1628],{"class":39,"line":330},[37,1629,1400],{"class":126},[37,1631,1632],{"class":39,"line":336},[37,1633,333],{"class":126},[37,1635,1636],{"class":39,"line":341},[37,1637,65],{"emptyLinePlaceholder":64},[37,1639,1640],{"class":39,"line":347},[37,1641,1642],{"class":43},"// Client-level equivalent: pass the full app/room/topic path yourself\n",[37,1644,1645,1647,1649,1651,1654,1656,1659],{"class":39,"line":777},[37,1646,852],{"class":126},[37,1648,258],{"class":50},[37,1650,160],{"class":126},[37,1652,1653],{"class":54},"`${",[37,1655,225],{"class":150},[37,1657,1658],{"class":54},"}/general/messages`",[37,1660,166],{"class":126},[18,1662,1664],{"id":1663},"listening-for-messages","Listening for Messages",[23,1666,1667],{},[26,1668,1670],{"className":112,"code":1669,"filename":114,"language":115,"meta":32,"style":32},"// Listen to a specific topic in the room\nroom.on('messages', (data, meta) => {\n  console.log('Data:', data)\n  console.log('Message ID:', meta.msgId)     // Unique message ID\n  console.log('Is replay:', meta.isReplay)   // true if replayed from a persistent session queue\n  console.log('Filter:', meta.filter)        // Filter value (if published with one)\n})\n\n// Listen to all subscribed topics. `topic` is the full app/room/topic path\nclient.onAny((topic: string, data: unknown, meta: MessageMeta) => {\n  console.log(`[${topic}]`, data, meta)\n})\n\n// Remove a specific handler\nconst handler = (data, meta) => console.log(data)\nroom.on('messages', handler)\nroom.off('messages', handler)\n\n// Remove all handlers for a topic\nroom.off('messages')\n\n// Client-level equivalent: the full path\nclient.on(`${APP_SLUG}/general/messages`, (data, meta) => {\n  console.log(data)\n})\n",[34,1671,1672,1677,1701,1714,1731,1748,1765,1769,1773,1778,1820,1839,1843,1847,1852,1882,1895,1908,1912,1917,1929,1933,1938,1966,1974],{"__ignoreMap":32},[37,1673,1674],{"class":39,"line":40},[37,1675,1676],{"class":43},"// Listen to a specific topic in the room\n",[37,1678,1679,1681,1683,1685,1687,1689,1691,1693,1695,1697,1699],{"class":39,"line":47},[37,1680,255],{"class":126},[37,1682,284],{"class":50},[37,1684,160],{"class":126},[37,1686,263],{"class":54},[37,1688,291],{"class":126},[37,1690,295],{"class":294},[37,1692,298],{"class":126},[37,1694,301],{"class":294},[37,1696,304],{"class":126},[37,1698,307],{"class":122},[37,1700,310],{"class":126},[37,1702,1703,1705,1707,1709,1712],{"class":39,"line":61},[37,1704,316],{"class":126},[37,1706,319],{"class":50},[37,1708,160],{"class":126},[37,1710,1711],{"class":54},"'Data:'",[37,1713,327],{"class":126},[37,1715,1716,1718,1720,1722,1725,1728],{"class":39,"line":68},[37,1717,316],{"class":126},[37,1719,319],{"class":50},[37,1721,160],{"class":126},[37,1723,1724],{"class":54},"'Message ID:'",[37,1726,1727],{"class":126},", meta.msgId)     ",[37,1729,1730],{"class":43},"// Unique message ID\n",[37,1732,1733,1735,1737,1739,1742,1745],{"class":39,"line":74},[37,1734,316],{"class":126},[37,1736,319],{"class":50},[37,1738,160],{"class":126},[37,1740,1741],{"class":54},"'Is replay:'",[37,1743,1744],{"class":126},", meta.isReplay)   ",[37,1746,1747],{"class":43},"// true if replayed from a persistent session queue\n",[37,1749,1750,1752,1754,1756,1759,1762],{"class":39,"line":85},[37,1751,316],{"class":126},[37,1753,319],{"class":50},[37,1755,160],{"class":126},[37,1757,1758],{"class":54},"'Filter:'",[37,1760,1761],{"class":126},", meta.filter)        ",[37,1763,1764],{"class":43},"// Filter value (if published with one)\n",[37,1766,1767],{"class":39,"line":90},[37,1768,333],{"class":126},[37,1770,1771],{"class":39,"line":96},[37,1772,65],{"emptyLinePlaceholder":64},[37,1774,1775],{"class":39,"line":196},[37,1776,1777],{"class":43},"// Listen to all subscribed topics. `topic` is the full app/room/topic path\n",[37,1779,1780,1782,1785,1788,1790,1793,1796,1798,1800,1802,1805,1807,1809,1811,1814,1816,1818],{"class":39,"line":202},[37,1781,852],{"class":126},[37,1783,1784],{"class":50},"onAny",[37,1786,1787],{"class":126},"((",[37,1789,1131],{"class":294},[37,1791,1792],{"class":122},":",[37,1794,1795],{"class":150}," string",[37,1797,298],{"class":126},[37,1799,295],{"class":294},[37,1801,1792],{"class":122},[37,1803,1804],{"class":150}," unknown",[37,1806,298],{"class":126},[37,1808,301],{"class":294},[37,1810,1792],{"class":122},[37,1812,1813],{"class":50}," MessageMeta",[37,1815,304],{"class":126},[37,1817,307],{"class":122},[37,1819,310],{"class":126},[37,1821,1822,1824,1826,1828,1831,1833,1836],{"class":39,"line":208},[37,1823,316],{"class":126},[37,1825,319],{"class":50},[37,1827,160],{"class":126},[37,1829,1830],{"class":54},"`[${",[37,1832,1131],{"class":126},[37,1834,1835],{"class":54},"}]`",[37,1837,1838],{"class":126},", data, meta)\n",[37,1840,1841],{"class":39,"line":241},[37,1842,333],{"class":126},[37,1844,1845],{"class":39,"line":246},[37,1846,65],{"emptyLinePlaceholder":64},[37,1848,1849],{"class":39,"line":252},[37,1850,1851],{"class":43},"// Remove a specific handler\n",[37,1853,1854,1856,1859,1861,1864,1866,1868,1870,1872,1874,1877,1879],{"class":39,"line":268},[37,1855,147],{"class":122},[37,1857,1858],{"class":50}," handler",[37,1860,154],{"class":122},[37,1862,1863],{"class":126}," (",[37,1865,295],{"class":294},[37,1867,298],{"class":126},[37,1869,301],{"class":294},[37,1871,304],{"class":126},[37,1873,307],{"class":122},[37,1875,1876],{"class":126}," console.",[37,1878,319],{"class":50},[37,1880,1881],{"class":126},"(data)\n",[37,1883,1884,1886,1888,1890,1892],{"class":39,"line":273},[37,1885,255],{"class":126},[37,1887,284],{"class":50},[37,1889,160],{"class":126},[37,1891,263],{"class":54},[37,1893,1894],{"class":126},", handler)\n",[37,1896,1897,1899,1902,1904,1906],{"class":39,"line":279},[37,1898,255],{"class":126},[37,1900,1901],{"class":50},"off",[37,1903,160],{"class":126},[37,1905,263],{"class":54},[37,1907,1894],{"class":126},[37,1909,1910],{"class":39,"line":313},[37,1911,65],{"emptyLinePlaceholder":64},[37,1913,1914],{"class":39,"line":330},[37,1915,1916],{"class":43},"// Remove all handlers for a topic\n",[37,1918,1919,1921,1923,1925,1927],{"class":39,"line":336},[37,1920,255],{"class":126},[37,1922,1901],{"class":50},[37,1924,160],{"class":126},[37,1926,263],{"class":54},[37,1928,166],{"class":126},[37,1930,1931],{"class":39,"line":341},[37,1932,65],{"emptyLinePlaceholder":64},[37,1934,1935],{"class":39,"line":347},[37,1936,1937],{"class":43},"// Client-level equivalent: the full path\n",[37,1939,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964],{"class":39,"line":777},[37,1941,852],{"class":126},[37,1943,284],{"class":50},[37,1945,160],{"class":126},[37,1947,1653],{"class":54},[37,1949,225],{"class":150},[37,1951,1658],{"class":54},[37,1953,291],{"class":126},[37,1955,295],{"class":294},[37,1957,298],{"class":126},[37,1959,301],{"class":294},[37,1961,304],{"class":126},[37,1963,307],{"class":122},[37,1965,310],{"class":126},[37,1967,1968,1970,1972],{"class":39,"line":1116},[37,1969,316],{"class":126},[37,1971,319],{"class":50},[37,1973,1881],{"class":126},[37,1975,1976],{"class":39,"line":1145},[37,1977,333],{"class":126},[18,1979,1981],{"id":1980},"publishing-messages","Publishing Messages",[23,1983,1984],{},[26,1985,1987],{"className":112,"code":1986,"filename":114,"language":115,"meta":32,"style":32},"// Basic publish\nroom.emit('messages', { text: 'Hello!' })\n\n// With options\nroom.emit('messages', { text: 'Important' }, {\n  qos: 2,           // Override default QoS\n  filter: 'vip',    // Route to subscribers with this filter\n  echo: false,      // Per-connection flag; see the note below\n})\n\n// With acknowledgment callback (the broker's publish ack, protocol v2)\nroom.emit('messages', { text: 'Hello' }, (error) => {\n  if (error) {\n    console.error('Publish failed:', error)\n  } else {\n    console.log('Message sent')\n  }\n})\n\n// With options and callback\nroom.emit('messages', { text: 'Hello' }, { qos: 2 }, (error) => {\n  if (error) console.error(error)\n})\n\n// Client-level equivalent: the full path\nclient.emit(`${APP_SLUG}/general/messages`, { text: 'Hello!' })\n",[34,1988,1989,1994,2010,2014,2018,2036,2046,2059,2072,2076,2080,2085,2111,2117,2130,2138,2151,2155,2159,2163,2168,2197,2209,2213,2217,2221],{"__ignoreMap":32},[37,1990,1991],{"class":39,"line":40},[37,1992,1993],{"class":43},"// Basic publish\n",[37,1995,1996,1998,2000,2002,2004,2006,2008],{"class":39,"line":47},[37,1997,255],{"class":126},[37,1999,352],{"class":50},[37,2001,160],{"class":126},[37,2003,263],{"class":54},[37,2005,359],{"class":126},[37,2007,362],{"class":54},[37,2009,365],{"class":126},[37,2011,2012],{"class":39,"line":61},[37,2013,65],{"emptyLinePlaceholder":64},[37,2015,2016],{"class":39,"line":68},[37,2017,1500],{"class":43},[37,2019,2020,2022,2024,2026,2028,2030,2033],{"class":39,"line":74},[37,2021,255],{"class":126},[37,2023,352],{"class":50},[37,2025,160],{"class":126},[37,2027,263],{"class":54},[37,2029,359],{"class":126},[37,2031,2032],{"class":54},"'Important'",[37,2034,2035],{"class":126}," }, {\n",[37,2037,2038,2040,2042,2044],{"class":39,"line":85},[37,2039,647],{"class":126},[37,2041,1519],{"class":150},[37,2043,749],{"class":126},[37,2045,1525],{"class":43},[37,2047,2048,2051,2054,2056],{"class":39,"line":90},[37,2049,2050],{"class":126},"  filter: ",[37,2052,2053],{"class":54},"'vip'",[37,2055,690],{"class":126},[37,2057,2058],{"class":43},"// Route to subscribers with this filter\n",[37,2060,2061,2064,2066,2069],{"class":39,"line":96},[37,2062,2063],{"class":126},"  echo: ",[37,2065,673],{"class":150},[37,2067,2068],{"class":126},",      ",[37,2070,2071],{"class":43},"// Per-connection flag; see the note below\n",[37,2073,2074],{"class":39,"line":196},[37,2075,333],{"class":126},[37,2077,2078],{"class":39,"line":202},[37,2079,65],{"emptyLinePlaceholder":64},[37,2081,2082],{"class":39,"line":208},[37,2083,2084],{"class":43},"// With acknowledgment callback (the broker's publish ack, protocol v2)\n",[37,2086,2087,2089,2091,2093,2095,2097,2100,2103,2105,2107,2109],{"class":39,"line":241},[37,2088,255],{"class":126},[37,2090,352],{"class":50},[37,2092,160],{"class":126},[37,2094,263],{"class":54},[37,2096,359],{"class":126},[37,2098,2099],{"class":54},"'Hello'",[37,2101,2102],{"class":126}," }, (",[37,2104,1070],{"class":294},[37,2106,304],{"class":126},[37,2108,307],{"class":122},[37,2110,310],{"class":126},[37,2112,2113,2115],{"class":39,"line":246},[37,2114,1351],{"class":122},[37,2116,1590],{"class":126},[37,2118,2119,2121,2123,2125,2128],{"class":39,"line":252},[37,2120,1360],{"class":126},[37,2122,1070],{"class":50},[37,2124,160],{"class":126},[37,2126,2127],{"class":54},"'Publish failed:'",[37,2129,1604],{"class":126},[37,2131,2132,2134,2136],{"class":39,"line":268},[37,2133,1375],{"class":126},[37,2135,1378],{"class":122},[37,2137,310],{"class":126},[37,2139,2140,2142,2144,2146,2149],{"class":39,"line":273},[37,2141,1360],{"class":126},[37,2143,319],{"class":50},[37,2145,160],{"class":126},[37,2147,2148],{"class":54},"'Message sent'",[37,2150,166],{"class":126},[37,2152,2153],{"class":39,"line":279},[37,2154,1400],{"class":126},[37,2156,2157],{"class":39,"line":313},[37,2158,333],{"class":126},[37,2160,2161],{"class":39,"line":330},[37,2162,65],{"emptyLinePlaceholder":64},[37,2164,2165],{"class":39,"line":336},[37,2166,2167],{"class":43},"// With options and callback\n",[37,2169,2170,2172,2174,2176,2178,2180,2182,2185,2187,2189,2191,2193,2195],{"class":39,"line":341},[37,2171,255],{"class":126},[37,2173,352],{"class":50},[37,2175,160],{"class":126},[37,2177,263],{"class":54},[37,2179,359],{"class":126},[37,2181,2099],{"class":54},[37,2183,2184],{"class":126}," }, { qos: ",[37,2186,1519],{"class":150},[37,2188,2102],{"class":126},[37,2190,1070],{"class":294},[37,2192,304],{"class":126},[37,2194,307],{"class":122},[37,2196,310],{"class":126},[37,2198,2199,2201,2204,2206],{"class":39,"line":347},[37,2200,1351],{"class":122},[37,2202,2203],{"class":126}," (error) console.",[37,2205,1070],{"class":50},[37,2207,2208],{"class":126},"(error)\n",[37,2210,2211],{"class":39,"line":777},[37,2212,333],{"class":126},[37,2214,2215],{"class":39,"line":1116},[37,2216,65],{"emptyLinePlaceholder":64},[37,2218,2219],{"class":39,"line":1145},[37,2220,1937],{"class":43},[37,2222,2223,2225,2227,2229,2231,2233,2235,2237,2239],{"class":39,"line":1164},[37,2224,852],{"class":126},[37,2226,352],{"class":50},[37,2228,160],{"class":126},[37,2230,1653],{"class":54},[37,2232,225],{"class":150},[37,2234,1658],{"class":54},[37,2236,359],{"class":126},[37,2238,362],{"class":54},[37,2240,365],{"class":126},[367,2242,2243],{"type":369},[14,2244,2245,2248,2249,2252,2253,2256],{},[373,2246,2247],{},"Publishers never receive their own messages."," The broker drops a message before delivering it to the actor that published it, whatever ",[34,2250,2251],{},"echo"," is set to. Append your own message to the UI locally. ",[34,2254,2255],{},"echo: false"," only adds a per-connection drop for the rare case of two connections sharing one actor token.",[18,2258,2260],{"id":2259},"room-presence","Room Presence",[14,2262,2263],{},"Presence is scoped to rooms. Set it through the room context; presence events\narrive on the client:",[23,2265,2266],{},[26,2267,2269],{"className":112,"code":2268,"filename":114,"language":115,"meta":32,"style":32},"// Join a room and set presence\nconst room = client.setApp(APP_SLUG).setRoom('general')\n\nroom.setPresence({\n  username: 'Alice',\n  status: 'online',\n  avatar: '/img/alice.png'\n})\n\n// Get all actors in this room (from local cache)\nconst actors = room.getPresence()\nconsole.log('In room:', Object.keys(actors).length)\n\n// Fetch presence list from server (async)\nconst freshList = await room.fetchPresence()\n\n// Presence events are client-level. Each carries { actorTokenId, presence }\nclient.on('presence:join', (actor) => {\n  console.log(`${actor.presence.username} joined`)\n})\n\nclient.on('presence:leave', (actor) => {\n  console.log(`${actor.presence.username} left`)\n})\n\nclient.on('presence:update', (actor) => {\n  console.log(`${actor.presence.username} updated status`)\n})\n",[34,2270,2271,2276,2302,2306,2316,2327,2337,2345,2349,2353,2358,2375,2400,2404,2409,2427,2431,2436,2458,2485,2489,2493,2514,2539,2543,2547,2568,2593],{"__ignoreMap":32},[37,2272,2273],{"class":39,"line":40},[37,2274,2275],{"class":43},"// Join a room and set presence\n",[37,2277,2278,2280,2282,2284,2286,2288,2290,2292,2294,2296,2298,2300],{"class":39,"line":47},[37,2279,147],{"class":122},[37,2281,213],{"class":150},[37,2283,154],{"class":122},[37,2285,183],{"class":126},[37,2287,220],{"class":50},[37,2289,160],{"class":126},[37,2291,225],{"class":150},[37,2293,228],{"class":126},[37,2295,231],{"class":50},[37,2297,160],{"class":126},[37,2299,236],{"class":54},[37,2301,166],{"class":126},[37,2303,2304],{"class":39,"line":61},[37,2305,65],{"emptyLinePlaceholder":64},[37,2307,2308,2310,2313],{"class":39,"line":68},[37,2309,255],{"class":126},[37,2311,2312],{"class":50},"setPresence",[37,2314,2315],{"class":126},"({\n",[37,2317,2318,2321,2324],{"class":39,"line":74},[37,2319,2320],{"class":126},"  username: ",[37,2322,2323],{"class":54},"'Alice'",[37,2325,2326],{"class":126},",\n",[37,2328,2329,2332,2335],{"class":39,"line":85},[37,2330,2331],{"class":126},"  status: ",[37,2333,2334],{"class":54},"'online'",[37,2336,2326],{"class":126},[37,2338,2339,2342],{"class":39,"line":90},[37,2340,2341],{"class":126},"  avatar: ",[37,2343,2344],{"class":54},"'/img/alice.png'\n",[37,2346,2347],{"class":39,"line":96},[37,2348,333],{"class":126},[37,2350,2351],{"class":39,"line":196},[37,2352,65],{"emptyLinePlaceholder":64},[37,2354,2355],{"class":39,"line":202},[37,2356,2357],{"class":43},"// Get all actors in this room (from local cache)\n",[37,2359,2360,2362,2365,2367,2370,2373],{"class":39,"line":208},[37,2361,147],{"class":122},[37,2363,2364],{"class":150}," actors",[37,2366,154],{"class":122},[37,2368,2369],{"class":126}," room.",[37,2371,2372],{"class":50},"getPresence",[37,2374,189],{"class":126},[37,2376,2377,2379,2381,2383,2386,2389,2392,2395,2398],{"class":39,"line":241},[37,2378,818],{"class":126},[37,2380,319],{"class":50},[37,2382,160],{"class":126},[37,2384,2385],{"class":54},"'In room:'",[37,2387,2388],{"class":126},", Object.",[37,2390,2391],{"class":50},"keys",[37,2393,2394],{"class":126},"(actors).",[37,2396,2397],{"class":150},"length",[37,2399,166],{"class":126},[37,2401,2402],{"class":39,"line":246},[37,2403,65],{"emptyLinePlaceholder":64},[37,2405,2406],{"class":39,"line":252},[37,2407,2408],{"class":43},"// Fetch presence list from server (async)\n",[37,2410,2411,2413,2416,2418,2420,2422,2425],{"class":39,"line":268},[37,2412,147],{"class":122},[37,2414,2415],{"class":150}," freshList",[37,2417,154],{"class":122},[37,2419,478],{"class":122},[37,2421,2369],{"class":126},[37,2423,2424],{"class":50},"fetchPresence",[37,2426,189],{"class":126},[37,2428,2429],{"class":39,"line":273},[37,2430,65],{"emptyLinePlaceholder":64},[37,2432,2433],{"class":39,"line":279},[37,2434,2435],{"class":43},"// Presence events are client-level. Each carries { actorTokenId, presence }\n",[37,2437,2438,2440,2442,2444,2447,2449,2452,2454,2456],{"class":39,"line":313},[37,2439,852],{"class":126},[37,2441,284],{"class":50},[37,2443,160],{"class":126},[37,2445,2446],{"class":54},"'presence:join'",[37,2448,291],{"class":126},[37,2450,2451],{"class":294},"actor",[37,2453,304],{"class":126},[37,2455,307],{"class":122},[37,2457,310],{"class":126},[37,2459,2460,2462,2464,2466,2468,2470,2472,2475,2477,2480,2483],{"class":39,"line":330},[37,2461,316],{"class":126},[37,2463,319],{"class":50},[37,2465,160],{"class":126},[37,2467,1653],{"class":54},[37,2469,2451],{"class":126},[37,2471,410],{"class":54},[37,2473,2474],{"class":126},"presence",[37,2476,410],{"class":54},[37,2478,2479],{"class":126},"username",[37,2481,2482],{"class":54},"} joined`",[37,2484,166],{"class":126},[37,2486,2487],{"class":39,"line":336},[37,2488,333],{"class":126},[37,2490,2491],{"class":39,"line":341},[37,2492,65],{"emptyLinePlaceholder":64},[37,2494,2495,2497,2499,2501,2504,2506,2508,2510,2512],{"class":39,"line":347},[37,2496,852],{"class":126},[37,2498,284],{"class":50},[37,2500,160],{"class":126},[37,2502,2503],{"class":54},"'presence:leave'",[37,2505,291],{"class":126},[37,2507,2451],{"class":294},[37,2509,304],{"class":126},[37,2511,307],{"class":122},[37,2513,310],{"class":126},[37,2515,2516,2518,2520,2522,2524,2526,2528,2530,2532,2534,2537],{"class":39,"line":777},[37,2517,316],{"class":126},[37,2519,319],{"class":50},[37,2521,160],{"class":126},[37,2523,1653],{"class":54},[37,2525,2451],{"class":126},[37,2527,410],{"class":54},[37,2529,2474],{"class":126},[37,2531,410],{"class":54},[37,2533,2479],{"class":126},[37,2535,2536],{"class":54},"} left`",[37,2538,166],{"class":126},[37,2540,2541],{"class":39,"line":1116},[37,2542,333],{"class":126},[37,2544,2545],{"class":39,"line":1145},[37,2546,65],{"emptyLinePlaceholder":64},[37,2548,2549,2551,2553,2555,2558,2560,2562,2564,2566],{"class":39,"line":1164},[37,2550,852],{"class":126},[37,2552,284],{"class":50},[37,2554,160],{"class":126},[37,2556,2557],{"class":54},"'presence:update'",[37,2559,291],{"class":126},[37,2561,2451],{"class":294},[37,2563,304],{"class":126},[37,2565,307],{"class":122},[37,2567,310],{"class":126},[37,2569,2570,2572,2574,2576,2578,2580,2582,2584,2586,2588,2591],{"class":39,"line":1169},[37,2571,316],{"class":126},[37,2573,319],{"class":50},[37,2575,160],{"class":126},[37,2577,1653],{"class":54},[37,2579,2451],{"class":126},[37,2581,410],{"class":54},[37,2583,2474],{"class":126},[37,2585,410],{"class":54},[37,2587,2479],{"class":126},[37,2589,2590],{"class":54},"} updated status`",[37,2592,166],{"class":126},[37,2594,2595],{"class":39,"line":1174},[37,2596,333],{"class":126},[367,2598,2600],{"type":2599},"warning",[14,2601,2602,2605,2606,2609,2610,2613,2614,2617,2618,2621,2622,410],{},[373,2603,2604],{},"Presence events are not room events."," ",[34,2607,2608],{},"room.on('presence:join')"," registers a topic handler for ",[34,2611,2612],{},"app/room/presence:join"," and never fires; listen with ",[34,2615,2616],{},"client.on('presence:join')",". ",[34,2619,2620],{},"client.setPresence()"," without a room is deprecated and is not broadcast; use ",[34,2623,2624],{},"room.setPresence()",[18,2626,2628],{"id":2627},"lobbies-multi-room-presence","Lobbies (Multi-Room Presence)",[14,2630,2631],{},"Lobbies let you observe presence across multiple rooms. Use them for dashboards\nand monitoring interfaces:",[23,2633,2634],{},[26,2635,2637],{"className":112,"code":2636,"filename":114,"language":115,"meta":32,"style":32},"// Subscribe to a lobby to observe all rooms\nconst lobby = client.setApp(APP_SLUG).setLobby('active-trips')\n\n// Subscribe returns a snapshot of current presence\nconst snapshot = await lobby.subscribe()\n// snapshot: { roomId -> { actorId -> presenceData } }\nconsole.log('Active trips:', Object.keys(snapshot).length)\n\n// Listen for presence events (includes room context)\nlobby.on('presence:join', (event) => {\n  // event: { lobbyId, roomId, actorId, data }\n  console.log(`${event.actorId} joined room ${event.roomId}`)\n  addToMap(event.roomId, event.actorId, event.data)\n})\n\nlobby.on('presence:update', (event) => {\n  updateOnMap(event.roomId, event.actorId, event.data)\n})\n\nlobby.on('presence:leave', (event) => {\n  removeFromMap(event.roomId, event.actorId)\n})\n\n// Fetch fresh presence at any time\nconst freshPresence = await lobby.fetchPresence()\n\n// Unsubscribe when done\nlobby.unsubscribe()\n",[34,2638,2639,2644,2673,2677,2682,2700,2705,2727,2731,2736,2757,2762,2794,2802,2806,2810,2830,2837,2841,2845,2865,2873,2877,2881,2886,2903,2907,2912],{"__ignoreMap":32},[37,2640,2641],{"class":39,"line":40},[37,2642,2643],{"class":43},"// Subscribe to a lobby to observe all rooms\n",[37,2645,2646,2648,2651,2653,2655,2657,2659,2661,2663,2666,2668,2671],{"class":39,"line":47},[37,2647,147],{"class":122},[37,2649,2650],{"class":150}," lobby",[37,2652,154],{"class":122},[37,2654,183],{"class":126},[37,2656,220],{"class":50},[37,2658,160],{"class":126},[37,2660,225],{"class":150},[37,2662,228],{"class":126},[37,2664,2665],{"class":50},"setLobby",[37,2667,160],{"class":126},[37,2669,2670],{"class":54},"'active-trips'",[37,2672,166],{"class":126},[37,2674,2675],{"class":39,"line":61},[37,2676,65],{"emptyLinePlaceholder":64},[37,2678,2679],{"class":39,"line":68},[37,2680,2681],{"class":43},"// Subscribe returns a snapshot of current presence\n",[37,2683,2684,2686,2689,2691,2693,2696,2698],{"class":39,"line":74},[37,2685,147],{"class":122},[37,2687,2688],{"class":150}," snapshot",[37,2690,154],{"class":122},[37,2692,478],{"class":122},[37,2694,2695],{"class":126}," lobby.",[37,2697,258],{"class":50},[37,2699,189],{"class":126},[37,2701,2702],{"class":39,"line":85},[37,2703,2704],{"class":43},"// snapshot: { roomId -> { actorId -> presenceData } }\n",[37,2706,2707,2709,2711,2713,2716,2718,2720,2723,2725],{"class":39,"line":90},[37,2708,818],{"class":126},[37,2710,319],{"class":50},[37,2712,160],{"class":126},[37,2714,2715],{"class":54},"'Active trips:'",[37,2717,2388],{"class":126},[37,2719,2391],{"class":50},[37,2721,2722],{"class":126},"(snapshot).",[37,2724,2397],{"class":150},[37,2726,166],{"class":126},[37,2728,2729],{"class":39,"line":96},[37,2730,65],{"emptyLinePlaceholder":64},[37,2732,2733],{"class":39,"line":196},[37,2734,2735],{"class":43},"// Listen for presence events (includes room context)\n",[37,2737,2738,2741,2743,2745,2747,2749,2751,2753,2755],{"class":39,"line":202},[37,2739,2740],{"class":126},"lobby.",[37,2742,284],{"class":50},[37,2744,160],{"class":126},[37,2746,2446],{"class":54},[37,2748,291],{"class":126},[37,2750,1206],{"class":294},[37,2752,304],{"class":126},[37,2754,307],{"class":122},[37,2756,310],{"class":126},[37,2758,2759],{"class":39,"line":208},[37,2760,2761],{"class":43},"  // event: { lobbyId, roomId, actorId, data }\n",[37,2763,2764,2766,2768,2770,2772,2774,2776,2779,2782,2784,2786,2789,2792],{"class":39,"line":241},[37,2765,316],{"class":126},[37,2767,319],{"class":50},[37,2769,160],{"class":126},[37,2771,1653],{"class":54},[37,2773,1206],{"class":126},[37,2775,410],{"class":54},[37,2777,2778],{"class":126},"actorId",[37,2780,2781],{"class":54},"} joined room ${",[37,2783,1206],{"class":126},[37,2785,410],{"class":54},[37,2787,2788],{"class":126},"roomId",[37,2790,2791],{"class":54},"}`",[37,2793,166],{"class":126},[37,2795,2796,2799],{"class":39,"line":246},[37,2797,2798],{"class":50},"  addToMap",[37,2800,2801],{"class":126},"(event.roomId, event.actorId, event.data)\n",[37,2803,2804],{"class":39,"line":252},[37,2805,333],{"class":126},[37,2807,2808],{"class":39,"line":268},[37,2809,65],{"emptyLinePlaceholder":64},[37,2811,2812,2814,2816,2818,2820,2822,2824,2826,2828],{"class":39,"line":273},[37,2813,2740],{"class":126},[37,2815,284],{"class":50},[37,2817,160],{"class":126},[37,2819,2557],{"class":54},[37,2821,291],{"class":126},[37,2823,1206],{"class":294},[37,2825,304],{"class":126},[37,2827,307],{"class":122},[37,2829,310],{"class":126},[37,2831,2832,2835],{"class":39,"line":279},[37,2833,2834],{"class":50},"  updateOnMap",[37,2836,2801],{"class":126},[37,2838,2839],{"class":39,"line":313},[37,2840,333],{"class":126},[37,2842,2843],{"class":39,"line":330},[37,2844,65],{"emptyLinePlaceholder":64},[37,2846,2847,2849,2851,2853,2855,2857,2859,2861,2863],{"class":39,"line":336},[37,2848,2740],{"class":126},[37,2850,284],{"class":50},[37,2852,160],{"class":126},[37,2854,2503],{"class":54},[37,2856,291],{"class":126},[37,2858,1206],{"class":294},[37,2860,304],{"class":126},[37,2862,307],{"class":122},[37,2864,310],{"class":126},[37,2866,2867,2870],{"class":39,"line":341},[37,2868,2869],{"class":50},"  removeFromMap",[37,2871,2872],{"class":126},"(event.roomId, event.actorId)\n",[37,2874,2875],{"class":39,"line":347},[37,2876,333],{"class":126},[37,2878,2879],{"class":39,"line":777},[37,2880,65],{"emptyLinePlaceholder":64},[37,2882,2883],{"class":39,"line":1116},[37,2884,2885],{"class":43},"// Fetch fresh presence at any time\n",[37,2887,2888,2890,2893,2895,2897,2899,2901],{"class":39,"line":1145},[37,2889,147],{"class":122},[37,2891,2892],{"class":150}," freshPresence",[37,2894,154],{"class":122},[37,2896,478],{"class":122},[37,2898,2695],{"class":126},[37,2900,2424],{"class":50},[37,2902,189],{"class":126},[37,2904,2905],{"class":39,"line":1164},[37,2906,65],{"emptyLinePlaceholder":64},[37,2908,2909],{"class":39,"line":1169},[37,2910,2911],{"class":43},"// Unsubscribe when done\n",[37,2913,2914,2916,2919],{"class":39,"line":1174},[37,2915,2740],{"class":126},[37,2917,2918],{"class":50},"unsubscribe",[37,2920,189],{"class":126},[367,2922,2923],{"type":369},[14,2924,2925,2928,2929,2933],{},[373,2926,2927],{},"Read-only:"," Lobbies are for observation only. Actors set presence on rooms, not lobbies. See ",[394,2930,2932],{"href":2931},"/docs/concepts/lobbies","Lobbies documentation"," for details.",[18,2935,2937],{"id":2936},"fluent-api-scoped-pubsub","Fluent API (Scoped Pub/Sub)",[14,2939,2940],{},"Use the fluent API to scope subscriptions and messages to a specific app and room:",[23,2942,2943],{},[26,2944,2946],{"className":112,"code":2945,"filename":114,"language":115,"meta":32,"style":32},"// Create a room context. APP_SLUG is the suffixed slug from the create response\nconst room = client.setApp(APP_SLUG).setRoom('general')\n\n// Subscribe (topic is auto-prefixed, e.g. to 'chat-a3f9/general/messages')\nroom.subscribe('messages')\n\n// Listen for messages\nroom.on('messages', (data, meta) => {\n  console.log('Message:', data)\n})\n\n// Publish (also auto-prefixed)\nroom.emit('messages', { text: 'Hello room!' })\n\n// Get the full topic prefix\nconsole.log(room.prefix) // e.g. 'chat-a3f9/general'\n\n// Unsubscribe\nroom.unsubscribe('messages')\n",[34,2947,2948,2953,2979,2983,2988,3000,3004,3008,3032,3045,3049,3053,3058,3075,3079,3084,3096,3100,3105],{"__ignoreMap":32},[37,2949,2950],{"class":39,"line":40},[37,2951,2952],{"class":43},"// Create a room context. APP_SLUG is the suffixed slug from the create response\n",[37,2954,2955,2957,2959,2961,2963,2965,2967,2969,2971,2973,2975,2977],{"class":39,"line":47},[37,2956,147],{"class":122},[37,2958,213],{"class":150},[37,2960,154],{"class":122},[37,2962,183],{"class":126},[37,2964,220],{"class":50},[37,2966,160],{"class":126},[37,2968,225],{"class":150},[37,2970,228],{"class":126},[37,2972,231],{"class":50},[37,2974,160],{"class":126},[37,2976,236],{"class":54},[37,2978,166],{"class":126},[37,2980,2981],{"class":39,"line":61},[37,2982,65],{"emptyLinePlaceholder":64},[37,2984,2985],{"class":39,"line":68},[37,2986,2987],{"class":43},"// Subscribe (topic is auto-prefixed, e.g. to 'chat-a3f9/general/messages')\n",[37,2989,2990,2992,2994,2996,2998],{"class":39,"line":74},[37,2991,255],{"class":126},[37,2993,258],{"class":50},[37,2995,160],{"class":126},[37,2997,263],{"class":54},[37,2999,166],{"class":126},[37,3001,3002],{"class":39,"line":85},[37,3003,65],{"emptyLinePlaceholder":64},[37,3005,3006],{"class":39,"line":90},[37,3007,276],{"class":43},[37,3009,3010,3012,3014,3016,3018,3020,3022,3024,3026,3028,3030],{"class":39,"line":96},[37,3011,255],{"class":126},[37,3013,284],{"class":50},[37,3015,160],{"class":126},[37,3017,263],{"class":54},[37,3019,291],{"class":126},[37,3021,295],{"class":294},[37,3023,298],{"class":126},[37,3025,301],{"class":294},[37,3027,304],{"class":126},[37,3029,307],{"class":122},[37,3031,310],{"class":126},[37,3033,3034,3036,3038,3040,3043],{"class":39,"line":196},[37,3035,316],{"class":126},[37,3037,319],{"class":50},[37,3039,160],{"class":126},[37,3041,3042],{"class":54},"'Message:'",[37,3044,327],{"class":126},[37,3046,3047],{"class":39,"line":202},[37,3048,333],{"class":126},[37,3050,3051],{"class":39,"line":208},[37,3052,65],{"emptyLinePlaceholder":64},[37,3054,3055],{"class":39,"line":241},[37,3056,3057],{"class":43},"// Publish (also auto-prefixed)\n",[37,3059,3060,3062,3064,3066,3068,3070,3073],{"class":39,"line":246},[37,3061,255],{"class":126},[37,3063,352],{"class":50},[37,3065,160],{"class":126},[37,3067,263],{"class":54},[37,3069,359],{"class":126},[37,3071,3072],{"class":54},"'Hello room!'",[37,3074,365],{"class":126},[37,3076,3077],{"class":39,"line":252},[37,3078,65],{"emptyLinePlaceholder":64},[37,3080,3081],{"class":39,"line":268},[37,3082,3083],{"class":43},"// Get the full topic prefix\n",[37,3085,3086,3088,3090,3093],{"class":39,"line":273},[37,3087,818],{"class":126},[37,3089,319],{"class":50},[37,3091,3092],{"class":126},"(room.prefix) ",[37,3094,3095],{"class":43},"// e.g. 'chat-a3f9/general'\n",[37,3097,3098],{"class":39,"line":279},[37,3099,65],{"emptyLinePlaceholder":64},[37,3101,3102],{"class":39,"line":313},[37,3103,3104],{"class":43},"// Unsubscribe\n",[37,3106,3107,3109,3111,3113,3115],{"class":39,"line":330},[37,3108,255],{"class":126},[37,3110,2918],{"class":50},[37,3112,160],{"class":126},[37,3114,263],{"class":54},[37,3116,166],{"class":126},[18,3118,3120],{"id":3119},"unsubscribing","Unsubscribing",[23,3122,3123],{},[26,3124,3126],{"className":112,"code":3125,"filename":114,"language":115,"meta":32,"style":32},"// Unsubscribe from a topic in the room\nroom.unsubscribe('messages')\n\n// With callback\nroom.unsubscribe('messages', (error) => {\n  if (error) {\n    console.error('Unsubscribe failed:', error)\n  }\n})\n\n// Client-level equivalent: the full path\nclient.unsubscribe(`${APP_SLUG}/general/messages`)\n",[34,3127,3128,3133,3145,3149,3154,3174,3180,3193,3197,3201,3205,3209],{"__ignoreMap":32},[37,3129,3130],{"class":39,"line":40},[37,3131,3132],{"class":43},"// Unsubscribe from a topic in the room\n",[37,3134,3135,3137,3139,3141,3143],{"class":39,"line":47},[37,3136,255],{"class":126},[37,3138,2918],{"class":50},[37,3140,160],{"class":126},[37,3142,263],{"class":54},[37,3144,166],{"class":126},[37,3146,3147],{"class":39,"line":61},[37,3148,65],{"emptyLinePlaceholder":64},[37,3150,3151],{"class":39,"line":68},[37,3152,3153],{"class":43},"// With callback\n",[37,3155,3156,3158,3160,3162,3164,3166,3168,3170,3172],{"class":39,"line":74},[37,3157,255],{"class":126},[37,3159,2918],{"class":50},[37,3161,160],{"class":126},[37,3163,263],{"class":54},[37,3165,291],{"class":126},[37,3167,1070],{"class":294},[37,3169,304],{"class":126},[37,3171,307],{"class":122},[37,3173,310],{"class":126},[37,3175,3176,3178],{"class":39,"line":85},[37,3177,1351],{"class":122},[37,3179,1590],{"class":126},[37,3181,3182,3184,3186,3188,3191],{"class":39,"line":90},[37,3183,1360],{"class":126},[37,3185,1070],{"class":50},[37,3187,160],{"class":126},[37,3189,3190],{"class":54},"'Unsubscribe failed:'",[37,3192,1604],{"class":126},[37,3194,3195],{"class":39,"line":96},[37,3196,1400],{"class":126},[37,3198,3199],{"class":39,"line":196},[37,3200,333],{"class":126},[37,3202,3203],{"class":39,"line":202},[37,3204,65],{"emptyLinePlaceholder":64},[37,3206,3207],{"class":39,"line":208},[37,3208,1937],{"class":43},[37,3210,3211,3213,3215,3217,3219,3221,3223],{"class":39,"line":241},[37,3212,852],{"class":126},[37,3214,2918],{"class":50},[37,3216,160],{"class":126},[37,3218,1653],{"class":54},[37,3220,225],{"class":150},[37,3222,1658],{"class":54},[37,3224,166],{"class":126},[18,3226,3228],{"id":3227},"topic-filters","Topic Filters",[14,3230,3231],{},"Filters let you narrow message delivery to specific entities within a topic.\nInstead of receiving all updates on a topic, subscribe with filters to only\nget messages for the entities you care about.",[23,3233,3234],{},[26,3235,3237],{"className":112,"code":3236,"filename":114,"language":115,"meta":32,"style":32},"const room = client.setApp(APP_SLUG).setRoom('ops')\n\n// Subscribe with filters: only receive updates for these bookings\nroom.subscribe('bookings', {\n  filters: ['booking_1', 'booking_2']\n})\n\n// Listen for filtered messages\nroom.on('bookings', (data, meta) => {\n  console.log('Booking update:', data)\n  console.log('Filter:', meta.filter)  // e.g. 'booking_1'\n})\n\n// Publish to a specific filter\nroom.emit('bookings', { status: 'confirmed' }, {\n  filter: 'booking_1'  // Reaches subscribers with this filter, plus subscribers with no filters\n})\n",[34,3238,3239,3266,3270,3275,3288,3304,3308,3312,3317,3341,3354,3370,3374,3378,3383,3401,3410],{"__ignoreMap":32},[37,3240,3241,3243,3245,3247,3249,3251,3253,3255,3257,3259,3261,3264],{"class":39,"line":40},[37,3242,147],{"class":122},[37,3244,213],{"class":150},[37,3246,154],{"class":122},[37,3248,183],{"class":126},[37,3250,220],{"class":50},[37,3252,160],{"class":126},[37,3254,225],{"class":150},[37,3256,228],{"class":126},[37,3258,231],{"class":50},[37,3260,160],{"class":126},[37,3262,3263],{"class":54},"'ops'",[37,3265,166],{"class":126},[37,3267,3268],{"class":39,"line":47},[37,3269,65],{"emptyLinePlaceholder":64},[37,3271,3272],{"class":39,"line":61},[37,3273,3274],{"class":43},"// Subscribe with filters: only receive updates for these bookings\n",[37,3276,3277,3279,3281,3283,3286],{"class":39,"line":68},[37,3278,255],{"class":126},[37,3280,258],{"class":50},[37,3282,160],{"class":126},[37,3284,3285],{"class":54},"'bookings'",[37,3287,586],{"class":126},[37,3289,3290,3293,3296,3298,3301],{"class":39,"line":74},[37,3291,3292],{"class":126},"  filters: [",[37,3294,3295],{"class":54},"'booking_1'",[37,3297,298],{"class":126},[37,3299,3300],{"class":54},"'booking_2'",[37,3302,3303],{"class":126},"]\n",[37,3305,3306],{"class":39,"line":85},[37,3307,333],{"class":126},[37,3309,3310],{"class":39,"line":90},[37,3311,65],{"emptyLinePlaceholder":64},[37,3313,3314],{"class":39,"line":96},[37,3315,3316],{"class":43},"// Listen for filtered messages\n",[37,3318,3319,3321,3323,3325,3327,3329,3331,3333,3335,3337,3339],{"class":39,"line":196},[37,3320,255],{"class":126},[37,3322,284],{"class":50},[37,3324,160],{"class":126},[37,3326,3285],{"class":54},[37,3328,291],{"class":126},[37,3330,295],{"class":294},[37,3332,298],{"class":126},[37,3334,301],{"class":294},[37,3336,304],{"class":126},[37,3338,307],{"class":122},[37,3340,310],{"class":126},[37,3342,3343,3345,3347,3349,3352],{"class":39,"line":202},[37,3344,316],{"class":126},[37,3346,319],{"class":50},[37,3348,160],{"class":126},[37,3350,3351],{"class":54},"'Booking update:'",[37,3353,327],{"class":126},[37,3355,3356,3358,3360,3362,3364,3367],{"class":39,"line":208},[37,3357,316],{"class":126},[37,3359,319],{"class":50},[37,3361,160],{"class":126},[37,3363,1758],{"class":54},[37,3365,3366],{"class":126},", meta.filter)  ",[37,3368,3369],{"class":43},"// e.g. 'booking_1'\n",[37,3371,3372],{"class":39,"line":241},[37,3373,333],{"class":126},[37,3375,3376],{"class":39,"line":246},[37,3377,65],{"emptyLinePlaceholder":64},[37,3379,3380],{"class":39,"line":252},[37,3381,3382],{"class":43},"// Publish to a specific filter\n",[37,3384,3385,3387,3389,3391,3393,3396,3399],{"class":39,"line":268},[37,3386,255],{"class":126},[37,3388,352],{"class":50},[37,3390,160],{"class":126},[37,3392,3285],{"class":54},[37,3394,3395],{"class":126},", { status: ",[37,3397,3398],{"class":54},"'confirmed'",[37,3400,2035],{"class":126},[37,3402,3403,3405,3407],{"class":39,"line":273},[37,3404,2050],{"class":126},[37,3406,3295],{"class":54},[37,3408,3409],{"class":43},"  // Reaches subscribers with this filter, plus subscribers with no filters\n",[37,3411,3412],{"class":39,"line":279},[37,3413,333],{"class":126},[3415,3416,3418],"h3",{"id":3417},"dynamic-filter-management","Dynamic Filter Management",[14,3420,3421],{},"Change filters at any time without resubscribing:",[23,3423,3424],{},[26,3425,3427],{"className":112,"code":3426,"filename":114,"language":115,"meta":32,"style":32},"// Replace all filters for a topic\nroom.setFilters('bookings', ['booking_3', 'booking_4'])\n\n// Add filters to existing set\nroom.addFilters('bookings', ['booking_5'])\n\n// Remove specific filters\nroom.removeFilters('bookings', ['booking_3'])\n\n// Client-level equivalents take the full path\nclient.setFilters(`${APP_SLUG}/ops/bookings`, ['booking_2', 'booking_3'])\nclient.addFilters(`${APP_SLUG}/ops/bookings`, ['booking_4'])\nclient.removeFilters(`${APP_SLUG}/ops/bookings`, ['booking_2'])\n",[34,3428,3429,3434,3459,3463,3468,3486,3490,3495,3512,3516,3521,3546,3566],{"__ignoreMap":32},[37,3430,3431],{"class":39,"line":40},[37,3432,3433],{"class":43},"// Replace all filters for a topic\n",[37,3435,3436,3438,3441,3443,3445,3448,3451,3453,3456],{"class":39,"line":47},[37,3437,255],{"class":126},[37,3439,3440],{"class":50},"setFilters",[37,3442,160],{"class":126},[37,3444,3285],{"class":54},[37,3446,3447],{"class":126},", [",[37,3449,3450],{"class":54},"'booking_3'",[37,3452,298],{"class":126},[37,3454,3455],{"class":54},"'booking_4'",[37,3457,3458],{"class":126},"])\n",[37,3460,3461],{"class":39,"line":61},[37,3462,65],{"emptyLinePlaceholder":64},[37,3464,3465],{"class":39,"line":68},[37,3466,3467],{"class":43},"// Add filters to existing set\n",[37,3469,3470,3472,3475,3477,3479,3481,3484],{"class":39,"line":74},[37,3471,255],{"class":126},[37,3473,3474],{"class":50},"addFilters",[37,3476,160],{"class":126},[37,3478,3285],{"class":54},[37,3480,3447],{"class":126},[37,3482,3483],{"class":54},"'booking_5'",[37,3485,3458],{"class":126},[37,3487,3488],{"class":39,"line":85},[37,3489,65],{"emptyLinePlaceholder":64},[37,3491,3492],{"class":39,"line":90},[37,3493,3494],{"class":43},"// Remove specific filters\n",[37,3496,3497,3499,3502,3504,3506,3508,3510],{"class":39,"line":96},[37,3498,255],{"class":126},[37,3500,3501],{"class":50},"removeFilters",[37,3503,160],{"class":126},[37,3505,3285],{"class":54},[37,3507,3447],{"class":126},[37,3509,3450],{"class":54},[37,3511,3458],{"class":126},[37,3513,3514],{"class":39,"line":196},[37,3515,65],{"emptyLinePlaceholder":64},[37,3517,3518],{"class":39,"line":202},[37,3519,3520],{"class":43},"// Client-level equivalents take the full path\n",[37,3522,3523,3525,3527,3529,3531,3533,3536,3538,3540,3542,3544],{"class":39,"line":208},[37,3524,852],{"class":126},[37,3526,3440],{"class":50},[37,3528,160],{"class":126},[37,3530,1653],{"class":54},[37,3532,225],{"class":150},[37,3534,3535],{"class":54},"}/ops/bookings`",[37,3537,3447],{"class":126},[37,3539,3300],{"class":54},[37,3541,298],{"class":126},[37,3543,3450],{"class":54},[37,3545,3458],{"class":126},[37,3547,3548,3550,3552,3554,3556,3558,3560,3562,3564],{"class":39,"line":241},[37,3549,852],{"class":126},[37,3551,3474],{"class":50},[37,3553,160],{"class":126},[37,3555,1653],{"class":54},[37,3557,225],{"class":150},[37,3559,3535],{"class":54},[37,3561,3447],{"class":126},[37,3563,3455],{"class":54},[37,3565,3458],{"class":126},[37,3567,3568,3570,3572,3574,3576,3578,3580,3582,3584],{"class":39,"line":246},[37,3569,852],{"class":126},[37,3571,3501],{"class":50},[37,3573,160],{"class":126},[37,3575,1653],{"class":54},[37,3577,225],{"class":150},[37,3579,3535],{"class":54},[37,3581,3447],{"class":126},[37,3583,3300],{"class":54},[37,3585,3458],{"class":126},[367,3587,3588],{"type":369},[14,3589,3590,3593,3594,298,3596,298,3599,3602,3603,3606,3607,410],{},[373,3591,3592],{},"No filters = wildcard:"," Subscribing without filters receives all messages on the topic, including filtered publishes. Subscribing with filters only receives messages published with a matching filter. Messages published without a filter are only delivered to wildcard (no-filter) subscribers. Each filter is its own routing key, not a privacy boundary. Max 100 filters per topic; values must not contain ",[34,3595,391],{},[34,3597,3598],{},"#",[34,3600,3601],{},"+"," or ",[34,3604,3605],{},"|",". See ",[394,3608,3610],{"href":3609},"/docs/concepts/filters","Filters",[18,3612,3614],{"id":3613},"quality-of-service-qos","Quality of Service (QoS)",[23,3616,3617],{},[26,3618,3620],{"className":112,"code":3619,"filename":114,"language":115,"meta":32,"style":32},"// Set the default QoS for all messages (default: 1)\nconst client = NoLag(token, { qos: 1 })\nconst room = client.setApp(APP_SLUG).setRoom('general')\n\n// QoS 0: at most once on the broker hop (fire and forget)\nroom.emit('telemetry', data, { qos: 0 })\n\n// QoS 1: at least once on the broker hop (default)\nroom.emit('orders', order, { qos: 1 })\n\n// QoS 2: deduplicated on the broker hop\nroom.emit('payments', payment, { qos: 2 })\n",[34,3621,3622,3627,3644,3670,3674,3679,3698,3702,3707,3725,3729,3734],{"__ignoreMap":32},[37,3623,3624],{"class":39,"line":40},[37,3625,3626],{"class":43},"// Set the default QoS for all messages (default: 1)\n",[37,3628,3629,3631,3633,3635,3637,3640,3642],{"class":39,"line":47},[37,3630,147],{"class":122},[37,3632,151],{"class":150},[37,3634,154],{"class":122},[37,3636,157],{"class":50},[37,3638,3639],{"class":126},"(token, { qos: ",[37,3641,650],{"class":150},[37,3643,365],{"class":126},[37,3645,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666,3668],{"class":39,"line":61},[37,3647,147],{"class":122},[37,3649,213],{"class":150},[37,3651,154],{"class":122},[37,3653,183],{"class":126},[37,3655,220],{"class":50},[37,3657,160],{"class":126},[37,3659,225],{"class":150},[37,3661,228],{"class":126},[37,3663,231],{"class":50},[37,3665,160],{"class":126},[37,3667,236],{"class":54},[37,3669,166],{"class":126},[37,3671,3672],{"class":39,"line":68},[37,3673,65],{"emptyLinePlaceholder":64},[37,3675,3676],{"class":39,"line":74},[37,3677,3678],{"class":43},"// QoS 0: at most once on the broker hop (fire and forget)\n",[37,3680,3681,3683,3685,3687,3690,3693,3696],{"class":39,"line":85},[37,3682,255],{"class":126},[37,3684,352],{"class":50},[37,3686,160],{"class":126},[37,3688,3689],{"class":54},"'telemetry'",[37,3691,3692],{"class":126},", data, { qos: ",[37,3694,3695],{"class":150},"0",[37,3697,365],{"class":126},[37,3699,3700],{"class":39,"line":90},[37,3701,65],{"emptyLinePlaceholder":64},[37,3703,3704],{"class":39,"line":96},[37,3705,3706],{"class":43},"// QoS 1: at least once on the broker hop (default)\n",[37,3708,3709,3711,3713,3715,3718,3721,3723],{"class":39,"line":196},[37,3710,255],{"class":126},[37,3712,352],{"class":50},[37,3714,160],{"class":126},[37,3716,3717],{"class":54},"'orders'",[37,3719,3720],{"class":126},", order, { qos: ",[37,3722,650],{"class":150},[37,3724,365],{"class":126},[37,3726,3727],{"class":39,"line":202},[37,3728,65],{"emptyLinePlaceholder":64},[37,3730,3731],{"class":39,"line":208},[37,3732,3733],{"class":43},"// QoS 2: deduplicated on the broker hop\n",[37,3735,3736,3738,3740,3742,3745,3748,3750],{"class":39,"line":241},[37,3737,255],{"class":126},[37,3739,352],{"class":50},[37,3741,160],{"class":126},[37,3743,3744],{"class":54},"'payments'",[37,3746,3747],{"class":126},", payment, { qos: ",[37,3749,1519],{"class":150},[37,3751,365],{"class":126},[367,3753,3754],{"type":2599},[14,3755,3756,3759,3760,410],{},[373,3757,3758],{},"QoS is a broker-hop setting, not an end-to-end guarantee."," The level is validated (0, 1 or 2) and passed to the broker's internal MQTT hop. The WebSocket leg has an optional publish ack (surfaced as the emit callback) and no resend, so no level is an end-to-end delivery guarantee. Deduplicate with an idempotency key if a message must not be applied twice. See ",[394,3761,3763],{"href":3762},"/docs/concepts/qos","QoS",[18,3765,3767],{"id":3766},"load-balancing","Load Balancing",[14,3769,3770,3771,3774],{},"Load balancing is opt-in. Without it every subscriber receives every message.\nWith it, subscribers that share a ",[34,3772,3773],{},"loadBalanceGroup"," form a group and each\nmessage is delivered to one member of the group:",[23,3776,3777],{},[26,3778,3780],{"className":112,"code":3779,"filename":114,"language":115,"meta":32,"style":32},"// Enable for all subscriptions\nconst client = NoLag(token, {\n  loadBalance: true,\n  loadBalanceGroup: 'worker-pool-1'\n})\n\n// Or per-subscription\nconst room = client.setApp(APP_SLUG).setRoom('image-processing')\nroom.subscribe('jobs', {\n  loadBalance: true,\n  loadBalanceGroup: 'job-workers'\n})\n\n// Only ONE client in the group receives each message\n",[34,3781,3782,3787,3800,3808,3815,3819,3823,3828,3855,3868,3876,3883,3887,3891],{"__ignoreMap":32},[37,3783,3784],{"class":39,"line":40},[37,3785,3786],{"class":43},"// Enable for all subscriptions\n",[37,3788,3789,3791,3793,3795,3797],{"class":39,"line":47},[37,3790,147],{"class":122},[37,3792,151],{"class":150},[37,3794,154],{"class":122},[37,3796,157],{"class":50},[37,3798,3799],{"class":126},"(token, {\n",[37,3801,3802,3804,3806],{"class":39,"line":61},[37,3803,670],{"class":126},[37,3805,613],{"class":150},[37,3807,2326],{"class":126},[37,3809,3810,3812],{"class":39,"line":68},[37,3811,684],{"class":126},[37,3813,3814],{"class":54},"'worker-pool-1'\n",[37,3816,3817],{"class":39,"line":74},[37,3818,333],{"class":126},[37,3820,3821],{"class":39,"line":85},[37,3822,65],{"emptyLinePlaceholder":64},[37,3824,3825],{"class":39,"line":90},[37,3826,3827],{"class":43},"// Or per-subscription\n",[37,3829,3830,3832,3834,3836,3838,3840,3842,3844,3846,3848,3850,3853],{"class":39,"line":96},[37,3831,147],{"class":122},[37,3833,213],{"class":150},[37,3835,154],{"class":122},[37,3837,183],{"class":126},[37,3839,220],{"class":50},[37,3841,160],{"class":126},[37,3843,225],{"class":150},[37,3845,228],{"class":126},[37,3847,231],{"class":50},[37,3849,160],{"class":126},[37,3851,3852],{"class":54},"'image-processing'",[37,3854,166],{"class":126},[37,3856,3857,3859,3861,3863,3866],{"class":39,"line":196},[37,3858,255],{"class":126},[37,3860,258],{"class":50},[37,3862,160],{"class":126},[37,3864,3865],{"class":54},"'jobs'",[37,3867,586],{"class":126},[37,3869,3870,3872,3874],{"class":39,"line":202},[37,3871,670],{"class":126},[37,3873,613],{"class":150},[37,3875,2326],{"class":126},[37,3877,3878,3880],{"class":39,"line":208},[37,3879,684],{"class":126},[37,3881,3882],{"class":54},"'job-workers'\n",[37,3884,3885],{"class":39,"line":241},[37,3886,333],{"class":126},[37,3888,3889],{"class":39,"line":246},[37,3890,65],{"emptyLinePlaceholder":64},[37,3892,3893],{"class":39,"line":252},[37,3894,3895],{"class":43},"// Only ONE client in the group receives each message\n",[14,3897,3898,3899,298,3902,3905,3906,410],{},"Workers whose actor type holds a persistent session (",[34,3900,3901],{},"agent",[34,3903,3904],{},"orchestrator",")\nalso have messages queued while they are away; see ",[394,3907,1412],{"href":1411},[18,3909,3911],{"id":3910},"rest-api-client","REST API Client",[14,3913,3914],{},"Manage apps, rooms, actors, and scopes programmatically:",[23,3916,3917],{},[26,3918,3920],{"className":112,"code":3919,"filename":114,"language":115,"meta":32,"style":32},"import { NoLagApi } from '@nolag/js-sdk'\nimport type { PaginatedResult, App } from '@nolag/js-sdk'\n\nconst api = new NoLagApi('your-api-key', {   // nlg_live_\u003C12hex>.\u003Csecret>\n  baseUrl: 'https://api.nolag.app/v1',  // Optional\n  timeout: 30000,                        // Optional\n})\n\n// Apps: list() returns PaginatedResult\u003CApp>\nconst result: PaginatedResult\u003CApp> = await api.apps.list()\nconsole.log(result.data)                  // App[]\nconsole.log(result.pagination.total)      // Total count\nconsole.log(result.pagination.page)       // Current page\nconsole.log(result.pagination.pageCount)  // Total pages\n\nconst singleApp = await api.apps.get(appId)            // Get by ID\nconst app = await api.apps.create({                     // Create\n  name: 'My App',\n  topics: ['messages'],  // Topics actors may address; without them every subscribe is unknown_topic\n})\nconsole.log(app.slug)                                   // e.g. 'my-app-a3f9': pass this to setApp()\nawait api.apps.update(app.appId, { name: 'Updated' })  // Update\nawait api.apps.delete(app.appId)                        // Delete\n\n// Rooms (plain array). Rooms must exist before clients can subscribe\nconst rooms = await api.rooms.list(appId)                // List rooms in an app\nconst singleRoom = await api.rooms.get(appId, roomId)    // Get by ID\nconst room = await api.rooms.create(appId, {             // Create\n  name: 'General', slug: 'general'\n})\nawait api.rooms.ensure(appId, {                          // Create if missing (idempotent);\n  name: 'Order 42', slug: 'order-42'                     // needs config.autoProvisionRooms=true on the app\n})\nawait api.rooms.update(appId, room.roomId, {             // Update\n  name: 'Updated Room'\n})\nawait api.rooms.delete(appId, room.roomId)               // Delete\n\n// Actors (plain array)\nconst actors = await api.actors.list()                   // List all actors\nconst singleActor = await api.actors.get(actorTokenId)   // Get by ID\nconst actor = await api.actors.create({                  // Create\n  name: 'Device 1',\n  actorType: 'device'  // 'device' | 'user' | 'service' | 'session' | 'agent' | 'orchestrator' | 'observer'\n})\nconsole.log('Access Token:', actor.accessToken)  // Save this! Only shown once\n\nawait api.actors.update(actor.actorTokenId, { name: 'Updated Device' })\nawait api.actors.delete(actor.actorTokenId)\n\n// Scopes: list() is paginated like apps\nconst scopes = await api.scopes.list()\nconsole.log(scopes.data, scopes.pagination.total)\n",[34,3921,3922,3933,3947,3951,3977,3990,4001,4005,4009,4014,4047,4059,4071,4083,4095,4099,4121,4143,4153,4166,4170,4182,4203,4218,4222,4227,4249,4269,4288,4301,4305,4320,4335,4339,4352,4359,4363,4376,4380,4385,4406,4426,4446,4455,4466,4470,4487,4491,4507,4519,4524,4530,4549],{"__ignoreMap":32},[37,3923,3924,3926,3929,3931],{"class":39,"line":40},[37,3925,123],{"class":122},[37,3927,3928],{"class":126}," { NoLagApi } ",[37,3930,130],{"class":122},[37,3932,133],{"class":54},[37,3934,3935,3937,3940,3943,3945],{"class":39,"line":47},[37,3936,123],{"class":122},[37,3938,3939],{"class":122}," type",[37,3941,3942],{"class":126}," { PaginatedResult, App } ",[37,3944,130],{"class":122},[37,3946,133],{"class":54},[37,3948,3949],{"class":39,"line":61},[37,3950,65],{"emptyLinePlaceholder":64},[37,3952,3953,3955,3958,3960,3963,3966,3968,3971,3974],{"class":39,"line":68},[37,3954,147],{"class":122},[37,3956,3957],{"class":150}," api",[37,3959,154],{"class":122},[37,3961,3962],{"class":122}," new",[37,3964,3965],{"class":50}," NoLagApi",[37,3967,160],{"class":126},[37,3969,3970],{"class":54},"'your-api-key'",[37,3972,3973],{"class":126},", {   ",[37,3975,3976],{"class":43},"// nlg_live_\u003C12hex>.\u003Csecret>\n",[37,3978,3979,3982,3985,3987],{"class":39,"line":74},[37,3980,3981],{"class":126},"  baseUrl: ",[37,3983,3984],{"class":54},"'https://api.nolag.app/v1'",[37,3986,602],{"class":126},[37,3988,3989],{"class":43},"// Optional\n",[37,3991,3992,3995,3997,3999],{"class":39,"line":85},[37,3993,3994],{"class":126},"  timeout: ",[37,3996,746],{"class":150},[37,3998,1522],{"class":126},[37,4000,3989],{"class":43},[37,4002,4003],{"class":39,"line":90},[37,4004,333],{"class":126},[37,4006,4007],{"class":39,"line":96},[37,4008,65],{"emptyLinePlaceholder":64},[37,4010,4011],{"class":39,"line":196},[37,4012,4013],{"class":43},"// Apps: list() returns PaginatedResult\u003CApp>\n",[37,4015,4016,4018,4021,4023,4026,4029,4032,4035,4037,4039,4042,4045],{"class":39,"line":202},[37,4017,147],{"class":122},[37,4019,4020],{"class":150}," result",[37,4022,1792],{"class":122},[37,4024,4025],{"class":50}," PaginatedResult",[37,4027,4028],{"class":126},"\u003C",[37,4030,4031],{"class":50},"App",[37,4033,4034],{"class":126},"> ",[37,4036,504],{"class":122},[37,4038,478],{"class":122},[37,4040,4041],{"class":126}," api.apps.",[37,4043,4044],{"class":50},"list",[37,4046,189],{"class":126},[37,4048,4049,4051,4053,4056],{"class":39,"line":208},[37,4050,818],{"class":126},[37,4052,319],{"class":50},[37,4054,4055],{"class":126},"(result.data)                  ",[37,4057,4058],{"class":43},"// App[]\n",[37,4060,4061,4063,4065,4068],{"class":39,"line":241},[37,4062,818],{"class":126},[37,4064,319],{"class":50},[37,4066,4067],{"class":126},"(result.pagination.total)      ",[37,4069,4070],{"class":43},"// Total count\n",[37,4072,4073,4075,4077,4080],{"class":39,"line":246},[37,4074,818],{"class":126},[37,4076,319],{"class":50},[37,4078,4079],{"class":126},"(result.pagination.page)       ",[37,4081,4082],{"class":43},"// Current page\n",[37,4084,4085,4087,4089,4092],{"class":39,"line":252},[37,4086,818],{"class":126},[37,4088,319],{"class":50},[37,4090,4091],{"class":126},"(result.pagination.pageCount)  ",[37,4093,4094],{"class":43},"// Total pages\n",[37,4096,4097],{"class":39,"line":268},[37,4098,65],{"emptyLinePlaceholder":64},[37,4100,4101,4103,4106,4108,4110,4112,4115,4118],{"class":39,"line":273},[37,4102,147],{"class":122},[37,4104,4105],{"class":150}," singleApp",[37,4107,154],{"class":122},[37,4109,478],{"class":122},[37,4111,4041],{"class":126},[37,4113,4114],{"class":50},"get",[37,4116,4117],{"class":126},"(appId)            ",[37,4119,4120],{"class":43},"// Get by ID\n",[37,4122,4123,4125,4128,4130,4132,4134,4137,4140],{"class":39,"line":279},[37,4124,147],{"class":122},[37,4126,4127],{"class":150}," app",[37,4129,154],{"class":122},[37,4131,478],{"class":122},[37,4133,4041],{"class":126},[37,4135,4136],{"class":50},"create",[37,4138,4139],{"class":126},"({                     ",[37,4141,4142],{"class":43},"// Create\n",[37,4144,4145,4148,4151],{"class":39,"line":313},[37,4146,4147],{"class":126},"  name: ",[37,4149,4150],{"class":54},"'My App'",[37,4152,2326],{"class":126},[37,4154,4155,4158,4160,4163],{"class":39,"line":330},[37,4156,4157],{"class":126},"  topics: [",[37,4159,263],{"class":54},[37,4161,4162],{"class":126},"],  ",[37,4164,4165],{"class":43},"// Topics actors may address; without them every subscribe is unknown_topic\n",[37,4167,4168],{"class":39,"line":336},[37,4169,333],{"class":126},[37,4171,4172,4174,4176,4179],{"class":39,"line":341},[37,4173,818],{"class":126},[37,4175,319],{"class":50},[37,4177,4178],{"class":126},"(app.slug)                                   ",[37,4180,4181],{"class":43},"// e.g. 'my-app-a3f9': pass this to setApp()\n",[37,4183,4184,4186,4188,4191,4194,4197,4200],{"class":39,"line":347},[37,4185,180],{"class":122},[37,4187,4041],{"class":126},[37,4189,4190],{"class":50},"update",[37,4192,4193],{"class":126},"(app.appId, { name: ",[37,4195,4196],{"class":54},"'Updated'",[37,4198,4199],{"class":126}," })  ",[37,4201,4202],{"class":43},"// Update\n",[37,4204,4205,4207,4209,4212,4215],{"class":39,"line":777},[37,4206,180],{"class":122},[37,4208,4041],{"class":126},[37,4210,4211],{"class":50},"delete",[37,4213,4214],{"class":126},"(app.appId)                        ",[37,4216,4217],{"class":43},"// Delete\n",[37,4219,4220],{"class":39,"line":1116},[37,4221,65],{"emptyLinePlaceholder":64},[37,4223,4224],{"class":39,"line":1145},[37,4225,4226],{"class":43},"// Rooms (plain array). Rooms must exist before clients can subscribe\n",[37,4228,4229,4231,4234,4236,4238,4241,4243,4246],{"class":39,"line":1164},[37,4230,147],{"class":122},[37,4232,4233],{"class":150}," rooms",[37,4235,154],{"class":122},[37,4237,478],{"class":122},[37,4239,4240],{"class":126}," api.rooms.",[37,4242,4044],{"class":50},[37,4244,4245],{"class":126},"(appId)                ",[37,4247,4248],{"class":43},"// List rooms in an app\n",[37,4250,4251,4253,4256,4258,4260,4262,4264,4267],{"class":39,"line":1169},[37,4252,147],{"class":122},[37,4254,4255],{"class":150}," singleRoom",[37,4257,154],{"class":122},[37,4259,478],{"class":122},[37,4261,4240],{"class":126},[37,4263,4114],{"class":50},[37,4265,4266],{"class":126},"(appId, roomId)    ",[37,4268,4120],{"class":43},[37,4270,4271,4273,4275,4277,4279,4281,4283,4286],{"class":39,"line":1174},[37,4272,147],{"class":122},[37,4274,213],{"class":150},[37,4276,154],{"class":122},[37,4278,478],{"class":122},[37,4280,4240],{"class":126},[37,4282,4136],{"class":50},[37,4284,4285],{"class":126},"(appId, {             ",[37,4287,4142],{"class":43},[37,4289,4290,4292,4295,4298],{"class":39,"line":1180},[37,4291,4147],{"class":126},[37,4293,4294],{"class":54},"'General'",[37,4296,4297],{"class":126},", slug: ",[37,4299,4300],{"class":54},"'general'\n",[37,4302,4303],{"class":39,"line":1186},[37,4304,333],{"class":126},[37,4306,4307,4309,4311,4314,4317],{"class":39,"line":1192},[37,4308,180],{"class":122},[37,4310,4240],{"class":126},[37,4312,4313],{"class":50},"ensure",[37,4315,4316],{"class":126},"(appId, {                          ",[37,4318,4319],{"class":43},"// Create if missing (idempotent);\n",[37,4321,4322,4324,4327,4329,4332],{"class":39,"line":1215},[37,4323,4147],{"class":126},[37,4325,4326],{"class":54},"'Order 42'",[37,4328,4297],{"class":126},[37,4330,4331],{"class":54},"'order-42'",[37,4333,4334],{"class":43},"                     // needs config.autoProvisionRooms=true on the app\n",[37,4336,4337],{"class":39,"line":1221},[37,4338,333],{"class":126},[37,4340,4341,4343,4345,4347,4350],{"class":39,"line":1245},[37,4342,180],{"class":122},[37,4344,4240],{"class":126},[37,4346,4190],{"class":50},[37,4348,4349],{"class":126},"(appId, room.roomId, {             ",[37,4351,4202],{"class":43},[37,4353,4354,4356],{"class":39,"line":1250},[37,4355,4147],{"class":126},[37,4357,4358],{"class":54},"'Updated Room'\n",[37,4360,4361],{"class":39,"line":1255},[37,4362,333],{"class":126},[37,4364,4365,4367,4369,4371,4374],{"class":39,"line":1277},[37,4366,180],{"class":122},[37,4368,4240],{"class":126},[37,4370,4211],{"class":50},[37,4372,4373],{"class":126},"(appId, room.roomId)               ",[37,4375,4217],{"class":43},[37,4377,4378],{"class":39,"line":1283},[37,4379,65],{"emptyLinePlaceholder":64},[37,4381,4382],{"class":39,"line":1307},[37,4383,4384],{"class":43},"// Actors (plain array)\n",[37,4386,4387,4389,4391,4393,4395,4398,4400,4403],{"class":39,"line":1312},[37,4388,147],{"class":122},[37,4390,2364],{"class":150},[37,4392,154],{"class":122},[37,4394,478],{"class":122},[37,4396,4397],{"class":126}," api.actors.",[37,4399,4044],{"class":50},[37,4401,4402],{"class":126},"()                   ",[37,4404,4405],{"class":43},"// List all actors\n",[37,4407,4408,4410,4413,4415,4417,4419,4421,4424],{"class":39,"line":1317},[37,4409,147],{"class":122},[37,4411,4412],{"class":150}," singleActor",[37,4414,154],{"class":122},[37,4416,478],{"class":122},[37,4418,4397],{"class":126},[37,4420,4114],{"class":50},[37,4422,4423],{"class":126},"(actorTokenId)   ",[37,4425,4120],{"class":43},[37,4427,4428,4430,4433,4435,4437,4439,4441,4444],{"class":39,"line":1323},[37,4429,147],{"class":122},[37,4431,4432],{"class":150}," actor",[37,4434,154],{"class":122},[37,4436,478],{"class":122},[37,4438,4397],{"class":126},[37,4440,4136],{"class":50},[37,4442,4443],{"class":126},"({                  ",[37,4445,4142],{"class":43},[37,4447,4448,4450,4453],{"class":39,"line":1348},[37,4449,4147],{"class":126},[37,4451,4452],{"class":54},"'Device 1'",[37,4454,2326],{"class":126},[37,4456,4457,4460,4463],{"class":39,"line":1357},[37,4458,4459],{"class":126},"  actorType: ",[37,4461,4462],{"class":54},"'device'",[37,4464,4465],{"class":43},"  // 'device' | 'user' | 'service' | 'session' | 'agent' | 'orchestrator' | 'observer'\n",[37,4467,4468],{"class":39,"line":1372},[37,4469,333],{"class":126},[37,4471,4472,4474,4476,4478,4481,4484],{"class":39,"line":1383},[37,4473,818],{"class":126},[37,4475,319],{"class":50},[37,4477,160],{"class":126},[37,4479,4480],{"class":54},"'Access Token:'",[37,4482,4483],{"class":126},", actor.accessToken)  ",[37,4485,4486],{"class":43},"// Save this! Only shown once\n",[37,4488,4489],{"class":39,"line":1397},[37,4490,65],{"emptyLinePlaceholder":64},[37,4492,4493,4495,4497,4499,4502,4505],{"class":39,"line":1403},[37,4494,180],{"class":122},[37,4496,4397],{"class":126},[37,4498,4190],{"class":50},[37,4500,4501],{"class":126},"(actor.actorTokenId, { name: ",[37,4503,4504],{"class":54},"'Updated Device'",[37,4506,365],{"class":126},[37,4508,4510,4512,4514,4516],{"class":39,"line":4509},49,[37,4511,180],{"class":122},[37,4513,4397],{"class":126},[37,4515,4211],{"class":50},[37,4517,4518],{"class":126},"(actor.actorTokenId)\n",[37,4520,4522],{"class":39,"line":4521},50,[37,4523,65],{"emptyLinePlaceholder":64},[37,4525,4527],{"class":39,"line":4526},51,[37,4528,4529],{"class":43},"// Scopes: list() is paginated like apps\n",[37,4531,4533,4535,4538,4540,4542,4545,4547],{"class":39,"line":4532},52,[37,4534,147],{"class":122},[37,4536,4537],{"class":150}," scopes",[37,4539,154],{"class":122},[37,4541,478],{"class":122},[37,4543,4544],{"class":126}," api.scopes.",[37,4546,4044],{"class":50},[37,4548,189],{"class":126},[37,4550,4552,4554,4556],{"class":39,"line":4551},53,[37,4553,818],{"class":126},[37,4555,319],{"class":50},[37,4557,4558],{"class":126},"(scopes.data, scopes.pagination.total)\n",[18,4560,4562],{"id":4561},"typescript-support","TypeScript Support",[14,4564,4565],{},"The SDK includes full TypeScript definitions:",[23,4567,4568],{},[26,4569,4571],{"className":112,"code":4570,"filename":114,"language":115,"meta":32,"style":32},"import { NoLag, NoLagApi, NoLagServerError, NoLagEncodeError } from '@nolag/js-sdk'\nimport type {\n  NoLagOptions,\n  ConnectionStatus,\n  ActorType,\n  MessageMeta,\n  MessageHandler,\n  ErrorHandler,\n  HydrationEvent,\n  ActorPresence,\n  PresenceData,\n  LobbyPresenceEvent,\n  LobbyPresenceState,\n  ReplayStartEvent,\n  ReplayEndEvent,\n  QoS,\n  SubscribeOptions,\n  EmitOptions,\n  RoomContext,\n  LobbyContext,\n  PaginatedResult,\n} from '@nolag/js-sdk'\n\nconst client = NoLag('your-access-token')\nconst room: RoomContext = client.setApp(APP_SLUG).setRoom('general')\n\n// Type your message data. MessageHandler\u003CT> is (data: T, meta: MessageMeta) => void\ninterface ChatMessage {\n  text: string\n  sender: string\n  timestamp: number\n}\n\nroom.on\u003CChatMessage>('messages', (data, meta) => {\n  console.log(`[${data.sender}]: ${data.text}`)\n})\n\n// Inline payload type\nroom.on\u003C{ text: string }>('messages', (data) => data.text)\n\n// Or type the handler itself\nconst onMessage: MessageHandler\u003CChatMessage> = (data, meta) => {\n  console.log(data.text, meta.msgId)\n}\nroom.on('messages', onMessage)\n\n// ActorType: 'device' | 'user' | 'service' | 'session' | 'agent' | 'orchestrator' | 'observer'\nconst kind: ActorType | null = client.actorType\n\n// ErrorHandler: (error: NoLagServerError | NoLagEncodeError | Error) => void\nconst onError: ErrorHandler = (error) => {\n  if (error instanceof NoLagServerError) console.error(error.code, error.hint)\n}\nclient.on('error', onError)\n\n// HydrationEvent: { topic: string, data: unknown }\nclient.on('hydration', (event: HydrationEvent) => console.log(event.topic, event.data))\n",[34,4572,4573,4584,4592,4597,4602,4607,4612,4617,4622,4627,4632,4637,4642,4647,4652,4657,4662,4667,4672,4677,4682,4687,4696,4700,4716,4747,4751,4756,4766,4776,4785,4795,4800,4804,4834,4865,4869,4873,4878,4909,4913,4918,4952,4961,4965,4978,4982,4987,5010,5014,5019,5043,5064,5068,5082,5087,5093],{"__ignoreMap":32},[37,4574,4575,4577,4580,4582],{"class":39,"line":40},[37,4576,123],{"class":122},[37,4578,4579],{"class":126}," { NoLag, NoLagApi, NoLagServerError, NoLagEncodeError } ",[37,4581,130],{"class":122},[37,4583,133],{"class":54},[37,4585,4586,4588,4590],{"class":39,"line":47},[37,4587,123],{"class":122},[37,4589,3939],{"class":122},[37,4591,310],{"class":126},[37,4593,4594],{"class":39,"line":61},[37,4595,4596],{"class":126},"  NoLagOptions,\n",[37,4598,4599],{"class":39,"line":68},[37,4600,4601],{"class":126},"  ConnectionStatus,\n",[37,4603,4604],{"class":39,"line":74},[37,4605,4606],{"class":126},"  ActorType,\n",[37,4608,4609],{"class":39,"line":85},[37,4610,4611],{"class":126},"  MessageMeta,\n",[37,4613,4614],{"class":39,"line":90},[37,4615,4616],{"class":126},"  MessageHandler,\n",[37,4618,4619],{"class":39,"line":96},[37,4620,4621],{"class":126},"  ErrorHandler,\n",[37,4623,4624],{"class":39,"line":196},[37,4625,4626],{"class":126},"  HydrationEvent,\n",[37,4628,4629],{"class":39,"line":202},[37,4630,4631],{"class":126},"  ActorPresence,\n",[37,4633,4634],{"class":39,"line":208},[37,4635,4636],{"class":126},"  PresenceData,\n",[37,4638,4639],{"class":39,"line":241},[37,4640,4641],{"class":126},"  LobbyPresenceEvent,\n",[37,4643,4644],{"class":39,"line":246},[37,4645,4646],{"class":126},"  LobbyPresenceState,\n",[37,4648,4649],{"class":39,"line":252},[37,4650,4651],{"class":126},"  ReplayStartEvent,\n",[37,4653,4654],{"class":39,"line":268},[37,4655,4656],{"class":126},"  ReplayEndEvent,\n",[37,4658,4659],{"class":39,"line":273},[37,4660,4661],{"class":126},"  QoS,\n",[37,4663,4664],{"class":39,"line":279},[37,4665,4666],{"class":126},"  SubscribeOptions,\n",[37,4668,4669],{"class":39,"line":313},[37,4670,4671],{"class":126},"  EmitOptions,\n",[37,4673,4674],{"class":39,"line":330},[37,4675,4676],{"class":126},"  RoomContext,\n",[37,4678,4679],{"class":39,"line":336},[37,4680,4681],{"class":126},"  LobbyContext,\n",[37,4683,4684],{"class":39,"line":341},[37,4685,4686],{"class":126},"  PaginatedResult,\n",[37,4688,4689,4692,4694],{"class":39,"line":347},[37,4690,4691],{"class":126},"} ",[37,4693,130],{"class":122},[37,4695,133],{"class":54},[37,4697,4698],{"class":39,"line":777},[37,4699,65],{"emptyLinePlaceholder":64},[37,4701,4702,4704,4706,4708,4710,4712,4714],{"class":39,"line":1116},[37,4703,147],{"class":122},[37,4705,151],{"class":150},[37,4707,154],{"class":122},[37,4709,157],{"class":50},[37,4711,160],{"class":126},[37,4713,163],{"class":54},[37,4715,166],{"class":126},[37,4717,4718,4720,4722,4724,4727,4729,4731,4733,4735,4737,4739,4741,4743,4745],{"class":39,"line":1145},[37,4719,147],{"class":122},[37,4721,213],{"class":150},[37,4723,1792],{"class":122},[37,4725,4726],{"class":50}," RoomContext",[37,4728,154],{"class":122},[37,4730,183],{"class":126},[37,4732,220],{"class":50},[37,4734,160],{"class":126},[37,4736,225],{"class":150},[37,4738,228],{"class":126},[37,4740,231],{"class":50},[37,4742,160],{"class":126},[37,4744,236],{"class":54},[37,4746,166],{"class":126},[37,4748,4749],{"class":39,"line":1164},[37,4750,65],{"emptyLinePlaceholder":64},[37,4752,4753],{"class":39,"line":1169},[37,4754,4755],{"class":43},"// Type your message data. MessageHandler\u003CT> is (data: T, meta: MessageMeta) => void\n",[37,4757,4758,4761,4764],{"class":39,"line":1174},[37,4759,4760],{"class":122},"interface",[37,4762,4763],{"class":50}," ChatMessage",[37,4765,310],{"class":126},[37,4767,4768,4771,4773],{"class":39,"line":1180},[37,4769,4770],{"class":294},"  text",[37,4772,1792],{"class":122},[37,4774,4775],{"class":150}," string\n",[37,4777,4778,4781,4783],{"class":39,"line":1186},[37,4779,4780],{"class":294},"  sender",[37,4782,1792],{"class":122},[37,4784,4775],{"class":150},[37,4786,4787,4790,4792],{"class":39,"line":1192},[37,4788,4789],{"class":294},"  timestamp",[37,4791,1792],{"class":122},[37,4793,4794],{"class":150}," number\n",[37,4796,4797],{"class":39,"line":1215},[37,4798,4799],{"class":126},"}\n",[37,4801,4802],{"class":39,"line":1221},[37,4803,65],{"emptyLinePlaceholder":64},[37,4805,4806,4808,4810,4812,4815,4818,4820,4822,4824,4826,4828,4830,4832],{"class":39,"line":1245},[37,4807,255],{"class":126},[37,4809,284],{"class":50},[37,4811,4028],{"class":126},[37,4813,4814],{"class":50},"ChatMessage",[37,4816,4817],{"class":126},">(",[37,4819,263],{"class":54},[37,4821,291],{"class":126},[37,4823,295],{"class":294},[37,4825,298],{"class":126},[37,4827,301],{"class":294},[37,4829,304],{"class":126},[37,4831,307],{"class":122},[37,4833,310],{"class":126},[37,4835,4836,4838,4840,4842,4844,4846,4848,4851,4854,4856,4858,4861,4863],{"class":39,"line":1250},[37,4837,316],{"class":126},[37,4839,319],{"class":50},[37,4841,160],{"class":126},[37,4843,1830],{"class":54},[37,4845,295],{"class":126},[37,4847,410],{"class":54},[37,4849,4850],{"class":126},"sender",[37,4852,4853],{"class":54},"}]: ${",[37,4855,295],{"class":126},[37,4857,410],{"class":54},[37,4859,4860],{"class":126},"text",[37,4862,2791],{"class":54},[37,4864,166],{"class":126},[37,4866,4867],{"class":39,"line":1255},[37,4868,333],{"class":126},[37,4870,4871],{"class":39,"line":1277},[37,4872,65],{"emptyLinePlaceholder":64},[37,4874,4875],{"class":39,"line":1283},[37,4876,4877],{"class":43},"// Inline payload type\n",[37,4879,4880,4882,4884,4887,4889,4891,4893,4896,4898,4900,4902,4904,4906],{"class":39,"line":1307},[37,4881,255],{"class":126},[37,4883,284],{"class":50},[37,4885,4886],{"class":126},"\u003C{ ",[37,4888,4860],{"class":294},[37,4890,1792],{"class":122},[37,4892,1795],{"class":150},[37,4894,4895],{"class":126}," }>(",[37,4897,263],{"class":54},[37,4899,291],{"class":126},[37,4901,295],{"class":294},[37,4903,304],{"class":126},[37,4905,307],{"class":122},[37,4907,4908],{"class":126}," data.text)\n",[37,4910,4911],{"class":39,"line":1312},[37,4912,65],{"emptyLinePlaceholder":64},[37,4914,4915],{"class":39,"line":1317},[37,4916,4917],{"class":43},"// Or type the handler itself\n",[37,4919,4920,4922,4925,4927,4930,4932,4934,4936,4938,4940,4942,4944,4946,4948,4950],{"class":39,"line":1323},[37,4921,147],{"class":122},[37,4923,4924],{"class":50}," onMessage",[37,4926,1792],{"class":122},[37,4928,4929],{"class":50}," MessageHandler",[37,4931,4028],{"class":126},[37,4933,4814],{"class":50},[37,4935,4034],{"class":126},[37,4937,504],{"class":122},[37,4939,1863],{"class":126},[37,4941,295],{"class":294},[37,4943,298],{"class":126},[37,4945,301],{"class":294},[37,4947,304],{"class":126},[37,4949,307],{"class":122},[37,4951,310],{"class":126},[37,4953,4954,4956,4958],{"class":39,"line":1348},[37,4955,316],{"class":126},[37,4957,319],{"class":50},[37,4959,4960],{"class":126},"(data.text, meta.msgId)\n",[37,4962,4963],{"class":39,"line":1357},[37,4964,4799],{"class":126},[37,4966,4967,4969,4971,4973,4975],{"class":39,"line":1372},[37,4968,255],{"class":126},[37,4970,284],{"class":50},[37,4972,160],{"class":126},[37,4974,263],{"class":54},[37,4976,4977],{"class":126},", onMessage)\n",[37,4979,4980],{"class":39,"line":1383},[37,4981,65],{"emptyLinePlaceholder":64},[37,4983,4984],{"class":39,"line":1397},[37,4985,4986],{"class":43},"// ActorType: 'device' | 'user' | 'service' | 'session' | 'agent' | 'orchestrator' | 'observer'\n",[37,4988,4989,4991,4994,4996,4999,5002,5005,5007],{"class":39,"line":1403},[37,4990,147],{"class":122},[37,4992,4993],{"class":150}," kind",[37,4995,1792],{"class":122},[37,4997,4998],{"class":50}," ActorType",[37,5000,5001],{"class":122}," |",[37,5003,5004],{"class":150}," null",[37,5006,154],{"class":122},[37,5008,5009],{"class":126}," client.actorType\n",[37,5011,5012],{"class":39,"line":4509},[37,5013,65],{"emptyLinePlaceholder":64},[37,5015,5016],{"class":39,"line":4521},[37,5017,5018],{"class":43},"// ErrorHandler: (error: NoLagServerError | NoLagEncodeError | Error) => void\n",[37,5020,5021,5023,5026,5028,5031,5033,5035,5037,5039,5041],{"class":39,"line":4526},[37,5022,147],{"class":122},[37,5024,5025],{"class":50}," onError",[37,5027,1792],{"class":122},[37,5029,5030],{"class":50}," ErrorHandler",[37,5032,154],{"class":122},[37,5034,1863],{"class":126},[37,5036,1070],{"class":294},[37,5038,304],{"class":126},[37,5040,307],{"class":122},[37,5042,310],{"class":126},[37,5044,5045,5047,5050,5053,5056,5059,5061],{"class":39,"line":4532},[37,5046,1351],{"class":122},[37,5048,5049],{"class":126}," (error ",[37,5051,5052],{"class":122},"instanceof",[37,5054,5055],{"class":50}," NoLagServerError",[37,5057,5058],{"class":126},") console.",[37,5060,1070],{"class":50},[37,5062,5063],{"class":126},"(error.code, error.hint)\n",[37,5065,5066],{"class":39,"line":4551},[37,5067,4799],{"class":126},[37,5069,5071,5073,5075,5077,5079],{"class":39,"line":5070},54,[37,5072,852],{"class":126},[37,5074,284],{"class":50},[37,5076,160],{"class":126},[37,5078,1065],{"class":54},[37,5080,5081],{"class":126},", onError)\n",[37,5083,5085],{"class":39,"line":5084},55,[37,5086,65],{"emptyLinePlaceholder":64},[37,5088,5090],{"class":39,"line":5089},56,[37,5091,5092],{"class":43},"// HydrationEvent: { topic: string, data: unknown }\n",[37,5094,5096,5098,5100,5102,5104,5106,5108,5110,5113,5115,5117,5119,5121],{"class":39,"line":5095},57,[37,5097,852],{"class":126},[37,5099,284],{"class":50},[37,5101,160],{"class":126},[37,5103,1125],{"class":54},[37,5105,291],{"class":126},[37,5107,1206],{"class":294},[37,5109,1792],{"class":122},[37,5111,5112],{"class":50}," HydrationEvent",[37,5114,304],{"class":126},[37,5116,307],{"class":122},[37,5118,1876],{"class":126},[37,5120,319],{"class":50},[37,5122,5123],{"class":126},"(event.topic, event.data))\n",[18,5125,5127],{"id":5126},"error-handling","Error Handling",[14,5129,5130,5131,5133,5134,5137,5138,5140,5141,5144,5145,5147,5148,298,5150,5152,5153,5156,5157,5159],{},"The ",[34,5132,1070],{}," event receives ",[34,5135,5136],{},"NoLagServerError | NoLagEncodeError | Error",". Narrow\nwith ",[34,5139,5052],{},". Broker-side failures (a room that does not exist, a topic the\nactor cannot write) arrive as ",[34,5142,5143],{},"NoLagServerError"," with ",[34,5146,1070],{}," (the machine name),\n",[34,5149,34],{},[34,5151,1131],{}," and ",[34,5154,5155],{},"hint",". Register the handler before ",[34,5158,1432],{}," so nothing is\nmissed during the handshake.",[23,5161,5162],{},[26,5163,5165],{"className":112,"code":5164,"filename":114,"language":115,"meta":32,"style":32},"import { NoLag, NoLagApiError, NoLagServerError, NoLagEncodeError } from '@nolag/js-sdk'\n\nconst client = NoLag('your-access-token')\nconst room = client.setApp(APP_SLUG).setRoom('general')\n\nclient.on('error', (error) => {\n  if (error instanceof NoLagServerError) {\n    // A structured frame from the broker (protocol v2)\n    console.error(error.error, error.code, error.topic, error.hint)\n    if (error.error === 'unknown_topic') {\n      // 42940: the room has not been created. Create it via the REST API.\n    }\n  } else if (error instanceof NoLagEncodeError) {\n    // The payload could not be msgpack-encoded (class instances, cycles)\n    console.error('Cannot encode payload for', error.op, error.topic)\n  } else {\n    console.error('Transport error:', error.message)\n  }\n})\n\n// Subscribe/emit callbacks\nroom.subscribe('messages', (error) => {\n  if (error) {\n    console.error('Subscribe failed:', error.message)\n  }\n})\n\nroom.emit('messages', data, (error) => {\n  if (error) {\n    console.error('Emit failed:', error.message)\n  }\n})\n\n// REST API errors\ntry {\n  await api.apps.get('invalid-id')\n} catch (error) {\n  if (error instanceof NoLagApiError) {\n    console.error('API Error:', error.statusCode, error.message)\n  }\n}\n",[34,5166,5167,5178,5182,5198,5224,5228,5248,5261,5266,5275,5291,5296,5301,5319,5324,5338,5346,5359,5363,5367,5371,5376,5396,5402,5414,5418,5422,5426,5447,5453,5466,5470,5474,5478,5483,5490,5506,5515,5528,5542,5546],{"__ignoreMap":32},[37,5168,5169,5171,5174,5176],{"class":39,"line":40},[37,5170,123],{"class":122},[37,5172,5173],{"class":126}," { NoLag, NoLagApiError, NoLagServerError, NoLagEncodeError } ",[37,5175,130],{"class":122},[37,5177,133],{"class":54},[37,5179,5180],{"class":39,"line":47},[37,5181,65],{"emptyLinePlaceholder":64},[37,5183,5184,5186,5188,5190,5192,5194,5196],{"class":39,"line":61},[37,5185,147],{"class":122},[37,5187,151],{"class":150},[37,5189,154],{"class":122},[37,5191,157],{"class":50},[37,5193,160],{"class":126},[37,5195,163],{"class":54},[37,5197,166],{"class":126},[37,5199,5200,5202,5204,5206,5208,5210,5212,5214,5216,5218,5220,5222],{"class":39,"line":68},[37,5201,147],{"class":122},[37,5203,213],{"class":150},[37,5205,154],{"class":122},[37,5207,183],{"class":126},[37,5209,220],{"class":50},[37,5211,160],{"class":126},[37,5213,225],{"class":150},[37,5215,228],{"class":126},[37,5217,231],{"class":50},[37,5219,160],{"class":126},[37,5221,236],{"class":54},[37,5223,166],{"class":126},[37,5225,5226],{"class":39,"line":74},[37,5227,65],{"emptyLinePlaceholder":64},[37,5229,5230,5232,5234,5236,5238,5240,5242,5244,5246],{"class":39,"line":85},[37,5231,852],{"class":126},[37,5233,284],{"class":50},[37,5235,160],{"class":126},[37,5237,1065],{"class":54},[37,5239,291],{"class":126},[37,5241,1070],{"class":294},[37,5243,304],{"class":126},[37,5245,307],{"class":122},[37,5247,310],{"class":126},[37,5249,5250,5252,5254,5256,5258],{"class":39,"line":90},[37,5251,1351],{"class":122},[37,5253,5049],{"class":126},[37,5255,5052],{"class":122},[37,5257,5055],{"class":50},[37,5259,5260],{"class":126},") {\n",[37,5262,5263],{"class":39,"line":96},[37,5264,5265],{"class":43},"    // A structured frame from the broker (protocol v2)\n",[37,5267,5268,5270,5272],{"class":39,"line":196},[37,5269,1360],{"class":126},[37,5271,1070],{"class":50},[37,5273,5274],{"class":126},"(error.error, error.code, error.topic, error.hint)\n",[37,5276,5277,5280,5283,5286,5289],{"class":39,"line":202},[37,5278,5279],{"class":122},"    if",[37,5281,5282],{"class":126}," (error.error ",[37,5284,5285],{"class":122},"===",[37,5287,5288],{"class":54}," 'unknown_topic'",[37,5290,5260],{"class":126},[37,5292,5293],{"class":39,"line":208},[37,5294,5295],{"class":43},"      // 42940: the room has not been created. Create it via the REST API.\n",[37,5297,5298],{"class":39,"line":241},[37,5299,5300],{"class":126},"    }\n",[37,5302,5303,5305,5307,5310,5312,5314,5317],{"class":39,"line":246},[37,5304,1375],{"class":126},[37,5306,1378],{"class":122},[37,5308,5309],{"class":122}," if",[37,5311,5049],{"class":126},[37,5313,5052],{"class":122},[37,5315,5316],{"class":50}," NoLagEncodeError",[37,5318,5260],{"class":126},[37,5320,5321],{"class":39,"line":252},[37,5322,5323],{"class":43},"    // The payload could not be msgpack-encoded (class instances, cycles)\n",[37,5325,5326,5328,5330,5332,5335],{"class":39,"line":268},[37,5327,1360],{"class":126},[37,5329,1070],{"class":50},[37,5331,160],{"class":126},[37,5333,5334],{"class":54},"'Cannot encode payload for'",[37,5336,5337],{"class":126},", error.op, error.topic)\n",[37,5339,5340,5342,5344],{"class":39,"line":273},[37,5341,1375],{"class":126},[37,5343,1378],{"class":122},[37,5345,310],{"class":126},[37,5347,5348,5350,5352,5354,5357],{"class":39,"line":279},[37,5349,1360],{"class":126},[37,5351,1070],{"class":50},[37,5353,160],{"class":126},[37,5355,5356],{"class":54},"'Transport error:'",[37,5358,1090],{"class":126},[37,5360,5361],{"class":39,"line":313},[37,5362,1400],{"class":126},[37,5364,5365],{"class":39,"line":330},[37,5366,333],{"class":126},[37,5368,5369],{"class":39,"line":336},[37,5370,65],{"emptyLinePlaceholder":64},[37,5372,5373],{"class":39,"line":341},[37,5374,5375],{"class":43},"// Subscribe/emit callbacks\n",[37,5377,5378,5380,5382,5384,5386,5388,5390,5392,5394],{"class":39,"line":347},[37,5379,255],{"class":126},[37,5381,258],{"class":50},[37,5383,160],{"class":126},[37,5385,263],{"class":54},[37,5387,291],{"class":126},[37,5389,1070],{"class":294},[37,5391,304],{"class":126},[37,5393,307],{"class":122},[37,5395,310],{"class":126},[37,5397,5398,5400],{"class":39,"line":777},[37,5399,1351],{"class":122},[37,5401,1590],{"class":126},[37,5403,5404,5406,5408,5410,5412],{"class":39,"line":1116},[37,5405,1360],{"class":126},[37,5407,1070],{"class":50},[37,5409,160],{"class":126},[37,5411,1601],{"class":54},[37,5413,1090],{"class":126},[37,5415,5416],{"class":39,"line":1145},[37,5417,1400],{"class":126},[37,5419,5420],{"class":39,"line":1164},[37,5421,333],{"class":126},[37,5423,5424],{"class":39,"line":1169},[37,5425,65],{"emptyLinePlaceholder":64},[37,5427,5428,5430,5432,5434,5436,5439,5441,5443,5445],{"class":39,"line":1174},[37,5429,255],{"class":126},[37,5431,352],{"class":50},[37,5433,160],{"class":126},[37,5435,263],{"class":54},[37,5437,5438],{"class":126},", data, (",[37,5440,1070],{"class":294},[37,5442,304],{"class":126},[37,5444,307],{"class":122},[37,5446,310],{"class":126},[37,5448,5449,5451],{"class":39,"line":1180},[37,5450,1351],{"class":122},[37,5452,1590],{"class":126},[37,5454,5455,5457,5459,5461,5464],{"class":39,"line":1186},[37,5456,1360],{"class":126},[37,5458,1070],{"class":50},[37,5460,160],{"class":126},[37,5462,5463],{"class":54},"'Emit failed:'",[37,5465,1090],{"class":126},[37,5467,5468],{"class":39,"line":1192},[37,5469,1400],{"class":126},[37,5471,5472],{"class":39,"line":1215},[37,5473,333],{"class":126},[37,5475,5476],{"class":39,"line":1221},[37,5477,65],{"emptyLinePlaceholder":64},[37,5479,5480],{"class":39,"line":1245},[37,5481,5482],{"class":43},"// REST API errors\n",[37,5484,5485,5488],{"class":39,"line":1250},[37,5486,5487],{"class":122},"try",[37,5489,310],{"class":126},[37,5491,5492,5495,5497,5499,5501,5504],{"class":39,"line":1255},[37,5493,5494],{"class":122},"  await",[37,5496,4041],{"class":126},[37,5498,4114],{"class":50},[37,5500,160],{"class":126},[37,5502,5503],{"class":54},"'invalid-id'",[37,5505,166],{"class":126},[37,5507,5508,5510,5513],{"class":39,"line":1277},[37,5509,4691],{"class":126},[37,5511,5512],{"class":122},"catch",[37,5514,1590],{"class":126},[37,5516,5517,5519,5521,5523,5526],{"class":39,"line":1283},[37,5518,1351],{"class":122},[37,5520,5049],{"class":126},[37,5522,5052],{"class":122},[37,5524,5525],{"class":50}," NoLagApiError",[37,5527,5260],{"class":126},[37,5529,5530,5532,5534,5536,5539],{"class":39,"line":1307},[37,5531,1360],{"class":126},[37,5533,1070],{"class":50},[37,5535,160],{"class":126},[37,5537,5538],{"class":54},"'API Error:'",[37,5540,5541],{"class":126},", error.statusCode, error.message)\n",[37,5543,5544],{"class":39,"line":1312},[37,5545,1400],{"class":126},[37,5547,5548],{"class":39,"line":1317},[37,5549,4799],{"class":126},[18,5551,5553],{"id":5552},"browser-usage","Browser Usage",[23,5555,5556],{},[26,5557,5562],{"className":5558,"code":5559,"filename":5560,"language":5561,"meta":32,"style":32},"language-html shiki shiki-themes github-light github-dark","\u003Cscript type=\"module\">\n  import { NoLag } from 'https://unpkg.com/@nolag/js-sdk/dist/browser.js'\n\n  const client = NoLag('your-access-token')\n  await client.connect()\n\n  // 'your-app-slug' is the suffixed slug returned when you created the app\n  const room = client.setApp('your-app-slug').setRoom('general')\n  room.subscribe('updates')\n  room.on('updates', (data) => {\n    document.getElementById('output').textContent = JSON.stringify(data)\n  })\n\u003C/script>\n","HTML","html",[34,5563,5564,5582,5594,5598,5614,5624,5628,5633,5660,5674,5694,5722,5727],{"__ignoreMap":32},[37,5565,5566,5568,5572,5574,5576,5579],{"class":39,"line":40},[37,5567,4028],{"class":126},[37,5569,5571],{"class":5570},"s9eBZ","script",[37,5573,3939],{"class":50},[37,5575,504],{"class":126},[37,5577,5578],{"class":54},"\"module\"",[37,5580,5581],{"class":126},">\n",[37,5583,5584,5587,5589,5591],{"class":39,"line":47},[37,5585,5586],{"class":122},"  import",[37,5588,127],{"class":126},[37,5590,130],{"class":122},[37,5592,5593],{"class":54}," 'https://unpkg.com/@nolag/js-sdk/dist/browser.js'\n",[37,5595,5596],{"class":39,"line":61},[37,5597,65],{"emptyLinePlaceholder":64},[37,5599,5600,5602,5604,5606,5608,5610,5612],{"class":39,"line":68},[37,5601,470],{"class":122},[37,5603,151],{"class":150},[37,5605,154],{"class":122},[37,5607,157],{"class":50},[37,5609,160],{"class":126},[37,5611,163],{"class":54},[37,5613,166],{"class":126},[37,5615,5616,5618,5620,5622],{"class":39,"line":74},[37,5617,5494],{"class":122},[37,5619,183],{"class":126},[37,5621,186],{"class":50},[37,5623,189],{"class":126},[37,5625,5626],{"class":39,"line":85},[37,5627,65],{"emptyLinePlaceholder":64},[37,5629,5630],{"class":39,"line":90},[37,5631,5632],{"class":43},"  // 'your-app-slug' is the suffixed slug returned when you created the app\n",[37,5634,5635,5637,5639,5641,5643,5645,5647,5650,5652,5654,5656,5658],{"class":39,"line":96},[37,5636,470],{"class":122},[37,5638,213],{"class":150},[37,5640,154],{"class":122},[37,5642,183],{"class":126},[37,5644,220],{"class":50},[37,5646,160],{"class":126},[37,5648,5649],{"class":54},"'your-app-slug'",[37,5651,228],{"class":126},[37,5653,231],{"class":50},[37,5655,160],{"class":126},[37,5657,236],{"class":54},[37,5659,166],{"class":126},[37,5661,5662,5665,5667,5669,5672],{"class":39,"line":196},[37,5663,5664],{"class":126},"  room.",[37,5666,258],{"class":50},[37,5668,160],{"class":126},[37,5670,5671],{"class":54},"'updates'",[37,5673,166],{"class":126},[37,5675,5676,5678,5680,5682,5684,5686,5688,5690,5692],{"class":39,"line":202},[37,5677,5664],{"class":126},[37,5679,284],{"class":50},[37,5681,160],{"class":126},[37,5683,5671],{"class":54},[37,5685,291],{"class":126},[37,5687,295],{"class":294},[37,5689,304],{"class":126},[37,5691,307],{"class":122},[37,5693,310],{"class":126},[37,5695,5696,5699,5702,5704,5707,5710,5712,5715,5717,5720],{"class":39,"line":208},[37,5697,5698],{"class":126},"    document.",[37,5700,5701],{"class":50},"getElementById",[37,5703,160],{"class":126},[37,5705,5706],{"class":54},"'output'",[37,5708,5709],{"class":126},").textContent ",[37,5711,504],{"class":122},[37,5713,5714],{"class":150}," JSON",[37,5716,410],{"class":126},[37,5718,5719],{"class":50},"stringify",[37,5721,1881],{"class":126},[37,5723,5724],{"class":39,"line":241},[37,5725,5726],{"class":126},"  })\n",[37,5728,5729,5732,5734],{"class":39,"line":246},[37,5730,5731],{"class":126},"\u003C/",[37,5733,5571],{"class":5570},[37,5735,5581],{"class":126},[18,5737,5739],{"id":5738},"complete-example","Complete Example",[23,5741,5742],{},[26,5743,5745],{"className":112,"code":5744,"filename":114,"language":115,"meta":32,"style":32},"import { NoLag, NoLagApi, NoLagServerError } from '@nolag/js-sdk'\n\n// Server side, once: create an app, a room in it, and an actor\nconst api = new NoLagApi(process.env.NOLAG_API_KEY)  // nlg_live_...\nconst app = await api.apps.create({ name: 'Chat', topics: ['messages'] })\nconsole.log(app.slug)  // e.g. 'chat-a3f9': the slug clients pass to setApp()\nawait api.rooms.create(app.appId, { name: 'General', slug: 'general' })\nconst actor = await api.actors.create({ name: 'chat-client', actorType: 'user' })\nconsole.log(actor.accessToken)  // shown once; hand it to the client\n\n// Client side: connect with the actor's access token\nconst client = NoLag(actor.accessToken, {\n  reconnect: true,\n  qos: 1\n})\n\nclient.on('error', (error) => {\n  if (error instanceof NoLagServerError) {\n    console.error(error.error, error.code, error.hint)\n  } else {\n    console.error('Error:', error)\n  }\n})\n\nclient.on('disconnect', (reason) => {\n  console.log('Disconnected:', reason)\n})\n\nclient.on('presence:join', (member) => {\n  console.log(`${member.presence.username} joined`)\n})\n\nawait client.connect()\nconsole.log('Connected as:', client.actorId)\n\n// Join the room: subscribe, set presence, listen\nconst room = client.setApp(app.slug).setRoom('general')\nroom.subscribe('messages')\nroom.setPresence({ username: 'Alice', status: 'online' })\n\nroom.on('messages', (data, meta) => {\n  console.log('Message:', data)\n})\n\n// Send a message. You will not receive it yourself, so render it locally\nroom.emit('messages', { text: 'Hello everyone!' })\n",[34,5746,5747,5758,5762,5767,5791,5819,5831,5849,5876,5888,5892,5897,5910,5918,5925,5929,5933,5953,5965,5974,5982,5994,5998,6002,6006,6026,6038,6042,6046,6067,6091,6095,6099,6109,6123,6127,6132,6155,6167,6185,6189,6213,6225,6229,6233,6238],{"__ignoreMap":32},[37,5748,5749,5751,5754,5756],{"class":39,"line":40},[37,5750,123],{"class":122},[37,5752,5753],{"class":126}," { NoLag, NoLagApi, NoLagServerError } ",[37,5755,130],{"class":122},[37,5757,133],{"class":54},[37,5759,5760],{"class":39,"line":47},[37,5761,65],{"emptyLinePlaceholder":64},[37,5763,5764],{"class":39,"line":61},[37,5765,5766],{"class":43},"// Server side, once: create an app, a room in it, and an actor\n",[37,5768,5769,5771,5773,5775,5777,5779,5782,5785,5788],{"class":39,"line":68},[37,5770,147],{"class":122},[37,5772,3957],{"class":150},[37,5774,154],{"class":122},[37,5776,3962],{"class":122},[37,5778,3965],{"class":50},[37,5780,5781],{"class":126},"(process.env.",[37,5783,5784],{"class":150},"NOLAG_API_KEY",[37,5786,5787],{"class":126},")  ",[37,5789,5790],{"class":43},"// nlg_live_...\n",[37,5792,5793,5795,5797,5799,5801,5803,5805,5808,5811,5814,5816],{"class":39,"line":74},[37,5794,147],{"class":122},[37,5796,4127],{"class":150},[37,5798,154],{"class":122},[37,5800,478],{"class":122},[37,5802,4041],{"class":126},[37,5804,4136],{"class":50},[37,5806,5807],{"class":126},"({ name: ",[37,5809,5810],{"class":54},"'Chat'",[37,5812,5813],{"class":126},", topics: [",[37,5815,263],{"class":54},[37,5817,5818],{"class":126},"] })\n",[37,5820,5821,5823,5825,5828],{"class":39,"line":85},[37,5822,818],{"class":126},[37,5824,319],{"class":50},[37,5826,5827],{"class":126},"(app.slug)  ",[37,5829,5830],{"class":43},"// e.g. 'chat-a3f9': the slug clients pass to setApp()\n",[37,5832,5833,5835,5837,5839,5841,5843,5845,5847],{"class":39,"line":90},[37,5834,180],{"class":122},[37,5836,4240],{"class":126},[37,5838,4136],{"class":50},[37,5840,4193],{"class":126},[37,5842,4294],{"class":54},[37,5844,4297],{"class":126},[37,5846,236],{"class":54},[37,5848,365],{"class":126},[37,5850,5851,5853,5855,5857,5859,5861,5863,5865,5868,5871,5874],{"class":39,"line":96},[37,5852,147],{"class":122},[37,5854,4432],{"class":150},[37,5856,154],{"class":122},[37,5858,478],{"class":122},[37,5860,4397],{"class":126},[37,5862,4136],{"class":50},[37,5864,5807],{"class":126},[37,5866,5867],{"class":54},"'chat-client'",[37,5869,5870],{"class":126},", actorType: ",[37,5872,5873],{"class":54},"'user'",[37,5875,365],{"class":126},[37,5877,5878,5880,5882,5885],{"class":39,"line":196},[37,5879,818],{"class":126},[37,5881,319],{"class":50},[37,5883,5884],{"class":126},"(actor.accessToken)  ",[37,5886,5887],{"class":43},"// shown once; hand it to the client\n",[37,5889,5890],{"class":39,"line":202},[37,5891,65],{"emptyLinePlaceholder":64},[37,5893,5894],{"class":39,"line":208},[37,5895,5896],{"class":43},"// Client side: connect with the actor's access token\n",[37,5898,5899,5901,5903,5905,5907],{"class":39,"line":241},[37,5900,147],{"class":122},[37,5902,151],{"class":150},[37,5904,154],{"class":122},[37,5906,157],{"class":50},[37,5908,5909],{"class":126},"(actor.accessToken, {\n",[37,5911,5912,5914,5916],{"class":39,"line":246},[37,5913,610],{"class":126},[37,5915,613],{"class":150},[37,5917,2326],{"class":126},[37,5919,5920,5922],{"class":39,"line":252},[37,5921,647],{"class":126},[37,5923,5924],{"class":150},"1\n",[37,5926,5927],{"class":39,"line":268},[37,5928,333],{"class":126},[37,5930,5931],{"class":39,"line":273},[37,5932,65],{"emptyLinePlaceholder":64},[37,5934,5935,5937,5939,5941,5943,5945,5947,5949,5951],{"class":39,"line":279},[37,5936,852],{"class":126},[37,5938,284],{"class":50},[37,5940,160],{"class":126},[37,5942,1065],{"class":54},[37,5944,291],{"class":126},[37,5946,1070],{"class":294},[37,5948,304],{"class":126},[37,5950,307],{"class":122},[37,5952,310],{"class":126},[37,5954,5955,5957,5959,5961,5963],{"class":39,"line":313},[37,5956,1351],{"class":122},[37,5958,5049],{"class":126},[37,5960,5052],{"class":122},[37,5962,5055],{"class":50},[37,5964,5260],{"class":126},[37,5966,5967,5969,5971],{"class":39,"line":330},[37,5968,1360],{"class":126},[37,5970,1070],{"class":50},[37,5972,5973],{"class":126},"(error.error, error.code, error.hint)\n",[37,5975,5976,5978,5980],{"class":39,"line":336},[37,5977,1375],{"class":126},[37,5979,1378],{"class":122},[37,5981,310],{"class":126},[37,5983,5984,5986,5988,5990,5992],{"class":39,"line":341},[37,5985,1360],{"class":126},[37,5987,1070],{"class":50},[37,5989,160],{"class":126},[37,5991,1087],{"class":54},[37,5993,1604],{"class":126},[37,5995,5996],{"class":39,"line":347},[37,5997,1400],{"class":126},[37,5999,6000],{"class":39,"line":777},[37,6001,333],{"class":126},[37,6003,6004],{"class":39,"line":1116},[37,6005,65],{"emptyLinePlaceholder":64},[37,6007,6008,6010,6012,6014,6016,6018,6020,6022,6024],{"class":39,"line":1145},[37,6009,852],{"class":126},[37,6011,284],{"class":50},[37,6013,160],{"class":126},[37,6015,973],{"class":54},[37,6017,291],{"class":126},[37,6019,978],{"class":294},[37,6021,304],{"class":126},[37,6023,307],{"class":122},[37,6025,310],{"class":126},[37,6027,6028,6030,6032,6034,6036],{"class":39,"line":1164},[37,6029,316],{"class":126},[37,6031,319],{"class":50},[37,6033,160],{"class":126},[37,6035,995],{"class":54},[37,6037,998],{"class":126},[37,6039,6040],{"class":39,"line":1169},[37,6041,333],{"class":126},[37,6043,6044],{"class":39,"line":1174},[37,6045,65],{"emptyLinePlaceholder":64},[37,6047,6048,6050,6052,6054,6056,6058,6061,6063,6065],{"class":39,"line":1180},[37,6049,852],{"class":126},[37,6051,284],{"class":50},[37,6053,160],{"class":126},[37,6055,2446],{"class":54},[37,6057,291],{"class":126},[37,6059,6060],{"class":294},"member",[37,6062,304],{"class":126},[37,6064,307],{"class":122},[37,6066,310],{"class":126},[37,6068,6069,6071,6073,6075,6077,6079,6081,6083,6085,6087,6089],{"class":39,"line":1186},[37,6070,316],{"class":126},[37,6072,319],{"class":50},[37,6074,160],{"class":126},[37,6076,1653],{"class":54},[37,6078,6060],{"class":126},[37,6080,410],{"class":54},[37,6082,2474],{"class":126},[37,6084,410],{"class":54},[37,6086,2479],{"class":126},[37,6088,2482],{"class":54},[37,6090,166],{"class":126},[37,6092,6093],{"class":39,"line":1192},[37,6094,333],{"class":126},[37,6096,6097],{"class":39,"line":1215},[37,6098,65],{"emptyLinePlaceholder":64},[37,6100,6101,6103,6105,6107],{"class":39,"line":1221},[37,6102,180],{"class":122},[37,6104,183],{"class":126},[37,6106,186],{"class":50},[37,6108,189],{"class":126},[37,6110,6111,6113,6115,6117,6120],{"class":39,"line":1245},[37,6112,818],{"class":126},[37,6114,319],{"class":50},[37,6116,160],{"class":126},[37,6118,6119],{"class":54},"'Connected as:'",[37,6121,6122],{"class":126},", client.actorId)\n",[37,6124,6125],{"class":39,"line":1250},[37,6126,65],{"emptyLinePlaceholder":64},[37,6128,6129],{"class":39,"line":1255},[37,6130,6131],{"class":43},"// Join the room: subscribe, set presence, listen\n",[37,6133,6134,6136,6138,6140,6142,6144,6147,6149,6151,6153],{"class":39,"line":1277},[37,6135,147],{"class":122},[37,6137,213],{"class":150},[37,6139,154],{"class":122},[37,6141,183],{"class":126},[37,6143,220],{"class":50},[37,6145,6146],{"class":126},"(app.slug).",[37,6148,231],{"class":50},[37,6150,160],{"class":126},[37,6152,236],{"class":54},[37,6154,166],{"class":126},[37,6156,6157,6159,6161,6163,6165],{"class":39,"line":1283},[37,6158,255],{"class":126},[37,6160,258],{"class":50},[37,6162,160],{"class":126},[37,6164,263],{"class":54},[37,6166,166],{"class":126},[37,6168,6169,6171,6173,6176,6178,6181,6183],{"class":39,"line":1307},[37,6170,255],{"class":126},[37,6172,2312],{"class":50},[37,6174,6175],{"class":126},"({ username: ",[37,6177,2323],{"class":54},[37,6179,6180],{"class":126},", status: ",[37,6182,2334],{"class":54},[37,6184,365],{"class":126},[37,6186,6187],{"class":39,"line":1312},[37,6188,65],{"emptyLinePlaceholder":64},[37,6190,6191,6193,6195,6197,6199,6201,6203,6205,6207,6209,6211],{"class":39,"line":1317},[37,6192,255],{"class":126},[37,6194,284],{"class":50},[37,6196,160],{"class":126},[37,6198,263],{"class":54},[37,6200,291],{"class":126},[37,6202,295],{"class":294},[37,6204,298],{"class":126},[37,6206,301],{"class":294},[37,6208,304],{"class":126},[37,6210,307],{"class":122},[37,6212,310],{"class":126},[37,6214,6215,6217,6219,6221,6223],{"class":39,"line":1323},[37,6216,316],{"class":126},[37,6218,319],{"class":50},[37,6220,160],{"class":126},[37,6222,3042],{"class":54},[37,6224,327],{"class":126},[37,6226,6227],{"class":39,"line":1348},[37,6228,333],{"class":126},[37,6230,6231],{"class":39,"line":1357},[37,6232,65],{"emptyLinePlaceholder":64},[37,6234,6235],{"class":39,"line":1372},[37,6236,6237],{"class":43},"// Send a message. You will not receive it yourself, so render it locally\n",[37,6239,6240,6242,6244,6246,6248,6250,6253],{"class":39,"line":1383},[37,6241,255],{"class":126},[37,6243,352],{"class":50},[37,6245,160],{"class":126},[37,6247,263],{"class":54},[37,6249,359],{"class":126},[37,6251,6252],{"class":54},"'Hello everyone!'",[37,6254,365],{"class":126},[18,6256,6258],{"id":6257},"next-steps","Next Steps",[6260,6261,6262,6269,6275,6280,6284,6288,6292,6296,6302],"ul",{},[6263,6264,6265],"li",{},[394,6266,6268],{"href":6267},"/docs/concepts/topics","Learn about Topics",[6263,6270,6271],{},[394,6272,6274],{"href":6273},"/docs/concepts/rooms","Rooms",[6263,6276,6277],{},[394,6278,2260],{"href":6279},"/docs/concepts/presence",[6263,6281,6282],{},[394,6283,2628],{"href":2931},[6263,6285,6286],{},[394,6287,3610],{"href":3609},[6263,6289,6290],{},[394,6291,3614],{"href":3762},[6263,6293,6294],{},[394,6295,1412],{"href":1411},[6263,6297,6298],{},[394,6299,6301],{"href":6300},"/docs/api-reference","REST API Reference",[6263,6303,6304],{},[394,6305,6307],{"href":6306},"/docs/guides/chat-app","Build a Chat App",[6309,6310,6311],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":32,"searchDepth":47,"depth":47,"links":6313},[6314,6315,6316,6317,6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6330,6331,6332,6333,6334,6335,6336,6337],{"id":20,"depth":47,"text":21},{"id":106,"depth":47,"text":107},{"id":413,"depth":47,"text":414},{"id":561,"depth":47,"text":562},{"id":782,"depth":47,"text":783},{"id":905,"depth":47,"text":906},{"id":1421,"depth":47,"text":1422},{"id":1663,"depth":47,"text":1664},{"id":1980,"depth":47,"text":1981},{"id":2259,"depth":47,"text":2260},{"id":2627,"depth":47,"text":2628},{"id":2936,"depth":47,"text":2937},{"id":3119,"depth":47,"text":3120},{"id":3227,"depth":47,"text":3228,"children":6328},[6329],{"id":3417,"depth":61,"text":3418},{"id":3613,"depth":47,"text":3614},{"id":3766,"depth":47,"text":3767},{"id":3910,"depth":47,"text":3911},{"id":4561,"depth":47,"text":4562},{"id":5126,"depth":47,"text":5127},{"id":5552,"depth":47,"text":5553},{"id":5738,"depth":47,"text":5739},{"id":6257,"depth":47,"text":6258},"Complete reference for the @nolag/js-sdk SDK. Connect, subscribe, publish, and manage real-time messaging in JavaScript and TypeScript.","md",{},"/docs/sdks/javascript",{"title":5,"description":6338},"docs/sdks/javascript","JOed6b0uacKPaJ-pO-z-mmEq59N6KpoAhhPtwHh64Mk",1789869421402]