[{"data":1,"prerenderedAt":469},["ShallowReactive",2],{"navigation":3,"-guide-hooks":72,"-guide-hooks-surround":464},[4,36],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Getting Started","/guide","1.guide/1.index",[9,11,16,21,26,31],{"title":5,"path":6,"stem":7,"icon":10},"ph:book-open-duotone",{"title":12,"path":13,"stem":14,"icon":15},"Hooks","/guide/hooks","1.guide/2.hooks","material-symbols-light:data-object",{"title":17,"path":18,"stem":19,"icon":20},"Peer","/guide/peer","1.guide/3.peer","mynaui:api",{"title":22,"path":23,"stem":24,"icon":25},"Message","/guide/message","1.guide/4.message","solar:letter-line-duotone",{"title":27,"path":28,"stem":29,"icon":30},"Pub / Sub","/guide/pubsub","1.guide/5.pubsub","simple-icons:googlepubsub",{"title":32,"path":33,"stem":34,"icon":35},"Resolver API","/guide/resolver","1.guide/6.resolver","tabler:route",{"title":37,"path":38,"stem":39,"children":40,"icon":42},"Adapters","/adapters","2.adapters/1.index",[41,43,48,52,57,62,67],{"title":37,"path":38,"stem":39,"icon":42},"emojione-monotone:electric-plug",{"title":44,"path":45,"stem":46,"icon":47},"Bun","/adapters/bun","2.adapters/bun","simple-icons:bun",{"title":49,"path":50,"stem":51},"Bunny","/adapters/bunny","2.adapters/bunny",{"title":53,"path":54,"stem":55,"icon":56},"Cloudflare","/adapters/cloudflare","2.adapters/cloudflare","devicon-plain:cloudflareworkers",{"title":58,"path":59,"stem":60,"icon":61},"Deno","/adapters/deno","2.adapters/deno","teenyicons:deno-solid",{"title":63,"path":64,"stem":65,"icon":66},"Node.js","/adapters/node","2.adapters/node","akar-icons:node-fill",{"title":68,"path":69,"stem":70,"icon":71},"SSE","/adapters/sse","2.adapters/sse","clarity:two-way-arrows-line",{"id":73,"title":12,"body":74,"description":458,"extension":459,"meta":460,"navigation":461,"path":13,"seo":462,"stem":14,"__hash__":463},"content/1.guide/2.hooks.md",{"type":75,"value":76,"toc":456,"icon":15},"minimark",[77,81,92,452],[78,79,80],"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.",[82,83,84],"tip",{},[78,85,86,87,91],{},"\nUsing ",[88,89,90],"code",{},"defineHooks()"," wrapper is optional and for type support and code auto completion.",[93,94,99],"pre",{"className":95,"code":96,"language":97,"meta":98,"style":98},"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      // 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, event) {\n    console.log(\"[ws] close\", peer, event);\n  },\n\n  error(peer, error) {\n    console.log(\"[ws] error\", peer, error);\n  },\n});\n","ts","",[88,100,101,124,131,151,167,195,204,211,217,223,229,234,247,266,271,276,294,309,335,351,357,362,367,384,399,404,409,426,441,446],{"__ignoreMap":98},[102,103,106,110,114,117,121],"span",{"class":104,"line":105},"line",1,[102,107,109],{"class":108},"so5gQ","import",[102,111,113],{"class":112},"slsVL"," { defineHooks } ",[102,115,116],{"class":108},"from",[102,118,120],{"class":119},"sfrk1"," \"crossws\"",[102,122,123],{"class":112},";\n",[102,125,127],{"class":104,"line":126},2,[102,128,130],{"emptyLinePlaceholder":129},true,"\n",[102,132,134,137,141,144,148],{"class":104,"line":133},3,[102,135,136],{"class":108},"const",[102,138,140],{"class":139},"suiK_"," hooks",[102,142,143],{"class":108}," =",[102,145,147],{"class":146},"shcOC"," defineHooks",[102,149,150],{"class":112},"({\n",[102,152,154,157,160,164],{"class":104,"line":153},4,[102,155,156],{"class":146},"  upgrade",[102,158,159],{"class":112},"(",[102,161,163],{"class":162},"sQHwn","req",[102,165,166],{"class":112},") {\n",[102,168,170,173,176,178,181,183,186,189,192],{"class":104,"line":169},5,[102,171,172],{"class":112},"    console.",[102,174,175],{"class":146},"log",[102,177,159],{"class":112},[102,179,180],{"class":119},"`[ws] upgrading ${",[102,182,163],{"class":112},[102,184,185],{"class":119},".",[102,187,188],{"class":112},"url",[102,190,191],{"class":119},"}...`",[102,193,194],{"class":112},");\n",[102,196,198,201],{"class":104,"line":197},6,[102,199,200],{"class":108},"    return",[102,202,203],{"class":112}," {\n",[102,205,207],{"class":104,"line":206},7,[102,208,210],{"class":209},"sCsY4","      // namespace: new URL(req.url).pathname\n",[102,212,214],{"class":104,"line":213},8,[102,215,216],{"class":112},"      headers: {},\n",[102,218,220],{"class":104,"line":219},9,[102,221,222],{"class":112},"    };\n",[102,224,226],{"class":104,"line":225},10,[102,227,228],{"class":112},"  },\n",[102,230,232],{"class":104,"line":231},11,[102,233,130],{"emptyLinePlaceholder":129},[102,235,237,240,242,245],{"class":104,"line":236},12,[102,238,239],{"class":146},"  open",[102,241,159],{"class":112},[102,243,244],{"class":162},"peer",[102,246,166],{"class":112},[102,248,250,252,254,256,259,261,264],{"class":104,"line":249},13,[102,251,172],{"class":112},[102,253,175],{"class":146},[102,255,159],{"class":112},[102,257,258],{"class":119},"`[ws] open: ${",[102,260,244],{"class":112},[102,262,263],{"class":119},"}`",[102,265,194],{"class":112},[102,267,269],{"class":104,"line":268},14,[102,270,228],{"class":112},[102,272,274],{"class":104,"line":273},15,[102,275,130],{"emptyLinePlaceholder":129},[102,277,279,282,284,286,289,292],{"class":104,"line":278},16,[102,280,281],{"class":146},"  message",[102,283,159],{"class":112},[102,285,244],{"class":162},[102,287,288],{"class":112},", ",[102,290,291],{"class":162},"message",[102,293,166],{"class":112},[102,295,297,299,301,303,306],{"class":104,"line":296},17,[102,298,172],{"class":112},[102,300,175],{"class":146},[102,302,159],{"class":112},[102,304,305],{"class":119},"\"[ws] message\"",[102,307,308],{"class":112},", peer, message);\n",[102,310,312,315,318,321,324,327,329,332],{"class":104,"line":311},18,[102,313,314],{"class":108},"    if",[102,316,317],{"class":112}," (message.",[102,319,320],{"class":146},"text",[102,322,323],{"class":112},"().",[102,325,326],{"class":146},"includes",[102,328,159],{"class":112},[102,330,331],{"class":119},"\"ping\"",[102,333,334],{"class":112},")) {\n",[102,336,338,341,344,346,349],{"class":104,"line":337},19,[102,339,340],{"class":112},"      peer.",[102,342,343],{"class":146},"send",[102,345,159],{"class":112},[102,347,348],{"class":119},"\"pong\"",[102,350,194],{"class":112},[102,352,354],{"class":104,"line":353},20,[102,355,356],{"class":112},"    }\n",[102,358,360],{"class":104,"line":359},21,[102,361,228],{"class":112},[102,363,365],{"class":104,"line":364},22,[102,366,130],{"emptyLinePlaceholder":129},[102,368,370,373,375,377,379,382],{"class":104,"line":369},23,[102,371,372],{"class":146},"  close",[102,374,159],{"class":112},[102,376,244],{"class":162},[102,378,288],{"class":112},[102,380,381],{"class":162},"event",[102,383,166],{"class":112},[102,385,387,389,391,393,396],{"class":104,"line":386},24,[102,388,172],{"class":112},[102,390,175],{"class":146},[102,392,159],{"class":112},[102,394,395],{"class":119},"\"[ws] close\"",[102,397,398],{"class":112},", peer, event);\n",[102,400,402],{"class":104,"line":401},25,[102,403,228],{"class":112},[102,405,407],{"class":104,"line":406},26,[102,408,130],{"emptyLinePlaceholder":129},[102,410,412,415,417,419,421,424],{"class":104,"line":411},27,[102,413,414],{"class":146},"  error",[102,416,159],{"class":112},[102,418,244],{"class":162},[102,420,288],{"class":112},[102,422,423],{"class":162},"error",[102,425,166],{"class":112},[102,427,429,431,433,435,438],{"class":104,"line":428},28,[102,430,172],{"class":112},[102,432,175],{"class":146},[102,434,159],{"class":112},[102,436,437],{"class":119},"\"[ws] error\"",[102,439,440],{"class":112},", peer, error);\n",[102,442,444],{"class":104,"line":443},29,[102,445,228],{"class":112},[102,447,449],{"class":104,"line":448},30,[102,450,451],{"class":112},"});\n",[453,454,455],"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":98,"searchDepth":126,"depth":126,"links":457},[],"Using hooks, you can define a WebSocket server that works across runtimes with the same syntax.","md",{"icon":15},{"icon":15},{"title":12,"description":458},"dwEpZPrzkJmd-v2nwaBYbcZX3inn-t2pIpmtxxFTn5o",[465,467],{"title":5,"path":6,"stem":7,"description":466,"icon":10,"children":-1},"crossws provides a cross-platform toolkit to define well-typed WebSocket apps that can then be integrated into various WebSocket servers using built-in adapters.",{"title":17,"path":18,"stem":19,"description":468,"icon":20,"children":-1},"Peer object allows easily interacting with connected clients.",1771506027684]