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