@opendatalabs/personal-server-ts-core 0.2.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +160 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +774 -0
- package/dist/api/index.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/request.d.ts +28 -0
- package/dist/auth/request.d.ts.map +1 -0
- package/dist/auth/request.js +106 -0
- package/dist/auth/request.js.map +1 -0
- package/dist/client.d.ts +233 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +243 -0
- package/dist/client.js.map +1 -0
- package/dist/config/defaults.d.ts +5 -5
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +3 -5
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +0 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +0 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +1 -9
- package/dist/config/paths.js.map +1 -1
- package/dist/contracts/access-logs.d.ts +8 -0
- package/dist/contracts/access-logs.d.ts.map +1 -0
- package/dist/contracts/access-logs.js +7 -0
- package/dist/contracts/access-logs.js.map +1 -0
- package/dist/contracts/auth-device.d.ts +70 -0
- package/dist/contracts/auth-device.d.ts.map +1 -0
- package/dist/contracts/auth-device.js +163 -0
- package/dist/contracts/auth-device.js.map +1 -0
- package/dist/contracts/binary.d.ts +54 -0
- package/dist/contracts/binary.d.ts.map +1 -0
- package/dist/contracts/binary.js +92 -0
- package/dist/contracts/binary.js.map +1 -0
- package/dist/contracts/config.d.ts +5 -0
- package/dist/contracts/config.d.ts.map +1 -0
- package/dist/contracts/config.js +30 -0
- package/dist/contracts/config.js.map +1 -0
- package/dist/contracts/data.d.ts +115 -0
- package/dist/contracts/data.d.ts.map +1 -0
- package/dist/contracts/data.js +237 -0
- package/dist/contracts/data.js.map +1 -0
- package/dist/contracts/grants.d.ts +45 -0
- package/dist/contracts/grants.d.ts.map +1 -0
- package/dist/contracts/grants.js +177 -0
- package/dist/contracts/grants.js.map +1 -0
- package/dist/contracts/http.d.ts +21 -0
- package/dist/contracts/http.d.ts.map +1 -0
- package/dist/contracts/http.js +49 -0
- package/dist/contracts/http.js.map +1 -0
- package/dist/contracts/index.d.ts +16 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +10 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/oauth.d.ts +38 -0
- package/dist/contracts/oauth.d.ts.map +1 -0
- package/dist/contracts/oauth.js +130 -0
- package/dist/contracts/oauth.js.map +1 -0
- package/dist/contracts/sync.d.ts +10 -0
- package/dist/contracts/sync.d.ts.map +1 -0
- package/dist/contracts/sync.js +34 -0
- package/dist/contracts/sync.js.map +1 -0
- package/dist/errors/catalog.d.ts +9 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/catalog.js +15 -0
- package/dist/errors/catalog.js.map +1 -1
- package/dist/grants/index.d.ts +2 -4
- package/dist/grants/index.d.ts.map +1 -1
- package/dist/grants/index.js +1 -2
- package/dist/grants/index.js.map +1 -1
- package/dist/keys/index.d.ts +1 -2
- package/dist/keys/index.d.ts.map +1 -1
- package/dist/keys/index.js +1 -2
- package/dist/keys/index.js.map +1 -1
- package/dist/keys/server-account.d.ts +5 -9
- package/dist/keys/server-account.d.ts.map +1 -1
- package/dist/keys/server-account.js +1 -47
- package/dist/keys/server-account.js.map +1 -1
- package/dist/logger/index.d.ts +6 -2
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +2 -6
- package/dist/logger/index.js.map +1 -1
- package/dist/logging/access-log.d.ts +0 -1
- package/dist/logging/access-log.d.ts.map +1 -1
- package/dist/logging/access-log.js +1 -24
- package/dist/logging/access-log.js.map +1 -1
- package/dist/logging/access-reader.d.ts +0 -5
- package/dist/logging/access-reader.d.ts.map +1 -1
- package/dist/logging/access-reader.js +1 -49
- package/dist/logging/access-reader.js.map +1 -1
- package/dist/mcp/activity.d.ts +68 -0
- package/dist/mcp/activity.d.ts.map +1 -0
- package/dist/mcp/activity.js +111 -0
- package/dist/mcp/activity.js.map +1 -0
- package/dist/mcp/builder-registration.d.ts +24 -0
- package/dist/mcp/builder-registration.d.ts.map +1 -0
- package/dist/mcp/builder-registration.js +89 -0
- package/dist/mcp/builder-registration.js.map +1 -0
- package/dist/mcp/connection-api.d.ts +170 -0
- package/dist/mcp/connection-api.d.ts.map +1 -0
- package/dist/mcp/connection-api.js +379 -0
- package/dist/mcp/connection-api.js.map +1 -0
- package/dist/mcp/grantee.d.ts +52 -0
- package/dist/mcp/grantee.d.ts.map +1 -0
- package/dist/mcp/grantee.js +91 -0
- package/dist/mcp/grantee.js.map +1 -0
- package/dist/mcp/index.d.ts +10 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +10 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/read-client.d.ts +136 -0
- package/dist/mcp/read-client.d.ts.map +1 -0
- package/dist/mcp/read-client.js +306 -0
- package/dist/mcp/read-client.js.map +1 -0
- package/dist/mcp/resources.d.ts +37 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +114 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/search/index.d.ts +34 -0
- package/dist/mcp/search/index.d.ts.map +1 -0
- package/dist/mcp/search/index.js +69 -0
- package/dist/mcp/search/index.js.map +1 -0
- package/dist/mcp/server.d.ts +53 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +308 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/store.d.ts +13 -0
- package/dist/mcp/store.d.ts.map +1 -0
- package/dist/mcp/store.js +98 -0
- package/dist/mcp/store.js.map +1 -0
- package/dist/mcp/tools.d.ts +60 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +1058 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +97 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +24 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/payment/index.d.ts +2 -0
- package/dist/payment/index.d.ts.map +1 -0
- package/dist/payment/index.js +2 -0
- package/dist/payment/index.js.map +1 -0
- package/dist/payment/x402.d.ts +155 -0
- package/dist/payment/x402.d.ts.map +1 -0
- package/dist/payment/x402.js +402 -0
- package/dist/payment/x402.js.map +1 -0
- package/dist/policy/data-read.d.ts +15 -0
- package/dist/policy/data-read.d.ts.map +1 -0
- package/dist/policy/data-read.js +84 -0
- package/dist/policy/data-read.js.map +1 -0
- package/dist/policy/index.d.ts +2 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +2 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/ports/index.d.ts +95 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +7 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/schemas/server-config.d.ts +12 -0
- package/dist/schemas/server-config.d.ts.map +1 -1
- package/dist/schemas/server-config.js +34 -4
- package/dist/schemas/server-config.js.map +1 -1
- package/dist/signing/index.d.ts +0 -1
- package/dist/signing/index.d.ts.map +1 -1
- package/dist/signing/index.js +0 -1
- package/dist/signing/index.js.map +1 -1
- package/dist/signing/request-signer.d.ts +8 -2
- package/dist/signing/request-signer.d.ts.map +1 -1
- package/dist/signing/request-signer.js +5 -31
- package/dist/signing/request-signer.js.map +1 -1
- package/dist/signing/signer.d.ts +20 -2
- package/dist/signing/signer.d.ts.map +1 -1
- package/dist/signing/signer.js +23 -13
- package/dist/signing/signer.js.map +1 -1
- package/dist/storage/adapters/index.d.ts +2 -1
- package/dist/storage/adapters/index.d.ts.map +1 -1
- package/dist/storage/adapters/index.js +2 -1
- package/dist/storage/adapters/index.js.map +1 -1
- package/dist/storage/adapters/interface.d.ts +10 -0
- package/dist/storage/adapters/interface.d.ts.map +1 -1
- package/dist/storage/adapters/sdk.d.ts +23 -0
- package/dist/storage/adapters/sdk.d.ts.map +1 -0
- package/dist/storage/adapters/sdk.js +73 -0
- package/dist/storage/adapters/sdk.js.map +1 -0
- package/dist/storage/adapters/vana.d.ts +7 -30
- package/dist/storage/adapters/vana.d.ts.map +1 -1
- package/dist/storage/adapters/vana.js +37 -92
- package/dist/storage/adapters/vana.js.map +1 -1
- package/dist/storage/blocks/build.d.ts +20 -0
- package/dist/storage/blocks/build.d.ts.map +1 -0
- package/dist/storage/blocks/build.js +378 -0
- package/dist/storage/blocks/build.js.map +1 -0
- package/dist/storage/blocks/cursor.d.ts +33 -0
- package/dist/storage/blocks/cursor.d.ts.map +1 -0
- package/dist/storage/blocks/cursor.js +142 -0
- package/dist/storage/blocks/cursor.js.map +1 -0
- package/dist/storage/blocks/errors.d.ts +6 -0
- package/dist/storage/blocks/errors.d.ts.map +1 -0
- package/dist/storage/blocks/errors.js +9 -0
- package/dist/storage/blocks/errors.js.map +1 -0
- package/dist/storage/blocks/index.d.ts +5 -0
- package/dist/storage/blocks/index.d.ts.map +1 -0
- package/dist/storage/blocks/index.js +4 -0
- package/dist/storage/blocks/index.js.map +1 -0
- package/dist/storage/blocks/types.d.ts +49 -0
- package/dist/storage/blocks/types.d.ts.map +1 -0
- package/dist/storage/blocks/types.js +2 -0
- package/dist/{grants → storage/blocks}/types.js.map +1 -1
- package/dist/storage/hierarchy/index.d.ts +0 -1
- package/dist/storage/hierarchy/index.d.ts.map +1 -1
- package/dist/storage/hierarchy/index.js +0 -1
- package/dist/storage/hierarchy/index.js.map +1 -1
- package/dist/storage/hierarchy/manager.d.ts +0 -14
- package/dist/storage/hierarchy/manager.d.ts.map +1 -1
- package/dist/storage/hierarchy/manager.js +1 -59
- package/dist/storage/hierarchy/manager.js.map +1 -1
- package/dist/storage/hierarchy/paths.d.ts.map +1 -1
- package/dist/storage/hierarchy/paths.js +11 -4
- package/dist/storage/hierarchy/paths.js.map +1 -1
- package/dist/storage/index/index.d.ts +2 -3
- package/dist/storage/index/index.d.ts.map +1 -1
- package/dist/storage/index/index.js +1 -2
- package/dist/storage/index/index.js.map +1 -1
- package/dist/storage/index/manager.d.ts +26 -6
- package/dist/storage/index/manager.d.ts.map +1 -1
- package/dist/storage/index/manager.js +1 -131
- package/dist/storage/index/manager.js.map +1 -1
- package/dist/storage/index/schema.d.ts +1 -3
- package/dist/storage/index/schema.d.ts.map +1 -1
- package/dist/storage/index/schema.js +1 -26
- package/dist/storage/index/schema.js.map +1 -1
- package/dist/storage/index/types.d.ts +16 -0
- package/dist/storage/index/types.d.ts.map +1 -1
- package/dist/storage/preview.d.ts +12 -0
- package/dist/storage/preview.d.ts.map +1 -0
- package/dist/storage/preview.js +239 -0
- package/dist/storage/preview.js.map +1 -0
- package/dist/sync/cursor.d.ts +5 -7
- package/dist/sync/cursor.d.ts.map +1 -1
- package/dist/sync/cursor.js +1 -18
- package/dist/sync/cursor.js.map +1 -1
- package/dist/sync/engine/sync-manager.d.ts +17 -0
- package/dist/sync/engine/sync-manager.d.ts.map +1 -1
- package/dist/sync/engine/sync-manager.js +104 -43
- package/dist/sync/engine/sync-manager.js.map +1 -1
- package/dist/sync/index.d.ts +4 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/issues.d.ts +55 -0
- package/dist/sync/issues.d.ts.map +1 -0
- package/dist/sync/issues.js +168 -0
- package/dist/sync/issues.js.map +1 -0
- package/dist/sync/retry-memory.d.ts +33 -0
- package/dist/sync/retry-memory.d.ts.map +1 -0
- package/dist/sync/retry-memory.js +68 -0
- package/dist/sync/retry-memory.js.map +1 -0
- package/dist/sync/types.d.ts +9 -24
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/sync/workers/delete.d.ts +42 -0
- package/dist/sync/workers/delete.d.ts.map +1 -0
- package/dist/sync/workers/delete.js +40 -0
- package/dist/sync/workers/delete.js.map +1 -0
- package/dist/sync/workers/download.d.ts +64 -18
- package/dist/sync/workers/download.d.ts.map +1 -1
- package/dist/sync/workers/download.js +396 -54
- package/dist/sync/workers/download.js.map +1 -1
- package/dist/sync/workers/upload.d.ts +29 -18
- package/dist/sync/workers/upload.d.ts.map +1 -1
- package/dist/sync/workers/upload.js +163 -46
- package/dist/sync/workers/upload.js.map +1 -1
- package/dist/test-utils/wallet.d.ts +1 -0
- package/dist/test-utils/wallet.d.ts.map +1 -1
- package/dist/test-utils/wallet.js +9 -31
- package/dist/test-utils/wallet.js.map +1 -1
- package/package.json +51 -27
- package/dist/auth/web3-signed.d.ts +0 -48
- package/dist/auth/web3-signed.d.ts.map +0 -1
- package/dist/auth/web3-signed.js +0 -110
- package/dist/auth/web3-signed.js.map +0 -1
- package/dist/config/loader.d.ts +0 -8
- package/dist/config/loader.d.ts.map +0 -1
- package/dist/config/loader.js +0 -38
- package/dist/config/loader.js.map +0 -1
- package/dist/gateway/client.d.ts +0 -98
- package/dist/gateway/client.d.ts.map +0 -1
- package/dist/gateway/client.js +0 -171
- package/dist/gateway/client.js.map +0 -1
- package/dist/grants/eip712.d.ts +0 -28
- package/dist/grants/eip712.d.ts.map +0 -1
- package/dist/grants/eip712.js +0 -30
- package/dist/grants/eip712.js.map +0 -1
- package/dist/grants/types.d.ts +0 -29
- package/dist/grants/types.d.ts.map +0 -1
- package/dist/grants/types.js +0 -6
- package/dist/grants/verify.d.ts +0 -24
- package/dist/grants/verify.d.ts.map +0 -1
- package/dist/grants/verify.js +0 -71
- package/dist/grants/verify.js.map +0 -1
- package/dist/keys/derive.d.ts +0 -18
- package/dist/keys/derive.d.ts.map +0 -1
- package/dist/keys/derive.js +0 -43
- package/dist/keys/derive.js.map +0 -1
- package/dist/schemas/data-file.d.ts +0 -20
- package/dist/schemas/data-file.d.ts.map +0 -1
- package/dist/schemas/data-file.js +0 -23
- package/dist/schemas/data-file.js.map +0 -1
- package/dist/scopes/index.d.ts +0 -3
- package/dist/scopes/index.d.ts.map +0 -1
- package/dist/scopes/index.js +0 -3
- package/dist/scopes/index.js.map +0 -1
- package/dist/scopes/match.d.ts +0 -13
- package/dist/scopes/match.d.ts.map +0 -1
- package/dist/scopes/match.js +0 -23
- package/dist/scopes/match.js.map +0 -1
- package/dist/scopes/parse.d.ts +0 -12
- package/dist/scopes/parse.d.ts.map +0 -1
- package/dist/scopes/parse.js +0 -29
- package/dist/scopes/parse.js.map +0 -1
- package/dist/signing/eip712.d.ts +0 -69
- package/dist/signing/eip712.d.ts.map +0 -1
- package/dist/signing/eip712.js +0 -68
- package/dist/signing/eip712.js.map +0 -1
- package/dist/storage/encryption/decrypt.d.ts +0 -10
- package/dist/storage/encryption/decrypt.d.ts.map +0 -1
- package/dist/storage/encryption/decrypt.js +0 -19
- package/dist/storage/encryption/decrypt.js.map +0 -1
- package/dist/storage/encryption/encrypt.d.ts +0 -10
- package/dist/storage/encryption/encrypt.d.ts.map +0 -1
- package/dist/storage/encryption/encrypt.js +0 -19
- package/dist/storage/encryption/encrypt.js.map +0 -1
- package/dist/storage/encryption/index.d.ts +0 -3
- package/dist/storage/encryption/index.d.ts.map +0 -1
- package/dist/storage/encryption/index.js +0 -3
- package/dist/storage/encryption/index.js.map +0 -1
|
@@ -1,65 +1,157 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { deriveScopeKey } from "
|
|
3
|
-
import { encryptWithPassword } from "../../storage/encryption/index.js";
|
|
1
|
+
import { encodeAbiParameters, keccak256, stringToHex } from "viem";
|
|
2
|
+
import { deriveScopeKey, encryptWithPassword, } from "@opendatalabs/vana-sdk/browser";
|
|
4
3
|
/**
|
|
5
4
|
* Upload a single unsynced index entry:
|
|
6
5
|
* 1. Read local data file from disk
|
|
7
|
-
* 2.
|
|
8
|
-
* 3.
|
|
9
|
-
* 4.
|
|
10
|
-
* 5. Upload
|
|
11
|
-
* 6.
|
|
12
|
-
* 7.
|
|
13
|
-
* 8. Update local index with fileId
|
|
6
|
+
* 2. Derive scope key from master key → hex-encode as OpenPGP password
|
|
7
|
+
* 3. Encrypt envelope with OpenPGP password-based encryption → ciphertext
|
|
8
|
+
* 4. Compute dataHash / metadataHash commitments (scope-addressed, no schema)
|
|
9
|
+
* 5. Upload ciphertext to storage backend, version-keyed `{scope}/{version}`
|
|
10
|
+
* 6. Register DPv2 data point on-chain (AddData) if not already
|
|
11
|
+
* 7. Persist the gateway-assigned dataPointId (marks the entry synced)
|
|
14
12
|
*/
|
|
15
13
|
export async function uploadOne(deps, entry) {
|
|
16
|
-
const {
|
|
14
|
+
const { storage, storageAdapter, gateway, signer, masterKey, serverOwner, logger, } = deps;
|
|
17
15
|
// 1. Read local data file
|
|
18
|
-
const envelope = await
|
|
19
|
-
// 2.
|
|
20
|
-
const schema = await gateway.getSchemaForScope(entry.scope);
|
|
21
|
-
if (!schema) {
|
|
22
|
-
throw new Error(`No schema found for scope: ${entry.scope}`);
|
|
23
|
-
}
|
|
24
|
-
// 3. Derive scope key → hex-encode as OpenPGP password
|
|
16
|
+
const envelope = await storage.readEnvelope(entry.scope, entry.collectedAt);
|
|
17
|
+
// 2. Derive scope key → hex-encode as OpenPGP password
|
|
25
18
|
const scopeKey = deriveScopeKey(masterKey, entry.scope);
|
|
26
|
-
const scopeKeyHex =
|
|
27
|
-
//
|
|
19
|
+
const scopeKeyHex = uint8ToHex(scopeKey);
|
|
20
|
+
// 3. Encrypt with OpenPGP password-based encryption
|
|
28
21
|
const plaintext = new TextEncoder().encode(JSON.stringify(envelope));
|
|
29
22
|
const encrypted = await encryptWithPassword(plaintext, scopeKeyHex);
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
})
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
23
|
+
// 4. Compute the on-chain commitments.
|
|
24
|
+
// dataHash = keccak256 of the plaintext envelope JSON. Commits to the
|
|
25
|
+
// canonical content, not the ciphertext — OpenPGP
|
|
26
|
+
// password-based encryption embeds random salts so
|
|
27
|
+
// re-encrypting the same plaintext yields different bytes;
|
|
28
|
+
// hashing the plaintext keeps the on-chain commitment
|
|
29
|
+
// reproducible across replicas serving the same version.
|
|
30
|
+
// metadataHash = keccak256 of canonical-JSON({scope, collectedAt,
|
|
31
|
+
// sizeBytes}). Commits to the off-chain metadata that
|
|
32
|
+
// describes this version without leaking the payload. DPv2
|
|
33
|
+
// is scope-addressed with no schema concept — the gateway
|
|
34
|
+
// neither records nor registers schemas — so no schemaId is
|
|
35
|
+
// looked up or committed.
|
|
36
|
+
const dataHash = keccak256(plaintext);
|
|
37
|
+
const metadataHash = keccak256(stringToHex(JSON.stringify({
|
|
38
|
+
scope: entry.scope,
|
|
39
|
+
collectedAt: entry.collectedAt,
|
|
40
|
+
sizeBytes: encrypted.byteLength,
|
|
41
|
+
})));
|
|
42
|
+
// 5. Upload ciphertext to storage backend FIRST, version-keyed so the
|
|
43
|
+
// download worker can reconstruct the URL from a DataPointRecord's
|
|
44
|
+
// (scope, expectedVersion) — DataPointRecords carry no URL. We upload
|
|
45
|
+
// before registering so the on-chain data point (the synced marker) is
|
|
46
|
+
// never stamped ahead of a blob that failed to land.
|
|
47
|
+
const storageKey = `${entry.scope}/${entry.version}`;
|
|
48
|
+
let url = await storageAdapter.upload(storageKey, encrypted);
|
|
49
|
+
// 6. DPv2 data-point registration (idempotent — skipped when a prior run
|
|
50
|
+
// already persisted a dataPointId on this entry). registerDataPoint stamps
|
|
51
|
+
// the synced marker that excludes this entry from findUnsynced next time.
|
|
52
|
+
let dataPointId;
|
|
53
|
+
if (entry.dataPointId) {
|
|
54
|
+
dataPointId = entry.dataPointId;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const registerAt = async (version) => {
|
|
58
|
+
const addDataSignature = await signer.signAddData({
|
|
59
|
+
ownerAddress: serverOwner,
|
|
60
|
+
scope: entry.scope,
|
|
61
|
+
dataHash,
|
|
62
|
+
metadataHash,
|
|
63
|
+
expectedVersion: version,
|
|
64
|
+
});
|
|
65
|
+
const dataPointResult = await gateway.registerDataPoint({
|
|
66
|
+
ownerAddress: serverOwner,
|
|
67
|
+
scope: entry.scope,
|
|
68
|
+
dataHash,
|
|
69
|
+
metadataHash,
|
|
70
|
+
expectedVersion: String(version),
|
|
71
|
+
signature: addDataSignature,
|
|
72
|
+
});
|
|
73
|
+
const id = dataPointResult.dataPointId ?? null;
|
|
74
|
+
if (!id) {
|
|
75
|
+
throw new Error(`Gateway registerDataPoint did not return a dataPointId for ${entry.path} (scope=${entry.scope}, version=${version})`);
|
|
76
|
+
}
|
|
77
|
+
return id;
|
|
78
|
+
};
|
|
79
|
+
try {
|
|
80
|
+
dataPointId = await registerAt(BigInt(entry.version));
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (!isStaleVersionConflict(err))
|
|
84
|
+
throw err;
|
|
85
|
+
// The registry's version for this (owner, scope) is ahead of the local
|
|
86
|
+
// index: pre-DPv2 rows were backfilled to version 1, and other replicas
|
|
87
|
+
// (PS Lite in the browser) advance the same per-scope sequence. The
|
|
88
|
+
// gateway 409s precisely so the client can re-sign against the live
|
|
89
|
+
// version — retrying the same version every cycle head-blocks the
|
|
90
|
+
// scope's whole upload queue.
|
|
91
|
+
const record = await gateway.getDataPoint(computeDataPointId(serverOwner, entry.scope));
|
|
92
|
+
if (!record)
|
|
93
|
+
throw err;
|
|
94
|
+
if (record.dataHash.toLowerCase() === dataHash.toLowerCase()) {
|
|
95
|
+
// Identical content is already registered (this entry, or a replica's
|
|
96
|
+
// copy of it) — adopt the registered data point rather than minting a
|
|
97
|
+
// new version of the same bytes.
|
|
98
|
+
dataPointId = record.id;
|
|
99
|
+
// Align the local row with the adopted registry version — downstream
|
|
100
|
+
// consumers sign from the row's version (e.g. x402 RecordDataAccess),
|
|
101
|
+
// so a stale local version would emit records the registry rejects.
|
|
102
|
+
const adoptedVersion = Number(record.expectedVersion);
|
|
103
|
+
if (adoptedVersion !== entry.version) {
|
|
104
|
+
// Cross-replica adopt: "the registrant already uploaded the blob
|
|
105
|
+
// under the registered version key" is an assumption, not a fact —
|
|
106
|
+
// a replica that crashed between register and upload leaves a
|
|
107
|
+
// registry row whose bytes 404 for every consumer (readers
|
|
108
|
+
// reconstruct the URL from the record's (scope, expectedVersion);
|
|
109
|
+
// records carry no URL). Verify, and heal from our identical
|
|
110
|
+
// plaintext (dataHash matched, so our ciphertext decrypts to the
|
|
111
|
+
// registered content).
|
|
112
|
+
const adoptedKey = `${entry.scope}/${adoptedVersion}`;
|
|
113
|
+
const adoptedBlobExists = await storageAdapter.exists(storageAdapter.urlForKey(adoptedKey));
|
|
114
|
+
if (!adoptedBlobExists) {
|
|
115
|
+
logger.warn({ scope: entry.scope, version: adoptedVersion, dataPointId }, "Adopted registry version has no blob in storage; re-uploading from local content");
|
|
116
|
+
url = await storageAdapter.upload(adoptedKey, encrypted);
|
|
117
|
+
}
|
|
118
|
+
await storage.updateEntryVersion(entry.path, adoptedVersion);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Rebase: re-sign one past the registry's live version. The blob key
|
|
123
|
+
// embeds the version (replicas reconstruct URLs from the registry
|
|
124
|
+
// record), so the rebased version needs its own blob; the one written
|
|
125
|
+
// under the stale key above is orphaned, which storage tolerates.
|
|
126
|
+
const rebased = BigInt(record.expectedVersion) + 1n;
|
|
127
|
+
url = await storageAdapter.upload(`${entry.scope}/${rebased}`, encrypted);
|
|
128
|
+
// A concurrent replica can still win the race to `rebased`; the next
|
|
129
|
+
// sync cycle re-reads the registry and rebases again, so this stays
|
|
130
|
+
// convergent without looping here.
|
|
131
|
+
dataPointId = await registerAt(rebased);
|
|
132
|
+
await storage.updateEntryVersion(entry.path, Number(rebased));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// 7. Stamp the dataPointId on the local index entry — marks it synced.
|
|
136
|
+
await storage.updateDataPointId(entry.path, dataPointId);
|
|
49
137
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
138
|
+
logger.info({
|
|
139
|
+
path: entry.path,
|
|
140
|
+
scope: entry.scope,
|
|
141
|
+
version: entry.version,
|
|
142
|
+
url,
|
|
143
|
+
dataPointId,
|
|
144
|
+
}, "Uploaded and registered DPv2 data point");
|
|
145
|
+
return { path: entry.path, url, dataPointId };
|
|
54
146
|
}
|
|
55
147
|
/**
|
|
56
|
-
* Process all unsynced entries (
|
|
148
|
+
* Process all unsynced entries (dataPointId === null).
|
|
57
149
|
* Processes sequentially to avoid overwhelming storage backend.
|
|
58
150
|
* Returns array of results (skips failures, logs errors).
|
|
59
151
|
*/
|
|
60
152
|
export async function uploadAll(deps, options) {
|
|
61
153
|
const batchSize = options?.batchSize ?? 50;
|
|
62
|
-
const entries = deps.
|
|
154
|
+
const entries = deps.storage.findUnsynced({ limit: batchSize });
|
|
63
155
|
const results = [];
|
|
64
156
|
for (const entry of entries) {
|
|
65
157
|
try {
|
|
@@ -67,9 +159,34 @@ export async function uploadAll(deps, options) {
|
|
|
67
159
|
results.push(result);
|
|
68
160
|
}
|
|
69
161
|
catch (err) {
|
|
70
|
-
|
|
162
|
+
const error = err;
|
|
163
|
+
options?.onError?.(entry, error);
|
|
164
|
+
deps.logger.error({ path: entry.path, scope: entry.scope, error: error.message }, "Failed to upload entry");
|
|
71
165
|
}
|
|
72
166
|
}
|
|
73
167
|
return results;
|
|
74
168
|
}
|
|
169
|
+
function uint8ToHex(bytes) {
|
|
170
|
+
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
171
|
+
}
|
|
172
|
+
// The gateway rejects a registration whose expectedVersion is not strictly
|
|
173
|
+
// greater than its stored value with a 409; the SDK client surfaces it as
|
|
174
|
+
// `Gateway error: 409 <detail>`. Anything else is not a version conflict.
|
|
175
|
+
function isStaleVersionConflict(err) {
|
|
176
|
+
return err instanceof Error && /Gateway error: 409\b/.test(err.message);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Deterministic DPv2 data-point id — `keccak256(abi.encode(owner, scope))`,
|
|
180
|
+
* the same primary key DataRegistryV2 and the gateway use. Lets the upload
|
|
181
|
+
* worker look up the registry's live row for a scope without a list call.
|
|
182
|
+
*/
|
|
183
|
+
export function computeDataPointId(ownerAddress, scope) {
|
|
184
|
+
// ABI-encoding an address is checksum-insensitive (same bytes either way),
|
|
185
|
+
// but viem rejects mixed-case strings that fail checksum validation —
|
|
186
|
+
// normalize so config-sourced owner strings can't trip it.
|
|
187
|
+
return keccak256(encodeAbiParameters([
|
|
188
|
+
{ name: "ownerAddress", type: "address" },
|
|
189
|
+
{ name: "scope", type: "string" },
|
|
190
|
+
], [ownerAddress.toLowerCase(), scope]));
|
|
191
|
+
}
|
|
75
192
|
//# sourceMappingURL=upload.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/sync/workers/upload.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/sync/workers/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/test-utils/wallet.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/test-utils/wallet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IACrD,aAAa,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC,CAAC;QAC7D,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAU,GAAG,UAAU,CA0B7D;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlB"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Provides deterministic wallets and header builders for integration tests.
|
|
4
4
|
*/
|
|
5
5
|
import { privateKeyToAccount } from "viem/accounts";
|
|
6
|
+
import { buildWeb3SignedHeader as sdkBuildWeb3SignedHeader } from "@opendatalabs/vana-sdk/browser";
|
|
6
7
|
/**
|
|
7
8
|
* Create a deterministic test wallet from a seed index.
|
|
8
9
|
* Seed 0 produces a fixed private key, seed N produces key = padded hex(N+1).
|
|
@@ -29,14 +30,6 @@ export function createTestWallet(seed = 0) {
|
|
|
29
30
|
},
|
|
30
31
|
};
|
|
31
32
|
}
|
|
32
|
-
/** Base64url encode a string (no padding). */
|
|
33
|
-
function base64urlEncode(input) {
|
|
34
|
-
return Buffer.from(input, "utf-8")
|
|
35
|
-
.toString("base64")
|
|
36
|
-
.replace(/\+/g, "-")
|
|
37
|
-
.replace(/\//g, "_")
|
|
38
|
-
.replace(/=+$/, "");
|
|
39
|
-
}
|
|
40
33
|
/**
|
|
41
34
|
* Build a valid Web3Signed Authorization header value.
|
|
42
35
|
* Format: "Web3Signed {base64url(payload)}.{signature}"
|
|
@@ -44,31 +37,16 @@ function base64urlEncode(input) {
|
|
|
44
37
|
* The payload is JSON with sorted keys, signed via EIP-191.
|
|
45
38
|
*/
|
|
46
39
|
export async function buildWeb3SignedHeader(params) {
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
return sdkBuildWeb3SignedHeader({
|
|
41
|
+
signMessage: (message) => params.wallet.signMessage(message),
|
|
49
42
|
aud: params.aud,
|
|
50
|
-
// SHA256 of empty string is a well-known constant
|
|
51
|
-
bodyHash: params.bodyHash ??
|
|
52
|
-
"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
|
53
|
-
exp: params.exp ?? now + 300,
|
|
54
|
-
iat: params.iat ?? now,
|
|
55
43
|
method: params.method,
|
|
56
44
|
uri: params.uri,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
.sort()
|
|
64
|
-
.reduce((acc, key) => {
|
|
65
|
-
acc[key] = payload[key];
|
|
66
|
-
return acc;
|
|
67
|
-
}, {});
|
|
68
|
-
const payloadJson = JSON.stringify(sortedPayload);
|
|
69
|
-
const payloadBase64 = base64urlEncode(payloadJson);
|
|
70
|
-
// Sign the base64url string via EIP-191
|
|
71
|
-
const signature = await params.wallet.signMessage(payloadBase64);
|
|
72
|
-
return `Web3Signed ${payloadBase64}.${signature}`;
|
|
45
|
+
bodyHash: params.bodyHash,
|
|
46
|
+
body: params.body,
|
|
47
|
+
iat: params.iat,
|
|
48
|
+
exp: params.exp,
|
|
49
|
+
grantId: params.grantId,
|
|
50
|
+
});
|
|
73
51
|
}
|
|
74
52
|
//# sourceMappingURL=wallet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/test-utils/wallet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/test-utils/wallet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,qBAAqB,IAAI,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAcnG;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,CAAC;IAC/C,oDAAoD;IACpD,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,KAAK,QAAQ,EAAmB,CAAC;IACpD,MAAM,OAAO,GAAsB,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEnE,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU;QACV,KAAK,CAAC,WAAW,CAAC,OAAe;YAC/B,OAAO,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,MAAM;YACxB,OAAO,OAAO,CAAC,aAAa,CAAC;gBAC3B,MAAM,EAAE,MAAM,CAAC,MAED;gBACd,KAAK,EAAE,MAAM,CAAC,KAED;gBACb,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAU3C;IACC,OAAO,wBAAwB,CAAC;QAC9B,WAAW,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACpE,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opendatalabs/personal-server-ts-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Protocol logic for the Vana Personal Server — auth, grants, scopes, storage, keys",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -24,6 +24,22 @@
|
|
|
24
24
|
"types": "./dist/config/index.d.ts",
|
|
25
25
|
"import": "./dist/config/index.js"
|
|
26
26
|
},
|
|
27
|
+
"./auth": {
|
|
28
|
+
"types": "./dist/auth/index.d.ts",
|
|
29
|
+
"import": "./dist/auth/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./contracts": {
|
|
32
|
+
"types": "./dist/contracts/index.d.ts",
|
|
33
|
+
"import": "./dist/contracts/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./client": {
|
|
36
|
+
"types": "./dist/client.d.ts",
|
|
37
|
+
"import": "./dist/client.js"
|
|
38
|
+
},
|
|
39
|
+
"./api": {
|
|
40
|
+
"types": "./dist/api/index.d.ts",
|
|
41
|
+
"import": "./dist/api/index.js"
|
|
42
|
+
},
|
|
27
43
|
"./logger": {
|
|
28
44
|
"types": "./dist/logger/index.d.ts",
|
|
29
45
|
"import": "./dist/logger/index.js"
|
|
@@ -36,10 +52,6 @@
|
|
|
36
52
|
"types": "./dist/schemas/server-config.d.ts",
|
|
37
53
|
"import": "./dist/schemas/server-config.js"
|
|
38
54
|
},
|
|
39
|
-
"./scopes": {
|
|
40
|
-
"types": "./dist/scopes/index.d.ts",
|
|
41
|
-
"import": "./dist/scopes/index.js"
|
|
42
|
-
},
|
|
43
55
|
"./storage/hierarchy": {
|
|
44
56
|
"types": "./dist/storage/hierarchy/index.d.ts",
|
|
45
57
|
"import": "./dist/storage/hierarchy/index.js"
|
|
@@ -48,26 +60,38 @@
|
|
|
48
60
|
"types": "./dist/storage/index/index.d.ts",
|
|
49
61
|
"import": "./dist/storage/index/index.js"
|
|
50
62
|
},
|
|
51
|
-
"./
|
|
52
|
-
"types": "./dist/
|
|
53
|
-
"import": "./dist/
|
|
63
|
+
"./storage/blocks": {
|
|
64
|
+
"types": "./dist/storage/blocks/index.d.ts",
|
|
65
|
+
"import": "./dist/storage/blocks/index.js"
|
|
54
66
|
},
|
|
55
|
-
"./
|
|
56
|
-
"types": "./dist/
|
|
57
|
-
"import": "./dist/
|
|
67
|
+
"./storage/preview": {
|
|
68
|
+
"types": "./dist/storage/preview.d.ts",
|
|
69
|
+
"import": "./dist/storage/preview.js"
|
|
70
|
+
},
|
|
71
|
+
"./storage/blocks/build": {
|
|
72
|
+
"types": "./dist/storage/blocks/build.d.ts",
|
|
73
|
+
"import": "./dist/storage/blocks/build.js"
|
|
58
74
|
},
|
|
59
75
|
"./grants": {
|
|
60
76
|
"types": "./dist/grants/index.d.ts",
|
|
61
77
|
"import": "./dist/grants/index.js"
|
|
62
78
|
},
|
|
63
|
-
"./
|
|
64
|
-
"types": "./dist/
|
|
65
|
-
"import": "./dist/
|
|
79
|
+
"./policy": {
|
|
80
|
+
"types": "./dist/policy/index.d.ts",
|
|
81
|
+
"import": "./dist/policy/index.js"
|
|
82
|
+
},
|
|
83
|
+
"./ports": {
|
|
84
|
+
"types": "./dist/ports/index.d.ts",
|
|
85
|
+
"import": "./dist/ports/index.js"
|
|
66
86
|
},
|
|
67
87
|
"./logging/access-log": {
|
|
68
88
|
"types": "./dist/logging/access-log.d.ts",
|
|
69
89
|
"import": "./dist/logging/access-log.js"
|
|
70
90
|
},
|
|
91
|
+
"./mcp": {
|
|
92
|
+
"types": "./dist/mcp/index.d.ts",
|
|
93
|
+
"import": "./dist/mcp/index.js"
|
|
94
|
+
},
|
|
71
95
|
"./keys": {
|
|
72
96
|
"types": "./dist/keys/index.d.ts",
|
|
73
97
|
"import": "./dist/keys/index.js"
|
|
@@ -84,9 +108,9 @@
|
|
|
84
108
|
"types": "./dist/sync/index.d.ts",
|
|
85
109
|
"import": "./dist/sync/index.js"
|
|
86
110
|
},
|
|
87
|
-
"./
|
|
88
|
-
"types": "./dist/
|
|
89
|
-
"import": "./dist/
|
|
111
|
+
"./sync/manager": {
|
|
112
|
+
"types": "./dist/sync/engine/sync-manager.d.ts",
|
|
113
|
+
"import": "./dist/sync/engine/sync-manager.js"
|
|
90
114
|
},
|
|
91
115
|
"./storage/adapters": {
|
|
92
116
|
"types": "./dist/storage/adapters/index.d.ts",
|
|
@@ -95,21 +119,21 @@
|
|
|
95
119
|
"./test-utils": {
|
|
96
120
|
"types": "./dist/test-utils/index.d.ts",
|
|
97
121
|
"import": "./dist/test-utils/index.js"
|
|
122
|
+
},
|
|
123
|
+
"./payment": {
|
|
124
|
+
"types": "./dist/payment/index.d.ts",
|
|
125
|
+
"import": "./dist/payment/index.js"
|
|
98
126
|
}
|
|
99
127
|
},
|
|
100
128
|
"scripts": {
|
|
101
129
|
"build": "tsc --build"
|
|
102
130
|
},
|
|
103
131
|
"dependencies": {
|
|
104
|
-
"@
|
|
105
|
-
"
|
|
106
|
-
"
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"
|
|
110
|
-
"zod": "^4.3.6"
|
|
111
|
-
},
|
|
112
|
-
"devDependencies": {
|
|
113
|
-
"@types/better-sqlite3": "^7.6.0"
|
|
132
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
133
|
+
"@opendatalabs/vana-sdk": "3.13.0",
|
|
134
|
+
"minisearch": "^7.2.0",
|
|
135
|
+
"unpdf": "^1.6.2",
|
|
136
|
+
"viem": "^2.54.2",
|
|
137
|
+
"zod": "^4.4.3"
|
|
114
138
|
}
|
|
115
139
|
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Web3Signed Authorization header parsing and verification.
|
|
3
|
-
*
|
|
4
|
-
* Header format: "Web3Signed {base64url(payload)}.{signature}"
|
|
5
|
-
* Payload is JSON with fields: aud, method, uri, bodyHash, iat, exp, grantId?
|
|
6
|
-
* Signature is EIP-191 over the base64url-encoded payload string.
|
|
7
|
-
*/
|
|
8
|
-
export interface Web3SignedPayload {
|
|
9
|
-
aud: string;
|
|
10
|
-
method: string;
|
|
11
|
-
uri: string;
|
|
12
|
-
bodyHash: string;
|
|
13
|
-
iat: number;
|
|
14
|
-
exp: number;
|
|
15
|
-
grantId?: string;
|
|
16
|
-
}
|
|
17
|
-
export interface VerifiedAuth {
|
|
18
|
-
signer: `0x${string}`;
|
|
19
|
-
payload: Web3SignedPayload;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Parse "Web3Signed <base64url>.<signature>" header value.
|
|
23
|
-
* Throws MissingAuthError if header is missing/empty.
|
|
24
|
-
* Throws InvalidSignatureError if format is invalid.
|
|
25
|
-
*/
|
|
26
|
-
export declare function parseWeb3SignedHeader(headerValue: string | undefined): {
|
|
27
|
-
payloadBase64: string;
|
|
28
|
-
payload: Web3SignedPayload;
|
|
29
|
-
signature: `0x${string}`;
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* Full verification: parse header, recover signer via EIP-191, check claims.
|
|
33
|
-
*
|
|
34
|
-
* Steps:
|
|
35
|
-
* 1. Parse header -> base64url + signature
|
|
36
|
-
* 2. Recover signer via recoverMessageAddress (EIP-191) over the base64url string
|
|
37
|
-
* 3. Check aud === expectedOrigin, method === expectedMethod, uri === expectedPath
|
|
38
|
-
* 4. Check iat/exp within clock skew (60s)
|
|
39
|
-
* 5. Return { signer, payload }
|
|
40
|
-
*/
|
|
41
|
-
export declare function verifyWeb3Signed(params: {
|
|
42
|
-
headerValue: string | undefined;
|
|
43
|
-
expectedOrigin: string;
|
|
44
|
-
expectedMethod: string;
|
|
45
|
-
expectedPath: string;
|
|
46
|
-
now?: number;
|
|
47
|
-
}): Promise<VerifiedAuth>;
|
|
48
|
-
//# sourceMappingURL=web3-signed.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"web3-signed.d.ts","sourceRoot":"","sources":["../../src/auth/web3-signed.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAaD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,KAAK,MAAM,EAAE,CAAC;CAC1B,CAmCA;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,YAAY,CAAC,CAqDxB"}
|