@eleven-am/pondsocket 0.1.125 → 0.1.126

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.
@@ -2,5 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PondResponse = void 0;
4
4
  class PondResponse {
5
+ constructor(requestId) {
6
+ this.requestId = requestId;
7
+ }
5
8
  }
6
9
  exports.PondResponse = PondResponse;
@@ -28,6 +28,7 @@ const eventRequest_1 = require("./eventRequest");
28
28
  const eventResponse_1 = require("./eventResponse");
29
29
  const enums_1 = require("../enums");
30
30
  const pondError_1 = require("../errors/pondError");
31
+ const uuid_1 = require("../misc/uuid");
31
32
  const presence_1 = require("../presence/presence");
32
33
  const subject_1 = require("../subjects/subject");
33
34
  class Channel {
@@ -45,16 +46,16 @@ class Channel {
45
46
  return __classPrivateFieldGet(this, _Channel_engine, "f").getUserData(userId);
46
47
  }
47
48
  broadcastMessage(event, payload) {
48
- __classPrivateFieldGet(this, _Channel_engine, "f").sendMessage(enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.BROADCAST, event, payload);
49
+ __classPrivateFieldGet(this, _Channel_engine, "f").sendMessage((0, uuid_1.uuid)(), enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.BROADCAST, event, payload);
49
50
  }
50
51
  broadcastMessageFromUser(userId, event, payload) {
51
- __classPrivateFieldGet(this, _Channel_engine, "f").sendMessage(userId, enums_1.ChannelReceiver.ALL_EXCEPT_SENDER, enums_1.ServerActions.BROADCAST, event, payload);
52
+ __classPrivateFieldGet(this, _Channel_engine, "f").sendMessage((0, uuid_1.uuid)(), userId, enums_1.ChannelReceiver.ALL_EXCEPT_SENDER, enums_1.ServerActions.BROADCAST, event, payload);
52
53
  }
53
54
  sendToUser(userId, event, payload) {
54
- __classPrivateFieldGet(this, _Channel_engine, "f").sendMessage(enums_1.SystemSender.CHANNEL, [userId], enums_1.ServerActions.BROADCAST, event, payload);
55
+ __classPrivateFieldGet(this, _Channel_engine, "f").sendMessage((0, uuid_1.uuid)(), enums_1.SystemSender.CHANNEL, [userId], enums_1.ServerActions.BROADCAST, event, payload);
55
56
  }
56
57
  sendToUsers(userIds, event, payload) {
57
- __classPrivateFieldGet(this, _Channel_engine, "f").sendMessage(enums_1.SystemSender.CHANNEL, userIds, enums_1.ServerActions.BROADCAST, event, payload);
58
+ __classPrivateFieldGet(this, _Channel_engine, "f").sendMessage((0, uuid_1.uuid)(), enums_1.SystemSender.CHANNEL, userIds, enums_1.ServerActions.BROADCAST, event, payload);
58
59
  }
59
60
  evictUser(userId, reason) {
60
61
  __classPrivateFieldGet(this, _Channel_engine, "f").kickUser(userId, reason !== null && reason !== void 0 ? reason : 'You have been banned from the channel');
@@ -132,12 +133,12 @@ class ChannelEngine {
132
133
  * @param reason - The reason for kicking the user
133
134
  */
134
135
  kickUser(userId, reason) {
135
- this.sendMessage(enums_1.SystemSender.CHANNEL, [userId], enums_1.ServerActions.SYSTEM, 'kicked_out', {
136
+ this.sendMessage((0, uuid_1.uuid)(), enums_1.SystemSender.CHANNEL, [userId], enums_1.ServerActions.SYSTEM, 'kicked_out', {
136
137
  message: reason,
137
138
  code: 403,
138
139
  });
139
140
  this.removeUser(userId);
140
- this.sendMessage(enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.SYSTEM, 'kicked', {
141
+ this.sendMessage((0, uuid_1.uuid)(), enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.SYSTEM, 'kicked', {
141
142
  userId,
142
143
  reason,
143
144
  });
@@ -147,7 +148,7 @@ class ChannelEngine {
147
148
  * @param reason - The reason for self-destructing the channel
148
149
  */
149
150
  destroy(reason) {
150
- this.sendMessage(enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.ERROR, 'destroyed', {
151
+ this.sendMessage((0, uuid_1.uuid)(), enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.ERROR, 'destroyed', {
151
152
  message: reason !== null && reason !== void 0 ? reason : 'Channel has been destroyed',
152
153
  });
153
154
  __classPrivateFieldGet(this, _ChannelEngine_parentEngine, "f").destroyChannel();
@@ -195,19 +196,21 @@ class ChannelEngine {
195
196
  }
196
197
  /**
197
198
  * @desc Sends a message to a specified set of users, from a specified sender
199
+ * @param requestId - The id of the request
198
200
  * @param sender - The sender of the message
199
201
  * @param recipient - The users to send the message to
200
202
  * @param action - The action of the message
201
203
  * @param event - The event name
202
204
  * @param payload - The payload of the message
203
205
  */
204
- sendMessage(sender, recipient, action, event, payload) {
206
+ sendMessage(requestId, sender, recipient, action, event, payload) {
205
207
  if (!__classPrivateFieldGet(this, _ChannelEngine_users, "f").has(sender) && sender !== enums_1.SystemSender.CHANNEL) {
206
208
  throw new pondError_1.ChannelError(`ChannelEngine: User with id ${sender} does not exist in channel ${this.name}`, 404, this.name);
207
209
  }
208
210
  const eventMessage = {
209
211
  recipients: __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_getUsersFromRecipients).call(this, recipient, sender),
210
212
  channelName: this.name,
213
+ requestId,
211
214
  action,
212
215
  payload,
213
216
  event,
@@ -229,12 +232,13 @@ class ChannelEngine {
229
232
  payload: message.payload,
230
233
  action: enums_1.ServerActions.BROADCAST,
231
234
  channelName: this.name,
235
+ requestId: message.requestId,
232
236
  recipients: __classPrivateFieldGet(this, _ChannelEngine_instances, "m", _ChannelEngine_getUsersFromRecipients).call(this, message.addresses || enums_1.ChannelReceiver.ALL_USERS, userId),
233
237
  };
234
238
  const request = new eventRequest_1.EventRequest(responseEvent, this);
235
239
  const response = new eventResponse_1.EventResponse(responseEvent, this);
236
240
  __classPrivateFieldGet(this, _ChannelEngine_parentEngine, "f").execute(request, response, () => {
237
- this.sendMessage(enums_1.SystemSender.CHANNEL, [userId], enums_1.ServerActions.ERROR, enums_1.ErrorTypes.HANDLER_NOT_FOUND, {
241
+ this.sendMessage(responseEvent.requestId, enums_1.SystemSender.CHANNEL, [userId], enums_1.ServerActions.ERROR, enums_1.ErrorTypes.HANDLER_NOT_FOUND, {
238
242
  message: 'A handler did not respond to the event',
239
243
  code: 404,
240
244
  });
@@ -18,7 +18,7 @@ const enums_1 = require("../enums");
18
18
  const pondError_1 = require("../errors/pondError");
19
19
  class EventResponse extends abstractResponse_1.PondResponse {
20
20
  constructor(event, engine) {
21
- super();
21
+ super(event.requestId);
22
22
  _EventResponse_instances.add(this);
23
23
  _EventResponse_event.set(this, void 0);
24
24
  _EventResponse_engine.set(this, void 0);
@@ -39,7 +39,7 @@ class EventResponse extends abstractResponse_1.PondResponse {
39
39
  */
40
40
  accept(assigns) {
41
41
  __classPrivateFieldGet(this, _EventResponse_instances, "m", _EventResponse_manageAssigns).call(this, assigns);
42
- __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(__classPrivateFieldGet(this, _EventResponse_event, "f").sender, __classPrivateFieldGet(this, _EventResponse_event, "f").recipients, __classPrivateFieldGet(this, _EventResponse_event, "f").action, __classPrivateFieldGet(this, _EventResponse_event, "f").event, __classPrivateFieldGet(this, _EventResponse_event, "f").payload);
42
+ __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _EventResponse_event, "f").sender, __classPrivateFieldGet(this, _EventResponse_event, "f").recipients, __classPrivateFieldGet(this, _EventResponse_event, "f").action, __classPrivateFieldGet(this, _EventResponse_event, "f").event, __classPrivateFieldGet(this, _EventResponse_event, "f").payload);
43
43
  return this;
44
44
  }
45
45
  /**
@@ -51,7 +51,7 @@ class EventResponse extends abstractResponse_1.PondResponse {
51
51
  reject(message, errorCode, assigns) {
52
52
  __classPrivateFieldGet(this, _EventResponse_instances, "m", _EventResponse_manageAssigns).call(this, assigns);
53
53
  const text = message || 'Unauthorized request';
54
- __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(enums_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _EventResponse_event, "f").sender], enums_1.ServerActions.ERROR, enums_1.ErrorTypes.UNAUTHORIZED_BROADCAST, {
54
+ __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(this.requestId, enums_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _EventResponse_event, "f").sender], enums_1.ServerActions.ERROR, enums_1.ErrorTypes.UNAUTHORIZED_BROADCAST, {
55
55
  message: text,
56
56
  code: errorCode || 403,
57
57
  });
@@ -65,7 +65,7 @@ class EventResponse extends abstractResponse_1.PondResponse {
65
65
  */
66
66
  send(event, payload, assigns) {
67
67
  this.accept(assigns);
68
- __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(enums_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _EventResponse_event, "f").sender], enums_1.ServerActions.SYSTEM, event, payload);
68
+ __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(this.requestId, enums_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _EventResponse_event, "f").sender], enums_1.ServerActions.SYSTEM, event, payload);
69
69
  }
70
70
  /**
71
71
  * @desc Emits a direct message to the client without accepting the request
@@ -75,7 +75,7 @@ class EventResponse extends abstractResponse_1.PondResponse {
75
75
  */
76
76
  sendOnly(event, payload, assigns) {
77
77
  __classPrivateFieldGet(this, _EventResponse_instances, "m", _EventResponse_manageAssigns).call(this, assigns);
78
- __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(enums_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _EventResponse_event, "f").sender], enums_1.ServerActions.SYSTEM, event, payload);
78
+ __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(this.requestId, enums_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _EventResponse_event, "f").sender], enums_1.ServerActions.SYSTEM, event, payload);
79
79
  }
80
80
  /**
81
81
  * @desc Sends a message to all clients in the channel
@@ -83,7 +83,7 @@ class EventResponse extends abstractResponse_1.PondResponse {
83
83
  * @param payload - the payload to send
84
84
  */
85
85
  broadcast(event, payload) {
86
- __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(__classPrivateFieldGet(this, _EventResponse_event, "f").sender, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.BROADCAST, event, payload);
86
+ __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _EventResponse_event, "f").sender, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.BROADCAST, event, payload);
87
87
  return this;
88
88
  }
89
89
  /**
@@ -92,7 +92,7 @@ class EventResponse extends abstractResponse_1.PondResponse {
92
92
  * @param payload - the payload to send
93
93
  */
94
94
  broadcastFromUser(event, payload) {
95
- __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(__classPrivateFieldGet(this, _EventResponse_event, "f").sender, enums_1.ChannelReceiver.ALL_EXCEPT_SENDER, enums_1.ServerActions.BROADCAST, event, payload);
95
+ __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _EventResponse_event, "f").sender, enums_1.ChannelReceiver.ALL_EXCEPT_SENDER, enums_1.ServerActions.BROADCAST, event, payload);
96
96
  return this;
97
97
  }
98
98
  /**
@@ -102,7 +102,7 @@ class EventResponse extends abstractResponse_1.PondResponse {
102
102
  * @param userIds - the ids of the clients to send the message to
103
103
  */
104
104
  sendToUsers(event, payload, userIds) {
105
- __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(__classPrivateFieldGet(this, _EventResponse_event, "f").sender, userIds, enums_1.ServerActions.BROADCAST, event, payload);
105
+ __classPrivateFieldGet(this, _EventResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _EventResponse_event, "f").sender, userIds, enums_1.ServerActions.BROADCAST, event, payload);
106
106
  return this;
107
107
  }
108
108
  /**
package/client/channel.js CHANGED
@@ -10,23 +10,24 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _Channel_instances, _Channel_name, _Channel_joinParams, _Channel_receiver, _Channel_clientState, _Channel_joinState, _Channel_publisher, _Channel_queue, _Channel_presence, _Channel_presenceSub, _Channel_send, _Channel_publish, _Channel_subscribeToPresence, _Channel_init, _Channel_emptyQueue;
13
+ var _Channel_instances, _Channel_name, _Channel_queue, _Channel_presence, _Channel_publisher, _Channel_joinParams, _Channel_presenceSub, _Channel_receiver, _Channel_clientState, _Channel_joinState, _Channel_send, _Channel_publish, _Channel_subscribeToPresence, _Channel_init, _Channel_emptyQueue, _Channel_buildJoinMessage, _Channel_onMessage;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.Channel = void 0;
16
16
  const enums_1 = require("../enums");
17
+ const uuid_1 = require("../misc/uuid");
17
18
  const subject_1 = require("../subjects/subject");
18
19
  class Channel {
19
20
  constructor(publisher, clientState, name, receiver, params) {
20
21
  _Channel_instances.add(this);
21
22
  _Channel_name.set(this, void 0);
23
+ _Channel_queue.set(this, void 0);
24
+ _Channel_presence.set(this, void 0);
25
+ _Channel_publisher.set(this, void 0);
22
26
  _Channel_joinParams.set(this, void 0);
27
+ _Channel_presenceSub.set(this, void 0);
23
28
  _Channel_receiver.set(this, void 0);
24
29
  _Channel_clientState.set(this, void 0);
25
30
  _Channel_joinState.set(this, void 0);
26
- _Channel_publisher.set(this, void 0);
27
- _Channel_queue.set(this, void 0);
28
- _Channel_presence.set(this, void 0);
29
- _Channel_presenceSub.set(this, void 0);
30
31
  __classPrivateFieldSet(this, _Channel_name, name, "f");
31
32
  __classPrivateFieldSet(this, _Channel_queue, [], "f");
32
33
  __classPrivateFieldSet(this, _Channel_presence, [], "f");
@@ -50,12 +51,7 @@ class Channel {
50
51
  if (__classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.CLOSED) {
51
52
  throw new Error('This channel has been closed');
52
53
  }
53
- const joinMessage = {
54
- action: enums_1.ClientActions.JOIN_CHANNEL,
55
- channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
56
- event: enums_1.ClientActions.JOIN_CHANNEL,
57
- payload: __classPrivateFieldGet(this, _Channel_joinParams, "f"),
58
- };
54
+ const joinMessage = __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_buildJoinMessage).call(this);
59
55
  __classPrivateFieldGet(this, _Channel_joinState, "f").publish(enums_1.ChannelState.JOINING);
60
56
  if (__classPrivateFieldGet(this, _Channel_clientState, "f").value) {
61
57
  __classPrivateFieldGet(this, _Channel_publisher, "f").call(this, joinMessage);
@@ -69,9 +65,11 @@ class Channel {
69
65
  */
70
66
  leave() {
71
67
  const leaveMessage = {
68
+ addresses: enums_1.ChannelReceiver.ALL_USERS,
72
69
  action: enums_1.ClientActions.LEAVE_CHANNEL,
73
- channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
74
70
  event: enums_1.ClientActions.LEAVE_CHANNEL,
71
+ channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
72
+ requestId: (0, uuid_1.uuid)(),
75
73
  payload: {},
76
74
  };
77
75
  __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_publish).call(this, leaveMessage);
@@ -83,10 +81,8 @@ class Channel {
83
81
  * @param callback - The callback to call when a message is received.
84
82
  */
85
83
  onMessage(callback) {
86
- return __classPrivateFieldGet(this, _Channel_receiver, "f").subscribe((data) => {
87
- if (data.action !== enums_1.ServerActions.PRESENCE) {
88
- return callback(data.event, data.payload);
89
- }
84
+ return __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_onMessage).call(this, (event, message) => {
85
+ callback(event, message);
90
86
  });
91
87
  }
92
88
  /**
@@ -150,7 +146,8 @@ class Channel {
150
146
  * @param recipient - The clients to send the message to.
151
147
  */
152
148
  sendMessage(event, payload, recipient) {
153
- __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, event, payload, recipient);
149
+ const requestId = (0, uuid_1.uuid)();
150
+ __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, event, requestId, payload, recipient);
154
151
  }
155
152
  /**
156
153
  * @desc Sends a message to the server and waits for a response.
@@ -159,12 +156,15 @@ class Channel {
159
156
  * @param responseEvent - The event to wait for.
160
157
  */
161
158
  sendForResponse(sentEvent, payload, responseEvent) {
159
+ const requestId = (0, uuid_1.uuid)();
162
160
  return new Promise((resolve) => {
163
- const unsub = this.onMessageEvent(responseEvent, (message) => {
164
- resolve(message);
165
- unsub();
161
+ const unsub = __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_onMessage).call(this, (event, message, responseId) => {
162
+ if (event === responseEvent && requestId === responseId) {
163
+ resolve(message);
164
+ unsub();
165
+ }
166
166
  });
167
- __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, sentEvent, payload);
167
+ __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, sentEvent, requestId, payload);
168
168
  });
169
169
  }
170
170
  /**
@@ -173,7 +173,8 @@ class Channel {
173
173
  * @param payload - The message to send.
174
174
  */
175
175
  broadcastFrom(event, payload) {
176
- __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, event, payload, enums_1.ChannelReceiver.ALL_EXCEPT_SENDER);
176
+ const requestId = (0, uuid_1.uuid)();
177
+ __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, event, requestId, payload, enums_1.ChannelReceiver.ALL_EXCEPT_SENDER);
177
178
  }
178
179
  /**
179
180
  * @desc Broadcasts a message to the channel, including yourself.
@@ -181,7 +182,8 @@ class Channel {
181
182
  * @param payload - The message to send.
182
183
  */
183
184
  broadcast(event, payload) {
184
- __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, event, payload);
185
+ const requestId = (0, uuid_1.uuid)();
186
+ __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, event, requestId, payload);
185
187
  }
186
188
  /**
187
189
  * @desc Gets the current presence of the channel.
@@ -223,27 +225,16 @@ class Channel {
223
225
  callback(state === enums_1.ChannelState.JOINED || state === enums_1.ChannelState.STALLED);
224
226
  });
225
227
  }
226
- /**
227
- * @desc Gets the first response from the channel.
228
- * @param event - The event to monitor.
229
- */
230
- getFirstResponse(event) {
231
- return new Promise((resolve) => {
232
- const unsub = this.onMessageEvent(event, (message) => {
233
- resolve(message);
234
- unsub();
235
- });
236
- });
237
- }
238
228
  }
239
229
  exports.Channel = Channel;
240
- _Channel_name = new WeakMap(), _Channel_joinParams = new WeakMap(), _Channel_receiver = new WeakMap(), _Channel_clientState = new WeakMap(), _Channel_joinState = new WeakMap(), _Channel_publisher = new WeakMap(), _Channel_queue = new WeakMap(), _Channel_presence = new WeakMap(), _Channel_presenceSub = new WeakMap(), _Channel_instances = new WeakSet(), _Channel_send = function _Channel_send(event, payload, receivers = enums_1.ChannelReceiver.ALL_USERS) {
230
+ _Channel_name = new WeakMap(), _Channel_queue = new WeakMap(), _Channel_presence = new WeakMap(), _Channel_publisher = new WeakMap(), _Channel_joinParams = new WeakMap(), _Channel_presenceSub = new WeakMap(), _Channel_receiver = new WeakMap(), _Channel_clientState = new WeakMap(), _Channel_joinState = new WeakMap(), _Channel_instances = new WeakSet(), _Channel_send = function _Channel_send(event, requestId, payload, receivers = enums_1.ChannelReceiver.ALL_USERS) {
241
231
  const message = {
242
232
  action: enums_1.ClientActions.BROADCAST,
243
233
  channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
234
+ addresses: receivers,
235
+ requestId,
244
236
  event,
245
237
  payload,
246
- addresses: receivers,
247
238
  };
248
239
  __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_publish).call(this, message);
249
240
  }, _Channel_publish = function _Channel_publish(data) {
@@ -274,12 +265,7 @@ _Channel_name = new WeakMap(), _Channel_joinParams = new WeakMap(), _Channel_rec
274
265
  });
275
266
  const unsubStateChange = __classPrivateFieldGet(this, _Channel_clientState, "f").subscribe((state) => {
276
267
  if (state && __classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.STALLED) {
277
- const joinMessage = {
278
- action: enums_1.ClientActions.JOIN_CHANNEL,
279
- channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
280
- event: enums_1.ClientActions.JOIN_CHANNEL,
281
- payload: __classPrivateFieldGet(this, _Channel_joinParams, "f"),
282
- };
268
+ const joinMessage = __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_buildJoinMessage).call(this);
283
269
  __classPrivateFieldGet(this, _Channel_publisher, "f").call(this, joinMessage);
284
270
  }
285
271
  else if (!state && __classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.JOINED) {
@@ -301,4 +287,19 @@ _Channel_name = new WeakMap(), _Channel_joinParams = new WeakMap(), _Channel_rec
301
287
  __classPrivateFieldGet(this, _Channel_publisher, "f").call(this, message);
302
288
  });
303
289
  __classPrivateFieldSet(this, _Channel_queue, [], "f");
290
+ }, _Channel_buildJoinMessage = function _Channel_buildJoinMessage() {
291
+ return {
292
+ addresses: enums_1.ChannelReceiver.ALL_USERS,
293
+ action: enums_1.ClientActions.JOIN_CHANNEL,
294
+ event: enums_1.ClientActions.JOIN_CHANNEL,
295
+ payload: __classPrivateFieldGet(this, _Channel_joinParams, "f"),
296
+ channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
297
+ requestId: (0, uuid_1.uuid)(),
298
+ };
299
+ }, _Channel_onMessage = function _Channel_onMessage(callback) {
300
+ return __classPrivateFieldGet(this, _Channel_receiver, "f").subscribe((data) => {
301
+ if (data.action !== enums_1.ServerActions.PRESENCE) {
302
+ return callback(data.event, data.payload, data.requestId);
303
+ }
304
+ });
304
305
  };
@@ -13,6 +13,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var _Endpoint_instances, _Endpoint_middleware, _Endpoint_channels, _Endpoint_sockets, _Endpoint_sendMessage, _Endpoint_joinChannel, _Endpoint_execute, _Endpoint_handleMessage, _Endpoint_readMessage, _Endpoint_isObjectEmpty;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.Endpoint = void 0;
16
+ const zod_1 = require("zod");
16
17
  const middleware_1 = require("../abstracts/middleware");
17
18
  const enums_1 = require("../enums");
18
19
  const pondError_1 = require("../errors/pondError");
@@ -20,6 +21,8 @@ const joinRequest_1 = require("../lobby/joinRequest");
20
21
  const joinResponse_1 = require("../lobby/joinResponse");
21
22
  const lobby_1 = require("../lobby/lobby");
22
23
  const matcher_1 = require("../matcher/matcher");
24
+ const uuid_1 = require("../misc/uuid");
25
+ const schema_1 = require("../schema");
23
26
  class Endpoint {
24
27
  constructor() {
25
28
  _Endpoint_instances.add(this);
@@ -83,6 +86,7 @@ class Endpoint {
83
86
  const message = {
84
87
  event,
85
88
  payload,
89
+ requestId: (0, uuid_1.uuid)(),
86
90
  action: enums_1.ServerActions.BROADCAST,
87
91
  channelName: enums_1.SystemSender.ENDPOINT,
88
92
  };
@@ -125,8 +129,8 @@ class Endpoint {
125
129
  exports.Endpoint = Endpoint;
126
130
  _Endpoint_middleware = new WeakMap(), _Endpoint_channels = new WeakMap(), _Endpoint_sockets = new WeakMap(), _Endpoint_instances = new WeakSet(), _Endpoint_sendMessage = function _Endpoint_sendMessage(socket, message) {
127
131
  socket.send(JSON.stringify(message));
128
- }, _Endpoint_joinChannel = function _Endpoint_joinChannel(channel, socket, joinParams) {
129
- const cache = Object.assign(Object.assign({}, socket), { channelName: channel });
132
+ }, _Endpoint_joinChannel = function _Endpoint_joinChannel(channel, socket, joinParams, requestId) {
133
+ const cache = Object.assign(Object.assign({}, socket), { requestId, channelName: channel });
130
134
  __classPrivateFieldGet(this, _Endpoint_middleware, "f").run(cache, joinParams, () => {
131
135
  throw new pondError_1.EndpointError(`GatewayEngine: Channel ${channel} does not exist`, 404);
132
136
  });
@@ -142,7 +146,7 @@ _Endpoint_middleware = new WeakMap(), _Endpoint_channels = new WeakMap(), _Endpo
142
146
  }, _Endpoint_handleMessage = function _Endpoint_handleMessage(cache, message) {
143
147
  switch (message.action) {
144
148
  case enums_1.ClientActions.JOIN_CHANNEL:
145
- __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_joinChannel).call(this, message.channelName, cache, message.payload);
149
+ __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_joinChannel).call(this, message.channelName, cache, message.payload, message.requestId);
146
150
  break;
147
151
  case enums_1.ClientActions.LEAVE_CHANNEL:
148
152
  __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_execute).call(this, message.channelName, (channel) => {
@@ -162,34 +166,22 @@ _Endpoint_middleware = new WeakMap(), _Endpoint_channels = new WeakMap(), _Endpo
162
166
  event: enums_1.ErrorTypes.INVALID_MESSAGE,
163
167
  action: enums_1.ServerActions.ERROR,
164
168
  channelName: enums_1.SystemSender.ENDPOINT,
169
+ requestId: (0, uuid_1.uuid)(),
165
170
  payload: {},
166
171
  };
167
172
  try {
168
173
  const data = JSON.parse(message);
169
- if (!data.action) {
170
- errorMessage.payload = {
171
- message: 'No action provided',
172
- };
173
- }
174
- else if (!data.channelName) {
175
- errorMessage.payload = {
176
- message: 'No channel name provided',
177
- };
178
- }
179
- else if (!data.payload) {
174
+ const result = schema_1.clientMessageSchema.parse(data);
175
+ __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_handleMessage).call(this, cache, result);
176
+ }
177
+ catch (e) {
178
+ if (e instanceof zod_1.ZodError) {
180
179
  errorMessage.payload = {
181
- message: 'No payload provided',
180
+ message: e.message,
181
+ code: 400,
182
182
  };
183
183
  }
184
- if (!__classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_isObjectEmpty).call(this, errorMessage.payload)) {
185
- __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_sendMessage).call(this, cache.socket, errorMessage);
186
- }
187
- else {
188
- __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_handleMessage).call(this, cache, data);
189
- }
190
- }
191
- catch (e) {
192
- if (e instanceof SyntaxError) {
184
+ else if (e instanceof SyntaxError) {
193
185
  errorMessage.payload = {
194
186
  message: 'Invalid JSON',
195
187
  };
@@ -224,6 +216,11 @@ _Endpoint_middleware = new WeakMap(), _Endpoint_channels = new WeakMap(), _Endpo
224
216
  code: e.code,
225
217
  };
226
218
  }
219
+ else {
220
+ errorMessage.payload = {
221
+ message: 'Unknown error',
222
+ };
223
+ }
227
224
  __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_sendMessage).call(this, cache.socket, errorMessage);
228
225
  }
229
226
  }, _Endpoint_isObjectEmpty = function _Endpoint_isObjectEmpty(obj) {
@@ -16,9 +16,10 @@ exports.ConnectionResponse = void 0;
16
16
  const abstractResponse_1 = require("../abstracts/abstractResponse");
17
17
  const enums_1 = require("../enums");
18
18
  const pondError_1 = require("../errors/pondError");
19
+ const uuid_1 = require("../misc/uuid");
19
20
  class ConnectionResponse extends abstractResponse_1.PondResponse {
20
21
  constructor(webSocket, engine, clientId) {
21
- super();
22
+ super((0, uuid_1.uuid)());
22
23
  _ConnectionResponse_instances.add(this);
23
24
  _ConnectionResponse_webSocket.set(this, void 0);
24
25
  _ConnectionResponse_engine.set(this, void 0);
@@ -76,9 +77,10 @@ class ConnectionResponse extends abstractResponse_1.PondResponse {
76
77
  exports.ConnectionResponse = ConnectionResponse;
77
78
  _ConnectionResponse_webSocket = new WeakMap(), _ConnectionResponse_engine = new WeakMap(), _ConnectionResponse_clientId = new WeakMap(), _ConnectionResponse_executed = new WeakMap(), _ConnectionResponse_instances = new WeakSet(), _ConnectionResponse_sendMessage = function _ConnectionResponse_sendMessage(action, event, payload) {
78
79
  const message = {
79
- action,
80
80
  event,
81
+ action,
81
82
  payload,
83
+ requestId: this.requestId,
82
84
  channelName: enums_1.SystemSender.ENDPOINT,
83
85
  };
84
86
  __classPrivateFieldGet(this, _ConnectionResponse_webSocket, "f").send(JSON.stringify(message));
@@ -18,7 +18,7 @@ const enums_1 = require("../enums");
18
18
  const pondError_1 = require("../errors/pondError");
19
19
  class JoinResponse extends abstractResponse_1.PondResponse {
20
20
  constructor(user, engine) {
21
- super();
21
+ super(user.requestId);
22
22
  _JoinResponse_instances.add(this);
23
23
  _JoinResponse_user.set(this, void 0);
24
24
  _JoinResponse_engine.set(this, void 0);
@@ -44,6 +44,7 @@ class JoinResponse extends abstractResponse_1.PondResponse {
44
44
  action: enums_1.ServerActions.SYSTEM,
45
45
  channelName: __classPrivateFieldGet(this, _JoinResponse_engine, "f").name,
46
46
  event: enums_1.Events.ACKNOWLEDGE,
47
+ requestId: this.requestId,
47
48
  payload: {},
48
49
  };
49
50
  __classPrivateFieldGet(this, _JoinResponse_user, "f").socket.send(JSON.stringify(acknowledgement));
@@ -67,6 +68,7 @@ class JoinResponse extends abstractResponse_1.PondResponse {
67
68
  },
68
69
  channelName: __classPrivateFieldGet(this, _JoinResponse_engine, "f").name,
69
70
  action: enums_1.ServerActions.ERROR,
71
+ requestId: this.requestId,
70
72
  };
71
73
  __classPrivateFieldGet(this, _JoinResponse_user, "f").socket.send(JSON.stringify(errorMessage));
72
74
  return this;
@@ -79,7 +81,7 @@ class JoinResponse extends abstractResponse_1.PondResponse {
79
81
  */
80
82
  send(event, payload, assigns) {
81
83
  this.accept(assigns);
82
- __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(enums_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId], enums_1.ServerActions.SYSTEM, event, payload);
84
+ __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(this.requestId, enums_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId], enums_1.ServerActions.SYSTEM, event, payload);
83
85
  return this;
84
86
  }
85
87
  /**
@@ -88,7 +90,7 @@ class JoinResponse extends abstractResponse_1.PondResponse {
88
90
  * @param payload - the payload to send
89
91
  */
90
92
  broadcast(event, payload) {
91
- __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.BROADCAST, event, payload);
93
+ __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.BROADCAST, event, payload);
92
94
  return this;
93
95
  }
94
96
  /**
@@ -97,7 +99,7 @@ class JoinResponse extends abstractResponse_1.PondResponse {
97
99
  * @param payload - the payload to send
98
100
  */
99
101
  broadcastFromUser(event, payload) {
100
- __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, enums_1.ChannelReceiver.ALL_EXCEPT_SENDER, enums_1.ServerActions.BROADCAST, event, payload);
102
+ __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, enums_1.ChannelReceiver.ALL_EXCEPT_SENDER, enums_1.ServerActions.BROADCAST, event, payload);
101
103
  return this;
102
104
  }
103
105
  /**
@@ -107,7 +109,7 @@ class JoinResponse extends abstractResponse_1.PondResponse {
107
109
  * @param userIds - the ids of the clients to send the message to
108
110
  */
109
111
  sendToUsers(event, payload, userIds) {
110
- __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, userIds, enums_1.ServerActions.BROADCAST, event, payload);
112
+ __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, userIds, enums_1.ServerActions.BROADCAST, event, payload);
111
113
  return this;
112
114
  }
113
115
  /**
package/lobby/lobby.js CHANGED
@@ -16,6 +16,7 @@ exports.PondChannel = exports.LobbyEngine = void 0;
16
16
  const middleware_1 = require("../abstracts/middleware");
17
17
  const channel_1 = require("../channel/channel");
18
18
  const enums_1 = require("../enums");
19
+ const uuid_1 = require("../misc/uuid");
19
20
  class LobbyEngine {
20
21
  constructor() {
21
22
  _LobbyEngine_channels.set(this, void 0);
@@ -68,11 +69,11 @@ class LobbyEngine {
68
69
  if (!channel) {
69
70
  throw new Error(`GatewayEngine: Channel ${channelName} does not exist`);
70
71
  }
71
- channel.sendMessage(enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.SYSTEM, event, payload);
72
+ channel.sendMessage((0, uuid_1.uuid)(), enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.SYSTEM, event, payload);
72
73
  }
73
74
  else {
74
75
  __classPrivateFieldGet(this, _LobbyEngine_channels, "f").forEach((channel) => {
75
- channel.sendMessage(enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.SYSTEM, event, payload);
76
+ channel.sendMessage((0, uuid_1.uuid)(), enums_1.SystemSender.CHANNEL, enums_1.ChannelReceiver.ALL_USERS, enums_1.ServerActions.SYSTEM, event, payload);
76
77
  });
77
78
  }
78
79
  }
package/misc/uuid.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uuid = void 0;
4
+ function uuid() {
5
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
6
+ .replace(/[xy]/g, (c) => {
7
+ const r = Math.random() * 16 | 0;
8
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
9
+ return v.toString(16);
10
+ });
11
+ }
12
+ exports.uuid = uuid;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eleven-am/pondsocket",
3
- "version": "0.1.125",
3
+ "version": "0.1.126",
4
4
  "description": "PondSocket is a fast simple socket server",
5
5
  "keywords": [
6
6
  "socket",
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.PresenceEngine = void 0;
16
16
  const enums_1 = require("../enums");
17
17
  const pondError_1 = require("../errors/pondError");
18
+ const uuid_1 = require("../misc/uuid");
18
19
  class PresenceEngine {
19
20
  constructor(channel) {
20
21
  _PresenceEngine_instances.add(this);
@@ -107,5 +108,5 @@ _PresenceEngine_presenceMap = new WeakMap(), _PresenceEngine_channel = new WeakM
107
108
  if (recipients.length === 0) {
108
109
  return;
109
110
  }
110
- __classPrivateFieldGet(this, _PresenceEngine_channel, "f").sendMessage(enums_1.SystemSender.CHANNEL, recipients, enums_1.ServerActions.PRESENCE, event, payload);
111
+ __classPrivateFieldGet(this, _PresenceEngine_channel, "f").sendMessage((0, uuid_1.uuid)(), enums_1.SystemSender.CHANNEL, recipients, enums_1.ServerActions.PRESENCE, event, payload);
111
112
  };
package/schema.js ADDED
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clientMessageSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const enums_1 = require("./enums");
6
+ exports.clientMessageSchema = zod_1.z.object({
7
+ event: zod_1.z.string(),
8
+ requestId: zod_1.z.string(),
9
+ channelName: zod_1.z.string(),
10
+ payload: zod_1.z.record(zod_1.z.any()),
11
+ action: zod_1.z.nativeEnum(enums_1.ClientActions),
12
+ addresses: zod_1.z.union([zod_1.z.nativeEnum(enums_1.ChannelReceiver), zod_1.z.array(zod_1.z.string())]).optional(),
13
+ });