smartsocket/ts/smartsocket.classes.socketserver.ts

95 lines
2.6 KiB
TypeScript
Raw Normal View History

2022-03-14 21:40:55 +00:00
import * as plugins from './smartsocket.plugins.js';
import * as pluginsTyped from './smartsocket.pluginstyped.js';
2018-03-19 09:00:11 +00:00
// used in case no other server is supplied
2022-03-14 21:40:55 +00:00
import { Smartsocket } from './smartsocket.classes.smartsocket.js';
import { logger } from './smartsocket.logging.js';
2018-03-19 09:00:11 +00:00
/**
* class socketServer
* handles the attachment of socketIo to whatever server is in play
*/
export class SocketServer {
private smartsocket: Smartsocket;
2022-01-20 15:50:25 +00:00
private httpServerDeferred: plugins.smartpromise.Deferred<any>;
2020-09-29 17:21:08 +00:00
private httpServer: pluginsTyped.http.Server | pluginsTyped.https.Server;
2022-12-28 12:52:16 +00:00
2022-01-19 07:05:06 +00:00
/**
* wether httpServer is standalone
*/
2018-03-19 09:00:11 +00:00
private standaloneServer = false;
constructor(smartSocketInstance: Smartsocket) {
this.smartsocket = smartSocketInstance;
}
/**
* starts the server with another server
* also works with an express style server
*/
2019-04-26 15:35:15 +00:00
public async setExternalServer(
serverType: 'smartexpress',
2023-07-21 01:53:41 +00:00
serverArg: pluginsTyped.typedserver.servertools.Server
2019-04-26 15:35:15 +00:00
) {
2022-01-20 15:50:25 +00:00
this.httpServerDeferred = plugins.smartpromise.defer();
2019-04-24 15:10:51 +00:00
await serverArg.startedPromise;
this.httpServer = serverArg.httpServer;
2022-01-20 15:50:25 +00:00
this.httpServerDeferred.resolve();
2018-03-19 09:00:11 +00:00
}
/**
* gets the server for socket.io
*/
2022-01-20 15:50:25 +00:00
public async getServerForSocketIo() {
if (this.httpServerDeferred) {
await this.httpServerDeferred.promise;
}
2018-03-19 09:00:11 +00:00
if (this.httpServer) {
return this.httpServer;
2019-04-24 15:10:51 +00:00
} else {
2022-03-24 11:52:28 +00:00
const httpModule = await this.smartsocket.smartenv.getSafeNodeModule('http');
2020-09-29 17:21:08 +00:00
this.httpServer = new httpModule.Server();
2018-03-19 09:00:11 +00:00
this.standaloneServer = true;
return this.httpServer;
}
}
/**
* starts listening to incoming sockets:
*/
public async start() {
const done = plugins.smartpromise.defer();
2018-03-19 09:00:11 +00:00
// handle http servers
2019-04-24 13:47:28 +00:00
// in case an external server has been set "this.standaloneServer" should be false
2018-03-19 09:00:11 +00:00
if (this.httpServer && this.standaloneServer) {
2019-04-24 13:47:28 +00:00
if (!this.smartsocket.options.port) {
2020-09-24 18:03:01 +00:00
logger.log('error', 'there should be a port specifed for smartsocket!');
2019-04-26 15:35:15 +00:00
throw new Error('there should be a port specified for smartsocket');
2019-04-24 13:47:28 +00:00
}
2018-03-19 09:00:11 +00:00
this.httpServer.listen(this.smartsocket.options.port, () => {
2020-09-24 18:04:11 +00:00
logger.log(
'success',
`Server started in standalone mode on ${this.smartsocket.options.port}`
);
2018-03-19 09:00:11 +00:00
done.resolve();
});
} else {
done.resolve();
}
// nothing else to do if express server is set
await done.promise;
return;
}
/**
* closes the server
*/
2022-01-19 06:01:58 +00:00
public async stop() {
if (this.httpServer) {
this.httpServer.close();
}
}
2018-03-19 09:00:11 +00:00
}