[{"data":1,"prerenderedAt":352},["ShallowReactive",2],{"navigation":3,"-guide-resolver":83,"-guide-resolver-surround":348},[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":37,"body":85,"description":104,"extension":343,"meta":344,"navigation":345,"path":38,"seo":346,"stem":39,"__hash__":347},"content\u002F1.guide\u002F7.resolver.md",{"type":86,"value":87,"toc":341,"icon":40},"minimark",[88,92,98,249,252,337],[89,90,91],"p",{},"When integrating WebSockets with larger projects, it is often needed to dynamically route an incoming event to websocket hooks. crossws provides a very simple mechanism to do this using resolver API.",[93,94,95],"tip",{},[89,96,97],{},"\nResolver supports async results. This allows implementing lazy loading.",[99,100,105],"pre",{"className":101,"code":102,"language":103,"meta":104,"style":104},"language-js shiki shiki-themes github-light github-dark github-dark","\u002F\u002F https:\u002F\u002Fcrossws.h3.dev\u002Fadapters\nimport crossws from \"crossws\u002Fadapters\u002F\u003Cadapter>\";\n\nimport { defineHooks } from \"crossws\";\n\nconst websocket = crossws({\n  async resolve(req) {\n    \u002F\u002F TODO: Resolve hooks based on req.url, req.headers\n    \u002F\u002F You can return undefined in case there is no match\n    return {\n      \u002F* resolved hooks *\u002F\n    };\n  },\n});\n","js","",[106,107,108,117,138,145,160,165,185,204,210,216,225,231,237,243],"code",{"__ignoreMap":104},[109,110,113],"span",{"class":111,"line":112},"line",1,[109,114,116],{"class":115},"sCsY4","\u002F\u002F https:\u002F\u002Fcrossws.h3.dev\u002Fadapters\n",[109,118,120,124,128,131,135],{"class":111,"line":119},2,[109,121,123],{"class":122},"so5gQ","import",[109,125,127],{"class":126},"slsVL"," crossws ",[109,129,130],{"class":122},"from",[109,132,134],{"class":133},"sfrk1"," \"crossws\u002Fadapters\u002F\u003Cadapter>\"",[109,136,137],{"class":126},";\n",[109,139,141],{"class":111,"line":140},3,[109,142,144],{"emptyLinePlaceholder":143},true,"\n",[109,146,148,150,153,155,158],{"class":111,"line":147},4,[109,149,123],{"class":122},[109,151,152],{"class":126}," { defineHooks } ",[109,154,130],{"class":122},[109,156,157],{"class":133}," \"crossws\"",[109,159,137],{"class":126},[109,161,163],{"class":111,"line":162},5,[109,164,144],{"emptyLinePlaceholder":143},[109,166,168,171,175,178,182],{"class":111,"line":167},6,[109,169,170],{"class":122},"const",[109,172,174],{"class":173},"suiK_"," websocket",[109,176,177],{"class":122}," =",[109,179,181],{"class":180},"shcOC"," crossws",[109,183,184],{"class":126},"({\n",[109,186,188,191,194,197,201],{"class":111,"line":187},7,[109,189,190],{"class":122},"  async",[109,192,193],{"class":180}," resolve",[109,195,196],{"class":126},"(",[109,198,200],{"class":199},"sQHwn","req",[109,202,203],{"class":126},") {\n",[109,205,207],{"class":111,"line":206},8,[109,208,209],{"class":115},"    \u002F\u002F TODO: Resolve hooks based on req.url, req.headers\n",[109,211,213],{"class":111,"line":212},9,[109,214,215],{"class":115},"    \u002F\u002F You can return undefined in case there is no match\n",[109,217,219,222],{"class":111,"line":218},10,[109,220,221],{"class":122},"    return",[109,223,224],{"class":126}," {\n",[109,226,228],{"class":111,"line":227},11,[109,229,230],{"class":115},"      \u002F* resolved hooks *\u002F\n",[109,232,234],{"class":111,"line":233},12,[109,235,236],{"class":126},"    };\n",[109,238,240],{"class":111,"line":239},13,[109,241,242],{"class":126},"  },\n",[109,244,246],{"class":111,"line":245},14,[109,247,248],{"class":126},"});\n",[89,250,251],{},"If you need to change resolve function (for cases like handling HMR):",[99,253,257],{"className":254,"code":255,"language":256,"meta":104,"style":104},"language-ts shiki shiki-themes github-light github-dark github-dark","let resolveWebSocketHooks = (req) => \u002F* ... *\u002F\n\nconst websocket = crossws({\n  async resolve(req) {\n    return resolveWebSocketHooks(req)\n  },\n});\n\n\u002F\u002F Update reference to `resolveWebSocketHooks` later.\n","ts",[106,258,259,283,287,299,311,320,324,328,332],{"__ignoreMap":104},[109,260,261,264,267,269,272,274,277,280],{"class":111,"line":112},[109,262,263],{"class":122},"let",[109,265,266],{"class":180}," resolveWebSocketHooks",[109,268,177],{"class":122},[109,270,271],{"class":126}," (",[109,273,200],{"class":199},[109,275,276],{"class":126},") ",[109,278,279],{"class":122},"=>",[109,281,282],{"class":115}," \u002F* ... *\u002F\n",[109,284,285],{"class":111,"line":119},[109,286,144],{"emptyLinePlaceholder":143},[109,288,289,291,293,295,297],{"class":111,"line":140},[109,290,170],{"class":122},[109,292,174],{"class":173},[109,294,177],{"class":122},[109,296,181],{"class":180},[109,298,184],{"class":126},[109,300,301,303,305,307,309],{"class":111,"line":147},[109,302,190],{"class":122},[109,304,193],{"class":180},[109,306,196],{"class":126},[109,308,200],{"class":199},[109,310,203],{"class":126},[109,312,313,315,317],{"class":111,"line":162},[109,314,221],{"class":122},[109,316,266],{"class":180},[109,318,319],{"class":126},"(req)\n",[109,321,322],{"class":111,"line":167},[109,323,242],{"class":126},[109,325,326],{"class":111,"line":187},[109,327,248],{"class":126},[109,329,330],{"class":111,"line":206},[109,331,144],{"emptyLinePlaceholder":143},[109,333,334],{"class":111,"line":212},[109,335,336],{"class":115},"\u002F\u002F Update reference to `resolveWebSocketHooks` later.\n",[338,339,340],"style",{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .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":104,"searchDepth":119,"depth":119,"links":342},[],"md",{"icon":40},{"icon":40},{"title":37,"description":104},"qYc4ehEjUjGEIczNROTBAY-QnIbqRlL1RNYMFjkmYHM",[349,350],{"title":32,"path":33,"stem":34,"description":104,"icon":35,"children":-1},{"title":42,"path":43,"stem":44,"description":351,"icon":45,"children":-1},"Forward incoming WebSocket connections to an upstream ws:\u002F\u002F or wss:\u002F\u002F target.",1782852618203]