helene
Version:
Real-time Web Apps for Node.js
101 lines • 3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ServerChannel = void 0;
const utils_1 = require("../utils");
const eventemitter2_1 = require("eventemitter2");
const event_1 = require("./event");
const transports_1 = require("./transports");
const SystemEvents = [
...Object.values(transports_1.HttpTransportEvents),
...Object.values(utils_1.ServerEvents),
...Object.values(transports_1.WebSocketTransportEvents),
];
class ServerChannel extends eventemitter2_1.EventEmitter2 {
channelName;
server;
clients = new Map();
constructor(channelName) {
super({
maxListeners: 1024,
});
this.channelName = channelName;
this.onAny((event, value) => {
if (!this.server.events.has(event) &&
!SystemEvents.includes(event)) {
console.warn('Event Not Registered:', event);
}
if (this.server.events.has(event)) {
const eventObject = this.server.events.get(event);
eventObject.handler(this, value);
}
});
}
setServer(server) {
this.server = server;
}
propagate(event, payload) {
const eventObject = this.server.events.get(event);
if (!eventObject) {
console.log('Event Not Registered:', event);
return;
}
const clients = this.clients.get(eventObject.name) ?? new Set();
for (const client of clients) {
client?.send(payload);
}
}
defer(event, params) {
process.nextTick(() => {
this.emit(event, params);
});
}
/**
* Refreshes a method by its identifier.
*/
refresh(method) {
this.emit(utils_1.HeleneEvents.METHOD_REFRESH, method);
}
/**
* Declares a new event.
*/
addEvent(name, opts) {
if (this.server.events.has(name)) {
this.server.events.delete(name);
}
const event = new event_1.Event(name, this.server, this, opts);
this.server.events.set(name, event);
}
addChannelClient(eventName, client) {
if (!this.clients.get(eventName)?.add(client)) {
this.clients.set(eventName, new Set([client]));
}
}
deleteClientNode(node) {
this.clients.forEach(clients => {
clients.delete(node);
});
}
get list() {
return Array.from(this.server.events.keys());
}
get length() {
return this.server.events.size;
}
get(event) {
return this.server.events.get(event);
}
has(event) {
return this.server.events.has(event);
}
delete(event) {
return this.server.events.delete(event);
}
clear() {
this.clients.clear();
}
isSubscribed(client, event) {
return !!this.clients.get(event.name)?.has(client);
}
}
exports.ServerChannel = ServerChannel;
//# sourceMappingURL=server-channel.js.map