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