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