@aimee-blue/ab-service-kit
Version:
Aimee Blue Service Template
81 lines (68 loc) • 3.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.pipeStreamIntoSocket = exports.defaultSendToSocket = void 0;
var _operators = require("rxjs/operators");
var _registerError = require("../registerError");
var _logging = require("../logging");
const SOCKET_CLOSED = 'Trying to send data while socket already closed';
const defaultSendToSocket = (socket, data) => {
return new Promise((res, rej) => {
if (socket.readyState === socket.OPEN) {
socket.send(data instanceof Buffer ? data : JSON.stringify(data), err => {
if (err) {
rej(err);
} else {
res();
}
});
} else {
rej(new Error(SOCKET_CLOSED));
}
});
};
exports.defaultSendToSocket = defaultSendToSocket;
const defaultSendToSocketErrorHandler = (data, error, logger) => {
if (error.message === SOCKET_CLOSED) {
logger.warn('🚨 Socket was closed before we could send data back', data);
} else {
(0, _registerError.registerError)(error);
logger.error('💥 Error when sending data', data, error);
}
};
const defaultCloseSocket = (socket, code) => {
socket.close(code);
};
const pipeStreamIntoSocket = (stream, socket, optsRaw) => {
var _optsRaw$close, _optsRaw$send, _optsRaw$logger, _optsRaw$onSendError, _optsRaw$closeOnError, _optsRaw$closeOnCompl;
const opts = {
close: (_optsRaw$close = optsRaw === null || optsRaw === void 0 ? void 0 : optsRaw.close) !== null && _optsRaw$close !== void 0 ? _optsRaw$close : defaultCloseSocket,
send: (_optsRaw$send = optsRaw === null || optsRaw === void 0 ? void 0 : optsRaw.send) !== null && _optsRaw$send !== void 0 ? _optsRaw$send : defaultSendToSocket,
logger: (_optsRaw$logger = optsRaw === null || optsRaw === void 0 ? void 0 : optsRaw.logger) !== null && _optsRaw$logger !== void 0 ? _optsRaw$logger : _logging.defaultLogger,
onSendError: (_optsRaw$onSendError = optsRaw === null || optsRaw === void 0 ? void 0 : optsRaw.onSendError) !== null && _optsRaw$onSendError !== void 0 ? _optsRaw$onSendError : defaultSendToSocketErrorHandler,
closeOnError: (_optsRaw$closeOnError = optsRaw === null || optsRaw === void 0 ? void 0 : optsRaw.closeOnError) !== null && _optsRaw$closeOnError !== void 0 ? _optsRaw$closeOnError : true,
closeOnComplete: (_optsRaw$closeOnCompl = optsRaw === null || optsRaw === void 0 ? void 0 : optsRaw.closeOnComplete) !== null && _optsRaw$closeOnCompl !== void 0 ? _optsRaw$closeOnCompl : true
};
const subscription = stream.pipe((0, _operators.concatMap)(data => opts.send(socket, data).catch(err => {
opts.onSendError(data, err, opts.logger);
return Promise.reject(err);
})), (0, _operators.ignoreElements)()).subscribe({
error: error => {
if (!(error instanceof Error && error.message === SOCKET_CLOSED)) {
opts.logger.error('💥 Outgoing stream error', error);
}
if (opts.closeOnError) {
opts.close(socket, 1011);
}
},
complete: () => {
if (opts.closeOnComplete) {
opts.close(socket, 1000);
}
}
});
return subscription;
};
exports.pipeStreamIntoSocket = pipeStreamIntoSocket;
//# sourceMappingURL=pipeStreamIntoSocket.js.map