[{"data":1,"prerenderedAt":11186},["ShallowReactive",2],{"navigation":3,"docs-path-index":152,"-docs-modules-web-sockets-api":198,"-docs-modules-web-sockets-api-surround":11181},[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":90,"body":200,"description":11175,"extension":11176,"links":11177,"meta":11178,"navigation":56,"path":132,"seo":11179,"stem":133,"__hash__":11180},"docs\u002Fdocs\u002F3.modules\u002F5.web-sockets\u002F1.api.md",{"type":201,"value":202,"toc":11112},"minimark",[203,212,219,225,230,273,277,320,324,346,349,715,719,733,737,907,910,916,921,924,942,945,948,952,1008,1052,1055,1089,1092,2478,2482,2530,2534,2882,2884,2889,2894,2897,2969,2972,3021,3024,3062,3105,3109,3192,3195,3224,3227,4915,4919,4922,5016,5019,5458,5460,5465,5470,5473,5497,5500,5531,5534,5557,5560,6426,6430,6433,6672,6674,6679,6689,6692,6716,6719,6750,6753,6770,6773,7745,7749,7876,7879,8216,8218,8224,8231,8234,8258,8261,8291,8294,8311,8314,9202,9206,9209,9346,9349,9713,9715,9719,9722,9730,9733,9811,9818,9821,9894,9901,9904,9981,9990,9993,10087,10091,10360,10365,10531,10536,10706,10710,10888,10893,11108],[204,205,206,207,211],"p",{},"This page provides a complete reference for all decorators available in the ",[208,209,210],"code",{},"@vercube\u002Fws"," module. Each decorator is explained with its purpose, parameters, behavior, and practical examples.",[213,214,216],"h2",{"id":215},"namespace",[208,217,218],{},"@Namespace",[204,220,221,222,224],{},"The ",[208,223,218],{}," decorator defines a WebSocket namespace path and must be applied to a controller class.",[226,227,229],"h3",{"id":228},"signature","Signature",[231,232,237],"pre",{"className":233,"code":234,"language":235,"meta":236,"style":236},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","function Namespace(path: string): ClassDecorator\n","ts","",[208,238,239],{"__ignoreMap":236},[240,241,244,248,252,256,260,263,267,270],"span",{"class":242,"line":243},"line",1,[240,245,247],{"class":246},"spNyl","function",[240,249,251],{"class":250},"s2Zo4"," Namespace",[240,253,255],{"class":254},"sMK4o","(",[240,257,259],{"class":258},"sHdIc","path",[240,261,262],{"class":254},":",[240,264,266],{"class":265},"sBMFI"," string",[240,268,269],{"class":254},"):",[240,271,272],{"class":265}," ClassDecorator\n",[226,274,276],{"id":275},"parameters","Parameters",[278,279,280,299],"table",{},[281,282,283],"thead",{},[284,285,286,290,293,296],"tr",{},[287,288,289],"th",{},"Parameter",[287,291,292],{},"Type",[287,294,295],{},"Required",[287,297,298],{},"Description",[300,301,302],"tbody",{},[284,303,304,309,314,317],{},[305,306,307],"td",{},[208,308,259],{},[305,310,311],{},[208,312,313],{},"string",[305,315,316],{},"Yes",[305,318,319],{},"The namespace path (URL path) for WebSocket connections",[226,321,323],{"id":322},"behavior","Behavior",[325,326,327,331,337,340],"ul",{},[328,329,330],"li",{},"Registers the namespace path in the WebSocket service",[328,332,333,334],{},"Clients connect to ",[208,335,336],{},"ws:\u002F\u002Fyourserver.com{path}",[328,338,339],{},"All message handlers in the controller are scoped to this namespace",[328,341,342,343],{},"Must be used on the same class as ",[208,344,345],{},"@Controller()",[226,347,22],{"id":348},"examples",[350,351,352,433,655],"code-group",{},[231,353,356],{"className":233,"code":354,"filename":355,"language":235,"meta":236,"style":236},"@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  \u002F\u002F All handlers are under \u002Fchat namespace\n}\n\n\u002F\u002F Clients connect to: ws:\u002F\u002Fyourserver.com\u002Fchat\n","Basic",[208,357,358,381,392,408,415,421,427],{"__ignoreMap":236},[240,359,360,363,366,369,372,376,378],{"class":242,"line":243},[240,361,362],{"class":254},"@",[240,364,365],{"class":250},"Namespace",[240,367,255],{"class":368},"sTEyZ",[240,370,371],{"class":254},"'",[240,373,375],{"class":374},"sfazB","\u002Fchat",[240,377,371],{"class":254},[240,379,380],{"class":368},")\n",[240,382,384,386,389],{"class":242,"line":383},2,[240,385,362],{"class":254},[240,387,388],{"class":250},"Controller",[240,390,391],{"class":368},"()\n",[240,393,395,399,402,405],{"class":242,"line":394},3,[240,396,398],{"class":397},"s7zQu","export",[240,400,401],{"class":246}," class",[240,403,404],{"class":265}," ChatGateway",[240,406,407],{"class":254}," {\n",[240,409,411],{"class":242,"line":410},4,[240,412,414],{"class":413},"sHwdD","  \u002F\u002F All handlers are under \u002Fchat namespace\n",[240,416,418],{"class":242,"line":417},5,[240,419,420],{"class":254},"}\n",[240,422,424],{"class":242,"line":423},6,[240,425,426],{"emptyLinePlaceholder":56},"\n",[240,428,430],{"class":242,"line":429},7,[240,431,432],{"class":413},"\u002F\u002F Clients connect to: ws:\u002F\u002Fyourserver.com\u002Fchat\n",[231,434,437],{"className":233,"code":435,"filename":436,"language":235,"meta":236,"style":236},"@Namespace('\u002Fpublic-chat')\n@Controller()\nexport class PublicChatGateway {\n  @Message({ event: 'message' })\n  handleMessage(data: any) { ... }\n}\n\n@Namespace('\u002Fprivate-chat')\n@Controller()\nexport class PrivateChatGateway {\n  @Message({ event: 'message' })\n  handleMessage(data: any) { ... }\n}\n\n\u002F\u002F Clients connect to:\n\u002F\u002F - ws:\u002F\u002Fyourserver.com\u002Fpublic-chat\n\u002F\u002F - ws:\u002F\u002Fyourserver.com\u002Fprivate-chat\n","Multiple namespaces",[208,438,439,456,464,475,507,534,538,542,560,569,581,606,627,632,637,643,649],{"__ignoreMap":236},[240,440,441,443,445,447,449,452,454],{"class":242,"line":243},[240,442,362],{"class":254},[240,444,365],{"class":250},[240,446,255],{"class":368},[240,448,371],{"class":254},[240,450,451],{"class":374},"\u002Fpublic-chat",[240,453,371],{"class":254},[240,455,380],{"class":368},[240,457,458,460,462],{"class":242,"line":383},[240,459,362],{"class":254},[240,461,388],{"class":250},[240,463,391],{"class":368},[240,465,466,468,470,473],{"class":242,"line":394},[240,467,398],{"class":397},[240,469,401],{"class":246},[240,471,472],{"class":265}," PublicChatGateway",[240,474,407],{"class":254},[240,476,477,480,483,485,488,492,494,497,500,502,505],{"class":242,"line":410},[240,478,479],{"class":254},"  @",[240,481,482],{"class":250},"Message",[240,484,255],{"class":368},[240,486,487],{"class":254},"{",[240,489,491],{"class":490},"swJcz"," event",[240,493,262],{"class":254},[240,495,496],{"class":254}," '",[240,498,499],{"class":374},"message",[240,501,371],{"class":254},[240,503,504],{"class":254}," }",[240,506,380],{"class":368},[240,508,509,512,514,517,519,522,525,528,531],{"class":242,"line":417},[240,510,511],{"class":490},"  handleMessage",[240,513,255],{"class":254},[240,515,516],{"class":258},"data",[240,518,262],{"class":254},[240,520,521],{"class":265}," any",[240,523,524],{"class":254},")",[240,526,527],{"class":254}," {",[240,529,530],{"class":254}," ...",[240,532,533],{"class":254}," }\n",[240,535,536],{"class":242,"line":423},[240,537,420],{"class":254},[240,539,540],{"class":242,"line":429},[240,541,426],{"emptyLinePlaceholder":56},[240,543,545,547,549,551,553,556,558],{"class":242,"line":544},8,[240,546,362],{"class":254},[240,548,365],{"class":250},[240,550,255],{"class":368},[240,552,371],{"class":254},[240,554,555],{"class":374},"\u002Fprivate-chat",[240,557,371],{"class":254},[240,559,380],{"class":368},[240,561,563,565,567],{"class":242,"line":562},9,[240,564,362],{"class":254},[240,566,388],{"class":250},[240,568,391],{"class":368},[240,570,572,574,576,579],{"class":242,"line":571},10,[240,573,398],{"class":397},[240,575,401],{"class":246},[240,577,578],{"class":265}," PrivateChatGateway",[240,580,407],{"class":254},[240,582,584,586,588,590,592,594,596,598,600,602,604],{"class":242,"line":583},11,[240,585,479],{"class":254},[240,587,482],{"class":250},[240,589,255],{"class":368},[240,591,487],{"class":254},[240,593,491],{"class":490},[240,595,262],{"class":254},[240,597,496],{"class":254},[240,599,499],{"class":374},[240,601,371],{"class":254},[240,603,504],{"class":254},[240,605,380],{"class":368},[240,607,609,611,613,615,617,619,621,623,625],{"class":242,"line":608},12,[240,610,511],{"class":490},[240,612,255],{"class":254},[240,614,516],{"class":258},[240,616,262],{"class":254},[240,618,521],{"class":265},[240,620,524],{"class":254},[240,622,527],{"class":254},[240,624,530],{"class":254},[240,626,533],{"class":254},[240,628,630],{"class":242,"line":629},13,[240,631,420],{"class":254},[240,633,635],{"class":242,"line":634},14,[240,636,426],{"emptyLinePlaceholder":56},[240,638,640],{"class":242,"line":639},15,[240,641,642],{"class":413},"\u002F\u002F Clients connect to:\n",[240,644,646],{"class":242,"line":645},16,[240,647,648],{"class":413},"\u002F\u002F - ws:\u002F\u002Fyourserver.com\u002Fpublic-chat\n",[240,650,652],{"class":242,"line":651},17,[240,653,654],{"class":413},"\u002F\u002F - ws:\u002F\u002Fyourserver.com\u002Fprivate-chat\n",[231,656,659],{"className":233,"code":657,"filename":658,"language":235,"meta":236,"style":236},"@Namespace('\u002Fapi\u002Fv1\u002Frealtime')\n@Controller()\nexport class RealtimeGateway {\n  \u002F\u002F ...\n}\n\n\u002F\u002F Clients connect to: ws:\u002F\u002Fyourserver.com\u002Fapi\u002Fv1\u002Frealtime\n","Nested path",[208,660,661,678,686,697,702,706,710],{"__ignoreMap":236},[240,662,663,665,667,669,671,674,676],{"class":242,"line":243},[240,664,362],{"class":254},[240,666,365],{"class":250},[240,668,255],{"class":368},[240,670,371],{"class":254},[240,672,673],{"class":374},"\u002Fapi\u002Fv1\u002Frealtime",[240,675,371],{"class":254},[240,677,380],{"class":368},[240,679,680,682,684],{"class":242,"line":383},[240,681,362],{"class":254},[240,683,388],{"class":250},[240,685,391],{"class":368},[240,687,688,690,692,695],{"class":242,"line":394},[240,689,398],{"class":397},[240,691,401],{"class":246},[240,693,694],{"class":265}," RealtimeGateway",[240,696,407],{"class":254},[240,698,699],{"class":242,"line":410},[240,700,701],{"class":413},"  \u002F\u002F ...\n",[240,703,704],{"class":242,"line":417},[240,705,420],{"class":254},[240,707,708],{"class":242,"line":423},[240,709,426],{"emptyLinePlaceholder":56},[240,711,712],{"class":242,"line":429},[240,713,714],{"class":413},"\u002F\u002F Clients connect to: ws:\u002F\u002Fyourserver.com\u002Fapi\u002Fv1\u002Frealtime\n",[226,716,718],{"id":717},"rules","Rules",[325,720,721,724,727,730],{},[328,722,723],{},"Path is case-insensitive (internally normalized to lowercase)",[328,725,726],{},"Leading slash is recommended but not required",[328,728,729],{},"Each namespace is isolated - messages don't cross namespace boundaries",[328,731,732],{},"You cannot have duplicate namespace paths",[226,734,736],{"id":735},"common-mistakes","Common Mistakes",[231,738,740],{"className":233,"code":739,"language":235,"meta":236,"style":236},"\u002F\u002F ❌ Missing @Namespace\n@Controller()\nexport class BadGateway {\n  @Message({ event: 'test' })\n  handleTest() { ... }\n}\n\u002F\u002F Warning: Unable to find namespace. Did you use @Namespace()?\n\n\u002F\u002F ❌ Empty namespace\n@Namespace('')\n@Controller()\nexport class BadGateway { ... }\n\n\u002F\u002F ✅ Correct\n@Namespace('\u002Fmy-namespace')\n@Controller()\nexport class GoodGateway { ... }\n",[208,741,742,747,755,766,791,805,809,814,818,823,836,844,858,862,867,884,892],{"__ignoreMap":236},[240,743,744],{"class":242,"line":243},[240,745,746],{"class":413},"\u002F\u002F ❌ Missing @Namespace\n",[240,748,749,751,753],{"class":242,"line":383},[240,750,362],{"class":254},[240,752,388],{"class":250},[240,754,391],{"class":368},[240,756,757,759,761,764],{"class":242,"line":394},[240,758,398],{"class":397},[240,760,401],{"class":246},[240,762,763],{"class":265}," BadGateway",[240,765,407],{"class":254},[240,767,768,770,772,774,776,778,780,782,785,787,789],{"class":242,"line":410},[240,769,479],{"class":254},[240,771,482],{"class":250},[240,773,255],{"class":368},[240,775,487],{"class":254},[240,777,491],{"class":490},[240,779,262],{"class":254},[240,781,496],{"class":254},[240,783,784],{"class":374},"test",[240,786,371],{"class":254},[240,788,504],{"class":254},[240,790,380],{"class":368},[240,792,793,796,799,801,803],{"class":242,"line":417},[240,794,795],{"class":490},"  handleTest",[240,797,798],{"class":254},"()",[240,800,527],{"class":254},[240,802,530],{"class":254},[240,804,533],{"class":254},[240,806,807],{"class":242,"line":423},[240,808,420],{"class":254},[240,810,811],{"class":242,"line":429},[240,812,813],{"class":413},"\u002F\u002F Warning: Unable to find namespace. Did you use @Namespace()?\n",[240,815,816],{"class":242,"line":544},[240,817,426],{"emptyLinePlaceholder":56},[240,819,820],{"class":242,"line":562},[240,821,822],{"class":413},"\u002F\u002F ❌ Empty namespace\n",[240,824,825,827,829,831,834],{"class":242,"line":571},[240,826,362],{"class":254},[240,828,365],{"class":250},[240,830,255],{"class":368},[240,832,833],{"class":254},"''",[240,835,380],{"class":368},[240,837,838,840,842],{"class":242,"line":583},[240,839,362],{"class":254},[240,841,388],{"class":250},[240,843,391],{"class":368},[240,845,846,848,850,852,854,856],{"class":242,"line":608},[240,847,398],{"class":397},[240,849,401],{"class":246},[240,851,763],{"class":265},[240,853,527],{"class":254},[240,855,530],{"class":254},[240,857,533],{"class":254},[240,859,860],{"class":242,"line":629},[240,861,426],{"emptyLinePlaceholder":56},[240,863,864],{"class":242,"line":634},[240,865,866],{"class":413},"\u002F\u002F ✅ Correct\n",[240,868,869,871,873,875,877,880,882],{"class":242,"line":639},[240,870,362],{"class":254},[240,872,365],{"class":250},[240,874,255],{"class":368},[240,876,371],{"class":254},[240,878,879],{"class":374},"\u002Fmy-namespace",[240,881,371],{"class":254},[240,883,380],{"class":368},[240,885,886,888,890],{"class":242,"line":645},[240,887,362],{"class":254},[240,889,388],{"class":250},[240,891,391],{"class":368},[240,893,894,896,898,901,903,905],{"class":242,"line":651},[240,895,398],{"class":397},[240,897,401],{"class":246},[240,899,900],{"class":265}," GoodGateway",[240,902,527],{"class":254},[240,904,530],{"class":254},[240,906,533],{"class":254},[908,909],"hr",{},[213,911,913],{"id":912},"onconnectionattempt",[208,914,915],{},"@OnConnectionAttempt",[204,917,221,918,920],{},[208,919,915],{}," decorator handles WebSocket connection attempts, allowing you to accept or reject connections based on authentication, authorization, or other criteria.",[226,922,229],{"id":923},"signature-1",[231,925,927],{"className":233,"code":926,"language":235,"meta":236,"style":236},"function OnConnectionAttempt(): MethodDecorator\n",[208,928,929],{"__ignoreMap":236},[240,930,931,933,936,939],{"class":242,"line":243},[240,932,247],{"class":246},[240,934,935],{"class":250}," OnConnectionAttempt",[240,937,938],{"class":254},"():",[240,940,941],{"class":265}," MethodDecorator\n",[226,943,276],{"id":944},"parameters-1",[204,946,947],{},"This decorator takes no parameters.",[226,949,951],{"id":950},"handler-method-signature","Handler Method Signature",[231,953,955],{"className":233,"code":954,"language":235,"meta":236,"style":236},"async (\n  params: Record\u003Cstring, unknown>,\n  request: Request\n): Promise\u003Cboolean | void>\n",[208,956,957,965,984,989],{"__ignoreMap":236},[240,958,959,962],{"class":242,"line":243},[240,960,961],{"class":250},"async",[240,963,964],{"class":368}," (\n",[240,966,967,970,973,975,978,981],{"class":242,"line":383},[240,968,969],{"class":368},"  params: Record",[240,971,972],{"class":254},"\u003C",[240,974,313],{"class":368},[240,976,977],{"class":254},",",[240,979,980],{"class":368}," unknown",[240,982,983],{"class":254},">,\n",[240,985,986],{"class":242,"line":394},[240,987,988],{"class":368},"  request: Request\n",[240,990,991,994,997,999,1002,1005],{"class":242,"line":410},[240,992,993],{"class":368},"): ",[240,995,996],{"class":265},"Promise",[240,998,972],{"class":254},[240,1000,1001],{"class":368},"boolean ",[240,1003,1004],{"class":254},"|",[240,1006,1007],{"class":254}," void>\n",[278,1009,1010,1020],{},[281,1011,1012],{},[284,1013,1014,1016,1018],{},[287,1015,289],{},[287,1017,292],{},[287,1019,298],{},[300,1021,1022,1037],{},[284,1023,1024,1029,1034],{},[305,1025,1026],{},[208,1027,1028],{},"params",[305,1030,1031],{},[208,1032,1033],{},"Record\u003Cstring, unknown>",[305,1035,1036],{},"Query parameters from the connection URL",[284,1038,1039,1044,1049],{},[305,1040,1041],{},[208,1042,1043],{},"request",[305,1045,1046],{},[208,1047,1048],{},"Request",[305,1050,1051],{},"The original HTTP upgrade request",[226,1053,323],{"id":1054},"behavior-1",[325,1056,1057,1060,1071,1077,1080,1083],{},[328,1058,1059],{},"Called before a WebSocket connection is established",[328,1061,1062,1063,1066,1067,1070],{},"Return ",[208,1064,1065],{},"true"," or ",[208,1068,1069],{},"undefined"," to accept the connection",[328,1072,1062,1073,1076],{},[208,1074,1075],{},"false"," to reject with 403 Forbidden",[328,1078,1079],{},"Throw an error to reject with 403 and error message",[328,1081,1082],{},"Optional - if not defined, all connections are accepted",[328,1084,1085,1086,1088],{},"Only one ",[208,1087,915],{}," handler per namespace",[226,1090,22],{"id":1091},"examples-1",[350,1093,1094,1318,1643,1940,2248],{},[231,1095,1097],{"className":233,"code":1096,"filename":355,"language":235,"meta":236,"style":236},"@Namespace('\u002Fsecure')\n@Controller()\nexport class SecureGateway {\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    if (!token) {\n      return false; \u002F\u002F Reject\n    }\n    \n    return true; \u002F\u002F Accept\n  }\n}\n\n\u002F\u002F Client: ws:\u002F\u002Fserver.com\u002Fsecure?token=abc123\n",[208,1098,1099,1116,1124,1135,1140,1149,1160,1180,1190,1208,1236,1241,1260,1275,1280,1284,1297,1302,1307,1312],{"__ignoreMap":236},[240,1100,1101,1103,1105,1107,1109,1112,1114],{"class":242,"line":243},[240,1102,362],{"class":254},[240,1104,365],{"class":250},[240,1106,255],{"class":368},[240,1108,371],{"class":254},[240,1110,1111],{"class":374},"\u002Fsecure",[240,1113,371],{"class":254},[240,1115,380],{"class":368},[240,1117,1118,1120,1122],{"class":242,"line":383},[240,1119,362],{"class":254},[240,1121,388],{"class":250},[240,1123,391],{"class":368},[240,1125,1126,1128,1130,1133],{"class":242,"line":394},[240,1127,398],{"class":397},[240,1129,401],{"class":246},[240,1131,1132],{"class":265}," SecureGateway",[240,1134,407],{"class":254},[240,1136,1137],{"class":242,"line":410},[240,1138,1139],{"class":368},"  \n",[240,1141,1142,1144,1147],{"class":242,"line":417},[240,1143,479],{"class":254},[240,1145,1146],{"class":250},"OnConnectionAttempt",[240,1148,391],{"class":368},[240,1150,1151,1154,1157],{"class":242,"line":423},[240,1152,1153],{"class":246},"  async",[240,1155,1156],{"class":490}," validateConnection",[240,1158,1159],{"class":254},"(\n",[240,1161,1162,1165,1167,1170,1172,1174,1176,1178],{"class":242,"line":429},[240,1163,1164],{"class":258},"    params",[240,1166,262],{"class":254},[240,1168,1169],{"class":265}," Record",[240,1171,972],{"class":254},[240,1173,313],{"class":265},[240,1175,977],{"class":254},[240,1177,980],{"class":265},[240,1179,983],{"class":254},[240,1181,1182,1185,1187],{"class":242,"line":544},[240,1183,1184],{"class":258},"    request",[240,1186,262],{"class":254},[240,1188,1189],{"class":265}," Request\n",[240,1191,1192,1195,1198,1200,1203,1206],{"class":242,"line":562},[240,1193,1194],{"class":254},"  ):",[240,1196,1197],{"class":265}," Promise",[240,1199,972],{"class":254},[240,1201,1202],{"class":265},"boolean",[240,1204,1205],{"class":254},">",[240,1207,407],{"class":254},[240,1209,1210,1213,1216,1219,1222,1225,1228,1231,1233],{"class":242,"line":571},[240,1211,1212],{"class":246},"    const",[240,1214,1215],{"class":368}," token",[240,1217,1218],{"class":254}," =",[240,1220,1221],{"class":368}," params",[240,1223,1224],{"class":254},".",[240,1226,1227],{"class":368},"token",[240,1229,1230],{"class":397}," as",[240,1232,266],{"class":265},[240,1234,1235],{"class":254},";\n",[240,1237,1238],{"class":242,"line":583},[240,1239,1240],{"class":490},"    \n",[240,1242,1243,1246,1249,1252,1254,1257],{"class":242,"line":608},[240,1244,1245],{"class":397},"    if",[240,1247,1248],{"class":490}," (",[240,1250,1251],{"class":254},"!",[240,1253,1227],{"class":368},[240,1255,1256],{"class":490},") ",[240,1258,1259],{"class":254},"{\n",[240,1261,1262,1265,1269,1272],{"class":242,"line":629},[240,1263,1264],{"class":397},"      return",[240,1266,1268],{"class":1267},"sfNiH"," false",[240,1270,1271],{"class":254},";",[240,1273,1274],{"class":413}," \u002F\u002F Reject\n",[240,1276,1277],{"class":242,"line":634},[240,1278,1279],{"class":254},"    }\n",[240,1281,1282],{"class":242,"line":639},[240,1283,1240],{"class":490},[240,1285,1286,1289,1292,1294],{"class":242,"line":645},[240,1287,1288],{"class":397},"    return",[240,1290,1291],{"class":1267}," true",[240,1293,1271],{"class":254},[240,1295,1296],{"class":413}," \u002F\u002F Accept\n",[240,1298,1299],{"class":242,"line":651},[240,1300,1301],{"class":254},"  }\n",[240,1303,1305],{"class":242,"line":1304},18,[240,1306,420],{"class":254},[240,1308,1310],{"class":242,"line":1309},19,[240,1311,426],{"emptyLinePlaceholder":56},[240,1313,1315],{"class":242,"line":1314},20,[240,1316,1317],{"class":413},"\u002F\u002F Client: ws:\u002F\u002Fserver.com\u002Fsecure?token=abc123\n",[231,1319,1322],{"className":233,"code":1320,"filename":1321,"language":235,"meta":236,"style":236},"@Namespace('\u002Fauthenticated')\n@Controller()\nexport class AuthenticatedGateway {\n  \n  @Inject(AuthService)\n  private authService!: AuthService;\n  \n  @OnConnectionAttempt()\n  async validateToken(params: Record\u003Cstring, unknown>): Promise\u003Cboolean> {\n    const token = params.token as string;\n    \n    try {\n      const user = await this.authService.verifyJWT(token);\n      \n      \u002F\u002F Check if user is active\n      if (!user.isActive) {\n        throw new Error('Account is inactive');\n      }\n      \n      return true;\n    } catch (error) {\n      console.error('Auth failed:', error);\n      return false;\n    }\n  }\n}\n","JWT Token validation",[208,1323,1324,1341,1349,1360,1364,1374,1390,1394,1402,1438,1458,1462,1469,1501,1506,1511,1532,1556,1561,1565,1573,1591,1619,1628,1633,1638],{"__ignoreMap":236},[240,1325,1326,1328,1330,1332,1334,1337,1339],{"class":242,"line":243},[240,1327,362],{"class":254},[240,1329,365],{"class":250},[240,1331,255],{"class":368},[240,1333,371],{"class":254},[240,1335,1336],{"class":374},"\u002Fauthenticated",[240,1338,371],{"class":254},[240,1340,380],{"class":368},[240,1342,1343,1345,1347],{"class":242,"line":383},[240,1344,362],{"class":254},[240,1346,388],{"class":250},[240,1348,391],{"class":368},[240,1350,1351,1353,1355,1358],{"class":242,"line":394},[240,1352,398],{"class":397},[240,1354,401],{"class":246},[240,1356,1357],{"class":265}," AuthenticatedGateway",[240,1359,407],{"class":254},[240,1361,1362],{"class":242,"line":410},[240,1363,1139],{"class":368},[240,1365,1366,1368,1371],{"class":242,"line":417},[240,1367,479],{"class":254},[240,1369,1370],{"class":250},"Inject",[240,1372,1373],{"class":368},"(AuthService)\n",[240,1375,1376,1379,1382,1385,1388],{"class":242,"line":423},[240,1377,1378],{"class":246},"  private",[240,1380,1381],{"class":490}," authService",[240,1383,1384],{"class":254},"!:",[240,1386,1387],{"class":265}," AuthService",[240,1389,1235],{"class":254},[240,1391,1392],{"class":242,"line":429},[240,1393,1139],{"class":368},[240,1395,1396,1398,1400],{"class":242,"line":544},[240,1397,479],{"class":254},[240,1399,1146],{"class":250},[240,1401,391],{"class":368},[240,1403,1404,1406,1409,1411,1413,1415,1417,1419,1421,1423,1425,1428,1430,1432,1434,1436],{"class":242,"line":562},[240,1405,1153],{"class":246},[240,1407,1408],{"class":490}," validateToken",[240,1410,255],{"class":254},[240,1412,1028],{"class":258},[240,1414,262],{"class":254},[240,1416,1169],{"class":265},[240,1418,972],{"class":254},[240,1420,313],{"class":265},[240,1422,977],{"class":254},[240,1424,980],{"class":265},[240,1426,1427],{"class":254},">):",[240,1429,1197],{"class":265},[240,1431,972],{"class":254},[240,1433,1202],{"class":265},[240,1435,1205],{"class":254},[240,1437,407],{"class":254},[240,1439,1440,1442,1444,1446,1448,1450,1452,1454,1456],{"class":242,"line":571},[240,1441,1212],{"class":246},[240,1443,1215],{"class":368},[240,1445,1218],{"class":254},[240,1447,1221],{"class":368},[240,1449,1224],{"class":254},[240,1451,1227],{"class":368},[240,1453,1230],{"class":397},[240,1455,266],{"class":265},[240,1457,1235],{"class":254},[240,1459,1460],{"class":242,"line":583},[240,1461,1240],{"class":490},[240,1463,1464,1467],{"class":242,"line":608},[240,1465,1466],{"class":397},"    try",[240,1468,407],{"class":254},[240,1470,1471,1474,1477,1479,1482,1485,1488,1490,1493,1495,1497,1499],{"class":242,"line":629},[240,1472,1473],{"class":246},"      const",[240,1475,1476],{"class":368}," user",[240,1478,1218],{"class":254},[240,1480,1481],{"class":397}," await",[240,1483,1484],{"class":254}," this.",[240,1486,1487],{"class":368},"authService",[240,1489,1224],{"class":254},[240,1491,1492],{"class":250},"verifyJWT",[240,1494,255],{"class":490},[240,1496,1227],{"class":368},[240,1498,524],{"class":490},[240,1500,1235],{"class":254},[240,1502,1503],{"class":242,"line":634},[240,1504,1505],{"class":490},"      \n",[240,1507,1508],{"class":242,"line":639},[240,1509,1510],{"class":413},"      \u002F\u002F Check if user is active\n",[240,1512,1513,1516,1518,1520,1523,1525,1528,1530],{"class":242,"line":645},[240,1514,1515],{"class":397},"      if",[240,1517,1248],{"class":490},[240,1519,1251],{"class":254},[240,1521,1522],{"class":368},"user",[240,1524,1224],{"class":254},[240,1526,1527],{"class":368},"isActive",[240,1529,1256],{"class":490},[240,1531,1259],{"class":254},[240,1533,1534,1537,1540,1543,1545,1547,1550,1552,1554],{"class":242,"line":651},[240,1535,1536],{"class":397},"        throw",[240,1538,1539],{"class":254}," new",[240,1541,1542],{"class":250}," Error",[240,1544,255],{"class":490},[240,1546,371],{"class":254},[240,1548,1549],{"class":374},"Account is inactive",[240,1551,371],{"class":254},[240,1553,524],{"class":490},[240,1555,1235],{"class":254},[240,1557,1558],{"class":242,"line":1304},[240,1559,1560],{"class":254},"      }\n",[240,1562,1563],{"class":242,"line":1309},[240,1564,1505],{"class":490},[240,1566,1567,1569,1571],{"class":242,"line":1314},[240,1568,1264],{"class":397},[240,1570,1291],{"class":1267},[240,1572,1235],{"class":254},[240,1574,1576,1579,1582,1584,1587,1589],{"class":242,"line":1575},21,[240,1577,1578],{"class":254},"    }",[240,1580,1581],{"class":397}," catch",[240,1583,1248],{"class":490},[240,1585,1586],{"class":368},"error",[240,1588,1256],{"class":490},[240,1590,1259],{"class":254},[240,1592,1594,1597,1599,1601,1603,1605,1608,1610,1612,1615,1617],{"class":242,"line":1593},22,[240,1595,1596],{"class":368},"      console",[240,1598,1224],{"class":254},[240,1600,1586],{"class":250},[240,1602,255],{"class":490},[240,1604,371],{"class":254},[240,1606,1607],{"class":374},"Auth failed:",[240,1609,371],{"class":254},[240,1611,977],{"class":254},[240,1613,1614],{"class":368}," error",[240,1616,524],{"class":490},[240,1618,1235],{"class":254},[240,1620,1622,1624,1626],{"class":242,"line":1621},23,[240,1623,1264],{"class":397},[240,1625,1268],{"class":1267},[240,1627,1235],{"class":254},[240,1629,1631],{"class":242,"line":1630},24,[240,1632,1279],{"class":254},[240,1634,1636],{"class":242,"line":1635},25,[240,1637,1301],{"class":254},[240,1639,1641],{"class":242,"line":1640},26,[240,1642,420],{"class":254},[231,1644,1647],{"className":233,"code":1645,"filename":1646,"language":235,"meta":236,"style":236},"@Namespace('\u002Fadmin')\n@Controller()\nexport class AdminGateway {\n  \n  @Inject(UserService)\n  private userService!: UserService;\n  \n  @OnConnectionAttempt()\n  async checkAdminAccess(params: Record\u003Cstring, unknown>): Promise\u003Cboolean> {\n    const userId = params.userId as string;\n    \n    if (!userId) {\n      throw new Error('User ID required');\n    }\n    \n    const user = await this.userService.findById(userId);\n    \n    if (!user || user.role !== 'admin') {\n      throw new Error('Admin access required');\n    }\n    \n    return true;\n  }\n}\n","Role-Based access",[208,1648,1649,1666,1674,1685,1689,1698,1712,1716,1724,1759,1781,1785,1799,1821,1825,1829,1857,1861,1895,1916,1920,1924,1932,1936],{"__ignoreMap":236},[240,1650,1651,1653,1655,1657,1659,1662,1664],{"class":242,"line":243},[240,1652,362],{"class":254},[240,1654,365],{"class":250},[240,1656,255],{"class":368},[240,1658,371],{"class":254},[240,1660,1661],{"class":374},"\u002Fadmin",[240,1663,371],{"class":254},[240,1665,380],{"class":368},[240,1667,1668,1670,1672],{"class":242,"line":383},[240,1669,362],{"class":254},[240,1671,388],{"class":250},[240,1673,391],{"class":368},[240,1675,1676,1678,1680,1683],{"class":242,"line":394},[240,1677,398],{"class":397},[240,1679,401],{"class":246},[240,1681,1682],{"class":265}," AdminGateway",[240,1684,407],{"class":254},[240,1686,1687],{"class":242,"line":410},[240,1688,1139],{"class":368},[240,1690,1691,1693,1695],{"class":242,"line":417},[240,1692,479],{"class":254},[240,1694,1370],{"class":250},[240,1696,1697],{"class":368},"(UserService)\n",[240,1699,1700,1702,1705,1707,1710],{"class":242,"line":423},[240,1701,1378],{"class":246},[240,1703,1704],{"class":490}," userService",[240,1706,1384],{"class":254},[240,1708,1709],{"class":265}," UserService",[240,1711,1235],{"class":254},[240,1713,1714],{"class":242,"line":429},[240,1715,1139],{"class":368},[240,1717,1718,1720,1722],{"class":242,"line":544},[240,1719,479],{"class":254},[240,1721,1146],{"class":250},[240,1723,391],{"class":368},[240,1725,1726,1728,1731,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751,1753,1755,1757],{"class":242,"line":562},[240,1727,1153],{"class":246},[240,1729,1730],{"class":490}," checkAdminAccess",[240,1732,255],{"class":254},[240,1734,1028],{"class":258},[240,1736,262],{"class":254},[240,1738,1169],{"class":265},[240,1740,972],{"class":254},[240,1742,313],{"class":265},[240,1744,977],{"class":254},[240,1746,980],{"class":265},[240,1748,1427],{"class":254},[240,1750,1197],{"class":265},[240,1752,972],{"class":254},[240,1754,1202],{"class":265},[240,1756,1205],{"class":254},[240,1758,407],{"class":254},[240,1760,1761,1763,1766,1768,1770,1772,1775,1777,1779],{"class":242,"line":571},[240,1762,1212],{"class":246},[240,1764,1765],{"class":368}," userId",[240,1767,1218],{"class":254},[240,1769,1221],{"class":368},[240,1771,1224],{"class":254},[240,1773,1774],{"class":368},"userId",[240,1776,1230],{"class":397},[240,1778,266],{"class":265},[240,1780,1235],{"class":254},[240,1782,1783],{"class":242,"line":583},[240,1784,1240],{"class":490},[240,1786,1787,1789,1791,1793,1795,1797],{"class":242,"line":608},[240,1788,1245],{"class":397},[240,1790,1248],{"class":490},[240,1792,1251],{"class":254},[240,1794,1774],{"class":368},[240,1796,1256],{"class":490},[240,1798,1259],{"class":254},[240,1800,1801,1804,1806,1808,1810,1812,1815,1817,1819],{"class":242,"line":629},[240,1802,1803],{"class":397},"      throw",[240,1805,1539],{"class":254},[240,1807,1542],{"class":250},[240,1809,255],{"class":490},[240,1811,371],{"class":254},[240,1813,1814],{"class":374},"User ID required",[240,1816,371],{"class":254},[240,1818,524],{"class":490},[240,1820,1235],{"class":254},[240,1822,1823],{"class":242,"line":634},[240,1824,1279],{"class":254},[240,1826,1827],{"class":242,"line":639},[240,1828,1240],{"class":490},[240,1830,1831,1833,1835,1837,1839,1841,1844,1846,1849,1851,1853,1855],{"class":242,"line":645},[240,1832,1212],{"class":246},[240,1834,1476],{"class":368},[240,1836,1218],{"class":254},[240,1838,1481],{"class":397},[240,1840,1484],{"class":254},[240,1842,1843],{"class":368},"userService",[240,1845,1224],{"class":254},[240,1847,1848],{"class":250},"findById",[240,1850,255],{"class":490},[240,1852,1774],{"class":368},[240,1854,524],{"class":490},[240,1856,1235],{"class":254},[240,1858,1859],{"class":242,"line":651},[240,1860,1240],{"class":490},[240,1862,1863,1865,1867,1869,1871,1874,1876,1878,1881,1884,1886,1889,1891,1893],{"class":242,"line":1304},[240,1864,1245],{"class":397},[240,1866,1248],{"class":490},[240,1868,1251],{"class":254},[240,1870,1522],{"class":368},[240,1872,1873],{"class":254}," ||",[240,1875,1476],{"class":368},[240,1877,1224],{"class":254},[240,1879,1880],{"class":368},"role",[240,1882,1883],{"class":254}," !==",[240,1885,496],{"class":254},[240,1887,1888],{"class":374},"admin",[240,1890,371],{"class":254},[240,1892,1256],{"class":490},[240,1894,1259],{"class":254},[240,1896,1897,1899,1901,1903,1905,1907,1910,1912,1914],{"class":242,"line":1309},[240,1898,1803],{"class":397},[240,1900,1539],{"class":254},[240,1902,1542],{"class":250},[240,1904,255],{"class":490},[240,1906,371],{"class":254},[240,1908,1909],{"class":374},"Admin access required",[240,1911,371],{"class":254},[240,1913,524],{"class":490},[240,1915,1235],{"class":254},[240,1917,1918],{"class":242,"line":1314},[240,1919,1279],{"class":254},[240,1921,1922],{"class":242,"line":1575},[240,1923,1240],{"class":490},[240,1925,1926,1928,1930],{"class":242,"line":1593},[240,1927,1288],{"class":397},[240,1929,1291],{"class":1267},[240,1931,1235],{"class":254},[240,1933,1934],{"class":242,"line":1621},[240,1935,1301],{"class":254},[240,1937,1938],{"class":242,"line":1630},[240,1939,420],{"class":254},[231,1941,1944],{"className":233,"code":1942,"filename":1943,"language":235,"meta":236,"style":236},"@Namespace('\u002Finternal')\n@Controller()\nexport class InternalGateway {\n  \n  private allowedIPs = new Set(['127.0.0.1', '192.168.1.1']);\n  \n  @OnConnectionAttempt()\n  async checkIP(params: Record\u003Cstring, unknown>, request: Request): Promise\u003Cboolean> {\n    const ip = request.headers.get('x-forwarded-for') || \n                request.headers.get('x-real-ip') || \n                'unknown';\n    \n    if (!this.allowedIPs.has(ip)) {\n      throw new Error(`IP ${ip} not allowed`);\n    }\n    \n    return true;\n  }\n}\n","IP Whitelist",[208,1945,1946,1963,1971,1982,1986,2024,2028,2036,2082,2120,2148,2160,2164,2191,2224,2228,2232,2240,2244],{"__ignoreMap":236},[240,1947,1948,1950,1952,1954,1956,1959,1961],{"class":242,"line":243},[240,1949,362],{"class":254},[240,1951,365],{"class":250},[240,1953,255],{"class":368},[240,1955,371],{"class":254},[240,1957,1958],{"class":374},"\u002Finternal",[240,1960,371],{"class":254},[240,1962,380],{"class":368},[240,1964,1965,1967,1969],{"class":242,"line":383},[240,1966,362],{"class":254},[240,1968,388],{"class":250},[240,1970,391],{"class":368},[240,1972,1973,1975,1977,1980],{"class":242,"line":394},[240,1974,398],{"class":397},[240,1976,401],{"class":246},[240,1978,1979],{"class":265}," InternalGateway",[240,1981,407],{"class":254},[240,1983,1984],{"class":242,"line":410},[240,1985,1139],{"class":368},[240,1987,1988,1990,1993,1995,1997,2000,2003,2005,2008,2010,2012,2014,2017,2019,2022],{"class":242,"line":417},[240,1989,1378],{"class":246},[240,1991,1992],{"class":490}," allowedIPs",[240,1994,1218],{"class":254},[240,1996,1539],{"class":254},[240,1998,1999],{"class":490}," Set",[240,2001,2002],{"class":368},"([",[240,2004,371],{"class":254},[240,2006,2007],{"class":374},"127.0.0.1",[240,2009,371],{"class":254},[240,2011,977],{"class":254},[240,2013,496],{"class":254},[240,2015,2016],{"class":374},"192.168.1.1",[240,2018,371],{"class":254},[240,2020,2021],{"class":368},"])",[240,2023,1235],{"class":254},[240,2025,2026],{"class":242,"line":423},[240,2027,1139],{"class":368},[240,2029,2030,2032,2034],{"class":242,"line":429},[240,2031,479],{"class":254},[240,2033,1146],{"class":250},[240,2035,391],{"class":368},[240,2037,2038,2040,2043,2045,2047,2049,2051,2053,2055,2057,2059,2062,2065,2067,2070,2072,2074,2076,2078,2080],{"class":242,"line":544},[240,2039,1153],{"class":246},[240,2041,2042],{"class":490}," checkIP",[240,2044,255],{"class":254},[240,2046,1028],{"class":258},[240,2048,262],{"class":254},[240,2050,1169],{"class":265},[240,2052,972],{"class":254},[240,2054,313],{"class":265},[240,2056,977],{"class":254},[240,2058,980],{"class":265},[240,2060,2061],{"class":254},">,",[240,2063,2064],{"class":258}," request",[240,2066,262],{"class":254},[240,2068,2069],{"class":265}," Request",[240,2071,269],{"class":254},[240,2073,1197],{"class":265},[240,2075,972],{"class":254},[240,2077,1202],{"class":265},[240,2079,1205],{"class":254},[240,2081,407],{"class":254},[240,2083,2084,2086,2089,2091,2093,2095,2098,2100,2103,2105,2107,2110,2112,2114,2117],{"class":242,"line":562},[240,2085,1212],{"class":246},[240,2087,2088],{"class":368}," ip",[240,2090,1218],{"class":254},[240,2092,2064],{"class":368},[240,2094,1224],{"class":254},[240,2096,2097],{"class":368},"headers",[240,2099,1224],{"class":254},[240,2101,2102],{"class":250},"get",[240,2104,255],{"class":490},[240,2106,371],{"class":254},[240,2108,2109],{"class":374},"x-forwarded-for",[240,2111,371],{"class":254},[240,2113,1256],{"class":490},[240,2115,2116],{"class":254},"||",[240,2118,2119],{"class":490}," \n",[240,2121,2122,2125,2127,2129,2131,2133,2135,2137,2140,2142,2144,2146],{"class":242,"line":571},[240,2123,2124],{"class":368},"                request",[240,2126,1224],{"class":254},[240,2128,2097],{"class":368},[240,2130,1224],{"class":254},[240,2132,2102],{"class":250},[240,2134,255],{"class":490},[240,2136,371],{"class":254},[240,2138,2139],{"class":374},"x-real-ip",[240,2141,371],{"class":254},[240,2143,1256],{"class":490},[240,2145,2116],{"class":254},[240,2147,2119],{"class":490},[240,2149,2150,2153,2156,2158],{"class":242,"line":583},[240,2151,2152],{"class":254},"                '",[240,2154,2155],{"class":374},"unknown",[240,2157,371],{"class":254},[240,2159,1235],{"class":254},[240,2161,2162],{"class":242,"line":608},[240,2163,1240],{"class":490},[240,2165,2166,2168,2170,2173,2176,2178,2181,2183,2186,2189],{"class":242,"line":629},[240,2167,1245],{"class":397},[240,2169,1248],{"class":490},[240,2171,2172],{"class":254},"!this.",[240,2174,2175],{"class":368},"allowedIPs",[240,2177,1224],{"class":254},[240,2179,2180],{"class":250},"has",[240,2182,255],{"class":490},[240,2184,2185],{"class":368},"ip",[240,2187,2188],{"class":490},")) ",[240,2190,1259],{"class":254},[240,2192,2193,2195,2197,2199,2201,2204,2207,2210,2212,2215,2218,2220,2222],{"class":242,"line":634},[240,2194,1803],{"class":397},[240,2196,1539],{"class":254},[240,2198,1542],{"class":250},[240,2200,255],{"class":490},[240,2202,2203],{"class":254},"`",[240,2205,2206],{"class":374},"IP ",[240,2208,2209],{"class":254},"${",[240,2211,2185],{"class":368},[240,2213,2214],{"class":254},"}",[240,2216,2217],{"class":374}," not allowed",[240,2219,2203],{"class":254},[240,2221,524],{"class":490},[240,2223,1235],{"class":254},[240,2225,2226],{"class":242,"line":639},[240,2227,1279],{"class":254},[240,2229,2230],{"class":242,"line":645},[240,2231,1240],{"class":490},[240,2233,2234,2236,2238],{"class":242,"line":651},[240,2235,1288],{"class":397},[240,2237,1291],{"class":1267},[240,2239,1235],{"class":254},[240,2241,2242],{"class":242,"line":1304},[240,2243,1301],{"class":254},[240,2245,2246],{"class":242,"line":1309},[240,2247,420],{"class":254},[231,2249,2252],{"className":233,"code":2250,"filename":2251,"language":235,"meta":236,"style":236},"@OnConnectionAttempt()\nasync validateHeaders(\n  params: Record\u003Cstring, unknown>, \n  request: Request\n): Promise\u003Cboolean> {\n  const apiKey = request.headers.get('x-api-key');\n  const version = request.headers.get('x-client-version');\n  \n  if (apiKey !== process.env.WS_API_KEY) {\n    throw new Error('Invalid API key');\n  }\n  \n  \u002F\u002F Check minimum client version\n  if (version && this.isVersionTooOld(version)) {\n    throw new Error('Please update your client');\n  }\n  \n  return true;\n}\n","Custom headers validation",[208,2253,2254,2262,2272,2288,2292,2306,2336,2364,2368,2385,2407,2411,2415,2420,2440,2461,2465,2469,2474],{"__ignoreMap":236},[240,2255,2256,2258,2260],{"class":242,"line":243},[240,2257,362],{"class":254},[240,2259,1146],{"class":250},[240,2261,391],{"class":368},[240,2263,2264,2267,2270],{"class":242,"line":383},[240,2265,2266],{"class":368},"async ",[240,2268,2269],{"class":250},"validateHeaders",[240,2271,1159],{"class":368},[240,2273,2274,2276,2278,2280,2282,2284,2286],{"class":242,"line":394},[240,2275,969],{"class":368},[240,2277,972],{"class":254},[240,2279,313],{"class":368},[240,2281,977],{"class":254},[240,2283,980],{"class":368},[240,2285,2061],{"class":254},[240,2287,2119],{"class":368},[240,2289,2290],{"class":242,"line":410},[240,2291,988],{"class":368},[240,2293,2294,2296,2298,2300,2302,2304],{"class":242,"line":417},[240,2295,993],{"class":368},[240,2297,996],{"class":265},[240,2299,972],{"class":254},[240,2301,1202],{"class":368},[240,2303,1205],{"class":254},[240,2305,407],{"class":254},[240,2307,2308,2311,2314,2316,2318,2320,2322,2324,2326,2328,2331,2333],{"class":242,"line":423},[240,2309,2310],{"class":368},"  const apiKey ",[240,2312,2313],{"class":254},"=",[240,2315,2064],{"class":368},[240,2317,1224],{"class":254},[240,2319,2097],{"class":368},[240,2321,1224],{"class":254},[240,2323,2102],{"class":250},[240,2325,255],{"class":368},[240,2327,371],{"class":254},[240,2329,2330],{"class":374},"x-api-key",[240,2332,371],{"class":254},[240,2334,2335],{"class":368},");\n",[240,2337,2338,2341,2343,2345,2347,2349,2351,2353,2355,2357,2360,2362],{"class":242,"line":429},[240,2339,2340],{"class":368},"  const version ",[240,2342,2313],{"class":254},[240,2344,2064],{"class":368},[240,2346,1224],{"class":254},[240,2348,2097],{"class":368},[240,2350,1224],{"class":254},[240,2352,2102],{"class":250},[240,2354,255],{"class":368},[240,2356,371],{"class":254},[240,2358,2359],{"class":374},"x-client-version",[240,2361,371],{"class":254},[240,2363,2335],{"class":368},[240,2365,2366],{"class":242,"line":544},[240,2367,1139],{"class":368},[240,2369,2370,2373,2375,2378,2381,2383],{"class":242,"line":562},[240,2371,2372],{"class":490},"  if",[240,2374,1248],{"class":254},[240,2376,2377],{"class":258},"apiKey",[240,2379,2380],{"class":368}," !== process.env.WS_API_KEY",[240,2382,524],{"class":254},[240,2384,407],{"class":254},[240,2386,2387,2390,2392,2394,2396,2398,2401,2403,2405],{"class":242,"line":571},[240,2388,2389],{"class":397},"    throw",[240,2391,1539],{"class":254},[240,2393,1542],{"class":250},[240,2395,255],{"class":490},[240,2397,371],{"class":254},[240,2399,2400],{"class":374},"Invalid API key",[240,2402,371],{"class":254},[240,2404,524],{"class":490},[240,2406,1235],{"class":254},[240,2408,2409],{"class":242,"line":583},[240,2410,1301],{"class":254},[240,2412,2413],{"class":242,"line":608},[240,2414,1139],{"class":368},[240,2416,2417],{"class":242,"line":629},[240,2418,2419],{"class":413},"  \u002F\u002F Check minimum client version\n",[240,2421,2422,2424,2426,2429,2432,2434,2436,2438],{"class":242,"line":634},[240,2423,2372],{"class":490},[240,2425,1248],{"class":254},[240,2427,2428],{"class":258},"version",[240,2430,2431],{"class":368}," && this.isVersionTooOld(",[240,2433,2428],{"class":258},[240,2435,524],{"class":254},[240,2437,1256],{"class":368},[240,2439,1259],{"class":254},[240,2441,2442,2444,2446,2448,2450,2452,2455,2457,2459],{"class":242,"line":639},[240,2443,2389],{"class":397},[240,2445,1539],{"class":254},[240,2447,1542],{"class":250},[240,2449,255],{"class":490},[240,2451,371],{"class":254},[240,2453,2454],{"class":374},"Please update your client",[240,2456,371],{"class":254},[240,2458,524],{"class":490},[240,2460,1235],{"class":254},[240,2462,2463],{"class":242,"line":645},[240,2464,1301],{"class":254},[240,2466,2467],{"class":242,"line":651},[240,2468,1139],{"class":368},[240,2470,2471],{"class":242,"line":1304},[240,2472,2473],{"class":368},"  return true;\n",[240,2475,2476],{"class":242,"line":1309},[240,2477,420],{"class":254},[226,2479,2481],{"id":2480},"return-values","Return Values",[278,2483,2484,2493],{},[281,2485,2486],{},[284,2487,2488,2491],{},[287,2489,2490],{},"Return Value",[287,2492,323],{},[300,2494,2495,2504,2513,2522],{},[284,2496,2497,2501],{},[305,2498,2499],{},[208,2500,1065],{},[305,2502,2503],{},"Accept connection",[284,2505,2506,2510],{},[305,2507,2508],{},[208,2509,1075],{},[305,2511,2512],{},"Reject with 403 Forbidden",[284,2514,2515,2520],{},[305,2516,2517,2519],{},[208,2518,1069],{}," (void)",[305,2521,2503],{},[284,2523,2524,2527],{},[305,2525,2526],{},"Thrown error",[305,2528,2529],{},"Reject with 403 and error message",[226,2531,2533],{"id":2532},"common-patterns","Common Patterns",[350,2535,2536,2647],{},[231,2537,2540],{"className":233,"code":2538,"filename":2539,"language":235,"meta":236,"style":236},"@OnConnectionAttempt()\nasync validateConnection(params: Record\u003Cstring, unknown>): Promise\u003Cboolean> {\n  \u002F\u002F All async operations work\n  const isValid = await this.database.checkUser(params.userId);\n  const hasPermission = await this.checkPermissions(params.userId);\n  \n  return isValid && hasPermission;\n}\n","Async Validation",[208,2541,2542,2550,2582,2587,2614,2634,2638,2643],{"__ignoreMap":236},[240,2543,2544,2546,2548],{"class":242,"line":243},[240,2545,362],{"class":254},[240,2547,1146],{"class":250},[240,2549,391],{"class":368},[240,2551,2552,2554,2557,2560,2562,2564,2566,2568,2570,2572,2574,2576,2578,2580],{"class":242,"line":383},[240,2553,2266],{"class":368},[240,2555,2556],{"class":250},"validateConnection",[240,2558,2559],{"class":368},"(params: Record",[240,2561,972],{"class":254},[240,2563,313],{"class":368},[240,2565,977],{"class":254},[240,2567,980],{"class":368},[240,2569,1205],{"class":254},[240,2571,993],{"class":368},[240,2573,996],{"class":265},[240,2575,972],{"class":254},[240,2577,1202],{"class":368},[240,2579,1205],{"class":254},[240,2581,407],{"class":254},[240,2583,2584],{"class":242,"line":394},[240,2585,2586],{"class":413},"  \u002F\u002F All async operations work\n",[240,2588,2589,2592,2594,2596,2598,2601,2603,2606,2609,2611],{"class":242,"line":410},[240,2590,2591],{"class":368},"  const isValid ",[240,2593,2313],{"class":254},[240,2595,1481],{"class":397},[240,2597,1484],{"class":254},[240,2599,2600],{"class":368},"database",[240,2602,1224],{"class":254},[240,2604,2605],{"class":250},"checkUser",[240,2607,2608],{"class":368},"(params",[240,2610,1224],{"class":254},[240,2612,2613],{"class":368},"userId);\n",[240,2615,2616,2619,2621,2623,2625,2628,2630,2632],{"class":242,"line":417},[240,2617,2618],{"class":368},"  const hasPermission ",[240,2620,2313],{"class":254},[240,2622,1481],{"class":397},[240,2624,1484],{"class":254},[240,2626,2627],{"class":250},"checkPermissions",[240,2629,2608],{"class":368},[240,2631,1224],{"class":254},[240,2633,2613],{"class":368},[240,2635,2636],{"class":242,"line":423},[240,2637,1139],{"class":368},[240,2639,2640],{"class":242,"line":429},[240,2641,2642],{"class":368},"  return isValid && hasPermission;\n",[240,2644,2645],{"class":242,"line":544},[240,2646,420],{"class":254},[231,2648,2651],{"className":233,"code":2649,"filename":2650,"language":235,"meta":236,"style":236},"@OnConnectionAttempt()\nasync validateConnection(params: Record\u003Cstring, unknown>): Promise\u003Cboolean> {\n  \u002F\u002F Check 1: Token exists\n  if (!params.token) {\n    throw new Error('Token required');\n  }\n  \n  \u002F\u002F Check 2: Valid token\n  const user = await this.authService.verify(params.token as string);\n  if (!user) {\n    throw new Error('Invalid token');\n  }\n  \n  \u002F\u002F Check 3: User has access\n  if (!user.permissions.includes('websocket:connect')) {\n    throw new Error('Insufficient permissions');\n  }\n  \n  return true;\n}\n","Multiple Checks",[208,2652,2653,2661,2691,2696,2709,2730,2734,2738,2743,2775,2789,2810,2814,2818,2823,2845,2866,2870,2874,2878],{"__ignoreMap":236},[240,2654,2655,2657,2659],{"class":242,"line":243},[240,2656,362],{"class":254},[240,2658,1146],{"class":250},[240,2660,391],{"class":368},[240,2662,2663,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689],{"class":242,"line":383},[240,2664,2266],{"class":368},[240,2666,2556],{"class":250},[240,2668,2559],{"class":368},[240,2670,972],{"class":254},[240,2672,313],{"class":368},[240,2674,977],{"class":254},[240,2676,980],{"class":368},[240,2678,1205],{"class":254},[240,2680,993],{"class":368},[240,2682,996],{"class":265},[240,2684,972],{"class":254},[240,2686,1202],{"class":368},[240,2688,1205],{"class":254},[240,2690,407],{"class":254},[240,2692,2693],{"class":242,"line":394},[240,2694,2695],{"class":413},"  \u002F\u002F Check 1: Token exists\n",[240,2697,2698,2700,2702,2705,2707],{"class":242,"line":410},[240,2699,2372],{"class":490},[240,2701,1248],{"class":254},[240,2703,2704],{"class":368},"!params.token",[240,2706,524],{"class":254},[240,2708,407],{"class":254},[240,2710,2711,2713,2715,2717,2719,2721,2724,2726,2728],{"class":242,"line":417},[240,2712,2389],{"class":397},[240,2714,1539],{"class":254},[240,2716,1542],{"class":250},[240,2718,255],{"class":490},[240,2720,371],{"class":254},[240,2722,2723],{"class":374},"Token required",[240,2725,371],{"class":254},[240,2727,524],{"class":490},[240,2729,1235],{"class":254},[240,2731,2732],{"class":242,"line":423},[240,2733,1301],{"class":254},[240,2735,2736],{"class":242,"line":429},[240,2737,1139],{"class":368},[240,2739,2740],{"class":242,"line":544},[240,2741,2742],{"class":413},"  \u002F\u002F Check 2: Valid token\n",[240,2744,2745,2748,2750,2752,2754,2756,2758,2761,2763,2765,2768,2771,2773],{"class":242,"line":562},[240,2746,2747],{"class":368},"  const user ",[240,2749,2313],{"class":254},[240,2751,1481],{"class":397},[240,2753,1484],{"class":254},[240,2755,1487],{"class":368},[240,2757,1224],{"class":254},[240,2759,2760],{"class":250},"verify",[240,2762,2608],{"class":368},[240,2764,1224],{"class":254},[240,2766,2767],{"class":368},"token ",[240,2769,2770],{"class":397},"as",[240,2772,266],{"class":265},[240,2774,2335],{"class":368},[240,2776,2777,2779,2781,2783,2785,2787],{"class":242,"line":571},[240,2778,2372],{"class":490},[240,2780,1248],{"class":254},[240,2782,1251],{"class":368},[240,2784,1522],{"class":258},[240,2786,524],{"class":254},[240,2788,407],{"class":254},[240,2790,2791,2793,2795,2797,2799,2801,2804,2806,2808],{"class":242,"line":583},[240,2792,2389],{"class":397},[240,2794,1539],{"class":254},[240,2796,1542],{"class":250},[240,2798,255],{"class":490},[240,2800,371],{"class":254},[240,2802,2803],{"class":374},"Invalid token",[240,2805,371],{"class":254},[240,2807,524],{"class":490},[240,2809,1235],{"class":254},[240,2811,2812],{"class":242,"line":608},[240,2813,1301],{"class":254},[240,2815,2816],{"class":242,"line":629},[240,2817,1139],{"class":368},[240,2819,2820],{"class":242,"line":634},[240,2821,2822],{"class":413},"  \u002F\u002F Check 3: User has access\n",[240,2824,2825,2827,2829,2832,2834,2837,2839,2841,2843],{"class":242,"line":639},[240,2826,2372],{"class":490},[240,2828,1248],{"class":254},[240,2830,2831],{"class":368},"!user.permissions.includes(",[240,2833,371],{"class":254},[240,2835,2836],{"class":374},"websocket:connect",[240,2838,371],{"class":254},[240,2840,524],{"class":254},[240,2842,1256],{"class":368},[240,2844,1259],{"class":254},[240,2846,2847,2849,2851,2853,2855,2857,2860,2862,2864],{"class":242,"line":645},[240,2848,2389],{"class":397},[240,2850,1539],{"class":254},[240,2852,1542],{"class":250},[240,2854,255],{"class":490},[240,2856,371],{"class":254},[240,2858,2859],{"class":374},"Insufficient permissions",[240,2861,371],{"class":254},[240,2863,524],{"class":490},[240,2865,1235],{"class":254},[240,2867,2868],{"class":242,"line":651},[240,2869,1301],{"class":254},[240,2871,2872],{"class":242,"line":1304},[240,2873,1139],{"class":368},[240,2875,2876],{"class":242,"line":1309},[240,2877,2473],{"class":368},[240,2879,2880],{"class":242,"line":1314},[240,2881,420],{"class":254},[908,2883],{},[213,2885,2886],{"id":499},[208,2887,2888],{},"@Message",[204,2890,221,2891,2893],{},[208,2892,2888],{}," decorator listens for incoming WebSocket messages with a specific event name.",[226,2895,229],{"id":2896},"signature-2",[231,2898,2900],{"className":233,"code":2899,"language":235,"meta":236,"style":236},"function Message(options: MessageDecoratorOptions): MethodDecorator\n\ninterface MessageDecoratorOptions {\n  event: string;\n  validationSchema?: ValidationTypes.Schema;\n}\n",[208,2901,2902,2923,2927,2936,2947,2965],{"__ignoreMap":236},[240,2903,2904,2906,2909,2911,2914,2916,2919,2921],{"class":242,"line":243},[240,2905,247],{"class":246},[240,2907,2908],{"class":250}," Message",[240,2910,255],{"class":254},[240,2912,2913],{"class":258},"options",[240,2915,262],{"class":254},[240,2917,2918],{"class":265}," MessageDecoratorOptions",[240,2920,269],{"class":254},[240,2922,941],{"class":265},[240,2924,2925],{"class":242,"line":383},[240,2926,426],{"emptyLinePlaceholder":56},[240,2928,2929,2932,2934],{"class":242,"line":394},[240,2930,2931],{"class":246},"interface",[240,2933,2918],{"class":265},[240,2935,407],{"class":254},[240,2937,2938,2941,2943,2945],{"class":242,"line":410},[240,2939,2940],{"class":490},"  event",[240,2942,262],{"class":254},[240,2944,266],{"class":265},[240,2946,1235],{"class":254},[240,2948,2949,2952,2955,2958,2960,2963],{"class":242,"line":417},[240,2950,2951],{"class":490},"  validationSchema",[240,2953,2954],{"class":254},"?:",[240,2956,2957],{"class":265}," ValidationTypes",[240,2959,1224],{"class":254},[240,2961,2962],{"class":265},"Schema",[240,2964,1235],{"class":254},[240,2966,2967],{"class":242,"line":423},[240,2968,420],{"class":254},[226,2970,276],{"id":2971},"parameters-2",[278,2973,2974,2986],{},[281,2975,2976],{},[284,2977,2978,2980,2982,2984],{},[287,2979,289],{},[287,2981,292],{},[287,2983,295],{},[287,2985,298],{},[300,2987,2988,3004],{},[284,2989,2990,2995,2999,3001],{},[305,2991,2992],{},[208,2993,2994],{},"event",[305,2996,2997],{},[208,2998,313],{},[305,3000,316],{},[305,3002,3003],{},"The event name to listen for",[284,3005,3006,3011,3015,3018],{},[305,3007,3008],{},[208,3009,3010],{},"validationSchema",[305,3012,3013],{},[208,3014,2962],{},[305,3016,3017],{},"No",[305,3019,3020],{},"Zod schema for validating incoming message data",[226,3022,951],{"id":3023},"handler-method-signature-1",[231,3025,3027],{"className":233,"code":3026,"language":235,"meta":236,"style":236},"async (\n  data: unknown,\n  peer: Peer\n): Promise\u003Cany>\n",[208,3028,3029,3035,3043,3048],{"__ignoreMap":236},[240,3030,3031,3033],{"class":242,"line":243},[240,3032,961],{"class":250},[240,3034,964],{"class":368},[240,3036,3037,3040],{"class":242,"line":383},[240,3038,3039],{"class":368},"  data: unknown",[240,3041,3042],{"class":254},",\n",[240,3044,3045],{"class":242,"line":394},[240,3046,3047],{"class":368},"  peer: Peer\n",[240,3049,3050,3052,3054,3056,3059],{"class":242,"line":410},[240,3051,993],{"class":368},[240,3053,996],{"class":265},[240,3055,972],{"class":254},[240,3057,3058],{"class":368},"any",[240,3060,3061],{"class":254},">\n",[278,3063,3064,3074],{},[281,3065,3066],{},[284,3067,3068,3070,3072],{},[287,3069,289],{},[287,3071,292],{},[287,3073,298],{},[300,3075,3076,3090],{},[284,3077,3078,3082,3087],{},[305,3079,3080],{},[208,3081,516],{},[305,3083,3084,3086],{},[208,3085,2155],{}," (or typed with schema)",[305,3088,3089],{},"The message data sent by the client",[284,3091,3092,3097,3102],{},[305,3093,3094],{},[208,3095,3096],{},"peer",[305,3098,3099],{},[208,3100,3101],{},"Peer",[305,3103,3104],{},"The connected peer that sent the message",[226,3106,3108],{"id":3107},"peer-object","Peer Object",[231,3110,3112],{"className":233,"code":3111,"language":235,"meta":236,"style":236},"interface Peer {\n  id: string;          \u002F\u002F Unique peer identifier\n  namespace?: string;  \u002F\u002F Namespace the peer is connected to\n  ip?: string;        \u002F\u002F Client IP address\n  send(message: unknown): void;  \u002F\u002F Send message to this peer\n}\n",[208,3113,3114,3123,3137,3151,3165,3188],{"__ignoreMap":236},[240,3115,3116,3118,3121],{"class":242,"line":243},[240,3117,2931],{"class":246},[240,3119,3120],{"class":265}," Peer",[240,3122,407],{"class":254},[240,3124,3125,3128,3130,3132,3134],{"class":242,"line":383},[240,3126,3127],{"class":490},"  id",[240,3129,262],{"class":254},[240,3131,266],{"class":265},[240,3133,1271],{"class":254},[240,3135,3136],{"class":413},"          \u002F\u002F Unique peer identifier\n",[240,3138,3139,3142,3144,3146,3148],{"class":242,"line":394},[240,3140,3141],{"class":490},"  namespace",[240,3143,2954],{"class":254},[240,3145,266],{"class":265},[240,3147,1271],{"class":254},[240,3149,3150],{"class":413},"  \u002F\u002F Namespace the peer is connected to\n",[240,3152,3153,3156,3158,3160,3162],{"class":242,"line":410},[240,3154,3155],{"class":490},"  ip",[240,3157,2954],{"class":254},[240,3159,266],{"class":265},[240,3161,1271],{"class":254},[240,3163,3164],{"class":413},"        \u002F\u002F Client IP address\n",[240,3166,3167,3170,3172,3174,3176,3178,3180,3183,3185],{"class":242,"line":417},[240,3168,3169],{"class":490},"  send",[240,3171,255],{"class":254},[240,3173,499],{"class":258},[240,3175,262],{"class":254},[240,3177,980],{"class":265},[240,3179,269],{"class":254},[240,3181,3182],{"class":265}," void",[240,3184,1271],{"class":254},[240,3186,3187],{"class":413},"  \u002F\u002F Send message to this peer\n",[240,3189,3190],{"class":242,"line":423},[240,3191,420],{"class":254},[226,3193,323],{"id":3194},"behavior-2",[325,3196,3197,3204,3207,3210,3221],{},[328,3198,3199,3200,3203],{},"Listens for messages with ",[208,3201,3202],{},"{ event: '...', data: {...} }"," structure",[328,3205,3206],{},"Can have multiple message handlers with different events",[328,3208,3209],{},"Supports schema validation with Zod or other validators",[328,3211,3212,3213,3216,3217,3220],{},"Handler return value can be used with ",[208,3214,3215],{},"@Emit",", ",[208,3218,3219],{},"@Broadcast",", etc.",[328,3222,3223],{},"Invalid messages (validation errors) are logged and ignored",[226,3225,22],{"id":3226},"examples-2",[350,3228,3229,3401,3757,4024,4231,4506],{},[231,3230,3233],{"className":233,"code":3231,"filename":3232,"language":235,"meta":236,"style":236},"@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  \n  @Message({ event: 'send-message' })\n  handleMessage(data: any, peer: Peer) {\n    console.log(`Message from ${peer.id}:`, data);\n  }\n}\n\n\u002F\u002F Client sends:\n\u002F\u002F ws.send(JSON.stringify({\n\u002F\u002F   event: 'send-message',\n\u002F\u002F   data: { text: 'Hello!' }\n\u002F\u002F }));\n","Basic Message Handler",[208,3234,3235,3251,3259,3269,3273,3298,3323,3364,3368,3372,3376,3381,3386,3391,3396],{"__ignoreMap":236},[240,3236,3237,3239,3241,3243,3245,3247,3249],{"class":242,"line":243},[240,3238,362],{"class":254},[240,3240,365],{"class":250},[240,3242,255],{"class":368},[240,3244,371],{"class":254},[240,3246,375],{"class":374},[240,3248,371],{"class":254},[240,3250,380],{"class":368},[240,3252,3253,3255,3257],{"class":242,"line":383},[240,3254,362],{"class":254},[240,3256,388],{"class":250},[240,3258,391],{"class":368},[240,3260,3261,3263,3265,3267],{"class":242,"line":394},[240,3262,398],{"class":397},[240,3264,401],{"class":246},[240,3266,404],{"class":265},[240,3268,407],{"class":254},[240,3270,3271],{"class":242,"line":410},[240,3272,1139],{"class":368},[240,3274,3275,3277,3279,3281,3283,3285,3287,3289,3292,3294,3296],{"class":242,"line":417},[240,3276,479],{"class":254},[240,3278,482],{"class":250},[240,3280,255],{"class":368},[240,3282,487],{"class":254},[240,3284,491],{"class":490},[240,3286,262],{"class":254},[240,3288,496],{"class":254},[240,3290,3291],{"class":374},"send-message",[240,3293,371],{"class":254},[240,3295,504],{"class":254},[240,3297,380],{"class":368},[240,3299,3300,3302,3304,3306,3308,3310,3312,3315,3317,3319,3321],{"class":242,"line":423},[240,3301,511],{"class":490},[240,3303,255],{"class":254},[240,3305,516],{"class":258},[240,3307,262],{"class":254},[240,3309,521],{"class":265},[240,3311,977],{"class":254},[240,3313,3314],{"class":258}," peer",[240,3316,262],{"class":254},[240,3318,3120],{"class":265},[240,3320,524],{"class":254},[240,3322,407],{"class":254},[240,3324,3325,3328,3330,3333,3335,3337,3340,3342,3344,3346,3349,3351,3353,3355,3357,3360,3362],{"class":242,"line":429},[240,3326,3327],{"class":368},"    console",[240,3329,1224],{"class":254},[240,3331,3332],{"class":250},"log",[240,3334,255],{"class":490},[240,3336,2203],{"class":254},[240,3338,3339],{"class":374},"Message from ",[240,3341,2209],{"class":254},[240,3343,3096],{"class":368},[240,3345,1224],{"class":254},[240,3347,3348],{"class":368},"id",[240,3350,2214],{"class":254},[240,3352,262],{"class":374},[240,3354,2203],{"class":254},[240,3356,977],{"class":254},[240,3358,3359],{"class":368}," data",[240,3361,524],{"class":490},[240,3363,1235],{"class":254},[240,3365,3366],{"class":242,"line":544},[240,3367,1301],{"class":254},[240,3369,3370],{"class":242,"line":562},[240,3371,420],{"class":254},[240,3373,3374],{"class":242,"line":571},[240,3375,426],{"emptyLinePlaceholder":56},[240,3377,3378],{"class":242,"line":583},[240,3379,3380],{"class":413},"\u002F\u002F Client sends:\n",[240,3382,3383],{"class":242,"line":608},[240,3384,3385],{"class":413},"\u002F\u002F ws.send(JSON.stringify({\n",[240,3387,3388],{"class":242,"line":629},[240,3389,3390],{"class":413},"\u002F\u002F   event: 'send-message',\n",[240,3392,3393],{"class":242,"line":634},[240,3394,3395],{"class":413},"\u002F\u002F   data: { text: 'Hello!' }\n",[240,3397,3398],{"class":242,"line":639},[240,3399,3400],{"class":413},"\u002F\u002F }));\n",[231,3402,3405],{"className":233,"code":3403,"filename":3404,"language":235,"meta":236,"style":236},"import { z } from 'zod';\n\nconst ChatMessageSchema = z.object({\n  text: z.string().min(1).max(500),\n  username: z.string().min(3).max(20),\n  room: z.string().optional()\n});\n\ntype ChatMessage = z.infer\u003Ctypeof ChatMessageSchema>;\n\n@Message({ \n  event: 'send-message',\n  validationSchema: ChatMessageSchema \n})\nhandleMessage(data: ChatMessage, peer: Peer) {\n  \u002F\u002F data is validated and typed\n  console.log(`${data.username}: ${data.text}`);\n  \n  if (data.room) {\n    this.broadcastToRoom(data.room, data);\n  }\n}\n","With Validation Schema",[208,3406,3407,3431,3435,3456,3498,3537,3559,3567,3571,3597,3601,3613,3627,3636,3642,3657,3662,3704,3708,3725,3749,3753],{"__ignoreMap":236},[240,3408,3409,3412,3414,3417,3419,3422,3424,3427,3429],{"class":242,"line":243},[240,3410,3411],{"class":397},"import",[240,3413,527],{"class":254},[240,3415,3416],{"class":368}," z",[240,3418,504],{"class":254},[240,3420,3421],{"class":397}," from",[240,3423,496],{"class":254},[240,3425,3426],{"class":374},"zod",[240,3428,371],{"class":254},[240,3430,1235],{"class":254},[240,3432,3433],{"class":242,"line":383},[240,3434,426],{"emptyLinePlaceholder":56},[240,3436,3437,3440,3443,3445,3447,3449,3452,3454],{"class":242,"line":394},[240,3438,3439],{"class":246},"const",[240,3441,3442],{"class":368}," ChatMessageSchema ",[240,3444,2313],{"class":254},[240,3446,3416],{"class":368},[240,3448,1224],{"class":254},[240,3450,3451],{"class":250},"object",[240,3453,255],{"class":368},[240,3455,1259],{"class":254},[240,3457,3458,3461,3463,3465,3467,3469,3471,3473,3476,3478,3482,3484,3486,3489,3491,3494,3496],{"class":242,"line":410},[240,3459,3460],{"class":490},"  text",[240,3462,262],{"class":254},[240,3464,3416],{"class":368},[240,3466,1224],{"class":254},[240,3468,313],{"class":250},[240,3470,798],{"class":368},[240,3472,1224],{"class":254},[240,3474,3475],{"class":250},"min",[240,3477,255],{"class":368},[240,3479,3481],{"class":3480},"sbssI","1",[240,3483,524],{"class":368},[240,3485,1224],{"class":254},[240,3487,3488],{"class":250},"max",[240,3490,255],{"class":368},[240,3492,3493],{"class":3480},"500",[240,3495,524],{"class":368},[240,3497,3042],{"class":254},[240,3499,3500,3503,3505,3507,3509,3511,3513,3515,3517,3519,3522,3524,3526,3528,3530,3533,3535],{"class":242,"line":417},[240,3501,3502],{"class":490},"  username",[240,3504,262],{"class":254},[240,3506,3416],{"class":368},[240,3508,1224],{"class":254},[240,3510,313],{"class":250},[240,3512,798],{"class":368},[240,3514,1224],{"class":254},[240,3516,3475],{"class":250},[240,3518,255],{"class":368},[240,3520,3521],{"class":3480},"3",[240,3523,524],{"class":368},[240,3525,1224],{"class":254},[240,3527,3488],{"class":250},[240,3529,255],{"class":368},[240,3531,3532],{"class":3480},"20",[240,3534,524],{"class":368},[240,3536,3042],{"class":254},[240,3538,3539,3542,3544,3546,3548,3550,3552,3554,3557],{"class":242,"line":423},[240,3540,3541],{"class":490},"  room",[240,3543,262],{"class":254},[240,3545,3416],{"class":368},[240,3547,1224],{"class":254},[240,3549,313],{"class":250},[240,3551,798],{"class":368},[240,3553,1224],{"class":254},[240,3555,3556],{"class":250},"optional",[240,3558,391],{"class":368},[240,3560,3561,3563,3565],{"class":242,"line":429},[240,3562,2214],{"class":254},[240,3564,524],{"class":368},[240,3566,1235],{"class":254},[240,3568,3569],{"class":242,"line":544},[240,3570,426],{"emptyLinePlaceholder":56},[240,3572,3573,3576,3579,3581,3583,3585,3588,3591,3594],{"class":242,"line":562},[240,3574,3575],{"class":246},"type",[240,3577,3578],{"class":265}," ChatMessage",[240,3580,1218],{"class":254},[240,3582,3416],{"class":265},[240,3584,1224],{"class":254},[240,3586,3587],{"class":265},"infer",[240,3589,3590],{"class":254},"\u003Ctypeof",[240,3592,3593],{"class":368}," ChatMessageSchema",[240,3595,3596],{"class":254},">;\n",[240,3598,3599],{"class":242,"line":571},[240,3600,426],{"emptyLinePlaceholder":56},[240,3602,3603,3605,3607,3609,3611],{"class":242,"line":583},[240,3604,362],{"class":254},[240,3606,482],{"class":250},[240,3608,255],{"class":368},[240,3610,487],{"class":254},[240,3612,2119],{"class":368},[240,3614,3615,3617,3619,3621,3623,3625],{"class":242,"line":608},[240,3616,2940],{"class":490},[240,3618,262],{"class":254},[240,3620,496],{"class":254},[240,3622,3291],{"class":374},[240,3624,371],{"class":254},[240,3626,3042],{"class":254},[240,3628,3629,3631,3633],{"class":242,"line":629},[240,3630,2951],{"class":490},[240,3632,262],{"class":254},[240,3634,3635],{"class":368}," ChatMessageSchema \n",[240,3637,3638,3640],{"class":242,"line":634},[240,3639,2214],{"class":254},[240,3641,380],{"class":368},[240,3643,3644,3647,3650,3652,3655],{"class":242,"line":639},[240,3645,3646],{"class":250},"handleMessage",[240,3648,3649],{"class":368},"(data: ChatMessage",[240,3651,977],{"class":254},[240,3653,3654],{"class":368}," peer: Peer) ",[240,3656,1259],{"class":254},[240,3658,3659],{"class":242,"line":645},[240,3660,3661],{"class":413},"  \u002F\u002F data is validated and typed\n",[240,3663,3664,3667,3669,3671,3673,3676,3678,3680,3683,3685,3688,3690,3692,3694,3697,3700,3702],{"class":242,"line":651},[240,3665,3666],{"class":368},"  console",[240,3668,1224],{"class":254},[240,3670,3332],{"class":250},[240,3672,255],{"class":490},[240,3674,3675],{"class":254},"`${",[240,3677,516],{"class":368},[240,3679,1224],{"class":254},[240,3681,3682],{"class":368},"username",[240,3684,2214],{"class":254},[240,3686,3687],{"class":374},": ",[240,3689,2209],{"class":254},[240,3691,516],{"class":368},[240,3693,1224],{"class":254},[240,3695,3696],{"class":368},"text",[240,3698,3699],{"class":254},"}`",[240,3701,524],{"class":490},[240,3703,1235],{"class":254},[240,3705,3706],{"class":242,"line":1304},[240,3707,1139],{"class":490},[240,3709,3710,3712,3714,3716,3718,3721,3723],{"class":242,"line":1309},[240,3711,2372],{"class":397},[240,3713,1248],{"class":490},[240,3715,516],{"class":368},[240,3717,1224],{"class":254},[240,3719,3720],{"class":368},"room",[240,3722,1256],{"class":490},[240,3724,1259],{"class":254},[240,3726,3727,3730,3733,3735,3737,3739,3741,3743,3745,3747],{"class":242,"line":1314},[240,3728,3729],{"class":254},"    this.",[240,3731,3732],{"class":250},"broadcastToRoom",[240,3734,255],{"class":490},[240,3736,516],{"class":368},[240,3738,1224],{"class":254},[240,3740,3720],{"class":368},[240,3742,977],{"class":254},[240,3744,3359],{"class":368},[240,3746,524],{"class":490},[240,3748,1235],{"class":254},[240,3750,3751],{"class":242,"line":1575},[240,3752,1301],{"class":254},[240,3754,3755],{"class":242,"line":1593},[240,3756,420],{"class":254},[231,3758,3761],{"className":233,"code":3759,"filename":3760,"language":235,"meta":236,"style":236},"@Namespace('\u002Fgame')\n@Controller()\nexport class GameGateway {\n  \n  @Message({ event: 'player-move' })\n  handleMove(data: { x: number; y: number }, peer: Peer) {\n    \u002F\u002F Handle player movement\n  }\n  \n  @Message({ event: 'player-attack' })\n  handleAttack(data: { target: string }, peer: Peer) {\n    \u002F\u002F Handle player attack\n  }\n  \n  @Message({ event: 'player-chat' })\n  handleChat(data: { text: string }, peer: Peer) {\n    \u002F\u002F Handle chat message\n  }\n}\n","Multiple Event Handlers",[208,3762,3763,3780,3788,3799,3803,3828,3871,3876,3880,3884,3909,3941,3946,3950,3954,3979,4011,4016,4020],{"__ignoreMap":236},[240,3764,3765,3767,3769,3771,3773,3776,3778],{"class":242,"line":243},[240,3766,362],{"class":254},[240,3768,365],{"class":250},[240,3770,255],{"class":368},[240,3772,371],{"class":254},[240,3774,3775],{"class":374},"\u002Fgame",[240,3777,371],{"class":254},[240,3779,380],{"class":368},[240,3781,3782,3784,3786],{"class":242,"line":383},[240,3783,362],{"class":254},[240,3785,388],{"class":250},[240,3787,391],{"class":368},[240,3789,3790,3792,3794,3797],{"class":242,"line":394},[240,3791,398],{"class":397},[240,3793,401],{"class":246},[240,3795,3796],{"class":265}," GameGateway",[240,3798,407],{"class":254},[240,3800,3801],{"class":242,"line":410},[240,3802,1139],{"class":368},[240,3804,3805,3807,3809,3811,3813,3815,3817,3819,3822,3824,3826],{"class":242,"line":417},[240,3806,479],{"class":254},[240,3808,482],{"class":250},[240,3810,255],{"class":368},[240,3812,487],{"class":254},[240,3814,491],{"class":490},[240,3816,262],{"class":254},[240,3818,496],{"class":254},[240,3820,3821],{"class":374},"player-move",[240,3823,371],{"class":254},[240,3825,504],{"class":254},[240,3827,380],{"class":368},[240,3829,3830,3833,3835,3837,3839,3841,3844,3846,3849,3851,3854,3856,3858,3861,3863,3865,3867,3869],{"class":242,"line":423},[240,3831,3832],{"class":490},"  handleMove",[240,3834,255],{"class":254},[240,3836,516],{"class":258},[240,3838,262],{"class":254},[240,3840,527],{"class":254},[240,3842,3843],{"class":490}," x",[240,3845,262],{"class":254},[240,3847,3848],{"class":265}," number",[240,3850,1271],{"class":254},[240,3852,3853],{"class":490}," y",[240,3855,262],{"class":254},[240,3857,3848],{"class":265},[240,3859,3860],{"class":254}," },",[240,3862,3314],{"class":258},[240,3864,262],{"class":254},[240,3866,3120],{"class":265},[240,3868,524],{"class":254},[240,3870,407],{"class":254},[240,3872,3873],{"class":242,"line":429},[240,3874,3875],{"class":413},"    \u002F\u002F Handle player movement\n",[240,3877,3878],{"class":242,"line":544},[240,3879,1301],{"class":254},[240,3881,3882],{"class":242,"line":562},[240,3883,1139],{"class":368},[240,3885,3886,3888,3890,3892,3894,3896,3898,3900,3903,3905,3907],{"class":242,"line":571},[240,3887,479],{"class":254},[240,3889,482],{"class":250},[240,3891,255],{"class":368},[240,3893,487],{"class":254},[240,3895,491],{"class":490},[240,3897,262],{"class":254},[240,3899,496],{"class":254},[240,3901,3902],{"class":374},"player-attack",[240,3904,371],{"class":254},[240,3906,504],{"class":254},[240,3908,380],{"class":368},[240,3910,3911,3914,3916,3918,3920,3922,3925,3927,3929,3931,3933,3935,3937,3939],{"class":242,"line":583},[240,3912,3913],{"class":490},"  handleAttack",[240,3915,255],{"class":254},[240,3917,516],{"class":258},[240,3919,262],{"class":254},[240,3921,527],{"class":254},[240,3923,3924],{"class":490}," target",[240,3926,262],{"class":254},[240,3928,266],{"class":265},[240,3930,3860],{"class":254},[240,3932,3314],{"class":258},[240,3934,262],{"class":254},[240,3936,3120],{"class":265},[240,3938,524],{"class":254},[240,3940,407],{"class":254},[240,3942,3943],{"class":242,"line":608},[240,3944,3945],{"class":413},"    \u002F\u002F Handle player attack\n",[240,3947,3948],{"class":242,"line":629},[240,3949,1301],{"class":254},[240,3951,3952],{"class":242,"line":634},[240,3953,1139],{"class":368},[240,3955,3956,3958,3960,3962,3964,3966,3968,3970,3973,3975,3977],{"class":242,"line":639},[240,3957,479],{"class":254},[240,3959,482],{"class":250},[240,3961,255],{"class":368},[240,3963,487],{"class":254},[240,3965,491],{"class":490},[240,3967,262],{"class":254},[240,3969,496],{"class":254},[240,3971,3972],{"class":374},"player-chat",[240,3974,371],{"class":254},[240,3976,504],{"class":254},[240,3978,380],{"class":368},[240,3980,3981,3984,3986,3988,3990,3992,3995,3997,3999,4001,4003,4005,4007,4009],{"class":242,"line":645},[240,3982,3983],{"class":490},"  handleChat",[240,3985,255],{"class":254},[240,3987,516],{"class":258},[240,3989,262],{"class":254},[240,3991,527],{"class":254},[240,3993,3994],{"class":490}," text",[240,3996,262],{"class":254},[240,3998,266],{"class":265},[240,4000,3860],{"class":254},[240,4002,3314],{"class":258},[240,4004,262],{"class":254},[240,4006,3120],{"class":265},[240,4008,524],{"class":254},[240,4010,407],{"class":254},[240,4012,4013],{"class":242,"line":651},[240,4014,4015],{"class":413},"    \u002F\u002F Handle chat message\n",[240,4017,4018],{"class":242,"line":1304},[240,4019,1301],{"class":254},[240,4021,4022],{"class":242,"line":1309},[240,4023,420],{"class":254},[231,4025,4028],{"className":233,"code":4026,"filename":4027,"language":235,"meta":236,"style":236},"@Message({ event: 'action' })\nhandleAction(data: any, peer: Peer) {\n  console.log('Peer ID:', peer.id);\n  console.log('Namespace:', peer.namespace);\n  console.log('IP:', peer.ip);\n  \n  \u002F\u002F Send message directly to this peer\n  peer.send({\n    event: 'action-response',\n    data: { status: 'received' }\n  });\n}\n","Accessing Peer Information",[208,4029,4030,4055,4069,4098,4127,4156,4160,4165,4179,4195,4218,4227],{"__ignoreMap":236},[240,4031,4032,4034,4036,4038,4040,4042,4044,4046,4049,4051,4053],{"class":242,"line":243},[240,4033,362],{"class":254},[240,4035,482],{"class":250},[240,4037,255],{"class":368},[240,4039,487],{"class":254},[240,4041,491],{"class":490},[240,4043,262],{"class":254},[240,4045,496],{"class":254},[240,4047,4048],{"class":374},"action",[240,4050,371],{"class":254},[240,4052,504],{"class":254},[240,4054,380],{"class":368},[240,4056,4057,4060,4063,4065,4067],{"class":242,"line":383},[240,4058,4059],{"class":250},"handleAction",[240,4061,4062],{"class":368},"(data: any",[240,4064,977],{"class":254},[240,4066,3654],{"class":368},[240,4068,1259],{"class":254},[240,4070,4071,4073,4075,4077,4079,4081,4084,4086,4088,4090,4092,4094,4096],{"class":242,"line":394},[240,4072,3666],{"class":368},[240,4074,1224],{"class":254},[240,4076,3332],{"class":250},[240,4078,255],{"class":490},[240,4080,371],{"class":254},[240,4082,4083],{"class":374},"Peer ID:",[240,4085,371],{"class":254},[240,4087,977],{"class":254},[240,4089,3314],{"class":368},[240,4091,1224],{"class":254},[240,4093,3348],{"class":368},[240,4095,524],{"class":490},[240,4097,1235],{"class":254},[240,4099,4100,4102,4104,4106,4108,4110,4113,4115,4117,4119,4121,4123,4125],{"class":242,"line":410},[240,4101,3666],{"class":368},[240,4103,1224],{"class":254},[240,4105,3332],{"class":250},[240,4107,255],{"class":490},[240,4109,371],{"class":254},[240,4111,4112],{"class":374},"Namespace:",[240,4114,371],{"class":254},[240,4116,977],{"class":254},[240,4118,3314],{"class":368},[240,4120,1224],{"class":254},[240,4122,215],{"class":368},[240,4124,524],{"class":490},[240,4126,1235],{"class":254},[240,4128,4129,4131,4133,4135,4137,4139,4142,4144,4146,4148,4150,4152,4154],{"class":242,"line":417},[240,4130,3666],{"class":368},[240,4132,1224],{"class":254},[240,4134,3332],{"class":250},[240,4136,255],{"class":490},[240,4138,371],{"class":254},[240,4140,4141],{"class":374},"IP:",[240,4143,371],{"class":254},[240,4145,977],{"class":254},[240,4147,3314],{"class":368},[240,4149,1224],{"class":254},[240,4151,2185],{"class":368},[240,4153,524],{"class":490},[240,4155,1235],{"class":254},[240,4157,4158],{"class":242,"line":423},[240,4159,1139],{"class":490},[240,4161,4162],{"class":242,"line":429},[240,4163,4164],{"class":413},"  \u002F\u002F Send message directly to this peer\n",[240,4166,4167,4170,4172,4175,4177],{"class":242,"line":544},[240,4168,4169],{"class":368},"  peer",[240,4171,1224],{"class":254},[240,4173,4174],{"class":250},"send",[240,4176,255],{"class":490},[240,4178,1259],{"class":254},[240,4180,4181,4184,4186,4188,4191,4193],{"class":242,"line":562},[240,4182,4183],{"class":490},"    event",[240,4185,262],{"class":254},[240,4187,496],{"class":254},[240,4189,4190],{"class":374},"action-response",[240,4192,371],{"class":254},[240,4194,3042],{"class":254},[240,4196,4197,4200,4202,4204,4207,4209,4211,4214,4216],{"class":242,"line":571},[240,4198,4199],{"class":490},"    data",[240,4201,262],{"class":254},[240,4203,527],{"class":254},[240,4205,4206],{"class":490}," status",[240,4208,262],{"class":254},[240,4210,496],{"class":254},[240,4212,4213],{"class":374},"received",[240,4215,371],{"class":254},[240,4217,533],{"class":254},[240,4219,4220,4223,4225],{"class":242,"line":583},[240,4221,4222],{"class":254},"  }",[240,4224,524],{"class":490},[240,4226,1235],{"class":254},[240,4228,4229],{"class":242,"line":608},[240,4230,420],{"class":254},[231,4232,4235],{"className":233,"code":4233,"filename":4234,"language":235,"meta":236,"style":236},"@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  \n  @Inject(ChatService)\n  private chatService!: ChatService;\n  \n  @Inject(UserService)\n  private userService!: UserService;\n  \n  @Message({ event: 'send-message' })\n  async handleMessage(data: { text: string; userId: string }, peer: Peer) {\n    \u002F\u002F Use injected services\n    const user = await this.userService.findById(data.userId);\n    await this.chatService.saveMessage({\n      text: data.text,\n      user: user.name,\n      peerId: peer.id\n    });\n  }\n}\n","With Dependency Injection",[208,4236,4237,4253,4261,4271,4275,4284,4298,4302,4310,4322,4326,4350,4391,4396,4426,4445,4460,4476,4490,4498,4502],{"__ignoreMap":236},[240,4238,4239,4241,4243,4245,4247,4249,4251],{"class":242,"line":243},[240,4240,362],{"class":254},[240,4242,365],{"class":250},[240,4244,255],{"class":368},[240,4246,371],{"class":254},[240,4248,375],{"class":374},[240,4250,371],{"class":254},[240,4252,380],{"class":368},[240,4254,4255,4257,4259],{"class":242,"line":383},[240,4256,362],{"class":254},[240,4258,388],{"class":250},[240,4260,391],{"class":368},[240,4262,4263,4265,4267,4269],{"class":242,"line":394},[240,4264,398],{"class":397},[240,4266,401],{"class":246},[240,4268,404],{"class":265},[240,4270,407],{"class":254},[240,4272,4273],{"class":242,"line":410},[240,4274,1139],{"class":368},[240,4276,4277,4279,4281],{"class":242,"line":417},[240,4278,479],{"class":254},[240,4280,1370],{"class":250},[240,4282,4283],{"class":368},"(ChatService)\n",[240,4285,4286,4288,4291,4293,4296],{"class":242,"line":423},[240,4287,1378],{"class":246},[240,4289,4290],{"class":490}," chatService",[240,4292,1384],{"class":254},[240,4294,4295],{"class":265}," ChatService",[240,4297,1235],{"class":254},[240,4299,4300],{"class":242,"line":429},[240,4301,1139],{"class":368},[240,4303,4304,4306,4308],{"class":242,"line":544},[240,4305,479],{"class":254},[240,4307,1370],{"class":250},[240,4309,1697],{"class":368},[240,4311,4312,4314,4316,4318,4320],{"class":242,"line":562},[240,4313,1378],{"class":246},[240,4315,1704],{"class":490},[240,4317,1384],{"class":254},[240,4319,1709],{"class":265},[240,4321,1235],{"class":254},[240,4323,4324],{"class":242,"line":571},[240,4325,1139],{"class":368},[240,4327,4328,4330,4332,4334,4336,4338,4340,4342,4344,4346,4348],{"class":242,"line":583},[240,4329,479],{"class":254},[240,4331,482],{"class":250},[240,4333,255],{"class":368},[240,4335,487],{"class":254},[240,4337,491],{"class":490},[240,4339,262],{"class":254},[240,4341,496],{"class":254},[240,4343,3291],{"class":374},[240,4345,371],{"class":254},[240,4347,504],{"class":254},[240,4349,380],{"class":368},[240,4351,4352,4354,4357,4359,4361,4363,4365,4367,4369,4371,4373,4375,4377,4379,4381,4383,4385,4387,4389],{"class":242,"line":608},[240,4353,1153],{"class":246},[240,4355,4356],{"class":490}," handleMessage",[240,4358,255],{"class":254},[240,4360,516],{"class":258},[240,4362,262],{"class":254},[240,4364,527],{"class":254},[240,4366,3994],{"class":490},[240,4368,262],{"class":254},[240,4370,266],{"class":265},[240,4372,1271],{"class":254},[240,4374,1765],{"class":490},[240,4376,262],{"class":254},[240,4378,266],{"class":265},[240,4380,3860],{"class":254},[240,4382,3314],{"class":258},[240,4384,262],{"class":254},[240,4386,3120],{"class":265},[240,4388,524],{"class":254},[240,4390,407],{"class":254},[240,4392,4393],{"class":242,"line":629},[240,4394,4395],{"class":413},"    \u002F\u002F Use injected services\n",[240,4397,4398,4400,4402,4404,4406,4408,4410,4412,4414,4416,4418,4420,4422,4424],{"class":242,"line":634},[240,4399,1212],{"class":246},[240,4401,1476],{"class":368},[240,4403,1218],{"class":254},[240,4405,1481],{"class":397},[240,4407,1484],{"class":254},[240,4409,1843],{"class":368},[240,4411,1224],{"class":254},[240,4413,1848],{"class":250},[240,4415,255],{"class":490},[240,4417,516],{"class":368},[240,4419,1224],{"class":254},[240,4421,1774],{"class":368},[240,4423,524],{"class":490},[240,4425,1235],{"class":254},[240,4427,4428,4431,4433,4436,4438,4441,4443],{"class":242,"line":639},[240,4429,4430],{"class":397},"    await",[240,4432,1484],{"class":254},[240,4434,4435],{"class":368},"chatService",[240,4437,1224],{"class":254},[240,4439,4440],{"class":250},"saveMessage",[240,4442,255],{"class":490},[240,4444,1259],{"class":254},[240,4446,4447,4450,4452,4454,4456,4458],{"class":242,"line":645},[240,4448,4449],{"class":490},"      text",[240,4451,262],{"class":254},[240,4453,3359],{"class":368},[240,4455,1224],{"class":254},[240,4457,3696],{"class":368},[240,4459,3042],{"class":254},[240,4461,4462,4465,4467,4469,4471,4474],{"class":242,"line":651},[240,4463,4464],{"class":490},"      user",[240,4466,262],{"class":254},[240,4468,1476],{"class":368},[240,4470,1224],{"class":254},[240,4472,4473],{"class":368},"name",[240,4475,3042],{"class":254},[240,4477,4478,4481,4483,4485,4487],{"class":242,"line":1304},[240,4479,4480],{"class":490},"      peerId",[240,4482,262],{"class":254},[240,4484,3314],{"class":368},[240,4486,1224],{"class":254},[240,4488,4489],{"class":368},"id\n",[240,4491,4492,4494,4496],{"class":242,"line":1309},[240,4493,1578],{"class":254},[240,4495,524],{"class":490},[240,4497,1235],{"class":254},[240,4499,4500],{"class":242,"line":1314},[240,4501,1301],{"class":254},[240,4503,4504],{"class":242,"line":1575},[240,4505,420],{"class":254},[231,4507,4510],{"className":233,"code":4508,"filename":4509,"language":235,"meta":236,"style":236},"const UpdateProfileSchema = z.object({\n  userId: z.string().uuid(),\n  profile: z.object({\n    name: z.string().min(2).max(50),\n    email: z.string().email(),\n    age: z.number().int().positive().max(120).optional(),\n    preferences: z.object({\n      theme: z.enum(['light', 'dark']),\n      notifications: z.boolean()\n    }).optional()\n  })\n});\n\n@Message({ \n  event: 'update-profile',\n  validationSchema: UpdateProfileSchema \n})\nasync handleUpdateProfile(\n  data: z.infer\u003Ctypeof UpdateProfileSchema>,\n  peer: Peer\n) {\n  await this.userService.updateProfile(data.userId, data.profile);\n  return { success: true };\n}\n","Complex Validation",[208,4511,4512,4531,4555,4572,4611,4635,4684,4701,4737,4752,4764,4770,4778,4782,4794,4809,4818,4824,4833,4849,4853,4859,4894,4911],{"__ignoreMap":236},[240,4513,4514,4516,4519,4521,4523,4525,4527,4529],{"class":242,"line":243},[240,4515,3439],{"class":246},[240,4517,4518],{"class":368}," UpdateProfileSchema ",[240,4520,2313],{"class":254},[240,4522,3416],{"class":368},[240,4524,1224],{"class":254},[240,4526,3451],{"class":250},[240,4528,255],{"class":368},[240,4530,1259],{"class":254},[240,4532,4533,4536,4538,4540,4542,4544,4546,4548,4551,4553],{"class":242,"line":383},[240,4534,4535],{"class":490},"  userId",[240,4537,262],{"class":254},[240,4539,3416],{"class":368},[240,4541,1224],{"class":254},[240,4543,313],{"class":250},[240,4545,798],{"class":368},[240,4547,1224],{"class":254},[240,4549,4550],{"class":250},"uuid",[240,4552,798],{"class":368},[240,4554,3042],{"class":254},[240,4556,4557,4560,4562,4564,4566,4568,4570],{"class":242,"line":394},[240,4558,4559],{"class":490},"  profile",[240,4561,262],{"class":254},[240,4563,3416],{"class":368},[240,4565,1224],{"class":254},[240,4567,3451],{"class":250},[240,4569,255],{"class":368},[240,4571,1259],{"class":254},[240,4573,4574,4577,4579,4581,4583,4585,4587,4589,4591,4593,4596,4598,4600,4602,4604,4607,4609],{"class":242,"line":410},[240,4575,4576],{"class":490},"    name",[240,4578,262],{"class":254},[240,4580,3416],{"class":368},[240,4582,1224],{"class":254},[240,4584,313],{"class":250},[240,4586,798],{"class":368},[240,4588,1224],{"class":254},[240,4590,3475],{"class":250},[240,4592,255],{"class":368},[240,4594,4595],{"class":3480},"2",[240,4597,524],{"class":368},[240,4599,1224],{"class":254},[240,4601,3488],{"class":250},[240,4603,255],{"class":368},[240,4605,4606],{"class":3480},"50",[240,4608,524],{"class":368},[240,4610,3042],{"class":254},[240,4612,4613,4616,4618,4620,4622,4624,4626,4628,4631,4633],{"class":242,"line":417},[240,4614,4615],{"class":490},"    email",[240,4617,262],{"class":254},[240,4619,3416],{"class":368},[240,4621,1224],{"class":254},[240,4623,313],{"class":250},[240,4625,798],{"class":368},[240,4627,1224],{"class":254},[240,4629,4630],{"class":250},"email",[240,4632,798],{"class":368},[240,4634,3042],{"class":254},[240,4636,4637,4640,4642,4644,4646,4649,4651,4653,4656,4658,4660,4663,4665,4667,4669,4671,4674,4676,4678,4680,4682],{"class":242,"line":423},[240,4638,4639],{"class":490},"    age",[240,4641,262],{"class":254},[240,4643,3416],{"class":368},[240,4645,1224],{"class":254},[240,4647,4648],{"class":250},"number",[240,4650,798],{"class":368},[240,4652,1224],{"class":254},[240,4654,4655],{"class":250},"int",[240,4657,798],{"class":368},[240,4659,1224],{"class":254},[240,4661,4662],{"class":250},"positive",[240,4664,798],{"class":368},[240,4666,1224],{"class":254},[240,4668,3488],{"class":250},[240,4670,255],{"class":368},[240,4672,4673],{"class":3480},"120",[240,4675,524],{"class":368},[240,4677,1224],{"class":254},[240,4679,3556],{"class":250},[240,4681,798],{"class":368},[240,4683,3042],{"class":254},[240,4685,4686,4689,4691,4693,4695,4697,4699],{"class":242,"line":429},[240,4687,4688],{"class":490},"    preferences",[240,4690,262],{"class":254},[240,4692,3416],{"class":368},[240,4694,1224],{"class":254},[240,4696,3451],{"class":250},[240,4698,255],{"class":368},[240,4700,1259],{"class":254},[240,4702,4703,4706,4708,4710,4712,4715,4717,4719,4722,4724,4726,4728,4731,4733,4735],{"class":242,"line":544},[240,4704,4705],{"class":490},"      theme",[240,4707,262],{"class":254},[240,4709,3416],{"class":368},[240,4711,1224],{"class":254},[240,4713,4714],{"class":250},"enum",[240,4716,2002],{"class":368},[240,4718,371],{"class":254},[240,4720,4721],{"class":374},"light",[240,4723,371],{"class":254},[240,4725,977],{"class":254},[240,4727,496],{"class":254},[240,4729,4730],{"class":374},"dark",[240,4732,371],{"class":254},[240,4734,2021],{"class":368},[240,4736,3042],{"class":254},[240,4738,4739,4742,4744,4746,4748,4750],{"class":242,"line":562},[240,4740,4741],{"class":490},"      notifications",[240,4743,262],{"class":254},[240,4745,3416],{"class":368},[240,4747,1224],{"class":254},[240,4749,1202],{"class":250},[240,4751,391],{"class":368},[240,4753,4754,4756,4758,4760,4762],{"class":242,"line":571},[240,4755,1578],{"class":254},[240,4757,524],{"class":368},[240,4759,1224],{"class":254},[240,4761,3556],{"class":250},[240,4763,391],{"class":368},[240,4765,4766,4768],{"class":242,"line":583},[240,4767,4222],{"class":254},[240,4769,380],{"class":368},[240,4771,4772,4774,4776],{"class":242,"line":608},[240,4773,2214],{"class":254},[240,4775,524],{"class":368},[240,4777,1235],{"class":254},[240,4779,4780],{"class":242,"line":629},[240,4781,426],{"emptyLinePlaceholder":56},[240,4783,4784,4786,4788,4790,4792],{"class":242,"line":634},[240,4785,362],{"class":254},[240,4787,482],{"class":250},[240,4789,255],{"class":368},[240,4791,487],{"class":254},[240,4793,2119],{"class":368},[240,4795,4796,4798,4800,4802,4805,4807],{"class":242,"line":639},[240,4797,2940],{"class":490},[240,4799,262],{"class":254},[240,4801,496],{"class":254},[240,4803,4804],{"class":374},"update-profile",[240,4806,371],{"class":254},[240,4808,3042],{"class":254},[240,4810,4811,4813,4815],{"class":242,"line":645},[240,4812,2951],{"class":490},[240,4814,262],{"class":254},[240,4816,4817],{"class":368}," UpdateProfileSchema \n",[240,4819,4820,4822],{"class":242,"line":651},[240,4821,2214],{"class":254},[240,4823,380],{"class":368},[240,4825,4826,4828,4831],{"class":242,"line":1304},[240,4827,2266],{"class":368},[240,4829,4830],{"class":250},"handleUpdateProfile",[240,4832,1159],{"class":368},[240,4834,4835,4838,4840,4842,4844,4847],{"class":242,"line":1309},[240,4836,4837],{"class":368},"  data: z",[240,4839,1224],{"class":254},[240,4841,3587],{"class":368},[240,4843,3590],{"class":254},[240,4845,4846],{"class":368}," UpdateProfileSchema",[240,4848,983],{"class":254},[240,4850,4851],{"class":242,"line":1314},[240,4852,3047],{"class":368},[240,4854,4855,4857],{"class":242,"line":1575},[240,4856,1256],{"class":368},[240,4858,1259],{"class":254},[240,4860,4861,4864,4866,4868,4870,4873,4875,4877,4879,4881,4883,4885,4887,4890,4892],{"class":242,"line":1593},[240,4862,4863],{"class":397},"  await",[240,4865,1484],{"class":254},[240,4867,1843],{"class":368},[240,4869,1224],{"class":254},[240,4871,4872],{"class":250},"updateProfile",[240,4874,255],{"class":490},[240,4876,516],{"class":368},[240,4878,1224],{"class":254},[240,4880,1774],{"class":368},[240,4882,977],{"class":254},[240,4884,3359],{"class":368},[240,4886,1224],{"class":254},[240,4888,4889],{"class":368},"profile",[240,4891,524],{"class":490},[240,4893,1235],{"class":254},[240,4895,4896,4899,4901,4904,4906,4908],{"class":242,"line":1621},[240,4897,4898],{"class":397},"  return",[240,4900,527],{"class":254},[240,4902,4903],{"class":490}," success",[240,4905,262],{"class":254},[240,4907,1291],{"class":1267},[240,4909,4910],{"class":254}," };\n",[240,4912,4913],{"class":242,"line":1630},[240,4914,420],{"class":254},[226,4916,4918],{"id":4917},"validation-error-handling","Validation Error Handling",[204,4920,4921],{},"When validation fails, the message is rejected and error details are logged:",[231,4923,4925],{"className":233,"code":4924,"language":235,"meta":236,"style":236},"\u002F\u002F Client sends invalid data:\nws.send(JSON.stringify({\n  event: 'send-message',\n  data: { text: '' }  \u002F\u002F Too short!\n}));\n\n\u002F\u002F Server logs:\n\u002F\u002F \"Websocket message validation error\"\n\u002F\u002F [{ path: 'text', message: 'String must contain at least 1 character(s)' }]\n",[208,4926,4927,4932,4953,4967,4988,4997,5001,5006,5011],{"__ignoreMap":236},[240,4928,4929],{"class":242,"line":243},[240,4930,4931],{"class":413},"\u002F\u002F Client sends invalid data:\n",[240,4933,4934,4937,4939,4941,4944,4946,4949,4951],{"class":242,"line":383},[240,4935,4936],{"class":368},"ws",[240,4938,1224],{"class":254},[240,4940,4174],{"class":250},[240,4942,4943],{"class":368},"(JSON",[240,4945,1224],{"class":254},[240,4947,4948],{"class":250},"stringify",[240,4950,255],{"class":368},[240,4952,1259],{"class":254},[240,4954,4955,4957,4959,4961,4963,4965],{"class":242,"line":394},[240,4956,2940],{"class":490},[240,4958,262],{"class":254},[240,4960,496],{"class":254},[240,4962,3291],{"class":374},[240,4964,371],{"class":254},[240,4966,3042],{"class":254},[240,4968,4969,4972,4974,4976,4978,4980,4983,4985],{"class":242,"line":410},[240,4970,4971],{"class":490},"  data",[240,4973,262],{"class":254},[240,4975,527],{"class":254},[240,4977,3994],{"class":490},[240,4979,262],{"class":254},[240,4981,4982],{"class":254}," ''",[240,4984,504],{"class":254},[240,4986,4987],{"class":413},"  \u002F\u002F Too short!\n",[240,4989,4990,4992,4995],{"class":242,"line":417},[240,4991,2214],{"class":254},[240,4993,4994],{"class":368},"))",[240,4996,1235],{"class":254},[240,4998,4999],{"class":242,"line":423},[240,5000,426],{"emptyLinePlaceholder":56},[240,5002,5003],{"class":242,"line":429},[240,5004,5005],{"class":413},"\u002F\u002F Server logs:\n",[240,5007,5008],{"class":242,"line":544},[240,5009,5010],{"class":413},"\u002F\u002F \"Websocket message validation error\"\n",[240,5012,5013],{"class":242,"line":562},[240,5014,5015],{"class":413},"\u002F\u002F [{ path: 'text', message: 'String must contain at least 1 character(s)' }]\n",[226,5017,2533],{"id":5018},"common-patterns-1",[350,5020,5021,5275],{},[231,5022,5025],{"className":233,"code":5023,"filename":5024,"language":235,"meta":236,"style":236},"@Namespace('\u002Fgame')\n@Controller()\nexport class GameGateway {\n  private playerStates = new Map\u003Cstring, PlayerState>();\n  \n  @Message({ event: 'player-move' })\n  handleMove(data: { x: number; y: number }, peer: Peer) {\n    \u002F\u002F Update player state\n    const state = this.playerStates.get(peer.id) || this.createInitialState();\n    state.position = { x: data.x, y: data.y };\n    this.playerStates.set(peer.id, state);\n  }\n}\n","Stateful Handler",[208,5026,5027,5043,5051,5061,5090,5094,5118,5156,5161,5200,5240,5267,5271],{"__ignoreMap":236},[240,5028,5029,5031,5033,5035,5037,5039,5041],{"class":242,"line":243},[240,5030,362],{"class":254},[240,5032,365],{"class":250},[240,5034,255],{"class":368},[240,5036,371],{"class":254},[240,5038,3775],{"class":374},[240,5040,371],{"class":254},[240,5042,380],{"class":368},[240,5044,5045,5047,5049],{"class":242,"line":383},[240,5046,362],{"class":254},[240,5048,388],{"class":250},[240,5050,391],{"class":368},[240,5052,5053,5055,5057,5059],{"class":242,"line":394},[240,5054,398],{"class":397},[240,5056,401],{"class":246},[240,5058,3796],{"class":265},[240,5060,407],{"class":254},[240,5062,5063,5065,5068,5070,5072,5075,5077,5079,5081,5084,5086,5088],{"class":242,"line":410},[240,5064,1378],{"class":246},[240,5066,5067],{"class":490}," playerStates",[240,5069,1218],{"class":254},[240,5071,1539],{"class":254},[240,5073,5074],{"class":490}," Map",[240,5076,972],{"class":254},[240,5078,313],{"class":265},[240,5080,977],{"class":254},[240,5082,5083],{"class":265}," PlayerState",[240,5085,1205],{"class":254},[240,5087,798],{"class":368},[240,5089,1235],{"class":254},[240,5091,5092],{"class":242,"line":417},[240,5093,1139],{"class":368},[240,5095,5096,5098,5100,5102,5104,5106,5108,5110,5112,5114,5116],{"class":242,"line":423},[240,5097,479],{"class":254},[240,5099,482],{"class":250},[240,5101,255],{"class":368},[240,5103,487],{"class":254},[240,5105,491],{"class":490},[240,5107,262],{"class":254},[240,5109,496],{"class":254},[240,5111,3821],{"class":374},[240,5113,371],{"class":254},[240,5115,504],{"class":254},[240,5117,380],{"class":368},[240,5119,5120,5122,5124,5126,5128,5130,5132,5134,5136,5138,5140,5142,5144,5146,5148,5150,5152,5154],{"class":242,"line":429},[240,5121,3832],{"class":490},[240,5123,255],{"class":254},[240,5125,516],{"class":258},[240,5127,262],{"class":254},[240,5129,527],{"class":254},[240,5131,3843],{"class":490},[240,5133,262],{"class":254},[240,5135,3848],{"class":265},[240,5137,1271],{"class":254},[240,5139,3853],{"class":490},[240,5141,262],{"class":254},[240,5143,3848],{"class":265},[240,5145,3860],{"class":254},[240,5147,3314],{"class":258},[240,5149,262],{"class":254},[240,5151,3120],{"class":265},[240,5153,524],{"class":254},[240,5155,407],{"class":254},[240,5157,5158],{"class":242,"line":544},[240,5159,5160],{"class":413},"    \u002F\u002F Update player state\n",[240,5162,5163,5165,5168,5170,5172,5175,5177,5179,5181,5183,5185,5187,5189,5191,5193,5196,5198],{"class":242,"line":562},[240,5164,1212],{"class":246},[240,5166,5167],{"class":368}," state",[240,5169,1218],{"class":254},[240,5171,1484],{"class":254},[240,5173,5174],{"class":368},"playerStates",[240,5176,1224],{"class":254},[240,5178,2102],{"class":250},[240,5180,255],{"class":490},[240,5182,3096],{"class":368},[240,5184,1224],{"class":254},[240,5186,3348],{"class":368},[240,5188,1256],{"class":490},[240,5190,2116],{"class":254},[240,5192,1484],{"class":254},[240,5194,5195],{"class":250},"createInitialState",[240,5197,798],{"class":490},[240,5199,1235],{"class":254},[240,5201,5202,5205,5207,5210,5212,5214,5216,5218,5220,5222,5225,5227,5229,5231,5233,5235,5238],{"class":242,"line":571},[240,5203,5204],{"class":368},"    state",[240,5206,1224],{"class":254},[240,5208,5209],{"class":368},"position",[240,5211,1218],{"class":254},[240,5213,527],{"class":254},[240,5215,3843],{"class":490},[240,5217,262],{"class":254},[240,5219,3359],{"class":368},[240,5221,1224],{"class":254},[240,5223,5224],{"class":368},"x",[240,5226,977],{"class":254},[240,5228,3853],{"class":490},[240,5230,262],{"class":254},[240,5232,3359],{"class":368},[240,5234,1224],{"class":254},[240,5236,5237],{"class":368},"y",[240,5239,4910],{"class":254},[240,5241,5242,5244,5246,5248,5251,5253,5255,5257,5259,5261,5263,5265],{"class":242,"line":583},[240,5243,3729],{"class":254},[240,5245,5174],{"class":368},[240,5247,1224],{"class":254},[240,5249,5250],{"class":250},"set",[240,5252,255],{"class":490},[240,5254,3096],{"class":368},[240,5256,1224],{"class":254},[240,5258,3348],{"class":368},[240,5260,977],{"class":254},[240,5262,5167],{"class":368},[240,5264,524],{"class":490},[240,5266,1235],{"class":254},[240,5268,5269],{"class":242,"line":608},[240,5270,1301],{"class":254},[240,5272,5273],{"class":242,"line":629},[240,5274,420],{"class":254},[231,5276,5279],{"className":233,"code":5277,"filename":5278,"language":235,"meta":236,"style":236},"@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","Error Handling",[208,5280,5281,5306,5321,5328,5352,5370,5384,5409,5417,5430,5445,5450,5454],{"__ignoreMap":236},[240,5282,5283,5285,5287,5289,5291,5293,5295,5297,5300,5302,5304],{"class":242,"line":243},[240,5284,362],{"class":254},[240,5286,482],{"class":250},[240,5288,255],{"class":368},[240,5290,487],{"class":254},[240,5292,491],{"class":490},[240,5294,262],{"class":254},[240,5296,496],{"class":254},[240,5298,5299],{"class":374},"risky-operation",[240,5301,371],{"class":254},[240,5303,504],{"class":254},[240,5305,380],{"class":368},[240,5307,5308,5310,5313,5315,5317,5319],{"class":242,"line":383},[240,5309,2266],{"class":368},[240,5311,5312],{"class":250},"handleRiskyOp",[240,5314,4062],{"class":368},[240,5316,977],{"class":254},[240,5318,3654],{"class":368},[240,5320,1259],{"class":254},[240,5322,5323,5326],{"class":242,"line":394},[240,5324,5325],{"class":397},"  try",[240,5327,407],{"class":254},[240,5329,5330,5332,5335,5337,5339,5341,5344,5346,5348,5350],{"class":242,"line":410},[240,5331,1212],{"class":246},[240,5333,5334],{"class":368}," result",[240,5336,1218],{"class":254},[240,5338,1481],{"class":397},[240,5340,1484],{"class":254},[240,5342,5343],{"class":250},"performOperation",[240,5345,255],{"class":490},[240,5347,516],{"class":368},[240,5349,524],{"class":490},[240,5351,1235],{"class":254},[240,5353,5354,5356,5358,5360,5362,5364,5366,5368],{"class":242,"line":417},[240,5355,1288],{"class":397},[240,5357,527],{"class":254},[240,5359,4903],{"class":490},[240,5361,262],{"class":254},[240,5363,1291],{"class":1267},[240,5365,977],{"class":254},[240,5367,5334],{"class":368},[240,5369,4910],{"class":254},[240,5371,5372,5374,5376,5378,5380,5382],{"class":242,"line":423},[240,5373,4222],{"class":254},[240,5375,1581],{"class":397},[240,5377,1248],{"class":490},[240,5379,1586],{"class":368},[240,5381,1256],{"class":490},[240,5383,1259],{"class":254},[240,5385,5386,5388,5390,5392,5394,5396,5399,5401,5403,5405,5407],{"class":242,"line":429},[240,5387,3327],{"class":368},[240,5389,1224],{"class":254},[240,5391,1586],{"class":250},[240,5393,255],{"class":490},[240,5395,371],{"class":254},[240,5397,5398],{"class":374},"Operation failed:",[240,5400,371],{"class":254},[240,5402,977],{"class":254},[240,5404,1614],{"class":368},[240,5406,524],{"class":490},[240,5408,1235],{"class":254},[240,5410,5411,5413,5415],{"class":242,"line":544},[240,5412,1288],{"class":397},[240,5414,527],{"class":254},[240,5416,2119],{"class":490},[240,5418,5419,5422,5424,5426,5428],{"class":242,"line":562},[240,5420,5421],{"class":490},"      success",[240,5423,262],{"class":254},[240,5425,1268],{"class":1267},[240,5427,977],{"class":254},[240,5429,2119],{"class":490},[240,5431,5432,5435,5437,5439,5441,5443],{"class":242,"line":571},[240,5433,5434],{"class":490},"      error",[240,5436,262],{"class":254},[240,5438,1614],{"class":368},[240,5440,1224],{"class":254},[240,5442,499],{"class":368},[240,5444,2119],{"class":490},[240,5446,5447],{"class":242,"line":583},[240,5448,5449],{"class":254},"    };\n",[240,5451,5452],{"class":242,"line":608},[240,5453,1301],{"class":254},[240,5455,5456],{"class":242,"line":629},[240,5457,420],{"class":254},[908,5459],{},[213,5461,5463],{"id":5462},"emit",[208,5464,3215],{},[204,5466,221,5467,5469],{},[208,5468,3215],{}," decorator sends the handler's return value back to the client that sent the message.",[226,5471,229],{"id":5472},"signature-3",[231,5474,5476],{"className":233,"code":5475,"language":235,"meta":236,"style":236},"function Emit(event: string): MethodDecorator\n",[208,5477,5478],{"__ignoreMap":236},[240,5479,5480,5482,5485,5487,5489,5491,5493,5495],{"class":242,"line":243},[240,5481,247],{"class":246},[240,5483,5484],{"class":250}," Emit",[240,5486,255],{"class":254},[240,5488,2994],{"class":258},[240,5490,262],{"class":254},[240,5492,266],{"class":265},[240,5494,269],{"class":254},[240,5496,941],{"class":265},[226,5498,276],{"id":5499},"parameters-3",[278,5501,5502,5514],{},[281,5503,5504],{},[284,5505,5506,5508,5510,5512],{},[287,5507,289],{},[287,5509,292],{},[287,5511,295],{},[287,5513,298],{},[300,5515,5516],{},[284,5517,5518,5522,5526,5528],{},[305,5519,5520],{},[208,5521,2994],{},[305,5523,5524],{},[208,5525,313],{},[305,5527,316],{},[305,5529,5530],{},"The event name for the emitted message",[226,5532,323],{"id":5533},"behavior-3",[325,5535,5536,5539,5542,5548,5551],{},[328,5537,5538],{},"Sends message only to the peer that triggered the handler",[328,5540,5541],{},"Uses the handler's return value as message data",[328,5543,5544,5545],{},"Must be used with ",[208,5546,5547],{},"@Message()",[328,5549,5550],{},"Executes after the handler completes",[328,5552,5553,5554,5556],{},"Automatically wraps data in ",[208,5555,3202],{}," format",[226,5558,22],{"id":5559},"examples-3",[350,5561,5562,5705,5876,6061,6236],{},[231,5563,5566],{"className":233,"code":5564,"filename":5565,"language":235,"meta":236,"style":236},"@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  \n  @Message({ event: 'ping' })\n  @Emit('pong')\n  handlePing() {\n    return { timestamp: Date.now() };\n  }\n}\n\n\u002F\u002F Client sends: { event: 'ping', data: {} }\n\u002F\u002F Client receives: { event: 'pong', data: { timestamp: 1234567890 } }\n","Basic Emit",[208,5567,5568,5584,5592,5602,5606,5631,5649,5658,5683,5687,5691,5695,5700],{"__ignoreMap":236},[240,5569,5570,5572,5574,5576,5578,5580,5582],{"class":242,"line":243},[240,5571,362],{"class":254},[240,5573,365],{"class":250},[240,5575,255],{"class":368},[240,5577,371],{"class":254},[240,5579,375],{"class":374},[240,5581,371],{"class":254},[240,5583,380],{"class":368},[240,5585,5586,5588,5590],{"class":242,"line":383},[240,5587,362],{"class":254},[240,5589,388],{"class":250},[240,5591,391],{"class":368},[240,5593,5594,5596,5598,5600],{"class":242,"line":394},[240,5595,398],{"class":397},[240,5597,401],{"class":246},[240,5599,404],{"class":265},[240,5601,407],{"class":254},[240,5603,5604],{"class":242,"line":410},[240,5605,1139],{"class":368},[240,5607,5608,5610,5612,5614,5616,5618,5620,5622,5625,5627,5629],{"class":242,"line":417},[240,5609,479],{"class":254},[240,5611,482],{"class":250},[240,5613,255],{"class":368},[240,5615,487],{"class":254},[240,5617,491],{"class":490},[240,5619,262],{"class":254},[240,5621,496],{"class":254},[240,5623,5624],{"class":374},"ping",[240,5626,371],{"class":254},[240,5628,504],{"class":254},[240,5630,380],{"class":368},[240,5632,5633,5635,5638,5640,5642,5645,5647],{"class":242,"line":423},[240,5634,479],{"class":254},[240,5636,5637],{"class":250},"Emit",[240,5639,255],{"class":368},[240,5641,371],{"class":254},[240,5643,5644],{"class":374},"pong",[240,5646,371],{"class":254},[240,5648,380],{"class":368},[240,5650,5651,5654,5656],{"class":242,"line":429},[240,5652,5653],{"class":490},"  handlePing",[240,5655,798],{"class":254},[240,5657,407],{"class":254},[240,5659,5660,5662,5664,5667,5669,5672,5674,5677,5680],{"class":242,"line":544},[240,5661,1288],{"class":397},[240,5663,527],{"class":254},[240,5665,5666],{"class":490}," timestamp",[240,5668,262],{"class":254},[240,5670,5671],{"class":368}," Date",[240,5673,1224],{"class":254},[240,5675,5676],{"class":250},"now",[240,5678,5679],{"class":490},"() ",[240,5681,5682],{"class":254},"};\n",[240,5684,5685],{"class":242,"line":562},[240,5686,1301],{"class":254},[240,5688,5689],{"class":242,"line":571},[240,5690,420],{"class":254},[240,5692,5693],{"class":242,"line":583},[240,5694,426],{"emptyLinePlaceholder":56},[240,5696,5697],{"class":242,"line":608},[240,5698,5699],{"class":413},"\u002F\u002F Client sends: { event: 'ping', data: {} }\n",[240,5701,5702],{"class":242,"line":629},[240,5703,5704],{"class":413},"\u002F\u002F Client receives: { event: 'pong', data: { timestamp: 1234567890 } }\n",[231,5706,5709],{"className":233,"code":5707,"filename":5708,"language":235,"meta":236,"style":236},"@Message({ event: 'get-user' })\n@Emit('user-data')\nasync getUserData(data: { userId: string }) {\n  const user = await this.userService.findById(data.userId);\n  return {\n    id: user.id,\n    name: user.name,\n    status: user.status\n  };\n}\n\n\u002F\u002F Client receives: { event: 'user-data', data: { id, name, status } }\n","With Async Handler",[208,5710,5711,5736,5753,5778,5809,5815,5830,5844,5858,5863,5867,5871],{"__ignoreMap":236},[240,5712,5713,5715,5717,5719,5721,5723,5725,5727,5730,5732,5734],{"class":242,"line":243},[240,5714,362],{"class":254},[240,5716,482],{"class":250},[240,5718,255],{"class":368},[240,5720,487],{"class":254},[240,5722,491],{"class":490},[240,5724,262],{"class":254},[240,5726,496],{"class":254},[240,5728,5729],{"class":374},"get-user",[240,5731,371],{"class":254},[240,5733,504],{"class":254},[240,5735,380],{"class":368},[240,5737,5738,5740,5742,5744,5746,5749,5751],{"class":242,"line":383},[240,5739,362],{"class":254},[240,5741,5637],{"class":250},[240,5743,255],{"class":368},[240,5745,371],{"class":254},[240,5747,5748],{"class":374},"user-data",[240,5750,371],{"class":254},[240,5752,380],{"class":368},[240,5754,5755,5757,5760,5763,5765,5767,5769,5772,5774,5776],{"class":242,"line":394},[240,5756,2266],{"class":368},[240,5758,5759],{"class":250},"getUserData",[240,5761,5762],{"class":368},"(data: ",[240,5764,487],{"class":254},[240,5766,1765],{"class":490},[240,5768,262],{"class":254},[240,5770,5771],{"class":368}," string ",[240,5773,2214],{"class":254},[240,5775,1256],{"class":368},[240,5777,1259],{"class":254},[240,5779,5780,5783,5785,5787,5789,5791,5793,5795,5797,5799,5801,5803,5805,5807],{"class":242,"line":410},[240,5781,5782],{"class":246},"  const",[240,5784,1476],{"class":368},[240,5786,1218],{"class":254},[240,5788,1481],{"class":397},[240,5790,1484],{"class":254},[240,5792,1843],{"class":368},[240,5794,1224],{"class":254},[240,5796,1848],{"class":250},[240,5798,255],{"class":490},[240,5800,516],{"class":368},[240,5802,1224],{"class":254},[240,5804,1774],{"class":368},[240,5806,524],{"class":490},[240,5808,1235],{"class":254},[240,5810,5811,5813],{"class":242,"line":417},[240,5812,4898],{"class":397},[240,5814,407],{"class":254},[240,5816,5817,5820,5822,5824,5826,5828],{"class":242,"line":423},[240,5818,5819],{"class":490},"    id",[240,5821,262],{"class":254},[240,5823,1476],{"class":368},[240,5825,1224],{"class":254},[240,5827,3348],{"class":368},[240,5829,3042],{"class":254},[240,5831,5832,5834,5836,5838,5840,5842],{"class":242,"line":429},[240,5833,4576],{"class":490},[240,5835,262],{"class":254},[240,5837,1476],{"class":368},[240,5839,1224],{"class":254},[240,5841,4473],{"class":368},[240,5843,3042],{"class":254},[240,5845,5846,5849,5851,5853,5855],{"class":242,"line":544},[240,5847,5848],{"class":490},"    status",[240,5850,262],{"class":254},[240,5852,1476],{"class":368},[240,5854,1224],{"class":254},[240,5856,5857],{"class":368},"status\n",[240,5859,5860],{"class":242,"line":562},[240,5861,5862],{"class":254},"  };\n",[240,5864,5865],{"class":242,"line":571},[240,5866,420],{"class":254},[240,5868,5869],{"class":242,"line":583},[240,5870,426],{"emptyLinePlaceholder":56},[240,5872,5873],{"class":242,"line":608},[240,5874,5875],{"class":413},"\u002F\u002F Client receives: { event: 'user-data', data: { id, name, status } }\n",[231,5877,5880],{"className":233,"code":5878,"filename":5879,"language":235,"meta":236,"style":236},"\u002F\u002F ❌ You cannot have multiple @Emit decorators\n@Message({ event: 'test' })\n@Emit('response-1')\n@Emit('response-2')\nhandleTest() { ... }\n\n\u002F\u002F ✅ Instead, emit once and let client handle\n@Message({ event: 'test' })\n@Emit('response')\nhandleTest() {\n  return {\n    type: 'multiple',\n    data: [...]\n  };\n}\n","Multiple Emits (Not Supported)",[208,5881,5882,5887,5911,5928,5945,5958,5962,5967,5991,6008,6016,6022,6038,6053,6057],{"__ignoreMap":236},[240,5883,5884],{"class":242,"line":243},[240,5885,5886],{"class":413},"\u002F\u002F ❌ You cannot have multiple @Emit decorators\n",[240,5888,5889,5891,5893,5895,5897,5899,5901,5903,5905,5907,5909],{"class":242,"line":383},[240,5890,362],{"class":254},[240,5892,482],{"class":250},[240,5894,255],{"class":368},[240,5896,487],{"class":254},[240,5898,491],{"class":490},[240,5900,262],{"class":254},[240,5902,496],{"class":254},[240,5904,784],{"class":374},[240,5906,371],{"class":254},[240,5908,504],{"class":254},[240,5910,380],{"class":368},[240,5912,5913,5915,5917,5919,5921,5924,5926],{"class":242,"line":394},[240,5914,362],{"class":254},[240,5916,5637],{"class":250},[240,5918,255],{"class":368},[240,5920,371],{"class":254},[240,5922,5923],{"class":374},"response-1",[240,5925,371],{"class":254},[240,5927,380],{"class":368},[240,5929,5930,5932,5934,5936,5938,5941,5943],{"class":242,"line":410},[240,5931,362],{"class":254},[240,5933,5637],{"class":250},[240,5935,255],{"class":368},[240,5937,371],{"class":254},[240,5939,5940],{"class":374},"response-2",[240,5942,371],{"class":254},[240,5944,380],{"class":368},[240,5946,5947,5950,5952,5954,5956],{"class":242,"line":417},[240,5948,5949],{"class":250},"handleTest",[240,5951,5679],{"class":368},[240,5953,487],{"class":254},[240,5955,530],{"class":254},[240,5957,533],{"class":254},[240,5959,5960],{"class":242,"line":423},[240,5961,426],{"emptyLinePlaceholder":56},[240,5963,5964],{"class":242,"line":429},[240,5965,5966],{"class":413},"\u002F\u002F ✅ Instead, emit once and let client handle\n",[240,5968,5969,5971,5973,5975,5977,5979,5981,5983,5985,5987,5989],{"class":242,"line":544},[240,5970,362],{"class":254},[240,5972,482],{"class":250},[240,5974,255],{"class":368},[240,5976,487],{"class":254},[240,5978,491],{"class":490},[240,5980,262],{"class":254},[240,5982,496],{"class":254},[240,5984,784],{"class":374},[240,5986,371],{"class":254},[240,5988,504],{"class":254},[240,5990,380],{"class":368},[240,5992,5993,5995,5997,5999,6001,6004,6006],{"class":242,"line":562},[240,5994,362],{"class":254},[240,5996,5637],{"class":250},[240,5998,255],{"class":368},[240,6000,371],{"class":254},[240,6002,6003],{"class":374},"response",[240,6005,371],{"class":254},[240,6007,380],{"class":368},[240,6009,6010,6012,6014],{"class":242,"line":571},[240,6011,5949],{"class":250},[240,6013,5679],{"class":368},[240,6015,1259],{"class":254},[240,6017,6018,6020],{"class":242,"line":583},[240,6019,4898],{"class":397},[240,6021,407],{"class":254},[240,6023,6024,6027,6029,6031,6034,6036],{"class":242,"line":608},[240,6025,6026],{"class":490},"    type",[240,6028,262],{"class":254},[240,6030,496],{"class":254},[240,6032,6033],{"class":374},"multiple",[240,6035,371],{"class":254},[240,6037,3042],{"class":254},[240,6039,6040,6042,6044,6047,6050],{"class":242,"line":629},[240,6041,4199],{"class":490},[240,6043,262],{"class":254},[240,6045,6046],{"class":490}," [",[240,6048,6049],{"class":254},"...",[240,6051,6052],{"class":490},"]\n",[240,6054,6055],{"class":242,"line":634},[240,6056,5862],{"class":254},[240,6058,6059],{"class":242,"line":639},[240,6060,420],{"class":254},[231,6062,6065],{"className":233,"code":6063,"filename":6064,"language":235,"meta":236,"style":236},"@Message({ event: 'create-order' })\n@Emit('order-created')\nasync createOrder(data: CreateOrderDto, peer: Peer) {\n  const order = await this.orderService.create(data);\n  \n  \u002F\u002F Return confirmation\n  return {\n    orderId: order.id,\n    status: 'created',\n    timestamp: new Date().toISOString()\n  };\n}\n\n\u002F\u002F Client can await response\n","Acknowledgment Pattern",[208,6066,6067,6092,6109,6125,6154,6158,6163,6169,6184,6199,6219,6223,6227,6231],{"__ignoreMap":236},[240,6068,6069,6071,6073,6075,6077,6079,6081,6083,6086,6088,6090],{"class":242,"line":243},[240,6070,362],{"class":254},[240,6072,482],{"class":250},[240,6074,255],{"class":368},[240,6076,487],{"class":254},[240,6078,491],{"class":490},[240,6080,262],{"class":254},[240,6082,496],{"class":254},[240,6084,6085],{"class":374},"create-order",[240,6087,371],{"class":254},[240,6089,504],{"class":254},[240,6091,380],{"class":368},[240,6093,6094,6096,6098,6100,6102,6105,6107],{"class":242,"line":383},[240,6095,362],{"class":254},[240,6097,5637],{"class":250},[240,6099,255],{"class":368},[240,6101,371],{"class":254},[240,6103,6104],{"class":374},"order-created",[240,6106,371],{"class":254},[240,6108,380],{"class":368},[240,6110,6111,6113,6116,6119,6121,6123],{"class":242,"line":394},[240,6112,2266],{"class":368},[240,6114,6115],{"class":250},"createOrder",[240,6117,6118],{"class":368},"(data: CreateOrderDto",[240,6120,977],{"class":254},[240,6122,3654],{"class":368},[240,6124,1259],{"class":254},[240,6126,6127,6129,6132,6134,6136,6138,6141,6143,6146,6148,6150,6152],{"class":242,"line":410},[240,6128,5782],{"class":246},[240,6130,6131],{"class":368}," order",[240,6133,1218],{"class":254},[240,6135,1481],{"class":397},[240,6137,1484],{"class":254},[240,6139,6140],{"class":368},"orderService",[240,6142,1224],{"class":254},[240,6144,6145],{"class":250},"create",[240,6147,255],{"class":490},[240,6149,516],{"class":368},[240,6151,524],{"class":490},[240,6153,1235],{"class":254},[240,6155,6156],{"class":242,"line":417},[240,6157,1139],{"class":490},[240,6159,6160],{"class":242,"line":423},[240,6161,6162],{"class":413},"  \u002F\u002F Return confirmation\n",[240,6164,6165,6167],{"class":242,"line":429},[240,6166,4898],{"class":397},[240,6168,407],{"class":254},[240,6170,6171,6174,6176,6178,6180,6182],{"class":242,"line":544},[240,6172,6173],{"class":490},"    orderId",[240,6175,262],{"class":254},[240,6177,6131],{"class":368},[240,6179,1224],{"class":254},[240,6181,3348],{"class":368},[240,6183,3042],{"class":254},[240,6185,6186,6188,6190,6192,6195,6197],{"class":242,"line":562},[240,6187,5848],{"class":490},[240,6189,262],{"class":254},[240,6191,496],{"class":254},[240,6193,6194],{"class":374},"created",[240,6196,371],{"class":254},[240,6198,3042],{"class":254},[240,6200,6201,6204,6206,6208,6210,6212,6214,6217],{"class":242,"line":571},[240,6202,6203],{"class":490},"    timestamp",[240,6205,262],{"class":254},[240,6207,1539],{"class":254},[240,6209,5671],{"class":250},[240,6211,798],{"class":490},[240,6213,1224],{"class":254},[240,6215,6216],{"class":250},"toISOString",[240,6218,391],{"class":490},[240,6220,6221],{"class":242,"line":583},[240,6222,5862],{"class":254},[240,6224,6225],{"class":242,"line":608},[240,6226,420],{"class":254},[240,6228,6229],{"class":242,"line":629},[240,6230,426],{"emptyLinePlaceholder":56},[240,6232,6233],{"class":242,"line":634},[240,6234,6235],{"class":413},"\u002F\u002F Client can await response\n",[231,6237,6240],{"className":233,"code":6238,"filename":6239,"language":235,"meta":236,"style":236},"@Message({ event: 'query' })\n@Emit('query-result')\nasync handleQuery(data: { query: string }) {\n  if (data.query === 'users') {\n    return await this.getUsers();\n  } else if (data.query === 'orders') {\n    return await this.getOrders();\n  }\n  \n  return { error: 'Unknown query' };\n}\n","Dynamic Response",[208,6241,6242,6267,6284,6308,6334,6349,6380,6395,6399,6403,6422],{"__ignoreMap":236},[240,6243,6244,6246,6248,6250,6252,6254,6256,6258,6261,6263,6265],{"class":242,"line":243},[240,6245,362],{"class":254},[240,6247,482],{"class":250},[240,6249,255],{"class":368},[240,6251,487],{"class":254},[240,6253,491],{"class":490},[240,6255,262],{"class":254},[240,6257,496],{"class":254},[240,6259,6260],{"class":374},"query",[240,6262,371],{"class":254},[240,6264,504],{"class":254},[240,6266,380],{"class":368},[240,6268,6269,6271,6273,6275,6277,6280,6282],{"class":242,"line":383},[240,6270,362],{"class":254},[240,6272,5637],{"class":250},[240,6274,255],{"class":368},[240,6276,371],{"class":254},[240,6278,6279],{"class":374},"query-result",[240,6281,371],{"class":254},[240,6283,380],{"class":368},[240,6285,6286,6288,6291,6293,6295,6298,6300,6302,6304,6306],{"class":242,"line":394},[240,6287,2266],{"class":368},[240,6289,6290],{"class":250},"handleQuery",[240,6292,5762],{"class":368},[240,6294,487],{"class":254},[240,6296,6297],{"class":490}," query",[240,6299,262],{"class":254},[240,6301,5771],{"class":368},[240,6303,2214],{"class":254},[240,6305,1256],{"class":368},[240,6307,1259],{"class":254},[240,6309,6310,6312,6314,6316,6318,6320,6323,6325,6328,6330,6332],{"class":242,"line":410},[240,6311,2372],{"class":397},[240,6313,1248],{"class":490},[240,6315,516],{"class":368},[240,6317,1224],{"class":254},[240,6319,6260],{"class":368},[240,6321,6322],{"class":254}," ===",[240,6324,496],{"class":254},[240,6326,6327],{"class":374},"users",[240,6329,371],{"class":254},[240,6331,1256],{"class":490},[240,6333,1259],{"class":254},[240,6335,6336,6338,6340,6342,6345,6347],{"class":242,"line":417},[240,6337,1288],{"class":397},[240,6339,1481],{"class":397},[240,6341,1484],{"class":254},[240,6343,6344],{"class":250},"getUsers",[240,6346,798],{"class":490},[240,6348,1235],{"class":254},[240,6350,6351,6353,6356,6359,6361,6363,6365,6367,6369,6371,6374,6376,6378],{"class":242,"line":423},[240,6352,4222],{"class":254},[240,6354,6355],{"class":397}," else",[240,6357,6358],{"class":397}," if",[240,6360,1248],{"class":490},[240,6362,516],{"class":368},[240,6364,1224],{"class":254},[240,6366,6260],{"class":368},[240,6368,6322],{"class":254},[240,6370,496],{"class":254},[240,6372,6373],{"class":374},"orders",[240,6375,371],{"class":254},[240,6377,1256],{"class":490},[240,6379,1259],{"class":254},[240,6381,6382,6384,6386,6388,6391,6393],{"class":242,"line":429},[240,6383,1288],{"class":397},[240,6385,1481],{"class":397},[240,6387,1484],{"class":254},[240,6389,6390],{"class":250},"getOrders",[240,6392,798],{"class":490},[240,6394,1235],{"class":254},[240,6396,6397],{"class":242,"line":544},[240,6398,1301],{"class":254},[240,6400,6401],{"class":242,"line":562},[240,6402,1139],{"class":490},[240,6404,6405,6407,6409,6411,6413,6415,6418,6420],{"class":242,"line":571},[240,6406,4898],{"class":397},[240,6408,527],{"class":254},[240,6410,1614],{"class":490},[240,6412,262],{"class":254},[240,6414,496],{"class":254},[240,6416,6417],{"class":374},"Unknown query",[240,6419,371],{"class":254},[240,6421,4910],{"class":254},[240,6423,6424],{"class":242,"line":583},[240,6425,420],{"class":254},[226,6427,6429],{"id":6428},"return-value-requirements","Return Value Requirements",[204,6431,6432],{},"The handler must return a value (or Promise that resolves to a value):",[231,6434,6436],{"className":233,"code":6435,"language":235,"meta":236,"style":236},"\u002F\u002F ✅ Good - Returns value\n@Message({ event: 'test' })\n@Emit('result')\nhandleTest() {\n  return { foo: 'bar' };\n}\n\n\u002F\u002F ✅ Good - Async return\n@Message({ event: 'test' })\n@Emit('result')\nasync handleTest() {\n  const data = await this.fetchData();\n  return data;\n}\n\n\u002F\u002F ⚠️ Warning - Returns void\n@Message({ event: 'test' })\n@Emit('result')\nhandleTest() {\n  \u002F\u002F No return - client receives empty data\n}\n",[208,6437,6438,6443,6467,6484,6492,6512,6516,6520,6525,6549,6565,6575,6594,6602,6606,6610,6615,6639,6655,6663,6668],{"__ignoreMap":236},[240,6439,6440],{"class":242,"line":243},[240,6441,6442],{"class":413},"\u002F\u002F ✅ Good - Returns value\n",[240,6444,6445,6447,6449,6451,6453,6455,6457,6459,6461,6463,6465],{"class":242,"line":383},[240,6446,362],{"class":254},[240,6448,482],{"class":250},[240,6450,255],{"class":368},[240,6452,487],{"class":254},[240,6454,491],{"class":490},[240,6456,262],{"class":254},[240,6458,496],{"class":254},[240,6460,784],{"class":374},[240,6462,371],{"class":254},[240,6464,504],{"class":254},[240,6466,380],{"class":368},[240,6468,6469,6471,6473,6475,6477,6480,6482],{"class":242,"line":394},[240,6470,362],{"class":254},[240,6472,5637],{"class":250},[240,6474,255],{"class":368},[240,6476,371],{"class":254},[240,6478,6479],{"class":374},"result",[240,6481,371],{"class":254},[240,6483,380],{"class":368},[240,6485,6486,6488,6490],{"class":242,"line":410},[240,6487,5949],{"class":250},[240,6489,5679],{"class":368},[240,6491,1259],{"class":254},[240,6493,6494,6496,6498,6501,6503,6505,6508,6510],{"class":242,"line":417},[240,6495,4898],{"class":397},[240,6497,527],{"class":254},[240,6499,6500],{"class":490}," foo",[240,6502,262],{"class":254},[240,6504,496],{"class":254},[240,6506,6507],{"class":374},"bar",[240,6509,371],{"class":254},[240,6511,4910],{"class":254},[240,6513,6514],{"class":242,"line":423},[240,6515,420],{"class":254},[240,6517,6518],{"class":242,"line":429},[240,6519,426],{"emptyLinePlaceholder":56},[240,6521,6522],{"class":242,"line":544},[240,6523,6524],{"class":413},"\u002F\u002F ✅ Good - Async return\n",[240,6526,6527,6529,6531,6533,6535,6537,6539,6541,6543,6545,6547],{"class":242,"line":562},[240,6528,362],{"class":254},[240,6530,482],{"class":250},[240,6532,255],{"class":368},[240,6534,487],{"class":254},[240,6536,491],{"class":490},[240,6538,262],{"class":254},[240,6540,496],{"class":254},[240,6542,784],{"class":374},[240,6544,371],{"class":254},[240,6546,504],{"class":254},[240,6548,380],{"class":368},[240,6550,6551,6553,6555,6557,6559,6561,6563],{"class":242,"line":571},[240,6552,362],{"class":254},[240,6554,5637],{"class":250},[240,6556,255],{"class":368},[240,6558,371],{"class":254},[240,6560,6479],{"class":374},[240,6562,371],{"class":254},[240,6564,380],{"class":368},[240,6566,6567,6569,6571,6573],{"class":242,"line":583},[240,6568,2266],{"class":368},[240,6570,5949],{"class":250},[240,6572,5679],{"class":368},[240,6574,1259],{"class":254},[240,6576,6577,6579,6581,6583,6585,6587,6590,6592],{"class":242,"line":608},[240,6578,5782],{"class":246},[240,6580,3359],{"class":368},[240,6582,1218],{"class":254},[240,6584,1481],{"class":397},[240,6586,1484],{"class":254},[240,6588,6589],{"class":250},"fetchData",[240,6591,798],{"class":490},[240,6593,1235],{"class":254},[240,6595,6596,6598,6600],{"class":242,"line":629},[240,6597,4898],{"class":397},[240,6599,3359],{"class":368},[240,6601,1235],{"class":254},[240,6603,6604],{"class":242,"line":634},[240,6605,420],{"class":254},[240,6607,6608],{"class":242,"line":639},[240,6609,426],{"emptyLinePlaceholder":56},[240,6611,6612],{"class":242,"line":645},[240,6613,6614],{"class":413},"\u002F\u002F ⚠️ Warning - Returns void\n",[240,6616,6617,6619,6621,6623,6625,6627,6629,6631,6633,6635,6637],{"class":242,"line":651},[240,6618,362],{"class":254},[240,6620,482],{"class":250},[240,6622,255],{"class":368},[240,6624,487],{"class":254},[240,6626,491],{"class":490},[240,6628,262],{"class":254},[240,6630,496],{"class":254},[240,6632,784],{"class":374},[240,6634,371],{"class":254},[240,6636,504],{"class":254},[240,6638,380],{"class":368},[240,6640,6641,6643,6645,6647,6649,6651,6653],{"class":242,"line":1304},[240,6642,362],{"class":254},[240,6644,5637],{"class":250},[240,6646,255],{"class":368},[240,6648,371],{"class":254},[240,6650,6479],{"class":374},[240,6652,371],{"class":254},[240,6654,380],{"class":368},[240,6656,6657,6659,6661],{"class":242,"line":1309},[240,6658,5949],{"class":250},[240,6660,5679],{"class":368},[240,6662,1259],{"class":254},[240,6664,6665],{"class":242,"line":1314},[240,6666,6667],{"class":413},"  \u002F\u002F No return - client receives empty data\n",[240,6669,6670],{"class":242,"line":1575},[240,6671,420],{"class":254},[908,6673],{},[213,6675,6677],{"id":6676},"broadcast",[208,6678,3219],{},[204,6680,221,6681,6683,6684,6688],{},[208,6682,3219],{}," decorator sends the handler's return value to all connected peers in the namespace, ",[6685,6686,6687],"strong",{},"including"," the sender.",[226,6690,229],{"id":6691},"signature-4",[231,6693,6695],{"className":233,"code":6694,"language":235,"meta":236,"style":236},"function Broadcast(event: string): MethodDecorator\n",[208,6696,6697],{"__ignoreMap":236},[240,6698,6699,6701,6704,6706,6708,6710,6712,6714],{"class":242,"line":243},[240,6700,247],{"class":246},[240,6702,6703],{"class":250}," Broadcast",[240,6705,255],{"class":254},[240,6707,2994],{"class":258},[240,6709,262],{"class":254},[240,6711,266],{"class":265},[240,6713,269],{"class":254},[240,6715,941],{"class":265},[226,6717,276],{"id":6718},"parameters-4",[278,6720,6721,6733],{},[281,6722,6723],{},[284,6724,6725,6727,6729,6731],{},[287,6726,289],{},[287,6728,292],{},[287,6730,295],{},[287,6732,298],{},[300,6734,6735],{},[284,6736,6737,6741,6745,6747],{},[305,6738,6739],{},[208,6740,2994],{},[305,6742,6743],{},[208,6744,313],{},[305,6746,316],{},[305,6748,6749],{},"The event name for the broadcasted message",[226,6751,323],{"id":6752},"behavior-4",[325,6754,6755,6758,6761,6763,6767],{},[328,6756,6757],{},"Sends message to ALL peers in the namespace",[328,6759,6760],{},"Includes the peer that triggered the handler",[328,6762,5541],{},[328,6764,5544,6765],{},[208,6766,5547],{},[328,6768,6769],{},"All peers receive the same message simultaneously",[226,6771,22],{"id":6772},"examples-4",[350,6774,6775,6983,7140,7358,7567],{},[231,6776,6779],{"className":233,"code":6777,"filename":6778,"language":235,"meta":236,"style":236},"@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  \n  @Message({ event: 'user-message' })\n  @Broadcast('new-message')\n  handleMessage(data: { text: string; user: string }) {\n    return {\n      text: data.text,\n      user: data.user,\n      timestamp: Date.now()\n    };\n  }\n}\n\n\u002F\u002F When user A sends a message:\n\u002F\u002F - User A receives it\n\u002F\u002F - User B receives it\n\u002F\u002F - User C receives it\n\u002F\u002F ... all users receive the same message\n","Basic Broadcast",[208,6780,6781,6797,6805,6815,6819,6844,6862,6893,6899,6913,6927,6942,6946,6950,6954,6958,6963,6968,6973,6978],{"__ignoreMap":236},[240,6782,6783,6785,6787,6789,6791,6793,6795],{"class":242,"line":243},[240,6784,362],{"class":254},[240,6786,365],{"class":250},[240,6788,255],{"class":368},[240,6790,371],{"class":254},[240,6792,375],{"class":374},[240,6794,371],{"class":254},[240,6796,380],{"class":368},[240,6798,6799,6801,6803],{"class":242,"line":383},[240,6800,362],{"class":254},[240,6802,388],{"class":250},[240,6804,391],{"class":368},[240,6806,6807,6809,6811,6813],{"class":242,"line":394},[240,6808,398],{"class":397},[240,6810,401],{"class":246},[240,6812,404],{"class":265},[240,6814,407],{"class":254},[240,6816,6817],{"class":242,"line":410},[240,6818,1139],{"class":368},[240,6820,6821,6823,6825,6827,6829,6831,6833,6835,6838,6840,6842],{"class":242,"line":417},[240,6822,479],{"class":254},[240,6824,482],{"class":250},[240,6826,255],{"class":368},[240,6828,487],{"class":254},[240,6830,491],{"class":490},[240,6832,262],{"class":254},[240,6834,496],{"class":254},[240,6836,6837],{"class":374},"user-message",[240,6839,371],{"class":254},[240,6841,504],{"class":254},[240,6843,380],{"class":368},[240,6845,6846,6848,6851,6853,6855,6858,6860],{"class":242,"line":423},[240,6847,479],{"class":254},[240,6849,6850],{"class":250},"Broadcast",[240,6852,255],{"class":368},[240,6854,371],{"class":254},[240,6856,6857],{"class":374},"new-message",[240,6859,371],{"class":254},[240,6861,380],{"class":368},[240,6863,6864,6866,6868,6870,6872,6874,6876,6878,6880,6882,6884,6886,6888,6891],{"class":242,"line":429},[240,6865,511],{"class":490},[240,6867,255],{"class":254},[240,6869,516],{"class":258},[240,6871,262],{"class":254},[240,6873,527],{"class":254},[240,6875,3994],{"class":490},[240,6877,262],{"class":254},[240,6879,266],{"class":265},[240,6881,1271],{"class":254},[240,6883,1476],{"class":490},[240,6885,262],{"class":254},[240,6887,266],{"class":265},[240,6889,6890],{"class":254}," })",[240,6892,407],{"class":254},[240,6894,6895,6897],{"class":242,"line":544},[240,6896,1288],{"class":397},[240,6898,407],{"class":254},[240,6900,6901,6903,6905,6907,6909,6911],{"class":242,"line":562},[240,6902,4449],{"class":490},[240,6904,262],{"class":254},[240,6906,3359],{"class":368},[240,6908,1224],{"class":254},[240,6910,3696],{"class":368},[240,6912,3042],{"class":254},[240,6914,6915,6917,6919,6921,6923,6925],{"class":242,"line":571},[240,6916,4464],{"class":490},[240,6918,262],{"class":254},[240,6920,3359],{"class":368},[240,6922,1224],{"class":254},[240,6924,1522],{"class":368},[240,6926,3042],{"class":254},[240,6928,6929,6932,6934,6936,6938,6940],{"class":242,"line":583},[240,6930,6931],{"class":490},"      timestamp",[240,6933,262],{"class":254},[240,6935,5671],{"class":368},[240,6937,1224],{"class":254},[240,6939,5676],{"class":250},[240,6941,391],{"class":490},[240,6943,6944],{"class":242,"line":608},[240,6945,5449],{"class":254},[240,6947,6948],{"class":242,"line":629},[240,6949,1301],{"class":254},[240,6951,6952],{"class":242,"line":634},[240,6953,420],{"class":254},[240,6955,6956],{"class":242,"line":639},[240,6957,426],{"emptyLinePlaceholder":56},[240,6959,6960],{"class":242,"line":645},[240,6961,6962],{"class":413},"\u002F\u002F When user A sends a message:\n",[240,6964,6965],{"class":242,"line":651},[240,6966,6967],{"class":413},"\u002F\u002F - User A receives it\n",[240,6969,6970],{"class":242,"line":1304},[240,6971,6972],{"class":413},"\u002F\u002F - User B receives it\n",[240,6974,6975],{"class":242,"line":1309},[240,6976,6977],{"class":413},"\u002F\u002F - User C receives it\n",[240,6979,6980],{"class":242,"line":1314},[240,6981,6982],{"class":413},"\u002F\u002F ... all users receive the same message\n",[231,6984,6987],{"className":233,"code":6985,"filename":6986,"language":235,"meta":236,"style":236},"@Message({ event: 'user-joined' })\n@Broadcast('user-status')\nhandleUserJoined(data: { username: string; userId: string }) {\n  return {\n    type: 'joined',\n    username: data.username,\n    userId: data.userId,\n    timestamp: new Date().toISOString()\n  };\n}\n\n\u002F\u002F All users see when someone joins\n","User Status Updates",[208,6988,6989,7014,7031,7054,7060,7075,7090,7105,7123,7127,7131,7135],{"__ignoreMap":236},[240,6990,6991,6993,6995,6997,6999,7001,7003,7005,7008,7010,7012],{"class":242,"line":243},[240,6992,362],{"class":254},[240,6994,482],{"class":250},[240,6996,255],{"class":368},[240,6998,487],{"class":254},[240,7000,491],{"class":490},[240,7002,262],{"class":254},[240,7004,496],{"class":254},[240,7006,7007],{"class":374},"user-joined",[240,7009,371],{"class":254},[240,7011,504],{"class":254},[240,7013,380],{"class":368},[240,7015,7016,7018,7020,7022,7024,7027,7029],{"class":242,"line":383},[240,7017,362],{"class":254},[240,7019,6850],{"class":250},[240,7021,255],{"class":368},[240,7023,371],{"class":254},[240,7025,7026],{"class":374},"user-status",[240,7028,371],{"class":254},[240,7030,380],{"class":368},[240,7032,7033,7036,7038,7040,7043,7045,7048,7050,7052],{"class":242,"line":394},[240,7034,7035],{"class":250},"handleUserJoined",[240,7037,5762],{"class":368},[240,7039,487],{"class":254},[240,7041,7042],{"class":490}," username",[240,7044,262],{"class":254},[240,7046,7047],{"class":368}," string; userId: string ",[240,7049,2214],{"class":254},[240,7051,1256],{"class":368},[240,7053,1259],{"class":254},[240,7055,7056,7058],{"class":242,"line":410},[240,7057,4898],{"class":397},[240,7059,407],{"class":254},[240,7061,7062,7064,7066,7068,7071,7073],{"class":242,"line":417},[240,7063,6026],{"class":490},[240,7065,262],{"class":254},[240,7067,496],{"class":254},[240,7069,7070],{"class":374},"joined",[240,7072,371],{"class":254},[240,7074,3042],{"class":254},[240,7076,7077,7080,7082,7084,7086,7088],{"class":242,"line":423},[240,7078,7079],{"class":490},"    username",[240,7081,262],{"class":254},[240,7083,3359],{"class":368},[240,7085,1224],{"class":254},[240,7087,3682],{"class":368},[240,7089,3042],{"class":254},[240,7091,7092,7095,7097,7099,7101,7103],{"class":242,"line":429},[240,7093,7094],{"class":490},"    userId",[240,7096,262],{"class":254},[240,7098,3359],{"class":368},[240,7100,1224],{"class":254},[240,7102,1774],{"class":368},[240,7104,3042],{"class":254},[240,7106,7107,7109,7111,7113,7115,7117,7119,7121],{"class":242,"line":544},[240,7108,6203],{"class":490},[240,7110,262],{"class":254},[240,7112,1539],{"class":254},[240,7114,5671],{"class":250},[240,7116,798],{"class":490},[240,7118,1224],{"class":254},[240,7120,6216],{"class":250},[240,7122,391],{"class":490},[240,7124,7125],{"class":242,"line":562},[240,7126,5862],{"class":254},[240,7128,7129],{"class":242,"line":571},[240,7130,420],{"class":254},[240,7132,7133],{"class":242,"line":583},[240,7134,426],{"emptyLinePlaceholder":56},[240,7136,7137],{"class":242,"line":608},[240,7138,7139],{"class":413},"\u002F\u002F All users see when someone joins\n",[231,7141,7144],{"className":233,"code":7142,"filename":7143,"language":235,"meta":236,"style":236},"@Namespace('\u002Fgame')\n@Controller()\nexport class GameGateway {\n  \n  @Message({ event: 'player-action' })\n  @Broadcast('game-update')\n  handleAction(data: { action: string; playerId: string }) {\n    \u002F\u002F Update game state\n    const newState = this.gameEngine.processAction(data);\n    \n    \u002F\u002F Broadcast new state to all players\n    return {\n      state: newState,\n      lastAction: data.action,\n      timestamp: Date.now()\n    };\n  }\n}\n","Game State Updates",[208,7145,7146,7162,7170,7180,7184,7209,7226,7259,7264,7291,7295,7300,7306,7317,7332,7346,7350,7354],{"__ignoreMap":236},[240,7147,7148,7150,7152,7154,7156,7158,7160],{"class":242,"line":243},[240,7149,362],{"class":254},[240,7151,365],{"class":250},[240,7153,255],{"class":368},[240,7155,371],{"class":254},[240,7157,3775],{"class":374},[240,7159,371],{"class":254},[240,7161,380],{"class":368},[240,7163,7164,7166,7168],{"class":242,"line":383},[240,7165,362],{"class":254},[240,7167,388],{"class":250},[240,7169,391],{"class":368},[240,7171,7172,7174,7176,7178],{"class":242,"line":394},[240,7173,398],{"class":397},[240,7175,401],{"class":246},[240,7177,3796],{"class":265},[240,7179,407],{"class":254},[240,7181,7182],{"class":242,"line":410},[240,7183,1139],{"class":368},[240,7185,7186,7188,7190,7192,7194,7196,7198,7200,7203,7205,7207],{"class":242,"line":417},[240,7187,479],{"class":254},[240,7189,482],{"class":250},[240,7191,255],{"class":368},[240,7193,487],{"class":254},[240,7195,491],{"class":490},[240,7197,262],{"class":254},[240,7199,496],{"class":254},[240,7201,7202],{"class":374},"player-action",[240,7204,371],{"class":254},[240,7206,504],{"class":254},[240,7208,380],{"class":368},[240,7210,7211,7213,7215,7217,7219,7222,7224],{"class":242,"line":423},[240,7212,479],{"class":254},[240,7214,6850],{"class":250},[240,7216,255],{"class":368},[240,7218,371],{"class":254},[240,7220,7221],{"class":374},"game-update",[240,7223,371],{"class":254},[240,7225,380],{"class":368},[240,7227,7228,7231,7233,7235,7237,7239,7242,7244,7246,7248,7251,7253,7255,7257],{"class":242,"line":429},[240,7229,7230],{"class":490},"  handleAction",[240,7232,255],{"class":254},[240,7234,516],{"class":258},[240,7236,262],{"class":254},[240,7238,527],{"class":254},[240,7240,7241],{"class":490}," action",[240,7243,262],{"class":254},[240,7245,266],{"class":265},[240,7247,1271],{"class":254},[240,7249,7250],{"class":490}," playerId",[240,7252,262],{"class":254},[240,7254,266],{"class":265},[240,7256,6890],{"class":254},[240,7258,407],{"class":254},[240,7260,7261],{"class":242,"line":544},[240,7262,7263],{"class":413},"    \u002F\u002F Update game state\n",[240,7265,7266,7268,7271,7273,7275,7278,7280,7283,7285,7287,7289],{"class":242,"line":562},[240,7267,1212],{"class":246},[240,7269,7270],{"class":368}," newState",[240,7272,1218],{"class":254},[240,7274,1484],{"class":254},[240,7276,7277],{"class":368},"gameEngine",[240,7279,1224],{"class":254},[240,7281,7282],{"class":250},"processAction",[240,7284,255],{"class":490},[240,7286,516],{"class":368},[240,7288,524],{"class":490},[240,7290,1235],{"class":254},[240,7292,7293],{"class":242,"line":571},[240,7294,1240],{"class":490},[240,7296,7297],{"class":242,"line":583},[240,7298,7299],{"class":413},"    \u002F\u002F Broadcast new state to all players\n",[240,7301,7302,7304],{"class":242,"line":608},[240,7303,1288],{"class":397},[240,7305,407],{"class":254},[240,7307,7308,7311,7313,7315],{"class":242,"line":629},[240,7309,7310],{"class":490},"      state",[240,7312,262],{"class":254},[240,7314,7270],{"class":368},[240,7316,3042],{"class":254},[240,7318,7319,7322,7324,7326,7328,7330],{"class":242,"line":634},[240,7320,7321],{"class":490},"      lastAction",[240,7323,262],{"class":254},[240,7325,3359],{"class":368},[240,7327,1224],{"class":254},[240,7329,4048],{"class":368},[240,7331,3042],{"class":254},[240,7333,7334,7336,7338,7340,7342,7344],{"class":242,"line":639},[240,7335,6931],{"class":490},[240,7337,262],{"class":254},[240,7339,5671],{"class":368},[240,7341,1224],{"class":254},[240,7343,5676],{"class":250},[240,7345,391],{"class":490},[240,7347,7348],{"class":242,"line":645},[240,7349,5449],{"class":254},[240,7351,7352],{"class":242,"line":651},[240,7353,1301],{"class":254},[240,7355,7356],{"class":242,"line":1304},[240,7357,420],{"class":254},[231,7359,7362],{"className":233,"code":7360,"filename":7361,"language":235,"meta":236,"style":236},"@Namespace('\u002Fnotifications')\n@Controller()\nexport class NotificationGateway {\n  \n  @Message({ event: 'system-alert' })\n  @Broadcast('alert')\n  handleSystemAlert(data: { message: string; severity: string }) {\n    return {\n      type: 'system',\n      message: data.message,\n      severity: data.severity,\n      timestamp: Date.now()\n    };\n  }\n}\n\n\u002F\u002F All connected clients receive the alert\n","Live Notifications",[208,7363,7364,7381,7389,7400,7404,7429,7446,7479,7485,7501,7516,7532,7546,7550,7554,7558,7562],{"__ignoreMap":236},[240,7365,7366,7368,7370,7372,7374,7377,7379],{"class":242,"line":243},[240,7367,362],{"class":254},[240,7369,365],{"class":250},[240,7371,255],{"class":368},[240,7373,371],{"class":254},[240,7375,7376],{"class":374},"\u002Fnotifications",[240,7378,371],{"class":254},[240,7380,380],{"class":368},[240,7382,7383,7385,7387],{"class":242,"line":383},[240,7384,362],{"class":254},[240,7386,388],{"class":250},[240,7388,391],{"class":368},[240,7390,7391,7393,7395,7398],{"class":242,"line":394},[240,7392,398],{"class":397},[240,7394,401],{"class":246},[240,7396,7397],{"class":265}," NotificationGateway",[240,7399,407],{"class":254},[240,7401,7402],{"class":242,"line":410},[240,7403,1139],{"class":368},[240,7405,7406,7408,7410,7412,7414,7416,7418,7420,7423,7425,7427],{"class":242,"line":417},[240,7407,479],{"class":254},[240,7409,482],{"class":250},[240,7411,255],{"class":368},[240,7413,487],{"class":254},[240,7415,491],{"class":490},[240,7417,262],{"class":254},[240,7419,496],{"class":254},[240,7421,7422],{"class":374},"system-alert",[240,7424,371],{"class":254},[240,7426,504],{"class":254},[240,7428,380],{"class":368},[240,7430,7431,7433,7435,7437,7439,7442,7444],{"class":242,"line":423},[240,7432,479],{"class":254},[240,7434,6850],{"class":250},[240,7436,255],{"class":368},[240,7438,371],{"class":254},[240,7440,7441],{"class":374},"alert",[240,7443,371],{"class":254},[240,7445,380],{"class":368},[240,7447,7448,7451,7453,7455,7457,7459,7462,7464,7466,7468,7471,7473,7475,7477],{"class":242,"line":429},[240,7449,7450],{"class":490},"  handleSystemAlert",[240,7452,255],{"class":254},[240,7454,516],{"class":258},[240,7456,262],{"class":254},[240,7458,527],{"class":254},[240,7460,7461],{"class":490}," message",[240,7463,262],{"class":254},[240,7465,266],{"class":265},[240,7467,1271],{"class":254},[240,7469,7470],{"class":490}," severity",[240,7472,262],{"class":254},[240,7474,266],{"class":265},[240,7476,6890],{"class":254},[240,7478,407],{"class":254},[240,7480,7481,7483],{"class":242,"line":544},[240,7482,1288],{"class":397},[240,7484,407],{"class":254},[240,7486,7487,7490,7492,7494,7497,7499],{"class":242,"line":562},[240,7488,7489],{"class":490},"      type",[240,7491,262],{"class":254},[240,7493,496],{"class":254},[240,7495,7496],{"class":374},"system",[240,7498,371],{"class":254},[240,7500,3042],{"class":254},[240,7502,7503,7506,7508,7510,7512,7514],{"class":242,"line":571},[240,7504,7505],{"class":490},"      message",[240,7507,262],{"class":254},[240,7509,3359],{"class":368},[240,7511,1224],{"class":254},[240,7513,499],{"class":368},[240,7515,3042],{"class":254},[240,7517,7518,7521,7523,7525,7527,7530],{"class":242,"line":583},[240,7519,7520],{"class":490},"      severity",[240,7522,262],{"class":254},[240,7524,3359],{"class":368},[240,7526,1224],{"class":254},[240,7528,7529],{"class":368},"severity",[240,7531,3042],{"class":254},[240,7533,7534,7536,7538,7540,7542,7544],{"class":242,"line":608},[240,7535,6931],{"class":490},[240,7537,262],{"class":254},[240,7539,5671],{"class":368},[240,7541,1224],{"class":254},[240,7543,5676],{"class":250},[240,7545,391],{"class":490},[240,7547,7548],{"class":242,"line":629},[240,7549,5449],{"class":254},[240,7551,7552],{"class":242,"line":634},[240,7553,1301],{"class":254},[240,7555,7556],{"class":242,"line":639},[240,7557,420],{"class":254},[240,7559,7560],{"class":242,"line":645},[240,7561,426],{"emptyLinePlaceholder":56},[240,7563,7564],{"class":242,"line":651},[240,7565,7566],{"class":413},"\u002F\u002F All connected clients receive the alert\n",[231,7568,7571],{"className":233,"code":7569,"filename":7570,"language":235,"meta":236,"style":236},"@Message({ event: 'document-change' })\n@Broadcast('document-updated')\nhandleDocumentChange(data: { \n  documentId: string;\n  changes: any[];\n  userId: string;\n}) {\n  return {\n    documentId: data.documentId,\n    changes: data.changes,\n    userId: data.userId,\n    version: this.incrementVersion(data.documentId)\n  };\n}\n\n\u002F\u002F All editors see changes in real-time\n","Collaborative Editing",[208,7572,7573,7598,7615,7626,7636,7641,7646,7654,7660,7676,7692,7706,7728,7732,7736,7740],{"__ignoreMap":236},[240,7574,7575,7577,7579,7581,7583,7585,7587,7589,7592,7594,7596],{"class":242,"line":243},[240,7576,362],{"class":254},[240,7578,482],{"class":250},[240,7580,255],{"class":368},[240,7582,487],{"class":254},[240,7584,491],{"class":490},[240,7586,262],{"class":254},[240,7588,496],{"class":254},[240,7590,7591],{"class":374},"document-change",[240,7593,371],{"class":254},[240,7595,504],{"class":254},[240,7597,380],{"class":368},[240,7599,7600,7602,7604,7606,7608,7611,7613],{"class":242,"line":383},[240,7601,362],{"class":254},[240,7603,6850],{"class":250},[240,7605,255],{"class":368},[240,7607,371],{"class":254},[240,7609,7610],{"class":374},"document-updated",[240,7612,371],{"class":254},[240,7614,380],{"class":368},[240,7616,7617,7620,7622,7624],{"class":242,"line":394},[240,7618,7619],{"class":250},"handleDocumentChange",[240,7621,5762],{"class":368},[240,7623,487],{"class":254},[240,7625,2119],{"class":368},[240,7627,7628,7631,7633],{"class":242,"line":410},[240,7629,7630],{"class":490},"  documentId",[240,7632,262],{"class":254},[240,7634,7635],{"class":368}," string;\n",[240,7637,7638],{"class":242,"line":417},[240,7639,7640],{"class":368},"  changes: any[];\n",[240,7642,7643],{"class":242,"line":423},[240,7644,7645],{"class":368},"  userId: string;\n",[240,7647,7648,7650,7652],{"class":242,"line":429},[240,7649,2214],{"class":254},[240,7651,1256],{"class":368},[240,7653,1259],{"class":254},[240,7655,7656,7658],{"class":242,"line":544},[240,7657,4898],{"class":397},[240,7659,407],{"class":254},[240,7661,7662,7665,7667,7669,7671,7674],{"class":242,"line":562},[240,7663,7664],{"class":490},"    documentId",[240,7666,262],{"class":254},[240,7668,3359],{"class":368},[240,7670,1224],{"class":254},[240,7672,7673],{"class":368},"documentId",[240,7675,3042],{"class":254},[240,7677,7678,7681,7683,7685,7687,7690],{"class":242,"line":571},[240,7679,7680],{"class":490},"    changes",[240,7682,262],{"class":254},[240,7684,3359],{"class":368},[240,7686,1224],{"class":254},[240,7688,7689],{"class":368},"changes",[240,7691,3042],{"class":254},[240,7693,7694,7696,7698,7700,7702,7704],{"class":242,"line":583},[240,7695,7094],{"class":490},[240,7697,262],{"class":254},[240,7699,3359],{"class":368},[240,7701,1224],{"class":254},[240,7703,1774],{"class":368},[240,7705,3042],{"class":254},[240,7707,7708,7711,7713,7715,7718,7720,7722,7724,7726],{"class":242,"line":608},[240,7709,7710],{"class":490},"    version",[240,7712,262],{"class":254},[240,7714,1484],{"class":254},[240,7716,7717],{"class":250},"incrementVersion",[240,7719,255],{"class":490},[240,7721,516],{"class":368},[240,7723,1224],{"class":254},[240,7725,7673],{"class":368},[240,7727,380],{"class":490},[240,7729,7730],{"class":242,"line":629},[240,7731,5862],{"class":254},[240,7733,7734],{"class":242,"line":634},[240,7735,420],{"class":254},[240,7737,7738],{"class":242,"line":639},[240,7739,426],{"emptyLinePlaceholder":56},[240,7741,7742],{"class":242,"line":645},[240,7743,7744],{"class":413},"\u002F\u002F All editors see changes in real-time\n",[226,7746,7748],{"id":7747},"broadcast-vs-emit","Broadcast vs Emit",[231,7750,7752],{"className":233,"code":7751,"language":235,"meta":236,"style":236},"\u002F\u002F @Emit - Only sender receives response\n@Message({ event: 'ping' })\n@Emit('pong')\nhandlePing() { ... }\n\n\u002F\u002F @Broadcast - Everyone receives (including sender)\n@Message({ event: 'announce' })\n@Broadcast('announcement')\nhandleAnnounce() { ... }\n",[208,7753,7754,7759,7783,7799,7812,7816,7821,7846,7863],{"__ignoreMap":236},[240,7755,7756],{"class":242,"line":243},[240,7757,7758],{"class":413},"\u002F\u002F @Emit - Only sender receives response\n",[240,7760,7761,7763,7765,7767,7769,7771,7773,7775,7777,7779,7781],{"class":242,"line":383},[240,7762,362],{"class":254},[240,7764,482],{"class":250},[240,7766,255],{"class":368},[240,7768,487],{"class":254},[240,7770,491],{"class":490},[240,7772,262],{"class":254},[240,7774,496],{"class":254},[240,7776,5624],{"class":374},[240,7778,371],{"class":254},[240,7780,504],{"class":254},[240,7782,380],{"class":368},[240,7784,7785,7787,7789,7791,7793,7795,7797],{"class":242,"line":394},[240,7786,362],{"class":254},[240,7788,5637],{"class":250},[240,7790,255],{"class":368},[240,7792,371],{"class":254},[240,7794,5644],{"class":374},[240,7796,371],{"class":254},[240,7798,380],{"class":368},[240,7800,7801,7804,7806,7808,7810],{"class":242,"line":410},[240,7802,7803],{"class":250},"handlePing",[240,7805,5679],{"class":368},[240,7807,487],{"class":254},[240,7809,530],{"class":254},[240,7811,533],{"class":254},[240,7813,7814],{"class":242,"line":417},[240,7815,426],{"emptyLinePlaceholder":56},[240,7817,7818],{"class":242,"line":423},[240,7819,7820],{"class":413},"\u002F\u002F @Broadcast - Everyone receives (including sender)\n",[240,7822,7823,7825,7827,7829,7831,7833,7835,7837,7840,7842,7844],{"class":242,"line":429},[240,7824,362],{"class":254},[240,7826,482],{"class":250},[240,7828,255],{"class":368},[240,7830,487],{"class":254},[240,7832,491],{"class":490},[240,7834,262],{"class":254},[240,7836,496],{"class":254},[240,7838,7839],{"class":374},"announce",[240,7841,371],{"class":254},[240,7843,504],{"class":254},[240,7845,380],{"class":368},[240,7847,7848,7850,7852,7854,7856,7859,7861],{"class":242,"line":544},[240,7849,362],{"class":254},[240,7851,6850],{"class":250},[240,7853,255],{"class":368},[240,7855,371],{"class":254},[240,7857,7858],{"class":374},"announcement",[240,7860,371],{"class":254},[240,7862,380],{"class":368},[240,7864,7865,7868,7870,7872,7874],{"class":242,"line":562},[240,7866,7867],{"class":250},"handleAnnounce",[240,7869,5679],{"class":368},[240,7871,487],{"class":254},[240,7873,530],{"class":254},[240,7875,533],{"class":254},[226,7877,2533],{"id":7878},"common-patterns-2",[350,7880,7881,8043],{},[231,7882,7885],{"className":233,"code":7883,"filename":7884,"language":235,"meta":236,"style":236},"@Message({ \n  event: 'post-message',\n  validationSchema: MessageSchema \n})\n@Broadcast('new-post')\nasync handlePost(data: MessageDto) {\n  \u002F\u002F Save to database\n  await this.messageService.save(data);\n  \n  \u002F\u002F Broadcast to all\n  return {\n    id: generateId(),\n    ...data,\n    createdAt: new Date()\n  };\n}\n","Broadcast with Validation",[208,7886,7887,7899,7914,7923,7929,7946,7958,7963,7985,7989,7994,8000,8013,8022,8035,8039],{"__ignoreMap":236},[240,7888,7889,7891,7893,7895,7897],{"class":242,"line":243},[240,7890,362],{"class":254},[240,7892,482],{"class":250},[240,7894,255],{"class":368},[240,7896,487],{"class":254},[240,7898,2119],{"class":368},[240,7900,7901,7903,7905,7907,7910,7912],{"class":242,"line":383},[240,7902,2940],{"class":490},[240,7904,262],{"class":254},[240,7906,496],{"class":254},[240,7908,7909],{"class":374},"post-message",[240,7911,371],{"class":254},[240,7913,3042],{"class":254},[240,7915,7916,7918,7920],{"class":242,"line":394},[240,7917,2951],{"class":490},[240,7919,262],{"class":254},[240,7921,7922],{"class":368}," MessageSchema \n",[240,7924,7925,7927],{"class":242,"line":410},[240,7926,2214],{"class":254},[240,7928,380],{"class":368},[240,7930,7931,7933,7935,7937,7939,7942,7944],{"class":242,"line":417},[240,7932,362],{"class":254},[240,7934,6850],{"class":250},[240,7936,255],{"class":368},[240,7938,371],{"class":254},[240,7940,7941],{"class":374},"new-post",[240,7943,371],{"class":254},[240,7945,380],{"class":368},[240,7947,7948,7950,7953,7956],{"class":242,"line":423},[240,7949,2266],{"class":368},[240,7951,7952],{"class":250},"handlePost",[240,7954,7955],{"class":368},"(data: MessageDto) ",[240,7957,1259],{"class":254},[240,7959,7960],{"class":242,"line":429},[240,7961,7962],{"class":413},"  \u002F\u002F Save to database\n",[240,7964,7965,7967,7969,7972,7974,7977,7979,7981,7983],{"class":242,"line":544},[240,7966,4863],{"class":397},[240,7968,1484],{"class":254},[240,7970,7971],{"class":368},"messageService",[240,7973,1224],{"class":254},[240,7975,7976],{"class":250},"save",[240,7978,255],{"class":490},[240,7980,516],{"class":368},[240,7982,524],{"class":490},[240,7984,1235],{"class":254},[240,7986,7987],{"class":242,"line":562},[240,7988,1139],{"class":490},[240,7990,7991],{"class":242,"line":571},[240,7992,7993],{"class":413},"  \u002F\u002F Broadcast to all\n",[240,7995,7996,7998],{"class":242,"line":583},[240,7997,4898],{"class":397},[240,7999,407],{"class":254},[240,8001,8002,8004,8006,8009,8011],{"class":242,"line":608},[240,8003,5819],{"class":490},[240,8005,262],{"class":254},[240,8007,8008],{"class":250}," generateId",[240,8010,798],{"class":490},[240,8012,3042],{"class":254},[240,8014,8015,8018,8020],{"class":242,"line":629},[240,8016,8017],{"class":254},"    ...",[240,8019,516],{"class":368},[240,8021,3042],{"class":254},[240,8023,8024,8027,8029,8031,8033],{"class":242,"line":634},[240,8025,8026],{"class":490},"    createdAt",[240,8028,262],{"class":254},[240,8030,1539],{"class":254},[240,8032,5671],{"class":250},[240,8034,391],{"class":490},[240,8036,8037],{"class":242,"line":639},[240,8038,5862],{"class":254},[240,8040,8041],{"class":242,"line":645},[240,8042,420],{"class":254},[231,8044,8047],{"className":233,"code":8045,"filename":8046,"language":235,"meta":236,"style":236},"@Message({ event: 'update' })\nasync handleUpdate(data: any, peer: Peer) {\n  \u002F\u002F Process update\n  const result = await this.process(data);\n  \n  \u002F\u002F Manually broadcast if needed\n  if (result.shouldNotify) {\n    this.wsService.broadcast(peer, {\n      event: 'update-notification',\n      data: result\n    });\n  }\n  \n  return result;\n}\n","Conditional Broadcast",[208,8048,8049,8074,8089,8094,8117,8121,8126,8143,8162,8178,8188,8196,8200,8204,8212],{"__ignoreMap":236},[240,8050,8051,8053,8055,8057,8059,8061,8063,8065,8068,8070,8072],{"class":242,"line":243},[240,8052,362],{"class":254},[240,8054,482],{"class":250},[240,8056,255],{"class":368},[240,8058,487],{"class":254},[240,8060,491],{"class":490},[240,8062,262],{"class":254},[240,8064,496],{"class":254},[240,8066,8067],{"class":374},"update",[240,8069,371],{"class":254},[240,8071,504],{"class":254},[240,8073,380],{"class":368},[240,8075,8076,8078,8081,8083,8085,8087],{"class":242,"line":383},[240,8077,2266],{"class":368},[240,8079,8080],{"class":250},"handleUpdate",[240,8082,4062],{"class":368},[240,8084,977],{"class":254},[240,8086,3654],{"class":368},[240,8088,1259],{"class":254},[240,8090,8091],{"class":242,"line":394},[240,8092,8093],{"class":413},"  \u002F\u002F Process update\n",[240,8095,8096,8098,8100,8102,8104,8106,8109,8111,8113,8115],{"class":242,"line":410},[240,8097,5782],{"class":246},[240,8099,5334],{"class":368},[240,8101,1218],{"class":254},[240,8103,1481],{"class":397},[240,8105,1484],{"class":254},[240,8107,8108],{"class":250},"process",[240,8110,255],{"class":490},[240,8112,516],{"class":368},[240,8114,524],{"class":490},[240,8116,1235],{"class":254},[240,8118,8119],{"class":242,"line":417},[240,8120,1139],{"class":490},[240,8122,8123],{"class":242,"line":423},[240,8124,8125],{"class":413},"  \u002F\u002F Manually broadcast if needed\n",[240,8127,8128,8130,8132,8134,8136,8139,8141],{"class":242,"line":429},[240,8129,2372],{"class":397},[240,8131,1248],{"class":490},[240,8133,6479],{"class":368},[240,8135,1224],{"class":254},[240,8137,8138],{"class":368},"shouldNotify",[240,8140,1256],{"class":490},[240,8142,1259],{"class":254},[240,8144,8145,8147,8150,8152,8154,8156,8158,8160],{"class":242,"line":544},[240,8146,3729],{"class":254},[240,8148,8149],{"class":368},"wsService",[240,8151,1224],{"class":254},[240,8153,6676],{"class":250},[240,8155,255],{"class":490},[240,8157,3096],{"class":368},[240,8159,977],{"class":254},[240,8161,407],{"class":254},[240,8163,8164,8167,8169,8171,8174,8176],{"class":242,"line":562},[240,8165,8166],{"class":490},"      event",[240,8168,262],{"class":254},[240,8170,496],{"class":254},[240,8172,8173],{"class":374},"update-notification",[240,8175,371],{"class":254},[240,8177,3042],{"class":254},[240,8179,8180,8183,8185],{"class":242,"line":571},[240,8181,8182],{"class":490},"      data",[240,8184,262],{"class":254},[240,8186,8187],{"class":368}," result\n",[240,8189,8190,8192,8194],{"class":242,"line":583},[240,8191,1578],{"class":254},[240,8193,524],{"class":490},[240,8195,1235],{"class":254},[240,8197,8198],{"class":242,"line":608},[240,8199,1301],{"class":254},[240,8201,8202],{"class":242,"line":629},[240,8203,1139],{"class":490},[240,8205,8206,8208,8210],{"class":242,"line":634},[240,8207,4898],{"class":397},[240,8209,5334],{"class":368},[240,8211,1235],{"class":254},[240,8213,8214],{"class":242,"line":639},[240,8215,420],{"class":254},[908,8217],{},[213,8219,8221],{"id":8220},"broadcastothers",[208,8222,8223],{},"@BroadcastOthers",[204,8225,221,8226,6683,8228,6688],{},[208,8227,8223],{},[6685,8229,8230],{},"excluding",[226,8232,229],{"id":8233},"signature-5",[231,8235,8237],{"className":233,"code":8236,"language":235,"meta":236,"style":236},"function BroadcastOthers(event: string): MethodDecorator\n",[208,8238,8239],{"__ignoreMap":236},[240,8240,8241,8243,8246,8248,8250,8252,8254,8256],{"class":242,"line":243},[240,8242,247],{"class":246},[240,8244,8245],{"class":250}," BroadcastOthers",[240,8247,255],{"class":254},[240,8249,2994],{"class":258},[240,8251,262],{"class":254},[240,8253,266],{"class":265},[240,8255,269],{"class":254},[240,8257,941],{"class":265},[226,8259,276],{"id":8260},"parameters-5",[278,8262,8263,8275],{},[281,8264,8265],{},[284,8266,8267,8269,8271,8273],{},[287,8268,289],{},[287,8270,292],{},[287,8272,295],{},[287,8274,298],{},[300,8276,8277],{},[284,8278,8279,8283,8287,8289],{},[305,8280,8281],{},[208,8282,2994],{},[305,8284,8285],{},[208,8286,313],{},[305,8288,316],{},[305,8290,6749],{},[226,8292,323],{"id":8293},"behavior-5",[325,8295,8296,8299,8301,8305],{},[328,8297,8298],{},"Sends message to ALL peers in the namespace EXCEPT the sender",[328,8300,5541],{},[328,8302,5544,8303],{},[208,8304,5547],{},[328,8306,8307,8308,8310],{},"Sender doesn't receive the broadcast (use ",[208,8309,3215],{}," if needed)",[226,8312,22],{"id":8313},"examples-5",[350,8315,8316,8507,8731,8881,9054],{},[231,8317,8320],{"className":233,"code":8318,"filename":8319,"language":235,"meta":236,"style":236},"@Namespace('\u002Fchat')\n@Controller()\nexport class ChatGateway {\n  \n  @Message({ event: 'typing' })\n  @BroadcastOthers('user-typing')\n  handleTyping(data: { username: string; isTyping: boolean }) {\n    return {\n      username: data.username,\n      isTyping: data.isTyping\n    };\n  }\n}\n\n\u002F\u002F User A types:\n\u002F\u002F - User A: doesn't see their own typing indicator\n\u002F\u002F - User B: sees \"User A is typing...\"\n\u002F\u002F - User C: sees \"User A is typing...\"\n","Typing Indicator",[208,8321,8322,8338,8346,8356,8360,8385,8403,8436,8442,8457,8471,8475,8479,8483,8487,8492,8497,8502],{"__ignoreMap":236},[240,8323,8324,8326,8328,8330,8332,8334,8336],{"class":242,"line":243},[240,8325,362],{"class":254},[240,8327,365],{"class":250},[240,8329,255],{"class":368},[240,8331,371],{"class":254},[240,8333,375],{"class":374},[240,8335,371],{"class":254},[240,8337,380],{"class":368},[240,8339,8340,8342,8344],{"class":242,"line":383},[240,8341,362],{"class":254},[240,8343,388],{"class":250},[240,8345,391],{"class":368},[240,8347,8348,8350,8352,8354],{"class":242,"line":394},[240,8349,398],{"class":397},[240,8351,401],{"class":246},[240,8353,404],{"class":265},[240,8355,407],{"class":254},[240,8357,8358],{"class":242,"line":410},[240,8359,1139],{"class":368},[240,8361,8362,8364,8366,8368,8370,8372,8374,8376,8379,8381,8383],{"class":242,"line":417},[240,8363,479],{"class":254},[240,8365,482],{"class":250},[240,8367,255],{"class":368},[240,8369,487],{"class":254},[240,8371,491],{"class":490},[240,8373,262],{"class":254},[240,8375,496],{"class":254},[240,8377,8378],{"class":374},"typing",[240,8380,371],{"class":254},[240,8382,504],{"class":254},[240,8384,380],{"class":368},[240,8386,8387,8389,8392,8394,8396,8399,8401],{"class":242,"line":423},[240,8388,479],{"class":254},[240,8390,8391],{"class":250},"BroadcastOthers",[240,8393,255],{"class":368},[240,8395,371],{"class":254},[240,8397,8398],{"class":374},"user-typing",[240,8400,371],{"class":254},[240,8402,380],{"class":368},[240,8404,8405,8408,8410,8412,8414,8416,8418,8420,8422,8424,8427,8429,8432,8434],{"class":242,"line":429},[240,8406,8407],{"class":490},"  handleTyping",[240,8409,255],{"class":254},[240,8411,516],{"class":258},[240,8413,262],{"class":254},[240,8415,527],{"class":254},[240,8417,7042],{"class":490},[240,8419,262],{"class":254},[240,8421,266],{"class":265},[240,8423,1271],{"class":254},[240,8425,8426],{"class":490}," isTyping",[240,8428,262],{"class":254},[240,8430,8431],{"class":265}," boolean",[240,8433,6890],{"class":254},[240,8435,407],{"class":254},[240,8437,8438,8440],{"class":242,"line":544},[240,8439,1288],{"class":397},[240,8441,407],{"class":254},[240,8443,8444,8447,8449,8451,8453,8455],{"class":242,"line":562},[240,8445,8446],{"class":490},"      username",[240,8448,262],{"class":254},[240,8450,3359],{"class":368},[240,8452,1224],{"class":254},[240,8454,3682],{"class":368},[240,8456,3042],{"class":254},[240,8458,8459,8462,8464,8466,8468],{"class":242,"line":571},[240,8460,8461],{"class":490},"      isTyping",[240,8463,262],{"class":254},[240,8465,3359],{"class":368},[240,8467,1224],{"class":254},[240,8469,8470],{"class":368},"isTyping\n",[240,8472,8473],{"class":242,"line":583},[240,8474,5449],{"class":254},[240,8476,8477],{"class":242,"line":608},[240,8478,1301],{"class":254},[240,8480,8481],{"class":242,"line":629},[240,8482,420],{"class":254},[240,8484,8485],{"class":242,"line":634},[240,8486,426],{"emptyLinePlaceholder":56},[240,8488,8489],{"class":242,"line":639},[240,8490,8491],{"class":413},"\u002F\u002F User A types:\n",[240,8493,8494],{"class":242,"line":645},[240,8495,8496],{"class":413},"\u002F\u002F - User A: doesn't see their own typing indicator\n",[240,8498,8499],{"class":242,"line":651},[240,8500,8501],{"class":413},"\u002F\u002F - User B: sees \"User A is typing...\"\n",[240,8503,8504],{"class":242,"line":1304},[240,8505,8506],{"class":413},"\u002F\u002F - User C: sees \"User A is typing...\"\n",[231,8508,8511],{"className":233,"code":8509,"filename":8510,"language":235,"meta":236,"style":236},"@Namespace('\u002Fgame')\n@Controller()\nexport class GameGateway {\n  \n  @Message({ event: 'move' })\n  @BroadcastOthers('player-moved')\n  handleMove(data: { x: number; y: number }, peer: Peer) {\n    return {\n      playerId: peer.id,\n      position: { x: data.x, y: data.y },\n      timestamp: Date.now()\n    };\n  }\n}\n\n\u002F\u002F Player moves:\n\u002F\u002F - Moving player: sees their own movement locally\n\u002F\u002F - Other players: see the movement via broadcast\n","Player Movement (Multiplayer Games)",[208,8512,8513,8529,8537,8547,8551,8576,8593,8631,8637,8652,8686,8700,8704,8708,8712,8716,8721,8726],{"__ignoreMap":236},[240,8514,8515,8517,8519,8521,8523,8525,8527],{"class":242,"line":243},[240,8516,362],{"class":254},[240,8518,365],{"class":250},[240,8520,255],{"class":368},[240,8522,371],{"class":254},[240,8524,3775],{"class":374},[240,8526,371],{"class":254},[240,8528,380],{"class":368},[240,8530,8531,8533,8535],{"class":242,"line":383},[240,8532,362],{"class":254},[240,8534,388],{"class":250},[240,8536,391],{"class":368},[240,8538,8539,8541,8543,8545],{"class":242,"line":394},[240,8540,398],{"class":397},[240,8542,401],{"class":246},[240,8544,3796],{"class":265},[240,8546,407],{"class":254},[240,8548,8549],{"class":242,"line":410},[240,8550,1139],{"class":368},[240,8552,8553,8555,8557,8559,8561,8563,8565,8567,8570,8572,8574],{"class":242,"line":417},[240,8554,479],{"class":254},[240,8556,482],{"class":250},[240,8558,255],{"class":368},[240,8560,487],{"class":254},[240,8562,491],{"class":490},[240,8564,262],{"class":254},[240,8566,496],{"class":254},[240,8568,8569],{"class":374},"move",[240,8571,371],{"class":254},[240,8573,504],{"class":254},[240,8575,380],{"class":368},[240,8577,8578,8580,8582,8584,8586,8589,8591],{"class":242,"line":423},[240,8579,479],{"class":254},[240,8581,8391],{"class":250},[240,8583,255],{"class":368},[240,8585,371],{"class":254},[240,8587,8588],{"class":374},"player-moved",[240,8590,371],{"class":254},[240,8592,380],{"class":368},[240,8594,8595,8597,8599,8601,8603,8605,8607,8609,8611,8613,8615,8617,8619,8621,8623,8625,8627,8629],{"class":242,"line":429},[240,8596,3832],{"class":490},[240,8598,255],{"class":254},[240,8600,516],{"class":258},[240,8602,262],{"class":254},[240,8604,527],{"class":254},[240,8606,3843],{"class":490},[240,8608,262],{"class":254},[240,8610,3848],{"class":265},[240,8612,1271],{"class":254},[240,8614,3853],{"class":490},[240,8616,262],{"class":254},[240,8618,3848],{"class":265},[240,8620,3860],{"class":254},[240,8622,3314],{"class":258},[240,8624,262],{"class":254},[240,8626,3120],{"class":265},[240,8628,524],{"class":254},[240,8630,407],{"class":254},[240,8632,8633,8635],{"class":242,"line":544},[240,8634,1288],{"class":397},[240,8636,407],{"class":254},[240,8638,8639,8642,8644,8646,8648,8650],{"class":242,"line":562},[240,8640,8641],{"class":490},"      playerId",[240,8643,262],{"class":254},[240,8645,3314],{"class":368},[240,8647,1224],{"class":254},[240,8649,3348],{"class":368},[240,8651,3042],{"class":254},[240,8653,8654,8657,8659,8661,8663,8665,8667,8669,8671,8673,8675,8677,8679,8681,8683],{"class":242,"line":571},[240,8655,8656],{"class":490},"      position",[240,8658,262],{"class":254},[240,8660,527],{"class":254},[240,8662,3843],{"class":490},[240,8664,262],{"class":254},[240,8666,3359],{"class":368},[240,8668,1224],{"class":254},[240,8670,5224],{"class":368},[240,8672,977],{"class":254},[240,8674,3853],{"class":490},[240,8676,262],{"class":254},[240,8678,3359],{"class":368},[240,8680,1224],{"class":254},[240,8682,5237],{"class":368},[240,8684,8685],{"class":254}," },\n",[240,8687,8688,8690,8692,8694,8696,8698],{"class":242,"line":583},[240,8689,6931],{"class":490},[240,8691,262],{"class":254},[240,8693,5671],{"class":368},[240,8695,1224],{"class":254},[240,8697,5676],{"class":250},[240,8699,391],{"class":490},[240,8701,8702],{"class":242,"line":608},[240,8703,5449],{"class":254},[240,8705,8706],{"class":242,"line":629},[240,8707,1301],{"class":254},[240,8709,8710],{"class":242,"line":634},[240,8711,420],{"class":254},[240,8713,8714],{"class":242,"line":639},[240,8715,426],{"emptyLinePlaceholder":56},[240,8717,8718],{"class":242,"line":645},[240,8719,8720],{"class":413},"\u002F\u002F Player moves:\n",[240,8722,8723],{"class":242,"line":651},[240,8724,8725],{"class":413},"\u002F\u002F - Moving player: sees their own movement locally\n",[240,8727,8728],{"class":242,"line":1304},[240,8729,8730],{"class":413},"\u002F\u002F - Other players: see the movement via broadcast\n",[231,8732,8735],{"className":233,"code":8733,"filename":8734,"language":235,"meta":236,"style":236},"@Message({ event: 'cursor-move' })\n@BroadcastOthers('cursor-update')\nhandleCursorMove(data: { x: number; y: number; userId: string }) {\n  return {\n    userId: data.userId,\n    position: { x: data.x, y: data.y }\n  };\n}\n\n\u002F\u002F User moves cursor:\n\u002F\u002F - Moving user: sees own cursor locally\n\u002F\u002F - Other users: see cursor position update\n","Cursor Position (Collaborative Tools)",[208,8736,8737,8762,8779,8801,8807,8821,8854,8858,8862,8866,8871,8876],{"__ignoreMap":236},[240,8738,8739,8741,8743,8745,8747,8749,8751,8753,8756,8758,8760],{"class":242,"line":243},[240,8740,362],{"class":254},[240,8742,482],{"class":250},[240,8744,255],{"class":368},[240,8746,487],{"class":254},[240,8748,491],{"class":490},[240,8750,262],{"class":254},[240,8752,496],{"class":254},[240,8754,8755],{"class":374},"cursor-move",[240,8757,371],{"class":254},[240,8759,504],{"class":254},[240,8761,380],{"class":368},[240,8763,8764,8766,8768,8770,8772,8775,8777],{"class":242,"line":383},[240,8765,362],{"class":254},[240,8767,8391],{"class":250},[240,8769,255],{"class":368},[240,8771,371],{"class":254},[240,8773,8774],{"class":374},"cursor-update",[240,8776,371],{"class":254},[240,8778,380],{"class":368},[240,8780,8781,8784,8786,8788,8790,8792,8795,8797,8799],{"class":242,"line":394},[240,8782,8783],{"class":250},"handleCursorMove",[240,8785,5762],{"class":368},[240,8787,487],{"class":254},[240,8789,3843],{"class":490},[240,8791,262],{"class":254},[240,8793,8794],{"class":368}," number; y: number; userId: string ",[240,8796,2214],{"class":254},[240,8798,1256],{"class":368},[240,8800,1259],{"class":254},[240,8802,8803,8805],{"class":242,"line":410},[240,8804,4898],{"class":397},[240,8806,407],{"class":254},[240,8808,8809,8811,8813,8815,8817,8819],{"class":242,"line":417},[240,8810,7094],{"class":490},[240,8812,262],{"class":254},[240,8814,3359],{"class":368},[240,8816,1224],{"class":254},[240,8818,1774],{"class":368},[240,8820,3042],{"class":254},[240,8822,8823,8826,8828,8830,8832,8834,8836,8838,8840,8842,8844,8846,8848,8850,8852],{"class":242,"line":423},[240,8824,8825],{"class":490},"    position",[240,8827,262],{"class":254},[240,8829,527],{"class":254},[240,8831,3843],{"class":490},[240,8833,262],{"class":254},[240,8835,3359],{"class":368},[240,8837,1224],{"class":254},[240,8839,5224],{"class":368},[240,8841,977],{"class":254},[240,8843,3853],{"class":490},[240,8845,262],{"class":254},[240,8847,3359],{"class":368},[240,8849,1224],{"class":254},[240,8851,5237],{"class":368},[240,8853,533],{"class":254},[240,8855,8856],{"class":242,"line":429},[240,8857,5862],{"class":254},[240,8859,8860],{"class":242,"line":544},[240,8861,420],{"class":254},[240,8863,8864],{"class":242,"line":562},[240,8865,426],{"emptyLinePlaceholder":56},[240,8867,8868],{"class":242,"line":571},[240,8869,8870],{"class":413},"\u002F\u002F User moves cursor:\n",[240,8872,8873],{"class":242,"line":583},[240,8874,8875],{"class":413},"\u002F\u002F - Moving user: sees own cursor locally\n",[240,8877,8878],{"class":242,"line":608},[240,8879,8880],{"class":413},"\u002F\u002F - Other users: see cursor position update\n",[231,8882,8885],{"className":233,"code":8883,"filename":8884,"language":235,"meta":236,"style":236},"@Message({ event: 'status-change' })\n@BroadcastOthers('user-status-changed')\nhandleStatusChange(data: { status: 'online' | 'away' | 'busy' }, peer: Peer) {\n  return {\n    userId: peer.id,\n    status: data.status,\n    timestamp: new Date().toISOString()\n  };\n}\n\n\u002F\u002F User changes status:\n\u002F\u002F - Status changing user: already knows their status\n\u002F\u002F - Other users: notified of the change\n","User Status Without Self-Notification",[208,8886,8887,8912,8929,8974,8980,8994,9009,9027,9031,9035,9039,9044,9049],{"__ignoreMap":236},[240,8888,8889,8891,8893,8895,8897,8899,8901,8903,8906,8908,8910],{"class":242,"line":243},[240,8890,362],{"class":254},[240,8892,482],{"class":250},[240,8894,255],{"class":368},[240,8896,487],{"class":254},[240,8898,491],{"class":490},[240,8900,262],{"class":254},[240,8902,496],{"class":254},[240,8904,8905],{"class":374},"status-change",[240,8907,371],{"class":254},[240,8909,504],{"class":254},[240,8911,380],{"class":368},[240,8913,8914,8916,8918,8920,8922,8925,8927],{"class":242,"line":383},[240,8915,362],{"class":254},[240,8917,8391],{"class":250},[240,8919,255],{"class":368},[240,8921,371],{"class":254},[240,8923,8924],{"class":374},"user-status-changed",[240,8926,371],{"class":254},[240,8928,380],{"class":368},[240,8930,8931,8934,8936,8938,8940,8942,8944,8947,8949,8952,8954,8957,8959,8961,8963,8966,8968,8970,8972],{"class":242,"line":394},[240,8932,8933],{"class":250},"handleStatusChange",[240,8935,5762],{"class":368},[240,8937,487],{"class":254},[240,8939,4206],{"class":490},[240,8941,262],{"class":254},[240,8943,496],{"class":254},[240,8945,8946],{"class":374},"online",[240,8948,371],{"class":254},[240,8950,8951],{"class":254}," |",[240,8953,496],{"class":254},[240,8955,8956],{"class":374},"away",[240,8958,371],{"class":254},[240,8960,8951],{"class":254},[240,8962,496],{"class":254},[240,8964,8965],{"class":374},"busy",[240,8967,371],{"class":254},[240,8969,3860],{"class":254},[240,8971,3654],{"class":368},[240,8973,1259],{"class":254},[240,8975,8976,8978],{"class":242,"line":410},[240,8977,4898],{"class":397},[240,8979,407],{"class":254},[240,8981,8982,8984,8986,8988,8990,8992],{"class":242,"line":417},[240,8983,7094],{"class":490},[240,8985,262],{"class":254},[240,8987,3314],{"class":368},[240,8989,1224],{"class":254},[240,8991,3348],{"class":368},[240,8993,3042],{"class":254},[240,8995,8996,8998,9000,9002,9004,9007],{"class":242,"line":423},[240,8997,5848],{"class":490},[240,8999,262],{"class":254},[240,9001,3359],{"class":368},[240,9003,1224],{"class":254},[240,9005,9006],{"class":368},"status",[240,9008,3042],{"class":254},[240,9010,9011,9013,9015,9017,9019,9021,9023,9025],{"class":242,"line":429},[240,9012,6203],{"class":490},[240,9014,262],{"class":254},[240,9016,1539],{"class":254},[240,9018,5671],{"class":250},[240,9020,798],{"class":490},[240,9022,1224],{"class":254},[240,9024,6216],{"class":250},[240,9026,391],{"class":490},[240,9028,9029],{"class":242,"line":544},[240,9030,5862],{"class":254},[240,9032,9033],{"class":242,"line":562},[240,9034,420],{"class":254},[240,9036,9037],{"class":242,"line":571},[240,9038,426],{"emptyLinePlaceholder":56},[240,9040,9041],{"class":242,"line":583},[240,9042,9043],{"class":413},"\u002F\u002F User changes status:\n",[240,9045,9046],{"class":242,"line":608},[240,9047,9048],{"class":413},"\u002F\u002F - Status changing user: already knows their status\n",[240,9050,9051],{"class":242,"line":629},[240,9052,9053],{"class":413},"\u002F\u002F - Other users: notified of the change\n",[231,9055,9058],{"className":233,"code":9056,"filename":9057,"language":235,"meta":236,"style":236},"@Message({ event: 'select-item' })\n@BroadcastOthers('item-selected')\nhandleSelection(data: { itemId: string; userId: string }) {\n  return {\n    itemId: data.itemId,\n    userId: data.userId,\n    action: 'selected'\n  };\n}\n\n\u002F\u002F User selects item:\n\u002F\u002F - Selecting user: handles selection locally\n\u002F\u002F - Other users: see what was selected\n","Selection Updates",[208,9059,9060,9085,9102,9124,9130,9146,9160,9175,9179,9183,9187,9192,9197],{"__ignoreMap":236},[240,9061,9062,9064,9066,9068,9070,9072,9074,9076,9079,9081,9083],{"class":242,"line":243},[240,9063,362],{"class":254},[240,9065,482],{"class":250},[240,9067,255],{"class":368},[240,9069,487],{"class":254},[240,9071,491],{"class":490},[240,9073,262],{"class":254},[240,9075,496],{"class":254},[240,9077,9078],{"class":374},"select-item",[240,9080,371],{"class":254},[240,9082,504],{"class":254},[240,9084,380],{"class":368},[240,9086,9087,9089,9091,9093,9095,9098,9100],{"class":242,"line":383},[240,9088,362],{"class":254},[240,9090,8391],{"class":250},[240,9092,255],{"class":368},[240,9094,371],{"class":254},[240,9096,9097],{"class":374},"item-selected",[240,9099,371],{"class":254},[240,9101,380],{"class":368},[240,9103,9104,9107,9109,9111,9114,9116,9118,9120,9122],{"class":242,"line":394},[240,9105,9106],{"class":250},"handleSelection",[240,9108,5762],{"class":368},[240,9110,487],{"class":254},[240,9112,9113],{"class":490}," itemId",[240,9115,262],{"class":254},[240,9117,7047],{"class":368},[240,9119,2214],{"class":254},[240,9121,1256],{"class":368},[240,9123,1259],{"class":254},[240,9125,9126,9128],{"class":242,"line":410},[240,9127,4898],{"class":397},[240,9129,407],{"class":254},[240,9131,9132,9135,9137,9139,9141,9144],{"class":242,"line":417},[240,9133,9134],{"class":490},"    itemId",[240,9136,262],{"class":254},[240,9138,3359],{"class":368},[240,9140,1224],{"class":254},[240,9142,9143],{"class":368},"itemId",[240,9145,3042],{"class":254},[240,9147,9148,9150,9152,9154,9156,9158],{"class":242,"line":423},[240,9149,7094],{"class":490},[240,9151,262],{"class":254},[240,9153,3359],{"class":368},[240,9155,1224],{"class":254},[240,9157,1774],{"class":368},[240,9159,3042],{"class":254},[240,9161,9162,9165,9167,9169,9172],{"class":242,"line":429},[240,9163,9164],{"class":490},"    action",[240,9166,262],{"class":254},[240,9168,496],{"class":254},[240,9170,9171],{"class":374},"selected",[240,9173,9174],{"class":254},"'\n",[240,9176,9177],{"class":242,"line":544},[240,9178,5862],{"class":254},[240,9180,9181],{"class":242,"line":562},[240,9182,420],{"class":254},[240,9184,9185],{"class":242,"line":571},[240,9186,426],{"emptyLinePlaceholder":56},[240,9188,9189],{"class":242,"line":583},[240,9190,9191],{"class":413},"\u002F\u002F User selects item:\n",[240,9193,9194],{"class":242,"line":608},[240,9195,9196],{"class":413},"\u002F\u002F - Selecting user: handles selection locally\n",[240,9198,9199],{"class":242,"line":629},[240,9200,9201],{"class":413},"\u002F\u002F - Other users: see what was selected\n",[226,9203,9205],{"id":9204},"combining-with-emit","Combining with @Emit",[204,9207,9208],{},"You can use both decorators to send different messages:",[231,9210,9212],{"className":233,"code":9211,"language":235,"meta":236,"style":236},"@Message({ event: 'action' })\n@Emit('action-confirmed')          \u002F\u002F Sender gets confirmation\n@BroadcastOthers('user-action')    \u002F\u002F Others get notification\nhandleAction(data: any, peer: Peer) {\n  return {\n    action: data.action,\n    userId: peer.id\n  };\n}\n\n\u002F\u002F Sender receives: { event: 'action-confirmed', data: {...} }\n\u002F\u002F Others receive: { event: 'user-action', data: {...} }\n",[208,9213,9214,9238,9259,9280,9292,9298,9312,9324,9328,9332,9336,9341],{"__ignoreMap":236},[240,9215,9216,9218,9220,9222,9224,9226,9228,9230,9232,9234,9236],{"class":242,"line":243},[240,9217,362],{"class":254},[240,9219,482],{"class":250},[240,9221,255],{"class":368},[240,9223,487],{"class":254},[240,9225,491],{"class":490},[240,9227,262],{"class":254},[240,9229,496],{"class":254},[240,9231,4048],{"class":374},[240,9233,371],{"class":254},[240,9235,504],{"class":254},[240,9237,380],{"class":368},[240,9239,9240,9242,9244,9246,9248,9251,9253,9256],{"class":242,"line":383},[240,9241,362],{"class":254},[240,9243,5637],{"class":250},[240,9245,255],{"class":368},[240,9247,371],{"class":254},[240,9249,9250],{"class":374},"action-confirmed",[240,9252,371],{"class":254},[240,9254,9255],{"class":368},")          ",[240,9257,9258],{"class":413},"\u002F\u002F Sender gets confirmation\n",[240,9260,9261,9263,9265,9267,9269,9272,9274,9277],{"class":242,"line":394},[240,9262,362],{"class":254},[240,9264,8391],{"class":250},[240,9266,255],{"class":368},[240,9268,371],{"class":254},[240,9270,9271],{"class":374},"user-action",[240,9273,371],{"class":254},[240,9275,9276],{"class":368},")    ",[240,9278,9279],{"class":413},"\u002F\u002F Others get notification\n",[240,9281,9282,9284,9286,9288,9290],{"class":242,"line":410},[240,9283,4059],{"class":250},[240,9285,4062],{"class":368},[240,9287,977],{"class":254},[240,9289,3654],{"class":368},[240,9291,1259],{"class":254},[240,9293,9294,9296],{"class":242,"line":417},[240,9295,4898],{"class":397},[240,9297,407],{"class":254},[240,9299,9300,9302,9304,9306,9308,9310],{"class":242,"line":423},[240,9301,9164],{"class":490},[240,9303,262],{"class":254},[240,9305,3359],{"class":368},[240,9307,1224],{"class":254},[240,9309,4048],{"class":368},[240,9311,3042],{"class":254},[240,9313,9314,9316,9318,9320,9322],{"class":242,"line":429},[240,9315,7094],{"class":490},[240,9317,262],{"class":254},[240,9319,3314],{"class":368},[240,9321,1224],{"class":254},[240,9323,4489],{"class":368},[240,9325,9326],{"class":242,"line":544},[240,9327,5862],{"class":254},[240,9329,9330],{"class":242,"line":562},[240,9331,420],{"class":254},[240,9333,9334],{"class":242,"line":571},[240,9335,426],{"emptyLinePlaceholder":56},[240,9337,9338],{"class":242,"line":583},[240,9339,9340],{"class":413},"\u002F\u002F Sender receives: { event: 'action-confirmed', data: {...} }\n",[240,9342,9343],{"class":242,"line":608},[240,9344,9345],{"class":413},"\u002F\u002F Others receive: { event: 'user-action', data: {...} }\n",[226,9347,2533],{"id":9348},"common-patterns-3",[350,9350,9351,9531],{},[231,9352,9355],{"className":233,"code":9353,"filename":9354,"language":235,"meta":236,"style":236},"@Message({ event: 'join-room' })\n@BroadcastOthers('user-joined')\nhandleJoinRoom(data: { roomId: string; username: string }) {\n  \u002F\u002F Add user to room\n  this.addToRoom(data.roomId, data.username);\n  \n  \u002F\u002F Notify others\n  return {\n    roomId: data.roomId,\n    username: data.username,\n    message: `${data.username} joined the room`\n  };\n}\n","Presence Awareness",[208,9356,9357,9382,9398,9421,9426,9455,9459,9464,9470,9485,9499,9523,9527],{"__ignoreMap":236},[240,9358,9359,9361,9363,9365,9367,9369,9371,9373,9376,9378,9380],{"class":242,"line":243},[240,9360,362],{"class":254},[240,9362,482],{"class":250},[240,9364,255],{"class":368},[240,9366,487],{"class":254},[240,9368,491],{"class":490},[240,9370,262],{"class":254},[240,9372,496],{"class":254},[240,9374,9375],{"class":374},"join-room",[240,9377,371],{"class":254},[240,9379,504],{"class":254},[240,9381,380],{"class":368},[240,9383,9384,9386,9388,9390,9392,9394,9396],{"class":242,"line":383},[240,9385,362],{"class":254},[240,9387,8391],{"class":250},[240,9389,255],{"class":368},[240,9391,371],{"class":254},[240,9393,7007],{"class":374},[240,9395,371],{"class":254},[240,9397,380],{"class":368},[240,9399,9400,9403,9405,9407,9410,9412,9415,9417,9419],{"class":242,"line":394},[240,9401,9402],{"class":250},"handleJoinRoom",[240,9404,5762],{"class":368},[240,9406,487],{"class":254},[240,9408,9409],{"class":490}," roomId",[240,9411,262],{"class":254},[240,9413,9414],{"class":368}," string; username: string ",[240,9416,2214],{"class":254},[240,9418,1256],{"class":368},[240,9420,1259],{"class":254},[240,9422,9423],{"class":242,"line":410},[240,9424,9425],{"class":413},"  \u002F\u002F Add user to room\n",[240,9427,9428,9431,9434,9436,9438,9440,9443,9445,9447,9449,9451,9453],{"class":242,"line":417},[240,9429,9430],{"class":254},"  this.",[240,9432,9433],{"class":250},"addToRoom",[240,9435,255],{"class":490},[240,9437,516],{"class":368},[240,9439,1224],{"class":254},[240,9441,9442],{"class":368},"roomId",[240,9444,977],{"class":254},[240,9446,3359],{"class":368},[240,9448,1224],{"class":254},[240,9450,3682],{"class":368},[240,9452,524],{"class":490},[240,9454,1235],{"class":254},[240,9456,9457],{"class":242,"line":423},[240,9458,1139],{"class":490},[240,9460,9461],{"class":242,"line":429},[240,9462,9463],{"class":413},"  \u002F\u002F Notify others\n",[240,9465,9466,9468],{"class":242,"line":544},[240,9467,4898],{"class":397},[240,9469,407],{"class":254},[240,9471,9472,9475,9477,9479,9481,9483],{"class":242,"line":562},[240,9473,9474],{"class":490},"    roomId",[240,9476,262],{"class":254},[240,9478,3359],{"class":368},[240,9480,1224],{"class":254},[240,9482,9442],{"class":368},[240,9484,3042],{"class":254},[240,9486,9487,9489,9491,9493,9495,9497],{"class":242,"line":571},[240,9488,7079],{"class":490},[240,9490,262],{"class":254},[240,9492,3359],{"class":368},[240,9494,1224],{"class":254},[240,9496,3682],{"class":368},[240,9498,3042],{"class":254},[240,9500,9501,9504,9506,9509,9511,9513,9515,9517,9520],{"class":242,"line":583},[240,9502,9503],{"class":490},"    message",[240,9505,262],{"class":254},[240,9507,9508],{"class":254}," `${",[240,9510,516],{"class":368},[240,9512,1224],{"class":254},[240,9514,3682],{"class":368},[240,9516,2214],{"class":254},[240,9518,9519],{"class":374}," joined the room",[240,9521,9522],{"class":254},"`\n",[240,9524,9525],{"class":242,"line":608},[240,9526,5862],{"class":254},[240,9528,9529],{"class":242,"line":629},[240,9530,420],{"class":254},[231,9532,9535],{"className":233,"code":9533,"filename":9534,"language":235,"meta":236,"style":236},"@Message({ event: 'document-edit' })\n@BroadcastOthers('edit-applied')\nhandleEdit(data: { \n  documentId: string;\n  edit: any;\n  userId: string;\n}) {\n  \u002F\u002F Apply edit\n  this.applyEdit(data.documentId, data.edit);\n  \n  \u002F\u002F Notify others (editor already has it locally)\n  return {\n    documentId: data.documentId,\n    edit: data.edit,\n    userId: data.userId\n  };\n}\n","Real-Time Collaboration",[208,9536,9537,9562,9579,9590,9598,9603,9607,9615,9620,9648,9652,9657,9663,9677,9692,9705,9709],{"__ignoreMap":236},[240,9538,9539,9541,9543,9545,9547,9549,9551,9553,9556,9558,9560],{"class":242,"line":243},[240,9540,362],{"class":254},[240,9542,482],{"class":250},[240,9544,255],{"class":368},[240,9546,487],{"class":254},[240,9548,491],{"class":490},[240,9550,262],{"class":254},[240,9552,496],{"class":254},[240,9554,9555],{"class":374},"document-edit",[240,9557,371],{"class":254},[240,9559,504],{"class":254},[240,9561,380],{"class":368},[240,9563,9564,9566,9568,9570,9572,9575,9577],{"class":242,"line":383},[240,9565,362],{"class":254},[240,9567,8391],{"class":250},[240,9569,255],{"class":368},[240,9571,371],{"class":254},[240,9573,9574],{"class":374},"edit-applied",[240,9576,371],{"class":254},[240,9578,380],{"class":368},[240,9580,9581,9584,9586,9588],{"class":242,"line":394},[240,9582,9583],{"class":250},"handleEdit",[240,9585,5762],{"class":368},[240,9587,487],{"class":254},[240,9589,2119],{"class":368},[240,9591,9592,9594,9596],{"class":242,"line":410},[240,9593,7630],{"class":490},[240,9595,262],{"class":254},[240,9597,7635],{"class":368},[240,9599,9600],{"class":242,"line":417},[240,9601,9602],{"class":368},"  edit: any;\n",[240,9604,9605],{"class":242,"line":423},[240,9606,7645],{"class":368},[240,9608,9609,9611,9613],{"class":242,"line":429},[240,9610,2214],{"class":254},[240,9612,1256],{"class":368},[240,9614,1259],{"class":254},[240,9616,9617],{"class":242,"line":544},[240,9618,9619],{"class":413},"  \u002F\u002F Apply edit\n",[240,9621,9622,9624,9627,9629,9631,9633,9635,9637,9639,9641,9644,9646],{"class":242,"line":562},[240,9623,9430],{"class":254},[240,9625,9626],{"class":250},"applyEdit",[240,9628,255],{"class":490},[240,9630,516],{"class":368},[240,9632,1224],{"class":254},[240,9634,7673],{"class":368},[240,9636,977],{"class":254},[240,9638,3359],{"class":368},[240,9640,1224],{"class":254},[240,9642,9643],{"class":368},"edit",[240,9645,524],{"class":490},[240,9647,1235],{"class":254},[240,9649,9650],{"class":242,"line":571},[240,9651,1139],{"class":490},[240,9653,9654],{"class":242,"line":583},[240,9655,9656],{"class":413},"  \u002F\u002F Notify others (editor already has it locally)\n",[240,9658,9659,9661],{"class":242,"line":608},[240,9660,4898],{"class":397},[240,9662,407],{"class":254},[240,9664,9665,9667,9669,9671,9673,9675],{"class":242,"line":629},[240,9666,7664],{"class":490},[240,9668,262],{"class":254},[240,9670,3359],{"class":368},[240,9672,1224],{"class":254},[240,9674,7673],{"class":368},[240,9676,3042],{"class":254},[240,9678,9679,9682,9684,9686,9688,9690],{"class":242,"line":634},[240,9680,9681],{"class":490},"    edit",[240,9683,262],{"class":254},[240,9685,3359],{"class":368},[240,9687,1224],{"class":254},[240,9689,9643],{"class":368},[240,9691,3042],{"class":254},[240,9693,9694,9696,9698,9700,9702],{"class":242,"line":639},[240,9695,7094],{"class":490},[240,9697,262],{"class":254},[240,9699,3359],{"class":368},[240,9701,1224],{"class":254},[240,9703,9704],{"class":368},"userId\n",[240,9706,9707],{"class":242,"line":645},[240,9708,5862],{"class":254},[240,9710,9711],{"class":242,"line":651},[240,9712,420],{"class":254},[908,9714],{},[213,9716,9718],{"id":9717},"decorator-combinations","Decorator Combinations",[204,9720,9721],{},"You can combine decorators to create powerful patterns:",[226,9723,9725,9727,9728],{"id":9724},"message-emit",[208,9726,2888],{}," + ",[208,9729,3215],{},[204,9731,9732],{},"Send response back to sender only:",[231,9734,9736],{"className":233,"code":9735,"language":235,"meta":236,"style":236},"@Message({ event: 'request' })\n@Emit('response')\nhandleRequest(data: any) {\n  return { result: 'processed' };\n}\n",[208,9737,9738,9762,9778,9788,9807],{"__ignoreMap":236},[240,9739,9740,9742,9744,9746,9748,9750,9752,9754,9756,9758,9760],{"class":242,"line":243},[240,9741,362],{"class":254},[240,9743,482],{"class":250},[240,9745,255],{"class":368},[240,9747,487],{"class":254},[240,9749,491],{"class":490},[240,9751,262],{"class":254},[240,9753,496],{"class":254},[240,9755,1043],{"class":374},[240,9757,371],{"class":254},[240,9759,504],{"class":254},[240,9761,380],{"class":368},[240,9763,9764,9766,9768,9770,9772,9774,9776],{"class":242,"line":383},[240,9765,362],{"class":254},[240,9767,5637],{"class":250},[240,9769,255],{"class":368},[240,9771,371],{"class":254},[240,9773,6003],{"class":374},[240,9775,371],{"class":254},[240,9777,380],{"class":368},[240,9779,9780,9783,9786],{"class":242,"line":394},[240,9781,9782],{"class":250},"handleRequest",[240,9784,9785],{"class":368},"(data: any) ",[240,9787,1259],{"class":254},[240,9789,9790,9792,9794,9796,9798,9800,9803,9805],{"class":242,"line":410},[240,9791,4898],{"class":397},[240,9793,527],{"class":254},[240,9795,5334],{"class":490},[240,9797,262],{"class":254},[240,9799,496],{"class":254},[240,9801,9802],{"class":374},"processed",[240,9804,371],{"class":254},[240,9806,4910],{"class":254},[240,9808,9809],{"class":242,"line":417},[240,9810,420],{"class":254},[226,9812,9814,9727,9816],{"id":9813},"message-broadcast",[208,9815,2888],{},[208,9817,3219],{},[204,9819,9820],{},"Notify everyone including sender:",[231,9822,9824],{"className":233,"code":9823,"language":235,"meta":236,"style":236},"@Message({ event: 'update' })\n@Broadcast('updated')\nhandleUpdate(data: any) {\n  return { updated: true };\n}\n",[208,9825,9826,9850,9867,9875,9890],{"__ignoreMap":236},[240,9827,9828,9830,9832,9834,9836,9838,9840,9842,9844,9846,9848],{"class":242,"line":243},[240,9829,362],{"class":254},[240,9831,482],{"class":250},[240,9833,255],{"class":368},[240,9835,487],{"class":254},[240,9837,491],{"class":490},[240,9839,262],{"class":254},[240,9841,496],{"class":254},[240,9843,8067],{"class":374},[240,9845,371],{"class":254},[240,9847,504],{"class":254},[240,9849,380],{"class":368},[240,9851,9852,9854,9856,9858,9860,9863,9865],{"class":242,"line":383},[240,9853,362],{"class":254},[240,9855,6850],{"class":250},[240,9857,255],{"class":368},[240,9859,371],{"class":254},[240,9861,9862],{"class":374},"updated",[240,9864,371],{"class":254},[240,9866,380],{"class":368},[240,9868,9869,9871,9873],{"class":242,"line":394},[240,9870,8080],{"class":250},[240,9872,9785],{"class":368},[240,9874,1259],{"class":254},[240,9876,9877,9879,9881,9884,9886,9888],{"class":242,"line":410},[240,9878,4898],{"class":397},[240,9880,527],{"class":254},[240,9882,9883],{"class":490}," updated",[240,9885,262],{"class":254},[240,9887,1291],{"class":1267},[240,9889,4910],{"class":254},[240,9891,9892],{"class":242,"line":417},[240,9893,420],{"class":254},[226,9895,9897,9727,9899],{"id":9896},"message-broadcastothers",[208,9898,2888],{},[208,9900,8223],{},[204,9902,9903],{},"Notify everyone except sender:",[231,9905,9907],{"className":233,"code":9906,"language":235,"meta":236,"style":236},"@Message({ event: 'action' })\n@BroadcastOthers('notification')\nhandleAction(data: any) {\n  return { action: 'completed' };\n}\n",[208,9908,9909,9933,9950,9958,9977],{"__ignoreMap":236},[240,9910,9911,9913,9915,9917,9919,9921,9923,9925,9927,9929,9931],{"class":242,"line":243},[240,9912,362],{"class":254},[240,9914,482],{"class":250},[240,9916,255],{"class":368},[240,9918,487],{"class":254},[240,9920,491],{"class":490},[240,9922,262],{"class":254},[240,9924,496],{"class":254},[240,9926,4048],{"class":374},[240,9928,371],{"class":254},[240,9930,504],{"class":254},[240,9932,380],{"class":368},[240,9934,9935,9937,9939,9941,9943,9946,9948],{"class":242,"line":383},[240,9936,362],{"class":254},[240,9938,8391],{"class":250},[240,9940,255],{"class":368},[240,9942,371],{"class":254},[240,9944,9945],{"class":374},"notification",[240,9947,371],{"class":254},[240,9949,380],{"class":368},[240,9951,9952,9954,9956],{"class":242,"line":394},[240,9953,4059],{"class":250},[240,9955,9785],{"class":368},[240,9957,1259],{"class":254},[240,9959,9960,9962,9964,9966,9968,9970,9973,9975],{"class":242,"line":410},[240,9961,4898],{"class":397},[240,9963,527],{"class":254},[240,9965,7241],{"class":490},[240,9967,262],{"class":254},[240,9969,496],{"class":254},[240,9971,9972],{"class":374},"completed",[240,9974,371],{"class":254},[240,9976,4910],{"class":254},[240,9978,9979],{"class":242,"line":417},[240,9980,420],{"class":254},[226,9982,9984,9727,9986,9727,9988],{"id":9983},"message-emit-broadcastothers",[208,9985,2888],{},[208,9987,3215],{},[208,9989,8223],{},[204,9991,9992],{},"Send different messages to sender and others:",[231,9994,9996],{"className":233,"code":9995,"language":235,"meta":236,"style":236},"@Message({ event: 'post' })\n@Emit('post-confirmed')\n@BroadcastOthers('new-post')\nhandlePost(data: PostDto) {\n  return data;\n}\n\u002F\u002F Sender: { event: 'post-confirmed', data: {...} }\n\u002F\u002F Others: { event: 'new-post', data: {...} }\n",[208,9997,9998,10023,10040,10056,10065,10073,10077,10082],{"__ignoreMap":236},[240,9999,10000,10002,10004,10006,10008,10010,10012,10014,10017,10019,10021],{"class":242,"line":243},[240,10001,362],{"class":254},[240,10003,482],{"class":250},[240,10005,255],{"class":368},[240,10007,487],{"class":254},[240,10009,491],{"class":490},[240,10011,262],{"class":254},[240,10013,496],{"class":254},[240,10015,10016],{"class":374},"post",[240,10018,371],{"class":254},[240,10020,504],{"class":254},[240,10022,380],{"class":368},[240,10024,10025,10027,10029,10031,10033,10036,10038],{"class":242,"line":383},[240,10026,362],{"class":254},[240,10028,5637],{"class":250},[240,10030,255],{"class":368},[240,10032,371],{"class":254},[240,10034,10035],{"class":374},"post-confirmed",[240,10037,371],{"class":254},[240,10039,380],{"class":368},[240,10041,10042,10044,10046,10048,10050,10052,10054],{"class":242,"line":394},[240,10043,362],{"class":254},[240,10045,8391],{"class":250},[240,10047,255],{"class":368},[240,10049,371],{"class":254},[240,10051,7941],{"class":374},[240,10053,371],{"class":254},[240,10055,380],{"class":368},[240,10057,10058,10060,10063],{"class":242,"line":410},[240,10059,7952],{"class":250},[240,10061,10062],{"class":368},"(data: PostDto) ",[240,10064,1259],{"class":254},[240,10066,10067,10069,10071],{"class":242,"line":417},[240,10068,4898],{"class":397},[240,10070,3359],{"class":368},[240,10072,1235],{"class":254},[240,10074,10075],{"class":242,"line":423},[240,10076,420],{"class":254},[240,10078,10079],{"class":242,"line":429},[240,10080,10081],{"class":413},"\u002F\u002F Sender: { event: 'post-confirmed', data: {...} }\n",[240,10083,10084],{"class":242,"line":544},[240,10085,10086],{"class":413},"\u002F\u002F Others: { event: 'new-post', data: {...} }\n",[226,10088,10090],{"id":10089},"multiple-handlers-same-namespace","Multiple Handlers Same Namespace",[231,10092,10094],{"className":233,"code":10093,"language":235,"meta":236,"style":236},"@Namespace('\u002Fapp')\n@Controller()\nexport class AppGateway {\n  \n  @Message({ event: 'ping' })\n  @Emit('pong')\n  handlePing() {\n    return { time: Date.now() };\n  }\n  \n  @Message({ event: 'broadcast' })\n  @Broadcast('message')\n  handleBroadcast(data: any) {\n    return data;\n  }\n  \n  @Message({ event: 'notify-others' })\n  @BroadcastOthers('notification')\n  handleNotify(data: any) {\n    return data;\n  }\n}\n",[208,10095,10096,10113,10121,10132,10136,10160,10176,10184,10205,10209,10213,10237,10253,10270,10278,10282,10286,10311,10327,10344,10352,10356],{"__ignoreMap":236},[240,10097,10098,10100,10102,10104,10106,10109,10111],{"class":242,"line":243},[240,10099,362],{"class":254},[240,10101,365],{"class":250},[240,10103,255],{"class":368},[240,10105,371],{"class":254},[240,10107,10108],{"class":374},"\u002Fapp",[240,10110,371],{"class":254},[240,10112,380],{"class":368},[240,10114,10115,10117,10119],{"class":242,"line":383},[240,10116,362],{"class":254},[240,10118,388],{"class":250},[240,10120,391],{"class":368},[240,10122,10123,10125,10127,10130],{"class":242,"line":394},[240,10124,398],{"class":397},[240,10126,401],{"class":246},[240,10128,10129],{"class":265}," AppGateway",[240,10131,407],{"class":254},[240,10133,10134],{"class":242,"line":410},[240,10135,1139],{"class":368},[240,10137,10138,10140,10142,10144,10146,10148,10150,10152,10154,10156,10158],{"class":242,"line":417},[240,10139,479],{"class":254},[240,10141,482],{"class":250},[240,10143,255],{"class":368},[240,10145,487],{"class":254},[240,10147,491],{"class":490},[240,10149,262],{"class":254},[240,10151,496],{"class":254},[240,10153,5624],{"class":374},[240,10155,371],{"class":254},[240,10157,504],{"class":254},[240,10159,380],{"class":368},[240,10161,10162,10164,10166,10168,10170,10172,10174],{"class":242,"line":423},[240,10163,479],{"class":254},[240,10165,5637],{"class":250},[240,10167,255],{"class":368},[240,10169,371],{"class":254},[240,10171,5644],{"class":374},[240,10173,371],{"class":254},[240,10175,380],{"class":368},[240,10177,10178,10180,10182],{"class":242,"line":429},[240,10179,5653],{"class":490},[240,10181,798],{"class":254},[240,10183,407],{"class":254},[240,10185,10186,10188,10190,10193,10195,10197,10199,10201,10203],{"class":242,"line":544},[240,10187,1288],{"class":397},[240,10189,527],{"class":254},[240,10191,10192],{"class":490}," time",[240,10194,262],{"class":254},[240,10196,5671],{"class":368},[240,10198,1224],{"class":254},[240,10200,5676],{"class":250},[240,10202,5679],{"class":490},[240,10204,5682],{"class":254},[240,10206,10207],{"class":242,"line":562},[240,10208,1301],{"class":254},[240,10210,10211],{"class":242,"line":571},[240,10212,1139],{"class":368},[240,10214,10215,10217,10219,10221,10223,10225,10227,10229,10231,10233,10235],{"class":242,"line":583},[240,10216,479],{"class":254},[240,10218,482],{"class":250},[240,10220,255],{"class":368},[240,10222,487],{"class":254},[240,10224,491],{"class":490},[240,10226,262],{"class":254},[240,10228,496],{"class":254},[240,10230,6676],{"class":374},[240,10232,371],{"class":254},[240,10234,504],{"class":254},[240,10236,380],{"class":368},[240,10238,10239,10241,10243,10245,10247,10249,10251],{"class":242,"line":608},[240,10240,479],{"class":254},[240,10242,6850],{"class":250},[240,10244,255],{"class":368},[240,10246,371],{"class":254},[240,10248,499],{"class":374},[240,10250,371],{"class":254},[240,10252,380],{"class":368},[240,10254,10255,10258,10260,10262,10264,10266,10268],{"class":242,"line":629},[240,10256,10257],{"class":490},"  handleBroadcast",[240,10259,255],{"class":254},[240,10261,516],{"class":258},[240,10263,262],{"class":254},[240,10265,521],{"class":265},[240,10267,524],{"class":254},[240,10269,407],{"class":254},[240,10271,10272,10274,10276],{"class":242,"line":634},[240,10273,1288],{"class":397},[240,10275,3359],{"class":368},[240,10277,1235],{"class":254},[240,10279,10280],{"class":242,"line":639},[240,10281,1301],{"class":254},[240,10283,10284],{"class":242,"line":645},[240,10285,1139],{"class":368},[240,10287,10288,10290,10292,10294,10296,10298,10300,10302,10305,10307,10309],{"class":242,"line":651},[240,10289,479],{"class":254},[240,10291,482],{"class":250},[240,10293,255],{"class":368},[240,10295,487],{"class":254},[240,10297,491],{"class":490},[240,10299,262],{"class":254},[240,10301,496],{"class":254},[240,10303,10304],{"class":374},"notify-others",[240,10306,371],{"class":254},[240,10308,504],{"class":254},[240,10310,380],{"class":368},[240,10312,10313,10315,10317,10319,10321,10323,10325],{"class":242,"line":1304},[240,10314,479],{"class":254},[240,10316,8391],{"class":250},[240,10318,255],{"class":368},[240,10320,371],{"class":254},[240,10322,9945],{"class":374},[240,10324,371],{"class":254},[240,10326,380],{"class":368},[240,10328,10329,10332,10334,10336,10338,10340,10342],{"class":242,"line":1309},[240,10330,10331],{"class":490},"  handleNotify",[240,10333,255],{"class":254},[240,10335,516],{"class":258},[240,10337,262],{"class":254},[240,10339,521],{"class":265},[240,10341,524],{"class":254},[240,10343,407],{"class":254},[240,10345,10346,10348,10350],{"class":242,"line":1314},[240,10347,1288],{"class":397},[240,10349,3359],{"class":368},[240,10351,1235],{"class":254},[240,10353,10354],{"class":242,"line":1575},[240,10355,1301],{"class":254},[240,10357,10358],{"class":242,"line":1593},[240,10359,420],{"class":254},[204,10361,10362],{},[6685,10363,10364],{},"Event Naming",[231,10366,10368],{"className":233,"code":10367,"language":235,"meta":236,"style":236},"\u002F\u002F ✅ Good - Descriptive, namespaced\n@Message({ event: 'chat:send-message' })\n@Message({ event: 'game:player-move' })\n@Message({ event: 'document:edit' })\n\n\u002F\u002F ❌ Bad - Generic, unclear\n@Message({ event: 'message' })\n@Message({ event: 'update' })\n@Message({ event: 'data' })\n",[208,10369,10370,10375,10400,10425,10450,10454,10459,10483,10507],{"__ignoreMap":236},[240,10371,10372],{"class":242,"line":243},[240,10373,10374],{"class":413},"\u002F\u002F ✅ Good - Descriptive, namespaced\n",[240,10376,10377,10379,10381,10383,10385,10387,10389,10391,10394,10396,10398],{"class":242,"line":383},[240,10378,362],{"class":254},[240,10380,482],{"class":250},[240,10382,255],{"class":368},[240,10384,487],{"class":254},[240,10386,491],{"class":490},[240,10388,262],{"class":254},[240,10390,496],{"class":254},[240,10392,10393],{"class":374},"chat:send-message",[240,10395,371],{"class":254},[240,10397,504],{"class":254},[240,10399,380],{"class":368},[240,10401,10402,10404,10406,10408,10410,10412,10414,10416,10419,10421,10423],{"class":242,"line":394},[240,10403,362],{"class":254},[240,10405,482],{"class":250},[240,10407,255],{"class":368},[240,10409,487],{"class":254},[240,10411,491],{"class":490},[240,10413,262],{"class":254},[240,10415,496],{"class":254},[240,10417,10418],{"class":374},"game:player-move",[240,10420,371],{"class":254},[240,10422,504],{"class":254},[240,10424,380],{"class":368},[240,10426,10427,10429,10431,10433,10435,10437,10439,10441,10444,10446,10448],{"class":242,"line":410},[240,10428,362],{"class":254},[240,10430,482],{"class":250},[240,10432,255],{"class":368},[240,10434,487],{"class":254},[240,10436,491],{"class":490},[240,10438,262],{"class":254},[240,10440,496],{"class":254},[240,10442,10443],{"class":374},"document:edit",[240,10445,371],{"class":254},[240,10447,504],{"class":254},[240,10449,380],{"class":368},[240,10451,10452],{"class":242,"line":417},[240,10453,426],{"emptyLinePlaceholder":56},[240,10455,10456],{"class":242,"line":423},[240,10457,10458],{"class":413},"\u002F\u002F ❌ Bad - Generic, unclear\n",[240,10460,10461,10463,10465,10467,10469,10471,10473,10475,10477,10479,10481],{"class":242,"line":429},[240,10462,362],{"class":254},[240,10464,482],{"class":250},[240,10466,255],{"class":368},[240,10468,487],{"class":254},[240,10470,491],{"class":490},[240,10472,262],{"class":254},[240,10474,496],{"class":254},[240,10476,499],{"class":374},[240,10478,371],{"class":254},[240,10480,504],{"class":254},[240,10482,380],{"class":368},[240,10484,10485,10487,10489,10491,10493,10495,10497,10499,10501,10503,10505],{"class":242,"line":544},[240,10486,362],{"class":254},[240,10488,482],{"class":250},[240,10490,255],{"class":368},[240,10492,487],{"class":254},[240,10494,491],{"class":490},[240,10496,262],{"class":254},[240,10498,496],{"class":254},[240,10500,8067],{"class":374},[240,10502,371],{"class":254},[240,10504,504],{"class":254},[240,10506,380],{"class":368},[240,10508,10509,10511,10513,10515,10517,10519,10521,10523,10525,10527,10529],{"class":242,"line":562},[240,10510,362],{"class":254},[240,10512,482],{"class":250},[240,10514,255],{"class":368},[240,10516,487],{"class":254},[240,10518,491],{"class":490},[240,10520,262],{"class":254},[240,10522,496],{"class":254},[240,10524,516],{"class":374},[240,10526,371],{"class":254},[240,10528,504],{"class":254},[240,10530,380],{"class":368},[204,10532,10533],{},[6685,10534,10535],{},"Type Safety",[231,10537,10539],{"className":233,"code":10538,"language":235,"meta":236,"style":236},"\u002F\u002F ✅ Good - Typed with schema\nconst Schema = z.object({ ... });\ntype Data = z.infer\u003Ctypeof Schema>;\n\n@Message({ \n  event: 'action',\n  validationSchema: Schema \n})\nhandleAction(data: Data, peer: Peer) { ... }\n\n\u002F\u002F ❌ Bad - Untyped\n@Message({ event: 'action' })\nhandleAction(data: any, peer: Peer) { ... }\n",[208,10540,10541,10546,10573,10595,10599,10611,10625,10634,10640,10657,10661,10666,10690],{"__ignoreMap":236},[240,10542,10543],{"class":242,"line":243},[240,10544,10545],{"class":413},"\u002F\u002F ✅ Good - Typed with schema\n",[240,10547,10548,10550,10553,10555,10557,10559,10561,10563,10565,10567,10569,10571],{"class":242,"line":383},[240,10549,3439],{"class":246},[240,10551,10552],{"class":368}," Schema ",[240,10554,2313],{"class":254},[240,10556,3416],{"class":368},[240,10558,1224],{"class":254},[240,10560,3451],{"class":250},[240,10562,255],{"class":368},[240,10564,487],{"class":254},[240,10566,530],{"class":254},[240,10568,504],{"class":254},[240,10570,524],{"class":368},[240,10572,1235],{"class":254},[240,10574,10575,10577,10580,10582,10584,10586,10588,10590,10593],{"class":242,"line":394},[240,10576,3575],{"class":246},[240,10578,10579],{"class":265}," Data",[240,10581,1218],{"class":254},[240,10583,3416],{"class":265},[240,10585,1224],{"class":254},[240,10587,3587],{"class":265},[240,10589,3590],{"class":254},[240,10591,10592],{"class":368}," Schema",[240,10594,3596],{"class":254},[240,10596,10597],{"class":242,"line":410},[240,10598,426],{"emptyLinePlaceholder":56},[240,10600,10601,10603,10605,10607,10609],{"class":242,"line":417},[240,10602,362],{"class":254},[240,10604,482],{"class":250},[240,10606,255],{"class":368},[240,10608,487],{"class":254},[240,10610,2119],{"class":368},[240,10612,10613,10615,10617,10619,10621,10623],{"class":242,"line":423},[240,10614,2940],{"class":490},[240,10616,262],{"class":254},[240,10618,496],{"class":254},[240,10620,4048],{"class":374},[240,10622,371],{"class":254},[240,10624,3042],{"class":254},[240,10626,10627,10629,10631],{"class":242,"line":429},[240,10628,2951],{"class":490},[240,10630,262],{"class":254},[240,10632,10633],{"class":368}," Schema \n",[240,10635,10636,10638],{"class":242,"line":544},[240,10637,2214],{"class":254},[240,10639,380],{"class":368},[240,10641,10642,10644,10647,10649,10651,10653,10655],{"class":242,"line":562},[240,10643,4059],{"class":250},[240,10645,10646],{"class":368},"(data: Data",[240,10648,977],{"class":254},[240,10650,3654],{"class":368},[240,10652,487],{"class":254},[240,10654,530],{"class":254},[240,10656,533],{"class":254},[240,10658,10659],{"class":242,"line":571},[240,10660,426],{"emptyLinePlaceholder":56},[240,10662,10663],{"class":242,"line":583},[240,10664,10665],{"class":413},"\u002F\u002F ❌ Bad - Untyped\n",[240,10667,10668,10670,10672,10674,10676,10678,10680,10682,10684,10686,10688],{"class":242,"line":608},[240,10669,362],{"class":254},[240,10671,482],{"class":250},[240,10673,255],{"class":368},[240,10675,487],{"class":254},[240,10677,491],{"class":490},[240,10679,262],{"class":254},[240,10681,496],{"class":254},[240,10683,4048],{"class":374},[240,10685,371],{"class":254},[240,10687,504],{"class":254},[240,10689,380],{"class":368},[240,10691,10692,10694,10696,10698,10700,10702,10704],{"class":242,"line":629},[240,10693,4059],{"class":250},[240,10695,4062],{"class":368},[240,10697,977],{"class":254},[240,10699,3654],{"class":368},[240,10701,487],{"class":254},[240,10703,530],{"class":254},[240,10705,533],{"class":254},[204,10707,10708],{},[6685,10709,5278],{},[231,10711,10713],{"className":233,"code":10712,"language":235,"meta":236,"style":236},"\u002F\u002F ✅ Good - Graceful error handling\n@Message({ event: 'risky' })\nasync handleRisky(data: any) {\n  try {\n    return await this.process(data);\n  } catch (error) {\n    return { error: error.message };\n  }\n}\n\n\u002F\u002F ❌ Bad - Unhandled errors\n@Message({ event: 'risky' })\nasync handleRisky(data: any) {\n  return await this.process(data); \u002F\u002F May throw\n}\n",[208,10714,10715,10720,10745,10756,10762,10780,10794,10812,10816,10820,10824,10829,10853,10863,10884],{"__ignoreMap":236},[240,10716,10717],{"class":242,"line":243},[240,10718,10719],{"class":413},"\u002F\u002F ✅ Good - Graceful error handling\n",[240,10721,10722,10724,10726,10728,10730,10732,10734,10736,10739,10741,10743],{"class":242,"line":383},[240,10723,362],{"class":254},[240,10725,482],{"class":250},[240,10727,255],{"class":368},[240,10729,487],{"class":254},[240,10731,491],{"class":490},[240,10733,262],{"class":254},[240,10735,496],{"class":254},[240,10737,10738],{"class":374},"risky",[240,10740,371],{"class":254},[240,10742,504],{"class":254},[240,10744,380],{"class":368},[240,10746,10747,10749,10752,10754],{"class":242,"line":394},[240,10748,2266],{"class":368},[240,10750,10751],{"class":250},"handleRisky",[240,10753,9785],{"class":368},[240,10755,1259],{"class":254},[240,10757,10758,10760],{"class":242,"line":410},[240,10759,5325],{"class":397},[240,10761,407],{"class":254},[240,10763,10764,10766,10768,10770,10772,10774,10776,10778],{"class":242,"line":417},[240,10765,1288],{"class":397},[240,10767,1481],{"class":397},[240,10769,1484],{"class":254},[240,10771,8108],{"class":250},[240,10773,255],{"class":490},[240,10775,516],{"class":368},[240,10777,524],{"class":490},[240,10779,1235],{"class":254},[240,10781,10782,10784,10786,10788,10790,10792],{"class":242,"line":423},[240,10783,4222],{"class":254},[240,10785,1581],{"class":397},[240,10787,1248],{"class":490},[240,10789,1586],{"class":368},[240,10791,1256],{"class":490},[240,10793,1259],{"class":254},[240,10795,10796,10798,10800,10802,10804,10806,10808,10810],{"class":242,"line":429},[240,10797,1288],{"class":397},[240,10799,527],{"class":254},[240,10801,1614],{"class":490},[240,10803,262],{"class":254},[240,10805,1614],{"class":368},[240,10807,1224],{"class":254},[240,10809,499],{"class":368},[240,10811,4910],{"class":254},[240,10813,10814],{"class":242,"line":544},[240,10815,1301],{"class":254},[240,10817,10818],{"class":242,"line":562},[240,10819,420],{"class":254},[240,10821,10822],{"class":242,"line":571},[240,10823,426],{"emptyLinePlaceholder":56},[240,10825,10826],{"class":242,"line":583},[240,10827,10828],{"class":413},"\u002F\u002F ❌ Bad - Unhandled errors\n",[240,10830,10831,10833,10835,10837,10839,10841,10843,10845,10847,10849,10851],{"class":242,"line":608},[240,10832,362],{"class":254},[240,10834,482],{"class":250},[240,10836,255],{"class":368},[240,10838,487],{"class":254},[240,10840,491],{"class":490},[240,10842,262],{"class":254},[240,10844,496],{"class":254},[240,10846,10738],{"class":374},[240,10848,371],{"class":254},[240,10850,504],{"class":254},[240,10852,380],{"class":368},[240,10854,10855,10857,10859,10861],{"class":242,"line":629},[240,10856,2266],{"class":368},[240,10858,10751],{"class":250},[240,10860,9785],{"class":368},[240,10862,1259],{"class":254},[240,10864,10865,10867,10869,10871,10873,10875,10877,10879,10881],{"class":242,"line":634},[240,10866,4898],{"class":397},[240,10868,1481],{"class":397},[240,10870,1484],{"class":254},[240,10872,8108],{"class":250},[240,10874,255],{"class":490},[240,10876,516],{"class":368},[240,10878,524],{"class":490},[240,10880,1271],{"class":254},[240,10882,10883],{"class":413}," \u002F\u002F May throw\n",[240,10885,10886],{"class":242,"line":639},[240,10887,420],{"class":254},[204,10889,10890],{},[6685,10891,10892],{},"Single Responsibility",[231,10894,10896],{"className":233,"code":10895,"language":235,"meta":236,"style":236},"\u002F\u002F ✅ Good - One concern per handler\n@Message({ event: 'create-order' })\nasync createOrder(data: OrderDto) { ... }\n\n@Message({ event: 'cancel-order' })\nasync cancelOrder(data: { orderId: string }) { ... }\n\n\u002F\u002F ❌ Bad - Multiple concerns\n@Message({ event: 'order-action' })\nasync handleOrder(data: any) {\n  if (data.action === 'create') { ... }\n  else if (data.action === 'cancel') { ... }\n}\n",[208,10897,10898,10903,10927,10942,10946,10971,10999,11003,11008,11033,11044,11072,11104],{"__ignoreMap":236},[240,10899,10900],{"class":242,"line":243},[240,10901,10902],{"class":413},"\u002F\u002F ✅ Good - One concern per handler\n",[240,10904,10905,10907,10909,10911,10913,10915,10917,10919,10921,10923,10925],{"class":242,"line":383},[240,10906,362],{"class":254},[240,10908,482],{"class":250},[240,10910,255],{"class":368},[240,10912,487],{"class":254},[240,10914,491],{"class":490},[240,10916,262],{"class":254},[240,10918,496],{"class":254},[240,10920,6085],{"class":374},[240,10922,371],{"class":254},[240,10924,504],{"class":254},[240,10926,380],{"class":368},[240,10928,10929,10931,10933,10936,10938,10940],{"class":242,"line":394},[240,10930,2266],{"class":368},[240,10932,6115],{"class":250},[240,10934,10935],{"class":368},"(data: OrderDto) ",[240,10937,487],{"class":254},[240,10939,530],{"class":254},[240,10941,533],{"class":254},[240,10943,10944],{"class":242,"line":410},[240,10945,426],{"emptyLinePlaceholder":56},[240,10947,10948,10950,10952,10954,10956,10958,10960,10962,10965,10967,10969],{"class":242,"line":417},[240,10949,362],{"class":254},[240,10951,482],{"class":250},[240,10953,255],{"class":368},[240,10955,487],{"class":254},[240,10957,491],{"class":490},[240,10959,262],{"class":254},[240,10961,496],{"class":254},[240,10963,10964],{"class":374},"cancel-order",[240,10966,371],{"class":254},[240,10968,504],{"class":254},[240,10970,380],{"class":368},[240,10972,10973,10975,10978,10980,10982,10985,10987,10989,10991,10993,10995,10997],{"class":242,"line":423},[240,10974,2266],{"class":368},[240,10976,10977],{"class":250},"cancelOrder",[240,10979,5762],{"class":368},[240,10981,487],{"class":254},[240,10983,10984],{"class":490}," orderId",[240,10986,262],{"class":254},[240,10988,5771],{"class":368},[240,10990,2214],{"class":254},[240,10992,1256],{"class":368},[240,10994,487],{"class":254},[240,10996,530],{"class":254},[240,10998,533],{"class":254},[240,11000,11001],{"class":242,"line":429},[240,11002,426],{"emptyLinePlaceholder":56},[240,11004,11005],{"class":242,"line":544},[240,11006,11007],{"class":413},"\u002F\u002F ❌ Bad - Multiple concerns\n",[240,11009,11010,11012,11014,11016,11018,11020,11022,11024,11027,11029,11031],{"class":242,"line":562},[240,11011,362],{"class":254},[240,11013,482],{"class":250},[240,11015,255],{"class":368},[240,11017,487],{"class":254},[240,11019,491],{"class":490},[240,11021,262],{"class":254},[240,11023,496],{"class":254},[240,11025,11026],{"class":374},"order-action",[240,11028,371],{"class":254},[240,11030,504],{"class":254},[240,11032,380],{"class":368},[240,11034,11035,11037,11040,11042],{"class":242,"line":571},[240,11036,2266],{"class":368},[240,11038,11039],{"class":250},"handleOrder",[240,11041,9785],{"class":368},[240,11043,1259],{"class":254},[240,11045,11046,11048,11050,11052,11054,11056,11058,11060,11062,11064,11066,11068,11070],{"class":242,"line":583},[240,11047,2372],{"class":397},[240,11049,1248],{"class":490},[240,11051,516],{"class":368},[240,11053,1224],{"class":254},[240,11055,4048],{"class":368},[240,11057,6322],{"class":254},[240,11059,496],{"class":254},[240,11061,6145],{"class":374},[240,11063,371],{"class":254},[240,11065,1256],{"class":490},[240,11067,487],{"class":254},[240,11069,530],{"class":254},[240,11071,533],{"class":254},[240,11073,11074,11077,11079,11081,11083,11085,11087,11089,11091,11094,11096,11098,11100,11102],{"class":242,"line":608},[240,11075,11076],{"class":397},"  else",[240,11078,6358],{"class":397},[240,11080,1248],{"class":490},[240,11082,516],{"class":368},[240,11084,1224],{"class":254},[240,11086,4048],{"class":368},[240,11088,6322],{"class":254},[240,11090,496],{"class":254},[240,11092,11093],{"class":374},"cancel",[240,11095,371],{"class":254},[240,11097,1256],{"class":490},[240,11099,487],{"class":254},[240,11101,530],{"class":254},[240,11103,533],{"class":254},[240,11105,11106],{"class":242,"line":629},[240,11107,420],{"class":254},[11109,11110,11111],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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":236,"searchDepth":243,"depth":383,"links":11113},[11114,11122,11131,11141,11148,11156,11164],{"id":215,"depth":383,"text":218,"children":11115},[11116,11117,11118,11119,11120,11121],{"id":228,"depth":394,"text":229},{"id":275,"depth":394,"text":276},{"id":322,"depth":394,"text":323},{"id":348,"depth":394,"text":22},{"id":717,"depth":394,"text":718},{"id":735,"depth":394,"text":736},{"id":912,"depth":383,"text":915,"children":11123},[11124,11125,11126,11127,11128,11129,11130],{"id":923,"depth":394,"text":229},{"id":944,"depth":394,"text":276},{"id":950,"depth":394,"text":951},{"id":1054,"depth":394,"text":323},{"id":1091,"depth":394,"text":22},{"id":2480,"depth":394,"text":2481},{"id":2532,"depth":394,"text":2533},{"id":499,"depth":383,"text":2888,"children":11132},[11133,11134,11135,11136,11137,11138,11139,11140],{"id":2896,"depth":394,"text":229},{"id":2971,"depth":394,"text":276},{"id":3023,"depth":394,"text":951},{"id":3107,"depth":394,"text":3108},{"id":3194,"depth":394,"text":323},{"id":3226,"depth":394,"text":22},{"id":4917,"depth":394,"text":4918},{"id":5018,"depth":394,"text":2533},{"id":5462,"depth":383,"text":3215,"children":11142},[11143,11144,11145,11146,11147],{"id":5472,"depth":394,"text":229},{"id":5499,"depth":394,"text":276},{"id":5533,"depth":394,"text":323},{"id":5559,"depth":394,"text":22},{"id":6428,"depth":394,"text":6429},{"id":6676,"depth":383,"text":3219,"children":11149},[11150,11151,11152,11153,11154,11155],{"id":6691,"depth":394,"text":229},{"id":6718,"depth":394,"text":276},{"id":6752,"depth":394,"text":323},{"id":6772,"depth":394,"text":22},{"id":7747,"depth":394,"text":7748},{"id":7878,"depth":394,"text":2533},{"id":8220,"depth":383,"text":8223,"children":11157},[11158,11159,11160,11161,11162,11163],{"id":8233,"depth":394,"text":229},{"id":8260,"depth":394,"text":276},{"id":8293,"depth":394,"text":323},{"id":8313,"depth":394,"text":22},{"id":9204,"depth":394,"text":9205},{"id":9348,"depth":394,"text":2533},{"id":9717,"depth":383,"text":9718,"children":11165},[11166,11168,11170,11172,11174],{"id":9724,"depth":394,"text":11167},"@Message + @Emit",{"id":9813,"depth":394,"text":11169},"@Message + @Broadcast",{"id":9896,"depth":394,"text":11171},"@Message + @BroadcastOthers",{"id":9983,"depth":394,"text":11173},"@Message + @Emit + @BroadcastOthers",{"id":10089,"depth":394,"text":10090},"Complete API reference for all WebSocket decorators","md",null,{},{"title":90,"description":11175},"L22fo3Uh0r-9wLTaiw0BAIYb2BW94opvYJgvsB7eu14",[11182,11184],{"title":66,"path":129,"stem":130,"description":11183,"children":-1},"Real-time bidirectional communication with decorator-based API",{"title":135,"path":136,"stem":137,"description":11185,"children":-1},"Expose AI tools with Model Context Protocol",1775552782009]