Skip to content

Commit

Permalink
added, fix #487
Browse files Browse the repository at this point in the history
  • Loading branch information
mStirner committed Oct 4, 2024
1 parent d19cd28 commit d4d4ff8
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 9 deletions.
21 changes: 19 additions & 2 deletions routes/router.api.events.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ const WebSocket = require("ws");
const path = require("path");
const fs = require("fs");

const { emitter, emitted } = require("../system/component/class.events.js");

module.exports = (app, router) => {

let wss = new WebSocket.Server({
Expand Down Expand Up @@ -39,10 +41,23 @@ module.exports = (app, router) => {
];
*/

emitter.on(emitted, (obj) => {
wss.clients.forEach((client) => {

let { readyState, filter } = client;
let { event, component } = obj;

if (readyState === WebSocket.OPEN && filter.events.includes(event) && filter.components.includes(component)) {
client.send(JSON.stringify(obj));
}

});
});

// fix #403 "Add missing components"
let componentNames = fs.readdirSync(path.resolve(process.cwd(), "components"));


/*
function reemit(event, component) {
return (...args) => {
Expand All @@ -60,7 +75,7 @@ module.exports = (app, router) => {
if (client.intents.includes(event) /*&& client.components.includes(component)* && client.readyState === WebSocket.OPEN) {
client.send(obj);
}
*/
*
let { readyState, filter } = client;
Expand All @@ -73,6 +88,7 @@ module.exports = (app, router) => {
};
}
// create reemit more automaticly
// TODO: loop over events defined in .events
// https://nodejs.org/dist/latest-v16.x/docs/api/events.html#emittereventnames
Expand Down Expand Up @@ -101,6 +117,7 @@ module.exports = (app, router) => {
}
});
*/


router.get("/", (req, res) => {
Expand Down
8 changes: 5 additions & 3 deletions system/component/class.base.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
const process = require("process");
const events = require("events");
//const events = require("events");

const Hooks = require("../class.hooks.js");
const Events = require("./class.events.js");

/**
* @description
Expand All @@ -22,10 +23,11 @@ const Hooks = require("../class.hooks.js");
*/
module.exports = class BASE {

constructor() {
constructor(name) {
this.ready = false;
this.events = new events();
this.events = new Events(name);
this.hooks = new Hooks();
// this.logger = ...?
}

// NOTE improve/change function name
Expand Down
7 changes: 4 additions & 3 deletions system/component/class.common.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const _expose = require("../../helper/expose.js");

const BASE = require("./class.base.js");

const Logger = require("../../system/logger");
const promisify = require("../../helper/promisify");

/**
Expand All @@ -20,11 +21,11 @@ const promisify = require("../../helper/promisify");
*/
module.exports = class COMMON extends BASE {

constructor(logger) {
constructor(name) {

super();
super(name);

this.logger = logger;
this.logger = Logger.create(name);

}

Expand Down
2 changes: 1 addition & 1 deletion system/component/class.component.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ module.exports = class COMPONENT extends COMMON {

constructor(name, schema, classes = []) {

super(require("../../system/logger").create(name));
super(name);

classes.forEach((cls) => {
Object.defineProperty(cls, "scope", {
Expand Down
42 changes: 42 additions & 0 deletions system/component/class.events.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const { EventEmitter } = require("events");

module.exports = class Events extends EventEmitter {

static emitted = Symbol("emitted");
static registered = Symbol("registerd");
static emitter = new EventEmitter();

constructor(name) {
super();
this.name = name;
this._registeredEvents = new Set();
}

emit(event, ...args) {

// the idea behin this was that it is used for /api/events ws route
// but the static "side chain" emitter, can also be used
// the purpuse of it was to transfer events between workers
// see #6 when implmented
// also, the "scenes" component can use it to detect state changes, e.g. for triggers
if (!this._registeredEvents.has(event)) {

this._registeredEvents.add(event);

process.nextTick(() => {
super.emit(Events.registered, ...args);
});

}

Events.emitter.emit(Events.emitted, {
component: this.name,
event,
args
});

return super.emit(event, ...args);

}

};

0 comments on commit d4d4ff8

Please sign in to comment.