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