@nubisco/openbridge 0.40.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/__tests__/node-version.test.d.ts +2 -0
- package/dist/__tests__/node-version.test.d.ts.map +1 -0
- package/dist/__tests__/node-version.test.js +24 -0
- package/dist/__tests__/node-version.test.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/node-version.d.ts +21 -0
- package/dist/node-version.d.ts.map +1 -0
- package/dist/node-version.js +43 -0
- package/dist/node-version.js.map +1 -0
- package/package.json +6 -6
- package/ui-dist/assets/{index-j6mOaiC_.js → index-BOFO0WNi.js} +37 -37
- package/ui-dist/assets/{index-Cg2Zaqbi.css → index-BuF2SqlM.css} +1 -1
- package/ui-dist/index.html +2 -2
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
[](https://github.com/nubisco/openbridge/actions/workflows/ci.yml)
|
|
14
14
|
[](https://github.com/nubisco/openbridge/releases)
|
|
15
15
|
[](https://www.npmjs.com/package/@nubisco/openbridge)
|
|
16
|
-
[](https://nodejs.org/)
|
|
17
17
|
[](https://pnpm.io/)
|
|
18
18
|
[](LICENSE)
|
|
19
19
|
[](docs/CLA-INDIVIDUAL.md)
|
|
@@ -67,7 +67,7 @@ Three ways to install. Full details, including system and network requirements,
|
|
|
67
67
|
|
|
68
68
|
### Install from npm
|
|
69
69
|
|
|
70
|
-
**Requirements:** Node.js
|
|
70
|
+
**Requirements:** Node.js 22.23.4 or newer. Node 20 is end of life and no longer gets security fixes, and earlier Node 22 releases are affected by the October 2026 Node.js security release.
|
|
71
71
|
|
|
72
72
|
```bash
|
|
73
73
|
npm install -g @nubisco/openbridge
|
|
@@ -85,7 +85,7 @@ State lives in `~/.openbridge` (config, plugins, HomeKit pairing), following the
|
|
|
85
85
|
|
|
86
86
|
### Run with Docker
|
|
87
87
|
|
|
88
|
-
For servers and NAS boxes. There is no image to pull: the [`docker-compose.yml`](docker-compose.yml) in this repository runs a stock `node:22-alpine` container that installs `@nubisco/openbridge` from npm into a volume on first boot, which is also what the in-app updater replaces.
|
|
88
|
+
For servers and NAS boxes. There is no image to pull: the [`docker-compose.yml`](docker-compose.yml) in this repository runs a stock `node:22.23.4-alpine` container that installs `@nubisco/openbridge` from npm into a volume on first boot, which is also what the in-app updater replaces.
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
91
|
curl -O https://raw.githubusercontent.com/nubisco/openbridge/master/docker-compose.yml
|
|
@@ -96,7 +96,7 @@ The first start spends a minute or two installing before the dashboard answers o
|
|
|
96
96
|
|
|
97
97
|
### Install from source
|
|
98
98
|
|
|
99
|
-
**Requirements:** Node.js
|
|
99
|
+
**Requirements:** Node.js 22.23.4+, pnpm 9+, roughly 1 GB of free disk (`node_modules` lands around 720 MB).
|
|
100
100
|
|
|
101
101
|
```bash
|
|
102
102
|
# Install dependencies
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-version.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/node-version.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { MINIMUM_NODE_VERSION, nodeVersionWarning } from '../node-version.js';
|
|
4
|
+
describe('nodeVersionWarning', () => {
|
|
5
|
+
it.each(['v20.19.0', 'v22.0.0', 'v22.23.3', 'v21.9.9', 'v18.20.4'])('warns on %s', (version) => {
|
|
6
|
+
const warning = nodeVersionWarning(version);
|
|
7
|
+
expect(warning).toContain(version);
|
|
8
|
+
expect(warning).toContain(MINIMUM_NODE_VERSION);
|
|
9
|
+
// The message must say why, not only that the version is old.
|
|
10
|
+
expect(warning).toMatch(/end of life/);
|
|
11
|
+
expect(warning).toMatch(/security release/);
|
|
12
|
+
});
|
|
13
|
+
it.each(['v22.23.4', 'v22.23.10', 'v22.24.0', 'v23.0.0', 'v24.0.0', 'v26.1.2'])('accepts %s', (version) => {
|
|
14
|
+
expect(nodeVersionWarning(version)).toBeNull();
|
|
15
|
+
});
|
|
16
|
+
it('stays quiet on a version string it cannot read', () => {
|
|
17
|
+
expect(nodeVersionWarning('nightly')).toBeNull();
|
|
18
|
+
});
|
|
19
|
+
it('matches engines.node in the published package.json', () => {
|
|
20
|
+
const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
|
|
21
|
+
expect(pkg.engines.node).toBe(`>=${MINIMUM_NODE_VERSION}`);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=node-version.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-version.test.js","sourceRoot":"","sources":["../../src/__tests__/node-version.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE7E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE;QAC7F,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC/C,8DAA8D;QAC9D,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE;QACxG,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;QAC5F,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,oBAAoB,EAAE,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { OPENBRIDGE_VERSION } from './version.js';
|
|
3
|
+
import { nodeVersionWarning } from './node-version.js';
|
|
3
4
|
// Argument handling runs before anything else: `openbridge --help` must never
|
|
4
5
|
// start a daemon or publish a HAP bridge on the local network as a side effect.
|
|
5
6
|
const argv = process.argv.slice(2);
|
|
@@ -47,6 +48,9 @@ function parsePort() {
|
|
|
47
48
|
const { Daemon } = await import('./daemon.js');
|
|
48
49
|
const { Logger } = await import('@nubisco/openbridge-logger');
|
|
49
50
|
const log = Logger.create('system');
|
|
51
|
+
const nodeWarning = nodeVersionWarning(process.version);
|
|
52
|
+
if (nodeWarning)
|
|
53
|
+
log.warn(nodeWarning);
|
|
50
54
|
// Prevent plugin errors from crashing the daemon
|
|
51
55
|
process.on('uncaughtException', (err) => {
|
|
52
56
|
log.error(`Uncaught exception: ${err?.message ?? err}`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The oldest Node.js release OpenBridge supports, kept in step with `engines.node`
|
|
3
|
+
* in every published package.json.
|
|
4
|
+
*
|
|
5
|
+
* Node 20 reached end of life in April 2026 and gets no security fixes. Node 22
|
|
6
|
+
* releases before 22.23.4 are affected by the October 2026 Node.js security
|
|
7
|
+
* release. A home bridge listens on the local network, so running it on either
|
|
8
|
+
* leaves known holes open.
|
|
9
|
+
*/
|
|
10
|
+
export declare const MINIMUM_NODE_VERSION = "22.23.4";
|
|
11
|
+
/**
|
|
12
|
+
* Returns the warning to log when `version` (in `process.version` form) is older
|
|
13
|
+
* than MINIMUM_NODE_VERSION, or null when it is supported or cannot be read.
|
|
14
|
+
*
|
|
15
|
+
* This warns rather than refusing to start. npm treats `engines` as advice, so a
|
|
16
|
+
* Docker volume or a global install can be updated onto an older Node, and a
|
|
17
|
+
* daemon that then refused to start would take the bridge, the dashboard and
|
|
18
|
+
* the in-app rollback down with it.
|
|
19
|
+
*/
|
|
20
|
+
export declare function nodeVersionWarning(version: string): string | null;
|
|
21
|
+
//# sourceMappingURL=node-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-version.d.ts","sourceRoot":"","sources":["../src/node-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAQ7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The oldest Node.js release OpenBridge supports, kept in step with `engines.node`
|
|
3
|
+
* in every published package.json.
|
|
4
|
+
*
|
|
5
|
+
* Node 20 reached end of life in April 2026 and gets no security fixes. Node 22
|
|
6
|
+
* releases before 22.23.4 are affected by the October 2026 Node.js security
|
|
7
|
+
* release. A home bridge listens on the local network, so running it on either
|
|
8
|
+
* leaves known holes open.
|
|
9
|
+
*/
|
|
10
|
+
export const MINIMUM_NODE_VERSION = '22.23.4';
|
|
11
|
+
function parse(version) {
|
|
12
|
+
const match = /^v?(\d+)\.(\d+)\.(\d+)/.exec(version.trim());
|
|
13
|
+
if (!match)
|
|
14
|
+
return null;
|
|
15
|
+
return [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Returns the warning to log when `version` (in `process.version` form) is older
|
|
19
|
+
* than MINIMUM_NODE_VERSION, or null when it is supported or cannot be read.
|
|
20
|
+
*
|
|
21
|
+
* This warns rather than refusing to start. npm treats `engines` as advice, so a
|
|
22
|
+
* Docker volume or a global install can be updated onto an older Node, and a
|
|
23
|
+
* daemon that then refused to start would take the bridge, the dashboard and
|
|
24
|
+
* the in-app rollback down with it.
|
|
25
|
+
*/
|
|
26
|
+
export function nodeVersionWarning(version) {
|
|
27
|
+
const current = parse(version);
|
|
28
|
+
const minimum = parse(MINIMUM_NODE_VERSION);
|
|
29
|
+
if (!current || !minimum)
|
|
30
|
+
return null;
|
|
31
|
+
for (let i = 0; i < 3; i++) {
|
|
32
|
+
if (current[i] > minimum[i])
|
|
33
|
+
return null;
|
|
34
|
+
if (current[i] < minimum[i]) {
|
|
35
|
+
return (`Node.js ${version} is older than ${MINIMUM_NODE_VERSION}, the oldest release OpenBridge supports. ` +
|
|
36
|
+
'Node 20 is end of life and gets no security fixes, and Node 22 releases before 22.23.4 are ' +
|
|
37
|
+
'affected by the October 2026 Node.js security release. OpenBridge will keep running, but ' +
|
|
38
|
+
`upgrade Node.js to ${MINIMUM_NODE_VERSION} or newer (under Docker, raise the image tag).`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=node-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-version.js","sourceRoot":"","sources":["../src/node-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAA;AAE7C,SAAS,KAAK,CAAC,OAAe;IAC5B,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAC3C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QACxC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,OAAO,CACL,WAAW,OAAO,kBAAkB,oBAAoB,4CAA4C;gBACpG,6FAA6F;gBAC7F,2FAA2F;gBAC3F,sBAAsB,oBAAoB,gDAAgD,CAC3F,CAAA;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nubisco/openbridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Local-first home automation bridge for developers. Plugin-based, TypeScript-first, Homebridge-compatible.",
|
|
5
5
|
"author": "José Silva <jose@nubisco.io>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"LICENSE"
|
|
41
41
|
],
|
|
42
42
|
"engines": {
|
|
43
|
-
"node": ">=
|
|
43
|
+
"node": ">=22.23.4"
|
|
44
44
|
},
|
|
45
45
|
"publishConfig": {
|
|
46
46
|
"access": "public"
|
|
@@ -53,10 +53,10 @@
|
|
|
53
53
|
"hap-nodejs": "^0.14.3",
|
|
54
54
|
"qrcode-terminal": "^0.12.0",
|
|
55
55
|
"systeminformation": "^5.33.16",
|
|
56
|
-
"@nubisco/openbridge-compatibility-homebridge": "0.
|
|
57
|
-
"@nubisco/openbridge-config": "0.
|
|
58
|
-
"@nubisco/openbridge-core": "0.
|
|
59
|
-
"@nubisco/openbridge-logger": "0.
|
|
56
|
+
"@nubisco/openbridge-compatibility-homebridge": "1.0.0",
|
|
57
|
+
"@nubisco/openbridge-config": "1.0.0",
|
|
58
|
+
"@nubisco/openbridge-core": "1.0.0",
|
|
59
|
+
"@nubisco/openbridge-logger": "1.0.0"
|
|
60
60
|
},
|
|
61
61
|
"optionalDependencies": {
|
|
62
62
|
"node-pty": "^1.1.0"
|