[{"data":1,"prerenderedAt":466},["ShallowReactive",2],{"navigation":3,"-adapters-bun":88,"-adapters-bun-surround":462},[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":59,"body":90,"description":456,"extension":457,"meta":458,"navigation":459,"path":60,"seo":460,"stem":61,"__hash__":461},"content\u002F2.adapters\u002Fbun.md",{"type":91,"value":92,"toc":453,"icon":62},"minimark",[93,114,133,376,398,403,425,449],[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 Bun!",[97,115,116,117,120,121,124,125,132],{},"To manually integrate crossws with your Bun server, you need to handle upgrade with ",[101,118,119],{},"handleUpgrade"," util and also pass the ",[101,122,123],{},"websocket"," object returned from the adapter to server options. crossws leverages native bun ",[126,127,131],"a",{"href":128,"rel":129},"https:\u002F\u002Fbun.sh\u002Fdocs\u002Fapi\u002Fwebsockets",[130],"nofollow","WebSocket API",".",[134,135,140],"pre",{"className":136,"code":137,"language":138,"meta":139,"style":139},"language-ts shiki shiki-themes github-light github-dark github-dark","import crossws from \"crossws\u002Fadapters\u002Fbun\";\n\nconst ws = crossws({\n  hooks: {\n    message: console.log,\n  },\n});\n\nBun.serve({\n  port: 3000,\n  websocket: ws.websocket,\n  fetch(request, server) {\n    if (request.headers.get(\"upgrade\") === \"websocket\") {\n      return ws.handleUpgrade(request, server);\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});\n","ts","",[101,141,142,165,172,192,198,204,210,216,221,231,243,249,271,299,313,319,334,342,360,366,371],{"__ignoreMap":139},[143,144,147,151,155,158,162],"span",{"class":145,"line":146},"line",1,[143,148,150],{"class":149},"so5gQ","import",[143,152,154],{"class":153},"slsVL"," crossws ",[143,156,157],{"class":149},"from",[143,159,161],{"class":160},"sfrk1"," \"crossws\u002Fadapters\u002Fbun\"",[143,163,164],{"class":153},";\n",[143,166,168],{"class":145,"line":167},2,[143,169,171],{"emptyLinePlaceholder":170},true,"\n",[143,173,175,178,182,185,189],{"class":145,"line":174},3,[143,176,177],{"class":149},"const",[143,179,181],{"class":180},"suiK_"," ws",[143,183,184],{"class":149}," =",[143,186,188],{"class":187},"shcOC"," crossws",[143,190,191],{"class":153},"({\n",[143,193,195],{"class":145,"line":194},4,[143,196,197],{"class":153},"  hooks: {\n",[143,199,201],{"class":145,"line":200},5,[143,202,203],{"class":153},"    message: console.log,\n",[143,205,207],{"class":145,"line":206},6,[143,208,209],{"class":153},"  },\n",[143,211,213],{"class":145,"line":212},7,[143,214,215],{"class":153},"});\n",[143,217,219],{"class":145,"line":218},8,[143,220,171],{"emptyLinePlaceholder":170},[143,222,224,227,229],{"class":145,"line":223},9,[143,225,226],{"class":153},"Bun.",[143,228,103],{"class":187},[143,230,191],{"class":153},[143,232,234,237,240],{"class":145,"line":233},10,[143,235,236],{"class":153},"  port: ",[143,238,239],{"class":180},"3000",[143,241,242],{"class":153},",\n",[143,244,246],{"class":145,"line":245},11,[143,247,248],{"class":153},"  websocket: ws.websocket,\n",[143,250,252,255,258,262,265,268],{"class":145,"line":251},12,[143,253,254],{"class":187},"  fetch",[143,256,257],{"class":153},"(",[143,259,261],{"class":260},"sQHwn","request",[143,263,264],{"class":153},", ",[143,266,267],{"class":260},"server",[143,269,270],{"class":153},") {\n",[143,272,274,277,280,283,285,288,291,294,297],{"class":145,"line":273},13,[143,275,276],{"class":149},"    if",[143,278,279],{"class":153}," (request.headers.",[143,281,282],{"class":187},"get",[143,284,257],{"class":153},[143,286,287],{"class":160},"\"upgrade\"",[143,289,290],{"class":153},") ",[143,292,293],{"class":149},"===",[143,295,296],{"class":160}," \"websocket\"",[143,298,270],{"class":153},[143,300,302,305,308,310],{"class":145,"line":301},14,[143,303,304],{"class":149},"      return",[143,306,307],{"class":153}," ws.",[143,309,119],{"class":187},[143,311,312],{"class":153},"(request, server);\n",[143,314,316],{"class":145,"line":315},15,[143,317,318],{"class":153},"    }\n",[143,320,322,325,328,331],{"class":145,"line":321},16,[143,323,324],{"class":149},"    return",[143,326,327],{"class":149}," new",[143,329,330],{"class":187}," Response",[143,332,333],{"class":153},"(\n",[143,335,337,340],{"class":145,"line":336},17,[143,338,339],{"class":160},"      `\u003Cscript>new WebSocket(\"ws:\u002F\u002Flocalhost:3000\").addEventListener('open', (e) => e.target.send(\"Hello from client!\"));\u003C\u002Fscript>`",[143,341,242],{"class":153},[143,343,345,348,351,354,357],{"class":145,"line":344},18,[143,346,347],{"class":153},"      { headers: { ",[143,349,350],{"class":160},"\"content-type\"",[143,352,353],{"class":153},": ",[143,355,356],{"class":160},"\"text\u002Fhtml\"",[143,358,359],{"class":153}," } },\n",[143,361,363],{"class":145,"line":362},19,[143,364,365],{"class":153},"    );\n",[143,367,369],{"class":145,"line":368},20,[143,370,209],{"class":153},[143,372,374],{"class":145,"line":373},21,[143,375,215],{"class":153},[377,378,379],"read-more",{},[97,380,381,382,389,390,397],{},"See ",[126,383,386],{"href":384,"rel":385},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Ftest\u002Ffixture\u002Fbun.ts",[130],[101,387,388],{},"test\u002Ffixture\u002Fbun.ts"," for demo and ",[126,391,394],{"href":392,"rel":393},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Fsrc\u002Fadapters\u002Fbun.ts",[130],[101,395,396],{},"src\u002Fadapters\u002Fbun.ts"," for implementation.",[399,400,402],"h2",{"id":401},"idle-timeout","Idle timeout",[97,404,405,406,412,413,416,417,420,421,424],{},"The shared ",[126,407,409],{"href":408},"\u002Fadapters#idletimeout",[101,410,411],{},"idleTimeout"," option (in ",[110,414,415],{},"seconds",") closes connections that die silently (half-open sockets). It maps to Bun's native WebSocket idle timeout, which auto-sends keepalive pings. Defaults to ",[101,418,419],{},"30","; pass ",[101,422,423],{},"0"," to disable.",[134,426,428],{"className":136,"code":427,"language":138,"meta":139,"style":139},"const ws = crossws({ idleTimeout: 60, hooks: { message: console.log } });\n",[101,429,430],{"__ignoreMap":139},[143,431,432,434,436,438,440,443,446],{"class":145,"line":146},[143,433,177],{"class":149},[143,435,181],{"class":180},[143,437,184],{"class":149},[143,439,188],{"class":187},[143,441,442],{"class":153},"({ idleTimeout: ",[143,444,445],{"class":180},"60",[143,447,448],{"class":153},", hooks: { message: console.log } });\n",[450,451,452],"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":139,"searchDepth":167,"depth":167,"links":454},[455],{"id":401,"depth":167,"text":402},"Manually integrate crossws with Bun.","md",{"icon":62},{"icon":62},{"title":59,"description":456},"GNZYss4smKZUdPZAWKOaob9oFi4sd3EBTTxUi4yJiOA",[463,464],{"title":52,"path":53,"stem":54,"description":139,"icon":57,"children":-1},{"title":64,"path":65,"stem":66,"description":465,"icon":67,"children":-1},"Manually integrate crossws with Bunny.net Edge Scripting.",1783073588850]