Implement basic centerSession structure
This commit is contained in:
279
main.js
279
main.js
@@ -396,12 +396,265 @@ class ClientSessionManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
startup() {
|
startup() {
|
||||||
|
try {
|
||||||
let sessions = fs.readFileSync(CLIENT_SESSIONS_FILE);
|
let sessions = fs.readFileSync(CLIENT_SESSIONS_FILE);
|
||||||
sessions = JSON.parse(sessions);
|
sessions = JSON.parse(sessions);
|
||||||
this.logger.log1(`Loaded ${sessions.length} sessions from ${CLIENT_SESSIONS_FILE}...`);
|
this.logger.log1(`Loaded ${sessions.length} sessions from ${CLIENT_SESSIONS_FILE}...`);
|
||||||
sessions.forEach(session => {
|
sessions.forEach(session => {
|
||||||
this.createSession(session.url, session.username, session.password);
|
this.createSession(session.url, session.username, session.password);
|
||||||
})
|
});
|
||||||
|
} catch (e) {
|
||||||
|
this.logger.log1(`Error loading sessions from ${CLIENT_SESSIONS_FILE}: ${e}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CenterSessionStatus {
|
||||||
|
static CONNECTED = "CONNECTED";
|
||||||
|
static WAITING_CONNECTION = "WAITING_CONNECTION";
|
||||||
|
static CONNECTION_PENDING = "CONNECTION_PENDING";
|
||||||
|
}
|
||||||
|
|
||||||
|
class CenterSession {
|
||||||
|
auto_enquire_link_period = 500;
|
||||||
|
eventEmitter = new EventEmitter();
|
||||||
|
busy = false;
|
||||||
|
session = null;
|
||||||
|
|
||||||
|
disconnectingPromise = {
|
||||||
|
promise: null,
|
||||||
|
resolve: null,
|
||||||
|
reject: null
|
||||||
|
}
|
||||||
|
|
||||||
|
static STATUS_CHANGED_EVENT = "statusChanged";
|
||||||
|
static ANY_PDU_EVENT = "*";
|
||||||
|
static MESSAGE_SEND_COUNTER_UPDATE_EVENT = "messageSendCounterUpdate";
|
||||||
|
|
||||||
|
constructor(id, port, username, password) {
|
||||||
|
this.id = id;
|
||||||
|
this.logger = new Logger(`CenterSession-${this.id}`);
|
||||||
|
this.port = port;
|
||||||
|
|
||||||
|
this.username = username;
|
||||||
|
this.password = password;
|
||||||
|
|
||||||
|
this.server = smpp.createServer({}, this.connected.bind(this));
|
||||||
|
this.server.on('debug', (type, msg, payload) => {
|
||||||
|
if (type.includes('pdu.')) {
|
||||||
|
this.eventEmitter.emit(msg, payload);
|
||||||
|
this.eventEmitter.emit(ClientSession.ANY_PDU_EVENT, payload);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.server.listen(this.port);
|
||||||
|
|
||||||
|
this.logger.log1(`Session created with port ${this.port}, username ${this.username}, password ${this.password} and ID ${this.id}`);
|
||||||
|
this.status = CenterSessionStatus.WAITING_CONNECTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
setStatus(newStatus) {
|
||||||
|
this.status = newStatus;
|
||||||
|
this.eventEmitter.emit(ClientSession.STATUS_CHANGED_EVENT, newStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
error(error) {
|
||||||
|
if (error.code === "ETIMEOUT") {
|
||||||
|
this.logger.log1("Connection timed out to " + this.port);
|
||||||
|
} else if (error.code === "ECONNREFUSED") {
|
||||||
|
this.logger.log1("Connection refused to " + this.port);
|
||||||
|
} else {
|
||||||
|
this.logger.log1("Connection failed to " + this.port);
|
||||||
|
}
|
||||||
|
this.setStatus(CenterSessionStatus.CONNECTION_PENDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
connected(session) {
|
||||||
|
this.logger.log1("Center got a connection on port " + this.port);
|
||||||
|
this.setStatus(CenterSessionStatus.CONNECTION_PENDING);
|
||||||
|
|
||||||
|
session.on('error', this.error.bind(this));
|
||||||
|
|
||||||
|
function bind_transciever(pdu) {
|
||||||
|
this.logger.log1(`Center got a bind_transciever on port ${this.port} with system_id ${pdu.system_id} and password ${pdu.password}`);
|
||||||
|
session.pause();
|
||||||
|
if (pdu.system_id === this.username && pdu.password === this.password) {
|
||||||
|
this.logger.log1(`Connection successful`);
|
||||||
|
session.send(pdu.response());
|
||||||
|
session.resume();
|
||||||
|
this.setStatus(CenterSessionStatus.CONNECTED);
|
||||||
|
} else {
|
||||||
|
this.logger.log1(`Connection failed, invalid credentials`);
|
||||||
|
session.send(pdu.response({
|
||||||
|
command_status: smpp.ESME_RBINDFAIL
|
||||||
|
}));
|
||||||
|
this.setStatus(CenterSessionStatus.WAITING_CONNECTION);
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
session.on('bind_transceiver', bind_transciever.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
// notify(source, destination, message) {
|
||||||
|
// return new Promise((resolve, reject) => {
|
||||||
|
// if (!this.canSend()) {
|
||||||
|
// this.logger.log1(`Cannot send message, not bound to ${this.url} or busy`);
|
||||||
|
// reject(`Cannot send message, not bound to ${this.url} or busy`);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// this.logger.log1(`Sending message from ${source} to ${destination} with message ${message}`);
|
||||||
|
// this.session.submit_sm({
|
||||||
|
// source_addr: source,
|
||||||
|
// destination_addr: destination,
|
||||||
|
// short_message: message
|
||||||
|
// }, pdu => {
|
||||||
|
// resolve(pdu);
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// notifyOnInterval(source, destination, message, interval, count) {
|
||||||
|
// return new Promise((resolve, reject) => {
|
||||||
|
// if (!this.canSend() || this.busy) {
|
||||||
|
// this.logger.log1(`Cannot send many message, not bound to ${this.url} or busy`);
|
||||||
|
// reject(`Cannot send many message, not bound to ${this.url} or busy`);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// this.busy = true;
|
||||||
|
// this.timer = new NanoTimer();
|
||||||
|
// let counter = 0;
|
||||||
|
// let previousUpdateCounter = 0;
|
||||||
|
//
|
||||||
|
// this.updateTimer = new NanoTimer();
|
||||||
|
// this.updateTimer.setInterval(() => {
|
||||||
|
// if (previousUpdateCounter !== counter) {
|
||||||
|
// this.eventEmitter.emit(ClientSession.MESSAGE_SEND_COUNTER_UPDATE_EVENT, counter);
|
||||||
|
// previousUpdateCounter = counter;
|
||||||
|
// }
|
||||||
|
// }, '', `${MESSAGE_SEND_UPDATE_DELAY / 1000} s`);
|
||||||
|
//
|
||||||
|
// this.timer.setInterval(() => {
|
||||||
|
// if (count > 0 && counter >= count) {
|
||||||
|
// this.cancelNotifyInterval();
|
||||||
|
// } else {
|
||||||
|
// this.notify(source, destination, message)
|
||||||
|
// .catch(e => this.logger.log1(`Error sending message: ${e}`));
|
||||||
|
// counter++;
|
||||||
|
// }
|
||||||
|
// }, '', `${interval} s`);
|
||||||
|
// resolve();
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// cancelNotifyInterval() {
|
||||||
|
// if (!!this.timer) {
|
||||||
|
// this.timer.clearInterval();
|
||||||
|
// this.updateTimer.clearInterval();
|
||||||
|
// this.timer = null;
|
||||||
|
// this.updateTimer = null;
|
||||||
|
// }
|
||||||
|
// this.busy = false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.disconnectingPromise.promise = new Promise((resolve, reject) => {
|
||||||
|
if (this.status !== CenterSessionStatus.CONNECTED) {
|
||||||
|
this.logger.log1(`Cannot close session, no clients bound to ${this.port}`);
|
||||||
|
reject(`Cannot close session, no clients bound to ${this.port}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.session.close();
|
||||||
|
this.setStatus(CenterSessionStatus.WAITING_CONNECTION);
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
return this.disconnectingPromise.promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
on(event, callback) {
|
||||||
|
this.eventEmitter.on(event, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
serialize() {
|
||||||
|
return {
|
||||||
|
id: this.id,
|
||||||
|
port: this.port,
|
||||||
|
username: this.username,
|
||||||
|
password: this.password,
|
||||||
|
status: this.status
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
canSend() {
|
||||||
|
return this.status === CenterSessionStatus.CONNECTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CenterSessionManager {
|
||||||
|
sessionIdCounter = 0;
|
||||||
|
logger = new Logger("CenterSessionManager");
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.servers = {};
|
||||||
|
// process.on('exit', this.cleanup.bind(this));
|
||||||
|
// process.on('SIGINT', this.cleanup.bind(this));
|
||||||
|
// process.on('SIGUSR1', this.cleanup.bind(this));
|
||||||
|
// process.on('SIGUSR2', this.cleanup.bind(this));
|
||||||
|
// process.on('uncaughtException', this.cleanup.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
createSession(port, username, password) {
|
||||||
|
if (this.servers[port]) {
|
||||||
|
this.logger.log1(`Center listening on ${port} already exists`);
|
||||||
|
return this.servers[port];
|
||||||
|
}
|
||||||
|
this.logger.log1(`Creating center listening on ${port} with username ${username} and password ${password}`);
|
||||||
|
let session = new CenterSession(this.sessionIdCounter++, port, username, password);
|
||||||
|
this.addSession(session);
|
||||||
|
return session;
|
||||||
|
}
|
||||||
|
|
||||||
|
addSession(server) {
|
||||||
|
this.logger.log1(`Adding session with ID ${server.id}`);
|
||||||
|
this.servers[server.port] = server;
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteSession(server) {
|
||||||
|
this.logger.log1(`Deleting session with ID ${server.id}`);
|
||||||
|
if (server.status === CenterSessionStatus.CONNECTED) {
|
||||||
|
server.close();
|
||||||
|
}
|
||||||
|
delete this.servers[server.port];
|
||||||
|
}
|
||||||
|
|
||||||
|
getSession(id) {
|
||||||
|
return Object.values(this.servers).find((session) => {
|
||||||
|
return session.id == id;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
serialize() {
|
||||||
|
return Object.values(this.servers).map((servers) => {
|
||||||
|
return servers.serialize();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
this.logger.log1(`Saving sessions to ${CENTER_SESSIONS_FILE}...`);
|
||||||
|
fs.writeFileSync(CENTER_SESSIONS_FILE, JSON.stringify(this.serialize(), null, 4));
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
startup() {
|
||||||
|
try {
|
||||||
|
let servers = fs.readFileSync(CENTER_SESSIONS_FILE);
|
||||||
|
servers = JSON.parse(servers);
|
||||||
|
this.logger.log1(`Loaded ${servers.length} sessions from ${CENTER_SESSIONS_FILE}...`);
|
||||||
|
servers.forEach(server => {
|
||||||
|
this.createSession(server.port, server.username, server.password);
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
this.logger.log1(`Error loading sessions from ${CLIENT_SESSIONS_FILE}: ${e}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -422,6 +675,17 @@ class HTTPServer {
|
|||||||
app.delete('/api/client/:id/connect', this.disconnectClientSession.bind(this));
|
app.delete('/api/client/:id/connect', this.disconnectClientSession.bind(this));
|
||||||
app.delete('/api/client/:id', this.deleteClientSession.bind(this));
|
app.delete('/api/client/:id', this.deleteClientSession.bind(this));
|
||||||
|
|
||||||
|
// app.get('/api/center', this.getCenterSessions.bind(this));
|
||||||
|
// app.post('/api/center', this.createCenterSession.bind(this));
|
||||||
|
// app.get('/api/center/:id', this.getCenterSessionById.bind(this));
|
||||||
|
// app.post('/api/center/:id/send', this.notify.bind(this));
|
||||||
|
// app.post('/api/center/:id/sendMany', this.notifyMany.bind(this));
|
||||||
|
// app.delete('/api/center/:id/sendMany', this.cancelNotifyMany.bind(this));
|
||||||
|
// app.post('/api/center/:id/bind', this.bindCenterSession.bind(this));
|
||||||
|
// app.post('/api/center/:id/connect', this.connectCenterSession.bind(this));
|
||||||
|
// app.delete('/api/center/:id/connect', this.disconnectCenterSession.bind(this));
|
||||||
|
// app.delete('/api/center/:id', this.deleteCenterSession.bind(this));
|
||||||
|
|
||||||
this.server = app.listen(SERVER_PORT, function() {
|
this.server = app.listen(SERVER_PORT, function() {
|
||||||
this.logger.log1(`HTTPServer listening at http://localhost:${SERVER_PORT}`)
|
this.logger.log1(`HTTPServer listening at http://localhost:${SERVER_PORT}`)
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
@@ -679,8 +943,17 @@ class WSServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let clientSessionManager = new ClientSessionManager();
|
let clientSessionManager = new ClientSessionManager();
|
||||||
|
let centerSessionManager = new CenterSessionManager();
|
||||||
clientSessionManager.startup();
|
clientSessionManager.startup();
|
||||||
let session = clientSessionManager.getSession(0);
|
centerSessionManager.startup();
|
||||||
session.connect().then(() => session.bind());
|
|
||||||
|
let session = clientSessionManager.createSession('smpp://localhost:7001', '123', 'test');
|
||||||
|
let server = centerSessionManager.createSession(7001, 'test', 'test');
|
||||||
|
|
||||||
|
session.connect().then(() => session.bind()).catch(err => console.log(err));
|
||||||
|
server.on(CenterSession.STATUS_CHANGED_EVENT, (status) => {
|
||||||
|
console.log(status);
|
||||||
|
});
|
||||||
|
|
||||||
new WSServer();
|
new WSServer();
|
||||||
new HTTPServer();
|
new HTTPServer();
|
Reference in New Issue
Block a user