@eleven-am/pondsocket 0.1.141 → 0.1.143

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.
@@ -12,19 +12,36 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.createEndpointEngine = void 0;
15
16
  const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
16
17
  const superwstest_1 = __importDefault(require("superwstest"));
17
18
  const pondSocket_1 = require("../server/pondSocket");
18
19
  /* eslint-disable line-comment-position, no-inline-comments */
20
+ const createEndpointEngine = (socket) => ({
21
+ createChannel: jest.fn(),
22
+ listConnections: jest.fn(),
23
+ getClients: jest.fn(),
24
+ broadcast: jest.fn(),
25
+ closeConnection: jest.fn(),
26
+ manageSocket: jest.fn(),
27
+ getUser: () => socket,
28
+ subscribeTo: jest.fn(),
29
+ unsubscribeFrom: jest.fn(),
30
+ });
31
+ exports.createEndpointEngine = createEndpointEngine;
19
32
  describe('endpoint', () => {
20
33
  let socket;
21
34
  let server;
22
35
  beforeEach((done) => {
23
36
  socket = new pondSocket_1.PondSocket();
24
- server = socket.listen(3000, 'localhost', done);
37
+ server = socket.listen(3000, 'localhost', () => {
38
+ done();
39
+ });
25
40
  });
26
41
  afterEach((done) => {
27
- server.close(done);
42
+ server.close(() => {
43
+ done();
44
+ });
28
45
  });
29
46
  it('should be able to close a single socket', () => __awaiter(void 0, void 0, void 0, function* () {
30
47
  let count = 0;
@@ -37,7 +54,7 @@ describe('endpoint', () => {
37
54
  }, 1000);
38
55
  }
39
56
  else {
40
- res.reject();
57
+ res.decline();
41
58
  }
42
59
  });
43
60
  yield (0, superwstest_1.default)(server)
@@ -51,11 +68,11 @@ describe('endpoint', () => {
51
68
  const endpoint = socket.createEndpoint('/api/:room', (req, res) => {
52
69
  if (req.params.room === 'socket') {
53
70
  res.accept();
54
- const connections = endpoint.listConnections();
71
+ const connections = endpoint.getClients();
55
72
  expect(connections).toHaveLength(1);
56
73
  }
57
74
  else {
58
- res.reject();
75
+ res.decline();
59
76
  }
60
77
  });
61
78
  yield (0, superwstest_1.default)(server)
@@ -67,7 +84,7 @@ describe('endpoint', () => {
67
84
  socket.createEndpoint('/api/:path', (req, res) => {
68
85
  count++;
69
86
  expect(req.params.path).toBe('socket');
70
- res.reject();
87
+ res.decline();
71
88
  });
72
89
  yield (0, superwstest_1.default)(server)
73
90
  .ws('/api/socket')
@@ -88,12 +105,12 @@ describe('endpoint', () => {
88
105
  const endpoint = socket.createEndpoint('/api/:room', (req, res) => {
89
106
  if (req.params.room === 'socket') {
90
107
  res.accept();
91
- const connections = endpoint.listConnections();
108
+ const connections = endpoint.getClients();
92
109
  expect(connections).toHaveLength(1);
93
110
  endpoint.broadcast('TEST', { test: 'test' });
94
111
  }
95
112
  else {
96
- res.reject();
113
+ res.decline();
97
114
  }
98
115
  });
99
116
  yield (0, superwstest_1.default)(server)
@@ -120,12 +137,12 @@ describe('endpoint', () => {
120
137
  res.accept();
121
138
  }
122
139
  else {
123
- res.reject();
140
+ res.decline();
124
141
  }
125
142
  });
126
143
  endpoint.createChannel('/test/:room', (req, res) => {
127
144
  expect(req.event.params.room).toBeDefined();
128
- res.accept({
145
+ res.accept().assign({
129
146
  assigns: {
130
147
  status: 'online',
131
148
  },
@@ -162,7 +179,7 @@ describe('endpoint', () => {
162
179
  });
163
180
  endpoint.createChannel('/test/:room', (req, res) => {
164
181
  expect(req.event.params.room).toBeDefined();
165
- res.reject('Something went wrong');
182
+ res.decline('Something went wrong');
166
183
  });
167
184
  yield (0, superwstest_1.default)(server)
168
185
  .ws('/api/socket')
@@ -212,7 +229,7 @@ describe('endpoint', () => {
212
229
  }));
213
230
  it('should throw an error if accept, reject / send is called more than once', () => __awaiter(void 0, void 0, void 0, function* () {
214
231
  socket.createEndpoint('/api/:room', (_, res) => {
215
- res.send('hello', {
232
+ res.reply('hello', {
216
233
  test: 'test',
217
234
  });
218
235
  expect(() => res.accept()).toThrowError('Cannot execute response more than once');
@@ -244,7 +261,7 @@ describe('endpoint', () => {
244
261
  res.accept();
245
262
  });
246
263
  channel.onEvent('echo', (req, res) => {
247
- res.send('echo', req.event.payload);
264
+ res.reply('echo', req.event.payload);
248
265
  });
249
266
  channel.onEvent('broadcast', (req) => {
250
267
  channel.broadcast('broadcast', Object.assign(Object.assign({}, req.event.payload), { broadcast: true }));
@@ -10,24 +10,26 @@ 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 _ConnectionResponse_instances, _ConnectionResponse_webSocket, _ConnectionResponse_engine, _ConnectionResponse_clientId, _ConnectionResponse_executed, _ConnectionResponse_sendMessage, _ConnectionResponse_performChecks;
13
+ var _ConnectionResponse_instances, _ConnectionResponse_webSocket, _ConnectionResponse_engine, _ConnectionResponse_clientId, _ConnectionResponse_executed, _ConnectionResponse_assigns, _ConnectionResponse_requestId, _ConnectionResponse_sendMessage, _ConnectionResponse_performChecks;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.ConnectionResponse = void 0;
16
16
  const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
17
- const abstractResponse_1 = require("../abstracts/abstractResponse");
18
17
  const pondError_1 = require("../errors/pondError");
19
- class ConnectionResponse extends abstractResponse_1.PondResponse {
18
+ class ConnectionResponse {
20
19
  constructor(webSocket, engine, clientId) {
21
- super((0, pondsocket_common_1.uuid)());
22
20
  _ConnectionResponse_instances.add(this);
23
21
  _ConnectionResponse_webSocket.set(this, void 0);
24
22
  _ConnectionResponse_engine.set(this, void 0);
25
23
  _ConnectionResponse_clientId.set(this, void 0);
26
24
  _ConnectionResponse_executed.set(this, void 0);
25
+ _ConnectionResponse_assigns.set(this, void 0);
26
+ _ConnectionResponse_requestId.set(this, void 0);
27
27
  __classPrivateFieldSet(this, _ConnectionResponse_webSocket, webSocket, "f");
28
28
  __classPrivateFieldSet(this, _ConnectionResponse_engine, engine, "f");
29
29
  __classPrivateFieldSet(this, _ConnectionResponse_clientId, clientId, "f");
30
+ __classPrivateFieldSet(this, _ConnectionResponse_assigns, {}, "f");
30
31
  __classPrivateFieldSet(this, _ConnectionResponse_executed, false, "f");
32
+ __classPrivateFieldSet(this, _ConnectionResponse_requestId, (0, pondsocket_common_1.uuid)(), "f");
31
33
  }
32
34
  /**
33
35
  * @desc Whether the server has responded to the request
@@ -36,24 +38,40 @@ class ConnectionResponse extends abstractResponse_1.PondResponse {
36
38
  return __classPrivateFieldGet(this, _ConnectionResponse_executed, "f");
37
39
  }
38
40
  /**
39
- * @desc Accepts the request and optionally assigns data to the client
40
- * @param assigns - the data to assign to the client
41
+ * @desc Assigns data to the user
42
+ * @param assigns - the data to assign
41
43
  */
42
- accept(assigns) {
44
+ assign(assigns) {
45
+ if (!__classPrivateFieldGet(this, _ConnectionResponse_executed, "f")) {
46
+ __classPrivateFieldSet(this, _ConnectionResponse_assigns, Object.assign(Object.assign({}, __classPrivateFieldGet(this, _ConnectionResponse_assigns, "f")), assigns), "f");
47
+ }
48
+ else {
49
+ const user = __classPrivateFieldGet(this, _ConnectionResponse_engine, "f").getUser(__classPrivateFieldGet(this, _ConnectionResponse_clientId, "f"));
50
+ user.assigns = Object.assign(Object.assign({}, user.assigns), assigns);
51
+ }
52
+ return this;
53
+ }
54
+ /**
55
+ * @desc Accepts the join request
56
+ */
57
+ accept() {
43
58
  __classPrivateFieldGet(this, _ConnectionResponse_instances, "m", _ConnectionResponse_performChecks).call(this);
44
59
  const cache = {
45
60
  clientId: __classPrivateFieldGet(this, _ConnectionResponse_clientId, "f"),
46
61
  socket: __classPrivateFieldGet(this, _ConnectionResponse_webSocket, "f"),
47
- assigns: assigns || {},
62
+ assigns: __classPrivateFieldGet(this, _ConnectionResponse_assigns, "f"),
63
+ subscriptions: new Map(),
64
+ pendingSubscriptions: new Set(),
48
65
  };
49
66
  __classPrivateFieldGet(this, _ConnectionResponse_engine, "f").manageSocket(cache);
67
+ return this;
50
68
  }
51
69
  /**
52
70
  * @desc Rejects the request with the given error message
53
71
  * @param message - the error message
54
72
  * @param errorCode - the error code
55
73
  */
56
- reject(message, errorCode) {
74
+ decline(message, errorCode) {
57
75
  __classPrivateFieldGet(this, _ConnectionResponse_instances, "m", _ConnectionResponse_performChecks).call(this);
58
76
  const payload = {
59
77
  message: message || 'Unauthorized connection',
@@ -66,20 +84,36 @@ class ConnectionResponse extends abstractResponse_1.PondResponse {
66
84
  * @desc Emits a direct message to the client
67
85
  * @param event - the event name
68
86
  * @param payload - the payload to send
69
- * @param assigns - the data to assign to the client
70
87
  */
71
- send(event, payload, assigns) {
72
- this.accept(assigns);
88
+ reply(event, payload) {
89
+ __classPrivateFieldGet(this, _ConnectionResponse_instances, "m", _ConnectionResponse_performChecks).call(this);
73
90
  __classPrivateFieldGet(this, _ConnectionResponse_instances, "m", _ConnectionResponse_sendMessage).call(this, pondsocket_common_1.ServerActions.BROADCAST, event, payload);
91
+ return this;
92
+ }
93
+ /**
94
+ * @desc Subscribes the client to a channel
95
+ * @param channel - the channel to subscribe to
96
+ */
97
+ subscribeTo(channel) {
98
+ __classPrivateFieldGet(this, _ConnectionResponse_engine, "f").subscribeTo(__classPrivateFieldGet(this, _ConnectionResponse_clientId, "f"), channel);
99
+ return this;
100
+ }
101
+ /**
102
+ * @desc Unsubscribes the client from a channel
103
+ * @param channel - the channel to unsubscribe from
104
+ */
105
+ unsubscribeFrom(channel) {
106
+ __classPrivateFieldGet(this, _ConnectionResponse_engine, "f").unsubscribeFrom(__classPrivateFieldGet(this, _ConnectionResponse_clientId, "f"), channel);
107
+ return this;
74
108
  }
75
109
  }
76
110
  exports.ConnectionResponse = ConnectionResponse;
77
- _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) {
111
+ _ConnectionResponse_webSocket = new WeakMap(), _ConnectionResponse_engine = new WeakMap(), _ConnectionResponse_clientId = new WeakMap(), _ConnectionResponse_executed = new WeakMap(), _ConnectionResponse_assigns = new WeakMap(), _ConnectionResponse_requestId = new WeakMap(), _ConnectionResponse_instances = new WeakSet(), _ConnectionResponse_sendMessage = function _ConnectionResponse_sendMessage(action, event, payload) {
78
112
  const message = {
79
113
  event,
80
114
  action,
81
115
  payload,
82
- requestId: this.requestId,
116
+ requestId: __classPrivateFieldGet(this, _ConnectionResponse_requestId, "f"),
83
117
  channelName: pondsocket_common_1.SystemSender.ENDPOINT,
84
118
  };
85
119
  __classPrivateFieldGet(this, _ConnectionResponse_webSocket, "f").send(JSON.stringify(message));
@@ -1,18 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMockSocket = void 0;
3
4
  const joinRequest_1 = require("./joinRequest");
4
5
  const eventResponse_test_1 = require("../channel/eventResponse.test");
5
- const createMockSocket = (params = {}) => {
6
- const channelEngine = (0, eventResponse_test_1.createChannelEngine)();
6
+ const createMockSocket = () => {
7
+ const { channelEngine } = (0, eventResponse_test_1.createChannelEngine)();
7
8
  const socket = {
8
9
  clientId: 'sender',
9
10
  assigns: { assign: 'assign' },
10
- requestId: 'requestId',
11
11
  channelName: 'channel',
12
+ requestId: 'requestId',
13
+ subscriptions: new Map(),
14
+ pendingSubscriptions: new Set(),
12
15
  socket: {
13
16
  send: jest.fn(),
14
17
  },
15
18
  };
19
+ return {
20
+ channelEngine,
21
+ socket,
22
+ };
23
+ };
24
+ exports.createMockSocket = createMockSocket;
25
+ const createJoinRequest = (params = {}) => {
26
+ const { channelEngine, socket } = (0, exports.createMockSocket)();
16
27
  const request = new joinRequest_1.JoinRequest(socket, params, channelEngine);
17
28
  return {
18
29
  channelEngine,
@@ -22,15 +33,15 @@ const createMockSocket = (params = {}) => {
22
33
  };
23
34
  describe('JoinRequest', () => {
24
35
  it('should create a new PondChannelResponse', () => {
25
- const { request } = createMockSocket();
36
+ const { request } = createJoinRequest();
26
37
  expect(request).toBeDefined();
27
38
  });
28
39
  it('should return the join params', () => {
29
- const { request } = createMockSocket({ params: 'params' });
40
+ const { request } = createJoinRequest({ params: 'params' });
30
41
  expect(request.joinParams).toEqual({ params: 'params' });
31
42
  });
32
43
  it('should return the user data', () => {
33
- const { request } = createMockSocket();
44
+ const { request } = createJoinRequest();
34
45
  expect(request.user).toEqual({
35
46
  id: 'sender',
36
47
  assigns: { assign: 'assign' },
@@ -1,19 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
4
+ const JoinRequest_test_1 = require("./JoinRequest.test");
4
5
  const joinResponse_1 = require("./joinResponse");
5
- const eventResponse_test_1 = require("../channel/eventResponse.test");
6
6
  const createPondResponse = () => {
7
- const channelEngine = (0, eventResponse_test_1.createChannelEngine)();
8
- const socket = {
9
- clientId: 'sender',
10
- assigns: { assign: 'assign' },
11
- channelName: 'channel',
12
- requestId: 'requestId',
13
- socket: {
14
- send: jest.fn(),
15
- },
16
- };
7
+ const { channelEngine, socket } = (0, JoinRequest_test_1.createMockSocket)();
17
8
  const response = new joinResponse_1.JoinResponse(socket, channelEngine);
18
9
  return {
19
10
  channelEngine,
@@ -39,7 +30,7 @@ describe('JoinResponse', () => {
39
30
  const { response, channelEngine, socket } = createPondResponse();
40
31
  // spy on the channelEngine to see if the user was added
41
32
  jest.spyOn(channelEngine, 'addUser');
42
- response.reject();
33
+ response.decline();
43
34
  // check if the response was sent
44
35
  expect(channelEngine.addUser).not.toHaveBeenCalled();
45
36
  expect(channelEngine.getUserData(socket.clientId)).toBeUndefined();
@@ -61,9 +52,12 @@ describe('JoinResponse', () => {
61
52
  const { response, channelEngine, socket } = createPondResponse();
62
53
  // spy on the channelEngine to see if the user was added
63
54
  jest.spyOn(channelEngine, 'addUser');
64
- response.send('POND_MESSAGE', { message: 'message' });
65
- // check if the response was sent
55
+ response
56
+ .accept()
57
+ .reply('POND_MESSAGE', { message: 'message' })
58
+ .assign({ assign: 'assign' });
66
59
  expect(channelEngine.addUser).toHaveBeenCalled();
60
+ // check if the response was sent
67
61
  expect(channelEngine.getUserData(socket.clientId)).toStrictEqual({
68
62
  assigns: {
69
63
  assign: 'assign',
@@ -98,27 +92,28 @@ describe('JoinResponse', () => {
98
92
  const { response, channelEngine } = createPondResponse();
99
93
  // spy on the channelEngine to see if any messages were published
100
94
  const broadcast = jest.spyOn(channelEngine, 'sendMessage');
95
+ const receiver = jest.fn();
101
96
  // add a second user to the channel
102
- channelEngine.addUser('user2', { assign: 'assign' }, () => { });
97
+ channelEngine.addUser('user2', { assign: 'assign' }, receiver);
103
98
  // send a message to a single user
104
99
  // this is because the sender does not exist in the channel yet
105
- expect(() => response.sendToUsers('hello_everyone', { message: 'hello' }, ['user2'])).toThrow();
100
+ expect(() => response.broadcastTo('hello_everyone', { message: 'hello' }, ['user2'])).toThrow();
106
101
  // clear the spy
107
102
  broadcast.mockClear();
108
103
  // add the sender to the channel by using the response.accept() method
109
- response.accept().sendToUsers('hello_everyone', { message: 'hello' }, ['user2']);
104
+ response.accept().broadcastTo('hello_everyone', { message: 'hello' }, ['user2']);
110
105
  // check if the message was sent
111
- expect(broadcast).toHaveBeenCalledWith('requestId', 'sender', ['user2'], pondsocket_common_1.ServerActions.BROADCAST, 'hello_everyone', { message: 'hello' });
106
+ expect(broadcast).toHaveBeenCalledWith('sender', ['user2'], pondsocket_common_1.ServerActions.BROADCAST, 'hello_everyone', { message: 'hello' }, 'requestId');
112
107
  // clear the spy
113
108
  broadcast.mockClear();
114
109
  // send a message to all users
115
110
  response.broadcast('hello_everyone', { message: 'hello' });
116
- expect(broadcast).toHaveBeenCalledWith('requestId', 'sender', pondsocket_common_1.ChannelReceiver.ALL_USERS, pondsocket_common_1.ServerActions.BROADCAST, 'hello_everyone', { message: 'hello' });
111
+ expect(broadcast).toHaveBeenCalledWith('sender', pondsocket_common_1.ChannelReceiver.ALL_USERS, pondsocket_common_1.ServerActions.BROADCAST, 'hello_everyone', { message: 'hello' }, 'requestId');
117
112
  // clear the spy
118
113
  broadcast.mockClear();
119
114
  // send a message to all users except the sender
120
- response.broadcastFromUser('hello_everyone', { message: 'hello' });
121
- expect(broadcast).toHaveBeenCalledWith('requestId', 'sender', pondsocket_common_1.ChannelReceiver.ALL_EXCEPT_SENDER, pondsocket_common_1.ServerActions.BROADCAST, 'hello_everyone', { message: 'hello' });
115
+ response.broadcastFrom('hello_everyone', { message: 'hello' });
116
+ expect(broadcast).toHaveBeenCalledWith('sender', pondsocket_common_1.ChannelReceiver.ALL_EXCEPT_SENDER, pondsocket_common_1.ServerActions.BROADCAST, 'hello_everyone', { message: 'hello' }, 'requestId');
122
117
  });
123
118
  it('should be able to track the presence of users', () => {
124
119
  const { response, channelEngine } = createPondResponse();
@@ -139,7 +134,7 @@ describe('JoinResponse', () => {
139
134
  response.accept();
140
135
  expect(channelEngine.addUser).toHaveBeenCalledWith(socket.clientId, socket.assigns, expect.any(Function));
141
136
  expect(() => response.accept()).toThrow('Request to join channel test rejected: Request already executed');
142
- expect(() => response.reject()).toThrow('Request to join channel test rejected: Request already executed');
143
- expect(() => response.send('event', { payload: 'payload' })).toThrow('Request to join channel test rejected: Request already executed');
137
+ expect(() => response.decline()).toThrow('Request to join channel test rejected: Request already executed');
138
+ expect(() => response.reply('event', { payload: 'payload' })).not.toThrow();
144
139
  });
145
140
  });
@@ -10,22 +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 _JoinResponse_instances, _JoinResponse_user, _JoinResponse_engine, _JoinResponse_executed, _JoinResponse_performChecks;
13
+ var _JoinResponse_instances, _JoinResponse_user, _JoinResponse_engine, _JoinResponse_newAssigns, _JoinResponse_executed, _JoinResponse_accepted, _JoinResponse_performChecks, _JoinResponse_sendMessage;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.JoinResponse = void 0;
16
16
  const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
17
- const abstractResponse_1 = require("../abstracts/abstractResponse");
18
17
  const pondError_1 = require("../errors/pondError");
19
- class JoinResponse extends abstractResponse_1.PondResponse {
18
+ class JoinResponse {
20
19
  constructor(user, engine) {
21
- super(user.requestId);
22
20
  _JoinResponse_instances.add(this);
23
21
  _JoinResponse_user.set(this, void 0);
24
22
  _JoinResponse_engine.set(this, void 0);
23
+ _JoinResponse_newAssigns.set(this, void 0);
25
24
  _JoinResponse_executed.set(this, void 0);
25
+ _JoinResponse_accepted.set(this, void 0);
26
26
  __classPrivateFieldSet(this, _JoinResponse_user, user, "f");
27
27
  __classPrivateFieldSet(this, _JoinResponse_engine, engine, "f");
28
28
  __classPrivateFieldSet(this, _JoinResponse_executed, false, "f");
29
+ __classPrivateFieldSet(this, _JoinResponse_accepted, false, "f");
30
+ __classPrivateFieldSet(this, _JoinResponse_newAssigns, Object.assign({}, user.assigns), "f");
29
31
  }
30
32
  /**
31
33
  * @desc Whether the server has responded to the request
@@ -34,23 +36,36 @@ class JoinResponse extends abstractResponse_1.PondResponse {
34
36
  return __classPrivateFieldGet(this, _JoinResponse_executed, "f");
35
37
  }
36
38
  /**
37
- * @desc Accepts the request and optionally assigns data to the client
38
- * @param assigns - the data to assign to the client
39
+ * @desc Assigns data to the client
40
+ * @param assigns - the data to assign
39
41
  */
40
- accept(assigns) {
42
+ assign(assigns) {
43
+ if (__classPrivateFieldGet(this, _JoinResponse_accepted, "f")) {
44
+ __classPrivateFieldGet(this, _JoinResponse_engine, "f").updateAssigns(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, assigns);
45
+ }
46
+ else {
47
+ __classPrivateFieldSet(this, _JoinResponse_newAssigns, Object.assign(Object.assign({}, __classPrivateFieldGet(this, _JoinResponse_newAssigns, "f")), assigns), "f");
48
+ }
49
+ return this;
50
+ }
51
+ /**
52
+ * @desc Accepts the join request to the channel
53
+ */
54
+ accept() {
41
55
  __classPrivateFieldGet(this, _JoinResponse_instances, "m", _JoinResponse_performChecks).call(this);
42
- const newAssigns = Object.assign(Object.assign({}, assigns || {}), __classPrivateFieldGet(this, _JoinResponse_user, "f").assigns);
43
56
  const acknowledgement = {
44
57
  action: pondsocket_common_1.ServerActions.SYSTEM,
45
58
  channelName: __classPrivateFieldGet(this, _JoinResponse_engine, "f").name,
46
59
  event: pondsocket_common_1.Events.ACKNOWLEDGE,
47
- requestId: this.requestId,
60
+ requestId: __classPrivateFieldGet(this, _JoinResponse_user, "f").requestId,
48
61
  payload: {},
49
62
  };
50
63
  __classPrivateFieldGet(this, _JoinResponse_user, "f").socket.send(JSON.stringify(acknowledgement));
51
- __classPrivateFieldGet(this, _JoinResponse_engine, "f").addUser(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, newAssigns, (event) => {
64
+ const unsubscribe = __classPrivateFieldGet(this, _JoinResponse_engine, "f").addUser(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, __classPrivateFieldGet(this, _JoinResponse_newAssigns, "f"), (event) => {
52
65
  __classPrivateFieldGet(this, _JoinResponse_user, "f").socket.send(JSON.stringify(event));
53
66
  });
67
+ __classPrivateFieldGet(this, _JoinResponse_user, "f").subscriptions.set(__classPrivateFieldGet(this, _JoinResponse_engine, "f").name, unsubscribe);
68
+ __classPrivateFieldSet(this, _JoinResponse_accepted, true, "f");
54
69
  return this;
55
70
  }
56
71
  /**
@@ -58,7 +73,7 @@ class JoinResponse extends abstractResponse_1.PondResponse {
58
73
  * @param message - the error message
59
74
  * @param errorCode - the error code
60
75
  */
61
- reject(message, errorCode) {
76
+ decline(message, errorCode) {
62
77
  __classPrivateFieldGet(this, _JoinResponse_instances, "m", _JoinResponse_performChecks).call(this);
63
78
  const errorMessage = {
64
79
  event: pondsocket_common_1.ErrorTypes.UNAUTHORIZED_JOIN_REQUEST,
@@ -68,7 +83,7 @@ class JoinResponse extends abstractResponse_1.PondResponse {
68
83
  },
69
84
  channelName: __classPrivateFieldGet(this, _JoinResponse_engine, "f").name,
70
85
  action: pondsocket_common_1.ServerActions.ERROR,
71
- requestId: this.requestId,
86
+ requestId: __classPrivateFieldGet(this, _JoinResponse_user, "f").requestId,
72
87
  };
73
88
  __classPrivateFieldGet(this, _JoinResponse_user, "f").socket.send(JSON.stringify(errorMessage));
74
89
  return this;
@@ -77,56 +92,80 @@ class JoinResponse extends abstractResponse_1.PondResponse {
77
92
  * @desc Emits a direct message to the client
78
93
  * @param event - the event name
79
94
  * @param payload - the payload to send
80
- * @param assigns - the data to assign to the client
81
95
  */
82
- send(event, payload, assigns) {
83
- this.accept(assigns);
84
- __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(this.requestId, pondsocket_common_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId], pondsocket_common_1.ServerActions.SYSTEM, event, payload);
96
+ reply(event, payload) {
97
+ const message = {
98
+ action: pondsocket_common_1.ServerActions.SYSTEM,
99
+ channelName: __classPrivateFieldGet(this, _JoinResponse_engine, "f").name,
100
+ requestId: __classPrivateFieldGet(this, _JoinResponse_user, "f").requestId,
101
+ payload,
102
+ event,
103
+ };
104
+ __classPrivateFieldGet(this, _JoinResponse_user, "f").socket.send(JSON.stringify(message));
85
105
  return this;
86
106
  }
87
107
  /**
88
- * @desc Emits a message to all clients in the channel
89
- * @param event - the event name
108
+ * @desc Sends a message to all clients in the channel
109
+ * @param event - the event to send
90
110
  * @param payload - the payload to send
91
111
  */
92
112
  broadcast(event, payload) {
93
- __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, pondsocket_common_1.ChannelReceiver.ALL_USERS, pondsocket_common_1.ServerActions.BROADCAST, event, payload);
113
+ __classPrivateFieldGet(this, _JoinResponse_instances, "m", _JoinResponse_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_USERS, event, payload);
94
114
  return this;
95
115
  }
96
116
  /**
97
- * @desc Emits a message to all clients in the channel except the sender
98
- * @param event - the event name
117
+ * @desc Sends a message to all clients in the channel except the client making the request
118
+ * @param event - the event to send
99
119
  * @param payload - the payload to send
100
120
  */
101
- broadcastFromUser(event, payload) {
102
- __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, pondsocket_common_1.ChannelReceiver.ALL_EXCEPT_SENDER, pondsocket_common_1.ServerActions.BROADCAST, event, payload);
121
+ broadcastFrom(event, payload) {
122
+ __classPrivateFieldGet(this, _JoinResponse_instances, "m", _JoinResponse_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_EXCEPT_SENDER, event, payload);
103
123
  return this;
104
124
  }
105
125
  /**
106
- * @desc Emits a message to a specific set of clients
107
- * @param event - the event name
108
- * @param payload - the payload to send
126
+ * @desc Sends a message to a set of clients in the channel
127
+ * @param event - the event to send
128
+ * @param payload - the payload to send
109
129
  * @param userIds - the ids of the clients to send the message to
110
130
  */
111
- sendToUsers(event, payload, userIds) {
112
- __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(this.requestId, __classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, userIds, pondsocket_common_1.ServerActions.BROADCAST, event, payload);
131
+ broadcastTo(event, payload, userIds) {
132
+ const ids = Array.isArray(userIds) ? userIds : [userIds];
133
+ __classPrivateFieldGet(this, _JoinResponse_instances, "m", _JoinResponse_sendMessage).call(this, ids, event, payload);
113
134
  return this;
114
135
  }
115
136
  /**
116
- * @desc tracks the presence of a client
117
- * @param presence - the presence data to track
137
+ * @desc Tracks a user's presence in the channel
138
+ * @param presence - the initial presence data
118
139
  */
119
140
  trackPresence(presence) {
120
141
  __classPrivateFieldGet(this, _JoinResponse_engine, "f").presenceEngine.trackPresence(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, presence);
121
142
  return this;
122
143
  }
144
+ /**
145
+ * @desc Subscribes the client to a channel
146
+ * @param channel - the channel to subscribe to
147
+ */
148
+ subscribeTo(channel) {
149
+ __classPrivateFieldGet(this, _JoinResponse_engine, "f").subscribeTo(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, channel);
150
+ return this;
151
+ }
152
+ /**
153
+ * @desc Unsubscribes the client from a channel
154
+ * @param channel - the channel to unsubscribe from
155
+ */
156
+ unsubscribeFrom(channel) {
157
+ __classPrivateFieldGet(this, _JoinResponse_engine, "f").unsubscribeFrom(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, channel);
158
+ return this;
159
+ }
123
160
  }
124
161
  exports.JoinResponse = JoinResponse;
125
- _JoinResponse_user = new WeakMap(), _JoinResponse_engine = new WeakMap(), _JoinResponse_executed = new WeakMap(), _JoinResponse_instances = new WeakSet(), _JoinResponse_performChecks = function _JoinResponse_performChecks() {
162
+ _JoinResponse_user = new WeakMap(), _JoinResponse_engine = new WeakMap(), _JoinResponse_newAssigns = new WeakMap(), _JoinResponse_executed = new WeakMap(), _JoinResponse_accepted = new WeakMap(), _JoinResponse_instances = new WeakSet(), _JoinResponse_performChecks = function _JoinResponse_performChecks() {
126
163
  if (__classPrivateFieldGet(this, _JoinResponse_executed, "f")) {
127
164
  const message = `Request to join channel ${__classPrivateFieldGet(this, _JoinResponse_engine, "f").name} rejected: Request already executed`;
128
165
  const code = 403;
129
166
  throw new pondError_1.ChannelError(message, code, __classPrivateFieldGet(this, _JoinResponse_engine, "f").name);
130
167
  }
131
168
  __classPrivateFieldSet(this, _JoinResponse_executed, true, "f");
169
+ }, _JoinResponse_sendMessage = function _JoinResponse_sendMessage(recipient, event, payload) {
170
+ __classPrivateFieldGet(this, _JoinResponse_engine, "f").sendMessage(__classPrivateFieldGet(this, _JoinResponse_user, "f").clientId, recipient, pondsocket_common_1.ServerActions.BROADCAST, event, payload, __classPrivateFieldGet(this, _JoinResponse_user, "f").requestId);
132
171
  };