[{"data":1,"prerenderedAt":5855},["ShallowReactive",2],{"navigation":3,"docs-path-index":152,"-docs-modules-web-sockets-overview":198,"-docs-modules-web-sockets-overview-surround":5850},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":52},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,53,138],{"title":11,"path":12,"stem":13,"children":14,"icon":25},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples","i-lucide-rocket",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":52},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[32,36,40,44,48],{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":37,"path":38,"stem":39},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":41,"path":42,"stem":43},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":45,"path":46,"stem":47},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":49,"path":50,"stem":51},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",false,{"title":54,"icon":55,"defaultOpen":56,"path":57,"stem":58,"children":59,"page":52},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[60,77,93,109,123,134],{"title":61,"icon":52,"defaultOpen":52,"path":62,"stem":63,"children":64,"page":52},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[65,69,73],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":70,"path":71,"stem":72},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":74,"path":75,"stem":76},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":78,"icon":52,"defaultOpen":52,"path":79,"stem":80,"children":81,"page":52},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[82,85,89],{"title":66,"path":83,"stem":84},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":86,"path":87,"stem":88},"Drivers","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":90,"path":91,"stem":92},"API","\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":94,"icon":52,"defaultOpen":52,"path":95,"stem":96,"children":97,"page":52},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[98,101,105],{"title":66,"path":99,"stem":100},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":102,"path":103,"stem":104},"AWS Lambda","\u002Fdocs\u002Fmodules\u002Fserverless\u002Faws-lambda","docs\u002F3.modules\u002F3.serverless\u002F1.aws-lambda",{"title":106,"path":107,"stem":108},"Azure Functions","\u002Fdocs\u002Fmodules\u002Fserverless\u002Fazure-functions","docs\u002F3.modules\u002F3.serverless\u002F2.azure-functions",{"title":110,"icon":52,"defaultOpen":52,"path":111,"stem":112,"children":113,"page":52},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[114,117,120],{"title":66,"path":115,"stem":116},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":86,"path":118,"stem":119},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":90,"path":121,"stem":122},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":124,"icon":52,"defaultOpen":52,"path":125,"stem":126,"children":127,"page":52},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[128,131],{"title":66,"path":129,"stem":130},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":90,"path":132,"stem":133},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":135,"path":136,"stem":137},"MCP","\u002Fdocs\u002Fmodules\u002Fmcp","docs\u002F3.modules\u002F6.mcp",{"title":139,"icon":140,"defaultOpen":52,"path":141,"stem":142,"children":143,"page":52},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[144,148],{"title":145,"path":146,"stem":147},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":149,"path":150,"stem":151},"Custom Plugin","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",[153,155,157,158,159,160,162,163,164,165,166,167,169,171,172,173,174,176,177,178,179,181,182,183,184,186,187,188,189,191,192,193,194,196,197],{"path":154},"\u002Fdocs\u002F.navigation",{"path":156},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":161},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":168},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":170},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":67},{"path":71},{"path":75},{"path":175},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":83},{"path":87},{"path":91},{"path":180},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":99},{"path":103},{"path":107},{"path":185},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":115},{"path":118},{"path":121},{"path":190},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":129},{"path":132},{"path":136},{"path":195},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":146},{"path":150},{"id":199,"title":66,"body":200,"description":5844,"extension":5845,"links":5846,"meta":5847,"navigation":56,"path":129,"seo":5848,"stem":130,"__hash__":5849},"docs\u002Fdocs\u002F3.modules\u002F5.web-sockets\u002F0.overview.md",{"type":201,"value":202,"toc":5809},"minimark",[203,215,219,287,291,1512,1516,1520,1523,1569,1572,1588,1592,1595,1690,1694,1697,1723,1784,1788,1791,1796,1801,1820,1825,1854,1858,1862,1869,2084,2087,2090,2331,2334,2338,2342,2345,2437,2441,2444,2590,2594,2597,2712,2716,2720,2723,3024,3028,3035,3206,3210,3213,3584,3587,3607,3611,3615,3618,4292,4296,4299,4715,4719,4722,5041,5045,5048,5348,5352,5356,5359,5541,5545,5548,5713,5717,5722,5731,5741,5746,5755,5764,5769,5778,5786,5791,5800,5805],[204,205,206,207,214],"p",{},"The WebSocket module enables real-time bidirectional communication between clients and your Vercube server using WebSocket connections. Built on top of ",[208,209,213],"a",{"href":210,"rel":211},"https:\u002F\u002Fcrossws.unjs.io\u002F",[212],"nofollow","crossws",", it provides a decorator-based API that makes WebSocket development intuitive and type-safe.",[216,217,18],"h2",{"id":218},"installation",[220,221,222,252,270],"code-group",{},[223,224,230],"pre",{"className":225,"code":226,"filename":227,"language":228,"meta":229,"style":229},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ pnpm add @vercube\u002Fws\n","pnpm","bash","",[231,232,233],"code",{"__ignoreMap":229},[234,235,238,242,246,249],"span",{"class":236,"line":237},"line",1,[234,239,241],{"class":240},"sBMFI","$",[234,243,245],{"class":244},"sfazB"," pnpm",[234,247,248],{"class":244}," add",[234,250,251],{"class":244}," @vercube\u002Fws\n",[223,253,256],{"className":225,"code":254,"filename":255,"language":228,"meta":229,"style":229},"$ npm install @vercube\u002Fws\n","npm",[231,257,258],{"__ignoreMap":229},[234,259,260,262,265,268],{"class":236,"line":237},[234,261,241],{"class":240},[234,263,264],{"class":244}," npm",[234,266,267],{"class":244}," install",[234,269,251],{"class":244},[223,271,274],{"className":225,"code":272,"filename":273,"language":228,"meta":229,"style":229},"$ bun install @vercube\u002Fws\n","bun",[231,275,276],{"__ignoreMap":229},[234,277,278,280,283,285],{"class":236,"line":237},[234,279,241],{"class":240},[234,281,282],{"class":244}," bun",[234,284,267],{"class":244},[234,286,251],{"class":244},[216,288,290],{"id":289},"quick-start","Quick Start",[292,293,294,299,456,460,1121,1125],"steps",{},[295,296,298],"h3",{"id":297},"enable-the-websocket-plugin","Enable the WebSocket Plugin",[223,300,305],{"className":301,"code":302,"filename":303,"language":304,"meta":229,"style":229},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createApp } from '@vercube\u002Fcore';\nimport { WebsocketPlugin } from '@vercube\u002Fws';\n\nconst app = createApp({\n  setup: async (app) => {\n    app.addPlugin(WebsocketPlugin);\n  }\n});\n","src\u002Findex.ts","ts",[231,306,307,339,362,368,390,418,440,446],{"__ignoreMap":229},[234,308,309,313,317,321,324,327,330,333,336],{"class":236,"line":237},[234,310,312],{"class":311},"s7zQu","import",[234,314,316],{"class":315},"sMK4o"," {",[234,318,320],{"class":319},"sTEyZ"," createApp",[234,322,323],{"class":315}," }",[234,325,326],{"class":311}," from",[234,328,329],{"class":315}," '",[234,331,332],{"class":244},"@vercube\u002Fcore",[234,334,335],{"class":315},"'",[234,337,338],{"class":315},";\n",[234,340,342,344,346,349,351,353,355,358,360],{"class":236,"line":341},2,[234,343,312],{"class":311},[234,345,316],{"class":315},[234,347,348],{"class":319}," WebsocketPlugin",[234,350,323],{"class":315},[234,352,326],{"class":311},[234,354,329],{"class":315},[234,356,357],{"class":244},"@vercube\u002Fws",[234,359,335],{"class":315},[234,361,338],{"class":315},[234,363,365],{"class":236,"line":364},3,[234,366,367],{"emptyLinePlaceholder":56},"\n",[234,369,371,375,378,381,384,387],{"class":236,"line":370},4,[234,372,374],{"class":373},"spNyl","const",[234,376,377],{"class":319}," app ",[234,379,380],{"class":315},"=",[234,382,320],{"class":383},"s2Zo4",[234,385,386],{"class":319},"(",[234,388,389],{"class":315},"{\n",[234,391,393,396,399,402,405,409,412,415],{"class":236,"line":392},5,[234,394,395],{"class":383},"  setup",[234,397,398],{"class":315},":",[234,400,401],{"class":373}," async",[234,403,404],{"class":315}," (",[234,406,408],{"class":407},"sHdIc","app",[234,410,411],{"class":315},")",[234,413,414],{"class":373}," =>",[234,416,417],{"class":315}," {\n",[234,419,421,424,427,430,433,436,438],{"class":236,"line":420},6,[234,422,423],{"class":319},"    app",[234,425,426],{"class":315},".",[234,428,429],{"class":383},"addPlugin",[234,431,386],{"class":432},"swJcz",[234,434,435],{"class":319},"WebsocketPlugin",[234,437,411],{"class":432},[234,439,338],{"class":315},[234,441,443],{"class":236,"line":442},7,[234,444,445],{"class":315},"  }\n",[234,447,449,452,454],{"class":236,"line":448},8,[234,450,451],{"class":315},"}",[234,453,411],{"class":319},[234,455,338],{"class":315},[295,457,459],{"id":458},"create-a-websocket-gateway","Create a WebSocket Gateway",[223,461,464],{"className":301,"code":462,"filename":463,"language":304,"meta":229,"style":229},"import { Controller } from '@vercube\u002Fcore';\nimport { \n  Namespace, \n  Message, \n  Emit, \n  OnConnectionAttempt \n} from '@vercube\u002Fws';\nimport type { Peer } from 'crossws';\n\n@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  \n  \u002F\u002F Optional: Control connection access\n  @OnConnectionAttempt()\n  async handleConnection(\n    params: Record\u003Cstring, unknown>, \n    request: Request\n  ): Promise\u003Cboolean> {\n    \u002F\u002F Validate authentication token from query params\n    const token = params.token as string;\n    \n    if (!token || !this.isValidToken(token)) {\n      return false; \u002F\u002F Reject connection\n    }\n    \n    return true; \u002F\u002F Accept connection\n  }\n  \n  \u002F\u002F Listen for 'message' events from clients\n  @Message({ event: 'message' })\n  @Emit('message-received')\n  async onMessage(\n    data: { text: string; user: string }, \n    peer: Peer\n  ) {\n    console.log(`Message from ${peer.id}:`, data);\n    \n    \u002F\u002F Return value is automatically emitted to the sender\n    return {\n      status: 'received',\n      timestamp: new Date().toISOString()\n    };\n  }\n  \n  private isValidToken(token: string): boolean {\n    \u002F\u002F Your token validation logic\n    return true;\n  }\n}\n","src\u002Fgateways\u002FChatGateway.ts",[231,465,466,487,496,506,515,524,531,545,569,574,595,606,620,626,633,644,656,683,694,713,719,747,753,784,800,806,811,825,830,835,841,870,889,899,930,941,949,994,999,1005,1012,1030,1054,1060,1065,1070,1095,1101,1110,1115],{"__ignoreMap":229},[234,467,468,470,472,475,477,479,481,483,485],{"class":236,"line":237},[234,469,312],{"class":311},[234,471,316],{"class":315},[234,473,474],{"class":319}," Controller",[234,476,323],{"class":315},[234,478,326],{"class":311},[234,480,329],{"class":315},[234,482,332],{"class":244},[234,484,335],{"class":315},[234,486,338],{"class":315},[234,488,489,491,493],{"class":236,"line":341},[234,490,312],{"class":311},[234,492,316],{"class":315},[234,494,495],{"class":432}," \n",[234,497,498,501,504],{"class":236,"line":364},[234,499,500],{"class":319},"  Namespace",[234,502,503],{"class":315},",",[234,505,495],{"class":432},[234,507,508,511,513],{"class":236,"line":370},[234,509,510],{"class":319},"  Message",[234,512,503],{"class":315},[234,514,495],{"class":432},[234,516,517,520,522],{"class":236,"line":392},[234,518,519],{"class":319},"  Emit",[234,521,503],{"class":315},[234,523,495],{"class":432},[234,525,526,529],{"class":236,"line":420},[234,527,528],{"class":319},"  OnConnectionAttempt",[234,530,495],{"class":432},[234,532,533,535,537,539,541,543],{"class":236,"line":442},[234,534,451],{"class":315},[234,536,326],{"class":311},[234,538,329],{"class":315},[234,540,357],{"class":244},[234,542,335],{"class":315},[234,544,338],{"class":315},[234,546,547,549,552,554,557,559,561,563,565,567],{"class":236,"line":448},[234,548,312],{"class":311},[234,550,551],{"class":311}," type",[234,553,316],{"class":315},[234,555,556],{"class":319}," Peer",[234,558,323],{"class":315},[234,560,326],{"class":311},[234,562,329],{"class":315},[234,564,213],{"class":244},[234,566,335],{"class":315},[234,568,338],{"class":315},[234,570,572],{"class":236,"line":571},9,[234,573,367],{"emptyLinePlaceholder":56},[234,575,577,580,583,585,587,590,592],{"class":236,"line":576},10,[234,578,579],{"class":315},"@",[234,581,582],{"class":383},"Namespace",[234,584,386],{"class":319},[234,586,335],{"class":315},[234,588,589],{"class":244},"\u002Fchat",[234,591,335],{"class":315},[234,593,594],{"class":319},")\n",[234,596,598,600,603],{"class":236,"line":597},11,[234,599,579],{"class":315},[234,601,602],{"class":383},"Controller",[234,604,605],{"class":319},"()\n",[234,607,609,612,615,618],{"class":236,"line":608},12,[234,610,611],{"class":311},"export",[234,613,614],{"class":373}," class",[234,616,617],{"class":240}," ChatGateway",[234,619,417],{"class":315},[234,621,623],{"class":236,"line":622},13,[234,624,625],{"class":319},"  \n",[234,627,629],{"class":236,"line":628},14,[234,630,632],{"class":631},"sHwdD","  \u002F\u002F Optional: Control connection access\n",[234,634,636,639,642],{"class":236,"line":635},15,[234,637,638],{"class":315},"  @",[234,640,641],{"class":383},"OnConnectionAttempt",[234,643,605],{"class":319},[234,645,647,650,653],{"class":236,"line":646},16,[234,648,649],{"class":373},"  async",[234,651,652],{"class":432}," handleConnection",[234,654,655],{"class":315},"(\n",[234,657,659,662,664,667,670,673,675,678,681],{"class":236,"line":658},17,[234,660,661],{"class":407},"    params",[234,663,398],{"class":315},[234,665,666],{"class":240}," Record",[234,668,669],{"class":315},"\u003C",[234,671,672],{"class":240},"string",[234,674,503],{"class":315},[234,676,677],{"class":240}," unknown",[234,679,680],{"class":315},">,",[234,682,495],{"class":319},[234,684,686,689,691],{"class":236,"line":685},18,[234,687,688],{"class":407},"    request",[234,690,398],{"class":315},[234,692,693],{"class":240}," Request\n",[234,695,697,700,703,705,708,711],{"class":236,"line":696},19,[234,698,699],{"class":315},"  ):",[234,701,702],{"class":240}," Promise",[234,704,669],{"class":315},[234,706,707],{"class":240},"boolean",[234,709,710],{"class":315},">",[234,712,417],{"class":315},[234,714,716],{"class":236,"line":715},20,[234,717,718],{"class":631},"    \u002F\u002F Validate authentication token from query params\n",[234,720,722,725,728,731,734,736,739,742,745],{"class":236,"line":721},21,[234,723,724],{"class":373},"    const",[234,726,727],{"class":319}," token",[234,729,730],{"class":315}," =",[234,732,733],{"class":319}," params",[234,735,426],{"class":315},[234,737,738],{"class":319},"token",[234,740,741],{"class":311}," as",[234,743,744],{"class":240}," string",[234,746,338],{"class":315},[234,748,750],{"class":236,"line":749},22,[234,751,752],{"class":432},"    \n",[234,754,756,759,761,764,766,769,772,775,777,779,782],{"class":236,"line":755},23,[234,757,758],{"class":311},"    if",[234,760,404],{"class":432},[234,762,763],{"class":315},"!",[234,765,738],{"class":319},[234,767,768],{"class":315}," ||",[234,770,771],{"class":315}," !this.",[234,773,774],{"class":383},"isValidToken",[234,776,386],{"class":432},[234,778,738],{"class":319},[234,780,781],{"class":432},")) ",[234,783,389],{"class":315},[234,785,787,790,794,797],{"class":236,"line":786},24,[234,788,789],{"class":311},"      return",[234,791,793],{"class":792},"sfNiH"," false",[234,795,796],{"class":315},";",[234,798,799],{"class":631}," \u002F\u002F Reject connection\n",[234,801,803],{"class":236,"line":802},25,[234,804,805],{"class":315},"    }\n",[234,807,809],{"class":236,"line":808},26,[234,810,752],{"class":432},[234,812,814,817,820,822],{"class":236,"line":813},27,[234,815,816],{"class":311},"    return",[234,818,819],{"class":792}," true",[234,821,796],{"class":315},[234,823,824],{"class":631}," \u002F\u002F Accept connection\n",[234,826,828],{"class":236,"line":827},28,[234,829,445],{"class":315},[234,831,833],{"class":236,"line":832},29,[234,834,625],{"class":319},[234,836,838],{"class":236,"line":837},30,[234,839,840],{"class":631},"  \u002F\u002F Listen for 'message' events from clients\n",[234,842,844,846,849,851,854,857,859,861,864,866,868],{"class":236,"line":843},31,[234,845,638],{"class":315},[234,847,848],{"class":383},"Message",[234,850,386],{"class":319},[234,852,853],{"class":315},"{",[234,855,856],{"class":432}," event",[234,858,398],{"class":315},[234,860,329],{"class":315},[234,862,863],{"class":244},"message",[234,865,335],{"class":315},[234,867,323],{"class":315},[234,869,594],{"class":319},[234,871,873,875,878,880,882,885,887],{"class":236,"line":872},32,[234,874,638],{"class":315},[234,876,877],{"class":383},"Emit",[234,879,386],{"class":319},[234,881,335],{"class":315},[234,883,884],{"class":244},"message-received",[234,886,335],{"class":315},[234,888,594],{"class":319},[234,890,892,894,897],{"class":236,"line":891},33,[234,893,649],{"class":373},[234,895,896],{"class":432}," onMessage",[234,898,655],{"class":315},[234,900,902,905,907,909,912,914,916,918,921,923,925,928],{"class":236,"line":901},34,[234,903,904],{"class":407},"    data",[234,906,398],{"class":315},[234,908,316],{"class":315},[234,910,911],{"class":432}," text",[234,913,398],{"class":315},[234,915,744],{"class":240},[234,917,796],{"class":315},[234,919,920],{"class":432}," user",[234,922,398],{"class":315},[234,924,744],{"class":240},[234,926,927],{"class":315}," },",[234,929,495],{"class":319},[234,931,933,936,938],{"class":236,"line":932},35,[234,934,935],{"class":407},"    peer",[234,937,398],{"class":315},[234,939,940],{"class":240}," Peer\n",[234,942,944,947],{"class":236,"line":943},36,[234,945,946],{"class":315},"  )",[234,948,417],{"class":315},[234,950,952,955,957,960,962,965,968,971,974,976,979,981,983,985,987,990,992],{"class":236,"line":951},37,[234,953,954],{"class":319},"    console",[234,956,426],{"class":315},[234,958,959],{"class":383},"log",[234,961,386],{"class":432},[234,963,964],{"class":315},"`",[234,966,967],{"class":244},"Message from ",[234,969,970],{"class":315},"${",[234,972,973],{"class":319},"peer",[234,975,426],{"class":315},[234,977,978],{"class":319},"id",[234,980,451],{"class":315},[234,982,398],{"class":244},[234,984,964],{"class":315},[234,986,503],{"class":315},[234,988,989],{"class":319}," data",[234,991,411],{"class":432},[234,993,338],{"class":315},[234,995,997],{"class":236,"line":996},38,[234,998,752],{"class":432},[234,1000,1002],{"class":236,"line":1001},39,[234,1003,1004],{"class":631},"    \u002F\u002F Return value is automatically emitted to the sender\n",[234,1006,1008,1010],{"class":236,"line":1007},40,[234,1009,816],{"class":311},[234,1011,417],{"class":315},[234,1013,1015,1018,1020,1022,1025,1027],{"class":236,"line":1014},41,[234,1016,1017],{"class":432},"      status",[234,1019,398],{"class":315},[234,1021,329],{"class":315},[234,1023,1024],{"class":244},"received",[234,1026,335],{"class":315},[234,1028,1029],{"class":315},",\n",[234,1031,1033,1036,1038,1041,1044,1047,1049,1052],{"class":236,"line":1032},42,[234,1034,1035],{"class":432},"      timestamp",[234,1037,398],{"class":315},[234,1039,1040],{"class":315}," new",[234,1042,1043],{"class":383}," Date",[234,1045,1046],{"class":432},"()",[234,1048,426],{"class":315},[234,1050,1051],{"class":383},"toISOString",[234,1053,605],{"class":432},[234,1055,1057],{"class":236,"line":1056},43,[234,1058,1059],{"class":315},"    };\n",[234,1061,1063],{"class":236,"line":1062},44,[234,1064,445],{"class":315},[234,1066,1068],{"class":236,"line":1067},45,[234,1069,625],{"class":319},[234,1071,1073,1076,1079,1081,1083,1085,1087,1090,1093],{"class":236,"line":1072},46,[234,1074,1075],{"class":373},"  private",[234,1077,1078],{"class":432}," isValidToken",[234,1080,386],{"class":315},[234,1082,738],{"class":407},[234,1084,398],{"class":315},[234,1086,744],{"class":240},[234,1088,1089],{"class":315},"):",[234,1091,1092],{"class":240}," boolean",[234,1094,417],{"class":315},[234,1096,1098],{"class":236,"line":1097},47,[234,1099,1100],{"class":631},"    \u002F\u002F Your token validation logic\n",[234,1102,1104,1106,1108],{"class":236,"line":1103},48,[234,1105,816],{"class":311},[234,1107,819],{"class":792},[234,1109,338],{"class":315},[234,1111,1113],{"class":236,"line":1112},49,[234,1114,445],{"class":315},[234,1116,1118],{"class":236,"line":1117},50,[234,1119,1120],{"class":315},"}\n",[295,1122,1124],{"id":1123},"connect-from-the-client","Connect from the Client",[223,1126,1129],{"className":301,"code":1127,"filename":1128,"language":304,"meta":229,"style":229},"\u002F\u002F Connect to the chat namespace\nconst ws = new WebSocket('ws:\u002F\u002Flocalhost:3000\u002Fchat?token=your-auth-token');\n\n\u002F\u002F Handle connection\nws.onopen = () => {\n  console.log('Connected to chat');\n  \n  \u002F\u002F Send a message\n  ws.send(JSON.stringify({\n    event: 'message',\n    data: {\n      text: 'Hello, server!',\n      user: 'Alice'\n    }\n  }));\n};\n\n\u002F\u002F Receive messages\nws.onmessage = (event) => {\n  const message = JSON.parse(event.data);\n  console.log('Received:', message);\n};\n\nws.onerror = (error) => {\n  console.error('WebSocket error:', error);\n};\n\nws.onclose = () => {\n  console.log('Disconnected from chat');\n};\n","client.ts",[231,1130,1131,1136,1163,1167,1172,1191,1213,1217,1222,1246,1261,1269,1285,1300,1304,1314,1319,1323,1328,1350,1381,1406,1410,1414,1436,1462,1466,1470,1487,1508],{"__ignoreMap":229},[234,1132,1133],{"class":236,"line":237},[234,1134,1135],{"class":631},"\u002F\u002F Connect to the chat namespace\n",[234,1137,1138,1140,1143,1145,1147,1150,1152,1154,1157,1159,1161],{"class":236,"line":341},[234,1139,374],{"class":373},[234,1141,1142],{"class":319}," ws ",[234,1144,380],{"class":315},[234,1146,1040],{"class":315},[234,1148,1149],{"class":383}," WebSocket",[234,1151,386],{"class":319},[234,1153,335],{"class":315},[234,1155,1156],{"class":244},"ws:\u002F\u002Flocalhost:3000\u002Fchat?token=your-auth-token",[234,1158,335],{"class":315},[234,1160,411],{"class":319},[234,1162,338],{"class":315},[234,1164,1165],{"class":236,"line":364},[234,1166,367],{"emptyLinePlaceholder":56},[234,1168,1169],{"class":236,"line":370},[234,1170,1171],{"class":631},"\u002F\u002F Handle connection\n",[234,1173,1174,1177,1179,1182,1184,1187,1189],{"class":236,"line":392},[234,1175,1176],{"class":319},"ws",[234,1178,426],{"class":315},[234,1180,1181],{"class":383},"onopen",[234,1183,730],{"class":315},[234,1185,1186],{"class":315}," ()",[234,1188,414],{"class":373},[234,1190,417],{"class":315},[234,1192,1193,1196,1198,1200,1202,1204,1207,1209,1211],{"class":236,"line":420},[234,1194,1195],{"class":319},"  console",[234,1197,426],{"class":315},[234,1199,959],{"class":383},[234,1201,386],{"class":432},[234,1203,335],{"class":315},[234,1205,1206],{"class":244},"Connected to chat",[234,1208,335],{"class":315},[234,1210,411],{"class":432},[234,1212,338],{"class":315},[234,1214,1215],{"class":236,"line":442},[234,1216,625],{"class":432},[234,1218,1219],{"class":236,"line":448},[234,1220,1221],{"class":631},"  \u002F\u002F Send a message\n",[234,1223,1224,1227,1229,1232,1234,1237,1239,1242,1244],{"class":236,"line":571},[234,1225,1226],{"class":319},"  ws",[234,1228,426],{"class":315},[234,1230,1231],{"class":383},"send",[234,1233,386],{"class":432},[234,1235,1236],{"class":319},"JSON",[234,1238,426],{"class":315},[234,1240,1241],{"class":383},"stringify",[234,1243,386],{"class":432},[234,1245,389],{"class":315},[234,1247,1248,1251,1253,1255,1257,1259],{"class":236,"line":576},[234,1249,1250],{"class":432},"    event",[234,1252,398],{"class":315},[234,1254,329],{"class":315},[234,1256,863],{"class":244},[234,1258,335],{"class":315},[234,1260,1029],{"class":315},[234,1262,1263,1265,1267],{"class":236,"line":597},[234,1264,904],{"class":432},[234,1266,398],{"class":315},[234,1268,417],{"class":315},[234,1270,1271,1274,1276,1278,1281,1283],{"class":236,"line":608},[234,1272,1273],{"class":432},"      text",[234,1275,398],{"class":315},[234,1277,329],{"class":315},[234,1279,1280],{"class":244},"Hello, server!",[234,1282,335],{"class":315},[234,1284,1029],{"class":315},[234,1286,1287,1290,1292,1294,1297],{"class":236,"line":622},[234,1288,1289],{"class":432},"      user",[234,1291,398],{"class":315},[234,1293,329],{"class":315},[234,1295,1296],{"class":244},"Alice",[234,1298,1299],{"class":315},"'\n",[234,1301,1302],{"class":236,"line":628},[234,1303,805],{"class":315},[234,1305,1306,1309,1312],{"class":236,"line":635},[234,1307,1308],{"class":315},"  }",[234,1310,1311],{"class":432},"))",[234,1313,338],{"class":315},[234,1315,1316],{"class":236,"line":646},[234,1317,1318],{"class":315},"};\n",[234,1320,1321],{"class":236,"line":658},[234,1322,367],{"emptyLinePlaceholder":56},[234,1324,1325],{"class":236,"line":685},[234,1326,1327],{"class":631},"\u002F\u002F Receive messages\n",[234,1329,1330,1332,1334,1337,1339,1341,1344,1346,1348],{"class":236,"line":696},[234,1331,1176],{"class":319},[234,1333,426],{"class":315},[234,1335,1336],{"class":383},"onmessage",[234,1338,730],{"class":315},[234,1340,404],{"class":315},[234,1342,1343],{"class":407},"event",[234,1345,411],{"class":315},[234,1347,414],{"class":373},[234,1349,417],{"class":315},[234,1351,1352,1355,1358,1360,1363,1365,1368,1370,1372,1374,1377,1379],{"class":236,"line":715},[234,1353,1354],{"class":373},"  const",[234,1356,1357],{"class":319}," message",[234,1359,730],{"class":315},[234,1361,1362],{"class":319}," JSON",[234,1364,426],{"class":315},[234,1366,1367],{"class":383},"parse",[234,1369,386],{"class":432},[234,1371,1343],{"class":319},[234,1373,426],{"class":315},[234,1375,1376],{"class":319},"data",[234,1378,411],{"class":432},[234,1380,338],{"class":315},[234,1382,1383,1385,1387,1389,1391,1393,1396,1398,1400,1402,1404],{"class":236,"line":721},[234,1384,1195],{"class":319},[234,1386,426],{"class":315},[234,1388,959],{"class":383},[234,1390,386],{"class":432},[234,1392,335],{"class":315},[234,1394,1395],{"class":244},"Received:",[234,1397,335],{"class":315},[234,1399,503],{"class":315},[234,1401,1357],{"class":319},[234,1403,411],{"class":432},[234,1405,338],{"class":315},[234,1407,1408],{"class":236,"line":749},[234,1409,1318],{"class":315},[234,1411,1412],{"class":236,"line":755},[234,1413,367],{"emptyLinePlaceholder":56},[234,1415,1416,1418,1420,1423,1425,1427,1430,1432,1434],{"class":236,"line":786},[234,1417,1176],{"class":319},[234,1419,426],{"class":315},[234,1421,1422],{"class":383},"onerror",[234,1424,730],{"class":315},[234,1426,404],{"class":315},[234,1428,1429],{"class":407},"error",[234,1431,411],{"class":315},[234,1433,414],{"class":373},[234,1435,417],{"class":315},[234,1437,1438,1440,1442,1444,1446,1448,1451,1453,1455,1458,1460],{"class":236,"line":802},[234,1439,1195],{"class":319},[234,1441,426],{"class":315},[234,1443,1429],{"class":383},[234,1445,386],{"class":432},[234,1447,335],{"class":315},[234,1449,1450],{"class":244},"WebSocket error:",[234,1452,335],{"class":315},[234,1454,503],{"class":315},[234,1456,1457],{"class":319}," error",[234,1459,411],{"class":432},[234,1461,338],{"class":315},[234,1463,1464],{"class":236,"line":808},[234,1465,1318],{"class":315},[234,1467,1468],{"class":236,"line":813},[234,1469,367],{"emptyLinePlaceholder":56},[234,1471,1472,1474,1476,1479,1481,1483,1485],{"class":236,"line":827},[234,1473,1176],{"class":319},[234,1475,426],{"class":315},[234,1477,1478],{"class":383},"onclose",[234,1480,730],{"class":315},[234,1482,1186],{"class":315},[234,1484,414],{"class":373},[234,1486,417],{"class":315},[234,1488,1489,1491,1493,1495,1497,1499,1502,1504,1506],{"class":236,"line":832},[234,1490,1195],{"class":319},[234,1492,426],{"class":315},[234,1494,959],{"class":383},[234,1496,386],{"class":432},[234,1498,335],{"class":315},[234,1500,1501],{"class":244},"Disconnected from chat",[234,1503,335],{"class":315},[234,1505,411],{"class":432},[234,1507,338],{"class":315},[234,1509,1510],{"class":236,"line":837},[234,1511,1318],{"class":315},[216,1513,1515],{"id":1514},"core-concepts","Core Concepts",[295,1517,1519],{"id":1518},"namespaces","Namespaces",[204,1521,1522],{},"Namespaces are logical channels that group WebSocket connections. They allow you to organize different types of real-time functionality within your application.",[223,1524,1526],{"className":301,"code":1525,"language":304,"meta":229,"style":229},"@Namespace('\u002Fchat')    \u002F\u002F Chat namespace at ws:\u002F\u002Fyourserver.com\u002Fchat\n@Namespace('\u002Fnotifications')  \u002F\u002F Notifications namespace\n",[231,1527,1528,1548],{"__ignoreMap":229},[234,1529,1530,1532,1534,1536,1538,1540,1542,1545],{"class":236,"line":237},[234,1531,579],{"class":315},[234,1533,582],{"class":383},[234,1535,386],{"class":319},[234,1537,335],{"class":315},[234,1539,589],{"class":244},[234,1541,335],{"class":315},[234,1543,1544],{"class":319},")    ",[234,1546,1547],{"class":631},"\u002F\u002F Chat namespace at ws:\u002F\u002Fyourserver.com\u002Fchat\n",[234,1549,1550,1552,1554,1556,1558,1561,1563,1566],{"class":236,"line":341},[234,1551,579],{"class":315},[234,1553,582],{"class":383},[234,1555,386],{"class":319},[234,1557,335],{"class":315},[234,1559,1560],{"class":244},"\u002Fnotifications",[234,1562,335],{"class":315},[234,1564,1565],{"class":319},")  ",[234,1567,1568],{"class":631},"\u002F\u002F Notifications namespace\n",[204,1570,1571],{},"Each namespace:",[1573,1574,1575,1579,1582,1585],"ul",{},[1576,1577,1578],"li",{},"Has its own connection URL path",[1576,1580,1581],{},"Maintains separate client connections",[1576,1583,1584],{},"Can have different connection handlers",[1576,1586,1587],{},"Isolates message events",[295,1589,1591],{"id":1590},"events","Events",[204,1593,1594],{},"Events are named message types that clients and servers use to communicate. Think of them as typed message channels within a namespace.",[223,1596,1598],{"className":301,"code":1597,"language":304,"meta":229,"style":229},"\u002F\u002F Server listens for 'message' event from clients\n@Message({ event: 'message' })\nhandleMessage(data: any, peer: Peer) { ... }\n\n\u002F\u002F Server emits 'update' event to client(s)\n@Emit('update')\nsendUpdate() { ... }\n",[231,1599,1600,1605,1629,1650,1654,1659,1676],{"__ignoreMap":229},[234,1601,1602],{"class":236,"line":237},[234,1603,1604],{"class":631},"\u002F\u002F Server listens for 'message' event from clients\n",[234,1606,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627],{"class":236,"line":341},[234,1608,579],{"class":315},[234,1610,848],{"class":383},[234,1612,386],{"class":319},[234,1614,853],{"class":315},[234,1616,856],{"class":432},[234,1618,398],{"class":315},[234,1620,329],{"class":315},[234,1622,863],{"class":244},[234,1624,335],{"class":315},[234,1626,323],{"class":315},[234,1628,594],{"class":319},[234,1630,1631,1634,1637,1639,1642,1644,1647],{"class":236,"line":364},[234,1632,1633],{"class":383},"handleMessage",[234,1635,1636],{"class":319},"(data: any",[234,1638,503],{"class":315},[234,1640,1641],{"class":319}," peer: Peer) ",[234,1643,853],{"class":315},[234,1645,1646],{"class":315}," ...",[234,1648,1649],{"class":315}," }\n",[234,1651,1652],{"class":236,"line":370},[234,1653,367],{"emptyLinePlaceholder":56},[234,1655,1656],{"class":236,"line":392},[234,1657,1658],{"class":631},"\u002F\u002F Server emits 'update' event to client(s)\n",[234,1660,1661,1663,1665,1667,1669,1672,1674],{"class":236,"line":420},[234,1662,579],{"class":315},[234,1664,877],{"class":383},[234,1666,386],{"class":319},[234,1668,335],{"class":315},[234,1670,1671],{"class":244},"update",[234,1673,335],{"class":315},[234,1675,594],{"class":319},[234,1677,1678,1681,1684,1686,1688],{"class":236,"line":442},[234,1679,1680],{"class":383},"sendUpdate",[234,1682,1683],{"class":319},"() ",[234,1685,853],{"class":315},[234,1687,1646],{"class":315},[234,1689,1649],{"class":315},[295,1691,1693],{"id":1692},"peers","Peers",[204,1695,1696],{},"A peer represents a connected WebSocket client. Each peer has:",[1573,1698,1699,1706,1711,1717],{},[1576,1700,1701,1705],{},[1702,1703,1704],"strong",{},"Unique ID",": Automatically assigned identifier",[1576,1707,1708,1710],{},[1702,1709,582],{},": The namespace they're connected to",[1576,1712,1713,1716],{},[1702,1714,1715],{},"IP Address",": Client's IP address",[1576,1718,1719,1722],{},[1702,1720,1721],{},"Send method",": To send messages directly to that peer",[223,1724,1726],{"className":301,"code":1725,"language":304,"meta":229,"style":229},"interface Peer {\n  id: string;\n  namespace?: string;\n  send(message: unknown): void;\n}\n",[231,1727,1728,1737,1748,1760,1780],{"__ignoreMap":229},[234,1729,1730,1733,1735],{"class":236,"line":237},[234,1731,1732],{"class":373},"interface",[234,1734,556],{"class":240},[234,1736,417],{"class":315},[234,1738,1739,1742,1744,1746],{"class":236,"line":341},[234,1740,1741],{"class":432},"  id",[234,1743,398],{"class":315},[234,1745,744],{"class":240},[234,1747,338],{"class":315},[234,1749,1750,1753,1756,1758],{"class":236,"line":364},[234,1751,1752],{"class":432},"  namespace",[234,1754,1755],{"class":315},"?:",[234,1757,744],{"class":240},[234,1759,338],{"class":315},[234,1761,1762,1765,1767,1769,1771,1773,1775,1778],{"class":236,"line":370},[234,1763,1764],{"class":432},"  send",[234,1766,386],{"class":315},[234,1768,863],{"class":407},[234,1770,398],{"class":315},[234,1772,677],{"class":240},[234,1774,1089],{"class":315},[234,1776,1777],{"class":240}," void",[234,1779,338],{"class":315},[234,1781,1782],{"class":236,"line":392},[234,1783,1120],{"class":315},[216,1785,1787],{"id":1786},"message-flow","Message Flow",[204,1789,1790],{},"Understanding how messages flow through the WebSocket system is crucial:",[1792,1793],"img",{"src":1794,"alt":1795},"\u002Fimages\u002Fwss-1.svg","Message flow",[204,1797,1798],{},[1702,1799,1800],{},"Connection Flow:",[1802,1803,1804,1807,1814,1817],"ol",{},[1576,1805,1806],{},"Client initiates WebSocket connection to a namespace",[1576,1808,1809,1810,1813],{},"Server calls ",[231,1811,1812],{},"@OnConnectionAttempt()"," handler (if defined)",[1576,1815,1816],{},"Handler validates connection (query params, headers)",[1576,1818,1819],{},"Connection accepted\u002Frejected based on handler return value",[204,1821,1822],{},[1702,1823,1824],{},"Message Flow:",[1802,1826,1827,1833,1840,1843],{},[1576,1828,1829,1830],{},"Client sends message with ",[231,1831,1832],{},"{ event: '...', data: {...} }",[1576,1834,1835,1836,1839],{},"Server matches event to ",[231,1837,1838],{},"@Message({ event: '...' })"," handler",[1576,1841,1842],{},"Handler processes message and returns response",[1576,1844,1845,1846,1849,1850,1853],{},"Response decorators (",[231,1847,1848],{},"@Emit",", ",[231,1851,1852],{},"@Broadcast",") send data back",[216,1855,1857],{"id":1856},"message-handlers","Message Handlers",[295,1859,1861],{"id":1860},"listening-to-events","Listening to Events",[204,1863,1864,1865,1868],{},"Use ",[231,1866,1867],{},"@Message()"," to listen for specific events from clients:",[223,1870,1872],{"className":301,"code":1871,"language":304,"meta":229,"style":229},"@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  \n  @Message({ event: 'send-message' })\n  handleMessage(data: any, peer: Peer) {\n    console.log(`Received from ${peer.id}:`, data);\n    \u002F\u002F Process message\n  }\n  \n  @Message({ event: 'typing' })\n  handleTyping(data: { isTyping: boolean }, peer: Peer) {\n    \u002F\u002F Handle typing indicator\n  }\n}\n",[231,1873,1874,1890,1898,1908,1912,1937,1964,2001,2006,2010,2014,2039,2071,2076,2080],{"__ignoreMap":229},[234,1875,1876,1878,1880,1882,1884,1886,1888],{"class":236,"line":237},[234,1877,579],{"class":315},[234,1879,582],{"class":383},[234,1881,386],{"class":319},[234,1883,335],{"class":315},[234,1885,589],{"class":244},[234,1887,335],{"class":315},[234,1889,594],{"class":319},[234,1891,1892,1894,1896],{"class":236,"line":341},[234,1893,579],{"class":315},[234,1895,602],{"class":383},[234,1897,605],{"class":319},[234,1899,1900,1902,1904,1906],{"class":236,"line":364},[234,1901,611],{"class":311},[234,1903,614],{"class":373},[234,1905,617],{"class":240},[234,1907,417],{"class":315},[234,1909,1910],{"class":236,"line":370},[234,1911,625],{"class":319},[234,1913,1914,1916,1918,1920,1922,1924,1926,1928,1931,1933,1935],{"class":236,"line":392},[234,1915,638],{"class":315},[234,1917,848],{"class":383},[234,1919,386],{"class":319},[234,1921,853],{"class":315},[234,1923,856],{"class":432},[234,1925,398],{"class":315},[234,1927,329],{"class":315},[234,1929,1930],{"class":244},"send-message",[234,1932,335],{"class":315},[234,1934,323],{"class":315},[234,1936,594],{"class":319},[234,1938,1939,1942,1944,1946,1948,1951,1953,1956,1958,1960,1962],{"class":236,"line":420},[234,1940,1941],{"class":432},"  handleMessage",[234,1943,386],{"class":315},[234,1945,1376],{"class":407},[234,1947,398],{"class":315},[234,1949,1950],{"class":240}," any",[234,1952,503],{"class":315},[234,1954,1955],{"class":407}," peer",[234,1957,398],{"class":315},[234,1959,556],{"class":240},[234,1961,411],{"class":315},[234,1963,417],{"class":315},[234,1965,1966,1968,1970,1972,1974,1976,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999],{"class":236,"line":442},[234,1967,954],{"class":319},[234,1969,426],{"class":315},[234,1971,959],{"class":383},[234,1973,386],{"class":432},[234,1975,964],{"class":315},[234,1977,1978],{"class":244},"Received from ",[234,1980,970],{"class":315},[234,1982,973],{"class":319},[234,1984,426],{"class":315},[234,1986,978],{"class":319},[234,1988,451],{"class":315},[234,1990,398],{"class":244},[234,1992,964],{"class":315},[234,1994,503],{"class":315},[234,1996,989],{"class":319},[234,1998,411],{"class":432},[234,2000,338],{"class":315},[234,2002,2003],{"class":236,"line":448},[234,2004,2005],{"class":631},"    \u002F\u002F Process message\n",[234,2007,2008],{"class":236,"line":571},[234,2009,445],{"class":315},[234,2011,2012],{"class":236,"line":576},[234,2013,625],{"class":319},[234,2015,2016,2018,2020,2022,2024,2026,2028,2030,2033,2035,2037],{"class":236,"line":597},[234,2017,638],{"class":315},[234,2019,848],{"class":383},[234,2021,386],{"class":319},[234,2023,853],{"class":315},[234,2025,856],{"class":432},[234,2027,398],{"class":315},[234,2029,329],{"class":315},[234,2031,2032],{"class":244},"typing",[234,2034,335],{"class":315},[234,2036,323],{"class":315},[234,2038,594],{"class":319},[234,2040,2041,2044,2046,2048,2050,2052,2055,2057,2059,2061,2063,2065,2067,2069],{"class":236,"line":608},[234,2042,2043],{"class":432},"  handleTyping",[234,2045,386],{"class":315},[234,2047,1376],{"class":407},[234,2049,398],{"class":315},[234,2051,316],{"class":315},[234,2053,2054],{"class":432}," isTyping",[234,2056,398],{"class":315},[234,2058,1092],{"class":240},[234,2060,927],{"class":315},[234,2062,1955],{"class":407},[234,2064,398],{"class":315},[234,2066,556],{"class":240},[234,2068,411],{"class":315},[234,2070,417],{"class":315},[234,2072,2073],{"class":236,"line":622},[234,2074,2075],{"class":631},"    \u002F\u002F Handle typing indicator\n",[234,2077,2078],{"class":236,"line":628},[234,2079,445],{"class":315},[234,2081,2082],{"class":236,"line":635},[234,2083,1120],{"class":315},[295,2085,49],{"id":2086},"validation",[204,2088,2089],{},"Add schema validation to ensure message data integrity:",[223,2091,2093],{"className":301,"code":2092,"language":304,"meta":229,"style":229},"import { z } from 'zod';\n\nconst MessageSchema = z.object({\n  text: z.string().min(1).max(500),\n  user: z.string(),\n  room: z.string().optional()\n});\n\n@Message({ \n  event: 'send-message',\n  validationSchema: MessageSchema \n})\nhandleMessage(data: z.infer\u003Ctypeof MessageSchema>, peer: Peer) {\n  \u002F\u002F data is typed and validated\n  console.log(data.text);\n}\n",[231,2094,2095,2117,2121,2141,2183,2200,2222,2230,2234,2246,2261,2271,2277,2301,2306,2327],{"__ignoreMap":229},[234,2096,2097,2099,2101,2104,2106,2108,2110,2113,2115],{"class":236,"line":237},[234,2098,312],{"class":311},[234,2100,316],{"class":315},[234,2102,2103],{"class":319}," z",[234,2105,323],{"class":315},[234,2107,326],{"class":311},[234,2109,329],{"class":315},[234,2111,2112],{"class":244},"zod",[234,2114,335],{"class":315},[234,2116,338],{"class":315},[234,2118,2119],{"class":236,"line":341},[234,2120,367],{"emptyLinePlaceholder":56},[234,2122,2123,2125,2128,2130,2132,2134,2137,2139],{"class":236,"line":364},[234,2124,374],{"class":373},[234,2126,2127],{"class":319}," MessageSchema ",[234,2129,380],{"class":315},[234,2131,2103],{"class":319},[234,2133,426],{"class":315},[234,2135,2136],{"class":383},"object",[234,2138,386],{"class":319},[234,2140,389],{"class":315},[234,2142,2143,2146,2148,2150,2152,2154,2156,2158,2161,2163,2167,2169,2171,2174,2176,2179,2181],{"class":236,"line":370},[234,2144,2145],{"class":432},"  text",[234,2147,398],{"class":315},[234,2149,2103],{"class":319},[234,2151,426],{"class":315},[234,2153,672],{"class":383},[234,2155,1046],{"class":319},[234,2157,426],{"class":315},[234,2159,2160],{"class":383},"min",[234,2162,386],{"class":319},[234,2164,2166],{"class":2165},"sbssI","1",[234,2168,411],{"class":319},[234,2170,426],{"class":315},[234,2172,2173],{"class":383},"max",[234,2175,386],{"class":319},[234,2177,2178],{"class":2165},"500",[234,2180,411],{"class":319},[234,2182,1029],{"class":315},[234,2184,2185,2188,2190,2192,2194,2196,2198],{"class":236,"line":392},[234,2186,2187],{"class":432},"  user",[234,2189,398],{"class":315},[234,2191,2103],{"class":319},[234,2193,426],{"class":315},[234,2195,672],{"class":383},[234,2197,1046],{"class":319},[234,2199,1029],{"class":315},[234,2201,2202,2205,2207,2209,2211,2213,2215,2217,2220],{"class":236,"line":420},[234,2203,2204],{"class":432},"  room",[234,2206,398],{"class":315},[234,2208,2103],{"class":319},[234,2210,426],{"class":315},[234,2212,672],{"class":383},[234,2214,1046],{"class":319},[234,2216,426],{"class":315},[234,2218,2219],{"class":383},"optional",[234,2221,605],{"class":319},[234,2223,2224,2226,2228],{"class":236,"line":442},[234,2225,451],{"class":315},[234,2227,411],{"class":319},[234,2229,338],{"class":315},[234,2231,2232],{"class":236,"line":448},[234,2233,367],{"emptyLinePlaceholder":56},[234,2235,2236,2238,2240,2242,2244],{"class":236,"line":571},[234,2237,579],{"class":315},[234,2239,848],{"class":383},[234,2241,386],{"class":319},[234,2243,853],{"class":315},[234,2245,495],{"class":319},[234,2247,2248,2251,2253,2255,2257,2259],{"class":236,"line":576},[234,2249,2250],{"class":432},"  event",[234,2252,398],{"class":315},[234,2254,329],{"class":315},[234,2256,1930],{"class":244},[234,2258,335],{"class":315},[234,2260,1029],{"class":315},[234,2262,2263,2266,2268],{"class":236,"line":597},[234,2264,2265],{"class":432},"  validationSchema",[234,2267,398],{"class":315},[234,2269,2270],{"class":319}," MessageSchema \n",[234,2272,2273,2275],{"class":236,"line":608},[234,2274,451],{"class":315},[234,2276,594],{"class":319},[234,2278,2279,2281,2284,2286,2289,2292,2295,2297,2299],{"class":236,"line":622},[234,2280,1633],{"class":383},[234,2282,2283],{"class":319},"(data: z",[234,2285,426],{"class":315},[234,2287,2288],{"class":319},"infer",[234,2290,2291],{"class":315},"\u003Ctypeof",[234,2293,2294],{"class":319}," MessageSchema",[234,2296,680],{"class":315},[234,2298,1641],{"class":319},[234,2300,389],{"class":315},[234,2302,2303],{"class":236,"line":628},[234,2304,2305],{"class":631},"  \u002F\u002F data is typed and validated\n",[234,2307,2308,2310,2312,2314,2316,2318,2320,2323,2325],{"class":236,"line":635},[234,2309,1195],{"class":319},[234,2311,426],{"class":315},[234,2313,959],{"class":383},[234,2315,386],{"class":432},[234,2317,1376],{"class":319},[234,2319,426],{"class":315},[234,2321,2322],{"class":319},"text",[234,2324,411],{"class":432},[234,2326,338],{"class":315},[234,2328,2329],{"class":236,"line":646},[234,2330,1120],{"class":315},[204,2332,2333],{},"Invalid messages are automatically rejected with validation errors.",[216,2335,2337],{"id":2336},"sending-messages","Sending Messages",[295,2339,2341],{"id":2340},"emit-to-sender","Emit to Sender",[204,2343,2344],{},"Send message back to the client that triggered the handler:",[223,2346,2348],{"className":301,"code":2347,"language":304,"meta":229,"style":229},"@Message({ event: 'ping' })\n@Emit('pong')\nhandlePing() {\n  return { timestamp: Date.now() };\n}\n\n\u002F\u002F Client receives: { event: 'pong', data: { timestamp: ... } }\n",[231,2349,2350,2375,2392,2401,2424,2428,2432],{"__ignoreMap":229},[234,2351,2352,2354,2356,2358,2360,2362,2364,2366,2369,2371,2373],{"class":236,"line":237},[234,2353,579],{"class":315},[234,2355,848],{"class":383},[234,2357,386],{"class":319},[234,2359,853],{"class":315},[234,2361,856],{"class":432},[234,2363,398],{"class":315},[234,2365,329],{"class":315},[234,2367,2368],{"class":244},"ping",[234,2370,335],{"class":315},[234,2372,323],{"class":315},[234,2374,594],{"class":319},[234,2376,2377,2379,2381,2383,2385,2388,2390],{"class":236,"line":341},[234,2378,579],{"class":315},[234,2380,877],{"class":383},[234,2382,386],{"class":319},[234,2384,335],{"class":315},[234,2386,2387],{"class":244},"pong",[234,2389,335],{"class":315},[234,2391,594],{"class":319},[234,2393,2394,2397,2399],{"class":236,"line":364},[234,2395,2396],{"class":383},"handlePing",[234,2398,1683],{"class":319},[234,2400,389],{"class":315},[234,2402,2403,2406,2408,2411,2413,2415,2417,2420,2422],{"class":236,"line":370},[234,2404,2405],{"class":311},"  return",[234,2407,316],{"class":315},[234,2409,2410],{"class":432}," timestamp",[234,2412,398],{"class":315},[234,2414,1043],{"class":319},[234,2416,426],{"class":315},[234,2418,2419],{"class":383},"now",[234,2421,1683],{"class":432},[234,2423,1318],{"class":315},[234,2425,2426],{"class":236,"line":392},[234,2427,1120],{"class":315},[234,2429,2430],{"class":236,"line":420},[234,2431,367],{"emptyLinePlaceholder":56},[234,2433,2434],{"class":236,"line":442},[234,2435,2436],{"class":631},"\u002F\u002F Client receives: { event: 'pong', data: { timestamp: ... } }\n",[295,2438,2440],{"id":2439},"broadcast-to-all","Broadcast to All",[204,2442,2443],{},"Send message to all clients in the namespace (including sender):",[223,2445,2447],{"className":301,"code":2446,"language":304,"meta":229,"style":229},"@Message({ event: 'user-joined' })\n@Broadcast('user-status')\nhandleUserJoined(data: { username: string }) {\n  return { \n    type: 'joined',\n    username: data.username,\n    timestamp: Date.now()\n  };\n}\n\n\u002F\u002F All clients receive the message\n",[231,2448,2449,2474,2492,2517,2525,2541,2557,2572,2577,2581,2585],{"__ignoreMap":229},[234,2450,2451,2453,2455,2457,2459,2461,2463,2465,2468,2470,2472],{"class":236,"line":237},[234,2452,579],{"class":315},[234,2454,848],{"class":383},[234,2456,386],{"class":319},[234,2458,853],{"class":315},[234,2460,856],{"class":432},[234,2462,398],{"class":315},[234,2464,329],{"class":315},[234,2466,2467],{"class":244},"user-joined",[234,2469,335],{"class":315},[234,2471,323],{"class":315},[234,2473,594],{"class":319},[234,2475,2476,2478,2481,2483,2485,2488,2490],{"class":236,"line":341},[234,2477,579],{"class":315},[234,2479,2480],{"class":383},"Broadcast",[234,2482,386],{"class":319},[234,2484,335],{"class":315},[234,2486,2487],{"class":244},"user-status",[234,2489,335],{"class":315},[234,2491,594],{"class":319},[234,2493,2494,2497,2500,2502,2505,2507,2510,2512,2515],{"class":236,"line":364},[234,2495,2496],{"class":383},"handleUserJoined",[234,2498,2499],{"class":319},"(data: ",[234,2501,853],{"class":315},[234,2503,2504],{"class":432}," username",[234,2506,398],{"class":315},[234,2508,2509],{"class":319}," string ",[234,2511,451],{"class":315},[234,2513,2514],{"class":319},") ",[234,2516,389],{"class":315},[234,2518,2519,2521,2523],{"class":236,"line":370},[234,2520,2405],{"class":311},[234,2522,316],{"class":315},[234,2524,495],{"class":432},[234,2526,2527,2530,2532,2534,2537,2539],{"class":236,"line":392},[234,2528,2529],{"class":432},"    type",[234,2531,398],{"class":315},[234,2533,329],{"class":315},[234,2535,2536],{"class":244},"joined",[234,2538,335],{"class":315},[234,2540,1029],{"class":315},[234,2542,2543,2546,2548,2550,2552,2555],{"class":236,"line":420},[234,2544,2545],{"class":432},"    username",[234,2547,398],{"class":315},[234,2549,989],{"class":319},[234,2551,426],{"class":315},[234,2553,2554],{"class":319},"username",[234,2556,1029],{"class":315},[234,2558,2559,2562,2564,2566,2568,2570],{"class":236,"line":442},[234,2560,2561],{"class":432},"    timestamp",[234,2563,398],{"class":315},[234,2565,1043],{"class":319},[234,2567,426],{"class":315},[234,2569,2419],{"class":383},[234,2571,605],{"class":432},[234,2573,2574],{"class":236,"line":448},[234,2575,2576],{"class":315},"  };\n",[234,2578,2579],{"class":236,"line":571},[234,2580,1120],{"class":315},[234,2582,2583],{"class":236,"line":576},[234,2584,367],{"emptyLinePlaceholder":56},[234,2586,2587],{"class":236,"line":597},[234,2588,2589],{"class":631},"\u002F\u002F All clients receive the message\n",[295,2591,2593],{"id":2592},"broadcast-to-others","Broadcast to Others",[204,2595,2596],{},"Send message to all clients except the sender:",[223,2598,2600],{"className":301,"code":2599,"language":304,"meta":229,"style":229},"@Message({ event: 'typing' })\n@BroadcastOthers('user-typing')\nhandleTyping(data: { username: string }) {\n  return {\n    username: data.username,\n    isTyping: true\n  };\n}\n\n\u002F\u002F All clients except the sender receive the message\n",[231,2601,2602,2626,2644,2665,2671,2685,2695,2699,2703,2707],{"__ignoreMap":229},[234,2603,2604,2606,2608,2610,2612,2614,2616,2618,2620,2622,2624],{"class":236,"line":237},[234,2605,579],{"class":315},[234,2607,848],{"class":383},[234,2609,386],{"class":319},[234,2611,853],{"class":315},[234,2613,856],{"class":432},[234,2615,398],{"class":315},[234,2617,329],{"class":315},[234,2619,2032],{"class":244},[234,2621,335],{"class":315},[234,2623,323],{"class":315},[234,2625,594],{"class":319},[234,2627,2628,2630,2633,2635,2637,2640,2642],{"class":236,"line":341},[234,2629,579],{"class":315},[234,2631,2632],{"class":383},"BroadcastOthers",[234,2634,386],{"class":319},[234,2636,335],{"class":315},[234,2638,2639],{"class":244},"user-typing",[234,2641,335],{"class":315},[234,2643,594],{"class":319},[234,2645,2646,2649,2651,2653,2655,2657,2659,2661,2663],{"class":236,"line":364},[234,2647,2648],{"class":383},"handleTyping",[234,2650,2499],{"class":319},[234,2652,853],{"class":315},[234,2654,2504],{"class":432},[234,2656,398],{"class":315},[234,2658,2509],{"class":319},[234,2660,451],{"class":315},[234,2662,2514],{"class":319},[234,2664,389],{"class":315},[234,2666,2667,2669],{"class":236,"line":370},[234,2668,2405],{"class":311},[234,2670,417],{"class":315},[234,2672,2673,2675,2677,2679,2681,2683],{"class":236,"line":392},[234,2674,2545],{"class":432},[234,2676,398],{"class":315},[234,2678,989],{"class":319},[234,2680,426],{"class":315},[234,2682,2554],{"class":319},[234,2684,1029],{"class":315},[234,2686,2687,2690,2692],{"class":236,"line":420},[234,2688,2689],{"class":432},"    isTyping",[234,2691,398],{"class":315},[234,2693,2694],{"class":792}," true\n",[234,2696,2697],{"class":236,"line":442},[234,2698,2576],{"class":315},[234,2700,2701],{"class":236,"line":448},[234,2702,1120],{"class":315},[234,2704,2705],{"class":236,"line":571},[234,2706,367],{"emptyLinePlaceholder":56},[234,2708,2709],{"class":236,"line":576},[234,2710,2711],{"class":631},"\u002F\u002F All clients except the sender receive the message\n",[216,2713,2715],{"id":2714},"connection-management","Connection Management",[295,2717,2719],{"id":2718},"accepting-connections","Accepting Connections",[204,2721,2722],{},"Control who can connect to your namespace:",[223,2724,2726],{"className":301,"code":2725,"language":304,"meta":229,"style":229},"@Namespace('\u002Fprivate-chat')\n@Controller()\nexport class PrivateChatGateway {\n  \n  @Inject(AuthService)\n  private authService!: AuthService;\n  \n  @OnConnectionAttempt()\n  async validateConnection(\n    params: Record\u003Cstring, unknown>,\n    request: Request\n  ): Promise\u003Cboolean> {\n    const token = params.token as string;\n    \n    try {\n      \u002F\u002F Validate JWT token\n      const user = await this.authService.verifyToken(token);\n      \n      \u002F\u002F Check permissions\n      if (!user.hasPermission('access-private-chat')) {\n        return false;\n      }\n      \n      return true;\n    } catch (error) {\n      return false;\n    }\n  }\n}\n",[231,2727,2728,2745,2753,2764,2768,2778,2793,2797,2805,2814,2833,2841,2855,2875,2879,2886,2891,2922,2927,2932,2962,2971,2976,2980,2988,3004,3012,3016,3020],{"__ignoreMap":229},[234,2729,2730,2732,2734,2736,2738,2741,2743],{"class":236,"line":237},[234,2731,579],{"class":315},[234,2733,582],{"class":383},[234,2735,386],{"class":319},[234,2737,335],{"class":315},[234,2739,2740],{"class":244},"\u002Fprivate-chat",[234,2742,335],{"class":315},[234,2744,594],{"class":319},[234,2746,2747,2749,2751],{"class":236,"line":341},[234,2748,579],{"class":315},[234,2750,602],{"class":383},[234,2752,605],{"class":319},[234,2754,2755,2757,2759,2762],{"class":236,"line":364},[234,2756,611],{"class":311},[234,2758,614],{"class":373},[234,2760,2761],{"class":240}," PrivateChatGateway",[234,2763,417],{"class":315},[234,2765,2766],{"class":236,"line":370},[234,2767,625],{"class":319},[234,2769,2770,2772,2775],{"class":236,"line":392},[234,2771,638],{"class":315},[234,2773,2774],{"class":383},"Inject",[234,2776,2777],{"class":319},"(AuthService)\n",[234,2779,2780,2782,2785,2788,2791],{"class":236,"line":420},[234,2781,1075],{"class":373},[234,2783,2784],{"class":432}," authService",[234,2786,2787],{"class":315},"!:",[234,2789,2790],{"class":240}," AuthService",[234,2792,338],{"class":315},[234,2794,2795],{"class":236,"line":442},[234,2796,625],{"class":319},[234,2798,2799,2801,2803],{"class":236,"line":448},[234,2800,638],{"class":315},[234,2802,641],{"class":383},[234,2804,605],{"class":319},[234,2806,2807,2809,2812],{"class":236,"line":571},[234,2808,649],{"class":373},[234,2810,2811],{"class":432}," validateConnection",[234,2813,655],{"class":315},[234,2815,2816,2818,2820,2822,2824,2826,2828,2830],{"class":236,"line":576},[234,2817,661],{"class":407},[234,2819,398],{"class":315},[234,2821,666],{"class":240},[234,2823,669],{"class":315},[234,2825,672],{"class":240},[234,2827,503],{"class":315},[234,2829,677],{"class":240},[234,2831,2832],{"class":315},">,\n",[234,2834,2835,2837,2839],{"class":236,"line":597},[234,2836,688],{"class":407},[234,2838,398],{"class":315},[234,2840,693],{"class":240},[234,2842,2843,2845,2847,2849,2851,2853],{"class":236,"line":608},[234,2844,699],{"class":315},[234,2846,702],{"class":240},[234,2848,669],{"class":315},[234,2850,707],{"class":240},[234,2852,710],{"class":315},[234,2854,417],{"class":315},[234,2856,2857,2859,2861,2863,2865,2867,2869,2871,2873],{"class":236,"line":622},[234,2858,724],{"class":373},[234,2860,727],{"class":319},[234,2862,730],{"class":315},[234,2864,733],{"class":319},[234,2866,426],{"class":315},[234,2868,738],{"class":319},[234,2870,741],{"class":311},[234,2872,744],{"class":240},[234,2874,338],{"class":315},[234,2876,2877],{"class":236,"line":628},[234,2878,752],{"class":432},[234,2880,2881,2884],{"class":236,"line":635},[234,2882,2883],{"class":311},"    try",[234,2885,417],{"class":315},[234,2887,2888],{"class":236,"line":646},[234,2889,2890],{"class":631},"      \u002F\u002F Validate JWT token\n",[234,2892,2893,2896,2898,2900,2903,2906,2909,2911,2914,2916,2918,2920],{"class":236,"line":658},[234,2894,2895],{"class":373},"      const",[234,2897,920],{"class":319},[234,2899,730],{"class":315},[234,2901,2902],{"class":311}," await",[234,2904,2905],{"class":315}," this.",[234,2907,2908],{"class":319},"authService",[234,2910,426],{"class":315},[234,2912,2913],{"class":383},"verifyToken",[234,2915,386],{"class":432},[234,2917,738],{"class":319},[234,2919,411],{"class":432},[234,2921,338],{"class":315},[234,2923,2924],{"class":236,"line":685},[234,2925,2926],{"class":432},"      \n",[234,2928,2929],{"class":236,"line":696},[234,2930,2931],{"class":631},"      \u002F\u002F Check permissions\n",[234,2933,2934,2937,2939,2941,2944,2946,2949,2951,2953,2956,2958,2960],{"class":236,"line":715},[234,2935,2936],{"class":311},"      if",[234,2938,404],{"class":432},[234,2940,763],{"class":315},[234,2942,2943],{"class":319},"user",[234,2945,426],{"class":315},[234,2947,2948],{"class":383},"hasPermission",[234,2950,386],{"class":432},[234,2952,335],{"class":315},[234,2954,2955],{"class":244},"access-private-chat",[234,2957,335],{"class":315},[234,2959,781],{"class":432},[234,2961,389],{"class":315},[234,2963,2964,2967,2969],{"class":236,"line":721},[234,2965,2966],{"class":311},"        return",[234,2968,793],{"class":792},[234,2970,338],{"class":315},[234,2972,2973],{"class":236,"line":749},[234,2974,2975],{"class":315},"      }\n",[234,2977,2978],{"class":236,"line":755},[234,2979,2926],{"class":432},[234,2981,2982,2984,2986],{"class":236,"line":786},[234,2983,789],{"class":311},[234,2985,819],{"class":792},[234,2987,338],{"class":315},[234,2989,2990,2993,2996,2998,3000,3002],{"class":236,"line":802},[234,2991,2992],{"class":315},"    }",[234,2994,2995],{"class":311}," catch",[234,2997,404],{"class":432},[234,2999,1429],{"class":319},[234,3001,2514],{"class":432},[234,3003,389],{"class":315},[234,3005,3006,3008,3010],{"class":236,"line":808},[234,3007,789],{"class":311},[234,3009,793],{"class":792},[234,3011,338],{"class":315},[234,3013,3014],{"class":236,"line":813},[234,3015,805],{"class":315},[234,3017,3018],{"class":236,"line":827},[234,3019,445],{"class":315},[234,3021,3022],{"class":236,"line":832},[234,3023,1120],{"class":315},[295,3025,3027],{"id":3026},"rejecting-connections","Rejecting Connections",[204,3029,3030,3031,3034],{},"Return ",[231,3032,3033],{},"false"," or throw an error to reject:",[223,3036,3038],{"className":301,"code":3037,"language":304,"meta":229,"style":229},"@OnConnectionAttempt()\nasync validateConnection(params: Record\u003Cstring, unknown>) {\n  if (!params.token) {\n    throw new Error('Token required');\n  }\n  \n  const isValid = await this.validateToken(params.token as string);\n  \n  if (!isValid) {\n    return false; \u002F\u002F Reject with 403\n  }\n  \n  return true;\n}\n",[231,3039,3040,3048,3073,3093,3116,3120,3124,3156,3160,3175,3186,3190,3194,3202],{"__ignoreMap":229},[234,3041,3042,3044,3046],{"class":236,"line":237},[234,3043,579],{"class":315},[234,3045,641],{"class":383},[234,3047,605],{"class":319},[234,3049,3050,3053,3056,3059,3061,3063,3065,3067,3069,3071],{"class":236,"line":341},[234,3051,3052],{"class":319},"async ",[234,3054,3055],{"class":383},"validateConnection",[234,3057,3058],{"class":319},"(params: Record",[234,3060,669],{"class":315},[234,3062,672],{"class":319},[234,3064,503],{"class":315},[234,3066,677],{"class":319},[234,3068,710],{"class":315},[234,3070,2514],{"class":319},[234,3072,389],{"class":315},[234,3074,3075,3078,3080,3082,3085,3087,3089,3091],{"class":236,"line":364},[234,3076,3077],{"class":311},"  if",[234,3079,404],{"class":432},[234,3081,763],{"class":315},[234,3083,3084],{"class":319},"params",[234,3086,426],{"class":315},[234,3088,738],{"class":319},[234,3090,2514],{"class":432},[234,3092,389],{"class":315},[234,3094,3095,3098,3100,3103,3105,3107,3110,3112,3114],{"class":236,"line":370},[234,3096,3097],{"class":311},"    throw",[234,3099,1040],{"class":315},[234,3101,3102],{"class":383}," Error",[234,3104,386],{"class":432},[234,3106,335],{"class":315},[234,3108,3109],{"class":244},"Token required",[234,3111,335],{"class":315},[234,3113,411],{"class":432},[234,3115,338],{"class":315},[234,3117,3118],{"class":236,"line":392},[234,3119,445],{"class":315},[234,3121,3122],{"class":236,"line":420},[234,3123,625],{"class":432},[234,3125,3126,3128,3131,3133,3135,3137,3140,3142,3144,3146,3148,3150,3152,3154],{"class":236,"line":442},[234,3127,1354],{"class":373},[234,3129,3130],{"class":319}," isValid",[234,3132,730],{"class":315},[234,3134,2902],{"class":311},[234,3136,2905],{"class":315},[234,3138,3139],{"class":383},"validateToken",[234,3141,386],{"class":432},[234,3143,3084],{"class":319},[234,3145,426],{"class":315},[234,3147,738],{"class":319},[234,3149,741],{"class":311},[234,3151,744],{"class":240},[234,3153,411],{"class":432},[234,3155,338],{"class":315},[234,3157,3158],{"class":236,"line":448},[234,3159,625],{"class":432},[234,3161,3162,3164,3166,3168,3171,3173],{"class":236,"line":571},[234,3163,3077],{"class":311},[234,3165,404],{"class":432},[234,3167,763],{"class":315},[234,3169,3170],{"class":319},"isValid",[234,3172,2514],{"class":432},[234,3174,389],{"class":315},[234,3176,3177,3179,3181,3183],{"class":236,"line":576},[234,3178,816],{"class":311},[234,3180,793],{"class":792},[234,3182,796],{"class":315},[234,3184,3185],{"class":631}," \u002F\u002F Reject with 403\n",[234,3187,3188],{"class":236,"line":597},[234,3189,445],{"class":315},[234,3191,3192],{"class":236,"line":608},[234,3193,625],{"class":432},[234,3195,3196,3198,3200],{"class":236,"line":622},[234,3197,2405],{"class":311},[234,3199,819],{"class":792},[234,3201,338],{"class":315},[234,3203,3204],{"class":236,"line":628},[234,3205,1120],{"class":315},[216,3207,3209],{"id":3208},"working-with-multiple-namespaces","Working with Multiple Namespaces",[204,3211,3212],{},"You can create multiple namespaces for different purposes:",[223,3214,3216],{"className":301,"code":3215,"language":304,"meta":229,"style":229},"\u002F\u002F Chat namespace\n@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  @Message({ event: 'message' })\n  handleMessage(data: any) { ... }\n}\n\n\u002F\u002F Notifications namespace\n@Namespace('\u002Fnotifications')\n@Controller()\nexport class NotificationsGateway {\n  @Message({ event: 'subscribe' })\n  handleSubscribe(data: any) { ... }\n}\n\n\u002F\u002F Admin namespace\n@Namespace('\u002Fadmin')\n@Controller()\nexport class AdminGateway {\n  @OnConnectionAttempt()\n  async validateAdmin(params: Record\u003Cstring, unknown>) {\n    \u002F\u002F Only allow admins\n    return this.authService.isAdmin(params.token);\n  }\n  \n  @Message({ event: 'broadcast' })\n  @Broadcast('admin-message')\n  handleBroadcast(data: any) { ... }\n}\n",[231,3217,3218,3223,3239,3247,3257,3281,3301,3305,3309,3313,3329,3337,3348,3373,3394,3398,3402,3407,3424,3432,3443,3451,3479,3484,3509,3513,3517,3542,3559,3580],{"__ignoreMap":229},[234,3219,3220],{"class":236,"line":237},[234,3221,3222],{"class":631},"\u002F\u002F Chat namespace\n",[234,3224,3225,3227,3229,3231,3233,3235,3237],{"class":236,"line":341},[234,3226,579],{"class":315},[234,3228,582],{"class":383},[234,3230,386],{"class":319},[234,3232,335],{"class":315},[234,3234,589],{"class":244},[234,3236,335],{"class":315},[234,3238,594],{"class":319},[234,3240,3241,3243,3245],{"class":236,"line":364},[234,3242,579],{"class":315},[234,3244,602],{"class":383},[234,3246,605],{"class":319},[234,3248,3249,3251,3253,3255],{"class":236,"line":370},[234,3250,611],{"class":311},[234,3252,614],{"class":373},[234,3254,617],{"class":240},[234,3256,417],{"class":315},[234,3258,3259,3261,3263,3265,3267,3269,3271,3273,3275,3277,3279],{"class":236,"line":392},[234,3260,638],{"class":315},[234,3262,848],{"class":383},[234,3264,386],{"class":319},[234,3266,853],{"class":315},[234,3268,856],{"class":432},[234,3270,398],{"class":315},[234,3272,329],{"class":315},[234,3274,863],{"class":244},[234,3276,335],{"class":315},[234,3278,323],{"class":315},[234,3280,594],{"class":319},[234,3282,3283,3285,3287,3289,3291,3293,3295,3297,3299],{"class":236,"line":420},[234,3284,1941],{"class":432},[234,3286,386],{"class":315},[234,3288,1376],{"class":407},[234,3290,398],{"class":315},[234,3292,1950],{"class":240},[234,3294,411],{"class":315},[234,3296,316],{"class":315},[234,3298,1646],{"class":315},[234,3300,1649],{"class":315},[234,3302,3303],{"class":236,"line":442},[234,3304,1120],{"class":315},[234,3306,3307],{"class":236,"line":448},[234,3308,367],{"emptyLinePlaceholder":56},[234,3310,3311],{"class":236,"line":571},[234,3312,1568],{"class":631},[234,3314,3315,3317,3319,3321,3323,3325,3327],{"class":236,"line":576},[234,3316,579],{"class":315},[234,3318,582],{"class":383},[234,3320,386],{"class":319},[234,3322,335],{"class":315},[234,3324,1560],{"class":244},[234,3326,335],{"class":315},[234,3328,594],{"class":319},[234,3330,3331,3333,3335],{"class":236,"line":597},[234,3332,579],{"class":315},[234,3334,602],{"class":383},[234,3336,605],{"class":319},[234,3338,3339,3341,3343,3346],{"class":236,"line":608},[234,3340,611],{"class":311},[234,3342,614],{"class":373},[234,3344,3345],{"class":240}," NotificationsGateway",[234,3347,417],{"class":315},[234,3349,3350,3352,3354,3356,3358,3360,3362,3364,3367,3369,3371],{"class":236,"line":622},[234,3351,638],{"class":315},[234,3353,848],{"class":383},[234,3355,386],{"class":319},[234,3357,853],{"class":315},[234,3359,856],{"class":432},[234,3361,398],{"class":315},[234,3363,329],{"class":315},[234,3365,3366],{"class":244},"subscribe",[234,3368,335],{"class":315},[234,3370,323],{"class":315},[234,3372,594],{"class":319},[234,3374,3375,3378,3380,3382,3384,3386,3388,3390,3392],{"class":236,"line":628},[234,3376,3377],{"class":432},"  handleSubscribe",[234,3379,386],{"class":315},[234,3381,1376],{"class":407},[234,3383,398],{"class":315},[234,3385,1950],{"class":240},[234,3387,411],{"class":315},[234,3389,316],{"class":315},[234,3391,1646],{"class":315},[234,3393,1649],{"class":315},[234,3395,3396],{"class":236,"line":635},[234,3397,1120],{"class":315},[234,3399,3400],{"class":236,"line":646},[234,3401,367],{"emptyLinePlaceholder":56},[234,3403,3404],{"class":236,"line":658},[234,3405,3406],{"class":631},"\u002F\u002F Admin namespace\n",[234,3408,3409,3411,3413,3415,3417,3420,3422],{"class":236,"line":685},[234,3410,579],{"class":315},[234,3412,582],{"class":383},[234,3414,386],{"class":319},[234,3416,335],{"class":315},[234,3418,3419],{"class":244},"\u002Fadmin",[234,3421,335],{"class":315},[234,3423,594],{"class":319},[234,3425,3426,3428,3430],{"class":236,"line":696},[234,3427,579],{"class":315},[234,3429,602],{"class":383},[234,3431,605],{"class":319},[234,3433,3434,3436,3438,3441],{"class":236,"line":715},[234,3435,611],{"class":311},[234,3437,614],{"class":373},[234,3439,3440],{"class":240}," AdminGateway",[234,3442,417],{"class":315},[234,3444,3445,3447,3449],{"class":236,"line":721},[234,3446,638],{"class":315},[234,3448,641],{"class":383},[234,3450,605],{"class":319},[234,3452,3453,3455,3458,3460,3462,3464,3466,3468,3470,3472,3474,3477],{"class":236,"line":749},[234,3454,649],{"class":373},[234,3456,3457],{"class":432}," validateAdmin",[234,3459,386],{"class":315},[234,3461,3084],{"class":407},[234,3463,398],{"class":315},[234,3465,666],{"class":240},[234,3467,669],{"class":315},[234,3469,672],{"class":240},[234,3471,503],{"class":315},[234,3473,677],{"class":240},[234,3475,3476],{"class":315},">)",[234,3478,417],{"class":315},[234,3480,3481],{"class":236,"line":755},[234,3482,3483],{"class":631},"    \u002F\u002F Only allow admins\n",[234,3485,3486,3488,3490,3492,3494,3497,3499,3501,3503,3505,3507],{"class":236,"line":786},[234,3487,816],{"class":311},[234,3489,2905],{"class":315},[234,3491,2908],{"class":319},[234,3493,426],{"class":315},[234,3495,3496],{"class":383},"isAdmin",[234,3498,386],{"class":432},[234,3500,3084],{"class":319},[234,3502,426],{"class":315},[234,3504,738],{"class":319},[234,3506,411],{"class":432},[234,3508,338],{"class":315},[234,3510,3511],{"class":236,"line":802},[234,3512,445],{"class":315},[234,3514,3515],{"class":236,"line":808},[234,3516,625],{"class":319},[234,3518,3519,3521,3523,3525,3527,3529,3531,3533,3536,3538,3540],{"class":236,"line":813},[234,3520,638],{"class":315},[234,3522,848],{"class":383},[234,3524,386],{"class":319},[234,3526,853],{"class":315},[234,3528,856],{"class":432},[234,3530,398],{"class":315},[234,3532,329],{"class":315},[234,3534,3535],{"class":244},"broadcast",[234,3537,335],{"class":315},[234,3539,323],{"class":315},[234,3541,594],{"class":319},[234,3543,3544,3546,3548,3550,3552,3555,3557],{"class":236,"line":827},[234,3545,638],{"class":315},[234,3547,2480],{"class":383},[234,3549,386],{"class":319},[234,3551,335],{"class":315},[234,3553,3554],{"class":244},"admin-message",[234,3556,335],{"class":315},[234,3558,594],{"class":319},[234,3560,3561,3564,3566,3568,3570,3572,3574,3576,3578],{"class":236,"line":832},[234,3562,3563],{"class":432},"  handleBroadcast",[234,3565,386],{"class":315},[234,3567,1376],{"class":407},[234,3569,398],{"class":315},[234,3571,1950],{"class":240},[234,3573,411],{"class":315},[234,3575,316],{"class":315},[234,3577,1646],{"class":315},[234,3579,1649],{"class":315},[234,3581,3582],{"class":236,"line":837},[234,3583,1120],{"class":315},[204,3585,3586],{},"Clients connect to different URLs:",[1573,3588,3589,3595,3601],{},[1576,3590,3591,3594],{},[231,3592,3593],{},"ws:\u002F\u002Fserver.com\u002Fchat"," - Chat namespace",[1576,3596,3597,3600],{},[231,3598,3599],{},"ws:\u002F\u002Fserver.com\u002Fnotifications"," - Notifications",[1576,3602,3603,3606],{},[231,3604,3605],{},"ws:\u002F\u002Fserver.com\u002Fadmin"," - Admin only",[216,3608,3610],{"id":3609},"advanced-patterns","Advanced Patterns",[295,3612,3614],{"id":3613},"room-based-messaging","Room-Based Messaging",[204,3616,3617],{},"Implement room functionality using namespaces and filtering:",[223,3619,3621],{"className":301,"code":3620,"language":304,"meta":229,"style":229},"@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  private rooms = new Map\u003Cstring, Set\u003Cstring>>(); \u002F\u002F room -> peer IDs\n  \n  @Inject($WebsocketService)\n  private ws!: WebsocketService;\n  \n  @Message({ event: 'join-room' })\n  joinRoom(data: { room: string }, peer: Peer) {\n    if (!this.rooms.has(data.room)) {\n      this.rooms.set(data.room, new Set());\n    }\n    \n    this.rooms.get(data.room)!.add(peer.id);\n    \n    \u002F\u002F Notify room members\n    this.broadcastToRoom(data.room, 'user-joined', {\n      userId: peer.id,\n      room: data.room\n    }, peer);\n  }\n  \n  @Message({ event: 'room-message' })\n  sendToRoom(data: { room: string; text: string }, peer: Peer) {\n    this.broadcastToRoom(data.room, 'message', {\n      from: peer.id,\n      text: data.text\n    }, peer);\n  }\n  \n  private broadcastToRoom(\n    room: string, \n    event: string, \n    data: any,\n    sender: Peer\n  ) {\n    const roomPeers = this.rooms.get(room);\n    if (!roomPeers) return;\n    \n    \u002F\u002F Send to all peers in room except sender\n    for (const peerId of roomPeers) {\n      if (peerId !== sender.id) {\n        \u002F\u002F You'd need to track peers separately\n        \u002F\u002F This is a simplified example\n      }\n    }\n  }\n}\n",[231,3622,3623,3639,3647,3657,3694,3698,3707,3721,3725,3750,3782,3812,3843,3847,3851,3891,3895,3900,3927,3942,3956,3967,3971,3975,4000,4039,4065,4080,4093,4103,4107,4111,4120,4133,4145,4155,4164,4170,4195,4213,4217,4222,4243,4266,4271,4276,4280,4284,4288],{"__ignoreMap":229},[234,3624,3625,3627,3629,3631,3633,3635,3637],{"class":236,"line":237},[234,3626,579],{"class":315},[234,3628,582],{"class":383},[234,3630,386],{"class":319},[234,3632,335],{"class":315},[234,3634,589],{"class":244},[234,3636,335],{"class":315},[234,3638,594],{"class":319},[234,3640,3641,3643,3645],{"class":236,"line":341},[234,3642,579],{"class":315},[234,3644,602],{"class":383},[234,3646,605],{"class":319},[234,3648,3649,3651,3653,3655],{"class":236,"line":364},[234,3650,611],{"class":311},[234,3652,614],{"class":373},[234,3654,617],{"class":240},[234,3656,417],{"class":315},[234,3658,3659,3661,3664,3666,3668,3671,3673,3675,3677,3680,3682,3684,3687,3689,3691],{"class":236,"line":370},[234,3660,1075],{"class":373},[234,3662,3663],{"class":432}," rooms",[234,3665,730],{"class":315},[234,3667,1040],{"class":315},[234,3669,3670],{"class":432}," Map",[234,3672,669],{"class":315},[234,3674,672],{"class":240},[234,3676,503],{"class":315},[234,3678,3679],{"class":240}," Set",[234,3681,669],{"class":315},[234,3683,672],{"class":240},[234,3685,3686],{"class":315},">>",[234,3688,1046],{"class":319},[234,3690,796],{"class":315},[234,3692,3693],{"class":631}," \u002F\u002F room -> peer IDs\n",[234,3695,3696],{"class":236,"line":392},[234,3697,625],{"class":319},[234,3699,3700,3702,3704],{"class":236,"line":420},[234,3701,638],{"class":315},[234,3703,2774],{"class":383},[234,3705,3706],{"class":319},"($WebsocketService)\n",[234,3708,3709,3711,3714,3716,3719],{"class":236,"line":442},[234,3710,1075],{"class":373},[234,3712,3713],{"class":432}," ws",[234,3715,2787],{"class":315},[234,3717,3718],{"class":240}," WebsocketService",[234,3720,338],{"class":315},[234,3722,3723],{"class":236,"line":448},[234,3724,625],{"class":319},[234,3726,3727,3729,3731,3733,3735,3737,3739,3741,3744,3746,3748],{"class":236,"line":571},[234,3728,638],{"class":315},[234,3730,848],{"class":383},[234,3732,386],{"class":319},[234,3734,853],{"class":315},[234,3736,856],{"class":432},[234,3738,398],{"class":315},[234,3740,329],{"class":315},[234,3742,3743],{"class":244},"join-room",[234,3745,335],{"class":315},[234,3747,323],{"class":315},[234,3749,594],{"class":319},[234,3751,3752,3755,3757,3759,3761,3763,3766,3768,3770,3772,3774,3776,3778,3780],{"class":236,"line":576},[234,3753,3754],{"class":432},"  joinRoom",[234,3756,386],{"class":315},[234,3758,1376],{"class":407},[234,3760,398],{"class":315},[234,3762,316],{"class":315},[234,3764,3765],{"class":432}," room",[234,3767,398],{"class":315},[234,3769,744],{"class":240},[234,3771,927],{"class":315},[234,3773,1955],{"class":407},[234,3775,398],{"class":315},[234,3777,556],{"class":240},[234,3779,411],{"class":315},[234,3781,417],{"class":315},[234,3783,3784,3786,3788,3791,3794,3796,3799,3801,3803,3805,3808,3810],{"class":236,"line":597},[234,3785,758],{"class":311},[234,3787,404],{"class":432},[234,3789,3790],{"class":315},"!this.",[234,3792,3793],{"class":319},"rooms",[234,3795,426],{"class":315},[234,3797,3798],{"class":383},"has",[234,3800,386],{"class":432},[234,3802,1376],{"class":319},[234,3804,426],{"class":315},[234,3806,3807],{"class":319},"room",[234,3809,781],{"class":432},[234,3811,389],{"class":315},[234,3813,3814,3817,3819,3821,3824,3826,3828,3830,3832,3834,3836,3838,3841],{"class":236,"line":608},[234,3815,3816],{"class":315},"      this.",[234,3818,3793],{"class":319},[234,3820,426],{"class":315},[234,3822,3823],{"class":383},"set",[234,3825,386],{"class":432},[234,3827,1376],{"class":319},[234,3829,426],{"class":315},[234,3831,3807],{"class":319},[234,3833,503],{"class":315},[234,3835,1040],{"class":315},[234,3837,3679],{"class":383},[234,3839,3840],{"class":432},"())",[234,3842,338],{"class":315},[234,3844,3845],{"class":236,"line":622},[234,3846,805],{"class":315},[234,3848,3849],{"class":236,"line":628},[234,3850,752],{"class":432},[234,3852,3853,3856,3858,3860,3863,3865,3867,3869,3871,3873,3876,3879,3881,3883,3885,3887,3889],{"class":236,"line":635},[234,3854,3855],{"class":315},"    this.",[234,3857,3793],{"class":319},[234,3859,426],{"class":315},[234,3861,3862],{"class":383},"get",[234,3864,386],{"class":432},[234,3866,1376],{"class":319},[234,3868,426],{"class":315},[234,3870,3807],{"class":319},[234,3872,411],{"class":432},[234,3874,3875],{"class":315},"!.",[234,3877,3878],{"class":383},"add",[234,3880,386],{"class":432},[234,3882,973],{"class":319},[234,3884,426],{"class":315},[234,3886,978],{"class":319},[234,3888,411],{"class":432},[234,3890,338],{"class":315},[234,3892,3893],{"class":236,"line":646},[234,3894,752],{"class":432},[234,3896,3897],{"class":236,"line":658},[234,3898,3899],{"class":631},"    \u002F\u002F Notify room members\n",[234,3901,3902,3904,3907,3909,3911,3913,3915,3917,3919,3921,3923,3925],{"class":236,"line":685},[234,3903,3855],{"class":315},[234,3905,3906],{"class":383},"broadcastToRoom",[234,3908,386],{"class":432},[234,3910,1376],{"class":319},[234,3912,426],{"class":315},[234,3914,3807],{"class":319},[234,3916,503],{"class":315},[234,3918,329],{"class":315},[234,3920,2467],{"class":244},[234,3922,335],{"class":315},[234,3924,503],{"class":315},[234,3926,417],{"class":315},[234,3928,3929,3932,3934,3936,3938,3940],{"class":236,"line":696},[234,3930,3931],{"class":432},"      userId",[234,3933,398],{"class":315},[234,3935,1955],{"class":319},[234,3937,426],{"class":315},[234,3939,978],{"class":319},[234,3941,1029],{"class":315},[234,3943,3944,3947,3949,3951,3953],{"class":236,"line":715},[234,3945,3946],{"class":432},"      room",[234,3948,398],{"class":315},[234,3950,989],{"class":319},[234,3952,426],{"class":315},[234,3954,3955],{"class":319},"room\n",[234,3957,3958,3961,3963,3965],{"class":236,"line":721},[234,3959,3960],{"class":315},"    },",[234,3962,1955],{"class":319},[234,3964,411],{"class":432},[234,3966,338],{"class":315},[234,3968,3969],{"class":236,"line":749},[234,3970,445],{"class":315},[234,3972,3973],{"class":236,"line":755},[234,3974,625],{"class":319},[234,3976,3977,3979,3981,3983,3985,3987,3989,3991,3994,3996,3998],{"class":236,"line":786},[234,3978,638],{"class":315},[234,3980,848],{"class":383},[234,3982,386],{"class":319},[234,3984,853],{"class":315},[234,3986,856],{"class":432},[234,3988,398],{"class":315},[234,3990,329],{"class":315},[234,3992,3993],{"class":244},"room-message",[234,3995,335],{"class":315},[234,3997,323],{"class":315},[234,3999,594],{"class":319},[234,4001,4002,4005,4007,4009,4011,4013,4015,4017,4019,4021,4023,4025,4027,4029,4031,4033,4035,4037],{"class":236,"line":802},[234,4003,4004],{"class":432},"  sendToRoom",[234,4006,386],{"class":315},[234,4008,1376],{"class":407},[234,4010,398],{"class":315},[234,4012,316],{"class":315},[234,4014,3765],{"class":432},[234,4016,398],{"class":315},[234,4018,744],{"class":240},[234,4020,796],{"class":315},[234,4022,911],{"class":432},[234,4024,398],{"class":315},[234,4026,744],{"class":240},[234,4028,927],{"class":315},[234,4030,1955],{"class":407},[234,4032,398],{"class":315},[234,4034,556],{"class":240},[234,4036,411],{"class":315},[234,4038,417],{"class":315},[234,4040,4041,4043,4045,4047,4049,4051,4053,4055,4057,4059,4061,4063],{"class":236,"line":808},[234,4042,3855],{"class":315},[234,4044,3906],{"class":383},[234,4046,386],{"class":432},[234,4048,1376],{"class":319},[234,4050,426],{"class":315},[234,4052,3807],{"class":319},[234,4054,503],{"class":315},[234,4056,329],{"class":315},[234,4058,863],{"class":244},[234,4060,335],{"class":315},[234,4062,503],{"class":315},[234,4064,417],{"class":315},[234,4066,4067,4070,4072,4074,4076,4078],{"class":236,"line":813},[234,4068,4069],{"class":432},"      from",[234,4071,398],{"class":315},[234,4073,1955],{"class":319},[234,4075,426],{"class":315},[234,4077,978],{"class":319},[234,4079,1029],{"class":315},[234,4081,4082,4084,4086,4088,4090],{"class":236,"line":827},[234,4083,1273],{"class":432},[234,4085,398],{"class":315},[234,4087,989],{"class":319},[234,4089,426],{"class":315},[234,4091,4092],{"class":319},"text\n",[234,4094,4095,4097,4099,4101],{"class":236,"line":832},[234,4096,3960],{"class":315},[234,4098,1955],{"class":319},[234,4100,411],{"class":432},[234,4102,338],{"class":315},[234,4104,4105],{"class":236,"line":837},[234,4106,445],{"class":315},[234,4108,4109],{"class":236,"line":843},[234,4110,625],{"class":319},[234,4112,4113,4115,4118],{"class":236,"line":872},[234,4114,1075],{"class":373},[234,4116,4117],{"class":432}," broadcastToRoom",[234,4119,655],{"class":315},[234,4121,4122,4125,4127,4129,4131],{"class":236,"line":891},[234,4123,4124],{"class":407},"    room",[234,4126,398],{"class":315},[234,4128,744],{"class":240},[234,4130,503],{"class":315},[234,4132,495],{"class":319},[234,4134,4135,4137,4139,4141,4143],{"class":236,"line":901},[234,4136,1250],{"class":407},[234,4138,398],{"class":315},[234,4140,744],{"class":240},[234,4142,503],{"class":315},[234,4144,495],{"class":319},[234,4146,4147,4149,4151,4153],{"class":236,"line":932},[234,4148,904],{"class":407},[234,4150,398],{"class":315},[234,4152,1950],{"class":240},[234,4154,1029],{"class":315},[234,4156,4157,4160,4162],{"class":236,"line":943},[234,4158,4159],{"class":407},"    sender",[234,4161,398],{"class":315},[234,4163,940],{"class":240},[234,4165,4166,4168],{"class":236,"line":951},[234,4167,946],{"class":315},[234,4169,417],{"class":315},[234,4171,4172,4174,4177,4179,4181,4183,4185,4187,4189,4191,4193],{"class":236,"line":996},[234,4173,724],{"class":373},[234,4175,4176],{"class":319}," roomPeers",[234,4178,730],{"class":315},[234,4180,2905],{"class":315},[234,4182,3793],{"class":319},[234,4184,426],{"class":315},[234,4186,3862],{"class":383},[234,4188,386],{"class":432},[234,4190,3807],{"class":319},[234,4192,411],{"class":432},[234,4194,338],{"class":315},[234,4196,4197,4199,4201,4203,4206,4208,4211],{"class":236,"line":1001},[234,4198,758],{"class":311},[234,4200,404],{"class":432},[234,4202,763],{"class":315},[234,4204,4205],{"class":319},"roomPeers",[234,4207,2514],{"class":432},[234,4209,4210],{"class":311},"return",[234,4212,338],{"class":315},[234,4214,4215],{"class":236,"line":1007},[234,4216,752],{"class":432},[234,4218,4219],{"class":236,"line":1014},[234,4220,4221],{"class":631},"    \u002F\u002F Send to all peers in room except sender\n",[234,4223,4224,4227,4229,4231,4234,4237,4239,4241],{"class":236,"line":1032},[234,4225,4226],{"class":311},"    for",[234,4228,404],{"class":432},[234,4230,374],{"class":373},[234,4232,4233],{"class":319}," peerId",[234,4235,4236],{"class":315}," of",[234,4238,4176],{"class":319},[234,4240,2514],{"class":432},[234,4242,389],{"class":315},[234,4244,4245,4247,4249,4252,4255,4258,4260,4262,4264],{"class":236,"line":1056},[234,4246,2936],{"class":311},[234,4248,404],{"class":432},[234,4250,4251],{"class":319},"peerId",[234,4253,4254],{"class":315}," !==",[234,4256,4257],{"class":319}," sender",[234,4259,426],{"class":315},[234,4261,978],{"class":319},[234,4263,2514],{"class":432},[234,4265,389],{"class":315},[234,4267,4268],{"class":236,"line":1062},[234,4269,4270],{"class":631},"        \u002F\u002F You'd need to track peers separately\n",[234,4272,4273],{"class":236,"line":1067},[234,4274,4275],{"class":631},"        \u002F\u002F This is a simplified example\n",[234,4277,4278],{"class":236,"line":1072},[234,4279,2975],{"class":315},[234,4281,4282],{"class":236,"line":1097},[234,4283,805],{"class":315},[234,4285,4286],{"class":236,"line":1103},[234,4287,445],{"class":315},[234,4289,4290],{"class":236,"line":1112},[234,4291,1120],{"class":315},[295,4293,4295],{"id":4294},"private-messaging","Private Messaging",[204,4297,4298],{},"Send messages between specific peers:",[223,4300,4302],{"className":301,"code":4301,"language":304,"meta":229,"style":229},"@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  private peers = new Map\u003Cstring, Peer>(); \u002F\u002F userId -> Peer\n  \n  @Message({ event: 'register' })\n  registerUser(data: { userId: string }, peer: Peer) {\n    this.peers.set(data.userId, peer);\n  }\n  \n  @Message({ event: 'private-message' })\n  sendPrivate(data: { to: string; text: string }, sender: Peer) {\n    const recipient = this.peers.get(data.to);\n    \n    if (recipient) {\n      recipient.send({\n        event: 'private-message',\n        data: {\n          from: sender.id,\n          text: data.text\n        }\n      });\n      \n      return { status: 'delivered' };\n    }\n    \n    return { status: 'user-offline' };\n  }\n}\n",[231,4303,4304,4320,4328,4338,4368,4372,4397,4429,4456,4460,4464,4489,4529,4559,4563,4576,4589,4604,4613,4628,4641,4646,4655,4659,4680,4684,4688,4707,4711],{"__ignoreMap":229},[234,4305,4306,4308,4310,4312,4314,4316,4318],{"class":236,"line":237},[234,4307,579],{"class":315},[234,4309,582],{"class":383},[234,4311,386],{"class":319},[234,4313,335],{"class":315},[234,4315,589],{"class":244},[234,4317,335],{"class":315},[234,4319,594],{"class":319},[234,4321,4322,4324,4326],{"class":236,"line":341},[234,4323,579],{"class":315},[234,4325,602],{"class":383},[234,4327,605],{"class":319},[234,4329,4330,4332,4334,4336],{"class":236,"line":364},[234,4331,611],{"class":311},[234,4333,614],{"class":373},[234,4335,617],{"class":240},[234,4337,417],{"class":315},[234,4339,4340,4342,4345,4347,4349,4351,4353,4355,4357,4359,4361,4363,4365],{"class":236,"line":370},[234,4341,1075],{"class":373},[234,4343,4344],{"class":432}," peers",[234,4346,730],{"class":315},[234,4348,1040],{"class":315},[234,4350,3670],{"class":432},[234,4352,669],{"class":315},[234,4354,672],{"class":240},[234,4356,503],{"class":315},[234,4358,556],{"class":240},[234,4360,710],{"class":315},[234,4362,1046],{"class":319},[234,4364,796],{"class":315},[234,4366,4367],{"class":631}," \u002F\u002F userId -> Peer\n",[234,4369,4370],{"class":236,"line":392},[234,4371,625],{"class":319},[234,4373,4374,4376,4378,4380,4382,4384,4386,4388,4391,4393,4395],{"class":236,"line":420},[234,4375,638],{"class":315},[234,4377,848],{"class":383},[234,4379,386],{"class":319},[234,4381,853],{"class":315},[234,4383,856],{"class":432},[234,4385,398],{"class":315},[234,4387,329],{"class":315},[234,4389,4390],{"class":244},"register",[234,4392,335],{"class":315},[234,4394,323],{"class":315},[234,4396,594],{"class":319},[234,4398,4399,4402,4404,4406,4408,4410,4413,4415,4417,4419,4421,4423,4425,4427],{"class":236,"line":442},[234,4400,4401],{"class":432},"  registerUser",[234,4403,386],{"class":315},[234,4405,1376],{"class":407},[234,4407,398],{"class":315},[234,4409,316],{"class":315},[234,4411,4412],{"class":432}," userId",[234,4414,398],{"class":315},[234,4416,744],{"class":240},[234,4418,927],{"class":315},[234,4420,1955],{"class":407},[234,4422,398],{"class":315},[234,4424,556],{"class":240},[234,4426,411],{"class":315},[234,4428,417],{"class":315},[234,4430,4431,4433,4435,4437,4439,4441,4443,4445,4448,4450,4452,4454],{"class":236,"line":448},[234,4432,3855],{"class":315},[234,4434,1692],{"class":319},[234,4436,426],{"class":315},[234,4438,3823],{"class":383},[234,4440,386],{"class":432},[234,4442,1376],{"class":319},[234,4444,426],{"class":315},[234,4446,4447],{"class":319},"userId",[234,4449,503],{"class":315},[234,4451,1955],{"class":319},[234,4453,411],{"class":432},[234,4455,338],{"class":315},[234,4457,4458],{"class":236,"line":571},[234,4459,445],{"class":315},[234,4461,4462],{"class":236,"line":576},[234,4463,625],{"class":319},[234,4465,4466,4468,4470,4472,4474,4476,4478,4480,4483,4485,4487],{"class":236,"line":597},[234,4467,638],{"class":315},[234,4469,848],{"class":383},[234,4471,386],{"class":319},[234,4473,853],{"class":315},[234,4475,856],{"class":432},[234,4477,398],{"class":315},[234,4479,329],{"class":315},[234,4481,4482],{"class":244},"private-message",[234,4484,335],{"class":315},[234,4486,323],{"class":315},[234,4488,594],{"class":319},[234,4490,4491,4494,4496,4498,4500,4502,4505,4507,4509,4511,4513,4515,4517,4519,4521,4523,4525,4527],{"class":236,"line":608},[234,4492,4493],{"class":432},"  sendPrivate",[234,4495,386],{"class":315},[234,4497,1376],{"class":407},[234,4499,398],{"class":315},[234,4501,316],{"class":315},[234,4503,4504],{"class":432}," to",[234,4506,398],{"class":315},[234,4508,744],{"class":240},[234,4510,796],{"class":315},[234,4512,911],{"class":432},[234,4514,398],{"class":315},[234,4516,744],{"class":240},[234,4518,927],{"class":315},[234,4520,4257],{"class":407},[234,4522,398],{"class":315},[234,4524,556],{"class":240},[234,4526,411],{"class":315},[234,4528,417],{"class":315},[234,4530,4531,4533,4536,4538,4540,4542,4544,4546,4548,4550,4552,4555,4557],{"class":236,"line":622},[234,4532,724],{"class":373},[234,4534,4535],{"class":319}," recipient",[234,4537,730],{"class":315},[234,4539,2905],{"class":315},[234,4541,1692],{"class":319},[234,4543,426],{"class":315},[234,4545,3862],{"class":383},[234,4547,386],{"class":432},[234,4549,1376],{"class":319},[234,4551,426],{"class":315},[234,4553,4554],{"class":319},"to",[234,4556,411],{"class":432},[234,4558,338],{"class":315},[234,4560,4561],{"class":236,"line":628},[234,4562,752],{"class":432},[234,4564,4565,4567,4569,4572,4574],{"class":236,"line":635},[234,4566,758],{"class":311},[234,4568,404],{"class":432},[234,4570,4571],{"class":319},"recipient",[234,4573,2514],{"class":432},[234,4575,389],{"class":315},[234,4577,4578,4581,4583,4585,4587],{"class":236,"line":646},[234,4579,4580],{"class":319},"      recipient",[234,4582,426],{"class":315},[234,4584,1231],{"class":383},[234,4586,386],{"class":432},[234,4588,389],{"class":315},[234,4590,4591,4594,4596,4598,4600,4602],{"class":236,"line":658},[234,4592,4593],{"class":432},"        event",[234,4595,398],{"class":315},[234,4597,329],{"class":315},[234,4599,4482],{"class":244},[234,4601,335],{"class":315},[234,4603,1029],{"class":315},[234,4605,4606,4609,4611],{"class":236,"line":685},[234,4607,4608],{"class":432},"        data",[234,4610,398],{"class":315},[234,4612,417],{"class":315},[234,4614,4615,4618,4620,4622,4624,4626],{"class":236,"line":696},[234,4616,4617],{"class":432},"          from",[234,4619,398],{"class":315},[234,4621,4257],{"class":319},[234,4623,426],{"class":315},[234,4625,978],{"class":319},[234,4627,1029],{"class":315},[234,4629,4630,4633,4635,4637,4639],{"class":236,"line":715},[234,4631,4632],{"class":432},"          text",[234,4634,398],{"class":315},[234,4636,989],{"class":319},[234,4638,426],{"class":315},[234,4640,4092],{"class":319},[234,4642,4643],{"class":236,"line":721},[234,4644,4645],{"class":315},"        }\n",[234,4647,4648,4651,4653],{"class":236,"line":749},[234,4649,4650],{"class":315},"      }",[234,4652,411],{"class":432},[234,4654,338],{"class":315},[234,4656,4657],{"class":236,"line":755},[234,4658,2926],{"class":432},[234,4660,4661,4663,4665,4668,4670,4672,4675,4677],{"class":236,"line":786},[234,4662,789],{"class":311},[234,4664,316],{"class":315},[234,4666,4667],{"class":432}," status",[234,4669,398],{"class":315},[234,4671,329],{"class":315},[234,4673,4674],{"class":244},"delivered",[234,4676,335],{"class":315},[234,4678,4679],{"class":315}," };\n",[234,4681,4682],{"class":236,"line":802},[234,4683,805],{"class":315},[234,4685,4686],{"class":236,"line":808},[234,4687,752],{"class":432},[234,4689,4690,4692,4694,4696,4698,4700,4703,4705],{"class":236,"line":813},[234,4691,816],{"class":311},[234,4693,316],{"class":315},[234,4695,4667],{"class":432},[234,4697,398],{"class":315},[234,4699,329],{"class":315},[234,4701,4702],{"class":244},"user-offline",[234,4704,335],{"class":315},[234,4706,4679],{"class":315},[234,4708,4709],{"class":236,"line":827},[234,4710,445],{"class":315},[234,4712,4713],{"class":236,"line":832},[234,4714,1120],{"class":315},[295,4716,4718],{"id":4717},"heartbeat-ping-pong","Heartbeat \u002F Ping-Pong",[204,4720,4721],{},"Keep connections alive and detect disconnects:",[223,4723,4725],{"className":301,"code":4724,"language":304,"meta":229,"style":229},"@Namespace('\u002Frealtime')\n@Controller()\nexport class RealtimeGateway {\n  \n  @Message({ event: 'ping' })\n  @Emit('pong')\n  handlePing() {\n    return { timestamp: Date.now() };\n  }\n}\n\n\u002F\u002F Client-side\nconst ws = new WebSocket('ws:\u002F\u002Fserver.com\u002Frealtime');\nlet pingInterval: NodeJS.Timeout;\n\nws.onopen = () => {\n  \u002F\u002F Send ping every 30 seconds\n  pingInterval = setInterval(() => {\n    ws.send(JSON.stringify({ event: 'ping', data: {} }));\n  }, 30000);\n};\n\nws.onclose = () => {\n  clearInterval(pingInterval);\n};\n",[231,4726,4727,4744,4752,4763,4767,4791,4807,4816,4836,4840,4844,4848,4853,4878,4898,4902,4918,4923,4941,4987,4999,5003,5007,5023,5037],{"__ignoreMap":229},[234,4728,4729,4731,4733,4735,4737,4740,4742],{"class":236,"line":237},[234,4730,579],{"class":315},[234,4732,582],{"class":383},[234,4734,386],{"class":319},[234,4736,335],{"class":315},[234,4738,4739],{"class":244},"\u002Frealtime",[234,4741,335],{"class":315},[234,4743,594],{"class":319},[234,4745,4746,4748,4750],{"class":236,"line":341},[234,4747,579],{"class":315},[234,4749,602],{"class":383},[234,4751,605],{"class":319},[234,4753,4754,4756,4758,4761],{"class":236,"line":364},[234,4755,611],{"class":311},[234,4757,614],{"class":373},[234,4759,4760],{"class":240}," RealtimeGateway",[234,4762,417],{"class":315},[234,4764,4765],{"class":236,"line":370},[234,4766,625],{"class":319},[234,4768,4769,4771,4773,4775,4777,4779,4781,4783,4785,4787,4789],{"class":236,"line":392},[234,4770,638],{"class":315},[234,4772,848],{"class":383},[234,4774,386],{"class":319},[234,4776,853],{"class":315},[234,4778,856],{"class":432},[234,4780,398],{"class":315},[234,4782,329],{"class":315},[234,4784,2368],{"class":244},[234,4786,335],{"class":315},[234,4788,323],{"class":315},[234,4790,594],{"class":319},[234,4792,4793,4795,4797,4799,4801,4803,4805],{"class":236,"line":420},[234,4794,638],{"class":315},[234,4796,877],{"class":383},[234,4798,386],{"class":319},[234,4800,335],{"class":315},[234,4802,2387],{"class":244},[234,4804,335],{"class":315},[234,4806,594],{"class":319},[234,4808,4809,4812,4814],{"class":236,"line":442},[234,4810,4811],{"class":432},"  handlePing",[234,4813,1046],{"class":315},[234,4815,417],{"class":315},[234,4817,4818,4820,4822,4824,4826,4828,4830,4832,4834],{"class":236,"line":448},[234,4819,816],{"class":311},[234,4821,316],{"class":315},[234,4823,2410],{"class":432},[234,4825,398],{"class":315},[234,4827,1043],{"class":319},[234,4829,426],{"class":315},[234,4831,2419],{"class":383},[234,4833,1683],{"class":432},[234,4835,1318],{"class":315},[234,4837,4838],{"class":236,"line":571},[234,4839,445],{"class":315},[234,4841,4842],{"class":236,"line":576},[234,4843,1120],{"class":315},[234,4845,4846],{"class":236,"line":597},[234,4847,367],{"emptyLinePlaceholder":56},[234,4849,4850],{"class":236,"line":608},[234,4851,4852],{"class":631},"\u002F\u002F Client-side\n",[234,4854,4855,4857,4859,4861,4863,4865,4867,4869,4872,4874,4876],{"class":236,"line":622},[234,4856,374],{"class":373},[234,4858,1142],{"class":319},[234,4860,380],{"class":315},[234,4862,1040],{"class":315},[234,4864,1149],{"class":383},[234,4866,386],{"class":319},[234,4868,335],{"class":315},[234,4870,4871],{"class":244},"ws:\u002F\u002Fserver.com\u002Frealtime",[234,4873,335],{"class":315},[234,4875,411],{"class":319},[234,4877,338],{"class":315},[234,4879,4880,4883,4886,4888,4891,4893,4896],{"class":236,"line":628},[234,4881,4882],{"class":373},"let",[234,4884,4885],{"class":319}," pingInterval",[234,4887,398],{"class":315},[234,4889,4890],{"class":240}," NodeJS",[234,4892,426],{"class":315},[234,4894,4895],{"class":240},"Timeout",[234,4897,338],{"class":315},[234,4899,4900],{"class":236,"line":635},[234,4901,367],{"emptyLinePlaceholder":56},[234,4903,4904,4906,4908,4910,4912,4914,4916],{"class":236,"line":646},[234,4905,1176],{"class":319},[234,4907,426],{"class":315},[234,4909,1181],{"class":383},[234,4911,730],{"class":315},[234,4913,1186],{"class":315},[234,4915,414],{"class":373},[234,4917,417],{"class":315},[234,4919,4920],{"class":236,"line":658},[234,4921,4922],{"class":631},"  \u002F\u002F Send ping every 30 seconds\n",[234,4924,4925,4928,4930,4933,4935,4937,4939],{"class":236,"line":685},[234,4926,4927],{"class":319},"  pingInterval",[234,4929,730],{"class":315},[234,4931,4932],{"class":383}," setInterval",[234,4934,386],{"class":432},[234,4936,1046],{"class":315},[234,4938,414],{"class":373},[234,4940,417],{"class":315},[234,4942,4943,4946,4948,4950,4952,4954,4956,4958,4960,4962,4964,4966,4968,4970,4972,4974,4976,4978,4981,4983,4985],{"class":236,"line":696},[234,4944,4945],{"class":319},"    ws",[234,4947,426],{"class":315},[234,4949,1231],{"class":383},[234,4951,386],{"class":432},[234,4953,1236],{"class":319},[234,4955,426],{"class":315},[234,4957,1241],{"class":383},[234,4959,386],{"class":432},[234,4961,853],{"class":315},[234,4963,856],{"class":432},[234,4965,398],{"class":315},[234,4967,329],{"class":315},[234,4969,2368],{"class":244},[234,4971,335],{"class":315},[234,4973,503],{"class":315},[234,4975,989],{"class":432},[234,4977,398],{"class":315},[234,4979,4980],{"class":315}," {}",[234,4982,323],{"class":315},[234,4984,1311],{"class":432},[234,4986,338],{"class":315},[234,4988,4989,4992,4995,4997],{"class":236,"line":715},[234,4990,4991],{"class":315},"  },",[234,4993,4994],{"class":2165}," 30000",[234,4996,411],{"class":432},[234,4998,338],{"class":315},[234,5000,5001],{"class":236,"line":721},[234,5002,1318],{"class":315},[234,5004,5005],{"class":236,"line":749},[234,5006,367],{"emptyLinePlaceholder":56},[234,5008,5009,5011,5013,5015,5017,5019,5021],{"class":236,"line":755},[234,5010,1176],{"class":319},[234,5012,426],{"class":315},[234,5014,1478],{"class":383},[234,5016,730],{"class":315},[234,5018,1186],{"class":315},[234,5020,414],{"class":373},[234,5022,417],{"class":315},[234,5024,5025,5028,5030,5033,5035],{"class":236,"line":786},[234,5026,5027],{"class":383},"  clearInterval",[234,5029,386],{"class":432},[234,5031,5032],{"class":319},"pingInterval",[234,5034,411],{"class":432},[234,5036,338],{"class":315},[234,5038,5039],{"class":236,"line":802},[234,5040,1318],{"class":315},[295,5042,5044],{"id":5043},"presence-tracking","Presence Tracking",[204,5046,5047],{},"Track online users in a namespace:",[223,5049,5051],{"className":301,"code":5050,"language":304,"meta":229,"style":229},"@Namespace('\u002Fpresence')\n@Controller()\nexport class PresenceGateway {\n  private onlineUsers = new Set\u003Cstring>();\n  \n  @OnConnectionAttempt()\n  async handleConnection(params: Record\u003Cstring, unknown>) {\n    const userId = params.userId as string;\n    this.onlineUsers.add(userId);\n    \n    \u002F\u002F Broadcast updated presence\n    this.broadcastPresence();\n    \n    return true;\n  }\n  \n  @Message({ event: 'disconnect' })\n  handleDisconnect(data: { userId: string }) {\n    this.onlineUsers.delete(data.userId);\n    this.broadcastPresence();\n  }\n  \n  private broadcastPresence() {\n    \u002F\u002F Broadcast to all connected clients\n    \u002F\u002F Implementation depends on how you track peers\n  }\n}\n",[231,5052,5053,5070,5078,5089,5112,5116,5124,5150,5170,5189,5193,5198,5209,5213,5221,5225,5229,5254,5278,5301,5311,5315,5319,5330,5335,5340,5344],{"__ignoreMap":229},[234,5054,5055,5057,5059,5061,5063,5066,5068],{"class":236,"line":237},[234,5056,579],{"class":315},[234,5058,582],{"class":383},[234,5060,386],{"class":319},[234,5062,335],{"class":315},[234,5064,5065],{"class":244},"\u002Fpresence",[234,5067,335],{"class":315},[234,5069,594],{"class":319},[234,5071,5072,5074,5076],{"class":236,"line":341},[234,5073,579],{"class":315},[234,5075,602],{"class":383},[234,5077,605],{"class":319},[234,5079,5080,5082,5084,5087],{"class":236,"line":364},[234,5081,611],{"class":311},[234,5083,614],{"class":373},[234,5085,5086],{"class":240}," PresenceGateway",[234,5088,417],{"class":315},[234,5090,5091,5093,5096,5098,5100,5102,5104,5106,5108,5110],{"class":236,"line":370},[234,5092,1075],{"class":373},[234,5094,5095],{"class":432}," onlineUsers",[234,5097,730],{"class":315},[234,5099,1040],{"class":315},[234,5101,3679],{"class":432},[234,5103,669],{"class":315},[234,5105,672],{"class":240},[234,5107,710],{"class":315},[234,5109,1046],{"class":319},[234,5111,338],{"class":315},[234,5113,5114],{"class":236,"line":392},[234,5115,625],{"class":319},[234,5117,5118,5120,5122],{"class":236,"line":420},[234,5119,638],{"class":315},[234,5121,641],{"class":383},[234,5123,605],{"class":319},[234,5125,5126,5128,5130,5132,5134,5136,5138,5140,5142,5144,5146,5148],{"class":236,"line":442},[234,5127,649],{"class":373},[234,5129,652],{"class":432},[234,5131,386],{"class":315},[234,5133,3084],{"class":407},[234,5135,398],{"class":315},[234,5137,666],{"class":240},[234,5139,669],{"class":315},[234,5141,672],{"class":240},[234,5143,503],{"class":315},[234,5145,677],{"class":240},[234,5147,3476],{"class":315},[234,5149,417],{"class":315},[234,5151,5152,5154,5156,5158,5160,5162,5164,5166,5168],{"class":236,"line":448},[234,5153,724],{"class":373},[234,5155,4412],{"class":319},[234,5157,730],{"class":315},[234,5159,733],{"class":319},[234,5161,426],{"class":315},[234,5163,4447],{"class":319},[234,5165,741],{"class":311},[234,5167,744],{"class":240},[234,5169,338],{"class":315},[234,5171,5172,5174,5177,5179,5181,5183,5185,5187],{"class":236,"line":571},[234,5173,3855],{"class":315},[234,5175,5176],{"class":319},"onlineUsers",[234,5178,426],{"class":315},[234,5180,3878],{"class":383},[234,5182,386],{"class":432},[234,5184,4447],{"class":319},[234,5186,411],{"class":432},[234,5188,338],{"class":315},[234,5190,5191],{"class":236,"line":576},[234,5192,752],{"class":432},[234,5194,5195],{"class":236,"line":597},[234,5196,5197],{"class":631},"    \u002F\u002F Broadcast updated presence\n",[234,5199,5200,5202,5205,5207],{"class":236,"line":608},[234,5201,3855],{"class":315},[234,5203,5204],{"class":383},"broadcastPresence",[234,5206,1046],{"class":432},[234,5208,338],{"class":315},[234,5210,5211],{"class":236,"line":622},[234,5212,752],{"class":432},[234,5214,5215,5217,5219],{"class":236,"line":628},[234,5216,816],{"class":311},[234,5218,819],{"class":792},[234,5220,338],{"class":315},[234,5222,5223],{"class":236,"line":635},[234,5224,445],{"class":315},[234,5226,5227],{"class":236,"line":646},[234,5228,625],{"class":319},[234,5230,5231,5233,5235,5237,5239,5241,5243,5245,5248,5250,5252],{"class":236,"line":658},[234,5232,638],{"class":315},[234,5234,848],{"class":383},[234,5236,386],{"class":319},[234,5238,853],{"class":315},[234,5240,856],{"class":432},[234,5242,398],{"class":315},[234,5244,329],{"class":315},[234,5246,5247],{"class":244},"disconnect",[234,5249,335],{"class":315},[234,5251,323],{"class":315},[234,5253,594],{"class":319},[234,5255,5256,5259,5261,5263,5265,5267,5269,5271,5273,5276],{"class":236,"line":685},[234,5257,5258],{"class":432},"  handleDisconnect",[234,5260,386],{"class":315},[234,5262,1376],{"class":407},[234,5264,398],{"class":315},[234,5266,316],{"class":315},[234,5268,4412],{"class":432},[234,5270,398],{"class":315},[234,5272,744],{"class":240},[234,5274,5275],{"class":315}," })",[234,5277,417],{"class":315},[234,5279,5280,5282,5284,5286,5289,5291,5293,5295,5297,5299],{"class":236,"line":696},[234,5281,3855],{"class":315},[234,5283,5176],{"class":319},[234,5285,426],{"class":315},[234,5287,5288],{"class":383},"delete",[234,5290,386],{"class":432},[234,5292,1376],{"class":319},[234,5294,426],{"class":315},[234,5296,4447],{"class":319},[234,5298,411],{"class":432},[234,5300,338],{"class":315},[234,5302,5303,5305,5307,5309],{"class":236,"line":715},[234,5304,3855],{"class":315},[234,5306,5204],{"class":383},[234,5308,1046],{"class":432},[234,5310,338],{"class":315},[234,5312,5313],{"class":236,"line":721},[234,5314,445],{"class":315},[234,5316,5317],{"class":236,"line":749},[234,5318,625],{"class":319},[234,5320,5321,5323,5326,5328],{"class":236,"line":755},[234,5322,1075],{"class":373},[234,5324,5325],{"class":432}," broadcastPresence",[234,5327,1046],{"class":315},[234,5329,417],{"class":315},[234,5331,5332],{"class":236,"line":786},[234,5333,5334],{"class":631},"    \u002F\u002F Broadcast to all connected clients\n",[234,5336,5337],{"class":236,"line":802},[234,5338,5339],{"class":631},"    \u002F\u002F Implementation depends on how you track peers\n",[234,5341,5342],{"class":236,"line":808},[234,5343,445],{"class":315},[234,5345,5346],{"class":236,"line":813},[234,5347,1120],{"class":315},[216,5349,5351],{"id":5350},"error-handling","Error Handling",[295,5353,5355],{"id":5354},"handler-errors","Handler Errors",[204,5357,5358],{},"Errors in message handlers are caught and logged:",[223,5360,5362],{"className":301,"code":5361,"language":304,"meta":229,"style":229},"@Message({ event: 'risky-operation' })\nasync handleRiskyOp(data: any, peer: Peer) {\n  try {\n    const result = await this.performOperation(data);\n    return { success: true, result };\n  } catch (error) {\n    console.error('Operation failed:', error);\n    return { \n      success: false, \n      error: error.message \n    };\n  }\n}\n",[231,5363,5364,5389,5404,5411,5435,5454,5468,5493,5501,5514,5529,5533,5537],{"__ignoreMap":229},[234,5365,5366,5368,5370,5372,5374,5376,5378,5380,5383,5385,5387],{"class":236,"line":237},[234,5367,579],{"class":315},[234,5369,848],{"class":383},[234,5371,386],{"class":319},[234,5373,853],{"class":315},[234,5375,856],{"class":432},[234,5377,398],{"class":315},[234,5379,329],{"class":315},[234,5381,5382],{"class":244},"risky-operation",[234,5384,335],{"class":315},[234,5386,323],{"class":315},[234,5388,594],{"class":319},[234,5390,5391,5393,5396,5398,5400,5402],{"class":236,"line":341},[234,5392,3052],{"class":319},[234,5394,5395],{"class":383},"handleRiskyOp",[234,5397,1636],{"class":319},[234,5399,503],{"class":315},[234,5401,1641],{"class":319},[234,5403,389],{"class":315},[234,5405,5406,5409],{"class":236,"line":364},[234,5407,5408],{"class":311},"  try",[234,5410,417],{"class":315},[234,5412,5413,5415,5418,5420,5422,5424,5427,5429,5431,5433],{"class":236,"line":370},[234,5414,724],{"class":373},[234,5416,5417],{"class":319}," result",[234,5419,730],{"class":315},[234,5421,2902],{"class":311},[234,5423,2905],{"class":315},[234,5425,5426],{"class":383},"performOperation",[234,5428,386],{"class":432},[234,5430,1376],{"class":319},[234,5432,411],{"class":432},[234,5434,338],{"class":315},[234,5436,5437,5439,5441,5444,5446,5448,5450,5452],{"class":236,"line":392},[234,5438,816],{"class":311},[234,5440,316],{"class":315},[234,5442,5443],{"class":432}," success",[234,5445,398],{"class":315},[234,5447,819],{"class":792},[234,5449,503],{"class":315},[234,5451,5417],{"class":319},[234,5453,4679],{"class":315},[234,5455,5456,5458,5460,5462,5464,5466],{"class":236,"line":420},[234,5457,1308],{"class":315},[234,5459,2995],{"class":311},[234,5461,404],{"class":432},[234,5463,1429],{"class":319},[234,5465,2514],{"class":432},[234,5467,389],{"class":315},[234,5469,5470,5472,5474,5476,5478,5480,5483,5485,5487,5489,5491],{"class":236,"line":442},[234,5471,954],{"class":319},[234,5473,426],{"class":315},[234,5475,1429],{"class":383},[234,5477,386],{"class":432},[234,5479,335],{"class":315},[234,5481,5482],{"class":244},"Operation failed:",[234,5484,335],{"class":315},[234,5486,503],{"class":315},[234,5488,1457],{"class":319},[234,5490,411],{"class":432},[234,5492,338],{"class":315},[234,5494,5495,5497,5499],{"class":236,"line":448},[234,5496,816],{"class":311},[234,5498,316],{"class":315},[234,5500,495],{"class":432},[234,5502,5503,5506,5508,5510,5512],{"class":236,"line":571},[234,5504,5505],{"class":432},"      success",[234,5507,398],{"class":315},[234,5509,793],{"class":792},[234,5511,503],{"class":315},[234,5513,495],{"class":432},[234,5515,5516,5519,5521,5523,5525,5527],{"class":236,"line":576},[234,5517,5518],{"class":432},"      error",[234,5520,398],{"class":315},[234,5522,1457],{"class":319},[234,5524,426],{"class":315},[234,5526,863],{"class":319},[234,5528,495],{"class":432},[234,5530,5531],{"class":236,"line":597},[234,5532,1059],{"class":315},[234,5534,5535],{"class":236,"line":608},[234,5536,445],{"class":315},[234,5538,5539],{"class":236,"line":622},[234,5540,1120],{"class":315},[295,5542,5544],{"id":5543},"validation-errors","Validation Errors",[204,5546,5547],{},"Schema validation errors are automatically handled:",[223,5549,5551],{"className":301,"code":5550,"language":304,"meta":229,"style":229},"const StrictSchema = z.object({\n  name: z.string().min(3),\n  age: z.number().positive()\n});\n\n@Message({ \n  event: 'submit',\n  validationSchema: StrictSchema \n})\nhandleSubmit(data: z.infer\u003Ctypeof StrictSchema>) {\n  \u002F\u002F If validation fails, this handler never runs\n  \u002F\u002F Client receives validation error details\n}\n",[231,5552,5553,5572,5600,5623,5631,5635,5647,5662,5671,5677,5699,5704,5709],{"__ignoreMap":229},[234,5554,5555,5557,5560,5562,5564,5566,5568,5570],{"class":236,"line":237},[234,5556,374],{"class":373},[234,5558,5559],{"class":319}," StrictSchema ",[234,5561,380],{"class":315},[234,5563,2103],{"class":319},[234,5565,426],{"class":315},[234,5567,2136],{"class":383},[234,5569,386],{"class":319},[234,5571,389],{"class":315},[234,5573,5574,5577,5579,5581,5583,5585,5587,5589,5591,5593,5596,5598],{"class":236,"line":341},[234,5575,5576],{"class":432},"  name",[234,5578,398],{"class":315},[234,5580,2103],{"class":319},[234,5582,426],{"class":315},[234,5584,672],{"class":383},[234,5586,1046],{"class":319},[234,5588,426],{"class":315},[234,5590,2160],{"class":383},[234,5592,386],{"class":319},[234,5594,5595],{"class":2165},"3",[234,5597,411],{"class":319},[234,5599,1029],{"class":315},[234,5601,5602,5605,5607,5609,5611,5614,5616,5618,5621],{"class":236,"line":364},[234,5603,5604],{"class":432},"  age",[234,5606,398],{"class":315},[234,5608,2103],{"class":319},[234,5610,426],{"class":315},[234,5612,5613],{"class":383},"number",[234,5615,1046],{"class":319},[234,5617,426],{"class":315},[234,5619,5620],{"class":383},"positive",[234,5622,605],{"class":319},[234,5624,5625,5627,5629],{"class":236,"line":370},[234,5626,451],{"class":315},[234,5628,411],{"class":319},[234,5630,338],{"class":315},[234,5632,5633],{"class":236,"line":392},[234,5634,367],{"emptyLinePlaceholder":56},[234,5636,5637,5639,5641,5643,5645],{"class":236,"line":420},[234,5638,579],{"class":315},[234,5640,848],{"class":383},[234,5642,386],{"class":319},[234,5644,853],{"class":315},[234,5646,495],{"class":319},[234,5648,5649,5651,5653,5655,5658,5660],{"class":236,"line":442},[234,5650,2250],{"class":432},[234,5652,398],{"class":315},[234,5654,329],{"class":315},[234,5656,5657],{"class":244},"submit",[234,5659,335],{"class":315},[234,5661,1029],{"class":315},[234,5663,5664,5666,5668],{"class":236,"line":448},[234,5665,2265],{"class":432},[234,5667,398],{"class":315},[234,5669,5670],{"class":319}," StrictSchema \n",[234,5672,5673,5675],{"class":236,"line":571},[234,5674,451],{"class":315},[234,5676,594],{"class":319},[234,5678,5679,5682,5684,5686,5688,5690,5693,5695,5697],{"class":236,"line":576},[234,5680,5681],{"class":383},"handleSubmit",[234,5683,2283],{"class":319},[234,5685,426],{"class":315},[234,5687,2288],{"class":319},[234,5689,2291],{"class":315},[234,5691,5692],{"class":319}," StrictSchema",[234,5694,710],{"class":315},[234,5696,2514],{"class":319},[234,5698,389],{"class":315},[234,5700,5701],{"class":236,"line":597},[234,5702,5703],{"class":631},"  \u002F\u002F If validation fails, this handler never runs\n",[234,5705,5706],{"class":236,"line":608},[234,5707,5708],{"class":631},"  \u002F\u002F Client receives validation error details\n",[234,5710,5711],{"class":236,"line":622},[234,5712,1120],{"class":315},[216,5714,5716],{"id":5715},"troubleshooting","Troubleshooting",[204,5718,5719],{},[1702,5720,5721],{},"\"Namespace not registered\"",[223,5723,5725],{"className":225,"code":5724,"language":228,"meta":229,"style":229},"# Error: Namespace \"\u002Fchat\" is not registered. Connection rejected.\n",[231,5726,5727],{"__ignoreMap":229},[234,5728,5729],{"class":236,"line":237},[234,5730,5724],{"class":631},[204,5732,5733,5736,5737,5740],{},[1702,5734,5735],{},"Solution:"," Make sure your gateway class has the ",[231,5738,5739],{},"@Namespace()"," decorator",[204,5742,5743],{},[1702,5744,5745],{},"\"No message handler for event\"",[223,5747,5749],{"className":225,"code":5748,"language":228,"meta":229,"style":229},"# Warning: No message handler for event \"foo\" in namespace \"\u002Fchat\"\n",[231,5750,5751],{"__ignoreMap":229},[234,5752,5753],{"class":236,"line":237},[234,5754,5748],{"class":631},[204,5756,5757,5759,5760,5763],{},[1702,5758,5735],{}," Add a ",[231,5761,5762],{},"@Message({ event: 'foo' })"," handler or check event name spelling",[204,5765,5766],{},[1702,5767,5768],{},"\"WebsocketService is not registered\"",[223,5770,5772],{"className":225,"code":5771,"language":228,"meta":229,"style":229},"# Warning: MessageDecorator::WebsocketService is not registered\n",[231,5773,5774],{"__ignoreMap":229},[234,5775,5776],{"class":236,"line":237},[234,5777,5771],{"class":631},[204,5779,5780,5782,5783,5785],{},[1702,5781,5735],{}," Add ",[231,5784,435],{}," to your app setup",[204,5787,5788],{},[1702,5789,5790],{},"Validation errors",[223,5792,5794],{"className":225,"code":5793,"language":228,"meta":229,"style":229},"# Message validation error: [{ path: 'text', message: 'Required' }]\n",[231,5795,5796],{"__ignoreMap":229},[234,5797,5798],{"class":236,"line":237},[234,5799,5793],{"class":631},[204,5801,5802,5804],{},[1702,5803,5735],{}," Check your message data matches the validation schema",[5806,5807,5808],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":229,"searchDepth":237,"depth":341,"links":5810},[5811,5812,5813,5818,5819,5823,5828,5832,5833,5839,5843],{"id":218,"depth":341,"text":18},{"id":289,"depth":341,"text":290},{"id":1514,"depth":341,"text":1515,"children":5814},[5815,5816,5817],{"id":1518,"depth":364,"text":1519},{"id":1590,"depth":364,"text":1591},{"id":1692,"depth":364,"text":1693},{"id":1786,"depth":341,"text":1787},{"id":1856,"depth":341,"text":1857,"children":5820},[5821,5822],{"id":1860,"depth":364,"text":1861},{"id":2086,"depth":364,"text":49},{"id":2336,"depth":341,"text":2337,"children":5824},[5825,5826,5827],{"id":2340,"depth":364,"text":2341},{"id":2439,"depth":364,"text":2440},{"id":2592,"depth":364,"text":2593},{"id":2714,"depth":341,"text":2715,"children":5829},[5830,5831],{"id":2718,"depth":364,"text":2719},{"id":3026,"depth":364,"text":3027},{"id":3208,"depth":341,"text":3209},{"id":3609,"depth":341,"text":3610,"children":5834},[5835,5836,5837,5838],{"id":3613,"depth":364,"text":3614},{"id":4294,"depth":364,"text":4295},{"id":4717,"depth":364,"text":4718},{"id":5043,"depth":364,"text":5044},{"id":5350,"depth":341,"text":5351,"children":5840},[5841,5842],{"id":5354,"depth":364,"text":5355},{"id":5543,"depth":364,"text":5544},{"id":5715,"depth":341,"text":5716},"Real-time bidirectional communication with decorator-based API","md",null,{},{"title":66,"description":5844},"150jqtE_KT8DF3wI9g9-7Kd2c73QfFwkc-EJBZTn6gk",[5851,5853],{"title":90,"path":121,"stem":122,"description":5852,"children":-1},"Complete API reference for Storage module",{"title":90,"path":132,"stem":133,"description":5854,"children":-1},"Complete API reference for all WebSocket decorators",1775552782647]