@nsshunt/stssocketioutils 2.0.14 → 2.0.16
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/dist/index.cjs +38 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +38 -22
- package/dist/index.mjs.map +1 -1
- package/dist/node.cjs +202 -77
- package/dist/node.cjs.map +1 -1
- package/dist/node.mjs +202 -77
- package/dist/node.mjs.map +1 -1
- package/package.json +3 -3
- package/types/baselineTests.d.ts +32 -0
- package/types/baselineTests.d.ts.map +1 -0
- package/types/singleservertestex1.test.d.ts +8 -0
- package/types/singleservertestex1.test.d.ts.map +1 -0
- package/types/singleservertestex2.test.d.ts +8 -0
- package/types/singleservertestex2.test.d.ts.map +1 -0
- package/types/socketIoClient.d.ts +4 -0
- package/types/socketIoClient.d.ts.map +1 -1
- package/types/socketIoServer.d.ts +18 -10
- package/types/socketIoServer.d.ts.map +1 -1
- package/types/singleservertest.test.d.ts +0 -2
- package/types/singleservertest.test.d.ts.map +0 -1
package/dist/node.mjs
CHANGED
|
@@ -17,27 +17,53 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
|
|
|
17
17
|
ioRedisMessageProcessorUrl;
|
|
18
18
|
serverClusterMode;
|
|
19
19
|
rooms;
|
|
20
|
-
|
|
20
|
+
serverName;
|
|
21
|
+
draining = false;
|
|
22
|
+
attached = false;
|
|
23
|
+
constructor(serverName) {
|
|
21
24
|
super();
|
|
25
|
+
this.serverName = serverName;
|
|
26
|
+
}
|
|
27
|
+
get logPrefix() {
|
|
28
|
+
if (this.namespace) {
|
|
29
|
+
return `SocketIoServer[${this.serverName}:${this.namespace}]: `;
|
|
30
|
+
} else {
|
|
31
|
+
return `SocketIoServer[${this.serverName}:<No Namespace>]: `;
|
|
32
|
+
}
|
|
22
33
|
}
|
|
23
34
|
LogErrorMessage(message) {
|
|
24
35
|
if (this.logger) {
|
|
25
|
-
this.logger.error(`${this.
|
|
36
|
+
this.logger.error(`${this.logPrefix}${message}`);
|
|
26
37
|
}
|
|
27
38
|
}
|
|
28
39
|
LogDebugMessage(message) {
|
|
29
40
|
if (this.logger) {
|
|
30
|
-
this.logger.debug(`${this.
|
|
41
|
+
this.logger.debug(`${this.logPrefix}${message}`);
|
|
31
42
|
}
|
|
32
43
|
}
|
|
33
44
|
LogInfoMessage(message) {
|
|
34
45
|
if (this.logger) {
|
|
35
|
-
this.logger.info(`${this.
|
|
46
|
+
this.logger.info(`${this.logPrefix}${message}`);
|
|
36
47
|
}
|
|
37
48
|
}
|
|
38
49
|
LogWarnMessage(message) {
|
|
39
50
|
if (this.logger) {
|
|
40
|
-
this.logger.warn(`${this.
|
|
51
|
+
this.logger.warn(`${this.logPrefix}${message}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
LogSillyMessage(message) {
|
|
55
|
+
if (this.logger) {
|
|
56
|
+
this.logger.silly(`${this.logPrefix}${message}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
LogVerboseMessage(message) {
|
|
60
|
+
if (this.logger) {
|
|
61
|
+
this.logger.verbose(`${this.logPrefix}${message}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
LogHttpMessage(message) {
|
|
65
|
+
if (this.logger) {
|
|
66
|
+
this.logger.http(`${this.logPrefix}${message}`);
|
|
41
67
|
}
|
|
42
68
|
}
|
|
43
69
|
// https://socket.io/docs/v4/middlewares/
|
|
@@ -53,29 +79,40 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
|
|
|
53
79
|
};
|
|
54
80
|
SocketEventsCallBack = (socket) => {
|
|
55
81
|
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
82
|
+
/*
|
|
83
|
+
protected GetConfig = (socketIoServeroptions: ISocketIoServerOpitons): Partial<ServerOptions> => {
|
|
84
|
+
//this.#redisClient = createClient({url: this.#options.ioRedisMessageProcessorUrl});
|
|
85
|
+
//await this.#redisClient.connect();
|
|
86
|
+
this.LogDebugMessage(`GetConfig() transports: [ [websocket] ]`);
|
|
87
|
+
const options: Partial<ServerOptions> = {
|
|
88
|
+
transports: [ "websocket" ], // or [ "websocket", "polling" ] (to use long-poolling. Note that the order matters)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== '') {
|
|
92
|
+
this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);
|
|
93
|
+
this.LogDebugMessage(`GetConfig() createAdapter(redis): redis url: [${socketIoServeroptions.ioRedisMessageProcessorUrl}]`);
|
|
94
|
+
options.adapter = createAdapter(this.redisClient) as any;
|
|
95
|
+
} else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {
|
|
96
|
+
this.LogDebugMessage(`GetConfig() createAdapter(cluster)`);
|
|
97
|
+
options.adapter = clusterCreateAdapter() as any;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare('') !== 0) {
|
|
101
|
+
this.LogDebugMessage(`GetConfig() wssCustomPath: [${socketIoServeroptions.wssCustomPath}]`);
|
|
102
|
+
options.path = socketIoServeroptions.wssCustomPath;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return options;
|
|
106
|
+
}
|
|
107
|
+
*/
|
|
72
108
|
SetEngineEvents = () => {
|
|
73
109
|
if (this.io) {
|
|
74
110
|
this.io.engine.on("connection_error", (err) => {
|
|
75
|
-
this.
|
|
76
|
-
this.
|
|
77
|
-
this.
|
|
78
|
-
this.
|
|
111
|
+
this.LogWarnMessage(`SetEngineEvents(): connection_error`);
|
|
112
|
+
this.LogWarnMessage(err.req);
|
|
113
|
+
this.LogWarnMessage(err.code);
|
|
114
|
+
this.LogWarnMessage(err.message);
|
|
115
|
+
this.LogWarnMessage(err.context);
|
|
79
116
|
});
|
|
80
117
|
}
|
|
81
118
|
};
|
|
@@ -83,13 +120,6 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
|
|
|
83
120
|
this.logger = logger;
|
|
84
121
|
return this;
|
|
85
122
|
};
|
|
86
|
-
WithExistingServer = (server) => {
|
|
87
|
-
if (this.io) {
|
|
88
|
-
throw new Error(`SocketIoServer:AttachServer(): Error: [Server already attached]`);
|
|
89
|
-
}
|
|
90
|
-
this.io = server;
|
|
91
|
-
return this;
|
|
92
|
-
};
|
|
93
123
|
WithListenPort = (listenPort) => {
|
|
94
124
|
this.listenPort = listenPort;
|
|
95
125
|
return this;
|
|
@@ -114,107 +144,176 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
|
|
|
114
144
|
this.namespace = namespace;
|
|
115
145
|
return this;
|
|
116
146
|
};
|
|
117
|
-
|
|
147
|
+
AttachSocketIoServer = async (server) => {
|
|
148
|
+
if (!this.io) {
|
|
149
|
+
this.LogInfoMessage(`AttachServer(): io = server`);
|
|
150
|
+
this.io = server;
|
|
151
|
+
this.LogInfoMessage(`AttachServer(): attached = true`);
|
|
152
|
+
this.attached = true;
|
|
153
|
+
this.LogInfoMessage(`AttachServer(): SetupNamespace()`);
|
|
154
|
+
this.SetupNamespace();
|
|
155
|
+
} else {
|
|
156
|
+
const errorMessage = this.attached === true ? `AttachServer(): Server already exists (from AttachServer())` : `AttachServer(): Server already exists (from StartServer())`;
|
|
157
|
+
this.LogErrorMessage(errorMessage);
|
|
158
|
+
throw new Error(errorMessage);
|
|
159
|
+
}
|
|
160
|
+
return this;
|
|
161
|
+
};
|
|
162
|
+
StartSocketIoServer = async () => {
|
|
118
163
|
if (!this.namespace) {
|
|
119
|
-
|
|
164
|
+
const errorMessage = `StartServer(): Error: [namespace not specified]`;
|
|
165
|
+
this.LogErrorMessage(errorMessage);
|
|
166
|
+
throw new Error(errorMessage);
|
|
120
167
|
}
|
|
121
168
|
if (!this.io) {
|
|
122
169
|
if (!this.listenPort) {
|
|
123
|
-
|
|
170
|
+
const errorMessage = `StartServer(): Error: [listenPort not specified]`;
|
|
171
|
+
this.LogErrorMessage(errorMessage);
|
|
172
|
+
throw new Error(errorMessage);
|
|
124
173
|
}
|
|
174
|
+
this.LogDebugMessage(`StartServer(): draining = false`);
|
|
175
|
+
this.draining = false;
|
|
176
|
+
this.LogDebugMessage(`StartServer(): transports: [ [websocket] ]`);
|
|
125
177
|
const options = {
|
|
126
178
|
transports: ["websocket"]
|
|
127
179
|
// or [ "websocket", "polling" ] (to use long-poolling. Note that the order matters)
|
|
128
180
|
};
|
|
129
181
|
if (this.ioRedisMessageProcessorUrl && this.ioRedisMessageProcessorUrl !== "") {
|
|
130
182
|
this.redisClient = new Redis(this.ioRedisMessageProcessorUrl);
|
|
183
|
+
this.LogDebugMessage(`StartServer(): createAdapter(redis): redis url: [${this.ioRedisMessageProcessorUrl}]`);
|
|
131
184
|
options.adapter = createAdapter(this.redisClient);
|
|
132
185
|
} else if (this.serverClusterMode && this.serverClusterMode === true) {
|
|
186
|
+
this.LogDebugMessage(`StartServer(): createAdapter(cluster)`);
|
|
133
187
|
options.adapter = createAdapter$1();
|
|
134
188
|
}
|
|
135
189
|
if (this.socketIoCustomPath && this.socketIoCustomPath.localeCompare("") !== 0) {
|
|
190
|
+
this.LogDebugMessage(`StartServer(): socketIoCustomPath: [${this.socketIoCustomPath}]`);
|
|
136
191
|
options.path = this.socketIoCustomPath;
|
|
137
192
|
}
|
|
193
|
+
this.LogDebugMessage(`StartServer(): new Server(): listenPort: [${this.listenPort}]`);
|
|
138
194
|
this.io = new Server(this.listenPort, options);
|
|
195
|
+
this.LogDebugMessage(`StartServer(): SetEngineEvents()`);
|
|
139
196
|
this.SetEngineEvents();
|
|
197
|
+
this.LogDebugMessage(`StartServer(): Sleeping ...`);
|
|
140
198
|
await Sleep(500);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
rooms = [...this.rooms];
|
|
199
|
+
this.LogDebugMessage(`StartServer(): Done Sleeping`);
|
|
200
|
+
this.LogInfoMessage(`AttachServer(): attached = false`);
|
|
201
|
+
this.attached = false;
|
|
202
|
+
this.LogInfoMessage(`StartServer(): SetupNamespace()`);
|
|
203
|
+
this.SetupNamespace();
|
|
147
204
|
} else {
|
|
148
|
-
|
|
149
|
-
|
|
205
|
+
const errorMessage = this.attached === true ? `StartServer(): Server already exists (from AttachServer())` : `StartServer(): Server already exists (from StartServer())`;
|
|
206
|
+
this.LogErrorMessage(errorMessage);
|
|
207
|
+
throw new Error(errorMessage);
|
|
150
208
|
}
|
|
151
|
-
this.SetupNamespace(rooms, autoJoinRooms);
|
|
152
209
|
return this;
|
|
153
210
|
};
|
|
154
|
-
|
|
211
|
+
DetachSockerIoServer = async () => {
|
|
155
212
|
if (this.io) {
|
|
156
|
-
|
|
213
|
+
if (this.attached === true) {
|
|
214
|
+
this.LogInfoMessage(`DetachServer(): StopNamespace()`);
|
|
215
|
+
await this.StopNamespace();
|
|
216
|
+
this.io = void 0;
|
|
217
|
+
this.LogInfoMessage(`DetachServer(): attached = false`);
|
|
218
|
+
this.attached = false;
|
|
219
|
+
} else {
|
|
220
|
+
const errorMessage = `DetachServer(): Error: [Server has not been attached. Use StopServer() to stop the socker.io server.]`;
|
|
221
|
+
this.LogErrorMessage(errorMessage);
|
|
222
|
+
throw new Error(errorMessage);
|
|
223
|
+
}
|
|
224
|
+
} else {
|
|
225
|
+
const errorMessage = `DetachServer(): Error: [no server exists to DetachServer()]`;
|
|
226
|
+
this.LogErrorMessage(errorMessage);
|
|
227
|
+
throw new Error(errorMessage);
|
|
157
228
|
}
|
|
158
|
-
this.io = server;
|
|
159
229
|
};
|
|
160
|
-
|
|
230
|
+
StopSocketIoServer = async () => {
|
|
161
231
|
if (this.io) {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
await this.
|
|
167
|
-
|
|
232
|
+
if (this.attached === false) {
|
|
233
|
+
this.LogInfoMessage(`StopServer(): draining = true`);
|
|
234
|
+
this.draining = true;
|
|
235
|
+
this.LogInfoMessage(`StopServer(): StopNamespace()`);
|
|
236
|
+
await this.StopNamespace();
|
|
237
|
+
this.LogInfoMessage(`StopServer(): io.of('/').adapter.close()`);
|
|
238
|
+
await this.io.of("/").adapter.close();
|
|
239
|
+
if (this.redisClient) {
|
|
240
|
+
this.LogInfoMessage(`StopServer(): redisClient.disconnect()`);
|
|
241
|
+
await this.redisClient.disconnect();
|
|
242
|
+
this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Sleeping...)`);
|
|
243
|
+
await Sleep(50);
|
|
244
|
+
this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Done Sleeping)`);
|
|
245
|
+
}
|
|
246
|
+
this.LogInfoMessage(`StopServer(): io.disconnectSockets()`);
|
|
247
|
+
this.io.disconnectSockets();
|
|
248
|
+
this.LogInfoMessage(`StopServer(): io.close()`);
|
|
249
|
+
this.io.close();
|
|
250
|
+
this.LogInfoMessage(`StopServer(): io = undefined`);
|
|
251
|
+
this.io = void 0;
|
|
252
|
+
} else {
|
|
253
|
+
const errorMessage = `StopServer(): Cannot stop an attached server. The server created must handle stop/disconnections. Use StopNamespace() instead.`;
|
|
254
|
+
this.LogErrorMessage(errorMessage);
|
|
255
|
+
throw new Error(errorMessage);
|
|
168
256
|
}
|
|
169
|
-
|
|
170
|
-
|
|
257
|
+
} else {
|
|
258
|
+
const errorMessage = `StopServer(): Error: [no server exists to StopServer()]`;
|
|
259
|
+
this.LogErrorMessage(errorMessage);
|
|
260
|
+
throw new Error(errorMessage);
|
|
171
261
|
}
|
|
172
262
|
};
|
|
173
263
|
LeaveRoom = (socket, room) => {
|
|
174
|
-
this.LogDebugMessage(`Leaving room [${room}]`);
|
|
264
|
+
this.LogDebugMessage(`LeaveRoom(): Leaving room [${room}]`);
|
|
175
265
|
socket.leave(room);
|
|
176
266
|
};
|
|
177
267
|
JoinRoom = (socket, room) => {
|
|
178
|
-
this.LogDebugMessage(`Socket joining room [${room}], ID: [${socket.id}]`);
|
|
268
|
+
this.LogDebugMessage(`JoinRoom(): Socket joining room [${room}], ID: [${socket.id}]`);
|
|
179
269
|
socket.join(room);
|
|
180
270
|
};
|
|
271
|
+
StopNamespace = async () => {
|
|
272
|
+
this.LogInfoMessage(`StopServer(): CloseNamespaceAdaptors()`);
|
|
273
|
+
await this.CloseNamespaceAdaptors();
|
|
274
|
+
this.LogInfoMessage(`StopServer(): DisconnectNamespaceSockets()`);
|
|
275
|
+
this.DisconnectNamespaceSockets();
|
|
276
|
+
};
|
|
181
277
|
SetupStandardEvents = (socket) => {
|
|
182
278
|
socket.on("disconnect", (reason) => {
|
|
183
|
-
this.LogDebugMessage(`socket disconnect, ID: [${socket.id}] [${reason}]`);
|
|
279
|
+
this.LogDebugMessage(`SetupStandardEvents(): socket disconnect, ID: [${socket.id}], reason: [${reason}]`);
|
|
184
280
|
});
|
|
185
281
|
socket.on("disconnecting", (reason) => {
|
|
186
|
-
this.LogDebugMessage(`socket disconnecting, ID: [${socket.id}] [${reason}]`);
|
|
282
|
+
this.LogDebugMessage(`SetupStandardEvents(): socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);
|
|
187
283
|
});
|
|
188
284
|
socket.on("error", (error) => {
|
|
189
|
-
this.LogDebugMessage(`socket error, ID: [${socket.id}] [${error}]`);
|
|
285
|
+
this.LogDebugMessage(`SetupStandardEvents(): socket error, ID: [${socket.id}], Error: [${error}]`);
|
|
190
286
|
});
|
|
191
287
|
socket.on("__STSdisconnect", (reason) => {
|
|
192
|
-
this.LogDebugMessage(`__STSdisconnect: socket disconnect, ID: [${socket.id}] [${reason}]`);
|
|
288
|
+
this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnect: socket disconnect, ID: [${socket.id}], reason: [${reason}]`);
|
|
193
289
|
});
|
|
194
290
|
socket.on("__STSdisconnecting", (reason, callBackResult) => {
|
|
195
|
-
this.LogDebugMessage(`__STSdisconnecting: socket disconnecting, ID: [${socket.id}] [${reason}]`);
|
|
291
|
+
this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnecting: socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);
|
|
196
292
|
callBackResult("__STSdisconnecting accepted by server.");
|
|
197
293
|
});
|
|
198
294
|
socket.on("__STSjoinRoom", (rooms) => {
|
|
199
295
|
rooms.forEach((room) => {
|
|
296
|
+
this.LogDebugMessage(`SetupStandardEvents(): __STSjoinRoom: room: [${room}], socket: [${socket.id}]`);
|
|
200
297
|
this.JoinRoom(socket, room);
|
|
201
298
|
});
|
|
202
299
|
});
|
|
203
300
|
socket.on("__STSleaveRoom", (rooms) => {
|
|
204
301
|
rooms.forEach((room) => {
|
|
302
|
+
this.LogDebugMessage(`SetupStandardEvents(): __STSleaveRoom: room: [${room}], socket: [${socket.id}]`);
|
|
205
303
|
this.LeaveRoom(socket, room);
|
|
206
304
|
});
|
|
207
305
|
});
|
|
208
306
|
socket.on("__STSsendToRoom", (rooms, payload) => {
|
|
209
307
|
rooms.forEach((room) => {
|
|
210
308
|
if (this.socketionamespace) {
|
|
211
|
-
this.LogDebugMessage(`socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}]`);
|
|
309
|
+
this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}], Command: [${payload.command}]`);
|
|
212
310
|
this.socketionamespace.to(room).emit(payload.command, payload);
|
|
213
311
|
}
|
|
214
312
|
});
|
|
215
313
|
});
|
|
216
314
|
socket.on("__STSsendToRoomWithCallback", (room, timeout, payload, cb) => {
|
|
217
315
|
if (this.socketionamespace) {
|
|
316
|
+
this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);
|
|
218
317
|
this.socketionamespace.to(room).timeout(timeout).emit(payload.command, payload, (err, dataResponse) => {
|
|
219
318
|
if (err) {
|
|
220
319
|
console.error(err);
|
|
@@ -225,10 +324,10 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
|
|
|
225
324
|
//errorCause: err.cause,
|
|
226
325
|
//errorStack: err.stack
|
|
227
326
|
};
|
|
228
|
-
this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
|
|
327
|
+
this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
|
|
229
328
|
cb(errorResponse);
|
|
230
329
|
} else {
|
|
231
|
-
this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
|
|
330
|
+
this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
|
|
232
331
|
cb(dataResponse);
|
|
233
332
|
}
|
|
234
333
|
});
|
|
@@ -249,6 +348,7 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
|
|
|
249
348
|
}, timeout).unref();
|
|
250
349
|
rooms.forEach((room) => {
|
|
251
350
|
if (this.socketionamespace) {
|
|
351
|
+
this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);
|
|
252
352
|
this.socketionamespace.to(room).timeout(timeout).emit(payload.command, payload, (err, dataResponse) => {
|
|
253
353
|
if (err) {
|
|
254
354
|
console.error(err);
|
|
@@ -259,13 +359,13 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
|
|
|
259
359
|
//errorCause: err.cause,
|
|
260
360
|
//errorStack: err.stack
|
|
261
361
|
};
|
|
262
|
-
this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
|
|
362
|
+
this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
|
|
263
363
|
responses.push({
|
|
264
364
|
room,
|
|
265
365
|
responses: errorResponse
|
|
266
366
|
});
|
|
267
367
|
} else {
|
|
268
|
-
this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
|
|
368
|
+
this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
|
|
269
369
|
responses.push({
|
|
270
370
|
room,
|
|
271
371
|
responses: dataResponse
|
|
@@ -273,6 +373,7 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
|
|
|
273
373
|
}
|
|
274
374
|
if (responses.length === rooms.length) {
|
|
275
375
|
clearTimeout(timeoutForComplete);
|
|
376
|
+
this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: All complete, Responses Count: [${responses.length}] Invoke call back(responses)`);
|
|
276
377
|
cb(responses);
|
|
277
378
|
}
|
|
278
379
|
});
|
|
@@ -280,40 +381,64 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
|
|
|
280
381
|
});
|
|
281
382
|
});
|
|
282
383
|
};
|
|
283
|
-
|
|
384
|
+
ConnectionDrainingConnectionMiddleware = () => {
|
|
385
|
+
if (this.socketionamespace) {
|
|
386
|
+
this.socketionamespace.use((socket, next) => {
|
|
387
|
+
if (this.draining === true) {
|
|
388
|
+
next(new Error(`ConnectionDrainingConnectionMiddleware(): Error: [server connections draining (from a server disconnect)]`));
|
|
389
|
+
} else {
|
|
390
|
+
next();
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
SetupNamespace = () => {
|
|
284
396
|
if (this.io) {
|
|
397
|
+
this.LogDebugMessage(`SetupNamespace(): socketionamespace = io.of('/${this.namespace}/'`);
|
|
285
398
|
this.socketionamespace = this.io.of(`/${this.namespace}/`);
|
|
399
|
+
this.LogDebugMessage(`SetupNamespace(): ConnectionDrainingConnectionMiddleware()`);
|
|
400
|
+
this.ConnectionDrainingConnectionMiddleware();
|
|
401
|
+
this.LogDebugMessage(`SetupNamespace(): SetupConnectionMiddleware()`);
|
|
286
402
|
this.SetupConnectionMiddleware();
|
|
287
403
|
this.socketionamespace.on("connection", (socket) => {
|
|
288
|
-
this.LogDebugMessage(`Socket connected, ID: [${socket.id}]`);
|
|
289
|
-
this.LogDebugMessage(`Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);
|
|
290
|
-
this.LogDebugMessage(`Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);
|
|
291
|
-
this.LogDebugMessage(`Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);
|
|
292
|
-
this.LogDebugMessage(`Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);
|
|
404
|
+
this.LogDebugMessage(`SetupNamespace(): Socket connected, ID: [${socket.id}]`);
|
|
405
|
+
this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);
|
|
406
|
+
this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);
|
|
407
|
+
this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);
|
|
408
|
+
this.LogDebugMessage(`SetupNamespace(): Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);
|
|
409
|
+
this.LogDebugMessage(`SetupNamespace(): SetupMessageMiddleware(): Socket: [${socket.id}]`);
|
|
293
410
|
this.SetupMessageMiddleware(socket);
|
|
294
|
-
if (
|
|
295
|
-
rooms.map((room) => {
|
|
411
|
+
if (this.rooms && this.rooms.length > 0) {
|
|
412
|
+
this.rooms.map((room) => {
|
|
413
|
+
this.LogDebugMessage(`SetupNamespace(): Joining Room: [${room}], Socket: [${socket.id}]`);
|
|
296
414
|
this.JoinRoom(socket, room);
|
|
297
415
|
});
|
|
298
416
|
}
|
|
417
|
+
this.LogDebugMessage(`SetupNamespace(): SetupStandardEvents: Socket: [${socket.id}]`);
|
|
299
418
|
this.SetupStandardEvents(socket);
|
|
300
419
|
setTimeout(() => {
|
|
420
|
+
this.LogDebugMessage(`SetupNamespace(): SocketConnectCallBack(): Socket: [${socket.id}]`);
|
|
301
421
|
this.SocketConnectCallBack(socket);
|
|
302
422
|
}, 0);
|
|
423
|
+
this.LogDebugMessage(`SetupNamespace(): SocketEventsCallBack(): Socket: [${socket.id}]`);
|
|
303
424
|
this.SocketEventsCallBack(socket);
|
|
304
425
|
});
|
|
305
426
|
} else {
|
|
306
|
-
|
|
427
|
+
const errorMessage = `SetupNamespace(): Error: [No server attached]`;
|
|
428
|
+
this.LogErrorMessage(errorMessage);
|
|
429
|
+
throw new Error(errorMessage);
|
|
307
430
|
}
|
|
308
431
|
return this;
|
|
309
432
|
};
|
|
310
433
|
CloseNamespaceAdaptors = async () => {
|
|
311
434
|
if (this.socketionamespace) {
|
|
435
|
+
this.LogDebugMessage(`CloseNamespaceAdaptors(): this.socketionamespace.adapter.close()`);
|
|
312
436
|
await this.socketionamespace.adapter.close();
|
|
313
437
|
}
|
|
314
438
|
};
|
|
315
439
|
DisconnectNamespaceSockets = () => {
|
|
316
440
|
if (this.socketionamespace) {
|
|
441
|
+
this.LogDebugMessage(`DisconnectNamespaceSockets(): this.socketionamespace.disconnectSockets()`);
|
|
317
442
|
this.socketionamespace.disconnectSockets();
|
|
318
443
|
this.socketionamespace = void 0;
|
|
319
444
|
}
|
package/dist/node.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.mjs","sources":["../src/socketIoServer.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject, Sleep } from '@nsshunt/stsutils'\n\nimport { Server, Namespace, Socket, ServerOptions } from \"socket.io\";\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, STSServerSocket, \n InterServerEvents } from './commonTypes'\n\n//import { createClient, RedisClientType } from 'redis';\nimport { Redis } from 'ioredis';\n\nimport { createAdapter as clusterCreateAdapter } from '@socket.io/cluster-adapter'\nimport { createAdapter } from \"@socket.io/redis-streams-adapter\";\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport interface ISocketIoServerOpitons {\n listenPort?: number\n ioRedisMessageProcessorUrl?: string\n wssCustomPath?: string\n serverClusterMode?: boolean\n}\n \nexport abstract class SocketIoServer<ClientToServerEvents extends STSDefaultClientToServerEvents, ServerToClientEvents extends STSDefaultServerToClientEvents> extends TinyEmitter {\n protected namespace?: string\n protected socketionamespace?: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n //protected socketionamespace?: Namespace<ClientToServerEvents, ServerToClientEvents, InterServerEvents>\n protected logger?: ISTSLogger\n protected io?: Server<ClientToServerEvents, ServerToClientEvents>;\n //#redisClient: RedisClientType | Redis | null = null;\n protected redisClient?: Redis;\n protected listenPort?: number;\n protected socketIoCustomPath?: string;\n protected ioRedisMessageProcessorUrl?: string;\n protected serverClusterMode?: boolean;\n protected rooms?: string[];\n\n constructor() { // IProcessBase\n super();\n }\n\n protected LogErrorMessage(message: any) {\n if (this.logger) {\n this.logger.error(`${this.namespace}: ${message}`);\n }\n }\n\n protected LogDebugMessage(message: any) {\n if (this.logger) {\n this.logger.debug(`${this.namespace}: ${message}`);\n }\n }\n\n protected LogInfoMessage(message: any) {\n if (this.logger) {\n this.logger.info(`${this.namespace}: ${message}`);\n }\n }\n\n protected LogWarnMessage(message: any) {\n if (this.logger) {\n this.logger.warn(`${this.namespace}: ${message}`);\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // https://socket.io/docs/v4/server-socket-instance/#sockethandshake\n // https://socket.io/docs/v4/server-socket-instance/#socket-middlewares\n // Use this middleward to check every incomming connection\n protected SetupConnectionMiddleware = () => { };\n\n // Use this middleware to check every packet being received\n protected SetupMessageMiddleware = (socket: STSServerSocket) => { };\n\n protected SocketConnectCallBack = (socket: Socket<ClientToServerEvents, ServerToClientEvents>): void => { };\n\n protected SocketEventsCallBack = (socket: Socket<ClientToServerEvents, ServerToClientEvents>): void => { };\n\n protected GetConfig = (socketIoServeroptions: ISocketIoServerOpitons): Partial<ServerOptions> => {\n //this.#redisClient = createClient({url: this.#options.ioRedisMessageProcessorUrl});\n //await this.#redisClient.connect();\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare('') !== 0) {\n options.path = socketIoServeroptions.wssCustomPath;\n }\n\n return options;\n }\n\n protected SetEngineEvents = () => {\n if (this.io) {\n this.io.engine.on(\"connection_error\", (err) => {\n this.LogInfoMessage(err.req); // the request object\n this.LogInfoMessage(err.code); // the error code, for example 1\n this.LogInfoMessage(err.message); // the error message, for example \"Session ID unknown\"\n this.LogInfoMessage(err.context); // some additional error context\n });\n }\n }\n\n WithLogger = (logger: ISTSLogger) => {\n this.logger = logger;\n return this;\n }\n\n WithExistingServer = (server: Server) => {\n if (this.io) {\n throw new Error(`SocketIoServer:AttachServer(): Error: [Server already attached]`);\n }\n this.io = server;\n return this;\n }\n\n WithListenPort = (listenPort: number) => {\n this.listenPort = listenPort;\n return this;\n }\n\n WithSocketIoCustomPath = (socketIoCustomPath: string) => {\n this.socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithIoRedisMessageProcessorUrl = (ioRedisMessageProcessorUrl: string) => {\n this.ioRedisMessageProcessorUrl = ioRedisMessageProcessorUrl;\n return this;\n }\n\n WithClusterMode = (serverClusterMode: boolean) => {\n this.serverClusterMode = serverClusterMode;\n return this;\n }\n\n WithRooms = (rooms: string[]) => {\n this.rooms = rooms;\n return this;\n }\n\n WithNamespace = (namespace: string) => {\n this.namespace = namespace;\n return this;\n }\n\n StartServer = async (): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n //this.#io = require(\"socket.io\")(this.#httpServer, options);\n if (!this.namespace) {\n throw new Error(`SocketIoServer:StartServer(): Error: [namespace not specified]`);\n }\n\n if (!this.io) {\n if (!this.listenPort) {\n throw new Error(`SocketIoServer:StartServer(): Error: [listenPort not specified]`);\n }\n\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (this.ioRedisMessageProcessorUrl && this.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(this.ioRedisMessageProcessorUrl);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (this.serverClusterMode && this.serverClusterMode === true) {\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (this.socketIoCustomPath && this.socketIoCustomPath.localeCompare('') !== 0) {\n options.path = this.socketIoCustomPath;\n }\n\n this.io = new Server(this.listenPort, options);\n\n this.SetEngineEvents();\n\n await Sleep(500);\n }\n\n let autoJoinRooms: boolean;\n let rooms: string[];\n if (this.rooms && this.rooms.length > 0) {\n autoJoinRooms = true;\n rooms = [ ...this.rooms ];\n } else {\n autoJoinRooms = false;\n rooms = [ ];\n }\n\n this.SetupNamespace(rooms, autoJoinRooms);\n\n return this;\n }\n\n AttachServer = async (server: Server): Promise<void> => {\n if (this.io) {\n throw new Error(`SocketIoServer:AttachServer(): Error: [Server already attached]`);\n }\n this.io = server;\n }\n\n StopServer = async () => {\n if (this.io) {\n await this.CloseNamespaceAdaptors();\n this.DisconnectNamespaceSockets();\n\n await this.io.of('/').adapter.close();\n\n if (this.redisClient) {\n await this.redisClient.disconnect();\n await Sleep(50);\n }\n\n this.io.disconnectSockets();\n this.io = undefined;\n }\n }\n\n LeaveRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`Leaving room [${room}]`);\n socket.leave(room);\n };\n\n JoinRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`Socket joining room [${room}], ID: [${socket.id}]`);\n socket.join(room);\n };\n\n protected SetupStandardEvents = (socket: STSServerSocket): void => {\n socket.on('disconnect', (reason: string) => {\n this.LogDebugMessage(`socket disconnect, ID: [${socket.id}] [${reason}]`);\n });\n\n socket.on('disconnecting', (reason: string) => {\n this.LogDebugMessage(`socket disconnecting, ID: [${socket.id}] [${reason}]`);\n });\n\n socket.on('error', (error: Error) => {\n this.LogDebugMessage(`socket error, ID: [${socket.id}] [${error}]`);\n });\n\n socket.on(\"__STSdisconnect\", (reason: string) => {\n this.LogDebugMessage(`__STSdisconnect: socket disconnect, ID: [${socket.id}] [${reason}]`);\n });\n\n socket.on(\"__STSdisconnecting\", (reason, callBackResult) => {\n this.LogDebugMessage(`__STSdisconnecting: socket disconnecting, ID: [${socket.id}] [${reason}]`);\n callBackResult(\"__STSdisconnecting accepted by server.\");\n });\n\n socket.on('__STSjoinRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.JoinRoom(socket, room)\n });\n });\n\n socket.on('__STSleaveRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LeaveRoom(socket, room);\n });\n });\n\n socket.on('__STSsendToRoom', (rooms: string[], payload: { command: string, payload: JSONObject }): void => {\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}]`);\n this.socketionamespace.to(room).emit(payload.command as any, payload);\n }\n });\n });\n\n socket.on('__STSsendToRoomWithCallback', (room: string, timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n if (this.socketionamespace) {\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n cb(errorResponse);\n } else {\n this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n cb(dataResponse);\n }\n });\n }\n });\n\n socket.on('__STSsendToRoomsWithCallback', (rooms: string[], timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n const responses: any[] = [ ];\n\n const timeoutForComplete = setTimeout(() => {\n // for this timeout case, sent back the error response and the responses we have received so far ...\n responses.push({\n room: '',\n responses: {\n error: true,\n errorName: 'timeout',\n errorMessage: `__STSsendToRoomsWithCallback timeout: [${timeout}] before all responses received`\n }\n });\n cb(responses);\n }, timeout).unref();\n\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n responses.push({\n room,\n responses: errorResponse\n });\n } else {\n this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n responses.push({\n room,\n responses: dataResponse\n });\n }\n if (responses.length === rooms.length) {\n clearTimeout(timeoutForComplete);\n cb(responses);\n }\n });\n }\n });\n });\n }\n \n protected SetupNamespace = (rooms: string[], autoJoinRooms: boolean): SocketIoServer<ClientToServerEvents, ServerToClientEvents> => {\n // Create STS Command Centre Client namespace\n if (this.io) {\n this.socketionamespace = this.io.of(`/${this.namespace}/`);\n\n this.SetupConnectionMiddleware();\n\n this.socketionamespace.on(\"connection\", socket => {\n this.LogDebugMessage(`Socket connected, ID: [${socket.id}]`);\n this.LogDebugMessage(`Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);\n this.LogDebugMessage(`Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);\n this.LogDebugMessage(`Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);\n this.LogDebugMessage(`Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);\n\n this.SetupMessageMiddleware(socket);\n\n if (autoJoinRooms) {\n rooms.map((room) => {\n this.JoinRoom(socket, room);\n });\n }\n\n this.SetupStandardEvents(socket);\n\n setTimeout(() => {\n this.SocketConnectCallBack(socket);\n }, 0);\n\n this.SocketEventsCallBack(socket);\n });\n } else {\n throw new Error('SocketIoServer:SetupNamespace(): Error: [No server attached');\n }\n\n return this;\n }\n\n CloseNamespaceAdaptors = async (): Promise<void> => {\n if (this.socketionamespace) {\n await this.socketionamespace.adapter.close();\n }\n }\n\n DisconnectNamespaceSockets = (): void => {\n if (this.socketionamespace) {\n this.socketionamespace.disconnectSockets();\n this.socketionamespace = undefined;\n }\n }\n}\n"],"names":["TinyEmitter","clusterCreateAdapter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node.mjs","sources":["../src/socketIoServer.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject, Sleep } from '@nsshunt/stsutils'\n\nimport { Server, Namespace, Socket, ServerOptions } from \"socket.io\";\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, STSServerSocket, \n InterServerEvents } from './commonTypes'\n\n//import { createClient, RedisClientType } from 'redis';\nimport { Redis } from 'ioredis';\n\nimport { createAdapter as clusterCreateAdapter } from '@socket.io/cluster-adapter'\nimport { createAdapter } from \"@socket.io/redis-streams-adapter\";\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport interface ISocketIoServerOpitons {\n listenPort?: number\n ioRedisMessageProcessorUrl?: string\n wssCustomPath?: string\n serverClusterMode?: boolean\n}\n \nexport abstract class SocketIoServer<ClientToServerEvents extends STSDefaultClientToServerEvents, ServerToClientEvents extends STSDefaultServerToClientEvents> extends TinyEmitter {\n protected namespace?: string\n protected socketionamespace?: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n //protected socketionamespace?: Namespace<ClientToServerEvents, ServerToClientEvents, InterServerEvents>\n protected logger?: ISTSLogger\n protected io?: Server<ClientToServerEvents, ServerToClientEvents>;\n //#redisClient: RedisClientType | Redis | null = null;\n protected redisClient?: Redis;\n protected listenPort?: number;\n protected socketIoCustomPath?: string;\n protected ioRedisMessageProcessorUrl?: string;\n protected serverClusterMode?: boolean;\n protected rooms?: string[];\n protected serverName: string\n protected draining: boolean = false;\n protected attached: boolean = false;\n\n constructor(serverName: string) { // IProcessBase\n super();\n this.serverName = serverName;\n }\n\n protected get logPrefix(): string {\n if (this.namespace) {\n return `SocketIoServer[${this.serverName}:${this.namespace}]: `;\n } else {\n return `SocketIoServer[${this.serverName}:<No Namespace>]: `;\n }\n }\n\n protected LogErrorMessage(message: any) {\n if (this.logger) {\n this.logger.error(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogDebugMessage(message: any) {\n if (this.logger) {\n this.logger.debug(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogInfoMessage(message: any) {\n if (this.logger) {\n this.logger.info(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogWarnMessage(message: any) {\n if (this.logger) {\n this.logger.warn(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogSillyMessage(message: any) {\n if (this.logger) {\n this.logger.silly(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogVerboseMessage(message: any) {\n if (this.logger) {\n this.logger.verbose(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogHttpMessage(message: any) {\n if (this.logger) {\n this.logger.http(`${this.logPrefix}${message}`);\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // https://socket.io/docs/v4/server-socket-instance/#sockethandshake\n // https://socket.io/docs/v4/server-socket-instance/#socket-middlewares\n // Use this middleward to check every incomming connection\n protected SetupConnectionMiddleware = () => { };\n\n // Use this middleware to check every packet being received\n protected SetupMessageMiddleware = (socket: STSServerSocket) => { };\n\n protected SocketConnectCallBack = (socket: Socket<ClientToServerEvents, ServerToClientEvents>): void => { };\n\n protected SocketEventsCallBack = (socket: Socket<ClientToServerEvents, ServerToClientEvents>): void => { };\n\n /*\n protected GetConfig = (socketIoServeroptions: ISocketIoServerOpitons): Partial<ServerOptions> => {\n //this.#redisClient = createClient({url: this.#options.ioRedisMessageProcessorUrl});\n //await this.#redisClient.connect();\n this.LogDebugMessage(`GetConfig() transports: [ [websocket] ]`);\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);\n this.LogDebugMessage(`GetConfig() createAdapter(redis): redis url: [${socketIoServeroptions.ioRedisMessageProcessorUrl}]`);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {\n this.LogDebugMessage(`GetConfig() createAdapter(cluster)`);\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare('') !== 0) {\n this.LogDebugMessage(`GetConfig() wssCustomPath: [${socketIoServeroptions.wssCustomPath}]`);\n options.path = socketIoServeroptions.wssCustomPath;\n }\n\n return options;\n }\n */\n\n protected SetEngineEvents = () => {\n if (this.io) {\n this.io.engine.on(\"connection_error\", (err) => {\n this.LogWarnMessage(`SetEngineEvents(): connection_error`); // the request object\n this.LogWarnMessage(err.req); // the request object\n this.LogWarnMessage(err.code); // the error code, for example 1\n this.LogWarnMessage(err.message); // the error message, for example \"Session ID unknown\"\n this.LogWarnMessage(err.context); // some additional error context\n });\n }\n }\n\n WithLogger = (logger: ISTSLogger) => {\n this.logger = logger;\n return this;\n }\n\n WithListenPort = (listenPort: number) => {\n this.listenPort = listenPort;\n return this;\n }\n\n WithSocketIoCustomPath = (socketIoCustomPath: string) => {\n this.socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithIoRedisMessageProcessorUrl = (ioRedisMessageProcessorUrl: string) => {\n this.ioRedisMessageProcessorUrl = ioRedisMessageProcessorUrl;\n return this;\n }\n\n WithClusterMode = (serverClusterMode: boolean) => {\n this.serverClusterMode = serverClusterMode;\n return this;\n }\n\n WithRooms = (rooms: string[]) => {\n this.rooms = rooms;\n return this;\n }\n\n WithNamespace = (namespace: string) => {\n this.namespace = namespace;\n return this;\n }\n\n AttachSocketIoServer = async (server: Server): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n if (!this.io) {\n this.LogInfoMessage(`AttachServer(): io = server`);\n this.io = server;\n\n this.LogInfoMessage(`AttachServer(): attached = true`);\n this.attached = true;\n\n this.LogInfoMessage(`AttachServer(): SetupNamespace()`);\n this.SetupNamespace();\n } else {\n const errorMessage = (this.attached === true ? `AttachServer(): Server already exists (from AttachServer())` : `AttachServer(): Server already exists (from StartServer())`);\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n return this;\n }\n\n StartSocketIoServer = async (): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n //this.#io = require(\"socket.io\")(this.#httpServer, options);\n if (!this.namespace) {\n const errorMessage = `StartServer(): Error: [namespace not specified]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n if (!this.io) {\n if (!this.listenPort) {\n const errorMessage = `StartServer(): Error: [listenPort not specified]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n this.LogDebugMessage(`StartServer(): draining = false`);\n this.draining = false;\n\n this.LogDebugMessage(`StartServer(): transports: [ [websocket] ]`);\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (this.ioRedisMessageProcessorUrl && this.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(this.ioRedisMessageProcessorUrl);\n this.LogDebugMessage(`StartServer(): createAdapter(redis): redis url: [${this.ioRedisMessageProcessorUrl}]`);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (this.serverClusterMode && this.serverClusterMode === true) {\n this.LogDebugMessage(`StartServer(): createAdapter(cluster)`);\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (this.socketIoCustomPath && this.socketIoCustomPath.localeCompare('') !== 0) {\n this.LogDebugMessage(`StartServer(): socketIoCustomPath: [${this.socketIoCustomPath}]`);\n options.path = this.socketIoCustomPath;\n }\n\n this.LogDebugMessage(`StartServer(): new Server(): listenPort: [${this.listenPort}]`);\n this.io = new Server(this.listenPort, options);\n\n this.LogDebugMessage(`StartServer(): SetEngineEvents()`);\n this.SetEngineEvents();\n\n this.LogDebugMessage(`StartServer(): Sleeping ...`);\n await Sleep(500);\n this.LogDebugMessage(`StartServer(): Done Sleeping`);\n\n this.LogInfoMessage(`AttachServer(): attached = false`);\n this.attached = false;\n\n this.LogInfoMessage(`StartServer(): SetupNamespace()`);\n this.SetupNamespace();\n\n } else {\n const errorMessage = (this.attached === true ? `StartServer(): Server already exists (from AttachServer())` : `StartServer(): Server already exists (from StartServer())`);\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n return this;\n }\n\n DetachSockerIoServer = async (): Promise<void> => {\n if (this.io) {\n if (this.attached === true) {\n this.LogInfoMessage(`DetachServer(): StopNamespace()`);\n await this.StopNamespace();\n this.io = undefined;\n this.LogInfoMessage(`DetachServer(): attached = false`);\n this.attached = false;\n } else {\n const errorMessage = `DetachServer(): Error: [Server has not been attached. Use StopServer() to stop the socker.io server.]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n } else {\n const errorMessage = `DetachServer(): Error: [no server exists to DetachServer()]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n }\n\n StopSocketIoServer = async () => {\n if (this.io) {\n if (this.attached === false) {\n // We are now draining connections\n this.LogInfoMessage(`StopServer(): draining = true`);\n this.draining = true;\n\n this.LogInfoMessage(`StopServer(): StopNamespace()`);\n await this.StopNamespace();\n\n this.LogInfoMessage(`StopServer(): io.of('/').adapter.close()`);\n await this.io.of('/').adapter.close();\n\n if (this.redisClient) {\n this.LogInfoMessage(`StopServer(): redisClient.disconnect()`);\n await this.redisClient.disconnect();\n this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Sleeping...)`);\n await Sleep(50);\n this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Done Sleeping)`);\n }\n\n // boot all current connections\n this.LogInfoMessage(`StopServer(): io.disconnectSockets()`);\n this.io.disconnectSockets();\n\n // Stop any future connections, close this server (does not close the underlying http(s) server if io server via that method\n this.LogInfoMessage(`StopServer(): io.close()`);\n this.io.close();\n\n this.LogInfoMessage(`StopServer(): io = undefined`);\n this.io = undefined;\n } else {\n const errorMessage = `StopServer(): Cannot stop an attached server. The server created must handle stop/disconnections. Use StopNamespace() instead.`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n } else {\n const errorMessage = `StopServer(): Error: [no server exists to StopServer()]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n }\n\n LeaveRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`LeaveRoom(): Leaving room [${room}]`);\n socket.leave(room);\n };\n\n JoinRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`JoinRoom(): Socket joining room [${room}], ID: [${socket.id}]`);\n socket.join(room);\n };\n\n protected StopNamespace = async() => {\n this.LogInfoMessage(`StopServer(): CloseNamespaceAdaptors()`);\n await this.CloseNamespaceAdaptors();\n\n this.LogInfoMessage(`StopServer(): DisconnectNamespaceSockets()`);\n this.DisconnectNamespaceSockets();\n }\n\n protected SetupStandardEvents = (socket: STSServerSocket): void => {\n socket.on('disconnect', (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket disconnect, ID: [${socket.id}], reason: [${reason}]`);\n });\n\n socket.on('disconnecting', (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);\n });\n\n socket.on('error', (error: Error) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket error, ID: [${socket.id}], Error: [${error}]`);\n });\n\n socket.on(\"__STSdisconnect\", (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnect: socket disconnect, ID: [${socket.id}], reason: [${reason}]`);\n });\n\n socket.on(\"__STSdisconnecting\", (reason, callBackResult) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnecting: socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);\n callBackResult(\"__STSdisconnecting accepted by server.\");\n });\n\n socket.on('__STSjoinRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSjoinRoom: room: [${room}], socket: [${socket.id}]`);\n this.JoinRoom(socket, room)\n });\n });\n\n socket.on('__STSleaveRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSleaveRoom: room: [${room}], socket: [${socket.id}]`);\n this.LeaveRoom(socket, room);\n });\n });\n\n socket.on('__STSsendToRoom', (rooms: string[], payload: { command: string, payload: JSONObject }): void => {\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).emit(payload.command as any, payload);\n }\n });\n });\n\n socket.on('__STSsendToRoomWithCallback', (room: string, timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n cb(errorResponse);\n } else {\n this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n cb(dataResponse);\n }\n });\n }\n });\n\n socket.on('__STSsendToRoomsWithCallback', (rooms: string[], timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n const responses: any[] = [ ];\n\n const timeoutForComplete = setTimeout(() => {\n // for this timeout case, sent back the error response and the responses we have received so far ...\n responses.push({\n room: '',\n responses: {\n error: true,\n errorName: 'timeout',\n errorMessage: `__STSsendToRoomsWithCallback timeout: [${timeout}] before all responses received`\n }\n });\n cb(responses);\n }, timeout).unref();\n\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n responses.push({\n room,\n responses: errorResponse\n });\n } else {\n this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n responses.push({\n room,\n responses: dataResponse\n });\n }\n if (responses.length === rooms.length) {\n clearTimeout(timeoutForComplete);\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: All complete, Responses Count: [${responses.length}] Invoke call back(responses)`);\n cb(responses);\n }\n });\n }\n });\n });\n }\n\n protected ConnectionDrainingConnectionMiddleware = (): void => {\n if (this.socketionamespace) {\n this.socketionamespace.use((socket, next) => {\n if (this.draining === true) {\n next(new Error(`ConnectionDrainingConnectionMiddleware(): Error: [server connections draining (from a server disconnect)]`));\n } else {\n next();\n }\n });\n }\n }\n \n protected SetupNamespace = (): SocketIoServer<ClientToServerEvents, ServerToClientEvents> => {\n // Create STS Command Centre Client namespace\n if (this.io) {\n this.LogDebugMessage(`SetupNamespace(): socketionamespace = io.of('/${this.namespace}/'`);\n this.socketionamespace = this.io.of(`/${this.namespace}/`);\n\n this.LogDebugMessage(`SetupNamespace(): ConnectionDrainingConnectionMiddleware()`);\n this.ConnectionDrainingConnectionMiddleware();\n\n this.LogDebugMessage(`SetupNamespace(): SetupConnectionMiddleware()`);\n this.SetupConnectionMiddleware();\n\n this.socketionamespace.on(\"connection\", socket => {\n this.LogDebugMessage(`SetupNamespace(): Socket connected, ID: [${socket.id}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);\n\n this.LogDebugMessage(`SetupNamespace(): SetupMessageMiddleware(): Socket: [${socket.id}]`);\n this.SetupMessageMiddleware(socket);\n\n if (this.rooms && this.rooms.length > 0) {\n this.rooms.map((room) => {\n this.LogDebugMessage(`SetupNamespace(): Joining Room: [${room}], Socket: [${socket.id}]`);\n this.JoinRoom(socket, room);\n });\n }\n\n this.LogDebugMessage(`SetupNamespace(): SetupStandardEvents: Socket: [${socket.id}]`);\n this.SetupStandardEvents(socket);\n\n setTimeout(() => {\n this.LogDebugMessage(`SetupNamespace(): SocketConnectCallBack(): Socket: [${socket.id}]`);\n this.SocketConnectCallBack(socket);\n }, 0);\n\n this.LogDebugMessage(`SetupNamespace(): SocketEventsCallBack(): Socket: [${socket.id}]`);\n this.SocketEventsCallBack(socket);\n });\n } else {\n const errorMessage = `SetupNamespace(): Error: [No server attached]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n return this;\n }\n\n protected CloseNamespaceAdaptors = async (): Promise<void> => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`CloseNamespaceAdaptors(): this.socketionamespace.adapter.close()`);\n await this.socketionamespace.adapter.close();\n }\n }\n\n protected DisconnectNamespaceSockets = (): void => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`DisconnectNamespaceSockets(): this.socketionamespace.disconnectSockets()`);\n this.socketionamespace.disconnectSockets();\n this.socketionamespace = undefined;\n }\n }\n}\n"],"names":["TinyEmitter","clusterCreateAdapter"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nsshunt/stssocketioutils",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.16",
|
|
4
4
|
"description": "STS Socket.IO Utils",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
},
|
|
49
49
|
"homepage": "https://github.com/nsshunt/stssocketioutils#readme",
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@nsshunt/stsconfig": "^1.27.
|
|
51
|
+
"@nsshunt/stsconfig": "^1.27.43",
|
|
52
52
|
"@types/detect-node": "^2.0.2",
|
|
53
53
|
"@typescript-eslint/eslint-plugin": "^8.54.0",
|
|
54
54
|
"@typescript-eslint/parser": "^8.54.0",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"vitest": "^4.0.18"
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
|
-
"@nsshunt/stsutils": "^1.19.
|
|
63
|
+
"@nsshunt/stsutils": "^1.19.73",
|
|
64
64
|
"@socket.io/cluster-adapter": "^0.3.0",
|
|
65
65
|
"@socket.io/redis-streams-adapter": "^0.2.3",
|
|
66
66
|
"chalk": "^4.1.2",
|