[{"data":1,"prerenderedAt":2044},["ShallowReactive",2],{"navigation":3,"-guide-peer":88,"-guide-peer-surround":2040},[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":17,"body":90,"description":2034,"extension":2035,"meta":2036,"navigation":2037,"path":18,"seo":2038,"stem":19,"__hash__":2039},"content\u002F1.guide\u002F3.peer.md",{"type":91,"value":92,"toc":2010,"icon":20},"minimark",[93,97,102,110,121,127,130,147,153,156,163,169,180,190,196,199,206,276,281,287,290,296,299,305,308,323,334,338,344,347,353,373,477,500,518,524,527,530,536,539,541,547,550,552,558,561,564,608,614,619,622,628,634,637,650,932,940,963,976,980,1625,2006],[94,95,96],"p",{},"When a new client connects to the server, crossws creates a peer instance that allows getting information from clients and sending messages to them.",[98,99,101],"h2",{"id":100},"instance-properties","Instance properties",[103,104,106],"h3",{"id":105},"peerid",[107,108,109],"code",{},"peer.id",[94,111,112,113,120],{},"Unique random identifier (",[114,115,119],"a",{"href":116,"rel":117},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FGlossary\u002FUUID",[118],"nofollow","uuid v4",") for the peer.",[103,122,124],{"id":123},"peerrequest",[107,125,126],{},"peer.request?",[94,128,129],{},"Access to the upgrade request info. You can use it to do authentication and access users headers and cookies.",[131,132,133],"note",{},[94,134,135,136,141,142,146],{},"\nThis property is compatible with web ",[114,137,140],{"href":138,"rel":139},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FRequest",[118],"Request"," interface, However interface is emulated for Node.js and sometimes unavailable. Refer to the ",[114,143,145],{"href":144},"#compatibility","compatibility table"," for more info.",[103,148,150],{"id":149},"peerremoteaddress",[107,151,152],{},"peer.remoteAddress?",[94,154,155],{},"The IP address of the client.",[131,157,158],{},[94,159,160,161,146],{},"\nNot all adapters provide this. Refer to the ",[114,162,145],{"href":144},[103,164,166],{"id":165},"peerwebsocket",[107,167,168],{},"peer.websocket",[94,170,171,172,179],{},"Direct access to the ",[114,173,176],{"href":174,"rel":175},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWebSocket",[118],[107,177,178],{},"WebSocket"," instance.",[131,181,182],{},[94,183,184,185,187,188,146],{},"\nWebSocket properties vary across runtimes. When accessing ",[107,186,168],{},", a lightweight proxy increases stability. Refer to the ",[114,189,145],{"href":144},[103,191,193],{"id":192},"peercontext",[107,194,195],{},"peer.context",[94,197,198],{},"The context is an object that contains arbitrary information about the request.",[94,200,201,202,205],{},"You can augment the ",[107,203,204],{},"PeerContext"," interface types to add your properties.",[207,208,213],"pre",{"className":209,"code":210,"language":211,"meta":212,"style":212},"language-ts shiki shiki-themes github-light github-dark github-dark","declare module \"crossws\" {\n  interface PeerContext {\n    customData?: string[];\n  }\n}\n","ts","",[107,214,215,235,247,264,270],{"__ignoreMap":212},[216,217,220,224,227,231],"span",{"class":218,"line":219},"line",1,[216,221,223],{"class":222},"so5gQ","declare",[216,225,226],{"class":222}," module",[216,228,230],{"class":229},"sfrk1"," \"crossws\"",[216,232,234],{"class":233},"slsVL"," {\n",[216,236,238,241,245],{"class":218,"line":237},2,[216,239,240],{"class":222},"  interface",[216,242,244],{"class":243},"shcOC"," PeerContext",[216,246,234],{"class":233},[216,248,250,254,257,261],{"class":218,"line":249},3,[216,251,253],{"class":252},"sQHwn","    customData",[216,255,256],{"class":222},"?:",[216,258,260],{"class":259},"suiK_"," string",[216,262,263],{"class":233},"[];\n",[216,265,267],{"class":218,"line":266},4,[216,268,269],{"class":233},"  }\n",[216,271,273],{"class":218,"line":272},5,[216,274,275],{"class":233},"}\n",[131,277,278],{},[94,279,280],{},"\ncontext data can be volatile in some runtimes.",[103,282,284],{"id":283},"peertopics",[107,285,286],{},"peer.topics",[94,288,289],{},"All topics, this peer has been subscribed to.",[103,291,293],{"id":292},"peernamespace",[107,294,295],{},"peer.namespace",[94,297,298],{},"Peer's pubsub namespace.",[103,300,302],{"id":301},"peerbufferedamount",[107,303,304],{},"peer.bufferedAmount",[94,306,307],{},"Number of bytes queued for transmission but not yet flushed to the client.",[94,309,310,311,315,316,322],{},"Use this to apply ",[312,313,314],"strong",{},"backpressure",": pause sending while it grows past a high watermark and resume once it drops. This prevents a fast producer (for example a streaming async generator) from filling the adapter's send buffer faster than the client can drain it. The easiest way to wait is ",[114,317,319],{"href":318},"#peerwaitfordrain",[107,320,321],{},"peer.waitForDrain()",".",[131,324,325],{},[94,326,327,328,331,332,146],{},"\nNot all adapters expose a buffer signal; those return ",[107,329,330],{},"0",". Refer to the ",[114,333,145],{"href":144},[98,335,337],{"id":336},"instance-methods","Instance methods",[103,339,341],{"id":340},"peersendmessage-compress",[107,342,343],{},"peer.send(message, { compress? })",[94,345,346],{},"Send a message to the connected client.",[103,348,350],{"id":349},"peerwaitfordrain-threshold-pollinterval-signal",[107,351,352],{},"peer.waitForDrain({ threshold?, pollInterval?, signal? })",[94,354,355,356,361,362,365,366,368,369,372],{},"Returns a promise that resolves once ",[114,357,359],{"href":358},"#peerbufferedamount",[107,360,304],{}," drops to or below ",[107,363,364],{},"threshold"," bytes (default ",[107,367,330],{},"), letting you ",[107,370,371],{},"await"," backpressure relief in a send loop:",[207,374,376],{"className":209,"code":375,"language":211,"meta":212,"style":212},"\u002F\u002F Throttle a fast producer to the client's pace\nfor (const chunk of stream) {\n  peer.send(chunk);\n  if (peer.bufferedAmount > 1024 * 1024 \u002F* 1MB *\u002F) {\n    await peer.waitForDrain({ threshold: 256 * 1024 \u002F* 256KB *\u002F });\n  }\n}\n",[107,377,378,384,404,415,440,467,472],{"__ignoreMap":212},[216,379,380],{"class":218,"line":219},[216,381,383],{"class":382},"sCsY4","\u002F\u002F Throttle a fast producer to the client's pace\n",[216,385,386,389,392,395,398,401],{"class":218,"line":237},[216,387,388],{"class":222},"for",[216,390,391],{"class":233}," (",[216,393,394],{"class":222},"const",[216,396,397],{"class":259}," chunk",[216,399,400],{"class":222}," of",[216,402,403],{"class":233}," stream) {\n",[216,405,406,409,412],{"class":218,"line":249},[216,407,408],{"class":233},"  peer.",[216,410,411],{"class":243},"send",[216,413,414],{"class":233},"(chunk);\n",[216,416,417,420,423,426,429,432,434,437],{"class":218,"line":266},[216,418,419],{"class":222},"  if",[216,421,422],{"class":233}," (peer.bufferedAmount ",[216,424,425],{"class":222},">",[216,427,428],{"class":259}," 1024",[216,430,431],{"class":222}," *",[216,433,428],{"class":259},[216,435,436],{"class":382}," \u002F* 1MB *\u002F",[216,438,439],{"class":233},") {\n",[216,441,442,445,448,451,454,457,459,461,464],{"class":218,"line":272},[216,443,444],{"class":222},"    await",[216,446,447],{"class":233}," peer.",[216,449,450],{"class":243},"waitForDrain",[216,452,453],{"class":233},"({ threshold: ",[216,455,456],{"class":259},"256",[216,458,431],{"class":222},[216,460,428],{"class":259},[216,462,463],{"class":382}," \u002F* 256KB *\u002F",[216,465,466],{"class":233}," });\n",[216,468,470],{"class":218,"line":469},6,[216,471,269],{"class":233},[216,473,475],{"class":218,"line":474},7,[216,476,275],{"class":233},[94,478,479,480,483,484,487,488,491,492,495,496,499],{},"It resolves immediately when there is no backpressure (or on adapters that do not report ",[107,481,482],{},"bufferedAmount","). Otherwise it polls every ",[107,485,486],{},"pollInterval"," ms (default ",[107,489,490],{},"100",") until the buffer drains, and also resolves early if the connection is no longer open so a send loop never hangs on a dropped client. Pass a ",[107,493,494],{},"signal"," (e.g. ",[107,497,498],{},"AbortSignal.timeout(ms)",") to abort the wait — the promise then rejects with the signal's reason.",[501,502,503],"tip",{},[94,504,505,506,508,509,515,516,322],{},"\nFor event-driven backpressure (instead of ",[107,507,371],{},"ing in a loop), use the ",[114,510,511,514],{"href":13},[107,512,513],{},"drain"," hook"," together with ",[107,517,304],{},[103,519,521],{"id":520},"peersubscribetopic",[107,522,523],{},"peer.subscribe(topic)",[94,525,526],{},"Join a broadcast topic.",[528,529],"read-more",{"to":28},[103,531,533],{"id":532},"peerunsubscribetopic",[107,534,535],{},"peer.unsubscribe(topic)",[94,537,538],{},"Leave a broadcast topic.",[528,540],{"to":28},[103,542,544],{"id":543},"peerpublishtopic-message",[107,545,546],{},"peer.publish(topic, message)",[94,548,549],{},"Broadcast a message to the topic. The peer that the publish is called on itself is always excluded from the broadcast.",[528,551],{"to":28},[103,553,555],{"id":554},"peerclosecode-number",[107,556,557],{},"peer.close(code?, number?)",[94,559,560],{},"Gracefully closes the connection.",[94,562,563],{},"Here is a list of close codes:",[565,566,567,574,580,586,592,598],"ul",{},[568,569,570,573],"li",{},[107,571,572],{},"1000"," means \"normal closure\" (default)",[568,575,576,579],{},[107,577,578],{},"1009"," means a message was too big and was rejected",[568,581,582,585],{},[107,583,584],{},"1011"," means the server encountered an error",[568,587,588,591],{},[107,589,590],{},"1012"," means the server is restarting",[568,593,594,597],{},[107,595,596],{},"1013"," means the server is too busy or the client is rate-limited",[568,599,600,603,604,607],{},[107,601,602],{},"4000"," through ",[107,605,606],{},"4999"," are reserved for applications (you can use it!)",[94,609,610,611,322],{},"To close the connection abruptly, use ",[107,612,613],{},"peer.terminate()",[103,615,617],{"id":616},"peerterminate",[107,618,613],{},[94,620,621],{},"Abruptly close the connection.",[94,623,624,625,322],{},"To gracefully close the connection, use ",[107,626,627],{},"peer.close()",[103,629,631],{"id":630},"peerpingdata",[107,632,633],{},"peer.ping(data?)",[94,635,636],{},"Send an application-level WebSocket ping control frame to the client.",[94,638,639,640,645,646,649],{},"Pair with the ",[114,641,642,514],{"href":13},[107,643,644],{},"pong"," — embedding a correlatable payload (e.g. a timestamp) in ",[107,647,648],{},"data"," — to measure round-trip latency:",[207,651,653],{"className":209,"code":652,"language":211,"meta":212,"style":212},"import { defineHooks } from \"crossws\";\n\nconst hooks = defineHooks({\n  message(peer, message) {\n    if (message.text() === \"measure-latency\") {\n      \u002F\u002F Embed the send time in the ping payload; the client echoes it back\n      \u002F\u002F in the pong so it can be told apart from keepalive pongs.\n      peer.ping(`rtt:${Date.now()}`);\n    }\n  },\n  pong(peer, data) {\n    const payload = new TextDecoder().decode(data);\n    if (!payload.startsWith(\"rtt:\")) return; \u002F\u002F keepalive or unrelated pong\n    const rtt = Date.now() - Number(payload.slice(4));\n    console.log(`[ws] round-trip latency: ${rtt}ms`);\n  },\n});\n",[107,654,655,671,677,693,712,734,739,744,775,781,787,803,829,862,899,921,926],{"__ignoreMap":212},[216,656,657,660,663,666,668],{"class":218,"line":219},[216,658,659],{"class":222},"import",[216,661,662],{"class":233}," { defineHooks } ",[216,664,665],{"class":222},"from",[216,667,230],{"class":229},[216,669,670],{"class":233},";\n",[216,672,673],{"class":218,"line":237},[216,674,676],{"emptyLinePlaceholder":675},true,"\n",[216,678,679,681,684,687,690],{"class":218,"line":249},[216,680,394],{"class":222},[216,682,683],{"class":259}," hooks",[216,685,686],{"class":222}," =",[216,688,689],{"class":243}," defineHooks",[216,691,692],{"class":233},"({\n",[216,694,695,698,701,704,707,710],{"class":218,"line":266},[216,696,697],{"class":243},"  message",[216,699,700],{"class":233},"(",[216,702,703],{"class":252},"peer",[216,705,706],{"class":233},", ",[216,708,709],{"class":252},"message",[216,711,439],{"class":233},[216,713,714,717,720,723,726,729,732],{"class":218,"line":272},[216,715,716],{"class":222},"    if",[216,718,719],{"class":233}," (message.",[216,721,722],{"class":243},"text",[216,724,725],{"class":233},"() ",[216,727,728],{"class":222},"===",[216,730,731],{"class":229}," \"measure-latency\"",[216,733,439],{"class":233},[216,735,736],{"class":218,"line":469},[216,737,738],{"class":382},"      \u002F\u002F Embed the send time in the ping payload; the client echoes it back\n",[216,740,741],{"class":218,"line":474},[216,742,743],{"class":382},"      \u002F\u002F in the pong so it can be told apart from keepalive pongs.\n",[216,745,747,750,753,755,758,761,763,766,769,772],{"class":218,"line":746},8,[216,748,749],{"class":233},"      peer.",[216,751,752],{"class":243},"ping",[216,754,700],{"class":233},[216,756,757],{"class":229},"`rtt:${",[216,759,760],{"class":233},"Date",[216,762,322],{"class":229},[216,764,765],{"class":243},"now",[216,767,768],{"class":229},"()",[216,770,771],{"class":229},"}`",[216,773,774],{"class":233},");\n",[216,776,778],{"class":218,"line":777},9,[216,779,780],{"class":233},"    }\n",[216,782,784],{"class":218,"line":783},10,[216,785,786],{"class":233},"  },\n",[216,788,790,793,795,797,799,801],{"class":218,"line":789},11,[216,791,792],{"class":243},"  pong",[216,794,700],{"class":233},[216,796,703],{"class":252},[216,798,706],{"class":233},[216,800,648],{"class":252},[216,802,439],{"class":233},[216,804,806,809,812,814,817,820,823,826],{"class":218,"line":805},12,[216,807,808],{"class":222},"    const",[216,810,811],{"class":259}," payload",[216,813,686],{"class":222},[216,815,816],{"class":222}," new",[216,818,819],{"class":243}," TextDecoder",[216,821,822],{"class":233},"().",[216,824,825],{"class":243},"decode",[216,827,828],{"class":233},"(data);\n",[216,830,832,834,836,839,842,845,847,850,853,856,859],{"class":218,"line":831},13,[216,833,716],{"class":222},[216,835,391],{"class":233},[216,837,838],{"class":222},"!",[216,840,841],{"class":233},"payload.",[216,843,844],{"class":243},"startsWith",[216,846,700],{"class":233},[216,848,849],{"class":229},"\"rtt:\"",[216,851,852],{"class":233},")) ",[216,854,855],{"class":222},"return",[216,857,858],{"class":233},"; ",[216,860,861],{"class":382},"\u002F\u002F keepalive or unrelated pong\n",[216,863,865,867,870,872,875,877,879,882,885,888,891,893,896],{"class":218,"line":864},14,[216,866,808],{"class":222},[216,868,869],{"class":259}," rtt",[216,871,686],{"class":222},[216,873,874],{"class":233}," Date.",[216,876,765],{"class":243},[216,878,725],{"class":233},[216,880,881],{"class":222},"-",[216,883,884],{"class":243}," Number",[216,886,887],{"class":233},"(payload.",[216,889,890],{"class":243},"slice",[216,892,700],{"class":233},[216,894,895],{"class":259},"4",[216,897,898],{"class":233},"));\n",[216,900,902,905,908,910,913,916,919],{"class":218,"line":901},15,[216,903,904],{"class":233},"    console.",[216,906,907],{"class":243},"log",[216,909,700],{"class":233},[216,911,912],{"class":229},"`[ws] round-trip latency: ${",[216,914,915],{"class":233},"rtt",[216,917,918],{"class":229},"}ms`",[216,920,774],{"class":233},[216,922,924],{"class":218,"line":923},16,[216,925,786],{"class":233},[216,927,929],{"class":218,"line":928},17,[216,930,931],{"class":233},"});\n",[94,933,934,935,939],{},"Use the ",[114,936,937,514],{"href":13},[107,938,752],{}," to observe pings the client sends unprompted (e.g. a graphql-ws style client heartbeat).",[131,941,942],{},[94,943,944,945,947,948,954,955,958,959,962],{},"\nThe ",[107,946,644],{}," hook also fires for the pongs the client sends in reply to the adapter's own internal keepalive pings (see ",[114,949,951],{"href":950},"\u002Fadapters#idletimeout",[107,952,953],{},"idleTimeout","), not only your ",[107,956,957],{},"peer.ping()"," calls. To measure RTT reliably, embed a correlatable payload in ",[107,960,961],{},"peer.ping(data)"," and ignore pongs that don't carry it (as above) rather than relying on a shared timestamp that any pong would consume.",[131,964,965],{},[94,966,967,968,970,971,973,974,322],{},"\nNot all adapters can send a ping frame, or surface inbound ping\u002Fpong frames to the ",[107,969,752],{},"\u002F",[107,972,644],{}," hooks. Refer to the ",[114,975,145],{"href":144},[98,977,979],{"id":978},"compatibility","Compatibility",[981,982,983,1026],"table",{},[984,985,986],"thead",{},[987,988,989,992,996,1000,1006,1010,1015,1021],"tr",{},[990,991],"th",{},[990,993,994],{},[114,995,59],{"href":60},[990,997,998],{},[114,999,69],{"href":70},[990,1001,1002],{},[114,1003,1005],{"href":1004},"\u002Fadapters\u002Fcloudflare#durable-objects","Cloudflare (durable)",[990,1007,1008],{},[114,1009,74],{"href":75},[990,1011,1012],{},[114,1013,1014],{"href":80},"Node (ws)",[990,1016,1017],{},[114,1018,1020],{"href":1019},"\u002Fadapters\u002Fnode#uwebsockets","Node (μWebSockets)",[990,1022,1023],{},[114,1024,84],{"href":1025},"adapters\u002Fsse",[1027,1028,1029,1052,1107,1128,1163,1204,1249,1296,1342,1385,1406,1427,1474,1534,1569,1604],"tbody",{},[987,1030,1031,1037,1040,1042,1044,1046,1048,1050],{},[1032,1033,1034],"td",{},[107,1035,1036],{},"send()",[1032,1038,1039],{},"✓",[1032,1041,1039],{},[1032,1043,1039],{},[1032,1045,1039],{},[1032,1047,1039],{},[1032,1049,1039],{},[1032,1051,1039],{},[987,1053,1054,1063,1065,1068,1081,1089,1097,1099],{},[1032,1055,1056,1059,1060],{},[107,1057,1058],{},"publish()"," \u002F ",[107,1061,1062],{},"subscribe()",[1032,1064,1039],{},[1032,1066,1067],{},"⨉",[1032,1069,1070,1071],{},"✓ ",[1072,1073,1074],"sup",{},[114,1075,1080],{"href":1076,"ariaDescribedBy":1077,"dataFootnoteRef":212,"id":1079},"#user-content-fn-1",[1078],"footnote-label","user-content-fnref-1","1",[1032,1082,1070,1083],{},[1072,1084,1085],{},[114,1086,1080],{"href":1076,"ariaDescribedBy":1087,"dataFootnoteRef":212,"id":1088},[1078],"user-content-fnref-1-2",[1032,1090,1070,1091],{},[1072,1092,1093],{},[114,1094,1080],{"href":1076,"ariaDescribedBy":1095,"dataFootnoteRef":212,"id":1096},[1078],"user-content-fnref-1-3",[1032,1098,1039],{},[1032,1100,1070,1101],{},[1072,1102,1103],{},[114,1104,1080],{"href":1076,"ariaDescribedBy":1105,"dataFootnoteRef":212,"id":1106},[1078],"user-content-fnref-1-4",[987,1108,1109,1114,1116,1118,1120,1122,1124,1126],{},[1032,1110,1111],{},[107,1112,1113],{},"close()",[1032,1115,1039],{},[1032,1117,1039],{},[1032,1119,1039],{},[1032,1121,1039],{},[1032,1123,1039],{},[1032,1125,1039],{},[1032,1127,1039],{},[987,1129,1130,1135,1137,1147,1149,1151,1153,1155],{},[1032,1131,1132],{},[107,1133,1134],{},"terminate()",[1032,1136,1039],{},[1032,1138,1070,1139],{},[1072,1140,1141],{},[114,1142,1146],{"href":1143,"ariaDescribedBy":1144,"dataFootnoteRef":212,"id":1145},"#user-content-fn-2",[1078],"user-content-fnref-2","2",[1032,1148,1039],{},[1032,1150,1039],{},[1032,1152,1039],{},[1032,1154,1039],{},[1032,1156,1070,1157],{},[1072,1158,1159],{},[114,1160,1146],{"href":1143,"ariaDescribedBy":1161,"dataFootnoteRef":212,"id":1162},[1078],"user-content-fnref-2-2",[987,1164,1165,1169,1171,1182,1190,1192,1194,1196],{},[1032,1166,1167],{},[107,1168,482],{},[1032,1170,1039],{},[1032,1172,1173,1174],{},"⨉ ",[1072,1175,1176],{},[114,1177,1181],{"href":1178,"ariaDescribedBy":1179,"dataFootnoteRef":212,"id":1180},"#user-content-fn-8",[1078],"user-content-fnref-8","3",[1032,1183,1173,1184],{},[1072,1185,1186],{},[114,1187,1181],{"href":1178,"ariaDescribedBy":1188,"dataFootnoteRef":212,"id":1189},[1078],"user-content-fnref-8-2",[1032,1191,1039],{},[1032,1193,1039],{},[1032,1195,1039],{},[1032,1197,1173,1198],{},[1072,1199,1200],{},[114,1201,1181],{"href":1178,"ariaDescribedBy":1202,"dataFootnoteRef":212,"id":1203},[1078],"user-content-fnref-8-3",[987,1205,1206,1210,1212,1221,1229,1237,1239,1241],{},[1032,1207,1208,514],{},[107,1209,513],{},[1032,1211,1039],{},[1032,1213,1173,1214],{},[1072,1215,1216],{},[114,1217,895],{"href":1218,"ariaDescribedBy":1219,"dataFootnoteRef":212,"id":1220},"#user-content-fn-9",[1078],"user-content-fnref-9",[1032,1222,1173,1223],{},[1072,1224,1225],{},[114,1226,895],{"href":1218,"ariaDescribedBy":1227,"dataFootnoteRef":212,"id":1228},[1078],"user-content-fnref-9-2",[1032,1230,1173,1231],{},[1072,1232,1233],{},[114,1234,895],{"href":1218,"ariaDescribedBy":1235,"dataFootnoteRef":212,"id":1236},[1078],"user-content-fnref-9-3",[1032,1238,1039],{},[1032,1240,1039],{},[1032,1242,1173,1243],{},[1072,1244,1245],{},[114,1246,895],{"href":1218,"ariaDescribedBy":1247,"dataFootnoteRef":212,"id":1248},[1078],"user-content-fnref-9-4",[987,1250,1251,1256,1258,1268,1276,1284,1286,1288],{},[1032,1252,1253],{},[107,1254,1255],{},"ping()",[1032,1257,1039],{},[1032,1259,1173,1260],{},[1072,1261,1262],{},[114,1263,1267],{"href":1264,"ariaDescribedBy":1265,"dataFootnoteRef":212,"id":1266},"#user-content-fn-10",[1078],"user-content-fnref-10","5",[1032,1269,1173,1270],{},[1072,1271,1272],{},[114,1273,1267],{"href":1264,"ariaDescribedBy":1274,"dataFootnoteRef":212,"id":1275},[1078],"user-content-fnref-10-2",[1032,1277,1173,1278],{},[1072,1279,1280],{},[114,1281,1267],{"href":1264,"ariaDescribedBy":1282,"dataFootnoteRef":212,"id":1283},[1078],"user-content-fnref-10-3",[1032,1285,1039],{},[1032,1287,1039],{},[1032,1289,1173,1290],{},[1072,1291,1292],{},[114,1293,1267],{"href":1264,"ariaDescribedBy":1294,"dataFootnoteRef":212,"id":1295},[1078],"user-content-fnref-10-4",[987,1297,1298,1304,1306,1314,1322,1330,1332,1334],{},[1032,1299,1300,1059,1302,683],{},[107,1301,752],{},[107,1303,644],{},[1032,1305,1039],{},[1032,1307,1173,1308],{},[1072,1309,1310],{},[114,1311,1267],{"href":1264,"ariaDescribedBy":1312,"dataFootnoteRef":212,"id":1313},[1078],"user-content-fnref-10-5",[1032,1315,1173,1316],{},[1072,1317,1318],{},[114,1319,1267],{"href":1264,"ariaDescribedBy":1320,"dataFootnoteRef":212,"id":1321},[1078],"user-content-fnref-10-6",[1032,1323,1173,1324],{},[1072,1325,1326],{},[114,1327,1267],{"href":1264,"ariaDescribedBy":1328,"dataFootnoteRef":212,"id":1329},[1078],"user-content-fnref-10-7",[1032,1331,1039],{},[1032,1333,1039],{},[1032,1335,1173,1336],{},[1072,1337,1338],{},[114,1339,1267],{"href":1264,"ariaDescribedBy":1340,"dataFootnoteRef":212,"id":1341},[1078],"user-content-fnref-10-8",[987,1343,1344,1349,1351,1353,1363,1365,1375,1383],{},[1032,1345,1346],{},[107,1347,1348],{},"request",[1032,1350,1039],{},[1032,1352,1039],{},[1032,1354,1070,1355],{},[1072,1356,1357],{},[114,1358,1362],{"href":1359,"ariaDescribedBy":1360,"dataFootnoteRef":212,"id":1361},"#user-content-fn-30",[1078],"user-content-fnref-30","6",[1032,1364,1039],{},[1032,1366,1070,1367],{},[1072,1368,1369],{},[114,1370,1374],{"href":1371,"ariaDescribedBy":1372,"dataFootnoteRef":212,"id":1373},"#user-content-fn-31",[1078],"user-content-fnref-31","7",[1032,1376,1070,1377],{},[1072,1378,1379],{},[114,1380,1374],{"href":1371,"ariaDescribedBy":1381,"dataFootnoteRef":212,"id":1382},[1078],"user-content-fnref-31-2",[1032,1384,1039],{},[987,1386,1387,1392,1394,1396,1398,1400,1402,1404],{},[1032,1388,1389],{},[107,1390,1391],{},"remoteAddress",[1032,1393,1039],{},[1032,1395,1067],{},[1032,1397,1067],{},[1032,1399,1039],{},[1032,1401,1039],{},[1032,1403,1039],{},[1032,1405,1067],{},[987,1407,1408,1413,1415,1417,1419,1421,1423,1425],{},[1032,1409,1410],{},[107,1411,1412],{},"websocket.url",[1032,1414,1039],{},[1032,1416,1039],{},[1032,1418,1039],{},[1032,1420,1039],{},[1032,1422,1039],{},[1032,1424,1039],{},[1032,1426,1039],{},[987,1428,1429,1434,1444,1446,1448,1456,1464,1472],{},[1032,1430,1431],{},[107,1432,1433],{},"websocket.extensions",[1032,1435,1070,1436],{},[1072,1437,1438],{},[114,1439,1443],{"href":1440,"ariaDescribedBy":1441,"dataFootnoteRef":212,"id":1442},"#user-content-fn-4",[1078],"user-content-fnref-4","8",[1032,1445,1067],{},[1032,1447,1067],{},[1032,1449,1070,1450],{},[1072,1451,1452],{},[114,1453,1443],{"href":1440,"ariaDescribedBy":1454,"dataFootnoteRef":212,"id":1455},[1078],"user-content-fnref-4-2",[1032,1457,1070,1458],{},[1072,1459,1460],{},[114,1461,1443],{"href":1440,"ariaDescribedBy":1462,"dataFootnoteRef":212,"id":1463},[1078],"user-content-fnref-4-3",[1032,1465,1070,1466],{},[1072,1467,1468],{},[114,1469,1443],{"href":1440,"ariaDescribedBy":1470,"dataFootnoteRef":212,"id":1471},[1078],"user-content-fnref-4-4",[1032,1473,1067],{},[987,1475,1476,1481,1491,1499,1507,1516,1524,1532],{},[1032,1477,1478],{},[107,1479,1480],{},"websocket.protocol",[1032,1482,1070,1483],{},[1072,1484,1485],{},[114,1486,1490],{"href":1487,"ariaDescribedBy":1488,"dataFootnoteRef":212,"id":1489},"#user-content-fn-5",[1078],"user-content-fnref-5","9",[1032,1492,1070,1493],{},[1072,1494,1495],{},[114,1496,1490],{"href":1487,"ariaDescribedBy":1497,"dataFootnoteRef":212,"id":1498},[1078],"user-content-fnref-5-2",[1032,1500,1070,1501],{},[1072,1502,1503],{},[114,1504,1490],{"href":1487,"ariaDescribedBy":1505,"dataFootnoteRef":212,"id":1506},[1078],"user-content-fnref-5-3",[1032,1508,1509,1515],{},[1072,1510,1511],{},[114,1512,1490],{"href":1487,"ariaDescribedBy":1513,"dataFootnoteRef":212,"id":1514},[1078],"user-content-fnref-5-4"," ✓",[1032,1517,1070,1518],{},[1072,1519,1520],{},[114,1521,1490],{"href":1487,"ariaDescribedBy":1522,"dataFootnoteRef":212,"id":1523},[1078],"user-content-fnref-5-5",[1032,1525,1070,1526],{},[1072,1527,1528],{},[114,1529,1490],{"href":1487,"ariaDescribedBy":1530,"dataFootnoteRef":212,"id":1531},[1078],"user-content-fnref-5-6",[1032,1533,1067],{},[987,1535,1536,1541,1543,1545,1547,1549,1551,1561],{},[1032,1537,1538],{},[107,1539,1540],{},"websocket.readyState",[1032,1542,1039],{},[1032,1544,1039],{},[1032,1546,1039],{},[1032,1548,1039],{},[1032,1550,1039],{},[1032,1552,1070,1553],{},[1072,1554,1555],{},[114,1556,1560],{"href":1557,"ariaDescribedBy":1558,"dataFootnoteRef":212,"id":1559},"#user-content-fn-6",[1078],"user-content-fnref-6","10",[1032,1562,1070,1563],{},[1072,1564,1565],{},[114,1566,1560],{"href":1557,"ariaDescribedBy":1567,"dataFootnoteRef":212,"id":1568},[1078],"user-content-fnref-6-2",[987,1570,1571,1576,1586,1588,1590,1592,1600,1602],{},[1032,1572,1573],{},[107,1574,1575],{},"websocket.binaryType",[1032,1577,1070,1578],{},[1072,1579,1580],{},[114,1581,1585],{"href":1582,"ariaDescribedBy":1583,"dataFootnoteRef":212,"id":1584},"#user-content-fn-7",[1078],"user-content-fnref-7","11",[1032,1587,1067],{},[1032,1589,1067],{},[1032,1591,1039],{},[1032,1593,1070,1594],{},[1072,1595,1596],{},[114,1597,1585],{"href":1582,"ariaDescribedBy":1598,"dataFootnoteRef":212,"id":1599},[1078],"user-content-fnref-7-2",[1032,1601,1039],{},[1032,1603,1067],{},[987,1605,1606,1611,1613,1615,1617,1619,1621,1623],{},[1032,1607,1608],{},[107,1609,1610],{},"websocket.bufferedAmount",[1032,1612,1067],{},[1032,1614,1067],{},[1032,1616,1067],{},[1032,1618,1039],{},[1032,1620,1039],{},[1032,1622,1039],{},[1032,1624,1067],{},[1626,1627,1630,1635],"section",{"className":1628,"dataFootnotes":212},[1629],"footnotes",[98,1631,1634],{"className":1632,"id":1078},[1633],"sr-only","Footnotes",[1636,1637,1638,1671,1689,1718,1753,1811,1827,1854,1898,1953,1975],"ol",{},[568,1639,1641,1642,1649,1650,1649,1657,1649,1664],{"id":1640},"user-content-fn-1","pubsub is not natively handled by runtime. peers are internally tracked. ",[114,1643,1648],{"href":1644,"ariaLabel":1645,"className":1646,"dataFootnoteBackref":212},"#user-content-fnref-1","Back to reference 1",[1647],"data-footnote-backref","↩"," ",[114,1651,1648,1655],{"href":1652,"ariaLabel":1653,"className":1654,"dataFootnoteBackref":212},"#user-content-fnref-1-2","Back to reference 1-2",[1647],[1072,1656,1146],{},[114,1658,1648,1662],{"href":1659,"ariaLabel":1660,"className":1661,"dataFootnoteBackref":212},"#user-content-fnref-1-3","Back to reference 1-3",[1647],[1072,1663,1181],{},[114,1665,1648,1669],{"href":1666,"ariaLabel":1667,"className":1668,"dataFootnoteBackref":212},"#user-content-fnref-1-4","Back to reference 1-4",[1647],[1072,1670,895],{},[568,1672,1674,1676,1677,1649,1682],{"id":1673},"user-content-fn-2",[107,1675,1113],{}," will be used for compatibility. ",[114,1678,1648],{"href":1679,"ariaLabel":1680,"className":1681,"dataFootnoteBackref":212},"#user-content-fnref-2","Back to reference 2",[1647],[114,1683,1648,1687],{"href":1684,"ariaLabel":1685,"className":1686,"dataFootnoteBackref":212},"#user-content-fnref-2-2","Back to reference 2-2",[1647],[1072,1688,1146],{},[568,1690,1692,1693,1695,1696,1698,1699,1649,1704,1649,1711],{"id":1691},"user-content-fn-8","The runtime exposes no send-buffer signal, so ",[107,1694,304],{}," reports ",[107,1697,330],{},". (Cloudflare buffers and applies backpressure internally; SSE has no equivalent.) ",[114,1700,1648],{"href":1701,"ariaLabel":1702,"className":1703,"dataFootnoteBackref":212},"#user-content-fnref-8","Back to reference 3",[1647],[114,1705,1648,1709],{"href":1706,"ariaLabel":1707,"className":1708,"dataFootnoteBackref":212},"#user-content-fnref-8-2","Back to reference 3-2",[1647],[1072,1710,1146],{},[114,1712,1648,1716],{"href":1713,"ariaLabel":1714,"className":1715,"dataFootnoteBackref":212},"#user-content-fnref-8-3","Back to reference 3-3",[1647],[1072,1717,1181],{},[568,1719,1721,1722,1726,1727,1649,1732,1649,1739,1649,1746],{"id":1720},"user-content-fn-9","The runtime emits no drain signal. Poll ",[114,1723,1724],{"href":358},[107,1725,304],{}," instead where it is available. ",[114,1728,1648],{"href":1729,"ariaLabel":1730,"className":1731,"dataFootnoteBackref":212},"#user-content-fnref-9","Back to reference 4",[1647],[114,1733,1648,1737],{"href":1734,"ariaLabel":1735,"className":1736,"dataFootnoteBackref":212},"#user-content-fnref-9-2","Back to reference 4-2",[1647],[1072,1738,1146],{},[114,1740,1648,1744],{"href":1741,"ariaLabel":1742,"className":1743,"dataFootnoteBackref":212},"#user-content-fnref-9-3","Back to reference 4-3",[1647],[1072,1745,1181],{},[114,1747,1648,1751],{"href":1748,"ariaLabel":1749,"className":1750,"dataFootnoteBackref":212},"#user-content-fnref-9-4","Back to reference 4-4",[1647],[1072,1752,895],{},[568,1754,1756,1757,1649,1762,1649,1769,1649,1776,1649,1783,1649,1790,1649,1797,1649,1804],{"id":1755},"user-content-fn-10","The runtime does not expose a ping\u002Fpong control-frame API to user code (pings\u002Fpongs are still handled transparently at the protocol level for liveness). ",[114,1758,1648],{"href":1759,"ariaLabel":1760,"className":1761,"dataFootnoteBackref":212},"#user-content-fnref-10","Back to reference 5",[1647],[114,1763,1648,1767],{"href":1764,"ariaLabel":1765,"className":1766,"dataFootnoteBackref":212},"#user-content-fnref-10-2","Back to reference 5-2",[1647],[1072,1768,1146],{},[114,1770,1648,1774],{"href":1771,"ariaLabel":1772,"className":1773,"dataFootnoteBackref":212},"#user-content-fnref-10-3","Back to reference 5-3",[1647],[1072,1775,1181],{},[114,1777,1648,1781],{"href":1778,"ariaLabel":1779,"className":1780,"dataFootnoteBackref":212},"#user-content-fnref-10-4","Back to reference 5-4",[1647],[1072,1782,895],{},[114,1784,1648,1788],{"href":1785,"ariaLabel":1786,"className":1787,"dataFootnoteBackref":212},"#user-content-fnref-10-5","Back to reference 5-5",[1647],[1072,1789,1267],{},[114,1791,1648,1795],{"href":1792,"ariaLabel":1793,"className":1794,"dataFootnoteBackref":212},"#user-content-fnref-10-6","Back to reference 5-6",[1647],[1072,1796,1362],{},[114,1798,1648,1802],{"href":1799,"ariaLabel":1800,"className":1801,"dataFootnoteBackref":212},"#user-content-fnref-10-7","Back to reference 5-7",[1647],[1072,1803,1374],{},[114,1805,1648,1809],{"href":1806,"ariaLabel":1807,"className":1808,"dataFootnoteBackref":212},"#user-content-fnref-10-8","Back to reference 5-8",[1647],[1072,1810,1443],{},[568,1812,1814,1815,1818,1819,1821,1822],{"id":1813},"user-content-fn-30","After durable object's hibernation, only ",[107,1816,1817],{},"request.url"," (and ",[107,1820,109],{},") remain available due to 2048 byte in-memory state limit. ",[114,1823,1648],{"href":1824,"ariaLabel":1825,"className":1826,"dataFootnoteBackref":212},"#user-content-fnref-30","Back to reference 6",[1647],[568,1828,1830,1831,1834,1835,706,1838,1841,1842,1649,1847],{"id":1829},"user-content-fn-31","using a proxy for ",[114,1832,140],{"href":138,"rel":1833},[118]," compatible interface (",[107,1836,1837],{},"url",[107,1839,1840],{},"headers"," only) wrapping Node.js requests. ",[114,1843,1648],{"href":1844,"ariaLabel":1845,"className":1846,"dataFootnoteBackref":212},"#user-content-fnref-31","Back to reference 7",[1647],[114,1848,1648,1852],{"href":1849,"ariaLabel":1850,"className":1851,"dataFootnoteBackref":212},"#user-content-fnref-31-2","Back to reference 7-2",[1647],[1072,1853,1146],{},[568,1855,1857,1863,1864,1871,1872,1649,1877,1649,1884,1649,1891],{"id":1856},"user-content-fn-4",[114,1858,1861],{"href":1859,"rel":1860},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWebSocket\u002Fextensions",[118],[107,1862,1433],{}," is polyfilled using ",[114,1865,1868],{"href":1866,"rel":1867},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FProtocol_upgrade_mechanism#websocket-specific_headers",[118],[107,1869,1870],{},"sec-websocket-extensions"," request header. ",[114,1873,1648],{"href":1874,"ariaLabel":1875,"className":1876,"dataFootnoteBackref":212},"#user-content-fnref-4","Back to reference 8",[1647],[114,1878,1648,1882],{"href":1879,"ariaLabel":1880,"className":1881,"dataFootnoteBackref":212},"#user-content-fnref-4-2","Back to reference 8-2",[1647],[1072,1883,1146],{},[114,1885,1648,1889],{"href":1886,"ariaLabel":1887,"className":1888,"dataFootnoteBackref":212},"#user-content-fnref-4-3","Back to reference 8-3",[1647],[1072,1890,1181],{},[114,1892,1648,1896],{"href":1893,"ariaLabel":1894,"className":1895,"dataFootnoteBackref":212},"#user-content-fnref-4-4","Back to reference 8-4",[1647],[1072,1897,895],{},[568,1899,1901,1863,1907,1871,1913,1649,1918,1649,1925,1649,1932,1649,1939,1649,1946],{"id":1900},"user-content-fn-5",[114,1902,1905],{"href":1903,"rel":1904},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWebSocket\u002Fprotocol",[118],[107,1906,1480],{},[114,1908,1910],{"href":1866,"rel":1909},[118],[107,1911,1912],{},"sec-websocket-protocol",[114,1914,1648],{"href":1915,"ariaLabel":1916,"className":1917,"dataFootnoteBackref":212},"#user-content-fnref-5","Back to reference 9",[1647],[114,1919,1648,1923],{"href":1920,"ariaLabel":1921,"className":1922,"dataFootnoteBackref":212},"#user-content-fnref-5-2","Back to reference 9-2",[1647],[1072,1924,1146],{},[114,1926,1648,1930],{"href":1927,"ariaLabel":1928,"className":1929,"dataFootnoteBackref":212},"#user-content-fnref-5-3","Back to reference 9-3",[1647],[1072,1931,1181],{},[114,1933,1648,1937],{"href":1934,"ariaLabel":1935,"className":1936,"dataFootnoteBackref":212},"#user-content-fnref-5-4","Back to reference 9-4",[1647],[1072,1938,895],{},[114,1940,1648,1944],{"href":1941,"ariaLabel":1942,"className":1943,"dataFootnoteBackref":212},"#user-content-fnref-5-5","Back to reference 9-5",[1647],[1072,1945,1267],{},[114,1947,1648,1951],{"href":1948,"ariaLabel":1949,"className":1950,"dataFootnoteBackref":212},"#user-content-fnref-5-6","Back to reference 9-6",[1647],[1072,1952,1362],{},[568,1954,1956,1962,1963,1649,1968],{"id":1955},"user-content-fn-6",[114,1957,1960],{"href":1958,"rel":1959},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWebSocket\u002FreadyState",[118],[107,1961,1540],{}," is polyfilled by tracking open\u002Fclose events. ",[114,1964,1648],{"href":1965,"ariaLabel":1966,"className":1967,"dataFootnoteBackref":212},"#user-content-fnref-6","Back to reference 10",[1647],[114,1969,1648,1973],{"href":1970,"ariaLabel":1971,"className":1972,"dataFootnoteBackref":212},"#user-content-fnref-6-2","Back to reference 10-2",[1647],[1072,1974,1146],{},[568,1976,1978,1979,1982,1983,1986,1987,1993,1994,1649,1999],{"id":1977},"user-content-fn-7","Some runtimes have non standard values including ",[107,1980,1981],{},"\"nodebuffer\""," and ",[107,1984,1985],{},"\"uint8array\"",". crossws auto converts them for ",[114,1988,1990],{"href":1989},"\u002Fguide\u002Fmessage#messagedata",[107,1991,1992],{},"message.data",". ",[114,1995,1648],{"href":1996,"ariaLabel":1997,"className":1998,"dataFootnoteBackref":212},"#user-content-fnref-7","Back to reference 11",[1647],[114,2000,1648,2004],{"href":2001,"ariaLabel":2002,"className":2003,"dataFootnoteBackref":212},"#user-content-fnref-7-2","Back to reference 11-2",[1647],[1072,2005,1146],{},[2007,2008,2009],"style",{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}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 pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}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":212,"searchDepth":237,"depth":237,"links":2011},[2012,2022,2032,2033],{"id":100,"depth":237,"text":101,"children":2013},[2014,2015,2016,2017,2018,2019,2020,2021],{"id":105,"depth":249,"text":109},{"id":123,"depth":249,"text":126},{"id":149,"depth":249,"text":152},{"id":165,"depth":249,"text":168},{"id":192,"depth":249,"text":195},{"id":283,"depth":249,"text":286},{"id":292,"depth":249,"text":295},{"id":301,"depth":249,"text":304},{"id":336,"depth":237,"text":337,"children":2023},[2024,2025,2026,2027,2028,2029,2030,2031],{"id":340,"depth":249,"text":343},{"id":349,"depth":249,"text":352},{"id":520,"depth":249,"text":523},{"id":532,"depth":249,"text":535},{"id":543,"depth":249,"text":546},{"id":554,"depth":249,"text":557},{"id":616,"depth":249,"text":613},{"id":630,"depth":249,"text":633},{"id":978,"depth":237,"text":979},{"id":1078,"depth":237,"text":1634},"Peer object allows easily interacting with connected clients.","md",{"icon":20},{"icon":20},{"title":17,"description":2034},"D8Ob4QNJdpvqdfEhOCMWXZOM3pxnUXgarOP5HQjP6MM",[2041,2043],{"title":12,"path":13,"stem":14,"description":2042,"icon":15,"children":-1},"Using hooks, you can define a WebSocket server that works across runtimes with the same syntax.",{"title":22,"path":23,"stem":24,"description":212,"icon":25,"children":-1},1783073589553]