sonamu 0.9.9 → 0.9.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/ai/agents/agent.d.ts.map +1 -1
  2. package/dist/ai/agents/agent.js +4 -2
  3. package/dist/ai/providers/rtzr/api.d.ts +1 -1
  4. package/dist/api/decorators.d.ts +0 -1
  5. package/dist/api/decorators.d.ts.map +1 -1
  6. package/dist/api/decorators.js +8 -6
  7. package/dist/api/sonamu.d.ts.map +1 -1
  8. package/dist/api/sonamu.js +123 -12
  9. package/dist/api/websocket-helpers.d.ts +1 -3
  10. package/dist/api/websocket-helpers.d.ts.map +1 -1
  11. package/dist/api/websocket-helpers.js +2 -15
  12. package/dist/stream/index.d.ts +3 -0
  13. package/dist/stream/index.d.ts.map +1 -1
  14. package/dist/stream/index.js +8 -2
  15. package/dist/stream/ws-core.d.ts +1 -0
  16. package/dist/stream/ws-core.d.ts.map +1 -1
  17. package/dist/stream/ws-delivery.d.ts +8 -0
  18. package/dist/stream/ws-delivery.d.ts.map +1 -1
  19. package/dist/stream/ws-delivery.js +160 -14
  20. package/dist/stream/ws-local-connection-store.d.ts +2 -0
  21. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  22. package/dist/stream/ws-local-connection-store.js +21 -1
  23. package/dist/stream/ws-registry.d.ts +6 -2
  24. package/dist/stream/ws-registry.d.ts.map +1 -1
  25. package/dist/stream/ws-registry.js +170 -6
  26. package/dist/stream/ws-telemetry-memory.d.ts +28 -0
  27. package/dist/stream/ws-telemetry-memory.d.ts.map +1 -0
  28. package/dist/stream/ws-telemetry-memory.js +180 -0
  29. package/dist/stream/ws-telemetry-trace.d.ts +12 -0
  30. package/dist/stream/ws-telemetry-trace.d.ts.map +1 -0
  31. package/dist/stream/ws-telemetry-trace.js +41 -0
  32. package/dist/stream/ws-telemetry.d.ts +509 -0
  33. package/dist/stream/ws-telemetry.d.ts.map +1 -0
  34. package/dist/stream/ws-telemetry.js +931 -0
  35. package/dist/stream/ws.d.ts +10 -3
  36. package/dist/stream/ws.d.ts.map +1 -1
  37. package/dist/stream/ws.js +306 -27
  38. package/dist/syncer/file-patterns.js +1 -1
  39. package/dist/syncer/syncer.d.ts +1 -1
  40. package/dist/syncer/syncer.d.ts.map +1 -1
  41. package/dist/syncer/syncer.js +7 -4
  42. package/dist/template/template.d.ts +1 -2
  43. package/dist/template/template.d.ts.map +1 -1
  44. package/dist/template/template.js +3 -4
  45. package/dist/template/zod-converter.d.ts +2 -2
  46. package/dist/testing/dev-vitest-manager.d.ts +1 -1
  47. package/dist/testing/dev-vitest-manager.js +2 -2
  48. package/dist/types/types.d.ts +11 -5
  49. package/dist/types/types.d.ts.map +1 -1
  50. package/dist/types/types.js +2 -2
  51. package/dist/utils/class-name.d.ts +6 -0
  52. package/dist/utils/class-name.d.ts.map +1 -0
  53. package/dist/utils/class-name.js +19 -0
  54. package/package.json +4 -4
  55. package/src/ai/agents/agent.ts +2 -1
  56. package/src/api/__tests__/sonamu.websocket.test.ts +84 -10
  57. package/src/api/decorators.ts +6 -6
  58. package/src/api/sonamu.ts +142 -7
  59. package/src/api/websocket-helpers.ts +2 -28
  60. package/src/shared/app.shared.ts.txt +8 -7
  61. package/src/shared/web.shared.ts.txt +8 -7
  62. package/src/skills/sonamu/testing-devrunner.md +1 -1
  63. package/src/stream/__tests__/ws-telemetry.test.ts +821 -0
  64. package/src/stream/__tests__/ws.test.ts +362 -2
  65. package/src/stream/index.ts +3 -0
  66. package/src/stream/ws-core.ts +2 -0
  67. package/src/stream/ws-delivery.ts +161 -19
  68. package/src/stream/ws-local-connection-store.ts +33 -0
  69. package/src/stream/ws-registry.ts +186 -5
  70. package/src/stream/ws-telemetry-memory.ts +246 -0
  71. package/src/stream/ws-telemetry-trace.ts +52 -0
  72. package/src/stream/ws-telemetry.ts +1772 -0
  73. package/src/stream/ws.ts +332 -34
  74. package/src/syncer/file-patterns.ts +2 -2
  75. package/src/syncer/syncer.ts +8 -4
  76. package/src/template/__tests__/services.template.websocket.test.ts +2 -0
  77. package/src/template/template.ts +2 -3
  78. package/src/testing/dev-vitest-manager.ts +1 -1
  79. package/src/types/types.ts +10 -3
  80. package/src/utils/class-name.ts +12 -0
@@ -1,7 +1,6 @@
1
1
  import { type Server } from "http";
2
2
  import { type WebsocketPluginOptions } from "@fastify/websocket";
3
3
  import { type FastifyReply } from "fastify";
4
- import { type ExtendedApi } from "./decorators";
5
4
  export declare function resolveIntegratedViteHmrOptions({ httpServer, requiresDedicatedWebSocketServer, rawPort, }: {
6
5
  httpServer: Server;
7
6
  requiresDedicatedWebSocketServer: boolean;
@@ -11,9 +10,8 @@ export declare function resolveIntegratedViteHmrOptions({ httpServer, requiresDe
11
10
  } | {
12
11
  port: number;
13
12
  };
14
- export declare function resolveWebSocketPluginOptions({ rawPluginOption, apis, }: {
13
+ export declare function resolveWebSocketPluginOptions({ rawPluginOption, }: {
15
14
  rawPluginOption: boolean | WebsocketPluginOptions | undefined;
16
- apis: ExtendedApi[];
17
15
  }): WebsocketPluginOptions | undefined;
18
16
  export declare function resolveWebSocketCloseDescriptor(error: unknown): {
19
17
  code: number;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-helpers.d.ts","sourceRoot":"","sources":["../../src/api/websocket-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,wBAAgB,+BAA+B,CAAC,EAC9C,UAAU,EACV,gCAAgC,EAChC,OAA0C,GAC3C,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC,EAAE,OAAO,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAOxC;AAID,wBAAgB,6BAA6B,CAAC,EAC5C,eAAe,EACf,IAAI,GACL,EAAE;IACD,eAAe,EAAE,OAAO,GAAG,sBAAsB,GAAG,SAAS,CAAC;IAC9D,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB,GAAG,sBAAsB,GAAG,SAAS,CA6BrC;AAID,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B,CAgCA;AAID,wBAAgB,wBAAwB,IAAI,YAAY,CAQvD"}
1
+ {"version":3,"file":"websocket-helpers.d.ts","sourceRoot":"","sources":["../../src/api/websocket-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAO5C,wBAAgB,+BAA+B,CAAC,EAC9C,UAAU,EACV,gCAAgC,EAChC,OAA0C,GAC3C,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC,EAAE,OAAO,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAOxC;AAGD,wBAAgB,6BAA6B,CAAC,EAC5C,eAAe,GAChB,EAAE;IACD,eAAe,EAAE,OAAO,GAAG,sBAAsB,GAAG,SAAS,CAAC;CAC/D,GAAG,sBAAsB,GAAG,SAAS,CAWrC;AAID,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B,CAgCA;AAID,wBAAgB,wBAAwB,IAAI,YAAY,CAQvD"}
@@ -10,19 +10,9 @@ function resolveIntegratedViteHmrOptions({ httpServer, requiresDedicatedWebSocke
10
10
  const parsedPort = rawPort?.trim() ? Number(rawPort) : 24678;
11
11
  return Number.isFinite(parsedPort) && parsedPort > 0 ? { port: parsedPort } : { port: 24678 };
12
12
  }
13
- function resolveWebSocketPluginOptions({ rawPluginOption, apis }) {
13
+ function resolveWebSocketPluginOptions({ rawPluginOption }) {
14
14
  const pluginOptions = rawPluginOption && rawPluginOption !== true ? { ...rawPluginOption } : {};
15
15
  const serverOptions = isPlainObject(pluginOptions.options) ? { ...pluginOptions.options } : {};
16
- if (isPositiveNumber(pluginOptions.maxPayload) && serverOptions.maxPayload === undefined) {
17
- serverOptions.maxPayload = pluginOptions.maxPayload;
18
- delete pluginOptions.maxPayload;
19
- }
20
- if (serverOptions.maxPayload === undefined) {
21
- const routeMaxPayloads = apis.map((api) => api.websocketOptions?.maxPayload).filter(isPositiveNumber);
22
- if (routeMaxPayloads.length > 0) {
23
- serverOptions.maxPayload = Math.max(...routeMaxPayloads);
24
- }
25
- }
26
16
  if (Object.keys(serverOptions).length > 0) {
27
17
  pluginOptions.options = serverOptions;
28
18
  }
@@ -63,9 +53,6 @@ function createWebSocketReplyStub() {
63
53
  throw new Error("FastifyReply is not available in websocket context. Define websocketContextProvider if your context setup depends on reply mutation.");
64
54
  } });
65
55
  }
66
- function isPositiveNumber(value) {
67
- return typeof value === "number" && Number.isFinite(value) && value > 0;
68
- }
69
56
  var init_websocket_helpers = __esmMin((() => {
70
57
  init_so_exceptions();
71
58
  init_utils();
@@ -74,4 +61,4 @@ var init_websocket_helpers = __esmMin((() => {
74
61
  //#endregion
75
62
  init_websocket_helpers();
76
63
  export { createWebSocketReplyStub, init_websocket_helpers, resolveIntegratedViteHmrOptions, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions };
77
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhlbHBlcnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS93ZWJzb2NrZXQtaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFNlcnZlciB9IGZyb20gXCJodHRwXCI7XG5cbmltcG9ydCB7IHR5cGUgV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgaXNTb0V4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8vIEZhc3RpZnkgd2Vic29ja2V0IHJvdXRl7JmAIFZpdGUgSE1SIHdlYnNvY2tldOydtCDqsJnsnYAgc2VydmVyIHNvY2tldOydhCDrkZDqs6Ag7Lap64+M7ZWY64qUIOqyg+ydhCDrsKnsp4DtlZjquLAg7JyE7ZW0LFxuLy8gV1Mgcm91dGXqsIAg7KG07J6s7ZWY66m0IEhNUuydhCDrs4Trj4Qg7Y+s7Yq466GcIOu2hOumrO2VtCDrnYTsm4BcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zKHtcbiAgaHR0cFNlcnZlcixcbiAgcmVxdWlyZXNEZWRpY2F0ZWRXZWJTb2NrZXRTZXJ2ZXIsXG4gIHJhd1BvcnQgPSBwcm9jZXNzLmVudi5TT05BTVVfVklURV9ITVJfUE9SVCxcbn06IHtcbiAgaHR0cFNlcnZlcjogU2VydmVyO1xuICByZXF1aXJlc0RlZGljYXRlZFdlYlNvY2tldFNlcnZlcjogYm9vbGVhbjtcbiAgcmF3UG9ydD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0pOiB7IHNlcnZlcjogU2VydmVyIH0gfCB7IHBvcnQ6IG51bWJlciB9IHtcbiAgaWYgKCFyZXF1aXJlc0RlZGljYXRlZFdlYlNvY2tldFNlcnZlcikge1xuICAgIHJldHVybiB7IHNlcnZlcjogaHR0cFNlcnZlciB9O1xuICB9XG5cbiAgY29uc3QgcGFyc2VkUG9ydCA9IHJhd1BvcnQ/LnRyaW0oKSA/IE51bWJlcihyYXdQb3J0KSA6IDI0Njc4O1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZFBvcnQpICYmIHBhcnNlZFBvcnQgPiAwID8geyBwb3J0OiBwYXJzZWRQb3J0IH0gOiB7IHBvcnQ6IDI0Njc4IH07XG59XG5cbi8vIHJvdXRlLWxldmVsIG1heFBheWxvYWTrpbwg7ISc67KEIHBsdWdpbiBvcHRpb25z7Jy866GcIOyKueqyqeyLnOy8nCwg7YGwIGZyYW1l7J2EIOuwm+ydgCDrkqQg64ur64qUIOuMgOyLoFxuLy8gdHJhbnNwb3J0IOugiOuyqOyXkOyEnCDrqLzsoIAg7KCc7ZWc65CY64+E66GdIO2VqFxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zKHtcbiAgcmF3UGx1Z2luT3B0aW9uLFxuICBhcGlzLFxufToge1xuICByYXdQbHVnaW5PcHRpb246IGJvb2xlYW4gfCBXZWJzb2NrZXRQbHVnaW5PcHRpb25zIHwgdW5kZWZpbmVkO1xuICBhcGlzOiBFeHRlbmRlZEFwaVtdO1xufSk6IFdlYnNvY2tldFBsdWdpbk9wdGlvbnMgfCB1bmRlZmluZWQge1xuICBjb25zdCBwbHVnaW5PcHRpb25zID1cbiAgICByYXdQbHVnaW5PcHRpb24gJiYgcmF3UGx1Z2luT3B0aW9uICE9PSB0cnVlXG4gICAgICA/IHsgLi4ucmF3UGx1Z2luT3B0aW9uIH1cbiAgICAgIDogKHt9IGFzIFdlYnNvY2tldFBsdWdpbk9wdGlvbnMgJiB7IG1heFBheWxvYWQ/OiBudW1iZXIgfSk7XG4gIGNvbnN0IHNlcnZlck9wdGlvbnMgPSBpc1BsYWluT2JqZWN0KHBsdWdpbk9wdGlvbnMub3B0aW9ucylcbiAgICA/IHsgLi4ucGx1Z2luT3B0aW9ucy5vcHRpb25zIH1cbiAgICA6ICh7fSBhcyBOb25OdWxsYWJsZTxXZWJzb2NrZXRQbHVnaW5PcHRpb25zW1wib3B0aW9uc1wiXT4pO1xuXG4gIGlmIChpc1Bvc2l0aXZlTnVtYmVyKHBsdWdpbk9wdGlvbnMubWF4UGF5bG9hZCkgJiYgc2VydmVyT3B0aW9ucy5tYXhQYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICBzZXJ2ZXJPcHRpb25zLm1heFBheWxvYWQgPSBwbHVnaW5PcHRpb25zLm1heFBheWxvYWQ7XG4gICAgZGVsZXRlIHBsdWdpbk9wdGlvbnMubWF4UGF5bG9hZDtcbiAgfVxuXG4gIGlmIChzZXJ2ZXJPcHRpb25zLm1heFBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJvdXRlTWF4UGF5bG9hZHMgPSBhcGlzXG4gICAgICAubWFwKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zPy5tYXhQYXlsb2FkKVxuICAgICAgLmZpbHRlcihpc1Bvc2l0aXZlTnVtYmVyKTtcblxuICAgIGlmIChyb3V0ZU1heFBheWxvYWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlcnZlck9wdGlvbnMubWF4UGF5bG9hZCA9IE1hdGgubWF4KC4uLnJvdXRlTWF4UGF5bG9hZHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhzZXJ2ZXJPcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgcGx1Z2luT3B0aW9ucy5vcHRpb25zID0gc2VydmVyT3B0aW9ucztcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhwbHVnaW5PcHRpb25zKS5sZW5ndGggPiAwID8gcGx1Z2luT3B0aW9ucyA6IHVuZGVmaW5lZDtcbn1cblxuLy8gaGFuZHNoYWtlL2F1dGgvdmFsaWRhdGlvbiDsi6TtjKjrpbwgZ2VuZXJpYyAxMDEx66GcIOutieqwnOyngCDslYrqs6AgMTAwOChwb2xpY3kgdmlvbGF0aW9uKeuhnCDrp6TtlZHtlbQsXG4vLyBjbG9zZSBjb2RlIHBvbGljeeulvCDtlZwg6rOz7JeQ7IScIOygleydmO2VqFxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IoZXJyb3I6IHVua25vd24pOiB7XG4gIGNvZGU6IG51bWJlcjtcbiAgcmVhc29uOiBzdHJpbmc7XG4gIGxvZ0xldmVsOiBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbn0ge1xuICBpZiAoaXNTb0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiAxMDA4LFxuICAgICAgICByZWFzb246IFwiSW52YWxpZCB3ZWJzb2NrZXQgaGFuZHNoYWtlXCIsXG4gICAgICAgIGxvZ0xldmVsOiBcIndhcm5cIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMSB8fCBlcnJvci5zdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IDEwMDgsXG4gICAgICAgIHJlYXNvbjogXCJVbmF1dGhvcml6ZWQgd2Vic29ja2V0IGNvbm5lY3Rpb25cIixcbiAgICAgICAgbG9nTGV2ZWw6IFwid2FyblwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA+PSA0MDAgJiYgZXJyb3Iuc3RhdHVzQ29kZSA8IDUwMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogMTAwOCxcbiAgICAgICAgcmVhc29uOiBcIlJlamVjdGVkIHdlYnNvY2tldCBjb25uZWN0aW9uXCIsXG4gICAgICAgIGxvZ0xldmVsOiBcIndhcm5cIixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiAxMDExLFxuICAgIHJlYXNvbjogXCJXZWJTb2NrZXQgaGFuZGxlciBmYWlsZWRcIixcbiAgICBsb2dMZXZlbDogXCJlcnJvclwiLFxuICB9O1xufVxuXG4vLyBXUyDqsr3roZzsl5DshJzripQgcmVwbHnqsIAg7KG07J6s7ZWY7KeAIOyViuycvOuvgOuhnCDsoJHqt7wg7Iuc64+E66W8IOymieyLnCDsl5Drn6zroZwgc3VyZmFjZe2VtCB0cmFuc3BvcnQgbWlzdXNl66W8IOu5qOumrCDrk5zrn6zrg4Rcbi8vIFNTRS9yZXBseeyXkCDsnZjsobTtlZjripQgY29udGV4dFByb3ZpZGVy6rCAIOyeiOycvOuptCB3ZWJzb2NrZXRDb250ZXh0UHJvdmlkZXLrpbwg65Sw66GcIOygleydmO2VmOudvOuKlCDqsIDsnbTrk5wg7Jet7ZWg64+EIO2VqFxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFJlcGx5U3R1YigpOiBGYXN0aWZ5UmVwbHkge1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIEZhc3RpZnlSZXBseSwge1xuICAgIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGYXN0aWZ5UmVwbHkgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiByZXBseSBtdXRhdGlvbi5cIixcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzUG9zaXRpdmVOdW1iZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPiAwO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVdBLFNBQWdCLGdDQUFnQyxFQUM5QyxZQUNBLGtDQUNBLFVBQVUsUUFBUSxJQUFJLHdCQUtrQjtBQUN4QyxLQUFJLENBQUMsa0NBQWtDO0FBQ3JDLFNBQU8sRUFBRSxRQUFRLFlBQVk7O0NBRy9CLE1BQU0sYUFBYSxTQUFTLE1BQU0sR0FBRyxPQUFPLFFBQVEsR0FBRztBQUN2RCxRQUFPLE9BQU8sU0FBUyxXQUFXLElBQUksYUFBYSxJQUFJLEVBQUUsTUFBTSxZQUFZLEdBQUcsRUFBRSxNQUFNLE9BQU87O0FBSy9GLFNBQWdCLDhCQUE4QixFQUM1QyxpQkFDQSxRQUlxQztDQUNyQyxNQUFNLGdCQUNKLG1CQUFtQixvQkFBb0IsT0FDbkMsRUFBRSxHQUFHLGlCQUFpQixHQUNyQixFQUFFO0NBQ1QsTUFBTSxnQkFBZ0IsY0FBYyxjQUFjLFFBQVEsR0FDdEQsRUFBRSxHQUFHLGNBQWMsU0FBUyxHQUMzQixFQUFFO0FBRVAsS0FBSSxpQkFBaUIsY0FBYyxXQUFXLElBQUksY0FBYyxlQUFlLFdBQVc7QUFDeEYsZ0JBQWMsYUFBYSxjQUFjO0FBQ3pDLFNBQU8sY0FBYzs7QUFHdkIsS0FBSSxjQUFjLGVBQWUsV0FBVztFQUMxQyxNQUFNLG1CQUFtQixLQUN0QixLQUFLLFFBQVEsSUFBSSxrQkFBa0IsV0FBVyxDQUM5QyxPQUFPLGlCQUFpQjtBQUUzQixNQUFJLGlCQUFpQixTQUFTLEdBQUc7QUFDL0IsaUJBQWMsYUFBYSxLQUFLLElBQUksR0FBRyxpQkFBaUI7OztBQUk1RCxLQUFJLE9BQU8sS0FBSyxjQUFjLENBQUMsU0FBUyxHQUFHO0FBQ3pDLGdCQUFjLFVBQVU7O0FBRzFCLFFBQU8sT0FBTyxLQUFLLGNBQWMsQ0FBQyxTQUFTLElBQUksZ0JBQWdCOztBQUtqRSxTQUFnQixnQ0FBZ0MsT0FJOUM7QUFDQSxLQUFJLGNBQWMsTUFBTSxFQUFFO0FBQ3hCLE1BQUksTUFBTSxlQUFlLEtBQUs7QUFDNUIsVUFBTztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNYOztBQUdILE1BQUksTUFBTSxlQUFlLE9BQU8sTUFBTSxlQUFlLEtBQUs7QUFDeEQsVUFBTztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNYOztBQUdILE1BQUksTUFBTSxjQUFjLE9BQU8sTUFBTSxhQUFhLEtBQUs7QUFDckQsVUFBTztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNYOzs7QUFJTCxRQUFPO0VBQ0wsTUFBTTtFQUNOLFFBQVE7RUFDUixVQUFVO0VBQ1g7O0FBS0gsU0FBZ0IsMkJBQXlDO0FBQ3ZELFFBQU8sSUFBSSxNQUFNLEVBQUUsRUFBa0IsRUFDbkMsTUFBTTtBQUNKLFFBQU0sSUFBSSxNQUNSLHVJQUNEO0lBRUosQ0FBQzs7QUFHSixTQUFTLGlCQUFpQixPQUFpQztBQUN6RCxRQUFPLE9BQU8sVUFBVSxZQUFZLE9BQU8sU0FBUyxNQUFNLElBQUksUUFBUTs7O3FCQW5IWjthQUNiIn0=
64
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhlbHBlcnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS93ZWJzb2NrZXQtaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFNlcnZlciB9IGZyb20gXCJodHRwXCI7XG5cbmltcG9ydCB7IHR5cGUgV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgaXNTb0V4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuLy8gRmFzdGlmeSB3ZWJzb2NrZXQgcm91dGXsmYAgVml0ZSBITVIgd2Vic29ja2V07J20IOqwmeydgCBzZXJ2ZXIgc29ja2V07J2EIOuRkOqzoCDstqnrj4ztlZjripQg6rKD7J2EIOuwqeyngO2VmOq4sCDsnITtlbQsXG4vLyBXUyByb3V0ZeqwgCDsobTsnqztlZjrqbQgSE1S7J2EIOuzhOuPhCDtj6ztirjroZwg67aE66as7ZW0IOudhOybgFxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbnRlZ3JhdGVkVml0ZUhtck9wdGlvbnMoe1xuICBodHRwU2VydmVyLFxuICByZXF1aXJlc0RlZGljYXRlZFdlYlNvY2tldFNlcnZlcixcbiAgcmF3UG9ydCA9IHByb2Nlc3MuZW52LlNPTkFNVV9WSVRFX0hNUl9QT1JULFxufToge1xuICBodHRwU2VydmVyOiBTZXJ2ZXI7XG4gIHJlcXVpcmVzRGVkaWNhdGVkV2ViU29ja2V0U2VydmVyOiBib29sZWFuO1xuICByYXdQb3J0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufSk6IHsgc2VydmVyOiBTZXJ2ZXIgfSB8IHsgcG9ydDogbnVtYmVyIH0ge1xuICBpZiAoIXJlcXVpcmVzRGVkaWNhdGVkV2ViU29ja2V0U2VydmVyKSB7XG4gICAgcmV0dXJuIHsgc2VydmVyOiBodHRwU2VydmVyIH07XG4gIH1cblxuICBjb25zdCBwYXJzZWRQb3J0ID0gcmF3UG9ydD8udHJpbSgpID8gTnVtYmVyKHJhd1BvcnQpIDogMjQ2Nzg7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkUG9ydCkgJiYgcGFyc2VkUG9ydCA+IDAgPyB7IHBvcnQ6IHBhcnNlZFBvcnQgfSA6IHsgcG9ydDogMjQ2NzggfTtcbn1cblxuLy8gQGZhc3RpZnkvd2Vic29ja2V0IHRyYW5zcG9ydCBvcHRpb27snYAgc2VydmVyLnBsdWdpbnMud3Psl5Ag66qF7Iuc65CcIOqwkuunjCDsgqzsmqntlaguXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMoe1xuICByYXdQbHVnaW5PcHRpb24sXG59OiB7XG4gIHJhd1BsdWdpbk9wdGlvbjogYm9vbGVhbiB8IFdlYnNvY2tldFBsdWdpbk9wdGlvbnMgfCB1bmRlZmluZWQ7XG59KTogV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBsdWdpbk9wdGlvbnMgPSByYXdQbHVnaW5PcHRpb24gJiYgcmF3UGx1Z2luT3B0aW9uICE9PSB0cnVlID8geyAuLi5yYXdQbHVnaW5PcHRpb24gfSA6IHt9O1xuICBjb25zdCBzZXJ2ZXJPcHRpb25zID0gaXNQbGFpbk9iamVjdChwbHVnaW5PcHRpb25zLm9wdGlvbnMpXG4gICAgPyB7IC4uLnBsdWdpbk9wdGlvbnMub3B0aW9ucyB9XG4gICAgOiAoe30gYXMgTm9uTnVsbGFibGU8V2Vic29ja2V0UGx1Z2luT3B0aW9uc1tcIm9wdGlvbnNcIl0+KTtcblxuICBpZiAoT2JqZWN0LmtleXMoc2VydmVyT3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgIHBsdWdpbk9wdGlvbnMub3B0aW9ucyA9IHNlcnZlck9wdGlvbnM7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMocGx1Z2luT3B0aW9ucykubGVuZ3RoID4gMCA/IHBsdWdpbk9wdGlvbnMgOiB1bmRlZmluZWQ7XG59XG5cbi8vIGhhbmRzaGFrZS9hdXRoL3ZhbGlkYXRpb24g7Iuk7Yyo66W8IGdlbmVyaWMgMTAxMeuhnCDrrYnqsJzsp4Ag7JWK6rOgIDEwMDgocG9saWN5IHZpb2xhdGlvbinroZwg66ek7ZWR7ZW0LFxuLy8gY2xvc2UgY29kZSBwb2xpY3nrpbwg7ZWcIOqzs+yXkOyEnCDsoJXsnZjtlahcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2ViU29ja2V0Q2xvc2VEZXNjcmlwdG9yKGVycm9yOiB1bmtub3duKToge1xuICBjb2RlOiBudW1iZXI7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBsb2dMZXZlbDogXCJ3YXJuXCIgfCBcImVycm9yXCI7XG59IHtcbiAgaWYgKGlzU29FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogMTAwOCxcbiAgICAgICAgcmVhc29uOiBcIkludmFsaWQgd2Vic29ja2V0IGhhbmRzaGFrZVwiLFxuICAgICAgICBsb2dMZXZlbDogXCJ3YXJuXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSA0MDEgfHwgZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiAxMDA4LFxuICAgICAgICByZWFzb246IFwiVW5hdXRob3JpemVkIHdlYnNvY2tldCBjb25uZWN0aW9uXCIsXG4gICAgICAgIGxvZ0xldmVsOiBcIndhcm5cIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPj0gNDAwICYmIGVycm9yLnN0YXR1c0NvZGUgPCA1MDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IDEwMDgsXG4gICAgICAgIHJlYXNvbjogXCJSZWplY3RlZCB3ZWJzb2NrZXQgY29ubmVjdGlvblwiLFxuICAgICAgICBsb2dMZXZlbDogXCJ3YXJuXCIsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29kZTogMTAxMSxcbiAgICByZWFzb246IFwiV2ViU29ja2V0IGhhbmRsZXIgZmFpbGVkXCIsXG4gICAgbG9nTGV2ZWw6IFwiZXJyb3JcIixcbiAgfTtcbn1cblxuLy8gV1Mg6rK966Gc7JeQ7ISc64qUIHJlcGx56rCAIOyhtOyerO2VmOyngCDslYrsnLzrr4DroZwg7KCR6re8IOyLnOuPhOulvCDsponsi5wg7JeQ65+s66GcIHN1cmZhY2XtlbQgdHJhbnNwb3J0IG1pc3VzZeulvCDruajrpqwg65Oc65+s64OEXG4vLyBTU0UvcmVwbHnsl5Ag7J2Y7KG07ZWY64qUIGNvbnRleHRQcm92aWRlcuqwgCDsnojsnLzrqbQgd2Vic29ja2V0Q29udGV4dFByb3ZpZGVy66W8IOuUsOuhnCDsoJXsnZjtlZjrnbzripQg6rCA7J2065OcIOyXre2VoOuPhCDtlahcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIoKTogRmFzdGlmeVJlcGx5IHtcbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBGYXN0aWZ5UmVwbHksIHtcbiAgICBnZXQoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRmFzdGlmeVJlcGx5IGlzIG5vdCBhdmFpbGFibGUgaW4gd2Vic29ja2V0IGNvbnRleHQuIERlZmluZSB3ZWJzb2NrZXRDb250ZXh0UHJvdmlkZXIgaWYgeW91ciBjb250ZXh0IHNldHVwIGRlcGVuZHMgb24gcmVwbHkgbXV0YXRpb24uXCIsXG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVVBLFNBQWdCLGdDQUFnQyxFQUM5QyxZQUNBLGtDQUNBLFVBQVUsUUFBUSxJQUFJLHdCQUtrQjtBQUN4QyxLQUFJLENBQUMsa0NBQWtDO0FBQ3JDLFNBQU8sRUFBRSxRQUFRLFlBQVk7O0NBRy9CLE1BQU0sYUFBYSxTQUFTLE1BQU0sR0FBRyxPQUFPLFFBQVEsR0FBRztBQUN2RCxRQUFPLE9BQU8sU0FBUyxXQUFXLElBQUksYUFBYSxJQUFJLEVBQUUsTUFBTSxZQUFZLEdBQUcsRUFBRSxNQUFNLE9BQU87O0FBSS9GLFNBQWdCLDhCQUE4QixFQUM1QyxtQkFHcUM7Q0FDckMsTUFBTSxnQkFBZ0IsbUJBQW1CLG9CQUFvQixPQUFPLEVBQUUsR0FBRyxpQkFBaUIsR0FBRyxFQUFFO0NBQy9GLE1BQU0sZ0JBQWdCLGNBQWMsY0FBYyxRQUFRLEdBQ3RELEVBQUUsR0FBRyxjQUFjLFNBQVMsR0FDM0IsRUFBRTtBQUVQLEtBQUksT0FBTyxLQUFLLGNBQWMsQ0FBQyxTQUFTLEdBQUc7QUFDekMsZ0JBQWMsVUFBVTs7QUFHMUIsUUFBTyxPQUFPLEtBQUssY0FBYyxDQUFDLFNBQVMsSUFBSSxnQkFBZ0I7O0FBS2pFLFNBQWdCLGdDQUFnQyxPQUk5QztBQUNBLEtBQUksY0FBYyxNQUFNLEVBQUU7QUFDeEIsTUFBSSxNQUFNLGVBQWUsS0FBSztBQUM1QixVQUFPO0lBQ0wsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1g7O0FBR0gsTUFBSSxNQUFNLGVBQWUsT0FBTyxNQUFNLGVBQWUsS0FBSztBQUN4RCxVQUFPO0lBQ0wsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1g7O0FBR0gsTUFBSSxNQUFNLGNBQWMsT0FBTyxNQUFNLGFBQWEsS0FBSztBQUNyRCxVQUFPO0lBQ0wsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1g7OztBQUlMLFFBQU87RUFDTCxNQUFNO0VBQ04sUUFBUTtFQUNSLFVBQVU7RUFDWDs7QUFLSCxTQUFnQiwyQkFBeUM7QUFDdkQsUUFBTyxJQUFJLE1BQU0sRUFBRSxFQUFrQixFQUNuQyxNQUFNO0FBQ0osUUFBTSxJQUFJLE1BQ1IsdUlBQ0Q7SUFFSixDQUFDOzs7cUJBekZ3RDthQUNiIn0=
@@ -3,6 +3,9 @@ export * from "./ws-audience";
3
3
  export * from "./ws-cluster-bus";
4
4
  export * from "./ws-core";
5
5
  export * from "./ws-presence-store";
6
+ export * from "./ws-telemetry";
7
+ export * from "./ws-telemetry-memory";
8
+ export * from "./ws-telemetry-trace";
6
9
  export * from "./ws";
7
10
  export * from "./ws-registry";
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stream/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,MAAM,CAAC;AACrB,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stream/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,MAAM,CAAC;AACrB,cAAc,eAAe,CAAC"}
@@ -1,6 +1,9 @@
1
1
  import { createMockSSEFactory, createSSEFactory, init_sse } from "./sse.js";
2
2
  import { WebSocketAudience, init_ws_audience } from "./ws-audience.js";
3
3
  import { NoopWebSocketClusterBus, init_ws_cluster_bus } from "./ws-cluster-bus.js";
4
+ import { InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, init_ws_telemetry_memory } from "./ws-telemetry-memory.js";
5
+ import { formatTraceParent, generateSpanId, generateTraceId, init_ws_telemetry_trace, parseTraceParent } from "./ws-telemetry-trace.js";
6
+ import { DEFAULT_TRACE_OPTIONS, EMPTY_METRICS_SNAPSHOT, NoopWebSocketTelemetryController, WebSocketTelemetryControllerImpl, createWebSocketTelemetryController, init_ws_telemetry, isPromiseLike } from "./ws-telemetry.js";
4
7
  import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./ws-presence-store.js";
5
8
  import { WebSocketRegistry, init_ws_registry } from "./ws-registry.js";
6
9
  import { WebSocketRuntime, createWebSocketRuntime, init_ws } from "./ws.js";
@@ -11,9 +14,12 @@ init_sse();
11
14
  init_ws_audience();
12
15
  init_ws_cluster_bus();
13
16
  init_ws_presence_store();
17
+ init_ws_telemetry();
18
+ init_ws_telemetry_memory();
19
+ init_ws_telemetry_trace();
14
20
  init_ws();
15
21
  init_ws_registry();
16
22
 
17
23
  //#endregion
18
- export { InMemoryWebSocketPresenceStore, NoopWebSocketClusterBus, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, createMockSSEFactory, createSSEFactory, createWebSocketRuntime };
19
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9zc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzLWF1ZGllbmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cy1jbHVzdGVyLWJ1c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtY29yZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cy1yZWdpc3RyeVwiO1xuIl0sIm1hcHBpbmdzIjoiIn0=
24
+ export { DEFAULT_TRACE_OPTIONS, EMPTY_METRICS_SNAPSHOT, InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, InMemoryWebSocketPresenceStore, NoopWebSocketClusterBus, NoopWebSocketTelemetryController, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, WebSocketTelemetryControllerImpl, createMockSSEFactory, createSSEFactory, createWebSocketRuntime, createWebSocketTelemetryController, formatTraceParent, generateSpanId, generateTraceId, isPromiseLike, parseTraceParent };
25
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9zc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzLWF1ZGllbmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cy1jbHVzdGVyLWJ1c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtY29yZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzLXRlbGVtZXRyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtdGVsZW1ldHJ5LW1lbW9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtdGVsZW1ldHJ5LXRyYWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtcmVnaXN0cnlcIjtcbiJdLCJtYXBwaW5ncyI6IiJ9
@@ -4,6 +4,7 @@ export interface ManagedWebSocketConnection {
4
4
  id: string;
5
5
  namespace: string;
6
6
  closed: boolean;
7
+ readonly userId?: string;
7
8
  publishUntyped(event: string, data: unknown): void;
8
9
  close(code?: number, reason?: string): void;
9
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ws-core.d.ts","sourceRoot":"","sources":["../../src/stream/ws-core.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC"}
1
+ {"version":3,"file":"ws-core.d.ts","sourceRoot":"","sources":["../../src/stream/ws-core.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAEhB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC"}
@@ -2,19 +2,27 @@ import { type WebSocketAudience } from "./ws-audience";
2
2
  import { type WebSocketAudienceResolver } from "./ws-audience-resolver";
3
3
  import { type WebSocketClusterBus } from "./ws-cluster-bus";
4
4
  import { type WebSocketLocalConnectionStore } from "./ws-local-connection-store";
5
+ import { type WebSocketTelemetryController } from "./ws-telemetry";
5
6
  export declare class WebSocketDeliveryEngine {
6
7
  private readonly options;
7
8
  private readonly pendingFanOutJobs;
8
9
  private fanOutFlushScheduled;
9
10
  private readonly unsubscribe;
11
+ private readonly telemetry;
12
+ private readonly unregisterMetricSource;
10
13
  constructor(options: {
11
14
  nodeId: string;
12
15
  localConnections: WebSocketLocalConnectionStore;
13
16
  audienceResolver: WebSocketAudienceResolver;
14
17
  clusterBus: WebSocketClusterBus;
18
+ telemetryController?: WebSocketTelemetryController;
15
19
  });
16
20
  publishToAudience(audience: WebSocketAudience, event: string, data: unknown): void;
17
21
  shutdown(): Promise<void>;
22
+ getTelemetrySnapshot(): {
23
+ pendingFanOutJobs: number;
24
+ pendingFanOutTargets: number;
25
+ };
18
26
  private handleClusterEnvelope;
19
27
  private enqueueFanOut;
20
28
  private scheduleFanOutFlush;
@@ -1 +1 @@
1
- {"version":3,"file":"ws-delivery.d.ts","sourceRoot":"","sources":["../../src/stream/ws-delivery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,KAAK,mBAAmB,EAAiC,MAAM,kBAAkB,CAAC;AAE3F,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAKjF,qBAAa,uBAAuB;IAWhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAV1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAK1B;IACR,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAGtB,OAAO,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,gBAAgB,EAAE,6BAA6B,CAAC;QAChD,gBAAgB,EAAE,yBAAyB,CAAC;QAC5C,UAAU,EAAE,mBAAmB,CAAC;KACjC;IAOH,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAoB5E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,WAAW;CASpB"}
1
+ {"version":3,"file":"ws-delivery.d.ts","sourceRoot":"","sources":["../../src/stream/ws-delivery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,KAAK,mBAAmB,EAAiC,MAAM,kBAAkB,CAAC;AAE3F,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,gBAAgB,CAAC;AAKxB,qBAAa,uBAAuB;IAahC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZ1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAK1B;IACR,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAa;gBAGjC,OAAO,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,gBAAgB,EAAE,6BAA6B,CAAC;QAChD,gBAAgB,EAAE,yBAAyB,CAAC;QAC5C,UAAU,EAAE,mBAAmB,CAAC;QAChC,mBAAmB,CAAC,EAAE,4BAA4B,CAAC;KACpD;IAWH,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IA0E5E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,oBAAoB,IAAI;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAA;KAAE;IAanF,OAAO,CAAC,qBAAqB;IA+C7B,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,eAAe;IA8CvB,OAAO,CAAC,WAAW;CAiBpB"}
@@ -1,28 +1,49 @@
1
1
  import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+ import { NoopWebSocketTelemetryController, init_ws_telemetry } from "./ws-telemetry.js";
2
3
  import { randomUUID } from "node:crypto";
3
4
 
4
5
  //#region src/stream/ws-delivery.ts
5
6
  var FAN_OUT_BATCH_SIZE, WebSocketDeliveryEngine;
6
7
  var init_ws_delivery = __esmMin((() => {
8
+ init_ws_telemetry();
7
9
  FAN_OUT_BATCH_SIZE = 250;
8
10
  WebSocketDeliveryEngine = class {
9
11
  pendingFanOutJobs = [];
10
12
  fanOutFlushScheduled = false;
11
13
  unsubscribe;
14
+ telemetry;
15
+ unregisterMetricSource;
12
16
  constructor(options) {
13
17
  this.options = options;
18
+ this.telemetry = this.options.telemetryController ?? new NoopWebSocketTelemetryController();
14
19
  this.unsubscribe = this.options.clusterBus.subscribe((envelope) => {
15
20
  this.handleClusterEnvelope(envelope);
16
21
  });
22
+ this.unregisterMetricSource = this.telemetry.registerMetricSource({ collect: () => this.getTelemetrySnapshot() });
17
23
  }
18
24
  publishToAudience(audience, event, data) {
19
25
  const routingPlan = this.options.audienceResolver.resolve(audience);
20
26
  const localTargets = this.options.localConnections.getConnections(routingPlan.localSessionIds);
27
+ this.telemetry.emit({
28
+ name: "ws.fanout.resolved",
29
+ level: "debug",
30
+ detail: {
31
+ localTargetCount: localTargets.length,
32
+ remoteNodeCount: routingPlan.remoteNodeIds.length
33
+ }
34
+ });
35
+ this.telemetry.recordMetric({
36
+ name: "sonamu.ws.fanout.targets",
37
+ kind: "histogram",
38
+ value: localTargets.length + routingPlan.remoteNodeIds.length,
39
+ unit: "1",
40
+ tags: { audience_type: audience.type }
41
+ });
21
42
  this.enqueueFanOut(localTargets, event, data);
22
43
  if (routingPlan.remoteNodeIds.length === 0) {
23
44
  return;
24
45
  }
25
- void this.options.clusterBus.publish({
46
+ const envelope = {
26
47
  id: randomUUID(),
27
48
  sourceNodeId: this.options.nodeId,
28
49
  targetNodeIds: routingPlan.remoteNodeIds,
@@ -30,21 +51,106 @@ var init_ws_delivery = __esmMin((() => {
30
51
  event,
31
52
  data,
32
53
  emittedAt: Date.now()
54
+ };
55
+ const publishStartedAt = performance.now();
56
+ Promise.resolve(this.options.clusterBus.publish(envelope)).then(() => {
57
+ const durationMs = performance.now() - publishStartedAt;
58
+ this.telemetry.emit({
59
+ name: "ws.cluster.envelope.published",
60
+ level: "debug",
61
+ detail: {
62
+ event,
63
+ targetNodeCount: routingPlan.remoteNodeIds.length
64
+ }
65
+ });
66
+ this.telemetry.recordSpan({
67
+ operationName: "ws.cluster.publish",
68
+ kind: "producer",
69
+ durationMs,
70
+ status: "unset",
71
+ attributes: {
72
+ event,
73
+ targetNodeCount: routingPlan.remoteNodeIds.length
74
+ }
75
+ });
76
+ }).catch((error) => {
77
+ const durationMs = performance.now() - publishStartedAt;
78
+ this.telemetry.emit({
79
+ name: "ws.cluster.envelope.failed",
80
+ level: "error",
81
+ detail: { event }
82
+ });
83
+ this.telemetry.recordSpan({
84
+ operationName: "ws.cluster.publish",
85
+ kind: "producer",
86
+ durationMs,
87
+ status: "error",
88
+ attributes: { event },
89
+ errorType: error instanceof Error ? error.name : typeof error
90
+ });
33
91
  });
34
92
  }
35
93
  async shutdown() {
94
+ this.unregisterMetricSource();
36
95
  this.unsubscribe();
37
96
  await this.options.clusterBus.shutdown();
38
97
  }
98
+ getTelemetrySnapshot() {
99
+ let pendingFanOutTargets = 0;
100
+ for (const job of this.pendingFanOutJobs) {
101
+ pendingFanOutTargets += Math.max(job.targets.length - job.cursor, 0);
102
+ }
103
+ return {
104
+ pendingFanOutJobs: this.pendingFanOutJobs.length,
105
+ pendingFanOutTargets
106
+ };
107
+ }
39
108
  handleClusterEnvelope(envelope) {
40
109
  if (envelope.sourceNodeId === this.options.nodeId) {
110
+ this.telemetry.emit({
111
+ name: "ws.cluster.envelope.ignored",
112
+ level: "debug",
113
+ detail: {
114
+ reason: "selfSource",
115
+ event: envelope.event
116
+ }
117
+ });
41
118
  return;
42
119
  }
43
120
  if (envelope.targetNodeIds && envelope.targetNodeIds.length > 0 && !envelope.targetNodeIds.includes(this.options.nodeId)) {
121
+ this.telemetry.emit({
122
+ name: "ws.cluster.envelope.ignored",
123
+ level: "debug",
124
+ detail: {
125
+ reason: "targetMismatch",
126
+ event: envelope.event
127
+ }
128
+ });
44
129
  return;
45
130
  }
131
+ const startedAt = performance.now();
132
+ this.telemetry.emit({
133
+ name: "ws.cluster.envelope.received",
134
+ level: "debug",
135
+ detail: {
136
+ event: envelope.event,
137
+ sourceNodeId: envelope.sourceNodeId
138
+ }
139
+ });
46
140
  const routingPlan = this.options.audienceResolver.resolve(envelope.audience);
47
- this.enqueueFanOut(this.options.localConnections.getConnections(routingPlan.localSessionIds), envelope.event, envelope.data);
141
+ const localTargets = this.options.localConnections.getConnections(routingPlan.localSessionIds);
142
+ this.enqueueFanOut(localTargets, envelope.event, envelope.data);
143
+ this.telemetry.recordSpan({
144
+ operationName: "ws.cluster.receive",
145
+ kind: "consumer",
146
+ durationMs: performance.now() - startedAt,
147
+ status: "unset",
148
+ attributes: {
149
+ event: envelope.event,
150
+ sourceNodeId: envelope.sourceNodeId,
151
+ localTargetCount: localTargets.length
152
+ }
153
+ });
48
154
  }
49
155
  enqueueFanOut(targets, event, data) {
50
156
  if (targets.length === 0) {
@@ -56,6 +162,14 @@ var init_ws_delivery = __esmMin((() => {
56
162
  data,
57
163
  cursor: 0
58
164
  });
165
+ this.telemetry.emit({
166
+ name: "ws.fanout.enqueued",
167
+ level: "debug",
168
+ detail: {
169
+ targetCount: targets.length,
170
+ event
171
+ }
172
+ });
59
173
  this.scheduleFanOutFlush();
60
174
  }
61
175
  scheduleFanOutFlush() {
@@ -69,21 +183,45 @@ var init_ws_delivery = __esmMin((() => {
69
183
  });
70
184
  }
71
185
  flushFanOutJobs() {
186
+ const startedAt = performance.now();
72
187
  let processed = 0;
73
- while (this.pendingFanOutJobs.length > 0 && processed < FAN_OUT_BATCH_SIZE) {
74
- const job = this.pendingFanOutJobs[0];
75
- while (job.cursor < job.targets.length && processed < FAN_OUT_BATCH_SIZE) {
76
- this.safePublish(job.targets[job.cursor], job.event, job.data);
77
- job.cursor += 1;
78
- processed += 1;
188
+ let status = "unset";
189
+ let errorType;
190
+ try {
191
+ while (this.pendingFanOutJobs.length > 0 && processed < FAN_OUT_BATCH_SIZE) {
192
+ const job = this.pendingFanOutJobs[0];
193
+ while (job.cursor < job.targets.length && processed < FAN_OUT_BATCH_SIZE) {
194
+ this.safePublish(job.targets[job.cursor], job.event, job.data);
195
+ job.cursor += 1;
196
+ processed += 1;
197
+ }
198
+ if (job.cursor >= job.targets.length) {
199
+ this.pendingFanOutJobs.shift();
200
+ }
79
201
  }
80
- if (job.cursor >= job.targets.length) {
81
- this.pendingFanOutJobs.shift();
202
+ } catch (error) {
203
+ status = "error";
204
+ errorType = error instanceof Error ? error.name : typeof error;
205
+ throw error;
206
+ } finally {
207
+ const durationMs = performance.now() - startedAt;
208
+ this.telemetry.emit({
209
+ name: "ws.fanout.flushed",
210
+ level: "debug",
211
+ detail: { processedCount: processed }
212
+ });
213
+ this.telemetry.recordSpan({
214
+ operationName: "ws.fanout.dispatch",
215
+ kind: "internal",
216
+ durationMs,
217
+ status,
218
+ attributes: { processedCount: processed },
219
+ errorType
220
+ });
221
+ if (this.pendingFanOutJobs.length > 0) {
222
+ this.scheduleFanOutFlush();
82
223
  }
83
224
  }
84
- if (this.pendingFanOutJobs.length > 0) {
85
- this.scheduleFanOutFlush();
86
- }
87
225
  }
88
226
  safePublish(connection, event, data) {
89
227
  try {
@@ -91,6 +229,14 @@ var init_ws_delivery = __esmMin((() => {
91
229
  connection.publishUntyped(event, data);
92
230
  }
93
231
  } catch {
232
+ this.telemetry.emit({
233
+ name: "ws.fanout.publish.failed",
234
+ level: "error",
235
+ connectionId: connection.id,
236
+ namespace: connection.namespace,
237
+ userId: connection.userId,
238
+ detail: { event }
239
+ });
94
240
  connection.close(1011, "WebSocket publish failed");
95
241
  }
96
242
  }
@@ -100,4 +246,4 @@ var init_ws_delivery = __esmMin((() => {
100
246
  //#endregion
101
247
  init_ws_delivery();
102
248
  export { WebSocketDeliveryEngine, init_ws_delivery };
103
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtZGVsaXZlcnkuanMiLCJuYW1lcyI6WyJvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlO1xuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcjtcbiAgICAgIGNsdXN0ZXJCdXM6IFdlYlNvY2tldENsdXN0ZXJCdXM7XG4gICAgfSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtZGVsaXZlcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlciB9IGZyb20gXCIuL3dzLWF1ZGllbmNlLXJlc29sdmVyXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldENsdXN0ZXJCdXMsIHR5cGUgV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlIH0gZnJvbSBcIi4vd3MtY2x1c3Rlci1idXNcIjtcbmltcG9ydCB7IHR5cGUgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlIH0gZnJvbSBcIi4vd3MtbG9jYWwtY29ubmVjdGlvbi1zdG9yZVwiO1xuXG4vLyBmYW4tb3V07J2EIGV2ZW50IGxvb3AgdGljayDri6jsnITroZwg64KY64igIO2VnCDrsojsl5Ag6ri0IOuPmeq4sCDro6jtlITrpbwg66eM65Ok7KeAIOyViuqyjCDtlahcbmNvbnN0IEZBTl9PVVRfQkFUQ0hfU0laRSA9IDI1MDtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldERlbGl2ZXJ5RW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRmFuT3V0Sm9iczogQXJyYXk8e1xuICAgIHRhcmdldHM6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW107XG4gICAgZXZlbnQ6IHN0cmluZztcbiAgICBkYXRhOiB1bmtub3duO1xuICAgIGN1cnNvcjogbnVtYmVyO1xuICB9PiA9IFtdO1xuICBwcml2YXRlIGZhbk91dEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlO1xuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcjtcbiAgICAgIGNsdXN0ZXJCdXM6IFdlYlNvY2tldENsdXN0ZXJCdXM7XG4gICAgfSxcbiAgKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSA9IHRoaXMub3B0aW9ucy5jbHVzdGVyQnVzLnN1YnNjcmliZSgoZW52ZWxvcGUpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlQ2x1c3RlckVudmVsb3BlKGVudmVsb3BlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHJvdXRpbmdQbGFuID0gdGhpcy5vcHRpb25zLmF1ZGllbmNlUmVzb2x2ZXIucmVzb2x2ZShhdWRpZW5jZSk7XG4gICAgY29uc3QgbG9jYWxUYXJnZXRzID0gdGhpcy5vcHRpb25zLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbnMocm91dGluZ1BsYW4ubG9jYWxTZXNzaW9uSWRzKTtcbiAgICB0aGlzLmVucXVldWVGYW5PdXQobG9jYWxUYXJnZXRzLCBldmVudCwgZGF0YSk7XG5cbiAgICBpZiAocm91dGluZ1BsYW4ucmVtb3RlTm9kZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2b2lkIHRoaXMub3B0aW9ucy5jbHVzdGVyQnVzLnB1Ymxpc2goe1xuICAgICAgaWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgIHNvdXJjZU5vZGVJZDogdGhpcy5vcHRpb25zLm5vZGVJZCxcbiAgICAgIHRhcmdldE5vZGVJZHM6IHJvdXRpbmdQbGFuLnJlbW90ZU5vZGVJZHMsXG4gICAgICBhdWRpZW5jZSxcbiAgICAgIGV2ZW50LFxuICAgICAgZGF0YSxcbiAgICAgIGVtaXR0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuY2x1c3RlckJ1cy5zaHV0ZG93bigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbHVzdGVyRW52ZWxvcGUoZW52ZWxvcGU6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZSk6IHZvaWQge1xuICAgIGlmIChlbnZlbG9wZS5zb3VyY2VOb2RlSWQgPT09IHRoaXMub3B0aW9ucy5ub2RlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlbnZlbG9wZS50YXJnZXROb2RlSWRzICYmXG4gICAgICBlbnZlbG9wZS50YXJnZXROb2RlSWRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICFlbnZlbG9wZS50YXJnZXROb2RlSWRzLmluY2x1ZGVzKHRoaXMub3B0aW9ucy5ub2RlSWQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGluZ1BsYW4gPSB0aGlzLm9wdGlvbnMuYXVkaWVuY2VSZXNvbHZlci5yZXNvbHZlKGVudmVsb3BlLmF1ZGllbmNlKTtcbiAgICB0aGlzLmVucXVldWVGYW5PdXQoXG4gICAgICB0aGlzLm9wdGlvbnMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9ucyhyb3V0aW5nUGxhbi5sb2NhbFNlc3Npb25JZHMpLFxuICAgICAgZW52ZWxvcGUuZXZlbnQsXG4gICAgICBlbnZlbG9wZS5kYXRhLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGVucXVldWVGYW5PdXQodGFyZ2V0czogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb25bXSwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0Zhbk91dEpvYnMucHVzaCh7XG4gICAgICB0YXJnZXRzLFxuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgY3Vyc29yOiAwLFxuICAgIH0pO1xuICAgIHRoaXMuc2NoZWR1bGVGYW5PdXRGbHVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZUZhbk91dEZsdXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZhbk91dEZsdXNoU2NoZWR1bGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mYW5PdXRGbHVzaFNjaGVkdWxlZCA9IHRydWU7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIHRoaXMuZmFuT3V0Rmx1c2hTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZmx1c2hGYW5PdXRKb2JzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoRmFuT3V0Sm9icygpOiB2b2lkIHtcbiAgICBsZXQgcHJvY2Vzc2VkID0gMDtcblxuICAgIHdoaWxlICh0aGlzLnBlbmRpbmdGYW5PdXRKb2JzLmxlbmd0aCA+IDAgJiYgcHJvY2Vzc2VkIDwgRkFOX09VVF9CQVRDSF9TSVpFKSB7XG4gICAgICBjb25zdCBqb2IgPSB0aGlzLnBlbmRpbmdGYW5PdXRKb2JzWzBdO1xuXG4gICAgICB3aGlsZSAoam9iLmN1cnNvciA8IGpvYi50YXJnZXRzLmxlbmd0aCAmJiBwcm9jZXNzZWQgPCBGQU5fT1VUX0JBVENIX1NJWkUpIHtcbiAgICAgICAgdGhpcy5zYWZlUHVibGlzaChqb2IudGFyZ2V0c1tqb2IuY3Vyc29yXSwgam9iLmV2ZW50LCBqb2IuZGF0YSk7XG4gICAgICAgIGpvYi5jdXJzb3IgKz0gMTtcbiAgICAgICAgcHJvY2Vzc2VkICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGlmIChqb2IuY3Vyc29yID49IGpvYi50YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnBlbmRpbmdGYW5PdXRKb2JzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ0Zhbk91dEpvYnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZUZhbk91dEZsdXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYWZlUHVibGlzaChjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24uY2xvc2VkKSB7XG4gICAgICAgIGNvbm5lY3Rpb24ucHVibGlzaFVudHlwZWQoZXZlbnQsIGRhdGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29ubmVjdGlvbi5jbG9zZSgxMDExLCBcIldlYlNvY2tldCBwdWJsaXNoIGZhaWxlZFwiKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0NBU00scUJBQXFCO0NBRWQsMEJBQWIsTUFBcUM7RUFDbkMsQUFBaUIsb0JBS1osRUFBRTtFQUNQLEFBQVEsdUJBQXVCO0VBQy9CLEFBQWlCO0VBRWpCLFlBQ0UsQUFBaUJBLFNBTWpCO0dBTmlCO0FBT2pCLFFBQUssY0FBYyxLQUFLLFFBQVEsV0FBVyxXQUFXLGFBQWE7QUFDakUsU0FBSyxzQkFBc0IsU0FBUztLQUNwQzs7RUFHSixrQkFBa0IsVUFBNkIsT0FBZSxNQUFxQjtHQUNqRixNQUFNLGNBQWMsS0FBSyxRQUFRLGlCQUFpQixRQUFRLFNBQVM7R0FDbkUsTUFBTSxlQUFlLEtBQUssUUFBUSxpQkFBaUIsZUFBZSxZQUFZLGdCQUFnQjtBQUM5RixRQUFLLGNBQWMsY0FBYyxPQUFPLEtBQUs7QUFFN0MsT0FBSSxZQUFZLGNBQWMsV0FBVyxHQUFHO0FBQzFDOztBQUdGLFFBQUssS0FBSyxRQUFRLFdBQVcsUUFBUTtJQUNuQyxJQUFJLFlBQVk7SUFDaEIsY0FBYyxLQUFLLFFBQVE7SUFDM0IsZUFBZSxZQUFZO0lBQzNCO0lBQ0E7SUFDQTtJQUNBLFdBQVcsS0FBSyxLQUFLO0lBQ3RCLENBQUM7O0VBR0osTUFBTSxXQUEwQjtBQUM5QixRQUFLLGFBQWE7QUFDbEIsU0FBTSxLQUFLLFFBQVEsV0FBVyxVQUFVOztFQUcxQyxBQUFRLHNCQUFzQixVQUEwQztBQUN0RSxPQUFJLFNBQVMsaUJBQWlCLEtBQUssUUFBUSxRQUFRO0FBQ2pEOztBQUdGLE9BQ0UsU0FBUyxpQkFDVCxTQUFTLGNBQWMsU0FBUyxLQUNoQyxDQUFDLFNBQVMsY0FBYyxTQUFTLEtBQUssUUFBUSxPQUFPLEVBQ3JEO0FBQ0E7O0dBR0YsTUFBTSxjQUFjLEtBQUssUUFBUSxpQkFBaUIsUUFBUSxTQUFTLFNBQVM7QUFDNUUsUUFBSyxjQUNILEtBQUssUUFBUSxpQkFBaUIsZUFBZSxZQUFZLGdCQUFnQixFQUN6RSxTQUFTLE9BQ1QsU0FBUyxLQUNWOztFQUdILEFBQVEsY0FBYyxTQUF1QyxPQUFlLE1BQXFCO0FBQy9GLE9BQUksUUFBUSxXQUFXLEdBQUc7QUFDeEI7O0FBR0YsUUFBSyxrQkFBa0IsS0FBSztJQUMxQjtJQUNBO0lBQ0E7SUFDQSxRQUFRO0lBQ1QsQ0FBQztBQUNGLFFBQUsscUJBQXFCOztFQUc1QixBQUFRLHNCQUE0QjtBQUNsQyxPQUFJLEtBQUssc0JBQXNCO0FBQzdCOztBQUdGLFFBQUssdUJBQXVCO0FBQzVCLHNCQUFtQjtBQUNqQixTQUFLLHVCQUF1QjtBQUM1QixTQUFLLGlCQUFpQjtLQUN0Qjs7RUFHSixBQUFRLGtCQUF3QjtHQUM5QixJQUFJLFlBQVk7QUFFaEIsVUFBTyxLQUFLLGtCQUFrQixTQUFTLEtBQUssWUFBWSxvQkFBb0I7SUFDMUUsTUFBTSxNQUFNLEtBQUssa0JBQWtCO0FBRW5DLFdBQU8sSUFBSSxTQUFTLElBQUksUUFBUSxVQUFVLFlBQVksb0JBQW9CO0FBQ3hFLFVBQUssWUFBWSxJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksT0FBTyxJQUFJLEtBQUs7QUFDOUQsU0FBSSxVQUFVO0FBQ2Qsa0JBQWE7O0FBR2YsUUFBSSxJQUFJLFVBQVUsSUFBSSxRQUFRLFFBQVE7QUFDcEMsVUFBSyxrQkFBa0IsT0FBTzs7O0FBSWxDLE9BQUksS0FBSyxrQkFBa0IsU0FBUyxHQUFHO0FBQ3JDLFNBQUsscUJBQXFCOzs7RUFJOUIsQUFBUSxZQUFZLFlBQXdDLE9BQWUsTUFBcUI7QUFDOUYsT0FBSTtBQUNGLFFBQUksQ0FBQyxXQUFXLFFBQVE7QUFDdEIsZ0JBQVcsZUFBZSxPQUFPLEtBQUs7O1dBRWxDO0FBQ04sZUFBVyxNQUFNLE1BQU0sMkJBQTJCIn0=
249
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtZGVsaXZlcnkuanMiLCJuYW1lcyI6WyJvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlO1xuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcjtcbiAgICAgIGNsdXN0ZXJCdXM6IFdlYlNvY2tldENsdXN0ZXJCdXM7XG4gICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPzogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcjtcbiAgICB9IiwiZW52ZWxvcGU6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZSIsInN0YXR1czogXCJ1bnNldFwiIHwgXCJlcnJvclwiIiwiZXJyb3JUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLWRlbGl2ZXJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRBdWRpZW5jZSB9IGZyb20gXCIuL3dzLWF1ZGllbmNlXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlUmVzb2x2ZXIgfSBmcm9tIFwiLi93cy1hdWRpZW5jZS1yZXNvbHZlclwiO1xuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRDbHVzdGVyQnVzLCB0eXBlIFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZSB9IGZyb20gXCIuL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQgeyB0eXBlIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uIH0gZnJvbSBcIi4vd3MtY29yZVwiO1xuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSB9IGZyb20gXCIuL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmVcIjtcbmltcG9ydCB7XG4gIE5vb3BXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIsXG59IGZyb20gXCIuL3dzLXRlbGVtZXRyeVwiO1xuXG4vLyBmYW4tb3V07J2EIGV2ZW50IGxvb3AgdGljayDri6jsnITroZwg64KY64igIO2VnCDrsojsl5Ag6ri0IOuPmeq4sCDro6jtlITrpbwg66eM65Ok7KeAIOyViuqyjCDtlahcbmNvbnN0IEZBTl9PVVRfQkFUQ0hfU0laRSA9IDI1MDtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldERlbGl2ZXJ5RW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRmFuT3V0Sm9iczogQXJyYXk8e1xuICAgIHRhcmdldHM6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW107XG4gICAgZXZlbnQ6IHN0cmluZztcbiAgICBkYXRhOiB1bmtub3duO1xuICAgIGN1cnNvcjogbnVtYmVyO1xuICB9PiA9IFtdO1xuICBwcml2YXRlIGZhbk91dEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVsZW1ldHJ5OiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHVucmVnaXN0ZXJNZXRyaWNTb3VyY2U6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlO1xuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcjtcbiAgICAgIGNsdXN0ZXJCdXM6IFdlYlNvY2tldENsdXN0ZXJCdXM7XG4gICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPzogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcjtcbiAgICB9LFxuICApIHtcbiAgICB0aGlzLnRlbGVtZXRyeSA9IHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyID8/IG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUgPSB0aGlzLm9wdGlvbnMuY2x1c3RlckJ1cy5zdWJzY3JpYmUoKGVudmVsb3BlKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZUNsdXN0ZXJFbnZlbG9wZShlbnZlbG9wZSk7XG4gICAgfSk7XG4gICAgdGhpcy51bnJlZ2lzdGVyTWV0cmljU291cmNlID0gdGhpcy50ZWxlbWV0cnkucmVnaXN0ZXJNZXRyaWNTb3VyY2Uoe1xuICAgICAgY29sbGVjdDogKCkgPT4gdGhpcy5nZXRUZWxlbWV0cnlTbmFwc2hvdCgpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2U6IFdlYlNvY2tldEF1ZGllbmNlLCBldmVudDogc3RyaW5nLCBkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgcm91dGluZ1BsYW4gPSB0aGlzLm9wdGlvbnMuYXVkaWVuY2VSZXNvbHZlci5yZXNvbHZlKGF1ZGllbmNlKTtcbiAgICBjb25zdCBsb2NhbFRhcmdldHMgPSB0aGlzLm9wdGlvbnMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9ucyhyb3V0aW5nUGxhbi5sb2NhbFNlc3Npb25JZHMpO1xuXG4gICAgdGhpcy50ZWxlbWV0cnkuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLmZhbm91dC5yZXNvbHZlZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBsb2NhbFRhcmdldENvdW50OiBsb2NhbFRhcmdldHMubGVuZ3RoLFxuICAgICAgICByZW1vdGVOb2RlQ291bnQ6IHJvdXRpbmdQbGFuLnJlbW90ZU5vZGVJZHMubGVuZ3RoLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnRlbGVtZXRyeS5yZWNvcmRNZXRyaWMoe1xuICAgICAgbmFtZTogXCJzb25hbXUud3MuZmFub3V0LnRhcmdldHNcIixcbiAgICAgIGtpbmQ6IFwiaGlzdG9ncmFtXCIsXG4gICAgICB2YWx1ZTogbG9jYWxUYXJnZXRzLmxlbmd0aCArIHJvdXRpbmdQbGFuLnJlbW90ZU5vZGVJZHMubGVuZ3RoLFxuICAgICAgdW5pdDogXCIxXCIsXG4gICAgICB0YWdzOiB7IGF1ZGllbmNlX3R5cGU6IGF1ZGllbmNlLnR5cGUgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZW5xdWV1ZUZhbk91dChsb2NhbFRhcmdldHMsIGV2ZW50LCBkYXRhKTtcblxuICAgIGlmIChyb3V0aW5nUGxhbi5yZW1vdGVOb2RlSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmVsb3BlOiBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGUgPSB7XG4gICAgICBpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgc291cmNlTm9kZUlkOiB0aGlzLm9wdGlvbnMubm9kZUlkLFxuICAgICAgdGFyZ2V0Tm9kZUlkczogcm91dGluZ1BsYW4ucmVtb3RlTm9kZUlkcyxcbiAgICAgIGF1ZGllbmNlLFxuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgZW1pdHRlZEF0OiBEYXRlLm5vdygpLFxuICAgIH07XG5cbiAgICBjb25zdCBwdWJsaXNoU3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHRoaXMub3B0aW9ucy5jbHVzdGVyQnVzLnB1Ymxpc2goZW52ZWxvcGUpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBwdWJsaXNoU3RhcnRlZEF0O1xuICAgICAgICB0aGlzLnRlbGVtZXRyeS5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLmNsdXN0ZXIuZW52ZWxvcGUucHVibGlzaGVkXCIsXG4gICAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQsIHRhcmdldE5vZGVDb3VudDogcm91dGluZ1BsYW4ucmVtb3RlTm9kZUlkcy5sZW5ndGggfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGVsZW1ldHJ5LnJlY29yZFNwYW4oe1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MuY2x1c3Rlci5wdWJsaXNoXCIsXG4gICAgICAgICAga2luZDogXCJwcm9kdWNlclwiLFxuICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgc3RhdHVzOiBcInVuc2V0XCIsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB0YXJnZXROb2RlQ291bnQ6IHJvdXRpbmdQbGFuLnJlbW90ZU5vZGVJZHMubGVuZ3RoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gcHVibGlzaFN0YXJ0ZWRBdDtcbiAgICAgICAgdGhpcy50ZWxlbWV0cnkuZW1pdCh7XG4gICAgICAgICAgbmFtZTogXCJ3cy5jbHVzdGVyLmVudmVsb3BlLmZhaWxlZFwiLFxuICAgICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgICAgZGV0YWlsOiB7IGV2ZW50IH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRlbGVtZXRyeS5yZWNvcmRTcGFuKHtcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBcIndzLmNsdXN0ZXIucHVibGlzaFwiLFxuICAgICAgICAgIGtpbmQ6IFwicHJvZHVjZXJcIixcbiAgICAgICAgICBkdXJhdGlvbk1zLFxuICAgICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQgfSxcbiAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTWV0cmljU291cmNlKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5jbHVzdGVyQnVzLnNodXRkb3duKCk7XG4gIH1cblxuICBnZXRUZWxlbWV0cnlTbmFwc2hvdCgpOiB7IHBlbmRpbmdGYW5PdXRKb2JzOiBudW1iZXI7IHBlbmRpbmdGYW5PdXRUYXJnZXRzOiBudW1iZXIgfSB7XG4gICAgbGV0IHBlbmRpbmdGYW5PdXRUYXJnZXRzID0gMDtcblxuICAgIGZvciAoY29uc3Qgam9iIG9mIHRoaXMucGVuZGluZ0Zhbk91dEpvYnMpIHtcbiAgICAgIHBlbmRpbmdGYW5PdXRUYXJnZXRzICs9IE1hdGgubWF4KGpvYi50YXJnZXRzLmxlbmd0aCAtIGpvYi5jdXJzb3IsIDApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nRmFuT3V0Sm9iczogdGhpcy5wZW5kaW5nRmFuT3V0Sm9icy5sZW5ndGgsXG4gICAgICBwZW5kaW5nRmFuT3V0VGFyZ2V0cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbHVzdGVyRW52ZWxvcGUoZW52ZWxvcGU6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZSk6IHZvaWQge1xuICAgIGlmIChlbnZlbG9wZS5zb3VyY2VOb2RlSWQgPT09IHRoaXMub3B0aW9ucy5ub2RlSWQpIHtcbiAgICAgIHRoaXMudGVsZW1ldHJ5LmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmNsdXN0ZXIuZW52ZWxvcGUuaWdub3JlZFwiLFxuICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICBkZXRhaWw6IHsgcmVhc29uOiBcInNlbGZTb3VyY2VcIiwgZXZlbnQ6IGVudmVsb3BlLmV2ZW50IH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlbnZlbG9wZS50YXJnZXROb2RlSWRzICYmXG4gICAgICBlbnZlbG9wZS50YXJnZXROb2RlSWRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICFlbnZlbG9wZS50YXJnZXROb2RlSWRzLmluY2x1ZGVzKHRoaXMub3B0aW9ucy5ub2RlSWQpXG4gICAgKSB7XG4gICAgICB0aGlzLnRlbGVtZXRyeS5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5jbHVzdGVyLmVudmVsb3BlLmlnbm9yZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgZGV0YWlsOiB7IHJlYXNvbjogXCJ0YXJnZXRNaXNtYXRjaFwiLCBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIHRoaXMudGVsZW1ldHJ5LmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jbHVzdGVyLmVudmVsb3BlLnJlY2VpdmVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgZGV0YWlsOiB7IGV2ZW50OiBlbnZlbG9wZS5ldmVudCwgc291cmNlTm9kZUlkOiBlbnZlbG9wZS5zb3VyY2VOb2RlSWQgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvdXRpbmdQbGFuID0gdGhpcy5vcHRpb25zLmF1ZGllbmNlUmVzb2x2ZXIucmVzb2x2ZShlbnZlbG9wZS5hdWRpZW5jZSk7XG4gICAgY29uc3QgbG9jYWxUYXJnZXRzID0gdGhpcy5vcHRpb25zLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbnMocm91dGluZ1BsYW4ubG9jYWxTZXNzaW9uSWRzKTtcbiAgICB0aGlzLmVucXVldWVGYW5PdXQobG9jYWxUYXJnZXRzLCBlbnZlbG9wZS5ldmVudCwgZW52ZWxvcGUuZGF0YSk7XG5cbiAgICB0aGlzLnRlbGVtZXRyeS5yZWNvcmRTcGFuKHtcbiAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MuY2x1c3Rlci5yZWNlaXZlXCIsXG4gICAgICBraW5kOiBcImNvbnN1bWVyXCIsXG4gICAgICBkdXJhdGlvbk1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIHN0YXR1czogXCJ1bnNldFwiLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBldmVudDogZW52ZWxvcGUuZXZlbnQsXG4gICAgICAgIHNvdXJjZU5vZGVJZDogZW52ZWxvcGUuc291cmNlTm9kZUlkLFxuICAgICAgICBsb2NhbFRhcmdldENvdW50OiBsb2NhbFRhcmdldHMubGVuZ3RoLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5xdWV1ZUZhbk91dCh0YXJnZXRzOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbltdLCBldmVudDogc3RyaW5nLCBkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nRmFuT3V0Sm9icy5wdXNoKHtcbiAgICAgIHRhcmdldHMsXG4gICAgICBldmVudCxcbiAgICAgIGRhdGEsXG4gICAgICBjdXJzb3I6IDAsXG4gICAgfSk7XG4gICAgdGhpcy50ZWxlbWV0cnkuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLmZhbm91dC5lbnF1ZXVlZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGRldGFpbDogeyB0YXJnZXRDb3VudDogdGFyZ2V0cy5sZW5ndGgsIGV2ZW50IH0sXG4gICAgfSk7XG4gICAgdGhpcy5zY2hlZHVsZUZhbk91dEZsdXNoKCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlRmFuT3V0Rmx1c2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmFuT3V0Rmx1c2hTY2hlZHVsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZhbk91dEZsdXNoU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgdGhpcy5mYW5PdXRGbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5mbHVzaEZhbk91dEpvYnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hGYW5PdXRKb2JzKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGxldCBwcm9jZXNzZWQgPSAwO1xuICAgIGxldCBzdGF0dXM6IFwidW5zZXRcIiB8IFwiZXJyb3JcIiA9IFwidW5zZXRcIjtcbiAgICBsZXQgZXJyb3JUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgd2hpbGUgKHRoaXMucGVuZGluZ0Zhbk91dEpvYnMubGVuZ3RoID4gMCAmJiBwcm9jZXNzZWQgPCBGQU5fT1VUX0JBVENIX1NJWkUpIHtcbiAgICAgICAgY29uc3Qgam9iID0gdGhpcy5wZW5kaW5nRmFuT3V0Sm9ic1swXTtcblxuICAgICAgICB3aGlsZSAoam9iLmN1cnNvciA8IGpvYi50YXJnZXRzLmxlbmd0aCAmJiBwcm9jZXNzZWQgPCBGQU5fT1VUX0JBVENIX1NJWkUpIHtcbiAgICAgICAgICB0aGlzLnNhZmVQdWJsaXNoKGpvYi50YXJnZXRzW2pvYi5jdXJzb3JdLCBqb2IuZXZlbnQsIGpvYi5kYXRhKTtcbiAgICAgICAgICBqb2IuY3Vyc29yICs9IDE7XG4gICAgICAgICAgcHJvY2Vzc2VkICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9iLmN1cnNvciA+PSBqb2IudGFyZ2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdGYW5PdXRKb2JzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc3RhdHVzID0gXCJlcnJvclwiO1xuICAgICAgZXJyb3JUeXBlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm5hbWUgOiB0eXBlb2YgZXJyb3I7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgdGhpcy50ZWxlbWV0cnkuZW1pdCh7XG4gICAgICAgIG5hbWU6IFwid3MuZmFub3V0LmZsdXNoZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgZGV0YWlsOiB7IHByb2Nlc3NlZENvdW50OiBwcm9jZXNzZWQgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy50ZWxlbWV0cnkucmVjb3JkU3Bhbih7XG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MuZmFub3V0LmRpc3BhdGNoXCIsXG4gICAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7IHByb2Nlc3NlZENvdW50OiBwcm9jZXNzZWQgfSxcbiAgICAgICAgZXJyb3JUeXBlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnBlbmRpbmdGYW5PdXRKb2JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZUZhbk91dEZsdXNoKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYWZlUHVibGlzaChjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24uY2xvc2VkKSB7XG4gICAgICAgIGNvbm5lY3Rpb24ucHVibGlzaFVudHlwZWQoZXZlbnQsIGRhdGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy50ZWxlbWV0cnkuZW1pdCh7XG4gICAgICAgIG5hbWU6IFwid3MuZmFub3V0LnB1Ymxpc2guZmFpbGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIGNvbm5lY3Rpb25JZDogY29ubmVjdGlvbi5pZCxcbiAgICAgICAgbmFtZXNwYWNlOiBjb25uZWN0aW9uLm5hbWVzcGFjZSxcbiAgICAgICAgdXNlcklkOiBjb25uZWN0aW9uLnVzZXJJZCxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50IH0sXG4gICAgICB9KTtcbiAgICAgIGNvbm5lY3Rpb24uY2xvc2UoMTAxMSwgXCJXZWJTb2NrZXQgcHVibGlzaCBmYWlsZWRcIik7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7b0JBVXdCO0NBR2xCLHFCQUFxQjtDQUVkLDBCQUFiLE1BQXFDO0VBQ25DLEFBQWlCLG9CQUtaLEVBQUU7RUFDUCxBQUFRLHVCQUF1QjtFQUMvQixBQUFpQjtFQUNqQixBQUFpQjtFQUNqQixBQUFpQjtFQUVqQixZQUNFLEFBQWlCQSxTQU9qQjtHQVBpQjtBQVFqQixRQUFLLFlBQVksS0FBSyxRQUFRLHVCQUF1QixJQUFJLGtDQUFrQztBQUMzRixRQUFLLGNBQWMsS0FBSyxRQUFRLFdBQVcsV0FBVyxhQUFhO0FBQ2pFLFNBQUssc0JBQXNCLFNBQVM7S0FDcEM7QUFDRixRQUFLLHlCQUF5QixLQUFLLFVBQVUscUJBQXFCLEVBQ2hFLGVBQWUsS0FBSyxzQkFBc0IsRUFDM0MsQ0FBQzs7RUFHSixrQkFBa0IsVUFBNkIsT0FBZSxNQUFxQjtHQUNqRixNQUFNLGNBQWMsS0FBSyxRQUFRLGlCQUFpQixRQUFRLFNBQVM7R0FDbkUsTUFBTSxlQUFlLEtBQUssUUFBUSxpQkFBaUIsZUFBZSxZQUFZLGdCQUFnQjtBQUU5RixRQUFLLFVBQVUsS0FBSztJQUNsQixNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7S0FDTixrQkFBa0Is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
@@ -1,10 +1,12 @@
1
1
  import { type ManagedWebSocketConnection } from "./ws-core";
2
+ import { type WebSocketTelemetryConnectionSnapshot } from "./ws-telemetry";
2
3
  export declare class WebSocketLocalConnectionStore {
3
4
  private readonly connections;
4
5
  register(connection: ManagedWebSocketConnection): void;
5
6
  unregister(connectionId: string): void;
6
7
  getConnection(connectionId: string): ManagedWebSocketConnection | undefined;
7
8
  getConnections(connectionIds: string[]): ManagedWebSocketConnection[];
9
+ getTelemetrySnapshot(): WebSocketTelemetryConnectionSnapshot;
8
10
  closeAll(code?: number, reason?: string): void;
9
11
  }
10
12
  //# sourceMappingURL=ws-local-connection-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ws-local-connection-store.d.ts","sourceRoot":"","sources":["../../src/stream/ws-local-connection-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAE5D,qBAAa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiD;IAE7E,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI;IAItD,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAItC,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS;IAI3E,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,0BAA0B,EAAE;IAqBrE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAK/C"}
1
+ {"version":3,"file":"ws-local-connection-store.d.ts","sourceRoot":"","sources":["../../src/stream/ws-local-connection-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EACL,KAAK,oCAAoC,EAE1C,MAAM,gBAAgB,CAAC;AAExB,qBAAa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiD;IAE7E,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI;IAItD,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAItC,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS;IAI3E,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,0BAA0B,EAAE;IAqBrE,oBAAoB,IAAI,oCAAoC;IAqB5D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAK/C"}
@@ -1,6 +1,9 @@
1
1
  import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
2
 
3
3
  //#region src/stream/ws-local-connection-store.ts
4
+ function isTelemetryInspectableConnection(connection) {
5
+ return "getTelemetrySnapshot" in connection && typeof connection.getTelemetrySnapshot === "function";
6
+ }
4
7
  var WebSocketLocalConnectionStore;
5
8
  var init_ws_local_connection_store = __esmMin((() => {
6
9
  WebSocketLocalConnectionStore = class {
@@ -30,6 +33,23 @@ var init_ws_local_connection_store = __esmMin((() => {
30
33
  }
31
34
  return targets;
32
35
  }
36
+ getTelemetrySnapshot() {
37
+ const snapshot = {
38
+ pendingInboundMessages: 0,
39
+ pendingOutboundMessages: 0,
40
+ socketBufferedBytes: 0
41
+ };
42
+ for (const connection of this.connections.values()) {
43
+ if (!isTelemetryInspectableConnection(connection)) {
44
+ continue;
45
+ }
46
+ const connectionSnapshot = connection.getTelemetrySnapshot();
47
+ snapshot.pendingInboundMessages += connectionSnapshot.pendingInboundMessages;
48
+ snapshot.pendingOutboundMessages += connectionSnapshot.pendingOutboundMessages;
49
+ snapshot.socketBufferedBytes += connectionSnapshot.socketBufferedBytes;
50
+ }
51
+ return snapshot;
52
+ }
33
53
  closeAll(code, reason) {
34
54
  for (const connection of this.connections.values()) {
35
55
  connection.close(code, reason);
@@ -41,4 +61,4 @@ var init_ws_local_connection_store = __esmMin((() => {
41
61
  //#endregion
42
62
  init_ws_local_connection_store();
43
63
  export { WebSocketLocalConnectionStore, init_ws_local_connection_store };
44
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtbG9jYWwtY29ubmVjdGlvbi1zdG9yZS5qcyIsIm5hbWVzIjpbInRhcmdldHM6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gXCIuL3dzLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbj4oKTtcblxuICByZWdpc3Rlcihjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb24uaWQsIGNvbm5lY3Rpb24pO1xuICB9XG5cbiAgdW5yZWdpc3Rlcihjb25uZWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvbnMoY29ubmVjdGlvbklkczogc3RyaW5nW10pOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbltdIHtcbiAgICBjb25zdCB0YXJnZXRzOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbltdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uSWQgb2YgY29ubmVjdGlvbklkcykge1xuICAgICAgaWYgKHNlZW4uaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChjb25uZWN0aW9uSWQpO1xuXG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKTtcbiAgICAgIGlmICghY29ubmVjdGlvbiB8fCBjb25uZWN0aW9uLmNsb3NlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0cy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRzO1xuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGNvbm5lY3Rpb24uY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Q0FFYSxnQ0FBYixNQUEyQztFQUN6QyxBQUFpQixjQUFjLElBQUksS0FBeUM7RUFFNUUsU0FBUyxZQUE4QztBQUNyRCxRQUFLLFlBQVksSUFBSSxXQUFXLElBQUksV0FBVzs7RUFHakQsV0FBVyxjQUE0QjtBQUNyQyxRQUFLLFlBQVksT0FBTyxhQUFhOztFQUd2QyxjQUFjLGNBQThEO0FBQzFFLFVBQU8sS0FBSyxZQUFZLElBQUksYUFBYTs7RUFHM0MsZUFBZSxlQUF1RDtHQUNwRSxNQUFNQSxVQUF3QyxFQUFFO0dBQ2hELE1BQU0sT0FBTyxJQUFJLEtBQWE7QUFFOUIsUUFBSyxNQUFNLGdCQUFnQixlQUFlO0FBQ3hDLFFBQUksS0FBSyxJQUFJLGFBQWEsRUFBRTtBQUMxQjs7QUFFRixTQUFLLElBQUksYUFBYTtJQUV0QixNQUFNLGFBQWEsS0FBSyxZQUFZLElBQUksYUFBYTtBQUNyRCxRQUFJLENBQUMsY0FBYyxXQUFXLFFBQVE7QUFDcEM7O0FBR0YsWUFBUSxLQUFLLFdBQVc7O0FBRzFCLFVBQU87O0VBR1QsU0FBUyxNQUFlLFFBQXVCO0FBQzdDLFFBQUssTUFBTSxjQUFjLEtBQUssWUFBWSxRQUFRLEVBQUU7QUFDbEQsZUFBVyxNQUFNLE1BQU0sT0FBTyJ9
64
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtbG9jYWwtY29ubmVjdGlvbi1zdG9yZS5qcyIsIm5hbWVzIjpbInRhcmdldHM6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW10iLCJzbmFwc2hvdDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvblNuYXBzaG90Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1sb2NhbC1jb25uZWN0aW9uLXN0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQge1xuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCxcbiAgdHlwZSBUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24sXG59IGZyb20gXCIuL3dzLXRlbGVtZXRyeVwiO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TG9jYWxDb25uZWN0aW9uU3RvcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uPigpO1xuXG4gIHJlZ2lzdGVyKGNvbm5lY3Rpb246IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9ucy5zZXQoY29ubmVjdGlvbi5pZCwgY29ubmVjdGlvbik7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkOiBzdHJpbmcpOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9ucyhjb25uZWN0aW9uSWRzOiBzdHJpbmdbXSk6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW10ge1xuICAgIGNvbnN0IHRhcmdldHM6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb25JZCBvZiBjb25uZWN0aW9uSWRzKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29ubmVjdGlvbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGNvbm5lY3Rpb25JZCk7XG5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpO1xuICAgICAgaWYgKCFjb25uZWN0aW9uIHx8IGNvbm5lY3Rpb24uY2xvc2VkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0YXJnZXRzLnB1c2goY29ubmVjdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldHM7XG4gIH1cblxuICBnZXRUZWxlbWV0cnlTbmFwc2hvdCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90OiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uU25hcHNob3QgPSB7XG4gICAgICBwZW5kaW5nSW5ib3VuZE1lc3NhZ2VzOiAwLFxuICAgICAgcGVuZGluZ091dGJvdW5kTWVzc2FnZXM6IDAsXG4gICAgICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiAwLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFpc1RlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbihjb25uZWN0aW9uKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29ubmVjdGlvblNuYXBzaG90ID0gY29ubmVjdGlvbi5nZXRUZWxlbWV0cnlTbmFwc2hvdCgpO1xuICAgICAgc25hcHNob3QucGVuZGluZ0luYm91bmRNZXNzYWdlcyArPSBjb25uZWN0aW9uU25hcHNob3QucGVuZGluZ0luYm91bmRNZXNzYWdlcztcbiAgICAgIHNuYXBzaG90LnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzICs9IGNvbm5lY3Rpb25TbmFwc2hvdC5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcztcbiAgICAgIHNuYXBzaG90LnNvY2tldEJ1ZmZlcmVkQnl0ZXMgKz0gY29ubmVjdGlvblNuYXBzaG90LnNvY2tldEJ1ZmZlcmVkQnl0ZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGNvbm5lY3Rpb24uY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24oXG4gIGNvbm5lY3Rpb246IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uLFxuKTogY29ubmVjdGlvbiBpcyBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiAmIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbiB7XG4gIHJldHVybiAoXG4gICAgXCJnZXRUZWxlbWV0cnlTbmFwc2hvdFwiIGluIGNvbm5lY3Rpb24gJiYgdHlwZW9mIGNvbm5lY3Rpb24uZ2V0VGVsZW1ldHJ5U25hcHNob3QgPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFzRUEsU0FBUyxpQ0FDUCxZQUMyRTtBQUMzRSxRQUNFLDBCQUEwQixjQUFjLE9BQU8sV0FBVyx5QkFBeUI7Ozs7Q0FwRTFFLGdDQUFiLE1BQTJDO0VBQ3pDLEFBQWlCLGNBQWMsSUFBSSxLQUF5QztFQUU1RSxTQUFTLFlBQThDO0FBQ3JELFFBQUssWUFBWSxJQUFJLFdBQVcsSUFBSSxXQUFXOztFQUdqRCxXQUFXLGNBQTRCO0FBQ3JDLFFBQUssWUFBWSxPQUFPLGFBQWE7O0VBR3ZDLGNBQWMsY0FBOEQ7QUFDMUUsVUFBTyxLQUFLLFlBQVksSUFBSSxhQUFhOztFQUczQyxlQUFlLGVBQXVEO0dBQ3BFLE1BQU1BLFVBQXdDLEVBQUU7R0FDaEQsTUFBTSxPQUFPLElBQUksS0FBYTtBQUU5QixRQUFLLE1BQU0sZ0JBQWdCLGVBQWU7QUFDeEMsUUFBSSxLQUFLLElBQUksYUFBYSxFQUFFO0FBQzFCOztBQUVGLFNBQUssSUFBSSxhQUFhO0lBRXRCLE1BQU0sYUFBYSxLQUFLLFlBQVksSUFBSSxhQUFhO0FBQ3JELFFBQUksQ0FBQyxjQUFjLFdBQVcsUUFBUTtBQUNwQzs7QUFHRixZQUFRLEtBQUssV0FBVzs7QUFHMUIsVUFBTzs7RUFHVCx1QkFBNkQ7R0FDM0QsTUFBTUMsV0FBaUQ7SUFDckQsd0JBQXdCO0lBQ3hCLHlCQUF5QjtJQUN6QixxQkFBcUI7SUFDdEI7QUFFRCxRQUFLLE1BQU0sY0FBYyxLQUFLLFlBQVksUUFBUSxFQUFFO0FBQ2xELFFBQUksQ0FBQyxpQ0FBaUMsV0FBVyxFQUFFO0FBQ2pEOztJQUdGLE1BQU0scUJBQXFCLFdBQVcsc0JBQXNCO0FBQzVELGFBQVMsMEJBQTBCLG1CQUFtQjtBQUN0RCxhQUFTLDJCQUEyQixtQkFBbUI7QUFDdkQsYUFBUyx1QkFBdUIsbUJBQW1COztBQUdyRCxVQUFPOztFQUdULFNBQVMsTUFBZSxRQUF1QjtBQUM3QyxRQUFLLE1BQU0sY0FBYyxLQUFLLFlBQVksUUFBUSxFQUFFO0FBQ2xELGVBQVcsTUFBTSxNQUFNLE9BQU8ifQ==
@@ -5,12 +5,14 @@ import { type ManagedWebSocketConnection, type WebSocketRegistryStats, type WebS
5
5
  import { WebSocketDeliveryEngine } from "./ws-delivery";
6
6
  import { WebSocketLocalConnectionStore } from "./ws-local-connection-store";
7
7
  import { type WebSocketPresenceStore, type WebSocketSessionPresence } from "./ws-presence-store";
8
+ import { type WebSocketTelemetryController } from "./ws-telemetry";
8
9
  export type { ManagedWebSocketConnection, WebSocketRegistryStats, WebSocketRoomId, WebSocketUserId, };
9
10
  export type WebSocketConnectionMeta = WebSocketSessionPresence;
10
11
  export type WebSocketRegistryOptions = {
11
- nodeId?: string;
12
+ nodeId: string;
12
13
  presenceStore?: WebSocketPresenceStore;
13
14
  clusterBus?: WebSocketClusterBus;
15
+ telemetryController?: WebSocketTelemetryController;
14
16
  };
15
17
  export declare class WebSocketRegistry {
16
18
  readonly nodeId: string;
@@ -19,7 +21,8 @@ export declare class WebSocketRegistry {
19
21
  readonly clusterBus: WebSocketClusterBus;
20
22
  readonly audienceResolver: WebSocketAudienceResolver;
21
23
  readonly deliveryEngine: WebSocketDeliveryEngine;
22
- constructor(options?: WebSocketRegistryOptions);
24
+ readonly telemetryController: WebSocketTelemetryController;
25
+ constructor(options: WebSocketRegistryOptions);
23
26
  register(connection: ManagedWebSocketConnection, active?: boolean): WebSocketConnectionMeta;
24
27
  activate(connectionId: string): void;
25
28
  unregister(connectionId: string): void;
@@ -28,6 +31,7 @@ export declare class WebSocketRegistry {
28
31
  clearUserId(connectionId: string): void;
29
32
  join(connectionId: string, roomId: WebSocketRoomId): void;
30
33
  leave(connectionId: string, roomId: WebSocketRoomId): void;
34
+ private emitMutationSkipped;
31
35
  broadcast(event: string, data: unknown, namespace?: string): void;
32
36
  publishToRoom(roomId: WebSocketRoomId, event: string, data: unknown, namespace?: string): void;
33
37
  publishToUser(userId: WebSocketUserId, event: string, data: unknown, namespace?: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ws-registry.d.ts","sourceRoot":"","sources":["../../src/stream/ws-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws-registry.d.ts","sourceRoot":"","sources":["../../src/stream/ws-registry.ts"],"names":[],"mappings":"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"}