[{"data":1,"prerenderedAt":1449},["ShallowReactive",2],{"navigation":3,"-adapters-node":83,"-adapters-node-surround":1444},[4,46],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Guide","\u002Fguide","1.guide\u002F1.index",[9,11,16,21,26,31,36,41],{"title":5,"path":6,"stem":7,"icon":10},"ph:book-open-duotone",{"title":12,"path":13,"stem":14,"icon":15},"Hooks","\u002Fguide\u002Fhooks","1.guide\u002F2.hooks","material-symbols-light:data-object",{"title":17,"path":18,"stem":19,"icon":20},"Peer","\u002Fguide\u002Fpeer","1.guide\u002F3.peer","mynaui:api",{"title":22,"path":23,"stem":24,"icon":25},"Message","\u002Fguide\u002Fmessage","1.guide\u002F4.message","solar:letter-line-duotone",{"title":27,"path":28,"stem":29,"icon":30},"Pub \u002F Sub","\u002Fguide\u002Fpubsub","1.guide\u002F5.pubsub","simple-icons:googlepubsub",{"title":32,"path":33,"stem":34,"icon":35},"Sync Backplane","\u002Fguide\u002Fsync","1.guide\u002F6.sync","tabler:refresh",{"title":37,"path":38,"stem":39,"icon":40},"Resolver API","\u002Fguide\u002Fresolver","1.guide\u002F7.resolver","tabler:route",{"title":42,"path":43,"stem":44,"icon":45},"WebSocket Proxy","\u002Fguide\u002Fproxy","1.guide\u002F8.proxy","tabler:arrows-exchange",{"title":47,"path":48,"stem":49,"children":50,"icon":52},"Adapters","\u002Fadapters","2.adapters\u002F1.index",[51,53,58,63,68,73,78],{"title":47,"path":48,"stem":49,"icon":52},"emojione-monotone:electric-plug",{"title":54,"path":55,"stem":56,"icon":57},"Bun","\u002Fadapters\u002Fbun","2.adapters\u002Fbun","simple-icons:bun",{"title":59,"path":60,"stem":61,"icon":62},"Bunny","\u002Fadapters\u002Fbunny","2.adapters\u002Fbunny","mdi:rabbit",{"title":64,"path":65,"stem":66,"icon":67},"Cloudflare","\u002Fadapters\u002Fcloudflare","2.adapters\u002Fcloudflare","devicon-plain:cloudflareworkers",{"title":69,"path":70,"stem":71,"icon":72},"Deno","\u002Fadapters\u002Fdeno","2.adapters\u002Fdeno","teenyicons:deno-solid",{"title":74,"path":75,"stem":76,"icon":77},"Node.js","\u002Fadapters\u002Fnode","2.adapters\u002Fnode","akar-icons:node-fill",{"title":79,"path":80,"stem":81,"icon":82},"SSE","\u002Fadapters\u002Fsse","2.adapters\u002Fsse","clarity:two-way-arrows-line",{"id":84,"title":74,"body":85,"description":1438,"extension":1439,"meta":1440,"navigation":1441,"path":75,"seo":1442,"stem":76,"__hash__":1443},"content\u002F2.adapters\u002Fnode.md",{"type":86,"value":87,"toc":1433,"icon":77},"minimark",[88,109,128,391,413,418,441,676,696,707,711,720,727,942,960,964,990,1406,1417,1429],[89,90,91],"tip",{},[92,93,94,95,99,100,103,104,108],"p",{},"\nYou can use ",[96,97,98],"code",{},"serve"," function from ",[96,101,102],{},"crossws\u002Fserver"," to ",[105,106,107],"strong",{},"automatically"," integrate crossws with Node.js!",[92,110,111,112,115,116,119,120,127],{},"To manually integrate crossws with your Node.js HTTP server, you need to connect the ",[96,113,114],{},"upgrade"," event to the ",[96,117,118],{},"handleUpgrade"," method returned from the adapter. crossws uses a prebundled version of ",[121,122,126],"a",{"href":123,"rel":124},"https:\u002F\u002Fgithub.com\u002Fwebsockets\u002Fws",[125],"nofollow","ws",".",[129,130,135],"pre",{"className":131,"code":132,"language":133,"meta":134,"style":134},"language-ts shiki shiki-themes github-light github-dark github-dark","import { createServer } from \"node:http\";\nimport crossws from \"crossws\u002Fadapters\u002Fnode\";\n\nconst ws = crossws({\n  hooks: {\n    message: console.log,\n  },\n});\n\nconst server = createServer((req, res) => {\n  res.end(\n    `\u003Cscript>new WebSocket(\"ws:\u002F\u002Flocalhost:3000\").addEventListener('open', (e) => e.target.send(\"Hello from client!\"));\u003C\u002Fscript>`,\n  );\n}).listen(3000);\n\nserver.on(\"upgrade\", (req, socket, head) => {\n  if (req.headers.upgrade === \"websocket\") {\n    ws.handleUpgrade(req, socket, head);\n  }\n});\n","ts","",[96,136,137,160,175,182,202,208,214,220,226,231,266,278,287,293,311,316,351,369,380,386],{"__ignoreMap":134},[138,139,142,146,150,153,157],"span",{"class":140,"line":141},"line",1,[138,143,145],{"class":144},"so5gQ","import",[138,147,149],{"class":148},"slsVL"," { createServer } ",[138,151,152],{"class":144},"from",[138,154,156],{"class":155},"sfrk1"," \"node:http\"",[138,158,159],{"class":148},";\n",[138,161,163,165,168,170,173],{"class":140,"line":162},2,[138,164,145],{"class":144},[138,166,167],{"class":148}," crossws ",[138,169,152],{"class":144},[138,171,172],{"class":155}," \"crossws\u002Fadapters\u002Fnode\"",[138,174,159],{"class":148},[138,176,178],{"class":140,"line":177},3,[138,179,181],{"emptyLinePlaceholder":180},true,"\n",[138,183,185,188,192,195,199],{"class":140,"line":184},4,[138,186,187],{"class":144},"const",[138,189,191],{"class":190},"suiK_"," ws",[138,193,194],{"class":144}," =",[138,196,198],{"class":197},"shcOC"," crossws",[138,200,201],{"class":148},"({\n",[138,203,205],{"class":140,"line":204},5,[138,206,207],{"class":148},"  hooks: {\n",[138,209,211],{"class":140,"line":210},6,[138,212,213],{"class":148},"    message: console.log,\n",[138,215,217],{"class":140,"line":216},7,[138,218,219],{"class":148},"  },\n",[138,221,223],{"class":140,"line":222},8,[138,224,225],{"class":148},"});\n",[138,227,229],{"class":140,"line":228},9,[138,230,181],{"emptyLinePlaceholder":180},[138,232,234,236,239,241,244,247,251,254,257,260,263],{"class":140,"line":233},10,[138,235,187],{"class":144},[138,237,238],{"class":190}," server",[138,240,194],{"class":144},[138,242,243],{"class":197}," createServer",[138,245,246],{"class":148},"((",[138,248,250],{"class":249},"sQHwn","req",[138,252,253],{"class":148},", ",[138,255,256],{"class":249},"res",[138,258,259],{"class":148},") ",[138,261,262],{"class":144},"=>",[138,264,265],{"class":148}," {\n",[138,267,269,272,275],{"class":140,"line":268},11,[138,270,271],{"class":148},"  res.",[138,273,274],{"class":197},"end",[138,276,277],{"class":148},"(\n",[138,279,281,284],{"class":140,"line":280},12,[138,282,283],{"class":155},"    `\u003Cscript>new WebSocket(\"ws:\u002F\u002Flocalhost:3000\").addEventListener('open', (e) => e.target.send(\"Hello from client!\"));\u003C\u002Fscript>`",[138,285,286],{"class":148},",\n",[138,288,290],{"class":140,"line":289},13,[138,291,292],{"class":148},"  );\n",[138,294,296,299,302,305,308],{"class":140,"line":295},14,[138,297,298],{"class":148},"}).",[138,300,301],{"class":197},"listen",[138,303,304],{"class":148},"(",[138,306,307],{"class":190},"3000",[138,309,310],{"class":148},");\n",[138,312,314],{"class":140,"line":313},15,[138,315,181],{"emptyLinePlaceholder":180},[138,317,319,322,325,327,330,333,335,337,340,342,345,347,349],{"class":140,"line":318},16,[138,320,321],{"class":148},"server.",[138,323,324],{"class":197},"on",[138,326,304],{"class":148},[138,328,329],{"class":155},"\"upgrade\"",[138,331,332],{"class":148},", (",[138,334,250],{"class":249},[138,336,253],{"class":148},[138,338,339],{"class":249},"socket",[138,341,253],{"class":148},[138,343,344],{"class":249},"head",[138,346,259],{"class":148},[138,348,262],{"class":144},[138,350,265],{"class":148},[138,352,354,357,360,363,366],{"class":140,"line":353},17,[138,355,356],{"class":144},"  if",[138,358,359],{"class":148}," (req.headers.upgrade ",[138,361,362],{"class":144},"===",[138,364,365],{"class":155}," \"websocket\"",[138,367,368],{"class":148},") {\n",[138,370,372,375,377],{"class":140,"line":371},18,[138,373,374],{"class":148},"    ws.",[138,376,118],{"class":197},[138,378,379],{"class":148},"(req, socket, head);\n",[138,381,383],{"class":140,"line":382},19,[138,384,385],{"class":148},"  }\n",[138,387,389],{"class":140,"line":388},20,[138,390,225],{"class":148},[392,393,394],"read-more",{},[92,395,396,397,404,405,412],{},"See ",[121,398,401],{"href":399,"rel":400},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Ftest\u002Ffixture\u002Fnode.ts",[125],[96,402,403],{},"test\u002Ffixture\u002Fnode.ts"," for demo and ",[121,406,409],{"href":407,"rel":408},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Fsrc\u002Fadapters\u002Fnode.ts",[125],[96,410,411],{},"src\u002Fadapters\u002Fnode.ts"," for implementation.",[414,415,417],"h2",{"id":416},"delegating-to-an-existing-nodejs-upgrade-handler","Delegating to an existing Node.js upgrade handler",[92,419,420,421,424,425,253,430,253,433,436,437,440],{},"If you already have a Node.js WebSocket library that exposes a raw ",[96,422,423],{},"(req, socket, head)"," upgrade handler (e.g. ",[121,426,428],{"href":123,"rel":427},[125],[96,429,126],{},[96,431,432],{},"socket.io",[96,434,435],{},"express-ws","), you can route to it through crossws using ",[96,438,439],{},"fromNodeUpgradeHandler",". This lets you keep crossws's upgrade-time request handling while delegating the WebSocket lifecycle to your existing library.",[129,442,444],{"className":131,"code":443,"language":133,"meta":134,"style":134},"import { WebSocketServer } from \"ws\";\nimport { fromNodeUpgradeHandler } from \"crossws\u002Fadapters\u002Fnode\";\nimport { serve } from \"crossws\u002Fserver\u002Fnode\";\n\nconst wss = new WebSocketServer({ noServer: true });\nwss.on(\"connection\", (ws) => {\n  ws.on(\"message\", (data) => ws.send(data));\n});\n\nserve({\n  fetch: () => new Response(\"ok\"),\n  websocket: fromNodeUpgradeHandler((req, socket, head) => {\n    wss.handleUpgrade(req, socket, head, (ws) => {\n      wss.emit(\"connection\", ws, req);\n    });\n  }),\n});\n",[96,445,446,460,473,487,491,515,537,567,571,575,581,604,629,647,662,667,672],{"__ignoreMap":134},[138,447,448,450,453,455,458],{"class":140,"line":141},[138,449,145],{"class":144},[138,451,452],{"class":148}," { WebSocketServer } ",[138,454,152],{"class":144},[138,456,457],{"class":155}," \"ws\"",[138,459,159],{"class":148},[138,461,462,464,467,469,471],{"class":140,"line":162},[138,463,145],{"class":144},[138,465,466],{"class":148}," { fromNodeUpgradeHandler } ",[138,468,152],{"class":144},[138,470,172],{"class":155},[138,472,159],{"class":148},[138,474,475,477,480,482,485],{"class":140,"line":177},[138,476,145],{"class":144},[138,478,479],{"class":148}," { serve } ",[138,481,152],{"class":144},[138,483,484],{"class":155}," \"crossws\u002Fserver\u002Fnode\"",[138,486,159],{"class":148},[138,488,489],{"class":140,"line":184},[138,490,181],{"emptyLinePlaceholder":180},[138,492,493,495,498,500,503,506,509,512],{"class":140,"line":204},[138,494,187],{"class":144},[138,496,497],{"class":190}," wss",[138,499,194],{"class":144},[138,501,502],{"class":144}," new",[138,504,505],{"class":197}," WebSocketServer",[138,507,508],{"class":148},"({ noServer: ",[138,510,511],{"class":190},"true",[138,513,514],{"class":148}," });\n",[138,516,517,520,522,524,527,529,531,533,535],{"class":140,"line":210},[138,518,519],{"class":148},"wss.",[138,521,324],{"class":197},[138,523,304],{"class":148},[138,525,526],{"class":155},"\"connection\"",[138,528,332],{"class":148},[138,530,126],{"class":249},[138,532,259],{"class":148},[138,534,262],{"class":144},[138,536,265],{"class":148},[138,538,539,542,544,546,549,551,554,556,558,561,564],{"class":140,"line":216},[138,540,541],{"class":148},"  ws.",[138,543,324],{"class":197},[138,545,304],{"class":148},[138,547,548],{"class":155},"\"message\"",[138,550,332],{"class":148},[138,552,553],{"class":249},"data",[138,555,259],{"class":148},[138,557,262],{"class":144},[138,559,560],{"class":148}," ws.",[138,562,563],{"class":197},"send",[138,565,566],{"class":148},"(data));\n",[138,568,569],{"class":140,"line":222},[138,570,225],{"class":148},[138,572,573],{"class":140,"line":228},[138,574,181],{"emptyLinePlaceholder":180},[138,576,577,579],{"class":140,"line":233},[138,578,98],{"class":197},[138,580,201],{"class":148},[138,582,583,586,589,591,593,596,598,601],{"class":140,"line":268},[138,584,585],{"class":197},"  fetch",[138,587,588],{"class":148},": () ",[138,590,262],{"class":144},[138,592,502],{"class":144},[138,594,595],{"class":197}," Response",[138,597,304],{"class":148},[138,599,600],{"class":155},"\"ok\"",[138,602,603],{"class":148},"),\n",[138,605,606,609,611,613,615,617,619,621,623,625,627],{"class":140,"line":280},[138,607,608],{"class":148},"  websocket: ",[138,610,439],{"class":197},[138,612,246],{"class":148},[138,614,250],{"class":249},[138,616,253],{"class":148},[138,618,339],{"class":249},[138,620,253],{"class":148},[138,622,344],{"class":249},[138,624,259],{"class":148},[138,626,262],{"class":144},[138,628,265],{"class":148},[138,630,631,634,636,639,641,643,645],{"class":140,"line":289},[138,632,633],{"class":148},"    wss.",[138,635,118],{"class":197},[138,637,638],{"class":148},"(req, socket, head, (",[138,640,126],{"class":249},[138,642,259],{"class":148},[138,644,262],{"class":144},[138,646,265],{"class":148},[138,648,649,652,655,657,659],{"class":140,"line":295},[138,650,651],{"class":148},"      wss.",[138,653,654],{"class":197},"emit",[138,656,304],{"class":148},[138,658,526],{"class":155},[138,660,661],{"class":148},", ws, req);\n",[138,663,664],{"class":140,"line":313},[138,665,666],{"class":148},"    });\n",[138,668,669],{"class":140,"line":318},[138,670,671],{"class":148},"  }),\n",[138,673,674],{"class":140,"line":353},[138,675,225],{"class":148},[92,677,678,679,253,682,253,685,253,688,691,692,695],{},"The underlying handler takes full ownership of the socket, so crossws's other lifecycle hooks (",[96,680,681],{},"open",[96,683,684],{},"message",[96,686,687],{},"close",[96,689,690],{},"error",") are ",[105,693,694],{},"not"," invoked for connections routed through it — manage the WebSocket lifecycle inside your own library as usual.",[697,698,699],"note",{},[92,700,701,703,704,127],{},[96,702,439],{}," only works on the Node.js runtime, and must be used via the crossws node server plugin so the request carries ",[96,705,706],{},"runtime.node.upgrade.{socket, head}",[414,708,710],{"id":709},"uwebsockets","uWebSockets",[92,712,713,714,719],{},"You can alternatively use ",[121,715,718],{"href":716,"rel":717},"https:\u002F\u002Fgithub.com\u002FuNetworking\u002FuWebSockets.js",[125],"uWebSockets.js"," for Node.js servers.",[92,721,722,723,726],{},"First add ",[96,724,725],{},"uNetworking\u002FuWebSockets.js"," as a dependency.",[129,728,730],{"className":131,"code":729,"language":133,"meta":134,"style":134},"import { App } from \"uWebSockets.js\";\nimport crossws from \"crossws\u002Fadapters\u002Fuws\";\n\nconst ws = crossws({\n  hooks: {\n    message: console.log,\n  },\n});\n\nconst server = App().ws(\"\u002F*\", ws.websocket);\n\nserver.get(\"\u002F*\", (res, req) => {\n  res.writeStatus(\"200 OK\").writeHeader(\"Content-Type\", \"text\u002Fhtml\");\n  res.end(\n    `\u003Cscript>new WebSocket(\"ws:\u002F\u002Flocalhost:3000\").addEventListener('open', (e) => e.target.send(\"Hello from client!\"));\u003C\u002Fscript>`,\n  );\n});\n\nserver.listen(3001, () => {\n  console.log(\"Listening to port 3001\");\n});\n",[96,731,732,746,759,763,775,779,783,787,791,795,819,823,848,878,886,892,896,900,904,922,937],{"__ignoreMap":134},[138,733,734,736,739,741,744],{"class":140,"line":141},[138,735,145],{"class":144},[138,737,738],{"class":148}," { App } ",[138,740,152],{"class":144},[138,742,743],{"class":155}," \"uWebSockets.js\"",[138,745,159],{"class":148},[138,747,748,750,752,754,757],{"class":140,"line":162},[138,749,145],{"class":144},[138,751,167],{"class":148},[138,753,152],{"class":144},[138,755,756],{"class":155}," \"crossws\u002Fadapters\u002Fuws\"",[138,758,159],{"class":148},[138,760,761],{"class":140,"line":177},[138,762,181],{"emptyLinePlaceholder":180},[138,764,765,767,769,771,773],{"class":140,"line":184},[138,766,187],{"class":144},[138,768,191],{"class":190},[138,770,194],{"class":144},[138,772,198],{"class":197},[138,774,201],{"class":148},[138,776,777],{"class":140,"line":204},[138,778,207],{"class":148},[138,780,781],{"class":140,"line":210},[138,782,213],{"class":148},[138,784,785],{"class":140,"line":216},[138,786,219],{"class":148},[138,788,789],{"class":140,"line":222},[138,790,225],{"class":148},[138,792,793],{"class":140,"line":228},[138,794,181],{"emptyLinePlaceholder":180},[138,796,797,799,801,803,806,809,811,813,816],{"class":140,"line":233},[138,798,187],{"class":144},[138,800,238],{"class":190},[138,802,194],{"class":144},[138,804,805],{"class":197}," App",[138,807,808],{"class":148},"().",[138,810,126],{"class":197},[138,812,304],{"class":148},[138,814,815],{"class":155},"\"\u002F*\"",[138,817,818],{"class":148},", ws.websocket);\n",[138,820,821],{"class":140,"line":268},[138,822,181],{"emptyLinePlaceholder":180},[138,824,825,827,830,832,834,836,838,840,842,844,846],{"class":140,"line":280},[138,826,321],{"class":148},[138,828,829],{"class":197},"get",[138,831,304],{"class":148},[138,833,815],{"class":155},[138,835,332],{"class":148},[138,837,256],{"class":249},[138,839,253],{"class":148},[138,841,250],{"class":249},[138,843,259],{"class":148},[138,845,262],{"class":144},[138,847,265],{"class":148},[138,849,850,852,855,857,860,863,866,868,871,873,876],{"class":140,"line":289},[138,851,271],{"class":148},[138,853,854],{"class":197},"writeStatus",[138,856,304],{"class":148},[138,858,859],{"class":155},"\"200 OK\"",[138,861,862],{"class":148},").",[138,864,865],{"class":197},"writeHeader",[138,867,304],{"class":148},[138,869,870],{"class":155},"\"Content-Type\"",[138,872,253],{"class":148},[138,874,875],{"class":155},"\"text\u002Fhtml\"",[138,877,310],{"class":148},[138,879,880,882,884],{"class":140,"line":295},[138,881,271],{"class":148},[138,883,274],{"class":197},[138,885,277],{"class":148},[138,887,888,890],{"class":140,"line":313},[138,889,283],{"class":155},[138,891,286],{"class":148},[138,893,894],{"class":140,"line":318},[138,895,292],{"class":148},[138,897,898],{"class":140,"line":353},[138,899,225],{"class":148},[138,901,902],{"class":140,"line":371},[138,903,181],{"emptyLinePlaceholder":180},[138,905,906,908,910,912,915,918,920],{"class":140,"line":382},[138,907,321],{"class":148},[138,909,301],{"class":197},[138,911,304],{"class":148},[138,913,914],{"class":190},"3001",[138,916,917],{"class":148},", () ",[138,919,262],{"class":144},[138,921,265],{"class":148},[138,923,924,927,930,932,935],{"class":140,"line":388},[138,925,926],{"class":148},"  console.",[138,928,929],{"class":197},"log",[138,931,304],{"class":148},[138,933,934],{"class":155},"\"Listening to port 3001\"",[138,936,310],{"class":148},[138,938,940],{"class":140,"line":939},21,[138,941,225],{"class":148},[392,943,944],{},[92,945,396,946,404,953,412],{},[121,947,950],{"href":948,"rel":949},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Ftest\u002Ffixture\u002Fnode-uws.ts",[125],[96,951,952],{},"test\u002Ffixture\u002Fnode-uws.ts",[121,954,957],{"href":955,"rel":956},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Fsrc\u002Fadapters\u002Fnode-uws.ts",[125],[96,958,959],{},"src\u002Fadapters\u002Fnode-uws.ts",[414,961,963],{"id":962},"socketio","Socket.IO",[92,965,966,970,971,974,975,977,978,981,982,985,986,989],{},[121,967,963],{"href":968,"rel":969},"https:\u002F\u002Fsocket.io\u002F",[125]," speaks two transports: a WebSocket upgrade and an HTTP long-polling fallback served under ",[96,972,973],{},"\u002Fsocket.io\u002F",". Both can be routed through crossws by combining ",[96,976,439],{}," with srvx's ",[96,979,980],{},"fetchNodeHandler"," helper to forward the polling path (and the optional client bundle at ",[96,983,984],{},"\u002Fsocket.io\u002Fsocket.io.js",") to socket.io's own Node-style ",[96,987,988],{},"(req, res)"," listener:",[129,991,993],{"className":131,"code":992,"language":133,"meta":134,"style":134},"import { createServer } from \"node:http\";\nimport { Server as SocketIOServer } from \"socket.io\";\nimport { fromNodeUpgradeHandler } from \"crossws\u002Fadapters\u002Fnode\";\nimport { serve } from \"crossws\u002Fserver\u002Fnode\";\nimport { fetchNodeHandler } from \"srvx\u002Fnode\";\n\n\u002F\u002F Attach socket.io to a throwaway http.Server — it never `.listen()`s,\n\u002F\u002F but the dummy server now holds socket.io's own `request` listener,\n\u002F\u002F which handles the client bundle AND delegates polling to engine.io.\nconst dummyServer = createServer();\nconst io = new SocketIOServer(dummyServer, { serveClient: true });\nconst [socketIoRequestListener] = dummyServer.listeners(\"request\");\n\nio.on(\"connection\", (socket) => {\n  socket.emit(\"welcome\", { id: socket.id });\n  socket.on(\"message\", (text) => io.emit(\"message\", { from: socket.id, text }));\n});\n\nconst server = serve({\n  port: 3000,\n  async fetch(req) {\n    const url = new URL(req.url);\n    if (url.pathname.startsWith(\"\u002Fsocket.io\u002F\")) {\n      return fetchNodeHandler(socketIoRequestListener, req);\n    }\n    return new Response(\"ok\");\n  },\n  websocket: fromNodeUpgradeHandler((req, socket, head) => {\n    io.engine.handleUpgrade(req, socket, head);\n  }),\n});\n\nawait server.ready();\n",[96,994,995,1007,1027,1039,1051,1065,1069,1075,1080,1085,1099,1120,1149,1153,1174,1189,1220,1224,1228,1241,1250,1264,1283,1303,1315,1321,1337,1342,1367,1377,1382,1387,1392],{"__ignoreMap":134},[138,996,997,999,1001,1003,1005],{"class":140,"line":141},[138,998,145],{"class":144},[138,1000,149],{"class":148},[138,1002,152],{"class":144},[138,1004,156],{"class":155},[138,1006,159],{"class":148},[138,1008,1009,1011,1014,1017,1020,1022,1025],{"class":140,"line":162},[138,1010,145],{"class":144},[138,1012,1013],{"class":148}," { Server ",[138,1015,1016],{"class":144},"as",[138,1018,1019],{"class":148}," SocketIOServer } ",[138,1021,152],{"class":144},[138,1023,1024],{"class":155}," \"socket.io\"",[138,1026,159],{"class":148},[138,1028,1029,1031,1033,1035,1037],{"class":140,"line":177},[138,1030,145],{"class":144},[138,1032,466],{"class":148},[138,1034,152],{"class":144},[138,1036,172],{"class":155},[138,1038,159],{"class":148},[138,1040,1041,1043,1045,1047,1049],{"class":140,"line":184},[138,1042,145],{"class":144},[138,1044,479],{"class":148},[138,1046,152],{"class":144},[138,1048,484],{"class":155},[138,1050,159],{"class":148},[138,1052,1053,1055,1058,1060,1063],{"class":140,"line":204},[138,1054,145],{"class":144},[138,1056,1057],{"class":148}," { fetchNodeHandler } ",[138,1059,152],{"class":144},[138,1061,1062],{"class":155}," \"srvx\u002Fnode\"",[138,1064,159],{"class":148},[138,1066,1067],{"class":140,"line":210},[138,1068,181],{"emptyLinePlaceholder":180},[138,1070,1071],{"class":140,"line":216},[138,1072,1074],{"class":1073},"sCsY4","\u002F\u002F Attach socket.io to a throwaway http.Server — it never `.listen()`s,\n",[138,1076,1077],{"class":140,"line":222},[138,1078,1079],{"class":1073},"\u002F\u002F but the dummy server now holds socket.io's own `request` listener,\n",[138,1081,1082],{"class":140,"line":228},[138,1083,1084],{"class":1073},"\u002F\u002F which handles the client bundle AND delegates polling to engine.io.\n",[138,1086,1087,1089,1092,1094,1096],{"class":140,"line":233},[138,1088,187],{"class":144},[138,1090,1091],{"class":190}," dummyServer",[138,1093,194],{"class":144},[138,1095,243],{"class":197},[138,1097,1098],{"class":148},"();\n",[138,1100,1101,1103,1106,1108,1110,1113,1116,1118],{"class":140,"line":268},[138,1102,187],{"class":144},[138,1104,1105],{"class":190}," io",[138,1107,194],{"class":144},[138,1109,502],{"class":144},[138,1111,1112],{"class":197}," SocketIOServer",[138,1114,1115],{"class":148},"(dummyServer, { serveClient: ",[138,1117,511],{"class":190},[138,1119,514],{"class":148},[138,1121,1122,1124,1127,1130,1133,1136,1139,1142,1144,1147],{"class":140,"line":280},[138,1123,187],{"class":144},[138,1125,1126],{"class":148}," [",[138,1128,1129],{"class":190},"socketIoRequestListener",[138,1131,1132],{"class":148},"] ",[138,1134,1135],{"class":144},"=",[138,1137,1138],{"class":148}," dummyServer.",[138,1140,1141],{"class":197},"listeners",[138,1143,304],{"class":148},[138,1145,1146],{"class":155},"\"request\"",[138,1148,310],{"class":148},[138,1150,1151],{"class":140,"line":289},[138,1152,181],{"emptyLinePlaceholder":180},[138,1154,1155,1158,1160,1162,1164,1166,1168,1170,1172],{"class":140,"line":295},[138,1156,1157],{"class":148},"io.",[138,1159,324],{"class":197},[138,1161,304],{"class":148},[138,1163,526],{"class":155},[138,1165,332],{"class":148},[138,1167,339],{"class":249},[138,1169,259],{"class":148},[138,1171,262],{"class":144},[138,1173,265],{"class":148},[138,1175,1176,1179,1181,1183,1186],{"class":140,"line":313},[138,1177,1178],{"class":148},"  socket.",[138,1180,654],{"class":197},[138,1182,304],{"class":148},[138,1184,1185],{"class":155},"\"welcome\"",[138,1187,1188],{"class":148},", { id: socket.id });\n",[138,1190,1191,1193,1195,1197,1199,1201,1204,1206,1208,1211,1213,1215,1217],{"class":140,"line":318},[138,1192,1178],{"class":148},[138,1194,324],{"class":197},[138,1196,304],{"class":148},[138,1198,548],{"class":155},[138,1200,332],{"class":148},[138,1202,1203],{"class":249},"text",[138,1205,259],{"class":148},[138,1207,262],{"class":144},[138,1209,1210],{"class":148}," io.",[138,1212,654],{"class":197},[138,1214,304],{"class":148},[138,1216,548],{"class":155},[138,1218,1219],{"class":148},", { from: socket.id, text }));\n",[138,1221,1222],{"class":140,"line":353},[138,1223,225],{"class":148},[138,1225,1226],{"class":140,"line":371},[138,1227,181],{"emptyLinePlaceholder":180},[138,1229,1230,1232,1234,1236,1239],{"class":140,"line":382},[138,1231,187],{"class":144},[138,1233,238],{"class":190},[138,1235,194],{"class":144},[138,1237,1238],{"class":197}," serve",[138,1240,201],{"class":148},[138,1242,1243,1246,1248],{"class":140,"line":388},[138,1244,1245],{"class":148},"  port: ",[138,1247,307],{"class":190},[138,1249,286],{"class":148},[138,1251,1252,1255,1258,1260,1262],{"class":140,"line":939},[138,1253,1254],{"class":144},"  async",[138,1256,1257],{"class":197}," fetch",[138,1259,304],{"class":148},[138,1261,250],{"class":249},[138,1263,368],{"class":148},[138,1265,1267,1270,1273,1275,1277,1280],{"class":140,"line":1266},22,[138,1268,1269],{"class":144},"    const",[138,1271,1272],{"class":190}," url",[138,1274,194],{"class":144},[138,1276,502],{"class":144},[138,1278,1279],{"class":197}," URL",[138,1281,1282],{"class":148},"(req.url);\n",[138,1284,1286,1289,1292,1295,1297,1300],{"class":140,"line":1285},23,[138,1287,1288],{"class":144},"    if",[138,1290,1291],{"class":148}," (url.pathname.",[138,1293,1294],{"class":197},"startsWith",[138,1296,304],{"class":148},[138,1298,1299],{"class":155},"\"\u002Fsocket.io\u002F\"",[138,1301,1302],{"class":148},")) {\n",[138,1304,1306,1309,1312],{"class":140,"line":1305},24,[138,1307,1308],{"class":144},"      return",[138,1310,1311],{"class":197}," fetchNodeHandler",[138,1313,1314],{"class":148},"(socketIoRequestListener, req);\n",[138,1316,1318],{"class":140,"line":1317},25,[138,1319,1320],{"class":148},"    }\n",[138,1322,1324,1327,1329,1331,1333,1335],{"class":140,"line":1323},26,[138,1325,1326],{"class":144},"    return",[138,1328,502],{"class":144},[138,1330,595],{"class":197},[138,1332,304],{"class":148},[138,1334,600],{"class":155},[138,1336,310],{"class":148},[138,1338,1340],{"class":140,"line":1339},27,[138,1341,219],{"class":148},[138,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361,1363,1365],{"class":140,"line":1344},28,[138,1346,608],{"class":148},[138,1348,439],{"class":197},[138,1350,246],{"class":148},[138,1352,250],{"class":249},[138,1354,253],{"class":148},[138,1356,339],{"class":249},[138,1358,253],{"class":148},[138,1360,344],{"class":249},[138,1362,259],{"class":148},[138,1364,262],{"class":144},[138,1366,265],{"class":148},[138,1368,1370,1373,1375],{"class":140,"line":1369},29,[138,1371,1372],{"class":148},"    io.engine.",[138,1374,118],{"class":197},[138,1376,379],{"class":148},[138,1378,1380],{"class":140,"line":1379},30,[138,1381,671],{"class":148},[138,1383,1385],{"class":140,"line":1384},31,[138,1386,225],{"class":148},[138,1388,1390],{"class":140,"line":1389},32,[138,1391,181],{"emptyLinePlaceholder":180},[138,1393,1395,1398,1401,1404],{"class":140,"line":1394},33,[138,1396,1397],{"class":144},"await",[138,1399,1400],{"class":148}," server.",[138,1402,1403],{"class":197},"ready",[138,1405,1098],{"class":148},[92,1407,1408,1409,1412,1413,1416],{},"If you only need the WebSocket transport, force the client to skip polling with ",[96,1410,1411],{},"io(url, { transports: [\"websocket\"] })"," and you can drop the ",[96,1414,1415],{},"fetch","-side delegation entirely.",[392,1418,1419],{},[92,1420,396,1421,1428],{},[121,1422,1425],{"href":1423,"rel":1424},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Ftree\u002Fmain\u002Fexamples\u002Fsocket.io",[125],[96,1426,1427],{},"examples\u002Fsocket.io"," for a runnable demo including a browser client.",[1430,1431,1432],"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 .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}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 .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":134,"searchDepth":162,"depth":162,"links":1434},[1435,1436,1437],{"id":416,"depth":162,"text":417},{"id":709,"depth":162,"text":710},{"id":962,"depth":162,"text":963},"Integrate crossws with Node.js (manually) or uWebSockets.js","md",{"icon":77},{"icon":77},{"title":74,"description":1438},"yKKZRZk8-1cnJu1SQ-tEaB205ZWPaFlyx7TcEOjS8D4",[1445,1447],{"title":69,"path":70,"stem":71,"description":1446,"icon":72,"children":-1},"Manually integrate crossws with Deno.",{"title":79,"path":80,"stem":81,"description":1448,"icon":82,"children":-1},"Integrate crossws with server-sent events and fetch-api.",1782852616980]