@eleven-am/pondsocket 0.1.198 → 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.
- package/contexts/connectionContext.js +169 -0
- package/contexts/eventContext.js +143 -0
- package/contexts/joinContext.js +192 -0
- package/engines/channelEngine.js +1 -4
- package/engines/endpointEngine.js +3 -5
- package/engines/lobbyEngine.js +14 -7
- package/package.json +1 -1
- package/server/server.js +16 -14
- package/types.d.ts +155 -83
- package/requests/eventRequest.js +0 -69
- package/requests/joinRequest.js +0 -56
- package/responses/connectionResponse.js +0 -92
- package/responses/eventResponse.js +0 -101
- package/responses/joinResponse.js +0 -134
|
@@ -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
|
+
};
|
package/engines/channelEngine.js
CHANGED
|
@@ -248,18 +248,15 @@ 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();
|
|
259
|
+
this.parent.deleteChannel(this.name);
|
|
263
260
|
}
|
|
264
261
|
}
|
|
265
262
|
exports.ChannelEngine = ChannelEngine;
|
|
@@ -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
|
|
50
|
-
|
|
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
|
});
|
package/engines/lobbyEngine.js
CHANGED
|
@@ -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
|
-
|
|
56
|
-
const response = new eventResponse_1.EventResponse(requestEvent, channel);
|
|
57
|
-
return handler(eventRequest, response, next);
|
|
53
|
+
if (!params) {
|
|
54
|
+
return next();
|
|
58
55
|
}
|
|
59
|
-
|
|
56
|
+
const context = new eventContext_1.EventContext(requestEvent, params, channel);
|
|
57
|
+
return handler(context, next);
|
|
60
58
|
});
|
|
61
59
|
}
|
|
62
60
|
/**
|
|
@@ -138,6 +136,15 @@ class LobbyEngine {
|
|
|
138
136
|
wrapChannel(engine) {
|
|
139
137
|
return new channel_1.Channel(engine);
|
|
140
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Broadcasts an event to all users in a channel
|
|
141
|
+
*/
|
|
142
|
+
deleteChannel(channelName) {
|
|
143
|
+
const channel = __classPrivateFieldGet(this, _LobbyEngine_channels, "f").get(channelName);
|
|
144
|
+
if (channel) {
|
|
145
|
+
__classPrivateFieldGet(this, _LobbyEngine_channels, "f").delete(channelName);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
141
148
|
}
|
|
142
149
|
exports.LobbyEngine = LobbyEngine;
|
|
143
150
|
_LobbyEngine_channels = new WeakMap(), _LobbyEngine_outGoingEvents = new WeakMap(), _LobbyEngine_instances = new WeakSet(), _LobbyEngine_getChannel = function _LobbyEngine_getChannel(channelName) {
|
package/package.json
CHANGED
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
|
-
|
|
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
|
-
|
|
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(';')
|
|
132
|
-
|
|
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
|
}, {});
|