netkitty
Version:
Network tools kit
72 lines (71 loc) • 2.65 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PipeClient = void 0;
const events_1 = __importDefault(require("events"));
const socket_ipc_1 = require("socket-ipc");
const PipeMessage_1 = require("./PipeMessage");
const PipeMessageHandler_1 = require("./PipeMessageHandler");
const SocketDownError_1 = require("../../errors/SocketDownError");
class PipeClient extends events_1.default {
#connected;
get connected() {
return this.#connected;
}
constructor(options) {
super();
this.actions = {};
this.id = options.id;
this.socketPath = options.socketPath;
this.actions = options.actions;
this.#connected = true;
this.client = new socket_ipc_1.MessageClient({ path: this.socketPath });
this.pipeMessageHandler = new PipeMessageHandler_1.PipeMessageHandler(this, this.client);
this.client.on('close', () => this.#connected = false);
this.client.start().then(() => {
this.client.send(Buffer.from(this.id).toString('base64'));
this.emit('ready');
});
}
/**
* Invoke server side action
* @param act
* @param args
*/
async invoke(act, ...args) {
return new Promise((resolve, reject) => {
const pipeMessage = new PipeMessage_1.PipeMessage();
pipeMessage.type = PipeMessage_1.PipeMessageType.REQUEST;
pipeMessage.payload = [act, ...args];
this.once(pipeMessage.messageId, (resultOrError) => resultOrError instanceof Error ? reject(resultOrError) : resolve(resultOrError));
if (!this.connected) {
this.removeAllListeners(pipeMessage.messageId);
return reject(new SocketDownError_1.SocketDownError('Socket is down'));
}
this.client.send(pipeMessage.serialize());
});
}
/**
* Notify event to pipe server
* @param event
* @param args
*/
notify(event, ...args) {
const pipeMessage = new PipeMessage_1.PipeMessage();
pipeMessage.type = PipeMessage_1.PipeMessageType.EVENT;
pipeMessage.payload = [event, ...args];
if (this.connected)
this.client.send(pipeMessage.serialize());
}
on(eventName, listener) {
super.on(eventName, listener);
return this;
}
once(eventName, listener) {
super.once(eventName, listener);
return this;
}
}
exports.PipeClient = PipeClient;