@opendatalabs/personal-server-ts-core 1.7.0 → 1.9.0

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 (122) hide show
  1. package/dist/api/index.d.ts +64 -2
  2. package/dist/api/index.d.ts.map +1 -1
  3. package/dist/api/index.js +189 -45
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/contracts/data.d.ts +16 -1
  6. package/dist/contracts/data.d.ts.map +1 -1
  7. package/dist/contracts/data.js +71 -19
  8. package/dist/contracts/data.js.map +1 -1
  9. package/dist/derivatives/api.d.ts +33 -0
  10. package/dist/derivatives/api.d.ts.map +1 -0
  11. package/dist/derivatives/api.js +216 -0
  12. package/dist/derivatives/api.js.map +1 -0
  13. package/dist/derivatives/compute.d.ts +106 -0
  14. package/dist/derivatives/compute.d.ts.map +1 -0
  15. package/dist/derivatives/compute.js +373 -0
  16. package/dist/derivatives/compute.js.map +1 -0
  17. package/dist/derivatives/index.d.ts +9 -0
  18. package/dist/derivatives/index.d.ts.map +1 -0
  19. package/dist/derivatives/index.js +9 -0
  20. package/dist/derivatives/index.js.map +1 -0
  21. package/dist/derivatives/inference.d.ts +102 -0
  22. package/dist/derivatives/inference.d.ts.map +1 -0
  23. package/dist/derivatives/inference.js +159 -0
  24. package/dist/derivatives/inference.js.map +1 -0
  25. package/dist/derivatives/prompt.d.ts +64 -0
  26. package/dist/derivatives/prompt.d.ts.map +1 -0
  27. package/dist/derivatives/prompt.js +186 -0
  28. package/dist/derivatives/prompt.js.map +1 -0
  29. package/dist/derivatives/registration.d.ts +53 -0
  30. package/dist/derivatives/registration.d.ts.map +1 -0
  31. package/dist/derivatives/registration.js +163 -0
  32. package/dist/derivatives/registration.js.map +1 -0
  33. package/dist/derivatives/scheduler.d.ts +56 -0
  34. package/dist/derivatives/scheduler.d.ts.map +1 -0
  35. package/dist/derivatives/scheduler.js +151 -0
  36. package/dist/derivatives/scheduler.js.map +1 -0
  37. package/dist/derivatives/store.d.ts +14 -0
  38. package/dist/derivatives/store.d.ts.map +1 -0
  39. package/dist/derivatives/store.js +75 -0
  40. package/dist/derivatives/store.js.map +1 -0
  41. package/dist/derivatives/types.d.ts +72 -0
  42. package/dist/derivatives/types.d.ts.map +1 -0
  43. package/dist/derivatives/types.js +25 -0
  44. package/dist/derivatives/types.js.map +1 -0
  45. package/dist/errors/catalog.d.ts +26 -0
  46. package/dist/errors/catalog.d.ts.map +1 -1
  47. package/dist/errors/catalog.js +39 -1
  48. package/dist/errors/catalog.js.map +1 -1
  49. package/dist/logging/access-log.d.ts +7 -1
  50. package/dist/logging/access-log.d.ts.map +1 -1
  51. package/dist/mcp/read-client.d.ts.map +1 -1
  52. package/dist/mcp/read-client.js +25 -1
  53. package/dist/mcp/read-client.js.map +1 -1
  54. package/dist/mcp/session.d.ts.map +1 -1
  55. package/dist/mcp/session.js +10 -1
  56. package/dist/mcp/session.js.map +1 -1
  57. package/dist/ports/index.d.ts +125 -0
  58. package/dist/ports/index.d.ts.map +1 -1
  59. package/dist/ports/index.js.map +1 -1
  60. package/dist/schemas/server-config.d.ts +12 -0
  61. package/dist/schemas/server-config.d.ts.map +1 -1
  62. package/dist/schemas/server-config.js +29 -0
  63. package/dist/schemas/server-config.js.map +1 -1
  64. package/dist/storage/adapters/index.d.ts +1 -1
  65. package/dist/storage/adapters/index.d.ts.map +1 -1
  66. package/dist/storage/adapters/index.js +1 -1
  67. package/dist/storage/adapters/index.js.map +1 -1
  68. package/dist/storage/adapters/vana.d.ts +2 -0
  69. package/dist/storage/adapters/vana.d.ts.map +1 -1
  70. package/dist/storage/adapters/vana.js +5 -1
  71. package/dist/storage/adapters/vana.js.map +1 -1
  72. package/dist/storage/index/types.d.ts +1 -0
  73. package/dist/storage/index/types.d.ts.map +1 -1
  74. package/dist/sync/data-point-feed.d.ts +35 -0
  75. package/dist/sync/data-point-feed.d.ts.map +1 -0
  76. package/dist/sync/data-point-feed.js +122 -0
  77. package/dist/sync/data-point-feed.js.map +1 -0
  78. package/dist/sync/delete-data-port.d.ts +50 -0
  79. package/dist/sync/delete-data-port.d.ts.map +1 -0
  80. package/dist/sync/delete-data-port.js +244 -0
  81. package/dist/sync/delete-data-port.js.map +1 -0
  82. package/dist/sync/engine/sync-manager.d.ts +14 -4
  83. package/dist/sync/engine/sync-manager.d.ts.map +1 -1
  84. package/dist/sync/engine/sync-manager.js +53 -8
  85. package/dist/sync/engine/sync-manager.js.map +1 -1
  86. package/dist/sync/index.d.ts +7 -0
  87. package/dist/sync/index.d.ts.map +1 -1
  88. package/dist/sync/index.js +7 -0
  89. package/dist/sync/index.js.map +1 -1
  90. package/dist/sync/pending-blob-deletions.d.ts +29 -0
  91. package/dist/sync/pending-blob-deletions.d.ts.map +1 -0
  92. package/dist/sync/pending-blob-deletions.js +116 -0
  93. package/dist/sync/pending-blob-deletions.js.map +1 -0
  94. package/dist/sync/scope-deletions.d.ts +155 -0
  95. package/dist/sync/scope-deletions.d.ts.map +1 -0
  96. package/dist/sync/scope-deletions.js +225 -0
  97. package/dist/sync/scope-deletions.js.map +1 -0
  98. package/dist/sync/tombstone.d.ts +27 -0
  99. package/dist/sync/tombstone.d.ts.map +1 -0
  100. package/dist/sync/tombstone.js +28 -0
  101. package/dist/sync/tombstone.js.map +1 -0
  102. package/dist/sync/workers/delete.d.ts +152 -31
  103. package/dist/sync/workers/delete.d.ts.map +1 -1
  104. package/dist/sync/workers/delete.js +461 -27
  105. package/dist/sync/workers/delete.js.map +1 -1
  106. package/dist/sync/workers/download.d.ts +52 -1
  107. package/dist/sync/workers/download.d.ts.map +1 -1
  108. package/dist/sync/workers/download.js +129 -2
  109. package/dist/sync/workers/download.js.map +1 -1
  110. package/dist/sync/workers/upload.d.ts +31 -1
  111. package/dist/sync/workers/upload.d.ts.map +1 -1
  112. package/dist/sync/workers/upload.js +108 -4
  113. package/dist/sync/workers/upload.js.map +1 -1
  114. package/dist/test-utils/index.d.ts +1 -0
  115. package/dist/test-utils/index.d.ts.map +1 -1
  116. package/dist/test-utils/index.js +1 -0
  117. package/dist/test-utils/index.js.map +1 -1
  118. package/dist/test-utils/memory-storage.d.ts +12 -0
  119. package/dist/test-utils/memory-storage.d.ts.map +1 -0
  120. package/dist/test-utils/memory-storage.js +146 -0
  121. package/dist/test-utils/memory-storage.js.map +1 -0
  122. package/package.json +5 -1
@@ -0,0 +1,122 @@
1
+ import { computeDataPointId } from "./data-point-id.js";
2
+ import { TOMBSTONE_DATA_HASH, TOMBSTONE_METADATA_HASH } from "./tombstone.js";
3
+ /**
4
+ * Deletion-aware gateway feed over the same REST endpoints the SDK client
5
+ * uses, plus the `includeDeleted=true` query the SDK does not expose:
6
+ *
7
+ * GET {gateway}/v1/data?user={owner}&includeDeleted=true[&cursor=..][&since=..][&limit=..]
8
+ * GET {gateway}/v1/data/{dataPointId}?includeDeleted=true
9
+ *
10
+ * Rows come back with `deletedAt` (null while live). A gateway that answers
11
+ * the single lookup of a tombstoned point with 410 instead of a row is
12
+ * normalised into a deleted record so callers never have to catch a 410.
13
+ */
14
+ export function createGatewayDataPointFeed(options) {
15
+ const base = options.gatewayUrl.replace(/\/+$/, "");
16
+ const fetchImpl = options.fetch ?? globalThis.fetch;
17
+ const now = options.now ?? (() => new Date());
18
+ return {
19
+ async listDataPointsByOwner(owner, cursor, listOptions) {
20
+ const params = new URLSearchParams({ user: owner });
21
+ if (cursor !== null)
22
+ params.set("cursor", cursor);
23
+ if (listOptions?.since)
24
+ params.set("since", listOptions.since);
25
+ if (listOptions?.limit !== undefined) {
26
+ params.set("limit", String(listOptions.limit));
27
+ }
28
+ if (listOptions?.includeDeleted)
29
+ params.set("includeDeleted", "true");
30
+ const res = await fetchImpl(`${base}/v1/data?${params.toString()}`);
31
+ if (!res.ok) {
32
+ throw new Error(`Gateway error: ${res.status} ${res.statusText}`);
33
+ }
34
+ const envelope = (await res.json());
35
+ const nextCursor = envelope.pagination?.hasMore === false
36
+ ? null
37
+ : (envelope.pagination?.nextCursor ?? null);
38
+ const rows = envelope.data?.dataPoints ?? [];
39
+ return {
40
+ dataPoints: rows.map((row) => normalizeRecord(row)),
41
+ cursor: nextCursor,
42
+ };
43
+ },
44
+ async getDataPoint(input) {
45
+ const dataPointId = computeDataPointId(input.ownerAddress, input.scope);
46
+ const res = await fetchImpl(`${base}/v1/data/${dataPointId}?includeDeleted=true`);
47
+ if (res.status === 404)
48
+ return null;
49
+ if (res.status === 410) {
50
+ // Tombstoned. Prefer the row the gateway echoes in the 410 body;
51
+ // otherwise synthesise the minimum a caller needs to treat the point
52
+ // as deleted "at or before now".
53
+ const body = await res.json().catch(() => null);
54
+ const echoed = unwrap(body);
55
+ const deletedAt = stringField(echoed, "deletedAt") ?? now().toISOString();
56
+ return {
57
+ id: dataPointId,
58
+ ownerAddress: input.ownerAddress,
59
+ scope: input.scope,
60
+ dataHash: stringField(echoed, "dataHash") ?? TOMBSTONE_DATA_HASH,
61
+ metadataHash: stringField(echoed, "metadataHash") ?? TOMBSTONE_METADATA_HASH,
62
+ expectedVersion: stringField(echoed, "expectedVersion") ?? "0",
63
+ addedAt: stringField(echoed, "addedAt") ?? deletedAt,
64
+ deletedAt,
65
+ };
66
+ }
67
+ if (!res.ok) {
68
+ throw new Error(`Gateway error: ${res.status} ${res.statusText}`);
69
+ }
70
+ const body = await res.json();
71
+ return normalizeRecord(unwrap(body));
72
+ },
73
+ };
74
+ }
75
+ // The gateway wraps single-resource responses as `{ data: {...} }` (the SDK's
76
+ // unwrapEnvelope); tolerate a bare object too.
77
+ function unwrap(body) {
78
+ if (typeof body !== "object" || body === null)
79
+ return null;
80
+ const record = body;
81
+ if (typeof record.data === "object" && record.data !== null) {
82
+ return record.data;
83
+ }
84
+ return record;
85
+ }
86
+ function stringField(record, key) {
87
+ const value = record?.[key];
88
+ return typeof value === "string" ? value : undefined;
89
+ }
90
+ function normalizeRecord(row) {
91
+ const record = (row ?? {});
92
+ const deletedAt = record.deletedAt;
93
+ return {
94
+ ...record,
95
+ deletedAt: typeof deletedAt === "string" ? deletedAt : null,
96
+ };
97
+ }
98
+ /**
99
+ * Adapter from the SDK `GatewayClient` listing to the feed shape. Used when a
100
+ * host wires no dedicated feed: deletions are only visible if the gateway
101
+ * happens to include `deletedAt` without being asked, so this is a
102
+ * degraded mode. Prefer `createGatewayDataPointFeed`.
103
+ */
104
+ export function feedFromGatewayClient(gateway) {
105
+ return {
106
+ async listDataPointsByOwner(owner, cursor, listOptions) {
107
+ const { includeDeleted: _includeDeleted, ...sdkOptions } = listOptions ?? {};
108
+ const result = Object.keys(sdkOptions).length > 0
109
+ ? await gateway.listDataPointsByOwner(owner, cursor, sdkOptions)
110
+ : await gateway.listDataPointsByOwner(owner, cursor);
111
+ return {
112
+ dataPoints: result.dataPoints.map((row) => normalizeRecord(row)),
113
+ cursor: result.cursor,
114
+ };
115
+ },
116
+ async getDataPoint(input) {
117
+ const row = await gateway.getDataPoint(computeDataPointId(input.ownerAddress, input.scope));
118
+ return row === null ? null : normalizeRecord(row);
119
+ },
120
+ };
121
+ }
122
+ //# sourceMappingURL=data-point-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-point-feed.js","sourceRoot":"","sources":["../../src/sync/data-point-feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { DataPointFeedPort, DeleteDataPort } from "../ports/index.js";
2
+ import type { ServerSigner } from "../signing/signer.js";
3
+ export interface GatewayDeleteDataPortOptions {
4
+ /** Gateway base URL, e.g. https://dp-rpc.vana.org */
5
+ gatewayUrl: string;
6
+ /** Deletion-aware registry lookup (current version + deleted state). */
7
+ dataPointFeed: DataPointFeedPort;
8
+ /** Data owner the tombstone is registered on behalf of. */
9
+ serverOwner: `0x${string}`;
10
+ /**
11
+ * The same signer the upload worker uses for AddData: the personal server
12
+ * account, which the registry trusts for this owner. Reused as-is so a
13
+ * tombstone is signed exactly like a normal registration.
14
+ */
15
+ signer: Pick<ServerSigner, "signAddData">;
16
+ storage: {
17
+ /** vana-storage base URL, e.g. https://storage.vana.org */
18
+ endpoint: string;
19
+ /** Protocol chain id; blob paths are chain-scoped. */
20
+ chainId: number;
21
+ /**
22
+ * EIP-191 signer for the Web3Signed storage auth. The same account the
23
+ * storage provider uploads with (the server account), so the DELETE is
24
+ * authorised the way PUT is.
25
+ */
26
+ signMessage(message: string): Promise<`0x${string}`>;
27
+ };
28
+ /** Test seam; defaults to the global fetch. */
29
+ fetch?: typeof fetch;
30
+ }
31
+ /**
32
+ * Remote deletion against the DPv2 gateway + vana-storage.
33
+ *
34
+ * Gateway (durable fact):
35
+ * DELETE {gateway}/v1/data/{dataPointId}
36
+ * Authorization: Web3Signed {signature}
37
+ * { ownerAddress, scope, expectedVersion, signature }
38
+ * where signature = EIP-712 AddData over
39
+ * { ownerAddress, scope, dataHash: TOMBSTONE_DATA_HASH,
40
+ * metadataHash: TOMBSTONE_METADATA_HASH, expectedVersion: current + 1 }
41
+ *
42
+ * Storage (one exact blob per version, never the scope prefix):
43
+ * DELETE {storage}/v1/chains/{chainId}/blobs/{owner}/{scope}/{version}
44
+ * authorization: Web3Signed (aud = storage endpoint, uri = that path)
45
+ * The path is the one the SDK's vana-storage provider uploads to: lowercased
46
+ * owner, every key segment URI-encoded; vana-storage resolves a three-segment
47
+ * path as a single-object delete and answers 404 when the object is absent.
48
+ */
49
+ export declare function createGatewayDeleteDataPort(options: GatewayDeleteDataPortOptions): DeleteDataPort;
50
+ //# sourceMappingURL=delete-data-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-data-port.d.ts","sourceRoot":"","sources":["../../src/sync/delete-data-port.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EAEjB,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKzD,MAAM,WAAW,4BAA4B;IAC3C,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,aAAa,EAAE,iBAAiB,CAAC;IACjC,2DAA2D;IAC3D,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B;;;;OAIG;IACH,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC1C,OAAO,EAAE;QACP,2DAA2D;QAC3D,QAAQ,EAAE,MAAM,CAAC;QACjB,sDAAsD;QACtD,OAAO,EAAE,MAAM,CAAC;QAChB;;;;WAIG;QACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;KACtD,CAAC;IACF,+CAA+C;IAC/C,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,cAAc,CA2LhB"}
@@ -0,0 +1,244 @@
1
+ import { buildWeb3SignedHeader } from "@opendatalabs/vana-sdk/browser";
2
+ import { computeDataPointId } from "./data-point-id.js";
3
+ import { parseGatewayNextVersion } from "./workers/upload.js";
4
+ import { TOMBSTONE_DATA_HASH, TOMBSTONE_METADATA_HASH } from "./tombstone.js";
5
+ /**
6
+ * Remote deletion against the DPv2 gateway + vana-storage.
7
+ *
8
+ * Gateway (durable fact):
9
+ * DELETE {gateway}/v1/data/{dataPointId}
10
+ * Authorization: Web3Signed {signature}
11
+ * { ownerAddress, scope, expectedVersion, signature }
12
+ * where signature = EIP-712 AddData over
13
+ * { ownerAddress, scope, dataHash: TOMBSTONE_DATA_HASH,
14
+ * metadataHash: TOMBSTONE_METADATA_HASH, expectedVersion: current + 1 }
15
+ *
16
+ * Storage (one exact blob per version, never the scope prefix):
17
+ * DELETE {storage}/v1/chains/{chainId}/blobs/{owner}/{scope}/{version}
18
+ * authorization: Web3Signed (aud = storage endpoint, uri = that path)
19
+ * The path is the one the SDK's vana-storage provider uploads to: lowercased
20
+ * owner, every key segment URI-encoded; vana-storage resolves a three-segment
21
+ * path as a single-object delete and answers 404 when the object is absent.
22
+ */
23
+ export function createGatewayDeleteDataPort(options) {
24
+ const gatewayBase = options.gatewayUrl.replace(/\/+$/, "");
25
+ const storageBase = options.storage.endpoint.replace(/\/+$/, "");
26
+ const fetchImpl = options.fetch ?? globalThis.fetch;
27
+ // The storage provider lowercases the owner in blob paths; match it or the
28
+ // exact DELETE keys would not be the ones PUT wrote.
29
+ const owner = options.serverOwner.toLowerCase();
30
+ async function sendTombstone(scope, dataPointId, version) {
31
+ const signature = await options.signer.signAddData({
32
+ ownerAddress: options.serverOwner,
33
+ scope,
34
+ dataHash: TOMBSTONE_DATA_HASH,
35
+ metadataHash: TOMBSTONE_METADATA_HASH,
36
+ expectedVersion: version,
37
+ });
38
+ return fetchImpl(`${gatewayBase}/v1/data/${dataPointId}`, {
39
+ method: "DELETE",
40
+ headers: {
41
+ "Content-Type": "application/json",
42
+ Authorization: `Web3Signed ${signature}`,
43
+ },
44
+ body: JSON.stringify({
45
+ ownerAddress: options.serverOwner,
46
+ scope,
47
+ expectedVersion: String(version),
48
+ signature,
49
+ }),
50
+ });
51
+ }
52
+ return {
53
+ async tombstone(scope) {
54
+ const dataPointId = computeDataPointId(options.serverOwner, scope);
55
+ const current = await options.dataPointFeed.getDataPoint({
56
+ ownerAddress: options.serverOwner,
57
+ scope,
58
+ });
59
+ if (current === null) {
60
+ return { status: "not-registered", dataPointId };
61
+ }
62
+ if (current.deletedAt !== null) {
63
+ return {
64
+ status: "already-deleted",
65
+ dataPointId,
66
+ version: current.expectedVersion,
67
+ deletedAt: current.deletedAt,
68
+ };
69
+ }
70
+ let version = BigInt(current.expectedVersion) + 1n;
71
+ let res = await sendTombstone(scope, dataPointId, version);
72
+ if (res.status === 409) {
73
+ // Another replica advanced the scope between our read and our
74
+ // write. The 409 body carries `currentExpectedVersion` (and the
75
+ // legacy message phrasing names the next valid version); re-sign
76
+ // once against it.
77
+ const body = await res.json().catch(() => null);
78
+ const conflict = unwrap(body);
79
+ // Gateway 409 body: `nextExpectedVersion` is the version to sign
80
+ // next; `currentExpectedVersion` is the version the gateway holds,
81
+ // so it needs +1. Prefer the explicit next, fall back to current+1,
82
+ // then to the legacy message phrasing.
83
+ const nextExplicit = integerField(conflict, "nextExpectedVersion") ??
84
+ integerField(body, "nextExpectedVersion");
85
+ const currentExpected = integerField(conflict, "currentExpectedVersion") ??
86
+ integerField(body, "currentExpectedVersion");
87
+ const legacyNext = parseGatewayNextVersion(detailFromBody(body, res.statusText));
88
+ const next = nextExplicit !== null
89
+ ? nextExplicit
90
+ : currentExpected !== null
91
+ ? currentExpected + 1n
92
+ : legacyNext !== null
93
+ ? BigInt(legacyNext)
94
+ : null;
95
+ if (next === null) {
96
+ throw new Error(`Gateway error: 409 ${detailFromBody(body, res.statusText)}`);
97
+ }
98
+ version = next;
99
+ res = await sendTombstone(scope, dataPointId, version);
100
+ }
101
+ if (res.status === 404) {
102
+ // The registry lost the row between our read and our write (or the
103
+ // feed answered from a replica ahead of the writer): nothing to
104
+ // tombstone.
105
+ return { status: "not-registered", dataPointId };
106
+ }
107
+ if (res.status === 410) {
108
+ // Raced with a concurrent deletion: the point is already gone. The
109
+ // winning tombstone may sit above the version we attempted (another
110
+ // replica advanced the scope first), and its version bounds the
111
+ // ciphertext to delete, so take the gateway's word: the echoed row,
112
+ // else a re-read of the deletion-aware feed, else unknown.
113
+ const body = await res.json().catch(() => null);
114
+ const echoed = unwrap(body);
115
+ let winning = normalizeVersionString(stringField(echoed, "expectedVersion"));
116
+ let deletedAt = stringField(echoed, "deletedAt");
117
+ if (winning === null) {
118
+ const reread = await options.dataPointFeed
119
+ .getDataPoint({ ownerAddress: options.serverOwner, scope })
120
+ .catch(() => null);
121
+ if (reread && reread.deletedAt !== null) {
122
+ winning = normalizeVersionString(reread.expectedVersion);
123
+ deletedAt = deletedAt ?? reread.deletedAt;
124
+ }
125
+ }
126
+ return {
127
+ status: "already-deleted",
128
+ dataPointId,
129
+ version: winning,
130
+ deletedAt,
131
+ };
132
+ }
133
+ if (!res.ok) {
134
+ throw new Error(`Gateway error: ${res.status} ${await errorDetail(res)}`);
135
+ }
136
+ const body = await res.json().catch(() => null);
137
+ const row = unwrap(body);
138
+ return {
139
+ status: "tombstoned",
140
+ dataPointId: stringField(row, "dataPointId") ?? dataPointId,
141
+ version: stringField(row, "expectedVersion") ?? String(version),
142
+ deletedAt: stringField(row, "deletedAt"),
143
+ };
144
+ },
145
+ async deleteBlobVersions(scope, versions) {
146
+ const outcome = {
147
+ deleted: [],
148
+ missing: [],
149
+ failed: [],
150
+ };
151
+ // Sequential on purpose: vana-storage rate-limits DELETE per owner
152
+ // and the caller already bounds the batch size per pass.
153
+ for (const version of versions) {
154
+ const path = `/v1/chains/${options.storage.chainId}/blobs/${owner}/${encodeURIComponent(scope)}/${encodeURIComponent(version)}`;
155
+ try {
156
+ const authorization = await buildWeb3SignedHeader({
157
+ signMessage: (message) => options.storage.signMessage(message),
158
+ aud: storageBase,
159
+ method: "DELETE",
160
+ uri: path,
161
+ });
162
+ const res = await fetchImpl(`${storageBase}${path}`, {
163
+ method: "DELETE",
164
+ headers: { authorization },
165
+ });
166
+ if (res.status === 404) {
167
+ // Idempotent: an absent object is a completed delete.
168
+ outcome.missing.push(version);
169
+ }
170
+ else if (res.ok) {
171
+ outcome.deleted.push(version);
172
+ }
173
+ else {
174
+ outcome.failed.push({
175
+ version,
176
+ error: `vana-storage delete failed: ${res.status} ${res.statusText}`,
177
+ });
178
+ }
179
+ }
180
+ catch (err) {
181
+ outcome.failed.push({
182
+ version,
183
+ error: err instanceof Error ? err.message : String(err),
184
+ });
185
+ }
186
+ }
187
+ return outcome;
188
+ },
189
+ };
190
+ }
191
+ async function errorDetail(res) {
192
+ const body = await res.json().catch(() => null);
193
+ return detailFromBody(body, res.statusText);
194
+ }
195
+ function detailFromBody(body, fallback) {
196
+ if (typeof body === "object" && body !== null) {
197
+ const record = body;
198
+ if (typeof record.error === "string")
199
+ return record.error;
200
+ if (typeof record.message === "string")
201
+ return record.message;
202
+ if (typeof record.error === "object" && record.error !== null) {
203
+ const nested = record.error;
204
+ if (typeof nested.message === "string")
205
+ return nested.message;
206
+ }
207
+ }
208
+ return fallback;
209
+ }
210
+ // Versions are unbounded integers on the wire (decimal strings); parse them
211
+ // as bigint so a value past Number.MAX_SAFE_INTEGER cannot round.
212
+ // A registry version is a positive decimal integer; anything else (including
213
+ // the "0" a body-less 410 can synthesise) is "unknown".
214
+ function normalizeVersionString(value) {
215
+ if (value === null || !/^\d+$/.test(value))
216
+ return null;
217
+ const parsed = BigInt(value);
218
+ return parsed > 0n ? parsed.toString() : null;
219
+ }
220
+ function integerField(record, key) {
221
+ if (typeof record !== "object" || record === null)
222
+ return null;
223
+ const value = record[key];
224
+ if (typeof value === "number" && Number.isSafeInteger(value)) {
225
+ return BigInt(value);
226
+ }
227
+ if (typeof value === "string" && /^\d+$/.test(value))
228
+ return BigInt(value);
229
+ return null;
230
+ }
231
+ function unwrap(body) {
232
+ if (typeof body !== "object" || body === null)
233
+ return null;
234
+ const record = body;
235
+ if (typeof record.data === "object" && record.data !== null) {
236
+ return record.data;
237
+ }
238
+ return record;
239
+ }
240
+ function stringField(record, key) {
241
+ const value = record?.[key];
242
+ return typeof value === "string" ? value : null;
243
+ }
244
+ //# sourceMappingURL=delete-data-port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-data-port.js","sourceRoot":"","sources":["../../src/sync/delete-data-port.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import type { UploadWorkerDeps } from "../workers/upload.js";
2
2
  import type { DownloadWorkerDeps } from "../workers/download.js";
3
3
  import type { SyncStatus } from "../types.js";
4
+ import { type DeleteScopeResult } from "../workers/delete.js";
5
+ import type { DeleteDataPort, PendingBlobDeletionStore } from "../../ports/index.js";
4
6
  export interface SyncManagerOptions {
5
7
  /** Polling interval in milliseconds (default: 60_000 = 1 minute) */
6
8
  pollInterval?: number;
@@ -10,6 +12,13 @@ export interface SyncManagerOptions {
10
12
  notifyDebounceMs?: number;
11
13
  /** Optional runtime gate. Returning blocked skips upload/download without an error. */
12
14
  canSync?: () => Promise<SyncCanRunResult> | SyncCanRunResult;
15
+ /**
16
+ * Remote deletion (gateway tombstone + storage blobs). Without it
17
+ * `deleteScope` is local-only and reports `durable: false`.
18
+ */
19
+ deleteData?: DeleteDataPort | null;
20
+ /** Durable retry marker for blob deletions that failed after the tombstone. */
21
+ pendingBlobDeletions?: PendingBlobDeletionStore;
13
22
  }
14
23
  export type SyncCanRunResult = {
15
24
  ok: true;
@@ -30,11 +39,12 @@ export interface SyncManager {
30
39
  /** Signal that new data has been ingested (next cycle picks it up) */
31
40
  notifyNewData(): void;
32
41
  /**
33
- * Propagate a scope deletion to the authoritative stores (R2 blobs + gateway file records).
34
- * Call BEFORE deleting the scope locally it reads the local index to find what to remove.
35
- * Best-effort: resolves with a summary; per-file failures are logged, not thrown.
42
+ * Durable scope deletion: gateway tombstone, then storage blobs, then the
43
+ * local copy (see workers/delete.ts for why that order is the only safe
44
+ * one). Resolves with a per-step result; a gateway failure leaves the
45
+ * local copy in place and is reported as `steps.gateway.status = "failed"`.
36
46
  */
37
- deleteScopeRemote(scope: string): Promise<void>;
47
+ deleteScope(scope: string): Promise<DeleteScopeResult>;
38
48
  /** Whether the sync manager is currently running */
39
49
  readonly running: boolean;
40
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sync-manager.d.ts","sourceRoot":"","sources":["../../../src/sync/engine/sync-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAgC,MAAM,aAAa,CAAC;AAM5E,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;CAC9D;AAED,MAAM,MAAM,gBAAgB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,KAAK,IAAI,IAAI,CAAC;IAEd,+CAA+C;IAC/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,mDAAmD;IACnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,8BAA8B;IAC9B,SAAS,IAAI,UAAU,CAAC;IAExB,sEAAsE;IACtE,aAAa,IAAI,IAAI,CAAC;IAEtB;;;;OAIG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,gBAAgB,EAC5B,YAAY,EAAE,kBAAkB,EAChC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,WAAW,CA2Nb"}
1
+ {"version":3,"file":"sync-manager.d.ts","sourceRoot":"","sources":["../../../src/sync/engine/sync-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAgC,MAAM,aAAa,CAAC;AAG5E,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EACV,cAAc,EACd,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;IAC7D;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,+EAA+E;IAC/E,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,MAAM,MAAM,gBAAgB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,KAAK,IAAI,IAAI,CAAC;IAEd,+CAA+C;IAC/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,mDAAmD;IACnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,8BAA8B;IAC9B,SAAS,IAAI,UAAU,CAAC;IAExB,sEAAsE;IACtE,aAAa,IAAI,IAAI,CAAC;IAEtB;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEvD,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,gBAAgB,EAC5B,YAAY,EAAE,kBAAkB,EAChC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,WAAW,CAoRb"}
@@ -1,6 +1,6 @@
1
1
  import { uploadAll } from "../workers/upload.js";
2
2
  import { downloadAll } from "../workers/download.js";
3
- import { deleteScopeRemote } from "../workers/delete.js";
3
+ import { deleteScope, retryPendingBlobDeletions, } from "../workers/delete.js";
4
4
  import { createDownloadRetryMemory } from "../retry-memory.js";
5
5
  const MAX_ERRORS = 10;
6
6
  export function createSyncManager(uploadDeps, downloadDeps, options) {
@@ -21,13 +21,36 @@ export function createSyncManager(uploadDeps, downloadDeps, options) {
21
21
  // attempted once per session, not once per cycle; transient storage errors
22
22
  // back off exponentially instead of re-firing on every cycle.
23
23
  const downloadRetryMemory = createDownloadRetryMemory();
24
+ const dataPointFeed = downloadDeps.dataPointFeed ?? uploadDeps.dataPointFeed;
25
+ const scopeDeletions = uploadDeps.scopeDeletions ?? downloadDeps.scopeDeletions;
26
+ // The upload worker queues guarded cleanup for ciphertext it had to
27
+ // abandon mid-race; it shares the manager's marker store.
28
+ const workerUploadDeps = {
29
+ ...uploadDeps,
30
+ pendingBlobDeletions: uploadDeps.pendingBlobDeletions ?? options?.pendingBlobDeletions,
31
+ };
32
+ const workerDownloadDeps = {
33
+ ...downloadDeps,
34
+ pendingBlobDeletions: downloadDeps.pendingBlobDeletions ?? options?.pendingBlobDeletions,
35
+ };
36
+ // Sync cycles and durable deletes mutate the same local index and the same
37
+ // registry rows. Run them one at a time (FIFO): a delete cannot start while
38
+ // an upload of the same scope is between "blob uploaded" and "row marked
39
+ // synced", and a cycle cannot start until a delete has finished all three
40
+ // steps. A rejected operation never blocks the ones queued behind it.
41
+ let mutationQueue = Promise.resolve();
42
+ function exclusive(operation) {
43
+ const run = mutationQueue.then(operation, operation);
44
+ mutationQueue = run.catch(() => undefined);
45
+ return run;
46
+ }
24
47
  async function runCycle() {
25
48
  // Prevent concurrent cycles
26
49
  if (cycleInFlight) {
27
50
  rerunRequested = true;
28
51
  return cycleInFlight;
29
52
  }
30
- cycleInFlight = (async () => {
53
+ cycleInFlight = exclusive(async () => {
31
54
  do {
32
55
  rerunRequested = false;
33
56
  const canRun = await (options?.canSync?.() ?? { ok: true });
@@ -37,9 +60,24 @@ export function createSyncManager(uploadDeps, downloadDeps, options) {
37
60
  continue;
38
61
  }
39
62
  blocked = null;
63
+ // Finish blob deletions whose tombstone landed but whose storage
64
+ // DELETE did not. Cheap when nothing is pending; never blocks sync.
65
+ try {
66
+ await retryPendingBlobDeletions({
67
+ deleteData: options?.deleteData,
68
+ pendingBlobDeletions: options?.pendingBlobDeletions,
69
+ dataPointFeed,
70
+ serverOwner: uploadDeps.serverOwner,
71
+ storage: uploadDeps.storage,
72
+ logger: uploadDeps.logger,
73
+ });
74
+ }
75
+ catch (err) {
76
+ uploadDeps.logger.warn({ error: err.message }, "Pending blob deletion retry failed");
77
+ }
40
78
  try {
41
79
  // Upload unsynced local files
42
- const uploadResults = await uploadAll(uploadDeps, {
80
+ const uploadResults = await uploadAll(workerUploadDeps, {
43
81
  batchSize: uploadBatchSize,
44
82
  onError(entry, error) {
45
83
  pushError({
@@ -65,7 +103,7 @@ export function createSyncManager(uploadDeps, downloadDeps, options) {
65
103
  try {
66
104
  // Download new remote files
67
105
  const fullReconcile = needsFullReconcile;
68
- const downloadResults = await downloadAll(downloadDeps, {
106
+ const downloadResults = await downloadAll(workerDownloadDeps, {
69
107
  fullReconcile,
70
108
  retryMemory: downloadRetryMemory,
71
109
  });
@@ -91,7 +129,7 @@ export function createSyncManager(uploadDeps, downloadDeps, options) {
91
129
  }
92
130
  lastSync = new Date().toISOString();
93
131
  } while (rerunRequested && isRunning);
94
- })();
132
+ });
95
133
  try {
96
134
  await cycleInFlight;
97
135
  }
@@ -187,9 +225,16 @@ export function createSyncManager(uploadDeps, downloadDeps, options) {
187
225
  uploadDeps.logger.debug("New data notification received");
188
226
  scheduleNotifiedCycle();
189
227
  },
190
- async deleteScopeRemote(scope) {
191
- // Reuses the upload worker's remote deps (gateway, storage adapter, signer, owner).
192
- await deleteScopeRemote(uploadDeps, scope);
228
+ deleteScope(scope) {
229
+ return exclusive(() => deleteScope({
230
+ storage: uploadDeps.storage,
231
+ serverOwner: uploadDeps.serverOwner,
232
+ deleteData: options?.deleteData,
233
+ pendingBlobDeletions: options?.pendingBlobDeletions,
234
+ scopeDeletions,
235
+ dataPointFeed,
236
+ logger: uploadDeps.logger,
237
+ }, scope));
193
238
  },
194
239
  };
195
240
  return manager;
@@ -1 +1 @@
1
- {"version":3,"file":"sync-manager.js","sourceRoot":"","sources":["../../../src/sync/engine/sync-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-manager.js","sourceRoot":"","sources":["../../../src/sync/engine/sync-manager.ts"],"names":[],"mappings":"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"}