@nubisco/openbridge 0.33.0 → 0.34.1

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/dist/updater.js CHANGED
@@ -7,8 +7,8 @@
7
7
  * complete. npm is also the mechanism, so there are no per-architecture release
8
8
  * tarballs to build and keep in step with the code that downloads them.
9
9
  */
10
- import { existsSync, readFileSync } from 'fs';
11
- import { dirname, join, resolve, sep } from 'path';
10
+ import { accessSync, constants, existsSync, readFileSync } from 'fs';
11
+ import { basename, dirname, join, resolve, sep } from 'path';
12
12
  import { spawn } from 'child_process';
13
13
  import { fileURLToPath } from 'url';
14
14
  import { APP_VOLUME } from './version.js';
@@ -16,6 +16,88 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
16
16
  export const PACKAGE_NAME = '@nubisco/openbridge';
17
17
  /** The installed package root, i.e. the directory holding our package.json. */
18
18
  export const PACKAGE_ROOT = resolve(__dirname, '..');
19
+ /** Supervisors that restart a service when it exits. */
20
+ const SUPERVISORS = ['supervise-daemon', 'systemd', 'runsv', 's6-supervise', 'runit', 'launchd'];
21
+ /**
22
+ * The name of the process that started this one.
23
+ *
24
+ * Read from `cmdline` first, because `comm` is truncated to fifteen characters
25
+ * by the kernel and OpenRC's `supervise-daemon` lands at sixteen. Comparing the
26
+ * truncated `supervise-daemo` against the real name never matches, which would
27
+ * classify a supervised daemon as unsupervised: it would then leave a process
28
+ * behind to start its replacement while the supervisor started one too, and the
29
+ * second would die on the port the first already holds.
30
+ *
31
+ * The prefix match on the way out covers `comm` when `cmdline` is unreadable,
32
+ * which happens for a parent owned by another user.
33
+ */
34
+ function parentProcessName() {
35
+ try {
36
+ const argv0 = readFileSync(`/proc/${process.ppid}/cmdline`, 'utf8').split('\0')[0];
37
+ if (argv0)
38
+ return basename(argv0);
39
+ }
40
+ catch {
41
+ /* no procfs, or unreadable */
42
+ }
43
+ try {
44
+ return readFileSync(`/proc/${process.ppid}/comm`, 'utf8').trim() || null;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * The npm prefix this package is installed under.
52
+ *
53
+ * Derived from where we are actually running rather than from `npm prefix -g`,
54
+ * which reports npm's configured prefix and can name a different tree entirely
55
+ * when the daemon was installed by another user or with a `--prefix` of its
56
+ * own. Updating a copy nobody is running is a convincing no-op.
57
+ */
58
+ export function globalPrefix() {
59
+ // <prefix>/lib/node_modules/@nubisco/openbridge on POSIX, and
60
+ // <prefix>/node_modules/@nubisco/openbridge on Windows.
61
+ const marker = `${sep}node_modules${sep}`;
62
+ const at = PACKAGE_ROOT.lastIndexOf(marker);
63
+ if (at === -1)
64
+ return null;
65
+ const modules = PACKAGE_ROOT.slice(0, at);
66
+ return modules.endsWith(`${sep}lib`) ? dirname(modules) : modules;
67
+ }
68
+ /** True when this process could actually write the installed package. */
69
+ function canReplacePackage() {
70
+ try {
71
+ accessSync(PACKAGE_ROOT, constants.W_OK);
72
+ accessSync(dirname(PACKAGE_ROOT), constants.W_OK);
73
+ return true;
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ /**
80
+ * Who, if anyone, restarts this process when it exits.
81
+ *
82
+ * Read from the environment rather than configured, because the daemon is
83
+ * started by whatever the host happens to use and nobody is going to tell it
84
+ * which. Each check identifies a supervisor by something only that supervisor
85
+ * sets.
86
+ */
87
+ export function detectRestartStrategy() {
88
+ // systemd stamps every service it starts with this, and nothing else does.
89
+ if (process.env.INVOCATION_ID)
90
+ return 'supervisor';
91
+ // A process supervisor as our direct parent, which respawns us on exit.
92
+ const parent = parentProcessName();
93
+ if (parent && SUPERVISORS.some((name) => name === parent || name.startsWith(parent)))
94
+ return 'supervisor';
95
+ // Docker's restart policy brings the container back, and the compose file
96
+ // sets this marker for the same reason the volume exists.
97
+ if (process.env.OPENBRIDGE_INSTALL === 'docker')
98
+ return 'supervisor';
99
+ return 'spawn';
100
+ }
19
101
  /** Where a Docker deployment keeps the app tree, outside the image. */
20
102
  export const CURRENT_DIR = join(APP_VOLUME, 'current');
21
103
  export const STAGING_DIR = join(APP_VOLUME, 'staging');
@@ -43,19 +125,44 @@ export function detectInstall() {
43
125
  ? `Update OPENBRIDGE_VERSION_SPEC in docker-compose.yml, then: docker compose up -d --force-recreate`
44
126
  : 'docker compose restart openbridge',
45
127
  pinnedTo: pin,
128
+ restart: 'supervisor',
129
+ ...(pin ? { blockedBy: `pinned to ${pin}` } : {}),
46
130
  };
47
131
  }
48
132
  // Under a node_modules means npm or pnpm put it there. Anywhere else means a
49
133
  // source checkout being run straight out of dist/.
50
134
  if (PACKAGE_ROOT.includes(`${sep}node_modules${sep}`)) {
135
+ const command = `npm install -g ${PACKAGE_NAME}@latest`;
136
+ const restart = detectRestartStrategy();
137
+ // Each of these is a reason the daemon would end up stopped, or would
138
+ // update a copy nobody runs. Naming which one is what turns "it does not
139
+ // work" into something the user can act on.
140
+ let blockedBy = null;
141
+ if (pin)
142
+ blockedBy = `pinned to ${pin}`;
143
+ else if (!globalPrefix())
144
+ blockedBy = 'the install prefix could not be determined';
145
+ else if (!canReplacePackage())
146
+ blockedBy = `no write access to ${PACKAGE_ROOT}`;
51
147
  return {
52
148
  method: 'npm',
53
- canSelfUpdate: false,
54
- command: `npm install -g ${PACKAGE_NAME}@latest`,
149
+ canSelfUpdate: blockedBy === null,
150
+ command,
55
151
  pinnedTo: pin,
152
+ restart,
153
+ ...(blockedBy ? { blockedBy } : {}),
56
154
  };
57
155
  }
58
- return { method: 'source', canSelfUpdate: false, command: 'git pull && pnpm install && pnpm build', pinnedTo: null };
156
+ // A source checkout is somebody's working tree. Replacing it from under them
157
+ // would discard whatever they were doing, which no amount of convenience justifies.
158
+ return {
159
+ method: 'source',
160
+ canSelfUpdate: false,
161
+ command: 'git pull && pnpm install && pnpm build',
162
+ pinnedTo: null,
163
+ restart: null,
164
+ blockedBy: 'running from a source checkout',
165
+ };
59
166
  }
60
167
  /**
61
168
  * The newest published version, straight from the registry.
@@ -118,6 +225,9 @@ export function npmInstall(prefix, version, onLine) {
118
225
  '--omit=optional',
119
226
  '--no-audit',
120
227
  '--no-fund',
228
+ // See npmInstallGlobal: a just-published version against a stale
229
+ // packument resolves as ETARGET.
230
+ '--prefer-online',
121
231
  `${PACKAGE_NAME}@${version}`,
122
232
  ], { stdio: ['ignore', 'pipe', 'pipe'], env: { ...process.env, NODE_ENV: 'production' } });
123
233
  let stderr = '';
@@ -133,6 +243,106 @@ export function npmInstall(prefix, version, onLine) {
133
243
  : reject(new Error(`npm install exited with ${code}${stderr ? `: ${stderr.trim().split('\n').slice(-3).join(' ')}` : ''}`)));
134
244
  });
135
245
  }
246
+ /**
247
+ * Install a version over the running global install.
248
+ *
249
+ * Safe while the daemon is running, which is the whole reason this is possible:
250
+ * every module it needs is already resolved and in memory, and on POSIX the old
251
+ * inode survives until the process releases it. npm writes the new tree and the
252
+ * running process carries on with the old code until something restarts it.
253
+ *
254
+ * The prefix is passed explicitly rather than left to npm's configuration,
255
+ * which can name a different tree than the one this process is running from.
256
+ */
257
+ export function npmInstallGlobal(prefix, version, onLine) {
258
+ return runNpm([
259
+ 'install',
260
+ '--global',
261
+ '--prefix',
262
+ prefix,
263
+ '--omit=optional',
264
+ '--no-audit',
265
+ '--no-fund',
266
+ // A version published minutes ago is exactly what an update reaches for,
267
+ // and a cached packument from before it existed makes npm insist it does
268
+ // not. Seen for real: the daemon's own version resolved while one of its
269
+ // workspace dependencies came back ETARGET from the same install.
270
+ '--prefer-online',
271
+ `${PACKAGE_NAME}@${version}`,
272
+ ], onLine);
273
+ }
274
+ /** The version of the package as it exists on disk right now, not as loaded. */
275
+ export function versionOnDisk() {
276
+ try {
277
+ const raw = readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8');
278
+ return JSON.parse(raw).version;
279
+ }
280
+ catch {
281
+ return null;
282
+ }
283
+ }
284
+ /**
285
+ * Get the daemon running again on the new code.
286
+ *
287
+ * Under a supervisor, exiting is the entire restart: it is watching for exactly
288
+ * that. Without one, the process has to leave something behind that outlives
289
+ * it, because a child started now would race the parent for the listening port
290
+ * and lose.
291
+ *
292
+ * So the `spawn` path starts a detached process whose only job is to wait for
293
+ * this pid to disappear and then start the daemon again. Detached and with its
294
+ * streams closed, so it is not killed along with its parent and does not hold
295
+ * the terminal open. It is written inline rather than shipped as a file because
296
+ * the update it is waiting on is, at that moment, replacing every file in the
297
+ * package it would otherwise be loaded from.
298
+ */
299
+ export function restartDaemon(strategy, log) {
300
+ if (strategy === 'spawn') {
301
+ const bin = process.argv[1];
302
+ const waiter = `
303
+ const { spawn } = require('child_process')
304
+ const pid = ${process.pid}
305
+ let waited = 0
306
+ const tick = setInterval(() => {
307
+ let alive = true
308
+ try { process.kill(pid, 0) } catch { alive = false }
309
+ // 30s, then start anyway: a parent that has not exited by now is stuck,
310
+ // and leaving the house without a bridge is the worse outcome.
311
+ if (alive && (waited += 250) < 30000) return
312
+ clearInterval(tick)
313
+ spawn(process.execPath, [${JSON.stringify(bin)}], {
314
+ detached: true,
315
+ stdio: 'ignore',
316
+ env: process.env,
317
+ }).unref()
318
+ }, 250)
319
+ `;
320
+ log?.('No supervisor found, so a detached process will start the new version once this one exits');
321
+ spawn(process.execPath, ['-e', waiter], { detached: true, stdio: 'ignore' }).unref();
322
+ }
323
+ // A moment for the HTTP response and the progress socket to flush, so the
324
+ // page says why it is about to go quiet.
325
+ setTimeout(() => process.exit(0), 500);
326
+ }
327
+ function runNpm(args, onLine) {
328
+ return new Promise((resolvePromise, reject) => {
329
+ const child = spawn(process.execPath, [npmCliPath(), ...args], {
330
+ stdio: ['ignore', 'pipe', 'pipe'],
331
+ env: { ...process.env, NODE_ENV: 'production' },
332
+ });
333
+ let stderr = '';
334
+ child.stdout?.on('data', (b) => onLine?.(b.toString().trim()));
335
+ child.stderr?.on('data', (b) => {
336
+ const text = b.toString();
337
+ stderr += text;
338
+ onLine?.(text.trim());
339
+ });
340
+ child.on('error', reject);
341
+ child.on('close', (code) => code === 0
342
+ ? resolvePromise()
343
+ : reject(new Error(`npm exited with ${code}${stderr ? `: ${stderr.trim().split('\n').slice(-3).join(' ')}` : ''}`)));
344
+ });
345
+ }
136
346
  /**
137
347
  * The npm CLI that ships with the running Node.
138
348
  *
@@ -1 +1 @@
1
- {"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nubisco/openbridge",
3
- "version": "0.33.0",
3
+ "version": "0.34.1",
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",
@@ -53,10 +53,10 @@
53
53
  "hap-nodejs": "^0.14.3",
54
54
  "qrcode-terminal": "^0.12.0",
55
55
  "systeminformation": "^5.31.5",
56
- "@nubisco/openbridge-compatibility-homebridge": "0.33.0",
57
- "@nubisco/openbridge-core": "0.33.0",
58
- "@nubisco/openbridge-logger": "0.33.0",
59
- "@nubisco/openbridge-config": "0.33.0"
56
+ "@nubisco/openbridge-compatibility-homebridge": "0.34.1",
57
+ "@nubisco/openbridge-config": "0.34.1",
58
+ "@nubisco/openbridge-core": "0.34.1",
59
+ "@nubisco/openbridge-logger": "0.34.1"
60
60
  },
61
61
  "optionalDependencies": {
62
62
  "node-pty": "^1.1.0"