UNPKG

threads-message-broker

Version:
102 lines (101 loc) 4.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ThreadsMessageBrokerSlave = void 0; const worker_threads = require("worker_threads"); const uuid_1 = require("uuid"); const threads_message_broker_local_subscriber_1 = require("./threads-message-broker-local-subscriber"); class ThreadsMessageBrokerSlave { constructor() { if (worker_threads.isMainThread === true) { throw new Error("Thread is main"); } this._subscribers_list = {}; worker_threads.parentPort.on("message", (data) => { const message = JSON.parse(data); if (message.command === "publish") { if (this._subscribers_list[message.event] === undefined) { return; } for (const id_subscriber in this._subscribers_list[message.event]) { const subscriber = this._subscribers_list[message.event][id_subscriber]; subscriber.emit("publish", message.data); } } if (message.command === "trigger") { if (this._subscribers_list[message.event] === undefined) { return; } for (const id_subscriber in this._subscribers_list[message.event]) { const subscriber = this._subscribers_list[message.event][id_subscriber]; subscriber.emit("trigger"); } } }); } publish(event_name, data, local_flag = false) { this._emit("publish", event_name, local_flag, data); } trigger(event_name, local_flag = false) { this._emit("trigger", event_name, local_flag); } _emit(type, event_name, local_flag = false, data = undefined) { if (this._subscribers_list[event_name] !== undefined) { for (const id_subscriber in this._subscribers_list[event_name]) { const subscriber = this._subscribers_list[event_name][id_subscriber]; subscriber.emit(type, data); } } if (local_flag === true) { return; } const message = { command: type, event: event_name, worker: null }; if (type === "publish") { message.data = data; } worker_threads.parentPort.postMessage(JSON.stringify(message)); } subscribe(event_name, fn) { if (this._subscribers_list[event_name] === undefined) { this._subscribers_list[event_name] = {}; } const id = (0, uuid_1.v4)(); const subscriber = new threads_message_broker_local_subscriber_1.ThreadsMessageBrokerLocalSubscriber(id, event_name, fn); this._subscribers_list[event_name][id] = subscriber; const parent_message = { command: "subscribe", id_subscriber: id, event: event_name, worker: null }; worker_threads.parentPort.postMessage(JSON.stringify(parent_message)); return `${event_name}${id}`; } unsubscribe(id_subscriber) { const id = id_subscriber.substring(id_subscriber.length - 36, id_subscriber.length); const event_name = id_subscriber.replace(id, ""); if (this._subscribers_list[event_name] !== undefined) { delete this._subscribers_list[event_name][id]; if (Object.keys(this._subscribers_list[event_name]).length <= 0) { delete this._subscribers_list[event_name]; } } const parent_message = { command: "unsubscribe", id_subscriber: id, event: event_name, worker: null }; worker_threads.parentPort.postMessage(JSON.stringify(parent_message)); } addThread() { throw new Error("Thread is not main"); } removeThread() { throw new Error("Thread is not main"); } } exports.ThreadsMessageBrokerSlave = ThreadsMessageBrokerSlave;