2022-04-14 14:25:48 +02:00
|
|
|
const util = require('../libs/util.js');
|
|
|
|
const net = require('net');
|
|
|
|
|
|
|
|
const Heartbeat = require('./Heartbeat.js');
|
|
|
|
const EventParser = require('./EventParser.js');
|
|
|
|
const Audiostream = require('./Audiostream.js');
|
|
|
|
|
|
|
|
class Connection {
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
if (util.isUnset(config.server.host)) {
|
|
|
|
logger.warn('host is not defined - defaulting to \'127.0.0.1\'...');
|
|
|
|
}
|
|
|
|
if (util.isUnset(config.server.port)) {
|
|
|
|
logger.warn('port is not defined - defaulting to \'3000\'...');
|
|
|
|
}
|
|
|
|
this.host = config?.server?.host || "127.0.0.1";
|
|
|
|
this.port = config?.server?.port || "3000";
|
|
|
|
}
|
|
|
|
|
|
|
|
getHost() {
|
|
|
|
return this.host;
|
|
|
|
}
|
|
|
|
|
|
|
|
getPort() {
|
|
|
|
return this.port;
|
|
|
|
}
|
|
|
|
|
|
|
|
getTag() {
|
|
|
|
return this.getHost() + ':' + this.getPort();
|
|
|
|
}
|
|
|
|
|
|
|
|
initialize() {
|
|
|
|
return this.#handleSocket(net.connect({
|
|
|
|
host: this.host,
|
|
|
|
port: this.port
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
|
|
|
|
#handleSocket(socket) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
socket.on('connect', () => {
|
|
|
|
this.#handleEventConnect(resolve, socket);
|
|
|
|
});
|
|
|
|
socket.on('error', (error) => {
|
|
|
|
this.#handleEventError(reject, error);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#handleEventConnect(resolve, socket) {
|
|
|
|
logger.info('connected to communication server \'' + this.getTag() + '\'...');
|
|
|
|
this.socket = socket;
|
|
|
|
this.eventParser = new EventParser();
|
2022-04-20 16:15:51 +02:00
|
|
|
this.audiostream = new Audiostream(this.eventParser);
|
2022-04-14 14:25:48 +02:00
|
|
|
this.heartbeat = new Heartbeat(this.eventParser);
|
|
|
|
this.#handleHeartbeat();
|
|
|
|
socket.on('timeout', () => {
|
|
|
|
this.#handleEventTimeout();
|
|
|
|
});
|
|
|
|
socket.on('close', () => {
|
|
|
|
this.#handleEventClose(resolve);
|
|
|
|
});
|
|
|
|
socket.on('data', (data) => {
|
|
|
|
this.#handleEventData(data);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async #handleEventData(data) {
|
|
|
|
this.eventParser.parse(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
#handleEventTimeout() {
|
|
|
|
logger.warn('connection to communication server \'' + this.getTag() + '\' timed out');
|
|
|
|
}
|
|
|
|
|
|
|
|
#handleEventError(reject, error) {
|
|
|
|
this.destroy();
|
|
|
|
return reject('error connecting to communication server \'' + this.getTag() + '\': ' + error);
|
|
|
|
}
|
|
|
|
|
|
|
|
#handleEventClose(resolve) {
|
|
|
|
logger.info('connection to communication server \'' + this.getTag() + '\' closed');
|
|
|
|
this.destroy();
|
|
|
|
return resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
#handleHeartbeat() {
|
|
|
|
this.heartbeat.on('timeout', () => {
|
|
|
|
logger.warn('heartbeat to communication server \'' + this.getTag() + '\' timed out');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-04-20 16:15:51 +02:00
|
|
|
#handleAudioEvents() {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-04-14 14:25:48 +02:00
|
|
|
destroy() {
|
|
|
|
if (this.heartbeat !== undefined) {
|
|
|
|
this.heartbeat.destroy();
|
|
|
|
this.heartbeat.removeAllListeners('timeout');
|
2022-04-20 16:15:51 +02:00
|
|
|
this.heartbeat = undefined;
|
2022-04-14 14:25:48 +02:00
|
|
|
}
|
|
|
|
if (this.socket !== undefined) {
|
|
|
|
this.socket.removeAllListeners('connect');
|
|
|
|
this.socket.removeAllListeners('error');
|
|
|
|
this.socket.removeAllListeners('timeout');
|
|
|
|
this.socket.removeAllListeners('close');
|
|
|
|
this.socket.removeAllListeners('data');
|
|
|
|
this.socket.end();
|
|
|
|
this.socket.destroy();
|
|
|
|
this.socket = undefined;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = Connection;
|