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