@syncular/server-hono 0.0.1-60

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 (76) hide show
  1. package/dist/api-key-auth.d.ts +49 -0
  2. package/dist/api-key-auth.d.ts.map +1 -0
  3. package/dist/api-key-auth.js +110 -0
  4. package/dist/api-key-auth.js.map +1 -0
  5. package/dist/blobs.d.ts +69 -0
  6. package/dist/blobs.d.ts.map +1 -0
  7. package/dist/blobs.js +383 -0
  8. package/dist/blobs.js.map +1 -0
  9. package/dist/console/index.d.ts +8 -0
  10. package/dist/console/index.d.ts.map +1 -0
  11. package/dist/console/index.js +7 -0
  12. package/dist/console/index.js.map +1 -0
  13. package/dist/console/routes.d.ts +106 -0
  14. package/dist/console/routes.d.ts.map +1 -0
  15. package/dist/console/routes.js +1612 -0
  16. package/dist/console/routes.js.map +1 -0
  17. package/dist/console/schemas.d.ts +308 -0
  18. package/dist/console/schemas.d.ts.map +1 -0
  19. package/dist/console/schemas.js +201 -0
  20. package/dist/console/schemas.js.map +1 -0
  21. package/dist/create-server.d.ts +78 -0
  22. package/dist/create-server.d.ts.map +1 -0
  23. package/dist/create-server.js +99 -0
  24. package/dist/create-server.js.map +1 -0
  25. package/dist/index.d.ts +16 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +25 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/openapi.d.ts +45 -0
  30. package/dist/openapi.d.ts.map +1 -0
  31. package/dist/openapi.js +59 -0
  32. package/dist/openapi.js.map +1 -0
  33. package/dist/proxy/connection-manager.d.ts +78 -0
  34. package/dist/proxy/connection-manager.d.ts.map +1 -0
  35. package/dist/proxy/connection-manager.js +251 -0
  36. package/dist/proxy/connection-manager.js.map +1 -0
  37. package/dist/proxy/index.d.ts +8 -0
  38. package/dist/proxy/index.d.ts.map +1 -0
  39. package/dist/proxy/index.js +8 -0
  40. package/dist/proxy/index.js.map +1 -0
  41. package/dist/proxy/routes.d.ts +74 -0
  42. package/dist/proxy/routes.d.ts.map +1 -0
  43. package/dist/proxy/routes.js +147 -0
  44. package/dist/proxy/routes.js.map +1 -0
  45. package/dist/rate-limit.d.ts +101 -0
  46. package/dist/rate-limit.d.ts.map +1 -0
  47. package/dist/rate-limit.js +186 -0
  48. package/dist/rate-limit.js.map +1 -0
  49. package/dist/routes.d.ts +126 -0
  50. package/dist/routes.d.ts.map +1 -0
  51. package/dist/routes.js +788 -0
  52. package/dist/routes.js.map +1 -0
  53. package/dist/ws.d.ts +230 -0
  54. package/dist/ws.d.ts.map +1 -0
  55. package/dist/ws.js +601 -0
  56. package/dist/ws.js.map +1 -0
  57. package/package.json +73 -0
  58. package/src/__tests__/create-server.test.ts +187 -0
  59. package/src/__tests__/pull-chunk-storage.test.ts +189 -0
  60. package/src/__tests__/rate-limit.test.ts +78 -0
  61. package/src/__tests__/realtime-bridge.test.ts +131 -0
  62. package/src/__tests__/ws-connection-manager.test.ts +176 -0
  63. package/src/api-key-auth.ts +179 -0
  64. package/src/blobs.ts +534 -0
  65. package/src/console/index.ts +17 -0
  66. package/src/console/routes.ts +2155 -0
  67. package/src/console/schemas.ts +299 -0
  68. package/src/create-server.ts +180 -0
  69. package/src/index.ts +42 -0
  70. package/src/openapi.ts +74 -0
  71. package/src/proxy/connection-manager.ts +340 -0
  72. package/src/proxy/index.ts +8 -0
  73. package/src/proxy/routes.ts +223 -0
  74. package/src/rate-limit.ts +321 -0
  75. package/src/routes.ts +1186 -0
  76. package/src/ws.ts +789 -0
package/dist/ws.js ADDED
@@ -0,0 +1,601 @@
1
+ /**
2
+ * @syncular/server-hono - WebSocket helpers for realtime sync wake-ups
3
+ *
4
+ * WebSockets are used only as a "wake up" mechanism; clients must still pull.
5
+ * Also supports presence tracking for collaborative features.
6
+ */
7
+ function safeSend(ws, message) {
8
+ try {
9
+ ws.send(message);
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ export function createWebSocketConnection(ws, args) {
17
+ let closed = false;
18
+ const connection = {
19
+ get isOpen() {
20
+ if (closed)
21
+ return false;
22
+ return ws.readyState === 1;
23
+ },
24
+ actorId: args.actorId,
25
+ clientId: args.clientId,
26
+ transportPath: args.transportPath,
27
+ sendSync(cursor, changes) {
28
+ if (!connection.isOpen)
29
+ return;
30
+ const payload = {
31
+ cursor,
32
+ timestamp: Date.now(),
33
+ };
34
+ if (changes && changes.length > 0) {
35
+ payload.changes = changes;
36
+ }
37
+ const ok = safeSend(ws, JSON.stringify({ event: 'sync', data: payload }));
38
+ if (!ok)
39
+ closed = true;
40
+ },
41
+ sendHeartbeat() {
42
+ if (!connection.isOpen)
43
+ return;
44
+ const ok = safeSend(ws, JSON.stringify({ event: 'heartbeat', data: { timestamp: Date.now() } }));
45
+ if (!ok)
46
+ closed = true;
47
+ },
48
+ sendPresence(data) {
49
+ if (!connection.isOpen)
50
+ return;
51
+ const ok = safeSend(ws, JSON.stringify({
52
+ event: 'presence',
53
+ data: { presence: data, timestamp: Date.now() },
54
+ }));
55
+ if (!ok)
56
+ closed = true;
57
+ },
58
+ sendPushResponse(data) {
59
+ if (!connection.isOpen)
60
+ return;
61
+ const ok = safeSend(ws, JSON.stringify({
62
+ event: 'push-response',
63
+ data: { ...data, timestamp: Date.now() },
64
+ }));
65
+ if (!ok)
66
+ closed = true;
67
+ },
68
+ sendError(message) {
69
+ if (connection.isOpen) {
70
+ safeSend(ws, JSON.stringify({
71
+ event: 'error',
72
+ data: { error: message, timestamp: Date.now() },
73
+ }));
74
+ }
75
+ connection.close(1011, 'server error');
76
+ },
77
+ close(code, reason) {
78
+ if (closed)
79
+ return;
80
+ closed = true;
81
+ try {
82
+ ws.close(code, reason);
83
+ }
84
+ catch {
85
+ // ignore
86
+ }
87
+ },
88
+ };
89
+ return connection;
90
+ }
91
+ /**
92
+ * Connection manager for tracking active WebSocket connections.
93
+ * Scope-key based notifications and presence tracking.
94
+ */
95
+ export class WebSocketConnectionManager {
96
+ connectionsByClientId = new Map();
97
+ scopeKeysByClientId = new Map();
98
+ connectionsByScopeKey = new Map();
99
+ /**
100
+ * In-memory presence tracking by scope key.
101
+ * Map<scopeKey, Map<clientId, PresenceEntry>>
102
+ */
103
+ presenceByScopeKey = new Map();
104
+ /**
105
+ * Callback for presence changes - allows integration with SyncRealtimeBroadcaster
106
+ */
107
+ onPresenceChange;
108
+ heartbeatIntervalMs;
109
+ heartbeatTimer = null;
110
+ constructor(options) {
111
+ this.heartbeatIntervalMs = options?.heartbeatIntervalMs ?? 30_000;
112
+ this.onPresenceChange = options?.onPresenceChange;
113
+ }
114
+ /**
115
+ * Register a connection for a client.
116
+ * Returns a cleanup function to unregister.
117
+ */
118
+ register(connection, initialScopeKeys = []) {
119
+ const clientId = connection.clientId;
120
+ let clientConns = this.connectionsByClientId.get(clientId);
121
+ if (!clientConns) {
122
+ clientConns = new Set();
123
+ this.connectionsByClientId.set(clientId, clientConns);
124
+ }
125
+ clientConns.add(connection);
126
+ if (!this.scopeKeysByClientId.has(clientId)) {
127
+ this.scopeKeysByClientId.set(clientId, new Set(initialScopeKeys));
128
+ }
129
+ const scopeKeys = this.scopeKeysByClientId.get(clientId) ?? new Set();
130
+ for (const k of scopeKeys) {
131
+ let scopeConns = this.connectionsByScopeKey.get(k);
132
+ if (!scopeConns) {
133
+ scopeConns = new Set();
134
+ this.connectionsByScopeKey.set(k, scopeConns);
135
+ }
136
+ scopeConns.add(connection);
137
+ }
138
+ this.ensureHeartbeat();
139
+ return () => {
140
+ this.unregister(connection);
141
+ this.ensureHeartbeat();
142
+ };
143
+ }
144
+ /**
145
+ * Update the effective scopes for an already-connected client.
146
+ * If the client has no active connections, this is a no-op.
147
+ */
148
+ updateClientScopeKeys(clientId, scopeKeys) {
149
+ const conns = this.connectionsByClientId.get(clientId);
150
+ if (!conns || conns.size === 0)
151
+ return;
152
+ const next = new Set(scopeKeys);
153
+ const prev = this.scopeKeysByClientId.get(clientId) ?? new Set();
154
+ // No-op when unchanged (reduces write load when clients pull frequently).
155
+ if (prev.size === next.size) {
156
+ let unchanged = true;
157
+ for (const k of prev) {
158
+ if (!next.has(k)) {
159
+ unchanged = false;
160
+ break;
161
+ }
162
+ }
163
+ if (unchanged)
164
+ return;
165
+ }
166
+ this.scopeKeysByClientId.set(clientId, next);
167
+ for (const k of prev) {
168
+ if (next.has(k))
169
+ continue;
170
+ const set = this.connectionsByScopeKey.get(k);
171
+ if (!set)
172
+ continue;
173
+ for (const conn of conns)
174
+ set.delete(conn);
175
+ if (set.size === 0)
176
+ this.connectionsByScopeKey.delete(k);
177
+ }
178
+ for (const k of next) {
179
+ if (prev.has(k))
180
+ continue;
181
+ let set = this.connectionsByScopeKey.get(k);
182
+ if (!set) {
183
+ set = new Set();
184
+ this.connectionsByScopeKey.set(k, set);
185
+ }
186
+ for (const conn of conns)
187
+ set.add(conn);
188
+ }
189
+ }
190
+ /**
191
+ * Check whether a client is currently authorized/subscribed for a scope key.
192
+ */
193
+ isClientSubscribedToScopeKey(clientId, scopeKey) {
194
+ const scopeKeys = this.scopeKeysByClientId.get(clientId);
195
+ if (!scopeKeys || scopeKeys.size === 0)
196
+ return false;
197
+ return scopeKeys.has(scopeKey);
198
+ }
199
+ // =========================================================================
200
+ // Presence Tracking
201
+ // =========================================================================
202
+ /**
203
+ * Join presence for a scope key.
204
+ * Called when a client wants to be visible to others in a scope.
205
+ */
206
+ joinPresence(clientId, scopeKey, metadata) {
207
+ const conns = this.connectionsByClientId.get(clientId);
208
+ if (!conns || conns.size === 0)
209
+ return false;
210
+ if (!this.isClientSubscribedToScopeKey(clientId, scopeKey))
211
+ return false;
212
+ // Get actorId from first connection
213
+ const conn = conns.values().next().value;
214
+ if (!conn)
215
+ return false;
216
+ const actorId = conn.actorId;
217
+ // Add to presence map
218
+ let scopePresence = this.presenceByScopeKey.get(scopeKey);
219
+ if (!scopePresence) {
220
+ scopePresence = new Map();
221
+ this.presenceByScopeKey.set(scopeKey, scopePresence);
222
+ }
223
+ const entry = {
224
+ clientId,
225
+ actorId,
226
+ joinedAt: Date.now(),
227
+ metadata,
228
+ };
229
+ scopePresence.set(clientId, entry);
230
+ // Notify other clients in this scope
231
+ this.broadcastPresenceEvent(scopeKey, {
232
+ action: 'join',
233
+ scopeKey,
234
+ clientId,
235
+ actorId,
236
+ metadata,
237
+ });
238
+ // Callback for cross-instance broadcasting
239
+ this.onPresenceChange?.({
240
+ action: 'join',
241
+ scopeKey,
242
+ clientId,
243
+ actorId,
244
+ metadata,
245
+ });
246
+ return true;
247
+ }
248
+ /**
249
+ * Leave presence for a scope key.
250
+ * Called when a client no longer wants to be visible in a scope.
251
+ */
252
+ leavePresence(clientId, scopeKey) {
253
+ const scopePresence = this.presenceByScopeKey.get(scopeKey);
254
+ if (!scopePresence)
255
+ return false;
256
+ const entry = scopePresence.get(clientId);
257
+ if (!entry)
258
+ return false;
259
+ scopePresence.delete(clientId);
260
+ if (scopePresence.size === 0) {
261
+ this.presenceByScopeKey.delete(scopeKey);
262
+ }
263
+ // Notify other clients in this scope
264
+ this.broadcastPresenceEvent(scopeKey, {
265
+ action: 'leave',
266
+ scopeKey,
267
+ clientId,
268
+ actorId: entry.actorId,
269
+ });
270
+ // Callback for cross-instance broadcasting
271
+ this.onPresenceChange?.({
272
+ action: 'leave',
273
+ scopeKey,
274
+ clientId,
275
+ actorId: entry.actorId,
276
+ });
277
+ return true;
278
+ }
279
+ /**
280
+ * Update presence metadata for a client in a scope.
281
+ * Used to update what entity a user is viewing/editing.
282
+ */
283
+ updatePresenceMetadata(clientId, scopeKey, metadata) {
284
+ if (!this.isClientSubscribedToScopeKey(clientId, scopeKey))
285
+ return false;
286
+ const scopePresence = this.presenceByScopeKey.get(scopeKey);
287
+ if (!scopePresence)
288
+ return false;
289
+ const entry = scopePresence.get(clientId);
290
+ if (!entry)
291
+ return false;
292
+ entry.metadata = metadata;
293
+ // Notify other clients in this scope
294
+ this.broadcastPresenceEvent(scopeKey, {
295
+ action: 'update',
296
+ scopeKey,
297
+ clientId,
298
+ actorId: entry.actorId,
299
+ metadata,
300
+ });
301
+ // Callback for cross-instance broadcasting
302
+ this.onPresenceChange?.({
303
+ action: 'update',
304
+ scopeKey,
305
+ clientId,
306
+ actorId: entry.actorId,
307
+ metadata,
308
+ });
309
+ return true;
310
+ }
311
+ /**
312
+ * Get presence entries for a scope key.
313
+ */
314
+ getPresence(scopeKey) {
315
+ const scopePresence = this.presenceByScopeKey.get(scopeKey);
316
+ if (!scopePresence)
317
+ return [];
318
+ return Array.from(scopePresence.values());
319
+ }
320
+ /**
321
+ * Get presence for multiple scopes.
322
+ */
323
+ getPresenceMultiple(scopeKeys) {
324
+ const result = {};
325
+ for (const scopeKey of scopeKeys) {
326
+ result[scopeKey] = this.getPresence(scopeKey);
327
+ }
328
+ return result;
329
+ }
330
+ /**
331
+ * Send current presence snapshot to a specific connection.
332
+ * Called when a client first subscribes to presence for a scope.
333
+ */
334
+ sendPresenceSnapshot(connection, scopeKey) {
335
+ const entries = this.getPresence(scopeKey);
336
+ connection.sendPresence({
337
+ action: 'snapshot',
338
+ scopeKey,
339
+ entries,
340
+ });
341
+ }
342
+ /**
343
+ * Handle a presence event from another server instance (via broadcaster).
344
+ * Updates local state and notifies local clients.
345
+ */
346
+ handleRemotePresenceEvent(event) {
347
+ const { action, scopeKey, clientId, actorId, metadata } = event;
348
+ // Update local presence state
349
+ let scopePresence = this.presenceByScopeKey.get(scopeKey);
350
+ switch (action) {
351
+ case 'join': {
352
+ if (!scopePresence) {
353
+ scopePresence = new Map();
354
+ this.presenceByScopeKey.set(scopeKey, scopePresence);
355
+ }
356
+ scopePresence.set(clientId, {
357
+ clientId,
358
+ actorId,
359
+ joinedAt: Date.now(),
360
+ metadata,
361
+ });
362
+ break;
363
+ }
364
+ case 'leave': {
365
+ if (scopePresence) {
366
+ scopePresence.delete(clientId);
367
+ if (scopePresence.size === 0) {
368
+ this.presenceByScopeKey.delete(scopeKey);
369
+ }
370
+ }
371
+ break;
372
+ }
373
+ case 'update': {
374
+ if (scopePresence) {
375
+ const entry = scopePresence.get(clientId);
376
+ if (entry) {
377
+ entry.metadata = metadata;
378
+ }
379
+ }
380
+ break;
381
+ }
382
+ }
383
+ // Notify local clients
384
+ this.broadcastPresenceEvent(scopeKey, event);
385
+ }
386
+ /**
387
+ * Broadcast a presence event to all clients subscribed to a scope key.
388
+ */
389
+ broadcastPresenceEvent(scopeKey, event) {
390
+ const conns = this.connectionsByScopeKey.get(scopeKey);
391
+ if (!conns)
392
+ return;
393
+ for (const conn of conns) {
394
+ if (!conn.isOpen)
395
+ continue;
396
+ // Don't send presence events back to the source client
397
+ if (event.clientId && conn.clientId === event.clientId)
398
+ continue;
399
+ conn.sendPresence(event);
400
+ }
401
+ }
402
+ /**
403
+ * Clean up presence when a client fully disconnects (all connections closed).
404
+ */
405
+ cleanupClientPresence(clientId) {
406
+ // Find all scopes this client has presence in
407
+ for (const [scopeKey, scopePresence] of this.presenceByScopeKey) {
408
+ const entry = scopePresence.get(clientId);
409
+ if (!entry)
410
+ continue;
411
+ scopePresence.delete(clientId);
412
+ if (scopePresence.size === 0) {
413
+ this.presenceByScopeKey.delete(scopeKey);
414
+ }
415
+ // Notify other clients
416
+ this.broadcastPresenceEvent(scopeKey, {
417
+ action: 'leave',
418
+ scopeKey,
419
+ clientId,
420
+ actorId: entry.actorId,
421
+ });
422
+ // Callback for cross-instance broadcasting
423
+ this.onPresenceChange?.({
424
+ action: 'leave',
425
+ scopeKey,
426
+ clientId,
427
+ actorId: entry.actorId,
428
+ });
429
+ }
430
+ }
431
+ // =========================================================================
432
+ // Sync Notifications
433
+ // =========================================================================
434
+ /**
435
+ * Notify clients that new data is available for the given scopes.
436
+ * Dedupes connections that match multiple scopes.
437
+ */
438
+ /**
439
+ * Maximum serialized size (bytes) for inline WS change delivery.
440
+ * Larger payloads fall back to cursor-only notification.
441
+ */
442
+ static WS_INLINE_MAX_BYTES = 64 * 1024;
443
+ notifyScopeKeys(scopeKeys, cursor, opts) {
444
+ const exclude = new Set(opts?.excludeClientIds ?? []);
445
+ const targets = new Set();
446
+ for (const k of scopeKeys) {
447
+ const conns = this.connectionsByScopeKey.get(k);
448
+ if (!conns)
449
+ continue;
450
+ for (const conn of conns)
451
+ targets.add(conn);
452
+ }
453
+ // Size guard: only deliver inline changes if under threshold
454
+ let inlineChanges;
455
+ if (opts?.changes && opts.changes.length > 0) {
456
+ const serialized = JSON.stringify(opts.changes);
457
+ if (serialized.length <= WebSocketConnectionManager.WS_INLINE_MAX_BYTES) {
458
+ inlineChanges = opts.changes;
459
+ }
460
+ }
461
+ for (const conn of targets) {
462
+ if (!conn.isOpen)
463
+ continue;
464
+ if (exclude.has(conn.clientId))
465
+ continue;
466
+ if (inlineChanges) {
467
+ conn.sendSync(cursor, inlineChanges);
468
+ }
469
+ else {
470
+ conn.sendSync(cursor);
471
+ }
472
+ }
473
+ }
474
+ /**
475
+ * Get the number of active connections for a client.
476
+ */
477
+ getConnectionCount(clientId) {
478
+ return this.connectionsByClientId.get(clientId)?.size ?? 0;
479
+ }
480
+ /**
481
+ * Get the current transport path for a client if connected.
482
+ */
483
+ getClientTransportPath(clientId) {
484
+ const conns = this.connectionsByClientId.get(clientId);
485
+ if (!conns || conns.size === 0) {
486
+ return null;
487
+ }
488
+ for (const conn of conns) {
489
+ if (conn.transportPath === 'relay') {
490
+ return 'relay';
491
+ }
492
+ }
493
+ return 'direct';
494
+ }
495
+ /**
496
+ * Get total number of active connections.
497
+ */
498
+ getTotalConnections() {
499
+ let total = 0;
500
+ for (const conns of this.connectionsByClientId.values()) {
501
+ total += conns.size;
502
+ }
503
+ return total;
504
+ }
505
+ /**
506
+ * Close all connections for a client.
507
+ */
508
+ closeClientConnections(clientId) {
509
+ const conns = this.connectionsByClientId.get(clientId);
510
+ if (!conns)
511
+ return;
512
+ const scopeKeys = this.scopeKeysByClientId.get(clientId) ?? new Set();
513
+ for (const k of scopeKeys) {
514
+ const set = this.connectionsByScopeKey.get(k);
515
+ if (!set)
516
+ continue;
517
+ for (const conn of conns)
518
+ set.delete(conn);
519
+ if (set.size === 0)
520
+ this.connectionsByScopeKey.delete(k);
521
+ }
522
+ for (const conn of conns) {
523
+ conn.close(1000, 'client closed');
524
+ }
525
+ this.connectionsByClientId.delete(clientId);
526
+ this.scopeKeysByClientId.delete(clientId);
527
+ this.ensureHeartbeat();
528
+ }
529
+ /**
530
+ * Close all connections.
531
+ */
532
+ closeAll() {
533
+ for (const conns of this.connectionsByClientId.values()) {
534
+ for (const conn of conns) {
535
+ conn.close(1000, 'server shutdown');
536
+ }
537
+ }
538
+ this.connectionsByClientId.clear();
539
+ this.scopeKeysByClientId.clear();
540
+ this.connectionsByScopeKey.clear();
541
+ this.presenceByScopeKey.clear();
542
+ this.ensureHeartbeat();
543
+ }
544
+ ensureHeartbeat() {
545
+ if (this.heartbeatIntervalMs <= 0)
546
+ return;
547
+ const total = this.getTotalConnections();
548
+ if (total === 0) {
549
+ if (this.heartbeatTimer) {
550
+ clearInterval(this.heartbeatTimer);
551
+ this.heartbeatTimer = null;
552
+ }
553
+ return;
554
+ }
555
+ if (this.heartbeatTimer)
556
+ return;
557
+ this.heartbeatTimer = setInterval(() => {
558
+ this.sendHeartbeats();
559
+ }, this.heartbeatIntervalMs);
560
+ }
561
+ sendHeartbeats() {
562
+ const closed = [];
563
+ for (const conns of this.connectionsByClientId.values()) {
564
+ for (const conn of conns) {
565
+ if (!conn.isOpen) {
566
+ closed.push(conn);
567
+ continue;
568
+ }
569
+ conn.sendHeartbeat();
570
+ }
571
+ }
572
+ for (const conn of closed) {
573
+ this.unregister(conn);
574
+ }
575
+ // Might have removed last connection.
576
+ this.ensureHeartbeat();
577
+ }
578
+ unregister(connection) {
579
+ const clientId = connection.clientId;
580
+ const scopeKeys = this.scopeKeysByClientId.get(clientId) ?? new Set();
581
+ for (const k of scopeKeys) {
582
+ const set = this.connectionsByScopeKey.get(k);
583
+ if (!set)
584
+ continue;
585
+ set.delete(connection);
586
+ if (set.size === 0)
587
+ this.connectionsByScopeKey.delete(k);
588
+ }
589
+ const conns = this.connectionsByClientId.get(clientId);
590
+ if (!conns)
591
+ return;
592
+ conns.delete(connection);
593
+ if (conns.size > 0)
594
+ return;
595
+ // Client fully disconnected - clean up presence
596
+ this.cleanupClientPresence(clientId);
597
+ this.connectionsByClientId.delete(clientId);
598
+ this.scopeKeysByClientId.delete(clientId);
599
+ }
600
+ }
601
+ //# sourceMappingURL=ws.js.map
package/dist/ws.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"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"}