kannon-client/classes/Connection.js

120 lines
No EOL
3.3 KiB
JavaScript

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();
this.audiostream = new Audiostream(this.eventParser);
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');
});
}
#handleAudioEvents() {
}
destroy() {
if (this.heartbeat !== undefined) {
this.heartbeat.destroy();
this.heartbeat.removeAllListeners('timeout');
this.heartbeat = undefined;
}
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;