@eleven-am/pondsocket 0.1.217 → 0.1.218

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.
@@ -17,6 +17,8 @@ export declare class ChannelEngine {
17
17
  upsertPresence(userId: string, presence: PondPresence): void;
18
18
  updateAssigns(userId: string, assigns: PondMessage): void;
19
19
  kickUser(userId: string, reason: string): void;
20
+ requestUserRemoval(userId: string): void;
21
+ getUserAcrossNodes(userId: string, timeoutMs?: number): Promise<UserData | null>;
20
22
  getAssigns(): UserAssigns;
21
23
  getPresence(): UserPresences;
22
24
  destroy(reason?: string): void;
@@ -30,7 +30,7 @@ var __rest = (this && this.__rest) || function (s, e) {
30
30
  }
31
31
  return t;
32
32
  };
33
- var _ChannelEngine_instances, _ChannelEngine_endpointId, _ChannelEngine_backend, _ChannelEngine_nodeId, _ChannelEngine_presenceEngine, _ChannelEngine_assignsCache, _ChannelEngine_userSubscriptions, _ChannelEngine_publisher, _ChannelEngine_distributedSubscription, _ChannelEngine_heartbeatSubscription, _ChannelEngine_nodeLastSeen, _ChannelEngine_nodeUsers, _ChannelEngine_staleNodeTimer, _ChannelEngine_name, _ChannelEngine_closed, _ChannelEngine_distributedReady, _ChannelEngine_safeRemovePresence, _ChannelEngine_buildSubscriber, _ChannelEngine_getOrCreatePresenceEngine, _ChannelEngine_getUsersFromRecipients, _ChannelEngine_setupDistributedSubscription, _ChannelEngine_afterDistributedReady, _ChannelEngine_handleDistributedMessage, _ChannelEngine_requestChannelState, _ChannelEngine_handleStateRequest, _ChannelEngine_handleStateResponse, _ChannelEngine_handleRemoteUserJoined, _ChannelEngine_handleRemoteUserLeft, _ChannelEngine_handleRemoteMessage, _ChannelEngine_handleRemotePresenceUpdate, _ChannelEngine_handleRemotePresenceRemoved, _ChannelEngine_handleRemoteAssignsUpdate, _ChannelEngine_handleRemoteEvictUser, _ChannelEngine_setupHeartbeatTracking, _ChannelEngine_cleanupStaleNodes, _ChannelEngine_trackNodeUser, _ChannelEngine_untrackNodeUser, _ChannelEngine_broadcastToNodes;
33
+ var _ChannelEngine_instances, _ChannelEngine_endpointId, _ChannelEngine_backend, _ChannelEngine_nodeId, _ChannelEngine_presenceEngine, _ChannelEngine_assignsCache, _ChannelEngine_userSubscriptions, _ChannelEngine_publisher, _ChannelEngine_distributedSubscription, _ChannelEngine_heartbeatSubscription, _ChannelEngine_nodeLastSeen, _ChannelEngine_nodeUsers, _ChannelEngine_pendingUserGets, _ChannelEngine_staleNodeTimer, _ChannelEngine_name, _ChannelEngine_closed, _ChannelEngine_distributedReady, _ChannelEngine_safeRemovePresence, _ChannelEngine_buildSubscriber, _ChannelEngine_getOrCreatePresenceEngine, _ChannelEngine_getUsersFromRecipients, _ChannelEngine_setupDistributedSubscription, _ChannelEngine_afterDistributedReady, _ChannelEngine_handleDistributedMessage, _ChannelEngine_requestChannelState, _ChannelEngine_handleStateRequest, _ChannelEngine_handleStateResponse, _ChannelEngine_handleRemoteUserJoined, _ChannelEngine_handleRemoteUserLeft, _ChannelEngine_handleRemoteMessage, _ChannelEngine_handleRemotePresenceUpdate, _ChannelEngine_handleRemotePresenceRemoved, _ChannelEngine_handleRemoteAssignsUpdate, _ChannelEngine_handleRemoteEvictUser, _ChannelEngine_handleRemoteUserRemove, _ChannelEngine_handleRemoteUserGetRequest, _ChannelEngine_handleRemoteUserGetResponse, _ChannelEngine_setupHeartbeatTracking, _ChannelEngine_cleanupStaleNodes, _ChannelEngine_trackNodeUser, _ChannelEngine_untrackNodeUser, _ChannelEngine_broadcastToNodes;
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
35
  exports.ChannelEngine = void 0;
36
36
  const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
@@ -59,6 +59,7 @@ class ChannelEngine {
59
59
  _ChannelEngine_heartbeatSubscription.set(this, null);
60
60
  _ChannelEngine_nodeLastSeen.set(this, new Map());
61
61
  _ChannelEngine_nodeUsers.set(this, new Map());
62
+ _ChannelEngine_pendingUserGets.set(this, new Map());
62
63
  _ChannelEngine_staleNodeTimer.set(this, null);
63
64
  _ChannelEngine_name.set(this, void 0);
64
65
  _ChannelEngine_closed.set(this, false);
@@ -222,6 +223,38 @@ class ChannelEngine {
222
223
  });
223
224
  this.removeUser(userId, true);
224
225
  }
226
+ requestUserRemoval(userId) {
227
+ __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_broadcastToNodes).call(this, {
228
+ type: types_1.DistributedMessageType.USER_REMOVE,
229
+ endpointName: __classPrivateFieldGet(this, _ChannelEngine_endpointId, "f"),
230
+ channelName: __classPrivateFieldGet(this, _ChannelEngine_name, "f"),
231
+ userId,
232
+ });
233
+ }
234
+ getUserAcrossNodes(userId, timeoutMs = 5000) {
235
+ if (!__classPrivateFieldGet(this, _ChannelEngine_backend, "f")) {
236
+ return Promise.resolve(null);
237
+ }
238
+ const requestId = (0, pondsocket_common_1.uuid)();
239
+ return new Promise((resolve) => {
240
+ const timer = setTimeout(() => {
241
+ __classPrivateFieldGet(this, _ChannelEngine_pendingUserGets, "f").delete(requestId);
242
+ resolve(null);
243
+ }, timeoutMs);
244
+ __classPrivateFieldGet(this, _ChannelEngine_pendingUserGets, "f").set(requestId, {
245
+ resolve,
246
+ timer,
247
+ });
248
+ __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_broadcastToNodes).call(this, {
249
+ type: types_1.DistributedMessageType.USER_GET_REQUEST,
250
+ endpointName: __classPrivateFieldGet(this, _ChannelEngine_endpointId, "f"),
251
+ channelName: __classPrivateFieldGet(this, _ChannelEngine_name, "f"),
252
+ userId,
253
+ requestId,
254
+ fromNode: __classPrivateFieldGet(this, _ChannelEngine_nodeId, "f"),
255
+ });
256
+ });
257
+ }
225
258
  getAssigns() {
226
259
  return mapToObject(__classPrivateFieldGet(this, _ChannelEngine_assignsCache, "f"));
227
260
  }
@@ -304,6 +337,8 @@ class ChannelEngine {
304
337
  clearInterval(__classPrivateFieldGet(this, _ChannelEngine_staleNodeTimer, "f"));
305
338
  __classPrivateFieldSet(this, _ChannelEngine_staleNodeTimer, null, "f");
306
339
  }
340
+ __classPrivateFieldGet(this, _ChannelEngine_pendingUserGets, "f").forEach((pending) => clearTimeout(pending.timer));
341
+ __classPrivateFieldGet(this, _ChannelEngine_pendingUserGets, "f").clear();
307
342
  __classPrivateFieldGet(this, _ChannelEngine_nodeLastSeen, "f").clear();
308
343
  __classPrivateFieldGet(this, _ChannelEngine_nodeUsers, "f").clear();
309
344
  __classPrivateFieldGet(this, _ChannelEngine_publisher, "f").close();
@@ -311,7 +346,7 @@ class ChannelEngine {
311
346
  }
312
347
  }
313
348
  exports.ChannelEngine = ChannelEngine;
314
- _ChannelEngine_endpointId = new WeakMap(), _ChannelEngine_backend = new WeakMap(), _ChannelEngine_nodeId = new WeakMap(), _ChannelEngine_presenceEngine = new WeakMap(), _ChannelEngine_assignsCache = new WeakMap(), _ChannelEngine_userSubscriptions = new WeakMap(), _ChannelEngine_publisher = new WeakMap(), _ChannelEngine_distributedSubscription = new WeakMap(), _ChannelEngine_heartbeatSubscription = new WeakMap(), _ChannelEngine_nodeLastSeen = new WeakMap(), _ChannelEngine_nodeUsers = new WeakMap(), _ChannelEngine_staleNodeTimer = new WeakMap(), _ChannelEngine_name = new WeakMap(), _ChannelEngine_closed = new WeakMap(), _ChannelEngine_distributedReady = new WeakMap(), _ChannelEngine_instances = new WeakSet(), _ChannelEngine_safeRemovePresence = function _ChannelEngine_safeRemovePresence(userId) {
349
+ _ChannelEngine_endpointId = new WeakMap(), _ChannelEngine_backend = new WeakMap(), _ChannelEngine_nodeId = new WeakMap(), _ChannelEngine_presenceEngine = new WeakMap(), _ChannelEngine_assignsCache = new WeakMap(), _ChannelEngine_userSubscriptions = new WeakMap(), _ChannelEngine_publisher = new WeakMap(), _ChannelEngine_distributedSubscription = new WeakMap(), _ChannelEngine_heartbeatSubscription = new WeakMap(), _ChannelEngine_nodeLastSeen = new WeakMap(), _ChannelEngine_nodeUsers = new WeakMap(), _ChannelEngine_pendingUserGets = new WeakMap(), _ChannelEngine_staleNodeTimer = new WeakMap(), _ChannelEngine_name = new WeakMap(), _ChannelEngine_closed = new WeakMap(), _ChannelEngine_distributedReady = new WeakMap(), _ChannelEngine_instances = new WeakSet(), _ChannelEngine_safeRemovePresence = function _ChannelEngine_safeRemovePresence(userId) {
315
350
  if (__classPrivateFieldGet(this, _ChannelEngine_presenceEngine, "f")) {
316
351
  try {
317
352
  __classPrivateFieldGet(this, _ChannelEngine_presenceEngine, "f").removePresence(userId);
@@ -421,6 +456,15 @@ _ChannelEngine_endpointId = new WeakMap(), _ChannelEngine_backend = new WeakMap(
421
456
  case types_1.DistributedMessageType.EVICT_USER:
422
457
  __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_handleRemoteEvictUser).call(this, message);
423
458
  break;
459
+ case types_1.DistributedMessageType.USER_REMOVE:
460
+ __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_handleRemoteUserRemove).call(this, message);
461
+ break;
462
+ case types_1.DistributedMessageType.USER_GET_REQUEST:
463
+ __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_handleRemoteUserGetRequest).call(this, message);
464
+ break;
465
+ case types_1.DistributedMessageType.USER_GET_RESPONSE:
466
+ __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_handleRemoteUserGetResponse).call(this, message);
467
+ break;
424
468
  case types_1.DistributedMessageType.NODE_HEARTBEAT:
425
469
  break;
426
470
  default:
@@ -545,6 +589,40 @@ _ChannelEngine_endpointId = new WeakMap(), _ChannelEngine_backend = new WeakMap(
545
589
  unsubscribe();
546
590
  __classPrivateFieldGet(this, _ChannelEngine_userSubscriptions, "f").delete(message.userId);
547
591
  }
592
+ }, _ChannelEngine_handleRemoteUserRemove = function _ChannelEngine_handleRemoteUserRemove(message) {
593
+ if (__classPrivateFieldGet(this, _ChannelEngine_userSubscriptions, "f").has(message.userId)) {
594
+ this.removeUser(message.userId);
595
+ return;
596
+ }
597
+ __classPrivateFieldGet(this, _ChannelEngine_assignsCache, "f").delete(message.userId);
598
+ __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_safeRemovePresence).call(this, message.userId);
599
+ __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_untrackNodeUser).call(this, message.sourceNodeId, message.userId);
600
+ }, _ChannelEngine_handleRemoteUserGetRequest = function _ChannelEngine_handleRemoteUserGetRequest(message) {
601
+ var _a;
602
+ if (!__classPrivateFieldGet(this, _ChannelEngine_userSubscriptions, "f").has(message.userId)) {
603
+ return;
604
+ }
605
+ __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_broadcastToNodes).call(this, {
606
+ type: types_1.DistributedMessageType.USER_GET_RESPONSE,
607
+ endpointName: __classPrivateFieldGet(this, _ChannelEngine_endpointId, "f"),
608
+ channelName: __classPrivateFieldGet(this, _ChannelEngine_name, "f"),
609
+ userId: message.userId,
610
+ requestId: message.requestId,
611
+ assigns: __classPrivateFieldGet(this, _ChannelEngine_assignsCache, "f").get(message.userId) || {},
612
+ presence: ((_a = __classPrivateFieldGet(this, _ChannelEngine_presenceEngine, "f")) === null || _a === void 0 ? void 0 : _a.getPresence(message.userId)) || {},
613
+ });
614
+ }, _ChannelEngine_handleRemoteUserGetResponse = function _ChannelEngine_handleRemoteUserGetResponse(message) {
615
+ const pending = __classPrivateFieldGet(this, _ChannelEngine_pendingUserGets, "f").get(message.requestId);
616
+ if (!pending) {
617
+ return;
618
+ }
619
+ clearTimeout(pending.timer);
620
+ __classPrivateFieldGet(this, _ChannelEngine_pendingUserGets, "f").delete(message.requestId);
621
+ pending.resolve({
622
+ id: message.userId,
623
+ assigns: message.assigns || {},
624
+ presence: message.presence || {},
625
+ });
548
626
  }, _ChannelEngine_setupHeartbeatTracking = function _ChannelEngine_setupHeartbeatTracking() {
549
627
  if (!__classPrivateFieldGet(this, _ChannelEngine_backend, "f")) {
550
628
  return;
@@ -68,12 +68,13 @@ class LobbyEngine {
68
68
  if (!params || context.isBlocked()) {
69
69
  return next();
70
70
  }
71
- context.updateParams(params);
72
- const payload = yield handler(context, next);
71
+ const typedContext = context;
72
+ typedContext.updateParams(params);
73
+ const payload = yield handler(typedContext, next);
73
74
  if (payload === undefined || payload === null) {
74
75
  return;
75
76
  }
76
- context.transform(payload);
77
+ typedContext.transform(payload);
77
78
  return next();
78
79
  }));
79
80
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eleven-am/pondsocket",
3
- "version": "0.1.217",
3
+ "version": "0.1.218",
4
4
  "description": "PondSocket is a fast simple socket server",
5
5
  "keywords": [
6
6
  "socket",
@@ -43,7 +43,7 @@
43
43
  "url": "git+https://github.com/Eleven-am/pondSocket.git"
44
44
  },
45
45
  "dependencies": {
46
- "@eleven-am/pondsocket-common": "^0.0.39",
46
+ "@eleven-am/pondsocket-common": "^0.0.40",
47
47
  "@types/node": "^25.3.3",
48
48
  "@types/ws": "^8.18.1",
49
49
  "redis": "^5.12.1",
package/types.d.ts CHANGED
@@ -100,20 +100,19 @@ export interface EvictUser extends DistributedMessage {
100
100
  export interface UserRemove extends DistributedMessage {
101
101
  type: DistributedMessageType.USER_REMOVE;
102
102
  userId: string;
103
- reason: string;
104
103
  }
105
104
  export interface UserGetRequest extends DistributedMessage {
106
105
  type: DistributedMessageType.USER_GET_REQUEST;
107
106
  userId: string;
108
- lookupRequestId: string;
107
+ requestId: string;
108
+ fromNode: string;
109
109
  }
110
110
  export interface UserGetResponse extends DistributedMessage {
111
111
  type: DistributedMessageType.USER_GET_RESPONSE;
112
- lookupRequestId: string;
113
112
  userId: string;
114
- found: boolean;
115
- assigns?: PondAssigns;
116
- presence?: PondPresence;
113
+ requestId: string;
114
+ assigns: PondAssigns;
115
+ presence: PondPresence;
117
116
  }
118
117
  export interface NodeHeartbeat extends DistributedMessage {
119
118
  type: DistributedMessageType.NODE_HEARTBEAT;
@@ -51,4 +51,12 @@ export declare class Channel<Schema extends AnyPondSchema = AnyPondSchema> {
51
51
  * Updates a user's assigns
52
52
  */
53
53
  updateAssigns(userId: string, assigns: Partial<AssignsOf<Schema>>): this;
54
+ /**
55
+ * Resolves a user's data from any node in the distributed cluster
56
+ */
57
+ getUserAcrossNodes(userId: string, timeoutMs?: number): Promise<UserData<PresenceOf<Schema>, AssignsOf<Schema>> | null>;
58
+ /**
59
+ * Requests removal of a user across all nodes in the distributed cluster
60
+ */
61
+ requestUserRemoval(userId: string): this;
54
62
  }
@@ -101,6 +101,19 @@ class Channel {
101
101
  __classPrivateFieldGet(this, _Channel_engine, "f").updateAssigns(userId, assigns);
102
102
  return this;
103
103
  }
104
+ /**
105
+ * Resolves a user's data from any node in the distributed cluster
106
+ */
107
+ getUserAcrossNodes(userId, timeoutMs) {
108
+ return __classPrivateFieldGet(this, _Channel_engine, "f").getUserAcrossNodes(userId, timeoutMs);
109
+ }
110
+ /**
111
+ * Requests removal of a user across all nodes in the distributed cluster
112
+ */
113
+ requestUserRemoval(userId) {
114
+ __classPrivateFieldGet(this, _Channel_engine, "f").requestUserRemoval(userId);
115
+ return this;
116
+ }
104
117
  }
105
118
  exports.Channel = Channel;
106
119
  _Channel_engine = new WeakMap();