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
@@ -0,0 +1,236 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+
3
+ //#region src/stream/ws-presence-store.ts
4
+ function getBindingKey(namespace, id) {
5
+ return `${namespace}::${id}`;
6
+ }
7
+ function parseBindingKey(key) {
8
+ const [namespace, ...rest] = key.split("::");
9
+ return {
10
+ namespace,
11
+ id: rest.join("::")
12
+ };
13
+ }
14
+ var InMemoryWebSocketPresenceStore;
15
+ var init_ws_presence_store = __esmMin((() => {
16
+ InMemoryWebSocketPresenceStore = class {
17
+ connections = new Map();
18
+ rooms = new Map();
19
+ users = new Map();
20
+ register(input) {
21
+ const meta = {
22
+ sessionId: input.sessionId,
23
+ nodeId: input.nodeId,
24
+ namespace: input.namespace,
25
+ active: input.active ?? true,
26
+ rooms: new Set(),
27
+ connectedAt: new Date(),
28
+ lastSeenAt: new Date()
29
+ };
30
+ this.connections.set(input.sessionId, meta);
31
+ return meta;
32
+ }
33
+ activate(sessionId) {
34
+ const meta = this.connections.get(sessionId);
35
+ if (!meta) {
36
+ return;
37
+ }
38
+ meta.active = true;
39
+ }
40
+ unregister(sessionId) {
41
+ const meta = this.connections.get(sessionId);
42
+ if (!meta) {
43
+ return undefined;
44
+ }
45
+ if (meta.userId !== undefined) {
46
+ this.removeUserBinding(meta.namespace, meta.userId, sessionId);
47
+ }
48
+ for (const roomId of meta.rooms) {
49
+ this.removeRoomBinding(meta.namespace, roomId, sessionId);
50
+ }
51
+ this.connections.delete(sessionId);
52
+ return meta;
53
+ }
54
+ touch(sessionId) {
55
+ const meta = this.connections.get(sessionId);
56
+ if (!meta) {
57
+ return;
58
+ }
59
+ meta.lastSeenAt = new Date();
60
+ }
61
+ setUserId(sessionId, userId) {
62
+ const meta = this.connections.get(sessionId);
63
+ if (!meta) {
64
+ return;
65
+ }
66
+ if (meta.userId !== undefined) {
67
+ this.removeUserBinding(meta.namespace, meta.userId, sessionId);
68
+ }
69
+ meta.userId = userId;
70
+ const key = getBindingKey(meta.namespace, String(userId));
71
+ const bound = this.users.get(key) ?? new Set();
72
+ bound.add(sessionId);
73
+ this.users.set(key, bound);
74
+ }
75
+ clearUserId(sessionId) {
76
+ const meta = this.connections.get(sessionId);
77
+ if (!meta || meta.userId === undefined) {
78
+ return;
79
+ }
80
+ this.removeUserBinding(meta.namespace, meta.userId, sessionId);
81
+ delete meta.userId;
82
+ }
83
+ join(sessionId, roomId) {
84
+ const meta = this.connections.get(sessionId);
85
+ if (!meta) {
86
+ return;
87
+ }
88
+ meta.rooms.add(roomId);
89
+ const key = getBindingKey(meta.namespace, roomId);
90
+ const members = this.rooms.get(key) ?? new Set();
91
+ members.add(sessionId);
92
+ this.rooms.set(key, members);
93
+ }
94
+ leave(sessionId, roomId) {
95
+ const meta = this.connections.get(sessionId);
96
+ if (!meta) {
97
+ return;
98
+ }
99
+ meta.rooms.delete(roomId);
100
+ this.removeRoomBinding(meta.namespace, roomId, sessionId);
101
+ }
102
+ getConnection(sessionId) {
103
+ return this.connections.get(sessionId);
104
+ }
105
+ getConnectionCount(namespace) {
106
+ let count = 0;
107
+ for (const meta of this.connections.values()) {
108
+ if (!meta.active || namespace && meta.namespace !== namespace) {
109
+ continue;
110
+ }
111
+ count += 1;
112
+ }
113
+ return count;
114
+ }
115
+ getRoomMembers(roomId, namespace) {
116
+ return this.getBoundConnections(this.rooms, roomId, namespace);
117
+ }
118
+ getStats() {
119
+ const byNamespace = {};
120
+ for (const meta of this.connections.values()) {
121
+ if (!meta.active) {
122
+ continue;
123
+ }
124
+ byNamespace[meta.namespace] = (byNamespace[meta.namespace] ?? 0) + 1;
125
+ }
126
+ return {
127
+ totalConnections: Object.values(byNamespace).reduce((sum, count) => sum + count, 0),
128
+ totalRooms: this.rooms.size,
129
+ byNamespace
130
+ };
131
+ }
132
+ queryAudience(audience) {
133
+ switch (audience.type) {
134
+ case "all": return this.getActiveConnections(audience.namespace);
135
+ case "room": return this.getBoundConnections(this.rooms, audience.roomId, audience.namespace);
136
+ case "user": return this.getBoundConnections(this.users, String(audience.userId), audience.namespace);
137
+ case "connections": {
138
+ const metas = [];
139
+ for (const connectionId of audience.connectionIds) {
140
+ const meta = this.connections.get(connectionId);
141
+ if (!meta?.active) {
142
+ continue;
143
+ }
144
+ if (audience.namespace && meta.namespace !== audience.namespace) {
145
+ continue;
146
+ }
147
+ metas.push(meta);
148
+ }
149
+ return metas;
150
+ }
151
+ case "union": {
152
+ const seen = new Set();
153
+ const metas = [];
154
+ for (const item of audience.audiences) {
155
+ for (const meta of this.queryAudience(item)) {
156
+ if (seen.has(meta.sessionId)) {
157
+ continue;
158
+ }
159
+ seen.add(meta.sessionId);
160
+ metas.push(meta);
161
+ }
162
+ }
163
+ return metas;
164
+ }
165
+ }
166
+ }
167
+ getActiveConnections(namespace) {
168
+ const metas = [];
169
+ for (const meta of this.connections.values()) {
170
+ if (!meta.active || namespace && meta.namespace !== namespace) {
171
+ continue;
172
+ }
173
+ metas.push(meta);
174
+ }
175
+ return metas;
176
+ }
177
+ getBoundConnections(bindings, id, namespace) {
178
+ const metas = [];
179
+ const seen = new Set();
180
+ for (const members of this.getScopedBindings(bindings, id, namespace)) {
181
+ for (const connectionId of members) {
182
+ if (seen.has(connectionId)) {
183
+ continue;
184
+ }
185
+ seen.add(connectionId);
186
+ const meta = this.connections.get(connectionId);
187
+ if (meta?.active) {
188
+ metas.push(meta);
189
+ }
190
+ }
191
+ }
192
+ return metas;
193
+ }
194
+ getScopedBindings(bindings, id, namespace) {
195
+ if (namespace) {
196
+ const exact = bindings.get(getBindingKey(namespace, id));
197
+ return exact ? [exact] : [];
198
+ }
199
+ const matches = [];
200
+ for (const [key, members] of bindings) {
201
+ const parsed = parseBindingKey(key);
202
+ if (parsed.id === id) {
203
+ matches.push(members);
204
+ }
205
+ }
206
+ return matches;
207
+ }
208
+ removeRoomBinding(namespace, roomId, sessionId) {
209
+ const key = getBindingKey(namespace, roomId);
210
+ const members = this.rooms.get(key);
211
+ if (!members) {
212
+ return;
213
+ }
214
+ members.delete(sessionId);
215
+ if (members.size === 0) {
216
+ this.rooms.delete(key);
217
+ }
218
+ }
219
+ removeUserBinding(namespace, userId, sessionId) {
220
+ const key = getBindingKey(namespace, String(userId));
221
+ const members = this.users.get(key);
222
+ if (!members) {
223
+ return;
224
+ }
225
+ members.delete(sessionId);
226
+ if (members.size === 0) {
227
+ this.users.delete(key);
228
+ }
229
+ }
230
+ };
231
+ }));
232
+
233
+ //#endregion
234
+ init_ws_presence_store();
235
+ export { InMemoryWebSocketPresenceStore, init_ws_presence_store };
236
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcHJlc2VuY2Utc3RvcmUuanMiLCJuYW1lcyI6WyJtZXRhOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UiLCJieU5hbWVzcGFjZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiIsIm1ldGFzOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSIsIm1hdGNoZXM6IFNldDxzdHJpbmc+W10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLXByZXNlbmNlLXN0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgV2ViU29ja2V0QXVkaWVuY2UgfSBmcm9tIFwiLi93cy1hdWRpZW5jZVwiO1xuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRSZWdpc3RyeVN0YXRzLCB0eXBlIFdlYlNvY2tldFJvb21JZCwgdHlwZSBXZWJTb2NrZXRVc2VySWQgfSBmcm9tIFwiLi93cy1jb3JlXCI7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIG5vZGVJZDogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgYWN0aXZlOiBib29sZWFuO1xuICByb29tczogU2V0PFdlYlNvY2tldFJvb21JZD47XG4gIGNvbm5lY3RlZEF0OiBEYXRlO1xuICBsYXN0U2VlbkF0OiBEYXRlO1xuICB1c2VySWQ/OiBXZWJTb2NrZXRVc2VySWQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFByZXNlbmNlU3RvcmUge1xuICByZWdpc3RlcihpbnB1dDoge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIGFjdGl2ZT86IGJvb2xlYW47XG4gIH0pOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U7XG4gIGFjdGl2YXRlKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZDtcbiAgdW5yZWdpc3RlcihzZXNzaW9uSWQ6IHN0cmluZyk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSB8IHVuZGVmaW5lZDtcbiAgdG91Y2goc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkO1xuICBzZXRVc2VySWQoc2Vzc2lvbklkOiBzdHJpbmcsIHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogdm9pZDtcbiAgY2xlYXJVc2VySWQoc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkO1xuICBqb2luKHNlc3Npb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQ7XG4gIGxlYXZlKHNlc3Npb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQ7XG4gIGdldENvbm5lY3Rpb24oc2Vzc2lvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UgfCB1bmRlZmluZWQ7XG4gIGdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2U/OiBzdHJpbmcpOiBudW1iZXI7XG4gIGdldFJvb21NZW1iZXJzKHJvb21JZDogV2ViU29ja2V0Um9vbUlkLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXTtcbiAgZ2V0U3RhdHMoKTogV2ViU29ja2V0UmVnaXN0cnlTdGF0cztcbiAgcXVlcnlBdWRpZW5jZShhdWRpZW5jZTogV2ViU29ja2V0QXVkaWVuY2UpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSBpbXBsZW1lbnRzIFdlYlNvY2tldFByZXNlbmNlU3RvcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSByb29tcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICByZWdpc3RlcihpbnB1dDoge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIGFjdGl2ZT86IGJvb2xlYW47XG4gIH0pOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2Uge1xuICAgIGNvbnN0IG1ldGE6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSA9IHtcbiAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgbm9kZUlkOiBpbnB1dC5ub2RlSWQsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGFjdGl2ZTogaW5wdXQuYWN0aXZlID8/IHRydWUsXG4gICAgICByb29tczogbmV3IFNldCgpLFxuICAgICAgY29ubmVjdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBsYXN0U2VlbkF0OiBuZXcgRGF0ZSgpLFxuICAgIH07XG4gICAgdGhpcy5jb25uZWN0aW9ucy5zZXQoaW5wdXQuc2Vzc2lvbklkLCBtZXRhKTtcbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIGFjdGl2YXRlKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWV0YS5hY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgdW5yZWdpc3RlcihzZXNzaW9uSWQ6IHN0cmluZyk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChtZXRhLnVzZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZVVzZXJCaW5kaW5nKG1ldGEubmFtZXNwYWNlLCBtZXRhLnVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvb21JZCBvZiBtZXRhLnJvb21zKSB7XG4gICAgICB0aGlzLnJlbW92ZVJvb21CaW5kaW5nKG1ldGEubmFtZXNwYWNlLCByb29tSWQsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9ucy5kZWxldGUoc2Vzc2lvbklkKTtcbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIHRvdWNoKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWV0YS5sYXN0U2VlbkF0ID0gbmV3IERhdGUoKTtcbiAgfVxuXG4gIHNldFVzZXJJZChzZXNzaW9uSWQ6IHN0cmluZywgdXNlcklkOiBXZWJTb2NrZXRVc2VySWQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWV0YS51c2VySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZW1vdmVVc2VyQmluZGluZyhtZXRhLm5hbWVzcGFjZSwgbWV0YS51c2VySWQsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgbWV0YS51c2VySWQgPSB1c2VySWQ7XG4gICAgY29uc3Qga2V5ID0gZ2V0QmluZGluZ0tleShtZXRhLm5hbWVzcGFjZSwgU3RyaW5nKHVzZXJJZCkpO1xuICAgIGNvbnN0IGJvdW5kID0gdGhpcy51c2Vycy5nZXQoa2V5KSA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBib3VuZC5hZGQoc2Vzc2lvbklkKTtcbiAgICB0aGlzLnVzZXJzLnNldChrZXksIGJvdW5kKTtcbiAgfVxuXG4gIGNsZWFyVXNlcklkKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhIHx8IG1ldGEudXNlcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZVVzZXJCaW5kaW5nKG1ldGEubmFtZXNwYWNlLCBtZXRhLnVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICBkZWxldGUgbWV0YS51c2VySWQ7XG4gIH1cblxuICBqb2luKHNlc3Npb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1ldGEucm9vbXMuYWRkKHJvb21JZCk7XG4gICAgY29uc3Qga2V5ID0gZ2V0QmluZGluZ0tleShtZXRhLm5hbWVzcGFjZSwgcm9vbUlkKTtcbiAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5yb29tcy5nZXQoa2V5KSA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBtZW1iZXJzLmFkZChzZXNzaW9uSWQpO1xuICAgIHRoaXMucm9vbXMuc2V0KGtleSwgbWVtYmVycyk7XG4gIH1cblxuICBsZWF2ZShzZXNzaW9uSWQ6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtZXRhLnJvb21zLmRlbGV0ZShyb29tSWQpO1xuICAgIHRoaXMucmVtb3ZlUm9vbUJpbmRpbmcobWV0YS5uYW1lc3BhY2UsIHJvb21JZCwgc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oc2Vzc2lvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvbkNvdW50KG5hbWVzcGFjZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIGZvciAoY29uc3QgbWV0YSBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIW1ldGEuYWN0aXZlIHx8IChuYW1lc3BhY2UgJiYgbWV0YS5uYW1lc3BhY2UgIT09IG5hbWVzcGFjZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlcnMocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb3VuZENvbm5lY3Rpb25zKHRoaXMucm9vbXMsIHJvb21JZCwgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFdlYlNvY2tldFJlZ2lzdHJ5U3RhdHMge1xuICAgIGNvbnN0IGJ5TmFtZXNwYWNlOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFtZXRhLmFjdGl2ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJ5TmFtZXNwYWNlW21ldGEubmFtZXNwYWNlXSA9IChieU5hbWVzcGFjZVttZXRhLm5hbWVzcGFjZV0gPz8gMCkgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbENvbm5lY3Rpb25zOiBPYmplY3QudmFsdWVzKGJ5TmFtZXNwYWNlKS5yZWR1Y2UoKHN1bSwgY291bnQpID0+IHN1bSArIGNvdW50LCAwKSxcbiAgICAgIHRvdGFsUm9vbXM6IHRoaXMucm9vbXMuc2l6ZSxcbiAgICAgIGJ5TmFtZXNwYWNlLFxuICAgIH07XG4gIH1cblxuICBxdWVyeUF1ZGllbmNlKGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdIHtcbiAgICBzd2l0Y2ggKGF1ZGllbmNlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJhbGxcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29ubmVjdGlvbnMoYXVkaWVuY2UubmFtZXNwYWNlKTtcbiAgICAgIGNhc2UgXCJyb29tXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJvdW5kQ29ubmVjdGlvbnModGhpcy5yb29tcywgYXVkaWVuY2Uucm9vbUlkLCBhdWRpZW5jZS5uYW1lc3BhY2UpO1xuICAgICAgY2FzZSBcInVzZXJcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm91bmRDb25uZWN0aW9ucyh0aGlzLnVzZXJzLCBTdHJpbmcoYXVkaWVuY2UudXNlcklkKSwgYXVkaWVuY2UubmFtZXNwYWNlKTtcbiAgICAgIGNhc2UgXCJjb25uZWN0aW9uc1wiOiB7XG4gICAgICAgIGNvbnN0IG1ldGFzOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbklkIG9mIGF1ZGllbmNlLmNvbm5lY3Rpb25JZHMpIHtcbiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKTtcbiAgICAgICAgICBpZiAoIW1ldGE/LmFjdGl2ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdWRpZW5jZS5uYW1lc3BhY2UgJiYgbWV0YS5uYW1lc3BhY2UgIT09IGF1ZGllbmNlLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1ldGFzLnB1c2gobWV0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWV0YXM7XG4gICAgICB9XG4gICAgICBjYXNlIFwidW5pb25cIjoge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGNvbnN0IG1ldGFzOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhdWRpZW5jZS5hdWRpZW5jZXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1ldGEgb2YgdGhpcy5xdWVyeUF1ZGllbmNlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMobWV0YS5zZXNzaW9uSWQpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWVuLmFkZChtZXRhLnNlc3Npb25JZCk7XG4gICAgICAgICAgICBtZXRhcy5wdXNoKG1ldGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZXRhcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZUNvbm5lY3Rpb25zKG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdIHtcbiAgICBjb25zdCBtZXRhczogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbWV0YSBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIW1ldGEuYWN0aXZlIHx8IChuYW1lc3BhY2UgJiYgbWV0YS5uYW1lc3BhY2UgIT09IG5hbWVzcGFjZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG1ldGFzLnB1c2gobWV0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCb3VuZENvbm5lY3Rpb25zKFxuICAgIGJpbmRpbmdzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdIHtcbiAgICBjb25zdCBtZXRhczogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlcnMgb2YgdGhpcy5nZXRTY29wZWRCaW5kaW5ncyhiaW5kaW5ncywgaWQsIG5hbWVzcGFjZSkpIHtcbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbklkIG9mIG1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuLmFkZChjb25uZWN0aW9uSWQpO1xuXG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpO1xuICAgICAgICBpZiAobWV0YT8uYWN0aXZlKSB7XG4gICAgICAgICAgbWV0YXMucHVzaChtZXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXRhcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NvcGVkQmluZGluZ3MoXG4gICAgYmluZGluZ3M6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PixcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWVzcGFjZT86IHN0cmluZyxcbiAgKTogU2V0PHN0cmluZz5bXSB7XG4gICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgY29uc3QgZXhhY3QgPSBiaW5kaW5ncy5nZXQoZ2V0QmluZGluZ0tleShuYW1lc3BhY2UsIGlkKSk7XG4gICAgICByZXR1cm4gZXhhY3QgPyBbZXhhY3RdIDogW107XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlczogU2V0PHN0cmluZz5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgbWVtYmVyc10gb2YgYmluZGluZ3MpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQmluZGluZ0tleShrZXkpO1xuICAgICAgaWYgKHBhcnNlZC5pZCA9PT0gaWQpIHtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKG1lbWJlcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVzO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSb29tQmluZGluZyhuYW1lc3BhY2U6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gZ2V0QmluZGluZ0tleShuYW1lc3BhY2UsIHJvb21JZCk7XG4gICAgY29uc3QgbWVtYmVycyA9IHRoaXMucm9vbXMuZ2V0KGtleSk7XG4gICAgaWYgKCFtZW1iZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWVtYmVycy5kZWxldGUoc2Vzc2lvbklkKTtcbiAgICBpZiAobWVtYmVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnJvb21zLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVXNlckJpbmRpbmcobmFtZXNwYWNlOiBzdHJpbmcsIHVzZXJJZDogV2ViU29ja2V0VXNlcklkLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGdldEJpbmRpbmdLZXkobmFtZXNwYWNlLCBTdHJpbmcodXNlcklkKSk7XG4gICAgY29uc3QgbWVtYmVycyA9IHRoaXMudXNlcnMuZ2V0KGtleSk7XG4gICAgaWYgKCFtZW1iZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWVtYmVycy5kZWxldGUoc2Vzc2lvbklkKTtcbiAgICBpZiAobWVtYmVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnVzZXJzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCaW5kaW5nS2V5KG5hbWVzcGFjZTogc3RyaW5nLCBpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWVzcGFjZX06OiR7aWR9YDtcbn1cblxuZnVuY3Rpb24gcGFyc2VCaW5kaW5nS2V5KGtleTogc3RyaW5nKTogeyBuYW1lc3BhY2U6IHN0cmluZzsgaWQ6IHN0cmluZyB9IHtcbiAgY29uc3QgW25hbWVzcGFjZSwgLi4ucmVzdF0gPSBrZXkuc3BsaXQoXCI6OlwiKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lc3BhY2UsXG4gICAgaWQ6IHJlc3Quam9pbihcIjo6XCIpLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUEyVEEsU0FBUyxjQUFjLFdBQW1CLElBQW9CO0FBQzVELFFBQU8sR0FBRyxVQUFVLElBQUk7O0FBRzFCLFNBQVMsZ0JBQWdCLEtBQWdEO0NBQ3ZFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsUUFBUSxJQUFJLE1BQU0sS0FBSztBQUM1QyxRQUFPO0VBQ0w7RUFDQSxJQUFJLEtBQUssS0FBSyxLQUFLO0VBQ3BCOzs7O0NBalNVLGlDQUFiLE1BQThFO0VBQzVFLEFBQWlCLGNBQWMsSUFBSSxLQUF1QztFQUMxRSxBQUFpQixRQUFRLElBQUksS0FBMEI7RUFDdkQsQUFBaUIsUUFBUSxJQUFJLEtBQTBCO0VBRXZELFNBQVMsT0FLb0I7R0FDM0IsTUFBTUEsT0FBaUM7SUFDckMsV0FBVyxNQUFNO0lBQ2pCLFFBQVEsTUFBTTtJQUNkLFdBQVcsTUFBTTtJQUNqQixRQUFRLE1BQU0sVUFBVTtJQUN4QixPQUFPLElBQUksS0FBSztJQUNoQixhQUFhLElBQUksTUFBTTtJQUN2QixZQUFZLElBQUksTUFBTTtJQUN2QjtBQUNELFFB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
@@ -0,0 +1,42 @@
1
+ import { type WebSocketAudience as WebSocketAudienceSpec } from "./ws-audience";
2
+ import { WebSocketAudienceResolver } from "./ws-audience-resolver";
3
+ import { type WebSocketClusterBus } from "./ws-cluster-bus";
4
+ import { type ManagedWebSocketConnection, type WebSocketRegistryStats, type WebSocketRoomId, type WebSocketUserId } from "./ws-core";
5
+ import { WebSocketDeliveryEngine } from "./ws-delivery";
6
+ import { WebSocketLocalConnectionStore } from "./ws-local-connection-store";
7
+ import { type WebSocketPresenceStore, type WebSocketSessionPresence } from "./ws-presence-store";
8
+ export type { ManagedWebSocketConnection, WebSocketRegistryStats, WebSocketRoomId, WebSocketUserId, };
9
+ export type WebSocketConnectionMeta = WebSocketSessionPresence;
10
+ export type WebSocketRegistryOptions = {
11
+ nodeId?: string;
12
+ presenceStore?: WebSocketPresenceStore;
13
+ clusterBus?: WebSocketClusterBus;
14
+ };
15
+ export declare class WebSocketRegistry {
16
+ readonly nodeId: string;
17
+ readonly localConnections: WebSocketLocalConnectionStore;
18
+ readonly presenceStore: WebSocketPresenceStore;
19
+ readonly clusterBus: WebSocketClusterBus;
20
+ readonly audienceResolver: WebSocketAudienceResolver;
21
+ readonly deliveryEngine: WebSocketDeliveryEngine;
22
+ constructor(options?: WebSocketRegistryOptions);
23
+ register(connection: ManagedWebSocketConnection, active?: boolean): WebSocketConnectionMeta;
24
+ activate(connectionId: string): void;
25
+ unregister(connectionId: string): void;
26
+ touch(connectionId: string): void;
27
+ setUserId(connectionId: string, userId: WebSocketUserId): void;
28
+ clearUserId(connectionId: string): void;
29
+ join(connectionId: string, roomId: WebSocketRoomId): void;
30
+ leave(connectionId: string, roomId: WebSocketRoomId): void;
31
+ broadcast(event: string, data: unknown, namespace?: string): void;
32
+ publishToRoom(roomId: WebSocketRoomId, event: string, data: unknown, namespace?: string): void;
33
+ publishToUser(userId: WebSocketUserId, event: string, data: unknown, namespace?: string): void;
34
+ publishToAudience(audience: WebSocketAudienceSpec, event: string, data: unknown): void;
35
+ getConnection(connectionId: string): WebSocketConnectionMeta | undefined;
36
+ getConnectionCount(namespace?: string): number;
37
+ getRoomMembers(roomId: WebSocketRoomId, namespace?: string): WebSocketConnectionMeta[];
38
+ getStats(): WebSocketRegistryStats;
39
+ closeAll(code?: number, reason?: string): void;
40
+ shutdown(code?: number, reason?: string): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=ws-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-registry.d.ts","sourceRoot":"","sources":["../../src/stream/ws-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+ import { WebSocketAudience, init_ws_audience } from "./ws-audience.js";
3
+ import { WebSocketAudienceResolver, init_ws_audience_resolver } from "./ws-audience-resolver.js";
4
+ import { NoopWebSocketClusterBus, init_ws_cluster_bus } from "./ws-cluster-bus.js";
5
+ import { WebSocketDeliveryEngine, init_ws_delivery } from "./ws-delivery.js";
6
+ import { WebSocketLocalConnectionStore, init_ws_local_connection_store } from "./ws-local-connection-store.js";
7
+ import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./ws-presence-store.js";
8
+
9
+ //#region src/stream/ws-registry.ts
10
+ var WebSocketRegistry;
11
+ var init_ws_registry = __esmMin((() => {
12
+ init_ws_audience();
13
+ init_ws_audience_resolver();
14
+ init_ws_cluster_bus();
15
+ init_ws_delivery();
16
+ init_ws_local_connection_store();
17
+ init_ws_presence_store();
18
+ WebSocketRegistry = class {
19
+ nodeId;
20
+ localConnections = new WebSocketLocalConnectionStore();
21
+ presenceStore;
22
+ clusterBus;
23
+ audienceResolver;
24
+ deliveryEngine;
25
+ constructor(options = {}) {
26
+ this.nodeId = options.nodeId ?? "local";
27
+ this.presenceStore = options.presenceStore ?? new InMemoryWebSocketPresenceStore();
28
+ this.clusterBus = options.clusterBus ?? new NoopWebSocketClusterBus();
29
+ this.audienceResolver = new WebSocketAudienceResolver({
30
+ nodeId: this.nodeId,
31
+ presenceStore: this.presenceStore
32
+ });
33
+ this.deliveryEngine = new WebSocketDeliveryEngine({
34
+ nodeId: this.nodeId,
35
+ localConnections: this.localConnections,
36
+ audienceResolver: this.audienceResolver,
37
+ clusterBus: this.clusterBus
38
+ });
39
+ }
40
+ register(connection, active = true) {
41
+ this.localConnections.register(connection);
42
+ return this.presenceStore.register({
43
+ sessionId: connection.id,
44
+ nodeId: this.nodeId,
45
+ namespace: connection.namespace,
46
+ active
47
+ });
48
+ }
49
+ activate(connectionId) {
50
+ this.presenceStore.activate(connectionId);
51
+ }
52
+ unregister(connectionId) {
53
+ this.presenceStore.unregister(connectionId);
54
+ this.localConnections.unregister(connectionId);
55
+ }
56
+ touch(connectionId) {
57
+ this.presenceStore.touch(connectionId);
58
+ }
59
+ setUserId(connectionId, userId) {
60
+ this.presenceStore.setUserId(connectionId, userId);
61
+ }
62
+ clearUserId(connectionId) {
63
+ this.presenceStore.clearUserId(connectionId);
64
+ }
65
+ join(connectionId, roomId) {
66
+ this.presenceStore.join(connectionId, roomId);
67
+ }
68
+ leave(connectionId, roomId) {
69
+ this.presenceStore.leave(connectionId, roomId);
70
+ }
71
+ broadcast(event, data, namespace) {
72
+ this.publishToAudience(WebSocketAudience.all(namespace), event, data);
73
+ }
74
+ publishToRoom(roomId, event, data, namespace) {
75
+ this.publishToAudience(WebSocketAudience.room(roomId, namespace), event, data);
76
+ }
77
+ publishToUser(userId, event, data, namespace) {
78
+ this.publishToAudience(WebSocketAudience.user(userId, namespace), event, data);
79
+ }
80
+ publishToAudience(audience, event, data) {
81
+ this.deliveryEngine.publishToAudience(audience, event, data);
82
+ }
83
+ getConnection(connectionId) {
84
+ return this.presenceStore.getConnection(connectionId);
85
+ }
86
+ getConnectionCount(namespace) {
87
+ return this.presenceStore.getConnectionCount(namespace);
88
+ }
89
+ getRoomMembers(roomId, namespace) {
90
+ return this.presenceStore.getRoomMembers(roomId, namespace);
91
+ }
92
+ getStats() {
93
+ return this.presenceStore.getStats();
94
+ }
95
+ closeAll(code, reason) {
96
+ this.localConnections.closeAll(code, reason);
97
+ }
98
+ async shutdown(code, reason) {
99
+ this.closeAll(code, reason);
100
+ await this.deliveryEngine.shutdown();
101
+ }
102
+ };
103
+ }));
104
+
105
+ //#endregion
106
+ init_ws_registry();
107
+ export { WebSocketRegistry, init_ws_registry };
108
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcmVnaXN0cnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1yZWdpc3RyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXZWJTb2NrZXRBdWRpZW5jZSwgdHlwZSBXZWJTb2NrZXRBdWRpZW5jZSBhcyBXZWJTb2NrZXRBdWRpZW5jZVNwZWMgfSBmcm9tIFwiLi93cy1hdWRpZW5jZVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlciB9IGZyb20gXCIuL3dzLWF1ZGllbmNlLXJlc29sdmVyXCI7XG5pbXBvcnQgeyBOb29wV2ViU29ja2V0Q2x1c3RlckJ1cywgdHlwZSBXZWJTb2NrZXRDbHVzdGVyQnVzIH0gZnJvbSBcIi4vd3MtY2x1c3Rlci1idXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24sXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgdHlwZSBXZWJTb2NrZXRSb29tSWQsXG4gIHR5cGUgV2ViU29ja2V0VXNlcklkLFxufSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSB9IGZyb20gXCIuL3dzLWRlbGl2ZXJ5XCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSB9IGZyb20gXCIuL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmVcIjtcbmltcG9ydCB7XG4gIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSxcbiAgdHlwZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlLFxuICB0eXBlIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSxcbn0gZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcblxuZXhwb3J0IHR5cGUge1xuICBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgV2ViU29ja2V0Um9vbUlkLFxuICBXZWJTb2NrZXRVc2VySWQsXG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbk1ldGEgPSBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgbm9kZUlkPzogc3RyaW5nO1xuICBwcmVzZW5jZVN0b3JlPzogV2ViU29ja2V0UHJlc2VuY2VTdG9yZTtcbiAgY2x1c3RlckJ1cz86IFdlYlNvY2tldENsdXN0ZXJCdXM7XG59O1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UmVnaXN0cnkge1xuICByZWFkb25seSBub2RlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9jYWxDb25uZWN0aW9ucyA9IG5ldyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSgpO1xuICByZWFkb25seSBwcmVzZW5jZVN0b3JlOiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICByZWFkb25seSBjbHVzdGVyQnVzOiBXZWJTb2NrZXRDbHVzdGVyQnVzO1xuICByZWFkb25seSBhdWRpZW5jZVJlc29sdmVyOiBXZWJTb2NrZXRBdWRpZW5jZVJlc29sdmVyO1xuICByZWFkb25seSBkZWxpdmVyeUVuZ2luZTogV2ViU29ja2V0RGVsaXZlcnlFbmdpbmU7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV2ViU29ja2V0UmVnaXN0cnlPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm5vZGVJZCA9IG9wdGlvbnMubm9kZUlkID8/IFwibG9jYWxcIjtcbiAgICB0aGlzLnByZXNlbmNlU3RvcmUgPSBvcHRpb25zLnByZXNlbmNlU3RvcmUgPz8gbmV3IEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSgpO1xuICAgIHRoaXMuY2x1c3RlckJ1cyA9IG9wdGlvbnMuY2x1c3RlckJ1cyA/PyBuZXcgTm9vcFdlYlNvY2tldENsdXN0ZXJCdXMoKTtcbiAgICB0aGlzLmF1ZGllbmNlUmVzb2x2ZXIgPSBuZXcgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcih7XG4gICAgICBub2RlSWQ6IHRoaXMubm9kZUlkLFxuICAgICAgcHJlc2VuY2VTdG9yZTogdGhpcy5wcmVzZW5jZVN0b3JlLFxuICAgIH0pO1xuICAgIHRoaXMuZGVsaXZlcnlFbmdpbmUgPSBuZXcgV2ViU29ja2V0RGVsaXZlcnlFbmdpbmUoe1xuICAgICAgbm9kZUlkOiB0aGlzLm5vZGVJZCxcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IHRoaXMubG9jYWxDb25uZWN0aW9ucyxcbiAgICAgIGF1ZGllbmNlUmVzb2x2ZXI6IHRoaXMuYXVkaWVuY2VSZXNvbHZlcixcbiAgICAgIGNsdXN0ZXJCdXM6IHRoaXMuY2x1c3RlckJ1cyxcbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyKFxuICAgIGNvbm5lY3Rpb246IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uLFxuICAgIGFjdGl2ZTogYm9vbGVhbiA9IHRydWUsXG4gICk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhIHtcbiAgICB0aGlzLmxvY2FsQ29ubmVjdGlvbnMucmVnaXN0ZXIoY29ubmVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5yZWdpc3Rlcih7XG4gICAgICBzZXNzaW9uSWQ6IGNvbm5lY3Rpb24uaWQsXG4gICAgICBub2RlSWQ6IHRoaXMubm9kZUlkLFxuICAgICAgbmFtZXNwYWNlOiBjb25uZWN0aW9uLm5hbWVzcGFjZSxcbiAgICAgIGFjdGl2ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmFjdGl2YXRlKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLnVucmVnaXN0ZXIoY29ubmVjdGlvbklkKTtcbiAgICB0aGlzLmxvY2FsQ29ubmVjdGlvbnMudW5yZWdpc3Rlcihjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgdG91Y2goY29ubmVjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNlbmNlU3RvcmUudG91Y2goY29ubmVjdGlvbklkKTtcbiAgfVxuXG4gIHNldFVzZXJJZChjb25uZWN0aW9uSWQ6IHN0cmluZywgdXNlcklkOiBXZWJTb2NrZXRVc2VySWQpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNlbmNlU3RvcmUuc2V0VXNlcklkKGNvbm5lY3Rpb25JZCwgdXNlcklkKTtcbiAgfVxuXG4gIGNsZWFyVXNlcklkKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmNsZWFyVXNlcklkKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBqb2luKGNvbm5lY3Rpb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5qb2luKGNvbm5lY3Rpb25JZCwgcm9vbUlkKTtcbiAgfVxuXG4gIGxlYXZlKGNvbm5lY3Rpb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5sZWF2ZShjb25uZWN0aW9uSWQsIHJvb21JZCk7XG4gIH1cblxuICBicm9hZGNhc3QoZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5hbGwobmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5yb29tKHJvb21JZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvVXNlcih1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS51c2VyKHVzZXJJZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2U6IFdlYlNvY2tldEF1ZGllbmNlU3BlYywgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuZGVsaXZlcnlFbmdpbmUucHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2UsIGV2ZW50LCBkYXRhKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRDb25uZWN0aW9uTWV0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uQ291bnQobmFtZXNwYWNlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlcnMocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhW10ge1xuICAgIHJldHVybiB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Um9vbU1lbWJlcnMocm9vbUlkLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogV2ViU29ja2V0UmVnaXN0cnlTdGF0cyB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRTdGF0cygpO1xuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bihjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gICAgYXdhaXQgdGhpcy5kZWxpdmVyeUVuZ2luZS5zaHV0ZG93bigpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O21CQUFtRzs0QkFDaEM7c0JBQ2tCO21CQU83QjtpQ0FDb0I7eUJBSy9DO0NBZ0JoQixvQkFBYixNQUErQjtFQUM3QixBQUFTO0VBQ1QsQUFBUyxtQkFBbUIsSUFBSSwrQkFBK0I7RUFDL0QsQUFBUztFQUNULEFBQVM7RUFDVCxBQUFTO0VBQ1QsQUFBUztFQUVULFlBQVksVUFBb0MsRUFBRSxFQUFFO0FBQ2xELFFBQUssU0FBUyxRQUFRLFVBQVU7QUFDaEMsUUFBSyxnQkFBZ0IsUUFBUSxpQkFBaUIsSUFBSSxnQ0FBZ0M7QUFDbEYsUUFBSyxhQUFhLFFBQVEsY0FBYyxJQUFJLHlCQUF5QjtBQUNyRSxRQUFLLG1CQUFtQixJQUFJLDBCQUEwQjtJQUNwRCxRQUFRLEtBQUs7SUFDYixlQUFlLEtBQUs7SUFDckIsQ0FBQztBQUNGLFFBQUssaUJBQWlCLElBQUksd0JBQXdCO0lBQ2hELFFBQVEsS0FBSztJQUNiLGtCQUFrQixLQUFLO0lBQ3ZCLGtCQUFrQixLQUFLO0lBQ3ZCLFlBQVksS0FBSztJQUNsQixDQUFDOztFQUdKLFNBQ0UsWUFDQSxTQUFrQixNQUNPO0FBQ3pCLFFBQUssaUJBQWlCLFNBQVMsV0FBVztBQUMxQyxVQUFPLEtBQUssY0FBYyxTQUFTO0lBQ2pDLFdBQVcsV0FBVztJQUN0QixRQUFRLEtBQUs7SUFDYixXQUFXLFdBQVc7SUFDdEI7SUFDRCxDQUFDOztFQUdKLFNBQVMsY0FBNEI7QUFDbkMsUUFBSyxjQUFjLFNBQVMsYUFBYTs7RUFHM0MsV0FBVyxjQUE0QjtBQUNyQyxRQUFLLGNBQWMsV0FBVyxhQUFhO0FBQzNDLFFBQUssaUJBQWlCLFdBQVcsYUFBYTs7RUFHaEQsTUFBTSxjQUE0QjtBQUNoQyxRQUFLLGNBQWMsTUFBTSxhQUFhOztFQUd4QyxVQUFVLGNBQXNCLFFBQStCO0FBQzdELFFBQUssY0FBYyxVQUFVLGNBQWMsT0FBTzs7RUFHcEQsWUFBWSxjQUE0QjtBQUN0QyxRQUFLLGNBQWMsWUFBWSxhQUFhOztFQUc5QyxLQUFLLGNBQXNCLFFBQStCO0FBQ3hELFFBQUssY0FBYyxLQUFLLGNBQWMsT0FBTzs7RUFHL0MsTUFBTSxjQUFzQixRQUErQjtBQUN6RCxRQUFLLGNBQWMsTUFBTSxjQUFjLE9BQU87O0VBR2hELFVBQVUsT0FBZSxNQUFlLFdBQTBCO0FBQ2hFLFFBQUssa0JBQWtCLGtCQUFrQixJQUFJLFVBQVUsRUFBRSxPQUFPLEtBQUs7O0VBR3ZFLGNBQWMsUUFBeUIsT0FBZSxNQUFlLFdBQTBCO0FBQzdGLFFBQUssa0JBQWtCLGtCQUFrQixLQUFLLFFBQVEsVUFBVSxFQUFFLE9BQU8sS0FBSzs7RUFHaEYsY0FBYyxRQUF5QixPQUFlLE1BQWUsV0FBMEI7QUFDN0YsUUFBSyxrQkFBa0Isa0JBQWtCLEtBQUssUUFBUSxVQUFVLEVBQUUsT0FBTyxLQUFLOztFQUdoRixrQkFBa0IsVUFBaUMsT0FBZSxNQUFxQjtBQUNyRixRQUFLLGVBQWUsa0JBQWtCLFVBQVUsT0FBTyxLQUFLOztFQUc5RCxjQUFjLGNBQTJEO0FBQ3ZFLFVBQU8sS0FBSyxjQUFjLGNBQWMsYUFBYTs7RUFHdkQsbUJBQW1CLFdBQTRCO0FBQzdDLFVBQU8sS0FBSyxjQUFjLG1CQUFtQixVQUFVOztFQUd6RCxlQUFlLFFBQXlCLFdBQStDO0FBQ3JGLFVBQU8sS0FBSyxjQUFjLGVBQWUsUUFBUSxVQUFVOztFQUc3RCxXQUFtQztBQUNqQyxVQUFPLEtBQUssY0FBYyxVQUFVOztFQUd0QyxTQUFTLE1BQWUsUUFBdUI7QUFDN0MsUUFBSyxpQkFBaUIsU0FBUyxNQUFNLE9BQU87O0VBRzlDLE1BQU0sU0FBUyxNQUFlLFFBQWdDO0FBQzVELFFBQUssU0FBUyxNQUFNLE9BQU87QUFDM0IsU0FBTSxLQUFLLGVBQWUsVUFBVSJ9
@@ -0,0 +1,52 @@
1
+ import { type WebSocket } from "ws";
2
+ import { z } from "zod";
3
+ import { type WebSocketAudience } from "./ws-audience";
4
+ import { type WebSocketClusterBus } from "./ws-cluster-bus";
5
+ import { type WebSocketPresenceStore } from "./ws-presence-store";
6
+ import { type ManagedWebSocketConnection, WebSocketRegistry, type WebSocketRoomId, type WebSocketUserId } from "./ws-registry";
7
+ type MessageHandler<T> = (data: T) => void | Promise<void>;
8
+ type CloseHandler = () => void | Promise<void>;
9
+ export type WebSocketEventMap = Record<string, unknown>;
10
+ type InferWebSocketEventMap<TSchema extends z.ZodRawShape> = z.infer<z.ZodObject<TSchema>>;
11
+ export type WebSocketOutEvents<TOut extends WebSocketEventMap = WebSocketEventMap> = TOut;
12
+ export type WebSocketInEvents<TIn extends WebSocketEventMap = WebSocketEventMap> = TIn;
13
+ export interface WebSocketConnection<TOut extends WebSocketEventMap = WebSocketEventMap, TIn extends WebSocketEventMap = WebSocketEventMap> extends ManagedWebSocketConnection {
14
+ transport: "ws";
15
+ onClose(callback: CloseHandler): void;
16
+ onMessage<K extends keyof WebSocketInEvents<TIn>>(event: K, handler: MessageHandler<WebSocketInEvents<TIn>[K]>): void;
17
+ publish<K extends keyof WebSocketOutEvents<TOut>>(event: K, data: WebSocketOutEvents<TOut>[K]): void;
18
+ waitForClose(): Promise<void>;
19
+ join(roomId: WebSocketRoomId): void;
20
+ leave(roomId: WebSocketRoomId): void;
21
+ setUserId(userId: WebSocketUserId): void;
22
+ clearUserId(): void;
23
+ }
24
+ export type AnyWebSocketConnection = WebSocketConnection<WebSocketEventMap, WebSocketEventMap>;
25
+ type WebSocketConnectionOptions<TOut extends z.ZodRawShape, TIn extends z.ZodRawShape> = {
26
+ namespace?: string;
27
+ heartbeat?: number;
28
+ maxPayload?: number;
29
+ active?: boolean;
30
+ outEvents: z.ZodObject<TOut>;
31
+ inEvents: z.ZodObject<TIn>;
32
+ registry: WebSocketRegistry;
33
+ };
34
+ export type WebSocketRuntimeOptions = {
35
+ nodeId?: string;
36
+ presenceStore?: WebSocketPresenceStore;
37
+ clusterBus?: WebSocketClusterBus;
38
+ };
39
+ export declare class WebSocketRuntime {
40
+ readonly registry: WebSocketRegistry;
41
+ constructor(options?: WebSocketRuntimeOptions);
42
+ registerConnection<TOutSchema extends z.ZodRawShape, TInSchema extends z.ZodRawShape>(socket: WebSocket, options: Omit<WebSocketConnectionOptions<TOutSchema, TInSchema>, "registry">): WebSocketConnection<InferWebSocketEventMap<TOutSchema>, InferWebSocketEventMap<TInSchema>>;
43
+ activateConnection(connectionId: string): void;
44
+ broadcast(event: string, data: unknown, namespace?: string): void;
45
+ publishToRoom(roomId: WebSocketRoomId, event: string, data: unknown, namespace?: string): void;
46
+ publishToUser(userId: WebSocketUserId, event: string, data: unknown, namespace?: string): void;
47
+ publishToAudience(audience: WebSocketAudience, event: string, data: unknown): void;
48
+ shutdown(code?: number, reason?: string): Promise<void>;
49
+ }
50
+ export declare function createWebSocketRuntime(options?: WebSocketRuntimeOptions): WebSocketRuntime;
51
+ export {};
52
+ //# sourceMappingURL=ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/stream/ws.ts"],"names":[],"mappings":"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"}