movex-core-util
Version:
Movex Core Util is the library of utilities for Movex
134 lines • 4.4 kB
JavaScript
;
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