@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 CHANGED
@@ -41,21 +41,33 @@ class SocketIoClient extends index.tinyEmitterExports.TinyEmitter {
41
41
  #socketIoCustomPath;
42
42
  #authToken;
43
43
  #socket;
44
+ #reconnectTimeout = 1500;
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(), 100).unref();
145
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
130
146
  } else {
131
- setTimeout(() => this.#EstablishSocketConnect(), 100);
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(`SocketIoClientHelper:SetupSocket(): Error: [address not provided when using agentManager]`);
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(`SocketIoClientHelper(): socketDetail.socket.io.on('error'): [${err}] Address: [${this.#address}]`);
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(`SocketIoClientHelper(): socketDetail.socket.io.on('reconnect_error'): [${err}] Address: [${this.#address}]`);
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(`SocketIoClientHelper(): socketDetail.socket.on('connect_error'): [${err}] Address: [${this.#address}]`);
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(`SocketIoClientHelper(): socketDetail.socket.io.on('reconnect'): Number: [${attempt}] Address: [${this.#address}]`);
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(`SocketIoClientHelper(): Socket: [${this.#socket.id}]: connected, Address: [${this.#address}]`);
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 = "SocketIoClientHelper(): Could not get socket object from socket.io, Address: [${socketDetail.address}]";
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("SocketIoClientHelper(): socket disconnect: " + reason);
204
+ this.LogDebugMessage("socket disconnect: " + reason);
189
205
  switch (reason) {
190
206
  case "io server disconnect":
191
207
  {
192
- this.LogDebugMessage("SocketIoClientHelper(): The server disconnected using disconnectSockets, i.e. normal safe shutdown from explicit disconnection by the server.");
193
- this.LogDebugMessage("SocketIoClientHelper(): The connection will be re-established when the server becomes available.");
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(), 100).unref();
215
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
200
216
  } else {
201
- setTimeout(() => this.#EstablishSocketConnect(), 100);
217
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
202
218
  }
203
219
  }
204
220
  break;
205
221
  case "io client disconnect":
206
- this.LogDebugMessage("SocketIoClientHelper(): The client disconnected using disconnectSockets, i.e. normal safe disconnection from explicit disconnection by the client.");
207
- this.LogDebugMessage("SocketIoClientHelper(): The connection will not be re-established automatically.");
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(`SocketIoClientHelper(): Server unexpectedly disconnected. Reason: [${reason}]`);
214
- this.LogDebugMessage("SocketIoClientHelper(): The connection will be re-established when the server becomes available.");
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(), 100).unref();
239
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
224
240
  } else {
225
- setTimeout(() => this.#EstablishSocketConnect(), 100);
241
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
226
242
  }
227
243
  }
228
244
  break;
@@ -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 = 1500; // 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":"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","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 = 1500;
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(), 100).unref();
143
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
128
144
  } else {
129
- setTimeout(() => this.#EstablishSocketConnect(), 100);
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(`SocketIoClientHelper:SetupSocket(): Error: [address not provided when using agentManager]`);
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(`SocketIoClientHelper(): socketDetail.socket.io.on('error'): [${err}] Address: [${this.#address}]`);
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(`SocketIoClientHelper(): socketDetail.socket.io.on('reconnect_error'): [${err}] Address: [${this.#address}]`);
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(`SocketIoClientHelper(): socketDetail.socket.on('connect_error'): [${err}] Address: [${this.#address}]`);
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(`SocketIoClientHelper(): socketDetail.socket.io.on('reconnect'): Number: [${attempt}] Address: [${this.#address}]`);
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(`SocketIoClientHelper(): Socket: [${this.#socket.id}]: connected, Address: [${this.#address}]`);
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 = "SocketIoClientHelper(): Could not get socket object from socket.io, Address: [${socketDetail.address}]";
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("SocketIoClientHelper(): socket disconnect: " + reason);
202
+ this.LogDebugMessage("socket disconnect: " + reason);
187
203
  switch (reason) {
188
204
  case "io server disconnect":
189
205
  {
190
- this.LogDebugMessage("SocketIoClientHelper(): The server disconnected using disconnectSockets, i.e. normal safe shutdown from explicit disconnection by the server.");
191
- this.LogDebugMessage("SocketIoClientHelper(): The connection will be re-established when the server becomes available.");
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(), 100).unref();
213
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
198
214
  } else {
199
- setTimeout(() => this.#EstablishSocketConnect(), 100);
215
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
200
216
  }
201
217
  }
202
218
  break;
203
219
  case "io client disconnect":
204
- this.LogDebugMessage("SocketIoClientHelper(): The client disconnected using disconnectSockets, i.e. normal safe disconnection from explicit disconnection by the client.");
205
- this.LogDebugMessage("SocketIoClientHelper(): The connection will not be re-established automatically.");
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(`SocketIoClientHelper(): Server unexpectedly disconnected. Reason: [${reason}]`);
212
- this.LogDebugMessage("SocketIoClientHelper(): The connection will be re-established when the server becomes available.");
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(), 100).unref();
237
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout).unref();
222
238
  } else {
223
- setTimeout(() => this.#EstablishSocketConnect(), 100);
239
+ setTimeout(() => this.#EstablishSocketConnect(), this.#reconnectTimeout);
224
240
  }
225
241
  }
226
242
  break;
@@ -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":";;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,mBAAAA,YAAY;AAAA,EAC/K;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,MAAc;AACtB,UAAA;AACA,SAAK,QAAQ;AAAA,EACjB;AAAA;AAAA,EAGU,gBAAgB,SAAoB;AAC1C,QAAI,KAAK,QAAS,MAAK,QAAQ,MAAM,OAAO;AAAA,EAChD;AAAA;AAAA,EAGU,gBAAgB,SAAoB;AAC1C,QAAI,KAAK,QAAS,MAAK,QAAQ,MAAM,OAAO;AAAA,EAChD;AAAA,EAEA,IAAI,OAAe;AACf,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,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,GAAG,EAAE,MAAA;AAAA,MAC1D,OAAO;AACH,mBAAW,MAAM,KAAK,wBAAA,GAA2B,GAAG;AAAA,MACxD;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,2FAA2F;AAAA,QAC/G;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,UAAU,GAAG,KAAK,UAAU,aAAa;AAG9C,SAAK,QAAQ,GAAG,GAAG,SAAS,CAAC,QAAe;AACxC,WAAK,gBAAgB,gEAAgE,GAAG,eAAe,KAAK,QAAQ,GAAG;AAAA,IAC3H,CAAC;AAED,SAAK,QAAQ,GAAG,GAAG,mBAAmB,CAAC,QAAe;AAClD,WAAK,gBAAgB,0EAA0E,GAAG,eAAe,KAAK,QAAQ,GAAG;AAAA,IACrI,CAAC;AAGD,SAAK,QAAQ,GAAG,iBAAiB,CAAC,QAAQ;AACtC,WAAK,gBAAgB,qEAAqE,GAAG,eAAe,KAAK,QAAQ,GAAG;AAAA,IAChI,CAAC;AAED,SAAK,QAAQ,GAAG,GAAG,aAAa,CAAC,YAAoB;AACjD,WAAK,gBAAgB,4EAA4E,OAAO,eAAe,KAAK,QAAQ,GAAG;AAAA,IAC3I,CAAC;AAQD,SAAK,QAAQ,GAAG,WAAW,MAAM;AAC7B,UAAI,KAAK,SAAS;AACd,aAAK,gBAAgB,oCAAoC,KAAK,QAAQ,EAAE,2BAA2B,KAAK,QAAQ,GAAG;AAEnH,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,gDAAgD,MAAM;AAC3E,cAAQ,QAAA;AAAA,QACR,KAAK;AAAyB;AAE1B,iBAAK,gBAAgB,+IAA+I;AACpK,iBAAK,gBAAgB,kGAAkG;AACvH,iBAAK,UAAU;AACf,gBAAI,QAAQ;AACR,kBAAI,KAAK,eAAe;AACpB,qBAAK,cAAc,WAAA;AAAA,cACvB;AACA,yBAAW,MAAM,KAAK,wBAAA,GAA2B,GAAG,EAAE,MAAA;AAAA,YAC1D,OAAO;AACH,yBAAW,MAAM,KAAK,wBAAA,GAA2B,GAAG;AAAA,YACxD;AAAA,UACJ;AACI;AAAA,QACJ,KAAK;AACD,eAAK,gBAAgB,oJAAoJ;AACzK,eAAK,gBAAgB,kFAAkF;AAEvG;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAoB;AACrB,iBAAK,gBAAgB,sEAAsE,MAAM,GAAG;AACpG,iBAAK,gBAAgB,kGAAkG;AACvH,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,GAAG,EAAE,MAAA;AAAA,YAC1D,OAAO;AACH,yBAAW,MAAM,KAAK,wBAAA,GAA2B,GAAG;AAAA,YACxD;AAAA,UACJ;AACI;AAAA,MAAA;AAAA,IAER,CAAC;AAAA,EACL;AACJ;","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 = 1500; // 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]}