@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.
- package/dist/cli/commands/buyer/start.d.ts.map +1 -1
- package/dist/cli/commands/buyer/start.js +9 -4
- package/dist/cli/commands/buyer/start.js.map +1 -1
- package/dist/cli/commands/gateway/index.d.ts.map +1 -1
- package/dist/cli/commands/gateway/index.js +6 -0
- package/dist/cli/commands/gateway/index.js.map +1 -1
- package/dist/cli/commands/seller/start.d.ts.map +1 -1
- package/dist/cli/commands/seller/start.js +9 -0
- package/dist/cli/commands/seller/start.js.map +1 -1
- package/dist/cli/commands/tunnel/start.d.ts.map +1 -1
- package/dist/cli/commands/tunnel/start.js +8 -2
- package/dist/cli/commands/tunnel/start.js.map +1 -1
- package/dist/cli/commands/update.d.ts +19 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +153 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.js +11 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +2 -0
- package/dist/cli/program.js.map +1 -1
- package/dist/gateway/buyer-process.d.ts +5 -0
- package/dist/gateway/buyer-process.d.ts.map +1 -1
- package/dist/gateway/buyer-process.js +7 -4
- package/dist/gateway/buyer-process.js.map +1 -1
- package/dist/gateway/buyer-process.test.js +28 -2
- package/dist/gateway/buyer-process.test.js.map +1 -1
- package/dist/gateway/console-api/deps.d.ts +3 -0
- package/dist/gateway/console-api/deps.d.ts.map +1 -1
- package/dist/gateway/console-api/handlers/index.d.ts.map +1 -1
- package/dist/gateway/console-api/handlers/index.js +2 -0
- package/dist/gateway/console-api/handlers/index.js.map +1 -1
- package/dist/gateway/console-api/handlers/staking.d.ts +28 -0
- package/dist/gateway/console-api/handlers/staking.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/staking.js +153 -0
- package/dist/gateway/console-api/handlers/staking.js.map +1 -0
- package/dist/gateway/console-api/handlers/staking.test.d.ts +2 -0
- package/dist/gateway/console-api/handlers/staking.test.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/staking.test.js +126 -0
- package/dist/gateway/console-api/handlers/staking.test.js.map +1 -0
- package/dist/gateway/console-api/handlers/update.d.ts +13 -0
- package/dist/gateway/console-api/handlers/update.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/update.js +65 -0
- package/dist/gateway/console-api/handlers/update.js.map +1 -0
- package/dist/gateway/console-api/router.d.ts +1 -1
- package/dist/gateway/console-api/router.d.ts.map +1 -1
- package/dist/gateway/console-api/router.js +8 -3
- package/dist/gateway/console-api/router.js.map +1 -1
- package/dist/gateway/console-api/types.d.ts +47 -0
- package/dist/gateway/console-api/types.d.ts.map +1 -1
- package/dist/gateway/console-api/types.js.map +1 -1
- package/dist/gateway/console-api/update.test.d.ts +2 -0
- package/dist/gateway/console-api/update.test.d.ts.map +1 -0
- package/dist/gateway/console-api/update.test.js +198 -0
- package/dist/gateway/console-api/update.test.js.map +1 -0
- package/dist/gateway/console.d.ts +3 -0
- package/dist/gateway/console.d.ts.map +1 -1
- package/dist/gateway/console.js +3 -0
- package/dist/gateway/console.js.map +1 -1
- package/dist/gateway/gateway-policy.test.js +66 -0
- package/dist/gateway/gateway-policy.test.js.map +1 -1
- package/dist/gateway/gateway.test.js +88 -0
- package/dist/gateway/gateway.test.js.map +1 -1
- package/dist/gateway/policy-resolver.test.js +11 -3
- package/dist/gateway/policy-resolver.test.js.map +1 -1
- package/dist/gateway/request-errors.test.js +119 -3
- package/dist/gateway/request-errors.test.js.map +1 -1
- package/dist/gateway/request-shaping.d.ts +4 -2
- package/dist/gateway/request-shaping.d.ts.map +1 -1
- package/dist/gateway/request-shaping.js +16 -10
- package/dist/gateway/request-shaping.js.map +1 -1
- package/dist/gateway/routing-through-gateway.test.js +1 -1
- package/dist/gateway/routing-through-gateway.test.js.map +1 -1
- package/dist/gateway/server.d.ts +6 -0
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +162 -73
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/services/usage.d.ts.map +1 -1
- package/dist/gateway/services/usage.js +7 -0
- package/dist/gateway/services/usage.js.map +1 -1
- package/dist/gateway/store-data.test.js +1 -1
- package/dist/gateway/store-data.test.js.map +1 -1
- package/dist/gateway/store-migrations.d.ts.map +1 -1
- package/dist/gateway/store-migrations.js +7 -0
- package/dist/gateway/store-migrations.js.map +1 -1
- package/dist/gateway/store.d.ts +24 -1
- package/dist/gateway/store.d.ts.map +1 -1
- package/dist/gateway/store.js +29 -10
- package/dist/gateway/store.js.map +1 -1
- package/dist/gateway/updates.d.ts +34 -0
- package/dist/gateway/updates.d.ts.map +1 -0
- package/dist/gateway/updates.js +155 -0
- package/dist/gateway/updates.js.map +1 -0
- package/dist/proxy/buyer-proxy.d.ts +34 -12
- package/dist/proxy/buyer-proxy.d.ts.map +1 -1
- package/dist/proxy/buyer-proxy.js +320 -61
- package/dist/proxy/buyer-proxy.js.map +1 -1
- package/dist/proxy/buyer-proxy.test.js +430 -23
- package/dist/proxy/buyer-proxy.test.js.map +1 -1
- package/dist/proxy/gateway-policy.test.js +7 -6
- package/dist/proxy/gateway-policy.test.js.map +1 -1
- package/dist/proxy/response-quality.d.ts +25 -0
- package/dist/proxy/response-quality.d.ts.map +1 -0
- package/dist/proxy/response-quality.js +203 -0
- package/dist/proxy/response-quality.js.map +1 -0
- package/dist/proxy/response-quality.test.d.ts +2 -0
- package/dist/proxy/response-quality.test.d.ts.map +1 -0
- package/dist/proxy/response-quality.test.js +72 -0
- package/dist/proxy/response-quality.test.js.map +1 -0
- package/dist/proxy/route-policy.d.ts +2 -0
- package/dist/proxy/route-policy.d.ts.map +1 -1
- package/dist/proxy/route-policy.js +9 -8
- package/dist/proxy/route-policy.js.map +1 -1
- package/dist/proxy/route-policy.test.js +6 -0
- package/dist/proxy/route-policy.test.js.map +1 -1
- package/dist/proxy/router-execution.d.ts.map +1 -1
- package/dist/proxy/router-execution.js +14 -4
- package/dist/proxy/router-execution.js.map +1 -1
- package/dist/proxy/router-execution.test.js +35 -0
- package/dist/proxy/router-execution.test.js.map +1 -1
- package/dist/update/install-method.d.ts +25 -0
- package/dist/update/install-method.d.ts.map +1 -0
- package/dist/update/install-method.js +76 -0
- package/dist/update/install-method.js.map +1 -0
- package/dist/update/notifier.d.ts +30 -0
- package/dist/update/notifier.d.ts.map +1 -0
- package/dist/update/notifier.js +84 -0
- package/dist/update/notifier.js.map +1 -0
- package/dist/update/root-updater.d.ts +80 -0
- package/dist/update/root-updater.d.ts.map +1 -0
- package/dist/update/root-updater.js +104 -0
- package/dist/update/root-updater.js.map +1 -0
- package/dist/update/update.test.d.ts +2 -0
- package/dist/update/update.test.d.ts.map +1 -0
- package/dist/update/update.test.js +224 -0
- package/dist/update/update.test.js.map +1 -0
- package/dist/update/version.d.ts +29 -0
- package/dist/update/version.d.ts.map +1 -0
- package/dist/update/version.js +110 -0
- package/dist/update/version.js.map +1 -0
- package/dist/update/watch.d.ts +32 -0
- package/dist/update/watch.d.ts.map +1 -0
- package/dist/update/watch.js +59 -0
- package/dist/update/watch.js.map +1 -0
- package/package.json +10 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,EAAuB,KAAK,WAAW,EAAsB,MAAM,gCAAgC,CAAA;AAa1G,4EAA4E;AAC5E,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAE3C,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,OAAO,0BAA0B,CAAA;IAChD,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACpE,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAA;CACjB;AA2ED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D5D"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { userInfo } from 'node:os';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import pkg from '../../../package.json' with { type: 'json' };
|
|
5
|
+
import { detectInstallMethod } from '../../update/install-method.js';
|
|
6
|
+
import { readRootUpdateProgress, ROOT_UPDATE_STALE_MS, requestRootUpdate, rootUpdaterPaths, updateInFlight, } from '../../update/root-updater.js';
|
|
7
|
+
import { fetchLatestVersion, isNewer, writeUpdateCache } from '../../update/version.js';
|
|
8
|
+
import { getGlobalOptions } from './types.js';
|
|
9
|
+
/** Bump when a field of the --json output changes meaning or is removed. */
|
|
10
|
+
export const UPDATE_JSON_SCHEMA_VERSION = 1;
|
|
11
|
+
/** How long `antseed update` waits on the gateway server's root updater before giving up. */
|
|
12
|
+
const ROOT_UPDATE_TIMEOUT_MS = 10 * 60_000;
|
|
13
|
+
/** A request nobody picked up by then means the updater's path unit is not installed or not running. */
|
|
14
|
+
const ROOT_PICKUP_WARN_MS = 30_000;
|
|
15
|
+
function runCommand(argv, json) {
|
|
16
|
+
return new Promise((resolve) => {
|
|
17
|
+
const child = spawn(argv[0], argv.slice(1), {
|
|
18
|
+
// --json keeps stdout for the report.
|
|
19
|
+
stdio: ['inherit', json ? process.stderr : 'inherit', 'inherit'],
|
|
20
|
+
shell: process.platform === 'win32',
|
|
21
|
+
});
|
|
22
|
+
child.on('error', (error) => {
|
|
23
|
+
process.stderr.write(chalk.red(`Could not run ${argv[0]}: ${error.message}\n`));
|
|
24
|
+
resolve(127);
|
|
25
|
+
});
|
|
26
|
+
child.on('exit', (code) => resolve(code ?? 1));
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function readProgress(paths) {
|
|
30
|
+
return readRootUpdateProgress(paths, { staleAfterMs: ROOT_UPDATE_STALE_MS });
|
|
31
|
+
}
|
|
32
|
+
/** Waits for the run that started at `since` or later to finish. */
|
|
33
|
+
async function waitForRootUpdate(paths, since, log) {
|
|
34
|
+
const started = Date.now();
|
|
35
|
+
let last = null;
|
|
36
|
+
let warned = false;
|
|
37
|
+
for (;;) {
|
|
38
|
+
const progress = readProgress(paths);
|
|
39
|
+
const state = progress?.state ?? null;
|
|
40
|
+
if (state !== last) {
|
|
41
|
+
if (state === 'requested')
|
|
42
|
+
log('Waiting for the update service…');
|
|
43
|
+
else if (state === 'running')
|
|
44
|
+
log(`Installing @antseed/cli@latest (from ${progress?.from ?? 'unknown'})…`);
|
|
45
|
+
last = state;
|
|
46
|
+
}
|
|
47
|
+
if (progress && !updateInFlight(progress) && progress.startedAt >= since - 5_000)
|
|
48
|
+
return progress;
|
|
49
|
+
if (!warned && state === 'requested' && Date.now() - started > ROOT_PICKUP_WARN_MS) {
|
|
50
|
+
warned = true;
|
|
51
|
+
log(chalk.yellow('The update service has not picked up the request. Check `systemctl status antseed-update.path`; servers installed before it existed need the installer re-run once.'));
|
|
52
|
+
}
|
|
53
|
+
if (Date.now() - started > ROOT_UPDATE_TIMEOUT_MS)
|
|
54
|
+
return progress;
|
|
55
|
+
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function updateThroughRoot(method, log) {
|
|
59
|
+
const paths = rootUpdaterPaths();
|
|
60
|
+
if (!paths)
|
|
61
|
+
throw new Error(method.note);
|
|
62
|
+
// Joins a run already going (one the console asked for), else asks for one.
|
|
63
|
+
const run = async () => {
|
|
64
|
+
const current = readProgress(paths);
|
|
65
|
+
if (updateInFlight(current))
|
|
66
|
+
return waitForRootUpdate(paths, current.startedAt, log);
|
|
67
|
+
const since = Date.now();
|
|
68
|
+
requestRootUpdate(paths, `cli:${userInfo().username}`, since);
|
|
69
|
+
return waitForRootUpdate(paths, since, log);
|
|
70
|
+
};
|
|
71
|
+
let result = await run();
|
|
72
|
+
// It joined a download; now install it.
|
|
73
|
+
if (result?.state === 'ready')
|
|
74
|
+
result = await run();
|
|
75
|
+
if (result?.state === 'succeeded') {
|
|
76
|
+
log(chalk.green(`Updated ${result.from ?? ''} → ${result.to ?? 'latest'}; the buyer and gateway services restarted.`));
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
if (result?.state === 'failed') {
|
|
80
|
+
log(chalk.red(`Update failed: ${result.error ?? 'unknown error'}. Details: journalctl -u antseed-update`));
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
log(chalk.red('Timed out waiting for the update service. Details: journalctl -u antseed-update'));
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
export function registerUpdateCommand(program) {
|
|
87
|
+
program
|
|
88
|
+
.command('update')
|
|
89
|
+
.description('Check npm for a newer Antseed CLI and install it the way this copy was installed')
|
|
90
|
+
.option('--check', 'only report whether an update is available', false)
|
|
91
|
+
.option('--json', 'print a JSON report on stdout', false)
|
|
92
|
+
.action(async (options) => {
|
|
93
|
+
const { dataDir } = getGlobalOptions(program);
|
|
94
|
+
const json = options.json;
|
|
95
|
+
const log = (line) => process.stderr.write(`${line}\n`);
|
|
96
|
+
const say = json ? log : (line) => console.log(line);
|
|
97
|
+
const current = pkg.version;
|
|
98
|
+
const method = detectInstallMethod();
|
|
99
|
+
const latest = await fetchLatestVersion();
|
|
100
|
+
try {
|
|
101
|
+
writeUpdateCache(dataDir, { checkedAt: Date.now(), latest });
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// a read-only data dir only costs the notifier its cache
|
|
105
|
+
}
|
|
106
|
+
const available = isNewer(latest, current);
|
|
107
|
+
const report = {
|
|
108
|
+
schemaVersion: UPDATE_JSON_SCHEMA_VERSION,
|
|
109
|
+
current,
|
|
110
|
+
latest,
|
|
111
|
+
available,
|
|
112
|
+
install: { kind: method.kind, command: method.command, note: method.note },
|
|
113
|
+
updated: false,
|
|
114
|
+
};
|
|
115
|
+
const finish = (code) => {
|
|
116
|
+
if (json)
|
|
117
|
+
console.log(JSON.stringify(report, null, 2));
|
|
118
|
+
process.exitCode = code;
|
|
119
|
+
};
|
|
120
|
+
if (!available) {
|
|
121
|
+
say(`Antseed ${current} is up to date${compareNote(latest, current)}.`);
|
|
122
|
+
return finish(0);
|
|
123
|
+
}
|
|
124
|
+
say(`Antseed ${latest} is available (you have ${current}).`);
|
|
125
|
+
if (options.check) {
|
|
126
|
+
say(method.command ? `Update with: ${chalk.bold(method.kind === 'installer' ? 'antseed update' : method.command)}` : method.note);
|
|
127
|
+
return finish(0);
|
|
128
|
+
}
|
|
129
|
+
if (method.kind === 'installer') {
|
|
130
|
+
report.updated = await updateThroughRoot(method, say);
|
|
131
|
+
return finish(report.updated ? 0 : 1);
|
|
132
|
+
}
|
|
133
|
+
if (!method.argv) {
|
|
134
|
+
say(method.note);
|
|
135
|
+
if (method.command)
|
|
136
|
+
say(`Update with: ${chalk.bold(method.command)}`);
|
|
137
|
+
return finish(1);
|
|
138
|
+
}
|
|
139
|
+
say(`Running: ${method.command}`);
|
|
140
|
+
const code = await runCommand(method.argv, json);
|
|
141
|
+
if (code !== 0) {
|
|
142
|
+
say(chalk.red(`${method.argv[0]} exited with ${code}.`));
|
|
143
|
+
return finish(code);
|
|
144
|
+
}
|
|
145
|
+
report.updated = true;
|
|
146
|
+
say(chalk.green(`Updated to ${latest}. Restart any running antseed buyer, seller or gateway to use it.`));
|
|
147
|
+
return finish(0);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
function compareNote(latest, current) {
|
|
151
|
+
return latest === current ? '' : ` (npm's latest is ${latest})`;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAwC,MAAM,gCAAgC,CAAA;AAC1G,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GAGf,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAA;AAY3C,6FAA6F;AAC7F,MAAM,sBAAsB,GAAG,EAAE,GAAG,MAAM,CAAA;AAC1C,wGAAwG;AACxG,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAElC,SAAS,UAAU,CAAC,IAAc,EAAE,IAAa;IAC/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAC3C,sCAAsC;YACtC,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC;YAChE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAA;QACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAA;YAC/E,OAAO,CAAC,GAAG,CAAC,CAAA;QACd,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAuB;IAC3C,OAAO,sBAAsB,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC,CAAA;AAC9E,CAAC;AAED,oEAAoE;AACpE,KAAK,UAAU,iBAAiB,CAAC,KAAuB,EAAE,KAAa,EAAE,GAA2B;IAClG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC1B,IAAI,IAAI,GAAkB,IAAI,CAAA;IAC9B,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,SAAS,CAAC;QACR,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAA;QACrC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,KAAK,KAAK,WAAW;gBAAE,GAAG,CAAC,iCAAiC,CAAC,CAAA;iBAC5D,IAAI,KAAK,KAAK,SAAS;gBAAE,GAAG,CAAC,wCAAwC,QAAQ,EAAE,IAAI,IAAI,SAAS,IAAI,CAAC,CAAA;YAC1G,IAAI,GAAG,KAAK,CAAA;QACd,CAAC;QACD,IAAI,QAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,SAAS,IAAI,KAAK,GAAG,KAAK;YAAE,OAAO,QAAQ,CAAA;QACjG,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,mBAAmB,EAAE,CAAC;YACnF,MAAM,GAAG,IAAI,CAAA;YACb,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qKAAqK,CAAC,CAAC,CAAA;QAC1L,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,sBAAsB;YAAE,OAAO,QAAQ,CAAA;QAClE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAAqB,EAAE,GAA2B;IACjF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAChC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxC,4EAA4E;IAC5E,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;QACrB,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QACnC,IAAI,cAAc,CAAC,OAAO,CAAC;YAAE,OAAO,iBAAiB,CAAC,KAAK,EAAE,OAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QACrF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,iBAAiB,CAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAA;QAC7D,OAAO,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAC7C,CAAC,CAAA;IACD,IAAI,MAAM,GAAG,MAAM,GAAG,EAAE,CAAA;IACxB,wCAAwC;IACxC,IAAI,MAAM,EAAE,KAAK,KAAK,OAAO;QAAE,MAAM,GAAG,MAAM,GAAG,EAAE,CAAA;IACnD,IAAI,MAAM,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;QAClC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC,EAAE,IAAI,QAAQ,6CAA6C,CAAC,CAAC,CAAA;QACtH,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,MAAM,EAAE,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,KAAK,IAAI,eAAe,yCAAyC,CAAC,CAAC,CAAA;QAC1G,OAAO,KAAK,CAAA;IACd,CAAC;IACD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC,CAAA;IACjG,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kFAAkF,CAAC;SAC/F,MAAM,CAAC,SAAS,EAAE,4CAA4C,EAAE,KAAK,CAAC;SACtE,MAAM,CAAC,QAAQ,EAAE,+BAA+B,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAA0C,EAAE,EAAE;QAC3D,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACzB,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC5D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA;QAC3B,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAA;QAEpC,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAA;QACzC,IAAI,CAAC;YACH,gBAAgB,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAiB;YAC3B,aAAa,EAAE,0BAA0B;YACzC,OAAO;YACP,MAAM;YACN,SAAS;YACT,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;YAC1E,OAAO,EAAE,KAAK;SACf,CAAA;QACD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;YAC9B,IAAI,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACtD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;QACzB,CAAC,CAAA;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,WAAW,OAAO,iBAAiB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;YACvE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;QAClB,CAAC;QACD,GAAG,CAAC,WAAW,MAAM,2BAA2B,OAAO,IAAI,CAAC,CAAA;QAC5D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACjI,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;QAClB,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,CAAC,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YACrD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACvC,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAChB,IAAI,MAAM,CAAC,OAAO;gBAAE,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACrE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;QAClB,CAAC;QACD,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAChD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAC,CAAA;YACxD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;QACrB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,MAAM,mEAAmE,CAAC,CAAC,CAAA;QACzG,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,OAAe;IAClD,OAAO,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,MAAM,GAAG,CAAA;AACjE,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { loadEnvFromFiles } from '../env/load-env.js';
|
|
4
|
+
import { notifyIfUpdateAvailable } from '../update/notifier.js';
|
|
4
5
|
import { createProgram } from './program.js';
|
|
6
|
+
import { getGlobalOptions } from './commands/types.js';
|
|
7
|
+
import pkg from '../../package.json' with { type: 'json' };
|
|
5
8
|
loadEnvFromFiles();
|
|
6
9
|
const program = createProgram();
|
|
10
|
+
program.hook('preAction', (_command, actionCommand) => {
|
|
11
|
+
try {
|
|
12
|
+
notifyIfUpdateAvailable({ dataDir: getGlobalOptions(program).dataDir, current: pkg.version, commandName: actionCommand.name() });
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// never let the update notice break a command
|
|
16
|
+
}
|
|
17
|
+
});
|
|
7
18
|
// No top-level await: the desktop app bundles this entry as CommonJS.
|
|
8
19
|
program.parseAsync(process.argv).catch((err) => {
|
|
9
20
|
console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE3D,gBAAgB,EAAE,CAAC;AAEnB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;AAEhC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,uBAAuB,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnI,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,sEAAsE;AACtE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,wEAAwE;IACxE,qCAAqC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,kFAAkF;AAClF,wBAAgB,aAAa,IAAI,OAAO,CA+BvC"}
|
package/dist/cli/program.js
CHANGED
|
@@ -16,6 +16,7 @@ import { registerTunnelCommands } from './commands/tunnel/index.js';
|
|
|
16
16
|
import { registerGatewayCommands } from './commands/gateway/index.js';
|
|
17
17
|
import { registerAntsCommands } from './commands/ants/index.js';
|
|
18
18
|
import { registerAppsCommands } from './commands/apps/index.js';
|
|
19
|
+
import { registerUpdateCommand } from './commands/update.js';
|
|
19
20
|
import pkg from '../../package.json' with { type: 'json' };
|
|
20
21
|
/** The full `antseed` command tree, without parsing argv (tests build it too). */
|
|
21
22
|
export function createProgram() {
|
|
@@ -44,6 +45,7 @@ export function createProgram() {
|
|
|
44
45
|
registerGatewayCommands(program);
|
|
45
46
|
registerAntsCommands(program);
|
|
46
47
|
registerAppsCommands(program);
|
|
48
|
+
registerUpdateCommand(program);
|
|
47
49
|
return program;
|
|
48
50
|
}
|
|
49
51
|
//# sourceMappingURL=program.js.map
|
package/dist/cli/program.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE3D,kFAAkF;AAClF,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,6BAA6B,CAAC;SAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;SACpB,MAAM,CAAC,qBAAqB,EAAE,4EAA4E,CAAC;SAC3G,MAAM,CAAC,mBAAmB,EAAE,oFAAoF,CAAC;SACjH,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAE5D,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrC,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { type ChildProcess } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* The buyer drains requests in flight and closes its payment channels on the
|
|
4
|
+
* way out; only kill it once its own shutdown deadline has passed.
|
|
5
|
+
*/
|
|
6
|
+
export declare const BUYER_STOP_TIMEOUT_MS: number;
|
|
2
7
|
export interface GatewayBuyerOptions {
|
|
3
8
|
buyerPort: number;
|
|
4
9
|
dataDir: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyer-process.d.ts","sourceRoot":"","sources":["../../src/gateway/buyer-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"buyer-process.d.ts","sourceRoot":"","sources":["../../src/gateway/buyer-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAU7D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAsC,CAAA;AAExE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,kDAAkD;IAClD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,YAAY,CAAA;CAC9C;AAED,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAM,EAA4C,GAAG,YAAY,CAsBnH;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IAMX,OAAO,CAAC,QAAQ,CAAC,QAAQ;IALrC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,aAAa,CAA8B;gBAEtB,QAAQ,EAAE,mBAAmB;IAE1D,KAAK,IAAI,IAAI;IAgCb,gDAAgD;IAC1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAW5B"}
|
|
@@ -2,13 +2,16 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import { createInterface } from 'node:readline';
|
|
3
3
|
import { identityPassphraseEnv, PASSPHRASE_ENV } from '@antseed/node';
|
|
4
4
|
import { PASSPHRASE_STDIN_ENV } from '../cli/wallet-passphrase.js';
|
|
5
|
-
import { BUYER_RESTART_EXIT_CODE } from '../proxy/buyer-proxy.js';
|
|
5
|
+
import { BUYER_RESTART_EXIT_CODE, BUYER_SHUTDOWN_DEADLINE_MS } from '../proxy/buyer-proxy.js';
|
|
6
6
|
/** A buyer that exits sooner than this after starting counts as failing to start. */
|
|
7
7
|
const QUICK_EXIT_MS = 30_000;
|
|
8
8
|
const MAX_QUICK_EXITS = 3;
|
|
9
9
|
const RESTART_DELAY_MS = 1_000;
|
|
10
|
-
/**
|
|
11
|
-
|
|
10
|
+
/**
|
|
11
|
+
* The buyer drains requests in flight and closes its payment channels on the
|
|
12
|
+
* way out; only kill it once its own shutdown deadline has passed.
|
|
13
|
+
*/
|
|
14
|
+
export const BUYER_STOP_TIMEOUT_MS = BUYER_SHUTDOWN_DEADLINE_MS + 15_000;
|
|
12
15
|
/** Starts the CLI as a supervised buyer child; `cli` is how to run the CLI (tests replace it). */
|
|
13
16
|
export function spawnCliBuyer(args, cli = [...process.execArgv, process.argv[1]]) {
|
|
14
17
|
// The wallet passphrase (from ANTSEED_PASSPHRASE, or typed on the terminal) goes to the
|
|
@@ -93,7 +96,7 @@ export class GatewayBuyer {
|
|
|
93
96
|
return;
|
|
94
97
|
const exited = new Promise((resolve) => { child.once('exit', () => resolve()); });
|
|
95
98
|
child.kill('SIGTERM');
|
|
96
|
-
const timer = setTimeout(() => { child.kill('SIGKILL'); },
|
|
99
|
+
const timer = setTimeout(() => { child.kill('SIGKILL'); }, BUYER_STOP_TIMEOUT_MS);
|
|
97
100
|
await exited;
|
|
98
101
|
clearTimeout(timer);
|
|
99
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyer-process.js","sourceRoot":"","sources":["../../src/gateway/buyer-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"buyer-process.js","sourceRoot":"","sources":["../../src/gateway/buyer-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,8 @@ import { join } from 'node:path';
|
|
|
6
6
|
import { PassThrough } from 'node:stream';
|
|
7
7
|
import { test } from 'node:test';
|
|
8
8
|
import { FileIdentityStore } from '@antseed/node';
|
|
9
|
-
import { BUYER_RESTART_EXIT_CODE } from '../proxy/buyer-proxy.js';
|
|
10
|
-
import { GatewayBuyer, spawnCliBuyer } from './buyer-process.js';
|
|
9
|
+
import { BUYER_RESTART_EXIT_CODE, BUYER_SHUTDOWN_DEADLINE_MS } from '../proxy/buyer-proxy.js';
|
|
10
|
+
import { BUYER_STOP_TIMEOUT_MS, GatewayBuyer, spawnCliBuyer } from './buyer-process.js';
|
|
11
11
|
class FakeChild extends EventEmitter {
|
|
12
12
|
stdout = new PassThrough();
|
|
13
13
|
stderr = new PassThrough();
|
|
@@ -83,6 +83,32 @@ test('stop terminates the buyer and does not restart it', async () => {
|
|
|
83
83
|
await waitForRestart();
|
|
84
84
|
assert.equal(children.length, 1);
|
|
85
85
|
});
|
|
86
|
+
test('lets a draining buyer finish its own shutdown before killing it', async (t) => {
|
|
87
|
+
t.mock.timers.enable({ apis: ['setTimeout'] });
|
|
88
|
+
const child = new FakeChild();
|
|
89
|
+
// A buyer still draining requests ignores SIGTERM until it is done.
|
|
90
|
+
child.kill = (signal) => {
|
|
91
|
+
child.killed.push(signal);
|
|
92
|
+
if (signal === 'SIGKILL')
|
|
93
|
+
child.exit(null, signal);
|
|
94
|
+
return true;
|
|
95
|
+
};
|
|
96
|
+
const buyer = new GatewayBuyer({
|
|
97
|
+
buyerPort: 28377,
|
|
98
|
+
dataDir: '/data',
|
|
99
|
+
configPath: '/data/config.json',
|
|
100
|
+
verbose: false,
|
|
101
|
+
onLog: () => { },
|
|
102
|
+
spawnBuyer: () => child,
|
|
103
|
+
});
|
|
104
|
+
buyer.start();
|
|
105
|
+
const stopped = buyer.stop();
|
|
106
|
+
t.mock.timers.tick(BUYER_SHUTDOWN_DEADLINE_MS);
|
|
107
|
+
assert.deepEqual(child.killed, ['SIGTERM']);
|
|
108
|
+
t.mock.timers.tick(BUYER_STOP_TIMEOUT_MS - BUYER_SHUTDOWN_DEADLINE_MS);
|
|
109
|
+
assert.deepEqual(child.killed, ['SIGTERM', 'SIGKILL']);
|
|
110
|
+
await stopped;
|
|
111
|
+
});
|
|
86
112
|
test('hands the wallet passphrase to the buyer on stdin, not in its environment', async () => {
|
|
87
113
|
const dir = mkdtempSync(join(tmpdir(), 'antseed-buyer-process-'));
|
|
88
114
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyer-process.test.js","sourceRoot":"","sources":["../../src/gateway/buyer-process.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"buyer-process.test.js","sourceRoot":"","sources":["../../src/gateway/buyer-process.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { BuyerAddressBook } from '../services/wallet-address.js';
|
|
2
2
|
import type { HostFacts } from '../exposure.js';
|
|
3
3
|
import type { GatewayStore } from '../store.js';
|
|
4
|
+
import type { GatewayUpdates } from '../updates.js';
|
|
4
5
|
import type { AuthConfig, Member } from './types.js';
|
|
5
6
|
/** What every console route module gets. */
|
|
6
7
|
export interface ConsoleDeps {
|
|
@@ -48,5 +49,7 @@ export interface ConsoleDeps {
|
|
|
48
49
|
listenHost?: string;
|
|
49
50
|
/** Host facts for exposure checks; inspected at startup when absent (tests inject them). */
|
|
50
51
|
hostFacts?: HostFacts;
|
|
52
|
+
/** Antseed update checks for `/update`; created from `dataDir` and `version` when absent (tests inject them). */
|
|
53
|
+
updates?: GatewayUpdates;
|
|
51
54
|
}
|
|
52
55
|
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../../src/gateway/console-api/deps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEpD,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,gBAAgB,CAAA;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE;QAAE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IACnG,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,CAAA;IAC/D,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAA;IACnD,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,MAAM,CAAA;IAC7B,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../../src/gateway/console-api/deps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEpD,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,gBAAgB,CAAA;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE;QAAE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IACnG,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,CAAA;IAC/D,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAA;IACnD,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,MAAM,CAAA;IAC7B,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,iHAAiH;IACjH,OAAO,CAAC,EAAE,cAAc,CAAA;CACzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/gateway/console-api/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/gateway/console-api/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAapD,iGAAiG;AACjG,eAAO,MAAM,qBAAqB,EAAE,gBAAgB,EAYnD,CAAA"}
|
|
@@ -6,6 +6,7 @@ import { registerPresetRoutes } from './presets.js';
|
|
|
6
6
|
import { registerRoutingRoutes } from './routing.js';
|
|
7
7
|
import { registerSettingsRoutes } from './settings.js';
|
|
8
8
|
import { registerStatusRoutes } from './status.js';
|
|
9
|
+
import { registerUpdateRoutes } from './update.js';
|
|
9
10
|
import { registerUsageRoutes } from './usage.js';
|
|
10
11
|
import { registerWorkspaceRoutes } from './workspaces.js';
|
|
11
12
|
/** Route modules owned by the gateway core; wallet and network routes are mounted separately. */
|
|
@@ -20,5 +21,6 @@ export const coreConsoleRegistrars = [
|
|
|
20
21
|
registerRoutingRoutes,
|
|
21
22
|
registerSettingsRoutes,
|
|
22
23
|
registerStatusRoutes,
|
|
24
|
+
registerUpdateRoutes,
|
|
23
25
|
];
|
|
24
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/gateway/console-api/handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEzD,iGAAiG;AACjG,MAAM,CAAC,MAAM,qBAAqB,GAAuB;IACvD,iBAAiB;IACjB,uBAAuB;IACvB,iBAAiB;IACjB,wBAAwB;IACxB,mBAAmB;IACnB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,sBAAsB;IACtB,oBAAoB;CACrB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/gateway/console-api/handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEzD,iGAAiG;AACjG,MAAM,CAAC,MAAM,qBAAqB,GAAuB;IACvD,iBAAiB;IACjB,uBAAuB;IACvB,iBAAiB;IACjB,wBAAwB;IACxB,mBAAmB;IACnB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,sBAAsB;IACtB,oBAAoB;IACpB,oBAAoB;CACrB,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ANTS staking inside the console. The console renders the staking dashboard's
|
|
3
|
+
* own pages; this module serves the dashboard's API to them at
|
|
4
|
+
* `/console/api/workspaces/:id/ants/*`, behind the console's sign-in and roles.
|
|
5
|
+
*
|
|
6
|
+
* The dashboard API keeps per-session state (the connected wallet, the one
|
|
7
|
+
* pending wallet approval, the job journal), so each console session gets its
|
|
8
|
+
* own dashboard session per workspace, bound to the workspace's buyer account.
|
|
9
|
+
* Sessions close when idle. Every transaction is signed by the member's own
|
|
10
|
+
* wallet in the browser; the gateway never signs for staking.
|
|
11
|
+
*/
|
|
12
|
+
import { createAntsServer, type AntsChainConfig } from '@antseed/ants';
|
|
13
|
+
import { requireWorkspaceAccess } from '../access.js';
|
|
14
|
+
import type { ConsoleDeps } from '../deps.js';
|
|
15
|
+
import { type ConsoleRouter } from '../router.js';
|
|
16
|
+
import { type BuyerAddressBook } from '../../services/wallet-address.js';
|
|
17
|
+
/** Seams for tests; production uses the defaults. */
|
|
18
|
+
export interface StakingRouteOverrides {
|
|
19
|
+
requireWorkspaceAccess?: typeof requireWorkspaceAccess;
|
|
20
|
+
buyerAddresses?: BuyerAddressBook;
|
|
21
|
+
resolveChain?: () => Promise<AntsChainConfig>;
|
|
22
|
+
/** The workspace buyer's address; defaults to the running buyer's identity book. */
|
|
23
|
+
workspaceAddress?: (buyerIdentity: string) => Promise<string | null>;
|
|
24
|
+
createServer?: typeof createAntsServer;
|
|
25
|
+
now?: () => number;
|
|
26
|
+
}
|
|
27
|
+
export declare function registerStakingRoutes(router: ConsoleRouter, deps: ConsoleDeps, overrides?: StakingRouteOverrides): void;
|
|
28
|
+
//# sourceMappingURL=staking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staking.d.ts","sourceRoot":"","sources":["../../../../src/gateway/console-api/handlers/staking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,gBAAgB,EAAiC,KAAK,eAAe,EAAmB,MAAM,eAAe,CAAA;AAItH,OAAO,EAAS,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAA8C,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAC7F,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAoBhG,qDAAqD;AACrD,MAAM,WAAW,qBAAqB;IACpC,sBAAsB,CAAC,EAAE,OAAO,sBAAsB,CAAA;IACtD,cAAc,CAAC,EAAE,gBAAgB,CAAA;IACjC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAA;IAC7C,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACpE,YAAY,CAAC,EAAE,OAAO,gBAAgB,CAAA;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,GAAE,qBAA0B,GAAG,IAAI,CAmH3H"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ANTS staking inside the console. The console renders the staking dashboard's
|
|
3
|
+
* own pages; this module serves the dashboard's API to them at
|
|
4
|
+
* `/console/api/workspaces/:id/ants/*`, behind the console's sign-in and roles.
|
|
5
|
+
*
|
|
6
|
+
* The dashboard API keeps per-session state (the connected wallet, the one
|
|
7
|
+
* pending wallet approval, the job journal), so each console session gets its
|
|
8
|
+
* own dashboard session per workspace, bound to the workspace's buyer account.
|
|
9
|
+
* Sessions close when idle. Every transaction is signed by the member's own
|
|
10
|
+
* wallet in the browser; the gateway never signs for staking.
|
|
11
|
+
*/
|
|
12
|
+
import { createAntsServer, resolveAntsChain, AntsContext } from '@antseed/ants';
|
|
13
|
+
import { DEFAULT_BUYER_IDENTITY } from '@antseed/node';
|
|
14
|
+
import { ZeroAddress } from 'ethers';
|
|
15
|
+
import { errorMessage } from '../../errors.js';
|
|
16
|
+
import { audit, requireWorkspaceAccess } from '../access.js';
|
|
17
|
+
import { ConsoleError, respond } from '../router.js';
|
|
18
|
+
import { resolveIdentityAddress } from '../../services/wallet-address.js';
|
|
19
|
+
/** A session nobody has called for this long is closed (unless a transaction is still running). */
|
|
20
|
+
const IDLE_MS = 30 * 60_000;
|
|
21
|
+
/** More open sessions than this close the least recently used idle ones first. */
|
|
22
|
+
const MAX_SESSIONS = 64;
|
|
23
|
+
const SWEEP_MS = 60_000;
|
|
24
|
+
/** Dashboard actions that start a wallet transaction; recorded in the audit log. */
|
|
25
|
+
const ACTION_PATHS = new Set([
|
|
26
|
+
'positions/stake', 'positions/move', 'positions/split', 'positions/merge', 'positions/extend', 'positions/max-lock', 'positions/withdraw',
|
|
27
|
+
'rewards/claim', 'rewards/restake', 'rewards/stake-usage', 'rewards/compound',
|
|
28
|
+
'verification/submit', 'seller/register', 'seller/claim-starter',
|
|
29
|
+
]);
|
|
30
|
+
export function registerStakingRoutes(router, deps, overrides = {}) {
|
|
31
|
+
const access = overrides.requireWorkspaceAccess ?? requireWorkspaceAccess;
|
|
32
|
+
const createServer = overrides.createServer ?? createAntsServer;
|
|
33
|
+
const now = overrides.now ?? deps.now;
|
|
34
|
+
const addressBook = overrides.buyerAddresses ?? deps.buyerAddresses ?? null;
|
|
35
|
+
const sessions = new Map();
|
|
36
|
+
// Rank the chain's RPC endpoints once per process; every session reads in that order.
|
|
37
|
+
let ranked = null;
|
|
38
|
+
const chain = () => {
|
|
39
|
+
ranked ??= (async () => {
|
|
40
|
+
const resolved = await (overrides.resolveChain ?? (() => resolveAntsChain(deps.configPath)))();
|
|
41
|
+
const probe = new AntsContext({ chain: resolved, address: ZeroAddress });
|
|
42
|
+
await probe.selectRpc();
|
|
43
|
+
return probe.chain;
|
|
44
|
+
})();
|
|
45
|
+
ranked.catch(() => { ranked = null; });
|
|
46
|
+
return ranked;
|
|
47
|
+
};
|
|
48
|
+
const workspaceAddress = overrides.workspaceAddress ?? (async (buyerIdentity) => (await resolveIdentityAddress(deps.dataDir, addressBook, buyerIdentity).catch(() => null))?.address ?? null);
|
|
49
|
+
const close = (key, session) => {
|
|
50
|
+
sessions.delete(key);
|
|
51
|
+
void session.server.then((server) => server.close()).catch(() => { });
|
|
52
|
+
};
|
|
53
|
+
/** Close idle sessions, then the least recently used idle ones while over the cap. Busy sessions stay. */
|
|
54
|
+
const sweep = async () => {
|
|
55
|
+
const entries = [...sessions.entries()].sort((a, b) => a[1].lastUsed - b[1].lastUsed);
|
|
56
|
+
let open = entries.length;
|
|
57
|
+
for (const [key, session] of entries) {
|
|
58
|
+
const server = await session.server.catch(() => null);
|
|
59
|
+
if (!server) {
|
|
60
|
+
close(key, session);
|
|
61
|
+
open--;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (server.busy)
|
|
65
|
+
continue;
|
|
66
|
+
if (now() - session.lastUsed > IDLE_MS || open > MAX_SESSIONS) {
|
|
67
|
+
close(key, session);
|
|
68
|
+
open--;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const timer = setInterval(() => { void sweep(); }, SWEEP_MS);
|
|
73
|
+
timer.unref?.();
|
|
74
|
+
const sessionFor = async (request) => {
|
|
75
|
+
const principal = request.principal;
|
|
76
|
+
if (principal?.kind !== 'member')
|
|
77
|
+
throw new ConsoleError(403, 'forbidden', 'Staking needs a signed-in member.');
|
|
78
|
+
const workspaceId = request.params['id'] ?? '';
|
|
79
|
+
// Staking reads the workspace's buyer rewards, which the Rewards page also limits to admins.
|
|
80
|
+
access(deps.store, principal, workspaceId, 'admin');
|
|
81
|
+
const workspace = deps.store.getWorkspace(workspaceId);
|
|
82
|
+
if (!workspace)
|
|
83
|
+
throw new ConsoleError(404, 'not_found', 'Workspace not found.');
|
|
84
|
+
const key = `${principal.sessionId}:${workspaceId}`;
|
|
85
|
+
let session = sessions.get(key);
|
|
86
|
+
if (!session) {
|
|
87
|
+
const buyerIdentity = workspace.buyerIdentity || DEFAULT_BUYER_IDENTITY;
|
|
88
|
+
const server = (async () => {
|
|
89
|
+
const address = await workspaceAddress(buyerIdentity);
|
|
90
|
+
if (!address)
|
|
91
|
+
throw new ConsoleError(409, 'wallet_unavailable', 'This workspace has no wallet address yet.');
|
|
92
|
+
return createServer({
|
|
93
|
+
port: 0,
|
|
94
|
+
browserWallet: true,
|
|
95
|
+
serveWeb: false,
|
|
96
|
+
selectRpc: false,
|
|
97
|
+
chain: await chain(),
|
|
98
|
+
address,
|
|
99
|
+
dataDir: deps.dataDir,
|
|
100
|
+
configPath: deps.configPath,
|
|
101
|
+
stateKey: `console-${principal.memberId}-${workspaceId}`,
|
|
102
|
+
});
|
|
103
|
+
})();
|
|
104
|
+
session = { server, lastUsed: now() };
|
|
105
|
+
sessions.set(key, session);
|
|
106
|
+
server.catch(() => { if (sessions.get(key) === session)
|
|
107
|
+
sessions.delete(key); });
|
|
108
|
+
if (sessions.size > MAX_SESSIONS)
|
|
109
|
+
void sweep();
|
|
110
|
+
}
|
|
111
|
+
session.lastUsed = now();
|
|
112
|
+
return session.server;
|
|
113
|
+
};
|
|
114
|
+
const forward = async (request) => {
|
|
115
|
+
const server = await sessionFor(request);
|
|
116
|
+
const rest = request.params['*'] ?? '';
|
|
117
|
+
const query = request.query.toString();
|
|
118
|
+
const response = await server.app.inject({
|
|
119
|
+
method: request.method === 'POST' ? 'POST' : 'GET',
|
|
120
|
+
url: `/api/${rest}${query ? `?${query}` : ''}`,
|
|
121
|
+
headers: { authorization: `Bearer ${server.token}`, ...(request.method === 'POST' ? { 'content-type': 'application/json' } : {}) },
|
|
122
|
+
...(request.method === 'POST' ? { payload: JSON.stringify(request.body ?? {}) } : {}),
|
|
123
|
+
});
|
|
124
|
+
let body;
|
|
125
|
+
try {
|
|
126
|
+
body = response.json();
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
deps.log(`console staking: ${request.method} ${rest} answered ${response.statusCode} without JSON`);
|
|
130
|
+
throw new ConsoleError(502, 'staking_unavailable', 'The staking service did not answer.');
|
|
131
|
+
}
|
|
132
|
+
if (request.method === 'POST' && ACTION_PATHS.has(rest) && response.statusCode < 300) {
|
|
133
|
+
const job = body?.data;
|
|
134
|
+
audit(deps, request, `staking.${rest.replace('/', '.')}`, { kind: 'workspace', id: request.params['id'] ?? null, label: null }, { jobId: job?.id ?? null });
|
|
135
|
+
}
|
|
136
|
+
// The dashboard's own `{ ok, data | error | state }` envelope, unchanged.
|
|
137
|
+
return respond(response.statusCode, body);
|
|
138
|
+
};
|
|
139
|
+
const handle = async (request) => {
|
|
140
|
+
try {
|
|
141
|
+
return await forward(request);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
if (error instanceof ConsoleError)
|
|
145
|
+
throw error;
|
|
146
|
+
deps.log(`console staking: ${request.method} ${request.params['*'] ?? ''}: ${errorMessage(error)}`);
|
|
147
|
+
throw new ConsoleError(502, 'staking_unavailable', `Staking could not be loaded: ${errorMessage(error)}`);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
router.add('GET', '/workspaces/:id/ants/*', handle, { allow: ['member'] });
|
|
151
|
+
router.add('POST', '/workspaces/:id/ants/*', handle, { allow: ['member'] });
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=staking.js.map
|