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