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;