sonamu 0.9.4 → 0.9.6

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 (171) hide show
  1. package/dist/ai/providers/rtzr/utils.js +2 -2
  2. package/dist/api/config.d.ts +13 -2
  3. package/dist/api/config.d.ts.map +1 -1
  4. package/dist/api/config.js +1 -1
  5. package/dist/api/context.d.ts +17 -7
  6. package/dist/api/context.d.ts.map +1 -1
  7. package/dist/api/context.js +1 -1
  8. package/dist/api/decorators.d.ts +18 -0
  9. package/dist/api/decorators.d.ts.map +1 -1
  10. package/dist/api/decorators.js +54 -3
  11. package/dist/api/index.js +8 -3
  12. package/dist/api/sonamu.d.ts +24 -9
  13. package/dist/api/sonamu.d.ts.map +1 -1
  14. package/dist/api/sonamu.js +365 -79
  15. package/dist/api/websocket-helpers.d.ts +24 -0
  16. package/dist/api/websocket-helpers.d.ts.map +1 -0
  17. package/dist/api/websocket-helpers.js +77 -0
  18. package/dist/bin/cli.js +12 -4
  19. package/dist/database/upsert-builder.js +4 -4
  20. package/dist/dict/sonamu-dictionary.js +6 -6
  21. package/dist/entity/entity-manager.js +1 -1
  22. package/dist/entity/entity.js +3 -3
  23. package/dist/index.d.ts +6 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -4
  26. package/dist/migration/code-generation.d.ts.map +1 -1
  27. package/dist/migration/code-generation.js +8 -9
  28. package/dist/stream/index.d.ts +6 -0
  29. package/dist/stream/index.d.ts.map +1 -1
  30. package/dist/stream/index.js +13 -2
  31. package/dist/stream/ws-audience-resolver.d.ts +15 -0
  32. package/dist/stream/ws-audience-resolver.d.ts.map +1 -0
  33. package/dist/stream/ws-audience-resolver.js +31 -0
  34. package/dist/stream/ws-audience.d.ts +28 -0
  35. package/dist/stream/ws-audience.d.ts.map +1 -0
  36. package/dist/stream/ws-audience.js +46 -0
  37. package/dist/stream/ws-cluster-bus.d.ts +23 -0
  38. package/dist/stream/ws-cluster-bus.d.ts.map +1 -0
  39. package/dist/stream/ws-cluster-bus.js +18 -0
  40. package/dist/stream/ws-core.d.ts +15 -0
  41. package/dist/stream/ws-core.d.ts.map +1 -0
  42. package/dist/stream/ws-core.js +1 -0
  43. package/dist/stream/ws-delivery.d.ts +24 -0
  44. package/dist/stream/ws-delivery.d.ts.map +1 -0
  45. package/dist/stream/ws-delivery.js +103 -0
  46. package/dist/stream/ws-local-connection-store.d.ts +10 -0
  47. package/dist/stream/ws-local-connection-store.d.ts.map +1 -0
  48. package/dist/stream/ws-local-connection-store.js +44 -0
  49. package/dist/stream/ws-presence-store.d.ts +61 -0
  50. package/dist/stream/ws-presence-store.d.ts.map +1 -0
  51. package/dist/stream/ws-presence-store.js +236 -0
  52. package/dist/stream/ws-registry.d.ts +42 -0
  53. package/dist/stream/ws-registry.d.ts.map +1 -0
  54. package/dist/stream/ws-registry.js +108 -0
  55. package/dist/stream/ws.d.ts +52 -0
  56. package/dist/stream/ws.d.ts.map +1 -0
  57. package/dist/stream/ws.js +397 -0
  58. package/dist/syncer/api-parser.d.ts.map +1 -1
  59. package/dist/syncer/api-parser.js +72 -2
  60. package/dist/syncer/checksum.d.ts.map +1 -1
  61. package/dist/syncer/checksum.js +13 -12
  62. package/dist/syncer/code-generator.d.ts.map +1 -1
  63. package/dist/syncer/code-generator.js +7 -4
  64. package/dist/syncer/event-batcher.d.ts +27 -0
  65. package/dist/syncer/event-batcher.d.ts.map +1 -0
  66. package/dist/syncer/event-batcher.js +69 -0
  67. package/dist/syncer/file-patterns.d.ts +48 -26
  68. package/dist/syncer/file-patterns.d.ts.map +1 -1
  69. package/dist/syncer/file-patterns.js +71 -23
  70. package/dist/syncer/file-tracking.d.ts +13 -0
  71. package/dist/syncer/file-tracking.d.ts.map +1 -0
  72. package/dist/syncer/file-tracking.js +33 -0
  73. package/dist/syncer/index.js +2 -2
  74. package/dist/syncer/module-loader.d.ts +2 -11
  75. package/dist/syncer/module-loader.d.ts.map +1 -1
  76. package/dist/syncer/module-loader.js +3 -3
  77. package/dist/syncer/syncer-actions.d.ts +39 -6
  78. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  79. package/dist/syncer/syncer-actions.js +125 -10
  80. package/dist/syncer/syncer.d.ts +33 -19
  81. package/dist/syncer/syncer.d.ts.map +1 -1
  82. package/dist/syncer/syncer.js +168 -168
  83. package/dist/syncer/watcher.d.ts +8 -0
  84. package/dist/syncer/watcher.d.ts.map +1 -0
  85. package/dist/syncer/watcher.js +105 -0
  86. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  87. package/dist/tasks/workflow-manager.js +2 -1
  88. package/dist/template/implementations/services.template.d.ts.map +1 -1
  89. package/dist/template/implementations/services.template.js +36 -1
  90. package/dist/testing/bootstrap.d.ts.map +1 -1
  91. package/dist/testing/bootstrap.js +8 -1
  92. package/dist/testing/data-explorer.d.ts.map +1 -1
  93. package/dist/testing/data-explorer.js +5 -3
  94. package/dist/testing/fixture-manager.js +1 -1
  95. package/dist/types/types.d.ts +2 -1
  96. package/dist/types/types.d.ts.map +1 -1
  97. package/dist/types/types.js +2 -2
  98. package/dist/ui/api.d.ts.map +1 -1
  99. package/dist/ui/api.js +4 -3
  100. package/dist/ui/cdd-service.js +1 -1
  101. package/dist/ui-web/assets/{index-C5KUjXm0.js → index-BmThfg-s.js} +39 -39
  102. package/dist/ui-web/assets/index-D4rYm-Xz.css +1 -0
  103. package/dist/ui-web/index.html +2 -2
  104. package/dist/utils/async-utils.d.ts +27 -3
  105. package/dist/utils/async-utils.d.ts.map +1 -1
  106. package/dist/utils/async-utils.js +56 -6
  107. package/dist/utils/formatter.d.ts +7 -1
  108. package/dist/utils/formatter.d.ts.map +1 -1
  109. package/dist/utils/formatter.js +95 -60
  110. package/dist/utils/fs-utils.d.ts +2 -0
  111. package/dist/utils/fs-utils.d.ts.map +1 -1
  112. package/dist/utils/fs-utils.js +10 -2
  113. package/dist/utils/process-utils.d.ts +6 -0
  114. package/dist/utils/process-utils.d.ts.map +1 -1
  115. package/dist/utils/process-utils.js +16 -3
  116. package/dist/utils/utils.d.ts +1 -0
  117. package/dist/utils/utils.d.ts.map +1 -1
  118. package/dist/utils/utils.js +2 -2
  119. package/package.json +7 -5
  120. package/src/ai/providers/rtzr/utils.ts +1 -1
  121. package/src/api/__tests__/sonamu.websocket.test.ts +64 -0
  122. package/src/api/__tests__/websocket-context.types.test.ts +58 -0
  123. package/src/api/config.ts +28 -2
  124. package/src/api/context.ts +21 -7
  125. package/src/api/decorators.ts +101 -1
  126. package/src/api/sonamu.ts +529 -127
  127. package/src/api/websocket-helpers.ts +122 -0
  128. package/src/bin/cli.ts +10 -2
  129. package/src/database/upsert-builder.ts +3 -3
  130. package/src/dict/sonamu-dictionary.ts +3 -3
  131. package/src/entity/entity.ts +1 -1
  132. package/src/index.ts +6 -0
  133. package/src/migration/code-generation.ts +6 -11
  134. package/src/shared/app.shared.ts.txt +312 -4
  135. package/src/shared/web.shared.ts.txt +340 -4
  136. package/src/stream/__tests__/ws-contracts.test.ts +381 -0
  137. package/src/stream/__tests__/ws.test.ts +449 -0
  138. package/src/stream/index.ts +6 -0
  139. package/src/stream/ws-audience-resolver.ts +35 -0
  140. package/src/stream/ws-audience.ts +62 -0
  141. package/src/stream/ws-cluster-bus.ts +32 -0
  142. package/src/stream/ws-core.ts +16 -0
  143. package/src/stream/ws-delivery.ts +138 -0
  144. package/src/stream/ws-local-connection-store.ts +44 -0
  145. package/src/stream/ws-presence-store.ts +326 -0
  146. package/src/stream/ws-registry.ts +138 -0
  147. package/src/stream/ws.ts +591 -0
  148. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +78 -0
  149. package/src/syncer/api-parser.ts +112 -1
  150. package/src/syncer/checksum.ts +23 -29
  151. package/src/syncer/code-generator.ts +4 -1
  152. package/src/syncer/event-batcher.ts +72 -0
  153. package/src/syncer/file-patterns.ts +98 -30
  154. package/src/syncer/file-tracking.ts +27 -0
  155. package/src/syncer/module-loader.ts +5 -12
  156. package/src/syncer/syncer-actions.ts +179 -17
  157. package/src/syncer/syncer.ts +250 -287
  158. package/src/syncer/watcher.ts +128 -0
  159. package/src/tasks/workflow-manager.ts +1 -0
  160. package/src/template/__tests__/services.template.websocket.test.ts +79 -0
  161. package/src/template/implementations/services.template.ts +69 -0
  162. package/src/testing/bootstrap.ts +8 -1
  163. package/src/testing/data-explorer.ts +3 -2
  164. package/src/types/types.ts +20 -2
  165. package/src/ui/api.ts +10 -1
  166. package/src/utils/async-utils.ts +71 -4
  167. package/src/utils/formatter.ts +114 -75
  168. package/src/utils/fs-utils.ts +9 -0
  169. package/src/utils/process-utils.ts +17 -0
  170. package/src/utils/utils.ts +1 -1
  171. package/dist/ui-web/assets/index-Dr8pRJC_.css +0 -1
@@ -1,2 +1,8 @@
1
1
  export * from "./sse";
2
+ export * from "./ws-audience";
3
+ export * from "./ws-cluster-bus";
4
+ export * from "./ws-core";
5
+ export * from "./ws-presence-store";
6
+ export * from "./ws";
7
+ export * from "./ws-registry";
2
8
  //# 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"}
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,8 +1,19 @@
1
1
  import { createMockSSEFactory, createSSEFactory, init_sse } from "./sse.js";
2
+ import { WebSocketAudience, init_ws_audience } from "./ws-audience.js";
3
+ import { NoopWebSocketClusterBus, init_ws_cluster_bus } from "./ws-cluster-bus.js";
4
+ import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./ws-presence-store.js";
5
+ import { WebSocketRegistry, init_ws_registry } from "./ws-registry.js";
6
+ import { WebSocketRuntime, createWebSocketRuntime, init_ws } from "./ws.js";
7
+ import "./ws-core.js";
2
8
 
3
9
  //#region src/stream/index.ts
4
10
  init_sse();
11
+ init_ws_audience();
12
+ init_ws_cluster_bus();
13
+ init_ws_presence_store();
14
+ init_ws();
15
+ init_ws_registry();
5
16
 
6
17
  //#endregion
7
- export { createMockSSEFactory, createSSEFactory };
8
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9zc2VcIjtcbiJdLCJtYXBwaW5ncyI6IiJ9
18
+ export { InMemoryWebSocketPresenceStore, NoopWebSocketClusterBus, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, createMockSSEFactory, createSSEFactory, createWebSocketRuntime };
19
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9zc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzLWF1ZGllbmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cy1jbHVzdGVyLWJ1c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtY29yZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cy1yZWdpc3RyeVwiO1xuIl0sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,15 @@
1
+ import { type WebSocketAudience } from "./ws-audience";
2
+ import { type WebSocketPresenceStore } from "./ws-presence-store";
3
+ export type WebSocketRoutingPlan = {
4
+ localSessionIds: string[];
5
+ remoteNodeIds: string[];
6
+ };
7
+ export declare class WebSocketAudienceResolver {
8
+ private readonly options;
9
+ constructor(options: {
10
+ nodeId: string;
11
+ presenceStore: WebSocketPresenceStore;
12
+ });
13
+ resolve(audience: WebSocketAudience): WebSocketRoutingPlan;
14
+ }
15
+ //# sourceMappingURL=ws-audience-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-audience-resolver.d.ts","sourceRoot":"","sources":["../../src/stream/ws-audience-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,MAAM,oBAAoB,GAAG;IACjC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,sBAAsB,CAAC;KACvC;IAGH,OAAO,CAAC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB;CAkB3D"}
@@ -0,0 +1,31 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+
3
+ //#region src/stream/ws-audience-resolver.ts
4
+ var WebSocketAudienceResolver;
5
+ var init_ws_audience_resolver = __esmMin((() => {
6
+ WebSocketAudienceResolver = class {
7
+ constructor(options) {
8
+ this.options = options;
9
+ }
10
+ resolve(audience) {
11
+ const localSessionIds = [];
12
+ const remoteNodeIds = new Set();
13
+ for (const meta of this.options.presenceStore.queryAudience(audience)) {
14
+ if (meta.nodeId === this.options.nodeId) {
15
+ localSessionIds.push(meta.sessionId);
16
+ continue;
17
+ }
18
+ remoteNodeIds.add(meta.nodeId);
19
+ }
20
+ return {
21
+ localSessionIds,
22
+ remoteNodeIds: [...remoteNodeIds]
23
+ };
24
+ }
25
+ };
26
+ }));
27
+
28
+ //#endregion
29
+ init_ws_audience_resolver();
30
+ export { WebSocketAudienceResolver, init_ws_audience_resolver };
31
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtYXVkaWVuY2UtcmVzb2x2ZXIuanMiLCJuYW1lcyI6WyJvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIHByZXNlbmNlU3RvcmU6IFdlYlNvY2tldFByZXNlbmNlU3RvcmU7XG4gICAgfSIsImxvY2FsU2Vzc2lvbklkczogc3RyaW5nW10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLWF1ZGllbmNlLXJlc29sdmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgV2ViU29ja2V0QXVkaWVuY2UgfSBmcm9tIFwiLi93cy1hdWRpZW5jZVwiO1xuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlIH0gZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0Um91dGluZ1BsYW4gPSB7XG4gIGxvY2FsU2Vzc2lvbklkczogc3RyaW5nW107XG4gIHJlbW90ZU5vZGVJZHM6IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldEF1ZGllbmNlUmVzb2x2ZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IHtcbiAgICAgIG5vZGVJZDogc3RyaW5nO1xuICAgICAgcHJlc2VuY2VTdG9yZTogV2ViU29ja2V0UHJlc2VuY2VTdG9yZTtcbiAgICB9LFxuICApIHt9XG5cbiAgcmVzb2x2ZShhdWRpZW5jZTogV2ViU29ja2V0QXVkaWVuY2UpOiBXZWJTb2NrZXRSb3V0aW5nUGxhbiB7XG4gICAgY29uc3QgbG9jYWxTZXNzaW9uSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlbW90ZU5vZGVJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgbWV0YSBvZiB0aGlzLm9wdGlvbnMucHJlc2VuY2VTdG9yZS5xdWVyeUF1ZGllbmNlKGF1ZGllbmNlKSkge1xuICAgICAgaWYgKG1ldGEubm9kZUlkID09PSB0aGlzLm9wdGlvbnMubm9kZUlkKSB7XG4gICAgICAgIGxvY2FsU2Vzc2lvbklkcy5wdXNoKG1ldGEuc2Vzc2lvbklkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJlbW90ZU5vZGVJZHMuYWRkKG1ldGEubm9kZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYWxTZXNzaW9uSWRzLFxuICAgICAgcmVtb3RlTm9kZUlkczogWy4uLnJlbW90ZU5vZGVJZHNdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Q0FRYSw0QkFBYixNQUF1QztFQUNyQyxZQUNFLEFBQWlCQSxTQUlqQjtHQUppQjs7RUFNbkIsUUFBUSxVQUFtRDtHQUN6RCxNQUFNQyxrQkFBNEIsRUFBRTtHQUNwQyxNQUFNLGdCQUFnQixJQUFJLEtBQWE7QUFFdkMsUUFBSyxNQUFNLFFBQVEsS0FBSyxRQUFRLGNBQWMsY0FBYyxTQUFTLEVBQUU7QUFDckUsUUFBSSxLQUFLLFdBQVcsS0FBSyxRQUFRLFFBQVE7QUFDdkMscUJBQWdCLEtBQUssS0FBSyxVQUFVO0FBQ3BDOztBQUdGLGtCQUFjLElBQUksS0FBSyxPQUFPOztBQUdoQyxVQUFPO0lBQ0w7SUFDQSxlQUFlLENBQUMsR0FBRyxjQUFjO0lBQ2xDIn0=
@@ -0,0 +1,28 @@
1
+ import { type WebSocketRoomId, type WebSocketUserId } from "./ws-core";
2
+ export type WebSocketAudience = {
3
+ type: "all";
4
+ namespace?: string;
5
+ } | {
6
+ type: "room";
7
+ roomId: WebSocketRoomId;
8
+ namespace?: string;
9
+ } | {
10
+ type: "user";
11
+ userId: WebSocketUserId;
12
+ namespace?: string;
13
+ } | {
14
+ type: "connections";
15
+ connectionIds: string[];
16
+ namespace?: string;
17
+ } | {
18
+ type: "union";
19
+ audiences: WebSocketAudience[];
20
+ };
21
+ export declare const WebSocketAudience: {
22
+ all(namespace?: string): WebSocketAudience;
23
+ room(roomId: WebSocketRoomId, namespace?: string): WebSocketAudience;
24
+ user(userId: WebSocketUserId, namespace?: string): WebSocketAudience;
25
+ connections(connectionIds: string[], namespace?: string): WebSocketAudience;
26
+ union(...audiences: WebSocketAudience[]): WebSocketAudience;
27
+ };
28
+ //# sourceMappingURL=ws-audience.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-audience.d.ts","sourceRoot":"","sources":["../../src/stream/ws-audience.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GACzB;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC,CAAC;AAEN,eAAO,MAAM,iBAAiB;oBACZ,MAAM,GAAG,iBAAiB;iBAM7B,eAAe,cAAc,MAAM,GAAG,iBAAiB;iBAOvD,eAAe,cAAc,MAAM,GAAG,iBAAiB;+BAOzC,MAAM,EAAE,cAAc,MAAM,GAAG,iBAAiB;wBAOvD,iBAAiB,EAAE,GAAG,iBAAiB;CAM5D,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+
3
+ //#region src/stream/ws-audience.ts
4
+ var WebSocketAudience;
5
+ var init_ws_audience = __esmMin((() => {
6
+ WebSocketAudience = {
7
+ all(namespace) {
8
+ return {
9
+ type: "all",
10
+ namespace
11
+ };
12
+ },
13
+ room(roomId, namespace) {
14
+ return {
15
+ type: "room",
16
+ roomId,
17
+ namespace
18
+ };
19
+ },
20
+ user(userId, namespace) {
21
+ return {
22
+ type: "user",
23
+ userId,
24
+ namespace
25
+ };
26
+ },
27
+ connections(connectionIds, namespace) {
28
+ return {
29
+ type: "connections",
30
+ connectionIds,
31
+ namespace
32
+ };
33
+ },
34
+ union(...audiences) {
35
+ return {
36
+ type: "union",
37
+ audiences
38
+ };
39
+ }
40
+ };
41
+ }));
42
+
43
+ //#endregion
44
+ init_ws_audience();
45
+ export { WebSocketAudience, init_ws_audience };
46
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtYXVkaWVuY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1hdWRpZW5jZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFdlYlNvY2tldFJvb21JZCwgdHlwZSBXZWJTb2NrZXRVc2VySWQgfSBmcm9tIFwiLi93cy1jb3JlXCI7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldEF1ZGllbmNlID1cbiAgfCB7XG4gICAgICB0eXBlOiBcImFsbFwiO1xuICAgICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcInJvb21cIjtcbiAgICAgIHJvb21JZDogV2ViU29ja2V0Um9vbUlkO1xuICAgICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcInVzZXJcIjtcbiAgICAgIHVzZXJJZDogV2ViU29ja2V0VXNlcklkO1xuICAgICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcImNvbm5lY3Rpb25zXCI7XG4gICAgICBjb25uZWN0aW9uSWRzOiBzdHJpbmdbXTtcbiAgICAgIG5hbWVzcGFjZT86IHN0cmluZztcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogXCJ1bmlvblwiO1xuICAgICAgYXVkaWVuY2VzOiBXZWJTb2NrZXRBdWRpZW5jZVtdO1xuICAgIH07XG5cbmV4cG9ydCBjb25zdCBXZWJTb2NrZXRBdWRpZW5jZSA9IHtcbiAgYWxsKG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldEF1ZGllbmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJhbGxcIixcbiAgICAgIG5hbWVzcGFjZSxcbiAgICB9O1xuICB9LFxuICByb29tKHJvb21JZDogV2ViU29ja2V0Um9vbUlkLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiBXZWJTb2NrZXRBdWRpZW5jZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwicm9vbVwiLFxuICAgICAgcm9vbUlkLFxuICAgICAgbmFtZXNwYWNlLFxuICAgIH07XG4gIH0sXG4gIHVzZXIodXNlcklkOiBXZWJTb2NrZXRVc2VySWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldEF1ZGllbmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgICB1c2VySWQsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgfTtcbiAgfSxcbiAgY29ubmVjdGlvbnMoY29ubmVjdGlvbklkczogc3RyaW5nW10sIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldEF1ZGllbmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjb25uZWN0aW9uc1wiLFxuICAgICAgY29ubmVjdGlvbklkcyxcbiAgICAgIG5hbWVzcGFjZSxcbiAgICB9O1xuICB9LFxuICB1bmlvbiguLi5hdWRpZW5jZXM6IFdlYlNvY2tldEF1ZGllbmNlW10pOiBXZWJTb2NrZXRBdWRpZW5jZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgIGF1ZGllbmNlcyxcbiAgICB9O1xuICB9LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Q0EyQmEsb0JBQW9CO0VBQy9CLElBQUksV0FBdUM7QUFDekMsVUFBTztJQUNMLE1BQU07SUFDTjtJQUNEOztFQUVILEtBQUssUUFBeUIsV0FBdUM7QUFDbkUsVUFBTztJQUNMLE1BQU07SUFDTjtJQUNBO0lBQ0Q7O0VBRUgsS0FBSyxRQUF5QixXQUF1QztBQUNuRSxVQUFPO0lBQ0wsTUFBTTtJQUNOO0lBQ0E7SUFDRDs7RUFFSCxZQUFZLGVBQXlCLFdBQXVDO0FBQzFFLFVBQU87SUFDTCxNQUFNO0lBQ047SUFDQTtJQUNEOztFQUVILE1BQU0sR0FBRyxXQUFtRDtBQUMxRCxVQUFPO0lBQ0wsTUFBTTtJQUNOO0lBQ0Q7O0VBRUoifQ==
@@ -0,0 +1,23 @@
1
+ import { type WebSocketAudience } from "./ws-audience";
2
+ export type WebSocketClusterEnvelope = {
3
+ id: string;
4
+ sourceNodeId: string;
5
+ targetNodeIds?: string[];
6
+ namespace?: string;
7
+ audience: WebSocketAudience;
8
+ event: string;
9
+ data: unknown;
10
+ emittedAt: number;
11
+ };
12
+ export type WebSocketClusterEnvelopeHandler = (envelope: WebSocketClusterEnvelope) => void | Promise<void>;
13
+ export interface WebSocketClusterBus {
14
+ publish(envelope: WebSocketClusterEnvelope): void | Promise<void>;
15
+ subscribe(handler: WebSocketClusterEnvelopeHandler): () => void;
16
+ shutdown(): void | Promise<void>;
17
+ }
18
+ export declare class NoopWebSocketClusterBus implements WebSocketClusterBus {
19
+ publish(_envelope: WebSocketClusterEnvelope): void;
20
+ subscribe(_handler: WebSocketClusterEnvelopeHandler): () => void;
21
+ shutdown(): void;
22
+ }
23
+ //# sourceMappingURL=ws-cluster-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-cluster-bus.d.ts","sourceRoot":"","sources":["../../src/stream/ws-cluster-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,CAC5C,QAAQ,EAAE,wBAAwB,KAC/B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,SAAS,CAAC,OAAO,EAAE,+BAA+B,GAAG,MAAM,IAAI,CAAC;IAChE,QAAQ,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,SAAS,EAAE,wBAAwB,GAAG,IAAI;IAElD,SAAS,CAAC,QAAQ,EAAE,+BAA+B,GAAG,MAAM,IAAI;IAIhE,QAAQ,IAAI,IAAI;CACjB"}
@@ -0,0 +1,18 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+
3
+ //#region src/stream/ws-cluster-bus.ts
4
+ var NoopWebSocketClusterBus;
5
+ var init_ws_cluster_bus = __esmMin((() => {
6
+ NoopWebSocketClusterBus = class {
7
+ publish(_envelope) {}
8
+ subscribe(_handler) {
9
+ return () => {};
10
+ }
11
+ shutdown() {}
12
+ };
13
+ }));
14
+
15
+ //#endregion
16
+ init_ws_cluster_bus();
17
+ export { NoopWebSocketClusterBus, init_ws_cluster_bus };
18
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtY2x1c3Rlci1idXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1jbHVzdGVyLWJ1cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlID0ge1xuICBpZDogc3RyaW5nO1xuICBzb3VyY2VOb2RlSWQ6IHN0cmluZztcbiAgdGFyZ2V0Tm9kZUlkcz86IHN0cmluZ1tdO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZTtcbiAgZXZlbnQ6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbiAgZW1pdHRlZEF0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGVIYW5kbGVyID0gKFxuICBlbnZlbG9wZTogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlLFxuKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRDbHVzdGVyQnVzIHtcbiAgcHVibGlzaChlbnZlbG9wZTogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHN1YnNjcmliZShoYW5kbGVyOiBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGVIYW5kbGVyKTogKCkgPT4gdm9pZDtcbiAgc2h1dGRvd24oKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBjbGFzcyBOb29wV2ViU29ja2V0Q2x1c3RlckJ1cyBpbXBsZW1lbnRzIFdlYlNvY2tldENsdXN0ZXJCdXMge1xuICBwdWJsaXNoKF9lbnZlbG9wZTogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlKTogdm9pZCB7fVxuXG4gIHN1YnNjcmliZShfaGFuZGxlcjogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlSGFuZGxlcik6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiAoKSA9PiB7fTtcbiAgfVxuXG4gIHNodXRkb3duKCk6IHZvaWQge31cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Q0F1QmEsMEJBQWIsTUFBb0U7RUFDbEUsUUFBUSxXQUEyQztFQUVuRCxVQUFVLFVBQXVEO0FBQy9ELGdCQUFhOztFQUdmLFdBQWlCIn0=
@@ -0,0 +1,15 @@
1
+ export type WebSocketUserId = number | string;
2
+ export type WebSocketRoomId = string;
3
+ export interface ManagedWebSocketConnection {
4
+ id: string;
5
+ namespace: string;
6
+ closed: boolean;
7
+ publishUntyped(event: string, data: unknown): void;
8
+ close(code?: number, reason?: string): void;
9
+ }
10
+ export type WebSocketRegistryStats = {
11
+ totalConnections: number;
12
+ totalRooms: number;
13
+ byNamespace: Record<string, number>;
14
+ };
15
+ //# sourceMappingURL=ws-core.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,24 @@
1
+ import { type WebSocketAudience } from "./ws-audience";
2
+ import { type WebSocketAudienceResolver } from "./ws-audience-resolver";
3
+ import { type WebSocketClusterBus } from "./ws-cluster-bus";
4
+ import { type WebSocketLocalConnectionStore } from "./ws-local-connection-store";
5
+ export declare class WebSocketDeliveryEngine {
6
+ private readonly options;
7
+ private readonly pendingFanOutJobs;
8
+ private fanOutFlushScheduled;
9
+ private readonly unsubscribe;
10
+ constructor(options: {
11
+ nodeId: string;
12
+ localConnections: WebSocketLocalConnectionStore;
13
+ audienceResolver: WebSocketAudienceResolver;
14
+ clusterBus: WebSocketClusterBus;
15
+ });
16
+ publishToAudience(audience: WebSocketAudience, event: string, data: unknown): void;
17
+ shutdown(): Promise<void>;
18
+ private handleClusterEnvelope;
19
+ private enqueueFanOut;
20
+ private scheduleFanOutFlush;
21
+ private flushFanOutJobs;
22
+ private safePublish;
23
+ }
24
+ //# sourceMappingURL=ws-delivery.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,103 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+ import { randomUUID } from "node:crypto";
3
+
4
+ //#region src/stream/ws-delivery.ts
5
+ var FAN_OUT_BATCH_SIZE, WebSocketDeliveryEngine;
6
+ var init_ws_delivery = __esmMin((() => {
7
+ FAN_OUT_BATCH_SIZE = 250;
8
+ WebSocketDeliveryEngine = class {
9
+ pendingFanOutJobs = [];
10
+ fanOutFlushScheduled = false;
11
+ unsubscribe;
12
+ constructor(options) {
13
+ this.options = options;
14
+ this.unsubscribe = this.options.clusterBus.subscribe((envelope) => {
15
+ this.handleClusterEnvelope(envelope);
16
+ });
17
+ }
18
+ publishToAudience(audience, event, data) {
19
+ const routingPlan = this.options.audienceResolver.resolve(audience);
20
+ const localTargets = this.options.localConnections.getConnections(routingPlan.localSessionIds);
21
+ this.enqueueFanOut(localTargets, event, data);
22
+ if (routingPlan.remoteNodeIds.length === 0) {
23
+ return;
24
+ }
25
+ void this.options.clusterBus.publish({
26
+ id: randomUUID(),
27
+ sourceNodeId: this.options.nodeId,
28
+ targetNodeIds: routingPlan.remoteNodeIds,
29
+ audience,
30
+ event,
31
+ data,
32
+ emittedAt: Date.now()
33
+ });
34
+ }
35
+ async shutdown() {
36
+ this.unsubscribe();
37
+ await this.options.clusterBus.shutdown();
38
+ }
39
+ handleClusterEnvelope(envelope) {
40
+ if (envelope.sourceNodeId === this.options.nodeId) {
41
+ return;
42
+ }
43
+ if (envelope.targetNodeIds && envelope.targetNodeIds.length > 0 && !envelope.targetNodeIds.includes(this.options.nodeId)) {
44
+ return;
45
+ }
46
+ const routingPlan = this.options.audienceResolver.resolve(envelope.audience);
47
+ this.enqueueFanOut(this.options.localConnections.getConnections(routingPlan.localSessionIds), envelope.event, envelope.data);
48
+ }
49
+ enqueueFanOut(targets, event, data) {
50
+ if (targets.length === 0) {
51
+ return;
52
+ }
53
+ this.pendingFanOutJobs.push({
54
+ targets,
55
+ event,
56
+ data,
57
+ cursor: 0
58
+ });
59
+ this.scheduleFanOutFlush();
60
+ }
61
+ scheduleFanOutFlush() {
62
+ if (this.fanOutFlushScheduled) {
63
+ return;
64
+ }
65
+ this.fanOutFlushScheduled = true;
66
+ setImmediate(() => {
67
+ this.fanOutFlushScheduled = false;
68
+ this.flushFanOutJobs();
69
+ });
70
+ }
71
+ flushFanOutJobs() {
72
+ 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;
79
+ }
80
+ if (job.cursor >= job.targets.length) {
81
+ this.pendingFanOutJobs.shift();
82
+ }
83
+ }
84
+ if (this.pendingFanOutJobs.length > 0) {
85
+ this.scheduleFanOutFlush();
86
+ }
87
+ }
88
+ safePublish(connection, event, data) {
89
+ try {
90
+ if (!connection.closed) {
91
+ connection.publishUntyped(event, data);
92
+ }
93
+ } catch {
94
+ connection.close(1011, "WebSocket publish failed");
95
+ }
96
+ }
97
+ };
98
+ }));
99
+
100
+ //#endregion
101
+ init_ws_delivery();
102
+ export { WebSocketDeliveryEngine, init_ws_delivery };
103
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtZGVsaXZlcnkuanMiLCJuYW1lcyI6WyJvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlO1xuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcjtcbiAgICAgIGNsdXN0ZXJCdXM6IFdlYlNvY2tldENsdXN0ZXJCdXM7XG4gICAgfSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtZGVsaXZlcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlciB9IGZyb20gXCIuL3dzLWF1ZGllbmNlLXJlc29sdmVyXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldENsdXN0ZXJCdXMsIHR5cGUgV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlIH0gZnJvbSBcIi4vd3MtY2x1c3Rlci1idXNcIjtcbmltcG9ydCB7IHR5cGUgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlIH0gZnJvbSBcIi4vd3MtbG9jYWwtY29ubmVjdGlvbi1zdG9yZVwiO1xuXG4vLyBmYW4tb3V07J2EIGV2ZW50IGxvb3AgdGljayDri6jsnITroZwg64KY64igIO2VnCDrsojsl5Ag6ri0IOuPmeq4sCDro6jtlITrpbwg66eM65Ok7KeAIOyViuqyjCDtlahcbmNvbnN0IEZBTl9PVVRfQkFUQ0hfU0laRSA9IDI1MDtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldERlbGl2ZXJ5RW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRmFuT3V0Sm9iczogQXJyYXk8e1xuICAgIHRhcmdldHM6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW107XG4gICAgZXZlbnQ6IHN0cmluZztcbiAgICBkYXRhOiB1bmtub3duO1xuICAgIGN1cnNvcjogbnVtYmVyO1xuICB9PiA9IFtdO1xuICBwcml2YXRlIGZhbk91dEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlO1xuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcjtcbiAgICAgIGNsdXN0ZXJCdXM6IFdlYlNvY2tldENsdXN0ZXJCdXM7XG4gICAgfSxcbiAgKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSA9IHRoaXMub3B0aW9ucy5jbHVzdGVyQnVzLnN1YnNjcmliZSgoZW52ZWxvcGUpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlQ2x1c3RlckVudmVsb3BlKGVudmVsb3BlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHJvdXRpbmdQbGFuID0gdGhpcy5vcHRpb25zLmF1ZGllbmNlUmVzb2x2ZXIucmVzb2x2ZShhdWRpZW5jZSk7XG4gICAgY29uc3QgbG9jYWxUYXJnZXRzID0gdGhpcy5vcHRpb25zLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbnMocm91dGluZ1BsYW4ubG9jYWxTZXNzaW9uSWRzKTtcbiAgICB0aGlzLmVucXVldWVGYW5PdXQobG9jYWxUYXJnZXRzLCBldmVudCwgZGF0YSk7XG5cbiAgICBpZiAocm91dGluZ1BsYW4ucmVtb3RlTm9kZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2b2lkIHRoaXMub3B0aW9ucy5jbHVzdGVyQnVzLnB1Ymxpc2goe1xuICAgICAgaWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgIHNvdXJjZU5vZGVJZDogdGhpcy5vcHRpb25zLm5vZGVJZCxcbiAgICAgIHRhcmdldE5vZGVJZHM6IHJvdXRpbmdQbGFuLnJlbW90ZU5vZGVJZHMsXG4gICAgICBhdWRpZW5jZSxcbiAgICAgIGV2ZW50LFxuICAgICAgZGF0YSxcbiAgICAgIGVtaXR0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuY2x1c3RlckJ1cy5zaHV0ZG93bigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbHVzdGVyRW52ZWxvcGUoZW52ZWxvcGU6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZSk6IHZvaWQge1xuICAgIGlmIChlbnZlbG9wZS5zb3VyY2VOb2RlSWQgPT09IHRoaXMub3B0aW9ucy5ub2RlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlbnZlbG9wZS50YXJnZXROb2RlSWRzICYmXG4gICAgICBlbnZlbG9wZS50YXJnZXROb2RlSWRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICFlbnZlbG9wZS50YXJnZXROb2RlSWRzLmluY2x1ZGVzKHRoaXMub3B0aW9ucy5ub2RlSWQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGluZ1BsYW4gPSB0aGlzLm9wdGlvbnMuYXVkaWVuY2VSZXNvbHZlci5yZXNvbHZlKGVudmVsb3BlLmF1ZGllbmNlKTtcbiAgICB0aGlzLmVucXVldWVGYW5PdXQoXG4gICAgICB0aGlzLm9wdGlvbnMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9ucyhyb3V0aW5nUGxhbi5sb2NhbFNlc3Npb25JZHMpLFxuICAgICAgZW52ZWxvcGUuZXZlbnQsXG4gICAgICBlbnZlbG9wZS5kYXRhLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGVucXVldWVGYW5PdXQodGFyZ2V0czogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb25bXSwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0Zhbk91dEpvYnMucHVzaCh7XG4gICAgICB0YXJnZXRzLFxuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgY3Vyc29yOiAwLFxuICAgIH0pO1xuICAgIHRoaXMuc2NoZWR1bGVGYW5PdXRGbHVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZUZhbk91dEZsdXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZhbk91dEZsdXNoU2NoZWR1bGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mYW5PdXRGbHVzaFNjaGVkdWxlZCA9IHRydWU7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIHRoaXMuZmFuT3V0Rmx1c2hTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZmx1c2hGYW5PdXRKb2JzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoRmFuT3V0Sm9icygpOiB2b2lkIHtcbiAgICBsZXQgcHJvY2Vzc2VkID0gMDtcblxuICAgIHdoaWxlICh0aGlzLnBlbmRpbmdGYW5PdXRKb2JzLmxlbmd0aCA+IDAgJiYgcHJvY2Vzc2VkIDwgRkFOX09VVF9CQVRDSF9TSVpFKSB7XG4gICAgICBjb25zdCBqb2IgPSB0aGlzLnBlbmRpbmdGYW5PdXRKb2JzWzBdO1xuXG4gICAgICB3aGlsZSAoam9iLmN1cnNvciA8IGpvYi50YXJnZXRzLmxlbmd0aCAmJiBwcm9jZXNzZWQgPCBGQU5fT1VUX0JBVENIX1NJWkUpIHtcbiAgICAgICAgdGhpcy5zYWZlUHVibGlzaChqb2IudGFyZ2V0c1tqb2IuY3Vyc29yXSwgam9iLmV2ZW50LCBqb2IuZGF0YSk7XG4gICAgICAgIGpvYi5jdXJzb3IgKz0gMTtcbiAgICAgICAgcHJvY2Vzc2VkICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGlmIChqb2IuY3Vyc29yID49IGpvYi50YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnBlbmRpbmdGYW5PdXRKb2JzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ0Zhbk91dEpvYnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZUZhbk91dEZsdXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYWZlUHVibGlzaChjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24uY2xvc2VkKSB7XG4gICAgICAgIGNvbm5lY3Rpb24ucHVibGlzaFVudHlwZWQoZXZlbnQsIGRhdGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29ubmVjdGlvbi5jbG9zZSgxMDExLCBcIldlYlNvY2tldCBwdWJsaXNoIGZhaWxlZFwiKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0NBU00scUJBQXFCO0NBRWQsMEJBQWIsTUFBcUM7RUFDbkMsQUFBaUIsb0JBS1osRUFBRTtFQUNQLEFBQVEsdUJBQXVCO0VBQy9CLEFBQWlCO0VBRWpCLFlBQ0UsQUFBaUJBLFNBTWpCO0dBTmlCO0FBT2pCLFFBQUssY0FBYyxLQUFLLFFBQVEsV0FBVyxXQUFXLGFBQWE7QUFDakUsU0FBSyxzQkFBc0IsU0FBUztLQUNwQzs7RUFHSixrQkFBa0IsVUFBNkIsT0FBZSxNQUFxQjtHQUNqRixNQUFNLGNBQWMsS0FBSyxRQUFRLGlCQUFpQixRQUFRLFNBQVM7R0FDbkUsTUFBTSxlQUFlLEtBQUssUUFBUSxpQkFBaUIsZUFBZSxZQUFZLGdCQUFnQjtBQUM5RixRQUFLLGNBQWMsY0FBYyxPQUFPLEtBQUs7QUFFN0MsT0FBSSxZQUFZLGNBQWMsV0FBVyxHQUFHO0FBQzFDOztBQUdGLFFBQUssS0FBSyxRQUFRLFdBQVcsUUFBUTtJQUNuQyxJQUFJLFlBQVk7SUFDaEIsY0FBYyxLQUFLLFFBQVE7SUFDM0IsZUFBZSxZQUFZO0lBQzNCO0lBQ0E7SUFDQTtJQUNBLFdBQVcsS0FBSyxLQUFLO0lBQ3RCLENBQUM7O0VBR0osTUFBTSxXQUEwQjtBQUM5QixRQUFLLGFBQWE7QUFDbEIsU0FBTSxLQUFLLFFBQVEsV0FBVyxVQUFVOztFQUcxQyxBQUFRLHNCQUFzQixVQUEwQztBQUN0RSxPQUFJLFNBQVMsaUJBQWlCLEtBQUssUUFBUSxRQUFRO0FBQ2pEOztBQUdGLE9BQ0UsU0FBUyxpQkFDVCxTQUFTLGNBQWMsU0FBUyxLQUNoQyxDQUFDLFNBQVMsY0FBYyxTQUFTLEtBQUssUUFBUSxPQUFPLEVBQ3JEO0FBQ0E7O0dBR0YsTUFBTSxjQUFjLEtBQUssUUFBUSxpQkFBaUIsUUFBUSxTQUFTLFNBQVM7QUFDNUUsUUFBSyxjQUNILEtBQUssUUFBUSxpQkFBaUIsZUFBZSxZQUFZLGdCQUFnQixFQUN6RSxTQUFTLE9BQ1QsU0FBUyxLQUNWOztFQUdILEFBQVEsY0FBYyxTQUF1QyxPQUFlLE1BQXFCO0FBQy9GLE9BQUksUUFBUSxXQUFXLEdBQUc7QUFDeEI7O0FBR0YsUUFBSyxrQkFBa0IsS0FBSztJQUMxQjtJQUNBO0lBQ0E7SUFDQSxRQUFRO0lBQ1QsQ0FBQztBQUNGLFFBQUsscUJBQXFCOztFQUc1QixBQUFRLHNCQUE0QjtBQUNsQyxPQUFJLEtBQUssc0JBQXNCO0FBQzdCOztBQUdGLFFBQUssdUJBQXVCO0FBQzVCLHNCQUFtQjtBQUNqQixTQUFLLHVCQUF1QjtBQUM1QixTQUFLLGlCQUFpQjtLQUN0Qjs7RUFHSixBQUFRLGtCQUF3QjtHQUM5QixJQUFJLFlBQVk7QUFFaEIsVUFBTyxLQUFLLGtCQUFrQixTQUFTLEtBQUssWUFBWSxvQkFBb0I7SUFDMUUsTUFBTSxNQUFNLEtBQUssa0JBQWtCO0FBRW5DLFdBQU8sSUFBSSxTQUFTLElBQUksUUFBUSxVQUFVLFlBQVksb0JBQW9CO0FBQ3hFLFVBQUssWUFBWSxJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksT0FBTyxJQUFJLEtBQUs7QUFDOUQsU0FBSSxVQUFVO0FBQ2Qsa0JBQWE7O0FBR2YsUUFBSSxJQUFJLFVBQVUsSUFBSSxRQUFRLFFBQVE7QUFDcEMsVUFBSyxrQkFBa0IsT0FBTzs7O0FBSWxDLE9BQUksS0FBSyxrQkFBa0IsU0FBUyxHQUFHO0FBQ3JDLFNBQUsscUJBQXFCOzs7RUFJOUIsQUFBUSxZQUFZLFlBQXdDLE9BQWUsTUFBcUI7QUFDOUYsT0FBSTtBQUNGLFFBQUksQ0FBQyxXQUFXLFFBQVE7QUFDdEIsZ0JBQVcsZUFBZSxPQUFPLEtBQUs7O1dBRWxDO0FBQ04sZUFBVyxNQUFNLE1BQU0sMkJBQTJCIn0=
@@ -0,0 +1,10 @@
1
+ import { type ManagedWebSocketConnection } from "./ws-core";
2
+ export declare class WebSocketLocalConnectionStore {
3
+ private readonly connections;
4
+ register(connection: ManagedWebSocketConnection): void;
5
+ unregister(connectionId: string): void;
6
+ getConnection(connectionId: string): ManagedWebSocketConnection | undefined;
7
+ getConnections(connectionIds: string[]): ManagedWebSocketConnection[];
8
+ closeAll(code?: number, reason?: string): void;
9
+ }
10
+ //# sourceMappingURL=ws-local-connection-store.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,44 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+
3
+ //#region src/stream/ws-local-connection-store.ts
4
+ var WebSocketLocalConnectionStore;
5
+ var init_ws_local_connection_store = __esmMin((() => {
6
+ WebSocketLocalConnectionStore = class {
7
+ connections = new Map();
8
+ register(connection) {
9
+ this.connections.set(connection.id, connection);
10
+ }
11
+ unregister(connectionId) {
12
+ this.connections.delete(connectionId);
13
+ }
14
+ getConnection(connectionId) {
15
+ return this.connections.get(connectionId);
16
+ }
17
+ getConnections(connectionIds) {
18
+ const targets = [];
19
+ const seen = new Set();
20
+ for (const connectionId of connectionIds) {
21
+ if (seen.has(connectionId)) {
22
+ continue;
23
+ }
24
+ seen.add(connectionId);
25
+ const connection = this.connections.get(connectionId);
26
+ if (!connection || connection.closed) {
27
+ continue;
28
+ }
29
+ targets.push(connection);
30
+ }
31
+ return targets;
32
+ }
33
+ closeAll(code, reason) {
34
+ for (const connection of this.connections.values()) {
35
+ connection.close(code, reason);
36
+ }
37
+ }
38
+ };
39
+ }));
40
+
41
+ //#endregion
42
+ init_ws_local_connection_store();
43
+ export { WebSocketLocalConnectionStore, init_ws_local_connection_store };
44
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtbG9jYWwtY29ubmVjdGlvbi1zdG9yZS5qcyIsIm5hbWVzIjpbInRhcmdldHM6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gXCIuL3dzLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbj4oKTtcblxuICByZWdpc3Rlcihjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb24uaWQsIGNvbm5lY3Rpb24pO1xuICB9XG5cbiAgdW5yZWdpc3Rlcihjb25uZWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvbnMoY29ubmVjdGlvbklkczogc3RyaW5nW10pOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbltdIHtcbiAgICBjb25zdCB0YXJnZXRzOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbltdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uSWQgb2YgY29ubmVjdGlvbklkcykge1xuICAgICAgaWYgKHNlZW4uaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChjb25uZWN0aW9uSWQpO1xuXG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKTtcbiAgICAgIGlmICghY29ubmVjdGlvbiB8fCBjb25uZWN0aW9uLmNsb3NlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0cy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRzO1xuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGNvbm5lY3Rpb24uY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Q0FFYSxnQ0FBYixNQUEyQztFQUN6QyxBQUFpQixjQUFjLElBQUksS0FBeUM7RUFFNUUsU0FBUyxZQUE4QztBQUNyRCxRQUFLLFlBQVksSUFBSSxXQUFXLElBQUksV0FBVzs7RUFHakQsV0FBVyxjQUE0QjtBQUNyQyxRQUFLLFlBQVksT0FBTyxhQUFhOztFQUd2QyxjQUFjLGNBQThEO0FBQzFFLFVBQU8sS0FBSyxZQUFZLElBQUksYUFBYTs7RUFHM0MsZUFBZSxlQUF1RDtHQUNwRSxNQUFNQSxVQUF3QyxFQUFFO0dBQ2hELE1BQU0sT0FBTyxJQUFJLEtBQWE7QUFFOUIsUUFBSyxNQUFNLGdCQUFnQixlQUFlO0FBQ3hDLFFBQUksS0FBSyxJQUFJLGFBQWEsRUFBRTtBQUMxQjs7QUFFRixTQUFLLElBQUksYUFBYTtJQUV0QixNQUFNLGFBQWEsS0FBSyxZQUFZLElBQUksYUFBYTtBQUNyRCxRQUFJLENBQUMsY0FBYyxXQUFXLFFBQVE7QUFDcEM7O0FBR0YsWUFBUSxLQUFLLFdBQVc7O0FBRzFCLFVBQU87O0VBR1QsU0FBUyxNQUFlLFFBQXVCO0FBQzdDLFFBQUssTUFBTSxjQUFjLEtBQUssWUFBWSxRQUFRLEVBQUU7QUFDbEQsZUFBVyxNQUFNLE1BQU0sT0FBTyJ9
@@ -0,0 +1,61 @@
1
+ import { type WebSocketAudience } from "./ws-audience";
2
+ import { type WebSocketRegistryStats, type WebSocketRoomId, type WebSocketUserId } from "./ws-core";
3
+ export type WebSocketSessionPresence = {
4
+ sessionId: string;
5
+ nodeId: string;
6
+ namespace: string;
7
+ active: boolean;
8
+ rooms: Set<WebSocketRoomId>;
9
+ connectedAt: Date;
10
+ lastSeenAt: Date;
11
+ userId?: WebSocketUserId;
12
+ };
13
+ export interface WebSocketPresenceStore {
14
+ register(input: {
15
+ sessionId: string;
16
+ nodeId: string;
17
+ namespace: string;
18
+ active?: boolean;
19
+ }): WebSocketSessionPresence;
20
+ activate(sessionId: string): void;
21
+ unregister(sessionId: string): WebSocketSessionPresence | undefined;
22
+ touch(sessionId: string): void;
23
+ setUserId(sessionId: string, userId: WebSocketUserId): void;
24
+ clearUserId(sessionId: string): void;
25
+ join(sessionId: string, roomId: WebSocketRoomId): void;
26
+ leave(sessionId: string, roomId: WebSocketRoomId): void;
27
+ getConnection(sessionId: string): WebSocketSessionPresence | undefined;
28
+ getConnectionCount(namespace?: string): number;
29
+ getRoomMembers(roomId: WebSocketRoomId, namespace?: string): WebSocketSessionPresence[];
30
+ getStats(): WebSocketRegistryStats;
31
+ queryAudience(audience: WebSocketAudience): WebSocketSessionPresence[];
32
+ }
33
+ export declare class InMemoryWebSocketPresenceStore implements WebSocketPresenceStore {
34
+ private readonly connections;
35
+ private readonly rooms;
36
+ private readonly users;
37
+ register(input: {
38
+ sessionId: string;
39
+ nodeId: string;
40
+ namespace: string;
41
+ active?: boolean;
42
+ }): WebSocketSessionPresence;
43
+ activate(sessionId: string): void;
44
+ unregister(sessionId: string): WebSocketSessionPresence | undefined;
45
+ touch(sessionId: string): void;
46
+ setUserId(sessionId: string, userId: WebSocketUserId): void;
47
+ clearUserId(sessionId: string): void;
48
+ join(sessionId: string, roomId: WebSocketRoomId): void;
49
+ leave(sessionId: string, roomId: WebSocketRoomId): void;
50
+ getConnection(sessionId: string): WebSocketSessionPresence | undefined;
51
+ getConnectionCount(namespace?: string): number;
52
+ getRoomMembers(roomId: WebSocketRoomId, namespace?: string): WebSocketSessionPresence[];
53
+ getStats(): WebSocketRegistryStats;
54
+ queryAudience(audience: WebSocketAudience): WebSocketSessionPresence[];
55
+ private getActiveConnections;
56
+ private getBoundConnections;
57
+ private getScopedBindings;
58
+ private removeRoomBinding;
59
+ private removeUserBinding;
60
+ }
61
+ //# sourceMappingURL=ws-presence-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-presence-store.d.ts","sourceRoot":"","sources":["../../src/stream/ws-presence-store.ts"],"names":[],"mappings":"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"}