@eleven-am/pondsocket 0.1.199 → 0.1.200

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.
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _ConnectionContext_instances, _ConnectionContext_executed, _ConnectionContext_assigns, _ConnectionContext_clientId, _ConnectionContext_engine, _ConnectionContext_params, _ConnectionContext_webSocketServer, _ConnectionContext_connectionData, _ConnectionContext_performChecks;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ConnectionContext = void 0;
16
+ const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
17
+ const httpError_1 = require("../errors/httpError");
18
+ /**
19
+ * ConnectionContext combines IncomingConnection data with ConnectionResponse functionality.
20
+ */
21
+ class ConnectionContext {
22
+ constructor(connectionData, { engine, params, webSocketServer }) {
23
+ _ConnectionContext_instances.add(this);
24
+ _ConnectionContext_executed.set(this, void 0);
25
+ _ConnectionContext_assigns.set(this, void 0);
26
+ _ConnectionContext_clientId.set(this, void 0);
27
+ _ConnectionContext_engine.set(this, void 0);
28
+ _ConnectionContext_params.set(this, void 0);
29
+ _ConnectionContext_webSocketServer.set(this, void 0);
30
+ _ConnectionContext_connectionData.set(this, void 0);
31
+ __classPrivateFieldSet(this, _ConnectionContext_webSocketServer, webSocketServer, "f");
32
+ __classPrivateFieldSet(this, _ConnectionContext_clientId, connectionData.id, "f");
33
+ __classPrivateFieldSet(this, _ConnectionContext_executed, false, "f");
34
+ __classPrivateFieldSet(this, _ConnectionContext_engine, engine, "f");
35
+ __classPrivateFieldSet(this, _ConnectionContext_params, params, "f");
36
+ __classPrivateFieldSet(this, _ConnectionContext_assigns, {}, "f");
37
+ __classPrivateFieldSet(this, _ConnectionContext_connectionData, connectionData, "f");
38
+ }
39
+ /**
40
+ * Whether the connection has been handled
41
+ */
42
+ get hasResponded() {
43
+ return __classPrivateFieldGet(this, _ConnectionContext_executed, "f");
44
+ }
45
+ /**
46
+ * Connection details including headers, cookies, address, id, etc.
47
+ */
48
+ get connection() {
49
+ return __classPrivateFieldGet(this, _ConnectionContext_connectionData, "f");
50
+ }
51
+ /**
52
+ * The request parameters
53
+ */
54
+ get requestId() {
55
+ return __classPrivateFieldGet(this, _ConnectionContext_params, "f").requestId;
56
+ }
57
+ /**
58
+ * The client ID
59
+ */
60
+ get clientId() {
61
+ return __classPrivateFieldGet(this, _ConnectionContext_clientId, "f");
62
+ }
63
+ /**
64
+ * The request headers
65
+ */
66
+ get headers() {
67
+ return __classPrivateFieldGet(this, _ConnectionContext_connectionData, "f").headers;
68
+ }
69
+ /**
70
+ * The request cookies
71
+ */
72
+ get cookies() {
73
+ return __classPrivateFieldGet(this, _ConnectionContext_connectionData, "f").cookies;
74
+ }
75
+ /**
76
+ * The client address
77
+ */
78
+ get address() {
79
+ return __classPrivateFieldGet(this, _ConnectionContext_connectionData, "f").address;
80
+ }
81
+ /**
82
+ * The event parameters
83
+ */
84
+ get event() {
85
+ return {
86
+ query: __classPrivateFieldGet(this, _ConnectionContext_connectionData, "f").query,
87
+ params: __classPrivateFieldGet(this, _ConnectionContext_connectionData, "f").params,
88
+ };
89
+ }
90
+ /**
91
+ * The query parameters
92
+ */
93
+ get query() {
94
+ return __classPrivateFieldGet(this, _ConnectionContext_connectionData, "f").query;
95
+ }
96
+ /**
97
+ * The path parameters
98
+ */
99
+ get params() {
100
+ return __classPrivateFieldGet(this, _ConnectionContext_connectionData, "f").params;
101
+ }
102
+ /**
103
+ * Assigns data to the client
104
+ */
105
+ assign(assigns) {
106
+ if (!__classPrivateFieldGet(this, _ConnectionContext_executed, "f")) {
107
+ __classPrivateFieldSet(this, _ConnectionContext_assigns, Object.assign(Object.assign({}, __classPrivateFieldGet(this, _ConnectionContext_assigns, "f")), assigns), "f");
108
+ }
109
+ else {
110
+ const user = __classPrivateFieldGet(this, _ConnectionContext_engine, "f").getUser(__classPrivateFieldGet(this, _ConnectionContext_clientId, "f"));
111
+ user.assigns = Object.assign(Object.assign({}, user.assigns), assigns);
112
+ }
113
+ return this;
114
+ }
115
+ /**
116
+ * Accepts the connection request
117
+ */
118
+ accept() {
119
+ __classPrivateFieldGet(this, _ConnectionContext_instances, "m", _ConnectionContext_performChecks).call(this);
120
+ __classPrivateFieldGet(this, _ConnectionContext_webSocketServer, "f").handleUpgrade(__classPrivateFieldGet(this, _ConnectionContext_params, "f").request, __classPrivateFieldGet(this, _ConnectionContext_params, "f").socket, __classPrivateFieldGet(this, _ConnectionContext_params, "f").head, (ws) => {
121
+ const cache = {
122
+ clientId: __classPrivateFieldGet(this, _ConnectionContext_clientId, "f"),
123
+ subscriptions: new Set(),
124
+ assigns: __classPrivateFieldGet(this, _ConnectionContext_assigns, "f"),
125
+ socket: ws,
126
+ };
127
+ __classPrivateFieldGet(this, _ConnectionContext_webSocketServer, "f").emit('connection', ws);
128
+ __classPrivateFieldGet(this, _ConnectionContext_engine, "f").manageSocket(cache);
129
+ });
130
+ return this;
131
+ }
132
+ /**
133
+ * Declines the connection request
134
+ */
135
+ decline(message, errorCode) {
136
+ __classPrivateFieldGet(this, _ConnectionContext_instances, "m", _ConnectionContext_performChecks).call(this);
137
+ const code = errorCode || 400;
138
+ const { socket } = __classPrivateFieldGet(this, _ConnectionContext_params, "f");
139
+ const newMessage = message || 'Unauthorized connection';
140
+ socket.write(`HTTP/1.1 ${code} ${newMessage}\r\n\r\n`);
141
+ socket.destroy();
142
+ return this;
143
+ }
144
+ /**
145
+ * Sends a direct reply to the client
146
+ */
147
+ reply(event, payload) {
148
+ if (!__classPrivateFieldGet(this, _ConnectionContext_executed, "f")) {
149
+ throw new httpError_1.HttpError(400, 'Connection has not been accepted');
150
+ }
151
+ const { socket } = __classPrivateFieldGet(this, _ConnectionContext_engine, "f").getUser(__classPrivateFieldGet(this, _ConnectionContext_clientId, "f"));
152
+ const message = {
153
+ event,
154
+ payload,
155
+ action: pondsocket_common_1.ServerActions.BROADCAST,
156
+ requestId: __classPrivateFieldGet(this, _ConnectionContext_params, "f").requestId,
157
+ channelName: pondsocket_common_1.SystemSender.ENDPOINT,
158
+ };
159
+ __classPrivateFieldGet(this, _ConnectionContext_engine, "f").sendMessage(socket, message);
160
+ return this;
161
+ }
162
+ }
163
+ exports.ConnectionContext = ConnectionContext;
164
+ _ConnectionContext_executed = new WeakMap(), _ConnectionContext_assigns = new WeakMap(), _ConnectionContext_clientId = new WeakMap(), _ConnectionContext_engine = new WeakMap(), _ConnectionContext_params = new WeakMap(), _ConnectionContext_webSocketServer = new WeakMap(), _ConnectionContext_connectionData = new WeakMap(), _ConnectionContext_instances = new WeakSet(), _ConnectionContext_performChecks = function _ConnectionContext_performChecks() {
165
+ if (__classPrivateFieldGet(this, _ConnectionContext_executed, "f")) {
166
+ throw new httpError_1.HttpError(400, 'Response has already been executed');
167
+ }
168
+ __classPrivateFieldSet(this, _ConnectionContext_executed, true, "f");
169
+ };
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _EventContext_instances, _EventContext_event, _EventContext_engine, _EventContext_params, _EventContext_requestId, _EventContext_sendMessage;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.EventContext = void 0;
16
+ const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
17
+ const channel_1 = require("../wrappers/channel");
18
+ /**
19
+ * EventContext combines the functionality of EventRequest and EventResponse
20
+ * to provide a unified interface for handling events in a channel.
21
+ */
22
+ class EventContext {
23
+ constructor(event, params, engine) {
24
+ _EventContext_instances.add(this);
25
+ _EventContext_event.set(this, void 0);
26
+ _EventContext_engine.set(this, void 0);
27
+ _EventContext_params.set(this, void 0);
28
+ _EventContext_requestId.set(this, void 0);
29
+ __classPrivateFieldSet(this, _EventContext_event, event, "f");
30
+ __classPrivateFieldSet(this, _EventContext_params, params, "f");
31
+ __classPrivateFieldSet(this, _EventContext_engine, engine, "f");
32
+ __classPrivateFieldSet(this, _EventContext_requestId, event.requestId, "f");
33
+ }
34
+ /**
35
+ * The event information
36
+ */
37
+ get event() {
38
+ return {
39
+ event: __classPrivateFieldGet(this, _EventContext_event, "f").event,
40
+ query: __classPrivateFieldGet(this, _EventContext_params, "f").query,
41
+ params: __classPrivateFieldGet(this, _EventContext_params, "f").params,
42
+ payload: __classPrivateFieldGet(this, _EventContext_event, "f").payload,
43
+ };
44
+ }
45
+ /**
46
+ * The channel name
47
+ */
48
+ get channelName() {
49
+ return __classPrivateFieldGet(this, _EventContext_engine, "f").name;
50
+ }
51
+ /**
52
+ * The channel instance
53
+ */
54
+ get channel() {
55
+ return new channel_1.Channel(__classPrivateFieldGet(this, _EventContext_engine, "f"));
56
+ }
57
+ /**
58
+ * All current presences in the channel
59
+ */
60
+ get presences() {
61
+ return __classPrivateFieldGet(this, _EventContext_engine, "f").getPresence();
62
+ }
63
+ /**
64
+ * All current assigns in the channel
65
+ */
66
+ get assigns() {
67
+ return __classPrivateFieldGet(this, _EventContext_engine, "f").getAssigns();
68
+ }
69
+ /**
70
+ * The user who sent the request
71
+ */
72
+ get user() {
73
+ return __classPrivateFieldGet(this, _EventContext_engine, "f").getUserData(__classPrivateFieldGet(this, _EventContext_event, "f").sender);
74
+ }
75
+ /**
76
+ * Assigns data to the client
77
+ */
78
+ assign(assigns) {
79
+ __classPrivateFieldGet(this, _EventContext_engine, "f").updateAssigns(__classPrivateFieldGet(this, _EventContext_event, "f").sender, assigns);
80
+ return this;
81
+ }
82
+ /**
83
+ * Sends a direct reply to the client
84
+ */
85
+ reply(event, payload) {
86
+ __classPrivateFieldGet(this, _EventContext_engine, "f").sendMessage(pondsocket_common_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _EventContext_event, "f").sender], pondsocket_common_1.ServerActions.SYSTEM, event, payload, __classPrivateFieldGet(this, _EventContext_requestId, "f"));
87
+ return this;
88
+ }
89
+ /**
90
+ * Broadcasts a message to all users in the channel
91
+ */
92
+ broadcast(event, payload) {
93
+ __classPrivateFieldGet(this, _EventContext_instances, "m", _EventContext_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_USERS, event, payload);
94
+ return this;
95
+ }
96
+ /**
97
+ * Broadcasts a message to all users except the sender
98
+ */
99
+ broadcastFrom(event, payload) {
100
+ __classPrivateFieldGet(this, _EventContext_instances, "m", _EventContext_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_EXCEPT_SENDER, event, payload);
101
+ return this;
102
+ }
103
+ /**
104
+ * Broadcasts a message to specific users
105
+ */
106
+ broadcastTo(event, payload, userIds) {
107
+ const ids = Array.isArray(userIds) ? userIds : [userIds];
108
+ __classPrivateFieldGet(this, _EventContext_instances, "m", _EventContext_sendMessage).call(this, ids, event, payload);
109
+ return this;
110
+ }
111
+ /**
112
+ * Tracks a user's presence
113
+ */
114
+ trackPresence(presence, userId = __classPrivateFieldGet(this, _EventContext_event, "f").sender) {
115
+ __classPrivateFieldGet(this, _EventContext_engine, "f").trackPresence(userId, presence);
116
+ return this;
117
+ }
118
+ /**
119
+ * Updates a user's presence
120
+ */
121
+ updatePresence(presence, userId = __classPrivateFieldGet(this, _EventContext_event, "f").sender) {
122
+ __classPrivateFieldGet(this, _EventContext_engine, "f").updatePresence(userId, presence);
123
+ return this;
124
+ }
125
+ /**
126
+ * Kicks a user from the channel
127
+ */
128
+ evictUser(reason, userId = __classPrivateFieldGet(this, _EventContext_event, "f").sender) {
129
+ __classPrivateFieldGet(this, _EventContext_engine, "f").kickUser(userId, reason);
130
+ return this;
131
+ }
132
+ /**
133
+ * Removes a user's presence
134
+ */
135
+ removePresence(userId = __classPrivateFieldGet(this, _EventContext_event, "f").sender) {
136
+ __classPrivateFieldGet(this, _EventContext_engine, "f").removePresence(userId);
137
+ return this;
138
+ }
139
+ }
140
+ exports.EventContext = EventContext;
141
+ _EventContext_event = new WeakMap(), _EventContext_engine = new WeakMap(), _EventContext_params = new WeakMap(), _EventContext_requestId = new WeakMap(), _EventContext_instances = new WeakSet(), _EventContext_sendMessage = function _EventContext_sendMessage(recipient, event, payload) {
142
+ __classPrivateFieldGet(this, _EventContext_engine, "f").sendMessage(__classPrivateFieldGet(this, _EventContext_event, "f").sender, recipient, pondsocket_common_1.ServerActions.BROADCAST, event, payload, __classPrivateFieldGet(this, _EventContext_requestId, "f"));
143
+ };
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _JoinContext_instances, _JoinContext_options, _JoinContext_engine, _JoinContext_user, _JoinContext_newAssigns, _JoinContext_executed, _JoinContext_accepted, _JoinContext_sendMessage, _JoinContext_directMessage, _JoinContext_performChecks;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.JoinContext = void 0;
16
+ const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
17
+ const httpError_1 = require("../errors/httpError");
18
+ const channel_1 = require("../wrappers/channel");
19
+ /**
20
+ * JoinContext combines the functionality of JoinRequest and JoinResponse
21
+ * to provide a unified interface for handling join events in a channel.
22
+ */
23
+ class JoinContext {
24
+ constructor(options, engine, user) {
25
+ _JoinContext_instances.add(this);
26
+ _JoinContext_options.set(this, void 0);
27
+ _JoinContext_engine.set(this, void 0);
28
+ _JoinContext_user.set(this, void 0);
29
+ _JoinContext_newAssigns.set(this, void 0);
30
+ _JoinContext_executed.set(this, void 0);
31
+ _JoinContext_accepted.set(this, void 0);
32
+ __classPrivateFieldSet(this, _JoinContext_options, options, "f");
33
+ __classPrivateFieldSet(this, _JoinContext_engine, engine, "f");
34
+ __classPrivateFieldSet(this, _JoinContext_user, user, "f");
35
+ __classPrivateFieldSet(this, _JoinContext_executed, false, "f");
36
+ __classPrivateFieldSet(this, _JoinContext_accepted, false, "f");
37
+ __classPrivateFieldSet(this, _JoinContext_newAssigns, Object.assign({}, user.assigns), "f");
38
+ }
39
+ /**
40
+ * The event information
41
+ */
42
+ get event() {
43
+ return {
44
+ event: __classPrivateFieldGet(this, _JoinContext_engine, "f").name,
45
+ query: __classPrivateFieldGet(this, _JoinContext_options, "f").params.query,
46
+ params: __classPrivateFieldGet(this, _JoinContext_options, "f").params.params,
47
+ payload: __classPrivateFieldGet(this, _JoinContext_options, "f").joinParams,
48
+ };
49
+ }
50
+ /**
51
+ * The channel name
52
+ */
53
+ get channelName() {
54
+ return __classPrivateFieldGet(this, _JoinContext_engine, "f").name;
55
+ }
56
+ /**
57
+ * The channel instance
58
+ */
59
+ get channel() {
60
+ return new channel_1.Channel(__classPrivateFieldGet(this, _JoinContext_engine, "f"));
61
+ }
62
+ /**
63
+ * All current presences in the channel
64
+ */
65
+ get presences() {
66
+ return __classPrivateFieldGet(this, _JoinContext_engine, "f").getPresence();
67
+ }
68
+ /**
69
+ * All current assigns in the channel
70
+ */
71
+ get assigns() {
72
+ return __classPrivateFieldGet(this, _JoinContext_engine, "f").getAssigns();
73
+ }
74
+ /**
75
+ * The user who sent the request
76
+ */
77
+ get user() {
78
+ return {
79
+ id: __classPrivateFieldGet(this, _JoinContext_options, "f").clientId,
80
+ assigns: __classPrivateFieldGet(this, _JoinContext_options, "f").assigns,
81
+ presence: {},
82
+ };
83
+ }
84
+ /**
85
+ * The join parameters
86
+ */
87
+ get joinParams() {
88
+ return __classPrivateFieldGet(this, _JoinContext_options, "f").joinParams;
89
+ }
90
+ /**
91
+ * Whether the request has been handled
92
+ */
93
+ get hasResponded() {
94
+ return __classPrivateFieldGet(this, _JoinContext_executed, "f");
95
+ }
96
+ /**
97
+ * Accepts the join request
98
+ */
99
+ accept() {
100
+ __classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_performChecks).call(this);
101
+ const onMessage = __classPrivateFieldGet(this, _JoinContext_engine, "f").parent.parent.sendMessage.bind(__classPrivateFieldGet(this, _JoinContext_engine, "f").parent.parent, __classPrivateFieldGet(this, _JoinContext_user, "f").socket);
102
+ const subscription = __classPrivateFieldGet(this, _JoinContext_engine, "f").addUser(__classPrivateFieldGet(this, _JoinContext_user, "f").clientId, __classPrivateFieldGet(this, _JoinContext_newAssigns, "f"), onMessage);
103
+ __classPrivateFieldGet(this, _JoinContext_user, "f").subscriptions.add(subscription);
104
+ __classPrivateFieldSet(this, _JoinContext_accepted, true, "f");
105
+ return this;
106
+ }
107
+ /**
108
+ * Declines the join request
109
+ */
110
+ decline(message, errorCode) {
111
+ __classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_performChecks).call(this);
112
+ const errorMessage = {
113
+ event: pondsocket_common_1.ErrorTypes.UNAUTHORIZED_JOIN_REQUEST,
114
+ payload: {
115
+ message: message || 'Unauthorized connection',
116
+ code: errorCode || 401,
117
+ },
118
+ channelName: __classPrivateFieldGet(this, _JoinContext_engine, "f").name,
119
+ action: pondsocket_common_1.ServerActions.ERROR,
120
+ requestId: __classPrivateFieldGet(this, _JoinContext_user, "f").requestId,
121
+ };
122
+ __classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_directMessage).call(this, errorMessage);
123
+ return this;
124
+ }
125
+ /**
126
+ * Assigns data to the user
127
+ */
128
+ assign(assigns) {
129
+ if (__classPrivateFieldGet(this, _JoinContext_accepted, "f")) {
130
+ __classPrivateFieldGet(this, _JoinContext_engine, "f").updateAssigns(__classPrivateFieldGet(this, _JoinContext_user, "f").clientId, assigns);
131
+ }
132
+ else {
133
+ __classPrivateFieldSet(this, _JoinContext_newAssigns, Object.assign(Object.assign({}, __classPrivateFieldGet(this, _JoinContext_newAssigns, "f")), assigns), "f");
134
+ }
135
+ return this;
136
+ }
137
+ /**
138
+ * Sends a direct reply to the user
139
+ */
140
+ reply(event, payload) {
141
+ const message = {
142
+ action: pondsocket_common_1.ServerActions.SYSTEM,
143
+ channelName: __classPrivateFieldGet(this, _JoinContext_engine, "f").name,
144
+ requestId: __classPrivateFieldGet(this, _JoinContext_user, "f").requestId,
145
+ payload,
146
+ event,
147
+ };
148
+ __classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_directMessage).call(this, message);
149
+ return this;
150
+ }
151
+ /**
152
+ * Broadcasts a message to specific users
153
+ */
154
+ broadcastTo(event, payload, userIds) {
155
+ const ids = Array.isArray(userIds) ? userIds : [userIds];
156
+ __classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_sendMessage).call(this, ids, event, payload);
157
+ return this;
158
+ }
159
+ /**
160
+ * Broadcasts a message to all users in the channel
161
+ */
162
+ broadcast(event, payload) {
163
+ __classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_USERS, event, payload);
164
+ return this;
165
+ }
166
+ /**
167
+ * Broadcasts a message to all users except the sender
168
+ */
169
+ broadcastFrom(event, payload) {
170
+ __classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_EXCEPT_SENDER, event, payload);
171
+ return this;
172
+ }
173
+ /**
174
+ * Tracks the user's presence
175
+ */
176
+ trackPresence(presence) {
177
+ __classPrivateFieldGet(this, _JoinContext_engine, "f").trackPresence(__classPrivateFieldGet(this, _JoinContext_user, "f").clientId, presence);
178
+ return this;
179
+ }
180
+ }
181
+ exports.JoinContext = JoinContext;
182
+ _JoinContext_options = new WeakMap(), _JoinContext_engine = new WeakMap(), _JoinContext_user = new WeakMap(), _JoinContext_newAssigns = new WeakMap(), _JoinContext_executed = new WeakMap(), _JoinContext_accepted = new WeakMap(), _JoinContext_instances = new WeakSet(), _JoinContext_sendMessage = function _JoinContext_sendMessage(recipient, event, payload) {
183
+ __classPrivateFieldGet(this, _JoinContext_engine, "f").sendMessage(__classPrivateFieldGet(this, _JoinContext_user, "f").clientId, recipient, pondsocket_common_1.ServerActions.BROADCAST, event, payload, __classPrivateFieldGet(this, _JoinContext_user, "f").requestId);
184
+ }, _JoinContext_directMessage = function _JoinContext_directMessage(event) {
185
+ __classPrivateFieldGet(this, _JoinContext_engine, "f").parent.parent.sendMessage(__classPrivateFieldGet(this, _JoinContext_user, "f").socket, event);
186
+ }, _JoinContext_performChecks = function _JoinContext_performChecks() {
187
+ if (__classPrivateFieldGet(this, _JoinContext_executed, "f")) {
188
+ const message = `Request to join channel ${__classPrivateFieldGet(this, _JoinContext_engine, "f").name} rejected: Request already executed`;
189
+ throw new httpError_1.HttpError(403, message);
190
+ }
191
+ __classPrivateFieldSet(this, _JoinContext_executed, true, "f");
192
+ };
@@ -248,19 +248,14 @@ class ChannelEngine {
248
248
  * Closes the channel and cleans up resources
249
249
  */
250
250
  close() {
251
- // Clear all user subscriptions
252
251
  __classPrivateFieldGet(this, _ChannelEngine_userSubscriptions, "f").forEach((unsubscribe) => unsubscribe());
253
252
  __classPrivateFieldGet(this, _ChannelEngine_userSubscriptions, "f").clear();
254
- // Clear assigns
255
253
  __classPrivateFieldGet(this, _ChannelEngine_assignsCache, "f").clear();
256
- // Close presence engine if exists
257
254
  if (__classPrivateFieldGet(this, _ChannelEngine_presenceEngine, "f")) {
258
255
  __classPrivateFieldGet(this, _ChannelEngine_presenceEngine, "f").close();
259
256
  __classPrivateFieldSet(this, _ChannelEngine_presenceEngine, null, "f");
260
257
  }
261
- // Close publisher
262
258
  __classPrivateFieldGet(this, _ChannelEngine_publisher, "f").close();
263
- // Remove the channel from the parent
264
259
  this.parent.deleteChannel(this.name);
265
260
  }
266
261
  }
@@ -16,10 +16,9 @@ exports.EndpointEngine = void 0;
16
16
  const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
17
17
  const lobbyEngine_1 = require("./lobbyEngine");
18
18
  const middleware_1 = require("../abstracts/middleware");
19
+ const joinContext_1 = require("../contexts/joinContext");
19
20
  const httpError_1 = require("../errors/httpError");
20
21
  const matcher_1 = require("../matcher/matcher");
21
- const joinRequest_1 = require("../requests/joinRequest");
22
- const joinResponse_1 = require("../responses/joinResponse");
23
22
  const pondChannel_1 = require("../wrappers/pondChannel");
24
23
  class EndpointEngine {
25
24
  constructor() {
@@ -46,9 +45,8 @@ class EndpointEngine {
46
45
  joinParams,
47
46
  };
48
47
  const channel = lobbyEngine.getOrCreateChannel(user.channelName);
49
- const request = new joinRequest_1.JoinRequest(options, channel);
50
- const response = new joinResponse_1.JoinResponse(user, channel);
51
- return handler(request, response, next);
48
+ const context = new joinContext_1.JoinContext(options, channel, user);
49
+ return handler(context, next);
52
50
  }
53
51
  next();
54
52
  });
@@ -24,10 +24,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.LobbyEngine = void 0;
25
25
  const channelEngine_1 = require("./channelEngine");
26
26
  const middleware_1 = require("../abstracts/middleware");
27
+ const eventContext_1 = require("../contexts/eventContext");
27
28
  const httpError_1 = require("../errors/httpError");
28
29
  const matcher_1 = require("../matcher/matcher");
29
- const eventRequest_1 = require("../requests/eventRequest");
30
- const eventResponse_1 = require("../responses/eventResponse");
31
30
  const channel_1 = require("../wrappers/channel");
32
31
  class LobbyEngine {
33
32
  constructor(parent) {
@@ -51,12 +50,11 @@ class LobbyEngine {
51
50
  onEvent(event, handler) {
52
51
  this.middleware.use((requestEvent, channel, next) => {
53
52
  const params = (0, matcher_1.parseAddress)(event, requestEvent.event);
54
- if (params) {
55
- const eventRequest = new eventRequest_1.EventRequest(requestEvent, params, channel);
56
- const response = new eventResponse_1.EventResponse(requestEvent, channel);
57
- return handler(eventRequest, response, next);
53
+ if (!params) {
54
+ return next();
58
55
  }
59
- return next();
56
+ const context = new eventContext_1.EventContext(requestEvent, params, channel);
57
+ return handler(context, next);
60
58
  });
61
59
  }
62
60
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eleven-am/pondsocket",
3
- "version": "0.1.199",
3
+ "version": "0.1.200",
4
4
  "description": "PondSocket is a fast simple socket server",
5
5
  "keywords": [
6
6
  "socket",
package/server/server.js CHANGED
@@ -17,12 +17,12 @@ const http_1 = require("http");
17
17
  const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
18
18
  const ws_1 = require("ws");
19
19
  const middleware_1 = require("../abstracts/middleware");
20
+ const connectionContext_1 = require("../contexts/connectionContext");
20
21
  const endpointEngine_1 = require("../engines/endpointEngine");
21
22
  const matcher_1 = require("../matcher/matcher");
22
- const connectionResponse_1 = require("../responses/connectionResponse");
23
23
  const endpoint_1 = require("../wrappers/endpoint");
24
24
  class PondSocket {
25
- constructor({ server, socketServer, exclusiveServer = true } = {}) {
25
+ constructor({ server, socketServer, exclusiveServer = true, } = {}) {
26
26
  _PondSocket_instances.add(this);
27
27
  _PondSocket_exclusiveServer.set(this, void 0);
28
28
  _PondSocket_server.set(this, void 0);
@@ -53,17 +53,17 @@ class PondSocket {
53
53
  const endpoint = new endpointEngine_1.EndpointEngine();
54
54
  __classPrivateFieldGet(this, _PondSocket_middleware, "f").use((req, params, next) => {
55
55
  const event = (0, matcher_1.parseAddress)(path, req.address);
56
- if (event) {
57
- const request = Object.assign(Object.assign({}, event), { cookies: __classPrivateFieldGet(this, _PondSocket_instances, "m", _PondSocket_getCookies).call(this, req.headers), headers: req.headers, address: req.address, id: req.id });
58
- const newParams = {
59
- params,
60
- engine: endpoint,
61
- webSocketServer: __classPrivateFieldGet(this, _PondSocket_socketServer, "f"),
62
- };
63
- const response = new connectionResponse_1.ConnectionResponse(request.id, newParams);
64
- return handler(request, response, next);
56
+ if (!event) {
57
+ return next();
65
58
  }
66
- return next();
59
+ const request = Object.assign(Object.assign({}, event), { cookies: __classPrivateFieldGet(this, _PondSocket_instances, "m", _PondSocket_getCookies).call(this, req.headers), headers: req.headers, address: req.address, id: req.id });
60
+ const newParams = {
61
+ params,
62
+ engine: endpoint,
63
+ webSocketServer: __classPrivateFieldGet(this, _PondSocket_socketServer, "f"),
64
+ };
65
+ const context = new connectionContext_1.ConnectionContext(request, newParams);
66
+ return handler(context, next);
67
67
  });
68
68
  return new endpoint_1.Endpoint(endpoint);
69
69
  }
@@ -128,8 +128,10 @@ _PondSocket_exclusiveServer = new WeakMap(), _PondSocket_server = new WeakMap(),
128
128
  if (!cookieHeader) {
129
129
  return {};
130
130
  }
131
- return cookieHeader.split(';').reduce((cookies, cookie) => {
132
- const [name, value] = cookie.trim().split('=');
131
+ return cookieHeader.split(';')
132
+ .reduce((cookies, cookie) => {
133
+ const [name, value] = cookie.trim()
134
+ .split('=');
133
135
  cookies[name] = decodeURIComponent(value);
134
136
  return cookies;
135
137
  }, {});