[{"data":1,"prerenderedAt":988},["ShallowReactive",2],{"navigation":3,"-adapters-bunny":78,"-adapters-bunny-surround":983},[4,41],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Guide","\u002Fguide","1.guide\u002F1.index",[9,11,16,21,26,31,36],{"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},"Resolver API","\u002Fguide\u002Fresolver","1.guide\u002F6.resolver","tabler:route",{"title":37,"path":38,"stem":39,"icon":40},"WebSocket Proxy","\u002Fguide\u002Fproxy","1.guide\u002F7.proxy","tabler:arrows-exchange",{"title":42,"path":43,"stem":44,"children":45,"icon":47},"Adapters","\u002Fadapters","2.adapters\u002F1.index",[46,48,53,58,63,68,73],{"title":42,"path":43,"stem":44,"icon":47},"emojione-monotone:electric-plug",{"title":49,"path":50,"stem":51,"icon":52},"Bun","\u002Fadapters\u002Fbun","2.adapters\u002Fbun","simple-icons:bun",{"title":54,"path":55,"stem":56,"icon":57},"Bunny","\u002Fadapters\u002Fbunny","2.adapters\u002Fbunny","mdi:rabbit",{"title":59,"path":60,"stem":61,"icon":62},"Cloudflare","\u002Fadapters\u002Fcloudflare","2.adapters\u002Fcloudflare","devicon-plain:cloudflareworkers",{"title":64,"path":65,"stem":66,"icon":67},"Deno","\u002Fadapters\u002Fdeno","2.adapters\u002Fdeno","teenyicons:deno-solid",{"title":69,"path":70,"stem":71,"icon":72},"Node.js","\u002Fadapters\u002Fnode","2.adapters\u002Fnode","akar-icons:node-fill",{"title":74,"path":75,"stem":76,"icon":77},"SSE","\u002Fadapters\u002Fsse","2.adapters\u002Fsse","clarity:two-way-arrows-line",{"id":79,"title":54,"body":80,"description":977,"extension":978,"meta":979,"navigation":980,"path":55,"seo":981,"stem":56,"__hash__":982},"content\u002F2.adapters\u002Fbunny.md",{"type":81,"value":82,"toc":969,"icon":57},"minimark",[83,104,114,119,130,528,532,542,832,836,839,845,848,860,890,896,902,905,936,947,959,965],[84,85,86],"tip",{},[87,88,89,90,94,95,98,99,103],"p",{},"\nYou can use ",[91,92,93],"code",{},"serve"," function from ",[91,96,97],{},"crossws\u002Fserver\u002Fbunny"," to ",[100,101,102],"strong",{},"automatically"," integrate crossws with Bunny.net!",[87,105,106,113],{},[107,108,112],"a",{"href":109,"rel":110},"https:\u002F\u002Fdocs.bunny.net\u002Fscripting\u002Fwebsockets",[111],"nofollow","Bunny.net Edge Scripting"," supports WebSockets to deliver low-latency, bidirectional communication between your applications and users across the globe.",[115,116,118],"h2",{"id":117},"usage","Usage",[87,120,121,122,125,126,129],{},"To integrate crossws with Bunny.net Edge Scripting, you need to check for the ",[91,123,124],{},"upgrade"," header and then call ",[91,127,128],{},"handleUpgrade"," method from the adapter passing the incoming request object. The returned value is the server upgrade response.",[131,132,137],"pre",{"className":133,"code":134,"language":135,"meta":136,"style":136},"language-ts shiki shiki-themes github-light github-dark github-dark","import * as BunnySDK from \"@bunny.net\u002Fedgescript-sdk\";\nimport crossws from \"crossws\u002Fadapters\u002Fbunny\";\n\nconst ws = crossws({\n  hooks: {\n    message: (peer, message) => {\n      console.log(\"Received:\", message.text());\n      peer.send(`Echo: ${message.text()}`);\n    },\n    open: (peer) => {\n      console.log(\"Client connected\");\n    },\n    close: (peer) => {\n      console.log(\"Client disconnected\");\n    },\n  },\n});\n\nBunnySDK.net.http.serve(async (request: Request) => {\n  if (request.headers.get(\"upgrade\") === \"websocket\") {\n    return ws.handleUpgrade(request);\n  }\n\n  return new Response(\n    `\u003Cscript>new WebSocket(\"wss:\u002F\u002Fyour-domain.b-cdn.net\").addEventListener(\"open\", (e) => e.target.send(\"Hello from client!\"));\u003C\u002Fscript>`,\n    { headers: { \"content-type\": \"text\u002Fhtml\" } },\n  );\n});\n","ts","",[91,138,139,169,184,191,210,216,244,268,298,304,320,334,339,355,369,374,380,386,391,422,450,464,470,475,490,499,517,523],{"__ignoreMap":136},[140,141,144,148,152,155,159,162,166],"span",{"class":142,"line":143},"line",1,[140,145,147],{"class":146},"so5gQ","import",[140,149,151],{"class":150},"suiK_"," *",[140,153,154],{"class":146}," as",[140,156,158],{"class":157},"slsVL"," BunnySDK ",[140,160,161],{"class":146},"from",[140,163,165],{"class":164},"sfrk1"," \"@bunny.net\u002Fedgescript-sdk\"",[140,167,168],{"class":157},";\n",[140,170,172,174,177,179,182],{"class":142,"line":171},2,[140,173,147],{"class":146},[140,175,176],{"class":157}," crossws ",[140,178,161],{"class":146},[140,180,181],{"class":164}," \"crossws\u002Fadapters\u002Fbunny\"",[140,183,168],{"class":157},[140,185,187],{"class":142,"line":186},3,[140,188,190],{"emptyLinePlaceholder":189},true,"\n",[140,192,194,197,200,203,207],{"class":142,"line":193},4,[140,195,196],{"class":146},"const",[140,198,199],{"class":150}," ws",[140,201,202],{"class":146}," =",[140,204,206],{"class":205},"shcOC"," crossws",[140,208,209],{"class":157},"({\n",[140,211,213],{"class":142,"line":212},5,[140,214,215],{"class":157},"  hooks: {\n",[140,217,219,222,225,229,232,235,238,241],{"class":142,"line":218},6,[140,220,221],{"class":205},"    message",[140,223,224],{"class":157},": (",[140,226,228],{"class":227},"sQHwn","peer",[140,230,231],{"class":157},", ",[140,233,234],{"class":227},"message",[140,236,237],{"class":157},") ",[140,239,240],{"class":146},"=>",[140,242,243],{"class":157}," {\n",[140,245,247,250,253,256,259,262,265],{"class":142,"line":246},7,[140,248,249],{"class":157},"      console.",[140,251,252],{"class":205},"log",[140,254,255],{"class":157},"(",[140,257,258],{"class":164},"\"Received:\"",[140,260,261],{"class":157},", message.",[140,263,264],{"class":205},"text",[140,266,267],{"class":157},"());\n",[140,269,271,274,277,279,282,284,287,289,292,295],{"class":142,"line":270},8,[140,272,273],{"class":157},"      peer.",[140,275,276],{"class":205},"send",[140,278,255],{"class":157},[140,280,281],{"class":164},"`Echo: ${",[140,283,234],{"class":157},[140,285,286],{"class":164},".",[140,288,264],{"class":205},[140,290,291],{"class":164},"()",[140,293,294],{"class":164},"}`",[140,296,297],{"class":157},");\n",[140,299,301],{"class":142,"line":300},9,[140,302,303],{"class":157},"    },\n",[140,305,307,310,312,314,316,318],{"class":142,"line":306},10,[140,308,309],{"class":205},"    open",[140,311,224],{"class":157},[140,313,228],{"class":227},[140,315,237],{"class":157},[140,317,240],{"class":146},[140,319,243],{"class":157},[140,321,323,325,327,329,332],{"class":142,"line":322},11,[140,324,249],{"class":157},[140,326,252],{"class":205},[140,328,255],{"class":157},[140,330,331],{"class":164},"\"Client connected\"",[140,333,297],{"class":157},[140,335,337],{"class":142,"line":336},12,[140,338,303],{"class":157},[140,340,342,345,347,349,351,353],{"class":142,"line":341},13,[140,343,344],{"class":205},"    close",[140,346,224],{"class":157},[140,348,228],{"class":227},[140,350,237],{"class":157},[140,352,240],{"class":146},[140,354,243],{"class":157},[140,356,358,360,362,364,367],{"class":142,"line":357},14,[140,359,249],{"class":157},[140,361,252],{"class":205},[140,363,255],{"class":157},[140,365,366],{"class":164},"\"Client disconnected\"",[140,368,297],{"class":157},[140,370,372],{"class":142,"line":371},15,[140,373,303],{"class":157},[140,375,377],{"class":142,"line":376},16,[140,378,379],{"class":157},"  },\n",[140,381,383],{"class":142,"line":382},17,[140,384,385],{"class":157},"});\n",[140,387,389],{"class":142,"line":388},18,[140,390,190],{"emptyLinePlaceholder":189},[140,392,394,397,399,401,404,407,410,413,416,418,420],{"class":142,"line":393},19,[140,395,396],{"class":157},"BunnySDK.net.http.",[140,398,93],{"class":205},[140,400,255],{"class":157},[140,402,403],{"class":146},"async",[140,405,406],{"class":157}," (",[140,408,409],{"class":227},"request",[140,411,412],{"class":146},":",[140,414,415],{"class":205}," Request",[140,417,237],{"class":157},[140,419,240],{"class":146},[140,421,243],{"class":157},[140,423,425,428,431,434,436,439,441,444,447],{"class":142,"line":424},20,[140,426,427],{"class":146},"  if",[140,429,430],{"class":157}," (request.headers.",[140,432,433],{"class":205},"get",[140,435,255],{"class":157},[140,437,438],{"class":164},"\"upgrade\"",[140,440,237],{"class":157},[140,442,443],{"class":146},"===",[140,445,446],{"class":164}," \"websocket\"",[140,448,449],{"class":157},") {\n",[140,451,453,456,459,461],{"class":142,"line":452},21,[140,454,455],{"class":146},"    return",[140,457,458],{"class":157}," ws.",[140,460,128],{"class":205},[140,462,463],{"class":157},"(request);\n",[140,465,467],{"class":142,"line":466},22,[140,468,469],{"class":157},"  }\n",[140,471,473],{"class":142,"line":472},23,[140,474,190],{"emptyLinePlaceholder":189},[140,476,478,481,484,487],{"class":142,"line":477},24,[140,479,480],{"class":146},"  return",[140,482,483],{"class":146}," new",[140,485,486],{"class":205}," Response",[140,488,489],{"class":157},"(\n",[140,491,493,496],{"class":142,"line":492},25,[140,494,495],{"class":164},"    `\u003Cscript>new WebSocket(\"wss:\u002F\u002Fyour-domain.b-cdn.net\").addEventListener(\"open\", (e) => e.target.send(\"Hello from client!\"));\u003C\u002Fscript>`",[140,497,498],{"class":157},",\n",[140,500,502,505,508,511,514],{"class":142,"line":501},26,[140,503,504],{"class":157},"    { headers: { ",[140,506,507],{"class":164},"\"content-type\"",[140,509,510],{"class":157},": ",[140,512,513],{"class":164},"\"text\u002Fhtml\"",[140,515,516],{"class":157}," } },\n",[140,518,520],{"class":142,"line":519},27,[140,521,522],{"class":157},"  );\n",[140,524,526],{"class":142,"line":525},28,[140,527,385],{"class":157},[115,529,531],{"id":530},"protocol-negotiation","Protocol Negotiation",[87,533,534,535,537,538,541],{},"You can control WebSocket protocol negotiation through the ",[91,536,124],{}," hook by setting the ",[91,539,540],{},"sec-websocket-protocol"," header. This is useful for implementing authorization or selecting specific subprotocols based on the request:",[131,543,545],{"className":133,"code":544,"language":135,"meta":136,"style":136},"const ws = crossws({\n  hooks: {\n    upgrade(req) {\n      \u002F\u002F Check for authorization token\n      const token = req.headers.get(\"authorization\");\n      if (!token) {\n        return new Response(\"Unauthorized\", { status: 401 });\n      }\n\n      \u002F\u002F Negotiate protocol based on client request\n      const requestedProtocol = req.headers.get(\"sec-websocket-protocol\");\n      const supportedProtocols = [\"graphql-ws\", \"graphql-transport-ws\"];\n\n      const protocol = requestedProtocol\n        ?.split(\",\")\n        .map((p) => p.trim())\n        .find((p) => supportedProtocols.includes(p));\n\n      return {\n        headers: {\n          \"sec-websocket-protocol\": protocol || \"\",\n        },\n      };\n    },\n  },\n});\n",[91,546,547,559,563,575,581,603,616,639,644,648,653,673,696,700,712,728,754,778,782,789,794,810,815,820,824,828],{"__ignoreMap":136},[140,548,549,551,553,555,557],{"class":142,"line":143},[140,550,196],{"class":146},[140,552,199],{"class":150},[140,554,202],{"class":146},[140,556,206],{"class":205},[140,558,209],{"class":157},[140,560,561],{"class":142,"line":171},[140,562,215],{"class":157},[140,564,565,568,570,573],{"class":142,"line":186},[140,566,567],{"class":205},"    upgrade",[140,569,255],{"class":157},[140,571,572],{"class":227},"req",[140,574,449],{"class":157},[140,576,577],{"class":142,"line":193},[140,578,580],{"class":579},"sCsY4","      \u002F\u002F Check for authorization token\n",[140,582,583,586,589,591,594,596,598,601],{"class":142,"line":212},[140,584,585],{"class":146},"      const",[140,587,588],{"class":150}," token",[140,590,202],{"class":146},[140,592,593],{"class":157}," req.headers.",[140,595,433],{"class":205},[140,597,255],{"class":157},[140,599,600],{"class":164},"\"authorization\"",[140,602,297],{"class":157},[140,604,605,608,610,613],{"class":142,"line":218},[140,606,607],{"class":146},"      if",[140,609,406],{"class":157},[140,611,612],{"class":146},"!",[140,614,615],{"class":157},"token) {\n",[140,617,618,621,623,625,627,630,633,636],{"class":142,"line":246},[140,619,620],{"class":146},"        return",[140,622,483],{"class":146},[140,624,486],{"class":205},[140,626,255],{"class":157},[140,628,629],{"class":164},"\"Unauthorized\"",[140,631,632],{"class":157},", { status: ",[140,634,635],{"class":150},"401",[140,637,638],{"class":157}," });\n",[140,640,641],{"class":142,"line":270},[140,642,643],{"class":157},"      }\n",[140,645,646],{"class":142,"line":300},[140,647,190],{"emptyLinePlaceholder":189},[140,649,650],{"class":142,"line":306},[140,651,652],{"class":579},"      \u002F\u002F Negotiate protocol based on client request\n",[140,654,655,657,660,662,664,666,668,671],{"class":142,"line":322},[140,656,585],{"class":146},[140,658,659],{"class":150}," requestedProtocol",[140,661,202],{"class":146},[140,663,593],{"class":157},[140,665,433],{"class":205},[140,667,255],{"class":157},[140,669,670],{"class":164},"\"sec-websocket-protocol\"",[140,672,297],{"class":157},[140,674,675,677,680,682,685,688,690,693],{"class":142,"line":336},[140,676,585],{"class":146},[140,678,679],{"class":150}," supportedProtocols",[140,681,202],{"class":146},[140,683,684],{"class":157}," [",[140,686,687],{"class":164},"\"graphql-ws\"",[140,689,231],{"class":157},[140,691,692],{"class":164},"\"graphql-transport-ws\"",[140,694,695],{"class":157},"];\n",[140,697,698],{"class":142,"line":341},[140,699,190],{"emptyLinePlaceholder":189},[140,701,702,704,707,709],{"class":142,"line":357},[140,703,585],{"class":146},[140,705,706],{"class":150}," protocol",[140,708,202],{"class":146},[140,710,711],{"class":157}," requestedProtocol\n",[140,713,714,717,720,722,725],{"class":142,"line":371},[140,715,716],{"class":157},"        ?.",[140,718,719],{"class":205},"split",[140,721,255],{"class":157},[140,723,724],{"class":164},"\",\"",[140,726,727],{"class":157},")\n",[140,729,730,733,736,739,741,743,745,748,751],{"class":142,"line":376},[140,731,732],{"class":157},"        .",[140,734,735],{"class":205},"map",[140,737,738],{"class":157},"((",[140,740,87],{"class":227},[140,742,237],{"class":157},[140,744,240],{"class":146},[140,746,747],{"class":157}," p.",[140,749,750],{"class":205},"trim",[140,752,753],{"class":157},"())\n",[140,755,756,758,761,763,765,767,769,772,775],{"class":142,"line":382},[140,757,732],{"class":157},[140,759,760],{"class":205},"find",[140,762,738],{"class":157},[140,764,87],{"class":227},[140,766,237],{"class":157},[140,768,240],{"class":146},[140,770,771],{"class":157}," supportedProtocols.",[140,773,774],{"class":205},"includes",[140,776,777],{"class":157},"(p));\n",[140,779,780],{"class":142,"line":388},[140,781,190],{"emptyLinePlaceholder":189},[140,783,784,787],{"class":142,"line":393},[140,785,786],{"class":146},"      return",[140,788,243],{"class":157},[140,790,791],{"class":142,"line":424},[140,792,793],{"class":157},"        headers: {\n",[140,795,796,799,802,805,808],{"class":142,"line":452},[140,797,798],{"class":164},"          \"sec-websocket-protocol\"",[140,800,801],{"class":157},": protocol ",[140,803,804],{"class":146},"||",[140,806,807],{"class":164}," \"\"",[140,809,498],{"class":157},[140,811,812],{"class":142,"line":466},[140,813,814],{"class":157},"        },\n",[140,816,817],{"class":142,"line":472},[140,818,819],{"class":157},"      };\n",[140,821,822],{"class":142,"line":477},[140,823,303],{"class":157},[140,825,826],{"class":142,"line":492},[140,827,379],{"class":157},[140,829,830],{"class":142,"line":501},[140,831,385],{"class":157},[115,833,835],{"id":834},"options","Options",[87,837,838],{},"The Bunny adapter supports the following options:",[840,841,843],"h3",{"id":842},"protocol",[91,844,842],{},[87,846,847],{},"The WebSocket subprotocol to use for the connection.",[849,850,851],"note",{},[87,852,853,854,856,857,859],{},"\nThis can be overridden by setting the ",[91,855,540],{}," header in the ",[91,858,124],{}," hook for dynamic protocol negotiation.",[131,861,863],{"className":133,"code":862,"language":135,"meta":136,"style":136},"const ws = crossws({\n  protocol: \"graphql-ws\",\n});\n",[91,864,865,877,886],{"__ignoreMap":136},[140,866,867,869,871,873,875],{"class":142,"line":143},[140,868,196],{"class":146},[140,870,199],{"class":150},[140,872,202],{"class":146},[140,874,206],{"class":205},[140,876,209],{"class":157},[140,878,879,882,884],{"class":142,"line":171},[140,880,881],{"class":157},"  protocol: ",[140,883,687],{"class":164},[140,885,498],{"class":157},[140,887,888],{"class":142,"line":186},[140,889,385],{"class":157},[840,891,893],{"id":892},"idletimeout",[91,894,895],{},"idleTimeout",[87,897,898,899,286],{},"The number of seconds to wait for a pong response before closing the connection. Defaults to ",[91,900,901],{},"30",[87,903,904],{},"If the client does not respond within this timeout, the connection is deemed unhealthy and closed. If no data is transmitted from the client for 2 minutes, the connection will be closed regardless of this configuration.",[131,906,908],{"className":133,"code":907,"language":135,"meta":136,"style":136},"const ws = crossws({\n  idleTimeout: 60,\n});\n",[91,909,910,922,932],{"__ignoreMap":136},[140,911,912,914,916,918,920],{"class":142,"line":143},[140,913,196],{"class":146},[140,915,199],{"class":150},[140,917,202],{"class":146},[140,919,206],{"class":205},[140,921,209],{"class":157},[140,923,924,927,930],{"class":142,"line":171},[140,925,926],{"class":157},"  idleTimeout: ",[140,928,929],{"class":150},"60",[140,931,498],{"class":157},[140,933,934],{"class":142,"line":186},[140,935,385],{"class":157},[937,938,939],"read-more",{},[87,940,941,942,946],{},"See ",[107,943,945],{"href":109,"rel":944},[111],"Bunny.net WebSocket Documentation"," for more details on the WebSocket API.",[937,948,949],{},[87,950,941,951,958],{},[107,952,955],{"href":953,"rel":954},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Fsrc\u002Fadapters\u002Fbunny.ts",[111],[91,956,957],{},"src\u002Fadapters\u002Fbunny.ts"," for implementation.",[131,960,963],{"className":961,"code":136,"language":264},[962],"language-text",[91,964,136],{"__ignoreMap":136},[966,967,968],"style",{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}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 .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":136,"searchDepth":171,"depth":171,"links":970},[971,972,973],{"id":117,"depth":171,"text":118},{"id":530,"depth":171,"text":531},{"id":834,"depth":171,"text":835,"children":974},[975,976],{"id":842,"depth":186,"text":842},{"id":892,"depth":186,"text":895},"Manually integrate crossws with Bunny.net Edge Scripting.","md",{"icon":57},{"icon":57},{"title":54,"description":977},"-UEzj4VSGNYya1LF5uQNbHgG6LC7_gbvZ1XOX9kVb3c",[984,986],{"title":49,"path":50,"stem":51,"description":985,"icon":52,"children":-1},"Manually integrate crossws with Bun.",{"title":59,"path":60,"stem":61,"description":987,"icon":62,"children":-1},"Integrate crossws with Cloudflare Workers and Durable Objects.",1775860078158]