UNPKG

movex-core-util

Version:

Movex Core Util is the library of utilities for Movex

134 lines 4.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SocketIOEmitter = void 0; const ts_results_1 = require("ts-results"); const Logsy_1 = require("../Logsy"); const logsy = Logsy_1.globalLogsy.withNamespace('[SocketIOEmitter]'); class SocketIOEmitter { constructor(socket, config) { this.socket = socket; this.config = { waitForResponseMs: (config === null || config === void 0 ? void 0 : config.waitForResponseMs) || 15 * 1000, }; } on(event, listener) { this.socket.on(event, listener); return this; } off(event, listener) { this.socket.off(event, listener); return this; } subscribe(event, listener) { this.on(event, listener); return () => { this.off(event, listener); }; } emit(event, request, acknowledgeCb) { const reqId = `${event}(${String(Math.random()).slice(-3)})`; logsy.debug('Emit', { reqId, event, request }); this.socket.emit(event, request, acknowledgeCb && withTimeout((res) => { if (res.ok) { logsy.debug('Emit Response Ok', { reqId, event, res }); acknowledgeCb(new ts_results_1.Ok(res.val)); } else { logsy.debug('Emit Response Err', { reqId, event, res }); acknowledgeCb(new ts_results_1.Err(res.val)); } }, () => { // this.logger.warn( // '[ServerSocketEmitter]', // event, // 'Request Timeout:', // request // ); // // TODO This error could be typed better using a result error // reject(new Err('RequestTimeout')); }, this.config.waitForResponseMs)); return false; } emitAndAcknowledge(event, request) { return new Promise((resolve, reject) => { const reqId = `${event}(${String(Math.random()).slice(-3)})`; logsy.debug('EmitAndAcknowledge', { reqId, event, request, }); this.socket.emit(event, request, withTimeout((res) => { if (res.ok) { logsy.debug('EmitAndAcknowledge Response Ok', { reqId, res, request, event, }); resolve(new ts_results_1.Ok(res.val)); } else { logsy.debug('EmitAndAcknowledge Response Err', { reqId, res, request, event, }); reject(new ts_results_1.Err(res.val)); } }, () => { logsy.error('EmitAndAcknowledge Request Timeout', { reqId, request, event, }); // TODO This error could be typed better using a result error reject(new ts_results_1.Err('RequestTimeout')); }, this.config.waitForResponseMs)); }).catch((e) => e); } onConnect(fn) { this.socket.on('connect', fn); return () => { this.socket.off('connect', fn); }; } onDisconnect(fn) { this.socket.on('disconnect', fn); return () => { this.socket.off('disconnect', fn); }; } disconnect() { this.socket.disconnect(); } } exports.SocketIOEmitter = SocketIOEmitter; /** * TODO: Deprecate this in favor of using the native timeout See https://socket.io/docs/v4/emitting-events/#with-timeout * * @param onSuccess * @param onTimeout * @param timeout * @returns */ const withTimeout = (onSuccess, onTimeout, timeout = 15 * 1000 // 15 sec ) => { let called = false; const timer = setTimeout(() => { if (called) return; called = true; onTimeout(); }, timeout); return (...args) => { if (called) { return; } called = true; clearTimeout(timer); onSuccess(...args); }; }; //# sourceMappingURL=ScketIOEmitter.js.map