netkitty
Version:
Network tools kit
83 lines (82 loc) • 2.77 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.PipeClientSocket = void 0;
const events_1 = __importDefault(require("events"));
const PipeMessage_1 = require("./PipeMessage");
const PipeMessageHandler_1 = require("./PipeMessageHandler");
const SocketDownError_1 = require("../../errors/SocketDownError");
class PipeClientSocket extends events_1.default {
#id;
#connection;
#connected;
/**
* ClientId
*/
get id() {
return this.#id;
}
/**
* Is client socket connected
*/
get connected() {
return this.#connected;
}
constructor(options) {
super();
this.actions = {};
this.#id = options.id;
this.#connection = options.connection;
this.actions = options.actions ? options.actions : {};
this.#connected = true;
this.#connection
.on('error', (err) => this.emit('error', err))
.once('close', () => {
this.#connected = false;
this.emit('disconnect');
this.removeAllListeners();
});
this.pipeMessageHandler = new PipeMessageHandler_1.PipeMessageHandler(this, this.#connection);
}
/**
* Invoke client 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.#connection.send(pipeMessage.serialize());
});
}
/**
* Notify event to pipe client
* @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.#connection.send(pipeMessage.serialize());
}
on(eventName, listener) {
super.on(eventName, listener);
return this;
}
once(eventName, listener) {
super.once(eventName, listener);
return this;
}
}
exports.PipeClientSocket = PipeClientSocket;