[{"data":1,"prerenderedAt":1104},["ShallowReactive",2],{"navigation":3,"-adapters-cloudflare":88,"-adapters-cloudflare-surround":1099},[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":69,"body":90,"description":1093,"extension":1094,"meta":1095,"navigation":1096,"path":70,"seo":1097,"stem":71,"__hash__":1098},"content\u002F2.adapters\u002Fcloudflare.md",{"type":91,"value":92,"toc":1089,"icon":72},"minimark",[93,120,131,730,737,806,828,833,853,907,911,930,965,1032,1035,1085],[94,95,96,97,104,105,108,109,114,115,119],"p",{},"To integrate crossws with Cloudflare ",[98,99,103],"a",{"href":100,"rel":101},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fdurable-objects\u002Fapi\u002Fwebsockets\u002F",[102],"nofollow","Durable Objects"," with ",[98,106,107],{"href":28},"pub\u002Fsub"," and ",[98,110,113],{"href":111,"rel":112},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fdurable-objects\u002Fbest-practices\u002Fwebsockets\u002F#websocket-hibernation-api",[102],"hibernation API"," support, you need to check for the ",[116,117,118],"code",{},"upgrade"," header and additionally export a DurableObject with crossws adapter hooks integrated.",[121,122,123],"note",{},[94,124,125,126,130],{},"\nIf you skip durable object class export or in cases the binding is unavailable, crossws uses a ",[127,128,129],"strong",{},"fallback mode"," without pub\u002Fsub support in the same worker.",[132,133,138],"pre",{"className":134,"code":135,"language":136,"meta":137,"style":137},"language-js shiki shiki-themes github-light github-dark github-dark","import { DurableObject } from \"cloudflare:workers\";\nimport crossws from \"crossws\u002Fadapters\u002Fcloudflare\";\n\nconst ws = crossws({\n  \u002F\u002F bindingName: \"$DurableObject\",\n  \u002F\u002F instanceName: \"crossws\",\n  hooks: {\n    message: console.log,\n    open(peer) {\n      peer.subscribe(\"chat\");\n      peer.publish(\"chat\", { user: \"server\", message: `${peer} joined!` });\n    },\n  },\n});\n\nexport default {\n  async fetch(request, env, context) {\n    if (request.headers.get(\"upgrade\") === \"websocket\") {\n      return ws.handleUpgrade(request, env, context);\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\nexport class $DurableObject extends DurableObject {\n  constructor(state, env) {\n    super(state, env);\n    ws.handleDurableInit(this, state, env);\n  }\n\n  fetch(request) {\n    return ws.handleDurableUpgrade(this, request);\n  }\n\n  webSocketMessage(client, message) {\n    return ws.handleDurableMessage(this, client, message);\n  }\n\n  webSocketPublish(topic, message, opts) {\n    return ws.handleDurablePublish(this, topic, message, opts);\n  }\n\n  webSocketClose(client, code, reason, wasClean) {\n    return ws.handleDurableClose(this, client, code, reason, wasClean);\n  }\n}\n","js","",[116,139,140,163,178,185,205,212,218,224,230,246,263,295,301,307,313,318,330,357,385,400,406,421,430,448,454,459,465,470,489,506,515,532,538,543,555,572,577,582,600,617,622,627,649,666,671,676,702,719,724],{"__ignoreMap":137},[141,142,145,149,153,156,160],"span",{"class":143,"line":144},"line",1,[141,146,148],{"class":147},"so5gQ","import",[141,150,152],{"class":151},"slsVL"," { DurableObject } ",[141,154,155],{"class":147},"from",[141,157,159],{"class":158},"sfrk1"," \"cloudflare:workers\"",[141,161,162],{"class":151},";\n",[141,164,166,168,171,173,176],{"class":143,"line":165},2,[141,167,148],{"class":147},[141,169,170],{"class":151}," crossws ",[141,172,155],{"class":147},[141,174,175],{"class":158}," \"crossws\u002Fadapters\u002Fcloudflare\"",[141,177,162],{"class":151},[141,179,181],{"class":143,"line":180},3,[141,182,184],{"emptyLinePlaceholder":183},true,"\n",[141,186,188,191,195,198,202],{"class":143,"line":187},4,[141,189,190],{"class":147},"const",[141,192,194],{"class":193},"suiK_"," ws",[141,196,197],{"class":147}," =",[141,199,201],{"class":200},"shcOC"," crossws",[141,203,204],{"class":151},"({\n",[141,206,208],{"class":143,"line":207},5,[141,209,211],{"class":210},"sCsY4","  \u002F\u002F bindingName: \"$DurableObject\",\n",[141,213,215],{"class":143,"line":214},6,[141,216,217],{"class":210},"  \u002F\u002F instanceName: \"crossws\",\n",[141,219,221],{"class":143,"line":220},7,[141,222,223],{"class":151},"  hooks: {\n",[141,225,227],{"class":143,"line":226},8,[141,228,229],{"class":151},"    message: console.log,\n",[141,231,233,236,239,243],{"class":143,"line":232},9,[141,234,235],{"class":200},"    open",[141,237,238],{"class":151},"(",[141,240,242],{"class":241},"sQHwn","peer",[141,244,245],{"class":151},") {\n",[141,247,249,252,255,257,260],{"class":143,"line":248},10,[141,250,251],{"class":151},"      peer.",[141,253,254],{"class":200},"subscribe",[141,256,238],{"class":151},[141,258,259],{"class":158},"\"chat\"",[141,261,262],{"class":151},");\n",[141,264,266,268,271,273,275,278,281,284,287,289,292],{"class":143,"line":265},11,[141,267,251],{"class":151},[141,269,270],{"class":200},"publish",[141,272,238],{"class":151},[141,274,259],{"class":158},[141,276,277],{"class":151},", { user: ",[141,279,280],{"class":158},"\"server\"",[141,282,283],{"class":151},", message: ",[141,285,286],{"class":158},"`${",[141,288,242],{"class":151},[141,290,291],{"class":158},"} joined!`",[141,293,294],{"class":151}," });\n",[141,296,298],{"class":143,"line":297},12,[141,299,300],{"class":151},"    },\n",[141,302,304],{"class":143,"line":303},13,[141,305,306],{"class":151},"  },\n",[141,308,310],{"class":143,"line":309},14,[141,311,312],{"class":151},"});\n",[141,314,316],{"class":143,"line":315},15,[141,317,184],{"emptyLinePlaceholder":183},[141,319,321,324,327],{"class":143,"line":320},16,[141,322,323],{"class":147},"export",[141,325,326],{"class":147}," default",[141,328,329],{"class":151}," {\n",[141,331,333,336,339,341,344,347,350,352,355],{"class":143,"line":332},17,[141,334,335],{"class":147},"  async",[141,337,338],{"class":200}," fetch",[141,340,238],{"class":151},[141,342,343],{"class":241},"request",[141,345,346],{"class":151},", ",[141,348,349],{"class":241},"env",[141,351,346],{"class":151},[141,353,354],{"class":241},"context",[141,356,245],{"class":151},[141,358,360,363,366,369,371,374,377,380,383],{"class":143,"line":359},18,[141,361,362],{"class":147},"    if",[141,364,365],{"class":151}," (request.headers.",[141,367,368],{"class":200},"get",[141,370,238],{"class":151},[141,372,373],{"class":158},"\"upgrade\"",[141,375,376],{"class":151},") ",[141,378,379],{"class":147},"===",[141,381,382],{"class":158}," \"websocket\"",[141,384,245],{"class":151},[141,386,388,391,394,397],{"class":143,"line":387},19,[141,389,390],{"class":147},"      return",[141,392,393],{"class":151}," ws.",[141,395,396],{"class":200},"handleUpgrade",[141,398,399],{"class":151},"(request, env, context);\n",[141,401,403],{"class":143,"line":402},20,[141,404,405],{"class":151},"    }\n",[141,407,409,412,415,418],{"class":143,"line":408},21,[141,410,411],{"class":147},"    return",[141,413,414],{"class":147}," new",[141,416,417],{"class":200}," Response",[141,419,420],{"class":151},"(\n",[141,422,424,427],{"class":143,"line":423},22,[141,425,426],{"class":158},"      `\u003Cscript>new WebSocket(\"ws:\u002F\u002Flocalhost:3000\").addEventListener(\"open\", (e) => e.target.send(\"Hello from client!\"));\u003C\u002Fscript>`",[141,428,429],{"class":151},",\n",[141,431,433,436,439,442,445],{"class":143,"line":432},23,[141,434,435],{"class":151},"      { headers: { ",[141,437,438],{"class":158},"\"content-type\"",[141,440,441],{"class":151},": ",[141,443,444],{"class":158},"\"text\u002Fhtml\"",[141,446,447],{"class":151}," } },\n",[141,449,451],{"class":143,"line":450},24,[141,452,453],{"class":151},"    );\n",[141,455,457],{"class":143,"line":456},25,[141,458,306],{"class":151},[141,460,462],{"class":143,"line":461},26,[141,463,464],{"class":151},"};\n",[141,466,468],{"class":143,"line":467},27,[141,469,184],{"emptyLinePlaceholder":183},[141,471,473,475,478,481,484,487],{"class":143,"line":472},28,[141,474,323],{"class":147},[141,476,477],{"class":147}," class",[141,479,480],{"class":200}," $DurableObject",[141,482,483],{"class":147}," extends",[141,485,486],{"class":200}," DurableObject",[141,488,329],{"class":151},[141,490,492,495,497,500,502,504],{"class":143,"line":491},29,[141,493,494],{"class":147},"  constructor",[141,496,238],{"class":151},[141,498,499],{"class":241},"state",[141,501,346],{"class":151},[141,503,349],{"class":241},[141,505,245],{"class":151},[141,507,509,512],{"class":143,"line":508},30,[141,510,511],{"class":193},"    super",[141,513,514],{"class":151},"(state, env);\n",[141,516,518,521,524,526,529],{"class":143,"line":517},31,[141,519,520],{"class":151},"    ws.",[141,522,523],{"class":200},"handleDurableInit",[141,525,238],{"class":151},[141,527,528],{"class":193},"this",[141,530,531],{"class":151},", state, env);\n",[141,533,535],{"class":143,"line":534},32,[141,536,537],{"class":151},"  }\n",[141,539,541],{"class":143,"line":540},33,[141,542,184],{"emptyLinePlaceholder":183},[141,544,546,549,551,553],{"class":143,"line":545},34,[141,547,548],{"class":200},"  fetch",[141,550,238],{"class":151},[141,552,343],{"class":241},[141,554,245],{"class":151},[141,556,558,560,562,565,567,569],{"class":143,"line":557},35,[141,559,411],{"class":147},[141,561,393],{"class":151},[141,563,564],{"class":200},"handleDurableUpgrade",[141,566,238],{"class":151},[141,568,528],{"class":193},[141,570,571],{"class":151},", request);\n",[141,573,575],{"class":143,"line":574},36,[141,576,537],{"class":151},[141,578,580],{"class":143,"line":579},37,[141,581,184],{"emptyLinePlaceholder":183},[141,583,585,588,590,593,595,598],{"class":143,"line":584},38,[141,586,587],{"class":200},"  webSocketMessage",[141,589,238],{"class":151},[141,591,592],{"class":241},"client",[141,594,346],{"class":151},[141,596,597],{"class":241},"message",[141,599,245],{"class":151},[141,601,603,605,607,610,612,614],{"class":143,"line":602},39,[141,604,411],{"class":147},[141,606,393],{"class":151},[141,608,609],{"class":200},"handleDurableMessage",[141,611,238],{"class":151},[141,613,528],{"class":193},[141,615,616],{"class":151},", client, message);\n",[141,618,620],{"class":143,"line":619},40,[141,621,537],{"class":151},[141,623,625],{"class":143,"line":624},41,[141,626,184],{"emptyLinePlaceholder":183},[141,628,630,633,635,638,640,642,644,647],{"class":143,"line":629},42,[141,631,632],{"class":200},"  webSocketPublish",[141,634,238],{"class":151},[141,636,637],{"class":241},"topic",[141,639,346],{"class":151},[141,641,597],{"class":241},[141,643,346],{"class":151},[141,645,646],{"class":241},"opts",[141,648,245],{"class":151},[141,650,652,654,656,659,661,663],{"class":143,"line":651},43,[141,653,411],{"class":147},[141,655,393],{"class":151},[141,657,658],{"class":200},"handleDurablePublish",[141,660,238],{"class":151},[141,662,528],{"class":193},[141,664,665],{"class":151},", topic, message, opts);\n",[141,667,669],{"class":143,"line":668},44,[141,670,537],{"class":151},[141,672,674],{"class":143,"line":673},45,[141,675,184],{"emptyLinePlaceholder":183},[141,677,679,682,684,686,688,690,692,695,697,700],{"class":143,"line":678},46,[141,680,681],{"class":200},"  webSocketClose",[141,683,238],{"class":151},[141,685,592],{"class":241},[141,687,346],{"class":151},[141,689,116],{"class":241},[141,691,346],{"class":151},[141,693,694],{"class":241},"reason",[141,696,346],{"class":151},[141,698,699],{"class":241},"wasClean",[141,701,245],{"class":151},[141,703,705,707,709,712,714,716],{"class":143,"line":704},47,[141,706,411],{"class":147},[141,708,393],{"class":151},[141,710,711],{"class":200},"handleDurableClose",[141,713,238],{"class":151},[141,715,528],{"class":193},[141,717,718],{"class":151},", client, code, reason, wasClean);\n",[141,720,722],{"class":143,"line":721},48,[141,723,537],{"class":151},[141,725,727],{"class":143,"line":726},49,[141,728,729],{"class":151},"}\n",[94,731,732,733,736],{},"Update your ",[116,734,735],{},"wrangler.toml"," to specify Durable object:",[132,738,742],{"className":739,"code":740,"language":741,"meta":137,"style":137},"language-ini shiki shiki-themes github-light github-dark github-dark","[[durable_objects.bindings]]\nname = \"$DurableObject\"\nclass_name = \"$DurableObject\"\n\n[[migrations]]\ntag = \"v1\"\nnew_classes = [\"$DurableObject\"]\n","ini",[116,743,744,752,763,772,776,783,793],{"__ignoreMap":137},[141,745,746,749],{"class":143,"line":144},[141,747,748],{"class":200},"[[durable_objects.bindings]",[141,750,751],{"class":151},"]\n",[141,753,754,757,760],{"class":143,"line":165},[141,755,756],{"class":147},"name",[141,758,759],{"class":151}," = ",[141,761,762],{"class":158},"\"$DurableObject\"\n",[141,764,765,768,770],{"class":143,"line":180},[141,766,767],{"class":147},"class_name",[141,769,759],{"class":151},[141,771,762],{"class":158},[141,773,774],{"class":143,"line":187},[141,775,184],{"emptyLinePlaceholder":183},[141,777,778,781],{"class":143,"line":207},[141,779,780],{"class":200},"[[migrations]",[141,782,751],{"class":151},[141,784,785,788,790],{"class":143,"line":214},[141,786,787],{"class":147},"tag",[141,789,759],{"class":151},[141,791,792],{"class":158},"\"v1\"\n",[141,794,795,798,801,804],{"class":143,"line":220},[141,796,797],{"class":147},"new_classes",[141,799,800],{"class":151}," = [",[141,802,803],{"class":158},"\"$DurableObject\"",[141,805,751],{"class":151},[807,808,809],"read-more",{},[94,810,811,812,819,820,827],{},"See ",[98,813,816],{"href":814,"rel":815},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Ftest\u002Ffixture\u002Fcloudflare-durable.ts",[102],[116,817,818],{},"test\u002Ffixture\u002Fcloudflare-durable.ts"," for demo and ",[98,821,824],{"href":822,"rel":823},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Fsrc\u002Fadapters\u002Fcloudflare.ts",[102],[116,825,826],{},"src\u002Fadapters\u002Fcloudflare.ts"," for implementation.",[829,830,832],"h3",{"id":831},"adapter-options","Adapter options",[121,834,835],{},[94,836,837,838,841,842,844,845,848,849,852],{},"\nBy default, crossws uses the durable object class ",[116,839,840],{},"$DurableObject"," from ",[116,843,349],{}," with an instance named ",[116,846,847],{},"crossws",".\nYou can customize this behavior by providing ",[116,850,851],{},"resolveDurableStub"," option.",[854,855,856,866,874,884,897],"ul",{},[857,858,859,862,863,865],"li",{},[116,860,861],{},"bindingName",": Durable Object binding name from environment (default: ",[116,864,840],{},").",[857,867,868,871,872,865],{},[116,869,870],{},"instanceName",": Durable Object instance name (default: ",[116,873,847],{},[857,875,876,878,879,108,881,883],{},[116,877,851],{},": Custom function that resolves Durable Object binding to handle the WebSocket upgrade. This option will override ",[116,880,861],{},[116,882,870],{},".",[857,885,886,889,890,893,894,896],{},[116,887,888],{},"sync",": Optional ",[98,891,892],{"href":33},"sync backplane"," to relay ",[98,895,107],{"href":28}," across instances (see below).",[857,898,899,902,903,883],{},[116,900,901],{},"onError",": Observe sync backplane failures. See ",[98,904,906],{"href":905},"\u002Fguide\u002Fsync#delivery-semantics","delivery semantics",[829,908,910],{"id":909},"sync-across-instances","Sync across instances",[94,912,913,914,916,917,919,920,922,923,926,927,929],{},"The ",[98,915,892],{"href":33}," relays ",[98,918,107],{"href":28}," between crossws instances, but on Cloudflare the model is different from a Node-style cluster — so reach for it only when you actually need it. A backplane on Cloudflare requires ",[127,921,103],{},": only a Durable Object's context owns its (hibernatable) sockets via ",[116,924,925],{},"ctx.getWebSockets()"," and can fan a message out to them. In ",[127,928,129],{}," (no Durable Object binding) each connection is a separate Worker invocation that can't send to another connection's socket, so pub\u002Fsub — and a backplane — are not supported there.",[854,931,932,949],{},[857,933,934,937,938,941,942,945,946],{},[127,935,936],{},"Single Durable Object (the default)."," With one instance (",[116,939,940],{},"\"crossws\"","), every connection across your app already lands on that same Durable Object, so ",[116,943,944],{},"peer.publish()"," is cluster-global out of the box. ",[127,947,948],{},"No backplane needed.",[857,950,951,954,955,958,959,961,962,964],{},[127,952,953],{},"Sharded Durable Objects."," If you fan connections across ",[127,956,957],{},"multiple"," instances (e.g. one per room via ",[116,960,851],{},"), a publish in one instance won't reach the others — a ",[116,963,888],{}," backplane bridges them.",[132,966,968],{"className":134,"code":967,"language":136,"meta":137,"style":137},"import crossws from \"crossws\u002Fadapters\u002Fcloudflare\";\nimport type { SyncAdapter } from \"crossws\";\n\nconst ws = crossws({\n  hooks,\n  sync: myBackplane, \u002F\u002F a custom SyncAdapter (see caveats below)\n});\n",[116,969,970,982,999,1003,1015,1020,1028],{"__ignoreMap":137},[141,971,972,974,976,978,980],{"class":143,"line":144},[141,973,148],{"class":147},[141,975,170],{"class":151},[141,977,155],{"class":147},[141,979,175],{"class":158},[141,981,162],{"class":151},[141,983,984,986,989,992,994,997],{"class":143,"line":165},[141,985,148],{"class":147},[141,987,988],{"class":147}," type",[141,990,991],{"class":151}," { SyncAdapter } ",[141,993,155],{"class":147},[141,995,996],{"class":158}," \"crossws\"",[141,998,162],{"class":151},[141,1000,1001],{"class":143,"line":180},[141,1002,184],{"emptyLinePlaceholder":183},[141,1004,1005,1007,1009,1011,1013],{"class":143,"line":187},[141,1006,190],{"class":147},[141,1008,194],{"class":193},[141,1010,197],{"class":147},[141,1012,201],{"class":200},[141,1014,204],{"class":151},[141,1016,1017],{"class":143,"line":207},[141,1018,1019],{"class":151},"  hooks,\n",[141,1021,1022,1025],{"class":143,"line":214},[141,1023,1024],{"class":151},"  sync: myBackplane, ",[141,1026,1027],{"class":210},"\u002F\u002F a custom SyncAdapter (see caveats below)\n",[141,1029,1030],{"class":143,"line":220},[141,1031,312],{"class":151},[94,1033,1034],{},"Two Cloudflare-specific caveats:",[854,1036,1037,1058],{},[857,1038,1039,1042,1043,1045,1046,1050,1051,1054,1055,1057],{},[127,1040,1041],{},"Inbound delivery into a Durable Object is best-effort."," crossws seeds the fan-out of a relayed message from the instance's in-memory peer map, which a hibernated\u002Fevicted Durable Object loses even though its sockets survive in ",[116,1044,925],{},". A message relayed ",[1047,1048,1049],"em",{},"into"," a hibernated Durable Object may miss some sockets. ",[127,1052,1053],{},"Outbound"," relay — a ",[116,1056,944],{}," in a Durable Object reaching the backplane — is reliable.",[857,1059,1060,1063,1064,1067,1068,1071,1072,1078,1079,1084],{},[127,1061,1062],{},"Bring a Cloudflare-native driver."," The built-in ",[116,1065,1066],{},"redis"," \u002F ",[116,1069,1070],{},"pgsql"," drivers open persistent connections and target Node-like runtimes, so they won't run inside workerd. Write a custom ",[98,1073,1075],{"href":1074},"\u002Fguide\u002Fsync#writing-a-driver",[116,1076,1077],{},"SyncAdapter"," over a Cloudflare-native transport (a coordinator Durable Object, ",[98,1080,1083],{"href":1081,"rel":1082},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fqueues\u002F",[102],"Queues",", or fetch-based pub\u002Fsub) instead.",[1086,1087,1088],"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 .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}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":137,"searchDepth":165,"depth":165,"links":1090},[1091,1092],{"id":831,"depth":180,"text":832},{"id":909,"depth":180,"text":910},"Integrate crossws with Cloudflare Workers and Durable Objects.","md",{"icon":72},{"icon":72},{"title":69,"description":1093},"xXfeYUrLd4zaMDDT58ZqFVaS9nghUyY-DVcsg69NaS4",[1100,1102],{"title":64,"path":65,"stem":66,"description":1101,"icon":67,"children":-1},"Manually integrate crossws with Bunny.net Edge Scripting.",{"title":74,"path":75,"stem":76,"description":1103,"icon":77,"children":-1},"Manually integrate crossws with Deno.",1783073588850]