@nsshunt/stssocketioutils 2.0.15 → 2.0.17
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/index.cjs
CHANGED
|
@@ -41,21 +41,33 @@ class SocketIoClient extends index.tinyEmitterExports.TinyEmitter {
|
|
|
41
41
|
#socketIoCustomPath;
|
|
42
42
|
#authToken;
|
|
43
43
|
#socket;
|
|
44
|
+
#reconnectTimeout = 2e3;
|
|
45
|
+
// default
|
|
44
46
|
constructor(name) {
|
|
45
47
|
super();
|
|
46
48
|
this.#name = name;
|
|
47
49
|
}
|
|
50
|
+
get logPrefix() {
|
|
51
|
+
return `SocketIoClient[${this.#name}]:`;
|
|
52
|
+
}
|
|
48
53
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
54
|
LogDebugMessage(message) {
|
|
50
|
-
if (this.#logger) this.#logger.debug(message);
|
|
55
|
+
if (this.#logger) this.#logger.debug(`${this.logPrefix}${message}`);
|
|
51
56
|
}
|
|
52
57
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
53
58
|
LogErrorMessage(message) {
|
|
54
|
-
if (this.#logger) this.#logger.error(message);
|
|
59
|
+
if (this.#logger) this.#logger.error(`${this.logPrefix}${message}`);
|
|
60
|
+
}
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
62
|
+
LogWarningMessage(message) {
|
|
63
|
+
if (this.#logger) this.#logger.warn(`${this.logPrefix}${message}`);
|
|
55
64
|
}
|
|
56
65
|
get name() {
|
|
57
66
|
return this.#name;
|
|
58
67
|
}
|
|
68
|
+
get reconnectTimeout() {
|
|
69
|
+
return this.#reconnectTimeout;
|
|
70
|
+
}
|
|
59
71
|
get agentManager() {
|
|
60
72
|
return this.#agentManager;
|
|
61
73
|
}
|
|
@@ -94,6 +106,10 @@ class SocketIoClient extends index.tinyEmitterExports.TinyEmitter {
|
|
|
94
106
|
this.#agentManager = agentManager;
|
|
95
107
|
return this;
|
|
96
108
|
}
|
|
109
|
+
WithReconnectTimeout(reconnectTimeout) {
|
|
110
|
+
this.#reconnectTimeout = reconnectTimeout;
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
97
113
|
SetupSocket() {
|
|
98
114
|
if (!this.#address) {
|
|
99
115
|
throw new Error(`SocketIoClientHelper:SetupSocket(): Error: [address not provided]`);
|
|
@@ -126,9 +142,9 @@ class SocketIoClient extends index.tinyEmitterExports.TinyEmitter {
|
|
|
126
142
|
}
|
|
127
143
|
this.#socket = void 0;
|
|
128
144
|
if (isNode) {
|
|
129
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
145
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
|
|
130
146
|
} else {
|
|
131
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
147
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
|
|
132
148
|
}
|
|
133
149
|
return;
|
|
134
150
|
}
|
|
@@ -139,7 +155,7 @@ class SocketIoClient extends index.tinyEmitterExports.TinyEmitter {
|
|
|
139
155
|
};
|
|
140
156
|
if (this.#agentManager) {
|
|
141
157
|
if (!this.#address) {
|
|
142
|
-
throw new Error(`
|
|
158
|
+
throw new Error(`SocketIoClient:SetupSocket(): Error: [address not provided when using agentManager]`);
|
|
143
159
|
}
|
|
144
160
|
socketOptions.agent = this.#agentManager.GetAgent(this.#address);
|
|
145
161
|
}
|
|
@@ -160,58 +176,58 @@ class SocketIoClient extends index.tinyEmitterExports.TinyEmitter {
|
|
|
160
176
|
}
|
|
161
177
|
this.#socket = socket_ioClient.io(this.#address, socketOptions);
|
|
162
178
|
this.#socket.io.on("error", (err) => {
|
|
163
|
-
this.LogErrorMessage(`
|
|
179
|
+
this.LogErrorMessage(`socketDetail.socket.io.on('error'): [${err}] Address: [${this.#address}]`);
|
|
164
180
|
});
|
|
165
181
|
this.#socket.io.on("reconnect_error", (err) => {
|
|
166
|
-
this.LogErrorMessage(`
|
|
182
|
+
this.LogErrorMessage(`socketDetail.socket.io.on('reconnect_error'): [${err}] Address: [${this.#address}]`);
|
|
167
183
|
});
|
|
168
184
|
this.#socket.on("connect_error", (err) => {
|
|
169
|
-
this.LogErrorMessage(`
|
|
185
|
+
this.LogErrorMessage(`socketDetail.socket.on('connect_error'): [${err}] Address: [${this.#address}]`);
|
|
170
186
|
});
|
|
171
187
|
this.#socket.io.on("reconnect", (attempt) => {
|
|
172
|
-
this.LogErrorMessage(`
|
|
188
|
+
this.LogErrorMessage(`socketDetail.socket.io.on('reconnect'): Number: [${attempt}] Address: [${this.#address}]`);
|
|
173
189
|
});
|
|
174
190
|
this.#socket.on("connect", () => {
|
|
175
191
|
if (this.#socket) {
|
|
176
|
-
this.LogDebugMessage(`
|
|
192
|
+
this.LogDebugMessage(`Socket: [${this.#socket.id}]: connected, Address: [${this.#address}]`);
|
|
177
193
|
setTimeout(() => {
|
|
178
194
|
this.ConnectCallBack(this.#socket);
|
|
179
195
|
}, 0);
|
|
180
196
|
this.SocketEventsCallBack(this.#socket);
|
|
181
197
|
} else {
|
|
182
|
-
const errorMessage = "
|
|
198
|
+
const errorMessage = "Could not get socket object from socket.io, Address: [${socketDetail.address}]";
|
|
183
199
|
this.LogErrorMessage(errorMessage);
|
|
184
200
|
this.ErrorCallBack(new Error(errorMessage));
|
|
185
201
|
}
|
|
186
202
|
});
|
|
187
203
|
this.#socket.on("disconnect", (reason) => {
|
|
188
|
-
this.LogDebugMessage("
|
|
204
|
+
this.LogDebugMessage("socket disconnect: " + reason);
|
|
189
205
|
switch (reason) {
|
|
190
206
|
case "io server disconnect":
|
|
191
207
|
{
|
|
192
|
-
this.LogDebugMessage("
|
|
193
|
-
this.LogDebugMessage("
|
|
208
|
+
this.LogDebugMessage("The server disconnected using disconnectSockets, i.e. normal safe shutdown from explicit disconnection by the server.");
|
|
209
|
+
this.LogDebugMessage("The connection will be re-established when the server becomes available.");
|
|
194
210
|
this.#socket = void 0;
|
|
195
211
|
if (isNode) {
|
|
196
212
|
if (this.#agentManager) {
|
|
197
213
|
this.#agentManager.ResetAgent();
|
|
198
214
|
}
|
|
199
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
215
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
|
|
200
216
|
} else {
|
|
201
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
217
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
|
|
202
218
|
}
|
|
203
219
|
}
|
|
204
220
|
break;
|
|
205
221
|
case "io client disconnect":
|
|
206
|
-
this.LogDebugMessage("
|
|
207
|
-
this.LogDebugMessage("
|
|
222
|
+
this.LogDebugMessage("The client disconnected using disconnectSockets, i.e. normal safe disconnection from explicit disconnection by the client.");
|
|
223
|
+
this.LogDebugMessage("The connection will not be re-established automatically.");
|
|
208
224
|
break;
|
|
209
225
|
case "transport close":
|
|
210
226
|
case "ping timeout":
|
|
211
227
|
case "transport error":
|
|
212
228
|
{
|
|
213
|
-
this.LogDebugMessage(`
|
|
214
|
-
this.LogDebugMessage("
|
|
229
|
+
this.LogDebugMessage(`Server unexpectedly disconnected. Reason: [${reason}]`);
|
|
230
|
+
this.LogDebugMessage("The connection will be re-established when the server becomes available.");
|
|
215
231
|
if (this.#socket) {
|
|
216
232
|
this.#socket.disconnect();
|
|
217
233
|
}
|
|
@@ -220,9 +236,9 @@ class SocketIoClient extends index.tinyEmitterExports.TinyEmitter {
|
|
|
220
236
|
if (this.#agentManager) {
|
|
221
237
|
this.#agentManager?.ResetAgent();
|
|
222
238
|
}
|
|
223
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
239
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
|
|
224
240
|
} else {
|
|
225
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
241
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
|
|
226
242
|
}
|
|
227
243
|
}
|
|
228
244
|
break;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/commonTypes.ts","../node_modules/detect-node/index.esm.js","../src/socketIoClient.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { Server, Socket, Namespace } from \"socket.io\";\nimport { ISTSLogger } from '@nsshunt/stsutils'\n\nexport interface STSDefaultClientToServerEvents {\n /**\n * Join the room(s) specified for this client.\n * @param room The room(s) to join for this client.\n * @returns \n */\n\t__STSjoinRoom: (room: string[]) => void;\n\n /**\n * Remove this client from the specified room(s).\n * @param room The room(s) to remove the client from within the server.\n * @returns \n */\n\t__STSleaveRoom: (room: string[]) => void;\n\n /**\n * Alerts the server that this client has flagged to disconnect. Allows server to perform clean-up if required. The server must call-back with the result of the disconnecting event.\n * @param reason Reason for the disconnecting event.\n * @param callback The server must call-back with the result of the disconnecting event.\n * @returns \n */\n\t__STSdisconnecting: (reason: string, callback: (data: string) => void) => void;\n\n /**\n * Alerts the server to disconnect this client.\n * @param reason Reason for the disconnect event.\n * @returns \n */\n\t__STSdisconnect: (reason: string) => void; // server and client event\n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param rooms Room array for broadcasting.\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n * @returns \n */\n __STSsendToRoom: (rooms: string[], payload: { command: string, payload: any }) => void;\n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param room Single room for broadcasting.\n\t * @param timeout Number of ms to try and get responses from all clients\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n\t * @param callback The callback function to be invoked once all clients have responded with their respective payloads\n * @returns \n */\n __STSsendToRoomWithCallback: (room: string, timeout: number, payload: { command: string, payload: any }, callback: (data: any) => void) => void; \n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param rooms Array of rooms for broadcasting.\n\t * @param timeout Number of ms to try and get responses from all clients\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n\t * @param callback The callback function to be invoked once all clients have responded with their respective payloads\n * @returns \n */\n __STSsendToRoomsWithCallback: (rooms: string[], timeout: number, payload: { command: string, payload: any }, callback: (data: any) => void) => void; \n}\n\nexport interface STSDefaultServerToClientEvents {\n /**\n * The server may emit an unsolicited disconnect event to flag that all clients should disconnect. Most likely becuase the server may be shutting down.\n * @param reason Reason why the server is emitting this disconnect event.\n * @returns \n */\n\t__STSdisconnect: (reason: string) => void;\n}\n\nexport enum STSNamespace {\n\tSTSMonitor = 'stsinstrumentmanager/stsmonitor',\n\tSTSControl = 'stsinstrumentmanager/stscontrol',\n STSTestingNamespace = 'ststestingnamespace/ststesting'\n}\n\nexport enum STSRoom {\n\t// STSMonitor rooms\n\tSTSInstrumentDataRoom = 'stsinstrumentdataroom', // This room is for all instrument data messages\n\tSTSInstrumentDataSubscriptionRoom = 'stsinstrumentdatasubscriptionroom', // This room is only for subscribed instrument data messages\n\n\t// STSControl rooms\n\tSTSRunnerRoom = 'stsrunnerroom',\n\tSTSNodeRunnerRoom = 'stsnoderunnerroom'\n}\n\nexport enum STSEvent {\n\t// STSInstrumentData\n\tSTSInstrumentData = 'stsinstrumentdata',\n\tSTSSubInstrumentData = 'stssubinstrumentdata', // sub-scribed instrument data. This only outputs the nodes that have been subscribed by the client(s).\n\tSTSResetInstrumentData = 'stsresetinstrumentdata',\n\n\tSTSStartLoggingInstrumentData = 'stsStartLoggingInstrumentData',\n\tSTSStopLoggingInstrumentData = 'stsStopLoggingInstrumentData',\n\n\t// STSRunner events\n\tSTSStart = 'stsstart', // Start a test run with options as payload.\n\tSTSStop = 'stsstop', // Stop test run(s).\n\tSTSPause = 'stspause', // Pause test run(s).\n\tSTSResume = 'stsresume', // Resume test run(s).\n\tSTSTerminate = 'ststerminate', // Terminate runner instances and exit applications.\n\t// This may also be uysed to force trigger self healing (i.e. auto re-start) when\n\t// running within a container orchestrator such as K8, K3 or Docker Swarm.\n\tSTSUpdateStaticConfig = 'stsupdatestaticconfig', // Update base configuration. Options as payload.\n\tSTSUpdateDynamicConfig = 'stsupdatedynamicconfig', // Update running configuration. This is used\n\t// to control the runnning behaviour of test(s) in-flight. Options as payload.\n\n\tSTSSendToRoom = 'sendToRoom',\n\n\t// Standard socket events\n\tconnect = 'connect'\n}\n\n// https://socket.io/docs/v4/typescript/\n\nexport interface InterServerEvents {\n\tping: () => void;\n}\n\nexport interface STSSocketIONamespace {\n\tnamespace: string\n\tpid: number\n\tsocketionamespace: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n}\n\nexport type STSSocketIONamespaces = Record<string, STSSocketIONamespace>;\n\nexport type STSServerSocket = Socket<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\nexport type STSClientSocket = Socket<STSDefaultServerToClientEvents, STSDefaultClientToServerEvents, InterServerEvents>\n","// Only Node.JS has a process variable that is of [[Class]] process\nexport default Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n","import { io, SocketOptions, ManagerOptions, Socket } from 'socket.io-client'\n//import { EventNames, EventParams } from \"@socket.io/component-emitter\";\n\nimport isNode from 'detect-node';\n\nimport { ISTSLogger, AgentManager } from '@nsshunt/stsutils'\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents } from './commonTypes'\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport abstract class SocketIoClient<ServerToClientEvents extends STSDefaultServerToClientEvents, ClientToServerEvents extends STSDefaultClientToServerEvents> extends TinyEmitter {\n #agentManager?: AgentManager\n #logger?: ISTSLogger\n #name: string\n #address?: string\n #socketIoCustomPath?: string\n #authToken?: string\n #socket?: Socket<ServerToClientEvents, ClientToServerEvents>;\n\n constructor(name: string) {\n super();\n this.#name = name;\n }\n \n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogDebugMessage(message: any): void {\n if (this.#logger) this.#logger.debug(message);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogErrorMessage(message: any): void {\n if (this.#logger) this.#logger.error(message);\n }\n\n get name(): string {\n return this.#name;\n }\n\n get agentManager(): AgentManager | undefined {\n return this.#agentManager;\n }\n\n get logger(): ISTSLogger | undefined {\n return this.#logger;\n }\n\n get address(): string | undefined {\n return this.#address;\n }\n\n get authToken(): string | undefined {\n return this.#authToken;\n }\n\n get socketIoCustomPath(): string | undefined {\n return this.#socketIoCustomPath;\n }\n\n get socket(): Socket<ServerToClientEvents, ClientToServerEvents> | undefined {\n return this.#socket;\n }\n\n WithAddress(address: string) {\n this.#address = address;\n return this;\n }\n\n WithAuthToken(authToken: string) {\n this.#authToken = authToken;\n return this;\n }\n\n WithSocketIoCustomPath(socketIoCustomPath: string) {\n this.#socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithLogger(logger: ISTSLogger) {\n this.#logger = logger;\n return this;\n }\n\n WithAgentManager(agentManager: AgentManager) {\n this.#agentManager = agentManager;\n return this;\n }\n\n SetupSocket() {\n if (!this.#address) {\n throw new Error(`SocketIoClientHelper:SetupSocket(): Error: [address not provided]`);\n }\n\n this.#EstablishSocketConnect();\n\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected ConnectCallBack(socket: Socket<ServerToClientEvents, ClientToServerEvents>): void { };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected SocketEventsCallBack(socket: Socket<ServerToClientEvents, ClientToServerEvents>): void { };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected ErrorCallBack(error: Error): void { };\n\n /*\n emit<Ev extends EventNames<ClientToServerEvents>>(ev: Ev, ...args: EventParams<ClientToServerEvents, Ev>): Socket<ServerToClientEvents, ClientToServerEvents> {\n if (this.#socket) {\n return this.#socket!.emit(ev, ...args);\n } else {\n throw new Error('SocketIoClient:emit(): Error: [socket instance not defined.]');\n }\n }\n */\n\n #EstablishSocketConnect(): void {\n if (this.#socket !== undefined) {\n // We already have a socket object (may or may not be connected)\n if (this.#socket.connected === true) {\n this.#socket.disconnect();\n }\n this.#socket = undefined;\n if (isNode) {\n setTimeout(() => this.#EstablishSocketConnect(), 100).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), 100); //@@ config\n }\n return;\n }\n\n let socketOptions: Partial<SocketOptions & ManagerOptions>;\n if (isNode) {\n // https://socket.io/docs/v4/client-options/#reconnection\n // https://github.com/socketio/engine.io-client#methods\n socketOptions = {\n transports: [\"websocket\" ]\n }\n if (this.#agentManager) {\n if (!this.#address) {\n throw new Error(`SocketIoClientHelper:SetupSocket(): Error: [address not provided when using agentManager]`);\n }\n socketOptions.agent = this.#agentManager.GetAgent(this.#address);\n }\n } else {\n socketOptions = {\n transports: [\"websocket\" ]\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // Send auth token for connections\n if (this.#authToken) {\n socketOptions.auth = (cb) => {\n cb({\n token: this.#authToken\n });\n }\n }\n\n // On Server use;\n /*\n io.use((socket, next) => {\n const token = socket.handshake.auth.token;\n // ...\n });\n */\n\n if (this.#socketIoCustomPath && this.#socketIoCustomPath.localeCompare('') !== 0) {\n socketOptions.path = this.#socketIoCustomPath;\n }\n\n this.#socket = io(this.#address, socketOptions) as Socket<ServerToClientEvents, ClientToServerEvents>\n\n // Manager errors\n this.#socket.io.on('error', (err: Error) => {\n this.LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.io.on('error'): [${err}] Address: [${this.#address}]`);\n });\n\n this.#socket.io.on('reconnect_error', (err: Error) => {\n this.LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.io.on('reconnect_error'): [${err}] Address: [${this.#address}]`);\n });\n\n // suppress automatic console logging by not letting it bubble up\n this.#socket.on(\"connect_error\", (err) => {\n this.LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.on('connect_error'): [${err}] Address: [${this.#address}]`);\n });\n\n this.#socket.io.on('reconnect', (attempt: number) => {\n this.LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.io.on('reconnect'): Number: [${attempt}] Address: [${this.#address}]`);\n });\n\n /*\n this.#socket.on(\"connect_timeout\", () => {\n this.#LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.on('connect_timeout') Address: [${this.#address}]`);\n });\n */\n\n this.#socket.on(\"connect\", () => {\n if (this.#socket) {\n this.LogDebugMessage(`SocketIoClientHelper(): Socket: [${this.#socket.id}]: connected, Address: [${this.#address}]`);\n\n setTimeout(() => {\n this.ConnectCallBack(this.#socket as Socket<ServerToClientEvents, ClientToServerEvents>);\n }, 0);\n\n this.SocketEventsCallBack(this.#socket);\n\n } else {\n const errorMessage: string = 'SocketIoClientHelper(): Could not get socket object from socket.io, Address: [${socketDetail.address}]';\n this.LogErrorMessage(errorMessage);\n this.ErrorCallBack(new Error(errorMessage));\n }\n })\n\n // https://socket.io/docs/v4/client-socket-instance/#disconnect\n this.#socket.on(\"disconnect\", (reason: string) => {\n this.LogDebugMessage('SocketIoClientHelper(): socket disconnect: ' + reason);\n switch (reason) {\n case 'io server disconnect' : {\n // The server disconnect using disconnectSockets (i.e. normal safe shutdown)\n this.LogDebugMessage('SocketIoClientHelper(): The server disconnected using disconnectSockets, i.e. normal safe shutdown from explicit disconnection by the server.');\n this.LogDebugMessage('SocketIoClientHelper(): The connection will be re-established when the server becomes available.');\n this.#socket = undefined;\n if (isNode) {\n if (this.#agentManager) {\n this.#agentManager.ResetAgent();\n }\n setTimeout(() => this.#EstablishSocketConnect(), 100).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), 100); //@@ config\n }\n }\n break;\n case 'io client disconnect' :\n this.LogDebugMessage('SocketIoClientHelper(): The client disconnected using disconnectSockets, i.e. normal safe disconnection from explicit disconnection by the client.');\n this.LogDebugMessage('SocketIoClientHelper(): The connection will not be re-established automatically.');\n // Do nothing\n break;\n case 'transport close' :\n case 'ping timeout' :\n case 'transport error' : {\n this.LogDebugMessage(`SocketIoClientHelper(): Server unexpectedly disconnected. Reason: [${reason}]`);\n this.LogDebugMessage('SocketIoClientHelper(): The connection will be re-established when the server becomes available.');\n if (this.#socket) {\n this.#socket.disconnect();\n }\n this.#socket = undefined;\n if (isNode) {\n if (this.#agentManager) {\n this.#agentManager?.ResetAgent();\n }\n setTimeout(() => this.#EstablishSocketConnect(), 100).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), 100); //@@ config\n }\n }\n break;\n }\n });\n }\n}\n"],"names":["STSNamespace","STSRoom","STSEvent","TinyEmitter","io"],"mappings":"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","x_google_ignoreList":[1]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/commonTypes.ts","../node_modules/detect-node/index.esm.js","../src/socketIoClient.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { Server, Socket, Namespace } from \"socket.io\";\nimport { ISTSLogger } from '@nsshunt/stsutils'\n\nexport interface STSDefaultClientToServerEvents {\n /**\n * Join the room(s) specified for this client.\n * @param room The room(s) to join for this client.\n * @returns \n */\n\t__STSjoinRoom: (room: string[]) => void;\n\n /**\n * Remove this client from the specified room(s).\n * @param room The room(s) to remove the client from within the server.\n * @returns \n */\n\t__STSleaveRoom: (room: string[]) => void;\n\n /**\n * Alerts the server that this client has flagged to disconnect. Allows server to perform clean-up if required. The server must call-back with the result of the disconnecting event.\n * @param reason Reason for the disconnecting event.\n * @param callback The server must call-back with the result of the disconnecting event.\n * @returns \n */\n\t__STSdisconnecting: (reason: string, callback: (data: string) => void) => void;\n\n /**\n * Alerts the server to disconnect this client.\n * @param reason Reason for the disconnect event.\n * @returns \n */\n\t__STSdisconnect: (reason: string) => void; // server and client event\n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param rooms Room array for broadcasting.\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n * @returns \n */\n __STSsendToRoom: (rooms: string[], payload: { command: string, payload: any }) => void;\n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param room Single room for broadcasting.\n\t * @param timeout Number of ms to try and get responses from all clients\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n\t * @param callback The callback function to be invoked once all clients have responded with their respective payloads\n * @returns \n */\n __STSsendToRoomWithCallback: (room: string, timeout: number, payload: { command: string, payload: any }, callback: (data: any) => void) => void; \n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param rooms Array of rooms for broadcasting.\n\t * @param timeout Number of ms to try and get responses from all clients\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n\t * @param callback The callback function to be invoked once all clients have responded with their respective payloads\n * @returns \n */\n __STSsendToRoomsWithCallback: (rooms: string[], timeout: number, payload: { command: string, payload: any }, callback: (data: any) => void) => void; \n}\n\nexport interface STSDefaultServerToClientEvents {\n /**\n * The server may emit an unsolicited disconnect event to flag that all clients should disconnect. Most likely becuase the server may be shutting down.\n * @param reason Reason why the server is emitting this disconnect event.\n * @returns \n */\n\t__STSdisconnect: (reason: string) => void;\n}\n\nexport enum STSNamespace {\n\tSTSMonitor = 'stsinstrumentmanager/stsmonitor',\n\tSTSControl = 'stsinstrumentmanager/stscontrol',\n STSTestingNamespace = 'ststestingnamespace/ststesting'\n}\n\nexport enum STSRoom {\n\t// STSMonitor rooms\n\tSTSInstrumentDataRoom = 'stsinstrumentdataroom', // This room is for all instrument data messages\n\tSTSInstrumentDataSubscriptionRoom = 'stsinstrumentdatasubscriptionroom', // This room is only for subscribed instrument data messages\n\n\t// STSControl rooms\n\tSTSRunnerRoom = 'stsrunnerroom',\n\tSTSNodeRunnerRoom = 'stsnoderunnerroom'\n}\n\nexport enum STSEvent {\n\t// STSInstrumentData\n\tSTSInstrumentData = 'stsinstrumentdata',\n\tSTSSubInstrumentData = 'stssubinstrumentdata', // sub-scribed instrument data. This only outputs the nodes that have been subscribed by the client(s).\n\tSTSResetInstrumentData = 'stsresetinstrumentdata',\n\n\tSTSStartLoggingInstrumentData = 'stsStartLoggingInstrumentData',\n\tSTSStopLoggingInstrumentData = 'stsStopLoggingInstrumentData',\n\n\t// STSRunner events\n\tSTSStart = 'stsstart', // Start a test run with options as payload.\n\tSTSStop = 'stsstop', // Stop test run(s).\n\tSTSPause = 'stspause', // Pause test run(s).\n\tSTSResume = 'stsresume', // Resume test run(s).\n\tSTSTerminate = 'ststerminate', // Terminate runner instances and exit applications.\n\t// This may also be uysed to force trigger self healing (i.e. auto re-start) when\n\t// running within a container orchestrator such as K8, K3 or Docker Swarm.\n\tSTSUpdateStaticConfig = 'stsupdatestaticconfig', // Update base configuration. Options as payload.\n\tSTSUpdateDynamicConfig = 'stsupdatedynamicconfig', // Update running configuration. This is used\n\t// to control the runnning behaviour of test(s) in-flight. Options as payload.\n\n\tSTSSendToRoom = 'sendToRoom',\n\n\t// Standard socket events\n\tconnect = 'connect'\n}\n\n// https://socket.io/docs/v4/typescript/\n\nexport interface InterServerEvents {\n\tping: () => void;\n}\n\nexport interface STSSocketIONamespace {\n\tnamespace: string\n\tpid: number\n\tsocketionamespace: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n}\n\nexport type STSSocketIONamespaces = Record<string, STSSocketIONamespace>;\n\nexport type STSServerSocket = Socket<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\nexport type STSClientSocket = Socket<STSDefaultServerToClientEvents, STSDefaultClientToServerEvents, InterServerEvents>\n","// Only Node.JS has a process variable that is of [[Class]] process\nexport default Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n","import { io, SocketOptions, ManagerOptions, Socket } from 'socket.io-client'\n//import { EventNames, EventParams } from \"@socket.io/component-emitter\";\n\nimport isNode from 'detect-node';\n\nimport { ISTSLogger, AgentManager } from '@nsshunt/stsutils'\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents } from './commonTypes'\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport abstract class SocketIoClient<ServerToClientEvents extends STSDefaultServerToClientEvents, ClientToServerEvents extends STSDefaultClientToServerEvents> extends TinyEmitter {\n #agentManager?: AgentManager\n #logger?: ISTSLogger\n #name: string\n #address?: string\n #socketIoCustomPath?: string\n #authToken?: string\n #socket?: Socket<ServerToClientEvents, ClientToServerEvents>;\n #reconnectTimeout: number = 2000; // default\n\n constructor(name: string) {\n super();\n this.#name = name;\n }\n \n protected get logPrefix(): string {\n return `SocketIoClient[${this.#name}]:`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogDebugMessage(message: any): void {\n if (this.#logger) this.#logger.debug(`${this.logPrefix}${message}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogErrorMessage(message: any): void {\n if (this.#logger) this.#logger.error(`${this.logPrefix}${message}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogWarningMessage(message: any): void {\n if (this.#logger) this.#logger.warn(`${this.logPrefix}${message}`);\n }\n\n get name(): string {\n return this.#name;\n }\n\n get reconnectTimeout(): number {\n return this.#reconnectTimeout;\n }\n\n get agentManager(): AgentManager | undefined {\n return this.#agentManager;\n }\n\n get logger(): ISTSLogger | undefined {\n return this.#logger;\n }\n\n get address(): string | undefined {\n return this.#address;\n }\n\n get authToken(): string | undefined {\n return this.#authToken;\n }\n\n get socketIoCustomPath(): string | undefined {\n return this.#socketIoCustomPath;\n }\n\n get socket(): Socket<ServerToClientEvents, ClientToServerEvents> | undefined {\n return this.#socket;\n }\n\n WithAddress(address: string) {\n this.#address = address;\n return this;\n }\n\n WithAuthToken(authToken: string) {\n this.#authToken = authToken;\n return this;\n }\n\n WithSocketIoCustomPath(socketIoCustomPath: string) {\n this.#socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithLogger(logger: ISTSLogger) {\n this.#logger = logger;\n return this;\n }\n\n WithAgentManager(agentManager: AgentManager) {\n this.#agentManager = agentManager;\n return this;\n }\n\n WithReconnectTimeout(reconnectTimeout: number) {\n this.#reconnectTimeout = reconnectTimeout;\n return this;\n }\n\n SetupSocket() {\n if (!this.#address) {\n throw new Error(`SocketIoClientHelper:SetupSocket(): Error: [address not provided]`);\n }\n\n this.#EstablishSocketConnect();\n\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected ConnectCallBack(socket: Socket<ServerToClientEvents, ClientToServerEvents>): void { };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected SocketEventsCallBack(socket: Socket<ServerToClientEvents, ClientToServerEvents>): void { };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected ErrorCallBack(error: Error): void { };\n\n /*\n emit<Ev extends EventNames<ClientToServerEvents>>(ev: Ev, ...args: EventParams<ClientToServerEvents, Ev>): Socket<ServerToClientEvents, ClientToServerEvents> {\n if (this.#socket) {\n return this.#socket!.emit(ev, ...args);\n } else {\n throw new Error('SocketIoClient:emit(): Error: [socket instance not defined.]');\n }\n }\n */\n\n #EstablishSocketConnect(): void {\n if (this.#socket !== undefined) {\n // We already have a socket object (may or may not be connected)\n if (this.#socket.connected === true) {\n this.#socket.disconnect();\n }\n this.#socket = undefined;\n if (isNode) {\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout); //@@ config\n }\n return;\n }\n\n let socketOptions: Partial<SocketOptions & ManagerOptions>;\n if (isNode) {\n // https://socket.io/docs/v4/client-options/#reconnection\n // https://github.com/socketio/engine.io-client#methods\n socketOptions = {\n transports: [\"websocket\" ]\n }\n if (this.#agentManager) {\n if (!this.#address) {\n throw new Error(`SocketIoClient:SetupSocket(): Error: [address not provided when using agentManager]`);\n }\n socketOptions.agent = this.#agentManager.GetAgent(this.#address);\n }\n } else {\n socketOptions = {\n transports: [\"websocket\" ]\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // Send auth token for connections\n if (this.#authToken) {\n socketOptions.auth = (cb) => {\n cb({\n token: this.#authToken\n });\n }\n }\n\n // On Server use;\n /*\n io.use((socket, next) => {\n const token = socket.handshake.auth.token;\n // ...\n });\n */\n\n if (this.#socketIoCustomPath && this.#socketIoCustomPath.localeCompare('') !== 0) {\n socketOptions.path = this.#socketIoCustomPath;\n }\n\n this.#socket = io(this.#address, socketOptions) as Socket<ServerToClientEvents, ClientToServerEvents>\n\n // Manager errors\n this.#socket.io.on('error', (err: Error) => {\n this.LogErrorMessage(`socketDetail.socket.io.on('error'): [${err}] Address: [${this.#address}]`);\n });\n\n this.#socket.io.on('reconnect_error', (err: Error) => {\n this.LogErrorMessage(`socketDetail.socket.io.on('reconnect_error'): [${err}] Address: [${this.#address}]`);\n });\n\n // suppress automatic console logging by not letting it bubble up\n this.#socket.on(\"connect_error\", (err) => {\n this.LogErrorMessage(`socketDetail.socket.on('connect_error'): [${err}] Address: [${this.#address}]`);\n });\n\n this.#socket.io.on('reconnect', (attempt: number) => {\n this.LogErrorMessage(`socketDetail.socket.io.on('reconnect'): Number: [${attempt}] Address: [${this.#address}]`);\n });\n\n /*\n this.#socket.on(\"connect_timeout\", () => {\n this.#LogErrorMessage(`socketDetail.socket.on('connect_timeout') Address: [${this.#address}]`);\n });\n */\n\n this.#socket.on(\"connect\", () => {\n if (this.#socket) {\n this.LogDebugMessage(`Socket: [${this.#socket.id}]: connected, Address: [${this.#address}]`);\n\n setTimeout(() => {\n this.ConnectCallBack(this.#socket as Socket<ServerToClientEvents, ClientToServerEvents>);\n }, 0);\n\n this.SocketEventsCallBack(this.#socket);\n\n } else {\n const errorMessage: string = 'Could not get socket object from socket.io, Address: [${socketDetail.address}]';\n this.LogErrorMessage(errorMessage);\n this.ErrorCallBack(new Error(errorMessage));\n }\n })\n\n // https://socket.io/docs/v4/client-socket-instance/#disconnect\n this.#socket.on(\"disconnect\", (reason: string) => {\n this.LogDebugMessage('socket disconnect: ' + reason);\n switch (reason) {\n case 'io server disconnect' : {\n // The server disconnect using disconnectSockets (i.e. normal safe shutdown)\n this.LogDebugMessage('The server disconnected using disconnectSockets, i.e. normal safe shutdown from explicit disconnection by the server.');\n this.LogDebugMessage('The connection will be re-established when the server becomes available.');\n this.#socket = undefined;\n if (isNode) {\n if (this.#agentManager) {\n this.#agentManager.ResetAgent();\n }\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout); //@@ config\n }\n }\n break;\n case 'io client disconnect' :\n this.LogDebugMessage('The client disconnected using disconnectSockets, i.e. normal safe disconnection from explicit disconnection by the client.');\n this.LogDebugMessage('The connection will not be re-established automatically.');\n // Do nothing\n break;\n case 'transport close' :\n case 'ping timeout' :\n case 'transport error' : {\n this.LogDebugMessage(`Server unexpectedly disconnected. Reason: [${reason}]`);\n this.LogDebugMessage('The connection will be re-established when the server becomes available.');\n if (this.#socket) {\n this.#socket.disconnect();\n }\n this.#socket = undefined;\n if (isNode) {\n if (this.#agentManager) {\n this.#agentManager?.ResetAgent();\n }\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout); //@@ config\n }\n }\n break;\n }\n });\n }\n}\n"],"names":["STSNamespace","STSRoom","STSEvent","TinyEmitter","io"],"mappings":";;;;AA2EO,IAAK,iCAAAA,kBAAL;AACNA,gBAAA,YAAA,IAAa;AACbA,gBAAA,YAAA,IAAa;AACVA,gBAAA,qBAAA,IAAsB;AAHd,SAAAA;AAAA,GAAA,gBAAA,CAAA,CAAA;AAML,IAAK,4BAAAC,aAAL;AAENA,WAAA,uBAAA,IAAwB;AACxBA,WAAA,mCAAA,IAAoC;AAGpCA,WAAA,eAAA,IAAgB;AAChBA,WAAA,mBAAA,IAAoB;AAPT,SAAAA;AAAA,GAAA,WAAA,CAAA,CAAA;AAUL,IAAK,6BAAAC,cAAL;AAENA,YAAA,mBAAA,IAAoB;AACpBA,YAAA,sBAAA,IAAuB;AACvBA,YAAA,wBAAA,IAAyB;AAEzBA,YAAA,+BAAA,IAAgC;AAChCA,YAAA,8BAAA,IAA+B;AAG/BA,YAAA,UAAA,IAAW;AACXA,YAAA,SAAA,IAAU;AACVA,YAAA,UAAA,IAAW;AACXA,YAAA,WAAA,IAAY;AACZA,YAAA,cAAA,IAAe;AAGfA,YAAA,uBAAA,IAAwB;AACxBA,YAAA,wBAAA,IAAyB;AAGzBA,YAAA,eAAA,IAAgB;AAGhBA,YAAA,SAAA,IAAU;AAxBC,SAAAA;AAAA,GAAA,YAAA,CAAA,CAAA;AC1FZ,MAAA,SAAe,OAAO,UAAU,SAAS,KAAK,OAAO,YAAY,cAAc,UAAU,CAAC,MAAM;ACUzF,MAAe,uBAAiJC,MAAAA,mBAAAA,YAAY;AAAA,EAC/K;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAA4B;AAAA;AAAA,EAE5B,YAAY,MAAc;AACtB,UAAA;AACA,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,IAAc,YAAoB;AAC9B,WAAO,kBAAkB,KAAK,KAAK;AAAA,EACvC;AAAA;AAAA,EAGU,gBAAgB,SAAoB;AAC1C,QAAI,KAAK,QAAS,MAAK,QAAQ,MAAM,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,EACtE;AAAA;AAAA,EAGU,gBAAgB,SAAoB;AAC1C,QAAI,KAAK,QAAS,MAAK,QAAQ,MAAM,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,EACtE;AAAA;AAAA,EAGU,kBAAkB,SAAoB;AAC5C,QAAI,KAAK,QAAS,MAAK,QAAQ,KAAK,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,EACrE;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,mBAA2B;AAC3B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,eAAyC;AACzC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,SAAiC;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,UAA8B;AAC9B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,YAAgC;AAChC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,qBAAyC;AACzC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,SAAyE;AACzE,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,YAAY,SAAiB;AACzB,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,cAAc,WAAmB;AAC7B,SAAK,aAAa;AAClB,WAAO;AAAA,EACX;AAAA,EAEA,uBAAuB,oBAA4B;AAC/C,SAAK,sBAAsB;AAC3B,WAAO;AAAA,EACX;AAAA,EAEA,WAAW,QAAoB;AAC3B,SAAK,UAAU;AACf,WAAO;AAAA,EACX;AAAA,EAEA,iBAAiB,cAA4B;AACzC,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACX;AAAA,EAEA,qBAAqB,kBAA0B;AAC3C,SAAK,oBAAoB;AACzB,WAAO;AAAA,EACX;AAAA,EAEA,cAAc;AACV,QAAI,CAAC,KAAK,UAAU;AAChB,YAAM,IAAI,MAAM,mEAAmE;AAAA,IACvF;AAEA,SAAK,wBAAA;AAEL,WAAO;AAAA,EACX;AAAA;AAAA,EAGU,gBAAgB,QAAkE;AAAA,EAAE;AAAA;AAAA,EAEpF,qBAAqB,QAAkE;AAAA,EAAE;AAAA;AAAA,EAEzF,cAAc,OAAoB;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY9C,0BAAgC;AAC5B,QAAI,KAAK,YAAY,QAAW;AAE5B,UAAI,KAAK,QAAQ,cAAc,MAAM;AACjC,aAAK,QAAQ,WAAA;AAAA,MACjB;AACA,WAAK,UAAU;AACf,UAAI,QAAQ;AACR,mBAAW,MAAM,KAAK,wBAAA,GAA2B,KAAK,iBAAiB,EAAE,MAAA;AAAA,MAC7E,OAAO;AACH,mBAAW,MAAM,KAAK,wBAAA,GAA2B,KAAK,iBAAiB;AAAA,MAC3E;AACA;AAAA,IACJ;AAEA,QAAI;AACJ,QAAI,QAAQ;AAGR,sBAAgB;AAAA,QACZ,YAAY,CAAC,WAAY;AAAA,MAAA;AAE7B,UAAI,KAAK,eAAe;AACpB,YAAI,CAAC,KAAK,UAAU;AAChB,gBAAM,IAAI,MAAM,qFAAqF;AAAA,QACzG;AACA,sBAAc,QAAQ,KAAK,cAAc,SAAS,KAAK,QAAQ;AAAA,MACnE;AAAA,IACJ,OAAO;AACH,sBAAgB;AAAA,QACZ,YAAY,CAAC,WAAY;AAAA,MAAA;AAAA,IAEjC;AAIA,QAAI,KAAK,YAAY;AACjB,oBAAc,OAAO,CAAC,OAAO;AACzB,WAAG;AAAA,UACC,OAAO,KAAK;AAAA,QAAA,CACf;AAAA,MACL;AAAA,IACJ;AAUA,QAAI,KAAK,uBAAuB,KAAK,oBAAoB,cAAc,EAAE,MAAM,GAAG;AAC9E,oBAAc,OAAO,KAAK;AAAA,IAC9B;AAEA,SAAK,UAAUC,gBAAAA,GAAG,KAAK,UAAU,aAAa;AAG9C,SAAK,QAAQ,GAAG,GAAG,SAAS,CAAC,QAAe;AACxC,WAAK,gBAAgB,wCAAwC,GAAG,eAAe,KAAK,QAAQ,GAAG;AAAA,IACnG,CAAC;AAED,SAAK,QAAQ,GAAG,GAAG,mBAAmB,CAAC,QAAe;AAClD,WAAK,gBAAgB,kDAAkD,GAAG,eAAe,KAAK,QAAQ,GAAG;AAAA,IAC7G,CAAC;AAGD,SAAK,QAAQ,GAAG,iBAAiB,CAAC,QAAQ;AACtC,WAAK,gBAAgB,6CAA6C,GAAG,eAAe,KAAK,QAAQ,GAAG;AAAA,IACxG,CAAC;AAED,SAAK,QAAQ,GAAG,GAAG,aAAa,CAAC,YAAoB;AACjD,WAAK,gBAAgB,oDAAoD,OAAO,eAAe,KAAK,QAAQ,GAAG;AAAA,IACnH,CAAC;AAQD,SAAK,QAAQ,GAAG,WAAW,MAAM;AAC7B,UAAI,KAAK,SAAS;AACd,aAAK,gBAAgB,YAAY,KAAK,QAAQ,EAAE,2BAA2B,KAAK,QAAQ,GAAG;AAE3F,mBAAW,MAAM;AACb,eAAK,gBAAgB,KAAK,OAA6D;AAAA,QAC3F,GAAG,CAAC;AAEJ,aAAK,qBAAqB,KAAK,OAAO;AAAA,MAE1C,OAAO;AACH,cAAM,eAAuB;AAC7B,aAAK,gBAAgB,YAAY;AACjC,aAAK,cAAc,IAAI,MAAM,YAAY,CAAC;AAAA,MAC9C;AAAA,IACJ,CAAC;AAGD,SAAK,QAAQ,GAAG,cAAc,CAAC,WAAmB;AAC9C,WAAK,gBAAgB,wBAAwB,MAAM;AACnD,cAAQ,QAAA;AAAA,QACR,KAAK;AAAyB;AAE1B,iBAAK,gBAAgB,uHAAuH;AAC5I,iBAAK,gBAAgB,0EAA0E;AAC/F,iBAAK,UAAU;AACf,gBAAI,QAAQ;AACR,kBAAI,KAAK,eAAe;AACpB,qBAAK,cAAc,WAAA;AAAA,cACvB;AACA,yBAAW,MAAM,KAAK,wBAAA,GAA2B,KAAK,iBAAiB,EAAE,MAAA;AAAA,YAC7E,OAAO;AACH,yBAAW,MAAM,KAAK,wBAAA,GAA2B,KAAK,iBAAiB;AAAA,YAC3E;AAAA,UACJ;AACI;AAAA,QACJ,KAAK;AACD,eAAK,gBAAgB,4HAA4H;AACjJ,eAAK,gBAAgB,0DAA0D;AAE/E;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAoB;AACrB,iBAAK,gBAAgB,8CAA8C,MAAM,GAAG;AAC5E,iBAAK,gBAAgB,0EAA0E;AAC/F,gBAAI,KAAK,SAAS;AACd,mBAAK,QAAQ,WAAA;AAAA,YACjB;AACA,iBAAK,UAAU;AACf,gBAAI,QAAQ;AACR,kBAAI,KAAK,eAAe;AACpB,qBAAK,eAAe,WAAA;AAAA,cACxB;AACA,yBAAW,MAAM,KAAK,wBAAA,GAA2B,KAAK,iBAAiB,EAAE,MAAA;AAAA,YAC7E,OAAO;AACH,yBAAW,MAAM,KAAK,wBAAA,GAA2B,KAAK,iBAAiB;AAAA,YAC3E;AAAA,UACJ;AACI;AAAA,MAAA;AAAA,IAER,CAAC;AAAA,EACL;AACJ;;;;;","x_google_ignoreList":[1]}
|
package/dist/index.mjs
CHANGED
|
@@ -39,21 +39,33 @@ class SocketIoClient extends tinyEmitterExports.TinyEmitter {
|
|
|
39
39
|
#socketIoCustomPath;
|
|
40
40
|
#authToken;
|
|
41
41
|
#socket;
|
|
42
|
+
#reconnectTimeout = 2e3;
|
|
43
|
+
// default
|
|
42
44
|
constructor(name) {
|
|
43
45
|
super();
|
|
44
46
|
this.#name = name;
|
|
45
47
|
}
|
|
48
|
+
get logPrefix() {
|
|
49
|
+
return `SocketIoClient[${this.#name}]:`;
|
|
50
|
+
}
|
|
46
51
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
52
|
LogDebugMessage(message) {
|
|
48
|
-
if (this.#logger) this.#logger.debug(message);
|
|
53
|
+
if (this.#logger) this.#logger.debug(`${this.logPrefix}${message}`);
|
|
49
54
|
}
|
|
50
55
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
56
|
LogErrorMessage(message) {
|
|
52
|
-
if (this.#logger) this.#logger.error(message);
|
|
57
|
+
if (this.#logger) this.#logger.error(`${this.logPrefix}${message}`);
|
|
58
|
+
}
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
LogWarningMessage(message) {
|
|
61
|
+
if (this.#logger) this.#logger.warn(`${this.logPrefix}${message}`);
|
|
53
62
|
}
|
|
54
63
|
get name() {
|
|
55
64
|
return this.#name;
|
|
56
65
|
}
|
|
66
|
+
get reconnectTimeout() {
|
|
67
|
+
return this.#reconnectTimeout;
|
|
68
|
+
}
|
|
57
69
|
get agentManager() {
|
|
58
70
|
return this.#agentManager;
|
|
59
71
|
}
|
|
@@ -92,6 +104,10 @@ class SocketIoClient extends tinyEmitterExports.TinyEmitter {
|
|
|
92
104
|
this.#agentManager = agentManager;
|
|
93
105
|
return this;
|
|
94
106
|
}
|
|
107
|
+
WithReconnectTimeout(reconnectTimeout) {
|
|
108
|
+
this.#reconnectTimeout = reconnectTimeout;
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
95
111
|
SetupSocket() {
|
|
96
112
|
if (!this.#address) {
|
|
97
113
|
throw new Error(`SocketIoClientHelper:SetupSocket(): Error: [address not provided]`);
|
|
@@ -124,9 +140,9 @@ class SocketIoClient extends tinyEmitterExports.TinyEmitter {
|
|
|
124
140
|
}
|
|
125
141
|
this.#socket = void 0;
|
|
126
142
|
if (isNode) {
|
|
127
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
143
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
|
|
128
144
|
} else {
|
|
129
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
145
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
|
|
130
146
|
}
|
|
131
147
|
return;
|
|
132
148
|
}
|
|
@@ -137,7 +153,7 @@ class SocketIoClient extends tinyEmitterExports.TinyEmitter {
|
|
|
137
153
|
};
|
|
138
154
|
if (this.#agentManager) {
|
|
139
155
|
if (!this.#address) {
|
|
140
|
-
throw new Error(`
|
|
156
|
+
throw new Error(`SocketIoClient:SetupSocket(): Error: [address not provided when using agentManager]`);
|
|
141
157
|
}
|
|
142
158
|
socketOptions.agent = this.#agentManager.GetAgent(this.#address);
|
|
143
159
|
}
|
|
@@ -158,58 +174,58 @@ class SocketIoClient extends tinyEmitterExports.TinyEmitter {
|
|
|
158
174
|
}
|
|
159
175
|
this.#socket = io(this.#address, socketOptions);
|
|
160
176
|
this.#socket.io.on("error", (err) => {
|
|
161
|
-
this.LogErrorMessage(`
|
|
177
|
+
this.LogErrorMessage(`socketDetail.socket.io.on('error'): [${err}] Address: [${this.#address}]`);
|
|
162
178
|
});
|
|
163
179
|
this.#socket.io.on("reconnect_error", (err) => {
|
|
164
|
-
this.LogErrorMessage(`
|
|
180
|
+
this.LogErrorMessage(`socketDetail.socket.io.on('reconnect_error'): [${err}] Address: [${this.#address}]`);
|
|
165
181
|
});
|
|
166
182
|
this.#socket.on("connect_error", (err) => {
|
|
167
|
-
this.LogErrorMessage(`
|
|
183
|
+
this.LogErrorMessage(`socketDetail.socket.on('connect_error'): [${err}] Address: [${this.#address}]`);
|
|
168
184
|
});
|
|
169
185
|
this.#socket.io.on("reconnect", (attempt) => {
|
|
170
|
-
this.LogErrorMessage(`
|
|
186
|
+
this.LogErrorMessage(`socketDetail.socket.io.on('reconnect'): Number: [${attempt}] Address: [${this.#address}]`);
|
|
171
187
|
});
|
|
172
188
|
this.#socket.on("connect", () => {
|
|
173
189
|
if (this.#socket) {
|
|
174
|
-
this.LogDebugMessage(`
|
|
190
|
+
this.LogDebugMessage(`Socket: [${this.#socket.id}]: connected, Address: [${this.#address}]`);
|
|
175
191
|
setTimeout(() => {
|
|
176
192
|
this.ConnectCallBack(this.#socket);
|
|
177
193
|
}, 0);
|
|
178
194
|
this.SocketEventsCallBack(this.#socket);
|
|
179
195
|
} else {
|
|
180
|
-
const errorMessage = "
|
|
196
|
+
const errorMessage = "Could not get socket object from socket.io, Address: [${socketDetail.address}]";
|
|
181
197
|
this.LogErrorMessage(errorMessage);
|
|
182
198
|
this.ErrorCallBack(new Error(errorMessage));
|
|
183
199
|
}
|
|
184
200
|
});
|
|
185
201
|
this.#socket.on("disconnect", (reason) => {
|
|
186
|
-
this.LogDebugMessage("
|
|
202
|
+
this.LogDebugMessage("socket disconnect: " + reason);
|
|
187
203
|
switch (reason) {
|
|
188
204
|
case "io server disconnect":
|
|
189
205
|
{
|
|
190
|
-
this.LogDebugMessage("
|
|
191
|
-
this.LogDebugMessage("
|
|
206
|
+
this.LogDebugMessage("The server disconnected using disconnectSockets, i.e. normal safe shutdown from explicit disconnection by the server.");
|
|
207
|
+
this.LogDebugMessage("The connection will be re-established when the server becomes available.");
|
|
192
208
|
this.#socket = void 0;
|
|
193
209
|
if (isNode) {
|
|
194
210
|
if (this.#agentManager) {
|
|
195
211
|
this.#agentManager.ResetAgent();
|
|
196
212
|
}
|
|
197
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
213
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
|
|
198
214
|
} else {
|
|
199
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
215
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
|
|
200
216
|
}
|
|
201
217
|
}
|
|
202
218
|
break;
|
|
203
219
|
case "io client disconnect":
|
|
204
|
-
this.LogDebugMessage("
|
|
205
|
-
this.LogDebugMessage("
|
|
220
|
+
this.LogDebugMessage("The client disconnected using disconnectSockets, i.e. normal safe disconnection from explicit disconnection by the client.");
|
|
221
|
+
this.LogDebugMessage("The connection will not be re-established automatically.");
|
|
206
222
|
break;
|
|
207
223
|
case "transport close":
|
|
208
224
|
case "ping timeout":
|
|
209
225
|
case "transport error":
|
|
210
226
|
{
|
|
211
|
-
this.LogDebugMessage(`
|
|
212
|
-
this.LogDebugMessage("
|
|
227
|
+
this.LogDebugMessage(`Server unexpectedly disconnected. Reason: [${reason}]`);
|
|
228
|
+
this.LogDebugMessage("The connection will be re-established when the server becomes available.");
|
|
213
229
|
if (this.#socket) {
|
|
214
230
|
this.#socket.disconnect();
|
|
215
231
|
}
|
|
@@ -218,9 +234,9 @@ class SocketIoClient extends tinyEmitterExports.TinyEmitter {
|
|
|
218
234
|
if (this.#agentManager) {
|
|
219
235
|
this.#agentManager?.ResetAgent();
|
|
220
236
|
}
|
|
221
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
237
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
|
|
222
238
|
} else {
|
|
223
|
-
setTimeout(() => this.#EstablishSocketConnect(),
|
|
239
|
+
setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
|
|
224
240
|
}
|
|
225
241
|
}
|
|
226
242
|
break;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/commonTypes.ts","../node_modules/detect-node/index.esm.js","../src/socketIoClient.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { Server, Socket, Namespace } from \"socket.io\";\nimport { ISTSLogger } from '@nsshunt/stsutils'\n\nexport interface STSDefaultClientToServerEvents {\n /**\n * Join the room(s) specified for this client.\n * @param room The room(s) to join for this client.\n * @returns \n */\n\t__STSjoinRoom: (room: string[]) => void;\n\n /**\n * Remove this client from the specified room(s).\n * @param room The room(s) to remove the client from within the server.\n * @returns \n */\n\t__STSleaveRoom: (room: string[]) => void;\n\n /**\n * Alerts the server that this client has flagged to disconnect. Allows server to perform clean-up if required. The server must call-back with the result of the disconnecting event.\n * @param reason Reason for the disconnecting event.\n * @param callback The server must call-back with the result of the disconnecting event.\n * @returns \n */\n\t__STSdisconnecting: (reason: string, callback: (data: string) => void) => void;\n\n /**\n * Alerts the server to disconnect this client.\n * @param reason Reason for the disconnect event.\n * @returns \n */\n\t__STSdisconnect: (reason: string) => void; // server and client event\n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param rooms Room array for broadcasting.\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n * @returns \n */\n __STSsendToRoom: (rooms: string[], payload: { command: string, payload: any }) => void;\n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param room Single room for broadcasting.\n\t * @param timeout Number of ms to try and get responses from all clients\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n\t * @param callback The callback function to be invoked once all clients have responded with their respective payloads\n * @returns \n */\n __STSsendToRoomWithCallback: (room: string, timeout: number, payload: { command: string, payload: any }, callback: (data: any) => void) => void; \n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param rooms Array of rooms for broadcasting.\n\t * @param timeout Number of ms to try and get responses from all clients\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n\t * @param callback The callback function to be invoked once all clients have responded with their respective payloads\n * @returns \n */\n __STSsendToRoomsWithCallback: (rooms: string[], timeout: number, payload: { command: string, payload: any }, callback: (data: any) => void) => void; \n}\n\nexport interface STSDefaultServerToClientEvents {\n /**\n * The server may emit an unsolicited disconnect event to flag that all clients should disconnect. Most likely becuase the server may be shutting down.\n * @param reason Reason why the server is emitting this disconnect event.\n * @returns \n */\n\t__STSdisconnect: (reason: string) => void;\n}\n\nexport enum STSNamespace {\n\tSTSMonitor = 'stsinstrumentmanager/stsmonitor',\n\tSTSControl = 'stsinstrumentmanager/stscontrol',\n STSTestingNamespace = 'ststestingnamespace/ststesting'\n}\n\nexport enum STSRoom {\n\t// STSMonitor rooms\n\tSTSInstrumentDataRoom = 'stsinstrumentdataroom', // This room is for all instrument data messages\n\tSTSInstrumentDataSubscriptionRoom = 'stsinstrumentdatasubscriptionroom', // This room is only for subscribed instrument data messages\n\n\t// STSControl rooms\n\tSTSRunnerRoom = 'stsrunnerroom',\n\tSTSNodeRunnerRoom = 'stsnoderunnerroom'\n}\n\nexport enum STSEvent {\n\t// STSInstrumentData\n\tSTSInstrumentData = 'stsinstrumentdata',\n\tSTSSubInstrumentData = 'stssubinstrumentdata', // sub-scribed instrument data. This only outputs the nodes that have been subscribed by the client(s).\n\tSTSResetInstrumentData = 'stsresetinstrumentdata',\n\n\tSTSStartLoggingInstrumentData = 'stsStartLoggingInstrumentData',\n\tSTSStopLoggingInstrumentData = 'stsStopLoggingInstrumentData',\n\n\t// STSRunner events\n\tSTSStart = 'stsstart', // Start a test run with options as payload.\n\tSTSStop = 'stsstop', // Stop test run(s).\n\tSTSPause = 'stspause', // Pause test run(s).\n\tSTSResume = 'stsresume', // Resume test run(s).\n\tSTSTerminate = 'ststerminate', // Terminate runner instances and exit applications.\n\t// This may also be uysed to force trigger self healing (i.e. auto re-start) when\n\t// running within a container orchestrator such as K8, K3 or Docker Swarm.\n\tSTSUpdateStaticConfig = 'stsupdatestaticconfig', // Update base configuration. Options as payload.\n\tSTSUpdateDynamicConfig = 'stsupdatedynamicconfig', // Update running configuration. This is used\n\t// to control the runnning behaviour of test(s) in-flight. Options as payload.\n\n\tSTSSendToRoom = 'sendToRoom',\n\n\t// Standard socket events\n\tconnect = 'connect'\n}\n\n// https://socket.io/docs/v4/typescript/\n\nexport interface InterServerEvents {\n\tping: () => void;\n}\n\nexport interface STSSocketIONamespace {\n\tnamespace: string\n\tpid: number\n\tsocketionamespace: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n}\n\nexport type STSSocketIONamespaces = Record<string, STSSocketIONamespace>;\n\nexport type STSServerSocket = Socket<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\nexport type STSClientSocket = Socket<STSDefaultServerToClientEvents, STSDefaultClientToServerEvents, InterServerEvents>\n","// Only Node.JS has a process variable that is of [[Class]] process\nexport default Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n","import { io, SocketOptions, ManagerOptions, Socket } from 'socket.io-client'\n//import { EventNames, EventParams } from \"@socket.io/component-emitter\";\n\nimport isNode from 'detect-node';\n\nimport { ISTSLogger, AgentManager } from '@nsshunt/stsutils'\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents } from './commonTypes'\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport abstract class SocketIoClient<ServerToClientEvents extends STSDefaultServerToClientEvents, ClientToServerEvents extends STSDefaultClientToServerEvents> extends TinyEmitter {\n #agentManager?: AgentManager\n #logger?: ISTSLogger\n #name: string\n #address?: string\n #socketIoCustomPath?: string\n #authToken?: string\n #socket?: Socket<ServerToClientEvents, ClientToServerEvents>;\n\n constructor(name: string) {\n super();\n this.#name = name;\n }\n \n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogDebugMessage(message: any): void {\n if (this.#logger) this.#logger.debug(message);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogErrorMessage(message: any): void {\n if (this.#logger) this.#logger.error(message);\n }\n\n get name(): string {\n return this.#name;\n }\n\n get agentManager(): AgentManager | undefined {\n return this.#agentManager;\n }\n\n get logger(): ISTSLogger | undefined {\n return this.#logger;\n }\n\n get address(): string | undefined {\n return this.#address;\n }\n\n get authToken(): string | undefined {\n return this.#authToken;\n }\n\n get socketIoCustomPath(): string | undefined {\n return this.#socketIoCustomPath;\n }\n\n get socket(): Socket<ServerToClientEvents, ClientToServerEvents> | undefined {\n return this.#socket;\n }\n\n WithAddress(address: string) {\n this.#address = address;\n return this;\n }\n\n WithAuthToken(authToken: string) {\n this.#authToken = authToken;\n return this;\n }\n\n WithSocketIoCustomPath(socketIoCustomPath: string) {\n this.#socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithLogger(logger: ISTSLogger) {\n this.#logger = logger;\n return this;\n }\n\n WithAgentManager(agentManager: AgentManager) {\n this.#agentManager = agentManager;\n return this;\n }\n\n SetupSocket() {\n if (!this.#address) {\n throw new Error(`SocketIoClientHelper:SetupSocket(): Error: [address not provided]`);\n }\n\n this.#EstablishSocketConnect();\n\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected ConnectCallBack(socket: Socket<ServerToClientEvents, ClientToServerEvents>): void { };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected SocketEventsCallBack(socket: Socket<ServerToClientEvents, ClientToServerEvents>): void { };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected ErrorCallBack(error: Error): void { };\n\n /*\n emit<Ev extends EventNames<ClientToServerEvents>>(ev: Ev, ...args: EventParams<ClientToServerEvents, Ev>): Socket<ServerToClientEvents, ClientToServerEvents> {\n if (this.#socket) {\n return this.#socket!.emit(ev, ...args);\n } else {\n throw new Error('SocketIoClient:emit(): Error: [socket instance not defined.]');\n }\n }\n */\n\n #EstablishSocketConnect(): void {\n if (this.#socket !== undefined) {\n // We already have a socket object (may or may not be connected)\n if (this.#socket.connected === true) {\n this.#socket.disconnect();\n }\n this.#socket = undefined;\n if (isNode) {\n setTimeout(() => this.#EstablishSocketConnect(), 100).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), 100); //@@ config\n }\n return;\n }\n\n let socketOptions: Partial<SocketOptions & ManagerOptions>;\n if (isNode) {\n // https://socket.io/docs/v4/client-options/#reconnection\n // https://github.com/socketio/engine.io-client#methods\n socketOptions = {\n transports: [\"websocket\" ]\n }\n if (this.#agentManager) {\n if (!this.#address) {\n throw new Error(`SocketIoClientHelper:SetupSocket(): Error: [address not provided when using agentManager]`);\n }\n socketOptions.agent = this.#agentManager.GetAgent(this.#address);\n }\n } else {\n socketOptions = {\n transports: [\"websocket\" ]\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // Send auth token for connections\n if (this.#authToken) {\n socketOptions.auth = (cb) => {\n cb({\n token: this.#authToken\n });\n }\n }\n\n // On Server use;\n /*\n io.use((socket, next) => {\n const token = socket.handshake.auth.token;\n // ...\n });\n */\n\n if (this.#socketIoCustomPath && this.#socketIoCustomPath.localeCompare('') !== 0) {\n socketOptions.path = this.#socketIoCustomPath;\n }\n\n this.#socket = io(this.#address, socketOptions) as Socket<ServerToClientEvents, ClientToServerEvents>\n\n // Manager errors\n this.#socket.io.on('error', (err: Error) => {\n this.LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.io.on('error'): [${err}] Address: [${this.#address}]`);\n });\n\n this.#socket.io.on('reconnect_error', (err: Error) => {\n this.LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.io.on('reconnect_error'): [${err}] Address: [${this.#address}]`);\n });\n\n // suppress automatic console logging by not letting it bubble up\n this.#socket.on(\"connect_error\", (err) => {\n this.LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.on('connect_error'): [${err}] Address: [${this.#address}]`);\n });\n\n this.#socket.io.on('reconnect', (attempt: number) => {\n this.LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.io.on('reconnect'): Number: [${attempt}] Address: [${this.#address}]`);\n });\n\n /*\n this.#socket.on(\"connect_timeout\", () => {\n this.#LogErrorMessage(`SocketIoClientHelper(): socketDetail.socket.on('connect_timeout') Address: [${this.#address}]`);\n });\n */\n\n this.#socket.on(\"connect\", () => {\n if (this.#socket) {\n this.LogDebugMessage(`SocketIoClientHelper(): Socket: [${this.#socket.id}]: connected, Address: [${this.#address}]`);\n\n setTimeout(() => {\n this.ConnectCallBack(this.#socket as Socket<ServerToClientEvents, ClientToServerEvents>);\n }, 0);\n\n this.SocketEventsCallBack(this.#socket);\n\n } else {\n const errorMessage: string = 'SocketIoClientHelper(): Could not get socket object from socket.io, Address: [${socketDetail.address}]';\n this.LogErrorMessage(errorMessage);\n this.ErrorCallBack(new Error(errorMessage));\n }\n })\n\n // https://socket.io/docs/v4/client-socket-instance/#disconnect\n this.#socket.on(\"disconnect\", (reason: string) => {\n this.LogDebugMessage('SocketIoClientHelper(): socket disconnect: ' + reason);\n switch (reason) {\n case 'io server disconnect' : {\n // The server disconnect using disconnectSockets (i.e. normal safe shutdown)\n this.LogDebugMessage('SocketIoClientHelper(): The server disconnected using disconnectSockets, i.e. normal safe shutdown from explicit disconnection by the server.');\n this.LogDebugMessage('SocketIoClientHelper(): The connection will be re-established when the server becomes available.');\n this.#socket = undefined;\n if (isNode) {\n if (this.#agentManager) {\n this.#agentManager.ResetAgent();\n }\n setTimeout(() => this.#EstablishSocketConnect(), 100).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), 100); //@@ config\n }\n }\n break;\n case 'io client disconnect' :\n this.LogDebugMessage('SocketIoClientHelper(): The client disconnected using disconnectSockets, i.e. normal safe disconnection from explicit disconnection by the client.');\n this.LogDebugMessage('SocketIoClientHelper(): The connection will not be re-established automatically.');\n // Do nothing\n break;\n case 'transport close' :\n case 'ping timeout' :\n case 'transport error' : {\n this.LogDebugMessage(`SocketIoClientHelper(): Server unexpectedly disconnected. Reason: [${reason}]`);\n this.LogDebugMessage('SocketIoClientHelper(): The connection will be re-established when the server becomes available.');\n if (this.#socket) {\n this.#socket.disconnect();\n }\n this.#socket = undefined;\n if (isNode) {\n if (this.#agentManager) {\n this.#agentManager?.ResetAgent();\n }\n setTimeout(() => this.#EstablishSocketConnect(), 100).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), 100); //@@ config\n }\n }\n break;\n }\n });\n }\n}\n"],"names":["STSNamespace","STSRoom","STSEvent","TinyEmitter"],"mappings":"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","x_google_ignoreList":[1]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/commonTypes.ts","../node_modules/detect-node/index.esm.js","../src/socketIoClient.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { Server, Socket, Namespace } from \"socket.io\";\nimport { ISTSLogger } from '@nsshunt/stsutils'\n\nexport interface STSDefaultClientToServerEvents {\n /**\n * Join the room(s) specified for this client.\n * @param room The room(s) to join for this client.\n * @returns \n */\n\t__STSjoinRoom: (room: string[]) => void;\n\n /**\n * Remove this client from the specified room(s).\n * @param room The room(s) to remove the client from within the server.\n * @returns \n */\n\t__STSleaveRoom: (room: string[]) => void;\n\n /**\n * Alerts the server that this client has flagged to disconnect. Allows server to perform clean-up if required. The server must call-back with the result of the disconnecting event.\n * @param reason Reason for the disconnecting event.\n * @param callback The server must call-back with the result of the disconnecting event.\n * @returns \n */\n\t__STSdisconnecting: (reason: string, callback: (data: string) => void) => void;\n\n /**\n * Alerts the server to disconnect this client.\n * @param reason Reason for the disconnect event.\n * @returns \n */\n\t__STSdisconnect: (reason: string) => void; // server and client event\n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param rooms Room array for broadcasting.\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n * @returns \n */\n __STSsendToRoom: (rooms: string[], payload: { command: string, payload: any }) => void;\n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param room Single room for broadcasting.\n\t * @param timeout Number of ms to try and get responses from all clients\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n\t * @param callback The callback function to be invoked once all clients have responded with their respective payloads\n * @returns \n */\n __STSsendToRoomWithCallback: (room: string, timeout: number, payload: { command: string, payload: any }, callback: (data: any) => void) => void; \n\n /**\n * Send a payload of data to 1 or more rooms registered on the server.\n * @param rooms Array of rooms for broadcasting.\n\t * @param timeout Number of ms to try and get responses from all clients\n * @param payload The data to be sent to every client within each of the rooms provided. The command within the payload must be a valid STSServerToClientEvents event. This includes any\n * interface that extends STSServerToClientEvents.\n\t * @param callback The callback function to be invoked once all clients have responded with their respective payloads\n * @returns \n */\n __STSsendToRoomsWithCallback: (rooms: string[], timeout: number, payload: { command: string, payload: any }, callback: (data: any) => void) => void; \n}\n\nexport interface STSDefaultServerToClientEvents {\n /**\n * The server may emit an unsolicited disconnect event to flag that all clients should disconnect. Most likely becuase the server may be shutting down.\n * @param reason Reason why the server is emitting this disconnect event.\n * @returns \n */\n\t__STSdisconnect: (reason: string) => void;\n}\n\nexport enum STSNamespace {\n\tSTSMonitor = 'stsinstrumentmanager/stsmonitor',\n\tSTSControl = 'stsinstrumentmanager/stscontrol',\n STSTestingNamespace = 'ststestingnamespace/ststesting'\n}\n\nexport enum STSRoom {\n\t// STSMonitor rooms\n\tSTSInstrumentDataRoom = 'stsinstrumentdataroom', // This room is for all instrument data messages\n\tSTSInstrumentDataSubscriptionRoom = 'stsinstrumentdatasubscriptionroom', // This room is only for subscribed instrument data messages\n\n\t// STSControl rooms\n\tSTSRunnerRoom = 'stsrunnerroom',\n\tSTSNodeRunnerRoom = 'stsnoderunnerroom'\n}\n\nexport enum STSEvent {\n\t// STSInstrumentData\n\tSTSInstrumentData = 'stsinstrumentdata',\n\tSTSSubInstrumentData = 'stssubinstrumentdata', // sub-scribed instrument data. This only outputs the nodes that have been subscribed by the client(s).\n\tSTSResetInstrumentData = 'stsresetinstrumentdata',\n\n\tSTSStartLoggingInstrumentData = 'stsStartLoggingInstrumentData',\n\tSTSStopLoggingInstrumentData = 'stsStopLoggingInstrumentData',\n\n\t// STSRunner events\n\tSTSStart = 'stsstart', // Start a test run with options as payload.\n\tSTSStop = 'stsstop', // Stop test run(s).\n\tSTSPause = 'stspause', // Pause test run(s).\n\tSTSResume = 'stsresume', // Resume test run(s).\n\tSTSTerminate = 'ststerminate', // Terminate runner instances and exit applications.\n\t// This may also be uysed to force trigger self healing (i.e. auto re-start) when\n\t// running within a container orchestrator such as K8, K3 or Docker Swarm.\n\tSTSUpdateStaticConfig = 'stsupdatestaticconfig', // Update base configuration. Options as payload.\n\tSTSUpdateDynamicConfig = 'stsupdatedynamicconfig', // Update running configuration. This is used\n\t// to control the runnning behaviour of test(s) in-flight. Options as payload.\n\n\tSTSSendToRoom = 'sendToRoom',\n\n\t// Standard socket events\n\tconnect = 'connect'\n}\n\n// https://socket.io/docs/v4/typescript/\n\nexport interface InterServerEvents {\n\tping: () => void;\n}\n\nexport interface STSSocketIONamespace {\n\tnamespace: string\n\tpid: number\n\tsocketionamespace: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n}\n\nexport type STSSocketIONamespaces = Record<string, STSSocketIONamespace>;\n\nexport type STSServerSocket = Socket<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\nexport type STSClientSocket = Socket<STSDefaultServerToClientEvents, STSDefaultClientToServerEvents, InterServerEvents>\n","// Only Node.JS has a process variable that is of [[Class]] process\nexport default Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n","import { io, SocketOptions, ManagerOptions, Socket } from 'socket.io-client'\n//import { EventNames, EventParams } from \"@socket.io/component-emitter\";\n\nimport isNode from 'detect-node';\n\nimport { ISTSLogger, AgentManager } from '@nsshunt/stsutils'\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents } from './commonTypes'\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport abstract class SocketIoClient<ServerToClientEvents extends STSDefaultServerToClientEvents, ClientToServerEvents extends STSDefaultClientToServerEvents> extends TinyEmitter {\n #agentManager?: AgentManager\n #logger?: ISTSLogger\n #name: string\n #address?: string\n #socketIoCustomPath?: string\n #authToken?: string\n #socket?: Socket<ServerToClientEvents, ClientToServerEvents>;\n #reconnectTimeout: number = 2000; // default\n\n constructor(name: string) {\n super();\n this.#name = name;\n }\n \n protected get logPrefix(): string {\n return `SocketIoClient[${this.#name}]:`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogDebugMessage(message: any): void {\n if (this.#logger) this.#logger.debug(`${this.logPrefix}${message}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogErrorMessage(message: any): void {\n if (this.#logger) this.#logger.error(`${this.logPrefix}${message}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected LogWarningMessage(message: any): void {\n if (this.#logger) this.#logger.warn(`${this.logPrefix}${message}`);\n }\n\n get name(): string {\n return this.#name;\n }\n\n get reconnectTimeout(): number {\n return this.#reconnectTimeout;\n }\n\n get agentManager(): AgentManager | undefined {\n return this.#agentManager;\n }\n\n get logger(): ISTSLogger | undefined {\n return this.#logger;\n }\n\n get address(): string | undefined {\n return this.#address;\n }\n\n get authToken(): string | undefined {\n return this.#authToken;\n }\n\n get socketIoCustomPath(): string | undefined {\n return this.#socketIoCustomPath;\n }\n\n get socket(): Socket<ServerToClientEvents, ClientToServerEvents> | undefined {\n return this.#socket;\n }\n\n WithAddress(address: string) {\n this.#address = address;\n return this;\n }\n\n WithAuthToken(authToken: string) {\n this.#authToken = authToken;\n return this;\n }\n\n WithSocketIoCustomPath(socketIoCustomPath: string) {\n this.#socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithLogger(logger: ISTSLogger) {\n this.#logger = logger;\n return this;\n }\n\n WithAgentManager(agentManager: AgentManager) {\n this.#agentManager = agentManager;\n return this;\n }\n\n WithReconnectTimeout(reconnectTimeout: number) {\n this.#reconnectTimeout = reconnectTimeout;\n return this;\n }\n\n SetupSocket() {\n if (!this.#address) {\n throw new Error(`SocketIoClientHelper:SetupSocket(): Error: [address not provided]`);\n }\n\n this.#EstablishSocketConnect();\n\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected ConnectCallBack(socket: Socket<ServerToClientEvents, ClientToServerEvents>): void { };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected SocketEventsCallBack(socket: Socket<ServerToClientEvents, ClientToServerEvents>): void { };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected ErrorCallBack(error: Error): void { };\n\n /*\n emit<Ev extends EventNames<ClientToServerEvents>>(ev: Ev, ...args: EventParams<ClientToServerEvents, Ev>): Socket<ServerToClientEvents, ClientToServerEvents> {\n if (this.#socket) {\n return this.#socket!.emit(ev, ...args);\n } else {\n throw new Error('SocketIoClient:emit(): Error: [socket instance not defined.]');\n }\n }\n */\n\n #EstablishSocketConnect(): void {\n if (this.#socket !== undefined) {\n // We already have a socket object (may or may not be connected)\n if (this.#socket.connected === true) {\n this.#socket.disconnect();\n }\n this.#socket = undefined;\n if (isNode) {\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout); //@@ config\n }\n return;\n }\n\n let socketOptions: Partial<SocketOptions & ManagerOptions>;\n if (isNode) {\n // https://socket.io/docs/v4/client-options/#reconnection\n // https://github.com/socketio/engine.io-client#methods\n socketOptions = {\n transports: [\"websocket\" ]\n }\n if (this.#agentManager) {\n if (!this.#address) {\n throw new Error(`SocketIoClient:SetupSocket(): Error: [address not provided when using agentManager]`);\n }\n socketOptions.agent = this.#agentManager.GetAgent(this.#address);\n }\n } else {\n socketOptions = {\n transports: [\"websocket\" ]\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // Send auth token for connections\n if (this.#authToken) {\n socketOptions.auth = (cb) => {\n cb({\n token: this.#authToken\n });\n }\n }\n\n // On Server use;\n /*\n io.use((socket, next) => {\n const token = socket.handshake.auth.token;\n // ...\n });\n */\n\n if (this.#socketIoCustomPath && this.#socketIoCustomPath.localeCompare('') !== 0) {\n socketOptions.path = this.#socketIoCustomPath;\n }\n\n this.#socket = io(this.#address, socketOptions) as Socket<ServerToClientEvents, ClientToServerEvents>\n\n // Manager errors\n this.#socket.io.on('error', (err: Error) => {\n this.LogErrorMessage(`socketDetail.socket.io.on('error'): [${err}] Address: [${this.#address}]`);\n });\n\n this.#socket.io.on('reconnect_error', (err: Error) => {\n this.LogErrorMessage(`socketDetail.socket.io.on('reconnect_error'): [${err}] Address: [${this.#address}]`);\n });\n\n // suppress automatic console logging by not letting it bubble up\n this.#socket.on(\"connect_error\", (err) => {\n this.LogErrorMessage(`socketDetail.socket.on('connect_error'): [${err}] Address: [${this.#address}]`);\n });\n\n this.#socket.io.on('reconnect', (attempt: number) => {\n this.LogErrorMessage(`socketDetail.socket.io.on('reconnect'): Number: [${attempt}] Address: [${this.#address}]`);\n });\n\n /*\n this.#socket.on(\"connect_timeout\", () => {\n this.#LogErrorMessage(`socketDetail.socket.on('connect_timeout') Address: [${this.#address}]`);\n });\n */\n\n this.#socket.on(\"connect\", () => {\n if (this.#socket) {\n this.LogDebugMessage(`Socket: [${this.#socket.id}]: connected, Address: [${this.#address}]`);\n\n setTimeout(() => {\n this.ConnectCallBack(this.#socket as Socket<ServerToClientEvents, ClientToServerEvents>);\n }, 0);\n\n this.SocketEventsCallBack(this.#socket);\n\n } else {\n const errorMessage: string = 'Could not get socket object from socket.io, Address: [${socketDetail.address}]';\n this.LogErrorMessage(errorMessage);\n this.ErrorCallBack(new Error(errorMessage));\n }\n })\n\n // https://socket.io/docs/v4/client-socket-instance/#disconnect\n this.#socket.on(\"disconnect\", (reason: string) => {\n this.LogDebugMessage('socket disconnect: ' + reason);\n switch (reason) {\n case 'io server disconnect' : {\n // The server disconnect using disconnectSockets (i.e. normal safe shutdown)\n this.LogDebugMessage('The server disconnected using disconnectSockets, i.e. normal safe shutdown from explicit disconnection by the server.');\n this.LogDebugMessage('The connection will be re-established when the server becomes available.');\n this.#socket = undefined;\n if (isNode) {\n if (this.#agentManager) {\n this.#agentManager.ResetAgent();\n }\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout); //@@ config\n }\n }\n break;\n case 'io client disconnect' :\n this.LogDebugMessage('The client disconnected using disconnectSockets, i.e. normal safe disconnection from explicit disconnection by the client.');\n this.LogDebugMessage('The connection will not be re-established automatically.');\n // Do nothing\n break;\n case 'transport close' :\n case 'ping timeout' :\n case 'transport error' : {\n this.LogDebugMessage(`Server unexpectedly disconnected. Reason: [${reason}]`);\n this.LogDebugMessage('The connection will be re-established when the server becomes available.');\n if (this.#socket) {\n this.#socket.disconnect();\n }\n this.#socket = undefined;\n if (isNode) {\n if (this.#agentManager) {\n this.#agentManager?.ResetAgent();\n }\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref(); //@@ config\n } else {\n setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout); //@@ config\n }\n }\n break;\n }\n });\n }\n}\n"],"names":["STSNamespace","STSRoom","STSEvent","TinyEmitter"],"mappings":"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","x_google_ignoreList":[1]}
|