@push.rocks/smartsocket 2.1.0 → 4.0.0

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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartsocket',
6
- version: '2.1.0',
6
+ version: '4.0.0',
7
7
  description: 'Provides easy and secure websocket communication mechanisms, including server and client implementation, function call routing, connection management, and tagging.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHFLQUFxSztDQUNuTCxDQUFBIn0=
@@ -1,2 +1,3 @@
1
1
  export * from './connection.js';
2
2
  export * from './tag.js';
3
+ export * from './message.js';
@@ -1,3 +1,4 @@
1
1
  export * from './connection.js';
2
2
  export * from './tag.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9pbnRlcmZhY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxVQUFVLENBQUMifQ==
3
+ export * from './message.js';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9pbnRlcmZhY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxjQUFjLENBQUMifQ==
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Message types for the smartsocket protocol
3
+ */
4
+ export type TMessageType = 'authRequest' | 'auth' | 'authResponse' | 'serverReady' | 'function' | 'functionResponse' | 'tagUpdate';
5
+ /**
6
+ * Base message interface for all smartsocket messages
7
+ */
8
+ export interface ISocketMessage<T = unknown> {
9
+ type: TMessageType;
10
+ id?: string;
11
+ payload: T;
12
+ }
13
+ /**
14
+ * Authentication request payload (server -> client)
15
+ */
16
+ export interface IAuthRequestPayload {
17
+ serverAlias: string;
18
+ }
19
+ /**
20
+ * Authentication data payload (client -> server)
21
+ */
22
+ export interface IAuthPayload {
23
+ alias: string;
24
+ }
25
+ /**
26
+ * Authentication response payload (server -> client)
27
+ */
28
+ export interface IAuthResponsePayload {
29
+ success: boolean;
30
+ error?: string;
31
+ }
32
+ /**
33
+ * Function call payload
34
+ */
35
+ export interface IFunctionCallPayload<T = unknown> {
36
+ funcName: string;
37
+ funcData: T;
38
+ }
39
+ /**
40
+ * Tag update payload
41
+ */
42
+ export interface ITagUpdatePayload {
43
+ tags: Record<string, unknown>;
44
+ }
45
+ /**
46
+ * Helper type for creating typed messages
47
+ */
48
+ export type TAuthRequestMessage = ISocketMessage<IAuthRequestPayload>;
49
+ export type TAuthMessage = ISocketMessage<IAuthPayload>;
50
+ export type TAuthResponseMessage = ISocketMessage<IAuthResponsePayload>;
51
+ export type TFunctionMessage = ISocketMessage<IFunctionCallPayload>;
52
+ export type TFunctionResponseMessage = ISocketMessage<IFunctionCallPayload>;
53
+ export type TTagUpdateMessage = ISocketMessage<ITagUpdatePayload>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2ludGVyZmFjZXMvbWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -15,18 +15,26 @@ export declare class Smartsocket {
15
15
  alias: string;
16
16
  smartenv: plugins.smartenv.Smartenv;
17
17
  options: ISmartsocketConstructorOptions;
18
- io: pluginsTyped.socketIo.Server;
19
18
  socketConnections: plugins.lik.ObjectMap<SocketConnection>;
20
19
  socketFunctions: plugins.lik.ObjectMap<SocketFunction<any>>;
21
20
  socketRequests: plugins.lik.ObjectMap<SocketRequest<any>>;
22
21
  eventSubject: plugins.smartrx.rxjs.Subject<interfaces.TConnectionStatus>;
23
22
  private socketServer;
24
23
  constructor(optionsArg: ISmartsocketConstructorOptions);
25
- setExternalServer(serverType: 'smartexpress', serverArg: any): Promise<void>;
24
+ /**
25
+ * Returns WebSocket hooks for integration with smartserve
26
+ * Pass these hooks to SmartServe's websocket config
27
+ */
28
+ getSmartserveWebSocketHooks(): pluginsTyped.ISmartserveWebSocketHooks;
26
29
  /**
27
30
  * starts smartsocket
28
31
  */
29
32
  start(): Promise<void>;
33
+ /**
34
+ * Handle a new WebSocket connection
35
+ * Called by SocketServer when a new connection is established
36
+ */
37
+ handleNewConnection(socket: pluginsTyped.TWebSocket | pluginsTyped.IWebSocketLike): Promise<void>;
30
38
  /**
31
39
  * stops smartsocket
32
40
  */
@@ -36,8 +44,4 @@ export declare class Smartsocket {
36
44
  */
37
45
  clientCall<T extends plugins.typedrequestInterfaces.ITypedRequest>(functionNameArg: T['method'], dataArg: T['request'], targetSocketConnectionArg: SocketConnection): Promise<T['response']>;
38
46
  addSocketFunction(socketFunction: SocketFunction<any>): void;
39
- /**
40
- * the standard handler for new socket connections
41
- */
42
- private _handleSocketConnection;
43
47
  }
@@ -18,25 +18,53 @@ export class Smartsocket {
18
18
  this.options = optionsArg;
19
19
  this.alias = plugins.isounique.uni(this.options.alias);
20
20
  }
21
- async setExternalServer(serverType, serverArg) {
22
- await this.socketServer.setExternalServer(serverType, serverArg);
21
+ /**
22
+ * Returns WebSocket hooks for integration with smartserve
23
+ * Pass these hooks to SmartServe's websocket config
24
+ */
25
+ getSmartserveWebSocketHooks() {
26
+ return this.socketServer.getSmartserveWebSocketHooks();
23
27
  }
24
28
  /**
25
29
  * starts smartsocket
26
30
  */
27
31
  async start() {
28
- const socketIoModule = await this.smartenv.getSafeNodeModule('socket.io');
29
- this.io = new socketIoModule.Server(await this.socketServer.getServerForSocketIo(), {
30
- cors: {
31
- allowedHeaders: '*',
32
- methods: '*',
33
- origin: '*',
34
- },
35
- });
36
32
  await this.socketServer.start();
37
- this.io.on('connection', (socketArg) => {
38
- this._handleSocketConnection(socketArg);
33
+ }
34
+ /**
35
+ * Handle a new WebSocket connection
36
+ * Called by SocketServer when a new connection is established
37
+ */
38
+ async handleNewConnection(socket) {
39
+ const socketConnection = new SocketConnection({
40
+ alias: undefined,
41
+ authenticated: false,
42
+ side: 'server',
43
+ smartsocketHost: this,
44
+ socket: socket,
39
45
  });
46
+ logger.log('info', 'Socket connected. Trying to authenticate...');
47
+ this.socketConnections.add(socketConnection);
48
+ // Handle disconnection
49
+ const handleClose = () => {
50
+ this.socketConnections.remove(socketConnection);
51
+ socketConnection.eventSubject.next('disconnected');
52
+ };
53
+ socket.addEventListener('close', handleClose);
54
+ socket.addEventListener('error', handleClose);
55
+ try {
56
+ await socketConnection.authenticate();
57
+ await socketConnection.listenToFunctionRequests();
58
+ // Signal that the server is ready
59
+ socketConnection.sendMessage({
60
+ type: 'serverReady',
61
+ payload: {},
62
+ });
63
+ }
64
+ catch (err) {
65
+ logger.log('warn', `Authentication failed: ${err}`);
66
+ this.socketConnections.remove(socketConnection);
67
+ }
40
68
  }
41
69
  /**
42
70
  * stops smartsocket
@@ -50,9 +78,8 @@ export class Smartsocket {
50
78
  }
51
79
  });
52
80
  this.socketConnections.wipe();
53
- this.io.close();
54
- // stop the corresponging server
55
- this.socketServer.stop();
81
+ // stop the corresponding server
82
+ await this.socketServer.stop();
56
83
  }
57
84
  // communication
58
85
  /**
@@ -75,28 +102,5 @@ export class Smartsocket {
75
102
  addSocketFunction(socketFunction) {
76
103
  this.socketFunctions.add(socketFunction);
77
104
  }
78
- /**
79
- * the standard handler for new socket connections
80
- */
81
- async _handleSocketConnection(socketArg) {
82
- const socketConnection = new SocketConnection({
83
- alias: undefined,
84
- authenticated: false,
85
- side: 'server',
86
- smartsocketHost: this,
87
- socket: socketArg,
88
- });
89
- logger.log('info', 'Socket connected. Trying to authenticate...');
90
- this.socketConnections.add(socketConnection);
91
- const disconnectSubscription = socketConnection.eventSubject.subscribe((eventArg) => {
92
- if (eventArg === 'disconnected') {
93
- this.socketConnections.remove(socketConnection);
94
- disconnectSubscription.unsubscribe();
95
- }
96
- });
97
- await socketConnection.authenticate();
98
- await socketConnection.listenToFunctionRequests();
99
- await socketConnection.socket.emit('serverFullyReactive');
100
- }
101
105
  }
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEtBQUssWUFBWSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sS0FBSyxVQUFVLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsVUFBVTtBQUNWLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFFTCxjQUFjLEdBRWYsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU9sRCxNQUFNLE9BQU8sV0FBVztJQWdCdEIsWUFBWSxVQUEwQztRQVgvQyxhQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRzNDLHNCQUFpQixHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQW9CLENBQUM7UUFDbEUsb0JBQWUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUF1QixDQUFDO1FBQ25FLG1CQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBc0IsQ0FBQztRQUVqRSxpQkFBWSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFnQyxDQUFDO1FBRS9FLGlCQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFHNUMsSUFBSSxDQUFDLE9BQU8sR0FB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
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEtBQUssWUFBWSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sS0FBSyxVQUFVLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsVUFBVTtBQUNWLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFFTCxjQUFjLEdBRWYsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU9sRCxNQUFNLE9BQU8sV0FBVztJQWV0QixZQUFZLFVBQTBDO1FBVi9DLGFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFM0Msc0JBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBb0IsQ0FBQztRQUNsRSxvQkFBZSxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQXVCLENBQUM7UUFDbkUsbUJBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFzQixDQUFDO1FBRWpFLGlCQUFZLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQWdDLENBQUM7UUFFL0UsaUJBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUc1QyxJQUFJLENBQUMsT0FBTyxHQUFH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
@@ -49,11 +49,15 @@ export declare class SmartsocketClient {
49
49
  removeTagById(tagIdArg: interfaces.ITag['id']): Promise<void>;
50
50
  constructor(optionsArg: ISmartsocketClientOptions);
51
51
  addSocketFunction(socketFunction: SocketFunction<any>): void;
52
+ private isReconnecting;
53
+ private isConnecting;
52
54
  /**
53
55
  * connect the client to the server
54
56
  */
55
57
  connect(): Promise<unknown>;
56
58
  private disconnectRunning;
59
+ private currentSocket;
60
+ private connectionAttemptId;
57
61
  /**
58
62
  * disconnect from the server
59
63
  */
@@ -48,7 +48,11 @@ export class SmartsocketClient {
48
48
  this.socketRequests = new plugins.lik.ObjectMap();
49
49
  // tagStore
50
50
  this.tagStore = {};
51
+ this.isReconnecting = false;
52
+ this.isConnecting = false;
51
53
  this.disconnectRunning = false;
54
+ this.currentSocket = null;
55
+ this.connectionAttemptId = 0; // Increment on each connect attempt to invalidate old timers
52
56
  this.alias = optionsArg.alias;
53
57
  this.serverUrl = optionsArg.url;
54
58
  this.serverPort = optionsArg.port;
@@ -65,94 +69,133 @@ export class SmartsocketClient {
65
69
  * connect the client to the server
66
70
  */
67
71
  async connect() {
68
- // Reset retry counters on new connection attempt
69
- this.currentRetryCount = 0;
70
- this.currentBackoffDelay = this.initialBackoffDelay;
72
+ // Prevent duplicate connection attempts
73
+ if (this.isConnecting) {
74
+ return;
75
+ }
76
+ this.isConnecting = true;
77
+ // Only reset retry counters on fresh connection (not during auto-reconnect)
78
+ if (!this.isReconnecting) {
79
+ this.currentRetryCount = 0;
80
+ this.currentBackoffDelay = this.initialBackoffDelay;
81
+ }
82
+ this.isReconnecting = false;
71
83
  const done = plugins.smartpromise.defer();
72
84
  const smartenvInstance = new plugins.smartenv.Smartenv();
73
- const socketIoClient = await smartenvInstance.getEnvAwareModule({
74
- nodeModuleName: 'socket.io-client',
75
- webUrlArg: 'https://cdn.jsdelivr.net/npm/socket.io-client@4/dist/socket.io.js',
76
- getFunction: () => {
77
- const socketIoBrowserModule = globalThis.io;
78
- // console.log('loaded socket.io for browser');
79
- return socketIoBrowserModule;
80
- },
81
- });
82
- // console.log(socketIoClient);
83
85
  logger.log('info', 'trying to connect...');
84
- const socketUrl = `${this.serverUrl}:${this.serverPort}`;
86
+ // Construct WebSocket URL
87
+ const protocol = this.serverUrl.startsWith('https') ? 'wss' : 'ws';
88
+ const host = this.serverUrl.replace(/^https?:\/\//, '');
89
+ const socketUrl = `${protocol}://${host}:${this.serverPort}`;
90
+ // Get WebSocket implementation (native in browser, ws in Node)
91
+ let WebSocketClass;
92
+ if (typeof WebSocket !== 'undefined') {
93
+ // Browser environment
94
+ WebSocketClass = WebSocket;
95
+ }
96
+ else {
97
+ // Node.js environment
98
+ const wsModule = await smartenvInstance.getSafeNodeModule('ws');
99
+ WebSocketClass = wsModule.default || wsModule;
100
+ }
101
+ const socket = new WebSocketClass(socketUrl);
102
+ this.currentSocket = socket;
85
103
  this.socketConnection = new SocketConnection({
86
104
  alias: this.alias,
87
105
  authenticated: false,
88
106
  side: 'client',
89
107
  smartsocketHost: this,
90
- socket: await socketIoClient
91
- .connect(socketUrl, {
92
- multiplex: true,
93
- rememberUpgrade: true,
94
- autoConnect: false,
95
- reconnectionAttempts: 0,
96
- rejectUnauthorized: socketUrl.startsWith('https://localhost') ? false : true,
97
- })
98
- .open(),
108
+ socket: socket,
99
109
  });
110
+ // Increment attempt ID to invalidate any pending timers from previous attempts
111
+ this.connectionAttemptId++;
112
+ const currentAttemptId = this.connectionAttemptId;
100
113
  const timer = new plugins.smarttime.Timer(5000);
101
114
  timer.start();
102
115
  timer.completed.then(() => {
103
- this.updateStatus('timedOut');
104
- logger.log('warn', 'connection to server timed out.');
105
- this.disconnect(true);
116
+ // Only fire timeout if this is still the current connection attempt
117
+ if (currentAttemptId === this.connectionAttemptId && this.eventStatus !== 'connected') {
118
+ this.updateStatus('timedOut');
119
+ logger.log('warn', 'connection to server timed out.');
120
+ this.disconnect(true);
121
+ }
106
122
  });
107
- // authentication flow
108
- this.socketConnection.socket.on('requestAuth', (dataArg) => {
123
+ // Handle connection open
124
+ socket.addEventListener('open', () => {
109
125
  timer.reset();
110
- logger.log('info', `server ${dataArg.serverAlias} requested authentication`);
111
- // lets register the authenticated event
112
- this.socketConnection.socket.on('authenticated', async () => {
113
- this.remoteShortId = dataArg.serverAlias;
114
- logger.log('info', 'client is authenticated');
115
- this.socketConnection.authenticated = true;
116
- await this.socketConnection.listenToFunctionRequests();
117
- });
118
- this.socketConnection.socket.on('serverFullyReactive', async () => {
119
- // lets take care of retagging
120
- const oldTagStore = this.tagStore;
121
- this.tagStoreSubscription?.unsubscribe();
122
- for (const keyArg of Object.keys(this.tagStore)) {
123
- this.socketConnection.addTag(this.tagStore[keyArg]);
124
- }
125
- this.tagStoreSubscription = this.socketConnection.tagStoreObservable.subscribe((tagStoreArg) => {
126
- this.tagStore = tagStoreArg;
127
- });
128
- for (const tag of Object.keys(oldTagStore)) {
129
- await this.addTag(oldTagStore[tag]);
130
- }
131
- this.updateStatus('connected');
132
- done.resolve();
133
- });
134
- // lets register the forbidden event
135
- this.socketConnection.socket.on('forbidden', async () => {
136
- logger.log('warn', `disconnecting due to being forbidden to use the ressource`);
137
- await this.disconnect();
138
- });
139
- // lets provide the actual auth data
140
- this.socketConnection.socket.emit('dataAuth', {
141
- alias: this.alias,
142
- });
143
126
  });
144
- // handle connection
145
- this.socketConnection.socket.on('connect', async () => { });
146
- // handle disconnection and errors
147
- this.socketConnection.socket.on('disconnect', async () => {
148
- await this.disconnect(true);
149
- });
150
- this.socketConnection.socket.on('reconnect_failed', async () => {
151
- await this.disconnect(true);
152
- });
153
- this.socketConnection.socket.on('connect_error', async () => {
154
- await this.disconnect(true);
127
+ // Handle messages
128
+ socket.addEventListener('message', async (event) => {
129
+ try {
130
+ const data = typeof event.data === 'string' ? event.data : event.data.toString();
131
+ const message = JSON.parse(data);
132
+ switch (message.type) {
133
+ case 'authRequest':
134
+ timer.reset();
135
+ const authRequestPayload = message.payload;
136
+ logger.log('info', `server ${authRequestPayload.serverAlias} requested authentication`);
137
+ this.remoteShortId = authRequestPayload.serverAlias;
138
+ // Send authentication data
139
+ this.socketConnection.sendMessage({
140
+ type: 'auth',
141
+ payload: { alias: this.alias },
142
+ });
143
+ break;
144
+ case 'authResponse':
145
+ const authResponse = message.payload;
146
+ if (authResponse.success) {
147
+ logger.log('info', 'client is authenticated');
148
+ this.socketConnection.authenticated = true;
149
+ }
150
+ else {
151
+ logger.log('warn', `authentication failed: ${authResponse.error}`);
152
+ await this.disconnect();
153
+ }
154
+ break;
155
+ case 'serverReady':
156
+ // Set up function request listening
157
+ await this.socketConnection.listenToFunctionRequests();
158
+ // Handle retagging
159
+ const oldTagStore = this.tagStore;
160
+ this.tagStoreSubscription?.unsubscribe();
161
+ for (const keyArg of Object.keys(this.tagStore)) {
162
+ this.socketConnection.addTag(this.tagStore[keyArg]);
163
+ }
164
+ this.tagStoreSubscription = this.socketConnection.tagStoreObservable.subscribe((tagStoreArg) => {
165
+ this.tagStore = tagStoreArg;
166
+ });
167
+ for (const tag of Object.keys(oldTagStore)) {
168
+ await this.addTag(oldTagStore[tag]);
169
+ }
170
+ this.updateStatus('connected');
171
+ this.isConnecting = false;
172
+ done.resolve();
173
+ break;
174
+ default:
175
+ // Other messages are handled by SocketConnection
176
+ this.socketConnection.handleMessage(message);
177
+ break;
178
+ }
179
+ }
180
+ catch (err) {
181
+ // Not a valid JSON message, ignore
182
+ }
155
183
  });
184
+ // Handle disconnection and errors
185
+ const closeHandler = async () => {
186
+ // Only handle close if this is still the current socket and we're not already disconnecting
187
+ if (this.currentSocket === socket && !this.disconnectRunning) {
188
+ logger.log('info', `SocketConnection with >alias ${this.alias} on >side client disconnected`);
189
+ await this.disconnect(true);
190
+ }
191
+ };
192
+ const errorHandler = async () => {
193
+ if (this.currentSocket === socket && !this.disconnectRunning) {
194
+ await this.disconnect(true);
195
+ }
196
+ };
197
+ socket.addEventListener('close', closeHandler);
198
+ socket.addEventListener('error', errorHandler);
156
199
  return done.promise;
157
200
  }
158
201
  /**
@@ -163,14 +206,18 @@ export class SmartsocketClient {
163
206
  return;
164
207
  }
165
208
  this.disconnectRunning = true;
209
+ this.isConnecting = false;
166
210
  this.updateStatus('disconnecting');
167
211
  this.tagStoreSubscription?.unsubscribe();
212
+ // Store reference to current socket before cleanup
213
+ const socketToClose = this.currentSocket;
214
+ this.currentSocket = null;
168
215
  if (this.socketConnection) {
169
216
  await this.socketConnection.disconnect();
170
217
  this.socketConnection = undefined;
171
218
  logger.log('ok', 'disconnected socket!');
172
219
  }
173
- else {
220
+ else if (!socketToClose) {
174
221
  this.disconnectRunning = false;
175
222
  logger.log('warn', 'tried to disconnect, without a SocketConnection');
176
223
  return;
@@ -195,6 +242,7 @@ export class SmartsocketClient {
195
242
  this.currentBackoffDelay = Math.min(this.currentBackoffDelay * 2, this.maxBackoffDelay);
196
243
  await plugins.smartdelay.delayFor(delay);
197
244
  this.disconnectRunning = false;
245
+ this.isReconnecting = true;
198
246
  await this.connect();
199
247
  }
200
248
  else {
@@ -216,7 +264,6 @@ export class SmartsocketClient {
216
264
  * @param dataArg
217
265
  */
218
266
  async serverCall(functionNameArg, dataArg) {
219
- const done = plugins.smartpromise.defer();
220
267
  const socketRequest = new SocketRequest(this, {
221
268
  side: 'requesting',
222
269
  originSocketConnection: this.socketConnection,
@@ -249,4 +296,4 @@ export class SmartsocketClient {
249
296
  this.currentBackoffDelay = this.initialBackoffDelay;
250
297
  }
251
298
  }
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldGNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXRjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEtBQUssWUFBWSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sS0FBSyxVQUFVLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDN0UsT0FBTyxFQUVMLGNBQWMsR0FDZixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFBaUMsYUFBYSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdEcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBZWxELE1BQU0sT0FBTyxpQkFBaUI7SUE2QjVCOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUF1QjtRQUN6QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBK0I7UUFDckQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBK0I7UUFDeEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMx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
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldGNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXRjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEtBQUssWUFBWSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sS0FBSyxVQUFVLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDN0UsT0FBTyxFQUVMLGNBQWMsR0FDZixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFBaUMsYUFBYSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdEcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBZWxELE1BQU0sT0FBTyxpQkFBaUI7SUE2QjVCOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUF1QjtRQUN6QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBK0I7UUFDckQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBK0I7UUFDeEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMx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
@@ -15,7 +15,7 @@ export interface ISocketConnectionConstructorOptions {
15
15
  authenticated: boolean;
16
16
  side: TSocketConnectionSide;
17
17
  smartsocketHost: Smartsocket | SmartsocketClient;
18
- socket: pluginsTyped.socketIo.Socket | pluginsTyped.socketIoClient.Socket;
18
+ socket: pluginsTyped.TWebSocket | pluginsTyped.IWebSocketLike;
19
19
  }
20
20
  /**
21
21
  * interface for authentication data
@@ -32,30 +32,40 @@ export declare class SocketConnection {
32
32
  side: TSocketConnectionSide;
33
33
  authenticated: boolean;
34
34
  smartsocketRef: Smartsocket | SmartsocketClient;
35
- socket: pluginsTyped.socketIo.Socket | pluginsTyped.socketIoClient.Socket;
35
+ socket: pluginsTyped.TWebSocket | pluginsTyped.IWebSocketLike;
36
36
  eventSubject: plugins.smartrx.rxjs.Subject<interfaces.TConnectionStatus>;
37
37
  eventStatus: interfaces.TConnectionStatus;
38
38
  private tagStore;
39
39
  tagStoreObservable: plugins.smartrx.rxjs.Subject<interfaces.TTagStore>;
40
40
  remoteTagStoreObservable: plugins.smartrx.rxjs.Subject<interfaces.TTagStore>;
41
41
  constructor(optionsArg: ISocketConnectionConstructorOptions);
42
+ /**
43
+ * Sends a message through the socket
44
+ */
45
+ sendMessage(message: interfaces.ISocketMessage): void;
46
+ /**
47
+ * Handles incoming messages
48
+ */
49
+ handleMessage(messageData: interfaces.ISocketMessage): void;
50
+ private handleFunctionCall;
51
+ private handleFunctionResponse;
52
+ private handleTagUpdate;
42
53
  /**
43
54
  * adds a tag to a connection
44
55
  */
45
56
  addTag(tagArg: interfaces.ITag): Promise<void>;
46
57
  /**
47
- * gets a tag by id
48
- * @param tagIdArg
58
+ * Gets a tag by id
49
59
  */
50
- getTagById(tagIdArg: interfaces.ITag['id']): Promise<interfaces.ITag<any>>;
60
+ getTagById(tagIdArg: interfaces.ITag['id']): interfaces.ITag | undefined;
51
61
  /**
52
- * removes a tag from a connection
62
+ * Removes a tag from a connection
53
63
  */
54
- removeTagById(tagIdArg: interfaces.ITag['id']): Promise<void>;
64
+ removeTagById(tagIdArg: interfaces.ITag['id']): void;
55
65
  /**
56
- * authenticate the socket
66
+ * authenticate the socket (server side)
57
67
  */
58
- authenticate(): Promise<unknown>;
68
+ authenticate(): Promise<SocketConnection>;
59
69
  /**
60
70
  * listen to function requests
61
71
  */