@freqhole/reliquary 0.2.9 → 0.2.11

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.
@@ -5,4 +5,26 @@ export declare function getRecordBySha256(dbName: string, sha256: string): Promi
5
5
  export declare function getRecordByBlake3(dbName: string, blake3: string): Promise<BlobRecord | null>;
6
6
  export declare function deleteRecord(dbName: string, blobId: string): Promise<void>;
7
7
  export declare function clearRecords(dbName: string): Promise<void>;
8
+ export declare function addCanvasRef(dbName: string, blobId: string, canvasDocId: string): Promise<void>;
9
+ export declare function removeCanvasRef(dbName: string, blobId: string, canvasDocId: string): Promise<void>;
10
+ export declare function getCanvasRefs(dbName: string, blobId: string): Promise<string[]>;
11
+ export declare function removeAllCanvasRefsForCanvas(dbName: string, canvasDocId: string): Promise<void>;
12
+ export declare function clearCanvasRefs(dbName: string): Promise<void>;
13
+ export interface ListBlobsOptions {
14
+ sort?: "size" | "filename" | "created_at";
15
+ direction?: "asc" | "desc";
16
+ /** filename substring filter, case-insensitive (matches sqlite's default
17
+ * `LIKE` behavior on the rust/tauri side). */
18
+ search?: string;
19
+ limit?: number;
20
+ offset?: number;
21
+ }
22
+ export interface ListBlobsPage {
23
+ items: BlobRecord[];
24
+ /** rows matching `search` (or every row, if no `search`) - not just this page. */
25
+ totalCount: number;
26
+ /** bytes across every row matching `search` (or every row, if no `search`). */
27
+ totalSize: number;
28
+ }
29
+ export declare function listBlobs(dbName: string, options?: ListBlobsOptions): Promise<ListBlobsPage>;
8
30
  //# sourceMappingURL=db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/blobs/db.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkE7C,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjF;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAS1F;AAkBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAE5F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAE5F;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAchF;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAchE"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/blobs/db.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8F7C,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjF;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAS1F;AAkBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAE5F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAE5F;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAchF;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAchE;AAQD,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrG;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxG;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYrF;AAED,wBAAsB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBrG;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnE;AAaD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC1C,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B;mDAC+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8EtG"}
package/dist/blobs/db.js CHANGED
@@ -8,19 +8,47 @@
8
8
  // rather than holding one long-lived connection open - simple, and avoids
9
9
  // a version-change block from another tab ever having anything to wait on.
10
10
  const STORE_NAME = "blobs";
11
- const DB_VERSION = 1;
11
+ const REFS_STORE_NAME = "blob_canvas_refs";
12
+ const DB_VERSION = 3;
12
13
  function openVersioned(dbName, version) {
13
14
  return new Promise((resolve, reject) => {
14
15
  const req = indexedDB.open(dbName, version);
15
16
  req.onupgradeneeded = () => {
16
17
  const db = req.result;
18
+ let store;
17
19
  if (!db.objectStoreNames.contains(STORE_NAME)) {
18
- const store = db.createObjectStore(STORE_NAME, { keyPath: "blob_id" });
20
+ store = db.createObjectStore(STORE_NAME, { keyPath: "blob_id" });
19
21
  store.createIndex("sha256", "sha256", { unique: false });
20
22
  store.createIndex("blake3", "blake3", { unique: false });
21
23
  store.createIndex("blob_type", "blob_type", { unique: false });
22
24
  store.createIndex("parent_blob_id", "parent_blob_id", { unique: false });
23
25
  }
26
+ else {
27
+ // pre-existing store from an earlier DB_VERSION - new indexes can
28
+ // still be added via the in-flight version-change transaction
29
+ // (`req.transaction`), they just can't be added outside
30
+ // onupgradeneeded. without this branch a version bump would silently
31
+ // never add the index for anyone who already has a v1/v2 database.
32
+ store = req.transaction.objectStore(STORE_NAME);
33
+ }
34
+ // added in v3 - supports sorting the local-files list (filez tab 2)
35
+ // by size without a full-store scan.
36
+ if (!store.indexNames.contains("size")) {
37
+ store.createIndex("size", "size", { unique: false });
38
+ }
39
+ if (!store.indexNames.contains("created_at")) {
40
+ store.createIndex("created_at", "created_at", { unique: false });
41
+ }
42
+ if (!db.objectStoreNames.contains(REFS_STORE_NAME)) {
43
+ // tracks which canvas documents currently have a widget
44
+ // referencing a given blob - a widget-delete cleanup can check
45
+ // this before purging local bytes, instead of scanning every
46
+ // canvas. composite key so re-adding an existing ref is a no-op
47
+ // (put with the same key overwrites, add() would throw).
48
+ const refs = db.createObjectStore(REFS_STORE_NAME, { keyPath: ["blob_id", "canvas_doc_id"] });
49
+ refs.createIndex("blob_id", "blob_id", { unique: false });
50
+ refs.createIndex("canvas_doc_id", "canvas_doc_id", { unique: false });
51
+ }
24
52
  };
25
53
  req.onsuccess = () => resolve(req.result);
26
54
  req.onerror = () => reject(req.error);
@@ -59,7 +87,7 @@ async function openDb(dbName) {
59
87
  req.onerror = () => reject(req.error);
60
88
  });
61
89
  const currentVersion = probe.version;
62
- const hasStore = probe.objectStoreNames.contains(STORE_NAME);
90
+ const hasStore = probe.objectStoreNames.contains(STORE_NAME) && probe.objectStoreNames.contains(REFS_STORE_NAME);
63
91
  probe.close();
64
92
  const targetVersion = hasStore ? currentVersion : currentVersion + 1;
65
93
  resolvedVersions.set(dbName, targetVersion);
@@ -139,3 +167,170 @@ export async function clearRecords(dbName) {
139
167
  };
140
168
  });
141
169
  }
170
+ // ---------------------------------------------------------------------------
171
+ // blob/canvas reference index - which canvas docs currently have a widget
172
+ // referencing a given blob, so a widget-delete cleanup can check this
173
+ // before purging local bytes instead of scanning every canvas.
174
+ // ---------------------------------------------------------------------------
175
+ export async function addCanvasRef(dbName, blobId, canvasDocId) {
176
+ const db = await openDb(dbName);
177
+ return new Promise((resolve, reject) => {
178
+ const tx = db.transaction(REFS_STORE_NAME, "readwrite");
179
+ tx.objectStore(REFS_STORE_NAME).put({ blob_id: blobId, canvas_doc_id: canvasDocId });
180
+ tx.oncomplete = () => {
181
+ db.close();
182
+ resolve();
183
+ };
184
+ tx.onerror = () => {
185
+ db.close();
186
+ reject(tx.error);
187
+ };
188
+ });
189
+ }
190
+ export async function removeCanvasRef(dbName, blobId, canvasDocId) {
191
+ const db = await openDb(dbName);
192
+ return new Promise((resolve, reject) => {
193
+ const tx = db.transaction(REFS_STORE_NAME, "readwrite");
194
+ tx.objectStore(REFS_STORE_NAME).delete([blobId, canvasDocId]);
195
+ tx.oncomplete = () => {
196
+ db.close();
197
+ resolve();
198
+ };
199
+ tx.onerror = () => {
200
+ db.close();
201
+ reject(tx.error);
202
+ };
203
+ });
204
+ }
205
+ export async function getCanvasRefs(dbName, blobId) {
206
+ const db = await openDb(dbName);
207
+ return new Promise((resolve, reject) => {
208
+ const tx = db.transaction(REFS_STORE_NAME, "readonly");
209
+ const req = tx.objectStore(REFS_STORE_NAME).index("blob_id").getAll(blobId);
210
+ req.onsuccess = () => {
211
+ const rows = req.result ?? [];
212
+ resolve(rows.map((r) => r.canvas_doc_id));
213
+ };
214
+ req.onerror = () => reject(req.error);
215
+ tx.oncomplete = () => db.close();
216
+ });
217
+ }
218
+ export async function removeAllCanvasRefsForCanvas(dbName, canvasDocId) {
219
+ const db = await openDb(dbName);
220
+ return new Promise((resolve, reject) => {
221
+ const tx = db.transaction(REFS_STORE_NAME, "readwrite");
222
+ const store = tx.objectStore(REFS_STORE_NAME);
223
+ const req = store.index("canvas_doc_id").openCursor(IDBKeyRange.only(canvasDocId));
224
+ req.onsuccess = () => {
225
+ const cursor = req.result;
226
+ if (cursor) {
227
+ cursor.delete();
228
+ cursor.continue();
229
+ }
230
+ };
231
+ req.onerror = () => reject(req.error);
232
+ tx.oncomplete = () => {
233
+ db.close();
234
+ resolve();
235
+ };
236
+ tx.onerror = () => {
237
+ db.close();
238
+ reject(tx.error);
239
+ };
240
+ });
241
+ }
242
+ export async function clearCanvasRefs(dbName) {
243
+ const db = await openDb(dbName);
244
+ return new Promise((resolve, reject) => {
245
+ const tx = db.transaction(REFS_STORE_NAME, "readwrite");
246
+ tx.objectStore(REFS_STORE_NAME).clear();
247
+ tx.oncomplete = () => {
248
+ db.close();
249
+ resolve();
250
+ };
251
+ tx.onerror = () => {
252
+ db.close();
253
+ reject(tx.error);
254
+ };
255
+ });
256
+ }
257
+ function matchesSearch(record, search) {
258
+ if (!search)
259
+ return true;
260
+ return (record.filename ?? "").toLowerCase().includes(search.toLowerCase());
261
+ }
262
+ export async function listBlobs(dbName, options = {}) {
263
+ const { sort = "created_at", direction = "desc", search, limit = 50, offset = 0 } = options;
264
+ const db = await openDb(dbName);
265
+ return new Promise((resolve, reject) => {
266
+ const tx = db.transaction(STORE_NAME, "readonly");
267
+ const store = tx.objectStore(STORE_NAME);
268
+ let totalCount = 0;
269
+ let totalSize = 0;
270
+ const items = [];
271
+ tx.oncomplete = () => {
272
+ db.close();
273
+ resolve({ items, totalCount, totalSize });
274
+ };
275
+ tx.onerror = () => {
276
+ db.close();
277
+ reject(tx.error);
278
+ };
279
+ // aggregate pass, always a full scan (see module doc comment above).
280
+ const aggReq = store.openCursor();
281
+ aggReq.onsuccess = () => {
282
+ const cursor = aggReq.result;
283
+ if (!cursor) {
284
+ collectPage();
285
+ return;
286
+ }
287
+ const record = cursor.value;
288
+ if (matchesSearch(record, search)) {
289
+ totalCount += 1;
290
+ totalSize += record.size ?? 0;
291
+ }
292
+ cursor.continue();
293
+ };
294
+ aggReq.onerror = () => reject(aggReq.error);
295
+ function collectPage() {
296
+ const useIndex = (sort === "size" || sort === "created_at") && store.indexNames.contains(sort);
297
+ const cursorDirection = direction === "asc" ? "next" : "prev";
298
+ if (useIndex) {
299
+ let skipped = 0;
300
+ const req = store.index(sort).openCursor(null, cursorDirection);
301
+ req.onsuccess = () => {
302
+ const cursor = req.result;
303
+ // no `cursor.continue()` here on either branch below intentionally
304
+ // stops iteration once the page is full - the transaction then
305
+ // auto-completes since nothing else is pending.
306
+ if (!cursor || items.length >= limit)
307
+ return;
308
+ const record = cursor.value;
309
+ if (matchesSearch(record, search)) {
310
+ if (skipped < offset) {
311
+ skipped += 1;
312
+ }
313
+ else {
314
+ items.push(record);
315
+ }
316
+ }
317
+ cursor.continue();
318
+ };
319
+ req.onerror = () => reject(req.error);
320
+ return;
321
+ }
322
+ // filename sort: no index to stream off, fetch/filter/sort/slice.
323
+ const req = store.getAll();
324
+ req.onsuccess = () => {
325
+ const all = req.result.filter((r) => matchesSearch(r, search));
326
+ all.sort((a, b) => {
327
+ const av = (a.filename ?? "").toLowerCase();
328
+ const bv = (b.filename ?? "").toLowerCase();
329
+ return direction === "asc" ? av.localeCompare(bv) : bv.localeCompare(av);
330
+ });
331
+ items.push(...all.slice(offset, offset + limit));
332
+ };
333
+ req.onerror = () => reject(req.error);
334
+ }
335
+ });
336
+ }
@@ -3,7 +3,7 @@
3
3
  import "fake-indexeddb/auto";
4
4
  import { IDBFactory } from "fake-indexeddb";
5
5
  import { beforeEach, describe, expect, it } from "vitest";
6
- import { clearRecords, deleteRecord, getRecord, getRecordByBlake3, getRecordBySha256, putRecord, } from "./db.js";
6
+ import { addCanvasRef, clearCanvasRefs, clearRecords, deleteRecord, getCanvasRefs, getRecord, getRecordByBlake3, getRecordBySha256, listBlobs, putRecord, removeAllCanvasRefsForCanvas, removeCanvasRef, } from "./db.js";
7
7
  const DB_NAME = "blobs-db-test";
8
8
  beforeEach(() => {
9
9
  globalThis.indexedDB = new IDBFactory();
@@ -91,6 +91,37 @@ describe("db name isolation", () => {
91
91
  expect(await getRecord("db-one", "blake3-aaa")).not.toBeNull();
92
92
  });
93
93
  });
94
+ describe("canvas ref index", () => {
95
+ it("tracks refs per blob and de-dupes re-adding the same ref", async () => {
96
+ await addCanvasRef(DB_NAME, "blob-a", "canvas-1");
97
+ await addCanvasRef(DB_NAME, "blob-a", "canvas-2");
98
+ await addCanvasRef(DB_NAME, "blob-a", "canvas-1");
99
+ const refs = (await getCanvasRefs(DB_NAME, "blob-a")).sort();
100
+ expect(refs).toEqual(["canvas-1", "canvas-2"]);
101
+ });
102
+ it("removeCanvasRef removes only the targeted ref", async () => {
103
+ await addCanvasRef(DB_NAME, "blob-b", "canvas-1");
104
+ await addCanvasRef(DB_NAME, "blob-b", "canvas-2");
105
+ await removeCanvasRef(DB_NAME, "blob-b", "canvas-1");
106
+ expect(await getCanvasRefs(DB_NAME, "blob-b")).toEqual(["canvas-2"]);
107
+ });
108
+ it("removeCanvasRef on a ref that never existed is a no-op", async () => {
109
+ await expect(removeCanvasRef(DB_NAME, "blob-c", "canvas-1")).resolves.toBeUndefined();
110
+ });
111
+ it("removeAllCanvasRefsForCanvas clears that canvas's refs across every blob", async () => {
112
+ await addCanvasRef(DB_NAME, "blob-d", "canvas-x");
113
+ await addCanvasRef(DB_NAME, "blob-e", "canvas-x");
114
+ await addCanvasRef(DB_NAME, "blob-d", "canvas-y");
115
+ await removeAllCanvasRefsForCanvas(DB_NAME, "canvas-x");
116
+ expect(await getCanvasRefs(DB_NAME, "blob-d")).toEqual(["canvas-y"]);
117
+ expect(await getCanvasRefs(DB_NAME, "blob-e")).toEqual([]);
118
+ });
119
+ it("clearCanvasRefs empties the whole ref index", async () => {
120
+ await addCanvasRef(DB_NAME, "blob-f", "canvas-1");
121
+ await clearCanvasRefs(DB_NAME);
122
+ expect(await getCanvasRefs(DB_NAME, "blob-f")).toEqual([]);
123
+ });
124
+ });
94
125
  describe("pre-existing database at a higher version", () => {
95
126
  it("still reads and writes when dbName already exists at a version above DB_VERSION", async () => {
96
127
  // simulates an app's pre-existing database (this module's whole
@@ -118,3 +149,55 @@ describe("pre-existing database at a higher version", () => {
118
149
  expect(await getRecordByBlake3(dbName, record.blake3)).toEqual(record);
119
150
  });
120
151
  });
152
+ describe("listBlobs", () => {
153
+ async function seedThree() {
154
+ await putRecord(DB_NAME, makeRecord({ blob_id: "a", blake3: "a", filename: "apple.txt", size: 1, created_at: 1 }));
155
+ await putRecord(DB_NAME, makeRecord({ blob_id: "b", blake3: "b", filename: "banana.txt", size: 5, created_at: 2 }));
156
+ await putRecord(DB_NAME, makeRecord({ blob_id: "c", blake3: "c", filename: "cherry.txt", size: 3, created_at: 3 }));
157
+ }
158
+ it("defaults to created_at desc", async () => {
159
+ await seedThree();
160
+ const page = await listBlobs(DB_NAME, {});
161
+ expect(page.items.map((r) => r.blob_id)).toEqual(["c", "b", "a"]);
162
+ expect(page.totalCount).toBe(3);
163
+ expect(page.totalSize).toBe(9);
164
+ });
165
+ it("sorts by size ascending via the size index", async () => {
166
+ await seedThree();
167
+ const page = await listBlobs(DB_NAME, { sort: "size", direction: "asc" });
168
+ expect(page.items.map((r) => r.blob_id)).toEqual(["a", "c", "b"]);
169
+ });
170
+ it("sorts by size descending", async () => {
171
+ await seedThree();
172
+ const page = await listBlobs(DB_NAME, { sort: "size", direction: "desc" });
173
+ expect(page.items.map((r) => r.blob_id)).toEqual(["b", "c", "a"]);
174
+ });
175
+ it("sorts by filename via the in-memory fallback (no index)", async () => {
176
+ await seedThree();
177
+ const page = await listBlobs(DB_NAME, { sort: "filename", direction: "asc" });
178
+ expect(page.items.map((r) => r.blob_id)).toEqual(["a", "b", "c"]);
179
+ });
180
+ it("paginates with limit/offset while preserving totals across the whole filter", async () => {
181
+ await seedThree();
182
+ const page1 = await listBlobs(DB_NAME, { sort: "size", direction: "asc", limit: 2, offset: 0 });
183
+ expect(page1.items.map((r) => r.blob_id)).toEqual(["a", "c"]);
184
+ expect(page1.totalCount).toBe(3);
185
+ const page2 = await listBlobs(DB_NAME, { sort: "size", direction: "asc", limit: 2, offset: 2 });
186
+ expect(page2.items.map((r) => r.blob_id)).toEqual(["b"]);
187
+ expect(page2.totalCount).toBe(3);
188
+ });
189
+ it("filters by a case-insensitive filename substring", async () => {
190
+ await seedThree();
191
+ const page = await listBlobs(DB_NAME, { search: "AN" });
192
+ expect(page.items.map((r) => r.blob_id)).toEqual(["b"]);
193
+ expect(page.totalCount).toBe(1);
194
+ expect(page.totalSize).toBe(5);
195
+ });
196
+ it("returns an empty page with zero totals when nothing matches", async () => {
197
+ await seedThree();
198
+ const page = await listBlobs(DB_NAME, { search: "nope" });
199
+ expect(page.items).toEqual([]);
200
+ expect(page.totalCount).toBe(0);
201
+ expect(page.totalSize).toBe(0);
202
+ });
203
+ });
@@ -1,5 +1,6 @@
1
1
  export { createBlobStore, isOPFSSupported, DEFAULT_DB_NAME, writeThroughChain, readThroughChain, hasBytesInChain, removeFromChain, } from "./store.js";
2
2
  export type { BlobStore, BlobStoreOptions, StoreBlobFromFileOptions, BytesBackend, } from "./store.js";
3
+ export type { ListBlobsOptions, ListBlobsPage } from "./db.js";
3
4
  export type { BlobLocalityInfo, BlobLocalityMetadata, BlobRecord, BlobType, BytesBackendName, NewBlobMeta, } from "./types.js";
4
5
  export { createOpfsBackend, createCacheBackend, defaultBytesChain } from "./bytes-backend.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,6 +1,8 @@
1
+ import { type ListBlobsOptions, type ListBlobsPage } from "./db.js";
1
2
  import type { BlobLocalityInfo, BlobRecord, NewBlobMeta } from "./types.js";
2
3
  export { isOPFSSupported } from "./bytes-backend.js";
3
4
  export type { BlobLocalityInfo, BlobLocalityMetadata, BlobRecord, BlobType, BytesBackendName, NewBlobMeta } from "./types.js";
5
+ export type { ListBlobsOptions, ListBlobsPage } from "./db.js";
4
6
  /** default IndexedDB database name for apps that don't need to preserve an
5
7
  * existing one. */
6
8
  export declare const DEFAULT_DB_NAME = "reliquary-blobs";
@@ -38,6 +40,17 @@ export interface BlobStore {
38
40
  checkBlobLocality(blobId: string, blake3?: string): Promise<BlobLocalityInfo>;
39
41
  deleteBlob(blobId: string): Promise<void>;
40
42
  clearAll(): Promise<void>;
43
+ /** record that `canvasDocId` currently has a widget referencing `blobId`. */
44
+ addCanvasRef(blobId: string, canvasDocId: string): Promise<void>;
45
+ /** remove a single canvas/blob reference (widget deleted or reassigned). */
46
+ removeCanvasRef(blobId: string, canvasDocId: string): Promise<void>;
47
+ /** every canvas doc id currently referencing `blobId`. */
48
+ getCanvasRefs(blobId: string): Promise<string[]>;
49
+ /** remove every ref row for `canvasDocId` (the whole canvas was deleted). */
50
+ removeAllCanvasRefsForCanvas(canvasDocId: string): Promise<void>;
51
+ /** paginated/sortable/searchable local listing - backs the filez widget's
52
+ * local-files tab. see `db.ts`'s `listBlobs` doc comment for perf notes. */
53
+ listBlobs(options?: ListBlobsOptions): Promise<ListBlobsPage>;
41
54
  }
42
55
  /** create a blob store instance. each instance owns its own object-url
43
56
  * cache; construct one per app (not per component/request). */
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/blobs/store.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9H;oBACoB;AACpB,eAAO,MAAM,eAAe,oBAAoB,CAAC;AAOjD,MAAM,WAAW,gBAAgB;IAC/B;;gEAE4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;4BAMwB;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrE,iBAAiB,CACf,IAAI,EAAE,IAAI,EACV,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAC3B,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,UAAU,CAAC,CAAC;IACvB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC1D,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClE,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACzE,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC7E,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC1E,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC/D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1E,iBAAiB,IAAI,IAAI,CAAC;IAC1B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;gEACgE;AAChE,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAiPzE;AAKD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC3G,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/blobs/store.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@
20
20
  // blake3 and shared at the origin regardless of which app wrote it, so it
21
21
  // is not parameterized per store instance - see `bytes-backend.ts`.
22
22
  import { hashBlake3, hashSha256, streamFileToOpfs } from "../worker/index.js";
23
- import { clearRecords, deleteRecord, getRecord, getRecordByBlake3, getRecordBySha256, putRecord, } from "./db.js";
23
+ import { addCanvasRef, clearCanvasRefs, clearRecords, deleteRecord, getCanvasRefs, getRecord, getRecordByBlake3, getRecordBySha256, listBlobs, putRecord, removeAllCanvasRefsForCanvas, removeCanvasRef, } from "./db.js";
24
24
  import { createOpfsBackend, defaultBytesChain, hasBytesInChain, readThroughChain, removeFromChain, writeThroughChain, } from "./bytes-backend.js";
25
25
  export { isOPFSSupported } from "./bytes-backend.js";
26
26
  /** default IndexedDB database name for apps that don't need to preserve an
@@ -237,6 +237,7 @@ export function createBlobStore(options = {}) {
237
237
  async function clearAll() {
238
238
  clearBlobUrlCache();
239
239
  await clearRecords(dbName);
240
+ await clearCanvasRefs(dbName);
240
241
  await Promise.all(chain.map((backend) => backend.clear()));
241
242
  }
242
243
  return {
@@ -255,6 +256,11 @@ export function createBlobStore(options = {}) {
255
256
  checkBlobLocality,
256
257
  deleteBlob,
257
258
  clearAll,
259
+ addCanvasRef: (blobId, canvasDocId) => addCanvasRef(dbName, blobId, canvasDocId),
260
+ removeCanvasRef: (blobId, canvasDocId) => removeCanvasRef(dbName, blobId, canvasDocId),
261
+ getCanvasRefs: (blobId) => getCanvasRefs(dbName, blobId),
262
+ removeAllCanvasRefsForCanvas: (canvasDocId) => removeAllCanvasRefsForCanvas(dbName, canvasDocId),
263
+ listBlobs: (options) => listBlobs(dbName, options),
258
264
  };
259
265
  }
260
266
  // low-level building blocks re-exported for callers that need to compose
@@ -1,6 +1,6 @@
1
1
  export type { BlobCapableNode, DiskSnatchResult, SnatchInfo, SnatchOptions, SnatchResult, } from "./types.js";
2
2
  export { DOWNLOAD_CANCELLED_MESSAGE, isCancelledError } from "./cancellation.js";
3
- export { discardPausedDownload, pauseSnatchDownload, snatchBlob, snatchBlobToDisk, } from "./snatch.js";
3
+ export { discardPausedDownload, pauseSnatchDownload, pauseSnatchDownloadByBlake3, snatchBlob, snatchBlobToDisk, } from "./snatch.js";
4
4
  export { BlobServer, DEFAULT_RELEASE_AFTER_MS, serveBlobRequest, } from "./serve.js";
5
5
  export type { BlobServerOptions, ServedBlobInfo } from "./serve.js";
6
6
  export { createPrefetcher, Prefetcher } from "./prefetch.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,UAAU,EACV,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,UAAU,EACV,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,2BAA2B,EAC3B,UAAU,EACV,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,UAAU,EACV,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export { DOWNLOAD_CANCELLED_MESSAGE, isCancelledError } from "./cancellation.js";
2
- export { discardPausedDownload, pauseSnatchDownload, snatchBlob, snatchBlobToDisk, } from "./snatch.js";
2
+ export { discardPausedDownload, pauseSnatchDownload, pauseSnatchDownloadByBlake3, snatchBlob, snatchBlobToDisk, } from "./snatch.js";
3
3
  export { BlobServer, DEFAULT_RELEASE_AFTER_MS, serveBlobRequest, } from "./serve.js";
4
4
  export { createPrefetcher, Prefetcher } from "./prefetch.js";
@@ -29,6 +29,14 @@ export declare function snatchBlobToDisk(node: BlobCapableNode, peerNodeIds: str
29
29
  * `download_cancel` or the download already settled.
30
30
  */
31
31
  export declare function pauseSnatchDownload(node: BlobCapableNode, downloadId: string): Promise<boolean>;
32
+ /**
33
+ * pause every in-flight snatch of this blake3 hash, without needing the
34
+ * `downloadId` the original caller registered (e.g. cleaning up after a
35
+ * caller - a deleted widget - that no longer has its own download state).
36
+ * returns false when `node` has no `download_cancel_by_blake3` or nothing
37
+ * was in flight for this hash.
38
+ */
39
+ export declare function pauseSnatchDownloadByBlake3(node: BlobCapableNode, blake3Hash: string): Promise<boolean>;
32
40
  /**
33
41
  * discard a paused partial: releases the gc pin a paused download left
34
42
  * behind so the transport can reclaim it. call when the user cancels for
@@ -1 +1 @@
1
- {"version":3,"file":"snatch.d.ts","sourceRoot":"","sources":["../../src/transfer/snatch.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AA0KpB;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,eAAe,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAwBvB;AAiDD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,eAAe,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,4BAA4B,EACtC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAsD3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,eAAe,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,eAAe,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf"}
1
+ {"version":3,"file":"snatch.d.ts","sourceRoot":"","sources":["../../src/transfer/snatch.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AA0KpB;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,eAAe,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAwBvB;AAiDD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,eAAe,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,4BAA4B,EACtC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAsD3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,eAAe,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,eAAe,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,eAAe,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -271,6 +271,18 @@ export async function pauseSnatchDownload(node, downloadId) {
271
271
  return false;
272
272
  return (await node.download_cancel(downloadId)) === true;
273
273
  }
274
+ /**
275
+ * pause every in-flight snatch of this blake3 hash, without needing the
276
+ * `downloadId` the original caller registered (e.g. cleaning up after a
277
+ * caller - a deleted widget - that no longer has its own download state).
278
+ * returns false when `node` has no `download_cancel_by_blake3` or nothing
279
+ * was in flight for this hash.
280
+ */
281
+ export async function pauseSnatchDownloadByBlake3(node, blake3Hash) {
282
+ if (!node.download_cancel_by_blake3)
283
+ return false;
284
+ return (await node.download_cancel_by_blake3(blake3Hash)) > 0;
285
+ }
274
286
  /**
275
287
  * discard a paused partial: releases the gc pin a paused download left
276
288
  * behind so the transport can reclaim it. call when the user cancels for
@@ -3,7 +3,7 @@ vi.mock("../worker/index.js", () => ({
3
3
  hashBlake3: vi.fn(async (bytes) => `hash-of-${bytes.length}-bytes`),
4
4
  }));
5
5
  import { hashBlake3 } from "../worker/index.js";
6
- import { discardPausedDownload, pauseSnatchDownload, snatchBlob, snatchBlobToDisk, } from "./snatch.js";
6
+ import { discardPausedDownload, pauseSnatchDownload, pauseSnatchDownloadByBlake3, snatchBlob, snatchBlobToDisk, } from "./snatch.js";
7
7
  afterEach(() => {
8
8
  vi.clearAllMocks();
9
9
  });
@@ -320,6 +320,25 @@ describe("pauseSnatchDownload / discardPausedDownload", () => {
320
320
  const node = { node_id: () => "me" };
321
321
  await expect(pauseSnatchDownload(node, "dl-1")).resolves.toBe(false);
322
322
  });
323
+ it("pauseSnatchDownloadByBlake3 pauses via download_cancel_by_blake3 and reports true when at least one was flagged", async () => {
324
+ const node = {
325
+ node_id: () => "me",
326
+ download_cancel_by_blake3: vi.fn(async () => 2),
327
+ };
328
+ await expect(pauseSnatchDownloadByBlake3(node, BLAKE3)).resolves.toBe(true);
329
+ expect(node.download_cancel_by_blake3).toHaveBeenCalledWith(BLAKE3);
330
+ });
331
+ it("pauseSnatchDownloadByBlake3 returns false when nothing was in flight", async () => {
332
+ const node = {
333
+ node_id: () => "me",
334
+ download_cancel_by_blake3: vi.fn(async () => 0),
335
+ };
336
+ await expect(pauseSnatchDownloadByBlake3(node, BLAKE3)).resolves.toBe(false);
337
+ });
338
+ it("pauseSnatchDownloadByBlake3 returns false when the node has no download_cancel_by_blake3", async () => {
339
+ const node = { node_id: () => "me" };
340
+ await expect(pauseSnatchDownloadByBlake3(node, BLAKE3)).resolves.toBe(false);
341
+ });
323
342
  it("discards a paused download via unprotect_blob, swallowing errors", async () => {
324
343
  const node = {
325
344
  node_id: () => "me",
@@ -28,6 +28,11 @@ export interface BlobCapableNode {
28
28
  /** pause/cancel an in-flight download by the id passed to it. returns
29
29
  * false when the download already settled. */
30
30
  download_cancel?(downloadId: string): Promise<boolean>;
31
+ /** pause/cancel every in-flight download for this blake3 hash, without
32
+ * needing the per-attempt downloadId (e.g. a caller that no longer has
33
+ * its own download state, such as a widget being torn down). returns
34
+ * how many were flagged - 0 means none were in flight. */
35
+ download_cancel_by_blake3?(blake3Hash: string): Promise<number>;
31
36
  /** release a gc pin held by a paused/cancelled download, letting the
32
37
  * partial be reclaimed. */
33
38
  unprotect_blob?(blake3Hash: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transfer/types.ts"],"names":[],"mappings":"AAeA,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,OAAO,IAAI,MAAM,CAAC;IAElB;;iEAE6D;IAC7D,sCAAsC,CAAC,CACrC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACtC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAAC;IAEvB;;;;;;;;;gBASY;IACZ,uCAAuC,CAAC,CACtC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EACjE,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACtC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;;;2EAIuE;IACvE,aAAa,CAAC,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE7C;mDAC+C;IAC/C,eAAe,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvD;gCAC4B;IAC5B,cAAc,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD;iEAC6D;IAC7D,WAAW,CAAC,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhD;wCACoC;IACpC,YAAY,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACzD;AAED,gEAAgE;AAChE,MAAM,WAAW,UAAU;IACzB;;oDAEgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;2EACuE;IACvE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;uEACmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;mDAE+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;6DACyD;IACzD,SAAS,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B;;;sCAGkC;IAClC,kBAAkB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3E;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transfer/types.ts"],"names":[],"mappings":"AAeA,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,OAAO,IAAI,MAAM,CAAC;IAElB;;iEAE6D;IAC7D,sCAAsC,CAAC,CACrC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACtC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAAC;IAEvB;;;;;;;;;gBASY;IACZ,uCAAuC,CAAC,CACtC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EACjE,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACtC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;;;2EAIuE;IACvE,aAAa,CAAC,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE7C;mDAC+C;IAC/C,eAAe,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvD;;;+DAG2D;IAC3D,yBAAyB,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE;gCAC4B;IAC5B,cAAc,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD;iEAC6D;IAC7D,WAAW,CAAC,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhD;wCACoC;IACpC,YAAY,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACzD;AAED,gEAAgE;AAChE,MAAM,WAAW,UAAU;IACzB;;oDAEgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;2EACuE;IACvE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;uEACmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;mDAE+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;6DACyD;IACzD,SAAS,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B;;;sCAGkC;IAClC,kBAAkB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3E;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -92,6 +92,9 @@ export declare class WorkerMiddenNode {
92
92
  * stays in the persistent store, pinned against gc - a later download
93
93
  * of the same hash resumes from the persisted bitfield. */
94
94
  download_cancel(downloadId: string): Promise<boolean>;
95
+ /** pause/cancel every in-flight download for this blake3 hash, without
96
+ * needing the per-attempt downloadId. returns how many were flagged. */
97
+ download_cancel_by_blake3(blake3Hash: string): Promise<number>;
95
98
  /** pin a hash against gc (keep a paused partial alive). */
96
99
  protect_blob(blake3Hash: string): Promise<void>;
97
100
  /** remove a gc pin added by protect_blob or a cancelled download. */
@@ -1 +1 @@
1
- {"version":3,"file":"midden-worker-client.d.ts","sourceRoot":"","sources":["../../src/worker/midden-worker-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"midden-worker-client.d.ts","sourceRoot":"","sources":["../../src/worker/midden-worker-client.ts"],"names":[],"mappings":"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"}
@@ -233,6 +233,11 @@ export class WorkerMiddenNode {
233
233
  async download_cancel(downloadId) {
234
234
  return this.api.downloadCancel(downloadId);
235
235
  }
236
+ /** pause/cancel every in-flight download for this blake3 hash, without
237
+ * needing the per-attempt downloadId. returns how many were flagged. */
238
+ async download_cancel_by_blake3(blake3Hash) {
239
+ return this.api.downloadCancelByBlake3(blake3Hash);
240
+ }
236
241
  /** pin a hash against gc (keep a paused partial alive). */
237
242
  async protect_blob(blake3Hash) {
238
243
  return this.api.protectBlob(blake3Hash);
@@ -42,6 +42,7 @@ function makeFakeApi(overrides = {}) {
42
42
  downloadVerifiedByIdProgress: vi.fn(),
43
43
  downloadVerifiedStreamingWithEnsure: vi.fn(),
44
44
  downloadCancel: vi.fn(),
45
+ downloadCancelByBlake3: vi.fn(),
45
46
  protectBlob: vi.fn(),
46
47
  unprotectBlob: vi.fn(),
47
48
  computeBlake3: vi.fn(),
@@ -76,6 +76,11 @@ export interface MiddenWorkerApi {
76
76
  * stays in the store, pinned against gc - a later download of the same
77
77
  * hash resumes from the persisted bitfield. */
78
78
  downloadCancel(downloadId: string): Promise<boolean>;
79
+ /** pause/cancel every in-flight download for this blake3 hash, without
80
+ * needing the per-attempt downloadId (e.g. cleaning up after a caller
81
+ * that no longer has its own download state). returns how many were
82
+ * flagged - 0 means none were in flight. */
83
+ downloadCancelByBlake3(blake3Hash: string): Promise<number>;
79
84
  /** pin a hash against gc (keep a paused partial download alive). */
80
85
  protectBlob(blake3Hash: string): Promise<void>;
81
86
  /** remove a gc pin added by protectBlob or a cancelled download. */
@@ -1 +1 @@
1
- {"version":3,"file":"midden-worker-contract.d.ts","sourceRoot":"","sources":["../../src/worker/midden-worker-contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"midden-worker-contract.d.ts","sourceRoot":"","sources":["../../src/worker/midden-worker-contract.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freqhole/reliquary",
3
- "version": "0.2.9",
3
+ "version": "0.2.11",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "freqhole media blob storage domain: content-addressed blobs, transfer, worker, solid helpers",