@freqhole/reliquary 0.2.10 → 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.
@@ -10,4 +10,21 @@ export declare function removeCanvasRef(dbName: string, blobId: string, canvasDo
10
10
  export declare function getCanvasRefs(dbName: string, blobId: string): Promise<string[]>;
11
11
  export declare function removeAllCanvasRefsForCanvas(dbName: string, canvasDocId: string): Promise<void>;
12
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>;
13
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;AA8E7C,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"}
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
@@ -9,19 +9,36 @@
9
9
  // a version-change block from another tab ever having anything to wait on.
10
10
  const STORE_NAME = "blobs";
11
11
  const REFS_STORE_NAME = "blob_canvas_refs";
12
- const DB_VERSION = 2;
12
+ const DB_VERSION = 3;
13
13
  function openVersioned(dbName, version) {
14
14
  return new Promise((resolve, reject) => {
15
15
  const req = indexedDB.open(dbName, version);
16
16
  req.onupgradeneeded = () => {
17
17
  const db = req.result;
18
+ let store;
18
19
  if (!db.objectStoreNames.contains(STORE_NAME)) {
19
- const store = db.createObjectStore(STORE_NAME, { keyPath: "blob_id" });
20
+ store = db.createObjectStore(STORE_NAME, { keyPath: "blob_id" });
20
21
  store.createIndex("sha256", "sha256", { unique: false });
21
22
  store.createIndex("blake3", "blake3", { unique: false });
22
23
  store.createIndex("blob_type", "blob_type", { unique: false });
23
24
  store.createIndex("parent_blob_id", "parent_blob_id", { unique: false });
24
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
+ }
25
42
  if (!db.objectStoreNames.contains(REFS_STORE_NAME)) {
26
43
  // tracks which canvas documents currently have a widget
27
44
  // referencing a given blob - a widget-delete cleanup can check
@@ -237,3 +254,83 @@ export async function clearCanvasRefs(dbName) {
237
254
  };
238
255
  });
239
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 { addCanvasRef, clearCanvasRefs, clearRecords, deleteRecord, getCanvasRefs, getRecord, getRecordByBlake3, getRecordBySha256, putRecord, removeAllCanvasRefsForCanvas, removeCanvasRef, } 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();
@@ -149,3 +149,55 @@ describe("pre-existing database at a higher version", () => {
149
149
  expect(await getRecordByBlake3(dbName, record.blake3)).toEqual(record);
150
150
  });
151
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";
@@ -46,6 +48,9 @@ export interface BlobStore {
46
48
  getCanvasRefs(blobId: string): Promise<string[]>;
47
49
  /** remove every ref row for `canvasDocId` (the whole canvas was deleted). */
48
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>;
49
54
  }
50
55
  /** create a blob store instance. each instance owns its own object-url
51
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":"AA6CA,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;IAC1B,6EAA6E;IAC7E,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,4EAA4E;IAC5E,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,0DAA0D;IAC1D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,6EAA6E;IAC7E,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED;gEACgE;AAChE,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAsPzE;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":"AAuBA,OAAO,EAaL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAUjB,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;AAC9H,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE/D;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;IAC1B,6EAA6E;IAC7E,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,4EAA4E;IAC5E,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,0DAA0D;IAC1D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,6EAA6E;IAC7E,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE;iFAC6E;IAC7E,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC/D;AAED;gEACgE;AAChE,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAuPzE;AAKD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC3G,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -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 { addCanvasRef, clearCanvasRefs, clearRecords, deleteRecord, getCanvasRefs, getRecord, getRecordByBlake3, getRecordBySha256, putRecord, removeAllCanvasRefsForCanvas, removeCanvasRef, } 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
@@ -260,6 +260,7 @@ export function createBlobStore(options = {}) {
260
260
  removeCanvasRef: (blobId, canvasDocId) => removeCanvasRef(dbName, blobId, canvasDocId),
261
261
  getCanvasRefs: (blobId) => getCanvasRefs(dbName, blobId),
262
262
  removeAllCanvasRefsForCanvas: (canvasDocId) => removeAllCanvasRefsForCanvas(dbName, canvasDocId),
263
+ listBlobs: (options) => listBlobs(dbName, options),
263
264
  };
264
265
  }
265
266
  // low-level building blocks re-exported for callers that need to compose
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freqhole/reliquary",
3
- "version": "0.2.10",
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",