[{"data":1,"prerenderedAt":439},["ShallowReactive",2],{"navigation":3,"-guide-pubsub":72,"-guide-pubsub-surround":436},[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":27,"body":74,"description":101,"extension":431,"meta":432,"navigation":433,"path":28,"seo":434,"stem":29,"__hash__":435},"content/1.guide/5.pubsub.md",{"type":75,"value":76,"toc":429,"icon":30},"minimark",[77,95,425],[78,79,80,81,85,86,90,91,94],"p",{},"crossws supports native pub-sub API integration. A ",[82,83,84],"a",{"href":18},"peer"," can be subscribed to a set of named channels using ",[87,88,89],"code",{},"peer.subscribe(\u003Cname>)",". Messages can be published to a channel using ",[87,92,93],{},"peer.publish(\u003Cname>, \u003Cmessage>)",". When publishing to a channel, the peer that does the publish is excluded from the broadcast so it won't receive it's own message.",[96,97,102],"pre",{"className":98,"code":99,"language":100,"meta":101,"style":101},"language-js shiki shiki-themes github-light github-dark github-dark","import { defineHooks } from \"crossws\";\n\nconst hooks = defineHooks({\n  upgrade(req) {\n    return {\n      // namespace: new URL(req.url).pathname\n    };\n  },\n  open(peer) {\n    // Send welcome to the new client\n    peer.send(\"Welcome to the server!\");\n\n    // Join new client to the \"chat\" channel\n    peer.subscribe(\"chat\");\n\n    // Notify every other connected client\n    peer.publish(\"chat\", `[system] ${peer} joined!`);\n  },\n\n  message(peer, message) {\n    // The server re-broadcasts incoming messages to everyone\n    peer.publish(\"chat\", `[${peer}] ${message}`);\n  },\n\n  close(peer) {\n    peer.publish(\"chat\", `[system] ${peer} has left the chat!`);\n    peer.unsubscribe(\"chat\");\n  },\n});\n","js","",[87,103,104,127,134,154,170,179,186,192,198,210,216,233,238,244,259,264,270,295,300,305,322,328,356,361,366,378,400,414,419],{"__ignoreMap":101},[105,106,109,113,117,120,124],"span",{"class":107,"line":108},"line",1,[105,110,112],{"class":111},"so5gQ","import",[105,114,116],{"class":115},"slsVL"," { defineHooks } ",[105,118,119],{"class":111},"from",[105,121,123],{"class":122},"sfrk1"," \"crossws\"",[105,125,126],{"class":115},";\n",[105,128,130],{"class":107,"line":129},2,[105,131,133],{"emptyLinePlaceholder":132},true,"\n",[105,135,137,140,144,147,151],{"class":107,"line":136},3,[105,138,139],{"class":111},"const",[105,141,143],{"class":142},"suiK_"," hooks",[105,145,146],{"class":111}," =",[105,148,150],{"class":149},"shcOC"," defineHooks",[105,152,153],{"class":115},"({\n",[105,155,157,160,163,167],{"class":107,"line":156},4,[105,158,159],{"class":149},"  upgrade",[105,161,162],{"class":115},"(",[105,164,166],{"class":165},"sQHwn","req",[105,168,169],{"class":115},") {\n",[105,171,173,176],{"class":107,"line":172},5,[105,174,175],{"class":111},"    return",[105,177,178],{"class":115}," {\n",[105,180,182],{"class":107,"line":181},6,[105,183,185],{"class":184},"sCsY4","      // namespace: new URL(req.url).pathname\n",[105,187,189],{"class":107,"line":188},7,[105,190,191],{"class":115},"    };\n",[105,193,195],{"class":107,"line":194},8,[105,196,197],{"class":115},"  },\n",[105,199,201,204,206,208],{"class":107,"line":200},9,[105,202,203],{"class":149},"  open",[105,205,162],{"class":115},[105,207,84],{"class":165},[105,209,169],{"class":115},[105,211,213],{"class":107,"line":212},10,[105,214,215],{"class":184},"    // Send welcome to the new client\n",[105,217,219,222,225,227,230],{"class":107,"line":218},11,[105,220,221],{"class":115},"    peer.",[105,223,224],{"class":149},"send",[105,226,162],{"class":115},[105,228,229],{"class":122},"\"Welcome to the server!\"",[105,231,232],{"class":115},");\n",[105,234,236],{"class":107,"line":235},12,[105,237,133],{"emptyLinePlaceholder":132},[105,239,241],{"class":107,"line":240},13,[105,242,243],{"class":184},"    // Join new client to the \"chat\" channel\n",[105,245,247,249,252,254,257],{"class":107,"line":246},14,[105,248,221],{"class":115},[105,250,251],{"class":149},"subscribe",[105,253,162],{"class":115},[105,255,256],{"class":122},"\"chat\"",[105,258,232],{"class":115},[105,260,262],{"class":107,"line":261},15,[105,263,133],{"emptyLinePlaceholder":132},[105,265,267],{"class":107,"line":266},16,[105,268,269],{"class":184},"    // Notify every other connected client\n",[105,271,273,275,278,280,282,285,288,290,293],{"class":107,"line":272},17,[105,274,221],{"class":115},[105,276,277],{"class":149},"publish",[105,279,162],{"class":115},[105,281,256],{"class":122},[105,283,284],{"class":115},", ",[105,286,287],{"class":122},"`[system] ${",[105,289,84],{"class":115},[105,291,292],{"class":122},"} joined!`",[105,294,232],{"class":115},[105,296,298],{"class":107,"line":297},18,[105,299,197],{"class":115},[105,301,303],{"class":107,"line":302},19,[105,304,133],{"emptyLinePlaceholder":132},[105,306,308,311,313,315,317,320],{"class":107,"line":307},20,[105,309,310],{"class":149},"  message",[105,312,162],{"class":115},[105,314,84],{"class":165},[105,316,284],{"class":115},[105,318,319],{"class":165},"message",[105,321,169],{"class":115},[105,323,325],{"class":107,"line":324},21,[105,326,327],{"class":184},"    // The server re-broadcasts incoming messages to everyone\n",[105,329,331,333,335,337,339,341,344,346,349,351,354],{"class":107,"line":330},22,[105,332,221],{"class":115},[105,334,277],{"class":149},[105,336,162],{"class":115},[105,338,256],{"class":122},[105,340,284],{"class":115},[105,342,343],{"class":122},"`[${",[105,345,84],{"class":115},[105,347,348],{"class":122},"}] ${",[105,350,319],{"class":115},[105,352,353],{"class":122},"}`",[105,355,232],{"class":115},[105,357,359],{"class":107,"line":358},23,[105,360,197],{"class":115},[105,362,364],{"class":107,"line":363},24,[105,365,133],{"emptyLinePlaceholder":132},[105,367,369,372,374,376],{"class":107,"line":368},25,[105,370,371],{"class":149},"  close",[105,373,162],{"class":115},[105,375,84],{"class":165},[105,377,169],{"class":115},[105,379,381,383,385,387,389,391,393,395,398],{"class":107,"line":380},26,[105,382,221],{"class":115},[105,384,277],{"class":149},[105,386,162],{"class":115},[105,388,256],{"class":122},[105,390,284],{"class":115},[105,392,287],{"class":122},[105,394,84],{"class":115},[105,396,397],{"class":122},"} has left the chat!`",[105,399,232],{"class":115},[105,401,403,405,408,410,412],{"class":107,"line":402},27,[105,404,221],{"class":115},[105,406,407],{"class":149},"unsubscribe",[105,409,162],{"class":115},[105,411,256],{"class":122},[105,413,232],{"class":115},[105,415,417],{"class":107,"line":416},28,[105,418,197],{"class":115},[105,420,422],{"class":107,"line":421},29,[105,423,424],{"class":115},"});\n",[426,427,428],"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":101,"searchDepth":129,"depth":129,"links":430},[],"md",{"icon":30},{"icon":30},{"title":27,"description":101},"iKvLyL5l3Psj98JsiDMTRWDTEzQE-hWqNa_xPUx8l5A",[437,438],{"title":22,"path":23,"stem":24,"description":101,"icon":25,"children":-1},{"title":32,"path":33,"stem":34,"description":101,"icon":35,"children":-1},1771506027685]