Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
4ca321f
`console.log()` removed
mStirner Jun 19, 2025
b8d0d8f
logging improved
mStirner Jun 19, 2025
7208a2b
warning for experimental worke threads added
mStirner Jun 19, 2025
0c0eae3
comment added, see #516 `add enum property for state type=string?⁴`
mStirner Jun 19, 2025
5dc97eb
command/comment added
mStirner Jun 19, 2025
65fb163
minor improvements
mStirner Jun 19, 2025
b0eb4b3
minor bug fixes/improvements
mStirner Jun 20, 2025
37e1925
improved stream handling in`.bridge()` method
mStirner Aug 20, 2025
286d367
Merge branch 'OpenHausIO:dev' into dev
mStirner Aug 20, 2025
c789d53
note added + logging improved
mStirner Aug 20, 2025
a064966
moved
mStirner Aug 20, 2025
f6331d7
Merge pull request #578 from mStirner/dev
mStirner Sep 14, 2025
63c8b3d
`httpServer()` & proxying improved
mStirner Sep 24, 2025
9da26e7
#561 & minor bug fix
mStirner Sep 24, 2025
f13999b
#561
mStirner Sep 24, 2025
437374c
fix #567
mStirner Sep 24, 2025
b785416
#561, `filter` method added & minor changes/fixes
mStirner Sep 24, 2025
fddd224
mdns implemented #446
mStirner Sep 24, 2025
37e9e46
Merge branch 'dev' of github.com:mStirner/backend into dev
mStirner Sep 24, 2025
18e2f78
fix test - added `filter` property
mStirner Sep 24, 2025
8f29f99
ignore txt files
mStirner Sep 24, 2025
14648d1
demo pages removed
mStirner Sep 25, 2025
77b2bbf
Merge pull request #582 from mStirner/dev
mStirner Oct 2, 2025
611a590
minor changes
mStirner Oct 8, 2025
7291243
schema validation for manifests added
mStirner Oct 8, 2025
d086f57
fix #536, `.parse()` method added
mStirner Oct 26, 2025
451ff0c
note added
mStirner Oct 26, 2025
04b720b
styling for parameters/`.classes` property added
mStirner Dec 31, 2025
fc5eb90
`hue2rgb` helper function added
mStirner Dec 31, 2025
9ebe777
http redirect test fixed
mStirner Dec 31, 2025
5a07a08
Merge branch 'OpenHausIO:dev' into dev
mStirner Dec 31, 2025
42d33e7
remove trailing comma `,`
mStirner Jan 1, 2026
847aa94
fix #590 - "missing tar"
mStirner Jan 11, 2026
3aea6c0
Merge branch 'dev' of github.com:mStirner/backend into dev
mStirner Jan 11, 2026
cf4a9cb
typo fixed
mStirner Jan 11, 2026
dbdce1f
`BIN_PATH_TAR` & `BIN_PATH_NPM` env vars added
mStirner Jan 16, 2026
fe42f03
Deprecation notice added
mStirner Jan 25, 2026
9aaff57
fix bin paths
mStirner Jan 25, 2026
4445dbf
added bin paths
mStirner Jan 25, 2026
bd390cd
drop down menu for param strings/enum
mStirner Jan 25, 2026
49ca2d6
prune router added
mStirner Jan 25, 2026
dfa228e
added
mStirner Jan 25, 2026
263ad64
switched from `exec` to `spawn` & make tar bin path configurable
mStirner Jan 25, 2026
126735a
plugins path added
mStirner Jan 27, 2026
c5f5f95
dev/resource limit removed
mStirner Jan 28, 2026
77dcd36
auth token check improved
mStirner Jan 28, 2026
f861f24
plugin worker improved
mStirner Jan 28, 2026
24cc1c5
gzip manipulation helper added
mStirner Jan 28, 2026
6cfeae6
pnpm added
mStirner Jan 28, 2026
0b228f5
progress calculation added
mStirner Jan 28, 2026
86d31d7
return clipped user object on login
mStirner Jan 28, 2026
1266613
synced with package.json
mStirner Jan 28, 2026
67ce5a4
Merge pull request #587 from mStirner/dev
mStirner Jan 28, 2026
dddd402
Bump version to `v3.3.0`
mStirner Feb 4, 2026
ce66760
Merge branch 'main' into dev
mStirner Feb 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -127,4 +127,6 @@ demo-database*
.vscode/archive-browser

build
dist
dist

*.txt
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@
"files.exclude": {
"**/.git": false
},
"files.eol": "\n",
"files.eol": "\n"
}
6 changes: 5 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ FROM node:22-alpine

WORKDIR /opt/OpenHaus/backend
COPY --from=builder node_modules node_modules
RUN apk --no-cache add openssl tzdata
RUN apk --no-cache add openssl tzdata tar

# copy binaries to default bin_path location
RUN cp /bin/tar /usr/bin/tar
RUN cp /usr/local/bin/npm /usr/bin/npm

ARG version=unknown
LABEL version=$version
Expand Down
78 changes: 76 additions & 2 deletions components/devices/class.interface.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const { Agent } = require("http");
const https = require("https");
const tls = require("tls");
const mongodb = require("mongodb");
const { Duplex, PassThrough } = require("stream");
const { PassThrough, pipeline, duplexPair } = require("stream");
const { randomUUID } = require("crypto");
//const path = require("path");

Expand Down Expand Up @@ -176,7 +176,7 @@ module.exports = class Interface {

}


/*
bridge() {

let { logger } = Interface.scope;
Expand Down Expand Up @@ -222,11 +222,21 @@ module.exports = class Interface {

}

/*
["close", "end", "error"].forEach((event) => {
stream.on(event, (...args) => {
console.log("Event", event, "on websocket stream received");
socket.emit(event, ...args);
});
});
*

stream.once("end", () => {
console.log("End on websocket stream received, call end on socket stream")
writable.end();
readable.end();
socket.end();
});

stream.once("destroy", () => {
writable.destory();
Expand Down Expand Up @@ -277,6 +287,70 @@ module.exports = class Interface {

return socket;

}
*/

// new approach
bridge() {

let { logger } = Interface.scope;
let { host, port, socket: proto } = this.settings;

// from this.adapter array
// placeholder for adapter pipeline
const encode = new PassThrough(); // outbound
const decode = new PassThrough(); // inbound
const [clientSock, proxySock] = duplexPair();


["ref", "unref", "setKeepAlive", "setTimeout", "setNoDelay"].forEach((fnc) => {
clientSock[fnc] = (...args) => {
logger.trace(`Interface ${this._id} method "${fnc}" called on socket stream, args:`, args);
};
});

Interface.socket(this._id, (err, ws, request) => {

if (err) {

if (process.env.NODE_ENV === "development") {
logger.warn(err, "Could not create socket");
}

return clientSock.destroy(err);

}

if (process.env.NODE_ENV === "development") {

clientSock.once("open", () => {
logger.debug(`Bridge open: iface ${this._id} <-> ${proto}://${host}:${port} (${request.uuid})`);
});

clientSock.once("close", () => {
logger.debug(`Bridge closed: iface ${this._id} <-> ${proto}://${host}:${port} (${request.uuid})`);
});

}

// outbound: client -> encode -> websocket
pipeline(proxySock, encode, ws, (err) => {
clientSock.destroy(err);
});

// inbound: websocket -> decode -> client
pipeline(ws, decode, proxySock, (err) => {
clientSock.destroy(err);
});

process.nextTick(() => {
clientSock.emit("open");
});

});

return clientSock;

}

// bridge methods connects adapter with the underlaying network socket
Expand Down
15 changes: 13 additions & 2 deletions components/endpoints/class.command.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ const { parentPort, isMainThread } = require("worker_threads");
const { commands } = require("../../system/worker/shared.js");
const { randomUUID } = require("crypto");

const COMMAND_HANDLER = new Set();

// fix/workaround #561
if (process.env.WORKER_THREADS_ENABLED === "true" && !isMainThread) {
parentPort.on("message", (msg) => {
COMMAND_HANDLER.forEach((handler) => {
handler(msg);
});
});
}

// check if a passed callback uses old
// command arugments, or the new signature
Expand Down Expand Up @@ -145,7 +155,8 @@ module.exports = class Command {


if (process.env.WORKER_THREADS_ENABLED === "true" && !isMainThread) {
parentPort.on("message", (msg) => {
//parentPort.on("message", (msg) => {
COMMAND_HANDLER.add((msg) => {
if (msg.component === "endpoints" && msg.type === "request" && msg.method === "trigger" && msg.command === this._id) {

//console.log("Received command trigger request", msg);
Expand Down Expand Up @@ -335,7 +346,7 @@ module.exports = class Command {
try {
params = params.map((obj) => {

if (this.params.length === 0) {
if (this.params?.length <= 0) {
return;
}

Expand Down
2 changes: 1 addition & 1 deletion components/endpoints/class.endpoint.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ module.exports = class Endpoint extends Item {

} catch (err) {

logger.warn(err, "Could not update item states after debouncing");
logger.warn(err, `Could not update item states after debouncing (${this.name})`, this.states);

}
}, 100); // TODO: remove time, or set to 1/0
Expand Down
26 changes: 24 additions & 2 deletions components/endpoints/class.param.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
const Joi = require("joi");

const CSS_CLASSES_NAMES = [
"hue-fader",
"brightness-fader",
"saturation-fader",
"fader-color-r",
"fader-color-g",
"fader-color-b"
];

const JOI_STRING_ENUM = Joi.object({
name: Joi.string().required(),
value: Joi.string().default((parent) => {
return parent.name.toLowerCase();
})
});

module.exports = class Param {

constructor(obj) {
Expand Down Expand Up @@ -39,7 +55,12 @@ module.exports = class Param {
return Joi.object({
// TODO: name: Joi.string().required();
type: Joi.string().valid("number", "string", "boolean").required(),
key: Joi.string().required()
key: Joi.string().required(),
// bei command/param change "sync" event auslösen für browser übergreifende sync von parametern?
// > jetzt via "command" event
// warum nicht via "update" event?
// why not to number?
classes: Joi.array().items(Joi.string().valid(...CSS_CLASSES_NAMES)).default([])
}).when(".type", {
switch: [{
is: "number",
Expand All @@ -52,8 +73,9 @@ module.exports = class Param {
}, {
is: "string",
then: Joi.object({
value: Joi.string().default(null).allow(null),
value: Joi.string().default(null).allow(null, ""),
//default: Joi.string().allow(null).default(null)
enum: Joi.array().items(JOI_STRING_ENUM).default([])
})
}, {
is: "boolean",
Expand Down
2 changes: 2 additions & 0 deletions components/endpoints/class.state.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ module.exports = class State {
is: "string",
then: Joi.object({
value: Joi.string().default(null).allow(null)
// enum: Joi.array().items(Joi.string()).validate(...)
// if enum are not empty, state value can only be on of the enums
})
}, {
is: "boolean",
Expand Down
14 changes: 14 additions & 0 deletions components/mdns/class.mdns.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,22 @@ module.exports = class MDNS extends Item {
return MDNS.schema().validate(data);
}

static query(item) {

let { events, logger } = MDNS.scope;

// TODO: change query from string to `Symbol("kQuery")`?
logger.debug(`Query "${item.name}", type=${item.type}`);
events.emit("query", item);

}

match(cb) {
this._matches.push(cb);
}

query() {
return MDNS.query(this);
}

};
4 changes: 3 additions & 1 deletion components/mdns/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ class C_MDNS extends COMPONENT {
constructor() {

// inject logger, collection and schema object
super("mdns", MDNS.schema());
super("mdns", MDNS.schema(), [
MDNS
]);

this.hooks.post("add", (data, next) => {
next(null, new MDNS(data));
Expand Down
2 changes: 1 addition & 1 deletion components/mdns/message-handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ module.exports = (scope) => {
});

_matches.forEach((cb) => {
cb(record);
cb(record, packet);
});

} else {
Expand Down
Loading