@opendatalabs/personal-server-ts-core 0.0.1-canary.0d0705b
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/auth/web3-signed.d.ts +48 -0
- package/dist/auth/web3-signed.d.ts.map +1 -0
- package/dist/auth/web3-signed.js +110 -0
- package/dist/auth/web3-signed.js.map +1 -0
- package/dist/config/defaults.d.ts +5 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +7 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +9 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +36 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/errors/catalog.d.ts +41 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +79 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/gateway/client.d.ts +98 -0
- package/dist/gateway/client.d.ts.map +1 -0
- package/dist/gateway/client.js +171 -0
- package/dist/gateway/client.js.map +1 -0
- package/dist/grants/eip712.d.ts +28 -0
- package/dist/grants/eip712.d.ts.map +1 -0
- package/dist/grants/eip712.js +30 -0
- package/dist/grants/eip712.js.map +1 -0
- package/dist/grants/index.d.ts +5 -0
- package/dist/grants/index.d.ts.map +1 -0
- package/dist/grants/index.js +3 -0
- package/dist/grants/index.js.map +1 -0
- package/dist/grants/types.d.ts +29 -0
- package/dist/grants/types.d.ts.map +1 -0
- package/dist/grants/types.js +6 -0
- package/dist/grants/types.js.map +1 -0
- package/dist/grants/verify.d.ts +24 -0
- package/dist/grants/verify.d.ts.map +1 -0
- package/dist/grants/verify.js +71 -0
- package/dist/grants/verify.js.map +1 -0
- package/dist/keys/derive.d.ts +18 -0
- package/dist/keys/derive.d.ts.map +1 -0
- package/dist/keys/derive.js +43 -0
- package/dist/keys/derive.js.map +1 -0
- package/dist/keys/index.d.ts +3 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +3 -0
- package/dist/keys/index.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/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 +15 -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/schemas/data-file.d.ts +20 -0
- package/dist/schemas/data-file.d.ts.map +1 -0
- package/dist/schemas/data-file.js +23 -0
- package/dist/schemas/data-file.js.map +1 -0
- package/dist/schemas/server-config.d.ts +103 -0
- package/dist/schemas/server-config.d.ts.map +1 -0
- package/dist/schemas/server-config.js +109 -0
- package/dist/schemas/server-config.js.map +1 -0
- package/dist/scopes/index.d.ts +3 -0
- package/dist/scopes/index.d.ts.map +1 -0
- package/dist/scopes/index.js +3 -0
- package/dist/scopes/index.js.map +1 -0
- package/dist/scopes/match.d.ts +13 -0
- package/dist/scopes/match.d.ts.map +1 -0
- package/dist/scopes/match.js +23 -0
- package/dist/scopes/match.js.map +1 -0
- package/dist/scopes/parse.d.ts +12 -0
- package/dist/scopes/parse.d.ts.map +1 -0
- package/dist/scopes/parse.js +29 -0
- package/dist/scopes/parse.js.map +1 -0
- package/dist/signing/eip712.d.ts +56 -0
- package/dist/signing/eip712.d.ts.map +1 -0
- package/dist/signing/eip712.js +57 -0
- package/dist/signing/eip712.js.map +1 -0
- package/dist/signing/index.d.ts +4 -0
- package/dist/signing/index.d.ts.map +1 -0
- package/dist/signing/index.js +4 -0
- package/dist/signing/index.js.map +1 -0
- package/dist/signing/request-signer.d.ts +12 -0
- package/dist/signing/request-signer.d.ts.map +1 -0
- package/dist/signing/request-signer.js +47 -0
- package/dist/signing/request-signer.js.map +1 -0
- package/dist/signing/signer.d.ts +14 -0
- package/dist/signing/signer.d.ts.map +1 -0
- package/dist/signing/signer.js +37 -0
- package/dist/signing/signer.js.map +1 -0
- package/dist/storage/adapters/index.d.ts +3 -0
- package/dist/storage/adapters/index.d.ts.map +1 -0
- package/dist/storage/adapters/index.js +2 -0
- package/dist/storage/adapters/index.js.map +1 -0
- package/dist/storage/adapters/interface.d.ts +47 -0
- package/dist/storage/adapters/interface.d.ts.map +1 -0
- package/dist/storage/adapters/interface.js +2 -0
- package/dist/storage/adapters/interface.js.map +1 -0
- package/dist/storage/adapters/vana.d.ts +32 -0
- package/dist/storage/adapters/vana.d.ts.map +1 -0
- package/dist/storage/adapters/vana.js +96 -0
- package/dist/storage/adapters/vana.js.map +1 -0
- package/dist/storage/encryption/decrypt.d.ts +10 -0
- package/dist/storage/encryption/decrypt.d.ts.map +1 -0
- package/dist/storage/encryption/decrypt.js +19 -0
- package/dist/storage/encryption/decrypt.js.map +1 -0
- package/dist/storage/encryption/encrypt.d.ts +10 -0
- package/dist/storage/encryption/encrypt.d.ts.map +1 -0
- package/dist/storage/encryption/encrypt.js +19 -0
- package/dist/storage/encryption/encrypt.js.map +1 -0
- package/dist/storage/encryption/index.d.ts +3 -0
- package/dist/storage/encryption/index.d.ts.map +1 -0
- package/dist/storage/encryption/index.js +3 -0
- package/dist/storage/encryption/index.js.map +1 -0
- package/dist/storage/hierarchy/index.d.ts +4 -0
- package/dist/storage/hierarchy/index.d.ts.map +1 -0
- package/dist/storage/hierarchy/index.js +3 -0
- package/dist/storage/hierarchy/index.js.map +1 -0
- package/dist/storage/hierarchy/manager.d.ts +23 -0
- package/dist/storage/hierarchy/manager.d.ts.map +1 -0
- package/dist/storage/hierarchy/manager.js +60 -0
- package/dist/storage/hierarchy/manager.js.map +1 -0
- package/dist/storage/hierarchy/paths.d.ts +11 -0
- package/dist/storage/hierarchy/paths.d.ts.map +1 -0
- package/dist/storage/hierarchy/paths.js +36 -0
- package/dist/storage/hierarchy/paths.js.map +1 -0
- package/dist/storage/index/index.d.ts +4 -0
- package/dist/storage/index/index.d.ts.map +1 -0
- package/dist/storage/index/index.js +3 -0
- package/dist/storage/index/index.js.map +1 -0
- package/dist/storage/index/manager.d.ts +37 -0
- package/dist/storage/index/manager.d.ts.map +1 -0
- package/dist/storage/index/manager.js +132 -0
- package/dist/storage/index/manager.js.map +1 -0
- package/dist/storage/index/schema.d.ts +4 -0
- package/dist/storage/index/schema.d.ts.map +1 -0
- package/dist/storage/index/schema.js +27 -0
- package/dist/storage/index/schema.js.map +1 -0
- package/dist/storage/index/types.d.ts +20 -0
- package/dist/storage/index/types.d.ts.map +1 -0
- package/dist/storage/index/types.js +2 -0
- package/dist/storage/index/types.js.map +1 -0
- package/dist/sync/cursor.d.ts +12 -0
- package/dist/sync/cursor.d.ts.map +1 -0
- package/dist/sync/cursor.js +19 -0
- package/dist/sync/cursor.js.map +1 -0
- package/dist/sync/engine/sync-manager.d.ts +25 -0
- package/dist/sync/engine/sync-manager.d.ts.map +1 -0
- package/dist/sync/engine/sync-manager.js +136 -0
- package/dist/sync/engine/sync-manager.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/types.d.ts +40 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +2 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/workers/download.d.ts +41 -0
- package/dist/sync/workers/download.d.ts.map +1 -0
- package/dist/sync/workers/download.js +90 -0
- package/dist/sync/workers/download.js.map +1 -0
- package/dist/sync/workers/upload.d.ts +43 -0
- package/dist/sync/workers/upload.d.ts.map +1 -0
- package/dist/sync/workers/upload.js +75 -0
- package/dist/sync/workers/upload.js.map +1 -0
- package/dist/test-utils/index.d.ts +2 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +2 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/wallet.d.ts +40 -0
- package/dist/test-utils/wallet.d.ts.map +1 -0
- package/dist/test-utils/wallet.js +72 -0
- package/dist/test-utils/wallet.js.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { IndexManager } from "../../storage/index/manager.js";
|
|
2
|
+
import type { HierarchyManagerOptions } from "../../storage/hierarchy/index.js";
|
|
3
|
+
import type { StorageAdapter } from "../../storage/adapters/interface.js";
|
|
4
|
+
import type { GatewayClient } from "../../gateway/client.js";
|
|
5
|
+
import type { SyncCursor } from "../cursor.js";
|
|
6
|
+
import type { FileRecord } from "../types.js";
|
|
7
|
+
import type { Logger } from "pino";
|
|
8
|
+
export interface DownloadWorkerDeps {
|
|
9
|
+
indexManager: IndexManager;
|
|
10
|
+
hierarchyOptions: HierarchyManagerOptions;
|
|
11
|
+
storageAdapter: StorageAdapter;
|
|
12
|
+
gateway: GatewayClient;
|
|
13
|
+
cursor: SyncCursor;
|
|
14
|
+
masterKey: Uint8Array;
|
|
15
|
+
serverOwner: string;
|
|
16
|
+
logger: Logger;
|
|
17
|
+
}
|
|
18
|
+
export interface DownloadResult {
|
|
19
|
+
fileId: string;
|
|
20
|
+
scope: string;
|
|
21
|
+
collectedAt: string;
|
|
22
|
+
path: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Download and process a single file record from the storage backend:
|
|
26
|
+
* 1. Check dedup: skip if fileId already in local index
|
|
27
|
+
* 2. Download OpenPGP encrypted binary from storage backend
|
|
28
|
+
* 3. Resolve schemaId → scope via Gateway getSchema
|
|
29
|
+
* 4. Derive scope key from master key → hex-encode as OpenPGP password
|
|
30
|
+
* 5. Decrypt with OpenPGP password-based decryption → plaintext JSON
|
|
31
|
+
* 6. Parse as DataFileEnvelope (validate)
|
|
32
|
+
* 7. Write to local filesystem via hierarchy manager
|
|
33
|
+
* 8. Insert into local index (with fileId)
|
|
34
|
+
*/
|
|
35
|
+
export declare function downloadOne(deps: DownloadWorkerDeps, record: FileRecord): Promise<DownloadResult | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Poll Gateway for new file records since lastProcessedTimestamp,
|
|
38
|
+
* download each, and advance the cursor.
|
|
39
|
+
*/
|
|
40
|
+
export declare function downloadAll(deps: DownloadWorkerDeps): Promise<DownloadResult[]>;
|
|
41
|
+
//# sourceMappingURL=download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../src/sync/workers/download.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAMnC,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA+DhC;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,cAAc,EAAE,CAAC,CAuC3B"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { writeDataFile } from "../../storage/hierarchy/index.js";
|
|
2
|
+
import { deriveScopeKey } from "../../keys/derive.js";
|
|
3
|
+
import { decryptWithPassword } from "../../storage/encryption/index.js";
|
|
4
|
+
import { DataFileEnvelopeSchema } from "../../schemas/data-file.js";
|
|
5
|
+
/**
|
|
6
|
+
* Download and process a single file record from the storage backend:
|
|
7
|
+
* 1. Check dedup: skip if fileId already in local index
|
|
8
|
+
* 2. Download OpenPGP encrypted binary from storage backend
|
|
9
|
+
* 3. Resolve schemaId → scope via Gateway getSchema
|
|
10
|
+
* 4. Derive scope key from master key → hex-encode as OpenPGP password
|
|
11
|
+
* 5. Decrypt with OpenPGP password-based decryption → plaintext JSON
|
|
12
|
+
* 6. Parse as DataFileEnvelope (validate)
|
|
13
|
+
* 7. Write to local filesystem via hierarchy manager
|
|
14
|
+
* 8. Insert into local index (with fileId)
|
|
15
|
+
*/
|
|
16
|
+
export async function downloadOne(deps, record) {
|
|
17
|
+
const { indexManager, hierarchyOptions, storageAdapter, gateway, masterKey, logger, } = deps;
|
|
18
|
+
// 1. Check dedup: skip if fileId already in local index
|
|
19
|
+
const existing = indexManager.findByFileId(record.fileId);
|
|
20
|
+
if (existing) {
|
|
21
|
+
logger.debug({ fileId: record.fileId }, "File already in index, skipping");
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
// 2. Download OpenPGP encrypted binary from storage backend
|
|
25
|
+
const encrypted = await storageAdapter.download(record.url);
|
|
26
|
+
// 3. Resolve schemaId → scope via Gateway getSchema
|
|
27
|
+
const schema = await gateway.getSchema(record.schemaId);
|
|
28
|
+
if (!schema) {
|
|
29
|
+
throw new Error(`No schema found for schemaId: ${record.schemaId}`);
|
|
30
|
+
}
|
|
31
|
+
// 4. Derive scope key → hex-encode as OpenPGP password
|
|
32
|
+
const scopeKey = deriveScopeKey(masterKey, schema.scope);
|
|
33
|
+
const scopeKeyHex = Buffer.from(scopeKey).toString("hex");
|
|
34
|
+
// 5. Decrypt with OpenPGP password-based decryption
|
|
35
|
+
const plaintext = await decryptWithPassword(encrypted, scopeKeyHex);
|
|
36
|
+
// 6. Parse as DataFileEnvelope (validate)
|
|
37
|
+
const raw = JSON.parse(new TextDecoder().decode(plaintext));
|
|
38
|
+
const envelope = DataFileEnvelopeSchema.parse(raw);
|
|
39
|
+
// 7. Write to local filesystem via hierarchy manager
|
|
40
|
+
const { relativePath, sizeBytes } = await writeDataFile(hierarchyOptions, envelope);
|
|
41
|
+
// 8. Insert into local index (with fileId)
|
|
42
|
+
indexManager.insert({
|
|
43
|
+
fileId: record.fileId,
|
|
44
|
+
path: relativePath,
|
|
45
|
+
scope: envelope.scope,
|
|
46
|
+
collectedAt: envelope.collectedAt,
|
|
47
|
+
sizeBytes,
|
|
48
|
+
});
|
|
49
|
+
logger.info({ fileId: record.fileId, scope: envelope.scope, path: relativePath }, "Downloaded and indexed file");
|
|
50
|
+
return {
|
|
51
|
+
fileId: record.fileId,
|
|
52
|
+
scope: envelope.scope,
|
|
53
|
+
collectedAt: envelope.collectedAt,
|
|
54
|
+
path: relativePath,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Poll Gateway for new file records since lastProcessedTimestamp,
|
|
59
|
+
* download each, and advance the cursor.
|
|
60
|
+
*/
|
|
61
|
+
export async function downloadAll(deps) {
|
|
62
|
+
const { gateway, cursor, serverOwner, logger } = deps;
|
|
63
|
+
// 1. Read cursor
|
|
64
|
+
const lastProcessedTimestamp = await cursor.read();
|
|
65
|
+
// 2. Poll gateway for new file records
|
|
66
|
+
const { files, cursor: nextCursor } = await gateway.listFilesSince(serverOwner, lastProcessedTimestamp);
|
|
67
|
+
const results = [];
|
|
68
|
+
// 3. Process each file record
|
|
69
|
+
for (const file of files) {
|
|
70
|
+
try {
|
|
71
|
+
const result = await downloadOne(deps, file);
|
|
72
|
+
if (result) {
|
|
73
|
+
results.push(result);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
logger.error({
|
|
78
|
+
fileId: file.fileId,
|
|
79
|
+
schemaId: file.schemaId,
|
|
80
|
+
error: err.message,
|
|
81
|
+
}, "Failed to download file");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// 4. Advance cursor if there are new records
|
|
85
|
+
if (nextCursor !== null) {
|
|
86
|
+
await cursor.write(nextCursor);
|
|
87
|
+
}
|
|
88
|
+
return results;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/sync/workers/download.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { IndexManager } from "../../storage/index/manager.js";
|
|
2
|
+
import type { HierarchyManagerOptions } from "../../storage/hierarchy/index.js";
|
|
3
|
+
import type { StorageAdapter } from "../../storage/adapters/interface.js";
|
|
4
|
+
import type { GatewayClient } from "../../gateway/client.js";
|
|
5
|
+
import type { ServerSigner } from "../../signing/signer.js";
|
|
6
|
+
import type { Logger } from "pino";
|
|
7
|
+
import type { IndexEntry } from "../../storage/index/types.js";
|
|
8
|
+
export interface UploadWorkerDeps {
|
|
9
|
+
indexManager: IndexManager;
|
|
10
|
+
hierarchyOptions: HierarchyManagerOptions;
|
|
11
|
+
storageAdapter: StorageAdapter;
|
|
12
|
+
gateway: GatewayClient;
|
|
13
|
+
signer: ServerSigner;
|
|
14
|
+
masterKey: Uint8Array;
|
|
15
|
+
serverOwner: string;
|
|
16
|
+
logger: Logger;
|
|
17
|
+
}
|
|
18
|
+
export interface UploadResult {
|
|
19
|
+
path: string;
|
|
20
|
+
fileId: string;
|
|
21
|
+
url: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Upload a single unsynced index entry:
|
|
25
|
+
* 1. Read local data file from disk
|
|
26
|
+
* 2. Look up schema for the scope → get schemaId
|
|
27
|
+
* 3. Derive scope key from master key → hex-encode as OpenPGP password
|
|
28
|
+
* 4. Encrypt with OpenPGP password-based encryption → binary
|
|
29
|
+
* 5. Upload OpenPGP binary to storage backend
|
|
30
|
+
* 6. Sign file registration via EIP-712
|
|
31
|
+
* 7. Register file record on-chain via Gateway (with schemaId)
|
|
32
|
+
* 8. Update local index with fileId
|
|
33
|
+
*/
|
|
34
|
+
export declare function uploadOne(deps: UploadWorkerDeps, entry: IndexEntry): Promise<UploadResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Process all unsynced entries (fileId === null).
|
|
37
|
+
* Processes sequentially to avoid overwhelming storage backend.
|
|
38
|
+
* Returns array of results (skips failures, logs errors).
|
|
39
|
+
*/
|
|
40
|
+
export declare function uploadAll(deps: UploadWorkerDeps, options?: {
|
|
41
|
+
batchSize?: number;
|
|
42
|
+
}): Promise<UploadResult[]>;
|
|
43
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/sync/workers/upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAK/D,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,YAAY,CAAC,CAoEvB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,gBAAgB,EACtB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,YAAY,EAAE,CAAC,CAkBzB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readDataFile } from "../../storage/hierarchy/index.js";
|
|
2
|
+
import { deriveScopeKey } from "../../keys/derive.js";
|
|
3
|
+
import { encryptWithPassword } from "../../storage/encryption/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* Upload a single unsynced index entry:
|
|
6
|
+
* 1. Read local data file from disk
|
|
7
|
+
* 2. Look up schema for the scope → get schemaId
|
|
8
|
+
* 3. Derive scope key from master key → hex-encode as OpenPGP password
|
|
9
|
+
* 4. Encrypt with OpenPGP password-based encryption → binary
|
|
10
|
+
* 5. Upload OpenPGP binary to storage backend
|
|
11
|
+
* 6. Sign file registration via EIP-712
|
|
12
|
+
* 7. Register file record on-chain via Gateway (with schemaId)
|
|
13
|
+
* 8. Update local index with fileId
|
|
14
|
+
*/
|
|
15
|
+
export async function uploadOne(deps, entry) {
|
|
16
|
+
const { indexManager, hierarchyOptions, storageAdapter, gateway, signer, masterKey, serverOwner, logger, } = deps;
|
|
17
|
+
// 1. Read local data file
|
|
18
|
+
const envelope = await readDataFile(hierarchyOptions, entry.scope, entry.collectedAt);
|
|
19
|
+
// 2. Look up schema for the scope
|
|
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
|
|
25
|
+
const scopeKey = deriveScopeKey(masterKey, entry.scope);
|
|
26
|
+
const scopeKeyHex = Buffer.from(scopeKey).toString("hex");
|
|
27
|
+
// 4. Encrypt with OpenPGP password-based encryption
|
|
28
|
+
const plaintext = new TextEncoder().encode(JSON.stringify(envelope));
|
|
29
|
+
const encrypted = await encryptWithPassword(plaintext, scopeKeyHex);
|
|
30
|
+
// 5. Upload to storage backend
|
|
31
|
+
const storageKey = `${entry.scope}/${entry.collectedAt}`;
|
|
32
|
+
const url = await storageAdapter.upload(storageKey, encrypted);
|
|
33
|
+
// 6. Sign file registration via EIP-712
|
|
34
|
+
const signature = await signer.signFileRegistration({
|
|
35
|
+
ownerAddress: serverOwner,
|
|
36
|
+
url,
|
|
37
|
+
schemaId: schema.id,
|
|
38
|
+
});
|
|
39
|
+
// 7. Register file on-chain via Gateway
|
|
40
|
+
const registration = await gateway.registerFile({
|
|
41
|
+
ownerAddress: serverOwner,
|
|
42
|
+
url,
|
|
43
|
+
schemaId: schema.id,
|
|
44
|
+
signature,
|
|
45
|
+
});
|
|
46
|
+
const fileId = registration.fileId;
|
|
47
|
+
if (!fileId) {
|
|
48
|
+
throw new Error(`Gateway registerFile did not return a fileId for ${entry.path}`);
|
|
49
|
+
}
|
|
50
|
+
// 8. Update local index with fileId
|
|
51
|
+
indexManager.updateFileId(entry.path, fileId);
|
|
52
|
+
logger.info({ path: entry.path, fileId, url }, "Uploaded and registered file");
|
|
53
|
+
return { path: entry.path, fileId, url };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Process all unsynced entries (fileId === null).
|
|
57
|
+
* Processes sequentially to avoid overwhelming storage backend.
|
|
58
|
+
* Returns array of results (skips failures, logs errors).
|
|
59
|
+
*/
|
|
60
|
+
export async function uploadAll(deps, options) {
|
|
61
|
+
const batchSize = options?.batchSize ?? 50;
|
|
62
|
+
const entries = deps.indexManager.findUnsynced({ limit: batchSize });
|
|
63
|
+
const results = [];
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
try {
|
|
66
|
+
const result = await uploadOne(deps, entry);
|
|
67
|
+
results.push(result);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
deps.logger.error({ path: entry.path, scope: entry.scope, error: err.message }, "Failed to upload entry");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/sync/workers/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test-utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GAEtB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test wallet utilities for Web3Signed auth testing.
|
|
3
|
+
* Provides deterministic wallets and header builders for integration tests.
|
|
4
|
+
*/
|
|
5
|
+
export interface TestWallet {
|
|
6
|
+
address: `0x${string}`;
|
|
7
|
+
privateKey: `0x${string}`;
|
|
8
|
+
signMessage(message: string): Promise<`0x${string}`>;
|
|
9
|
+
signTypedData(params: {
|
|
10
|
+
domain: Record<string, unknown>;
|
|
11
|
+
types: Record<string, Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
type: string;
|
|
14
|
+
}>>;
|
|
15
|
+
primaryType: string;
|
|
16
|
+
message: Record<string, unknown>;
|
|
17
|
+
}): Promise<`0x${string}`>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a deterministic test wallet from a seed index.
|
|
21
|
+
* Seed 0 produces a fixed private key, seed N produces key = padded hex(N+1).
|
|
22
|
+
*/
|
|
23
|
+
export declare function createTestWallet(seed?: number): TestWallet;
|
|
24
|
+
/**
|
|
25
|
+
* Build a valid Web3Signed Authorization header value.
|
|
26
|
+
* Format: "Web3Signed {base64url(payload)}.{signature}"
|
|
27
|
+
*
|
|
28
|
+
* The payload is JSON with sorted keys, signed via EIP-191.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildWeb3SignedHeader(params: {
|
|
31
|
+
wallet: TestWallet;
|
|
32
|
+
aud: string;
|
|
33
|
+
method: string;
|
|
34
|
+
uri: string;
|
|
35
|
+
bodyHash?: string;
|
|
36
|
+
iat?: number;
|
|
37
|
+
exp?: number;
|
|
38
|
+
grantId?: string;
|
|
39
|
+
}): Promise<string>;
|
|
40
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/test-utils/wallet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,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;AAWD;;;;;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,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BlB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test wallet utilities for Web3Signed auth testing.
|
|
3
|
+
* Provides deterministic wallets and header builders for integration tests.
|
|
4
|
+
*/
|
|
5
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
6
|
+
/**
|
|
7
|
+
* Create a deterministic test wallet from a seed index.
|
|
8
|
+
* Seed 0 produces a fixed private key, seed N produces key = padded hex(N+1).
|
|
9
|
+
*/
|
|
10
|
+
export function createTestWallet(seed = 0) {
|
|
11
|
+
// Derive a deterministic private key from the seed.
|
|
12
|
+
// Pad the (seed + 1) value to 32 bytes hex.
|
|
13
|
+
const keyValue = (seed + 1).toString(16).padStart(64, "0");
|
|
14
|
+
const privateKey = `0x${keyValue}`;
|
|
15
|
+
const account = privateKeyToAccount(privateKey);
|
|
16
|
+
return {
|
|
17
|
+
address: account.address,
|
|
18
|
+
privateKey,
|
|
19
|
+
async signMessage(message) {
|
|
20
|
+
return account.signMessage({ message });
|
|
21
|
+
},
|
|
22
|
+
async signTypedData(params) {
|
|
23
|
+
return account.signTypedData({
|
|
24
|
+
domain: params.domain,
|
|
25
|
+
types: params.types,
|
|
26
|
+
primaryType: params.primaryType,
|
|
27
|
+
message: params.message,
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
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
|
+
/**
|
|
41
|
+
* Build a valid Web3Signed Authorization header value.
|
|
42
|
+
* Format: "Web3Signed {base64url(payload)}.{signature}"
|
|
43
|
+
*
|
|
44
|
+
* The payload is JSON with sorted keys, signed via EIP-191.
|
|
45
|
+
*/
|
|
46
|
+
export async function buildWeb3SignedHeader(params) {
|
|
47
|
+
const now = Math.floor(Date.now() / 1000);
|
|
48
|
+
const payload = {
|
|
49
|
+
aud: params.aud,
|
|
50
|
+
bodyHash: params.bodyHash ?? "",
|
|
51
|
+
exp: params.exp ?? now + 300,
|
|
52
|
+
iat: params.iat ?? now,
|
|
53
|
+
method: params.method,
|
|
54
|
+
uri: params.uri,
|
|
55
|
+
};
|
|
56
|
+
if (params.grantId !== undefined) {
|
|
57
|
+
payload["grantId"] = params.grantId;
|
|
58
|
+
}
|
|
59
|
+
// Sort keys for deterministic serialization
|
|
60
|
+
const sortedPayload = Object.keys(payload)
|
|
61
|
+
.sort()
|
|
62
|
+
.reduce((acc, key) => {
|
|
63
|
+
acc[key] = payload[key];
|
|
64
|
+
return acc;
|
|
65
|
+
}, {});
|
|
66
|
+
const payloadJson = JSON.stringify(sortedPayload);
|
|
67
|
+
const payloadBase64 = base64urlEncode(payloadJson);
|
|
68
|
+
// Sign the base64url string via EIP-191
|
|
69
|
+
const signature = await params.wallet.signMessage(payloadBase64);
|
|
70
|
+
return `Web3Signed ${payloadBase64}.${signature}`;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +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;AAepD;;;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,8CAA8C;AAC9C,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;SAC/B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAS3C;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAA4B;QACvC,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;QAC/B,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG;QAC5B,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,EAAE,MAAM,CAAC,GAAG;KAChB,CAAC;IAEF,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACtC,CAAC;IAED,4CAA4C;IAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SACvC,IAAI,EAAE;SACN,MAAM,CAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IAET,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAEnD,wCAAwC;IACxC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAEjE,OAAO,cAAc,aAAa,IAAI,SAAS,EAAE,CAAC;AACpD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@opendatalabs/personal-server-ts-core",
|
|
3
|
+
"version": "0.0.1-canary.0d0705b",
|
|
4
|
+
"description": "Protocol logic for the Vana Personal Server — auth, grants, scopes, storage, keys",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/vana-com/personal-server-ts.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/vana-com/personal-server-ts#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/vana-com/personal-server-ts/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"exports": {
|
|
23
|
+
"./config": {
|
|
24
|
+
"types": "./dist/config/index.d.ts",
|
|
25
|
+
"import": "./dist/config/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./logger": {
|
|
28
|
+
"types": "./dist/logger/index.d.ts",
|
|
29
|
+
"import": "./dist/logger/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./errors": {
|
|
32
|
+
"types": "./dist/errors/catalog.d.ts",
|
|
33
|
+
"import": "./dist/errors/catalog.js"
|
|
34
|
+
},
|
|
35
|
+
"./schemas": {
|
|
36
|
+
"types": "./dist/schemas/server-config.d.ts",
|
|
37
|
+
"import": "./dist/schemas/server-config.js"
|
|
38
|
+
},
|
|
39
|
+
"./scopes": {
|
|
40
|
+
"types": "./dist/scopes/index.d.ts",
|
|
41
|
+
"import": "./dist/scopes/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./storage/hierarchy": {
|
|
44
|
+
"types": "./dist/storage/hierarchy/index.d.ts",
|
|
45
|
+
"import": "./dist/storage/hierarchy/index.js"
|
|
46
|
+
},
|
|
47
|
+
"./storage/index": {
|
|
48
|
+
"types": "./dist/storage/index/index.d.ts",
|
|
49
|
+
"import": "./dist/storage/index/index.js"
|
|
50
|
+
},
|
|
51
|
+
"./schemas/data-file": {
|
|
52
|
+
"types": "./dist/schemas/data-file.d.ts",
|
|
53
|
+
"import": "./dist/schemas/data-file.js"
|
|
54
|
+
},
|
|
55
|
+
"./auth": {
|
|
56
|
+
"types": "./dist/auth/web3-signed.d.ts",
|
|
57
|
+
"import": "./dist/auth/web3-signed.js"
|
|
58
|
+
},
|
|
59
|
+
"./grants": {
|
|
60
|
+
"types": "./dist/grants/index.d.ts",
|
|
61
|
+
"import": "./dist/grants/index.js"
|
|
62
|
+
},
|
|
63
|
+
"./gateway": {
|
|
64
|
+
"types": "./dist/gateway/client.d.ts",
|
|
65
|
+
"import": "./dist/gateway/client.js"
|
|
66
|
+
},
|
|
67
|
+
"./logging/access-log": {
|
|
68
|
+
"types": "./dist/logging/access-log.d.ts",
|
|
69
|
+
"import": "./dist/logging/access-log.js"
|
|
70
|
+
},
|
|
71
|
+
"./keys": {
|
|
72
|
+
"types": "./dist/keys/index.d.ts",
|
|
73
|
+
"import": "./dist/keys/index.js"
|
|
74
|
+
},
|
|
75
|
+
"./logging/access-reader": {
|
|
76
|
+
"types": "./dist/logging/access-reader.d.ts",
|
|
77
|
+
"import": "./dist/logging/access-reader.js"
|
|
78
|
+
},
|
|
79
|
+
"./signing": {
|
|
80
|
+
"types": "./dist/signing/index.d.ts",
|
|
81
|
+
"import": "./dist/signing/index.js"
|
|
82
|
+
},
|
|
83
|
+
"./sync": {
|
|
84
|
+
"types": "./dist/sync/index.d.ts",
|
|
85
|
+
"import": "./dist/sync/index.js"
|
|
86
|
+
},
|
|
87
|
+
"./storage/encryption": {
|
|
88
|
+
"types": "./dist/storage/encryption/index.d.ts",
|
|
89
|
+
"import": "./dist/storage/encryption/index.js"
|
|
90
|
+
},
|
|
91
|
+
"./storage/adapters": {
|
|
92
|
+
"types": "./dist/storage/adapters/index.d.ts",
|
|
93
|
+
"import": "./dist/storage/adapters/index.js"
|
|
94
|
+
},
|
|
95
|
+
"./test-utils": {
|
|
96
|
+
"types": "./dist/test-utils/index.d.ts",
|
|
97
|
+
"import": "./dist/test-utils/index.js"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"scripts": {
|
|
101
|
+
"build": "tsc --build"
|
|
102
|
+
},
|
|
103
|
+
"dependencies": {
|
|
104
|
+
"@noble/hashes": "^2.0.1",
|
|
105
|
+
"better-sqlite3": "^12.6.2",
|
|
106
|
+
"openpgp": "^6.3.0",
|
|
107
|
+
"pino": "^10.3.0",
|
|
108
|
+
"pino-pretty": "^13.0.0",
|
|
109
|
+
"viem": "^2.45.1",
|
|
110
|
+
"zod": "^4.3.6"
|
|
111
|
+
},
|
|
112
|
+
"devDependencies": {
|
|
113
|
+
"@types/better-sqlite3": "^7.6.0"
|
|
114
|
+
}
|
|
115
|
+
}
|