@eleven-am/pondsocket 0.1.124 → 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
- constructor(publisher, clientState, name, receiver, params = {}) {
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");
@@ -37,6 +38,12 @@ class Channel {
37
38
  __classPrivateFieldSet(this, _Channel_joinState, new subject_1.SimpleBehaviorSubject(enums_1.ChannelState.IDLE), "f");
38
39
  __classPrivateFieldSet(this, _Channel_presenceSub, __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_init).call(this, receiver), "f");
39
40
  }
41
+ /**
42
+ * @desc Gets the current connection state of the channel.
43
+ */
44
+ get channelState() {
45
+ return __classPrivateFieldGet(this, _Channel_joinState, "f").value;
46
+ }
40
47
  /**
41
48
  * @desc Connects to the channel.
42
49
  */
@@ -44,12 +51,7 @@ class Channel {
44
51
  if (__classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.CLOSED) {
45
52
  throw new Error('This channel has been closed');
46
53
  }
47
- const joinMessage = {
48
- action: enums_1.ClientActions.JOIN_CHANNEL,
49
- channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
50
- event: enums_1.ClientActions.JOIN_CHANNEL,
51
- payload: __classPrivateFieldGet(this, _Channel_joinParams, "f"),
52
- };
54
+ const joinMessage = __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_buildJoinMessage).call(this);
53
55
  __classPrivateFieldGet(this, _Channel_joinState, "f").publish(enums_1.ChannelState.JOINING);
54
56
  if (__classPrivateFieldGet(this, _Channel_clientState, "f").value) {
55
57
  __classPrivateFieldGet(this, _Channel_publisher, "f").call(this, joinMessage);
@@ -63,9 +65,11 @@ class Channel {
63
65
  */
64
66
  leave() {
65
67
  const leaveMessage = {
68
+ addresses: enums_1.ChannelReceiver.ALL_USERS,
66
69
  action: enums_1.ClientActions.LEAVE_CHANNEL,
67
- channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
68
70
  event: enums_1.ClientActions.LEAVE_CHANNEL,
71
+ channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
72
+ requestId: (0, uuid_1.uuid)(),
69
73
  payload: {},
70
74
  };
71
75
  __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_publish).call(this, leaveMessage);
@@ -77,10 +81,8 @@ class Channel {
77
81
  * @param callback - The callback to call when a message is received.
78
82
  */
79
83
  onMessage(callback) {
80
- return __classPrivateFieldGet(this, _Channel_receiver, "f").subscribe((data) => {
81
- if (data.action !== enums_1.ServerActions.PRESENCE) {
82
- return callback(data.event, data.payload);
83
- }
84
+ return __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_onMessage).call(this, (event, message) => {
85
+ callback(event, message);
84
86
  });
85
87
  }
86
88
  /**
@@ -144,7 +146,26 @@ class Channel {
144
146
  * @param recipient - The clients to send the message to.
145
147
  */
146
148
  sendMessage(event, payload, recipient) {
147
- __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);
151
+ }
152
+ /**
153
+ * @desc Sends a message to the server and waits for a response.
154
+ * @param sentEvent - The event to send.
155
+ * @param payload - The message to send.
156
+ * @param responseEvent - The event to wait for.
157
+ */
158
+ sendForResponse(sentEvent, payload, responseEvent) {
159
+ const requestId = (0, uuid_1.uuid)();
160
+ return new Promise((resolve) => {
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
+ });
167
+ __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, sentEvent, requestId, payload);
168
+ });
148
169
  }
149
170
  /**
150
171
  * @desc Broadcasts a message to every other client in the channel except yourself.
@@ -152,7 +173,8 @@ class Channel {
152
173
  * @param payload - The message to send.
153
174
  */
154
175
  broadcastFrom(event, payload) {
155
- __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);
156
178
  }
157
179
  /**
158
180
  * @desc Broadcasts a message to the channel, including yourself.
@@ -160,13 +182,8 @@ class Channel {
160
182
  * @param payload - The message to send.
161
183
  */
162
184
  broadcast(event, payload) {
163
- __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, event, payload);
164
- }
165
- /**
166
- * @desc Gets the current connection state of the channel.
167
- */
168
- get channelState() {
169
- return __classPrivateFieldGet(this, _Channel_joinState, "f").value;
185
+ const requestId = (0, uuid_1.uuid)();
186
+ __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_send).call(this, event, requestId, payload);
170
187
  }
171
188
  /**
172
189
  * @desc Gets the current presence of the channel.
@@ -182,11 +199,23 @@ class Channel {
182
199
  return __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_subscribeToPresence).call(this, (_event, payload) => callback(payload.presence));
183
200
  }
184
201
  /**
185
- * @desc Gets the current connection state of the channel.
202
+ * @desc Checks if the channel is connected.
186
203
  */
187
204
  isConnected() {
188
205
  return __classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.JOINED || __classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.STALLED;
189
206
  }
207
+ /**
208
+ * @desc Checks if the channel is stalled.
209
+ */
210
+ isStalled() {
211
+ return __classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.STALLED;
212
+ }
213
+ /**
214
+ * @desc Checks if the channel is closed.
215
+ */
216
+ isClosed() {
217
+ return __classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.CLOSED;
218
+ }
190
219
  /**
191
220
  * @desc Monitors the connection state of the channel.
192
221
  * @param callback - The callback to call when the connection state changes.
@@ -198,13 +227,14 @@ class Channel {
198
227
  }
199
228
  }
200
229
  exports.Channel = Channel;
201
- _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) {
202
231
  const message = {
203
232
  action: enums_1.ClientActions.BROADCAST,
204
233
  channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
234
+ addresses: receivers,
235
+ requestId,
205
236
  event,
206
237
  payload,
207
- addresses: receivers,
208
238
  };
209
239
  __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_publish).call(this, message);
210
240
  }, _Channel_publish = function _Channel_publish(data) {
@@ -235,12 +265,7 @@ _Channel_name = new WeakMap(), _Channel_joinParams = new WeakMap(), _Channel_rec
235
265
  });
236
266
  const unsubStateChange = __classPrivateFieldGet(this, _Channel_clientState, "f").subscribe((state) => {
237
267
  if (state && __classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.STALLED) {
238
- const joinMessage = {
239
- action: enums_1.ClientActions.JOIN_CHANNEL,
240
- channelName: __classPrivateFieldGet(this, _Channel_name, "f"),
241
- event: enums_1.ClientActions.JOIN_CHANNEL,
242
- payload: __classPrivateFieldGet(this, _Channel_joinParams, "f"),
243
- };
268
+ const joinMessage = __classPrivateFieldGet(this, _Channel_instances, "m", _Channel_buildJoinMessage).call(this);
244
269
  __classPrivateFieldGet(this, _Channel_publisher, "f").call(this, joinMessage);
245
270
  }
246
271
  else if (!state && __classPrivateFieldGet(this, _Channel_joinState, "f").value === enums_1.ChannelState.JOINED) {
@@ -261,6 +286,20 @@ _Channel_name = new WeakMap(), _Channel_joinParams = new WeakMap(), _Channel_rec
261
286
  .forEach((message) => {
262
287
  __classPrivateFieldGet(this, _Channel_publisher, "f").call(this, message);
263
288
  });
264
- __classPrivateFieldGet(this, _Channel_joinState, "f").publish(enums_1.ChannelState.JOINED);
265
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
+ });
266
305
  };
package/client.js CHANGED
@@ -85,7 +85,7 @@ class PondClient {
85
85
  return __classPrivateFieldGet(this, _PondClient_channels, "f")[name];
86
86
  }
87
87
  const publisher = __classPrivateFieldGet(this, _PondClient_instances, "m", _PondClient_createPublisher).call(this);
88
- const channel = new channel_1.Channel(publisher, this._connectionState, name, this._broadcaster, params);
88
+ const channel = new channel_1.Channel(publisher, this._connectionState, name, this._broadcaster, params || {});
89
89
  __classPrivateFieldGet(this, _PondClient_channels, "f")[name] = channel;
90
90
  return channel;
91
91
  }
@@ -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.124",
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
+ });
package/types.d.ts CHANGED
@@ -380,6 +380,14 @@ export declare class ClientChannel<EventType extends PondEvenType = PondEvenType
380
380
  */
381
381
  sendMessage <Key extends keyof EventType> (event: Key, payload: EventType[Key], recipient: string[]): void;
382
382
 
383
+ /**
384
+ * @desc Sends a message to the server and waits for a response.
385
+ * @param sentEvent - The event to send.
386
+ * @param payload - The message to send.
387
+ * @param responseEvent - The event to wait for.
388
+ */
389
+ sendForResponse <ResponseKey extends keyof EventType, SentKey extends keyof EventType> (sentEvent: SentKey, payload: EventType[SentKey], responseEvent: ResponseKey): Promise<EventType[ResponseKey]>;
390
+
383
391
  /**
384
392
  * @desc Broadcasts a message to every other client in the channel except yourself.
385
393
  * @param event - The event to send.
@@ -406,15 +414,31 @@ export declare class ClientChannel<EventType extends PondEvenType = PondEvenType
406
414
  onUsersChange (callback: (users: PondPresence[]) => void): Unsubscribe;
407
415
 
408
416
  /**
409
- * @desc Gets the current connection state of the channel.
417
+ * @desc Checks if the channel is connected.
410
418
  */
411
419
  isConnected (): boolean;
412
420
 
421
+ /**
422
+ * @desc Checks if the channel is stalled.
423
+ */
424
+ isStalled (): boolean;
425
+
426
+ /**
427
+ * @desc Checks if the channel is closed.
428
+ */
429
+ isClosed (): boolean;
430
+
413
431
  /**
414
432
  * @desc Monitors the connection state of the channel.
415
433
  * @param callback - The callback to call when the connection state changes.
416
434
  */
417
435
  onConnectionChange (callback: (connected: boolean) => void): Unsubscribe;
436
+
437
+ /**
438
+ * @desc Gets the first response from the channel.
439
+ * @param event - The event to monitor.
440
+ */
441
+ getFirstResponse <Key extends keyof EventType> (event: Key): Promise<EventType[Key]>;
418
442
  }
419
443
 
420
444
  declare class Endpoint {