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.
- package/dist/ai/providers/rtzr/utils.js +2 -2
- package/dist/api/config.d.ts +13 -2
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/context.d.ts +17 -7
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts +18 -0
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +54 -3
- package/dist/api/index.js +8 -3
- package/dist/api/sonamu.d.ts +24 -9
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +365 -79
- package/dist/api/websocket-helpers.d.ts +24 -0
- package/dist/api/websocket-helpers.d.ts.map +1 -0
- package/dist/api/websocket-helpers.js +77 -0
- package/dist/bin/cli.js +12 -4
- package/dist/database/upsert-builder.js +4 -4
- package/dist/dict/sonamu-dictionary.js +6 -6
- package/dist/entity/entity-manager.js +1 -1
- package/dist/entity/entity.js +3 -3
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -4
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +8 -9
- package/dist/stream/index.d.ts +6 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +13 -2
- package/dist/stream/ws-audience-resolver.d.ts +15 -0
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -0
- package/dist/stream/ws-audience-resolver.js +31 -0
- package/dist/stream/ws-audience.d.ts +28 -0
- package/dist/stream/ws-audience.d.ts.map +1 -0
- package/dist/stream/ws-audience.js +46 -0
- package/dist/stream/ws-cluster-bus.d.ts +23 -0
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -0
- package/dist/stream/ws-cluster-bus.js +18 -0
- package/dist/stream/ws-core.d.ts +15 -0
- package/dist/stream/ws-core.d.ts.map +1 -0
- package/dist/stream/ws-core.js +1 -0
- package/dist/stream/ws-delivery.d.ts +24 -0
- package/dist/stream/ws-delivery.d.ts.map +1 -0
- package/dist/stream/ws-delivery.js +103 -0
- package/dist/stream/ws-local-connection-store.d.ts +10 -0
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -0
- package/dist/stream/ws-local-connection-store.js +44 -0
- package/dist/stream/ws-presence-store.d.ts +61 -0
- package/dist/stream/ws-presence-store.d.ts.map +1 -0
- package/dist/stream/ws-presence-store.js +236 -0
- package/dist/stream/ws-registry.d.ts +42 -0
- package/dist/stream/ws-registry.d.ts.map +1 -0
- package/dist/stream/ws-registry.js +108 -0
- package/dist/stream/ws.d.ts +52 -0
- package/dist/stream/ws.d.ts.map +1 -0
- package/dist/stream/ws.js +397 -0
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +72 -2
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +13 -12
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +7 -4
- package/dist/syncer/event-batcher.d.ts +27 -0
- package/dist/syncer/event-batcher.d.ts.map +1 -0
- package/dist/syncer/event-batcher.js +69 -0
- package/dist/syncer/file-patterns.d.ts +48 -26
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +71 -23
- package/dist/syncer/file-tracking.d.ts +13 -0
- package/dist/syncer/file-tracking.d.ts.map +1 -0
- package/dist/syncer/file-tracking.js +33 -0
- package/dist/syncer/index.js +2 -2
- package/dist/syncer/module-loader.d.ts +2 -11
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +3 -3
- package/dist/syncer/syncer-actions.d.ts +39 -6
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +125 -10
- package/dist/syncer/syncer.d.ts +33 -19
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +168 -168
- package/dist/syncer/watcher.d.ts +8 -0
- package/dist/syncer/watcher.d.ts.map +1 -0
- package/dist/syncer/watcher.js +105 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +2 -1
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +36 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +8 -1
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +5 -3
- package/dist/testing/fixture-manager.js +1 -1
- package/dist/types/types.d.ts +2 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +2 -2
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +4 -3
- package/dist/ui/cdd-service.js +1 -1
- package/dist/ui-web/assets/{index-C5KUjXm0.js → index-BmThfg-s.js} +39 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.d.ts +27 -3
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +56 -6
- package/dist/utils/formatter.d.ts +7 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +95 -60
- package/dist/utils/fs-utils.d.ts +2 -0
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +10 -2
- package/dist/utils/process-utils.d.ts +6 -0
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +16 -3
- package/dist/utils/utils.d.ts +1 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +2 -2
- package/package.json +7 -5
- package/src/ai/providers/rtzr/utils.ts +1 -1
- package/src/api/__tests__/sonamu.websocket.test.ts +64 -0
- package/src/api/__tests__/websocket-context.types.test.ts +58 -0
- package/src/api/config.ts +28 -2
- package/src/api/context.ts +21 -7
- package/src/api/decorators.ts +101 -1
- package/src/api/sonamu.ts +529 -127
- package/src/api/websocket-helpers.ts +122 -0
- package/src/bin/cli.ts +10 -2
- package/src/database/upsert-builder.ts +3 -3
- package/src/dict/sonamu-dictionary.ts +3 -3
- package/src/entity/entity.ts +1 -1
- package/src/index.ts +6 -0
- package/src/migration/code-generation.ts +6 -11
- package/src/shared/app.shared.ts.txt +312 -4
- package/src/shared/web.shared.ts.txt +340 -4
- package/src/stream/__tests__/ws-contracts.test.ts +381 -0
- package/src/stream/__tests__/ws.test.ts +449 -0
- package/src/stream/index.ts +6 -0
- package/src/stream/ws-audience-resolver.ts +35 -0
- package/src/stream/ws-audience.ts +62 -0
- package/src/stream/ws-cluster-bus.ts +32 -0
- package/src/stream/ws-core.ts +16 -0
- package/src/stream/ws-delivery.ts +138 -0
- package/src/stream/ws-local-connection-store.ts +44 -0
- package/src/stream/ws-presence-store.ts +326 -0
- package/src/stream/ws-registry.ts +138 -0
- package/src/stream/ws.ts +591 -0
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +78 -0
- package/src/syncer/api-parser.ts +112 -1
- package/src/syncer/checksum.ts +23 -29
- package/src/syncer/code-generator.ts +4 -1
- package/src/syncer/event-batcher.ts +72 -0
- package/src/syncer/file-patterns.ts +98 -30
- package/src/syncer/file-tracking.ts +27 -0
- package/src/syncer/module-loader.ts +5 -12
- package/src/syncer/syncer-actions.ts +179 -17
- package/src/syncer/syncer.ts +250 -287
- package/src/syncer/watcher.ts +128 -0
- package/src/tasks/workflow-manager.ts +1 -0
- package/src/template/__tests__/services.template.websocket.test.ts +79 -0
- package/src/template/implementations/services.template.ts +69 -0
- package/src/testing/bootstrap.ts +8 -1
- package/src/testing/data-explorer.ts +3 -2
- package/src/types/types.ts +20 -2
- package/src/ui/api.ts +10 -1
- package/src/utils/async-utils.ts +71 -4
- package/src/utils/formatter.ts +114 -75
- package/src/utils/fs-utils.ts +9 -0
- package/src/utils/process-utils.ts +17 -0
- package/src/utils/utils.ts +1 -1
- 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+PixcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWVzcGFjZT86IHN0cmluZyxcbiAgKTogU2V0PHN0cmluZz5bXSB7XG4gICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgY29uc3QgZXhhY3QgPSBiaW5kaW5ncy5nZXQoZ2V0QmluZGluZ0tleShuYW1lc3BhY2UsIGlkKSk7XG4gICAgICByZXR1cm4gZXhhY3QgPyBbZXhhY3RdIDogW107XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlczogU2V0PHN0cmluZz5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgbWVtYmVyc10gb2YgYmluZGluZ3MpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQmluZGluZ0tleShrZXkpO1xuICAgICAgaWYgKHBhcnNlZC5pZCA9PT0gaWQpIHtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKG1lbWJlcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVzO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSb29tQmluZGluZyhuYW1lc3BhY2U6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gZ2V0QmluZGluZ0tleShuYW1lc3BhY2UsIHJvb21JZCk7XG4gICAgY29uc3QgbWVtYmVycyA9IHRoaXMucm9vbXMuZ2V0KGtleSk7XG4gICAgaWYgKCFtZW1iZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWVtYmVycy5kZWxldGUoc2Vzc2lvbklkKTtcbiAgICBpZiAobWVtYmVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnJvb21zLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVXNlckJpbmRpbmcobmFtZXNwYWNlOiBzdHJpbmcsIHVzZXJJZDogV2ViU29ja2V0VXNlcklkLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGdldEJpbmRpbmdLZXkobmFtZXNwYWNlLCBTdHJpbmcodXNlcklkKSk7XG4gICAgY29uc3QgbWVtYmVycyA9IHRoaXMudXNlcnMuZ2V0KGtleSk7XG4gICAgaWYgKCFtZW1iZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWVtYmVycy5kZWxldGUoc2Vzc2lvbklkKTtcbiAgICBpZiAobWVtYmVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnVzZXJzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCaW5kaW5nS2V5KG5hbWVzcGFjZTogc3RyaW5nLCBpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWVzcGFjZX06OiR7aWR9YDtcbn1cblxuZnVuY3Rpb24gcGFyc2VCaW5kaW5nS2V5KGtleTogc3RyaW5nKTogeyBuYW1lc3BhY2U6IHN0cmluZzsgaWQ6IHN0cmluZyB9IHtcbiAgY29uc3QgW25hbWVzcGFjZSwgLi4ucmVzdF0gPSBrZXkuc3BsaXQoXCI6OlwiKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lc3BhY2UsXG4gICAgaWQ6IHJlc3Quam9pbihcIjo6XCIpLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUEyVEEsU0FBUyxjQUFjLFdBQW1CLElBQW9CO0FBQzVELFFBQU8sR0FBRyxVQUFVLElBQUk7O0FBRzFCLFNBQVMsZ0JBQWdCLEtBQWdEO0NBQ3ZFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsUUFBUSxJQUFJLE1BQU0sS0FBSztBQUM1QyxRQUFPO0VBQ0w7RUFDQSxJQUFJLEtBQUssS0FBSyxLQUFLO0VBQ3BCOzs7O0NBalNVLGlDQUFiLE1BQThFO0VBQzVFLEFBQWlCLGNBQWMsSUFBSSxLQUF1QztFQUMxRSxBQUFpQixRQUFRLElBQUksS0FBMEI7RUFDdkQsQUFBaUIsUUFBUSxJQUFJLEtBQTBCO0VBRXZELFNBQVMsT0FLb0I7R0FDM0IsTUFBTUEsT0FBaUM7SUFDckMsV0FBVyxNQUFNO0lBQ2pCLFFBQVEsTUFBTTtJQUNkLFdBQVcsTUFBTTtJQUNqQixRQUFRLE1BQU0sVUFBVTtJQUN4QixPQUFPLElBQUksS0FBSztJQUNoQixhQUFhLElBQUksTUFBTTtJQUN2QixZQUFZLElBQUksTUFBTTtJQUN2QjtBQUNELFFBQUssWUFBWSxJQUFJLE1BQU0sV0FBVyxLQUFLO0FBQzNDLFVBQU87O0VBR1QsU0FBUyxXQUF5QjtHQUNoQyxNQUFNLE9BQU8sS0FBSyxZQUFZLElBQUksVUFBVTtBQUM1QyxPQUFJLENBQUMsTUFBTTtBQUNUOztBQUdGLFFBQUssU0FBUzs7RUFHaEIsV0FBVyxXQUF5RDtHQUNsRSxNQUFNLE9BQU8sS0FBSyxZQUFZLElBQUksVUFBVTtBQUM1QyxPQUFJLENBQUMsTUFBTTtBQUNULFdBQU87O0FBR1QsT0FBSSxLQUFLLFdBQVcsV0FBVztBQUM3QixTQUFLLGtCQUFrQixLQUFLLFdBQVcsS0FBSyxRQUFRLFVBQVU7O0FBR2hFLFFBQUssTUFBTSxVQUFVLEtBQUssT0FBTztBQUMvQixTQUFLLGtCQUFrQixLQUFLLFdBQVcsUUFBUSxVQUFVOztBQUczRCxRQUFLLFlBQVksT0FBTyxVQUFVO0FBQ2xDLFVBQU87O0VBR1QsTUFBTSxXQUF5QjtHQUM3QixNQUFNLE9BQU8sS0FBSyxZQUFZLElBQUksVUFBVTtBQUM1QyxPQUFJLENBQUMsTUFBTTtBQUNUOztBQUdGLFFBQUssYUFBYSxJQUFJLE1BQU07O0VBRzlCLFVBQVUsV0FBbUIsUUFBK0I7R0FDMUQsTUFBTSxPQUFPLEtBQUssWUFBWSxJQUFJLFVBQVU7QUFDNUMsT0FBSSxDQUFDLE1BQU07QUFDVDs7QUFHRixPQUFJLEtBQUssV0FBVyxXQUFXO0FBQzdCLFNBQUssa0JBQWtCLEtBQUssV0FBVyxLQUFLLFFBQVEsVUFBVTs7QUFHaEUsUUFBSyxTQUFTO0dBQ2QsTUFBTSxNQUFNLGNBQWMsS0FBSyxXQUFXLE9BQU8sT0FBTyxDQUFDO0dBQ3pELE1BQU0sUUFBUSxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxLQUFhO0FBQ3RELFNBQU0sSUFBSSxVQUFVO0FBQ3BCLFFBQUssTUFBTSxJQUFJLEtBQUssTUFBTTs7RUFHNUIsWUFBWSxXQUF5QjtHQUNuQyxNQUFNLE9BQU8sS0FBSyxZQUFZLElBQUksVUFBVTtBQUM1QyxPQUFJLENBQUMsUUFBUSxLQUFLLFdBQVcsV0FBVztBQUN0Qzs7QUFHRixRQUFLLGtCQUFrQixLQUFLLFdBQVcsS0FBSyxRQUFRLFVBQVU7QUFDOUQsVUFBTyxLQUFLOztFQUdkLEtBQUssV0FBbUIsUUFBK0I7R0FDckQsTUFBTSxPQUFPLEtBQUssWUFBWSxJQUFJLFVBQVU7QUFDNUMsT0FBSSxDQUFDLE1BQU07QUFDVDs7QUFHRixRQUFLLE1BQU0sSUFBSSxPQUFPO0dBQ3RCLE1BQU0sTUFBTSxjQUFjLEtBQUssV0FBVyxPQUFPO0dBQ2pELE1BQU0sVUFBVSxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxLQUFhO0FBQ3hELFdBQVEsSUFBSSxVQUFVO0FBQ3RCLFFBQUssTUFBTSxJQUFJLEtBQUssUUFBUTs7RUFHOUIsTUFBTSxXQUFtQixRQUErQjtHQUN0RCxNQUFNLE9BQU8sS0FBSyxZQUFZLElBQUksVUFBVTtBQUM1QyxPQUFJLENBQUMsTUFBTTtBQUNUOztBQUdGLFFBQUssTUFBTSxPQUFPLE9BQU87QUFDekIsUUFBSyxrQkFBa0IsS0FBSyxXQUFXLFFBQVEsVUFBVTs7RUFHM0QsY0FBYyxXQUF5RDtBQUNyRSxVQUFPLEtBQUssWUFBWSxJQUFJLFVBQVU7O0VBR3hDLG1CQUFtQixXQUE0QjtHQUM3QyxJQUFJLFFBQVE7QUFFWixRQUFLLE1BQU0sUUFBUSxLQUFLLFlBQVksUUFBUSxFQUFFO0FBQzVDLFFBQUksQ0FBQyxLQUFLLFVBQVcsYUFBYSxLQUFLLGNBQWMsV0FBWTtBQUMvRDs7QUFHRixhQUFTOztBQUdYLFVBQU87O0VBR1QsZUFBZSxRQUF5QixXQUFnRDtBQUN0RixVQUFPLEtBQUssb0JBQW9CLEtBQUssT0FBTyxRQUFRLFVBQVU7O0VBR2hFLFdBQW1DO0dBQ2pDLE1BQU1DLGNBQXNDLEVBQUU7QUFFOUMsUUFBSyxNQUFNLFFBQVEsS0FBSyxZQUFZLFFBQVEsRUFBRTtBQUM1QyxRQUFJLENBQUMsS0FBSyxRQUFRO0FBQ2hCOztBQUVGLGdCQUFZLEtBQUssY0FBYyxZQUFZLEtBQUssY0FBYyxLQUFLOztBQUdyRSxVQUFPO0lBQ0wsa0JBQWtCLE9BQU8sT0FBTyxZQUFZLENBQUMsUUFBUSxLQUFLLFVBQVUsTUFBTSxPQUFPLEVBQUU7SUFDbkYsWUFBWSxLQUFLLE1BQU07SUFDdkI7SUFDRDs7RUFHSCxjQUFjLFVBQXlEO0FBQ3JFLFdBQVEsU0FBUyxNQUFqQjtJQUNFLEtBQUssTUFDSCxRQUFPLEtBQUsscUJBQXFCLFNBQVMsVUFBVTtJQUN0RCxLQUFLLE9BQ0gsUUFBTyxLQUFLLG9CQUFvQixLQUFLLE9BQU8sU0FBUyxRQUFRLFNBQVMsVUFBVTtJQUNsRixLQUFLLE9BQ0gsUUFBTyxLQUFLLG9CQUFvQixLQUFLLE9BQU8sT0FBTyxTQUFTLE9BQU8sRUFBRSxTQUFTLFVBQVU7SUFDMUYsS0FBSyxlQUFlO0tBQ2xCLE1BQU1DLFFBQW9DLEVBQUU7QUFFNUMsVUFBSyxNQUFNLGdCQUFnQixTQUFTLGVBQWU7TUFDakQsTUFBTSxPQUFPLEtBQUssWUFBWSxJQUFJLGFBQWE7QUFDL0MsVUFBSSxDQUFDLE1BQU0sUUFBUTtBQUNqQjs7QUFFRixVQUFJLFNBQVMsYUFBYSxLQUFLLGNBQWMsU0FBUyxXQUFXO0FBQy9EOztBQUVGLFlBQU0sS0FBSyxLQUFLOztBQUdsQixZQUFPOztJQUVULEtBQUssU0FBUztLQUNaLE1BQU0sT0FBTyxJQUFJLEtBQWE7S0FDOUIsTUFBTUEsUUFBb0MsRUFBRTtBQUU1QyxVQUFLLE1BQU0sUUFBUSxTQUFTLFdBQVc7QUFDckMsV0FBSyxNQUFNLFFBQVEsS0FBSyxjQUFjLEtBQUssRUFBRTtBQUMzQyxXQUFJLEtBQUssSUFBSSxLQUFLLFVBQVUsRUFBRTtBQUM1Qjs7QUFHRixZQUFLLElBQUksS0FBSyxVQUFVO0FBQ3hCLGFBQU0sS0FBSyxLQUFLOzs7QUFJcEIsWUFBTzs7OztFQUtiLEFBQVEscUJBQXFCLFdBQWdEO0dBQzNFLE1BQU1BLFFBQW9DLEVBQUU7QUFFNUMsUUFBSyxNQUFNLFFBQVEsS0FBSyxZQUFZLFFBQVEsRUFBRTtBQUM1QyxRQUFJLENBQUMsS0FBSyxVQUFXLGFBQWEsS0FBSyxjQUFjLFdBQVk7QUFDL0Q7O0FBR0YsVUFBTSxLQUFLLEtBQUs7O0FBR2xCLFVBQU87O0VBR1QsQUFBUSxvQkFDTixVQUNBLElBQ0EsV0FDNEI7R0FDNUIsTUFBTUEsUUFBb0MsRUFBRTtHQUM1QyxNQUFNLE9BQU8sSUFBSSxLQUFhO0FBRTlCLFFBQUssTUFBTSxXQUFXLEtBQUssa0JBQWtCLFVBQVUsSUFBSSxVQUFVLEVBQUU7QUFDckUsU0FBSyxNQUFNLGdCQUFnQixTQUFTO0FBQ2xDLFNBQUksS0FBSyxJQUFJLGFBQWEsRUFBRTtBQUMxQjs7QUFFRixVQUFLLElBQUksYUFBYTtLQUV0QixNQUFNLE9BQU8sS0FBSyxZQUFZLElBQUksYUFBYTtBQUMvQyxTQUFJLE1BQU0sUUFBUTtBQUNoQixZQUFNLEtBQUssS0FBSzs7OztBQUt0QixVQUFPOztFQUdULEFBQVEsa0JBQ04sVUFDQSxJQUNBLFdBQ2U7QUFDZixPQUFJLFdBQVc7SUFDYixNQUFNLFFBQVEsU0FBUyxJQUFJLGNBQWMsV0FBVyxHQUFHLENBQUM7QUFDeEQsV0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLEVBQUU7O0dBRzdCLE1BQU1DLFVBQXlCLEVBQUU7QUFDakMsUUFBSyxNQUFNLENBQUMsS0FBSyxZQUFZLFVBQVU7SUFDckMsTUFBTSxTQUFTLGdCQUFnQixJQUFJO0FBQ25DLFFBQUksT0FBTyxPQUFPLElBQUk7QUFDcEIsYUFBUSxLQUFLLFFBQVE7OztBQUl6QixVQUFPOztFQUdULEFBQVEsa0JBQWtCLFdBQW1CLFFBQXlCLFdBQXlCO0dBQzdGLE1BQU0sTUFBTSxjQUFjLFdBQVcsT0FBTztHQUM1QyxNQUFNLFVBQVUsS0FBSyxNQUFNLElBQUksSUFBSTtBQUNuQyxPQUFJLENBQUMsU0FBUztBQUNaOztBQUdGLFdBQVEsT0FBTyxVQUFVO0FBQ3pCLE9BQUksUUFBUSxTQUFTLEdBQUc7QUFDdEIsU0FBSyxNQUFNLE9BQU8sSUFBSTs7O0VBSTFCLEFBQVEsa0JBQWtCLFdBQW1CLFFBQXlCLFdBQXlCO0dBQzdGLE1BQU0sTUFBTSxjQUFjLFdBQVcsT0FBTyxPQUFPLENBQUM7R0FDcEQsTUFBTSxVQUFVLEtBQUssTUFBTSxJQUFJLElBQUk7QUFDbkMsT0FBSSxDQUFDLFNBQVM7QUFDWjs7QUFHRixXQUFRLE9BQU8sVUFBVTtBQUN6QixPQUFJLFFBQVEsU0FBUyxHQUFHO0FBQ3RCLFNBQUssTUFBTSxPQUFPLElBQUkifQ==
|
|
@@ -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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"}
|