Implement closing and destroying center sessions

Although this currently serves little to no purpose because the sessions can not be opened again
This commit is contained in:
David Majdandžić
2023-03-25 17:40:44 +01:00
parent 6a29bb3014
commit b8e9642507
2 changed files with 89 additions and 5 deletions

File diff suppressed because one or more lines are too long

92
main.js
View File

@@ -446,7 +446,6 @@ class CenterMode {
class CenterSession { class CenterSession {
// TODO: If the port is in use this throws an exception, catch it and log it // TODO: If the port is in use this throws an exception, catch it and log it
// TODO: Implement session overview, they can be closed, destroyed and reconnected
eventEmitter = new EventEmitter(); eventEmitter = new EventEmitter();
busy = false; busy = false;
sessions = []; sessions = [];
@@ -461,6 +460,7 @@ class CenterSession {
static STATUS_CHANGED_EVENT = "statusChanged"; static STATUS_CHANGED_EVENT = "statusChanged";
static MODE_CHANGED_EVENT = "modeChanged"; static MODE_CHANGED_EVENT = "modeChanged";
static SESSION_CHANGED_EVENT = "sessionChanged";
static ANY_PDU_EVENT = "*"; static ANY_PDU_EVENT = "*";
static MESSAGE_SEND_COUNTER_UPDATE_EVENT = "messageSendCounterUpdate"; static MESSAGE_SEND_COUNTER_UPDATE_EVENT = "messageSendCounterUpdate";
@@ -535,7 +535,7 @@ class CenterSession {
session.send(pdu.response()); session.send(pdu.response());
session.resume(); session.resume();
session.on('pdu', this.sessionPdu.bind(this, session)); session.on('pdu', this.sessionPdu.bind(this, session));
this.sessions.push(session); this.addSession(session);
this.setStatus(CenterSessionStatus.CONNECTED); this.setStatus(CenterSessionStatus.CONNECTED);
session.on('debug', (type, msg, payload) => { session.on('debug', (type, msg, payload) => {
if (type.includes('pdu.')) { if (type.includes('pdu.')) {
@@ -643,6 +643,49 @@ class CenterSession {
return session; return session;
} }
getSessions() {
return this.sessions.map(session => {
return this.mapSession(session);
})
}
mapSession(session) {
return {
closed: session.closed,
paused: session.paused,
remoteAddress: session.remoteAddress,
remotePort: session.remotePort,
_id: session._id,
deleted: session.deleted || false
}
}
closeSession(sessionId) {
let session = this.sessions.find(session => session._id == sessionId);
if (!!session) {
session.close();
this.eventEmitter.emit(CenterSession.SESSION_CHANGED_EVENT, this.mapSession(session));
}
}
deleteSession(sessionId) {
let session = this.sessions.find(session => session._id == sessionId);
if (!!session) {
session.close();
session.destroy();
session.deleted = true;
this.eventEmitter.emit(CenterSession.SESSION_CHANGED_EVENT, this.mapSession(session));
delete this.sessions[this.sessions.indexOf(session)];
this.sessions = this.sessions.filter(Boolean);
}
}
addSession(session) {
let sessionInfo = this.mapSession(session);
this.eventEmitter.emit(CenterSession.SESSION_CHANGED_EVENT, sessionInfo);
this.sessions.push(session);
}
close() { close() {
this.disconnectingPromise.promise = new Promise((resolve, reject) => { this.disconnectingPromise.promise = new Promise((resolve, reject) => {
if (this.status !== CenterSessionStatus.CONNECTED) { if (this.status !== CenterSessionStatus.CONNECTED) {
@@ -776,7 +819,10 @@ class HTTPServer {
app.get('/api/center', this.getCenterSessions.bind(this)); app.get('/api/center', this.getCenterSessions.bind(this));
app.post('/api/center', this.createCenterSession.bind(this)); app.post('/api/center', this.createCenterSession.bind(this));
app.get('/api/center/modes', this.getAvailableModes.bind(this)); app.get('/api/center/modes', this.getAvailableModes.bind(this));
app.get('/api/center/:id', this.getCenterSessionById.bind(this)); app.get('/api/center/:id', this.getCenterServerById.bind(this));
app.get('/api/center/:id/session', this.getCenterServerSessionsById.bind(this));
app.delete('/api/center/:id/session/:sessionId', this.closeCenterServerSessionById.bind(this));
app.delete('/api/center/:id/session/:sessionId/destroy', this.deleteCenterServerSessionById.bind(this));
app.patch('/api/center/:id', this.patchCenterServer.bind(this)); app.patch('/api/center/:id', this.patchCenterServer.bind(this));
app.post('/api/center/:id/send', this.notify.bind(this)); app.post('/api/center/:id/send', this.notify.bind(this));
app.post('/api/center/:id/sendMany', this.notifyMany.bind(this)); app.post('/api/center/:id/sendMany', this.notifyMany.bind(this));
@@ -961,7 +1007,7 @@ class HTTPServer {
res.send(session.serialize()); res.send(session.serialize());
} }
getCenterSessionById(req, res) { getCenterServerById(req, res) {
let session = centerSessionManager.getSession(req.params.id); let session = centerSessionManager.getSession(req.params.id);
this.logger.log1(`Getting center session by ID ${req.params.id}`); this.logger.log1(`Getting center session by ID ${req.params.id}`);
if (session) { if (session) {
@@ -973,6 +1019,44 @@ class HTTPServer {
} }
} }
getCenterServerSessionsById(req, res) {
let server = centerSessionManager.getSession(req.params.id);
this.logger.log1(`Getting center session by ID ${req.params.id}`);
if (server) {
this.logger.log1(`Center session found with ID ${req.params.id}`)
res.send(server.getSessions());
} else {
this.logger.log1(`No center session found with ID ${req.params.id}`);
res.status(404).send();
}
}
closeCenterServerSessionById(req, res) {
let server = centerSessionManager.getSession(req.params.id);
this.logger.log1(`Getting center session by ID ${req.params.id}`);
if (server) {
this.logger.log1(`Center session found with ID ${req.params.id}`)
server.closeSession(req.params.sessionId)
res.send();
} else {
this.logger.log1(`No center session found with ID ${req.params.id}`);
res.status(404).send();
}
}
deleteCenterServerSessionById(req, res) {
let server = centerSessionManager.getSession(req.params.id);
this.logger.log1(`Getting center session by ID ${req.params.id}`);
if (server) {
this.logger.log1(`Center session found with ID ${req.params.id}`)
server.deleteSession(req.params.sessionId)
res.send();
} else {
this.logger.log1(`No center session found with ID ${req.params.id}`);
res.status(404).send();
}
}
patchCenterServer(req, res) { patchCenterServer(req, res) {
let server = centerSessionManager.getSession(req.params.id); let server = centerSessionManager.getSession(req.params.id);
if (server) { if (server) {