[{"data":1,"prerenderedAt":3198},["ShallowReactive",2],{"navigation":3,"-docs-websocket":407,"-docs-websocket-surround":3193},[4,93,226,232,392,404],{"title":5,"path":6,"stem":7,"children":8,"icon":92},"","\u002Fdocs","1.docs\u002F1.index",[9,12,17,22,27,32,37,42,47,52,57,62,67,72,77,82,87],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-compass",{"title":13,"path":14,"stem":15,"icon":16},"Quick Start","\u002Fdocs\u002Fquick-start","1.docs\u002F2.quick-start","i-lucide-zap",{"title":18,"path":19,"stem":20,"icon":21},"Renderer","\u002Fdocs\u002Frenderer","1.docs\u002F4.renderer","ri:layout-masonry-line",{"title":23,"path":24,"stem":25,"icon":26},"Routing","\u002Fdocs\u002Frouting","1.docs\u002F5.routing","ri:direction-line",{"title":28,"path":29,"stem":30,"icon":31},"Assets","\u002Fdocs\u002Fassets","1.docs\u002F50.assets","ri:image-2-line",{"title":33,"path":34,"stem":35,"icon":36},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F50.configuration","ri:settings-3-line",{"title":38,"path":39,"stem":40,"icon":41},"Database","\u002Fdocs\u002Fdatabase","1.docs\u002F50.database","ri:database-2-line",{"title":43,"path":44,"stem":45,"icon":46},"Lifecycle","\u002Fdocs\u002Flifecycle","1.docs\u002F50.lifecycle","i-lucide-layers",{"title":48,"path":49,"stem":50,"icon":51},"OpenAPI","\u002Fdocs\u002Fopenapi","1.docs\u002F50.openapi","ri:contract-line",{"title":53,"path":54,"stem":55,"icon":56},"Plugins","\u002Fdocs\u002Fplugins","1.docs\u002F50.plugins","ri:plug-line",{"title":58,"path":59,"stem":60,"icon":61},"Tasks","\u002Fdocs\u002Ftasks","1.docs\u002F50.tasks","codicon:run-all",{"title":63,"path":64,"stem":65,"icon":66},"WebSocket","\u002Fdocs\u002Fwebsocket","1.docs\u002F50.websocket","ri:broadcast-fill",{"title":68,"path":69,"stem":70,"icon":71},"Server Entry","\u002Fdocs\u002Fserver-entry","1.docs\u002F6.server-entry","ri:server-line",{"title":73,"path":74,"stem":75,"icon":76},"Cache","\u002Fdocs\u002Fcache","1.docs\u002F7.cache","ri:speed-line",{"title":78,"path":79,"stem":80,"icon":81},"KV Storage","\u002Fdocs\u002Fstorage","1.docs\u002F8.storage","carbon:datastore",{"title":83,"path":84,"stem":85,"icon":86},"Migration Guide","\u002Fdocs\u002Fmigration","1.docs\u002F99.migration","ri:arrow-right-up-line",{"title":88,"path":89,"stem":90,"icon":91},"Nightly Channel","\u002Fdocs\u002Fnightly","1.docs\u002F99.nightly","ri:moon-fill","i-lucide-book-open",{"title":94,"path":95,"stem":96,"children":97,"icon":99},"Deploy","\u002Fdeploy","2.deploy\u002F0.index",[98,100,121],{"title":94,"path":95,"stem":96,"icon":99},"ri:upload-cloud-2-line",{"title":101,"path":102,"stem":103,"children":104,"page":120},"Runtimes","\u002Fdeploy\u002Fruntimes","2.deploy\u002F10.runtimes",[105,110,115],{"title":106,"path":107,"stem":108,"icon":109},"Node.js","\u002Fdeploy\u002Fruntimes\u002Fnode","2.deploy\u002F10.runtimes\u002F1.node","akar-icons:node-fill",{"title":111,"path":112,"stem":113,"icon":114},"Bun","\u002Fdeploy\u002Fruntimes\u002Fbun","2.deploy\u002F10.runtimes\u002Fbun","simple-icons:bun",{"title":116,"path":117,"stem":118,"icon":119},"Deno","\u002Fdeploy\u002Fruntimes\u002Fdeno","2.deploy\u002F10.runtimes\u002Fdeno","simple-icons:deno",false,{"title":122,"path":123,"stem":124,"children":125,"page":120},"Providers","\u002Fdeploy\u002Fproviders","2.deploy\u002F20.providers",[126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222],{"title":127,"path":128,"stem":129},"Alwaysdata","\u002Fdeploy\u002Fproviders\u002Falwaysdata","2.deploy\u002F20.providers\u002Falwaysdata",{"title":131,"path":132,"stem":133},"AWS Lambda","\u002Fdeploy\u002Fproviders\u002Faws","2.deploy\u002F20.providers\u002Faws",{"title":135,"path":136,"stem":137},"AWS Amplify","\u002Fdeploy\u002Fproviders\u002Faws-amplify","2.deploy\u002F20.providers\u002Faws-amplify",{"title":139,"path":140,"stem":141},"Azure","\u002Fdeploy\u002Fproviders\u002Fazure","2.deploy\u002F20.providers\u002Fazure",{"title":143,"path":144,"stem":145},"Cleavr","\u002Fdeploy\u002Fproviders\u002Fcleavr","2.deploy\u002F20.providers\u002Fcleavr",{"title":147,"path":148,"stem":149},"Cloudflare","\u002Fdeploy\u002Fproviders\u002Fcloudflare","2.deploy\u002F20.providers\u002Fcloudflare",{"title":151,"path":152,"stem":153},"Deno Deploy","\u002Fdeploy\u002Fproviders\u002Fdeno-deploy","2.deploy\u002F20.providers\u002Fdeno-deploy",{"title":155,"path":156,"stem":157},"DigitalOcean","\u002Fdeploy\u002Fproviders\u002Fdigitalocean","2.deploy\u002F20.providers\u002Fdigitalocean",{"title":159,"path":160,"stem":161},"EdgeOne Pages","\u002Fdeploy\u002Fproviders\u002Fedgeone","2.deploy\u002F20.providers\u002Fedgeone",{"title":163,"path":164,"stem":165},"Firebase","\u002Fdeploy\u002Fproviders\u002Ffirebase","2.deploy\u002F20.providers\u002Ffirebase",{"title":167,"path":168,"stem":169},"Flightcontrol","\u002Fdeploy\u002Fproviders\u002Fflightcontrol","2.deploy\u002F20.providers\u002Fflightcontrol",{"title":171,"path":172,"stem":173},"Genezio","\u002Fdeploy\u002Fproviders\u002Fgenezio","2.deploy\u002F20.providers\u002Fgenezio",{"title":175,"path":176,"stem":177},"GitHub Pages","\u002Fdeploy\u002Fproviders\u002Fgithub-pages","2.deploy\u002F20.providers\u002Fgithub-pages",{"title":179,"path":180,"stem":181},"GitLab Pages","\u002Fdeploy\u002Fproviders\u002Fgitlab-pages","2.deploy\u002F20.providers\u002Fgitlab-pages",{"title":183,"path":184,"stem":185},"Heroku","\u002Fdeploy\u002Fproviders\u002Fheroku","2.deploy\u002F20.providers\u002Fheroku",{"title":187,"path":188,"stem":189},"IIS","\u002Fdeploy\u002Fproviders\u002Fiis","2.deploy\u002F20.providers\u002Fiis",{"title":191,"path":192,"stem":193},"Koyeb","\u002Fdeploy\u002Fproviders\u002Fkoyeb","2.deploy\u002F20.providers\u002Fkoyeb",{"title":195,"path":196,"stem":197},"Netlify","\u002Fdeploy\u002Fproviders\u002Fnetlify","2.deploy\u002F20.providers\u002Fnetlify",{"title":199,"path":200,"stem":201},"Platform.sh","\u002Fdeploy\u002Fproviders\u002Fplatform-sh","2.deploy\u002F20.providers\u002Fplatform-sh",{"title":203,"path":204,"stem":205},"Render.com","\u002Fdeploy\u002Fproviders\u002Frender","2.deploy\u002F20.providers\u002Frender",{"title":207,"path":208,"stem":209},"StormKit","\u002Fdeploy\u002Fproviders\u002Fstormkit","2.deploy\u002F20.providers\u002Fstormkit",{"title":211,"path":212,"stem":213},"Vercel","\u002Fdeploy\u002Fproviders\u002Fvercel","2.deploy\u002F20.providers\u002Fvercel",{"title":215,"path":216,"stem":217},"Zeabur","\u002Fdeploy\u002Fproviders\u002Fzeabur","2.deploy\u002F20.providers\u002Fzeabur",{"title":219,"path":220,"stem":221},"Zephyr Cloud","\u002Fdeploy\u002Fproviders\u002Fzephyr","2.deploy\u002F20.providers\u002Fzephyr",{"title":223,"path":224,"stem":225},"Zerops","\u002Fdeploy\u002Fproviders\u002Fzerops","2.deploy\u002F20.providers\u002Fzerops",{"title":227,"path":228,"stem":229,"children":230,"icon":36},"Config","\u002Fconfig","3.config\u002F0.index",[231],{"title":227,"path":228,"stem":229,"icon":36},{"title":233,"path":234,"stem":235,"children":236,"icon":238},"Examples","\u002Fexamples","4.examples\u002F0.index",[237,239,244,249,254,259,263,268,273,278,283,288,293,297,302,306,310,315,320,325,330,335,340,345,350,355,360,364,369,374,378,383,388],{"title":233,"path":234,"stem":235,"icon":238},"i-lucide-folder-code",{"title":240,"path":241,"stem":242,"icon":243},"API Routes","\u002Fexamples\u002Fapi-routes","4.examples\u002Fapi-routes","i-lucide-route",{"title":245,"path":246,"stem":247,"icon":248},"Auto Imports","\u002Fexamples\u002Fauto-imports","4.examples\u002Fauto-imports","i-lucide-import",{"title":250,"path":251,"stem":252,"icon":253},"Cached Handler","\u002Fexamples\u002Fcached-handler","4.examples\u002Fcached-handler","i-lucide-clock",{"title":255,"path":256,"stem":257,"icon":258},"Custom Error Handler","\u002Fexamples\u002Fcustom-error-handler","4.examples\u002Fcustom-error-handler","i-lucide-alert-circle",{"title":38,"path":260,"stem":261,"icon":262},"\u002Fexamples\u002Fdatabase","4.examples\u002Fdatabase","i-lucide-database",{"title":264,"path":265,"stem":266,"icon":267},"Elysia","\u002Fexamples\u002Felysia","4.examples\u002Felysia","i-skill-icons-elysia-dark",{"title":269,"path":270,"stem":271,"icon":272},"Express","\u002Fexamples\u002Fexpress","4.examples\u002Fexpress","i-simple-icons-express",{"title":274,"path":275,"stem":276,"icon":277},"Fastify","\u002Fexamples\u002Ffastify","4.examples\u002Ffastify","i-simple-icons-fastify",{"title":279,"path":280,"stem":281,"icon":282},"Hello World","\u002Fexamples\u002Fhello-world","4.examples\u002Fhello-world","i-lucide-sparkles",{"title":284,"path":285,"stem":286,"icon":287},"Hono","\u002Fexamples\u002Fhono","4.examples\u002Fhono","i-logos-hono",{"title":289,"path":290,"stem":291,"icon":292},"Import Alias","\u002Fexamples\u002Fimport-alias","4.examples\u002Fimport-alias","i-lucide-at-sign",{"title":294,"path":295,"stem":296,"icon":46},"Middleware","\u002Fexamples\u002Fmiddleware","4.examples\u002Fmiddleware",{"title":298,"path":299,"stem":300,"icon":301},"Mono JSX","\u002Fexamples\u002Fmono-jsx","4.examples\u002Fmono-jsx","i-lucide-brackets",{"title":303,"path":304,"stem":305,"icon":301},"Nano JSX","\u002Fexamples\u002Fnano-jsx","4.examples\u002Fnano-jsx",{"title":53,"path":307,"stem":308,"icon":309},"\u002Fexamples\u002Fplugins","4.examples\u002Fplugins","i-lucide-plug",{"title":311,"path":312,"stem":313,"icon":314},"Custom Renderer","\u002Fexamples\u002Frenderer","4.examples\u002Frenderer","i-lucide-code",{"title":316,"path":317,"stem":318,"icon":319},"Runtime Config","\u002Fexamples\u002Fruntime-config","4.examples\u002Fruntime-config","i-lucide-settings",{"title":321,"path":322,"stem":323,"icon":324},"Server Fetch","\u002Fexamples\u002Fserver-fetch","4.examples\u002Fserver-fetch","i-lucide-arrow-right-left",{"title":326,"path":327,"stem":328,"icon":329},"Shiki","\u002Fexamples\u002Fshiki","4.examples\u002Fshiki","i-lucide-highlighter",{"title":331,"path":332,"stem":333,"icon":334},"Takumi","\u002Fexamples\u002Ftakumi","4.examples\u002Ftakumi","i-lucide-image",{"title":336,"path":337,"stem":338,"icon":339},"Virtual Routes","\u002Fexamples\u002Fvirtual-routes","4.examples\u002Fvirtual-routes","i-lucide-box",{"title":341,"path":342,"stem":343,"icon":344},"Vite Nitro Plugin","\u002Fexamples\u002Fvite-nitro-plugin","4.examples\u002Fvite-nitro-plugin","i-logos-vitejs",{"title":346,"path":347,"stem":348,"icon":349},"Vite RSC","\u002Fexamples\u002Fvite-rsc","4.examples\u002Fvite-rsc","i-logos-react",{"title":351,"path":352,"stem":353,"icon":354},"Vite SSR HTML","\u002Fexamples\u002Fvite-ssr-html","4.examples\u002Fvite-ssr-html","i-logos-html-5",{"title":356,"path":357,"stem":358,"icon":359},"SSR with Preact","\u002Fexamples\u002Fvite-ssr-preact","4.examples\u002Fvite-ssr-preact","i-logos-preact",{"title":361,"path":362,"stem":363,"icon":349},"SSR with React","\u002Fexamples\u002Fvite-ssr-react","4.examples\u002Fvite-ssr-react",{"title":365,"path":366,"stem":367,"icon":368},"SSR with SolidJS","\u002Fexamples\u002Fvite-ssr-solid","4.examples\u002Fvite-ssr-solid","i-logos-solidjs-icon",{"title":370,"path":371,"stem":372,"icon":373},"SSR with TanStack Router","\u002Fexamples\u002Fvite-ssr-tsr-react","4.examples\u002Fvite-ssr-tsr-react","i-simple-icons-tanstack",{"title":375,"path":376,"stem":377,"icon":373},"SSR with TanStack Start","\u002Fexamples\u002Fvite-ssr-tss-react","4.examples\u002Fvite-ssr-tss-react",{"title":379,"path":380,"stem":381,"icon":382},"SSR with Vue Router","\u002Fexamples\u002Fvite-ssr-vue-router","4.examples\u002Fvite-ssr-vue-router","i-logos-vue",{"title":384,"path":385,"stem":386,"icon":387},"Vite + tRPC","\u002Fexamples\u002Fvite-trpc","4.examples\u002Fvite-trpc","i-simple-icons-trpc",{"title":63,"path":389,"stem":390,"icon":391},"\u002Fexamples\u002Fwebsocket","4.examples\u002Fwebsocket","i-lucide-radio",{"title":393,"path":394,"stem":395,"children":396},"Blog","\u002Fblog","9.blog",[397,400],{"title":393,"path":394,"stem":398,"icon":399},"9.blog\u002Findex","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":399},"Nitro v3 Beta is here!","\u002Fblog\u002Fv3-beta","9.blog\u002F1.v3-beta",{"title":5,"path":405,"stem":406},"\u002F","index",{"id":408,"title":63,"body":409,"description":3187,"extension":3188,"meta":3189,"navigation":3190,"path":64,"seo":3191,"stem":65,"__hash__":3192},"content\u002F1.docs\u002F50.websocket.md",{"type":410,"value":411,"toc":3163,"icon":66},"minimark",[412,416,421,426,429,519,523,535,743,757,762,772,907,911,914,919,922,1117,1123,1194,1201,1206,1209,1240,1244,1247,1297,1302,1314,1361,1365,1368,1397,1400,1407,1411,1540,1544,1551,1554,1592,1598,1601,1620,1626,1629,1647,1653,1661,1691,1697,1700,1723,1729,1732,1736,1744,1834,1915,1919,1922,2144,2161,2165,2171,2179,2361,2372,2381,2632,2636,2644,2838,2846,2910,2914,2926,3155,3159],[413,414,415],"p",{},"WebSocket enables real-time, bidirectional communication between client and server. Nitro's WebSocket integration works across all supported deployment targets including Node.js, Bun, Deno, and Cloudflare Workers.",[417,418],"read-more",{"title":419,"to":420},"CrossWS Documentation","https:\u002F\u002Fcrossws.h3.dev\u002F",[422,423,425],"h2",{"id":424},"enable-websocket","Enable WebSocket",[413,427,428],{},"Enable WebSocket support in your Nitro configuration:",[430,431,432],"code-group",{},[433,434,439],"pre",{"className":435,"code":436,"filename":437,"language":438,"meta":5,"style":5},"language-ts shiki shiki-themes github-light github-dark github-dark","import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  features: {\n    websocket: true,\n  },\n});\n","nitro.config.ts","ts",[440,441,442,465,472,488,494,507,513],"code",{"__ignoreMap":5},[443,444,447,451,455,458,462],"span",{"class":445,"line":446},"line",1,[443,448,450],{"class":449},"so5gQ","import",[443,452,454],{"class":453},"slsVL"," { defineConfig } ",[443,456,457],{"class":449},"from",[443,459,461],{"class":460},"sfrk1"," \"nitro\"",[443,463,464],{"class":453},";\n",[443,466,468],{"class":445,"line":467},2,[443,469,471],{"emptyLinePlaceholder":470},true,"\n",[443,473,475,478,481,485],{"class":445,"line":474},3,[443,476,477],{"class":449},"export",[443,479,480],{"class":449}," default",[443,482,484],{"class":483},"shcOC"," defineConfig",[443,486,487],{"class":453},"({\n",[443,489,491],{"class":445,"line":490},4,[443,492,493],{"class":453},"  features: {\n",[443,495,497,500,504],{"class":445,"line":496},5,[443,498,499],{"class":453},"    websocket: ",[443,501,503],{"class":502},"suiK_","true",[443,505,506],{"class":453},",\n",[443,508,510],{"class":445,"line":509},6,[443,511,512],{"class":453},"  },\n",[443,514,516],{"class":445,"line":515},7,[443,517,518],{"class":453},"});\n",[422,520,522],{"id":521},"usage","Usage",[413,524,525,526,529,530,534],{},"Create a WebSocket handler using ",[440,527,528],{},"defineWebSocketHandler"," and export it from a route file. WebSocket handlers follow the same ",[531,532,533],"a",{"href":24},"file-based routing"," as regular request handlers.",[433,536,539],{"className":435,"code":537,"filename":538,"language":438,"meta":5,"style":5},"import { defineWebSocketHandler } from \"nitro\";\n\nexport default defineWebSocketHandler({\n  open(peer) {\n    console.log(\"Connected:\", peer.id);\n  },\n  message(peer, message) {\n    console.log(\"Message:\", message.text());\n    peer.send(\"Hello from server!\");\n  },\n  close(peer, details) {\n    console.log(\"Disconnected:\", peer.id, details.code, details.reason);\n  },\n  error(peer, error) {\n    console.error(\"Error:\", error);\n  },\n});\n","routes\u002F_ws.ts",[440,540,541,554,558,569,584,600,604,621,642,659,664,681,696,701,718,733,738],{"__ignoreMap":5},[443,542,543,545,548,550,552],{"class":445,"line":446},[443,544,450],{"class":449},[443,546,547],{"class":453}," { defineWebSocketHandler } ",[443,549,457],{"class":449},[443,551,461],{"class":460},[443,553,464],{"class":453},[443,555,556],{"class":445,"line":467},[443,557,471],{"emptyLinePlaceholder":470},[443,559,560,562,564,567],{"class":445,"line":474},[443,561,477],{"class":449},[443,563,480],{"class":449},[443,565,566],{"class":483}," defineWebSocketHandler",[443,568,487],{"class":453},[443,570,571,574,577,581],{"class":445,"line":490},[443,572,573],{"class":483},"  open",[443,575,576],{"class":453},"(",[443,578,580],{"class":579},"sQHwn","peer",[443,582,583],{"class":453},") {\n",[443,585,586,589,592,594,597],{"class":445,"line":496},[443,587,588],{"class":453},"    console.",[443,590,591],{"class":483},"log",[443,593,576],{"class":453},[443,595,596],{"class":460},"\"Connected:\"",[443,598,599],{"class":453},", peer.id);\n",[443,601,602],{"class":445,"line":509},[443,603,512],{"class":453},[443,605,606,609,611,613,616,619],{"class":445,"line":515},[443,607,608],{"class":483},"  message",[443,610,576],{"class":453},[443,612,580],{"class":579},[443,614,615],{"class":453},", ",[443,617,618],{"class":579},"message",[443,620,583],{"class":453},[443,622,624,626,628,630,633,636,639],{"class":445,"line":623},8,[443,625,588],{"class":453},[443,627,591],{"class":483},[443,629,576],{"class":453},[443,631,632],{"class":460},"\"Message:\"",[443,634,635],{"class":453},", message.",[443,637,638],{"class":483},"text",[443,640,641],{"class":453},"());\n",[443,643,645,648,651,653,656],{"class":445,"line":644},9,[443,646,647],{"class":453},"    peer.",[443,649,650],{"class":483},"send",[443,652,576],{"class":453},[443,654,655],{"class":460},"\"Hello from server!\"",[443,657,658],{"class":453},");\n",[443,660,662],{"class":445,"line":661},10,[443,663,512],{"class":453},[443,665,667,670,672,674,676,679],{"class":445,"line":666},11,[443,668,669],{"class":483},"  close",[443,671,576],{"class":453},[443,673,580],{"class":579},[443,675,615],{"class":453},[443,677,678],{"class":579},"details",[443,680,583],{"class":453},[443,682,684,686,688,690,693],{"class":445,"line":683},12,[443,685,588],{"class":453},[443,687,591],{"class":483},[443,689,576],{"class":453},[443,691,692],{"class":460},"\"Disconnected:\"",[443,694,695],{"class":453},", peer.id, details.code, details.reason);\n",[443,697,699],{"class":445,"line":698},13,[443,700,512],{"class":453},[443,702,704,707,709,711,713,716],{"class":445,"line":703},14,[443,705,706],{"class":483},"  error",[443,708,576],{"class":453},[443,710,580],{"class":579},[443,712,615],{"class":453},[443,714,715],{"class":579},"error",[443,717,583],{"class":453},[443,719,721,723,725,727,730],{"class":445,"line":720},15,[443,722,588],{"class":453},[443,724,715],{"class":483},[443,726,576],{"class":453},[443,728,729],{"class":460},"\"Error:\"",[443,731,732],{"class":453},", error);\n",[443,734,736],{"class":445,"line":735},16,[443,737,512],{"class":453},[443,739,741],{"class":445,"line":740},17,[443,742,518],{"class":453},[744,745,746],"tip",{},[413,747,748,749,752,753,756],{},"You can use any route path for WebSocket handlers. For example, ",[440,750,751],{},"routes\u002Fchat.ts"," handles WebSocket connections on ",[440,754,755],{},"\u002Fchat",".",[758,759,761],"h3",{"id":760},"connecting-from-the-client","Connecting from the client",[413,763,764,765,771],{},"Use the browser's ",[531,766,770],{"href":767,"rel":768},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWebSocket",[769],"nofollow","WebSocket API"," to connect:",[433,773,777],{"className":774,"code":775,"language":776,"meta":5,"style":5},"language-js shiki shiki-themes github-light github-dark github-dark","const ws = new WebSocket(\"ws:\u002F\u002Flocalhost:3000\u002F_ws\");\n\nws.addEventListener(\"open\", () => {\n  console.log(\"Connected!\");\n  ws.send(\"Hello from client!\");\n});\n\nws.addEventListener(\"message\", (event) => {\n  console.log(\"Received:\", event.data);\n});\n","js",[440,778,779,803,807,829,843,857,861,865,889,903],{"__ignoreMap":5},[443,780,781,784,787,790,793,796,798,801],{"class":445,"line":446},[443,782,783],{"class":449},"const",[443,785,786],{"class":502}," ws",[443,788,789],{"class":449}," =",[443,791,792],{"class":449}," new",[443,794,795],{"class":483}," WebSocket",[443,797,576],{"class":453},[443,799,800],{"class":460},"\"ws:\u002F\u002Flocalhost:3000\u002F_ws\"",[443,802,658],{"class":453},[443,804,805],{"class":445,"line":467},[443,806,471],{"emptyLinePlaceholder":470},[443,808,809,812,815,817,820,823,826],{"class":445,"line":474},[443,810,811],{"class":453},"ws.",[443,813,814],{"class":483},"addEventListener",[443,816,576],{"class":453},[443,818,819],{"class":460},"\"open\"",[443,821,822],{"class":453},", () ",[443,824,825],{"class":449},"=>",[443,827,828],{"class":453}," {\n",[443,830,831,834,836,838,841],{"class":445,"line":490},[443,832,833],{"class":453},"  console.",[443,835,591],{"class":483},[443,837,576],{"class":453},[443,839,840],{"class":460},"\"Connected!\"",[443,842,658],{"class":453},[443,844,845,848,850,852,855],{"class":445,"line":496},[443,846,847],{"class":453},"  ws.",[443,849,650],{"class":483},[443,851,576],{"class":453},[443,853,854],{"class":460},"\"Hello from client!\"",[443,856,658],{"class":453},[443,858,859],{"class":445,"line":509},[443,860,518],{"class":453},[443,862,863],{"class":445,"line":515},[443,864,471],{"emptyLinePlaceholder":470},[443,866,867,869,871,873,876,879,882,885,887],{"class":445,"line":623},[443,868,811],{"class":453},[443,870,814],{"class":483},[443,872,576],{"class":453},[443,874,875],{"class":460},"\"message\"",[443,877,878],{"class":453},", (",[443,880,881],{"class":579},"event",[443,883,884],{"class":453},") ",[443,886,825],{"class":449},[443,888,828],{"class":453},[443,890,891,893,895,897,900],{"class":445,"line":644},[443,892,833],{"class":453},[443,894,591],{"class":483},[443,896,576],{"class":453},[443,898,899],{"class":460},"\"Received:\"",[443,901,902],{"class":453},", event.data);\n",[443,904,905],{"class":445,"line":661},[443,906,518],{"class":453},[422,908,910],{"id":909},"hooks","Hooks",[413,912,913],{},"WebSocket handlers accept the following lifecycle hooks:",[758,915,917],{"id":916},"upgrade",[440,918,916],{},[413,920,921],{},"Called before the WebSocket connection is established. Use it to authenticate requests, set the namespace, or attach context data to the peer.",[433,923,925],{"className":435,"code":924,"filename":751,"language":438,"meta":5,"style":5},"import { defineWebSocketHandler } from \"nitro\";\n\nexport default defineWebSocketHandler({\n  upgrade(request) {\n    const url = new URL(request.url);\n    const token = url.searchParams.get(\"token\");\n    if (!isValidToken(token)) {\n      throw new Response(\"Unauthorized\", { status: 401 });\n    }\n    return {\n      context: { userId: getUserId(token) },\n    };\n  },\n  open(peer) {\n    console.log(\"User connected:\", peer.context.userId);\n  },\n  \u002F\u002F ...\n});\n",[440,926,927,939,943,953,965,983,1005,1022,1046,1051,1058,1069,1074,1078,1088,1102,1106,1112],{"__ignoreMap":5},[443,928,929,931,933,935,937],{"class":445,"line":446},[443,930,450],{"class":449},[443,932,547],{"class":453},[443,934,457],{"class":449},[443,936,461],{"class":460},[443,938,464],{"class":453},[443,940,941],{"class":445,"line":467},[443,942,471],{"emptyLinePlaceholder":470},[443,944,945,947,949,951],{"class":445,"line":474},[443,946,477],{"class":449},[443,948,480],{"class":449},[443,950,566],{"class":483},[443,952,487],{"class":453},[443,954,955,958,960,963],{"class":445,"line":490},[443,956,957],{"class":483},"  upgrade",[443,959,576],{"class":453},[443,961,962],{"class":579},"request",[443,964,583],{"class":453},[443,966,967,970,973,975,977,980],{"class":445,"line":496},[443,968,969],{"class":449},"    const",[443,971,972],{"class":502}," url",[443,974,789],{"class":449},[443,976,792],{"class":449},[443,978,979],{"class":483}," URL",[443,981,982],{"class":453},"(request.url);\n",[443,984,985,987,990,992,995,998,1000,1003],{"class":445,"line":509},[443,986,969],{"class":449},[443,988,989],{"class":502}," token",[443,991,789],{"class":449},[443,993,994],{"class":453}," url.searchParams.",[443,996,997],{"class":483},"get",[443,999,576],{"class":453},[443,1001,1002],{"class":460},"\"token\"",[443,1004,658],{"class":453},[443,1006,1007,1010,1013,1016,1019],{"class":445,"line":515},[443,1008,1009],{"class":449},"    if",[443,1011,1012],{"class":453}," (",[443,1014,1015],{"class":449},"!",[443,1017,1018],{"class":483},"isValidToken",[443,1020,1021],{"class":453},"(token)) {\n",[443,1023,1024,1027,1029,1032,1034,1037,1040,1043],{"class":445,"line":623},[443,1025,1026],{"class":449},"      throw",[443,1028,792],{"class":449},[443,1030,1031],{"class":483}," Response",[443,1033,576],{"class":453},[443,1035,1036],{"class":460},"\"Unauthorized\"",[443,1038,1039],{"class":453},", { status: ",[443,1041,1042],{"class":502},"401",[443,1044,1045],{"class":453}," });\n",[443,1047,1048],{"class":445,"line":644},[443,1049,1050],{"class":453},"    }\n",[443,1052,1053,1056],{"class":445,"line":661},[443,1054,1055],{"class":449},"    return",[443,1057,828],{"class":453},[443,1059,1060,1063,1066],{"class":445,"line":666},[443,1061,1062],{"class":453},"      context: { userId: ",[443,1064,1065],{"class":483},"getUserId",[443,1067,1068],{"class":453},"(token) },\n",[443,1070,1071],{"class":445,"line":683},[443,1072,1073],{"class":453},"    };\n",[443,1075,1076],{"class":445,"line":698},[443,1077,512],{"class":453},[443,1079,1080,1082,1084,1086],{"class":445,"line":703},[443,1081,573],{"class":483},[443,1083,576],{"class":453},[443,1085,580],{"class":579},[443,1087,583],{"class":453},[443,1089,1090,1092,1094,1096,1099],{"class":445,"line":720},[443,1091,588],{"class":453},[443,1093,591],{"class":483},[443,1095,576],{"class":453},[443,1097,1098],{"class":460},"\"User connected:\"",[443,1100,1101],{"class":453},", peer.context.userId);\n",[443,1103,1104],{"class":445,"line":735},[443,1105,512],{"class":453},[443,1107,1108],{"class":445,"line":740},[443,1109,1111],{"class":1110},"sCsY4","  \u002F\u002F ...\n",[443,1113,1115],{"class":445,"line":1114},18,[443,1116,518],{"class":453},[413,1118,1119,1120,1122],{},"The ",[440,1121,916],{}," hook can return an object with:",[1124,1125,1126,1142],"table",{},[1127,1128,1129],"thead",{},[1130,1131,1132,1136,1139],"tr",{},[1133,1134,1135],"th",{},"Property",[1133,1137,1138],{},"Type",[1133,1140,1141],{},"Description",[1143,1144,1145,1161,1176],"tbody",{},[1130,1146,1147,1153,1158],{},[1148,1149,1150],"td",{},[440,1151,1152],{},"headers",[1148,1154,1155],{},[440,1156,1157],{},"HeadersInit",[1148,1159,1160],{},"Response headers to include in the upgrade response",[1130,1162,1163,1168,1173],{},[1148,1164,1165],{},[440,1166,1167],{},"namespace",[1148,1169,1170],{},[440,1171,1172],{},"string",[1148,1174,1175],{},"Override the pub\u002Fsub namespace for this connection",[1130,1177,1178,1183,1188],{},[1148,1179,1180],{},[440,1181,1182],{},"context",[1148,1184,1185],{},[440,1186,1187],{},"object",[1148,1189,1190,1191],{},"Data attached to ",[440,1192,1193],{},"peer.context",[413,1195,1196,1197,1200],{},"Throw a ",[440,1198,1199],{},"Response"," to reject the upgrade.",[758,1202,1204],{"id":1203},"open",[440,1205,1203],{},[413,1207,1208],{},"Called when a WebSocket connection is established and the peer is ready to send and receive messages.",[433,1210,1212],{"className":435,"code":1211,"language":438,"meta":5,"style":5},"open(peer) {\n  peer.send(\"Welcome!\");\n}\n",[440,1213,1214,1221,1235],{"__ignoreMap":5},[443,1215,1216,1218],{"class":445,"line":446},[443,1217,1203],{"class":483},[443,1219,1220],{"class":453},"(peer) {\n",[443,1222,1223,1226,1228,1230,1233],{"class":445,"line":467},[443,1224,1225],{"class":453},"  peer.",[443,1227,650],{"class":483},[443,1229,576],{"class":453},[443,1231,1232],{"class":460},"\"Welcome!\"",[443,1234,658],{"class":453},[443,1236,1237],{"class":445,"line":474},[443,1238,1239],{"class":453},"}\n",[758,1241,1242],{"id":618},[440,1243,618],{},[413,1245,1246],{},"Called when a message is received from a peer.",[433,1248,1250],{"className":435,"code":1249,"language":438,"meta":5,"style":5},"message(peer, message) {\n  const text = message.text();\n  const data = message.json();\n}\n",[440,1251,1252,1259,1277,1293],{"__ignoreMap":5},[443,1253,1254,1256],{"class":445,"line":446},[443,1255,618],{"class":483},[443,1257,1258],{"class":453},"(peer, message) {\n",[443,1260,1261,1264,1267,1269,1272,1274],{"class":445,"line":467},[443,1262,1263],{"class":449},"  const",[443,1265,1266],{"class":502}," text",[443,1268,789],{"class":449},[443,1270,1271],{"class":453}," message.",[443,1273,638],{"class":483},[443,1275,1276],{"class":453},"();\n",[443,1278,1279,1281,1284,1286,1288,1291],{"class":445,"line":474},[443,1280,1263],{"class":449},[443,1282,1283],{"class":502}," data",[443,1285,789],{"class":449},[443,1287,1271],{"class":453},[443,1289,1290],{"class":483},"json",[443,1292,1276],{"class":453},[443,1294,1295],{"class":445,"line":490},[443,1296,1239],{"class":453},[758,1298,1300],{"id":1299},"close",[440,1301,1299],{},[413,1303,1304,1305,1307,1308,1310,1311,756],{},"Called when a WebSocket connection is closed. Receives a ",[440,1306,678],{}," object with optional ",[440,1309,440],{}," and ",[440,1312,1313],{},"reason",[433,1315,1317],{"className":435,"code":1316,"language":438,"meta":5,"style":5},"close(peer, details) {\n  console.log(`Closed: ${details.code} - ${details.reason}`);\n}\n",[440,1318,1319,1326,1357],{"__ignoreMap":5},[443,1320,1321,1323],{"class":445,"line":446},[443,1322,1299],{"class":483},[443,1324,1325],{"class":453},"(peer, details) {\n",[443,1327,1328,1330,1332,1334,1337,1339,1341,1343,1346,1348,1350,1352,1355],{"class":445,"line":467},[443,1329,833],{"class":453},[443,1331,591],{"class":483},[443,1333,576],{"class":453},[443,1335,1336],{"class":460},"`Closed: ${",[443,1338,678],{"class":453},[443,1340,756],{"class":460},[443,1342,440],{"class":453},[443,1344,1345],{"class":460},"} - ${",[443,1347,678],{"class":453},[443,1349,756],{"class":460},[443,1351,1313],{"class":453},[443,1353,1354],{"class":460},"}`",[443,1356,658],{"class":453},[443,1358,1359],{"class":445,"line":474},[443,1360,1239],{"class":453},[758,1362,1363],{"id":715},[440,1364,715],{},[413,1366,1367],{},"Called when an error occurs on the WebSocket connection.",[433,1369,1371],{"className":435,"code":1370,"language":438,"meta":5,"style":5},"error(peer, error) {\n  console.error(\"WebSocket error:\", error);\n}\n",[440,1372,1373,1380,1393],{"__ignoreMap":5},[443,1374,1375,1377],{"class":445,"line":446},[443,1376,715],{"class":483},[443,1378,1379],{"class":453},"(peer, error) {\n",[443,1381,1382,1384,1386,1388,1391],{"class":445,"line":467},[443,1383,833],{"class":453},[443,1385,715],{"class":483},[443,1387,576],{"class":453},[443,1389,1390],{"class":460},"\"WebSocket error:\"",[443,1392,732],{"class":453},[443,1394,1395],{"class":445,"line":474},[443,1396,1239],{"class":453},[422,1398,1399],{"id":580},"Peer",[413,1401,1119,1402,1404,1405,756],{},[440,1403,580],{}," object represents a connected WebSocket client. It is available in all hooks except ",[440,1406,916],{},[758,1408,1410],{"id":1409},"properties","Properties",[1124,1412,1413,1423],{},[1127,1414,1415],{},[1130,1416,1417,1419,1421],{},[1133,1418,1135],{},[1133,1420,1138],{},[1133,1422,1141],{},[1143,1424,1425,1439,1452,1467,1481,1496,1511,1526],{},[1130,1426,1427,1432,1436],{},[1148,1428,1429],{},[440,1430,1431],{},"id",[1148,1433,1434],{},[440,1435,1172],{},[1148,1437,1438],{},"Unique identifier for this peer",[1130,1440,1441,1445,1449],{},[1148,1442,1443],{},[440,1444,1167],{},[1148,1446,1447],{},[440,1448,1172],{},[1148,1450,1451],{},"Pub\u002Fsub namespace this peer belongs to",[1130,1453,1454,1458,1462],{},[1148,1455,1456],{},[440,1457,1182],{},[1148,1459,1460],{},[440,1461,1187],{},[1148,1463,1464,1465],{},"Arbitrary context data set during ",[440,1466,916],{},[1130,1468,1469,1473,1478],{},[1148,1470,1471],{},[440,1472,962],{},[1148,1474,1475],{},[440,1476,1477],{},"Request",[1148,1479,1480],{},"The original upgrade request",[1130,1482,1483,1488,1493],{},[1148,1484,1485],{},[440,1486,1487],{},"peers",[1148,1489,1490],{},[440,1491,1492],{},"Set\u003CPeer>",[1148,1494,1495],{},"All connected peers in the same namespace",[1130,1497,1498,1503,1508],{},[1148,1499,1500],{},[440,1501,1502],{},"topics",[1148,1504,1505],{},[440,1506,1507],{},"Set\u003Cstring>",[1148,1509,1510],{},"Topics this peer is subscribed to",[1130,1512,1513,1518,1523],{},[1148,1514,1515],{},[440,1516,1517],{},"remoteAddress",[1148,1519,1520],{},[440,1521,1522],{},"string?",[1148,1524,1525],{},"Client IP address (adapter-dependent)",[1130,1527,1528,1533,1537],{},[1148,1529,1530],{},[440,1531,1532],{},"websocket",[1148,1534,1535],{},[440,1536,63],{},[1148,1538,1539],{},"The underlying WebSocket instance",[758,1541,1543],{"id":1542},"methods","Methods",[1545,1546,1548],"h4",{"id":1547},"peersenddata-options",[440,1549,1550],{},"peer.send(data, options?)",[413,1552,1553],{},"Send a message directly to this peer. Accepts strings, objects (serialized as JSON), or binary data.",[433,1555,1557],{"className":435,"code":1556,"language":438,"meta":5,"style":5},"peer.send(\"Hello!\");\npeer.send({ type: \"greeting\", text: \"Hello!\" });\n",[440,1558,1559,1573],{"__ignoreMap":5},[443,1560,1561,1564,1566,1568,1571],{"class":445,"line":446},[443,1562,1563],{"class":453},"peer.",[443,1565,650],{"class":483},[443,1567,576],{"class":453},[443,1569,1570],{"class":460},"\"Hello!\"",[443,1572,658],{"class":453},[443,1574,1575,1577,1579,1582,1585,1588,1590],{"class":445,"line":467},[443,1576,1563],{"class":453},[443,1578,650],{"class":483},[443,1580,1581],{"class":453},"({ type: ",[443,1583,1584],{"class":460},"\"greeting\"",[443,1586,1587],{"class":453},", text: ",[443,1589,1570],{"class":460},[443,1591,1045],{"class":453},[1545,1593,1595],{"id":1594},"peersubscribetopic",[440,1596,1597],{},"peer.subscribe(topic)",[413,1599,1600],{},"Subscribe this peer to a pub\u002Fsub topic.",[433,1602,1604],{"className":435,"code":1603,"language":438,"meta":5,"style":5},"peer.subscribe(\"notifications\");\n",[440,1605,1606],{"__ignoreMap":5},[443,1607,1608,1610,1613,1615,1618],{"class":445,"line":446},[443,1609,1563],{"class":453},[443,1611,1612],{"class":483},"subscribe",[443,1614,576],{"class":453},[443,1616,1617],{"class":460},"\"notifications\"",[443,1619,658],{"class":453},[1545,1621,1623],{"id":1622},"peerunsubscribetopic",[440,1624,1625],{},"peer.unsubscribe(topic)",[413,1627,1628],{},"Unsubscribe this peer from a topic.",[433,1630,1632],{"className":435,"code":1631,"language":438,"meta":5,"style":5},"peer.unsubscribe(\"notifications\");\n",[440,1633,1634],{"__ignoreMap":5},[443,1635,1636,1638,1641,1643,1645],{"class":445,"line":446},[443,1637,1563],{"class":453},[443,1639,1640],{"class":483},"unsubscribe",[443,1642,576],{"class":453},[443,1644,1617],{"class":460},[443,1646,658],{"class":453},[1545,1648,1650],{"id":1649},"peerpublishtopic-data-options",[440,1651,1652],{},"peer.publish(topic, data, options?)",[413,1654,1655,1656,1660],{},"Broadcast a message to all peers subscribed to a topic within the same namespace. The publishing peer does ",[1657,1658,1659],"strong",{},"not"," receive the message.",[433,1662,1664],{"className":435,"code":1663,"language":438,"meta":5,"style":5},"peer.publish(\"chat\", { user: \"Alice\", text: \"Hello everyone!\" });\n",[440,1665,1666],{"__ignoreMap":5},[443,1667,1668,1670,1673,1675,1678,1681,1684,1686,1689],{"class":445,"line":446},[443,1669,1563],{"class":453},[443,1671,1672],{"class":483},"publish",[443,1674,576],{"class":453},[443,1676,1677],{"class":460},"\"chat\"",[443,1679,1680],{"class":453},", { user: ",[443,1682,1683],{"class":460},"\"Alice\"",[443,1685,1587],{"class":453},[443,1687,1688],{"class":460},"\"Hello everyone!\"",[443,1690,1045],{"class":453},[1545,1692,1694],{"id":1693},"peerclosecode-reason",[440,1695,1696],{},"peer.close(code?, reason?)",[413,1698,1699],{},"Gracefully close the WebSocket connection.",[433,1701,1703],{"className":435,"code":1702,"language":438,"meta":5,"style":5},"peer.close(1000, \"Normal closure\");\n",[440,1704,1705],{"__ignoreMap":5},[443,1706,1707,1709,1711,1713,1716,1718,1721],{"class":445,"line":446},[443,1708,1563],{"class":453},[443,1710,1299],{"class":483},[443,1712,576],{"class":453},[443,1714,1715],{"class":502},"1000",[443,1717,615],{"class":453},[443,1719,1720],{"class":460},"\"Normal closure\"",[443,1722,658],{"class":453},[1545,1724,1726],{"id":1725},"peerterminate",[440,1727,1728],{},"peer.terminate()",[413,1730,1731],{},"Immediately terminate the connection without sending a close frame.",[422,1733,1735],{"id":1734},"message-1","Message",[413,1737,1119,1738,1740,1741,1743],{},[440,1739,618],{}," object in the ",[440,1742,618],{}," hook provides methods to read the incoming data in different formats.",[1124,1745,1746,1758],{},[1127,1747,1748],{},[1130,1749,1750,1753,1756],{},[1133,1751,1752],{},"Method",[1133,1754,1755],{},"Return Type",[1133,1757,1141],{},[1143,1759,1760,1774,1789,1804,1819],{},[1130,1761,1762,1767,1771],{},[1148,1763,1764],{},[440,1765,1766],{},"text()",[1148,1768,1769],{},[440,1770,1172],{},[1148,1772,1773],{},"Message as a UTF-8 string",[1130,1775,1776,1781,1786],{},[1148,1777,1778],{},[440,1779,1780],{},"json()",[1148,1782,1783],{},[440,1784,1785],{},"T",[1148,1787,1788],{},"Message parsed as JSON",[1130,1790,1791,1796,1801],{},[1148,1792,1793],{},[440,1794,1795],{},"uint8Array()",[1148,1797,1798],{},[440,1799,1800],{},"Uint8Array",[1148,1802,1803],{},"Message as a byte array",[1130,1805,1806,1811,1816],{},[1148,1807,1808],{},[440,1809,1810],{},"arrayBuffer()",[1148,1812,1813],{},[440,1814,1815],{},"ArrayBuffer",[1148,1817,1818],{},"Message as an ArrayBuffer",[1130,1820,1821,1826,1831],{},[1148,1822,1823],{},[440,1824,1825],{},"blob()",[1148,1827,1828],{},[440,1829,1830],{},"Blob",[1148,1832,1833],{},"Message as a Blob",[433,1835,1837],{"className":435,"code":1836,"language":438,"meta":5,"style":5},"message(peer, message) {\n  \u002F\u002F Parse as text\n  const text = message.text();\n\n  \u002F\u002F Parse as typed JSON\n  const data = message.json\u003C{ type: string; payload: unknown }>();\n}\n",[440,1838,1839,1845,1850,1864,1868,1873,1911],{"__ignoreMap":5},[443,1840,1841,1843],{"class":445,"line":446},[443,1842,618],{"class":483},[443,1844,1258],{"class":453},[443,1846,1847],{"class":445,"line":467},[443,1848,1849],{"class":1110},"  \u002F\u002F Parse as text\n",[443,1851,1852,1854,1856,1858,1860,1862],{"class":445,"line":474},[443,1853,1263],{"class":449},[443,1855,1266],{"class":502},[443,1857,789],{"class":449},[443,1859,1271],{"class":453},[443,1861,638],{"class":483},[443,1863,1276],{"class":453},[443,1865,1866],{"class":445,"line":490},[443,1867,471],{"emptyLinePlaceholder":470},[443,1869,1870],{"class":445,"line":496},[443,1871,1872],{"class":1110},"  \u002F\u002F Parse as typed JSON\n",[443,1874,1875,1877,1879,1881,1883,1885,1888,1891,1894,1897,1900,1903,1905,1908],{"class":445,"line":509},[443,1876,1263],{"class":449},[443,1878,1283],{"class":502},[443,1880,789],{"class":449},[443,1882,1271],{"class":453},[443,1884,1290],{"class":483},[443,1886,1887],{"class":453},"\u003C{ ",[443,1889,1890],{"class":579},"type",[443,1892,1893],{"class":449},":",[443,1895,1896],{"class":502}," string",[443,1898,1899],{"class":453},"; ",[443,1901,1902],{"class":579},"payload",[443,1904,1893],{"class":449},[443,1906,1907],{"class":502}," unknown",[443,1909,1910],{"class":453}," }>();\n",[443,1912,1913],{"class":445,"line":515},[443,1914,1239],{"class":453},[422,1916,1918],{"id":1917},"pubsub","Pub\u002FSub",[413,1920,1921],{},"Pub\u002Fsub (publish\u002Fsubscribe) enables broadcasting messages to groups of connected peers through topics. Peers subscribe to topics and receive messages published to those topics.",[433,1923,1925],{"className":435,"code":1924,"filename":751,"language":438,"meta":5,"style":5},"import { defineWebSocketHandler } from \"nitro\";\n\nexport default defineWebSocketHandler({\n  open(peer) {\n    peer.subscribe(\"chat\");\n    peer.publish(\"chat\", { system: `${peer} joined the chat` });\n    peer.send({ system: \"Welcome to the chat!\" });\n  },\n  message(peer, message) {\n    \u002F\u002F Broadcast to all other subscribers\n    peer.publish(\"chat\", {\n      user: peer.toString(),\n      text: message.text(),\n    });\n    \u002F\u002F Echo back to sender\n    peer.send({ user: \"You\", text: message.text() });\n  },\n  close(peer) {\n    peer.publish(\"chat\", { system: `${peer} left the chat` });\n  },\n});\n",[440,1926,1927,1939,1943,1953,1963,1975,1998,2012,2016,2030,2035,2048,2059,2068,2073,2078,2098,2102,2112,2134,2139],{"__ignoreMap":5},[443,1928,1929,1931,1933,1935,1937],{"class":445,"line":446},[443,1930,450],{"class":449},[443,1932,547],{"class":453},[443,1934,457],{"class":449},[443,1936,461],{"class":460},[443,1938,464],{"class":453},[443,1940,1941],{"class":445,"line":467},[443,1942,471],{"emptyLinePlaceholder":470},[443,1944,1945,1947,1949,1951],{"class":445,"line":474},[443,1946,477],{"class":449},[443,1948,480],{"class":449},[443,1950,566],{"class":483},[443,1952,487],{"class":453},[443,1954,1955,1957,1959,1961],{"class":445,"line":490},[443,1956,573],{"class":483},[443,1958,576],{"class":453},[443,1960,580],{"class":579},[443,1962,583],{"class":453},[443,1964,1965,1967,1969,1971,1973],{"class":445,"line":496},[443,1966,647],{"class":453},[443,1968,1612],{"class":483},[443,1970,576],{"class":453},[443,1972,1677],{"class":460},[443,1974,658],{"class":453},[443,1976,1977,1979,1981,1983,1985,1988,1991,1993,1996],{"class":445,"line":509},[443,1978,647],{"class":453},[443,1980,1672],{"class":483},[443,1982,576],{"class":453},[443,1984,1677],{"class":460},[443,1986,1987],{"class":453},", { system: ",[443,1989,1990],{"class":460},"`${",[443,1992,580],{"class":453},[443,1994,1995],{"class":460},"} joined the chat`",[443,1997,1045],{"class":453},[443,1999,2000,2002,2004,2007,2010],{"class":445,"line":515},[443,2001,647],{"class":453},[443,2003,650],{"class":483},[443,2005,2006],{"class":453},"({ system: ",[443,2008,2009],{"class":460},"\"Welcome to the chat!\"",[443,2011,1045],{"class":453},[443,2013,2014],{"class":445,"line":623},[443,2015,512],{"class":453},[443,2017,2018,2020,2022,2024,2026,2028],{"class":445,"line":644},[443,2019,608],{"class":483},[443,2021,576],{"class":453},[443,2023,580],{"class":579},[443,2025,615],{"class":453},[443,2027,618],{"class":579},[443,2029,583],{"class":453},[443,2031,2032],{"class":445,"line":661},[443,2033,2034],{"class":1110},"    \u002F\u002F Broadcast to all other subscribers\n",[443,2036,2037,2039,2041,2043,2045],{"class":445,"line":666},[443,2038,647],{"class":453},[443,2040,1672],{"class":483},[443,2042,576],{"class":453},[443,2044,1677],{"class":460},[443,2046,2047],{"class":453},", {\n",[443,2049,2050,2053,2056],{"class":445,"line":683},[443,2051,2052],{"class":453},"      user: peer.",[443,2054,2055],{"class":483},"toString",[443,2057,2058],{"class":453},"(),\n",[443,2060,2061,2064,2066],{"class":445,"line":698},[443,2062,2063],{"class":453},"      text: message.",[443,2065,638],{"class":483},[443,2067,2058],{"class":453},[443,2069,2070],{"class":445,"line":703},[443,2071,2072],{"class":453},"    });\n",[443,2074,2075],{"class":445,"line":720},[443,2076,2077],{"class":1110},"    \u002F\u002F Echo back to sender\n",[443,2079,2080,2082,2084,2087,2090,2093,2095],{"class":445,"line":735},[443,2081,647],{"class":453},[443,2083,650],{"class":483},[443,2085,2086],{"class":453},"({ user: ",[443,2088,2089],{"class":460},"\"You\"",[443,2091,2092],{"class":453},", text: message.",[443,2094,638],{"class":483},[443,2096,2097],{"class":453},"() });\n",[443,2099,2100],{"class":445,"line":740},[443,2101,512],{"class":453},[443,2103,2104,2106,2108,2110],{"class":445,"line":1114},[443,2105,669],{"class":483},[443,2107,576],{"class":453},[443,2109,580],{"class":579},[443,2111,583],{"class":453},[443,2113,2115,2117,2119,2121,2123,2125,2127,2129,2132],{"class":445,"line":2114},19,[443,2116,647],{"class":453},[443,2118,1672],{"class":483},[443,2120,576],{"class":453},[443,2122,1677],{"class":460},[443,2124,1987],{"class":453},[443,2126,1990],{"class":460},[443,2128,580],{"class":453},[443,2130,2131],{"class":460},"} left the chat`",[443,2133,1045],{"class":453},[443,2135,2137],{"class":445,"line":2136},20,[443,2138,512],{"class":453},[443,2140,2142],{"class":445,"line":2141},21,[443,2143,518],{"class":453},[2145,2146,2147],"note",{},[413,2148,2149,2152,2153,2156,2157,2160],{},[440,2150,2151],{},"peer.publish()"," sends the message to all subscribers of the topic ",[1657,2154,2155],{},"except"," the publishing peer. Use ",[440,2158,2159],{},"peer.send()"," to also send to the publisher.",[758,2162,2164],{"id":2163},"namespaces","Namespaces",[413,2166,2167,2168,2170],{},"Namespaces provide isolated pub\u002Fsub groups for WebSocket connections. Each peer belongs to one namespace, and ",[440,2169,2151],{}," only broadcasts to peers within the same namespace.",[413,2172,2173,2174,2178],{},"By default, the namespace is derived from the request URL pathname. This works naturally with ",[531,2175,2177],{"href":2176},"\u002Fdocs\u002Frouting#dynamic-routes","dynamic routes"," — each path gets its own isolated namespace:",[433,2180,2183],{"className":435,"code":2181,"filename":2182,"language":438,"meta":5,"style":5},"import { defineWebSocketHandler } from \"nitro\";\n\nexport default defineWebSocketHandler({\n  open(peer) {\n    peer.subscribe(\"messages\");\n    peer.publish(\"messages\", `${peer} joined ${peer.namespace}`);\n  },\n  message(peer, message) {\n    \u002F\u002F Only reaches peers in the same room\n    peer.publish(\"messages\", `${peer}: ${message.text()}`);\n  },\n  close(peer) {\n    peer.publish(\"messages\", `${peer} left`);\n  },\n});\n","routes\u002Frooms\u002F[room].ts",[440,2184,2185,2197,2201,2211,2221,2234,2263,2267,2281,2286,2318,2322,2332,2353,2357],{"__ignoreMap":5},[443,2186,2187,2189,2191,2193,2195],{"class":445,"line":446},[443,2188,450],{"class":449},[443,2190,547],{"class":453},[443,2192,457],{"class":449},[443,2194,461],{"class":460},[443,2196,464],{"class":453},[443,2198,2199],{"class":445,"line":467},[443,2200,471],{"emptyLinePlaceholder":470},[443,2202,2203,2205,2207,2209],{"class":445,"line":474},[443,2204,477],{"class":449},[443,2206,480],{"class":449},[443,2208,566],{"class":483},[443,2210,487],{"class":453},[443,2212,2213,2215,2217,2219],{"class":445,"line":490},[443,2214,573],{"class":483},[443,2216,576],{"class":453},[443,2218,580],{"class":579},[443,2220,583],{"class":453},[443,2222,2223,2225,2227,2229,2232],{"class":445,"line":496},[443,2224,647],{"class":453},[443,2226,1612],{"class":483},[443,2228,576],{"class":453},[443,2230,2231],{"class":460},"\"messages\"",[443,2233,658],{"class":453},[443,2235,2236,2238,2240,2242,2244,2246,2248,2250,2253,2255,2257,2259,2261],{"class":445,"line":509},[443,2237,647],{"class":453},[443,2239,1672],{"class":483},[443,2241,576],{"class":453},[443,2243,2231],{"class":460},[443,2245,615],{"class":453},[443,2247,1990],{"class":460},[443,2249,580],{"class":453},[443,2251,2252],{"class":460},"} joined ${",[443,2254,580],{"class":453},[443,2256,756],{"class":460},[443,2258,1167],{"class":453},[443,2260,1354],{"class":460},[443,2262,658],{"class":453},[443,2264,2265],{"class":445,"line":515},[443,2266,512],{"class":453},[443,2268,2269,2271,2273,2275,2277,2279],{"class":445,"line":623},[443,2270,608],{"class":483},[443,2272,576],{"class":453},[443,2274,580],{"class":579},[443,2276,615],{"class":453},[443,2278,618],{"class":579},[443,2280,583],{"class":453},[443,2282,2283],{"class":445,"line":644},[443,2284,2285],{"class":1110},"    \u002F\u002F Only reaches peers in the same room\n",[443,2287,2288,2290,2292,2294,2296,2298,2300,2302,2305,2307,2309,2311,2314,2316],{"class":445,"line":661},[443,2289,647],{"class":453},[443,2291,1672],{"class":483},[443,2293,576],{"class":453},[443,2295,2231],{"class":460},[443,2297,615],{"class":453},[443,2299,1990],{"class":460},[443,2301,580],{"class":453},[443,2303,2304],{"class":460},"}: ${",[443,2306,618],{"class":453},[443,2308,756],{"class":460},[443,2310,638],{"class":483},[443,2312,2313],{"class":460},"()",[443,2315,1354],{"class":460},[443,2317,658],{"class":453},[443,2319,2320],{"class":445,"line":666},[443,2321,512],{"class":453},[443,2323,2324,2326,2328,2330],{"class":445,"line":683},[443,2325,669],{"class":483},[443,2327,576],{"class":453},[443,2329,580],{"class":579},[443,2331,583],{"class":453},[443,2333,2334,2336,2338,2340,2342,2344,2346,2348,2351],{"class":445,"line":698},[443,2335,647],{"class":453},[443,2337,1672],{"class":483},[443,2339,576],{"class":453},[443,2341,2231],{"class":460},[443,2343,615],{"class":453},[443,2345,1990],{"class":460},[443,2347,580],{"class":453},[443,2349,2350],{"class":460},"} left`",[443,2352,658],{"class":453},[443,2354,2355],{"class":445,"line":703},[443,2356,512],{"class":453},[443,2358,2359],{"class":445,"line":720},[443,2360,518],{"class":453},[413,2362,2363,2364,2367,2368,2371],{},"In this example, clients connecting to ",[440,2365,2366],{},"\u002Frooms\u002Fgame"," are isolated from clients connecting to ",[440,2369,2370],{},"\u002Frooms\u002Flobby"," — each path is its own namespace.",[413,2373,2374,2375,2377,2378,2380],{},"To override the default namespace, return a custom ",[440,2376,1167],{}," from the ",[440,2379,916],{}," hook:",[433,2382,2384],{"className":435,"code":2383,"filename":751,"language":438,"meta":5,"style":5},"import { defineWebSocketHandler } from \"nitro\";\n\nexport default defineWebSocketHandler({\n  upgrade(request) {\n    \u002F\u002F Group connections by a query parameter instead of the pathname\n    const url = new URL(request.url);\n    const channel = url.searchParams.get(\"channel\") || \"general\";\n    return {\n      namespace: `chat:${channel}`,\n    };\n  },\n  open(peer) {\n    peer.subscribe(\"messages\");\n    peer.publish(\"messages\", `${peer} joined`);\n  },\n  message(peer, message) {\n    peer.publish(\"messages\", `${peer}: ${message.text()}`);\n  },\n  close(peer) {\n    peer.publish(\"messages\", `${peer} left`);\n  },\n});\n",[440,2385,2386,2398,2402,2412,2422,2427,2441,2469,2475,2490,2494,2498,2508,2520,2541,2545,2559,2589,2593,2603,2623,2627],{"__ignoreMap":5},[443,2387,2388,2390,2392,2394,2396],{"class":445,"line":446},[443,2389,450],{"class":449},[443,2391,547],{"class":453},[443,2393,457],{"class":449},[443,2395,461],{"class":460},[443,2397,464],{"class":453},[443,2399,2400],{"class":445,"line":467},[443,2401,471],{"emptyLinePlaceholder":470},[443,2403,2404,2406,2408,2410],{"class":445,"line":474},[443,2405,477],{"class":449},[443,2407,480],{"class":449},[443,2409,566],{"class":483},[443,2411,487],{"class":453},[443,2413,2414,2416,2418,2420],{"class":445,"line":490},[443,2415,957],{"class":483},[443,2417,576],{"class":453},[443,2419,962],{"class":579},[443,2421,583],{"class":453},[443,2423,2424],{"class":445,"line":496},[443,2425,2426],{"class":1110},"    \u002F\u002F Group connections by a query parameter instead of the pathname\n",[443,2428,2429,2431,2433,2435,2437,2439],{"class":445,"line":509},[443,2430,969],{"class":449},[443,2432,972],{"class":502},[443,2434,789],{"class":449},[443,2436,792],{"class":449},[443,2438,979],{"class":483},[443,2440,982],{"class":453},[443,2442,2443,2445,2448,2450,2452,2454,2456,2459,2461,2464,2467],{"class":445,"line":515},[443,2444,969],{"class":449},[443,2446,2447],{"class":502}," channel",[443,2449,789],{"class":449},[443,2451,994],{"class":453},[443,2453,997],{"class":483},[443,2455,576],{"class":453},[443,2457,2458],{"class":460},"\"channel\"",[443,2460,884],{"class":453},[443,2462,2463],{"class":449},"||",[443,2465,2466],{"class":460}," \"general\"",[443,2468,464],{"class":453},[443,2470,2471,2473],{"class":445,"line":623},[443,2472,1055],{"class":449},[443,2474,828],{"class":453},[443,2476,2477,2480,2483,2486,2488],{"class":445,"line":644},[443,2478,2479],{"class":453},"      namespace: ",[443,2481,2482],{"class":460},"`chat:${",[443,2484,2485],{"class":453},"channel",[443,2487,1354],{"class":460},[443,2489,506],{"class":453},[443,2491,2492],{"class":445,"line":661},[443,2493,1073],{"class":453},[443,2495,2496],{"class":445,"line":666},[443,2497,512],{"class":453},[443,2499,2500,2502,2504,2506],{"class":445,"line":683},[443,2501,573],{"class":483},[443,2503,576],{"class":453},[443,2505,580],{"class":579},[443,2507,583],{"class":453},[443,2509,2510,2512,2514,2516,2518],{"class":445,"line":698},[443,2511,647],{"class":453},[443,2513,1612],{"class":483},[443,2515,576],{"class":453},[443,2517,2231],{"class":460},[443,2519,658],{"class":453},[443,2521,2522,2524,2526,2528,2530,2532,2534,2536,2539],{"class":445,"line":703},[443,2523,647],{"class":453},[443,2525,1672],{"class":483},[443,2527,576],{"class":453},[443,2529,2231],{"class":460},[443,2531,615],{"class":453},[443,2533,1990],{"class":460},[443,2535,580],{"class":453},[443,2537,2538],{"class":460},"} joined`",[443,2540,658],{"class":453},[443,2542,2543],{"class":445,"line":720},[443,2544,512],{"class":453},[443,2546,2547,2549,2551,2553,2555,2557],{"class":445,"line":735},[443,2548,608],{"class":483},[443,2550,576],{"class":453},[443,2552,580],{"class":579},[443,2554,615],{"class":453},[443,2556,618],{"class":579},[443,2558,583],{"class":453},[443,2560,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587],{"class":445,"line":740},[443,2562,647],{"class":453},[443,2564,1672],{"class":483},[443,2566,576],{"class":453},[443,2568,2231],{"class":460},[443,2570,615],{"class":453},[443,2572,1990],{"class":460},[443,2574,580],{"class":453},[443,2576,2304],{"class":460},[443,2578,618],{"class":453},[443,2580,756],{"class":460},[443,2582,638],{"class":483},[443,2584,2313],{"class":460},[443,2586,1354],{"class":460},[443,2588,658],{"class":453},[443,2590,2591],{"class":445,"line":1114},[443,2592,512],{"class":453},[443,2594,2595,2597,2599,2601],{"class":445,"line":2114},[443,2596,669],{"class":483},[443,2598,576],{"class":453},[443,2600,580],{"class":579},[443,2602,583],{"class":453},[443,2604,2605,2607,2609,2611,2613,2615,2617,2619,2621],{"class":445,"line":2136},[443,2606,647],{"class":453},[443,2608,1672],{"class":483},[443,2610,576],{"class":453},[443,2612,2231],{"class":460},[443,2614,615],{"class":453},[443,2616,1990],{"class":460},[443,2618,580],{"class":453},[443,2620,2350],{"class":460},[443,2622,658],{"class":453},[443,2624,2625],{"class":445,"line":2141},[443,2626,512],{"class":453},[443,2628,2630],{"class":445,"line":2629},22,[443,2631,518],{"class":453},[422,2633,2635],{"id":2634},"server-sent-events-sse","Server-Sent Events (SSE)",[413,2637,2638,2643],{},[531,2639,2642],{"href":2640,"rel":2641},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events",[769],"Server-Sent Events"," provide a simpler alternative when you only need server-to-client streaming. Unlike WebSockets, SSE uses standard HTTP and supports automatic reconnection.",[433,2645,2648],{"className":435,"code":2646,"filename":2647,"language":438,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\nimport { createEventStream } from \"nitro\u002Fh3\";\n\nexport default defineHandler((event) => {\n  const stream = createEventStream(event);\n\n  const interval = setInterval(async () => {\n    await stream.push(`Message @ ${new Date().toLocaleTimeString()}`);\n  }, 1000);\n\n  stream.onClosed(() => {\n    clearInterval(interval);\n  });\n\n  return stream.send();\n});\n","routes\u002Fsse.ts",[440,2649,2650,2663,2677,2681,2701,2716,2720,2744,2778,2787,2791,2806,2814,2819,2823,2834],{"__ignoreMap":5},[443,2651,2652,2654,2657,2659,2661],{"class":445,"line":446},[443,2653,450],{"class":449},[443,2655,2656],{"class":453}," { defineHandler } ",[443,2658,457],{"class":449},[443,2660,461],{"class":460},[443,2662,464],{"class":453},[443,2664,2665,2667,2670,2672,2675],{"class":445,"line":467},[443,2666,450],{"class":449},[443,2668,2669],{"class":453}," { createEventStream } ",[443,2671,457],{"class":449},[443,2673,2674],{"class":460}," \"nitro\u002Fh3\"",[443,2676,464],{"class":453},[443,2678,2679],{"class":445,"line":474},[443,2680,471],{"emptyLinePlaceholder":470},[443,2682,2683,2685,2687,2690,2693,2695,2697,2699],{"class":445,"line":490},[443,2684,477],{"class":449},[443,2686,480],{"class":449},[443,2688,2689],{"class":483}," defineHandler",[443,2691,2692],{"class":453},"((",[443,2694,881],{"class":579},[443,2696,884],{"class":453},[443,2698,825],{"class":449},[443,2700,828],{"class":453},[443,2702,2703,2705,2708,2710,2713],{"class":445,"line":496},[443,2704,1263],{"class":449},[443,2706,2707],{"class":502}," stream",[443,2709,789],{"class":449},[443,2711,2712],{"class":483}," createEventStream",[443,2714,2715],{"class":453},"(event);\n",[443,2717,2718],{"class":445,"line":509},[443,2719,471],{"emptyLinePlaceholder":470},[443,2721,2722,2724,2727,2729,2732,2734,2737,2740,2742],{"class":445,"line":515},[443,2723,1263],{"class":449},[443,2725,2726],{"class":502}," interval",[443,2728,789],{"class":449},[443,2730,2731],{"class":483}," setInterval",[443,2733,576],{"class":453},[443,2735,2736],{"class":449},"async",[443,2738,2739],{"class":453}," () ",[443,2741,825],{"class":449},[443,2743,828],{"class":453},[443,2745,2746,2749,2752,2755,2757,2760,2763,2766,2769,2772,2774,2776],{"class":445,"line":623},[443,2747,2748],{"class":449},"    await",[443,2750,2751],{"class":453}," stream.",[443,2753,2754],{"class":483},"push",[443,2756,576],{"class":453},[443,2758,2759],{"class":460},"`Message @ ${",[443,2761,2762],{"class":449},"new",[443,2764,2765],{"class":483}," Date",[443,2767,2768],{"class":460},"().",[443,2770,2771],{"class":483},"toLocaleTimeString",[443,2773,2313],{"class":460},[443,2775,1354],{"class":460},[443,2777,658],{"class":453},[443,2779,2780,2783,2785],{"class":445,"line":644},[443,2781,2782],{"class":453},"  }, ",[443,2784,1715],{"class":502},[443,2786,658],{"class":453},[443,2788,2789],{"class":445,"line":661},[443,2790,471],{"emptyLinePlaceholder":470},[443,2792,2793,2796,2799,2802,2804],{"class":445,"line":666},[443,2794,2795],{"class":453},"  stream.",[443,2797,2798],{"class":483},"onClosed",[443,2800,2801],{"class":453},"(() ",[443,2803,825],{"class":449},[443,2805,828],{"class":453},[443,2807,2808,2811],{"class":445,"line":683},[443,2809,2810],{"class":483},"    clearInterval",[443,2812,2813],{"class":453},"(interval);\n",[443,2815,2816],{"class":445,"line":698},[443,2817,2818],{"class":453},"  });\n",[443,2820,2821],{"class":445,"line":703},[443,2822,471],{"emptyLinePlaceholder":470},[443,2824,2825,2828,2830,2832],{"class":445,"line":720},[443,2826,2827],{"class":449},"  return",[443,2829,2751],{"class":453},[443,2831,650],{"class":483},[443,2833,1276],{"class":453},[443,2835,2836],{"class":445,"line":735},[443,2837,518],{"class":453},[413,2839,2840,2841,1893],{},"Connect from the client using the ",[531,2842,2845],{"href":2843,"rel":2844},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FEventSource",[769],"EventSource API",[433,2847,2849],{"className":774,"code":2848,"language":776,"meta":5,"style":5},"const source = new EventSource(\"\u002Fsse\");\n\nsource.onmessage = (event) => {\n  console.log(event.data);\n};\n",[440,2850,2851,2872,2876,2896,2905],{"__ignoreMap":5},[443,2852,2853,2855,2858,2860,2862,2865,2867,2870],{"class":445,"line":446},[443,2854,783],{"class":449},[443,2856,2857],{"class":502}," source",[443,2859,789],{"class":449},[443,2861,792],{"class":449},[443,2863,2864],{"class":483}," EventSource",[443,2866,576],{"class":453},[443,2868,2869],{"class":460},"\"\u002Fsse\"",[443,2871,658],{"class":453},[443,2873,2874],{"class":445,"line":467},[443,2875,471],{"emptyLinePlaceholder":470},[443,2877,2878,2881,2884,2886,2888,2890,2892,2894],{"class":445,"line":474},[443,2879,2880],{"class":453},"source.",[443,2882,2883],{"class":483},"onmessage",[443,2885,789],{"class":449},[443,2887,1012],{"class":453},[443,2889,881],{"class":579},[443,2891,884],{"class":453},[443,2893,825],{"class":449},[443,2895,828],{"class":453},[443,2897,2898,2900,2902],{"class":445,"line":490},[443,2899,833],{"class":453},[443,2901,591],{"class":483},[443,2903,2904],{"class":453},"(event.data);\n",[443,2906,2907],{"class":445,"line":496},[443,2908,2909],{"class":453},"};\n",[758,2911,2913],{"id":2912},"structured-messages","Structured messages",[413,2915,2916,2917,615,2919,2921,2922,2925],{},"SSE messages support optional ",[440,2918,1431],{},[440,2920,881],{},", and ",[440,2923,2924],{},"retry"," fields:",[433,2927,2930],{"className":435,"code":2928,"filename":2929,"language":438,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\nimport { createEventStream } from \"nitro\u002Fh3\";\n\nexport default defineHandler((event) => {\n  const stream = createEventStream(event);\n  let id = 0;\n\n  const interval = setInterval(async () => {\n    await stream.push({\n      id: String(id++),\n      event: \"update\",\n      data: JSON.stringify({ value: Math.random() }),\n      retry: 3000,\n    });\n  }, 1000);\n\n  stream.onClosed(() => {\n    clearInterval(interval);\n  });\n\n  return stream.send();\n});\n","routes\u002Fevents.ts",[440,2931,2932,2944,2956,2960,2978,2990,3006,3010,3030,3040,3057,3067,3089,3099,3103,3111,3115,3127,3133,3137,3141,3151],{"__ignoreMap":5},[443,2933,2934,2936,2938,2940,2942],{"class":445,"line":446},[443,2935,450],{"class":449},[443,2937,2656],{"class":453},[443,2939,457],{"class":449},[443,2941,461],{"class":460},[443,2943,464],{"class":453},[443,2945,2946,2948,2950,2952,2954],{"class":445,"line":467},[443,2947,450],{"class":449},[443,2949,2669],{"class":453},[443,2951,457],{"class":449},[443,2953,2674],{"class":460},[443,2955,464],{"class":453},[443,2957,2958],{"class":445,"line":474},[443,2959,471],{"emptyLinePlaceholder":470},[443,2961,2962,2964,2966,2968,2970,2972,2974,2976],{"class":445,"line":490},[443,2963,477],{"class":449},[443,2965,480],{"class":449},[443,2967,2689],{"class":483},[443,2969,2692],{"class":453},[443,2971,881],{"class":579},[443,2973,884],{"class":453},[443,2975,825],{"class":449},[443,2977,828],{"class":453},[443,2979,2980,2982,2984,2986,2988],{"class":445,"line":496},[443,2981,1263],{"class":449},[443,2983,2707],{"class":502},[443,2985,789],{"class":449},[443,2987,2712],{"class":483},[443,2989,2715],{"class":453},[443,2991,2992,2995,2998,3001,3004],{"class":445,"line":509},[443,2993,2994],{"class":449},"  let",[443,2996,2997],{"class":453}," id ",[443,2999,3000],{"class":449},"=",[443,3002,3003],{"class":502}," 0",[443,3005,464],{"class":453},[443,3007,3008],{"class":445,"line":515},[443,3009,471],{"emptyLinePlaceholder":470},[443,3011,3012,3014,3016,3018,3020,3022,3024,3026,3028],{"class":445,"line":623},[443,3013,1263],{"class":449},[443,3015,2726],{"class":502},[443,3017,789],{"class":449},[443,3019,2731],{"class":483},[443,3021,576],{"class":453},[443,3023,2736],{"class":449},[443,3025,2739],{"class":453},[443,3027,825],{"class":449},[443,3029,828],{"class":453},[443,3031,3032,3034,3036,3038],{"class":445,"line":644},[443,3033,2748],{"class":449},[443,3035,2751],{"class":453},[443,3037,2754],{"class":483},[443,3039,487],{"class":453},[443,3041,3042,3045,3048,3051,3054],{"class":445,"line":661},[443,3043,3044],{"class":453},"      id: ",[443,3046,3047],{"class":483},"String",[443,3049,3050],{"class":453},"(id",[443,3052,3053],{"class":449},"++",[443,3055,3056],{"class":453},"),\n",[443,3058,3059,3062,3065],{"class":445,"line":666},[443,3060,3061],{"class":453},"      event: ",[443,3063,3064],{"class":460},"\"update\"",[443,3066,506],{"class":453},[443,3068,3069,3072,3075,3077,3080,3083,3086],{"class":445,"line":683},[443,3070,3071],{"class":453},"      data: ",[443,3073,3074],{"class":502},"JSON",[443,3076,756],{"class":453},[443,3078,3079],{"class":483},"stringify",[443,3081,3082],{"class":453},"({ value: Math.",[443,3084,3085],{"class":483},"random",[443,3087,3088],{"class":453},"() }),\n",[443,3090,3091,3094,3097],{"class":445,"line":698},[443,3092,3093],{"class":453},"      retry: ",[443,3095,3096],{"class":502},"3000",[443,3098,506],{"class":453},[443,3100,3101],{"class":445,"line":703},[443,3102,2072],{"class":453},[443,3104,3105,3107,3109],{"class":445,"line":720},[443,3106,2782],{"class":453},[443,3108,1715],{"class":502},[443,3110,658],{"class":453},[443,3112,3113],{"class":445,"line":735},[443,3114,471],{"emptyLinePlaceholder":470},[443,3116,3117,3119,3121,3123,3125],{"class":445,"line":740},[443,3118,2795],{"class":453},[443,3120,2798],{"class":483},[443,3122,2801],{"class":453},[443,3124,825],{"class":449},[443,3126,828],{"class":453},[443,3128,3129,3131],{"class":445,"line":1114},[443,3130,2810],{"class":483},[443,3132,2813],{"class":453},[443,3134,3135],{"class":445,"line":2114},[443,3136,2818],{"class":453},[443,3138,3139],{"class":445,"line":2136},[443,3140,471],{"emptyLinePlaceholder":470},[443,3142,3143,3145,3147,3149],{"class":445,"line":2141},[443,3144,2827],{"class":449},[443,3146,2751],{"class":453},[443,3148,650],{"class":483},[443,3150,1276],{"class":453},[443,3152,3153],{"class":445,"line":2629},[443,3154,518],{"class":453},[417,3156],{"title":3157,"to":3158},"H3 Documentation","https:\u002F\u002Fh3.dev\u002F",[3160,3161,3162],"style",{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":5,"searchDepth":467,"depth":467,"links":3164},[3165,3166,3169,3176,3180,3181,3184],{"id":424,"depth":467,"text":425},{"id":521,"depth":467,"text":522,"children":3167},[3168],{"id":760,"depth":474,"text":761},{"id":909,"depth":467,"text":910,"children":3170},[3171,3172,3173,3174,3175],{"id":916,"depth":474,"text":916},{"id":1203,"depth":474,"text":1203},{"id":618,"depth":474,"text":618},{"id":1299,"depth":474,"text":1299},{"id":715,"depth":474,"text":715},{"id":580,"depth":467,"text":1399,"children":3177},[3178,3179],{"id":1409,"depth":474,"text":1410},{"id":1542,"depth":474,"text":1543},{"id":1734,"depth":467,"text":1735},{"id":1917,"depth":467,"text":1918,"children":3182},[3183],{"id":2163,"depth":474,"text":2164},{"id":2634,"depth":467,"text":2635,"children":3185},[3186],{"id":2912,"depth":474,"text":2913},"Nitro provides cross-platform WebSocket support powered by CrossWS and H3.","md",{"icon":66},{"icon":66},{"title":63,"description":3187},"SPAAHvW7HGZJQvq30KKXJup7pvi3M0g01PT5Q7oEGu8",[3194,3196],{"title":58,"path":59,"stem":60,"description":3195,"icon":61,"children":-1},"Nitro tasks allow on-off operations in runtime.",{"title":68,"path":69,"stem":70,"description":3197,"icon":71,"children":-1},"Use a server entry to create a global middleware that runs for all routes before they are matched.",1784141548820]