[{"data":1,"prerenderedAt":1033},["ShallowReactive",2],{"navigation":3,"-adapters-sse":88,"-adapters-sse-surround":1029},[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":84,"body":90,"description":1023,"extension":1024,"meta":1025,"navigation":1026,"path":85,"seo":1027,"stem":86,"__hash__":1028},"content\u002F2.adapters\u002Fsse.md",{"type":91,"value":92,"toc":1016,"icon":87},"minimark",[93,116,129,134,139,145,148,399,402,527,531,564,592,792,816,820,826,963,990,1012],[94,95,96,97,107,108,115],"p",{},"If your deployment target does not supports handling WebSocket upgrades, crossws SSE adapter allows to add integration based on web platform standards (",[98,99,103],"a",{"href":100,"rel":101},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FFetch_API",[102],"nofollow",[104,105,106],"code",{},"fetch"," and ",[98,109,112],{"href":110,"rel":111},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FEventSource",[102],[104,113,114],{},"EventSource",")",[117,118,119],"important",{},[94,120,121,122,128],{},"\nThis is an experimental adapter and requires a custom ",[98,123,125],{"href":124},"#client-side",[104,126,127],{},"WebsocketSSE"," client to connect.",[130,131,133],"h2",{"id":132},"usage","Usage",[135,136,138],"h3",{"id":137},"server-side","Server side",[140,141,142],"note",{},[94,143,144],{},"\nHTTP\u002F2 + TLS is recommended in order to increase browser limitations about number of SSE connections (from 6 to 100) and also to allow bidirectional messaging with streaming.",[94,146,147],{},"Define adapter:",[149,150,155],"pre",{"className":151,"code":152,"language":153,"meta":154,"style":154},"language-ts shiki shiki-themes github-light github-dark github-dark","import sseAdapter from \"crossws\u002Fadapters\u002Fsse\";\n\nconst ws = sseAdapter({\n  bidir: true, \u002F\u002F Enable bidirectional messaging support\n  hooks: {\n    upgrade(request) {\n      \u002F\u002F In case of bidirectional mode, extra auth is recommended based on request\n      \u002F\u002F You can return a new Response() instead to abort\n      return {\n        headers: {},\n      };\n    },\n    open(peer) {\n      \u002F\u002F Use this hook to send messages to peer\n      peer.send(`Welcome ${peer}`);\n    },\n    message(peer, message) {\n      \u002F\u002F Accepting messages from peer (bidirectional mode)\n      console.log(`Message from ${peer}: ${message}`); \u002F\u002F Message from \u003Cid>: ping\n    },\n  },\n});\n","ts","",[104,156,157,180,187,207,223,229,245,251,257,266,272,278,284,297,303,325,330,347,353,382,387,393],{"__ignoreMap":154},[158,159,162,166,170,173,177],"span",{"class":160,"line":161},"line",1,[158,163,165],{"class":164},"so5gQ","import",[158,167,169],{"class":168},"slsVL"," sseAdapter ",[158,171,172],{"class":164},"from",[158,174,176],{"class":175},"sfrk1"," \"crossws\u002Fadapters\u002Fsse\"",[158,178,179],{"class":168},";\n",[158,181,183],{"class":160,"line":182},2,[158,184,186],{"emptyLinePlaceholder":185},true,"\n",[158,188,190,193,197,200,204],{"class":160,"line":189},3,[158,191,192],{"class":164},"const",[158,194,196],{"class":195},"suiK_"," ws",[158,198,199],{"class":164}," =",[158,201,203],{"class":202},"shcOC"," sseAdapter",[158,205,206],{"class":168},"({\n",[158,208,210,213,216,219],{"class":160,"line":209},4,[158,211,212],{"class":168},"  bidir: ",[158,214,215],{"class":195},"true",[158,217,218],{"class":168},", ",[158,220,222],{"class":221},"sCsY4","\u002F\u002F Enable bidirectional messaging support\n",[158,224,226],{"class":160,"line":225},5,[158,227,228],{"class":168},"  hooks: {\n",[158,230,232,235,238,242],{"class":160,"line":231},6,[158,233,234],{"class":202},"    upgrade",[158,236,237],{"class":168},"(",[158,239,241],{"class":240},"sQHwn","request",[158,243,244],{"class":168},") {\n",[158,246,248],{"class":160,"line":247},7,[158,249,250],{"class":221},"      \u002F\u002F In case of bidirectional mode, extra auth is recommended based on request\n",[158,252,254],{"class":160,"line":253},8,[158,255,256],{"class":221},"      \u002F\u002F You can return a new Response() instead to abort\n",[158,258,260,263],{"class":160,"line":259},9,[158,261,262],{"class":164},"      return",[158,264,265],{"class":168}," {\n",[158,267,269],{"class":160,"line":268},10,[158,270,271],{"class":168},"        headers: {},\n",[158,273,275],{"class":160,"line":274},11,[158,276,277],{"class":168},"      };\n",[158,279,281],{"class":160,"line":280},12,[158,282,283],{"class":168},"    },\n",[158,285,287,290,292,295],{"class":160,"line":286},13,[158,288,289],{"class":202},"    open",[158,291,237],{"class":168},[158,293,294],{"class":240},"peer",[158,296,244],{"class":168},[158,298,300],{"class":160,"line":299},14,[158,301,302],{"class":221},"      \u002F\u002F Use this hook to send messages to peer\n",[158,304,306,309,312,314,317,319,322],{"class":160,"line":305},15,[158,307,308],{"class":168},"      peer.",[158,310,311],{"class":202},"send",[158,313,237],{"class":168},[158,315,316],{"class":175},"`Welcome ${",[158,318,294],{"class":168},[158,320,321],{"class":175},"}`",[158,323,324],{"class":168},");\n",[158,326,328],{"class":160,"line":327},16,[158,329,283],{"class":168},[158,331,333,336,338,340,342,345],{"class":160,"line":332},17,[158,334,335],{"class":202},"    message",[158,337,237],{"class":168},[158,339,294],{"class":240},[158,341,218],{"class":168},[158,343,344],{"class":240},"message",[158,346,244],{"class":168},[158,348,350],{"class":160,"line":349},18,[158,351,352],{"class":221},"      \u002F\u002F Accepting messages from peer (bidirectional mode)\n",[158,354,356,359,362,364,367,369,372,374,376,379],{"class":160,"line":355},19,[158,357,358],{"class":168},"      console.",[158,360,361],{"class":202},"log",[158,363,237],{"class":168},[158,365,366],{"class":175},"`Message from ${",[158,368,294],{"class":168},[158,370,371],{"class":175},"}: ${",[158,373,344],{"class":168},[158,375,321],{"class":175},[158,377,378],{"class":168},"); ",[158,380,381],{"class":221},"\u002F\u002F Message from \u003Cid>: ping\n",[158,383,385],{"class":160,"line":384},20,[158,386,283],{"class":168},[158,388,390],{"class":160,"line":389},21,[158,391,392],{"class":168},"  },\n",[158,394,396],{"class":160,"line":395},22,[158,397,398],{"class":168},"});\n",[94,400,401],{},"Inside your web server handler:",[149,403,407],{"className":404,"code":405,"language":406,"meta":154,"style":154},"language-js shiki shiki-themes github-light github-dark github-dark","async fetch(request) {\n  \u002F\u002F Handle crossws upgrade\n  if (\n    request.headers.get(\"accept\") === \"text\u002Fevent-stream\" ||\n    request.headers.has(\"x-crossws-id\")\n  ) {\n    return ws.fetch(request);\n  }\n\n  \u002F\u002F Your normal application logic\n  return new Response(\"default page\")\n}\n","js",[104,408,409,419,424,432,457,472,477,490,495,499,504,522],{"__ignoreMap":154},[158,410,411,414,416],{"class":160,"line":161},[158,412,413],{"class":168},"async ",[158,415,106],{"class":202},[158,417,418],{"class":168},"(request) {\n",[158,420,421],{"class":160,"line":182},[158,422,423],{"class":221},"  \u002F\u002F Handle crossws upgrade\n",[158,425,426,429],{"class":160,"line":189},[158,427,428],{"class":164},"  if",[158,430,431],{"class":168}," (\n",[158,433,434,437,440,442,445,448,451,454],{"class":160,"line":209},[158,435,436],{"class":168},"    request.headers.",[158,438,439],{"class":202},"get",[158,441,237],{"class":168},[158,443,444],{"class":175},"\"accept\"",[158,446,447],{"class":168},") ",[158,449,450],{"class":164},"===",[158,452,453],{"class":175}," \"text\u002Fevent-stream\"",[158,455,456],{"class":164}," ||\n",[158,458,459,461,464,466,469],{"class":160,"line":225},[158,460,436],{"class":168},[158,462,463],{"class":202},"has",[158,465,237],{"class":168},[158,467,468],{"class":175},"\"x-crossws-id\"",[158,470,471],{"class":168},")\n",[158,473,474],{"class":160,"line":231},[158,475,476],{"class":168},"  ) {\n",[158,478,479,482,485,487],{"class":160,"line":247},[158,480,481],{"class":164},"    return",[158,483,484],{"class":168}," ws.",[158,486,106],{"class":202},[158,488,489],{"class":168},"(request);\n",[158,491,492],{"class":160,"line":253},[158,493,494],{"class":168},"  }\n",[158,496,497],{"class":160,"line":259},[158,498,186],{"emptyLinePlaceholder":185},[158,500,501],{"class":160,"line":268},[158,502,503],{"class":221},"  \u002F\u002F Your normal application logic\n",[158,505,506,509,512,515,517,520],{"class":160,"line":274},[158,507,508],{"class":164},"  return",[158,510,511],{"class":164}," new",[158,513,514],{"class":202}," Response",[158,516,237],{"class":168},[158,518,519],{"class":175},"\"default page\"",[158,521,471],{"class":168},[158,523,524],{"class":160,"line":280},[158,525,526],{"class":168},"}\n",[135,528,530],{"id":529},"using-with-express-or-other-nodejs-frameworks","Using with Express or other Node.js frameworks",[94,532,533,534,537,538,545,546,553,554,559,560,563],{},"The SSE adapter's ",[104,535,536],{},"ws.fetch"," is a Web-standard fetch handler: it takes a ",[98,539,542],{"href":540,"rel":541},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FRequest",[102],[104,543,544],{},"Request"," and returns a ",[98,547,550],{"href":548,"rel":549},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FResponse",[102],[104,551,552],{},"Response",". Node.js frameworks like ",[98,555,558],{"href":556,"rel":557},"https:\u002F\u002Fexpressjs.com\u002F",[102],"Express"," instead work with the raw Node.js ",[104,561,562],{},"(req, res)"," style, so you need a small bridge to convert between the two.",[94,565,566,567,570,571,574,575,582,583,588,589,591],{},"Rather than manually converting streams with ",[104,568,569],{},"Readable.toWeb","\u002F",[104,572,573],{},"Readable.fromWeb"," and copying over status\u002Fheaders by hand, use the ",[98,576,579],{"href":577,"rel":578},"https:\u002F\u002Fsrvx.h3.dev\u002Fguide\u002Fnode",[102],[104,580,581],{},"toNodeHandler"," helper from ",[98,584,587],{"href":585,"rel":586},"https:\u002F\u002Fsrvx.h3.dev\u002F",[102],"srvx",", which turns any Web-standard fetch handler into a plain ",[104,590,562],{}," Node.js handler:",[149,593,595],{"className":404,"code":594,"language":406,"meta":154,"style":154},"import express from \"express\";\nimport { toNodeHandler } from \"srvx\u002Fnode\";\nimport sseAdapter from \"crossws\u002Fadapters\u002Fsse\";\n\nconst ws = sseAdapter({\n  hooks: {\n    \u002F* ... *\u002F\n  },\n});\n\nconst app = express();\n\napp.use((req, res, next) => {\n  if (\n    req.headers.accept === \"text\u002Fevent-stream\" ||\n    req.headers[\"x-crossws-id\"]\n  ) {\n    return toNodeHandler((request) => ws.fetch(request))(req, res);\n  }\n  next();\n});\n",[104,596,597,611,625,637,641,653,657,662,666,670,674,689,693,724,730,741,751,755,777,781,788],{"__ignoreMap":154},[158,598,599,601,604,606,609],{"class":160,"line":161},[158,600,165],{"class":164},[158,602,603],{"class":168}," express ",[158,605,172],{"class":164},[158,607,608],{"class":175}," \"express\"",[158,610,179],{"class":168},[158,612,613,615,618,620,623],{"class":160,"line":182},[158,614,165],{"class":164},[158,616,617],{"class":168}," { toNodeHandler } ",[158,619,172],{"class":164},[158,621,622],{"class":175}," \"srvx\u002Fnode\"",[158,624,179],{"class":168},[158,626,627,629,631,633,635],{"class":160,"line":189},[158,628,165],{"class":164},[158,630,169],{"class":168},[158,632,172],{"class":164},[158,634,176],{"class":175},[158,636,179],{"class":168},[158,638,639],{"class":160,"line":209},[158,640,186],{"emptyLinePlaceholder":185},[158,642,643,645,647,649,651],{"class":160,"line":225},[158,644,192],{"class":164},[158,646,196],{"class":195},[158,648,199],{"class":164},[158,650,203],{"class":202},[158,652,206],{"class":168},[158,654,655],{"class":160,"line":231},[158,656,228],{"class":168},[158,658,659],{"class":160,"line":247},[158,660,661],{"class":221},"    \u002F* ... *\u002F\n",[158,663,664],{"class":160,"line":253},[158,665,392],{"class":168},[158,667,668],{"class":160,"line":259},[158,669,398],{"class":168},[158,671,672],{"class":160,"line":268},[158,673,186],{"emptyLinePlaceholder":185},[158,675,676,678,681,683,686],{"class":160,"line":274},[158,677,192],{"class":164},[158,679,680],{"class":195}," app",[158,682,199],{"class":164},[158,684,685],{"class":202}," express",[158,687,688],{"class":168},"();\n",[158,690,691],{"class":160,"line":280},[158,692,186],{"emptyLinePlaceholder":185},[158,694,695,698,701,704,707,709,712,714,717,719,722],{"class":160,"line":286},[158,696,697],{"class":168},"app.",[158,699,700],{"class":202},"use",[158,702,703],{"class":168},"((",[158,705,706],{"class":240},"req",[158,708,218],{"class":168},[158,710,711],{"class":240},"res",[158,713,218],{"class":168},[158,715,716],{"class":240},"next",[158,718,447],{"class":168},[158,720,721],{"class":164},"=>",[158,723,265],{"class":168},[158,725,726,728],{"class":160,"line":299},[158,727,428],{"class":164},[158,729,431],{"class":168},[158,731,732,735,737,739],{"class":160,"line":305},[158,733,734],{"class":168},"    req.headers.accept ",[158,736,450],{"class":164},[158,738,453],{"class":175},[158,740,456],{"class":164},[158,742,743,746,748],{"class":160,"line":327},[158,744,745],{"class":168},"    req.headers[",[158,747,468],{"class":175},[158,749,750],{"class":168},"]\n",[158,752,753],{"class":160,"line":332},[158,754,476],{"class":168},[158,756,757,759,762,764,766,768,770,772,774],{"class":160,"line":349},[158,758,481],{"class":164},[158,760,761],{"class":202}," toNodeHandler",[158,763,703],{"class":168},[158,765,241],{"class":240},[158,767,447],{"class":168},[158,769,721],{"class":164},[158,771,484],{"class":168},[158,773,106],{"class":202},[158,775,776],{"class":168},"(request))(req, res);\n",[158,778,779],{"class":160,"line":355},[158,780,494],{"class":168},[158,782,783,786],{"class":160,"line":384},[158,784,785],{"class":202},"  next",[158,787,688],{"class":168},[158,789,790],{"class":160,"line":389},[158,791,398],{"class":168},[140,793,794],{},[94,795,796,797,799,800,570,802,804,805,570,808,811,812,815],{},"\nThis is not specific to Express: ",[104,798,581],{}," only needs the raw Node.js ",[104,801,706],{},[104,803,711],{}," objects, so the same pattern works for any framework whose handler ultimately exposes them — Fastify's ",[104,806,807],{},"request.raw",[104,809,810],{},"reply.raw",", NestJS running on top of its Express or Fastify adapter, or a plain ",[104,813,814],{},"node:http"," server.",[135,817,819],{"id":818},"client-side","Client side",[94,821,822,823,825],{},"In order to make communication with server, we need a special ",[104,824,127],{}," client.",[149,827,829],{"className":404,"code":828,"language":406,"meta":154,"style":154},"import { WebsocketSSE } from \"crossws\u002Fwebsocket\u002Fsse\";\n\nconst ws = new WebsocketSSE(\"https:\u002F\u002F\u003Cserver_address>\", { bdir: true });\n\nws.addEventListener(\"open\", () => {\n  ws.send(\"ping\");\n});\n\nws.addEventListener(\"message\", (event) => {\n  console.log(\"Received:\", event.data);\n});\n",[104,830,831,845,849,875,879,899,913,917,921,944,959],{"__ignoreMap":154},[158,832,833,835,838,840,843],{"class":160,"line":161},[158,834,165],{"class":164},[158,836,837],{"class":168}," { WebsocketSSE } ",[158,839,172],{"class":164},[158,841,842],{"class":175}," \"crossws\u002Fwebsocket\u002Fsse\"",[158,844,179],{"class":168},[158,846,847],{"class":160,"line":182},[158,848,186],{"emptyLinePlaceholder":185},[158,850,851,853,855,857,859,862,864,867,870,872],{"class":160,"line":189},[158,852,192],{"class":164},[158,854,196],{"class":195},[158,856,199],{"class":164},[158,858,511],{"class":164},[158,860,861],{"class":202}," WebsocketSSE",[158,863,237],{"class":168},[158,865,866],{"class":175},"\"https:\u002F\u002F\u003Cserver_address>\"",[158,868,869],{"class":168},", { bdir: ",[158,871,215],{"class":195},[158,873,874],{"class":168}," });\n",[158,876,877],{"class":160,"line":209},[158,878,186],{"emptyLinePlaceholder":185},[158,880,881,884,887,889,892,895,897],{"class":160,"line":225},[158,882,883],{"class":168},"ws.",[158,885,886],{"class":202},"addEventListener",[158,888,237],{"class":168},[158,890,891],{"class":175},"\"open\"",[158,893,894],{"class":168},", () ",[158,896,721],{"class":164},[158,898,265],{"class":168},[158,900,901,904,906,908,911],{"class":160,"line":231},[158,902,903],{"class":168},"  ws.",[158,905,311],{"class":202},[158,907,237],{"class":168},[158,909,910],{"class":175},"\"ping\"",[158,912,324],{"class":168},[158,914,915],{"class":160,"line":247},[158,916,398],{"class":168},[158,918,919],{"class":160,"line":253},[158,920,186],{"emptyLinePlaceholder":185},[158,922,923,925,927,929,932,935,938,940,942],{"class":160,"line":259},[158,924,883],{"class":168},[158,926,886],{"class":202},[158,928,237],{"class":168},[158,930,931],{"class":175},"\"message\"",[158,933,934],{"class":168},", (",[158,936,937],{"class":240},"event",[158,939,447],{"class":168},[158,941,721],{"class":164},[158,943,265],{"class":168},[158,945,946,949,951,953,956],{"class":160,"line":268},[158,947,948],{"class":168},"  console.",[158,950,361],{"class":202},[158,952,237],{"class":168},[158,954,955],{"class":175},"\"Received:\"",[158,957,958],{"class":168},", event.data);\n",[158,960,961],{"class":160,"line":274},[158,962,398],{"class":168},[140,964,965],{},[94,966,967,968,971,972,977,978,983,984,989],{},"\nBehind the scenes, ",[104,969,970],{},"WebSocketSSE",", uses ",[98,973,975],{"href":110,"rel":974},[102],[104,976,114],{}," to receive messages from server. In order to send messages to the server, it tries to make another connection stream using same peer id and if failed, fallback to ",[98,979,981],{"href":100,"rel":980},[102],[104,982,106],{}," for each message.\nIn theory, it is possible to have communication on a single HTTP\u002F2 connection, however, due to a ",[98,985,988],{"href":986,"rel":987},"https:\u002F\u002Fgithub.com\u002Fwhatwg\u002Ffetch\u002Fissues\u002F1254",[102],"current limitation in fetch standard"," we need 2 connections, one for receiving messages and one for sending.",[991,992,993],"read-more",{},[94,994,995,996,1003,1004,1011],{},"See ",[98,997,1000],{"href":998,"rel":999},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Ftest\u002Ffixture\u002Fsse.ts",[102],[104,1001,1002],{},"test\u002Ffixture\u002Fsse.ts"," for demo and ",[98,1005,1008],{"href":1006,"rel":1007},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fcrossws\u002Fblob\u002Fmain\u002Fsrc\u002Fadapters\u002Fsse.ts",[102],[104,1009,1010],{},"src\u002Fadapters\u002Fsse.ts"," for implementation.",[1013,1014,1015],"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":154,"searchDepth":182,"depth":182,"links":1017},[1018],{"id":132,"depth":182,"text":133,"children":1019},[1020,1021,1022],{"id":137,"depth":189,"text":138},{"id":529,"depth":189,"text":530},{"id":818,"depth":189,"text":819},"Integrate crossws with server-sent events and fetch-api.","md",{"icon":87},{"icon":87},{"title":84,"description":1023},"B8l-kv0JIA45y5ExdQmVwVac2mWsOJI6btVyAy82SGE",[1030,1032],{"title":79,"path":80,"stem":81,"description":1031,"icon":82,"children":-1},"Integrate crossws with Node.js (manually) or uWebSockets.js",null,1783073588851]