netkitty
Version:
Network tools kit
96 lines (95 loc) • 4.24 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PipeMessageHandler = void 0;
const socket_ipc_1 = require("socket-ipc");
const PipeMessage_1 = require("./PipeMessage");
const events_1 = __importDefault(require("events"));
const UnknownPipeMessageTypeError_1 = require("../../errors/UnknownPipeMessageTypeError");
const ActionNotFoundError_1 = require("../../errors/ActionNotFoundError");
class PipeMessageHandler extends events_1.default {
#owner;
#socket;
constructor(owner, socket) {
super();
this.#owner = owner;
this.#socket = socket;
if (this.#socket instanceof socket_ipc_1.MessageConnection) {
this.#socket.on('message', (message) => this.onMessageHandler(message));
}
else {
this.#socket.on('message', (message) => this.onMessageHandler(message));
}
}
/**
* On pipe message handler
* @param message
* @protected
*/
onMessageHandler(message) {
const pipeMessage = new PipeMessage_1.PipeMessage(message.data);
switch (pipeMessage.type) {
case PipeMessage_1.PipeMessageType.EVENT:
{
const args = pipeMessage.payload;
const eventName = args.shift();
this.#owner.emit(eventName, ...args);
}
break;
case PipeMessage_1.PipeMessageType.REQUEST:
{
const args = pipeMessage.payload;
const actionName = args.shift();
const action = this.#owner.actions[actionName];
if (action) {
action.call(this.#owner, ...args)
.then(response => {
pipeMessage.type = PipeMessage_1.PipeMessageType.RESPONSE_OK;
pipeMessage.payload = response;
this.#socket.send(pipeMessage.serialize());
})
.catch((error) => {
pipeMessage.type = PipeMessage_1.PipeMessageType.RESPONSE_ERR;
pipeMessage.payload = {
message: error.message,
errno: error.errno,
code: error.code
};
this.#socket.send(pipeMessage.serialize());
});
}
else {
pipeMessage.type = PipeMessage_1.PipeMessageType.RESPONSE_ERR;
const actionNotFoundError = new ActionNotFoundError_1.ActionNotFoundError(`Action ${actionName} not found`);
pipeMessage.payload = {
message: actionNotFoundError.message,
errno: actionNotFoundError.errno,
code: actionNotFoundError.code
};
this.#socket.send(pipeMessage.serialize());
}
}
break;
case PipeMessage_1.PipeMessageType.RESPONSE_OK:
{
this.#owner.emit(pipeMessage.messageId, pipeMessage.payload);
}
break;
case PipeMessage_1.PipeMessageType.RESPONSE_ERR:
{
const responseError = new Error();
responseError.message = pipeMessage.payload.message;
responseError.errno = pipeMessage.payload.errno;
responseError.code = pipeMessage.payload.code;
this.#owner.emit(pipeMessage.messageId, responseError);
}
break;
default: {
this.#owner.emit('error', new UnknownPipeMessageTypeError_1.UnknownPipeMessageTypeError(`Unknown pipe message type ${pipeMessage.type}`));
}
}
}
}
exports.PipeMessageHandler = PipeMessageHandler;