[{"data":1,"prerenderedAt":1089},["ShallowReactive",2],{"navigation":3,"-guide-hooks":83,"-guide-hooks-surround":1085},[4,46],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Guide","\u002Fguide","1.guide\u002F1.index",[9,11,16,21,26,31,36,41],{"title":5,"path":6,"stem":7,"icon":10},"ph:book-open-duotone",{"title":12,"path":13,"stem":14,"icon":15},"Hooks","\u002Fguide\u002Fhooks","1.guide\u002F2.hooks","material-symbols-light:data-object",{"title":17,"path":18,"stem":19,"icon":20},"Peer","\u002Fguide\u002Fpeer","1.guide\u002F3.peer","mynaui:api",{"title":22,"path":23,"stem":24,"icon":25},"Message","\u002Fguide\u002Fmessage","1.guide\u002F4.message","solar:letter-line-duotone",{"title":27,"path":28,"stem":29,"icon":30},"Pub \u002F Sub","\u002Fguide\u002Fpubsub","1.guide\u002F5.pubsub","simple-icons:googlepubsub",{"title":32,"path":33,"stem":34,"icon":35},"Sync Backplane","\u002Fguide\u002Fsync","1.guide\u002F6.sync","tabler:refresh",{"title":37,"path":38,"stem":39,"icon":40},"Resolver API","\u002Fguide\u002Fresolver","1.guide\u002F7.resolver","tabler:route",{"title":42,"path":43,"stem":44,"icon":45},"WebSocket Proxy","\u002Fguide\u002Fproxy","1.guide\u002F8.proxy","tabler:arrows-exchange",{"title":47,"path":48,"stem":49,"children":50,"icon":52},"Adapters","\u002Fadapters","2.adapters\u002F1.index",[51,53,58,63,68,73,78],{"title":47,"path":48,"stem":49,"icon":52},"emojione-monotone:electric-plug",{"title":54,"path":55,"stem":56,"icon":57},"Bun","\u002Fadapters\u002Fbun","2.adapters\u002Fbun","simple-icons:bun",{"title":59,"path":60,"stem":61,"icon":62},"Bunny","\u002Fadapters\u002Fbunny","2.adapters\u002Fbunny","mdi:rabbit",{"title":64,"path":65,"stem":66,"icon":67},"Cloudflare","\u002Fadapters\u002Fcloudflare","2.adapters\u002Fcloudflare","devicon-plain:cloudflareworkers",{"title":69,"path":70,"stem":71,"icon":72},"Deno","\u002Fadapters\u002Fdeno","2.adapters\u002Fdeno","teenyicons:deno-solid",{"title":74,"path":75,"stem":76,"icon":77},"Node.js","\u002Fadapters\u002Fnode","2.adapters\u002Fnode","akar-icons:node-fill",{"title":79,"path":80,"stem":81,"icon":82},"SSE","\u002Fadapters\u002Fsse","2.adapters\u002Fsse","clarity:two-way-arrows-line",{"id":84,"title":12,"body":85,"description":1079,"extension":1080,"meta":1081,"navigation":1082,"path":13,"seo":1083,"stem":14,"__hash__":1084},"content\u002F1.guide\u002F2.hooks.md",{"type":86,"value":87,"toc":1075,"icon":15},"minimark",[88,92,103,512,517,531,540,706,710,726,1071],[89,90,91],"p",{},"Crossws provides a cross-platform API to define WebSocket servers. An implementation with these hooks works across runtimes without needing you to go into details of each of them. You only define the life-cycle hooks that you only need.",[93,94,95],"tip",{},[89,96,97,98,102],{},"\nUsing ",[99,100,101],"code",{},"defineHooks()"," wrapper is optional and for type support and code auto completion.",[104,105,110],"pre",{"className":106,"code":107,"language":108,"meta":109,"style":109},"language-ts shiki shiki-themes github-light github-dark github-dark","import { defineHooks } from \"crossws\";\n\nconst hooks = defineHooks({\n  upgrade(req) {\n    console.log(`[ws] upgrading ${req.url}...`);\n    return {\n      \u002F\u002F namespace: new URL(req.url).pathname\n      headers: {},\n    };\n  },\n\n  open(peer) {\n    console.log(`[ws] open: ${peer}`);\n  },\n\n  message(peer, message) {\n    console.log(\"[ws] message\", peer, message);\n    if (message.text().includes(\"ping\")) {\n      peer.send(\"pong\");\n    }\n  },\n\n  close(peer, details) {\n    console.log(\"[ws] close\", peer, details);\n  },\n\n  error(peer, error) {\n    console.log(\"[ws] error\", peer, error);\n  },\n\n  drain(peer) {\n    \u002F\u002F Send buffer drained after backpressure — safe to resume sending.\n    \u002F\u002F Pair with `peer.bufferedAmount`. Not all adapters emit this.\n    console.log(\"[ws] drain\", peer);\n  },\n});\n","ts","",[99,111,112,135,142,162,178,206,215,222,228,234,240,245,258,277,282,287,305,320,346,362,368,373,378,395,410,415,420,437,452,457,462,474,480,486,501,506],{"__ignoreMap":109},[113,114,117,121,125,128,132],"span",{"class":115,"line":116},"line",1,[113,118,120],{"class":119},"so5gQ","import",[113,122,124],{"class":123},"slsVL"," { defineHooks } ",[113,126,127],{"class":119},"from",[113,129,131],{"class":130},"sfrk1"," \"crossws\"",[113,133,134],{"class":123},";\n",[113,136,138],{"class":115,"line":137},2,[113,139,141],{"emptyLinePlaceholder":140},true,"\n",[113,143,145,148,152,155,159],{"class":115,"line":144},3,[113,146,147],{"class":119},"const",[113,149,151],{"class":150},"suiK_"," hooks",[113,153,154],{"class":119}," =",[113,156,158],{"class":157},"shcOC"," defineHooks",[113,160,161],{"class":123},"({\n",[113,163,165,168,171,175],{"class":115,"line":164},4,[113,166,167],{"class":157},"  upgrade",[113,169,170],{"class":123},"(",[113,172,174],{"class":173},"sQHwn","req",[113,176,177],{"class":123},") {\n",[113,179,181,184,187,189,192,194,197,200,203],{"class":115,"line":180},5,[113,182,183],{"class":123},"    console.",[113,185,186],{"class":157},"log",[113,188,170],{"class":123},[113,190,191],{"class":130},"`[ws] upgrading ${",[113,193,174],{"class":123},[113,195,196],{"class":130},".",[113,198,199],{"class":123},"url",[113,201,202],{"class":130},"}...`",[113,204,205],{"class":123},");\n",[113,207,209,212],{"class":115,"line":208},6,[113,210,211],{"class":119},"    return",[113,213,214],{"class":123}," {\n",[113,216,218],{"class":115,"line":217},7,[113,219,221],{"class":220},"sCsY4","      \u002F\u002F namespace: new URL(req.url).pathname\n",[113,223,225],{"class":115,"line":224},8,[113,226,227],{"class":123},"      headers: {},\n",[113,229,231],{"class":115,"line":230},9,[113,232,233],{"class":123},"    };\n",[113,235,237],{"class":115,"line":236},10,[113,238,239],{"class":123},"  },\n",[113,241,243],{"class":115,"line":242},11,[113,244,141],{"emptyLinePlaceholder":140},[113,246,248,251,253,256],{"class":115,"line":247},12,[113,249,250],{"class":157},"  open",[113,252,170],{"class":123},[113,254,255],{"class":173},"peer",[113,257,177],{"class":123},[113,259,261,263,265,267,270,272,275],{"class":115,"line":260},13,[113,262,183],{"class":123},[113,264,186],{"class":157},[113,266,170],{"class":123},[113,268,269],{"class":130},"`[ws] open: ${",[113,271,255],{"class":123},[113,273,274],{"class":130},"}`",[113,276,205],{"class":123},[113,278,280],{"class":115,"line":279},14,[113,281,239],{"class":123},[113,283,285],{"class":115,"line":284},15,[113,286,141],{"emptyLinePlaceholder":140},[113,288,290,293,295,297,300,303],{"class":115,"line":289},16,[113,291,292],{"class":157},"  message",[113,294,170],{"class":123},[113,296,255],{"class":173},[113,298,299],{"class":123},", ",[113,301,302],{"class":173},"message",[113,304,177],{"class":123},[113,306,308,310,312,314,317],{"class":115,"line":307},17,[113,309,183],{"class":123},[113,311,186],{"class":157},[113,313,170],{"class":123},[113,315,316],{"class":130},"\"[ws] message\"",[113,318,319],{"class":123},", peer, message);\n",[113,321,323,326,329,332,335,338,340,343],{"class":115,"line":322},18,[113,324,325],{"class":119},"    if",[113,327,328],{"class":123}," (message.",[113,330,331],{"class":157},"text",[113,333,334],{"class":123},"().",[113,336,337],{"class":157},"includes",[113,339,170],{"class":123},[113,341,342],{"class":130},"\"ping\"",[113,344,345],{"class":123},")) {\n",[113,347,349,352,355,357,360],{"class":115,"line":348},19,[113,350,351],{"class":123},"      peer.",[113,353,354],{"class":157},"send",[113,356,170],{"class":123},[113,358,359],{"class":130},"\"pong\"",[113,361,205],{"class":123},[113,363,365],{"class":115,"line":364},20,[113,366,367],{"class":123},"    }\n",[113,369,371],{"class":115,"line":370},21,[113,372,239],{"class":123},[113,374,376],{"class":115,"line":375},22,[113,377,141],{"emptyLinePlaceholder":140},[113,379,381,384,386,388,390,393],{"class":115,"line":380},23,[113,382,383],{"class":157},"  close",[113,385,170],{"class":123},[113,387,255],{"class":173},[113,389,299],{"class":123},[113,391,392],{"class":173},"details",[113,394,177],{"class":123},[113,396,398,400,402,404,407],{"class":115,"line":397},24,[113,399,183],{"class":123},[113,401,186],{"class":157},[113,403,170],{"class":123},[113,405,406],{"class":130},"\"[ws] close\"",[113,408,409],{"class":123},", peer, details);\n",[113,411,413],{"class":115,"line":412},25,[113,414,239],{"class":123},[113,416,418],{"class":115,"line":417},26,[113,419,141],{"emptyLinePlaceholder":140},[113,421,423,426,428,430,432,435],{"class":115,"line":422},27,[113,424,425],{"class":157},"  error",[113,427,170],{"class":123},[113,429,255],{"class":173},[113,431,299],{"class":123},[113,433,434],{"class":173},"error",[113,436,177],{"class":123},[113,438,440,442,444,446,449],{"class":115,"line":439},28,[113,441,183],{"class":123},[113,443,186],{"class":157},[113,445,170],{"class":123},[113,447,448],{"class":130},"\"[ws] error\"",[113,450,451],{"class":123},", peer, error);\n",[113,453,455],{"class":115,"line":454},29,[113,456,239],{"class":123},[113,458,460],{"class":115,"line":459},30,[113,461,141],{"emptyLinePlaceholder":140},[113,463,465,468,470,472],{"class":115,"line":464},31,[113,466,467],{"class":157},"  drain",[113,469,170],{"class":123},[113,471,255],{"class":173},[113,473,177],{"class":123},[113,475,477],{"class":115,"line":476},32,[113,478,479],{"class":220},"    \u002F\u002F Send buffer drained after backpressure — safe to resume sending.\n",[113,481,483],{"class":115,"line":482},33,[113,484,485],{"class":220},"    \u002F\u002F Pair with `peer.bufferedAmount`. Not all adapters emit this.\n",[113,487,489,491,493,495,498],{"class":115,"line":488},34,[113,490,183],{"class":123},[113,492,186],{"class":157},[113,494,170],{"class":123},[113,496,497],{"class":130},"\"[ws] drain\"",[113,499,500],{"class":123},", peer);\n",[113,502,504],{"class":115,"line":503},35,[113,505,239],{"class":123},[113,507,509],{"class":115,"line":508},36,[113,510,511],{"class":123},"});\n",[513,514,516],"h2",{"id":515},"context","Context",[89,518,519,520,522,523,526,527,530],{},"You can attach data to the connection by returning a ",[99,521,515],{}," object from the ",[99,524,525],{},"upgrade"," hook. This data is then available as ",[99,528,529],{},"peer.context"," in all other hooks for the lifetime of the connection.",[532,533,534],"note",{},[89,535,536,537,196],{},"\nContext can be volatile in some environments like ",[99,538,539],{},"cloudflare-durable",[104,541,543],{"className":106,"code":542,"language":108,"meta":109,"style":109},"import { defineHooks } from \"crossws\";\n\nconst hooks = defineHooks({\n  upgrade(req) {\n    return {\n      context: { data: \"myData\" },\n    };\n  },\n\n  open(peer) {\n    console.log(peer.context.data); \u002F\u002F myData\n  },\n\n  message(peer, message) {\n    console.log(peer.context.data); \u002F\u002F myData\n  },\n\n  close(peer, details) {\n    console.log(peer.context.data); \u002F\u002F myData\n  },\n});\n",[99,544,545,557,561,573,583,589,600,604,608,612,622,634,638,642,656,666,670,674,688,698,702],{"__ignoreMap":109},[113,546,547,549,551,553,555],{"class":115,"line":116},[113,548,120],{"class":119},[113,550,124],{"class":123},[113,552,127],{"class":119},[113,554,131],{"class":130},[113,556,134],{"class":123},[113,558,559],{"class":115,"line":137},[113,560,141],{"emptyLinePlaceholder":140},[113,562,563,565,567,569,571],{"class":115,"line":144},[113,564,147],{"class":119},[113,566,151],{"class":150},[113,568,154],{"class":119},[113,570,158],{"class":157},[113,572,161],{"class":123},[113,574,575,577,579,581],{"class":115,"line":164},[113,576,167],{"class":157},[113,578,170],{"class":123},[113,580,174],{"class":173},[113,582,177],{"class":123},[113,584,585,587],{"class":115,"line":180},[113,586,211],{"class":119},[113,588,214],{"class":123},[113,590,591,594,597],{"class":115,"line":208},[113,592,593],{"class":123},"      context: { data: ",[113,595,596],{"class":130},"\"myData\"",[113,598,599],{"class":123}," },\n",[113,601,602],{"class":115,"line":217},[113,603,233],{"class":123},[113,605,606],{"class":115,"line":224},[113,607,239],{"class":123},[113,609,610],{"class":115,"line":230},[113,611,141],{"emptyLinePlaceholder":140},[113,613,614,616,618,620],{"class":115,"line":236},[113,615,250],{"class":157},[113,617,170],{"class":123},[113,619,255],{"class":173},[113,621,177],{"class":123},[113,623,624,626,628,631],{"class":115,"line":242},[113,625,183],{"class":123},[113,627,186],{"class":157},[113,629,630],{"class":123},"(peer.context.data); ",[113,632,633],{"class":220},"\u002F\u002F myData\n",[113,635,636],{"class":115,"line":247},[113,637,239],{"class":123},[113,639,640],{"class":115,"line":260},[113,641,141],{"emptyLinePlaceholder":140},[113,643,644,646,648,650,652,654],{"class":115,"line":279},[113,645,292],{"class":157},[113,647,170],{"class":123},[113,649,255],{"class":173},[113,651,299],{"class":123},[113,653,302],{"class":173},[113,655,177],{"class":123},[113,657,658,660,662,664],{"class":115,"line":284},[113,659,183],{"class":123},[113,661,186],{"class":157},[113,663,630],{"class":123},[113,665,633],{"class":220},[113,667,668],{"class":115,"line":289},[113,669,239],{"class":123},[113,671,672],{"class":115,"line":307},[113,673,141],{"emptyLinePlaceholder":140},[113,675,676,678,680,682,684,686],{"class":115,"line":322},[113,677,383],{"class":157},[113,679,170],{"class":123},[113,681,255],{"class":173},[113,683,299],{"class":123},[113,685,392],{"class":173},[113,687,177],{"class":123},[113,689,690,692,694,696],{"class":115,"line":348},[113,691,183],{"class":123},[113,693,186],{"class":157},[113,695,630],{"class":123},[113,697,633],{"class":220},[113,699,700],{"class":115,"line":364},[113,701,239],{"class":123},[113,703,704],{"class":115,"line":370},[113,705,511],{"class":123},[513,707,709],{"id":708},"authentication","Authentication",[89,711,712,713,715,716,725],{},"During the ",[99,714,525],{}," hook it is possible to authenticate the user before upgrading the connection. If the user is not authenticated, you can return (or throw) a ",[717,718,722],"a",{"href":719,"rel":720},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FResponse",[721],"nofollow",[99,723,724],{},"Response"," to prevent the connection from being upgraded.",[104,727,729],{"className":106,"code":728,"language":108,"meta":109,"style":109},"import { defineHooks } from \"crossws\";\n\nconst hooks = defineHooks({\n  upgrade(req) {\n    const authHeader = req.headers.get(\"Authorization\");\n\n    if (!authHeader || !authHeader.startsWith(\"Basic \")) {\n      return new Response(\"Unauthorized\", {\n        status: 401,\n        headers: {\n          \"WWW-Authenticate\":\n            'Basic realm=\"Websocket Authentication\", charset=\"UTF-8\"',\n        },\n      });\n    }\n\n    const base64Credentials = authHeader.split(\" \")[1];\n    const [username, password] = atob(base64Credentials).split(\":\");\n\n    if (username !== \"myUsername\" || password !== \"myPassword\") {\n      return new Response(\"Unauthorized\", {\n        status: 401,\n        headers: {\n          \"WWW-Authenticate\":\n            'Basic realm=\"Websocket Authentication\", charset=\"UTF-8\"',\n        },\n      });\n    }\n\n    return {\n      headers: {}, \u002F\u002F Optionally return custom headers\n    };\n  },\n});\n",[99,730,731,743,747,759,769,792,796,828,847,858,863,871,878,883,888,892,896,925,961,965,991,1005,1013,1017,1023,1029,1033,1037,1041,1045,1051,1059,1063,1067],{"__ignoreMap":109},[113,732,733,735,737,739,741],{"class":115,"line":116},[113,734,120],{"class":119},[113,736,124],{"class":123},[113,738,127],{"class":119},[113,740,131],{"class":130},[113,742,134],{"class":123},[113,744,745],{"class":115,"line":137},[113,746,141],{"emptyLinePlaceholder":140},[113,748,749,751,753,755,757],{"class":115,"line":144},[113,750,147],{"class":119},[113,752,151],{"class":150},[113,754,154],{"class":119},[113,756,158],{"class":157},[113,758,161],{"class":123},[113,760,761,763,765,767],{"class":115,"line":164},[113,762,167],{"class":157},[113,764,170],{"class":123},[113,766,174],{"class":173},[113,768,177],{"class":123},[113,770,771,774,777,779,782,785,787,790],{"class":115,"line":180},[113,772,773],{"class":119},"    const",[113,775,776],{"class":150}," authHeader",[113,778,154],{"class":119},[113,780,781],{"class":123}," req.headers.",[113,783,784],{"class":157},"get",[113,786,170],{"class":123},[113,788,789],{"class":130},"\"Authorization\"",[113,791,205],{"class":123},[113,793,794],{"class":115,"line":208},[113,795,141],{"emptyLinePlaceholder":140},[113,797,798,800,803,806,809,812,815,818,821,823,826],{"class":115,"line":217},[113,799,325],{"class":119},[113,801,802],{"class":123}," (",[113,804,805],{"class":119},"!",[113,807,808],{"class":123},"authHeader ",[113,810,811],{"class":119},"||",[113,813,814],{"class":119}," !",[113,816,817],{"class":123},"authHeader.",[113,819,820],{"class":157},"startsWith",[113,822,170],{"class":123},[113,824,825],{"class":130},"\"Basic \"",[113,827,345],{"class":123},[113,829,830,833,836,839,841,844],{"class":115,"line":224},[113,831,832],{"class":119},"      return",[113,834,835],{"class":119}," new",[113,837,838],{"class":157}," Response",[113,840,170],{"class":123},[113,842,843],{"class":130},"\"Unauthorized\"",[113,845,846],{"class":123},", {\n",[113,848,849,852,855],{"class":115,"line":230},[113,850,851],{"class":123},"        status: ",[113,853,854],{"class":150},"401",[113,856,857],{"class":123},",\n",[113,859,860],{"class":115,"line":236},[113,861,862],{"class":123},"        headers: {\n",[113,864,865,868],{"class":115,"line":242},[113,866,867],{"class":130},"          \"WWW-Authenticate\"",[113,869,870],{"class":123},":\n",[113,872,873,876],{"class":115,"line":247},[113,874,875],{"class":130},"            'Basic realm=\"Websocket Authentication\", charset=\"UTF-8\"'",[113,877,857],{"class":123},[113,879,880],{"class":115,"line":260},[113,881,882],{"class":123},"        },\n",[113,884,885],{"class":115,"line":279},[113,886,887],{"class":123},"      });\n",[113,889,890],{"class":115,"line":284},[113,891,367],{"class":123},[113,893,894],{"class":115,"line":289},[113,895,141],{"emptyLinePlaceholder":140},[113,897,898,900,903,905,908,911,913,916,919,922],{"class":115,"line":307},[113,899,773],{"class":119},[113,901,902],{"class":150}," base64Credentials",[113,904,154],{"class":119},[113,906,907],{"class":123}," authHeader.",[113,909,910],{"class":157},"split",[113,912,170],{"class":123},[113,914,915],{"class":130},"\" \"",[113,917,918],{"class":123},")[",[113,920,921],{"class":150},"1",[113,923,924],{"class":123},"];\n",[113,926,927,929,932,935,937,940,943,946,949,952,954,956,959],{"class":115,"line":322},[113,928,773],{"class":119},[113,930,931],{"class":123}," [",[113,933,934],{"class":150},"username",[113,936,299],{"class":123},[113,938,939],{"class":150},"password",[113,941,942],{"class":123},"] ",[113,944,945],{"class":119},"=",[113,947,948],{"class":157}," atob",[113,950,951],{"class":123},"(base64Credentials).",[113,953,910],{"class":157},[113,955,170],{"class":123},[113,957,958],{"class":130},"\":\"",[113,960,205],{"class":123},[113,962,963],{"class":115,"line":348},[113,964,141],{"emptyLinePlaceholder":140},[113,966,967,969,972,975,978,981,984,986,989],{"class":115,"line":364},[113,968,325],{"class":119},[113,970,971],{"class":123}," (username ",[113,973,974],{"class":119},"!==",[113,976,977],{"class":130}," \"myUsername\"",[113,979,980],{"class":119}," ||",[113,982,983],{"class":123}," password ",[113,985,974],{"class":119},[113,987,988],{"class":130}," \"myPassword\"",[113,990,177],{"class":123},[113,992,993,995,997,999,1001,1003],{"class":115,"line":370},[113,994,832],{"class":119},[113,996,835],{"class":119},[113,998,838],{"class":157},[113,1000,170],{"class":123},[113,1002,843],{"class":130},[113,1004,846],{"class":123},[113,1006,1007,1009,1011],{"class":115,"line":375},[113,1008,851],{"class":123},[113,1010,854],{"class":150},[113,1012,857],{"class":123},[113,1014,1015],{"class":115,"line":380},[113,1016,862],{"class":123},[113,1018,1019,1021],{"class":115,"line":397},[113,1020,867],{"class":130},[113,1022,870],{"class":123},[113,1024,1025,1027],{"class":115,"line":412},[113,1026,875],{"class":130},[113,1028,857],{"class":123},[113,1030,1031],{"class":115,"line":417},[113,1032,882],{"class":123},[113,1034,1035],{"class":115,"line":422},[113,1036,887],{"class":123},[113,1038,1039],{"class":115,"line":439},[113,1040,367],{"class":123},[113,1042,1043],{"class":115,"line":454},[113,1044,141],{"emptyLinePlaceholder":140},[113,1046,1047,1049],{"class":115,"line":459},[113,1048,211],{"class":119},[113,1050,214],{"class":123},[113,1052,1053,1056],{"class":115,"line":464},[113,1054,1055],{"class":123},"      headers: {}, ",[113,1057,1058],{"class":220},"\u002F\u002F Optionally return custom headers\n",[113,1060,1061],{"class":115,"line":476},[113,1062,233],{"class":123},[113,1064,1065],{"class":115,"line":482},[113,1066,239],{"class":123},[113,1068,1069],{"class":115,"line":488},[113,1070,511],{"class":123},[1072,1073,1074],"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 .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}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":109,"searchDepth":137,"depth":137,"links":1076},[1077,1078],{"id":515,"depth":137,"text":516},{"id":708,"depth":137,"text":709},"Using hooks, you can define a WebSocket server that works across runtimes with the same syntax.","md",{"icon":15},{"icon":15},{"title":12,"description":1079},"FpAxmBu18hx9O7suIGyPBpyAadYZVQjSRwiVcXNmo3g",[1086,1087],{"title":5,"path":6,"stem":7,"description":109,"icon":10,"children":-1},{"title":17,"path":18,"stem":19,"description":1088,"icon":20,"children":-1},"Peer object allows easily interacting with connected clients.",1782852618199]