@antseed/cli 0.1.193 → 0.1.195

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.
Files changed (145) hide show
  1. package/dist/cli/commands/buyer/start.d.ts.map +1 -1
  2. package/dist/cli/commands/buyer/start.js +9 -4
  3. package/dist/cli/commands/buyer/start.js.map +1 -1
  4. package/dist/cli/commands/gateway/index.d.ts.map +1 -1
  5. package/dist/cli/commands/gateway/index.js +6 -0
  6. package/dist/cli/commands/gateway/index.js.map +1 -1
  7. package/dist/cli/commands/seller/start.d.ts.map +1 -1
  8. package/dist/cli/commands/seller/start.js +9 -0
  9. package/dist/cli/commands/seller/start.js.map +1 -1
  10. package/dist/cli/commands/tunnel/start.d.ts.map +1 -1
  11. package/dist/cli/commands/tunnel/start.js +8 -2
  12. package/dist/cli/commands/tunnel/start.js.map +1 -1
  13. package/dist/cli/commands/update.d.ts +19 -0
  14. package/dist/cli/commands/update.d.ts.map +1 -0
  15. package/dist/cli/commands/update.js +153 -0
  16. package/dist/cli/commands/update.js.map +1 -0
  17. package/dist/cli/index.js +11 -0
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/cli/program.d.ts.map +1 -1
  20. package/dist/cli/program.js +2 -0
  21. package/dist/cli/program.js.map +1 -1
  22. package/dist/gateway/buyer-process.d.ts +5 -0
  23. package/dist/gateway/buyer-process.d.ts.map +1 -1
  24. package/dist/gateway/buyer-process.js +7 -4
  25. package/dist/gateway/buyer-process.js.map +1 -1
  26. package/dist/gateway/buyer-process.test.js +28 -2
  27. package/dist/gateway/buyer-process.test.js.map +1 -1
  28. package/dist/gateway/console-api/deps.d.ts +3 -0
  29. package/dist/gateway/console-api/deps.d.ts.map +1 -1
  30. package/dist/gateway/console-api/handlers/index.d.ts.map +1 -1
  31. package/dist/gateway/console-api/handlers/index.js +2 -0
  32. package/dist/gateway/console-api/handlers/index.js.map +1 -1
  33. package/dist/gateway/console-api/handlers/staking.d.ts +28 -0
  34. package/dist/gateway/console-api/handlers/staking.d.ts.map +1 -0
  35. package/dist/gateway/console-api/handlers/staking.js +153 -0
  36. package/dist/gateway/console-api/handlers/staking.js.map +1 -0
  37. package/dist/gateway/console-api/handlers/staking.test.d.ts +2 -0
  38. package/dist/gateway/console-api/handlers/staking.test.d.ts.map +1 -0
  39. package/dist/gateway/console-api/handlers/staking.test.js +126 -0
  40. package/dist/gateway/console-api/handlers/staking.test.js.map +1 -0
  41. package/dist/gateway/console-api/handlers/update.d.ts +13 -0
  42. package/dist/gateway/console-api/handlers/update.d.ts.map +1 -0
  43. package/dist/gateway/console-api/handlers/update.js +65 -0
  44. package/dist/gateway/console-api/handlers/update.js.map +1 -0
  45. package/dist/gateway/console-api/router.d.ts +1 -1
  46. package/dist/gateway/console-api/router.d.ts.map +1 -1
  47. package/dist/gateway/console-api/router.js +8 -3
  48. package/dist/gateway/console-api/router.js.map +1 -1
  49. package/dist/gateway/console-api/types.d.ts +47 -0
  50. package/dist/gateway/console-api/types.d.ts.map +1 -1
  51. package/dist/gateway/console-api/types.js.map +1 -1
  52. package/dist/gateway/console-api/update.test.d.ts +2 -0
  53. package/dist/gateway/console-api/update.test.d.ts.map +1 -0
  54. package/dist/gateway/console-api/update.test.js +198 -0
  55. package/dist/gateway/console-api/update.test.js.map +1 -0
  56. package/dist/gateway/console.d.ts +3 -0
  57. package/dist/gateway/console.d.ts.map +1 -1
  58. package/dist/gateway/console.js +3 -0
  59. package/dist/gateway/console.js.map +1 -1
  60. package/dist/gateway/gateway-policy.test.js +66 -0
  61. package/dist/gateway/gateway-policy.test.js.map +1 -1
  62. package/dist/gateway/gateway.test.js +88 -0
  63. package/dist/gateway/gateway.test.js.map +1 -1
  64. package/dist/gateway/policy-resolver.test.js +11 -3
  65. package/dist/gateway/policy-resolver.test.js.map +1 -1
  66. package/dist/gateway/request-errors.test.js +119 -3
  67. package/dist/gateway/request-errors.test.js.map +1 -1
  68. package/dist/gateway/request-shaping.d.ts +4 -2
  69. package/dist/gateway/request-shaping.d.ts.map +1 -1
  70. package/dist/gateway/request-shaping.js +16 -10
  71. package/dist/gateway/request-shaping.js.map +1 -1
  72. package/dist/gateway/routing-through-gateway.test.js +1 -1
  73. package/dist/gateway/routing-through-gateway.test.js.map +1 -1
  74. package/dist/gateway/server.d.ts +6 -0
  75. package/dist/gateway/server.d.ts.map +1 -1
  76. package/dist/gateway/server.js +162 -73
  77. package/dist/gateway/server.js.map +1 -1
  78. package/dist/gateway/services/usage.d.ts.map +1 -1
  79. package/dist/gateway/services/usage.js +7 -0
  80. package/dist/gateway/services/usage.js.map +1 -1
  81. package/dist/gateway/store-data.test.js +1 -1
  82. package/dist/gateway/store-data.test.js.map +1 -1
  83. package/dist/gateway/store-migrations.d.ts.map +1 -1
  84. package/dist/gateway/store-migrations.js +7 -0
  85. package/dist/gateway/store-migrations.js.map +1 -1
  86. package/dist/gateway/store.d.ts +24 -1
  87. package/dist/gateway/store.d.ts.map +1 -1
  88. package/dist/gateway/store.js +29 -10
  89. package/dist/gateway/store.js.map +1 -1
  90. package/dist/gateway/updates.d.ts +34 -0
  91. package/dist/gateway/updates.d.ts.map +1 -0
  92. package/dist/gateway/updates.js +155 -0
  93. package/dist/gateway/updates.js.map +1 -0
  94. package/dist/proxy/buyer-proxy.d.ts +34 -12
  95. package/dist/proxy/buyer-proxy.d.ts.map +1 -1
  96. package/dist/proxy/buyer-proxy.js +320 -61
  97. package/dist/proxy/buyer-proxy.js.map +1 -1
  98. package/dist/proxy/buyer-proxy.test.js +430 -23
  99. package/dist/proxy/buyer-proxy.test.js.map +1 -1
  100. package/dist/proxy/gateway-policy.test.js +7 -6
  101. package/dist/proxy/gateway-policy.test.js.map +1 -1
  102. package/dist/proxy/response-quality.d.ts +25 -0
  103. package/dist/proxy/response-quality.d.ts.map +1 -0
  104. package/dist/proxy/response-quality.js +203 -0
  105. package/dist/proxy/response-quality.js.map +1 -0
  106. package/dist/proxy/response-quality.test.d.ts +2 -0
  107. package/dist/proxy/response-quality.test.d.ts.map +1 -0
  108. package/dist/proxy/response-quality.test.js +72 -0
  109. package/dist/proxy/response-quality.test.js.map +1 -0
  110. package/dist/proxy/route-policy.d.ts +2 -0
  111. package/dist/proxy/route-policy.d.ts.map +1 -1
  112. package/dist/proxy/route-policy.js +9 -8
  113. package/dist/proxy/route-policy.js.map +1 -1
  114. package/dist/proxy/route-policy.test.js +6 -0
  115. package/dist/proxy/route-policy.test.js.map +1 -1
  116. package/dist/proxy/router-execution.d.ts.map +1 -1
  117. package/dist/proxy/router-execution.js +14 -4
  118. package/dist/proxy/router-execution.js.map +1 -1
  119. package/dist/proxy/router-execution.test.js +35 -0
  120. package/dist/proxy/router-execution.test.js.map +1 -1
  121. package/dist/update/install-method.d.ts +25 -0
  122. package/dist/update/install-method.d.ts.map +1 -0
  123. package/dist/update/install-method.js +76 -0
  124. package/dist/update/install-method.js.map +1 -0
  125. package/dist/update/notifier.d.ts +30 -0
  126. package/dist/update/notifier.d.ts.map +1 -0
  127. package/dist/update/notifier.js +84 -0
  128. package/dist/update/notifier.js.map +1 -0
  129. package/dist/update/root-updater.d.ts +80 -0
  130. package/dist/update/root-updater.d.ts.map +1 -0
  131. package/dist/update/root-updater.js +104 -0
  132. package/dist/update/root-updater.js.map +1 -0
  133. package/dist/update/update.test.d.ts +2 -0
  134. package/dist/update/update.test.d.ts.map +1 -0
  135. package/dist/update/update.test.js +224 -0
  136. package/dist/update/update.test.js.map +1 -0
  137. package/dist/update/version.d.ts +29 -0
  138. package/dist/update/version.d.ts.map +1 -0
  139. package/dist/update/version.js +110 -0
  140. package/dist/update/version.js.map +1 -0
  141. package/dist/update/watch.d.ts +32 -0
  142. package/dist/update/watch.d.ts.map +1 -0
  143. package/dist/update/watch.js +59 -0
  144. package/dist/update/watch.js.map +1 -0
  145. package/package.json +10 -10
@@ -0,0 +1,76 @@
1
+ import { accessSync, constants, realpathSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { CLI_PACKAGE } from './version.js';
4
+ const LATEST = `${CLI_PACKAGE}@latest`;
5
+ /** Where the running CLI lives, symlinks resolved (`npm i -g` links the bin into the prefix). */
6
+ export function cliScriptPath(argv1 = process.argv[1]) {
7
+ if (!argv1)
8
+ return '';
9
+ try {
10
+ return realpathSync(argv1);
11
+ }
12
+ catch {
13
+ return argv1;
14
+ }
15
+ }
16
+ function writable(path) {
17
+ try {
18
+ accessSync(path, constants.W_OK);
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /** The `node_modules` directory holding `@antseed/cli` in `path`, or null. */
26
+ function globalModulesDir(path) {
27
+ const marker = path.search(/[\\/]node_modules[\\/]@antseed[\\/]cli[\\/]/);
28
+ return marker === -1 ? null : path.slice(0, marker + '/node_modules'.length);
29
+ }
30
+ export function detectInstallMethod(options = {}) {
31
+ const env = options.env ?? process.env;
32
+ const path = (options.scriptPath ?? cliScriptPath()).replaceAll('\\', '/');
33
+ const isWritable = options.isWritable ?? writable;
34
+ if (env['ANTSEED_UPDATER_REQUEST']?.trim()) {
35
+ if (env['ANTSEED_UPDATER_KIND'] === 'desktop') {
36
+ return { kind: 'desktop', command: null, argv: null, note: 'Bundled with the desktop app, which installs the update and restarts.' };
37
+ }
38
+ return { kind: 'installer', command: 'antseed update', argv: null, note: 'Installed by the gateway installer; its root update service installs new versions and restarts the services.' };
39
+ }
40
+ if (options.electron ?? (Boolean(process.versions['electron']) || env['ELECTRON_RUN_AS_NODE'] === '1')) {
41
+ return { kind: 'desktop', command: null, argv: null, note: 'Bundled with the desktop app, which updates it.' };
42
+ }
43
+ if (path.includes('/_npx/')) {
44
+ return { kind: 'npx', command: `npx ${LATEST}`, argv: null, note: 'Run through npx; ask for @latest to get the newest version.' };
45
+ }
46
+ if (path.startsWith('/nix/store/')) {
47
+ return { kind: 'nix', command: 'nix profile upgrade antseed', argv: null, note: 'Installed with Nix; update the flake input (or your profile) to get a new version.' };
48
+ }
49
+ if (path.includes('/pnpm/global/') || path.includes('/.pnpm-global/')) {
50
+ return { kind: 'pnpm', command: `pnpm add -g ${LATEST}`, argv: ['pnpm', 'add', '-g', LATEST], note: 'Installed globally with pnpm.' };
51
+ }
52
+ if (path.includes('/yarn/global/')) {
53
+ return { kind: 'yarn', command: `yarn global add ${LATEST}`, argv: ['yarn', 'global', 'add', LATEST], note: 'Installed globally with Yarn.' };
54
+ }
55
+ if (path.includes('/.bun/install/global/')) {
56
+ return { kind: 'bun', command: `bun add -g ${LATEST}`, argv: ['bun', 'add', '-g', LATEST], note: 'Installed globally with Bun.' };
57
+ }
58
+ if (path.includes('/.volta/tools/image/packages/')) {
59
+ return { kind: 'volta', command: `volta install ${LATEST}`, argv: ['volta', 'install', LATEST], note: 'Installed with Volta.' };
60
+ }
61
+ const modules = globalModulesDir(path);
62
+ if (modules) {
63
+ // npm's global layout: <prefix>/lib/node_modules on Unix, <prefix>/node_modules on Windows.
64
+ const global = /\/lib\/node_modules$/.test(modules) || /\/npm\/node_modules$/.test(modules);
65
+ if (global) {
66
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
67
+ if (isWritable(modules)) {
68
+ return { kind: 'npm', command: `npm install -g ${LATEST}`, argv: [npm, 'install', '-g', LATEST], note: 'Installed globally with npm.' };
69
+ }
70
+ return { kind: 'npm', command: `sudo npm install -g ${LATEST}`, argv: null, note: `Installed globally with npm in ${dirname(modules)}, which needs root to change.` };
71
+ }
72
+ return { kind: 'local', command: `npm install ${LATEST}`, argv: null, note: `A project dependency in ${dirname(modules)}; update it in that project.` };
73
+ }
74
+ return { kind: 'source', command: 'git pull && pnpm install && pnpm run build', argv: null, note: 'Running from a source checkout.' };
75
+ }
76
+ //# sourceMappingURL=install-method.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-method.js","sourceRoot":"","sources":["../../src/update/install-method.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type InstallKind, type InstallMethod } from './install-method.js';
2
+ /** Installs that `antseed update` (or the person) can act on; the others update some other way. */
3
+ export declare const NOTIFY_KINDS: ReadonlySet<InstallKind>;
4
+ export declare function refreshUpdateCacheInBackground(dataDir: string, env?: NodeJS.ProcessEnv): void;
5
+ export interface NotifyOptions {
6
+ dataDir: string;
7
+ current: string;
8
+ /** The command that is about to run, e.g. `update` or `start`. */
9
+ commandName: string;
10
+ argv?: string[];
11
+ env?: NodeJS.ProcessEnv;
12
+ stream?: NodeJS.WriteStream;
13
+ now?: number;
14
+ refresh?: (dataDir: string) => void;
15
+ }
16
+ /**
17
+ * Prints a one-line notice on stderr when the last registry check found a
18
+ * newer CLI, and refreshes that check in the background every 30 minutes. Silent
19
+ * for non-interactive runs (`--json`, pipes, services, CI) and when
20
+ * `NO_UPDATE_NOTIFIER` or `ANTSEED_NO_UPDATE_CHECK` is set.
21
+ */
22
+ export declare function notifyIfUpdateAvailable(options: NotifyOptions): void;
23
+ /**
24
+ * The one line that announces a newer CLI. Nothing installs by itself: like
25
+ * the desktop app, Antseed says a version is out and the person takes it.
26
+ * `running` names a long-running process, which keeps its version until it
27
+ * restarts.
28
+ */
29
+ export declare function updateAvailableLine(latest: string, current: string, method: InstallMethod, running?: string): string;
30
+ //# sourceMappingURL=notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../../src/update/notifier.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAU/F,mGAAmG;AACnG,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,WAAW,CAAwE,CAAA;AAuB1H,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,IAAI,CAa1G;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAcpE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpH"}
@@ -0,0 +1,84 @@
1
+ import { spawn } from 'node:child_process';
2
+ import chalk from 'chalk';
3
+ import { detectInstallMethod } from './install-method.js';
4
+ import { isNewer, readUpdateCache, registryUrl, UPDATE_CHECK_INTERVAL_MS, updateCachePath, updateChecksDisabled, } from './version.js';
5
+ /** Installs that `antseed update` (or the person) can act on; the others update some other way. */
6
+ export const NOTIFY_KINDS = new Set(['installer', 'npm', 'pnpm', 'yarn', 'bun', 'volta', 'nix']);
7
+ /**
8
+ * Refreshes the cache in a detached child, the way update-notifier does, so
9
+ * a slow registry never delays this command or its exit. Self-contained:
10
+ * the esbuild bundle has no separate worker file to run.
11
+ */
12
+ const CHECK_SCRIPT = `
13
+ const fs = require('node:fs'), path = require('node:path');
14
+ const [url, file] = process.argv.slice(1);
15
+ fetch(url, { headers: { accept: 'application/json' }, signal: AbortSignal.timeout(10000) })
16
+ .then((r) => r.ok ? r.json() : null)
17
+ .then((tags) => {
18
+ const latest = tags && tags.latest;
19
+ if (typeof latest !== 'string' || !/^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/.test(latest)) return;
20
+ fs.mkdirSync(path.dirname(file), { recursive: true });
21
+ const tmp = file + '.' + process.pid + '.tmp';
22
+ fs.writeFileSync(tmp, JSON.stringify({ checkedAt: Date.now(), latest }));
23
+ fs.renameSync(tmp, file);
24
+ })
25
+ .catch(() => {});
26
+ `;
27
+ export function refreshUpdateCacheInBackground(dataDir, env = process.env) {
28
+ try {
29
+ const url = `${registryUrl(env)}/-/package/@antseed%2fcli/dist-tags`;
30
+ const child = spawn(process.execPath, ['-e', CHECK_SCRIPT, url, updateCachePath(dataDir)], {
31
+ detached: true,
32
+ stdio: 'ignore',
33
+ windowsHide: true,
34
+ });
35
+ child.on('error', () => { });
36
+ child.unref();
37
+ }
38
+ catch {
39
+ // best effort
40
+ }
41
+ }
42
+ /**
43
+ * Prints a one-line notice on stderr when the last registry check found a
44
+ * newer CLI, and refreshes that check in the background every 30 minutes. Silent
45
+ * for non-interactive runs (`--json`, pipes, services, CI) and when
46
+ * `NO_UPDATE_NOTIFIER` or `ANTSEED_NO_UPDATE_CHECK` is set.
47
+ */
48
+ export function notifyIfUpdateAvailable(options) {
49
+ const env = options.env ?? process.env;
50
+ const stream = options.stream ?? process.stderr;
51
+ const argv = options.argv ?? process.argv;
52
+ if (options.commandName === 'update' || updateChecksDisabled(env) || !stream.isTTY || argv.includes('--json'))
53
+ return;
54
+ const method = detectInstallMethod({ env });
55
+ if (!NOTIFY_KINDS.has(method.kind))
56
+ return;
57
+ const cache = readUpdateCache(options.dataDir);
58
+ const now = options.now ?? Date.now();
59
+ if (!cache || now - cache.checkedAt > UPDATE_CHECK_INTERVAL_MS)
60
+ (options.refresh ?? ((dir) => refreshUpdateCacheInBackground(dir, env)))(options.dataDir);
61
+ if (!cache || !isNewer(cache.latest, options.current))
62
+ return;
63
+ stream.write(`${chalk.yellow('●')} ${updateAvailableLine(cache.latest, options.current, method)}\n`);
64
+ }
65
+ /**
66
+ * The one line that announces a newer CLI. Nothing installs by itself: like
67
+ * the desktop app, Antseed says a version is out and the person takes it.
68
+ * `running` names a long-running process, which keeps its version until it
69
+ * restarts.
70
+ */
71
+ export function updateAvailableLine(latest, current, method, running) {
72
+ const have = running ? `this ${running} runs ${current}` : `you have ${current}`;
73
+ return `Antseed ${latest} is available (${have}). ${howToUpdate(method, running)}`;
74
+ }
75
+ function howToUpdate(method, running) {
76
+ const command = chalk.bold('antseed update');
77
+ if (method.kind === 'installer')
78
+ return `Update from the gateway console (Settings → General) or run ${command}; the services restart on it.`;
79
+ if (method.kind === 'nix') {
80
+ return running ? `Update your Nix flake input, then restart the ${running}.` : 'Update your Nix flake input to get it.';
81
+ }
82
+ return running ? `Run ${command}, then restart the ${running}.` : `Run ${command} to install it.`;
83
+ }
84
+ //# sourceMappingURL=notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/update/notifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * The gateway installer runs the CLI as an unprivileged `antseed` user that
3
+ * cannot write its own install (`/opt/antseed`, root-owned). It installs a
4
+ * root `antseed-update.service` started by a systemd path unit whenever
5
+ * the request file appears, and tells the CLI both paths:
6
+ *
7
+ * - `ANTSEED_UPDATER_REQUEST`: a file in the `antseed` user's home. Its
8
+ * existence is the request; the updater deletes it and installs
9
+ * `@antseed/cli@latest` (never a version named in the file). The file's
10
+ * `action` only picks the step, the way the desktop app splits them:
11
+ * `download` installs the new version next to the running one and stops
12
+ * (`ready`); `install` (the default) also switches to it and restarts the
13
+ * buyer and gateway services.
14
+ * - `ANTSEED_UPDATER_STATUS`: JSON the updater writes in a root-owned
15
+ * directory, so the `antseed` user can read but not forge it.
16
+ */
17
+ export interface RootUpdaterPaths {
18
+ request: string;
19
+ status: string;
20
+ }
21
+ export type RootUpdateState = 'requested' | 'running' | 'ready' | 'succeeded' | 'failed';
22
+ /** `download` fetches the new version; `install` switches to it and restarts. */
23
+ export type RootUpdateAction = 'download' | 'install';
24
+ export interface RootUpdateProgress {
25
+ state: RootUpdateState;
26
+ action: RootUpdateAction;
27
+ /** Version before the update; null while only requested. */
28
+ from: string | null;
29
+ /** Version downloaded (ready) or installed (succeeded); null until then. */
30
+ to: string | null;
31
+ /** When the request was made (requested) or the updater started (otherwise). */
32
+ startedAt: number;
33
+ finishedAt: number | null;
34
+ /** Why it failed, in one line; details are in `journalctl -u antseed-update`. */
35
+ error: string | null;
36
+ }
37
+ /**
38
+ * The desktop app runs the gateway too (its public tunnel) and answers the
39
+ * same request with its own updater (`ANTSEED_UPDATER_KIND=desktop`). It
40
+ * updates the whole app, not the CLI, so it writes the app's versions into
41
+ * the status file as `app`, and those are the versions the console shows.
42
+ */
43
+ export interface UpdaterAppVersions {
44
+ /** The running app version. */
45
+ current: string;
46
+ /** The newest release the app knows of; null before its first check. */
47
+ latest: string | null;
48
+ checkedAt: number | null;
49
+ error: string | null;
50
+ }
51
+ export declare function readUpdaterAppVersions(paths: RootUpdaterPaths): UpdaterAppVersions | null;
52
+ export declare function rootUpdaterPaths(env?: NodeJS.ProcessEnv): RootUpdaterPaths | null;
53
+ /**
54
+ * Asks the root updater for `@antseed/cli@latest`. Writing the file is all it
55
+ * takes; it appears whole (written aside, then renamed), since the updater
56
+ * starts the moment the path exists.
57
+ */
58
+ export declare function requestRootUpdate(paths: RootUpdaterPaths, requestedBy: string, now?: number, action?: RootUpdateAction): void;
59
+ /**
60
+ * Asks the desktop app's updater to check for a release now. A separate file
61
+ * from the update request, so a check is never read as an install.
62
+ */
63
+ export declare function requestDesktopUpdateCheck(paths: RootUpdaterPaths): void;
64
+ /**
65
+ * The gateway server's update service gives up after 15 minutes
66
+ * (`TimeoutStartSec`); a run still "running" well past that was cut off
67
+ * (a reboot, a kill) and would otherwise block every later update.
68
+ */
69
+ export declare const ROOT_UPDATE_STALE_MS: number;
70
+ /**
71
+ * The pending request, else the updater's last run; null when it never ran.
72
+ * With `staleAfterMs`, a run that has been "running" longer reads as failed.
73
+ */
74
+ export declare function readRootUpdateProgress(paths: RootUpdaterPaths, options?: {
75
+ staleAfterMs?: number;
76
+ now?: number;
77
+ }): RootUpdateProgress | null;
78
+ /** A request or run that has not finished. */
79
+ export declare function updateInFlight(progress: RootUpdateProgress | null): boolean;
80
+ //# sourceMappingURL=root-updater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-updater.d.ts","sourceRoot":"","sources":["../../src/update/root-updater.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAA;AAExF,iFAAiF;AACjF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,CAAA;AAErD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,eAAe,CAAA;IACtB,MAAM,EAAE,gBAAgB,CAAA;IACxB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,4EAA4E;IAC5E,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,iFAAiF;IACjF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,wEAAwE;IACxE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CAazF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,gBAAgB,GAAG,IAAI,CAI9F;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAa,EAAE,MAAM,GAAE,gBAA4B,GAAG,IAAI,CAS5I;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAEvE;AAQD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAAc,CAAA;AAE/C;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,kBAAkB,GAAG,IAAI,CAkC3B;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAE3E"}
@@ -0,0 +1,104 @@
1
+ import { existsSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs';
2
+ import { isSemver } from './version.js';
3
+ export function readUpdaterAppVersions(paths) {
4
+ try {
5
+ const app = JSON.parse(readFileSync(paths.status, 'utf8'))['app'];
6
+ if (!app || !isSemver(app['current']))
7
+ return null;
8
+ return {
9
+ current: app['current'],
10
+ latest: isSemver(app['latest']) ? app['latest'] : null,
11
+ checkedAt: typeof app['checkedAt'] === 'number' ? app['checkedAt'] : null,
12
+ error: typeof app['error'] === 'string' ? app['error'].slice(0, 500) : null,
13
+ };
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export function rootUpdaterPaths(env = process.env) {
20
+ const request = env['ANTSEED_UPDATER_REQUEST']?.trim();
21
+ const status = env['ANTSEED_UPDATER_STATUS']?.trim();
22
+ return request && status ? { request, status } : null;
23
+ }
24
+ /**
25
+ * Asks the root updater for `@antseed/cli@latest`. Writing the file is all it
26
+ * takes; it appears whole (written aside, then renamed), since the updater
27
+ * starts the moment the path exists.
28
+ */
29
+ export function requestRootUpdate(paths, requestedBy, now = Date.now(), action = 'install') {
30
+ const temp = `${paths.request}.${process.pid}.tmp`;
31
+ writeFileSync(temp, `${JSON.stringify({ requestedAt: now, requestedBy, action })}\n`, { mode: 0o644 });
32
+ try {
33
+ renameSync(temp, paths.request);
34
+ }
35
+ catch (error) {
36
+ rmSync(temp, { force: true });
37
+ throw error;
38
+ }
39
+ }
40
+ /**
41
+ * Asks the desktop app's updater to check for a release now. A separate file
42
+ * from the update request, so a check is never read as an install.
43
+ */
44
+ export function requestDesktopUpdateCheck(paths) {
45
+ writeFileSync(`${paths.request}.check`, '', { mode: 0o644 });
46
+ }
47
+ function readAction(value) {
48
+ return value === 'download' ? 'download' : 'install';
49
+ }
50
+ const STATES = new Set(['running', 'ready', 'succeeded', 'failed']);
51
+ /**
52
+ * The gateway server's update service gives up after 15 minutes
53
+ * (`TimeoutStartSec`); a run still "running" well past that was cut off
54
+ * (a reboot, a kill) and would otherwise block every later update.
55
+ */
56
+ export const ROOT_UPDATE_STALE_MS = 20 * 60_000;
57
+ /**
58
+ * The pending request, else the updater's last run; null when it never ran.
59
+ * With `staleAfterMs`, a run that has been "running" longer reads as failed.
60
+ */
61
+ export function readRootUpdateProgress(paths, options = {}) {
62
+ if (existsSync(paths.request)) {
63
+ let startedAt = Date.now();
64
+ try {
65
+ startedAt = statSync(paths.request).mtimeMs;
66
+ }
67
+ catch {
68
+ // picked up just now
69
+ }
70
+ let action = 'install';
71
+ try {
72
+ action = readAction(JSON.parse(readFileSync(paths.request, 'utf8'))['action']);
73
+ }
74
+ catch {
75
+ // an empty or older request installs
76
+ }
77
+ return { state: 'requested', action, from: null, to: null, startedAt: Math.floor(startedAt), finishedAt: null, error: null };
78
+ }
79
+ try {
80
+ const raw = JSON.parse(readFileSync(paths.status, 'utf8'));
81
+ if (typeof raw['state'] !== 'string' || !STATES.has(raw['state']) || typeof raw['startedAt'] !== 'number')
82
+ return null;
83
+ const progress = {
84
+ state: raw['state'],
85
+ action: readAction(raw['action']),
86
+ from: isSemver(raw['from']) ? raw['from'] : null,
87
+ to: isSemver(raw['to']) ? raw['to'] : null,
88
+ startedAt: raw['startedAt'],
89
+ finishedAt: typeof raw['finishedAt'] === 'number' ? raw['finishedAt'] : null,
90
+ error: typeof raw['error'] === 'string' ? raw['error'].slice(0, 500) : null,
91
+ };
92
+ const stale = options.staleAfterMs !== undefined && progress.state === 'running'
93
+ && (options.now ?? Date.now()) - progress.startedAt > options.staleAfterMs;
94
+ return stale ? { ...progress, state: 'failed', error: 'the update service stopped before finishing' } : progress;
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ /** A request or run that has not finished. */
101
+ export function updateInFlight(progress) {
102
+ return progress?.state === 'requested' || progress?.state === 'running';
103
+ }
104
+ //# sourceMappingURL=root-updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-updater.js","sourceRoot":"","sources":["../../src/update/root-updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=update.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.test.d.ts","sourceRoot":"","sources":["../../src/update/update.test.ts"],"names":[],"mappings":""}