@opendatalabs/personal-server-ts-lite 1.33.8 → 1.34.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.
Files changed (51) hide show
  1. package/dist/additions-crypto.d.ts +3 -0
  2. package/dist/additions-crypto.d.ts.map +1 -0
  3. package/dist/additions-crypto.js +32 -0
  4. package/dist/additions-crypto.js.map +1 -0
  5. package/dist/additions-protocol.d.ts +48 -0
  6. package/dist/additions-protocol.d.ts.map +1 -0
  7. package/dist/additions-protocol.js +17 -0
  8. package/dist/additions-protocol.js.map +1 -0
  9. package/dist/additions-session.d.ts +18 -0
  10. package/dist/additions-session.d.ts.map +1 -0
  11. package/dist/additions-session.js +190 -0
  12. package/dist/additions-session.js.map +1 -0
  13. package/dist/additions-transport.d.ts +64 -0
  14. package/dist/additions-transport.d.ts.map +1 -0
  15. package/dist/additions-transport.js +333 -0
  16. package/dist/additions-transport.js.map +1 -0
  17. package/dist/additions-worker.bundle.js +30615 -0
  18. package/dist/additions-worker.d.ts +2 -0
  19. package/dist/additions-worker.d.ts.map +1 -0
  20. package/dist/additions-worker.js +259 -0
  21. package/dist/additions-worker.js.map +1 -0
  22. package/dist/browser-runtime.d.ts +2 -1
  23. package/dist/browser-runtime.d.ts.map +1 -1
  24. package/dist/browser-runtime.js +5 -1
  25. package/dist/browser-runtime.js.map +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/relay-tls.d.ts.map +1 -1
  30. package/dist/relay-tls.js +10 -0
  31. package/dist/relay-tls.js.map +1 -1
  32. package/dist/relay.d.ts +2 -2
  33. package/dist/relay.d.ts.map +1 -1
  34. package/dist/relay.js +114 -54
  35. package/dist/relay.js.map +1 -1
  36. package/dist/runtime.d.ts +2 -0
  37. package/dist/runtime.d.ts.map +1 -1
  38. package/dist/runtime.js +2 -1
  39. package/dist/runtime.js.map +1 -1
  40. package/dist/state.d.ts +8 -1
  41. package/dist/state.d.ts.map +1 -1
  42. package/dist/state.js +84 -20
  43. package/dist/state.js.map +1 -1
  44. package/dist/storage-utils.d.ts.map +1 -1
  45. package/dist/storage-utils.js +10 -2
  46. package/dist/storage-utils.js.map +1 -1
  47. package/dist/sync.d.ts +8 -1
  48. package/dist/sync.d.ts.map +1 -1
  49. package/dist/sync.js +53 -3
  50. package/dist/sync.js.map +1 -1
  51. package/package.json +8 -5
@@ -0,0 +1,333 @@
1
+ import { z } from "zod";
2
+ import { getAddress, keccak256, stringToHex } from "viem";
3
+ import { buildWeb3SignedHeader, deriveScopeKey, } from "@opendatalabs/vana-sdk/browser";
4
+ import { readBoundedResponse, createVersionInventoryClient, additionsLedgerScope, ADDITIONS_SUMMARY_SCOPE, } from "@opendatalabs/personal-server-ts-core/additions";
5
+ import { createGatewayDeleteDataPort } from "@opendatalabs/personal-server-ts-core/sync";
6
+ import { resolveVanaStorageEndpoint } from "@opendatalabs/personal-server-ts-core/storage/adapters";
7
+ const hash = z.string().regex(/^0x[0-9a-fA-F]{64}$/);
8
+ const publicationHeaderSchema = z.object({
9
+ scope: z.string().min(1).max(256),
10
+ expectedVersion: z.string().regex(/^[1-9][0-9]*$/),
11
+ dataHash: hash,
12
+ metadataHash: hash,
13
+ });
14
+ const publicationSchema = publicationHeaderSchema.extend({
15
+ encrypted: z.array(z.number().int().min(0).max(255)),
16
+ });
17
+ const legacySealedSchema = z.object({
18
+ iv: z.array(z.number().int().min(0).max(255)).length(12),
19
+ ciphertext: z.array(z.number().int().min(0).max(255)),
20
+ });
21
+ const binarySealedSchema = z.object({
22
+ version: z.literal(2),
23
+ iv: z.instanceof(Uint8Array).refine((bytes) => bytes.byteLength === 12),
24
+ ciphertext: z.instanceof(Uint8Array),
25
+ });
26
+ export function createPsLiteAdditionsTransport(options) {
27
+ const candidateStore = options.stateStore.bounded;
28
+ if (!candidateStore)
29
+ throw new Error("Bounded additions persistence unavailable");
30
+ const stateStore = candidateStore;
31
+ const owner = getAddress(options.ownerAddress).toLowerCase();
32
+ const storage = resolveVanaStorageEndpoint(options.config);
33
+ const gateway = options.config.gateway.url.replace(/\/+$/, "");
34
+ const network = `vana:${options.config.gateway.chainId}:${new URL(gateway).origin}`;
35
+ const fetcher = options.fetch ?? globalThis.fetch;
36
+ const binding = (scope) => JSON.stringify([owner, network, scope]);
37
+ const journalKey = (scope) => `additions-publication-v1:${keccak256(stringToHex(binding(scope)))}`;
38
+ const blobUrl = (scope, version) => `${storage}/v1/chains/${options.config.gateway.chainId}/blobs/${owner}/${scope.split("/").map(encodeURIComponent).join("/")}/${version}`;
39
+ const key = crypto.subtle.importKey("raw", Uint8Array.from(deriveScopeKey(options.masterKey, "ps-lite.additions-journal.v1")), "AES-GCM", false, ["encrypt", "decrypt"]);
40
+ async function fetchBounded(input, budget) {
41
+ budget.charge(input.body?.byteLength ?? 0);
42
+ const response = await fetcher(input.url, {
43
+ method: input.method ?? "GET",
44
+ headers: input.headers,
45
+ body: input.body ? Uint8Array.from(input.body) : undefined,
46
+ signal: budget.signal,
47
+ redirect: "error",
48
+ cache: "no-store",
49
+ });
50
+ const body = await readBoundedResponse(response, budget);
51
+ budget.charge();
52
+ return {
53
+ status: response.status,
54
+ headers: Array.from(response.headers.entries()),
55
+ body,
56
+ };
57
+ }
58
+ async function signRequest(params, signal) {
59
+ signal?.throwIfAborted();
60
+ const result = await buildWeb3SignedHeader({
61
+ ...params,
62
+ signMessage: (message) => options.ownerSigner.signMessageBounded(message, signal),
63
+ });
64
+ signal?.throwIfAborted();
65
+ return result;
66
+ }
67
+ // Each session belongs to one Web Lock and one worker lifetime. Cache only
68
+ // authenticated fingerprints, since returning candidate buffers transfers ownership.
69
+ function openSession() {
70
+ const fingerprints = new Map();
71
+ function fingerprint(prepared) {
72
+ return JSON.stringify([
73
+ prepared.scope,
74
+ prepared.expectedVersion,
75
+ prepared.dataHash,
76
+ prepared.metadataHash,
77
+ keccak256(prepared.encrypted),
78
+ ]);
79
+ }
80
+ async function persistPending(prepared, budget) {
81
+ const { encrypted, ...metadata } = prepared;
82
+ const header = new TextEncoder().encode(JSON.stringify(metadata));
83
+ if (header.byteLength > 4096)
84
+ throw new Error("Checkpoint journal header too large");
85
+ budget.charge((header.byteLength + 20) * 8);
86
+ const plaintext = new Uint8Array(4 + header.byteLength + encrypted.byteLength);
87
+ new DataView(plaintext.buffer).setUint32(0, header.byteLength);
88
+ plaintext.set(header, 4);
89
+ plaintext.set(encrypted, 4 + header.byteLength);
90
+ const iv = crypto.getRandomValues(new Uint8Array(12));
91
+ const ciphertext = await crypto.subtle.encrypt({
92
+ name: "AES-GCM",
93
+ iv,
94
+ additionalData: new TextEncoder().encode(binding(prepared.scope)),
95
+ }, await key, plaintext);
96
+ budget.charge();
97
+ await stateStore.set(journalKey(prepared.scope), { version: 2, iv, ciphertext: new Uint8Array(ciphertext) }, budget.signal);
98
+ budget.charge();
99
+ }
100
+ async function readPending(scope, budget) {
101
+ budget.charge();
102
+ const value = await stateStore.get(journalKey(scope), budget.signal);
103
+ budget.charge();
104
+ if (value === null) {
105
+ fingerprints.set(scope, null);
106
+ return null;
107
+ }
108
+ // Bound clone/validation work before a schema can materialize legacy arrays.
109
+ // Inspect only the container and length here; array validation happens after admission.
110
+ if (!value || typeof value !== "object" || !("ciphertext" in value))
111
+ throw new Error("Invalid checkpoint journal");
112
+ const bytes = value.ciphertext;
113
+ if (!(bytes instanceof Uint8Array) && !Array.isArray(bytes))
114
+ throw new Error("Invalid checkpoint journal ciphertext");
115
+ budget.charge(bytes.length * 16);
116
+ const binary = binarySealedSchema.safeParse(value);
117
+ const entry = binary.success
118
+ ? binary.data
119
+ : legacySealedSchema.parse(value);
120
+ const plaintext = await crypto.subtle.decrypt({
121
+ name: "AES-GCM",
122
+ iv: Uint8Array.from(entry.iv),
123
+ additionalData: new TextEncoder().encode(binding(scope)),
124
+ }, await key, Uint8Array.from(entry.ciphertext));
125
+ budget.charge(plaintext.byteLength * 8);
126
+ let prepared;
127
+ if (binary.success) {
128
+ if (plaintext.byteLength < 4)
129
+ throw new Error("Invalid checkpoint journal header");
130
+ const headerLength = new DataView(plaintext).getUint32(0);
131
+ if (headerLength > 4096 || headerLength > plaintext.byteLength - 4)
132
+ throw new Error("Invalid checkpoint journal header length");
133
+ const header = publicationHeaderSchema.parse(JSON.parse(new TextDecoder().decode(new Uint8Array(plaintext, 4, headerLength))));
134
+ prepared = {
135
+ ...header,
136
+ dataHash: hash.parse(header.dataHash),
137
+ metadataHash: hash.parse(header.metadataHash),
138
+ encrypted: new Uint8Array(plaintext, 4 + headerLength),
139
+ };
140
+ }
141
+ else {
142
+ const parsed = publicationSchema.parse(JSON.parse(new TextDecoder().decode(plaintext)));
143
+ prepared = {
144
+ ...parsed,
145
+ dataHash: hash.parse(parsed.dataHash),
146
+ metadataHash: hash.parse(parsed.metadataHash),
147
+ encrypted: Uint8Array.from(parsed.encrypted),
148
+ };
149
+ }
150
+ if (prepared.scope !== scope)
151
+ throw new Error("Checkpoint journal scope mismatch");
152
+ if (!binary.success) {
153
+ // An old admitted intent may need a separate capped migration pass.
154
+ // Commit the compact representation before attempting network retries.
155
+ budget.charge(prepared.encrypted.byteLength * 8 + 32 * 1024);
156
+ await persistPending(prepared, budget);
157
+ }
158
+ fingerprints.set(scope, fingerprint(prepared));
159
+ return prepared;
160
+ }
161
+ async function clearPending(scope, budget) {
162
+ budget.charge();
163
+ await stateStore.delete(journalKey(scope), budget.signal);
164
+ fingerprints.set(scope, null);
165
+ budget.charge();
166
+ }
167
+ async function publish(prepared, budget) {
168
+ budget.charge(prepared.encrypted.byteLength * 32);
169
+ if (!fingerprints.has(prepared.scope))
170
+ await readPending(prepared.scope, budget);
171
+ const pending = fingerprints.get(prepared.scope);
172
+ const candidate = fingerprint(prepared);
173
+ if (pending && pending !== candidate)
174
+ throw new Error("Interrupted checkpoint must be reconciled before replacement");
175
+ if (!pending) {
176
+ await persistPending(prepared, budget);
177
+ fingerprints.set(prepared.scope, candidate);
178
+ }
179
+ const url = blobUrl(prepared.scope, prepared.expectedVersion);
180
+ const authorization = await signRequest({
181
+ aud: options.storageAudience ?? storage,
182
+ method: "PUT",
183
+ uri: new URL(url).pathname,
184
+ body: prepared.encrypted,
185
+ }, budget.signal);
186
+ const uploaded = await fetchBounded({
187
+ url,
188
+ method: "PUT",
189
+ headers: [
190
+ ["authorization", authorization],
191
+ ["content-type", "application/octet-stream"],
192
+ ],
193
+ body: prepared.encrypted,
194
+ }, budget);
195
+ if (uploaded.status < 200 || uploaded.status >= 300)
196
+ throw new Error(`Checkpoint upload failed (${uploaded.status})`);
197
+ budget.charge();
198
+ const signature = await options.ownerSigner.signAddDataBounded({
199
+ ownerAddress: getAddress(owner),
200
+ scope: prepared.scope,
201
+ dataHash: prepared.dataHash,
202
+ metadataHash: prepared.metadataHash,
203
+ expectedVersion: BigInt(prepared.expectedVersion),
204
+ }, budget.signal);
205
+ budget.charge();
206
+ const body = new TextEncoder().encode(JSON.stringify({
207
+ ownerAddress: owner,
208
+ scope: prepared.scope,
209
+ dataHash: prepared.dataHash,
210
+ metadataHash: prepared.metadataHash,
211
+ expectedVersion: prepared.expectedVersion,
212
+ }));
213
+ const registered = await fetchBounded({
214
+ url: `${gateway}/v1/data`,
215
+ method: "POST",
216
+ headers: [
217
+ ["Content-Type", "application/json"],
218
+ ["Authorization", `Web3Signed ${signature}`],
219
+ ],
220
+ body,
221
+ }, budget);
222
+ if (registered.status < 200 || registered.status >= 300)
223
+ throw new Error(`Checkpoint registration failed (${registered.status})`);
224
+ // Keep the journal until the worker verifies inventory AND decrypted blob commitments.
225
+ }
226
+ return {
227
+ fetch: fetchBounded,
228
+ signRequest,
229
+ publish,
230
+ readPending,
231
+ clearPending,
232
+ download,
233
+ };
234
+ }
235
+ async function download(key, budget) {
236
+ const slash = key.lastIndexOf("/");
237
+ const scope = key.slice(0, slash);
238
+ const version = key.slice(slash + 1);
239
+ if (slash < 1 || !/^[1-9][0-9]*$/.test(version))
240
+ throw new Error("Invalid checkpoint blob key");
241
+ const response = await fetchBounded({ url: blobUrl(scope, version) }, budget);
242
+ if (response.status < 200 || response.status >= 300)
243
+ throw new Error(`Checkpoint download failed (${response.status})`);
244
+ return response.body;
245
+ }
246
+ async function tombstone(scope, budget) {
247
+ budget.charge();
248
+ if (scope !== "vana.system.additions" &&
249
+ !scope.startsWith("vana.system.additions.") &&
250
+ !/^vana\.system\.additions-hash\.[0-9a-f]{64}$/.test(scope))
251
+ throw new Error("Bounded deletion is limited to additions scopes");
252
+ const inventory = createVersionInventoryClient({
253
+ gatewayUrl: gateway,
254
+ ownerAddress: options.ownerAddress,
255
+ ownerSigner: { signRequest },
256
+ boundedOwnerSigner: signRequest,
257
+ fetch: fetcher,
258
+ });
259
+ const port = createGatewayDeleteDataPort({
260
+ gatewayUrl: gateway,
261
+ serverOwner: getAddress(options.ownerAddress),
262
+ dataPointFeed: {
263
+ async getDataPoint({ ownerAddress, scope }) {
264
+ if (ownerAddress.toLowerCase() !== owner)
265
+ throw new Error("Deletion owner changed");
266
+ const page = await inventory.page(scope, {
267
+ limit: 1,
268
+ budget,
269
+ signal: budget.signal,
270
+ });
271
+ const head = page.data.head;
272
+ return head
273
+ ? {
274
+ ...head,
275
+ id: page.data.dataPointId,
276
+ ownerAddress,
277
+ scope,
278
+ addedAt: page.data.versions[0]?.addedAt ?? "",
279
+ }
280
+ : null;
281
+ },
282
+ listDataPointsByOwner: async () => {
283
+ throw new Error("Deletion cannot enumerate data");
284
+ },
285
+ },
286
+ signer: {
287
+ signAddData: (message) => options.ownerSigner.signAddDataBounded(message, budget.signal),
288
+ },
289
+ storage: {
290
+ endpoint: storage,
291
+ audience: options.storageAudience,
292
+ chainId: options.config.gateway.chainId,
293
+ signMessage: (message) => options.ownerSigner.signMessageBounded(message, budget.signal),
294
+ },
295
+ fetch: async (url, init) => {
296
+ const result = await fetchBounded({
297
+ url: String(url),
298
+ method: init?.method,
299
+ headers: Array.from(new Headers(init?.headers).entries()),
300
+ body: typeof init?.body === "string"
301
+ ? new TextEncoder().encode(init.body)
302
+ : undefined,
303
+ }, budget);
304
+ return new Response(result.body.length ? Uint8Array.from(result.body) : null, { status: result.status, headers: result.headers });
305
+ },
306
+ });
307
+ const outcome = await port.tombstone(scope);
308
+ budget.charge();
309
+ return outcome;
310
+ }
311
+ async function deleteScope(scope, budget) {
312
+ if (scope.startsWith("vana.system."))
313
+ return;
314
+ const intent = `additions-deletion-v1:${keccak256(stringToHex(binding(scope)))}`;
315
+ const pending = await stateStore.get(intent, budget.signal);
316
+ budget.charge();
317
+ const ledger = additionsLedgerScope(scope);
318
+ // Write intent before touching the registry: a crash after the ledger
319
+ // tombstone must still retry summary invalidation and journal clearing.
320
+ await stateStore.set(intent, true, budget.signal);
321
+ const outcome = await tombstone(ledger, budget);
322
+ await openSession().clearPending(ledger, budget);
323
+ if (pending || outcome.status === "tombstoned") {
324
+ await tombstone(ADDITIONS_SUMMARY_SCOPE, budget);
325
+ await openSession().clearPending(ADDITIONS_SUMMARY_SCOPE, budget);
326
+ }
327
+ // Repeated polls must not invalidate a subsequently rebuilt summary.
328
+ await stateStore.delete(intent, budget.signal);
329
+ budget.charge();
330
+ }
331
+ return { ...openSession(), openSession, tombstone, deleteScope };
332
+ }
333
+ //# sourceMappingURL=additions-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"additions-transport.js","sourceRoot":"","sources":["../src/additions-transport.ts"],"names":[],"mappings":"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"}