threads-message-broker
Version:
Message broker for threads
102 lines (101 loc) • 4.14 kB
JavaScript
;
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;