@syncular/relay 0.0.6-125 → 0.0.6-135
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/realtime.d.ts +2 -15
- package/dist/realtime.d.ts.map +1 -1
- package/dist/realtime.js +14 -185
- package/dist/realtime.js.map +1 -1
- package/dist/server-role/index.d.ts.map +1 -1
- package/dist/server-role/index.js +1 -2
- package/dist/server-role/index.js.map +1 -1
- package/package.json +4 -4
- package/src/realtime.ts +20 -202
- package/src/server-role/index.ts +4 -2
package/dist/realtime.d.ts
CHANGED
|
@@ -36,11 +36,7 @@ export interface RelayWebSocketConnection {
|
|
|
36
36
|
* efficient notification routing.
|
|
37
37
|
*/
|
|
38
38
|
export declare class RelayRealtime {
|
|
39
|
-
private
|
|
40
|
-
private scopeKeysByClientId;
|
|
41
|
-
private connectionsByScopeKey;
|
|
42
|
-
private heartbeatIntervalMs;
|
|
43
|
-
private heartbeatTimer;
|
|
39
|
+
private readonly registry;
|
|
44
40
|
constructor(options?: {
|
|
45
41
|
heartbeatIntervalMs?: number;
|
|
46
42
|
});
|
|
@@ -50,15 +46,9 @@ export declare class RelayRealtime {
|
|
|
50
46
|
*/
|
|
51
47
|
register(connection: RelayWebSocketConnection, initialScopeKeys?: string[]): () => void;
|
|
52
48
|
/**
|
|
53
|
-
* Update the effective
|
|
54
|
-
* In the new scope model, this is called with table names.
|
|
55
|
-
*/
|
|
56
|
-
updateClientTables(clientId: string, tables: string[]): void;
|
|
57
|
-
/**
|
|
58
|
-
* Alias for backwards compatibility.
|
|
49
|
+
* Update the effective scopes for an already-connected client.
|
|
59
50
|
*/
|
|
60
51
|
updateClientScopeKeys(clientId: string, scopeKeys: string[]): void;
|
|
61
|
-
private _updateScopeKeys;
|
|
62
52
|
/**
|
|
63
53
|
* Notify clients that new data is available for the given scopes.
|
|
64
54
|
*/
|
|
@@ -81,9 +71,6 @@ export declare class RelayRealtime {
|
|
|
81
71
|
* Close all connections.
|
|
82
72
|
*/
|
|
83
73
|
closeAll(): void;
|
|
84
|
-
private ensureHeartbeat;
|
|
85
|
-
private sendHeartbeats;
|
|
86
|
-
private unregister;
|
|
87
74
|
}
|
|
88
75
|
/**
|
|
89
76
|
* Create a WebSocket connection wrapper.
|
package/dist/realtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IACtC,IAAI,EAAE;QACJ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,IAAI,IAAI,CAAC;IACtB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuD;IAEhF,YAAY,OAAO,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,EAIrD;IAED;;;OAGG;IACH,QAAQ,CACN,UAAU,EAAE,wBAAwB,EACpC,gBAAgB,GAAE,MAAM,EAAO,GAC9B,MAAM,IAAI,CAEZ;IAED;;OAEG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAEjE;IAED;;OAEG;IACH,eAAe,CACb,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GACrC,IAAI,CAQN;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3C;IAED;;OAEG;IACH,mBAAmB,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE7C;IAED;;OAEG;IACH,QAAQ,IAAI,IAAI,CAEf;CACF;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;CACpB,EACD,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC1C,wBAAwB,CA2D1B"}
|
package/dist/realtime.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Adapted from @syncular/server-hono/ws.ts for relay use.
|
|
8
8
|
*/
|
|
9
|
+
import { RealtimeConnectionRegistry } from '@syncular/core';
|
|
9
10
|
/**
|
|
10
11
|
* Realtime manager for relay WebSocket connections.
|
|
11
12
|
*
|
|
@@ -13,228 +14,56 @@
|
|
|
13
14
|
* efficient notification routing.
|
|
14
15
|
*/
|
|
15
16
|
export class RelayRealtime {
|
|
16
|
-
|
|
17
|
-
scopeKeysByClientId = new Map();
|
|
18
|
-
connectionsByScopeKey = new Map();
|
|
19
|
-
heartbeatIntervalMs;
|
|
20
|
-
heartbeatTimer = null;
|
|
17
|
+
registry;
|
|
21
18
|
constructor(options) {
|
|
22
|
-
this.
|
|
19
|
+
this.registry = new RealtimeConnectionRegistry({
|
|
20
|
+
heartbeatIntervalMs: options?.heartbeatIntervalMs,
|
|
21
|
+
});
|
|
23
22
|
}
|
|
24
23
|
/**
|
|
25
24
|
* Register a connection for a client.
|
|
26
25
|
* Returns a cleanup function to unregister.
|
|
27
26
|
*/
|
|
28
27
|
register(connection, initialScopeKeys = []) {
|
|
29
|
-
|
|
30
|
-
let clientConns = this.connectionsByClientId.get(clientId);
|
|
31
|
-
if (!clientConns) {
|
|
32
|
-
clientConns = new Set();
|
|
33
|
-
this.connectionsByClientId.set(clientId, clientConns);
|
|
34
|
-
}
|
|
35
|
-
clientConns.add(connection);
|
|
36
|
-
if (!this.scopeKeysByClientId.has(clientId)) {
|
|
37
|
-
this.scopeKeysByClientId.set(clientId, new Set(initialScopeKeys));
|
|
38
|
-
}
|
|
39
|
-
const scopeKeys = this.scopeKeysByClientId.get(clientId) ?? new Set();
|
|
40
|
-
for (const k of scopeKeys) {
|
|
41
|
-
let scopeConns = this.connectionsByScopeKey.get(k);
|
|
42
|
-
if (!scopeConns) {
|
|
43
|
-
scopeConns = new Set();
|
|
44
|
-
this.connectionsByScopeKey.set(k, scopeConns);
|
|
45
|
-
}
|
|
46
|
-
scopeConns.add(connection);
|
|
47
|
-
}
|
|
48
|
-
this.ensureHeartbeat();
|
|
49
|
-
return () => {
|
|
50
|
-
this.unregister(connection);
|
|
51
|
-
this.ensureHeartbeat();
|
|
52
|
-
};
|
|
28
|
+
return this.registry.register(connection, initialScopeKeys);
|
|
53
29
|
}
|
|
54
30
|
/**
|
|
55
|
-
* Update the effective
|
|
56
|
-
* In the new scope model, this is called with table names.
|
|
57
|
-
*/
|
|
58
|
-
updateClientTables(clientId, tables) {
|
|
59
|
-
this._updateScopeKeys(clientId, tables);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Alias for backwards compatibility.
|
|
31
|
+
* Update the effective scopes for an already-connected client.
|
|
63
32
|
*/
|
|
64
33
|
updateClientScopeKeys(clientId, scopeKeys) {
|
|
65
|
-
this.
|
|
66
|
-
}
|
|
67
|
-
_updateScopeKeys(clientId, keys) {
|
|
68
|
-
const conns = this.connectionsByClientId.get(clientId);
|
|
69
|
-
if (!conns || conns.size === 0)
|
|
70
|
-
return;
|
|
71
|
-
const next = new Set(keys);
|
|
72
|
-
const prev = this.scopeKeysByClientId.get(clientId) ?? new Set();
|
|
73
|
-
// No-op when unchanged
|
|
74
|
-
if (prev.size === next.size) {
|
|
75
|
-
let unchanged = true;
|
|
76
|
-
for (const k of prev) {
|
|
77
|
-
if (!next.has(k)) {
|
|
78
|
-
unchanged = false;
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
if (unchanged)
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
this.scopeKeysByClientId.set(clientId, next);
|
|
86
|
-
// Remove from old scopes
|
|
87
|
-
for (const k of prev) {
|
|
88
|
-
if (next.has(k))
|
|
89
|
-
continue;
|
|
90
|
-
const set = this.connectionsByScopeKey.get(k);
|
|
91
|
-
if (!set)
|
|
92
|
-
continue;
|
|
93
|
-
for (const conn of conns)
|
|
94
|
-
set.delete(conn);
|
|
95
|
-
if (set.size === 0)
|
|
96
|
-
this.connectionsByScopeKey.delete(k);
|
|
97
|
-
}
|
|
98
|
-
// Add to new scopes
|
|
99
|
-
for (const k of next) {
|
|
100
|
-
if (prev.has(k))
|
|
101
|
-
continue;
|
|
102
|
-
let set = this.connectionsByScopeKey.get(k);
|
|
103
|
-
if (!set) {
|
|
104
|
-
set = new Set();
|
|
105
|
-
this.connectionsByScopeKey.set(k, set);
|
|
106
|
-
}
|
|
107
|
-
for (const conn of conns)
|
|
108
|
-
set.add(conn);
|
|
109
|
-
}
|
|
34
|
+
this.registry.updateClientScopeKeys(clientId, scopeKeys);
|
|
110
35
|
}
|
|
111
36
|
/**
|
|
112
37
|
* Notify clients that new data is available for the given scopes.
|
|
113
38
|
*/
|
|
114
39
|
notifyScopeKeys(scopeKeys, cursor, opts) {
|
|
115
|
-
|
|
116
|
-
const targets = new Set();
|
|
117
|
-
for (const k of scopeKeys) {
|
|
118
|
-
const conns = this.connectionsByScopeKey.get(k);
|
|
119
|
-
if (!conns)
|
|
120
|
-
continue;
|
|
121
|
-
for (const conn of conns)
|
|
122
|
-
targets.add(conn);
|
|
123
|
-
}
|
|
124
|
-
for (const conn of targets) {
|
|
125
|
-
if (!conn.isOpen)
|
|
126
|
-
continue;
|
|
127
|
-
if (exclude.has(conn.clientId))
|
|
128
|
-
continue;
|
|
40
|
+
this.registry.forEachConnectionInScopeKeys(scopeKeys, (conn) => {
|
|
129
41
|
conn.sendSync(cursor);
|
|
130
|
-
}
|
|
42
|
+
}, { excludeClientIds: opts?.excludeClientIds });
|
|
131
43
|
}
|
|
132
44
|
/**
|
|
133
45
|
* Get the number of active connections for a client.
|
|
134
46
|
*/
|
|
135
47
|
getConnectionCount(clientId) {
|
|
136
|
-
return this.
|
|
48
|
+
return this.registry.getConnectionCount(clientId);
|
|
137
49
|
}
|
|
138
50
|
/**
|
|
139
51
|
* Get total number of active connections.
|
|
140
52
|
*/
|
|
141
53
|
getTotalConnections() {
|
|
142
|
-
|
|
143
|
-
for (const conns of this.connectionsByClientId.values()) {
|
|
144
|
-
total += conns.size;
|
|
145
|
-
}
|
|
146
|
-
return total;
|
|
54
|
+
return this.registry.getTotalConnections();
|
|
147
55
|
}
|
|
148
56
|
/**
|
|
149
57
|
* Close all connections for a client.
|
|
150
58
|
*/
|
|
151
59
|
closeClientConnections(clientId) {
|
|
152
|
-
|
|
153
|
-
if (!conns)
|
|
154
|
-
return;
|
|
155
|
-
const scopeKeys = this.scopeKeysByClientId.get(clientId) ?? new Set();
|
|
156
|
-
for (const k of scopeKeys) {
|
|
157
|
-
const set = this.connectionsByScopeKey.get(k);
|
|
158
|
-
if (!set)
|
|
159
|
-
continue;
|
|
160
|
-
for (const conn of conns)
|
|
161
|
-
set.delete(conn);
|
|
162
|
-
if (set.size === 0)
|
|
163
|
-
this.connectionsByScopeKey.delete(k);
|
|
164
|
-
}
|
|
165
|
-
for (const conn of conns) {
|
|
166
|
-
conn.close(1000, 'client closed');
|
|
167
|
-
}
|
|
168
|
-
this.connectionsByClientId.delete(clientId);
|
|
169
|
-
this.scopeKeysByClientId.delete(clientId);
|
|
170
|
-
this.ensureHeartbeat();
|
|
60
|
+
this.registry.closeClientConnections(clientId, 1000, 'client closed');
|
|
171
61
|
}
|
|
172
62
|
/**
|
|
173
63
|
* Close all connections.
|
|
174
64
|
*/
|
|
175
65
|
closeAll() {
|
|
176
|
-
|
|
177
|
-
for (const conn of conns) {
|
|
178
|
-
conn.close(1000, 'server shutdown');
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
this.connectionsByClientId.clear();
|
|
182
|
-
this.scopeKeysByClientId.clear();
|
|
183
|
-
this.connectionsByScopeKey.clear();
|
|
184
|
-
this.ensureHeartbeat();
|
|
185
|
-
}
|
|
186
|
-
ensureHeartbeat() {
|
|
187
|
-
if (this.heartbeatIntervalMs <= 0)
|
|
188
|
-
return;
|
|
189
|
-
const total = this.getTotalConnections();
|
|
190
|
-
if (total === 0) {
|
|
191
|
-
if (this.heartbeatTimer) {
|
|
192
|
-
clearInterval(this.heartbeatTimer);
|
|
193
|
-
this.heartbeatTimer = null;
|
|
194
|
-
}
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
if (this.heartbeatTimer)
|
|
198
|
-
return;
|
|
199
|
-
this.heartbeatTimer = setInterval(() => {
|
|
200
|
-
this.sendHeartbeats();
|
|
201
|
-
}, this.heartbeatIntervalMs);
|
|
202
|
-
}
|
|
203
|
-
sendHeartbeats() {
|
|
204
|
-
const closed = [];
|
|
205
|
-
for (const conns of this.connectionsByClientId.values()) {
|
|
206
|
-
for (const conn of conns) {
|
|
207
|
-
if (!conn.isOpen) {
|
|
208
|
-
closed.push(conn);
|
|
209
|
-
continue;
|
|
210
|
-
}
|
|
211
|
-
conn.sendHeartbeat();
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
for (const conn of closed) {
|
|
215
|
-
this.unregister(conn);
|
|
216
|
-
}
|
|
217
|
-
this.ensureHeartbeat();
|
|
218
|
-
}
|
|
219
|
-
unregister(connection) {
|
|
220
|
-
const clientId = connection.clientId;
|
|
221
|
-
const scopeKeys = this.scopeKeysByClientId.get(clientId) ?? new Set();
|
|
222
|
-
for (const k of scopeKeys) {
|
|
223
|
-
const set = this.connectionsByScopeKey.get(k);
|
|
224
|
-
if (!set)
|
|
225
|
-
continue;
|
|
226
|
-
set.delete(connection);
|
|
227
|
-
if (set.size === 0)
|
|
228
|
-
this.connectionsByScopeKey.delete(k);
|
|
229
|
-
}
|
|
230
|
-
const conns = this.connectionsByClientId.get(clientId);
|
|
231
|
-
if (!conns)
|
|
232
|
-
return;
|
|
233
|
-
conns.delete(connection);
|
|
234
|
-
if (conns.size > 0)
|
|
235
|
-
return;
|
|
236
|
-
this.connectionsByClientId.delete(clientId);
|
|
237
|
-
this.scopeKeysByClientId.delete(clientId);
|
|
66
|
+
this.registry.closeAll(1000, 'server shutdown');
|
|
238
67
|
}
|
|
239
68
|
}
|
|
240
69
|
/**
|
package/dist/realtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime.js","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"realtime.js","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server-role/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/C,KAAK,SAAS,GAAG,cAAc,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,wBAAwB,CACvC,EAAE,SAAS,aAAa,GAAG,aAAa;IAExC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,uBAAuB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACjD,QAAQ,EAAE,aAAa,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CACT,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EAAE,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACnE;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;OAEG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,aAAa,GAAG,aAAa,EACxE,OAAO,EAAE,wBAAwB,CAAC,EAAE,CAAC,GACpC,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server-role/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/C,KAAK,SAAS,GAAG,cAAc,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,wBAAwB,CACvC,EAAE,SAAS,aAAa,GAAG,aAAa;IAExC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,uBAAuB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACjD,QAAQ,EAAE,aAAa,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CACT,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EAAE,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACnE;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;OAEG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,aAAa,GAAG,aAAa,EACxE,OAAO,EAAE,wBAAwB,CAAC,EAAE,CAAC,GACpC,IAAI,CAuQN"}
|
|
@@ -137,8 +137,7 @@ export function createRelayRoutes(options) {
|
|
|
137
137
|
effectiveScopes: pullResult.effectiveScopes,
|
|
138
138
|
});
|
|
139
139
|
// Notify realtime about updated scope values
|
|
140
|
-
|
|
141
|
-
options.realtime.updateClientTables(request.clientId, tables);
|
|
140
|
+
options.realtime.updateClientScopeKeys(request.clientId, Object.keys(pullResult.effectiveScopes));
|
|
142
141
|
logSyncEvent({
|
|
143
142
|
event: 'relay.pull',
|
|
144
143
|
userId: auth.actorId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server-role/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server-role/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncular/relay",
|
|
3
|
-
"version": "0.0.6-
|
|
3
|
+
"version": "0.0.6-135",
|
|
4
4
|
"description": "Edge relay for Syncular distributed sync",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Benjamin Kniffler",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"release": "bunx syncular-publish"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@syncular/core": "0.0.6-
|
|
46
|
-
"@syncular/server": "0.0.6-
|
|
45
|
+
"@syncular/core": "0.0.6-135",
|
|
46
|
+
"@syncular/server": "0.0.6-135"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"hono": "^4.0.0",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@syncular/config": "0.0.0",
|
|
54
|
-
"@syncular/server-dialect-sqlite": "0.0.6-
|
|
54
|
+
"@syncular/server-dialect-sqlite": "0.0.6-135",
|
|
55
55
|
"kysely": "*"
|
|
56
56
|
},
|
|
57
57
|
"files": [
|
package/src/realtime.ts
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* Adapted from @syncular/server-hono/ws.ts for relay use.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { RealtimeConnectionRegistry } from '@syncular/core';
|
|
11
|
+
|
|
10
12
|
/**
|
|
11
13
|
* WebSocket event data for sync notifications.
|
|
12
14
|
*/
|
|
@@ -39,21 +41,12 @@ export interface RelayWebSocketConnection {
|
|
|
39
41
|
* efficient notification routing.
|
|
40
42
|
*/
|
|
41
43
|
export class RelayRealtime {
|
|
42
|
-
private
|
|
43
|
-
string,
|
|
44
|
-
Set<RelayWebSocketConnection>
|
|
45
|
-
>();
|
|
46
|
-
private scopeKeysByClientId = new Map<string, Set<string>>();
|
|
47
|
-
private connectionsByScopeKey = new Map<
|
|
48
|
-
string,
|
|
49
|
-
Set<RelayWebSocketConnection>
|
|
50
|
-
>();
|
|
51
|
-
|
|
52
|
-
private heartbeatIntervalMs: number;
|
|
53
|
-
private heartbeatTimer: ReturnType<typeof setInterval> | null = null;
|
|
44
|
+
private readonly registry: RealtimeConnectionRegistry<RelayWebSocketConnection>;
|
|
54
45
|
|
|
55
46
|
constructor(options?: { heartbeatIntervalMs?: number }) {
|
|
56
|
-
this.
|
|
47
|
+
this.registry = new RealtimeConnectionRegistry({
|
|
48
|
+
heartbeatIntervalMs: options?.heartbeatIntervalMs,
|
|
49
|
+
});
|
|
57
50
|
}
|
|
58
51
|
|
|
59
52
|
/**
|
|
@@ -64,92 +57,14 @@ export class RelayRealtime {
|
|
|
64
57
|
connection: RelayWebSocketConnection,
|
|
65
58
|
initialScopeKeys: string[] = []
|
|
66
59
|
): () => void {
|
|
67
|
-
|
|
68
|
-
let clientConns = this.connectionsByClientId.get(clientId);
|
|
69
|
-
if (!clientConns) {
|
|
70
|
-
clientConns = new Set();
|
|
71
|
-
this.connectionsByClientId.set(clientId, clientConns);
|
|
72
|
-
}
|
|
73
|
-
clientConns.add(connection);
|
|
74
|
-
|
|
75
|
-
if (!this.scopeKeysByClientId.has(clientId)) {
|
|
76
|
-
this.scopeKeysByClientId.set(clientId, new Set(initialScopeKeys));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const scopeKeys =
|
|
80
|
-
this.scopeKeysByClientId.get(clientId) ?? new Set<string>();
|
|
81
|
-
for (const k of scopeKeys) {
|
|
82
|
-
let scopeConns = this.connectionsByScopeKey.get(k);
|
|
83
|
-
if (!scopeConns) {
|
|
84
|
-
scopeConns = new Set();
|
|
85
|
-
this.connectionsByScopeKey.set(k, scopeConns);
|
|
86
|
-
}
|
|
87
|
-
scopeConns.add(connection);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
this.ensureHeartbeat();
|
|
91
|
-
|
|
92
|
-
return () => {
|
|
93
|
-
this.unregister(connection);
|
|
94
|
-
this.ensureHeartbeat();
|
|
95
|
-
};
|
|
60
|
+
return this.registry.register(connection, initialScopeKeys);
|
|
96
61
|
}
|
|
97
62
|
|
|
98
63
|
/**
|
|
99
|
-
* Update the effective
|
|
100
|
-
* In the new scope model, this is called with table names.
|
|
101
|
-
*/
|
|
102
|
-
updateClientTables(clientId: string, tables: string[]): void {
|
|
103
|
-
this._updateScopeKeys(clientId, tables);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Alias for backwards compatibility.
|
|
64
|
+
* Update the effective scopes for an already-connected client.
|
|
108
65
|
*/
|
|
109
66
|
updateClientScopeKeys(clientId: string, scopeKeys: string[]): void {
|
|
110
|
-
this.
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
private _updateScopeKeys(clientId: string, keys: string[]): void {
|
|
114
|
-
const conns = this.connectionsByClientId.get(clientId);
|
|
115
|
-
if (!conns || conns.size === 0) return;
|
|
116
|
-
|
|
117
|
-
const next = new Set<string>(keys);
|
|
118
|
-
const prev = this.scopeKeysByClientId.get(clientId) ?? new Set<string>();
|
|
119
|
-
|
|
120
|
-
// No-op when unchanged
|
|
121
|
-
if (prev.size === next.size) {
|
|
122
|
-
let unchanged = true;
|
|
123
|
-
for (const k of prev) {
|
|
124
|
-
if (!next.has(k)) {
|
|
125
|
-
unchanged = false;
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (unchanged) return;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
this.scopeKeysByClientId.set(clientId, next);
|
|
133
|
-
|
|
134
|
-
// Remove from old scopes
|
|
135
|
-
for (const k of prev) {
|
|
136
|
-
if (next.has(k)) continue;
|
|
137
|
-
const set = this.connectionsByScopeKey.get(k);
|
|
138
|
-
if (!set) continue;
|
|
139
|
-
for (const conn of conns) set.delete(conn);
|
|
140
|
-
if (set.size === 0) this.connectionsByScopeKey.delete(k);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Add to new scopes
|
|
144
|
-
for (const k of next) {
|
|
145
|
-
if (prev.has(k)) continue;
|
|
146
|
-
let set = this.connectionsByScopeKey.get(k);
|
|
147
|
-
if (!set) {
|
|
148
|
-
set = new Set();
|
|
149
|
-
this.connectionsByScopeKey.set(k, set);
|
|
150
|
-
}
|
|
151
|
-
for (const conn of conns) set.add(conn);
|
|
152
|
-
}
|
|
67
|
+
this.registry.updateClientScopeKeys(clientId, scopeKeys);
|
|
153
68
|
}
|
|
154
69
|
|
|
155
70
|
/**
|
|
@@ -160,138 +75,41 @@ export class RelayRealtime {
|
|
|
160
75
|
cursor: number,
|
|
161
76
|
opts?: { excludeClientIds?: string[] }
|
|
162
77
|
): void {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
for (const conn of targets) {
|
|
173
|
-
if (!conn.isOpen) continue;
|
|
174
|
-
if (exclude.has(conn.clientId)) continue;
|
|
175
|
-
conn.sendSync(cursor);
|
|
176
|
-
}
|
|
78
|
+
this.registry.forEachConnectionInScopeKeys(
|
|
79
|
+
scopeKeys,
|
|
80
|
+
(conn) => {
|
|
81
|
+
conn.sendSync(cursor);
|
|
82
|
+
},
|
|
83
|
+
{ excludeClientIds: opts?.excludeClientIds }
|
|
84
|
+
);
|
|
177
85
|
}
|
|
178
86
|
|
|
179
87
|
/**
|
|
180
88
|
* Get the number of active connections for a client.
|
|
181
89
|
*/
|
|
182
90
|
getConnectionCount(clientId: string): number {
|
|
183
|
-
return this.
|
|
91
|
+
return this.registry.getConnectionCount(clientId);
|
|
184
92
|
}
|
|
185
93
|
|
|
186
94
|
/**
|
|
187
95
|
* Get total number of active connections.
|
|
188
96
|
*/
|
|
189
97
|
getTotalConnections(): number {
|
|
190
|
-
|
|
191
|
-
for (const conns of this.connectionsByClientId.values()) {
|
|
192
|
-
total += conns.size;
|
|
193
|
-
}
|
|
194
|
-
return total;
|
|
98
|
+
return this.registry.getTotalConnections();
|
|
195
99
|
}
|
|
196
100
|
|
|
197
101
|
/**
|
|
198
102
|
* Close all connections for a client.
|
|
199
103
|
*/
|
|
200
104
|
closeClientConnections(clientId: string): void {
|
|
201
|
-
|
|
202
|
-
if (!conns) return;
|
|
203
|
-
|
|
204
|
-
const scopeKeys =
|
|
205
|
-
this.scopeKeysByClientId.get(clientId) ?? new Set<string>();
|
|
206
|
-
for (const k of scopeKeys) {
|
|
207
|
-
const set = this.connectionsByScopeKey.get(k);
|
|
208
|
-
if (!set) continue;
|
|
209
|
-
for (const conn of conns) set.delete(conn);
|
|
210
|
-
if (set.size === 0) this.connectionsByScopeKey.delete(k);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
for (const conn of conns) {
|
|
214
|
-
conn.close(1000, 'client closed');
|
|
215
|
-
}
|
|
216
|
-
this.connectionsByClientId.delete(clientId);
|
|
217
|
-
this.scopeKeysByClientId.delete(clientId);
|
|
218
|
-
this.ensureHeartbeat();
|
|
105
|
+
this.registry.closeClientConnections(clientId, 1000, 'client closed');
|
|
219
106
|
}
|
|
220
107
|
|
|
221
108
|
/**
|
|
222
109
|
* Close all connections.
|
|
223
110
|
*/
|
|
224
111
|
closeAll(): void {
|
|
225
|
-
|
|
226
|
-
for (const conn of conns) {
|
|
227
|
-
conn.close(1000, 'server shutdown');
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
this.connectionsByClientId.clear();
|
|
231
|
-
this.scopeKeysByClientId.clear();
|
|
232
|
-
this.connectionsByScopeKey.clear();
|
|
233
|
-
this.ensureHeartbeat();
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
private ensureHeartbeat(): void {
|
|
237
|
-
if (this.heartbeatIntervalMs <= 0) return;
|
|
238
|
-
|
|
239
|
-
const total = this.getTotalConnections();
|
|
240
|
-
|
|
241
|
-
if (total === 0) {
|
|
242
|
-
if (this.heartbeatTimer) {
|
|
243
|
-
clearInterval(this.heartbeatTimer);
|
|
244
|
-
this.heartbeatTimer = null;
|
|
245
|
-
}
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (this.heartbeatTimer) return;
|
|
250
|
-
|
|
251
|
-
this.heartbeatTimer = setInterval(() => {
|
|
252
|
-
this.sendHeartbeats();
|
|
253
|
-
}, this.heartbeatIntervalMs);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
private sendHeartbeats(): void {
|
|
257
|
-
const closed: RelayWebSocketConnection[] = [];
|
|
258
|
-
|
|
259
|
-
for (const conns of this.connectionsByClientId.values()) {
|
|
260
|
-
for (const conn of conns) {
|
|
261
|
-
if (!conn.isOpen) {
|
|
262
|
-
closed.push(conn);
|
|
263
|
-
continue;
|
|
264
|
-
}
|
|
265
|
-
conn.sendHeartbeat();
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
for (const conn of closed) {
|
|
270
|
-
this.unregister(conn);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
this.ensureHeartbeat();
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
private unregister(connection: RelayWebSocketConnection): void {
|
|
277
|
-
const clientId = connection.clientId;
|
|
278
|
-
|
|
279
|
-
const scopeKeys =
|
|
280
|
-
this.scopeKeysByClientId.get(clientId) ?? new Set<string>();
|
|
281
|
-
for (const k of scopeKeys) {
|
|
282
|
-
const set = this.connectionsByScopeKey.get(k);
|
|
283
|
-
if (!set) continue;
|
|
284
|
-
set.delete(connection);
|
|
285
|
-
if (set.size === 0) this.connectionsByScopeKey.delete(k);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
const conns = this.connectionsByClientId.get(clientId);
|
|
289
|
-
if (!conns) return;
|
|
290
|
-
conns.delete(connection);
|
|
291
|
-
if (conns.size > 0) return;
|
|
292
|
-
|
|
293
|
-
this.connectionsByClientId.delete(clientId);
|
|
294
|
-
this.scopeKeysByClientId.delete(clientId);
|
|
112
|
+
this.registry.closeAll(1000, 'server shutdown');
|
|
295
113
|
}
|
|
296
114
|
}
|
|
297
115
|
|
package/src/server-role/index.ts
CHANGED
|
@@ -266,8 +266,10 @@ export function createRelayRoutes<DB extends RelayDatabase = RelayDatabase>(
|
|
|
266
266
|
});
|
|
267
267
|
|
|
268
268
|
// Notify realtime about updated scope values
|
|
269
|
-
|
|
270
|
-
|
|
269
|
+
options.realtime.updateClientScopeKeys(
|
|
270
|
+
request.clientId,
|
|
271
|
+
Object.keys(pullResult.effectiveScopes)
|
|
272
|
+
);
|
|
271
273
|
|
|
272
274
|
logSyncEvent({
|
|
273
275
|
event: 'relay.pull',
|