@opendatalabs/personal-server-ts-server 0.0.1-canary.016adf9 → 0.0.1-canary.052d47e
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/api-auth.d.ts +31 -0
- package/dist/api-auth.d.ts.map +1 -0
- package/dist/api-auth.js +148 -0
- package/dist/api-auth.js.map +1 -0
- package/dist/api.d.ts +4 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +3 -0
- package/dist/api.js.map +1 -1
- package/dist/app.d.ts +77 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +165 -9
- package/dist/app.js.map +1 -1
- package/dist/bootstrap.d.ts +36 -3
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +434 -39
- package/dist/bootstrap.js.map +1 -1
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +369 -0
- package/dist/client.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +14 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +78 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +9 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +22 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/enclave-main.d.ts +10 -0
- package/dist/enclave-main.d.ts.map +1 -0
- package/dist/enclave-main.js +115 -0
- package/dist/enclave-main.js.map +1 -0
- package/dist/hono-context.d.ts +14 -0
- package/dist/hono-context.d.ts.map +1 -0
- package/dist/hono-context.js +2 -0
- package/dist/hono-context.js.map +1 -0
- package/dist/index.js +48 -12
- package/dist/index.js.map +1 -1
- package/dist/jobs/types.d.ts +17 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +3 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/jobs/worker.d.ts +30 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +217 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/keys/server-account.d.ts +28 -0
- package/dist/keys/server-account.d.ts.map +1 -0
- package/dist/keys/server-account.js +48 -0
- package/dist/keys/server-account.js.map +1 -0
- package/dist/listen.d.ts +11 -0
- package/dist/listen.d.ts.map +1 -0
- package/dist/listen.js +23 -0
- package/dist/listen.js.map +1 -0
- package/dist/logger/index.d.ts +5 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +9 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logging/access-log.d.ts +4 -0
- package/dist/logging/access-log.d.ts.map +1 -0
- package/dist/logging/access-log.js +25 -0
- package/dist/logging/access-log.js.map +1 -0
- package/dist/logging/access-reader.d.ts +19 -0
- package/dist/logging/access-reader.d.ts.map +1 -0
- package/dist/logging/access-reader.js +50 -0
- package/dist/logging/access-reader.js.map +1 -0
- package/dist/middleware/access-log.d.ts.map +1 -1
- package/dist/middleware/access-log.js +8 -2
- package/dist/middleware/access-log.js.map +1 -1
- package/dist/middleware/builder-check.d.ts +2 -2
- package/dist/middleware/builder-check.d.ts.map +1 -1
- package/dist/middleware/builder-check.js +7 -2
- package/dist/middleware/builder-check.js.map +1 -1
- package/dist/middleware/cors.d.ts +18 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +51 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/owner-check.js +1 -1
- package/dist/middleware/owner-check.js.map +1 -1
- package/dist/middleware/web3-auth.d.ts +12 -0
- package/dist/middleware/web3-auth.d.ts.map +1 -1
- package/dist/middleware/web3-auth.js +27 -31
- package/dist/middleware/web3-auth.js.map +1 -1
- package/dist/migrations/detect-stuck-version-ledger.d.ts +43 -0
- package/dist/migrations/detect-stuck-version-ledger.d.ts.map +1 -0
- package/dist/migrations/detect-stuck-version-ledger.js +73 -0
- package/dist/migrations/detect-stuck-version-ledger.js.map +1 -0
- package/dist/migrations/local-state.d.ts +35 -0
- package/dist/migrations/local-state.d.ts.map +1 -0
- package/dist/migrations/local-state.js +133 -0
- package/dist/migrations/local-state.js.map +1 -0
- package/dist/migrations/state-migrations.d.ts +78 -0
- package/dist/migrations/state-migrations.d.ts.map +1 -0
- package/dist/migrations/state-migrations.js +72 -0
- package/dist/migrations/state-migrations.js.map +1 -0
- package/dist/pending-blob-deletions.d.ts +10 -0
- package/dist/pending-blob-deletions.d.ts.map +1 -0
- package/dist/pending-blob-deletions.js +38 -0
- package/dist/pending-blob-deletions.js.map +1 -0
- package/dist/routes/access-logs.d.ts +7 -0
- package/dist/routes/access-logs.d.ts.map +1 -1
- package/dist/routes/access-logs.js +11 -17
- package/dist/routes/access-logs.js.map +1 -1
- package/dist/routes/auth-device.d.ts +49 -0
- package/dist/routes/auth-device.d.ts.map +1 -0
- package/dist/routes/auth-device.js +581 -0
- package/dist/routes/auth-device.js.map +1 -0
- package/dist/routes/data.d.ts +67 -2
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +41 -201
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/derivatives.d.ts +33 -0
- package/dist/routes/derivatives.d.ts.map +1 -0
- package/dist/routes/derivatives.js +33 -0
- package/dist/routes/derivatives.js.map +1 -0
- package/dist/routes/enclave-jobs.d.ts +9 -0
- package/dist/routes/enclave-jobs.d.ts.map +1 -0
- package/dist/routes/enclave-jobs.js +104 -0
- package/dist/routes/enclave-jobs.js.map +1 -0
- package/dist/routes/grants.d.ts +9 -2
- package/dist/routes/grants.d.ts.map +1 -1
- package/dist/routes/grants.js +18 -196
- package/dist/routes/grants.js.map +1 -1
- package/dist/routes/health.d.ts +7 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +39 -2
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/mcp.d.ts +115 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +676 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/oauth-token.d.ts +56 -0
- package/dist/routes/oauth-token.d.ts.map +1 -0
- package/dist/routes/oauth-token.js +49 -0
- package/dist/routes/oauth-token.js.map +1 -0
- package/dist/routes/sync.d.ts +7 -0
- package/dist/routes/sync.d.ts.map +1 -1
- package/dist/routes/sync.js +12 -39
- package/dist/routes/sync.js.map +1 -1
- package/dist/routes/ui-config.d.ts.map +1 -1
- package/dist/routes/ui-config.js +17 -82
- package/dist/routes/ui-config.js.map +1 -1
- package/dist/routes/ui-registration.d.ts +9 -0
- package/dist/routes/ui-registration.d.ts.map +1 -0
- package/dist/routes/ui-registration.js +217 -0
- package/dist/routes/ui-registration.js.map +1 -0
- package/dist/routes/ui.d.ts +1 -0
- package/dist/routes/ui.d.ts.map +1 -1
- package/dist/routes/ui.js +46 -4
- package/dist/routes/ui.js.map +1 -1
- package/dist/routes/write-session.d.ts +37 -0
- package/dist/routes/write-session.d.ts.map +1 -0
- package/dist/routes/write-session.js +34 -0
- package/dist/routes/write-session.js.map +1 -0
- package/dist/storage/hierarchy.d.ts +36 -0
- package/dist/storage/hierarchy.d.ts.map +1 -0
- package/dist/storage/hierarchy.js +282 -0
- package/dist/storage/hierarchy.js.map +1 -0
- package/dist/storage/index-manager.d.ts +60 -0
- package/dist/storage/index-manager.d.ts.map +1 -0
- package/dist/storage/index-manager.js +174 -0
- package/dist/storage/index-manager.js.map +1 -0
- package/dist/storage/index-schema.d.ts +5 -0
- package/dist/storage/index-schema.d.ts.map +1 -0
- package/dist/storage/index-schema.js +69 -0
- package/dist/storage/index-schema.js.map +1 -0
- package/dist/storage/node-data-storage.d.ts +9 -0
- package/dist/storage/node-data-storage.d.ts.map +1 -0
- package/dist/storage/node-data-storage.js +105 -0
- package/dist/storage/node-data-storage.js.map +1 -0
- package/dist/storage/question-store.d.ts +9 -0
- package/dist/storage/question-store.d.ts.map +1 -0
- package/dist/storage/question-store.js +151 -0
- package/dist/storage/question-store.js.map +1 -0
- package/dist/sync-cursor.d.ts +15 -0
- package/dist/sync-cursor.d.ts.map +1 -0
- package/dist/sync-cursor.js +110 -0
- package/dist/sync-cursor.js.map +1 -0
- package/dist/token-store.d.ts +22 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +120 -0
- package/dist/token-store.js.map +1 -0
- package/dist/tunnel/auth.d.ts +4 -0
- package/dist/tunnel/auth.d.ts.map +1 -1
- package/dist/tunnel/auth.js +2 -1
- package/dist/tunnel/auth.js.map +1 -1
- package/dist/tunnel/config.d.ts +1 -0
- package/dist/tunnel/config.d.ts.map +1 -1
- package/dist/tunnel/config.js +1 -1
- package/dist/tunnel/config.js.map +1 -1
- package/dist/tunnel/manager.d.ts +21 -1
- package/dist/tunnel/manager.d.ts.map +1 -1
- package/dist/tunnel/manager.js +78 -23
- package/dist/tunnel/manager.js.map +1 -1
- package/dist/ui/browser_tls_rustls_bg.wasm +0 -0
- package/dist/ui/index.html +2192 -0
- package/dist/ui/ps-lite-debug.d.ts +93 -0
- package/dist/ui/ps-lite-debug.d.ts.map +1 -0
- package/dist/ui/ps-lite-debug.js +135347 -0
- package/dist/ui/ps-lite-debug.js.map +1 -0
- package/package.json +20 -6
- package/dist/middleware/grant-check.d.ts +0 -12
- package/dist/middleware/grant-check.d.ts.map +0 -1
- package/dist/middleware/grant-check.js +0 -90
- package/dist/middleware/grant-check.js.map +0 -1
package/dist/routes/data.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
+
import { type PersonalServerApiDispatchOptions, type PersonalServerReadFulfillmentReporter } from "@opendatalabs/personal-server-ts-core/api";
|
|
2
3
|
import type { HierarchyManagerOptions } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
|
|
3
4
|
import type { IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
|
|
4
|
-
import type { GatewayClient } from "@opendatalabs/
|
|
5
|
+
import type { DataPortabilityGatewayConfig, GatewayClient } from "@opendatalabs/vana-sdk/node";
|
|
5
6
|
import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
|
|
6
|
-
import type { SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
|
|
7
|
+
import type { ScopeDeletionTracker, SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
|
|
8
|
+
import type { DataStoragePort, RuntimeAvailabilityPort } from "@opendatalabs/personal-server-ts-core/ports";
|
|
9
|
+
import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
|
|
10
|
+
import type { TokenStore } from "../token-store.js";
|
|
11
|
+
import type { WriteProofReplayStore, WriteSessionStore } from "@opendatalabs/personal-server-ts-core/write";
|
|
12
|
+
import type { LineageGatewayPort } from "@opendatalabs/personal-server-ts-core/lineage";
|
|
7
13
|
import type { Logger } from "pino";
|
|
8
14
|
export interface DataRouteDeps {
|
|
9
15
|
indexManager: IndexManager;
|
|
@@ -12,9 +18,68 @@ export interface DataRouteDeps {
|
|
|
12
18
|
serverOrigin: string | (() => string);
|
|
13
19
|
serverOwner?: `0x${string}`;
|
|
14
20
|
gateway: GatewayClient;
|
|
21
|
+
/**
|
|
22
|
+
* Required for the X402 flow on GET /v1/data/:scope. Provides the EIP-712
|
|
23
|
+
* domain (escrowPaymentDomain + dataRegistryDomain) the server uses to
|
|
24
|
+
* recover X-PAYMENT signatures and the embedded accessRecord signatures.
|
|
25
|
+
*/
|
|
26
|
+
gatewayConfig?: DataPortabilityGatewayConfig;
|
|
27
|
+
/**
|
|
28
|
+
* Gateway base URL. Used by the X402 forward path — the handler `fetch`es
|
|
29
|
+
* POST /v1/escrow/pay directly so it can inspect the gateway's structured
|
|
30
|
+
* error body (the SDK's gateway.payForOperation discards it).
|
|
31
|
+
*/
|
|
32
|
+
gatewayUrl?: string;
|
|
33
|
+
/**
|
|
34
|
+
* When true, GET /v1/data/:scope enforces the X402 challenge / X-PAYMENT
|
|
35
|
+
* cycle on every read. Off-by-default so dev / test setups don't require
|
|
36
|
+
* builder-side payment signing.
|
|
37
|
+
*/
|
|
38
|
+
paymentEnabled?: boolean;
|
|
15
39
|
accessLogWriter: AccessLogWriter;
|
|
40
|
+
readFulfillmentReporter?: PersonalServerReadFulfillmentReporter;
|
|
16
41
|
syncManager?: SyncManager | null;
|
|
42
|
+
/** Read-side tombstone memory; reads of a deleted scope answer 410. */
|
|
43
|
+
scopeDeletions?: ScopeDeletionTracker;
|
|
17
44
|
devToken?: string;
|
|
45
|
+
accessToken?: string;
|
|
46
|
+
tokenStore?: TokenStore;
|
|
47
|
+
dataStorage?: DataStoragePort;
|
|
48
|
+
runtimeAvailability?: RuntimeAvailabilityPort;
|
|
49
|
+
/**
|
|
50
|
+
* Write API sessions (POST /v1/write/session). When present, the ingest
|
|
51
|
+
* endpoint accepts write-session bearer tokens for delegated builder
|
|
52
|
+
* writes; absent = owner-only ingest, unchanged.
|
|
53
|
+
*/
|
|
54
|
+
writeSessionStore?: WriteSessionStore;
|
|
55
|
+
/** Replay guard for per-write proofs; defaults to in-memory (api-auth). */
|
|
56
|
+
writeProofReplayStore?: WriteProofReplayStore;
|
|
57
|
+
/**
|
|
58
|
+
* Powers the RECORD_DATA_ACCESS attestation embedded in 402 challenges.
|
|
59
|
+
* When supplied alongside serverOwner + paymentEnabled, every challenge
|
|
60
|
+
* carries a server-signed accessRecord. Required for the on-chain
|
|
61
|
+
* recordDataAccess to be scheduled by gateway.settle later.
|
|
62
|
+
*/
|
|
63
|
+
serverSigner?: ServerSigner;
|
|
64
|
+
/**
|
|
65
|
+
* Personal server's own EOA address. Needed by the X402 verifier so it
|
|
66
|
+
* can confirm that the accessRecord echoed back in X-PAYMENT was signed
|
|
67
|
+
* by this server (not forged by a malicious builder).
|
|
68
|
+
*/
|
|
69
|
+
serverAddress?: `0x${string}`;
|
|
70
|
+
/**
|
|
71
|
+
* Gateway access for derivative data: lineage source lookups on write, the
|
|
72
|
+
* signed lineage read and the cascade delete walk. Absent = lineage writes
|
|
73
|
+
* can only cite local scopes; lineage read / cascade answer 503 / 501.
|
|
74
|
+
*/
|
|
75
|
+
lineageGateway?: LineageGatewayPort;
|
|
76
|
+
/** Post-commit write hook (derivative recompute on refresh). */
|
|
77
|
+
onDataWritten?: (event: {
|
|
78
|
+
scope: string;
|
|
79
|
+
collectedAt: string;
|
|
80
|
+
lineageSources?: string[];
|
|
81
|
+
}) => void;
|
|
82
|
+
mountPath?: PersonalServerApiDispatchOptions["basePath"];
|
|
18
83
|
}
|
|
19
84
|
export declare function dataRoutes(deps: DataRouteDeps): Hono;
|
|
20
85
|
//# sourceMappingURL=data.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAEL,KAAK,gCAAgC,EACrC,KAAK,qCAAqC,EAC3C,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EACV,4BAA4B,EAC5B,aAAa,EACd,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EACV,oBAAoB,EACpB,WAAW,EACZ,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQnC,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,4BAA4B,CAAC;IAC7C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,uBAAuB,CAAC,EAAE,qCAAqC,CAAC;IAChE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,uEAAuE;IACvE,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,2EAA2E;IAC3E,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,gEAAgE;IAChE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,KAAK,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,gCAAgC,CAAC,UAAU,CAAC,CAAC;CAC1D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAwDpD"}
|
package/dist/routes/data.js
CHANGED
|
@@ -1,213 +1,53 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
-
import {
|
|
3
|
-
import { createDataFileEnvelope } from "@opendatalabs/personal-server-ts-core/schemas/data-file";
|
|
4
|
-
import { generateCollectedAt, writeDataFile, readDataFile, deleteAllForScope, } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
|
|
2
|
+
import { handlePersonalServerDataRequest, } from "@opendatalabs/personal-server-ts-core/api";
|
|
5
3
|
import { createBodyLimit, DATA_INGEST_MAX_SIZE, } from "../middleware/body-limit.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { createGrantCheckMiddleware } from "../middleware/grant-check.js";
|
|
9
|
-
import { createAccessLogMiddleware } from "../middleware/access-log.js";
|
|
10
|
-
import { createOwnerCheckMiddleware } from "../middleware/owner-check.js";
|
|
4
|
+
import { createNodeDataStorage } from "../storage/node-data-storage.js";
|
|
5
|
+
import { createServerApiAuth } from "../api-auth.js";
|
|
11
6
|
export function dataRoutes(deps) {
|
|
12
7
|
const app = new Hono();
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
const dataStorage = deps.dataStorage ??
|
|
9
|
+
createNodeDataStorage({
|
|
10
|
+
indexManager: deps.indexManager,
|
|
11
|
+
hierarchyOptions: deps.hierarchyOptions,
|
|
12
|
+
});
|
|
13
|
+
const auth = createServerApiAuth({
|
|
15
14
|
serverOrigin: deps.serverOrigin,
|
|
16
|
-
devToken: deps.devToken,
|
|
17
15
|
serverOwner: deps.serverOwner,
|
|
18
|
-
});
|
|
19
|
-
const builderCheck = createBuilderCheckMiddleware(deps.gateway);
|
|
20
|
-
const grantCheck = createGrantCheckMiddleware({
|
|
21
16
|
gateway: deps.gateway,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const scopeResult = ScopeSchema.safeParse(scopeParam);
|
|
30
|
-
if (!scopeResult.success) {
|
|
31
|
-
return c.json({
|
|
32
|
-
error: "INVALID_SCOPE",
|
|
33
|
-
message: scopeResult.error.issues[0].message,
|
|
34
|
-
}, 400);
|
|
35
|
-
}
|
|
36
|
-
const scope = scopeResult.data;
|
|
37
|
-
// 2. Parse pagination
|
|
38
|
-
const limit = c.req.query("limit")
|
|
39
|
-
? parseInt(c.req.query("limit"), 10)
|
|
40
|
-
: 20;
|
|
41
|
-
const offset = c.req.query("offset")
|
|
42
|
-
? parseInt(c.req.query("offset"), 10)
|
|
43
|
-
: 0;
|
|
44
|
-
// 3. Query index
|
|
45
|
-
const entries = deps.indexManager.findByScope({ scope, limit, offset });
|
|
46
|
-
const total = deps.indexManager.countByScope(scope);
|
|
47
|
-
// 4. Return response
|
|
48
|
-
return c.json({
|
|
49
|
-
scope,
|
|
50
|
-
versions: entries.map((e) => ({
|
|
51
|
-
fileId: e.fileId,
|
|
52
|
-
collectedAt: e.collectedAt,
|
|
53
|
-
})),
|
|
54
|
-
total,
|
|
55
|
-
limit,
|
|
56
|
-
offset,
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
// GET /v1/data — list distinct scopes (requires auth + builder, no grant)
|
|
60
|
-
app.get("/", web3Auth, builderCheck, async (c) => {
|
|
61
|
-
const scopePrefix = c.req.query("scopePrefix");
|
|
62
|
-
const limit = c.req.query("limit")
|
|
63
|
-
? parseInt(c.req.query("limit"), 10)
|
|
64
|
-
: 20;
|
|
65
|
-
const offset = c.req.query("offset")
|
|
66
|
-
? parseInt(c.req.query("offset"), 10)
|
|
67
|
-
: 0;
|
|
68
|
-
const result = deps.indexManager.listDistinctScopes({
|
|
69
|
-
scopePrefix: scopePrefix || undefined,
|
|
70
|
-
limit,
|
|
71
|
-
offset,
|
|
72
|
-
});
|
|
73
|
-
return c.json({
|
|
74
|
-
scopes: result.scopes,
|
|
75
|
-
total: result.total,
|
|
76
|
-
limit,
|
|
77
|
-
offset,
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
// GET /v1/data/:scope — read a data file (requires auth + grant)
|
|
81
|
-
app.get("/:scope", web3Auth, builderCheck, grantCheck, accessLog, async (c) => {
|
|
82
|
-
// 1. Validate scope
|
|
83
|
-
const scopeParam = c.req.param("scope");
|
|
84
|
-
const scopeResult = ScopeSchema.safeParse(scopeParam);
|
|
85
|
-
if (!scopeResult.success) {
|
|
86
|
-
return c.json({
|
|
87
|
-
error: "INVALID_SCOPE",
|
|
88
|
-
message: scopeResult.error.issues[0].message,
|
|
89
|
-
}, 400);
|
|
90
|
-
}
|
|
91
|
-
const scope = scopeResult.data;
|
|
92
|
-
// 2. Determine lookup strategy: fileId, at, or latest
|
|
93
|
-
const fileIdParam = c.req.query("fileId");
|
|
94
|
-
const atParam = c.req.query("at");
|
|
95
|
-
let entry;
|
|
96
|
-
if (fileIdParam) {
|
|
97
|
-
entry = deps.indexManager.findByFileId(fileIdParam);
|
|
98
|
-
}
|
|
99
|
-
else if (atParam) {
|
|
100
|
-
entry = deps.indexManager.findClosestByScope(scope, atParam);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
entry = deps.indexManager.findLatestByScope(scope);
|
|
104
|
-
}
|
|
105
|
-
// 3. 404 if not found
|
|
106
|
-
if (!entry) {
|
|
107
|
-
return c.json({
|
|
108
|
-
error: "NOT_FOUND",
|
|
109
|
-
message: `No data found for scope "${scope}"`,
|
|
110
|
-
}, 404);
|
|
111
|
-
}
|
|
112
|
-
// 4. Read the data file from disk
|
|
113
|
-
const envelope = await readDataFile(deps.hierarchyOptions, scope, entry.collectedAt);
|
|
114
|
-
// 5. Return 200 with envelope
|
|
115
|
-
return c.json(envelope);
|
|
17
|
+
devToken: deps.devToken,
|
|
18
|
+
accessToken: deps.accessToken,
|
|
19
|
+
tokenStore: deps.tokenStore,
|
|
20
|
+
dataStorage,
|
|
21
|
+
runtimeAvailability: deps.runtimeAvailability,
|
|
22
|
+
writeSessionStore: deps.writeSessionStore,
|
|
23
|
+
writeProofReplayStore: deps.writeProofReplayStore,
|
|
116
24
|
});
|
|
117
25
|
app.use("/:scope", createBodyLimit(DATA_INGEST_MAX_SIZE));
|
|
118
|
-
app.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
message: "Request body must be a JSON object",
|
|
144
|
-
}, 400);
|
|
145
|
-
}
|
|
146
|
-
// 3. Look up schema via Gateway (strict: reject if not found)
|
|
147
|
-
let schemaUrl;
|
|
148
|
-
try {
|
|
149
|
-
const schema = await deps.gateway.getSchemaForScope(scope);
|
|
150
|
-
if (!schema) {
|
|
151
|
-
return c.json({
|
|
152
|
-
error: "NO_SCHEMA",
|
|
153
|
-
message: `No schema registered for scope: ${scope}`,
|
|
154
|
-
}, 400);
|
|
155
|
-
}
|
|
156
|
-
schemaUrl = schema.definitionUrl;
|
|
157
|
-
}
|
|
158
|
-
catch (err) {
|
|
159
|
-
deps.logger.error({ err, scope }, "Gateway schema lookup failed");
|
|
160
|
-
return c.json({
|
|
161
|
-
error: "GATEWAY_ERROR",
|
|
162
|
-
message: "Failed to look up schema for scope",
|
|
163
|
-
}, 502);
|
|
164
|
-
}
|
|
165
|
-
// 4. Generate collectedAt
|
|
166
|
-
const collectedAt = generateCollectedAt();
|
|
167
|
-
// 5. Construct envelope
|
|
168
|
-
const envelope = createDataFileEnvelope(scope, collectedAt, body, schemaUrl);
|
|
169
|
-
// 6. Write atomically
|
|
170
|
-
const writeResult = await writeDataFile(deps.hierarchyOptions, envelope);
|
|
171
|
-
// 7. Insert into index
|
|
172
|
-
deps.indexManager.insert({
|
|
173
|
-
fileId: null,
|
|
174
|
-
path: writeResult.relativePath,
|
|
175
|
-
scope,
|
|
176
|
-
collectedAt,
|
|
177
|
-
sizeBytes: writeResult.sizeBytes,
|
|
178
|
-
});
|
|
179
|
-
deps.logger.info({ scope, collectedAt, path: writeResult.relativePath }, "Data file ingested");
|
|
180
|
-
// 8. Notify sync manager of new data (if enabled)
|
|
181
|
-
let status = "stored";
|
|
182
|
-
if (deps.syncManager) {
|
|
183
|
-
deps.syncManager.notifyNewData();
|
|
184
|
-
status = "syncing";
|
|
185
|
-
}
|
|
186
|
-
// 9. Return 201
|
|
187
|
-
return c.json({ scope, collectedAt, status }, 201);
|
|
188
|
-
});
|
|
189
|
-
// Owner-check middleware (web3-auth + owner-check)
|
|
190
|
-
const ownerCheck = createOwnerCheckMiddleware(deps.serverOwner);
|
|
191
|
-
// DELETE /v1/data/:scope — delete all versions for a scope (owner auth required)
|
|
192
|
-
app.delete("/:scope", web3Auth, ownerCheck, async (c) => {
|
|
193
|
-
// 1. Validate scope
|
|
194
|
-
const scopeParam = c.req.param("scope");
|
|
195
|
-
const scopeResult = ScopeSchema.safeParse(scopeParam);
|
|
196
|
-
if (!scopeResult.success) {
|
|
197
|
-
return c.json({
|
|
198
|
-
error: "INVALID_SCOPE",
|
|
199
|
-
message: scopeResult.error.issues[0].message,
|
|
200
|
-
}, 400);
|
|
201
|
-
}
|
|
202
|
-
const scope = scopeResult.data;
|
|
203
|
-
// 2. Delete from index
|
|
204
|
-
const deletedCount = deps.indexManager.deleteByScope(scope);
|
|
205
|
-
// 3. Delete from filesystem
|
|
206
|
-
await deleteAllForScope(deps.hierarchyOptions, scope);
|
|
207
|
-
deps.logger.info({ scope, deletedCount }, "Scope deleted");
|
|
208
|
-
// 4. Return 204
|
|
209
|
-
return c.body(null, 204);
|
|
210
|
-
});
|
|
26
|
+
app.all("*", (c) => handlePersonalServerDataRequest(c.req.raw, {
|
|
27
|
+
storage: dataStorage,
|
|
28
|
+
auth,
|
|
29
|
+
accessLogWriter: deps.accessLogWriter,
|
|
30
|
+
readFulfillmentReporter: deps.readFulfillmentReporter,
|
|
31
|
+
syncManager: deps.syncManager ?? null,
|
|
32
|
+
scopeDeletions: deps.scopeDeletions,
|
|
33
|
+
runtimeAvailability: deps.runtimeAvailability,
|
|
34
|
+
serverSigner: deps.serverSigner,
|
|
35
|
+
serverOwner: deps.serverOwner,
|
|
36
|
+
serverAddress: deps.serverAddress,
|
|
37
|
+
gateway: deps.gateway,
|
|
38
|
+
gatewayConfig: deps.gatewayConfig,
|
|
39
|
+
gatewayUrl: deps.gatewayUrl,
|
|
40
|
+
paymentEnabled: deps.paymentEnabled,
|
|
41
|
+
lineageGateway: deps.lineageGateway,
|
|
42
|
+
onDataWritten: deps.onDataWritten,
|
|
43
|
+
// Network identifier for the 402 challenge body. We use the chain
|
|
44
|
+
// id as the convention since the gateway is chain-scoped; clients
|
|
45
|
+
// dispatch on the (scheme, chainId) pair, not the human name.
|
|
46
|
+
network: deps.gatewayConfig
|
|
47
|
+
? `vana:${deps.gatewayConfig.chainId}`
|
|
48
|
+
: undefined,
|
|
49
|
+
logger: deps.logger,
|
|
50
|
+
}, { basePath: deps.mountPath }));
|
|
211
51
|
return app;
|
|
212
52
|
}
|
|
213
53
|
//# sourceMappingURL=data.js.map
|
package/dist/routes/data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,+BAA+B,GAGhC,MAAM,2CAA2C,CAAC;AAwBnD,OAAO,EACL,eAAe,EACf,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAyErD,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,MAAM,WAAW,GACf,IAAI,CAAC,WAAW;QAChB,qBAAqB,CAAC;YACpB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC,CAAC;IACL,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW;QACX,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;KAClD,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC1D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,+BAA+B,CAC7B,CAAC,CAAC,GAAG,CAAC,GAAG,EACT;QACE,OAAO,EAAE,WAAW;QACpB,IAAI;QACJ,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;QACrD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;QACrC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,kEAAkE;QAClE,kEAAkE;QAClE,8DAA8D;QAC9D,OAAO,EAAE,IAAI,CAAC,aAAa;YACzB,CAAC,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;YACtC,CAAC,CAAC,SAAS;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAC7B,CACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derivative compute routes: /v1/derivatives/questions. Thin Hono wrapper
|
|
3
|
+
* over the runtime-agnostic core handler; builder auth is the Write API's
|
|
4
|
+
* (write-session token + signed proof), owner auth is the usual owner gate.
|
|
5
|
+
*/
|
|
6
|
+
import { Hono } from "hono";
|
|
7
|
+
import type { Logger } from "pino";
|
|
8
|
+
import type { GatewayClient } from "@opendatalabs/vana-sdk/node";
|
|
9
|
+
import { type PersonalServerDerivativesApiDeps } from "@opendatalabs/personal-server-ts-core/derivatives";
|
|
10
|
+
import type { PersonalServerApiDispatchOptions } from "@opendatalabs/personal-server-ts-core/api";
|
|
11
|
+
import type { DataStoragePort, RuntimeAvailabilityPort } from "@opendatalabs/personal-server-ts-core/ports";
|
|
12
|
+
import type { WriteProofReplayStore, WriteSessionStore } from "@opendatalabs/personal-server-ts-core/write";
|
|
13
|
+
import type { TokenStore } from "../token-store.js";
|
|
14
|
+
export interface DerivativesRouteDeps {
|
|
15
|
+
logger: Logger;
|
|
16
|
+
serverOrigin: string | (() => string);
|
|
17
|
+
serverOwner?: `0x${string}`;
|
|
18
|
+
gateway: GatewayClient;
|
|
19
|
+
devToken?: string;
|
|
20
|
+
accessToken?: string;
|
|
21
|
+
tokenStore?: TokenStore;
|
|
22
|
+
dataStorage?: DataStoragePort;
|
|
23
|
+
runtimeAvailability?: RuntimeAvailabilityPort;
|
|
24
|
+
/** Shared with the data routes so builder tokens work on both. */
|
|
25
|
+
writeSessionStore?: WriteSessionStore;
|
|
26
|
+
writeProofReplayStore?: WriteProofReplayStore;
|
|
27
|
+
/** The compute layer (store + scheduler). Absent = every route answers 503. */
|
|
28
|
+
compute?: PersonalServerDerivativesApiDeps["compute"];
|
|
29
|
+
now?: () => Date;
|
|
30
|
+
mountPath?: PersonalServerApiDispatchOptions["basePath"];
|
|
31
|
+
}
|
|
32
|
+
export declare function derivativesRoutes(deps: DerivativesRouteDeps): Hono;
|
|
33
|
+
//# sourceMappingURL=derivatives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivatives.d.ts","sourceRoot":"","sources":["../../src/routes/derivatives.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAGL,KAAK,gCAAgC,EACtC,MAAM,mDAAmD,CAAC;AAC3D,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAC;AAClG,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,+EAA+E;IAC/E,OAAO,CAAC,EAAE,gCAAgC,CAAC,SAAS,CAAC,CAAC;IACtD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,gCAAgC,CAAC,UAAU,CAAC,CAAC;CAC1D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CA6BlE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derivative compute routes: /v1/derivatives/questions. Thin Hono wrapper
|
|
3
|
+
* over the runtime-agnostic core handler; builder auth is the Write API's
|
|
4
|
+
* (write-session token + signed proof), owner auth is the usual owner gate.
|
|
5
|
+
*/
|
|
6
|
+
import { Hono } from "hono";
|
|
7
|
+
import { handlePersonalServerDerivativesRequest, MAX_QUESTION_BODY_BYTES, } from "@opendatalabs/personal-server-ts-core/derivatives";
|
|
8
|
+
import { createBodyLimit } from "../middleware/body-limit.js";
|
|
9
|
+
import { createServerApiAuth } from "../api-auth.js";
|
|
10
|
+
export function derivativesRoutes(deps) {
|
|
11
|
+
const app = new Hono();
|
|
12
|
+
const auth = createServerApiAuth({
|
|
13
|
+
serverOrigin: deps.serverOrigin,
|
|
14
|
+
serverOwner: deps.serverOwner,
|
|
15
|
+
gateway: deps.gateway,
|
|
16
|
+
devToken: deps.devToken,
|
|
17
|
+
accessToken: deps.accessToken,
|
|
18
|
+
tokenStore: deps.tokenStore,
|
|
19
|
+
dataStorage: deps.dataStorage,
|
|
20
|
+
runtimeAvailability: deps.runtimeAvailability,
|
|
21
|
+
writeSessionStore: deps.writeSessionStore,
|
|
22
|
+
writeProofReplayStore: deps.writeProofReplayStore,
|
|
23
|
+
});
|
|
24
|
+
app.use("*", createBodyLimit(MAX_QUESTION_BODY_BYTES));
|
|
25
|
+
app.all("*", (c) => handlePersonalServerDerivativesRequest(c.req.raw, {
|
|
26
|
+
auth,
|
|
27
|
+
compute: deps.compute ?? null,
|
|
28
|
+
now: deps.now,
|
|
29
|
+
logger: deps.logger,
|
|
30
|
+
}, { basePath: deps.mountPath }));
|
|
31
|
+
return app;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=derivatives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivatives.js","sourceRoot":"","sources":["../../src/routes/derivatives.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EACL,sCAAsC,EACtC,uBAAuB,GAExB,MAAM,mDAAmD,CAAC;AAW3D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAqBrD,MAAM,UAAU,iBAAiB,CAAC,IAA0B;IAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;KAClD,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACvD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,sCAAsC,CACpC,CAAC,CAAC,GAAG,CAAC,GAAG,EACT;QACE,IAAI;QACJ,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAC7B,CACF,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { type JobRequestEnvelope } from "@opendatalabs/vana-sdk/protocol/jobs";
|
|
3
|
+
import type { JobExecuteResponse } from "../jobs/types.js";
|
|
4
|
+
export interface EnclaveJobRouteDeps {
|
|
5
|
+
accessToken: string;
|
|
6
|
+
executeJob(envelope: JobRequestEnvelope): Promise<JobExecuteResponse>;
|
|
7
|
+
}
|
|
8
|
+
export declare function enclaveJobRoutes(deps: EnclaveJobRouteDeps): Hono;
|
|
9
|
+
//# sourceMappingURL=enclave-jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enclave-jobs.d.ts","sourceRoot":"","sources":["../../src/routes/enclave-jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAM1B,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACvE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CA0ChE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { isAddress, isHex } from "viem";
|
|
4
|
+
import { JOB_OPERATIONS, JOB_PROTOCOL_VERSION, } from "@opendatalabs/vana-sdk/protocol/jobs";
|
|
5
|
+
import { createBodyLimit } from "../middleware/body-limit.js";
|
|
6
|
+
import { JobFailure } from "../jobs/worker.js";
|
|
7
|
+
const MAX_JOB_BODY_BYTES = 256 * 1024;
|
|
8
|
+
const BEARER_PREFIX = "Bearer ";
|
|
9
|
+
export function enclaveJobRoutes(deps) {
|
|
10
|
+
const app = new Hono();
|
|
11
|
+
app.use("/execute", createBodyLimit(MAX_JOB_BODY_BYTES));
|
|
12
|
+
app.post("/execute", async (context) => {
|
|
13
|
+
if (!hasValidBearer(context.req.header("authorization"), deps.accessToken)) {
|
|
14
|
+
return context.json(jobError("AUTH_INVALID", "invalid bearer token"), 401);
|
|
15
|
+
}
|
|
16
|
+
let body;
|
|
17
|
+
try {
|
|
18
|
+
body = await context.req.json();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return context.json({ error: { message: "invalid request body" } }, 400);
|
|
22
|
+
}
|
|
23
|
+
if (!isJobEnvelope(body)) {
|
|
24
|
+
return context.json({ error: { message: "invalid request body" } }, 400);
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
return context.json(await deps.executeJob(body), 200);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error instanceof JobFailure) {
|
|
31
|
+
return context.json(jobError(error.code, error.message, error.retryable), statusFor(error.code));
|
|
32
|
+
}
|
|
33
|
+
return context.json(jobError("INTERNAL", "job execution failed", true), 500);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
return app;
|
|
37
|
+
}
|
|
38
|
+
function hasValidBearer(header, expected) {
|
|
39
|
+
if (!header?.startsWith(BEARER_PREFIX)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const received = Buffer.from(header.slice(BEARER_PREFIX.length));
|
|
43
|
+
const target = Buffer.from(expected);
|
|
44
|
+
if (received.length !== target.length) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return timingSafeEqual(received, target);
|
|
48
|
+
}
|
|
49
|
+
function isJobEnvelope(value) {
|
|
50
|
+
if (!isRecord(value) || !isRecord(value.request)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
const request = value.request;
|
|
54
|
+
return (value.auth !== "" &&
|
|
55
|
+
typeof value.auth === "string" &&
|
|
56
|
+
request.v === JOB_PROTOCOL_VERSION &&
|
|
57
|
+
typeof request.jobId === "string" &&
|
|
58
|
+
isAddressValue(request.owner) &&
|
|
59
|
+
isAddressValue(request.builder) &&
|
|
60
|
+
isHexValue(request.builderPublicKey) &&
|
|
61
|
+
isHexValue(request.grantId) &&
|
|
62
|
+
typeof request.scope === "string" &&
|
|
63
|
+
JOB_OPERATIONS.some((operation) => operation === request.operation) &&
|
|
64
|
+
(request.pinnedVersion === null ||
|
|
65
|
+
typeof request.pinnedVersion === "string") &&
|
|
66
|
+
typeof request.deadline === "string");
|
|
67
|
+
}
|
|
68
|
+
function isAddressValue(value) {
|
|
69
|
+
return typeof value === "string" && isAddress(value);
|
|
70
|
+
}
|
|
71
|
+
function isHexValue(value) {
|
|
72
|
+
return typeof value === "string" && isHex(value);
|
|
73
|
+
}
|
|
74
|
+
function isRecord(value) {
|
|
75
|
+
return typeof value === "object" && value !== null;
|
|
76
|
+
}
|
|
77
|
+
function jobError(code, message, retryable = false) {
|
|
78
|
+
return { error: { code, message, retryable } };
|
|
79
|
+
}
|
|
80
|
+
function statusFor(code) {
|
|
81
|
+
switch (code) {
|
|
82
|
+
case "AUTH_INVALID":
|
|
83
|
+
return 401;
|
|
84
|
+
case "BUILDER_MISMATCH":
|
|
85
|
+
case "OWNER_MISMATCH":
|
|
86
|
+
case "GRANT_REVOKED":
|
|
87
|
+
case "GRANT_INVALID":
|
|
88
|
+
case "SIGNED_ARTIFACT_MISSING":
|
|
89
|
+
case "SIGNED_ARTIFACT_INVALID":
|
|
90
|
+
case "SERVER_NOT_REGISTERED":
|
|
91
|
+
return 403;
|
|
92
|
+
case "SCOPE_NOT_FOUND":
|
|
93
|
+
return 404;
|
|
94
|
+
case "VERSION_MISMATCH":
|
|
95
|
+
return 409;
|
|
96
|
+
case "DEADLINE_PASSED":
|
|
97
|
+
return 410;
|
|
98
|
+
case "RESULT_TOO_LARGE":
|
|
99
|
+
return 413;
|
|
100
|
+
case "INTERNAL":
|
|
101
|
+
return 500;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=enclave-jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enclave-jobs.js","sourceRoot":"","sources":["../../src/routes/enclave-jobs.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/grants.d.ts
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Grants routes — GET / (owner), POST / (create grant),
|
|
2
|
+
* Grants routes — GET / (owner), POST / (create grant), DELETE /:grantId
|
|
3
|
+
* (revoke grant), POST /verify (public).
|
|
3
4
|
*/
|
|
4
5
|
import { Hono } from "hono";
|
|
5
6
|
import type { Logger } from "pino";
|
|
6
|
-
import type { GatewayClient } from "@opendatalabs/
|
|
7
|
+
import type { DataPortabilityGatewayConfig, GatewayClient } from "@opendatalabs/vana-sdk/node";
|
|
8
|
+
import { type PersonalServerApiDispatchOptions } from "@opendatalabs/personal-server-ts-core/api";
|
|
7
9
|
import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
|
|
10
|
+
import type { TokenStore } from "../token-store.js";
|
|
8
11
|
export interface GrantsRouteDeps {
|
|
9
12
|
logger: Logger;
|
|
10
13
|
gateway: GatewayClient;
|
|
14
|
+
gatewayConfig?: DataPortabilityGatewayConfig;
|
|
11
15
|
serverOwner?: `0x${string}`;
|
|
12
16
|
serverOrigin: string | (() => string);
|
|
13
17
|
devToken?: string;
|
|
18
|
+
accessToken?: string;
|
|
19
|
+
tokenStore?: TokenStore;
|
|
14
20
|
serverSigner?: ServerSigner;
|
|
21
|
+
mountPath?: PersonalServerApiDispatchOptions["basePath"];
|
|
15
22
|
}
|
|
16
23
|
export declare function grantsRoutes(deps: GrantsRouteDeps): Hono;
|
|
17
24
|
//# sourceMappingURL=grants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/routes/grants.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/routes/grants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EACV,4BAA4B,EAC5B,aAAa,EACd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,4BAA4B,CAAC;IAC7C,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,SAAS,CAAC,EAAE,gCAAgC,CAAC,UAAU,CAAC,CAAC;CAC1D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CA8BxD"}
|