@nodetool-ai/compute 0.8.1 → 0.8.2
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/.nodetool-build-stamp +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/manager.d.ts +12 -10
- package/dist/manager.d.ts.map +1 -1
- package/dist/manager.js +57 -31
- package/dist/manager.js.map +1 -1
- package/dist/providers/types.d.ts +22 -2
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/verda-api.d.ts +63 -0
- package/dist/providers/verda-api.d.ts.map +1 -0
- package/dist/providers/verda-api.js +205 -0
- package/dist/providers/verda-api.js.map +1 -0
- package/dist/providers/verda.d.ts +75 -0
- package/dist/providers/verda.d.ts.map +1 -0
- package/dist/providers/verda.js +560 -0
- package/dist/providers/verda.js.map +1 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
2026-
|
|
1
|
+
2026-10-12T08:37:29.591Z
|
package/dist/index.d.ts
CHANGED
|
@@ -6,5 +6,8 @@ export type { BridgeCreationRegistrar, WorkerActivityHeartbeatOptions, WorkerAct
|
|
|
6
6
|
export type { ReaperDeps, ReaperHandle, ReaperManager } from "./reaper.js";
|
|
7
7
|
export { RunpodPodProvider } from "./providers/runpod.js";
|
|
8
8
|
export { VastProvider } from "./providers/vast.js";
|
|
9
|
-
export
|
|
9
|
+
export { VerdaProvider } from "./providers/verda.js";
|
|
10
|
+
export { VerdaApiClient, VerdaApiError } from "./providers/verda-api.js";
|
|
11
|
+
export type { VerdaCredentials } from "./providers/verda-api.js";
|
|
12
|
+
export type { ProviderInstance, ProvisionResult, WorkerCredentials, WorkerProvider, WorkerSpec, WorkerStatus, WorkerTarget, } from "./providers/types.js";
|
|
10
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,4 +4,6 @@ export { runReaperOnce, startReaper } from "./reaper.js";
|
|
|
4
4
|
export { attachWorkerActivityHeartbeat, installWorkerActivityHeartbeat, } from "./worker-heartbeat.js";
|
|
5
5
|
export { RunpodPodProvider } from "./providers/runpod.js";
|
|
6
6
|
export { VastProvider } from "./providers/vast.js";
|
|
7
|
+
export { VerdaProvider } from "./providers/verda.js";
|
|
8
|
+
export { VerdaApiClient, VerdaApiError } from "./providers/verda-api.js";
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAO7C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAO7C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/manager.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CreateWorkerInstanceInput, type CreateWorkerProfileInput, type ListWorkerInstancesOptions, type WorkerInstance, type WorkerInstancePatch, type WorkerProfile } from "@nodetool-ai/models";
|
|
2
|
-
import type { WorkerProvider, WorkerStatus, WorkerTarget } from "./providers/types.js";
|
|
2
|
+
import type { WorkerCredentials, WorkerProvider, WorkerStatus, WorkerTarget } from "./providers/types.js";
|
|
3
3
|
/**
|
|
4
4
|
* The connection info a caller applies to the Python bridge when attaching to
|
|
5
5
|
* a worker — the worker's WebSocket URL and its bearer token (if any).
|
|
@@ -44,7 +44,7 @@ export interface WorkerManagerDeps {
|
|
|
44
44
|
getSetting: (key: string) => Promise<string | null>;
|
|
45
45
|
setSetting: (key: string, value: string) => Promise<void>;
|
|
46
46
|
deleteSetting: (key: string) => Promise<void>;
|
|
47
|
-
providerFactory: (target: WorkerTarget,
|
|
47
|
+
providerFactory: (target: WorkerTarget, credentials: WorkerCredentials) => WorkerProvider;
|
|
48
48
|
}
|
|
49
49
|
export declare class WorkerManager {
|
|
50
50
|
private readonly deps;
|
|
@@ -135,16 +135,18 @@ export declare class WorkerManager {
|
|
|
135
135
|
*/
|
|
136
136
|
apiKeyStatus(): Promise<Record<WorkerTarget, boolean>>;
|
|
137
137
|
/**
|
|
138
|
-
* Load a target
|
|
139
|
-
* environment when the keychain is unreachable
|
|
140
|
-
*
|
|
138
|
+
* Load every secret a target authenticates with, from the secret store and
|
|
139
|
+
* falling back to the environment when the keychain is unreachable
|
|
140
|
+
* (headless/sandboxed). Throws naming ALL missing secrets, so a Verda user
|
|
141
|
+
* fixing one credential is not sent back for the second.
|
|
141
142
|
*/
|
|
142
|
-
private
|
|
143
|
+
private loadCredentials;
|
|
144
|
+
/** The target's secrets that resolve nowhere. Empty means it is usable. */
|
|
145
|
+
private missingSecrets;
|
|
143
146
|
/**
|
|
144
|
-
* Resolve
|
|
145
|
-
*
|
|
146
|
-
* throws) and `apiKeyStatus` (which reports).
|
|
147
|
+
* Resolve one secret from the secret store, then the environment. Returns
|
|
148
|
+
* `null` when neither has it (no throw).
|
|
147
149
|
*/
|
|
148
|
-
private
|
|
150
|
+
private resolveSecret;
|
|
149
151
|
}
|
|
150
152
|
//# sourceMappingURL=manager.d.ts.map
|
package/dist/manager.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAiBA,OAAO,EAWL,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAiBA,OAAO,EAWL,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EAEd,YAAY,EACZ,YAAY,EACb,MAAM,sBAAsB,CAAC;AA0B9B;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAsBD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,CACnB,KAAK,EAAE,wBAAwB,KAC5B,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5B,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAClE,kBAAkB,EAAE,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACnD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,oBAAoB,EAAE,CACpB,KAAK,EAAE,yBAAyB,KAC7B,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,OAAO,CAAC,EAAE,0BAA0B,KACjC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/B,oBAAoB,EAAE,CACpB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,mBAAmB,KACvB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,SAAS,EAAE,CACT,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,KAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5B,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,eAAe,EAAE,CACf,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,iBAAiB,KAC3B,cAAc,CAAC;CACrB;AA2BD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IAEzC,YAAY,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM,EAEhD;IAID,aAAa,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAErE;IAED,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAEvC;IAED,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzC;IAID;;;;OAIG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAiD5D;IAED;;;;OAIG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAQtD;IAED;;;;;OAKG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAmBxD;IAED;;;;OAIG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAU3D;IAED,wEAAwE;IAClE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ7B;IAED,uCAAuC;IACvC,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAEhC;IAED;;;OAGG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAE9D;IAED,sDAAsD;IAChD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAMtD;IAED;;;;;;;OAOG;IACG,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAqD3C;IAID;;;;;OAKG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAa1D;IAED;;;;OAIG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAGlE;IAED;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAM5B;IAED;;;;;OAKG;IACG,eAAe,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAetD;IAID,8EAA8E;YAChE,2BAA2B;YAO3B,eAAe;YAQf,eAAe;IAK7B;;;;;OAKG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAS3D;IAED;;;;;OAKG;YACW,eAAe;IAoB7B,2EAA2E;YAC7D,cAAc;IAa5B;;;OAGG;YACW,aAAa;CAO5B"}
|
package/dist/manager.js
CHANGED
|
@@ -16,6 +16,7 @@ import { createLogger } from "@nodetool-ai/config";
|
|
|
16
16
|
import { createWorkerInstance as realCreateWorkerInstance, createWorkerProfile as realCreateWorkerProfile, deleteWorkerProfile as realDeleteWorkerProfile, getSecret as realGetSecret, getWorkerInstance as realGetWorkerInstance, getWorkerProfile as realGetWorkerProfile, listWorkerInstances as realListWorkerInstances, listWorkerProfiles as realListWorkerProfiles, updateWorkerInstance as realUpdateWorkerInstance, Setting, } from "@nodetool-ai/models";
|
|
17
17
|
import { RunpodPodProvider } from "./providers/runpod.js";
|
|
18
18
|
import { VastProvider } from "./providers/vast.js";
|
|
19
|
+
import { VerdaProvider } from "./providers/verda.js";
|
|
19
20
|
const log = createLogger("nodetool.compute.manager");
|
|
20
21
|
/** Local desktop user id used for secret-store reads (shared with the CLI). */
|
|
21
22
|
const LOCAL_USER_ID = "1";
|
|
@@ -25,18 +26,29 @@ const LOCAL_USER_ID = "1";
|
|
|
25
26
|
* instance reads it to re-point its Python bridge.
|
|
26
27
|
*/
|
|
27
28
|
const ACTIVE_WORKER_KEY = "active_worker_instance_id";
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Secret-store keys each target authenticates with. Most targets take a single
|
|
31
|
+
* API key; Verda takes an OAuth2 client id AND secret, so this is a list per
|
|
32
|
+
* target rather than one name. A target is usable only when EVERY listed
|
|
33
|
+
* secret resolves.
|
|
34
|
+
*/
|
|
35
|
+
const CREDENTIAL_SECRETS = {
|
|
36
|
+
runpod: ["RUNPOD_API_KEY"],
|
|
37
|
+
vast: ["VAST_API_KEY"],
|
|
38
|
+
verda: ["VERDA_CLIENT_ID", "VERDA_CLIENT_SECRET"],
|
|
32
39
|
};
|
|
33
40
|
/** Construct the concrete provider for a target. */
|
|
34
|
-
function defaultProviderFactory(target,
|
|
41
|
+
function defaultProviderFactory(target, credentials) {
|
|
35
42
|
switch (target) {
|
|
36
43
|
case "runpod":
|
|
37
|
-
return new RunpodPodProvider(
|
|
44
|
+
return new RunpodPodProvider(credentials.RUNPOD_API_KEY);
|
|
38
45
|
case "vast":
|
|
39
|
-
return new VastProvider(
|
|
46
|
+
return new VastProvider(credentials.VAST_API_KEY);
|
|
47
|
+
case "verda":
|
|
48
|
+
return new VerdaProvider({
|
|
49
|
+
clientId: credentials.VERDA_CLIENT_ID,
|
|
50
|
+
clientSecret: credentials.VERDA_CLIENT_SECRET,
|
|
51
|
+
});
|
|
40
52
|
default:
|
|
41
53
|
throw new Error(`Unsupported worker target: ${target}`);
|
|
42
54
|
}
|
|
@@ -151,6 +163,11 @@ export class WorkerManager {
|
|
|
151
163
|
const result = await provider.resume(instance.provider_ref);
|
|
152
164
|
return this.deps.updateWorkerInstance(instance.id, {
|
|
153
165
|
status: "running",
|
|
166
|
+
// A resume can hand back a DIFFERENT provider handle: Verda releases the
|
|
167
|
+
// machine on stop and boots a new one from the retained disk. Dropping
|
|
168
|
+
// the new ref would leave the registry pointing at a dead instance and
|
|
169
|
+
// the live one billing untracked.
|
|
170
|
+
provider_ref: result.providerRef,
|
|
154
171
|
ws_url: result.wsUrl,
|
|
155
172
|
estimated_cost_usd: result.costUsd ?? instance.estimated_cost_usd,
|
|
156
173
|
// Resuming is activity — reset the idle clock so the reaper doesn't
|
|
@@ -336,8 +353,8 @@ export class WorkerManager {
|
|
|
336
353
|
return instance;
|
|
337
354
|
}
|
|
338
355
|
async resolveProvider(target) {
|
|
339
|
-
const
|
|
340
|
-
return this.deps.providerFactory(target,
|
|
356
|
+
const credentials = await this.loadCredentials(target);
|
|
357
|
+
return this.deps.providerFactory(target, credentials);
|
|
341
358
|
}
|
|
342
359
|
/**
|
|
343
360
|
* Report whether each target's API key is available — store OR environment,
|
|
@@ -346,39 +363,46 @@ export class WorkerManager {
|
|
|
346
363
|
* env-provided key.
|
|
347
364
|
*/
|
|
348
365
|
async apiKeyStatus() {
|
|
349
|
-
const targets = Object.keys(
|
|
350
|
-
const entries = await Promise.all(targets.map(async (target) => [target, (await this.
|
|
366
|
+
const targets = Object.keys(CREDENTIAL_SECRETS);
|
|
367
|
+
const entries = await Promise.all(targets.map(async (target) => [target, (await this.missingSecrets(target)).length === 0]));
|
|
351
368
|
return Object.fromEntries(entries);
|
|
352
369
|
}
|
|
353
370
|
/**
|
|
354
|
-
* Load a target
|
|
355
|
-
* environment when the keychain is unreachable
|
|
356
|
-
*
|
|
371
|
+
* Load every secret a target authenticates with, from the secret store and
|
|
372
|
+
* falling back to the environment when the keychain is unreachable
|
|
373
|
+
* (headless/sandboxed). Throws naming ALL missing secrets, so a Verda user
|
|
374
|
+
* fixing one credential is not sent back for the second.
|
|
357
375
|
*/
|
|
358
|
-
async
|
|
359
|
-
const
|
|
360
|
-
if (
|
|
361
|
-
|
|
376
|
+
async loadCredentials(target) {
|
|
377
|
+
const missing = await this.missingSecrets(target);
|
|
378
|
+
if (missing.length > 0) {
|
|
379
|
+
throw new Error(`${missing.join(" and ")} not found in the secret store or ` +
|
|
380
|
+
`environment. Store with: ` +
|
|
381
|
+
`${missing.map((name) => `nodetool secrets store ${name}`).join("; ")}`);
|
|
362
382
|
}
|
|
363
|
-
const
|
|
364
|
-
|
|
365
|
-
|
|
383
|
+
const names = CREDENTIAL_SECRETS[target];
|
|
384
|
+
const entries = await Promise.all(names.map(async (name) => [name, (await this.resolveSecret(name)) ?? ""]));
|
|
385
|
+
return Object.fromEntries(entries);
|
|
386
|
+
}
|
|
387
|
+
/** The target's secrets that resolve nowhere. Empty means it is usable. */
|
|
388
|
+
async missingSecrets(target) {
|
|
389
|
+
const names = CREDENTIAL_SECRETS[target];
|
|
390
|
+
if (!names) {
|
|
391
|
+
throw new Error(`No credential mapping for worker target: ${target}`);
|
|
392
|
+
}
|
|
393
|
+
const resolved = await Promise.all(names.map(async (name) => [name, await this.resolveSecret(name)]));
|
|
394
|
+
return resolved.filter(([, value]) => value === null).map(([name]) => name);
|
|
366
395
|
}
|
|
367
396
|
/**
|
|
368
|
-
* Resolve
|
|
369
|
-
*
|
|
370
|
-
* throws) and `apiKeyStatus` (which reports).
|
|
397
|
+
* Resolve one secret from the secret store, then the environment. Returns
|
|
398
|
+
* `null` when neither has it (no throw).
|
|
371
399
|
*/
|
|
372
|
-
async
|
|
373
|
-
const
|
|
374
|
-
if (!key) {
|
|
375
|
-
throw new Error(`No API key mapping for worker target: ${target}`);
|
|
376
|
-
}
|
|
377
|
-
const fromStore = await this.deps.getSecret(key, LOCAL_USER_ID);
|
|
400
|
+
async resolveSecret(name) {
|
|
401
|
+
const fromStore = await this.deps.getSecret(name, LOCAL_USER_ID);
|
|
378
402
|
if (fromStore) {
|
|
379
403
|
return fromStore;
|
|
380
404
|
}
|
|
381
|
-
return process.env[
|
|
405
|
+
return process.env[name] ?? null;
|
|
382
406
|
}
|
|
383
407
|
}
|
|
384
408
|
/** Build a provision spec from a profile's declarative fields. */
|
|
@@ -389,6 +413,8 @@ function specFromProfile(profile, target, token) {
|
|
|
389
413
|
image: profile.image,
|
|
390
414
|
target,
|
|
391
415
|
gpu: typeof spec.gpu === "string" ? spec.gpu : undefined,
|
|
416
|
+
region: typeof spec.region === "string" ? spec.region : undefined,
|
|
417
|
+
osImage: typeof spec.osImage === "string" ? spec.osImage : undefined,
|
|
392
418
|
vcpu: typeof spec.vcpu === "number" ? spec.vcpu : undefined,
|
|
393
419
|
disk: typeof spec.disk === "number" ? spec.disk : undefined,
|
|
394
420
|
env: isStringRecord(spec.env) ? spec.env : undefined,
|
package/dist/manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
/** Provisioning target a profile/spec runs on. */
|
|
2
|
-
export type WorkerTarget = "runpod" | "vast";
|
|
2
|
+
export type WorkerTarget = "runpod" | "vast" | "verda";
|
|
3
|
+
/**
|
|
4
|
+
* The resolved secrets a provider authenticates with, keyed by secret name
|
|
5
|
+
* (e.g. `{ RUNPOD_API_KEY: "..." }`). A target needs one entry per name in the
|
|
6
|
+
* manager's `CREDENTIAL_SECRETS` list — Verda takes a client id AND secret, so
|
|
7
|
+
* a single key string cannot express every target's credentials.
|
|
8
|
+
*/
|
|
9
|
+
export type WorkerCredentials = Readonly<Record<string, string>>;
|
|
3
10
|
/**
|
|
4
11
|
* Lifecycle status of a worker, shared by instances and provider results.
|
|
5
12
|
* `provisioning` → `running` → `attached`, with `stopping`/`stopped` on
|
|
@@ -28,8 +35,21 @@ export interface WorkerSpec {
|
|
|
28
35
|
image: string;
|
|
29
36
|
/** Provisioning target. */
|
|
30
37
|
target: WorkerTarget;
|
|
31
|
-
/** Provider-shaped GPU selector (e.g. "A40"). */
|
|
38
|
+
/** Provider-shaped GPU selector (e.g. "A40", or a Verda `instance_type`). */
|
|
32
39
|
gpu?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Provider-shaped region/datacenter selector. Verda REQUIRES a
|
|
42
|
+
* `location_code` on every create; when this is unset the provider resolves
|
|
43
|
+
* one from live availability. Ignored by targets that pick a region
|
|
44
|
+
* themselves (RunPod, Vast).
|
|
45
|
+
*/
|
|
46
|
+
region?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Guest OS image for VM targets (Verda `image_type`). Distinct from `image`,
|
|
49
|
+
* which is the Docker image the guest RUNS — a VM target needs both. Unset
|
|
50
|
+
* lets the provider choose a CUDA+Docker image from the live catalog.
|
|
51
|
+
*/
|
|
52
|
+
osImage?: string;
|
|
33
53
|
/** Number of GPUs to request (GPU targets only). Defaults to 1. */
|
|
34
54
|
gpuCount?: number;
|
|
35
55
|
/** vCPU count. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAOA,kDAAkD;AAClD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAOA,kDAAkD;AAClD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,SAAS,GACT,UAAU,GACV,UAAU,GAEV,SAAS,GAET,YAAY,GACZ,OAAO,CAAC;AAEZ;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,eAAO,MAAM,cAAc,2BAAuC,CAAC;AACnE,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,MAAM,EAAE,YAAY,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACtD,wDAAwD;IACxD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9C;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,mEAAmE;IACnE,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CACrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,2EAA2E;AAC3E,+EAA+E;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,2EAA2E;AAC3E,+EAA+E;AA6B/E;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,mBAAmB,cAAc,CAAC;AACnE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,sEAAsE;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export type VerdaMethod = "GET" | "POST" | "PUT" | "DELETE";
|
|
2
|
+
/** A decoded Verda response: the HTTP status plus the parsed body (if any). */
|
|
3
|
+
export interface VerdaResponse<T = unknown> {
|
|
4
|
+
status: number;
|
|
5
|
+
body: T;
|
|
6
|
+
}
|
|
7
|
+
/** Verda cloud API credentials — distinct from the separate inference key. */
|
|
8
|
+
export interface VerdaCredentials {
|
|
9
|
+
clientId: string;
|
|
10
|
+
clientSecret: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A Verda API failure carrying the HTTP status, so callers can tell apart the
|
|
14
|
+
* failures the brief requires be handled distinctly: no capacity (503),
|
|
15
|
+
* authentication (401/403), quota/funds (402/422) and malformed input (400).
|
|
16
|
+
*/
|
|
17
|
+
export declare class VerdaApiError extends Error {
|
|
18
|
+
readonly status: number;
|
|
19
|
+
readonly path: string;
|
|
20
|
+
constructor(message: string, status: number, path: string);
|
|
21
|
+
/** The provider reported no capacity for the requested configuration. */
|
|
22
|
+
get isNoCapacity(): boolean;
|
|
23
|
+
/** The credentials were rejected — retrying with the same token cannot help. */
|
|
24
|
+
get isAuth(): boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Reject a resource identifier that would escape its intended API path.
|
|
28
|
+
*
|
|
29
|
+
* The Verda Python SDK shipped a path-traversal fix in 1.24.1 (a crafted
|
|
30
|
+
* resource name or id could redirect an authenticated request to a different
|
|
31
|
+
* endpoint). NodeTool interpolates ids into paths too — a `provider_ref` read
|
|
32
|
+
* back from the registry, a volume id from a provider response — so the same
|
|
33
|
+
* check is enforced here rather than trusted to the far side.
|
|
34
|
+
*/
|
|
35
|
+
export declare function assertSafeId(id: string, label: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Authenticated Verda REST client. One instance per credential pair holds that
|
|
38
|
+
* pair's access token; refresh is serialized so a burst of concurrent calls
|
|
39
|
+
* mints one token rather than racing.
|
|
40
|
+
*/
|
|
41
|
+
export declare class VerdaApiClient {
|
|
42
|
+
private readonly credentials;
|
|
43
|
+
private readonly baseUrl;
|
|
44
|
+
private accessToken;
|
|
45
|
+
private expiresAt;
|
|
46
|
+
/** In-flight refresh, shared by every caller that arrives during it. */
|
|
47
|
+
private pending;
|
|
48
|
+
constructor(credentials: VerdaCredentials, baseUrl?: string);
|
|
49
|
+
/**
|
|
50
|
+
* Call an authenticated endpoint. Retries 429/503 with backoff, and retries
|
|
51
|
+
* ONCE after a 401 with a freshly minted token (a token can expire mid-flight);
|
|
52
|
+
* a second 401 is a credential problem and is surfaced.
|
|
53
|
+
*/
|
|
54
|
+
request<T = unknown>(method: VerdaMethod, path: string, body?: Record<string, unknown>): Promise<VerdaResponse<T>>;
|
|
55
|
+
/** Drop the cached token, forcing the next call to mint a fresh one. */
|
|
56
|
+
invalidate(): void;
|
|
57
|
+
private send;
|
|
58
|
+
private decode;
|
|
59
|
+
/** Return a live access token, refreshing when absent or near expiry. */
|
|
60
|
+
private token;
|
|
61
|
+
private refresh;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=verda-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verda-api.d.ts","sourceRoot":"","sources":["../../src/providers/verda-api.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE5D,+EAA+E;AAC/E,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;CACT;AAED,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,KAAK;IAGpC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAHvB,YACE,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAItB;IAED,yEAAyE;IACzE,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,gFAAgF;IAChF,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ9D;AAmBD;;;;GAIG;AACH,qBAAa,cAAc;IAOvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAAK;IACtB,wEAAwE;IACxE,OAAO,CAAC,OAAO,CAAgC;IAE/C,YACmB,WAAW,EAAE,gBAAgB,EAC7B,OAAO,GAAE,MAA2B,EAOtD;IAED;;;;OAIG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAuB3B;IAED,wEAAwE;IACxE,UAAU,IAAI,IAAI,CAGjB;YAIa,IAAI;YAqBJ,MAAM;IA4BpB,yEAAyE;IACzE,OAAO,CAAC,KAAK;YAYC,OAAO;CAoCtB"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// Verda cloud API transport — authentication, retries, and response decoding.
|
|
2
|
+
//
|
|
3
|
+
// Split from `verda.ts` so the provider reads as lifecycle logic while the
|
|
4
|
+
// awkward parts of the wire protocol live here:
|
|
5
|
+
//
|
|
6
|
+
// * OAuth2 client-credentials tokens (`POST /v1/oauth2/token`) with a single
|
|
7
|
+
// in-flight refresh per client, refreshed before expiry.
|
|
8
|
+
// * The documented rate limits (500 authenticated req/min per project, 60/min
|
|
9
|
+
// per method+path) surface as 429 + `Retry-After`, honoured with bounded
|
|
10
|
+
// retries.
|
|
11
|
+
// * Verda answers instance actions asynchronously: 202 (accepted), 204 (the
|
|
12
|
+
// single action was already satisfied), 207 (a bulk action partly failed).
|
|
13
|
+
// Callers get the status code, not a decoded resource, so they can tell
|
|
14
|
+
// "accepted" from "done".
|
|
15
|
+
//
|
|
16
|
+
// Credentials are injected by the caller (the `WorkerManager` sources them from
|
|
17
|
+
// the secret store); this module never reads `process.env`.
|
|
18
|
+
/** Production base URL. The rendered API reference advertises localhost in its
|
|
19
|
+
* `servers` block, so it is pinned here rather than taken from a generator. */
|
|
20
|
+
const VERDA_API_BASE_URL = "https://api.verda.com";
|
|
21
|
+
/** Refresh a token this long before it expires, to cover clock skew + latency. */
|
|
22
|
+
const TOKEN_REFRESH_SKEW_MS = 60_000;
|
|
23
|
+
/** Cap on retries of a 429/503 before the call fails. */
|
|
24
|
+
const MAX_RETRIES = 3;
|
|
25
|
+
/** Fallback backoff when a 429 carries no usable `Retry-After`. */
|
|
26
|
+
const DEFAULT_RETRY_DELAY_MS = 2_000;
|
|
27
|
+
/**
|
|
28
|
+
* A Verda API failure carrying the HTTP status, so callers can tell apart the
|
|
29
|
+
* failures the brief requires be handled distinctly: no capacity (503),
|
|
30
|
+
* authentication (401/403), quota/funds (402/422) and malformed input (400).
|
|
31
|
+
*/
|
|
32
|
+
export class VerdaApiError extends Error {
|
|
33
|
+
status;
|
|
34
|
+
path;
|
|
35
|
+
constructor(message, status, path) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.status = status;
|
|
38
|
+
this.path = path;
|
|
39
|
+
this.name = "VerdaApiError";
|
|
40
|
+
}
|
|
41
|
+
/** The provider reported no capacity for the requested configuration. */
|
|
42
|
+
get isNoCapacity() {
|
|
43
|
+
return this.status === 503;
|
|
44
|
+
}
|
|
45
|
+
/** The credentials were rejected — retrying with the same token cannot help. */
|
|
46
|
+
get isAuth() {
|
|
47
|
+
return this.status === 401 || this.status === 403;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Reject a resource identifier that would escape its intended API path.
|
|
52
|
+
*
|
|
53
|
+
* The Verda Python SDK shipped a path-traversal fix in 1.24.1 (a crafted
|
|
54
|
+
* resource name or id could redirect an authenticated request to a different
|
|
55
|
+
* endpoint). NodeTool interpolates ids into paths too — a `provider_ref` read
|
|
56
|
+
* back from the registry, a volume id from a provider response — so the same
|
|
57
|
+
* check is enforced here rather than trusted to the far side.
|
|
58
|
+
*/
|
|
59
|
+
export function assertSafeId(id, label) {
|
|
60
|
+
if (!/^[A-Za-z0-9._-]+$/.test(id)) {
|
|
61
|
+
throw new Error(`Unsafe Verda ${label} ${JSON.stringify(id)}: ids may contain only ` +
|
|
62
|
+
`letters, digits, dot, underscore and hyphen`);
|
|
63
|
+
}
|
|
64
|
+
return id;
|
|
65
|
+
}
|
|
66
|
+
/** Parse `Retry-After` (delta-seconds or HTTP-date) into milliseconds. */
|
|
67
|
+
function retryAfterMs(header) {
|
|
68
|
+
if (!header)
|
|
69
|
+
return DEFAULT_RETRY_DELAY_MS;
|
|
70
|
+
const seconds = Number(header);
|
|
71
|
+
if (Number.isFinite(seconds) && seconds >= 0) {
|
|
72
|
+
return seconds * 1_000;
|
|
73
|
+
}
|
|
74
|
+
const date = Date.parse(header);
|
|
75
|
+
if (!Number.isNaN(date)) {
|
|
76
|
+
return Math.max(0, date - Date.now());
|
|
77
|
+
}
|
|
78
|
+
return DEFAULT_RETRY_DELAY_MS;
|
|
79
|
+
}
|
|
80
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
81
|
+
/**
|
|
82
|
+
* Authenticated Verda REST client. One instance per credential pair holds that
|
|
83
|
+
* pair's access token; refresh is serialized so a burst of concurrent calls
|
|
84
|
+
* mints one token rather than racing.
|
|
85
|
+
*/
|
|
86
|
+
export class VerdaApiClient {
|
|
87
|
+
credentials;
|
|
88
|
+
baseUrl;
|
|
89
|
+
accessToken = null;
|
|
90
|
+
expiresAt = 0;
|
|
91
|
+
/** In-flight refresh, shared by every caller that arrives during it. */
|
|
92
|
+
pending = null;
|
|
93
|
+
constructor(credentials, baseUrl = VERDA_API_BASE_URL) {
|
|
94
|
+
this.credentials = credentials;
|
|
95
|
+
this.baseUrl = baseUrl;
|
|
96
|
+
if (!credentials.clientId || !credentials.clientSecret) {
|
|
97
|
+
throw new Error("Verda requires both VERDA_CLIENT_ID and VERDA_CLIENT_SECRET");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Call an authenticated endpoint. Retries 429/503 with backoff, and retries
|
|
102
|
+
* ONCE after a 401 with a freshly minted token (a token can expire mid-flight);
|
|
103
|
+
* a second 401 is a credential problem and is surfaced.
|
|
104
|
+
*/
|
|
105
|
+
async request(method, path, body) {
|
|
106
|
+
let reauthed = false;
|
|
107
|
+
for (let attempt = 0;; attempt++) {
|
|
108
|
+
const token = await this.token();
|
|
109
|
+
const response = await this.send(method, path, token, body);
|
|
110
|
+
if (response.status === 401 && !reauthed) {
|
|
111
|
+
// The token was rejected — drop it and mint a new one exactly once.
|
|
112
|
+
reauthed = true;
|
|
113
|
+
this.invalidate();
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if ((response.status === 429 || response.status === 503) &&
|
|
117
|
+
attempt < MAX_RETRIES) {
|
|
118
|
+
await sleep(retryAfterMs(response.headers.get("retry-after")));
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
return this.decode(response, method, path);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Drop the cached token, forcing the next call to mint a fresh one. */
|
|
125
|
+
invalidate() {
|
|
126
|
+
this.accessToken = null;
|
|
127
|
+
this.expiresAt = 0;
|
|
128
|
+
}
|
|
129
|
+
// --- Internals ----------------------------------------------------------
|
|
130
|
+
async send(method, path, token, body) {
|
|
131
|
+
const init = {
|
|
132
|
+
method,
|
|
133
|
+
headers: {
|
|
134
|
+
Authorization: `Bearer ${token}`,
|
|
135
|
+
"Content-Type": "application/json",
|
|
136
|
+
Accept: "application/json",
|
|
137
|
+
},
|
|
138
|
+
signal: AbortSignal.timeout(60_000),
|
|
139
|
+
};
|
|
140
|
+
if (body && method !== "GET") {
|
|
141
|
+
init.body = JSON.stringify(body);
|
|
142
|
+
}
|
|
143
|
+
return fetch(`${this.baseUrl}${path}`, init);
|
|
144
|
+
}
|
|
145
|
+
async decode(response, method, path) {
|
|
146
|
+
const text = await response.text().catch(() => "");
|
|
147
|
+
if (!response.ok) {
|
|
148
|
+
// Response bodies can echo request fields; include only the provider's
|
|
149
|
+
// message, never the request body, which carries the worker token.
|
|
150
|
+
throw new VerdaApiError(`Verda ${method} ${path} failed (${response.status}): ${text.slice(0, 500)}`, response.status, path);
|
|
151
|
+
}
|
|
152
|
+
// 202/204 legitimately carry no body — an action was accepted, not applied.
|
|
153
|
+
let parsed = null;
|
|
154
|
+
if (text) {
|
|
155
|
+
try {
|
|
156
|
+
parsed = JSON.parse(text);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Some creates answer with a bare id rather than JSON; keep the text.
|
|
160
|
+
parsed = text;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return { status: response.status, body: parsed };
|
|
164
|
+
}
|
|
165
|
+
/** Return a live access token, refreshing when absent or near expiry. */
|
|
166
|
+
token() {
|
|
167
|
+
if (this.accessToken && Date.now() < this.expiresAt - TOKEN_REFRESH_SKEW_MS) {
|
|
168
|
+
return Promise.resolve(this.accessToken);
|
|
169
|
+
}
|
|
170
|
+
// Serialize: concurrent callers share one refresh rather than each minting
|
|
171
|
+
// a token (and burning the per-path rate limit on /oauth2/token).
|
|
172
|
+
this.pending ??= this.refresh().finally(() => {
|
|
173
|
+
this.pending = null;
|
|
174
|
+
});
|
|
175
|
+
return this.pending;
|
|
176
|
+
}
|
|
177
|
+
async refresh() {
|
|
178
|
+
const response = await fetch(`${this.baseUrl}/v1/oauth2/token`, {
|
|
179
|
+
method: "POST",
|
|
180
|
+
headers: { "Content-Type": "application/json", Accept: "application/json" },
|
|
181
|
+
body: JSON.stringify({
|
|
182
|
+
grant_type: "client_credentials",
|
|
183
|
+
client_id: this.credentials.clientId,
|
|
184
|
+
client_secret: this.credentials.clientSecret,
|
|
185
|
+
}),
|
|
186
|
+
signal: AbortSignal.timeout(30_000),
|
|
187
|
+
});
|
|
188
|
+
if (!response.ok) {
|
|
189
|
+
// Never echo the body: the request carried the client secret and a
|
|
190
|
+
// provider error may quote it back.
|
|
191
|
+
throw new VerdaApiError(`Verda authentication failed (${response.status}). Check ` +
|
|
192
|
+
`VERDA_CLIENT_ID and VERDA_CLIENT_SECRET.`, response.status, "/v1/oauth2/token");
|
|
193
|
+
}
|
|
194
|
+
const token = (await response.json());
|
|
195
|
+
if (!token.access_token) {
|
|
196
|
+
throw new Error("Verda token response contained no access_token");
|
|
197
|
+
}
|
|
198
|
+
this.accessToken = token.access_token;
|
|
199
|
+
// Treat a missing expires_in conservatively rather than caching forever.
|
|
200
|
+
const ttl = typeof token.expires_in === "number" ? token.expires_in : 300;
|
|
201
|
+
this.expiresAt = Date.now() + ttl * 1_000;
|
|
202
|
+
return token.access_token;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=verda-api.js.map
|