Browse Source

remove all session users from joined chat rooms at ioserver shutdown

develop
Rob Colbert 1 year ago
parent
commit
648fb67933
  1. 10
      dtp-chat.js
  2. 23
      lib/site-ioserver.js
  3. 31
      lib/site-runtime.js

10
dtp-chat.js

@ -51,6 +51,16 @@ class SiteWebApp extends SiteRuntime {
await this.startExpressJS(); await this.startExpressJS();
} }
async shutdown ( ) {
await super.shutdown();
if (this.io) {
await this.io.shutdown();
}
return 0; // exitCode
}
async startExpressJS ( ) { async startExpressJS ( ) {
const { session: sessionService } = this.services; const { session: sessionService } = this.services;

23
lib/site-ioserver.js

@ -33,6 +33,7 @@ export class SiteIoServer extends SiteCommon {
super(dtp); super(dtp);
this.dtp = dtp; this.dtp = dtp;
this.log = new SiteLog(dtp, SiteIoServer); this.log = new SiteLog(dtp, SiteIoServer);
this.sessions = { };
} }
async start (httpServer) { async start (httpServer) {
@ -121,8 +122,23 @@ export class SiteIoServer extends SiteCommon {
this.log.error('Redis error', { error }); this.log.error('Redis error', { error });
} }
async stop ( ) { async shutdown ( ) {
this.log.info('stopping Socket.io server'); const { chat: chatService } = this.dtp.services;
this.log.alert('Socket.io server shutting down');
for (const socketId in this.sessions) {
const session = this.sessions[socketId];
this.log.debug('leaving joined rooms', { size: session.joinedRooms.size });
for (const roomId of session.joinedRooms) {
const room = await chatService.getRoomById(roomId);
await chatService.chatRoomCheckOut(room, session.user);
}
session.joinedRooms.clear();
this.log.debug('closing socket connection', { socketId });
await session.socket.disconnect(true);
}
} }
async onSocketConnect (socket) { async onSocketConnect (socket) {
@ -197,6 +213,7 @@ export class SiteIoServer extends SiteCommon {
joinedChannels: new Set(), joinedChannels: new Set(),
joinedRooms: new Map(), joinedRooms: new Map(),
}; };
this.sessions[socket.id] = session;
session.onSocketDisconnect = this.onSocketDisconnect.bind(this, session); session.onSocketDisconnect = this.onSocketDisconnect.bind(this, session);
socket.on('disconnect', session.onSocketDisconnect); socket.on('disconnect', session.onSocketDisconnect);
@ -291,6 +308,8 @@ export class SiteIoServer extends SiteCommon {
session.socket.off('user-chat', session.onUserChat); session.socket.off('user-chat', session.onUserChat);
delete session.onUserChat; delete session.onUserChat;
} }
delete this.sessions[session.socket.id];
} }
async onJoinChannel (session, message) { async onJoinChannel (session, message) {

31
lib/site-runtime.js

@ -50,6 +50,34 @@ export class SiteRuntime {
await this.loadModels(); await this.loadModels();
await this.loadServices(); await this.loadServices();
process.on('unhandledRejection', (error, p) => {
this.log.error('Unhandled rejection', {
error: error,
promise: p,
stack: error.stack
});
});
process.on('warning', (error) => {
this.log.alert('warning', { error });
});
process.once('SIGINT', async ( ) => {
this.log.info('SIGINT received (requesting shutdown)');
const exitCode = await this.shutdown();
this.terminate(exitCode);
});
}
async shutdown ( ) {
this.log.alert('System runtime shutting down');
}
terminate (exitCode = 0) {
process.nextTick(( ) => {
process.exit(exitCode);
});
} }
async loadConfig ( ) { async loadConfig ( ) {
@ -218,8 +246,7 @@ export class SiteRuntime {
viewModel.DTP_SCRIPT_DEBUG = (process.env.NODE_ENV !== 'production'); viewModel.DTP_SCRIPT_DEBUG = (process.env.NODE_ENV !== 'production');
viewModel.dtp = this; viewModel.dtp = this;
const pkg = await import(path.join(this.config.root, 'package.json'), { assert: { type: 'json' } }); // jshint ignore:line viewModel.pkg = this.config.pkg;
viewModel.pkg = pkg.default; // jshint ignore:line
viewModel.dayjs = dayjs; viewModel.dayjs = dayjs;
viewModel.numeral = numeral; viewModel.numeral = numeral;
// viewModel.phoneNumberJS = require('libphonenumber-js'); // viewModel.phoneNumberJS = require('libphonenumber-js');

Loading…
Cancel
Save