fix(core): update
This commit is contained in:
		| @@ -117,15 +117,16 @@ tap.test('should be able to make a functionCall from server to client', async () | |||||||
|   expect(response.hi).to.equal('hi there from server'); |   expect(response.hi).to.equal('hi there from server'); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('client should disconnect and reconnect', async (tools) => { | tap.test('client should disconnect and reconnect', async (toolsArg) => { | ||||||
|   await testSmartsocketClient.disconnect(); |   await testSmartsocketClient.disconnect(); | ||||||
|   await testSmartsocketClient.connect(); |   await testSmartsocketClient.connect(); | ||||||
|  |   await toolsArg.delayFor(2000); | ||||||
|  |   expect(testSmartsocket.socketConnections.getArray().length).to.equal(1); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| // class smartsocket | // class smartsocket | ||||||
| tap.test('should be able to switch to a new server', async (toolsArg) => { | tap.test('should be able to switch to a new server', async (toolsArg) => { | ||||||
|   await testSmartsocket.stop(); |   await testSmartsocket.stop(); | ||||||
|   await toolsArg.delayFor(5000); |  | ||||||
|   testSmartsocket = new smartsocket.Smartsocket({ alias: 'testserver2', port: testConfig.port }); |   testSmartsocket = new smartsocket.Smartsocket({ alias: 'testserver2', port: testConfig.port }); | ||||||
|   await testSmartsocket.start(); |   await testSmartsocket.start(); | ||||||
|   await toolsArg.delayFor(30000); |   await toolsArg.delayFor(30000); | ||||||
|   | |||||||
| @@ -47,7 +47,7 @@ export class Smartsocket { | |||||||
|    */ |    */ | ||||||
|   public async start() { |   public async start() { | ||||||
|     const socketIoModule = this.smartenv.getSafeNodeModule('socket.io'); |     const socketIoModule = this.smartenv.getSafeNodeModule('socket.io'); | ||||||
|     this.io = socketIoModule(this.socketServer.getServerForSocketIo()); |     this.io = socketIoModule(await this.socketServer.getServerForSocketIo()); | ||||||
|     await this.socketServer.start(); |     await this.socketServer.start(); | ||||||
|     this.io.on('connection', (socketArg) => { |     this.io.on('connection', (socketArg) => { | ||||||
|       this._handleSocketConnection(socketArg); |       this._handleSocketConnection(socketArg); | ||||||
|   | |||||||
| @@ -105,82 +105,81 @@ export class SmartsocketClient { | |||||||
|       authenticated: false, |       authenticated: false, | ||||||
|       side: 'client', |       side: 'client', | ||||||
|       smartsocketHost: this, |       smartsocketHost: this, | ||||||
|       socket: await socketIoClient.connect(socketUrl, { |       socket: await socketIoClient | ||||||
|         multiplex: false, |         .connect(socketUrl, { | ||||||
|         reconnectionAttempts: 5, |           multiplex: false, | ||||||
|         rejectUnauthorized: socketUrl.startsWith('https://localhost') ? false : true, |           autoConnect: false, | ||||||
|       }), |           reconnectionAttempts: 0, | ||||||
|  |           rejectUnauthorized: socketUrl.startsWith('https://localhost') ? false : true, | ||||||
|  |         }) | ||||||
|  |         .open(), | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     const timer = new plugins.smarttime.Timer(5000); |     const timer = new plugins.smarttime.Timer(5000); | ||||||
|     timer.start(); |     timer.start(); | ||||||
|     timer.completed.then(() => { |     timer.completed.then(() => { | ||||||
|       logger.log('warn', 'connection to server timed out.'); |       logger.log('warn', 'connection to server timed out.'); | ||||||
|       this.disconnect(); |       this.disconnect(true); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     // authentication flow |     // authentication flow | ||||||
|     this.socketConnection.socket.on( |     this.socketConnection.socket.on('requestAuth', (dataArg: interfaces.IRequestAuthPayload) => { | ||||||
|       'requestAuth', |       timer.reset(); | ||||||
|       (dataArg: interfaces.IRequestAuthPayload) => { |       logger.log('info', `server ${dataArg.serverAlias} requested authentication`); | ||||||
|         timer.reset(); |  | ||||||
|         logger.log('info', `server ${dataArg.serverAlias} requested authentication`); |  | ||||||
|  |  | ||||||
|         // lets register the authenticated event |       // lets register the authenticated event | ||||||
|         this.socketConnection.socket.on('authenticated', async () => { |       this.socketConnection.socket.on('authenticated', async () => { | ||||||
|           this.remoteShortId = dataArg.serverAlias; |         this.remoteShortId = dataArg.serverAlias; | ||||||
|           logger.log('info', 'client is authenticated'); |         logger.log('info', 'client is authenticated'); | ||||||
|           this.socketConnection.authenticated = true; |         this.socketConnection.authenticated = true; | ||||||
|           await this.socketConnection.listenToFunctionRequests(); |         await this.socketConnection.listenToFunctionRequests(); | ||||||
|         }); |       }); | ||||||
|  |  | ||||||
|         this.socketConnection.socket.on('serverFullyReactive', async () => { |       this.socketConnection.socket.on('serverFullyReactive', async () => { | ||||||
|           // lets take care of retagging |         // lets take care of retagging | ||||||
|           const oldTagStore = this.tagStore; |         const oldTagStore = this.tagStore; | ||||||
|           this.tagStoreSubscription?.unsubscribe(); |         this.tagStoreSubscription?.unsubscribe(); | ||||||
|           for (const keyArg of Object.keys(this.tagStore)) { |         for (const keyArg of Object.keys(this.tagStore)) { | ||||||
|             this.socketConnection.addTag(this.tagStore[keyArg]); |           this.socketConnection.addTag(this.tagStore[keyArg]); | ||||||
|  |         } | ||||||
|  |         this.tagStoreSubscription = this.socketConnection.tagStoreObservable.subscribe( | ||||||
|  |           (tagStoreArg) => { | ||||||
|  |             this.tagStore = tagStoreArg; | ||||||
|           } |           } | ||||||
|           this.tagStoreSubscription = this.socketConnection.tagStoreObservable.subscribe( |         ); | ||||||
|             (tagStoreArg) => { |  | ||||||
|               this.tagStore = tagStoreArg; |  | ||||||
|             } |  | ||||||
|           ); |  | ||||||
|  |  | ||||||
|           for (const tag of Object.keys(oldTagStore)) { |         for (const tag of Object.keys(oldTagStore)) { | ||||||
|             await this.addTag(oldTagStore[tag]); |           await this.addTag(oldTagStore[tag]); | ||||||
|           } |         } | ||||||
|           done.resolve(); |         this.updateStatus('connected'); | ||||||
|         }); |         done.resolve(); | ||||||
|  |       }); | ||||||
|  |  | ||||||
|         // lets register the forbidden event |       // lets register the forbidden event | ||||||
|         this.socketConnection.socket.on('forbidden', async () => { |       this.socketConnection.socket.on('forbidden', async () => { | ||||||
|           logger.log('warn', `disconnecting due to being forbidden to use the ressource`); |         logger.log('warn', `disconnecting due to being forbidden to use the ressource`); | ||||||
|           await this.disconnect(); |         await this.disconnect(); | ||||||
|         }); |       }); | ||||||
|  |  | ||||||
|         // lets provide the actual auth data |       // lets provide the actual auth data | ||||||
|         this.socketConnection.socket.emit('dataAuth', { |       this.socketConnection.socket.emit('dataAuth', { | ||||||
|           alias: this.alias, |         alias: this.alias, | ||||||
|         }); |       }); | ||||||
|       } |     }); | ||||||
|     ); |  | ||||||
|  |  | ||||||
|     // handle connection |     // handle connection | ||||||
|     this.socketConnection.socket.on('connect', async () => { |     this.socketConnection.socket.on('connect', async () => {}); | ||||||
|       this.updateStatus('connected'); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     // handle disconnection and errors |     // handle disconnection and errors | ||||||
|     this.socketConnection.socket.on('disconnect', async () => { |     this.socketConnection.socket.on('disconnect', async () => { | ||||||
|       await this.disconnect(); |       await this.disconnect(true); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     this.socketConnection.socket.on('reconnect_failed', async () => { |     this.socketConnection.socket.on('reconnect_failed', async () => { | ||||||
|       await this.disconnect(); |       await this.disconnect(true); | ||||||
|     }); |     }); | ||||||
|     this.socketConnection.socket.on('connect_error', async () => { |     this.socketConnection.socket.on('connect_error', async () => { | ||||||
|       await this.disconnect(); |       await this.disconnect(true); | ||||||
|     }); |     }); | ||||||
|     return done.promise; |     return done.promise; | ||||||
|   } |   } | ||||||
| @@ -188,19 +187,25 @@ export class SmartsocketClient { | |||||||
|   /** |   /** | ||||||
|    * disconnect from the server |    * disconnect from the server | ||||||
|    */ |    */ | ||||||
|   public async disconnect() { |   public async disconnect(useAutoconnectSetting = false) { | ||||||
|  |     if (this.eventStatus === 'disconnecting') { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     this.updateStatus('disconnecting'); | ||||||
|     this.tagStoreSubscription?.unsubscribe(); |     this.tagStoreSubscription?.unsubscribe(); | ||||||
|     if (this.socketConnection) { |     if (this.socketConnection) { | ||||||
|       await this.socketConnection.disconnect(); |       await this.socketConnection.disconnect(); | ||||||
|       this.socketConnection = undefined; |       this.socketConnection = undefined; | ||||||
|       logger.log('ok', 'disconnected!'); |       logger.log('ok', 'disconnected socket!'); | ||||||
|     } |     } | ||||||
|     logger.log('warn', `disconnected from server ${this.remoteShortId}`); |     logger.log('warn', `disconnected from server ${this.remoteShortId}`); | ||||||
|     this.remoteShortId = null; |     this.remoteShortId = null; | ||||||
|     this.updateStatus('disconnected'); |  | ||||||
|  |  | ||||||
|     if (this.autoReconnect) { |     if (this.autoReconnect && useAutoconnectSetting && this.eventStatus !== 'connecting') { | ||||||
|  |       this.updateStatus('connecting'); | ||||||
|       this.tryDebouncedReconnect(); |       this.tryDebouncedReconnect(); | ||||||
|  |     } else if (this.eventStatus === 'connected') { | ||||||
|  |       this.updateStatus('disconnected'); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -216,6 +221,7 @@ export class SmartsocketClient { | |||||||
|    * try a reconnection |    * try a reconnection | ||||||
|    */ |    */ | ||||||
|   public async tryDebouncedReconnect() { |   public async tryDebouncedReconnect() { | ||||||
|  |     console.log('debounced reconnect!'); | ||||||
|     await plugins.smartdelay.delayForRandom(10000, 20000); |     await plugins.smartdelay.delayForRandom(10000, 20000); | ||||||
|     await this.connect(); |     await this.connect(); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -197,7 +197,7 @@ export class SocketConnection { | |||||||
|         this.remoteTagStoreObservable.next(tagStoreArg); |         this.remoteTagStoreObservable.next(tagStoreArg); | ||||||
|       }); |       }); | ||||||
|  |  | ||||||
|       logger.log('info', `now listening to function requests for ${this.alias}`); |       logger.log('info', `now listening to function requests for ${this.alias} on side ${this.side}`); | ||||||
|       done.resolve(this); |       done.resolve(this); | ||||||
|     } else { |     } else { | ||||||
|       const errMessage = 'socket needs to be authenticated first'; |       const errMessage = 'socket needs to be authenticated first'; | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ import { logger } from './smartsocket.logging'; | |||||||
|  */ |  */ | ||||||
| export class SocketServer { | export class SocketServer { | ||||||
|   private smartsocket: Smartsocket; |   private smartsocket: Smartsocket; | ||||||
|  |   private httpServerDeferred: plugins.smartpromise.Deferred<any>; | ||||||
|   private httpServer: pluginsTyped.http.Server | pluginsTyped.https.Server; |   private httpServer: pluginsTyped.http.Server | pluginsTyped.https.Server; | ||||||
|    |    | ||||||
|   /** |   /** | ||||||
| @@ -30,14 +31,19 @@ export class SocketServer { | |||||||
|     serverType: 'smartexpress', |     serverType: 'smartexpress', | ||||||
|     serverArg: pluginsTyped.smartexpress.Server |     serverArg: pluginsTyped.smartexpress.Server | ||||||
|   ) { |   ) { | ||||||
|  |     this.httpServerDeferred = plugins.smartpromise.defer(); | ||||||
|     await serverArg.startedPromise; |     await serverArg.startedPromise; | ||||||
|     this.httpServer = serverArg.httpServer; |     this.httpServer = serverArg.httpServer; | ||||||
|  |     this.httpServerDeferred.resolve(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * gets the server for socket.io |    * gets the server for socket.io | ||||||
|    */ |    */ | ||||||
|   public getServerForSocketIo() { |   public async getServerForSocketIo() { | ||||||
|  |     if (this.httpServerDeferred) { | ||||||
|  |       await this.httpServerDeferred.promise; | ||||||
|  |     } | ||||||
|     if (this.httpServer) { |     if (this.httpServer) { | ||||||
|       return this.httpServer; |       return this.httpServer; | ||||||
|     } else { |     } else { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user