[{"data":1,"prerenderedAt":445},["ShallowReactive",2],{"navigation":3,"-adapters-deno":88,"-adapters-deno-surround":440},[4,51],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Guide","\u002Fguide","1.guide\u002F1.index",[9,11,16,21,26,31,36,41,46],{"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,"icon":50},"WebSocket Client","\u002Fguide\u002Fclient","1.guide\u002F9.client","tabler:plug-connected",{"title":52,"path":53,"stem":54,"children":55,"icon":57},"Adapters","\u002Fadapters","2.adapters\u002F1.index",[56,58,63,68,73,78,83],{"title":52,"path":53,"stem":54,"icon":57},"emojione-monotone:electric-plug",{"title":59,"path":60,"stem":61,"icon":62},"Bun","\u002Fadapters\u002Fbun","2.adapters\u002Fbun","simple-icons:bun",{"title":64,"path":65,"stem":66,"icon":67},"Bunny","\u002Fadapters\u002Fbunny","2.adapters\u002Fbunny","mdi:rabbit",{"title":69,"path":70,"stem":71,"icon":72},"Cloudflare","\u002Fadapters\u002Fcloudflare","2.adapters\u002Fcloudflare","devicon-plain:cloudflareworkers",{"title":74,"path":75,"stem":76,"icon":77},"Deno","\u002Fadapters\u002Fdeno","2.adapters\u002Fdeno","teenyicons:deno-solid",{"title":79,"path":80,"stem":81,"icon":82},"Node.js","\u002Fadapters\u002Fnode","2.adapters\u002Fnode","akar-icons:node-fill",{"title":84,"path":85,"stem":86,"icon":87},"SSE","\u002Fadapters\u002Fsse","2.adapters\u002Fsse","clarity:two-way-arrows-line",{"id":89,"title":74,"body":90,"description":434,"extension":435,"meta":436,"navigation":437,"path":75,"seo":438,"stem":76,"__hash__":439},"content\u002F2.adapters\u002Fdeno.md",{"type":91,"value":92,"toc":431,"icon":77},"minimark",[93,114,125,351,372,377,403,427],[94,95,96],"tip",{},[97,98,99,100,104,105,108,109,113],"p",{},"\nYou can use ",[101,102,103],"code",{},"serve"," function from ",[101,106,107],{},"crossws\u002Fserver"," to ",[110,111,112],"strong",{},"automatically"," integrate crossws with Deno!",[97,115,116,117,120,121,124],{},"To manually integrate crossws with your Deno server, you need to check for the ",[101,118,119],{},"upgrade"," header and then call ",[101,122,123],{},"handleUpgrade"," method from the adapter passing the incoming request object. The returned value is the server upgrade response.",[126,127,132],"pre",{"className":128,"code":129,"language":130,"meta":131,"style":131},"language-ts shiki shiki-themes github-light github-dark github-dark","import crossws from \"crossws\u002Fadapters\u002Fdeno\";\n\nconst ws = crossws({\n  hooks: {\n    message: console.log,\n  },\n});\n\nDeno.serve({ port: 3000 }, (request, info) => {\n  if (request.headers.get(\"upgrade\") === \"websocket\") {\n    return ws.handleUpgrade(request, info);\n  }\n  return new Response(\n    `\u003Cscript>new WebSocket(\"ws:\u002F\u002Flocalhost:3000\").addEventListener(\"open\", (e) => e.target.send(\"Hello from client!\"));\u003C\u002Fscript>`,\n    { headers: { \"content-type\": \"text\u002Fhtml\" } },\n  );\n});\n","ts","",[101,133,134,157,164,184,190,196,202,208,213,249,278,292,298,313,322,340,346],{"__ignoreMap":131},[135,136,139,143,147,150,154],"span",{"class":137,"line":138},"line",1,[135,140,142],{"class":141},"so5gQ","import",[135,144,146],{"class":145},"slsVL"," crossws ",[135,148,149],{"class":141},"from",[135,151,153],{"class":152},"sfrk1"," \"crossws\u002Fadapters\u002Fdeno\"",[135,155,156],{"class":145},";\n",[135,158,160],{"class":137,"line":159},2,[135,161,163],{"emptyLinePlaceholder":162},true,"\n",[135,165,167,170,174,177,181],{"class":137,"line":166},3,[135,168,169],{"class":141},"const",[135,171,173],{"class":172},"suiK_"," ws",[135,175,176],{"class":141}," =",[135,178,180],{"class":179},"shcOC"," crossws",[135,182,183],{"class":145},"({\n",[135,185,187],{"class":137,"line":186},4,[135,188,189],{"class":145},"  hooks: {\n",[135,191,193],{"class":137,"line":192},5,[135,194,195],{"class":145},"    message: console.log,\n",[135,197,199],{"class":137,"line":198},6,[135,200,201],{"class":145},"  },\n",[135,203,205],{"class":137,"line":204},7,[135,206,207],{"class":145},"});\n",[135,209,211],{"class":137,"line":210},8,[135,212,163],{"emptyLinePlaceholder":162},[135,214,216,219,221,224,227,230,234,237,240,243,246],{"class":137,"line":215},9,[135,217,218],{"class":145},"Deno.",[135,220,103],{"class":179},[135,222,223],{"class":145},"({ port: ",[135,225,226],{"class":172},"3000",[135,228,229],{"class":145}," }, (",[135,231,233],{"class":232},"sQHwn","request",[135,235,236],{"class":145},", ",[135,238,239],{"class":232},"info",[135,241,242],{"class":145},") ",[135,244,245],{"class":141},"=>",[135,247,248],{"class":145}," {\n",[135,250,252,255,258,261,264,267,269,272,275],{"class":137,"line":251},10,[135,253,254],{"class":141},"  if",[135,256,257],{"class":145}," (request.headers.",[135,259,260],{"class":179},"get",[135,262,263],{"class":145},"(",[135,265,266],{"class":152},"\"upgrade\"",[135,268,242],{"class":145},[135,270,271],{"class":141},"===",[135,273,274],{"class":152}," \"websocket\"",[135,276,277],{"class":145},") {\n",[135,279,281,284,287,289],{"class":137,"line":280},11,[135,282,283],{"class":141},"    return",[135,285,286],{"class":145}," ws.",[135,288,123],{"class":179},[135,290,291],{"class":145},"(request, info);\n",[135,293,295],{"class":137,"line":294},12,[135,296,297],{"class":145},"  }\n",[135,299,301,304,307,310],{"class":137,"line":300},13,[135,302,303],{"class":141},"  return",[135,305,306],{"class":141}," new",[135,308,309],{"class":179}," Response",[135,311,312],{"class":145},"(\n",[135,314,316,319],{"class":137,"line":315},14,[135,317,318],{"class":152},"    `\u003Cscript>new WebSocket(\"ws:\u002F\u002Flocalhost:3000\").addEventListener(\"open\", (e) => e.target.send(\"Hello from client!\"));\u003C\u002Fscript>`",[135,320,321],{"class":145},",\n",[135,323,325,328,331,334,337],{"class":137,"line":324},15,[135,326,327],{"class":145},"    { headers: { ",[135,329,330],{"class":152},"\"content-type\"",[135,332,333],{"class":145},": ",[135,335,336],{"class":152},"\"text\u002Fhtml\"",[135,338,339],{"class":145}," } },\n",[135,341,343],{"class":137,"line":342},16,[135,344,345],{"class":145},"  );\n",[135,347,349],{"class":137,"line":348},17,[135,350,207],{"class":145},[352,353,354],"read-more",{},[97,355,356,357,364,365,371],{},"See ",[358,359,361],"a",{"href":360},".\u002Ftest\u002Ffixture\u002Fdeno.ts",[101,362,363],{},"test\u002Ffixture\u002Fdeno.ts"," for demo and ",[358,366,368],{"href":367},".\u002Fsrc\u002Fadapters\u002Fdeno.ts",[101,369,370],{},"src\u002Fadapters\u002Fdeno.ts"," for implementation.",[373,374,376],"h2",{"id":375},"idle-timeout","Idle timeout",[97,378,379,380,386,387,390,391,394,395,398,399,402],{},"The shared ",[358,381,383],{"href":382},"\u002Fadapters#idletimeout",[101,384,385],{},"idleTimeout"," option (in ",[110,388,389],{},"seconds",") closes connections that die silently (half-open sockets). It maps to Deno's native ",[101,392,393],{},"Deno.upgradeWebSocket"," idle timeout, which auto-sends keepalive pings. Defaults to ",[101,396,397],{},"30","; pass ",[101,400,401],{},"0"," to disable.",[126,404,406],{"className":128,"code":405,"language":130,"meta":131,"style":131},"const ws = crossws({ idleTimeout: 60, hooks: { message: console.log } });\n",[101,407,408],{"__ignoreMap":131},[135,409,410,412,414,416,418,421,424],{"class":137,"line":138},[135,411,169],{"class":141},[135,413,173],{"class":172},[135,415,176],{"class":141},[135,417,180],{"class":179},[135,419,420],{"class":145},"({ idleTimeout: ",[135,422,423],{"class":172},"60",[135,425,426],{"class":145},", hooks: { message: console.log } });\n",[428,429,430],"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);}",{"title":131,"searchDepth":159,"depth":159,"links":432},[433],{"id":375,"depth":159,"text":376},"Manually integrate crossws with Deno.","md",{"icon":77},{"icon":77},{"title":74,"description":434},"Fy38jx10njnEvnIqc2jLWu3TnmdoRBS9O5wZrH7QuJU",[441,443],{"title":69,"path":70,"stem":71,"description":442,"icon":72,"children":-1},"Integrate crossws with Cloudflare Workers and Durable Objects.",{"title":79,"path":80,"stem":81,"description":444,"icon":82,"children":-1},"Integrate crossws with Node.js (manually) or uWebSockets.js",1783073588851]