[{"data":1,"prerenderedAt":2312},["ShallowReactive",2],{"docs:/docs/high-level-sdks/iot":3},{"id":4,"title":5,"body":6,"description":2305,"extension":2306,"meta":2307,"navigation":274,"path":2308,"seo":2309,"stem":2310,"__hash__":2311},"docs/docs/high-level-sdks/iot.md","IoT SDK",{"type":7,"value":8,"toc":2290},"minimark",[9,14,18,23,40,45,67,71,117,151,198,207,233,406,410,434,457,461,467,1535,1539,1542,1547,1727,1837,1841,1952,1955,2133,2137,2224,2228,2286],[10,11,13],"h1",{"id":12},"nolagiot","@nolag/iot",[15,16,17],"p",{},"IoT device telemetry and command dispatch with acknowledgment tracking.",[19,20,22],"h2",{"id":21},"overview","Overview",[15,24,25,26,30,31,34,35,39],{},"Connect IoT devices and controllers over real-time channels. Devices push telemetry (sensor readings, status updates, or any structured measurement) while controllers dispatch commands with Promise-based acknowledgment tracking and configurable timeouts. Two roles participate in a device group: ",[27,28,29],"strong",{},"devices"," report data and acknowledge commands, and ",[27,32,33],{},"controllers"," watch telemetry and issue commands. A wrapper plays one role; a process that needs both runs two wrappers on two clients with different device IDs. Groups organise devices by fleet, physical location, or function. Your app owns one core NoLag client and injects it into ",[36,37,38],"code",{},"NoLagIoT","; the wrapper attaches its behaviour to that connection.",[41,42,44],"h3",{"id":43},"key-features","Key Features",[46,47,48,52,55,58,61,64],"ul",{},[49,50,51],"li",{},"Real-time telemetry broadcast from devices to all group subscribers",[49,53,54],{},"Promise-based command dispatch with configurable acknowledgment timeout",[49,56,57],{},"Commands and acks routed by device ID with filters, so a device only receives its own commands",[49,59,60],{},"Ephemeral topics throughout, suited to high-frequency data",[49,62,63],{},"Device online/offline presence via lobby",[49,65,66],{},"Multiple groups per connection; join by zone, building floor, vehicle type, etc.",[19,68,70],{"id":69},"how-it-works","How It Works",[15,72,73,75,76,79,80,83,84,87,88,91,92,95,96,99,100,102,103,106,107,109,110,112,113,116],{},[36,74,38],{}," attaches to an injected ",[36,77,78],{},"@nolag/js-sdk"," client and manages a lobby that reflects device presence. Calling ",[36,81,82],{},"joinGroup(name)"," returns a ",[36,85,86],{},"DeviceGroup"," that subscribes to three topics: ",[36,89,90],{},"telemetry"," for sensor readings, ",[36,93,94],{},"commands"," for command payloads, and ",[36,97,98],{},"_cmd_ack"," for acknowledgments. None of them is logged server-side. Routing uses filters: a device subscribes to ",[36,101,94],{}," filtered on its own ",[36,104,105],{},"deviceId",", and a controller subscribes to ",[36,108,98],{}," filtered on its ",[36,111,105],{},", so a command reaches only its target and an ack reaches only its sender. A controller sees every command on the group but never emits ",[36,114,115],{},"command","; only devices do.",[15,118,119,120,123,124,127,128,131,132,135,136,139,140,143,144,147,148,150],{},"When a controller calls ",[36,121,122],{},"sendCommand()"," the SDK stores a pending Promise keyed on the command ID and publishes the ",[36,125,126],{},"DeviceCommand",". When the target device calls ",[36,129,130],{},"ackCommand()",", the matching Promise resolves on ",[36,133,134],{},"'acked'"," or ",[36,137,138],{},"'completed'"," and rejects on ",[36,141,142],{},"'failed'",", or rejects after ",[36,145,146],{},"commandTimeout",". The first ack settles the command; later acks for the same ID are ignored. Publishers never receive their own messages, so telemetry you send is stored in your own buffer without emitting ",[36,149,90],{},". The app owns the socket lifecycle; the wrapper never opens or closes it.",[152,153,154,167],"table",{},[155,156,157],"thead",{},[158,159,160,164],"tr",{},[161,162,163],"th",{},"Topic",[161,165,166],{},"Purpose",[168,169,170,180,189],"tbody",{},[158,171,172,177],{},[173,174,175],"td",{},[36,176,90],{},[173,178,179],{},"Sensor readings and device status updates",[158,181,182,186],{},[173,183,184],{},[36,185,94],{},[173,187,188],{},"Commands dispatched to devices, filtered by target device ID",[158,190,191,195],{},[173,192,193],{},[36,194,98],{},[173,196,197],{},"Command acknowledgments, filtered by the sending controller's device ID",[15,199,200,201,206],{},"A fresh subscribe or an ordinary reconnect never replays history, and this SDK never triggers replay; see ",[202,203,205],"a",{"href":204},"/docs/concepts/replay","Replay"," for the one case where the broker replays messages.",[208,209,211],"callout",{"type":210},"info",[15,212,213,216,217,220,221,224,225,228,229,232],{},[27,214,215],{},"Before you start."," Create an app from the ",[36,218,219],{},"nolag-iot-sdk"," blueprint. That seeds the rooms this SDK expects (",[36,222,223],{},"factory-floor",") and the ",[36,226,227],{},"online"," lobby, and returns an app slug with a random suffix. That slug is the ",[36,230,231],{},"appName"," you pass to the wrapper. You can also do this in the portal: Apps, New App, pick the blueprint.",[234,235,236],"code-tabs",{},[237,238,244],"pre",{"className":239,"code":240,"filename":241,"language":242,"meta":243,"style":243},"language-typescript shiki shiki-themes github-light github-dark","import { NoLagApi } from \"@nolag/js-sdk\";\n\nconst api = new NoLagApi(process.env.NOLAG_API_KEY); // nlg_live_...\nconst app = await api.apps.create({ name: \"My App\", blueprintId: \"nolag-iot-sdk\" });\nconsole.log(app.slug); // e.g. \"my-app-a3f9\": this is your appName\n\nconst actor = await api.actors.create({ name: \"sensor-01\", actorType: \"device\" });\nconsole.log(actor.accessToken); // shown once; keep it\n","Setup (server side, once)","typescript","",[36,245,246,269,276,309,343,358,363,393],{"__ignoreMap":243},[247,248,251,255,259,262,266],"span",{"class":249,"line":250},"line",1,[247,252,254],{"class":253},"szBVR","import",[247,256,258],{"class":257},"sVt8B"," { NoLagApi } ",[247,260,261],{"class":253},"from",[247,263,265],{"class":264},"sZZnC"," \"@nolag/js-sdk\"",[247,267,268],{"class":257},";\n",[247,270,272],{"class":249,"line":271},2,[247,273,275],{"emptyLinePlaceholder":274},true,"\n",[247,277,279,282,286,289,292,296,299,302,305],{"class":249,"line":278},3,[247,280,281],{"class":253},"const",[247,283,285],{"class":284},"sj4cs"," api",[247,287,288],{"class":253}," =",[247,290,291],{"class":253}," new",[247,293,295],{"class":294},"sScJk"," NoLagApi",[247,297,298],{"class":257},"(process.env.",[247,300,301],{"class":284},"NOLAG_API_KEY",[247,303,304],{"class":257},"); ",[247,306,308],{"class":307},"sJ8bj","// nlg_live_...\n",[247,310,312,314,317,319,322,325,328,331,334,337,340],{"class":249,"line":311},4,[247,313,281],{"class":253},[247,315,316],{"class":284}," app",[247,318,288],{"class":253},[247,320,321],{"class":253}," await",[247,323,324],{"class":257}," api.apps.",[247,326,327],{"class":294},"create",[247,329,330],{"class":257},"({ name: ",[247,332,333],{"class":264},"\"My App\"",[247,335,336],{"class":257},", blueprintId: ",[247,338,339],{"class":264},"\"nolag-iot-sdk\"",[247,341,342],{"class":257}," });\n",[247,344,346,349,352,355],{"class":249,"line":345},5,[247,347,348],{"class":257},"console.",[247,350,351],{"class":294},"log",[247,353,354],{"class":257},"(app.slug); ",[247,356,357],{"class":307},"// e.g. \"my-app-a3f9\": this is your appName\n",[247,359,361],{"class":249,"line":360},6,[247,362,275],{"emptyLinePlaceholder":274},[247,364,366,368,371,373,375,378,380,382,385,388,391],{"class":249,"line":365},7,[247,367,281],{"class":253},[247,369,370],{"class":284}," actor",[247,372,288],{"class":253},[247,374,321],{"class":253},[247,376,377],{"class":257}," api.actors.",[247,379,327],{"class":294},[247,381,330],{"class":257},[247,383,384],{"class":264},"\"sensor-01\"",[247,386,387],{"class":257},", actorType: ",[247,389,390],{"class":264},"\"device\"",[247,392,342],{"class":257},[247,394,396,398,400,403],{"class":249,"line":395},8,[247,397,348],{"class":257},[247,399,351],{"class":294},[247,401,402],{"class":257},"(actor.accessToken); ",[247,404,405],{"class":307},"// shown once; keep it\n",[19,407,409],{"id":408},"installation","Installation",[234,411,412],{},[237,413,418],{"className":414,"code":415,"filename":416,"language":417,"meta":243,"style":243},"language-bash shiki shiki-themes github-light github-dark","npm install @nolag/iot @nolag/js-sdk\n","Terminal","bash",[36,419,420],{"__ignoreMap":243},[247,421,422,425,428,431],{"class":249,"line":250},[247,423,424],{"class":294},"npm",[247,426,427],{"class":264}," install",[247,429,430],{"class":264}," @nolag/iot",[247,432,433],{"class":264}," @nolag/js-sdk\n",[208,435,436],{"type":210},[15,437,438,441,442,444,445,448,449,452,453,456],{},[27,439,440],{},"Shared connection."," One core NoLag client can back several wrapper SDKs at once, for example IoT telemetry, a dashboard, and notify on a single socket, as long as each wrapper uses a distinct ",[36,443,231],{},". Each wrapper attaches its handlers on construction and releases them with ",[36,446,447],{},"detach()",", and never touches the socket itself. Your app owns ",[36,450,451],{},"connect()"," and ",[36,454,455],{},"disconnect()",".",[19,458,460],{"id":459},"quick-start","Quick Start",[15,462,463,464,466],{},"The device and the controller are two clients with different device IDs. Both join the seeded ",[36,465,223],{}," group.",[234,468,469,944],{},[237,470,473],{"className":239,"code":471,"filename":472,"language":242,"meta":243,"style":243},"import { NoLag } from '@nolag/js-sdk'\nimport { NoLagIoT } from '@nolag/iot'\n\nconst client = NoLag(DEVICE_TOKEN)\nconst iot = new NoLagIoT({\n  client,\n  appName: APP_SLUG, // the slug returned when you created the app\n  deviceId: 'sensor-01',\n  role: 'device',    // one role per wrapper; 'device' is the default\n})\n\nawait client.connect()   // the app owns the connection\nawait iot.ready()        // wrapper setup complete\n\n// Join the seeded group\nconst group = iot.joinGroup('factory-floor')\n\n// Publish readings. The sensor id is the first argument; unit and tags are options.\ngroup.sendTelemetry('temperature', 22.4, { unit: 'celsius', tags: { line: 'A' } })\ngroup.sendTelemetry('humidity', 61, { unit: 'percent' })\n\n// Commands addressed to this deviceId arrive here. Ack once: 'acked' or\n// 'completed' resolves the controller's Promise, 'failed' rejects it.\ngroup.on('command', async (cmd) => {\n  console.log('Received command:', cmd.command, cmd.params, 'from', cmd.sentBy)\n  try {\n    const result = await handleCommand(cmd.command, cmd.params)\n    group.ackCommand(cmd.id, 'completed', result)\n  } catch (err) {\n    group.ackCommand(cmd.id, 'failed', err instanceof Error ? err.message : String(err))\n  }\n})\n\n// Teardown: the wrapper releases its handlers; the app closes the socket.\niot.detach()\nclient.disconnect()\n","Device",[36,474,475,487,499,503,524,541,546,560,571,586,592,597,615,632,637,643,665,670,676,710,735,740,746,752,786,808,816,835,852,864,899,905,910,915,921,933],{"__ignoreMap":243},[247,476,477,479,482,484],{"class":249,"line":250},[247,478,254],{"class":253},[247,480,481],{"class":257}," { NoLag } ",[247,483,261],{"class":253},[247,485,486],{"class":264}," '@nolag/js-sdk'\n",[247,488,489,491,494,496],{"class":249,"line":271},[247,490,254],{"class":253},[247,492,493],{"class":257}," { NoLagIoT } ",[247,495,261],{"class":253},[247,497,498],{"class":264}," '@nolag/iot'\n",[247,500,501],{"class":249,"line":278},[247,502,275],{"emptyLinePlaceholder":274},[247,504,505,507,510,512,515,518,521],{"class":249,"line":311},[247,506,281],{"class":253},[247,508,509],{"class":284}," client",[247,511,288],{"class":253},[247,513,514],{"class":294}," NoLag",[247,516,517],{"class":257},"(",[247,519,520],{"class":284},"DEVICE_TOKEN",[247,522,523],{"class":257},")\n",[247,525,526,528,531,533,535,538],{"class":249,"line":345},[247,527,281],{"class":253},[247,529,530],{"class":284}," iot",[247,532,288],{"class":253},[247,534,291],{"class":253},[247,536,537],{"class":294}," NoLagIoT",[247,539,540],{"class":257},"({\n",[247,542,543],{"class":249,"line":360},[247,544,545],{"class":257},"  client,\n",[247,547,548,551,554,557],{"class":249,"line":365},[247,549,550],{"class":257},"  appName: ",[247,552,553],{"class":284},"APP_SLUG",[247,555,556],{"class":257},", ",[247,558,559],{"class":307},"// the slug returned when you created the app\n",[247,561,562,565,568],{"class":249,"line":395},[247,563,564],{"class":257},"  deviceId: ",[247,566,567],{"class":264},"'sensor-01'",[247,569,570],{"class":257},",\n",[247,572,574,577,580,583],{"class":249,"line":573},9,[247,575,576],{"class":257},"  role: ",[247,578,579],{"class":264},"'device'",[247,581,582],{"class":257},",    ",[247,584,585],{"class":307},"// one role per wrapper; 'device' is the default\n",[247,587,589],{"class":249,"line":588},10,[247,590,591],{"class":257},"})\n",[247,593,595],{"class":249,"line":594},11,[247,596,275],{"emptyLinePlaceholder":274},[247,598,600,603,606,609,612],{"class":249,"line":599},12,[247,601,602],{"class":253},"await",[247,604,605],{"class":257}," client.",[247,607,608],{"class":294},"connect",[247,610,611],{"class":257},"()   ",[247,613,614],{"class":307},"// the app owns the connection\n",[247,616,618,620,623,626,629],{"class":249,"line":617},13,[247,619,602],{"class":253},[247,621,622],{"class":257}," iot.",[247,624,625],{"class":294},"ready",[247,627,628],{"class":257},"()        ",[247,630,631],{"class":307},"// wrapper setup complete\n",[247,633,635],{"class":249,"line":634},14,[247,636,275],{"emptyLinePlaceholder":274},[247,638,640],{"class":249,"line":639},15,[247,641,642],{"class":307},"// Join the seeded group\n",[247,644,646,648,651,653,655,658,660,663],{"class":249,"line":645},16,[247,647,281],{"class":253},[247,649,650],{"class":284}," group",[247,652,288],{"class":253},[247,654,622],{"class":257},[247,656,657],{"class":294},"joinGroup",[247,659,517],{"class":257},[247,661,662],{"class":264},"'factory-floor'",[247,664,523],{"class":257},[247,666,668],{"class":249,"line":667},17,[247,669,275],{"emptyLinePlaceholder":274},[247,671,673],{"class":249,"line":672},18,[247,674,675],{"class":307},"// Publish readings. The sensor id is the first argument; unit and tags are options.\n",[247,677,679,682,685,687,690,692,695,698,701,704,707],{"class":249,"line":678},19,[247,680,681],{"class":257},"group.",[247,683,684],{"class":294},"sendTelemetry",[247,686,517],{"class":257},[247,688,689],{"class":264},"'temperature'",[247,691,556],{"class":257},[247,693,694],{"class":284},"22.4",[247,696,697],{"class":257},", { unit: ",[247,699,700],{"class":264},"'celsius'",[247,702,703],{"class":257},", tags: { line: ",[247,705,706],{"class":264},"'A'",[247,708,709],{"class":257}," } })\n",[247,711,713,715,717,719,722,724,727,729,732],{"class":249,"line":712},20,[247,714,681],{"class":257},[247,716,684],{"class":294},[247,718,517],{"class":257},[247,720,721],{"class":264},"'humidity'",[247,723,556],{"class":257},[247,725,726],{"class":284},"61",[247,728,697],{"class":257},[247,730,731],{"class":264},"'percent'",[247,733,734],{"class":257}," })\n",[247,736,738],{"class":249,"line":737},21,[247,739,275],{"emptyLinePlaceholder":274},[247,741,743],{"class":249,"line":742},22,[247,744,745],{"class":307},"// Commands addressed to this deviceId arrive here. Ack once: 'acked' or\n",[247,747,749],{"class":249,"line":748},23,[247,750,751],{"class":307},"// 'completed' resolves the controller's Promise, 'failed' rejects it.\n",[247,753,755,757,760,762,765,767,770,773,777,780,783],{"class":249,"line":754},24,[247,756,681],{"class":257},[247,758,759],{"class":294},"on",[247,761,517],{"class":257},[247,763,764],{"class":264},"'command'",[247,766,556],{"class":257},[247,768,769],{"class":253},"async",[247,771,772],{"class":257}," (",[247,774,776],{"class":775},"s4XuR","cmd",[247,778,779],{"class":257},") ",[247,781,782],{"class":253},"=>",[247,784,785],{"class":257}," {\n",[247,787,789,792,794,796,799,802,805],{"class":249,"line":788},25,[247,790,791],{"class":257},"  console.",[247,793,351],{"class":294},[247,795,517],{"class":257},[247,797,798],{"class":264},"'Received command:'",[247,800,801],{"class":257},", cmd.command, cmd.params, ",[247,803,804],{"class":264},"'from'",[247,806,807],{"class":257},", cmd.sentBy)\n",[247,809,811,814],{"class":249,"line":810},26,[247,812,813],{"class":253},"  try",[247,815,785],{"class":257},[247,817,819,822,825,827,829,832],{"class":249,"line":818},27,[247,820,821],{"class":253},"    const",[247,823,824],{"class":284}," result",[247,826,288],{"class":253},[247,828,321],{"class":253},[247,830,831],{"class":294}," handleCommand",[247,833,834],{"class":257},"(cmd.command, cmd.params)\n",[247,836,838,841,844,847,849],{"class":249,"line":837},28,[247,839,840],{"class":257},"    group.",[247,842,843],{"class":294},"ackCommand",[247,845,846],{"class":257},"(cmd.id, ",[247,848,138],{"class":264},[247,850,851],{"class":257},", result)\n",[247,853,855,858,861],{"class":249,"line":854},29,[247,856,857],{"class":257},"  } ",[247,859,860],{"class":253},"catch",[247,862,863],{"class":257}," (err) {\n",[247,865,867,869,871,873,875,878,881,884,887,890,893,896],{"class":249,"line":866},30,[247,868,840],{"class":257},[247,870,843],{"class":294},[247,872,846],{"class":257},[247,874,142],{"class":264},[247,876,877],{"class":257},", err ",[247,879,880],{"class":253},"instanceof",[247,882,883],{"class":294}," Error",[247,885,886],{"class":253}," ?",[247,888,889],{"class":257}," err.message ",[247,891,892],{"class":253},":",[247,894,895],{"class":294}," String",[247,897,898],{"class":257},"(err))\n",[247,900,902],{"class":249,"line":901},31,[247,903,904],{"class":257},"  }\n",[247,906,908],{"class":249,"line":907},32,[247,909,591],{"class":257},[247,911,913],{"class":249,"line":912},33,[247,914,275],{"emptyLinePlaceholder":274},[247,916,918],{"class":249,"line":917},34,[247,919,920],{"class":307},"// Teardown: the wrapper releases its handlers; the app closes the socket.\n",[247,922,924,927,930],{"class":249,"line":923},35,[247,925,926],{"class":257},"iot.",[247,928,929],{"class":294},"detach",[247,931,932],{"class":257},"()\n",[247,934,936,939,942],{"class":249,"line":935},36,[247,937,938],{"class":257},"client.",[247,940,941],{"class":294},"disconnect",[247,943,932],{"class":257},[237,945,948],{"className":239,"code":946,"filename":947,"language":242,"meta":243,"style":243},"import { NoLag } from '@nolag/js-sdk'\nimport { NoLagIoT } from '@nolag/iot'\n\nconst client = NoLag(CONTROLLER_TOKEN)\nconst iot = new NoLagIoT({\n  client,\n  appName: APP_SLUG, // the slug returned when you created the app\n  deviceId: 'control-room',\n  role: 'controller',\n})\n\nawait client.connect()\nawait iot.ready()\n\nconst group = iot.joinGroup('factory-floor')\n\n// Watch telemetry from every device in the group\ngroup.on('telemetry', ({ deviceId, sensorId, value, unit, timestamp }) => {\n  console.log(`[${deviceId}] ${sensorId}: ${value} ${unit ?? ''}`, new Date(timestamp))\n})\n\n// Read the in-memory buffer (synchronous). Omit arguments for everything.\nconst readings = group.getTelemetry('sensor-01', 'temperature')\nconsole.log('Last temperature:', readings[readings.length - 1]?.value)\n\n// Dispatch a command. Resolves when the device acks ('acked' or 'completed'),\n// rejects on 'failed' or after commandTimeout.\ntry {\n  const cmd = await group.sendCommand('sensor-01', 'reboot', { delay: 5000 })\n  console.log('Command', cmd.id, 'status:', cmd.status, 'result:', cmd.result)\n} catch (err) {\n  console.error('Command failed or timed out:', err)\n}\n\n// Acks for commands this controller sent\ngroup.on('commandAck', (cmd) => {\n  console.log(`Command ${cmd.id} for ${cmd.targetDeviceId}: ${cmd.status}`)\n})\n\n// Presence\niot.on('deviceOnline', (device) => console.log('Online:', device.deviceId))\niot.on('deviceOffline', (device) => console.log('Offline:', device.deviceId))\n\niot.detach()\nclient.disconnect()\n","Controller",[36,949,950,960,970,974,991,1005,1009,1019,1028,1037,1041,1045,1055,1065,1069,1087,1091,1096,1139,1184,1188,1192,1197,1221,1247,1251,1256,1261,1268,1302,1328,1337,1352,1357,1361,1366,1388,1431,1436,1441,1447,1481,1512,1517,1526],{"__ignoreMap":243},[247,951,952,954,956,958],{"class":249,"line":250},[247,953,254],{"class":253},[247,955,481],{"class":257},[247,957,261],{"class":253},[247,959,486],{"class":264},[247,961,962,964,966,968],{"class":249,"line":271},[247,963,254],{"class":253},[247,965,493],{"class":257},[247,967,261],{"class":253},[247,969,498],{"class":264},[247,971,972],{"class":249,"line":278},[247,973,275],{"emptyLinePlaceholder":274},[247,975,976,978,980,982,984,986,989],{"class":249,"line":311},[247,977,281],{"class":253},[247,979,509],{"class":284},[247,981,288],{"class":253},[247,983,514],{"class":294},[247,985,517],{"class":257},[247,987,988],{"class":284},"CONTROLLER_TOKEN",[247,990,523],{"class":257},[247,992,993,995,997,999,1001,1003],{"class":249,"line":345},[247,994,281],{"class":253},[247,996,530],{"class":284},[247,998,288],{"class":253},[247,1000,291],{"class":253},[247,1002,537],{"class":294},[247,1004,540],{"class":257},[247,1006,1007],{"class":249,"line":360},[247,1008,545],{"class":257},[247,1010,1011,1013,1015,1017],{"class":249,"line":365},[247,1012,550],{"class":257},[247,1014,553],{"class":284},[247,1016,556],{"class":257},[247,1018,559],{"class":307},[247,1020,1021,1023,1026],{"class":249,"line":395},[247,1022,564],{"class":257},[247,1024,1025],{"class":264},"'control-room'",[247,1027,570],{"class":257},[247,1029,1030,1032,1035],{"class":249,"line":573},[247,1031,576],{"class":257},[247,1033,1034],{"class":264},"'controller'",[247,1036,570],{"class":257},[247,1038,1039],{"class":249,"line":588},[247,1040,591],{"class":257},[247,1042,1043],{"class":249,"line":594},[247,1044,275],{"emptyLinePlaceholder":274},[247,1046,1047,1049,1051,1053],{"class":249,"line":599},[247,1048,602],{"class":253},[247,1050,605],{"class":257},[247,1052,608],{"class":294},[247,1054,932],{"class":257},[247,1056,1057,1059,1061,1063],{"class":249,"line":617},[247,1058,602],{"class":253},[247,1060,622],{"class":257},[247,1062,625],{"class":294},[247,1064,932],{"class":257},[247,1066,1067],{"class":249,"line":634},[247,1068,275],{"emptyLinePlaceholder":274},[247,1070,1071,1073,1075,1077,1079,1081,1083,1085],{"class":249,"line":639},[247,1072,281],{"class":253},[247,1074,650],{"class":284},[247,1076,288],{"class":253},[247,1078,622],{"class":257},[247,1080,657],{"class":294},[247,1082,517],{"class":257},[247,1084,662],{"class":264},[247,1086,523],{"class":257},[247,1088,1089],{"class":249,"line":645},[247,1090,275],{"emptyLinePlaceholder":274},[247,1092,1093],{"class":249,"line":667},[247,1094,1095],{"class":307},"// Watch telemetry from every device in the group\n",[247,1097,1098,1100,1102,1104,1107,1110,1112,1114,1117,1119,1122,1124,1127,1129,1132,1135,1137],{"class":249,"line":672},[247,1099,681],{"class":257},[247,1101,759],{"class":294},[247,1103,517],{"class":257},[247,1105,1106],{"class":264},"'telemetry'",[247,1108,1109],{"class":257},", ({ ",[247,1111,105],{"class":775},[247,1113,556],{"class":257},[247,1115,1116],{"class":775},"sensorId",[247,1118,556],{"class":257},[247,1120,1121],{"class":775},"value",[247,1123,556],{"class":257},[247,1125,1126],{"class":775},"unit",[247,1128,556],{"class":257},[247,1130,1131],{"class":775},"timestamp",[247,1133,1134],{"class":257}," }) ",[247,1136,782],{"class":253},[247,1138,785],{"class":257},[247,1140,1141,1143,1145,1147,1150,1152,1155,1157,1160,1162,1165,1167,1170,1173,1175,1178,1181],{"class":249,"line":678},[247,1142,791],{"class":257},[247,1144,351],{"class":294},[247,1146,517],{"class":257},[247,1148,1149],{"class":264},"`[${",[247,1151,105],{"class":257},[247,1153,1154],{"class":264},"}] ${",[247,1156,1116],{"class":257},[247,1158,1159],{"class":264},"}: ${",[247,1161,1121],{"class":257},[247,1163,1164],{"class":264},"} ${",[247,1166,1126],{"class":257},[247,1168,1169],{"class":253}," ??",[247,1171,1172],{"class":264}," ''}`",[247,1174,556],{"class":257},[247,1176,1177],{"class":253},"new",[247,1179,1180],{"class":294}," Date",[247,1182,1183],{"class":257},"(timestamp))\n",[247,1185,1186],{"class":249,"line":712},[247,1187,591],{"class":257},[247,1189,1190],{"class":249,"line":737},[247,1191,275],{"emptyLinePlaceholder":274},[247,1193,1194],{"class":249,"line":742},[247,1195,1196],{"class":307},"// Read the in-memory buffer (synchronous). Omit arguments for everything.\n",[247,1198,1199,1201,1204,1206,1208,1211,1213,1215,1217,1219],{"class":249,"line":748},[247,1200,281],{"class":253},[247,1202,1203],{"class":284}," readings",[247,1205,288],{"class":253},[247,1207,466],{"class":257},[247,1209,1210],{"class":294},"getTelemetry",[247,1212,517],{"class":257},[247,1214,567],{"class":264},[247,1216,556],{"class":257},[247,1218,689],{"class":264},[247,1220,523],{"class":257},[247,1222,1223,1225,1227,1229,1232,1235,1238,1241,1244],{"class":249,"line":754},[247,1224,348],{"class":257},[247,1226,351],{"class":294},[247,1228,517],{"class":257},[247,1230,1231],{"class":264},"'Last temperature:'",[247,1233,1234],{"class":257},", readings[readings.",[247,1236,1237],{"class":284},"length",[247,1239,1240],{"class":253}," -",[247,1242,1243],{"class":284}," 1",[247,1245,1246],{"class":257},"]?.value)\n",[247,1248,1249],{"class":249,"line":788},[247,1250,275],{"emptyLinePlaceholder":274},[247,1252,1253],{"class":249,"line":810},[247,1254,1255],{"class":307},"// Dispatch a command. Resolves when the device acks ('acked' or 'completed'),\n",[247,1257,1258],{"class":249,"line":818},[247,1259,1260],{"class":307},"// rejects on 'failed' or after commandTimeout.\n",[247,1262,1263,1266],{"class":249,"line":837},[247,1264,1265],{"class":253},"try",[247,1267,785],{"class":257},[247,1269,1270,1273,1276,1278,1280,1282,1285,1287,1289,1291,1294,1297,1300],{"class":249,"line":854},[247,1271,1272],{"class":253},"  const",[247,1274,1275],{"class":284}," cmd",[247,1277,288],{"class":253},[247,1279,321],{"class":253},[247,1281,466],{"class":257},[247,1283,1284],{"class":294},"sendCommand",[247,1286,517],{"class":257},[247,1288,567],{"class":264},[247,1290,556],{"class":257},[247,1292,1293],{"class":264},"'reboot'",[247,1295,1296],{"class":257},", { delay: ",[247,1298,1299],{"class":284},"5000",[247,1301,734],{"class":257},[247,1303,1304,1306,1308,1310,1313,1316,1319,1322,1325],{"class":249,"line":866},[247,1305,791],{"class":257},[247,1307,351],{"class":294},[247,1309,517],{"class":257},[247,1311,1312],{"class":264},"'Command'",[247,1314,1315],{"class":257},", cmd.id, ",[247,1317,1318],{"class":264},"'status:'",[247,1320,1321],{"class":257},", cmd.status, ",[247,1323,1324],{"class":264},"'result:'",[247,1326,1327],{"class":257},", cmd.result)\n",[247,1329,1330,1333,1335],{"class":249,"line":901},[247,1331,1332],{"class":257},"} ",[247,1334,860],{"class":253},[247,1336,863],{"class":257},[247,1338,1339,1341,1344,1346,1349],{"class":249,"line":907},[247,1340,791],{"class":257},[247,1342,1343],{"class":294},"error",[247,1345,517],{"class":257},[247,1347,1348],{"class":264},"'Command failed or timed out:'",[247,1350,1351],{"class":257},", err)\n",[247,1353,1354],{"class":249,"line":912},[247,1355,1356],{"class":257},"}\n",[247,1358,1359],{"class":249,"line":917},[247,1360,275],{"emptyLinePlaceholder":274},[247,1362,1363],{"class":249,"line":923},[247,1364,1365],{"class":307},"// Acks for commands this controller sent\n",[247,1367,1368,1370,1372,1374,1377,1380,1382,1384,1386],{"class":249,"line":935},[247,1369,681],{"class":257},[247,1371,759],{"class":294},[247,1373,517],{"class":257},[247,1375,1376],{"class":264},"'commandAck'",[247,1378,1379],{"class":257},", (",[247,1381,776],{"class":775},[247,1383,779],{"class":257},[247,1385,782],{"class":253},[247,1387,785],{"class":257},[247,1389,1391,1393,1395,1397,1400,1402,1404,1407,1410,1412,1414,1417,1419,1421,1423,1426,1429],{"class":249,"line":1390},37,[247,1392,791],{"class":257},[247,1394,351],{"class":294},[247,1396,517],{"class":257},[247,1398,1399],{"class":264},"`Command ${",[247,1401,776],{"class":257},[247,1403,456],{"class":264},[247,1405,1406],{"class":257},"id",[247,1408,1409],{"class":264},"} for ${",[247,1411,776],{"class":257},[247,1413,456],{"class":264},[247,1415,1416],{"class":257},"targetDeviceId",[247,1418,1159],{"class":264},[247,1420,776],{"class":257},[247,1422,456],{"class":264},[247,1424,1425],{"class":257},"status",[247,1427,1428],{"class":264},"}`",[247,1430,523],{"class":257},[247,1432,1434],{"class":249,"line":1433},38,[247,1435,591],{"class":257},[247,1437,1439],{"class":249,"line":1438},39,[247,1440,275],{"emptyLinePlaceholder":274},[247,1442,1444],{"class":249,"line":1443},40,[247,1445,1446],{"class":307},"// Presence\n",[247,1448,1450,1452,1454,1456,1459,1461,1464,1466,1468,1471,1473,1475,1478],{"class":249,"line":1449},41,[247,1451,926],{"class":257},[247,1453,759],{"class":294},[247,1455,517],{"class":257},[247,1457,1458],{"class":264},"'deviceOnline'",[247,1460,1379],{"class":257},[247,1462,1463],{"class":775},"device",[247,1465,779],{"class":257},[247,1467,782],{"class":253},[247,1469,1470],{"class":257}," console.",[247,1472,351],{"class":294},[247,1474,517],{"class":257},[247,1476,1477],{"class":264},"'Online:'",[247,1479,1480],{"class":257},", device.deviceId))\n",[247,1482,1484,1486,1488,1490,1493,1495,1497,1499,1501,1503,1505,1507,1510],{"class":249,"line":1483},42,[247,1485,926],{"class":257},[247,1487,759],{"class":294},[247,1489,517],{"class":257},[247,1491,1492],{"class":264},"'deviceOffline'",[247,1494,1379],{"class":257},[247,1496,1463],{"class":775},[247,1498,779],{"class":257},[247,1500,782],{"class":253},[247,1502,1470],{"class":257},[247,1504,351],{"class":294},[247,1506,517],{"class":257},[247,1508,1509],{"class":264},"'Offline:'",[247,1511,1480],{"class":257},[247,1513,1515],{"class":249,"line":1514},43,[247,1516,275],{"emptyLinePlaceholder":274},[247,1518,1520,1522,1524],{"class":249,"line":1519},44,[247,1521,926],{"class":257},[247,1523,929],{"class":294},[247,1525,932],{"class":257},[247,1527,1529,1531,1533],{"class":249,"line":1528},45,[247,1530,938],{"class":257},[247,1532,941],{"class":294},[247,1534,932],{"class":257},[19,1536,1538],{"id":1537},"api-reference","API Reference",[41,1540,38],{"id":1541},"nolagiot-1",[1543,1544,1546],"h4",{"id":1545},"constructor-options","Constructor Options",[152,1548,1549,1562],{},[155,1550,1551],{},[158,1552,1553,1556,1559],{},[161,1554,1555],{},"Option",[161,1557,1558],{},"Type",[161,1560,1561],{},"Description",[168,1563,1564,1582,1600,1613,1627,1645,1660,1675,1693,1709],{},[158,1565,1566,1571,1576],{},[173,1567,1568],{},[36,1569,1570],{},"client",[173,1572,1573],{},[36,1574,1575],{},"NoLagSocket",[173,1577,1578,1581],{},[27,1579,1580],{},"Required."," The injected core NoLag client the app owns and connects.",[158,1583,1584,1588,1593],{},[173,1585,1586],{},[36,1587,231],{},[173,1589,1590],{},[36,1591,1592],{},"string",[173,1594,1595,1596,1599],{},"The app slug used as the topic prefix. Pass the suffixed slug returned when you created the app; the default ",[36,1597,1598],{},"'iot'"," will not match a hosted app.",[158,1601,1602,1606,1610],{},[173,1603,1604],{},[36,1605,105],{},[173,1607,1608],{},[36,1609,1592],{},[173,1611,1612],{},"Stable device identifier (auto-generated if omitted). Used as the filter for commands (device) or acks (controller).",[158,1614,1615,1620,1624],{},[173,1616,1617],{},[36,1618,1619],{},"deviceName",[173,1621,1622],{},[36,1623,1592],{},[173,1625,1626],{},"Optional human-readable device name.",[158,1628,1629,1634,1639],{},[173,1630,1631],{},[36,1632,1633],{},"role",[173,1635,1636],{},[36,1637,1638],{},"'device' | 'controller'",[173,1640,1641,1642,1644],{},"The one role this wrapper plays (default ",[36,1643,579],{},").",[158,1646,1647,1652,1657],{},[173,1648,1649],{},[36,1650,1651],{},"metadata",[173,1653,1654],{},[36,1655,1656],{},"Record\u003Cstring, unknown>",[173,1658,1659],{},"Optional custom data attached to device presence.",[158,1661,1662,1667,1672],{},[173,1663,1664],{},[36,1665,1666],{},"groups",[173,1668,1669],{},[36,1670,1671],{},"string[]",[173,1673,1674],{},"Groups to join once the wrapper is ready.",[158,1676,1677,1682,1687],{},[173,1678,1679],{},[36,1680,1681],{},"maxTelemetryPoints",[173,1683,1684],{},[36,1685,1686],{},"number",[173,1688,1689,1690,1644],{},"Max telemetry readings retained per device/sensor pair (default ",[36,1691,1692],{},"1000",[158,1694,1695,1699,1703],{},[173,1696,1697],{},[36,1698,146],{},[173,1700,1701],{},[36,1702,1686],{},[173,1704,1705,1706,1644],{},"Command acknowledgment timeout in ms (default ",[36,1707,1708],{},"30000",[158,1710,1711,1716,1721],{},[173,1712,1713],{},[36,1714,1715],{},"debug",[173,1717,1718],{},[36,1719,1720],{},"boolean",[173,1722,1723,1724,1644],{},"Enable wrapper debug logging (default ",[36,1725,1726],{},"false",[152,1728,1729,1741],{},[155,1730,1731],{},[158,1732,1733,1736,1739],{},[161,1734,1735],{},"Method",[161,1737,1738],{},"Returns",[161,1740,1561],{},[168,1742,1743,1758,1772,1790,1804,1819],{},[158,1744,1745,1750,1755],{},[173,1746,1747],{},[36,1748,1749],{},"ready()",[173,1751,1752],{},[36,1753,1754],{},"Promise\u003Cvoid>",[173,1756,1757],{},"Resolves once wrapper setup completed. Join methods throw before this resolves.",[158,1759,1760,1764,1769],{},[173,1761,1762],{},[36,1763,447],{},[173,1765,1766],{},[36,1767,1768],{},"void",[173,1770,1771],{},"Release this wrapper's handlers and topics, and clear pending command timers; terminal, never closes the socket.",[158,1773,1774,1779,1783],{},[173,1775,1776],{},[36,1777,1778],{},"joinGroup(name, opts?)",[173,1780,1781],{},[36,1782,86],{},[173,1784,1785,1786,1789],{},"Subscribe to a device group and return it. Synchronous; returns the existing instance if already joined. ",[36,1787,1788],{},"opts.filters"," limits the telemetry subscription; commands and acks keep their device-ID routing.",[158,1791,1792,1797,1801],{},[173,1793,1794],{},[36,1795,1796],{},"leaveGroup(name)",[173,1798,1799],{},[36,1800,1768],{},[173,1802,1803],{},"Unsubscribe from a device group and release its resources.",[158,1805,1806,1811,1816],{},[173,1807,1808],{},[36,1809,1810],{},"getGroups()",[173,1812,1813],{},[36,1814,1815],{},"DeviceGroup[]",[173,1817,1818],{},"All currently joined groups.",[158,1820,1821,1826,1831],{},[173,1822,1823],{},[36,1824,1825],{},"getOnlineDevices()",[173,1827,1828],{},[36,1829,1830],{},"Device[]",[173,1832,1833,1834,1836],{},"Devices currently present in the ",[36,1835,227],{}," lobby.",[41,1838,1840],{"id":1839},"nolagiot-events","NoLagIoT Events",[152,1842,1843,1855],{},[155,1844,1845],{},[158,1846,1847,1850,1853],{},[161,1848,1849],{},"Event",[161,1851,1852],{},"Payload",[161,1854,1561],{},[168,1856,1857,1870,1885,1897,1909,1923,1938],{},[158,1858,1859,1864,1867],{},[173,1860,1861],{},[36,1862,1863],{},"connected",[173,1865,1866],{},"none",[173,1868,1869],{},"Wrapper setup completed on a live connection.",[158,1871,1872,1877,1882],{},[173,1873,1874],{},[36,1875,1876],{},"disconnected",[173,1878,1879],{},[36,1880,1881],{},"reason: string",[173,1883,1884],{},"Connection closed.",[158,1886,1887,1892,1894],{},[173,1888,1889],{},[36,1890,1891],{},"reconnecting",[173,1893,1866],{},[173,1895,1896],{},"The core client is attempting to reconnect.",[158,1898,1899,1904,1906],{},[173,1900,1901],{},[36,1902,1903],{},"reconnected",[173,1905,1866],{},[173,1907,1908],{},"Connection restored; group membership and presence are restored automatically.",[158,1910,1911,1915,1920],{},[173,1912,1913],{},[36,1914,1343],{},[173,1916,1917],{},[36,1918,1919],{},"error: Error",[173,1921,1922],{},"A transport or protocol error occurred.",[158,1924,1925,1930,1935],{},[173,1926,1927],{},[36,1928,1929],{},"deviceOnline",[173,1931,1932],{},[36,1933,1934],{},"device: Device",[173,1936,1937],{},"A device joined the lobby.",[158,1939,1940,1945,1949],{},[173,1941,1942],{},[36,1943,1944],{},"deviceOffline",[173,1946,1947],{},[36,1948,1934],{},[173,1950,1951],{},"A device left the lobby.",[41,1953,86],{"id":1954},"devicegroup",[152,1956,1957,1970],{},[155,1958,1959],{},[158,1960,1961,1963,1966,1968],{},[161,1962,1735],{},[161,1964,1965],{},"Role",[161,1967,1738],{},[161,1969,1561],{},[168,1971,1972,1999,2020,2045,2077,2093,2110],{},[158,1973,1974,1979,1981,1986],{},[173,1975,1976],{},[36,1977,1978],{},"sendTelemetry(sensorId, value, opts?)",[173,1980,472],{},[173,1982,1983],{},[36,1984,1985],{},"TelemetryReading",[173,1987,1988,1989,1991,1992,1995,1996,456],{},"Publish a reading and return it. ",[36,1990,1121],{}," is a number, string, boolean or object; ",[36,1993,1994],{},"opts"," is ",[36,1997,1998],{},"{ unit?, tags?, filter?, filters? }",[158,2000,2001,2006,2009,2014],{},[173,2002,2003],{},[36,2004,2005],{},"getTelemetry(deviceId?, sensorId?)",[173,2007,2008],{},"Both",[173,2010,2011],{},[36,2012,2013],{},"TelemetryReading[]",[173,2015,2016,2017,2019],{},"Read buffered readings, oldest first. Omit both arguments for every device and sensor, or pass only ",[36,2018,105],{}," for one device.",[158,2021,2022,2027,2029,2034],{},[173,2023,2024],{},[36,2025,2026],{},"sendCommand(targetDeviceId, command, params?)",[173,2028,947],{},[173,2030,2031],{},[36,2032,2033],{},"Promise\u003CDeviceCommand>",[173,2035,2036,2037,135,2039,2041,2042,2044],{},"Dispatch a named command to one device. Resolves on ",[36,2038,134],{},[36,2040,138],{},", rejects on ",[36,2043,142],{}," or timeout.",[158,2046,2047,2052,2054,2058],{},[173,2048,2049],{},[36,2050,2051],{},"ackCommand(commandId, status, result?)",[173,2053,472],{},[173,2055,2056],{},[36,2057,1768],{},[173,2059,2060,2061,1995,2063,556,2065,135,2067,2069,2070,2072,2073,2076],{},"Acknowledge a received command. ",[36,2062,1425],{},[36,2064,134],{},[36,2066,138],{},[36,2068,142],{},"; on ",[36,2071,142],{}," a string ",[36,2074,2075],{},"result"," becomes the error message.",[158,2078,2079,2084,2086,2090],{},[173,2080,2081],{},[36,2082,2083],{},"getDevices()",[173,2085,2008],{},[173,2087,2088],{},[36,2089,1830],{},[173,2091,2092],{},"Remote devices present in this group.",[158,2094,2095,2100,2102,2107],{},[173,2096,2097],{},[36,2098,2099],{},"getDevice(deviceId)",[173,2101,2008],{},[173,2103,2104],{},[36,2105,2106],{},"Device | undefined",[173,2108,2109],{},"One remote device by ID.",[158,2111,2112,2124,2126,2130],{},[173,2113,2114,2117,2118,2117,2121],{},[36,2115,2116],{},"setFilters(values)"," / ",[36,2119,2120],{},"addFilters(values)",[36,2122,2123],{},"removeFilters(values)",[173,2125,2008],{},[173,2127,2128],{},[36,2129,1768],{},[173,2131,2132],{},"Change which telemetry filter values this group receives. Commands and acks are unaffected.",[41,2134,2136],{"id":2135},"devicegroup-events","DeviceGroup Events",[152,2138,2139,2149],{},[155,2140,2141],{},[158,2142,2143,2145,2147],{},[161,2144,1849],{},[161,2146,1852],{},[161,2148,1561],{},[168,2150,2151,2164,2177,2196,2210],{},[158,2152,2153,2157,2161],{},[173,2154,2155],{},[36,2156,90],{},[173,2158,2159],{},[36,2160,1985],{},[173,2162,2163],{},"A reading was received from another device in the group.",[158,2165,2166,2170,2174],{},[173,2167,2168],{},[36,2169,115],{},[173,2171,2172],{},[36,2173,126],{},[173,2175,2176],{},"A command addressed to this device arrived (device role only).",[158,2178,2179,2184,2188],{},[173,2180,2181],{},[36,2182,2183],{},"commandAck",[173,2185,2186],{},[36,2187,126],{},[173,2189,2190,2191,452,2193,2195],{},"A device acknowledged a command this controller sent; ",[36,2192,1425],{},[36,2194,2075],{}," reflect the ack.",[158,2197,2198,2203,2207],{},[173,2199,2200],{},[36,2201,2202],{},"deviceJoined",[173,2204,2205],{},[36,2206,1934],{},[173,2208,2209],{},"A device joined this group.",[158,2211,2212,2217,2221],{},[173,2213,2214],{},[36,2215,2216],{},"deviceLeft",[173,2218,2219],{},[36,2220,1934],{},[173,2222,2223],{},"A device left this group.",[41,2225,2227],{"id":2226},"types","Types",[152,2229,2230,2239],{},[155,2231,2232],{},[158,2233,2234,2236],{},[161,2235,1558],{},[161,2237,2238],{},"Shape",[168,2240,2241,2252,2263,2275],{},[158,2242,2243,2247],{},[173,2244,2245],{},[36,2246,1985],{},[173,2248,2249],{},[36,2250,2251],{},"{ id, deviceId, sensorId, value, unit?, tags?, timestamp, isReplay }",[158,2253,2254,2258],{},[173,2255,2256],{},[36,2257,126],{},[173,2259,2260],{},[36,2261,2262],{},"{ id, targetDeviceId, command, params?, status, sentBy, sentAt, ackedAt?, completedAt?, result?, error? }",[158,2264,2265,2270],{},[173,2266,2267],{},[36,2268,2269],{},"CommandStatus",[173,2271,2272],{},[36,2273,2274],{},"'pending' | 'acked' | 'completed' | 'failed' | 'timeout'",[158,2276,2277,2281],{},[173,2278,2279],{},[36,2280,472],{},[173,2282,2283],{},[36,2284,2285],{},"{ deviceId, actorTokenId, deviceName?, role, metadata?, joinedAt, isLocal }",[2287,2288,2289],"style",{},"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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":243,"searchDepth":271,"depth":271,"links":2291},[2292,2295,2296,2297,2298],{"id":21,"depth":271,"text":22,"children":2293},[2294],{"id":43,"depth":278,"text":44},{"id":69,"depth":271,"text":70},{"id":408,"depth":271,"text":409},{"id":459,"depth":271,"text":460},{"id":1537,"depth":271,"text":1538,"children":2299},[2300,2301,2302,2303,2304],{"id":1541,"depth":278,"text":38},{"id":1839,"depth":278,"text":1840},{"id":1954,"depth":278,"text":86},{"id":2135,"depth":278,"text":2136},{"id":2226,"depth":278,"text":2227},"IoT device telemetry and command dispatch with acknowledgment tracking for connected device fleets.","md",{},"/docs/high-level-sdks/iot",{"title":5,"description":2305},"docs/high-level-sdks/iot","L12OJe6v5CNDryWYqe7eZDiMpt9e3SlF5q60mtRMs-o",1789869420365]