@fireproof/core 0.19.8-dev-global → 0.19.9-dev-frag

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. package/README.md +7 -0
  2. package/chunk-7EWIAXTM.js +7 -0
  3. package/chunk-7EWIAXTM.js.map +1 -0
  4. package/chunk-JO5AVWG7.js +67 -0
  5. package/chunk-JO5AVWG7.js.map +1 -0
  6. package/chunk-PB4BKL4O.js +7 -0
  7. package/chunk-PB4BKL4O.js.map +1 -0
  8. package/chunk-YS4GL6OK.js +266 -0
  9. package/chunk-YS4GL6OK.js.map +1 -0
  10. package/{store-indexdb-WLRSICCB.js → gateway-IZRHJWPE.js} +48 -80
  11. package/gateway-IZRHJWPE.js.map +1 -0
  12. package/gateway-YSNUK2L3.js +145 -0
  13. package/gateway-YSNUK2L3.js.map +1 -0
  14. package/index.cjs +2132 -1783
  15. package/index.cjs.map +1 -1
  16. package/index.d.cts +613 -513
  17. package/index.d.ts +613 -513
  18. package/index.global.js +19366 -20107
  19. package/index.global.js.map +1 -1
  20. package/index.js +1512 -1022
  21. package/index.js.map +1 -1
  22. package/key-bag-file-NMEBFSPM.js +54 -0
  23. package/key-bag-file-NMEBFSPM.js.map +1 -0
  24. package/key-bag-indexdb-X5V6GNBZ.js +50 -0
  25. package/key-bag-indexdb-X5V6GNBZ.js.map +1 -0
  26. package/mem-filesystem-B6C6QOIP.js +41 -0
  27. package/mem-filesystem-B6C6QOIP.js.map +1 -0
  28. package/metafile-cjs.json +1 -1
  29. package/metafile-esm.json +1 -1
  30. package/metafile-iife.json +1 -1
  31. package/node-filesystem-5JLBSHKQ.js +41 -0
  32. package/node-filesystem-5JLBSHKQ.js.map +1 -0
  33. package/package.json +8 -7
  34. package/tests/blockstore/fragment-gateway.test.ts +107 -0
  35. package/tests/blockstore/keyed-crypto.test.ts +302 -0
  36. package/tests/blockstore/loader.test.ts +24 -19
  37. package/tests/blockstore/store.test.ts +34 -28
  38. package/tests/blockstore/transaction.test.ts +19 -15
  39. package/tests/fireproof/config.test.ts +94 -78
  40. package/tests/fireproof/crdt.test.ts +34 -28
  41. package/tests/fireproof/database.test.ts +22 -14
  42. package/tests/fireproof/fireproof.test.fixture.ts +133 -0
  43. package/tests/fireproof/fireproof.test.ts +331 -219
  44. package/tests/fireproof/hello.test.ts +6 -4
  45. package/tests/fireproof/indexer.test.ts +34 -27
  46. package/tests/fireproof/utils.test.ts +65 -0
  47. package/tests/helpers.ts +25 -57
  48. package/utils-IZPK4QS7.js +14 -0
  49. package/utils-IZPK4QS7.js.map +1 -0
  50. package/chunk-BNL4PVBF.js +0 -314
  51. package/chunk-BNL4PVBF.js.map +0 -1
  52. package/chunk-JW2QT6BF.js +0 -184
  53. package/chunk-JW2QT6BF.js.map +0 -1
  54. package/node-sys-container-MIEX6ELJ.js +0 -29
  55. package/node-sys-container-MIEX6ELJ.js.map +0 -1
  56. package/store-file-VJ6BI4II.js +0 -191
  57. package/store-file-VJ6BI4II.js.map +0 -1
  58. package/store-indexdb-WLRSICCB.js.map +0 -1
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/database.ts","../../src/write-queue.ts","../../src/crdt.ts","../../src/crdt-helpers.ts","../../src/blockstore/index.ts","../../src/blockstore/connection-base.ts","../../src/blockstore/task-manager.ts","../../src/blockstore/connect-rest.ts","../../src/blockstore/store-factory.ts","../../src/blockstore/store.ts","../../src/blockstore/loader.ts","../../src/blockstore/types.ts","../../src/blockstore/loader-helpers.ts","../../src/blockstore/encrypt-helpers.ts","../../src/blockstore/encrypt-codec.ts","../../src/blockstore/transaction.ts","../../src/blockstore/commit-queue.ts","../../src/indexer-helpers.ts","../../src/indexer.ts","../../src/crdt-clock.ts","../../src/apply-head-queue.ts","../../src/version.ts"],"sourcesContent":["import { uuidv7 } from \"uuidv7\";\nimport { Logger, ResolveOnce } from \"@adviser/cement\";\n\nimport { WriteQueue, writeQueue } from \"./write-queue.js\";\nimport { CRDT } from \"./crdt.js\";\nimport { index } from \"./indexer.js\";\nimport type {\n DocUpdate,\n ClockHead,\n ConfigOpts,\n MapFn,\n QueryOpts,\n ChangesOptions,\n DocSet,\n DocWithId,\n IndexKeyType,\n ListenerFn,\n DocResponse,\n ChangesResponse,\n DocTypes,\n IndexRows,\n DocFragment,\n ChangesResponseRow,\n CRDTMeta,\n AllDocsQueryOpts,\n AllDocsResponse,\n} from \"./types.js\";\nimport { BaseBlockstore, Connectable } from \"./blockstore/index.js\";\nimport { SysContainer } from \"./runtime/sys-container.js\";\nimport { ensureLogger } from \"./utils.js\";\nimport { NotFoundError } from \"./blockstore/gateway.js\";\n\nexport class Database<DT extends DocTypes = NonNullable<unknown>> implements Connectable {\n static databases = new Map<string, Database>();\n\n readonly name?: string;\n readonly opts: ConfigOpts = {};\n\n _listening = false;\n readonly _listeners = new Set<ListenerFn<DT>>();\n readonly _noupdate_listeners = new Set<ListenerFn<DT>>();\n readonly _crdt: CRDT<DT>;\n readonly _writeQueue: WriteQueue<DT>;\n readonly blockstore: BaseBlockstore;\n\n async close() {\n await this.ready();\n await this._crdt.close();\n await this.blockstore.close();\n }\n\n async destroy() {\n await this.ready();\n await this._crdt.destroy();\n await this.blockstore.destroy();\n }\n\n readonly _ready = new ResolveOnce<void>();\n async ready() {\n return this._ready.once(async () => {\n await SysContainer.start();\n await this._crdt.ready();\n await this.blockstore.ready();\n });\n }\n\n readonly logger: Logger;\n\n constructor(name?: string, opts?: ConfigOpts) {\n this.name = name;\n this.opts = opts || this.opts;\n this.logger = ensureLogger(this.opts, \"Database\");\n // this.logger.SetDebug(\"Database\")\n this._crdt = new CRDT(name, this.opts);\n this.blockstore = this._crdt.blockstore; // for connector compatibility\n this._writeQueue = writeQueue(async (updates: DocUpdate<DT>[]) => {\n return await this._crdt.bulk(updates);\n }); //, Infinity)\n this._crdt.clock.onTock(() => {\n this._no_update_notify();\n });\n }\n\n async get<T extends DocTypes>(id: string): Promise<DocWithId<T>> {\n if (!id) throw this.logger.Error().Str(\"db\", this.name).Msg(`Doc id is required`).AsError();\n\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"get\");\n const got = await this._crdt.get(id).catch((e) => {\n throw new NotFoundError(`Not found: ${id} - ${e.message}`);\n });\n if (!got) throw new NotFoundError(`Not found: ${id}`);\n const { doc } = got;\n return { ...(doc as unknown as DocWithId<T>), _id: id };\n }\n\n async put<T extends DocTypes>(doc: DocSet<T>): Promise<DocResponse> {\n await this.ready();\n this.logger.Debug().Str(\"id\", doc._id).Msg(\"put\");\n const { _id, ...value } = doc;\n const docId = _id || uuidv7();\n const result = (await this._writeQueue.push({\n id: docId,\n value: {\n ...(value as unknown as DocSet<DT>),\n _id: docId,\n },\n })) as CRDTMeta;\n return { id: docId, clock: result?.head, name: this.name } as DocResponse;\n }\n\n async del(id: string): Promise<DocResponse> {\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"del\");\n const result = (await this._writeQueue.push({ id: id, del: true })) as CRDTMeta;\n return { id, clock: result?.head, name: this.name } as DocResponse;\n }\n\n async changes<T extends DocTypes>(since: ClockHead = [], opts: ChangesOptions = {}): Promise<ChangesResponse<T>> {\n await this.ready();\n this.logger.Debug().Any(\"since\", since).Any(\"opts\", opts).Msg(\"changes\");\n const { result, head } = await this._crdt.changes(since, opts);\n const rows: ChangesResponseRow<T>[] = result.map(({ id: key, value, del, clock }) => ({\n key,\n value: (del ? { _id: key, _deleted: true } : { _id: key, ...value }) as DocWithId<T>,\n clock,\n }));\n return { rows, clock: head, name: this.name };\n }\n\n async allDocs<T extends DocTypes>(opts: AllDocsQueryOpts = {}): Promise<AllDocsResponse<T>> {\n await this.ready();\n void opts;\n this.logger.Debug().Msg(\"allDocs\");\n const { result, head } = await this._crdt.allDocs();\n const rows = result.map(({ id: key, value, del }) => ({\n key,\n value: (del ? { _id: key, _deleted: true } : { _id: key, ...value }) as DocWithId<T>,\n }));\n return { rows, clock: head, name: this.name };\n }\n\n async allDocuments<T extends DocTypes>(): Promise<{\n rows: {\n key: string;\n value: DocWithId<T>;\n }[];\n clock: ClockHead;\n }> {\n return this.allDocs<T>();\n }\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void {\n this.logger.Debug().Bool(\"updates\", updates).Msg(\"subscribe\");\n if (updates) {\n if (!this._listening) {\n this._listening = true;\n this._crdt.clock.onTick((updates: DocUpdate<NonNullable<unknown>>[]) => {\n void this._notify(updates);\n });\n }\n this._listeners.add(listener as ListenerFn<NonNullable<unknown>>);\n return () => {\n this._listeners.delete(listener as ListenerFn<NonNullable<unknown>>);\n };\n } else {\n this._noupdate_listeners.add(listener as ListenerFn<NonNullable<unknown>>);\n return () => {\n this._noupdate_listeners.delete(listener as ListenerFn<NonNullable<unknown>>);\n };\n }\n }\n\n // todo if we add this onto dbs in fireproof.ts then we can make index.ts a separate package\n async query<K extends IndexKeyType, T extends DocTypes, R extends DocFragment = T>(\n field: string | MapFn<T>,\n opts: QueryOpts<K> = {},\n ): Promise<IndexRows<K, T, R>> {\n await this.ready();\n this.logger.Debug().Any(\"field\", field).Any(\"opts\", opts).Msg(\"query\");\n const _crdt = this._crdt as unknown as CRDT<T>;\n const idx =\n typeof field === \"string\" ? index<K, T, R>({ _crdt }, field) : index<K, T, R>({ _crdt }, makeName(field.toString()), field);\n return await idx.query(opts);\n }\n\n async compact() {\n await this.ready();\n await this._crdt.compact();\n }\n\n async _notify(updates: DocUpdate<NonNullable<unknown>>[]) {\n await this.ready();\n if (this._listeners.size) {\n const docs: DocWithId<NonNullable<unknown>>[] = updates.map(({ id, value }) => ({ ...value, _id: id }));\n for (const listener of this._listeners) {\n await (async () => await listener(docs as DocWithId<DT>[]))().catch((e: Error) => {\n this.logger.Error().Err(e).Msg(\"subscriber error\");\n });\n }\n }\n }\n\n async _no_update_notify() {\n await this.ready();\n if (this._noupdate_listeners.size) {\n for (const listener of this._noupdate_listeners) {\n await (async () => await listener([]))().catch((e: Error) => {\n this.logger.Error().Err(e).Msg(\"subscriber error\");\n });\n }\n }\n }\n}\n\nfunction toSortedArray(set?: Record<string, unknown>): Record<string, unknown>[] {\n if (!set) return [];\n return Object.entries(set)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => ({ [k]: v }));\n}\n\nexport function fireproof(name: string, opts?: ConfigOpts): Database {\n const key = JSON.stringify(\n toSortedArray({\n name,\n stores: toSortedArray(opts?.store?.stores),\n\n makeMetaStore: !!opts?.store?.makeMetaStore,\n makeDataStore: !!opts?.store?.makeDataStore,\n makeRemoteWAL: !!opts?.store?.makeRemoteWAL,\n\n encodeFile: !!opts?.store?.encodeFile,\n decodeFile: !!opts?.store?.decodeFile,\n }),\n );\n let db = Database.databases.get(key);\n if (!db) {\n db = new Database(name, opts);\n Database.databases.set(key, db);\n }\n return db;\n}\n\nfunction makeName(fnString: string) {\n const regex = /\\(([^,()]+,\\s*[^,()]+|\\[[^\\]]+\\],\\s*[^,()]+)\\)/g;\n let found: RegExpExecArray | null = null;\n const matches = Array.from(fnString.matchAll(regex), (match) => match[1].trim());\n if (matches.length === 0) {\n found = /=>\\s*(.*)/.exec(fnString);\n }\n if (!found) {\n return fnString;\n } else {\n // it's a consise arrow function, match everything after the arrow\n return found[1];\n }\n}\n","import { DocTypes, MetaType, DocUpdate } from \"./types.js\";\n\ntype WorkerFunction<T extends DocTypes> = (tasks: DocUpdate<T>[]) => Promise<MetaType>;\n\nexport interface WriteQueue<T extends DocTypes> {\n push(task: DocUpdate<T>): Promise<MetaType>;\n}\n\ninterface WriteQueueItem<T extends DocTypes> {\n readonly task: DocUpdate<T>;\n resolve(result: MetaType): void;\n reject(error: Error): void;\n}\n\nexport function writeQueue<T extends DocTypes>(worker: WorkerFunction<T>, payload = Infinity, unbounded = false): WriteQueue<T> {\n const queue: WriteQueueItem<T>[] = [];\n let isProcessing = false;\n\n async function process() {\n if (isProcessing || queue.length === 0) return;\n isProcessing = true;\n\n const tasksToProcess = queue.splice(0, payload);\n const updates = tasksToProcess.map((item) => item.task);\n\n if (unbounded) {\n // Run all updates in parallel and resolve/reject them individually\n const promises = updates.map(async (update, index) => {\n try {\n const result = await worker([update]);\n tasksToProcess[index].resolve(result);\n } catch (error) {\n tasksToProcess[index].reject(error as Error);\n }\n });\n\n await Promise.all(promises);\n } else {\n // Original logic: Run updates in a batch and resolve/reject them together\n try {\n const result = await worker(updates);\n tasksToProcess.forEach((task) => task.resolve(result));\n } catch (error) {\n tasksToProcess.forEach((task) => task.reject(error as Error));\n }\n }\n\n isProcessing = false;\n void process();\n }\n\n return {\n push(task: DocUpdate<T>): Promise<MetaType> {\n return new Promise<MetaType>((resolve, reject) => {\n queue.push({ task, resolve, reject });\n void process();\n });\n },\n };\n}\n","import { Block } from \"multiformats\";\nimport { Logger, ResolveOnce } from \"@adviser/cement\";\n\nimport {\n EncryptedBlockstore,\n type CompactionFetcher,\n type TransactionMeta,\n type CarTransaction,\n BaseBlockstore,\n} from \"./blockstore/index.js\";\nimport {\n clockChangesSince,\n applyBulkUpdateToCrdt,\n getValueFromCrdt,\n readFiles,\n getAllEntries,\n clockVis,\n getBlock,\n doCompact,\n} from \"./crdt-helpers.js\";\nimport type {\n DocUpdate,\n CRDTMeta,\n ClockHead,\n ConfigOpts,\n ChangesOptions,\n IdxMetaMap,\n DocValue,\n IndexKeyType,\n DocWithId,\n DocTypes,\n Falsy,\n} from \"./types.js\";\nimport { index, type Index } from \"./indexer.js\";\nimport { CRDTClock } from \"./crdt-clock.js\";\nimport { blockstoreFactory } from \"./blockstore/transaction.js\";\nimport { ensureLogger } from \"./utils.js\";\n\nexport class CRDT<T extends DocTypes> {\n readonly name?: string;\n readonly opts: ConfigOpts;\n\n readonly onceReady = new ResolveOnce<void>();\n async ready(): Promise<void> {\n return this.onceReady.once(async () => {\n await Promise.all([this.blockstore.ready(), this.indexBlockstore.ready(), this.clock.ready()]);\n });\n }\n\n async close(): Promise<void> {\n await Promise.all([this.blockstore.close(), this.indexBlockstore.close(), this.clock.close()]);\n }\n\n async destroy(): Promise<void> {\n await Promise.all([this.blockstore.destroy(), this.indexBlockstore.destroy()]);\n }\n\n readonly blockstore: BaseBlockstore;\n readonly indexBlockstore: BaseBlockstore;\n readonly indexers = new Map<string, Index<IndexKeyType, NonNullable<unknown>>>();\n readonly clock: CRDTClock<T>;\n\n readonly logger: Logger;\n\n constructor(name?: string, opts: ConfigOpts = {}) {\n this.name = name;\n this.logger = ensureLogger(opts, \"CRDT\");\n this.opts = opts;\n this.blockstore = blockstoreFactory({\n name: name,\n applyMeta: async (meta: TransactionMeta) => {\n const crdtMeta = meta as CRDTMeta;\n if (!crdtMeta.head) throw this.logger.Error().Msg(\"missing head\").AsError();\n await this.clock.applyHead(crdtMeta.head, []);\n },\n compact: async (blocks: CompactionFetcher) => {\n await doCompact(blocks, this.clock.head, this.logger);\n return { head: this.clock.head } as TransactionMeta;\n },\n autoCompact: this.opts.autoCompact || 100,\n crypto: this.opts.crypto,\n store: { ...this.opts.store, isIndex: undefined },\n public: this.opts.public,\n meta: this.opts.meta,\n threshold: this.opts.threshold,\n });\n this.indexBlockstore = blockstoreFactory({\n name: name,\n applyMeta: async (meta: TransactionMeta) => {\n const idxCarMeta = meta as IdxMetaMap;\n if (!idxCarMeta.indexes) throw this.logger.Error().Msg(\"missing indexes\").AsError();\n for (const [name, idx] of Object.entries(idxCarMeta.indexes)) {\n index({ _crdt: this }, name, undefined, idx);\n }\n },\n crypto: this.opts.crypto,\n store: { ...this.opts.store, isIndex: this.opts.store?.isIndex || \"idx\" },\n public: this.opts.public,\n });\n this.clock = new CRDTClock<T>(this.blockstore);\n this.clock.onZoom(() => {\n for (const idx of this.indexers.values()) {\n idx._resetIndex();\n }\n });\n }\n\n async bulk(updates: DocUpdate<T>[]): Promise<CRDTMeta> {\n await this.ready();\n const prevHead = [...this.clock.head];\n\n const done = await this.blockstore.transaction<CRDTMeta>(async (blocks: CarTransaction): Promise<CRDTMeta> => {\n const { head } = await applyBulkUpdateToCrdt<T>(\n this.blockstore.ebOpts.storeRuntime,\n blocks,\n this.clock.head,\n updates,\n this.logger,\n );\n updates = updates.map((dupdate: DocUpdate<T>) => {\n // if (!dupdate.value) throw new Error(\"missing value\");\n readFiles(this.blockstore, { doc: dupdate.value as DocWithId<T> });\n return dupdate;\n });\n return { head };\n });\n await this.clock.applyHead(done.meta.head, prevHead, updates);\n return done.meta;\n }\n\n // if (snap) await this.clock.applyHead(crdtMeta.head, this.clock.head)\n\n async allDocs(): Promise<{ result: DocUpdate<T>[]; head: ClockHead }> {\n await this.ready();\n const result: DocUpdate<T>[] = [];\n for await (const entry of getAllEntries<T>(this.blockstore, this.clock.head, this.logger)) {\n result.push(entry);\n }\n return { result, head: this.clock.head };\n }\n\n async vis(): Promise<string> {\n await this.ready();\n const txt: string[] = [];\n for await (const line of clockVis(this.blockstore, this.clock.head)) {\n txt.push(line);\n }\n return txt.join(\"\\n\");\n }\n\n async getBlock(cidString: string): Promise<Block> {\n await this.ready();\n return await getBlock(this.blockstore, cidString);\n }\n\n async get(key: string): Promise<DocValue<T> | Falsy> {\n await this.ready();\n const result = await getValueFromCrdt<T>(this.blockstore, this.clock.head, key, this.logger);\n if (result.del) return undefined;\n return result;\n }\n\n async changes(\n since: ClockHead = [],\n opts: ChangesOptions = {},\n ): Promise<{\n result: DocUpdate<T>[];\n head: ClockHead;\n }> {\n await this.ready();\n return await clockChangesSince<T>(this.blockstore, this.clock.head, since, opts, this.logger);\n }\n\n async compact(): Promise<void> {\n const blocks = this.blockstore as EncryptedBlockstore;\n return await blocks.compact();\n }\n}\n","import { encode, decode, Block } from \"multiformats/block\";\nimport { parse } from \"multiformats/link\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as codec from \"@ipld/dag-cbor\";\nimport { put, get, entries, root } from \"@web3-storage/pail/crdt\";\nimport { EventBlockView, EventLink, Operation, PutOperation } from \"@web3-storage/pail/crdt/api\";\nimport { EventFetcher, vis } from \"@web3-storage/pail/clock\";\nimport * as Batch from \"@web3-storage/pail/crdt/batch\";\nimport {\n type EncryptedBlockstore,\n type CompactionFetcher,\n CarTransaction,\n BlockFetcher,\n TransactionMeta,\n AnyLink,\n StoreRuntime,\n BaseBlockstore,\n} from \"./blockstore/index.js\";\nimport {\n type IndexKeyType,\n type DocUpdate,\n type ClockHead,\n type DocValue,\n type CRDTMeta,\n type ChangesOptions,\n type DocFileMeta,\n type DocFiles,\n type DocSet,\n type DocWithId,\n type DocTypes,\n throwFalsy,\n} from \"./types.js\";\nimport { Result } from \"@web3-storage/pail/crdt/api\";\nimport { Logger } from \"@adviser/cement\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction time(tag: string) {\n // console.time(tag)\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction timeEnd(tag: string) {\n // console.timeEnd(tag)\n}\n\nfunction toString<K extends IndexKeyType>(key: K, logger: Logger): string {\n switch (typeof key) {\n case \"string\":\n case \"number\":\n return key.toString();\n default:\n throw logger.Error().Msg(\"Invalid key type\").AsError();\n }\n}\n\nexport async function applyBulkUpdateToCrdt<T extends DocTypes>(\n store: StoreRuntime,\n tblocks: CarTransaction,\n head: ClockHead,\n updates: DocUpdate<T>[],\n logger: Logger,\n): Promise<CRDTMeta> {\n let result: Result | null = null;\n if (updates.length > 1) {\n const batch = await Batch.create(tblocks, head);\n for (const update of updates) {\n const link = await writeDocContent(store, tblocks, update, logger);\n await batch.put(toString(update.id, logger), link);\n }\n result = await batch.commit();\n } else if (updates.length === 1) {\n const link = await writeDocContent(store, tblocks, updates[0], logger);\n result = await put(tblocks, head, toString(updates[0].id, logger), link);\n }\n if (!result) throw logger.Error().Uint64(\"updates.len\", updates.length).Msg(\"Missing result\").AsError();\n\n if (result.event) {\n for (const { cid, bytes } of [\n ...result.additions,\n // ...result.removals,\n result.event,\n ]) {\n tblocks.putSync(cid, bytes);\n }\n }\n return { head: result.head } as CRDTMeta;\n}\n\n// this whole thing can get pulled outside of the write queue\nasync function writeDocContent<T extends DocTypes>(\n store: StoreRuntime,\n blocks: CarTransaction,\n update: DocUpdate<T>,\n logger: Logger,\n): Promise<AnyLink> {\n let value: Partial<DocValue<T>>;\n if (update.del) {\n value = { del: true };\n } else {\n if (!update.value) throw logger.Error().Msg(\"Missing value\").AsError();\n await processFiles(store, blocks, update.value, logger);\n value = { doc: update.value as DocWithId<T> };\n }\n const block = await encode({ value, hasher, codec });\n blocks.putSync(block.cid, block.bytes);\n return block.cid;\n}\n\nasync function processFiles<T extends DocTypes>(store: StoreRuntime, blocks: CarTransaction, doc: DocSet<T>, logger: Logger) {\n if (doc._files) {\n await processFileset(logger, store, blocks, doc._files);\n }\n if (doc._publicFiles) {\n await processFileset(logger, store, blocks, doc._publicFiles, true);\n }\n}\n\nasync function processFileset(logger: Logger, store: StoreRuntime, blocks: CarTransaction, files: DocFiles, publicFiles = false) {\n const dbBlockstore = blocks.parent as EncryptedBlockstore;\n if (!dbBlockstore.loader) throw logger.Error().Msg(\"Missing loader, database name is required\").AsError();\n const t = new CarTransaction(dbBlockstore); // maybe this should move to encrypted-blockstore\n const didPut = [];\n // let totalSize = 0\n for (const filename in files) {\n if (File === files[filename].constructor) {\n const file = files[filename] as File;\n\n // totalSize += file.size\n const { cid, blocks: fileBlocks } = await store.encodeFile(file);\n didPut.push(filename);\n for (const block of fileBlocks) {\n t.putSync(block.cid, block.bytes);\n }\n files[filename] = { cid, type: file.type, size: file.size } as DocFileMeta;\n } else {\n const { cid, type, size, car } = files[filename] as DocFileMeta;\n if (cid && type && size && car) {\n files[filename] = { cid, type, size, car };\n }\n }\n }\n\n if (didPut.length) {\n const car = await dbBlockstore.loader.commitFiles(t, { files } as unknown as TransactionMeta, {\n public: publicFiles,\n });\n if (car) {\n for (const name of didPut) {\n files[name] = { car, ...files[name] } as DocFileMeta;\n }\n }\n }\n}\n\nexport async function getValueFromCrdt<T extends DocTypes>(\n blocks: BaseBlockstore,\n head: ClockHead,\n key: string,\n logger: Logger,\n): Promise<DocValue<T>> {\n if (!head.length) throw logger.Debug().Msg(\"Getting from an empty database\").AsError();\n const link = await get(blocks, head, key);\n if (!link) throw logger.Error().Str(\"key\", key).Msg(`Missing key`).AsError();\n return await getValueFromLink(blocks, link, logger);\n}\n\nexport function readFiles<T extends DocTypes>(blocks: BaseBlockstore, { doc }: Partial<DocValue<T>>) {\n if (!doc) return;\n if (doc._files) {\n readFileset(blocks as EncryptedBlockstore, doc._files);\n }\n if (doc._publicFiles) {\n readFileset(blocks as EncryptedBlockstore, doc._publicFiles, true);\n }\n}\n\nfunction readFileset(blocks: EncryptedBlockstore, files: DocFiles, isPublic = false) {\n for (const filename in files) {\n const fileMeta = files[filename] as DocFileMeta;\n if (fileMeta.cid) {\n if (isPublic) {\n fileMeta.url = `https://${fileMeta.cid.toString()}.ipfs.w3s.link/`;\n }\n if (fileMeta.car) {\n fileMeta.file = async () =>\n await blocks.ebOpts.storeRuntime.decodeFile(\n {\n get: async (cid: AnyLink) => {\n return await blocks.getFile(throwFalsy(fileMeta.car), cid, isPublic);\n },\n },\n fileMeta.cid,\n fileMeta,\n );\n }\n }\n files[filename] = fileMeta;\n }\n}\n\nasync function getValueFromLink<T extends DocTypes>(blocks: BlockFetcher, link: AnyLink, logger: Logger): Promise<DocValue<T>> {\n const block = await blocks.get(link);\n if (!block) throw logger.Error().Str(\"link\", link.toString()).Msg(`Missing linked block`).AsError();\n const { value } = (await decode({ bytes: block.bytes, hasher, codec })) as { value: DocValue<T> };\n const cvalue = {\n ...value,\n cid: link,\n };\n readFiles(blocks as EncryptedBlockstore, cvalue);\n return cvalue;\n}\n\nclass DirtyEventFetcher<T> extends EventFetcher<T> {\n async get(link: EventLink<T>): Promise<EventBlockView<T>> {\n try {\n return super.get(link);\n } catch (e) {\n console.error(\"missing event\", link.toString(), e);\n return { value: undefined } as unknown as EventBlockView<T>;\n }\n }\n}\n\nexport async function clockChangesSince<T extends DocTypes>(\n blocks: BlockFetcher,\n head: ClockHead,\n since: ClockHead,\n opts: ChangesOptions,\n logger: Logger,\n): Promise<{ result: DocUpdate<T>[]; head: ClockHead }> {\n const eventsFetcher = (\n opts.dirty ? new DirtyEventFetcher<Operation>(blocks) : new EventFetcher<Operation>(blocks)\n ) as EventFetcher<Operation>;\n const keys = new Set<string>();\n const updates = await gatherUpdates<T>(\n blocks,\n eventsFetcher,\n head,\n since,\n [],\n keys,\n new Set<string>(),\n opts.limit || Infinity,\n logger,\n );\n return { result: updates.reverse(), head };\n}\n\nasync function gatherUpdates<T extends DocTypes>(\n blocks: BlockFetcher,\n eventsFetcher: EventFetcher<Operation>,\n head: ClockHead,\n since: ClockHead,\n updates: DocUpdate<T>[] = [],\n keys: Set<string>,\n didLinks: Set<string>,\n limit: number,\n logger: Logger,\n): Promise<DocUpdate<T>[]> {\n if (limit <= 0) return updates;\n // if (Math.random() < 0.001) console.log('gatherUpdates', head.length, since.length, updates.length)\n const sHead = head.map((l) => l.toString());\n for (const link of since) {\n if (sHead.includes(link.toString())) {\n return updates;\n }\n }\n for (const link of head) {\n if (didLinks.has(link.toString())) continue;\n didLinks.add(link.toString());\n const { value: event } = await eventsFetcher.get(link);\n if (!event) continue;\n const { type } = event.data;\n let ops = [] as PutOperation[];\n if (type === \"batch\") {\n ops = event.data.ops as PutOperation[];\n } else if (type === \"put\") {\n ops = [event.data] as PutOperation[];\n }\n for (let i = ops.length - 1; i >= 0; i--) {\n const { key, value } = ops[i];\n if (!keys.has(key)) {\n // todo option to see all updates\n const docValue = await getValueFromLink<T>(blocks, value, logger);\n updates.push({ id: key, value: docValue.doc, del: docValue.del, clock: link });\n limit--;\n keys.add(key);\n }\n }\n if (event.parents) {\n updates = await gatherUpdates(blocks, eventsFetcher, event.parents, since, updates, keys, didLinks, limit, logger);\n }\n }\n return updates;\n}\n\nexport async function* getAllEntries<T extends DocTypes>(blocks: BlockFetcher, head: ClockHead, logger: Logger) {\n // return entries(blocks, head)\n for await (const [key, link] of entries(blocks, head)) {\n const docValue = await getValueFromLink(blocks, link, logger);\n yield { id: key, value: docValue.doc, del: docValue.del } as DocUpdate<T>;\n }\n}\n\nexport async function* clockVis(blocks: BlockFetcher, head: ClockHead) {\n for await (const line of vis(blocks, head)) {\n yield line;\n }\n}\n\nlet isCompacting = false;\nexport async function doCompact(blockLog: CompactionFetcher, head: ClockHead, logger: Logger) {\n if (isCompacting) {\n // console.log('already compacting')\n return;\n }\n isCompacting = true;\n\n time(\"compact head\");\n for (const cid of head) {\n const bl = await blockLog.get(cid);\n if (!bl) throw logger.Error().Ref(\"cid\", cid).Msg(\"Missing head block\").AsError();\n }\n timeEnd(\"compact head\");\n\n // for await (const blk of blocks.entries()) {\n // const bl = await blockLog.get(blk.cid)\n // if (!bl) throw new Error('Missing tblock: ' + blk.cid.toString())\n // }\n\n // todo maybe remove\n // for await (const blk of blocks.loader!.entries()) {\n // const bl = await blockLog.get(blk.cid)\n // if (!bl) throw new Error('Missing db block: ' + blk.cid.toString())\n // }\n\n time(\"compact all entries\");\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _entry of getAllEntries(blockLog, head, logger)) {\n // result.push(entry)\n // void 1;\n continue;\n }\n timeEnd(\"compact all entries\");\n\n // time(\"compact crdt entries\")\n // for await (const [, link] of entries(blockLog, head)) {\n // const bl = await blockLog.get(link)\n // if (!bl) throw new Error('Missing entry block: ' + link.toString())\n // }\n // timeEnd(\"compact crdt entries\")\n\n time(\"compact clock vis\");\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _line of vis(blockLog, head)) {\n void 1;\n }\n timeEnd(\"compact clock vis\");\n\n time(\"compact root\");\n const result = await root(blockLog, head);\n timeEnd(\"compact root\");\n\n time(\"compact root blocks\");\n for (const { cid, bytes } of [...result.additions, ...result.removals]) {\n blockLog.loggedBlocks.putSync(cid, bytes);\n }\n timeEnd(\"compact root blocks\");\n\n time(\"compact changes\");\n await clockChangesSince(blockLog, head, [], {}, logger);\n timeEnd(\"compact changes\");\n\n isCompacting = false;\n}\n\nexport async function getBlock(blocks: BlockFetcher, cidString: string) {\n const block = await blocks.get(parse(cidString));\n if (!block) throw new Error(`Missing block ${cidString}`);\n const { cid, value } = await decode({ bytes: block.bytes, codec, hasher });\n return new Block({ cid, value, bytes: block.bytes });\n}\n","import { ConnectREST } from \"./connect-rest.js\";\nexport type {\n AnyBlock,\n AnyLink,\n AnyAnyLink,\n CarGroup,\n UploadDataFnParams,\n UploadMetaFnParams,\n DownloadDataFnParams,\n DownloadMetaFnParams,\n DbMeta,\n CommitOpts,\n CryptoOpts,\n StoreFactory,\n StoreOpts,\n StoreRuntime,\n TransactionMeta,\n BlobLike,\n Connection,\n TestStore,\n} from \"./types.js\";\n\nexport * from \"./store-factory.js\";\nexport * from \"./gateway.js\";\n\nimport { type CarClockHead, type Connectable, type DbMetaEventBlock } from \"./connection-base.js\";\nexport { ConnectREST, CarClockHead, Connectable, DbMetaEventBlock };\n\nexport { EncryptedBlockstore, BaseBlockstore, CompactionFetcher, type BlockFetcher, CarTransaction } from \"./transaction.js\";\nexport { Loader, Loadable } from \"./loader.js\";\nexport { DataStore, type DataSaveOpts, MetaStore, RemoteWAL, type WALState } from \"./store.js\";\nexport { parseCarFile } from \"./loader-helpers.js\";\nexport { ConnectionBase } from \"./connection-base.js\";\n","import { EventBlock, decodeEventBlock } from \"@web3-storage/pail/clock\";\nimport { EventView } from \"@web3-storage/pail/clock/api\";\nimport { MemoryBlockstore } from \"@web3-storage/pail/block\";\nimport type { Link, Version } from \"multiformats\";\nimport { Logger } from \"@adviser/cement\";\n\nimport { Falsy, throwFalsy } from \"../types.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport type { BlockstoreOpts } from \"./transaction.js\";\nimport type { UploadMetaFnParams, UploadDataFnParams, DownloadMetaFnParams, DownloadDataFnParams, Connection } from \"./types.js\";\nimport { Loadable, type Loader } from \"./loader.js\";\nimport { ensureLogger } from \"../utils.js\";\n\nexport type CarClockHead = Link<DbMetaEventBlock, number, number, Version>[];\n\nexport interface Connectable {\n readonly blockstore: {\n readonly loader?: Loader;\n readonly ebOpts: BlockstoreOpts;\n };\n readonly name?: string;\n}\n\nexport abstract class ConnectionBase implements Connection {\n // readonly ready: Promise<unknown>;\n // todo move to LRU blockstore https://github.com/web3-storage/w3clock/blob/main/src/worker/block.js\n readonly eventBlocks = new MemoryBlockstore();\n parents: CarClockHead = [];\n loader?: Loadable;\n taskManager?: TaskManager;\n loaded: Promise<void> = Promise.resolve();\n\n abstract metaUpload(bytes: Uint8Array, params: UploadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n abstract dataUpload(bytes: Uint8Array, params: UploadDataFnParams, opts?: { public?: boolean }): Promise<void>;\n abstract metaDownload(params: DownloadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n abstract dataDownload(params: DownloadDataFnParams): Promise<Uint8Array | Falsy>;\n\n readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"ConnectionBase\");\n }\n\n async refresh() {\n await throwFalsy(throwFalsy(this.loader).remoteMetaStore).load(\"main\");\n await (await throwFalsy(this.loader).remoteWAL())._process();\n }\n\n connect({ loader }: { loader?: Loader }) {\n if (!loader) throw this.logger.Error().Msg(\"loader is required\").AsError();\n this.connectMeta({ loader });\n this.connectStorage({ loader });\n }\n\n connectMeta({ loader }: { loader?: Loader }) {\n if (!loader) throw this.logger.Error().Msg(\"loader is required\").AsError();\n this.loader = loader;\n this.taskManager = new TaskManager(loader);\n this.onConnect();\n this.logger.Warn().Msg(\"connectMeta: connecting to remote meta store is disabled\");\n // const remote = new RemoteMetaStore(new URL(`remote://connectMeta`), this.loader.name, this, this.logger);\n // remote.onLoad(\"main\", async (metas) => {\n // if (metas) {\n // await throwFalsy(this.loader).handleDbMetasFromStore(metas);\n // }\n // });\n // this.loader.remoteMetaStore = remote;\n // this.loaded = this.loader.ready().then(async () => {\n // remote.load(\"main\").then(async () => {\n // (await throwFalsy(this.loader).remoteWAL())._process();\n // });\n // });\n }\n\n async onConnect() {\n return;\n }\n\n connectStorage({ loader }: { loader?: Loader }) {\n if (!loader) throw this.logger.Error().Msg(\"loader is required\").AsError();\n this.loader = loader;\n this.logger.Warn().Msg(\"connectStorage: connecting to remote meta store is disabled\");\n // loader.remoteCarStore = new RemoteDataStore(new URL(`remote://remoteCarStore`), this.loader.name, this, this.logger);\n // loader.remoteFileStore = new RemoteDataStore(new URL(`remote://remoteFileStore`), this.loader.name, this, this.logger);\n }\n\n async createEventBlock(bytes: Uint8Array): Promise<DbMetaEventBlock> {\n const data = {\n dbMeta: bytes,\n };\n const event = await EventBlock.create(\n data,\n this.parents as unknown as Link<EventView<{ dbMeta: Uint8Array }>, number, number, 1>[],\n );\n await this.eventBlocks.put(event.cid, event.bytes);\n return event as EventBlock<{ dbMeta: Uint8Array }>; // todo test these `as` casts\n }\n\n async decodeEventBlock(bytes: Uint8Array): Promise<DbMetaEventBlock> {\n const event = await decodeEventBlock<{ dbMeta: Uint8Array }>(bytes);\n return event as EventBlock<{ dbMeta: Uint8Array }>; // todo test these `as` casts\n }\n\n // move this stuff to connect\n // async getDashboardURL(compact = true) {\n // const baseUrl = 'https://dashboard.fireproof.storage/'\n // if (!this.loader?.remoteCarStore) return new URL('/howto', baseUrl)\n // // if (compact) {\n // // await this.compact()\n // // }\n // const currents = await this.loader?.metaStore?.load()\n // if (!currents) throw new Error(\"Can't sync empty database: save data first\")\n // if (currents.length > 1)\n // throw new Error(\"Can't sync database with split heads: make an update first\")\n // const current = currents[0]\n // const params = {\n // car: current.car.toString()\n // }\n // if (current.key) {\n // // @ts-ignore\n // params.key = current.key.toString()\n // }\n // // @ts-ignore\n // if (this.name) {\n // // @ts-ignore\n // params.name = this.name\n // }\n // const url = new URL('/import#' + new URLSearchParams(params).toString(), baseUrl)\n // console.log('Import to dashboard: ' + url.toString())\n // return url\n // }\n\n // openDashboard() {\n // void this.getDashboardURL().then(url => {\n // if (url) window.open(url.toString(), '_blank')\n // })\n // }\n}\n\nexport type DbMetaEventBlock = EventBlock<{ dbMeta: Uint8Array }>;\n","import { Logger } from \"@adviser/cement\";\nimport { DbMetaEventBlock } from \"./connection-base.js\";\nimport { AnyLink, Loader } from \"./index.js\";\nimport { ensureLogger } from \"../utils.js\";\n\ninterface TaskItem {\n readonly cid: string;\n readonly eventBlock: DbMetaEventBlock;\n retries: number;\n}\n\nexport class TaskManager {\n private readonly eventsWeHandled = new Set<string>();\n private readonly loader: Loader;\n\n private queue: TaskItem[] = [];\n private isProcessing = false;\n\n readonly logger: Logger;\n constructor(loader: Loader) {\n this.loader = loader;\n this.logger = ensureLogger(loader.logger, \"TaskManager\");\n }\n\n async handleEvent(eventBlock: DbMetaEventBlock) {\n const cid = eventBlock.cid.toString();\n const parents = eventBlock.value.parents.map((cid: AnyLink) => cid.toString());\n for (const parent of parents) {\n this.eventsWeHandled.add(parent);\n }\n this.queue.push({ cid, eventBlock, retries: 0 });\n this.queue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));\n void this.processQueue();\n }\n\n private async processQueue() {\n if (this.isProcessing) return;\n this.isProcessing = true;\n const filteredQueue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));\n const first = filteredQueue[0];\n if (!first) {\n return;\n }\n try {\n this.loader?.remoteMetaStore?.handleByteHeads([first.eventBlock.value.data.dbMeta]);\n this.eventsWeHandled.add(first.cid);\n this.queue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));\n } catch (err) {\n if (first.retries++ > 3) {\n this.logger.Error().Str(\"cid\", first.cid).Msg(\"failed to process event block after 3 retries\");\n this.queue = this.queue.filter(({ cid }) => cid !== first.cid);\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n throw this.logger.Error().Err(err).Msg(\"failed to process event block\").AsError();\n } finally {\n this.isProcessing = false;\n if (this.queue.length > 0) {\n void this.processQueue();\n }\n }\n }\n}\n","import type { DownloadMetaFnParams, DownloadDataFnParams, UploadMetaFnParams, UploadDataFnParams } from \"./types.js\";\nimport { ConnectionBase } from \"./connection-base.js\";\nimport { ensureLogger } from \"../utils.js\";\nimport { Logger } from \"@adviser/cement\";\n\nexport class ConnectREST extends ConnectionBase {\n readonly baseUrl: URL;\n\n constructor(base: string, logger: Logger) {\n super(ensureLogger(logger, \"ConnectREST\"));\n this.baseUrl = new URL(base);\n }\n\n async dataUpload(bytes: Uint8Array, params: UploadDataFnParams) {\n // console.log('s3 dataUpload', params.car.toString())\n const carCid = params.car.toString();\n const uploadURL = new URL(`/cars/${carCid}.car`, this.baseUrl);\n\n const done = await fetch(uploadURL, { method: \"PUT\", body: bytes });\n // console.log('rest dataUpload done', params.car.toString(), done)\n if (!done.ok) {\n throw this.logger.Error().Msg(\"failed to upload data \" + done.statusText);\n }\n }\n\n async dataDownload(params: DownloadDataFnParams) {\n const { car } = params;\n const fetchFromUrl = new URL(`/cars/${car.toString()}.car`, this.baseUrl);\n const response = await fetch(fetchFromUrl);\n if (!response.ok) {\n return undefined; // throw new Error('failed to download data ' + response.statusText)\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n return bytes;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async metaUpload(bytes: Uint8Array, params: UploadMetaFnParams) {\n // const event = await this.createEventBlock(bytes)\n // const base64String = Base64.fromUint8Array(bytes)\n // const crdtEntry = {\n // cid: event.cid.toString(),\n // data: base64String,\n // parents: this.parents.map(p => p.toString())\n // }\n // const fetchUploadUrl = new URL(\n // `?${new URLSearchParams({ type: 'meta', ...params }).toString()}`,\n // this.uploadUrl\n // )\n // const done = await fetch(fetchUploadUrl, {\n // method: 'PUT',\n // body: JSON.stringify(crdtEntry)\n // })\n // const result = await done.json()\n // if (result.status != 201) {\n // throw new Error('failed to upload data ' + JSON.parse(result.body).message)\n // }\n // this.parents = [event.cid]\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async metaDownload(params: DownloadMetaFnParams) {\n // const { name, branch } = params\n // const fetchUploadUrl = new URL(`?${new URLSearchParams({ type: \"meta\", ...params }).toString()}`,this.uploadUrl)\n // const data = await fetch(fetchUploadUrl)\n // let response = await data.json()\n // if (response.status != 200) throw new Error(\"Failed to download data\")\n // response = JSON.parse(response.body).items\n // const events = await Promise.all(\n // response.map(async (element: any) => {\n // const base64String = element.data\n // const bytes = Base64.toUint8Array(base64String)\n // return { cid: element.cid, bytes }\n // })\n // )\n // const cids = events.map((e) => e.cid)\n // const uniqueParentsMap = new Map([...this.parents, ...cids].map((p) => [p.toString(), p]))\n // this.parents = Array.from(uniqueParentsMap.values())\n // return events.map((e) => e.bytes)\n return [];\n }\n}\n","import { Logger, KeyedResolvOnce } from \"@adviser/cement\";\n\nimport { dataDir } from \"../runtime/data-dir.js\";\nimport { decodeFile, encodeFile } from \"../runtime/files.js\";\nimport { Loadable } from \"./loader.js\";\nimport { DataStore, MetaStore, RemoteWAL } from \"./store.js\";\nimport { StoreOpts, StoreRuntime, TestStore } from \"./types.js\";\nimport { ensureLogger } from \"../utils.js\";\nimport { Gateway } from \"./gateway.js\";\n\nfunction ensureIsIndex(url: URL, isIndex?: string): URL {\n if (isIndex) {\n url.searchParams.set(\"index\", isIndex);\n return url;\n } else {\n url.searchParams.delete(\"index\");\n return url;\n }\n}\n\nexport function toURL(pathOrUrl: string | URL, isIndex?: string): URL {\n if (pathOrUrl instanceof URL) return ensureIsIndex(pathOrUrl, isIndex);\n try {\n const url = new URL(pathOrUrl);\n return ensureIsIndex(url, isIndex);\n } catch (e) {\n const url = new URL(`file://${pathOrUrl}`);\n return ensureIsIndex(url, isIndex);\n }\n}\n\nexport interface StoreFactoryItem {\n readonly protocol: string;\n readonly overrideBaseURL?: string; // if this set it overrides the defaultURL\n readonly overrideRegistration?: boolean; // if this is set, it will override the registration\n // which switches between file and indexdb\n readonly data: (logger: Logger) => Promise<Gateway>;\n readonly meta: (logger: Logger) => Promise<Gateway>;\n readonly wal: (logger: Logger) => Promise<Gateway>;\n readonly test: (logger: Logger) => Promise<TestStore>;\n}\n\nconst storeFactory = new Map<string, StoreFactoryItem>();\n\nfunction ensureName(name: string, url: URL) {\n if (!url.searchParams.has(\"name\")) {\n url.searchParams.set(\"name\", name);\n }\n}\n\nfunction buildURL(optURL: string | URL | undefined, loader: Loadable): URL {\n const storeOpts = loader.ebOpts.store;\n const obuItem = Array.from(storeFactory.values()).find((items) => items.overrideBaseURL);\n let obuUrl: URL | undefined;\n if (obuItem && obuItem.overrideBaseURL) {\n obuUrl = new URL(obuItem.overrideBaseURL);\n }\n return toURL(optURL || obuUrl || dataDir(loader.name, storeOpts.stores?.base), storeOpts.isIndex);\n}\n\nexport function registerStoreProtocol(item: StoreFactoryItem) {\n let protocol = item.protocol;\n if (!protocol.endsWith(\":\")) {\n protocol += \":\";\n }\n if (storeFactory.has(protocol)) {\n if (!item.overrideBaseURL && storeFactory.get(protocol) !== item) {\n const logger = ensureLogger({}, \"registerStoreProtocol\", { protocol });\n logger.Warn().Msg(`protocol ${protocol} already registered`);\n return () => {\n /* no-op */\n };\n }\n }\n // we need to clear the overrideBaseURL if it is set\n if (item.overrideBaseURL) {\n Array.from(storeFactory.values()).forEach((items) => {\n (\n items as {\n overrideBaseURL?: string;\n }\n ).overrideBaseURL = undefined;\n });\n }\n storeFactory.set(protocol, item);\n return () => {\n storeFactory.delete(protocol);\n };\n}\n\nfunction runStoreFactory<T>(url: URL, logger: Logger, run: (item: StoreFactoryItem) => Promise<T>): Promise<T> {\n const item = storeFactory.get(url.protocol);\n if (!item) {\n throw logger\n .Error()\n .Url(url)\n .Str(\"protocol\", url.protocol)\n .Any(\"keys\", Array(storeFactory.keys()))\n .Msg(`unsupported protocol`)\n .AsError();\n }\n logger.Debug().Str(\"protocol\", url.protocol).Msg(\"run\");\n return run(item);\n}\n\nconst onceLoadDataGateway = new KeyedResolvOnce<Gateway>();\nfunction loadDataGateway(url: URL, logger: Logger) {\n return onceLoadDataGateway.get(url.protocol).once(async () => {\n return runStoreFactory(url, logger, async (item) => item.data(logger));\n });\n}\n\nconst onceDataStoreFactory = new KeyedResolvOnce<DataStore>();\nasync function dataStoreFactory(loader: Loadable): Promise<DataStore> {\n const url = buildURL(loader.ebOpts.store.stores?.data, loader);\n ensureName(loader.name, url);\n const logger = ensureLogger(loader.logger, \"dataStoreFactory\", { url: url.toString() });\n url.searchParams.set(\"store\", \"data\");\n return onceDataStoreFactory.get(url.toString()).once(async () => {\n const gateway = await loadDataGateway(url, logger);\n const store = new DataStore(loader.name, url, loader.logger, gateway);\n const ret = await store.start();\n if (ret.isErr()) {\n throw logger.Error().Result(\"start\", ret).Msg(\"start failed\").AsError();\n }\n logger.Debug().Str(\"prepared\", store.url.toString()).Msg(\"produced\");\n return store;\n });\n}\n\nconst onceLoadMetaGateway = new KeyedResolvOnce<Gateway>();\nfunction loadMetaGateway(url: URL, logger: Logger) {\n return onceLoadMetaGateway.get(url.protocol).once(async () => {\n return runStoreFactory(url, logger, async (item) => item.meta(logger));\n });\n}\n\nconst onceMetaStoreFactory = new KeyedResolvOnce<MetaStore>();\nasync function metaStoreFactory(loader: Loadable): Promise<MetaStore> {\n const url = buildURL(loader.ebOpts.store.stores?.meta, loader);\n ensureName(loader.name, url);\n const logger = ensureLogger(loader.logger, \"metaStoreFactory\", { url: () => url.toString() });\n url.searchParams.set(\"store\", \"meta\");\n return onceMetaStoreFactory.get(url.toString()).once(async () => {\n logger.Debug().Str(\"protocol\", url.protocol).Msg(\"pre-protocol switch\");\n const gateway = await loadMetaGateway(url, logger);\n const store = new MetaStore(loader.name, url, loader.logger, gateway);\n const ret = await store.start();\n if (ret.isErr()) {\n throw logger.Error().Result(\"start\", ret).Msg(\"start failed\").AsError();\n }\n return store;\n });\n}\n\nconst onceWalGateway = new KeyedResolvOnce<Gateway>();\nfunction loadWalGateway(url: URL, logger: Logger) {\n return onceWalGateway.get(url.protocol).once(async () => {\n return runStoreFactory(url, logger, async (item) => item.wal(logger));\n });\n}\n\nconst onceRemoteWalFactory = new KeyedResolvOnce<RemoteWAL>();\nasync function remoteWalFactory(loader: Loadable): Promise<RemoteWAL> {\n const url = buildURL(loader.ebOpts.store.stores?.meta, loader);\n ensureName(loader.name, url);\n const logger = ensureLogger(loader.logger, \"remoteWalFactory\", { url: url.toString() });\n url.searchParams.set(\"store\", \"wal\");\n return onceRemoteWalFactory.get(url.toString()).once(async () => {\n const gateway = await loadWalGateway(url, logger);\n logger.Debug().Str(\"prepared\", url.toString()).Msg(\"produced\");\n const store = new RemoteWAL(loader, url, loader.logger, gateway);\n const ret = await store.start();\n if (ret.isErr()) {\n throw logger.Error().Result(\"start\", ret).Msg(\"start failed\").AsError();\n }\n return store;\n });\n}\n\nexport async function testStoreFactory(url: URL, ilogger?: Logger): Promise<TestStore> {\n const logger = ensureLogger(\n {\n logger: ilogger,\n },\n \"testStoreFactory\",\n );\n return runStoreFactory(url, logger, async (item) => item.test(logger));\n}\n\nexport function toStoreRuntime(opts: StoreOpts, ilogger: Logger): StoreRuntime {\n const logger = ensureLogger(ilogger, \"toStoreRuntime\", {});\n return {\n makeMetaStore: (loader: Loadable) => {\n logger\n .Debug()\n .Str(\"fromOpts\", \"\" + !!loader.ebOpts.store.makeMetaStore)\n .Msg(\"makeMetaStore\");\n return (loader.ebOpts.store.makeMetaStore || metaStoreFactory)(loader);\n },\n makeDataStore: (loader: Loadable) => {\n logger\n .Debug()\n .Str(\"fromOpts\", \"\" + !!loader.ebOpts.store.makeDataStore)\n .Msg(\"makeDataStore\");\n return (loader.ebOpts.store.makeDataStore || dataStoreFactory)(loader);\n },\n makeRemoteWAL: (loader: Loadable) => {\n logger\n .Debug()\n .Str(\"fromOpts\", \"\" + !!loader.ebOpts.store.makeRemoteWAL)\n .Msg(\"makeRemoteWAL\");\n return (loader.ebOpts.store.makeRemoteWAL || remoteWalFactory)(loader);\n },\n\n encodeFile: opts.encodeFile || encodeFile,\n decodeFile: opts.decodeFile || decodeFile,\n };\n}\n\nregisterStoreProtocol({\n protocol: \"file:\",\n data: async (logger) => {\n const { FileDataGateway } = await import(\"../runtime/store-file.js\");\n return new FileDataGateway(logger);\n },\n meta: async (logger) => {\n const { FileMetaGateway } = await import(\"../runtime/store-file.js\");\n return new FileMetaGateway(logger);\n },\n wal: async (logger) => {\n const { FileWALGateway } = await import(\"../runtime/store-file.js\");\n return new FileWALGateway(logger);\n },\n test: async (logger) => {\n const { FileTestStore } = await import(\"../runtime/store-file.js\");\n return new FileTestStore(logger);\n },\n});\n\nregisterStoreProtocol({\n protocol: \"indexdb:\",\n data: async (logger) => {\n const { IndexDBDataGateway } = await import(\"../runtime/store-indexdb.js\");\n return new IndexDBDataGateway(logger);\n },\n meta: async (logger) => {\n const { IndexDBMetaGateway } = await import(\"../runtime/store-indexdb.js\");\n return new IndexDBMetaGateway(logger);\n },\n wal: async (logger) => {\n const { IndexDBMetaGateway } = await import(\"../runtime/store-indexdb.js\");\n return new IndexDBMetaGateway(logger);\n },\n test: async (logger) => {\n const { IndexDBTestStore } = await import(\"../runtime/store-indexdb.js\");\n return new IndexDBTestStore(logger);\n },\n});\n","import pLimit from \"p-limit\";\nimport { format, parse, ToString } from \"@ipld/dag-json\";\nimport { Logger, ResolveOnce, Result } from \"@adviser/cement\";\n\nimport type { AnyBlock, AnyLink, CommitOpts, DbMeta } from \"./types.js\";\nimport { Falsy, throwFalsy } from \"../types.js\";\nimport { Gateway, isNotFoundError } from \"./gateway.js\";\nimport { ensureLogger, exception2Result } from \"../utils.js\";\nimport { carLogIncludesGroup, Loadable } from \"./loader.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\n\n// const match = PACKAGE_VERSION.match(/^([^.]*\\.[^.]*)/);\n// if (!match) throw new Error(\"invalid version: \" + PACKAGE_VERSION);\n// export const STORAGE_VERSION = match[0];\n\nfunction guardVersion(url: URL): Result<URL> {\n if (!url.searchParams.has(\"version\")) {\n return Result.Err(`missing version: ${url.toString()}`);\n }\n return Result.Ok(url);\n}\n\nabstract class VersionedStore {\n // readonly STORAGE_VERSION: string;\n readonly name: string;\n readonly url: URL;\n readonly logger: Logger;\n constructor(name: string, url: URL, logger: Logger) {\n this.name = name;\n this.url = url;\n this.logger = logger;\n // const sv = url.searchParams.get(\"version\");\n // if (!sv) throw this.logger.Error().Str(\"url\", url.toString()).Msg(`version not found`);\n // this.STORAGE_VERSION = sv;\n }\n\n readonly _onStarted: (() => void)[] = [];\n onStarted(fn: () => void) {\n this._onStarted.push(fn);\n }\n abstract start(): Promise<Result<void>>;\n\n readonly _onClosed: (() => void)[] = [];\n onClosed(fn: () => void) {\n this._onClosed.push(fn);\n }\n abstract close(): Promise<Result<void>>;\n}\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\nexport class MetaStore extends VersionedStore {\n readonly tag: string = \"header-base\";\n\n readonly gateway: Gateway;\n\n constructor(name: string, url: URL, logger: Logger, gateway: Gateway) {\n super(name, url, ensureLogger(logger, \"MetaStore\", {}));\n this.gateway = gateway;\n }\n\n makeHeader({ cars, key }: DbMeta): ToString<DbMeta> {\n const toEncode: DbMeta = { cars };\n if (key) toEncode.key = key;\n return format(toEncode);\n }\n\n parseHeader(headerData: ToString<DbMeta>): DbMeta {\n const got = parse<DbMeta>(headerData);\n return got;\n }\n\n async start(): Promise<Result<void>> {\n this.logger.Debug().Msg(\"starting\");\n const res = await this.gateway.start(this.url);\n if (res.isErr()) {\n return res;\n }\n this._onStarted.forEach((fn) => fn());\n return guardVersion(this.url);\n }\n\n async load(branch?: string): Promise<DbMeta[] | Falsy> {\n this.logger\n .Debug()\n .Str(\"branch\", branch || \"\")\n .Msg(\"loading\");\n const url = await this.gateway.buildUrl(this.url, branch || \"main\");\n if (url.isErr()) {\n throw this.logger\n .Error()\n .Result(\"buidUrl\", url)\n .Str(\"branch\", branch || \"\")\n .Url(this.url)\n .Msg(\"got error from gateway.buildUrl\")\n .AsError();\n }\n const bytes = await this.gateway.get(url.Ok());\n if (bytes.isErr()) {\n if (isNotFoundError(bytes)) {\n return undefined;\n }\n throw this.logger.Error().Url(url.Ok()).Result(\"bytes:\", bytes).Msg(\"gateway get\").AsError();\n }\n try {\n return [this.parseHeader(textDecoder.decode(bytes.Ok()))];\n } catch (e) {\n throw this.logger.Error().Err(e).Msg(\"parseHeader\").AsError();\n }\n }\n\n async save(meta: DbMeta, branch = \"main\") {\n this.logger.Debug().Str(\"branch\", branch).Any(\"meta\", meta).Msg(\"saving meta\");\n const bytes = this.makeHeader(meta);\n const url = await this.gateway.buildUrl(this.url, branch);\n if (url.isErr()) {\n throw this.logger.Error().Err(url.Err()).Str(\"branch\", branch).Url(this.url).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const res = await this.gateway.put(url.Ok(), textEncoder.encode(bytes));\n if (res.isErr()) {\n throw this.logger.Error().Err(res.Err()).Msg(\"got error from gateway.put\").AsError();\n }\n return res.Ok();\n }\n\n async close(): Promise<Result<void>> {\n await this.gateway.close(this.url);\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n async destroy(): Promise<Result<void>> {\n return this.gateway.destroy(this.url);\n }\n}\n\nexport interface DataSaveOpts {\n readonly public: boolean;\n}\n\nexport class DataStore extends VersionedStore {\n readonly tag: string = \"car-base\";\n readonly gateway: Gateway;\n\n constructor(name: string, url: URL, logger: Logger, gateway: Gateway) {\n super(\n name,\n url,\n ensureLogger(logger, \"DataStore\", {\n url: () => url.toString(),\n }),\n );\n this.gateway = gateway;\n }\n\n async start(): Promise<Result<void>> {\n this.logger.Debug().Msg(\"starting-gateway\");\n const res = await this.gateway.start(this.url);\n if (res.isErr()) {\n this.logger.Error().Result(\"gw-start\", res).Msg(\"started-gateway\");\n return res;\n }\n this._onStarted.forEach((fn) => fn());\n const version = guardVersion(this.url);\n if (version.isErr()) {\n this.logger.Error().Result(\"version\", version).Msg(\"guardVersion\");\n await this.close();\n return version;\n }\n this.logger.Debug().Msg(\"started\");\n return version;\n }\n\n async load(cid: AnyLink): Promise<AnyBlock> {\n this.logger.Debug().Any(\"cid\", cid).Msg(\"loading\");\n const url = await this.gateway.buildUrl(this.url, cid.toString());\n if (url.isErr()) {\n throw this.logger.Error().Err(url.Err()).Str(\"cid\", cid.toString()).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const res = await this.gateway.get(url.Ok());\n if (res.isErr()) {\n throw res.Err();\n }\n return { cid, bytes: res.Ok() };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async save(car: AnyBlock, opts?: DataSaveOpts): Promise</*AnyLink | */ void> {\n this.logger.Debug().Any(\"cid\", car.cid.toString()).Msg(\"saving\");\n const url = await this.gateway.buildUrl(this.url, car.cid.toString());\n if (url.isErr()) {\n throw this.logger.Error().Err(url.Err()).Ref(\"cid\", car.cid).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const res = await this.gateway.put(url.Ok(), car.bytes);\n if (res.isErr()) {\n throw this.logger.Error().Err(res.Err()).Msg(\"got error from gateway.put\").AsError();\n }\n return res.Ok();\n }\n async remove(cid: AnyLink): Promise<Result<void>> {\n const url = await this.gateway.buildUrl(this.url, cid.toString());\n if (url.isErr()) {\n return url;\n }\n return this.gateway.delete(url.Ok());\n }\n async close(): Promise<Result<void>> {\n await this.gateway.close(this.url);\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n destroy(): Promise<Result<void>> {\n return this.gateway.destroy(this.url);\n }\n}\n\nexport interface WALState {\n operations: DbMeta[];\n noLoaderOps: DbMeta[];\n fileOperations: {\n readonly cid: AnyLink;\n readonly public: boolean;\n }[];\n}\n\nexport class RemoteWAL extends VersionedStore {\n readonly tag: string = \"rwal-base\";\n\n readonly loader: Loadable;\n\n readonly _ready = new ResolveOnce<void>();\n\n private async ready() {\n return this._ready.once(async () => {\n const walState = await this.load().catch((e) => {\n this.logger.Error().Any(\"error\", e).Msg(\"error loading wal\");\n return undefined;\n });\n if (!walState) {\n this.walState.operations = [];\n this.walState.fileOperations = [];\n } else {\n this.walState.operations = walState.operations || [];\n this.walState.fileOperations = walState.fileOperations || [];\n }\n });\n }\n\n walState: WALState = { operations: [], noLoaderOps: [], fileOperations: [] };\n readonly processing: Promise<void> | undefined = undefined;\n readonly processQueue: CommitQueue<void> = new CommitQueue<void>();\n\n readonly gateway: Gateway;\n\n constructor(loader: Loadable, url: URL, logger: Logger, gateway: Gateway) {\n super(loader.name, url, ensureLogger(logger, \"RemoteWAL\"));\n this.loader = loader;\n this.gateway = gateway;\n }\n\n async enqueue(dbMeta: DbMeta, opts: CommitOpts) {\n await this.ready();\n if (opts.noLoader) {\n this.walState.noLoaderOps.push(dbMeta);\n } else {\n this.walState.operations.push(dbMeta);\n }\n await this.save(this.walState);\n void this._process();\n }\n\n async enqueueFile(fileCid: AnyLink, publicFile = false) {\n await this.ready();\n this.walState.fileOperations.push({ cid: fileCid, public: publicFile });\n // await this.save(this.walState)\n }\n\n async _process() {\n await this.ready();\n if (!this.loader.remoteCarStore) return;\n await this.processQueue.enqueue(async () => {\n await this._doProcess();\n if (this.walState.operations.length || this.walState.fileOperations.length || this.walState.noLoaderOps.length) {\n setTimeout(() => void this._process(), 0);\n }\n });\n }\n\n async _doProcess() {\n if (!this.loader.remoteCarStore) return;\n const rmlp = (async () => {\n const operations = [...this.walState.operations];\n const fileOperations = [...this.walState.fileOperations];\n const uploads: Promise<void>[] = [];\n const noLoaderOps = [...this.walState.noLoaderOps];\n const limit = pLimit(5);\n\n if (operations.length + fileOperations.length + noLoaderOps.length === 0) return;\n\n for (const dbMeta of noLoaderOps) {\n const uploadP = limit(async () => {\n for (const cid of dbMeta.cars) {\n const car = await (await this.loader.carStore()).load(cid);\n if (!car) {\n if (carLogIncludesGroup(this.loader.carLog, dbMeta.cars))\n throw this.logger.Error().Ref(\"cid\", cid).Msg(\"missing local car\").AsError();\n } else {\n await throwFalsy(this.loader.remoteCarStore).save(car);\n }\n this.walState.noLoaderOps = this.walState.noLoaderOps.filter((op) => op !== dbMeta);\n }\n });\n uploads.push(uploadP);\n }\n\n for (const dbMeta of operations) {\n const uploadP = limit(async () => {\n for (const cid of dbMeta.cars) {\n const car = await (await this.loader.carStore()).load(cid).catch(() => null);\n if (!car) {\n if (carLogIncludesGroup(this.loader.carLog, dbMeta.cars))\n throw this.logger.Error().Ref(\"cid\", cid).Msg(`missing local car`).AsError();\n } else {\n await throwFalsy(this.loader.remoteCarStore).save(car);\n }\n }\n this.walState.operations = this.walState.operations.filter((op) => op !== dbMeta);\n });\n uploads.push(uploadP);\n }\n\n if (fileOperations.length) {\n const dbLoader = this.loader;\n for (const { cid: fileCid, public: publicFile } of fileOperations) {\n const uploadP = limit(async () => {\n const fileBlock = await (await dbLoader.fileStore()).load(fileCid); // .catch(() => false)\n await dbLoader.remoteFileStore?.save(fileBlock, { public: publicFile });\n this.walState.fileOperations = this.walState.fileOperations.filter((op) => op.cid !== fileCid);\n });\n uploads.push(uploadP);\n }\n }\n\n try {\n const res = await Promise.allSettled(uploads);\n const errors = res.filter((r) => r.status === \"rejected\") as PromiseRejectedResult[];\n if (errors.length) {\n throw this.logger\n .Error()\n .Any(\n \"errors\",\n errors.map((e) => e.reason),\n )\n .Msg(\"error uploading\")\n .AsError();\n\n errors[0].reason;\n }\n if (operations.length) {\n const lastOp = operations[operations.length - 1];\n // console.log('saving remote meta', lastOp.car.toString())\n await this.loader.remoteMetaStore?.save(lastOp).catch((e: Error) => {\n this.walState.operations.push(lastOp);\n throw this.logger.Error().Any(\"error\", e).Msg(\"error saving remote meta\").AsError();\n });\n }\n } finally {\n await this.save(this.walState);\n }\n })();\n // this.loader.remoteMetaLoading = rmlp;\n await rmlp;\n }\n\n async start() {\n const res = await this.gateway.start(this.url);\n if (res.isErr()) {\n return res;\n }\n const ver = guardVersion(this.url);\n if (ver.isErr()) {\n await this.close();\n return ver;\n }\n const ready = await exception2Result(() => this.ready());\n this._onStarted.forEach((fn) => fn());\n if (ready.isErr()) {\n await this.close();\n return ready;\n }\n return ready;\n }\n\n async load(): Promise<WALState | Falsy> {\n this.logger.Debug().Msg(\"loading\");\n const filepath = await this.gateway.buildUrl(this.url, \"main\");\n if (filepath.isErr()) {\n throw this.logger.Error().Err(filepath.Err()).Str(\"url\", this.url.toString()).Msg(\"error building url\").AsError();\n }\n const bytes = await this.gateway.get(filepath.Ok());\n if (bytes.isErr()) {\n if (isNotFoundError(bytes)) {\n return undefined;\n }\n throw this.logger.Error().Err(bytes.Err()).Msg(\"error get\").AsError();\n }\n try {\n return bytes && parse<WALState>(textDecoder.decode(bytes.Ok()));\n } catch (e) {\n throw this.logger.Error().Err(e).Msg(\"error parse\").AsError();\n }\n }\n\n async save(state: WALState) {\n const filepath = await this.gateway.buildUrl(this.url, \"main\");\n if (filepath.isErr()) {\n throw this.logger.Error().Err(filepath.Err()).Str(\"url\", this.url.toString()).Msg(\"error building url\").AsError();\n }\n let encoded: ToString<WALState>;\n try {\n encoded = format(state);\n } catch (e) {\n throw this.logger.Error().Err(e).Any(\"state\", state).Msg(\"error format\").AsError();\n }\n const res = await this.gateway.put(filepath.Ok(), textEncoder.encode(encoded));\n if (res.isErr()) {\n throw this.logger.Error().Err(res.Err()).Str(\"filePath\", filepath.Ok().toString()).Msg(\"error saving\").AsError();\n }\n }\n\n async close() {\n await this.gateway.close(this.url);\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n\n destroy() {\n return this.gateway.destroy(this.url);\n }\n}\n","import pLimit from \"p-limit\";\nimport { CarReader } from \"@ipld/car\";\nimport { Logger, ResolveOnce } from \"@adviser/cement\";\n// import { uuidv4 } from \"uuidv7\";\n\nimport {\n type AnyBlock,\n type AnyLink,\n type CarHeader,\n type CommitOpts,\n type DbMeta,\n type TransactionMeta,\n type CarGroup,\n type CarLog,\n toCIDBlock,\n} from \"./types.js\";\nimport type { BlockstoreOpts, BlockstoreRuntime } from \"./transaction.js\";\n\nimport { encodeCarFile, encodeCarHeader, parseCarFile } from \"./loader-helpers.js\";\nimport { decodeEncryptedCar, encryptedEncodeCarFile } from \"./encrypt-helpers.js\";\n\nimport { DataStore, MetaStore, RemoteWAL } from \"./store.js\";\n\nimport { CarTransaction, defaultedBlockstoreRuntime } from \"./transaction.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport * as CBW from \"@ipld/car/buffer-writer\";\nimport type { Falsy, FileTransactionMeta } from \"../types.js\";\n\nexport function carLogIncludesGroup(list: CarLog, cids: CarGroup) {\n return list.some((arr: CarGroup) => {\n return arr.toString() === cids.toString();\n });\n}\n\n// this works for car groups because toString looks like bafy,bafy\nfunction uniqueCids(list: CarLog, remove = new Set<string>()): CarLog {\n const byString = new Map<string, CarGroup>();\n for (const cid of list) {\n if (remove.has(cid.toString())) continue;\n byString.set(cid.toString(), cid);\n }\n return [...byString.values()];\n}\n\nexport function toHexString(byteArray: Uint8Array) {\n return Array.from(byteArray)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\ntype AbstractRemoteMetaStore = MetaStore & {\n handleByteHeads(byteHeads: Uint8Array[], branch?: string): Promise<DbMeta[]>;\n};\n\nexport abstract class Loadable {\n name = \"\";\n abstract readonly logger: Logger;\n abstract readonly ebOpts: BlockstoreRuntime;\n remoteCarStore?: DataStore;\n abstract carStore(): Promise<DataStore>;\n carLog: CarLog = new Array<CarGroup>();\n remoteMetaStore?: AbstractRemoteMetaStore;\n remoteFileStore?: DataStore;\n abstract ready(): Promise<void>;\n abstract close(): Promise<void>;\n abstract fileStore(): Promise<DataStore>;\n abstract remoteWAL(): Promise<RemoteWAL>;\n abstract handleDbMetasFromStore(metas: DbMeta[]): Promise<void>;\n}\n\nexport class Loader implements Loadable {\n readonly name: string;\n readonly ebOpts: BlockstoreRuntime;\n readonly commitQueue: CommitQueue<CarGroup> = new CommitQueue<CarGroup>();\n readonly isCompacting = false;\n readonly carReaders = new Map<string, Promise<CarReader>>();\n readonly seenCompacted = new Set<string>();\n readonly processedCars = new Set<string>();\n\n carLog: CarLog = [];\n key?: string;\n keyId?: string;\n remoteMetaStore?: AbstractRemoteMetaStore;\n remoteCarStore?: DataStore;\n remoteFileStore?: DataStore;\n\n private getBlockCache = new Map<string, AnyBlock>();\n private seenMeta = new Set<string>();\n private writeLimit = pLimit(1);\n\n // readonly id = uuidv4();\n\n async carStore(): Promise<DataStore> {\n return this.ebOpts.storeRuntime.makeDataStore(this);\n }\n\n async fileStore(): Promise<DataStore> {\n return this.ebOpts.storeRuntime.makeDataStore(this);\n }\n async remoteWAL(): Promise<RemoteWAL> {\n return this.ebOpts.storeRuntime.makeRemoteWAL(this);\n }\n\n async metaStore(): Promise<MetaStore> {\n return this.ebOpts.storeRuntime.makeMetaStore(this);\n }\n\n readonly onceReady = new ResolveOnce<void>();\n async ready(): Promise<void> {\n return this.onceReady.once(async () => {\n const metas = this.ebOpts.meta ? [this.ebOpts.meta] : await (await this.metaStore()).load(\"main\");\n if (metas) {\n await this.handleDbMetasFromStore(metas);\n }\n });\n }\n\n async close() {\n const toClose = await Promise.all([this.carStore(), this.metaStore(), this.fileStore(), this.remoteWAL()]);\n await Promise.all(toClose.map((store) => store.close()));\n }\n\n async destroy() {\n const toDestroy = await Promise.all([this.carStore(), this.metaStore(), this.fileStore(), this.remoteWAL()]);\n await Promise.all(toDestroy.map((store) => store.destroy()));\n }\n\n readonly logger: Logger;\n constructor(name: string, ebOpts: BlockstoreOpts) {\n this.name = name;\n // console.log(\"Loader\", name, ebOpts)\n this.ebOpts = defaultedBlockstoreRuntime(\n {\n ...ebOpts,\n name,\n },\n \"Loader\",\n );\n this.logger = this.ebOpts.logger;\n }\n\n // async snapToCar(carCid: AnyLink | string) {\n // await this.ready\n // if (typeof carCid === 'string') {\n // carCid = CID.parse(carCid)\n // }\n // const carHeader = await this.loadCarHeaderFromMeta({ car: carCid, key: this.key || null })\n // this.carLog = [carCid, ...carHeader.cars]\n // await this.getMoreReaders(carHeader.cars)\n // await this._applyCarHeader(carHeader, true)\n // }\n\n async handleDbMetasFromStore(metas: DbMeta[]): Promise<void> {\n for (const meta of metas) {\n await this.writeLimit(async () => {\n await this.mergeDbMetaIntoClock(meta);\n });\n }\n }\n\n async mergeDbMetaIntoClock(meta: DbMeta): Promise<void> {\n if (this.isCompacting) {\n throw this.logger.Error().Msg(\"cannot merge while compacting\").AsError();\n }\n\n if (this.seenMeta.has(meta.cars.toString())) return;\n this.seenMeta.add(meta.cars.toString());\n\n if (meta.key) {\n await this.setKey(meta.key);\n }\n if (carLogIncludesGroup(this.carLog, meta.cars)) {\n return;\n }\n const carHeader = await this.loadCarHeaderFromMeta<TransactionMeta>(meta);\n // fetch other cars down the compact log?\n // todo we should use a CID set for the compacted cids (how to expire?)\n // console.log('merge carHeader', carHeader.head.length, carHeader.head.toString(), meta.car.toString())\n carHeader.compact.map((c) => c.toString()).forEach(this.seenCompacted.add, this.seenCompacted);\n await this.getMoreReaders(carHeader.cars.flat());\n this.carLog = [...uniqueCids([meta.cars, ...this.carLog, ...carHeader.cars], this.seenCompacted)];\n await this.ebOpts.applyMeta?.(carHeader.meta);\n }\n\n protected async ingestKeyFromMeta(meta: DbMeta): Promise<void> {\n const { key } = meta;\n if (key) {\n await this.setKey(key);\n }\n }\n\n async loadCarHeaderFromMeta<T>({ cars: cids }: DbMeta): Promise<CarHeader<T>> {\n //Call loadCar for every cid\n const reader = await this.loadCar(cids[0]);\n return await parseCarFile(reader, this.logger);\n }\n\n async _getKey(): Promise<string | undefined> {\n if (this.key) return this.key;\n // generate a random key\n if (!this.ebOpts.public) {\n await this.setKey(toHexString(this.ebOpts.crypto.randomBytes(32)));\n }\n return this.key || undefined;\n }\n\n async commitFiles(\n t: CarTransaction,\n done: TransactionMeta,\n opts: CommitOpts = { noLoader: false, compact: false },\n ): Promise<CarGroup> {\n return this.commitQueue.enqueue(() => this._commitInternalFiles(t, done, opts));\n }\n // can these skip the queue? or have a file queue?\n async _commitInternalFiles(\n t: CarTransaction,\n done: TransactionMeta,\n opts: CommitOpts = { noLoader: false, compact: false },\n ): Promise<CarGroup> {\n await this.ready();\n const { files: roots } = this.makeFileCarHeader(done as FileTransactionMeta) as {\n files: AnyLink[];\n };\n const cids: AnyLink[] = [];\n const cars = await this.prepareCarFilesFiles(roots, t, !!opts.public);\n for (const car of cars) {\n const { cid, bytes } = car;\n await (await this.fileStore()).save({ cid, bytes });\n await (await this.remoteWAL()).enqueueFile(cid, !!opts.public);\n cids.push(cid);\n }\n\n return cids;\n }\n\n async loadFileCar(cid: AnyLink, isPublic = false): Promise<CarReader> {\n return await this.storesLoadCar(cid, await this.fileStore(), this.remoteFileStore, isPublic);\n }\n\n async commit<T = TransactionMeta>(\n t: CarTransaction,\n done: T,\n opts: CommitOpts = { noLoader: false, compact: false },\n ): Promise<CarGroup> {\n return this.commitQueue.enqueue(() => this._commitInternal(t, done, opts));\n }\n\n async cacheTransaction(t: CarTransaction) {\n for await (const block of t.entries()) {\n const sBlock = block.cid.toString();\n if (!this.getBlockCache.has(sBlock)) {\n this.getBlockCache.set(sBlock, block);\n }\n }\n }\n\n async cacheCarReader(carCidStr: string, reader: CarReader) {\n if (this.processedCars.has(carCidStr)) return;\n this.processedCars.add(carCidStr);\n for await (const block of reader.blocks()) {\n const sBlock = block.cid.toString();\n if (!this.getBlockCache.has(sBlock)) {\n this.getBlockCache.set(sBlock, block);\n }\n }\n }\n\n async _commitInternal<T>(t: CarTransaction, done: T, opts: CommitOpts = { noLoader: false, compact: false }): Promise<CarGroup> {\n await this.ready();\n const fp = this.makeCarHeader<T>(done, this.carLog, !!opts.compact);\n const rootBlock = await encodeCarHeader(fp);\n\n const cars = await this.prepareCarFiles(rootBlock, t, !!opts.public);\n const cids: AnyLink[] = [];\n for (const car of cars) {\n const { cid, bytes } = car;\n await (await this.carStore()).save({ cid, bytes });\n cids.push(cid);\n }\n\n await this.cacheTransaction(t);\n const newDbMeta = { cars: cids, key: this.key || null } as DbMeta;\n await (await this.remoteWAL()).enqueue(newDbMeta, opts);\n await (await this.metaStore()).save(newDbMeta);\n await this.updateCarLog(cids, fp, !!opts.compact);\n return cids;\n }\n\n async prepareCarFilesFiles(\n roots: AnyLink[],\n t: CarTransaction,\n isPublic: boolean,\n ): Promise<{ cid: AnyLink; bytes: Uint8Array }[]> {\n const theKey = isPublic ? null : await this._getKey();\n const car =\n theKey && this.ebOpts.crypto\n ? await encryptedEncodeCarFile(this.logger, this.ebOpts.crypto, theKey, roots[0], t)\n : await encodeCarFile(roots, t);\n return [car];\n }\n\n async prepareCarFiles(rootBlock: AnyBlock, t: CarTransaction, isPublic: boolean): Promise<{ cid: AnyLink; bytes: Uint8Array }[]> {\n const theKey = isPublic ? undefined : await this._getKey();\n const carFiles: { cid: AnyLink; bytes: Uint8Array }[] = [];\n const threshold = this.ebOpts.threshold || 1000 * 1000;\n let clonedt = new CarTransaction(t.parent, { add: false });\n clonedt.putSync(rootBlock.cid, rootBlock.bytes);\n let newsize = CBW.blockLength(toCIDBlock(rootBlock));\n let cidRootBlock = rootBlock;\n for (const { cid, bytes } of t.entries()) {\n newsize += CBW.blockLength(toCIDBlock({ cid: cid, bytes }));\n if (newsize >= threshold) {\n carFiles.push(await this.createCarFile(theKey, cidRootBlock.cid, clonedt));\n clonedt = new CarTransaction(t.parent, { add: false });\n clonedt.putSync(cid, bytes);\n cidRootBlock = { cid, bytes };\n newsize = CBW.blockLength(toCIDBlock({ cid, bytes })); //+ CBW.blockLength(rootBlock)\n } else {\n clonedt.putSync(cid, bytes);\n }\n }\n carFiles.push(await this.createCarFile(theKey, cidRootBlock.cid, clonedt));\n // console.log(\"split to \", carFiles.length, \"files\")\n return carFiles;\n }\n\n private async createCarFile(\n theKey: string | undefined,\n cid: AnyLink,\n t: CarTransaction,\n ): Promise<{ cid: AnyLink; bytes: Uint8Array }> {\n try {\n return theKey && this.ebOpts.crypto\n ? await encryptedEncodeCarFile(this.logger, this.ebOpts.crypto, theKey, cid, t)\n : await encodeCarFile([cid], t);\n } catch (e) {\n console.error(\"error creating car file\", e);\n throw e;\n }\n }\n\n protected makeFileCarHeader(result: FileTransactionMeta): TransactionMeta {\n const files: AnyLink[] = [];\n for (const [, meta] of Object.entries(result.files || {})) {\n if (meta && typeof meta === \"object\" && \"cid\" in meta && meta !== null) {\n files.push(meta.cid as AnyLink);\n }\n }\n return { ...result, files };\n }\n\n async updateCarLog<T>(cids: CarGroup, fp: CarHeader<T>, compact: boolean): Promise<void> {\n if (compact) {\n const previousCompactCid = fp.compact[fp.compact.length - 1];\n fp.compact.map((c) => c.toString()).forEach(this.seenCompacted.add, this.seenCompacted);\n this.carLog = [...uniqueCids([...this.carLog, ...fp.cars, cids], this.seenCompacted)];\n await this.removeCidsForCompact(previousCompactCid[0]);\n } else {\n this.carLog.unshift(cids);\n }\n }\n\n async removeCidsForCompact(cid: AnyLink) {\n const carHeader = await this.loadCarHeaderFromMeta({\n cars: [cid],\n } as unknown as DbMeta);\n for (const cids of carHeader.compact) {\n for (const cid of cids) {\n await (await this.carStore()).remove(cid);\n }\n }\n }\n\n // async flushCars() {\n // await this.ready\n // // for each cid in car log, make a dbMeta\n // for (const cid of this.carLog) {\n // const dbMeta = { car: cid, key: this.key || null } as DbMeta\n // await this.remoteWAL!.enqueue(dbMeta, { public: false })\n // }\n // }\n\n async *entries(cache = true): AsyncIterableIterator<AnyBlock> {\n await this.ready();\n if (cache) {\n for (const [, block] of this.getBlockCache) {\n yield block;\n }\n } else {\n for (const [, block] of this.getBlockCache) {\n yield block;\n }\n for (const cids of this.carLog) {\n for (const cid of cids) {\n const reader = await this.loadCar(cid);\n if (!reader) throw this.logger.Error().Ref(\"cid\", cid).Msg(\"missing car reader\").AsError();\n for await (const block of reader.blocks()) {\n const sCid = block.cid.toString();\n if (!this.getBlockCache.has(sCid)) {\n yield block;\n }\n }\n }\n }\n }\n }\n\n async getBlock(cid: AnyLink): Promise<AnyBlock | Falsy> {\n await this.ready();\n const sCid = cid.toString();\n if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n\n const getCarCid = async (carCid: AnyLink) => {\n if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n const reader = await this.loadCar(carCid);\n if (!reader) {\n throw this.logger.Error().Ref(\"cid\", carCid).Msg(\"missing car reader\").AsError();\n }\n await this.cacheCarReader(carCid.toString(), reader).catch(() => {\n return;\n });\n if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n throw this.logger.Error().Str(\"cid\", sCid).Msg(\"block not in reader\").AsError();\n };\n\n const getCompactCarCids = async (carCid: AnyLink) => {\n // console.log(\"getCompactCarCids\", carCid.toString())\n\n const reader = await this.loadCar(carCid);\n if (!reader) {\n throw this.logger.Error().Str(\"cid\", carCid.toString()).Msg(\"missing car reader\").AsError();\n }\n\n const header = await parseCarFile(reader, this.logger);\n\n const compacts = header.compact;\n\n let got: AnyBlock | undefined;\n const batchSize = 5;\n for (let i = 0; i < compacts.length; i += batchSize) {\n const promises: Promise<AnyBlock | undefined>[] = [];\n for (let j = i; j < Math.min(i + batchSize, compacts.length); j++) {\n for (const cid of compacts[j]) {\n promises.push(getCarCid(cid));\n }\n }\n try {\n got = await Promise.any(promises);\n } catch {\n // Ignore the error and continue with the next iteration\n }\n if (got) break;\n }\n\n if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n throw this.logger.Error().Str(\"cid\", sCid).Msg(\"block not in compact reader\").AsError();\n };\n\n let got;\n const batchSize = 5;\n for (let i = 0; i < this.carLog.length; i += batchSize) {\n const batch = this.carLog.slice(i, i + batchSize);\n const promises: Promise<AnyBlock | undefined>[] = batch.flatMap((slice) => slice.map(getCarCid));\n try {\n got = await Promise.any(promises);\n } catch {\n // Ignore the error and continue with the next iteration\n }\n if (got) break;\n }\n\n if (!got) {\n try {\n got = await getCompactCarCids(this.carLog[this.carLog.length - 1][0]);\n } catch {\n // Ignore the error and continue with the next iteration\n }\n }\n\n return got;\n }\n\n protected makeCarHeader<T>(meta: T, cars: CarLog, compact = false): CarHeader<T> {\n const coreHeader = compact ? { cars: [], compact: cars } : { cars, compact: [] };\n return { ...coreHeader, meta };\n }\n\n async loadCar(cid: AnyLink): Promise<CarReader> {\n if (!this.carStore) {\n throw this.logger.Error().Msg(\"car store not initialized\").AsError();\n }\n const loaded = await this.storesLoadCar(cid, await this.carStore(), this.remoteCarStore);\n return loaded;\n }\n\n //What if instead it returns an Array of CarHeader\n protected async storesLoadCar(cid: AnyLink, local: DataStore, remote?: DataStore, publicFiles?: boolean): Promise<CarReader> {\n const cidsString = cid.toString();\n if (!this.carReaders.has(cidsString)) {\n this.carReaders.set(\n cidsString,\n (async () => {\n let loadedCar: AnyBlock | undefined = undefined;\n try {\n //loadedCar now is an array of AnyBlocks\n this.logger.Debug().Str(\"cid\", cidsString).Msg(\"loading car\");\n loadedCar = await local.load(cid);\n this.logger.Debug().Bool(\"loadedCar\", loadedCar).Msg(\"loaded\");\n } catch (e) {\n if (remote) {\n const remoteCar = await remote.load(cid);\n if (remoteCar) {\n // todo test for this\n this.logger.Debug().Ref(\"cid\", remoteCar.cid).Msg(\"saving remote car locally\");\n await local.save(remoteCar);\n loadedCar = remoteCar;\n }\n } else {\n this.logger.Error().Str(\"cid\", cidsString).Err(e).Msg(\"loading car\");\n }\n }\n if (!loadedCar) {\n throw this.logger.Error().Url(local.url).Str(\"cid\", cidsString).Msg(\"missing car files\").AsError();\n }\n //This needs a fix as well as the fromBytes function expects a Uint8Array\n //Either we can merge the bytes or return an array of rawReaders\n const rawReader = await CarReader.fromBytes(loadedCar.bytes);\n const readerP = publicFiles ? Promise.resolve(rawReader) : this.ensureDecryptedReader(rawReader);\n\n const cachedReaderP = readerP.then(async (reader) => {\n await this.cacheCarReader(cidsString, reader).catch(() => {\n return;\n });\n return reader;\n });\n this.carReaders.set(cidsString, cachedReaderP);\n return readerP;\n })().catch((e) => {\n this.carReaders.delete(cidsString);\n throw e;\n }),\n );\n }\n return this.carReaders.get(cidsString) as Promise<CarReader>;\n }\n\n protected async ensureDecryptedReader(reader: CarReader): Promise<CarReader> {\n const theKey = await this._getKey();\n if (this.ebOpts.public || !(theKey && this.ebOpts.crypto)) {\n return reader;\n }\n const { blocks, root } = await decodeEncryptedCar(this.logger, this.ebOpts.crypto, theKey, reader);\n return {\n getRoots: () => [root],\n get: blocks.get.bind(blocks),\n blocks: blocks.entries.bind(blocks),\n } as unknown as CarReader;\n }\n\n protected async setKey(key: string) {\n if (this.key && this.key !== key)\n throw this.logger.Error().Str(\"this.key\", this.key).Str(\"key\", key).Msg(\"setting key\").AsError();\n this.key = key;\n const encoder = new TextEncoder();\n const data = encoder.encode(key);\n const hashBuffer = await this.ebOpts.crypto.digestSHA256(data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n this.keyId = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n protected async getMoreReaders(cids: AnyLink[]) {\n const limit = pLimit(5);\n const missing = cids.filter((cid) => !this.carReaders.has(cid.toString()));\n await Promise.all(missing.map((cid) => limit(() => this.loadCar(cid))));\n }\n}\n","import type { CID, Link, Version } from \"multiformats\";\nimport { DataStore, MetaStore, RemoteWAL } from \"./store.js\";\nimport type { Loadable } from \"./loader.js\";\nimport { DocFileMeta, Falsy } from \"../types.js\";\nimport { CarTransaction } from \"./transaction.js\";\n\nexport type AnyLink = Link<unknown, number, number, Version>;\nexport type CarGroup = AnyLink[];\nexport type CarLog = CarGroup[];\nexport type AnyAnyLink = Link<unknown, number, number, Version>;\n\nexport type AnyLinkFn = (cid: AnyLink) => Promise<AnyBlock | undefined>;\n\nexport interface AnyBlock {\n readonly cid: Link<unknown, number, number, Version>;\n readonly bytes: Uint8Array;\n}\n\nexport interface CIDBlock {\n readonly cid: CID<unknown, number, number, Version>;\n readonly bytes: Uint8Array;\n}\n\nexport function toCIDBlock(block: AnyBlock): CIDBlock {\n return block as CIDBlock;\n}\nexport interface AnyAnyBlock {\n readonly cid: AnyAnyLink;\n readonly bytes: Uint8Array;\n}\n\nexport interface EncryptOpts {\n readonly key: ArrayBuffer;\n readonly cid: AnyLink;\n readonly bytes: Uint8Array;\n}\n\nexport interface DecryptOptsValue {\n readonly bytes: Uint8Array;\n readonly iv: Uint8Array;\n}\n\nexport interface DecryptOpts {\n readonly key: ArrayBuffer;\n readonly value: DecryptOptsValue;\n}\n\nexport interface AnyDecodedBlock {\n readonly cid: AnyLink;\n readonly bytes: Uint8Array;\n readonly value: DecryptOptsValue;\n}\n\nexport interface CarMakeable {\n entries(): Iterable<AnyBlock>;\n get(cid: AnyLink): Promise<AnyBlock | undefined>;\n}\n\nexport interface CarHeader<T> {\n readonly cars: CarLog;\n readonly compact: CarLog;\n readonly meta: T;\n}\n\n// type NestedData =\n// | Uint8Array\n// | string\n// | number\n// | boolean\n// | undefined\n// | null\n// | AnyLink\n// | NestedData[]\n// | { [key: string]: NestedData };\n\nexport interface TransactionWrapper<M extends TransactionMeta> {\n meta: M;\n cars?: CarGroup;\n t: CarTransaction;\n}\n\nexport type TransactionMeta = unknown;\n//CRDTMeta | IndexTransactionMeta | FileTransactionMeta;\n\n// export interface MakeCodecCrypto {\n// subtle: {\n// decrypt: (algo: { name: string; iv: Uint8Array; tagLength: number }, key: CryptoKey, data: Uint8Array) => Promise<ArrayBuffer>;\n// encrypt: (algo: { name: string; iv: Uint8Array; tagLength: number }, key: CryptoKey, data: Uint8Array) => Promise<ArrayBuffer>;\n// };\n// }\n\nexport interface FPJsonWebKey {\n alg?: string;\n crv?: string;\n d?: string;\n dp?: string;\n dq?: string;\n e?: string;\n ext?: boolean;\n k?: string;\n key_ops?: string[];\n kty?: string;\n n?: string;\n oth?: RsaOtherPrimesInfo[];\n p?: string;\n q?: string;\n qi?: string;\n use?: string;\n x?: string;\n y?: string;\n}\n\nexport type FPKeyFormat = \"jwk\" | \"pkcs8\" | \"raw\" | \"spki\";\nexport type FPKeyUsage = \"decrypt\" | \"deriveBits\" | \"deriveKey\" | \"encrypt\" | \"sign\" | \"unwrapKey\" | \"verify\" | \"wrapKey\";\n\nexport interface FPAlgorithm {\n name: string;\n}\nexport type FPAlgorithmIdentifier = FPAlgorithm | string;\n\nexport interface FPRsaHashedImportParams extends FPAlgorithm {\n hash: FPAlgorithmIdentifier;\n}\n\nexport type FPNamedCurve = string;\nexport interface FPEcKeyImportParams extends FPAlgorithm {\n namedCurve: FPNamedCurve;\n}\n\nexport interface FPHmacImportParams extends FPAlgorithm {\n hash: FPAlgorithmIdentifier;\n length?: number;\n}\n\nexport interface FPAesKeyAlgorithm extends FPAlgorithm {\n length: number;\n}\n\nexport type FPKeyType = \"private\" | \"public\" | \"secret\";\n\nexport interface FPCryptoKey {\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm) */\n readonly algorithm: FPAlgorithm;\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable) */\n readonly extractable: boolean;\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type) */\n readonly type: FPKeyType;\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages) */\n readonly usages: FPKeyUsage[];\n}\n\ninterface FPArrayBufferTypes {\n ArrayBuffer: ArrayBuffer;\n}\ntype FPArrayBufferLike = FPArrayBufferTypes[keyof FPArrayBufferTypes];\n\nexport interface FPArrayBufferView {\n /**\n * The ArrayBuffer instance referenced by the array.\n */\n buffer: FPArrayBufferLike;\n\n /**\n * The length in bytes of the array.\n */\n byteLength: number;\n\n /**\n * The offset in bytes of the array.\n */\n byteOffset: number;\n}\n\nexport type FPBufferSource = FPArrayBufferView | ArrayBuffer;\nexport interface CryptoOpts {\n importKey(\n format: FPKeyFormat,\n keyData: FPJsonWebKey | FPBufferSource,\n algorithm: FPAlgorithmIdentifier | FPRsaHashedImportParams | FPEcKeyImportParams | FPHmacImportParams | FPAesKeyAlgorithm,\n extractable: boolean,\n keyUsages: FPKeyUsage[],\n ): Promise<FPCryptoKey>;\n\n //(format: \"raw\", key: ArrayBuffer, algo: string, extractable: boolean, usages: string[]) => Promise<CryptoKey>;\n readonly decrypt: (\n algo: { name: string; iv: Uint8Array; tagLength: number },\n key: FPCryptoKey,\n data: Uint8Array,\n ) => Promise<ArrayBuffer>;\n readonly encrypt: (\n algo: { name: string; iv: Uint8Array; tagLength: number },\n key: FPCryptoKey,\n data: Uint8Array,\n ) => Promise<ArrayBuffer>;\n readonly digestSHA256: (data: Uint8Array) => Promise<ArrayBuffer>;\n readonly randomBytes: (size: number) => Uint8Array;\n}\n\nexport interface BlobLike {\n /**\n * Returns a ReadableStream which yields the Blob data.\n */\n stream: () => ReadableStream;\n}\n\nexport interface StoreFactory {\n makeMetaStore?: (loader: Loadable) => Promise<MetaStore>;\n makeDataStore?: (loader: Loadable) => Promise<DataStore>;\n makeRemoteWAL?: (loader: Loadable) => Promise<RemoteWAL>;\n\n encodeFile?: (blob: BlobLike) => Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n decodeFile?: (blocks: unknown, cid: AnyLink, meta: DocFileMeta) => Promise<File>;\n}\n\nexport interface StoreOpts extends StoreFactory {\n readonly isIndex?: string; // index prefix\n readonly stores?: {\n // string means local storage\n // URL means schema selects the storeType\n readonly base?: string | URL;\n\n readonly meta?: string | URL;\n readonly data?: string | URL;\n readonly index?: string | URL;\n readonly remoteWAL?: string | URL;\n };\n}\n\nexport interface TestStore {\n // readonly url: URL;\n get(url: URL, key: string): Promise<Uint8Array>;\n // delete the underlying store and all its data\n // delete(): Promise<void>;\n}\n\nexport interface StoreRuntime {\n // the factories should produce ready-to-use stores\n // which means they have to call start() on the store\n // to fullfill lifecycle requirements\n // to release resources, like one database connection\n // for all stores a refcount on close() should be used\n makeMetaStore(loader: Loadable): Promise<MetaStore>;\n makeDataStore(loader: Loadable): Promise<DataStore>;\n makeRemoteWAL(loader: Loadable): Promise<RemoteWAL>;\n encodeFile(blob: BlobLike): Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<File>;\n}\n\nexport interface CommitOpts {\n readonly noLoader?: boolean;\n readonly compact?: boolean;\n readonly public?: boolean;\n}\n\nexport interface DbMeta {\n readonly cars: CarGroup;\n key?: string;\n}\n\nexport interface UploadMetaFnParams {\n readonly name: string;\n readonly branch: string;\n}\n\nexport type FnParamTypes = \"data\" | \"file\";\n\nexport interface UploadDataFnParams {\n readonly type: FnParamTypes;\n readonly name: string;\n readonly car: string;\n readonly size: string;\n}\n\nexport interface DownloadDataFnParams {\n readonly type: FnParamTypes;\n readonly name: string;\n readonly car: string;\n}\n\nexport interface DownloadMetaFnParams {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface Connection {\n readonly loader?: Loadable;\n readonly loaded: Promise<void>;\n connectMeta({ loader }: { loader?: Loadable }): void;\n connectStorage({ loader }: { loader?: Loadable }): void;\n\n metaUpload(bytes: Uint8Array, params: UploadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n dataUpload(bytes: Uint8Array, params: UploadDataFnParams, opts?: { public?: boolean }): Promise<void>;\n metaDownload(params: DownloadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n dataDownload(params: DownloadDataFnParams): Promise<Uint8Array | Falsy>;\n}\n","import { CID } from \"multiformats\";\nimport { Block, encode, decode } from \"multiformats/block\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as raw from \"multiformats/codecs/raw\";\nimport * as CBW from \"@ipld/car/buffer-writer\";\nimport * as codec from \"@ipld/dag-cbor\";\nimport { CarReader } from \"@ipld/car\";\nimport type { Logger } from \"@adviser/cement\";\n\nimport { AnyBlock, AnyLink, CarHeader, CarMakeable } from \"./types.js\";\n\nexport async function encodeCarFile(roots: AnyLink[], t: CarMakeable): Promise<AnyBlock> {\n let size = 0;\n const headerSize = CBW.headerLength({ roots } as { roots: CID<unknown, number, number, 1>[] });\n size += headerSize;\n for (const { cid, bytes } of t.entries()) {\n size += CBW.blockLength({ cid, bytes } as Block<unknown, number, number, 1>);\n }\n const buffer = new Uint8Array(size);\n const writer = CBW.createWriter(buffer, { headerSize });\n\n for (const r of roots) {\n writer.addRoot(r as CID<unknown, number, number, 1>);\n }\n\n for (const { cid, bytes } of t.entries()) {\n writer.write({ cid, bytes } as Block<unknown, number, number, 1>);\n }\n writer.close();\n return await encode({ value: writer.bytes, hasher, codec: raw });\n}\n\nexport async function encodeCarHeader<T>(fp: CarHeader<T>) {\n return (await encode({\n value: { fp },\n hasher,\n codec,\n })) as AnyBlock;\n}\n\nexport async function parseCarFile<T>(reader: CarReader, logger: Logger): Promise<CarHeader<T>> {\n const roots = await reader.getRoots();\n const header = await reader.get(roots[0]);\n if (!header) throw logger.Error().Msg(\"missing header block\").AsError();\n const { value } = await decode({ bytes: header.bytes, hasher, codec });\n const fpvalue = value as { readonly fp: CarHeader<T> };\n // @jchris where is the fp attribute coming from?\n if (fpvalue && !fpvalue.fp) {\n throw logger.Error().Msg(\"missing fp\").AsError();\n }\n return fpvalue.fp;\n}\n","import { sha256 } from \"multiformats/hashes/sha2\";\nimport { CID } from \"multiformats\";\nimport { encode, decode, create as mfCreate } from \"multiformats/block\";\nimport type { MultihashHasher, ToString } from \"multiformats\";\n\nimport type { CarReader } from \"@ipld/car\";\nimport * as dagcbor from \"@ipld/dag-cbor\";\n\nimport { MemoryBlockstore } from \"@web3-storage/pail/block\";\n\n// @ts-expect-error \"prolly-trees\" has no types\nimport { bf } from \"prolly-trees/utils\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { nocache as cache } from \"prolly-trees/cache\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { create, load } from \"prolly-trees/cid-set\";\n\nimport { encodeCarFile } from \"./loader-helpers.js\";\nimport { makeCodec } from \"./encrypt-codec.js\";\nimport type { AnyLinkFn, AnyBlock, CarMakeable, AnyLink, AnyDecodedBlock, CryptoOpts } from \"./types.js\";\nimport { Logger } from \"@adviser/cement\";\n\nfunction carLogIncludesGroup(list: AnyLink[], cidMatch: AnyLink) {\n return list.some((cid: AnyLink) => {\n return cid.toString() === cidMatch.toString();\n });\n}\n\nfunction makeEncDec(logger: Logger, crypto: CryptoOpts, randomBytes: (size: number) => Uint8Array) {\n const codec = makeCodec(logger, crypto, randomBytes);\n\n const encrypt = async function* ({\n get,\n cids,\n hasher,\n key,\n cache,\n chunker,\n root,\n }: {\n get: (cid: AnyLink) => Promise<AnyBlock | undefined>;\n key: ArrayBuffer;\n cids: AnyLink[];\n hasher: MultihashHasher<number>;\n chunker: (bytes: Uint8Array) => AsyncGenerator<Uint8Array>;\n cache: (cid: AnyLink) => Promise<AnyBlock>;\n root: AnyLink;\n }): AsyncGenerator<unknown, void, unknown> {\n const set = new Set<ToString<AnyLink>>();\n let eroot;\n if (!carLogIncludesGroup(cids, root)) cids.push(root);\n for (const cid of cids) {\n const unencrypted = await get(cid);\n if (!unencrypted) throw logger.Error().Ref(\"cid\", cid).Msg(\"missing cid block\").AsError();\n const encrypted = await codec.encrypt({ ...unencrypted, key });\n const block = await encode({ ...encrypted, codec, hasher });\n yield block;\n set.add(block.cid.toString());\n if (unencrypted.cid.equals(root)) eroot = block.cid;\n }\n if (!eroot) throw logger.Error().Msg(\"cids does not include root\").AsError();\n const list = [...set].map((s) => CID.parse(s));\n let last;\n for await (const node of create({ list, get, cache, chunker, hasher, codec: dagcbor })) {\n const block = (await node.block) as AnyBlock;\n yield block;\n last = block;\n }\n if (!last) throw logger.Error().Msg(\"missing last block\").AsError();\n const head = [eroot, last.cid];\n const block = await encode({ value: head, codec: dagcbor, hasher });\n yield block;\n };\n\n const decrypt = async function* ({\n root,\n get,\n key,\n cache,\n chunker,\n hasher,\n }: {\n root: AnyLink;\n get: (cid: AnyLink) => Promise<AnyBlock | undefined>;\n key: ArrayBuffer;\n cache: (cid: AnyLink) => Promise<AnyBlock>;\n chunker: (bytes: Uint8Array) => AsyncGenerator<Uint8Array>;\n hasher: MultihashHasher<number>;\n }): AsyncGenerator<AnyBlock, void, undefined> {\n const getWithDecode = async (cid: AnyLink) =>\n get(cid).then(async (block) => {\n if (!block) return;\n const decoded = await decode({ ...block, codec: dagcbor, hasher });\n return decoded;\n });\n const getWithDecrypt = async (cid: AnyLink) =>\n get(cid).then(async (block) => {\n if (!block) return;\n const decoded = await decode({ ...block, codec, hasher });\n return decoded;\n });\n const decodedRoot = await getWithDecode(root);\n if (!decodedRoot) throw logger.Error().Msg(\"missing root\").AsError();\n if (!decodedRoot.bytes) throw logger.Error().Msg(\"missing bytes\").AsError();\n const {\n value: [eroot, tree],\n } = decodedRoot as { value: [AnyLink, AnyLink] };\n const rootBlock = (await get(eroot)) as AnyDecodedBlock;\n if (!rootBlock) throw logger.Error().Msg(\"missing root block\").AsError();\n const cidset = await load({ cid: tree, get: getWithDecode, cache, chunker, codec, hasher });\n const { result: nodes } = (await cidset.getAllEntries()) as { result: { cid: CID }[] };\n const unwrap = async (eblock?: AnyDecodedBlock) => {\n if (!eblock) throw logger.Error().Msg(\"missing block\").AsError();\n if (!eblock.value) {\n eblock = await decode({ ...eblock, codec, hasher });\n if (!eblock.value) throw logger.Error().Msg(\"missing value\").AsError();\n }\n const { bytes, cid } = await codec.decrypt({ ...eblock, key }).catch((e) => {\n throw e;\n });\n const block = await mfCreate({ cid, bytes, hasher, codec });\n return block;\n };\n const promises = [];\n for (const { cid } of nodes) {\n if (!rootBlock.cid.equals(cid)) promises.push(getWithDecrypt(cid).then(unwrap));\n }\n yield* promises;\n yield unwrap(rootBlock);\n };\n return { encrypt, decrypt };\n}\nconst chunker = bf(30);\n\nfunction hexStringToUint8Array(hexString: string) {\n const length = hexString.length;\n const uint8Array = new Uint8Array(length / 2);\n for (let i = 0; i < length; i += 2) {\n uint8Array[i / 2] = parseInt(hexString.substring(i, i + 2), 16);\n }\n return uint8Array;\n}\n\nexport async function encryptedEncodeCarFile(\n logger: Logger,\n crypto: CryptoOpts,\n key: string,\n rootCid: AnyLink,\n t: CarMakeable,\n): Promise<AnyBlock> {\n const encryptionKey = hexStringToUint8Array(key);\n const encryptedBlocks = new MemoryBlockstore();\n const cidsToEncrypt = [] as AnyLink[];\n for (const { cid, bytes } of t.entries()) {\n cidsToEncrypt.push(cid);\n const g = await t.get(cid);\n if (!g) throw logger.Error().Ref(\"cid\", cid).Int(\"bytes\", bytes.length).Msg(\"missing cid block\").AsError();\n }\n let last: AnyBlock | null = null;\n const { encrypt } = makeEncDec(logger, crypto, crypto.randomBytes);\n\n for await (const block of encrypt({\n cids: cidsToEncrypt,\n get: t.get.bind(t),\n key: encryptionKey,\n hasher: sha256,\n chunker,\n cache,\n root: rootCid,\n }) as AsyncGenerator<AnyBlock, void, unknown>) {\n await encryptedBlocks.put(block.cid, block.bytes);\n last = block;\n }\n if (!last) throw logger.Error().Msg(\"no blocks encrypted\").AsError();\n const encryptedCar = await encodeCarFile([last.cid], encryptedBlocks);\n return encryptedCar;\n}\n\nexport async function decodeEncryptedCar(logger: Logger, crypto: CryptoOpts, key: string, reader: CarReader) {\n const roots = await reader.getRoots();\n const root = roots[0];\n return await decodeCarBlocks(logger, crypto, root, reader.get.bind(reader) as AnyLinkFn, key);\n}\nasync function decodeCarBlocks(\n logger: Logger,\n crypto: CryptoOpts,\n root: AnyLink,\n get: (cid: AnyLink) => Promise<AnyBlock | undefined>,\n keyMaterial: string,\n): Promise<{ blocks: MemoryBlockstore; root: AnyLink }> {\n const decryptionKeyUint8 = hexStringToUint8Array(keyMaterial);\n const decryptionKey = decryptionKeyUint8.buffer.slice(0, decryptionKeyUint8.byteLength);\n\n const decryptedBlocks = new MemoryBlockstore();\n let last: AnyBlock | null = null;\n\n const { decrypt } = makeEncDec(logger, crypto, crypto.randomBytes);\n\n for await (const block of decrypt({\n root,\n get,\n key: decryptionKey,\n hasher: sha256,\n chunker,\n cache,\n })) {\n await decryptedBlocks.put(block.cid, block.bytes);\n last = block;\n }\n if (!last) throw logger.Error().Msg(\"no blocks decrypted\").AsError();\n return { blocks: decryptedBlocks, root: last.cid };\n}\n","import { CID } from \"multiformats\";\nimport type { AnyLink, CryptoOpts, DecryptOpts, EncryptOpts } from \"./types.js\";\nimport { ensureLogger } from \"../utils.js\";\nimport { Logger } from \"@adviser/cement\";\n\nexport function makeCodec(ilogger: Logger, crypto: CryptoOpts, randomBytes: (size: number) => Uint8Array) {\n const logger = ensureLogger(ilogger, \"makeCodec\");\n const enc32 = (value: number) => {\n value = +value;\n const buff = new Uint8Array(4);\n buff[3] = value >>> 24;\n buff[2] = value >>> 16;\n buff[1] = value >>> 8;\n buff[0] = value & 0xff;\n return buff;\n };\n\n const readUInt32LE = (buffer: Uint8Array) => {\n const offset = buffer.byteLength - 4;\n return (buffer[offset] | (buffer[offset + 1] << 8) | (buffer[offset + 2] << 16)) + buffer[offset + 3] * 0x1000000;\n };\n\n const concat = (buffers: (ArrayBuffer | Uint8Array)[]) => {\n const uint8Arrays = buffers.map((b) => (b instanceof ArrayBuffer ? new Uint8Array(b) : b));\n const totalLength = uint8Arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n\n let offset = 0;\n for (const arr of uint8Arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n\n return result;\n };\n\n const encode = ({ iv, bytes }: { iv: Uint8Array; bytes: Uint8Array }) => concat([iv, bytes]);\n const decode = (bytes: Uint8Array) => {\n const iv = bytes.subarray(0, 12);\n bytes = bytes.slice(12);\n return { iv, bytes };\n };\n\n const code = 0x300000 + 1337;\n\n async function subtleKey(key: ArrayBuffer) {\n return await crypto.importKey(\n \"raw\", // raw or jwk\n key, // raw data\n \"AES-GCM\",\n false, // extractable\n [\"encrypt\", \"decrypt\"],\n );\n }\n\n const decrypt = async ({ key, value }: DecryptOpts): Promise<{ cid: AnyLink; bytes: Uint8Array }> => {\n const { bytes: inBytes, iv } = value;\n const cryKey = await subtleKey(key);\n const deBytes = await crypto.decrypt(\n {\n name: \"AES-GCM\",\n iv,\n tagLength: 128,\n },\n cryKey,\n inBytes,\n );\n const bytes = new Uint8Array(deBytes);\n const len = readUInt32LE(bytes.subarray(0, 4));\n const cid = CID.decode(bytes.subarray(4, 4 + len));\n return { cid, bytes: bytes.subarray(4 + len) };\n };\n const encrypt = async ({ key, cid, bytes }: EncryptOpts) => {\n const len = enc32(cid.bytes.byteLength);\n const iv = randomBytes(12);\n const msg = concat([len, cid.bytes, bytes]);\n try {\n const cryKey = await subtleKey(key);\n const deBytes = await crypto.encrypt(\n {\n name: \"AES-GCM\",\n iv,\n tagLength: 128,\n },\n cryKey,\n msg,\n );\n bytes = new Uint8Array(deBytes);\n } catch (e) {\n throw logger.Error().Err(e).Msg(\"encrypt failed\").AsError();\n }\n return { value: { bytes, iv } };\n };\n\n const cryptoFn = (key: Uint8Array) => {\n return { encrypt: (opts: EncryptOpts) => encrypt({ ...opts, key }), decrypt: (opts: DecryptOpts) => decrypt({ ...opts, key }) };\n };\n\n const name = \"jchris@encrypted-block:aes-gcm\";\n\n return { encode, decode, code, name, encrypt, decrypt, crypto: cryptoFn };\n}\n","import { MemoryBlockstore } from \"@web3-storage/pail/block\";\nimport { BlockFetcher as BlockFetcherApi } from \"@web3-storage/pail/api\";\n\nimport {\n AnyAnyLink,\n AnyBlock,\n AnyLink,\n CarMakeable,\n DbMeta,\n StoreRuntime,\n StoreOpts,\n TransactionMeta,\n TransactionWrapper,\n} from \"./types.js\";\n\nimport { Loader } from \"./loader.js\";\nimport type { CID, Block, Version } from \"multiformats\";\nimport { CryptoOpts } from \"./types.js\";\nimport { falsyToUndef } from \"../types.js\";\nimport { toCryptoOpts } from \"../runtime/crypto.js\";\nimport { toStoreRuntime } from \"./store-factory.js\";\nimport { Logger } from \"@adviser/cement\";\nimport { ensureLogger } from \"../utils.js\";\n\nexport type BlockFetcher = BlockFetcherApi;\n\nexport class CarTransaction extends MemoryBlockstore implements CarMakeable {\n readonly parent: BaseBlockstore;\n constructor(parent: BaseBlockstore, opts = { add: true }) {\n super();\n if (opts.add) {\n parent.transactions.add(this);\n }\n this.parent = parent;\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined> {\n return ((await this.superGet(cid)) || falsyToUndef(await this.parent.get(cid))) as Block<T, C, A, V>;\n }\n\n async superGet(cid: AnyLink): Promise<AnyBlock | undefined> {\n return super.get(cid);\n }\n}\n\nexport function defaultedBlockstoreRuntime(\n opts: BlockstoreOpts,\n component: string,\n ctx?: Record<string, unknown>,\n): BlockstoreRuntime {\n const logger = ensureLogger(opts, component, ctx);\n const store = opts.store || {};\n return {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n applyMeta: (meta: TransactionMeta, snap?: boolean): Promise<void> => {\n return Promise.resolve();\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n compact: async (blocks: CompactionFetcher) => {\n return {} as unknown as TransactionMeta;\n },\n autoCompact: 100,\n public: false,\n name: undefined,\n threshold: 1000 * 1000,\n ...opts,\n logger,\n crypto: toCryptoOpts(opts.crypto),\n store,\n storeRuntime: toStoreRuntime(store, logger),\n };\n}\n\nconst blockstoreFactory = function (opts: BlockstoreOpts): BaseBlockstore | EncryptedBlockstore {\n if (opts.name) {\n return new EncryptedBlockstore(opts);\n } else {\n return new BaseBlockstore(opts);\n }\n};\n\nexport { blockstoreFactory };\n\nexport class BaseBlockstore implements BlockFetcher {\n readonly transactions = new Set<CarTransaction>();\n readonly ebOpts: BlockstoreRuntime;\n\n readonly loader?: Loader;\n readonly name?: string;\n\n // ready: Promise<void>;\n ready(): Promise<void> {\n return Promise.resolve();\n }\n\n async close(): Promise<void> {\n // no-op\n }\n\n async destroy(): Promise<void> {\n // no-op\n }\n\n readonly logger: Logger;\n constructor(ebOpts: BlockstoreOpts = {}) {\n // console.log(\"BaseBlockstore\", ebOpts)\n this.ebOpts = defaultedBlockstoreRuntime(ebOpts, \"BaseBlockstore\");\n this.logger = this.ebOpts.logger;\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyAnyLink): Promise<Block<T, C, A, V> | undefined> {\n if (!cid) throw this.logger.Error().Msg(\"required cid\").AsError();\n for (const f of this.transactions) {\n // if (Math.random() < 0.001) console.log('get', cid.toString(), this.transactions.size)\n const v = await f.superGet(cid);\n if (v) return v as Block<T, C, A, V>;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async put(cid: AnyAnyLink, block: Uint8Array): Promise<void> {\n throw this.logger.Error().Msg(\"use a transaction to put\").AsError();\n }\n\n lastTxMeta?: unknown; // TransactionMeta\n\n async transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _opts = {},\n ): Promise<TransactionWrapper<M>> {\n const t = new CarTransaction(this);\n const done: M = await fn(t);\n this.lastTxMeta = done;\n return { t, meta: done };\n }\n\n async *entries(): AsyncIterableIterator<AnyBlock> {\n const seen = new Set<string>();\n for (const t of this.transactions) {\n for await (const blk of t.entries()) {\n if (seen.has(blk.cid.toString())) continue;\n seen.add(blk.cid.toString());\n yield blk;\n }\n }\n }\n}\n\nexport class EncryptedBlockstore extends BaseBlockstore {\n readonly name: string;\n readonly loader: Loader;\n\n ready(): Promise<void> {\n return this.loader.ready();\n }\n\n close(): Promise<void> {\n return this.loader.close();\n }\n\n destroy(): Promise<void> {\n return this.loader.destroy();\n }\n\n compacting = false;\n readonly logger: Logger;\n\n constructor(ebOpts: BlockstoreOpts) {\n super(ebOpts);\n this.logger = ensureLogger(ebOpts, \"EncryptedBlockstore\");\n const { name } = ebOpts;\n if (!name) {\n throw this.logger.Error().Msg(\"name required\").AsError();\n }\n this.name = name;\n this.loader = new Loader(this.name, ebOpts);\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyAnyLink): Promise<Block<T, C, A, V> | undefined> {\n const got = await super.get(cid);\n if (got) return got as Block<T, C, A, V>;\n if (!this.loader) {\n return;\n }\n return falsyToUndef(await this.loader.getBlock(cid)) as Block<T, C, A, V>;\n }\n\n async transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n opts = { noLoader: false },\n ): Promise<TransactionWrapper<M>> {\n const { t, meta: done } = await super.transaction<M>(fn);\n const cars = await this.loader.commit<M>(t, done, opts);\n if (this.ebOpts.autoCompact && this.loader.carLog.length > this.ebOpts.autoCompact) {\n setTimeout(() => void this.compact(), 10);\n }\n if (cars) {\n this.transactions.delete(t);\n return { meta: done, cars, t };\n }\n throw this.logger.Error().Msg(\"failed to commit car files\").AsError();\n }\n\n async getFile(car: AnyLink, cid: AnyLink, isPublic = false): Promise<Uint8Array> {\n await this.ready();\n if (!this.loader) throw this.logger.Error().Msg(\"loader required to get file, database must be named\").AsError();\n const reader = await this.loader.loadFileCar(car, isPublic);\n const block = await reader.get(cid as CID);\n if (!block) throw this.logger.Error().Str(\"cid\", cid.toString()).Msg(`Missing block`).AsError();\n return block.bytes;\n }\n\n async compact() {\n await this.ready();\n if (!this.loader) throw this.logger.Error().Msg(\"loader required to compact\").AsError();\n if (this.loader.carLog.length < 2) return;\n const compactFn = this.ebOpts.compact || ((blocks: CompactionFetcher) => this.defaultCompact(blocks, this.logger));\n if (!compactFn || this.compacting) return;\n const blockLog = new CompactionFetcher(this);\n this.compacting = true;\n const meta = await compactFn(blockLog);\n await this.loader?.commit(blockLog.loggedBlocks, meta, {\n compact: true,\n noLoader: true,\n });\n this.compacting = false;\n }\n\n async defaultCompact(blocks: CompactionFetcher, logger: Logger): Promise<TransactionMeta> {\n // console.log('eb compact')\n if (!this.loader) {\n throw logger.Error().Msg(\"no loader\").AsError();\n }\n if (!this.lastTxMeta) {\n throw logger.Error().Msg(\"no lastTxMeta\").AsError();\n }\n for await (const blk of this.loader.entries(false)) {\n blocks.loggedBlocks.putSync(blk.cid, blk.bytes);\n }\n for (const t of this.transactions) {\n for await (const blk of t.entries()) {\n blocks.loggedBlocks.putSync(blk.cid, blk.bytes);\n }\n }\n return this.lastTxMeta as TransactionMeta;\n }\n\n async *entries(): AsyncIterableIterator<AnyBlock> {\n // const seen = new Set<string>();\n for await (const blk of this.loader.entries()) {\n // if (seen.has(blk.cid.toString())) continue\n // seen.add(blk.cid.toString())\n yield blk;\n }\n }\n}\n\nexport class CompactionFetcher implements BlockFetcher {\n blockstore: EncryptedBlockstore;\n // loader: Loader | null = null\n loggedBlocks: CarTransaction;\n\n constructor(blocks: EncryptedBlockstore) {\n this.blockstore = blocks;\n // this.loader = blocks.loader\n this.loggedBlocks = new CarTransaction(blocks);\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined> {\n const block = await this.blockstore.get(cid);\n if (block) this.loggedBlocks.putSync(cid, block.bytes);\n return falsyToUndef(block) as Block<T, C, A, V>;\n }\n}\n\nexport type CompactFn = (blocks: CompactionFetcher) => Promise<TransactionMeta>;\n\nexport interface BlockstoreOpts {\n readonly logger?: Logger;\n readonly applyMeta?: (meta: TransactionMeta, snap?: boolean) => Promise<void>;\n readonly compact?: CompactFn;\n readonly autoCompact?: number;\n readonly crypto?: CryptoOpts;\n readonly store?: StoreOpts;\n readonly public?: boolean;\n readonly meta?: DbMeta;\n readonly name?: string;\n readonly threshold?: number;\n}\n\nexport interface BlockstoreRuntime {\n readonly logger: Logger;\n readonly applyMeta: (meta: TransactionMeta, snap?: boolean) => Promise<void>;\n readonly compact: CompactFn;\n readonly autoCompact: number;\n readonly crypto: CryptoOpts;\n readonly store: StoreOpts;\n readonly storeRuntime: StoreRuntime;\n readonly public: boolean;\n readonly meta?: DbMeta;\n readonly name?: string;\n readonly threshold: number;\n}\n","type QueueFunction = () => Promise<void>;\n\nexport class CommitQueue<T = void> {\n readonly queue: QueueFunction[] = [];\n processing = false;\n\n async enqueue(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const queueFn = async () => {\n try {\n resolve(await fn());\n } catch (e) {\n reject(e);\n } finally {\n this.processing = false;\n this.processNext();\n }\n };\n this.queue.push(queueFn);\n if (!this.processing) {\n this.processNext();\n }\n });\n }\n\n processNext() {\n if (this.queue.length > 0 && !this.processing) {\n this.processing = true;\n const queueFn = this.queue.shift();\n if (queueFn) {\n queueFn();\n }\n }\n }\n}\n","import type { Block, Link } from \"multiformats\";\nimport { create } from \"multiformats/block\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as codec from \"@ipld/dag-cbor\";\n\n// @ts-expect-error \"charwise\" has no types\nimport charwise from \"charwise\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport * as DbIndex from \"prolly-trees/db-index\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { bf, simpleCompare } from \"prolly-trees/utils\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { nocache as cache } from \"prolly-trees/cache\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { ProllyNode as BaseNode } from \"prolly-trees/db-index\";\n\nimport {\n DocUpdate,\n MapFn,\n DocFragment,\n IndexUpdate,\n QueryOpts,\n IndexRow,\n DocWithId,\n IndexKeyType,\n IndexKey,\n DocTypes,\n DocObject,\n IndexUpdateString,\n} from \"./types.js\";\nimport { CarTransaction, BlockFetcher, AnyLink, AnyBlock } from \"./blockstore/index.js\";\nimport { CRDT } from \"./crdt.js\";\n\nexport class IndexTree<K extends IndexKeyType, R extends DocFragment> {\n cid?: AnyLink;\n root?: ProllyNode<K, R>;\n}\n\ntype CompareRef = string | number;\nexport type CompareKey = [string | number, CompareRef];\n\nfunction refCompare(aRef: CompareRef, bRef: CompareRef) {\n if (Number.isNaN(aRef)) return -1;\n if (Number.isNaN(bRef)) throw new Error(\"ref may not be Infinity or NaN\");\n if (aRef === Infinity) return 1;\n // if (!Number.isFinite(bRef)) throw new Error('ref may not be Infinity or NaN')\n\n return simpleCompare(aRef, bRef) as number;\n}\n\nfunction compare(a: CompareKey, b: CompareKey) {\n const [aKey, aRef] = a;\n const [bKey, bRef] = b;\n\n const comp: number = simpleCompare(aKey, bKey);\n if (comp !== 0) return comp;\n return refCompare(aRef, bRef);\n}\n\nexport const byKeyOpts: StaticProllyOptions<CompareKey> = { cache, chunker: bf(30), codec, hasher, compare };\n\nexport const byIdOpts: StaticProllyOptions<unknown> = { cache, chunker: bf(30), codec, hasher, compare: simpleCompare };\n\nexport interface IndexDoc<K extends IndexKeyType> {\n readonly key: IndexKey<K>;\n readonly value: DocFragment;\n}\n\nexport interface IndexDocString {\n readonly key: string;\n readonly value: DocFragment;\n}\n\nexport function indexEntriesForChanges<T extends DocTypes, K extends IndexKeyType>(\n changes: DocUpdate<T>[],\n mapFn: MapFn<T>,\n): IndexDoc<K>[] {\n const indexEntries: IndexDoc<K>[] = [];\n changes.forEach(({ id: key, value, del }) => {\n if (del || !value) return;\n let mapCalled = false;\n const mapReturn = mapFn({ ...(value as DocWithId<T>), _id: key }, (k: IndexKeyType, v?: DocFragment) => {\n mapCalled = true;\n if (typeof k === \"undefined\") return;\n indexEntries.push({\n key: [charwise.encode(k) as K, key],\n value: v || null,\n });\n });\n if (!mapCalled && mapReturn) {\n indexEntries.push({\n key: [charwise.encode(mapReturn) as K, key],\n value: null,\n });\n }\n });\n return indexEntries;\n}\n\nfunction makeProllyGetBlock(blocks: BlockFetcher): (address: AnyLink) => Promise<AnyBlock> {\n return async (address: AnyLink) => {\n const block = await blocks.get(address);\n if (!block) throw new Error(`Missing block ${address.toString()}`);\n const { cid, bytes } = block;\n return create({ cid, bytes, hasher, codec }) as Promise<AnyBlock>;\n };\n}\n\nexport async function bulkIndex<K extends IndexKeyType, T extends DocFragment, CT>(\n tblocks: CarTransaction,\n inIndex: IndexTree<K, T>,\n indexEntries: (IndexUpdate<K> | IndexUpdateString)[],\n opts: StaticProllyOptions<CT>,\n): Promise<IndexTree<K, T>> {\n if (!indexEntries.length) return inIndex;\n if (!inIndex.root) {\n if (!inIndex.cid) {\n let returnRootBlock: Block | undefined = undefined;\n let returnNode: ProllyNode<K, T> | undefined = undefined;\n\n for await (const node of (await DbIndex.create({\n get: makeProllyGetBlock(tblocks),\n list: indexEntries,\n ...opts,\n })) as ProllyNode<K, T>[]) {\n const block = await node.block;\n await tblocks.put(block.cid, block.bytes);\n returnRootBlock = block;\n returnNode = node;\n }\n if (!returnNode || !returnRootBlock) throw new Error(\"failed to create index\");\n return { root: returnNode, cid: returnRootBlock.cid };\n } else {\n inIndex.root = (await DbIndex.load({ cid: inIndex.cid, get: makeProllyGetBlock(tblocks), ...opts })) as ProllyNode<K, T>;\n }\n }\n const { root, blocks: newBlocks } = await inIndex.root.bulk(indexEntries);\n if (root) {\n for await (const block of newBlocks) {\n await tblocks.put(block.cid, block.bytes);\n }\n return { root, cid: (await root.block).cid };\n } else {\n return { root: undefined, cid: undefined };\n }\n}\n\nexport async function loadIndex<K extends IndexKeyType, T extends DocFragment, CT>(\n tblocks: BlockFetcher,\n cid: AnyLink,\n opts: StaticProllyOptions<CT>,\n): Promise<ProllyNode<K, T>> {\n return (await DbIndex.load({ cid, get: makeProllyGetBlock(tblocks), ...opts })) as ProllyNode<K, T>;\n}\n\nexport async function applyQuery<K extends IndexKeyType, T extends DocObject, R extends DocFragment>(\n crdt: CRDT<T>,\n resp: { result: ProllyIndexRow<K, R>[] },\n query: QueryOpts<K>,\n): Promise<{\n rows: IndexRow<K, T, R>[];\n}> {\n if (query.descending) {\n resp.result = resp.result.reverse();\n }\n if (query.limit) {\n resp.result = resp.result.slice(0, query.limit);\n }\n if (query.includeDocs) {\n resp.result = await Promise.all(\n resp.result.map(async (row) => {\n const val = await crdt.get(row.id);\n const doc = val ? ({ ...val.doc, _id: row.id } as DocWithId<T>) : undefined;\n return { ...row, doc };\n }),\n );\n }\n return {\n rows: resp.result.map(({ key, ...row }) => {\n return {\n key: charwise.decode(key),\n ...row,\n };\n }),\n };\n}\n\nexport function encodeRange(range: [IndexKeyType, IndexKeyType]): [string, string] {\n return [charwise.encode(range[0]), charwise.encode(range[1])];\n}\n\nexport function encodeKey(key: DocFragment): string {\n return charwise.encode(key) as string;\n}\n\nexport interface ProllyIndexRow<K extends IndexKeyType, T extends DocFragment> {\n readonly id: string;\n readonly key: IndexKey<K>;\n readonly value: T;\n}\n\n// ProllyNode type based on the ProllyNode from 'prolly-trees/base'\ninterface ProllyNode<K extends IndexKeyType, T extends DocFragment> extends BaseNode {\n getAllEntries(): PromiseLike<{ [x: string]: unknown; result: ProllyIndexRow<K, T>[] }>;\n getMany<KI extends IndexKeyType>(removeIds: KI[]): Promise<{ /* [x: K]: unknown; */ result: IndexKey<K>[] }>;\n range(a: string, b: string): Promise<{ result: ProllyIndexRow<K, T>[] }>;\n get(key: string): Promise<{ result: ProllyIndexRow<K, T>[] }>;\n bulk(bulk: (IndexUpdate<K> | IndexUpdateString)[]): PromiseLike<{\n readonly root?: ProllyNode<K, T>;\n readonly blocks: Block[];\n }>;\n readonly address: Promise<Link>;\n readonly distance: number;\n compare: (a: unknown, b: unknown) => number;\n readonly cache: unknown;\n readonly block: Promise<Block>;\n}\n\ninterface StaticProllyOptions<T> {\n readonly cache: unknown;\n chunker: (entry: T, distance: number) => boolean;\n readonly codec: unknown;\n readonly hasher: unknown;\n compare: (a: T, b: T) => number;\n}\n","import {\n type ClockHead,\n type DocUpdate,\n type MapFn,\n type IndexUpdate,\n type QueryOpts,\n type IdxMeta,\n type DocFragment,\n type IdxMetaMap,\n type IndexKeyType,\n type IndexRows,\n type DocTypes,\n type IndexUpdateString,\n throwFalsy,\n IndexTransactionMeta,\n} from \"./types.js\";\nimport { BaseBlockstore } from \"./blockstore/index.js\";\n\nimport {\n bulkIndex,\n indexEntriesForChanges,\n byIdOpts,\n byKeyOpts,\n IndexTree,\n applyQuery,\n encodeRange,\n encodeKey,\n loadIndex,\n IndexDocString,\n CompareKey,\n} from \"./indexer-helpers.js\";\nimport { CRDT } from \"./crdt.js\";\nimport { ensureLogger } from \"./utils.js\";\nimport { Logger } from \"@adviser/cement\";\n\nexport function index<K extends IndexKeyType = string, T extends DocTypes = NonNullable<unknown>, R extends DocFragment = T>(\n { _crdt }: { _crdt: CRDT<T> | CRDT<NonNullable<unknown>> },\n name: string,\n mapFn?: MapFn<T>,\n meta?: IdxMeta,\n): Index<K, T, R> {\n if (mapFn && meta) throw _crdt.logger.Error().Msg(\"cannot provide both mapFn and meta\").AsError();\n if (mapFn && mapFn.constructor.name !== \"Function\") throw _crdt.logger.Error().Msg(\"mapFn must be a function\").AsError();\n if (_crdt.indexers.has(name)) {\n const idx = _crdt.indexers.get(name) as unknown as Index<K, T>;\n idx.applyMapFn(name, mapFn, meta);\n } else {\n const idx = new Index<K, T>(_crdt, name, mapFn, meta);\n _crdt.indexers.set(name, idx as unknown as Index<K, NonNullable<unknown>, NonNullable<unknown>>);\n }\n return _crdt.indexers.get(name) as unknown as Index<K, T, R>;\n}\n\n// interface ByIdIndexIten<K extends IndexKeyType> {\n// readonly key: K;\n// readonly value: [K, K];\n// }\n\nexport class Index<K extends IndexKeyType, T extends DocTypes, R extends DocFragment = T> {\n readonly blockstore: BaseBlockstore;\n readonly crdt: CRDT<T>;\n name: string;\n mapFn?: MapFn<T>;\n mapFnString = \"\";\n byKey = new IndexTree<K, R>();\n byId = new IndexTree<K, R>();\n indexHead?: ClockHead;\n includeDocsDefault = false;\n initError?: Error;\n\n ready(): Promise<void> {\n return Promise.all([this.blockstore.ready(), this.crdt.ready()]).then(() => {\n /* noop */\n });\n }\n\n close(): Promise<void> {\n return Promise.all([this.blockstore.close(), this.crdt.close()]).then(() => {\n /* noop */\n });\n }\n destroy(): Promise<void> {\n return Promise.all([this.blockstore.destroy(), this.crdt.destroy()]).then(() => {\n /* noop */\n });\n }\n\n readonly logger: Logger;\n\n constructor(crdt: CRDT<T> | CRDT<NonNullable<unknown>>, name: string, mapFn?: MapFn<T>, meta?: IdxMeta) {\n this.logger = ensureLogger(crdt.logger, \"Index\");\n this.blockstore = crdt.indexBlockstore;\n this.crdt = crdt as CRDT<T>;\n this.applyMapFn(name, mapFn, meta);\n this.name = name;\n if (!(this.mapFnString || this.initError)) throw this.logger.Error().Msg(\"missing mapFnString\").AsError();\n // this.ready = this.blockstore.ready.then(() => {\n // return;\n // });\n // .then((header: IdxCarHeader) => {\n // // @ts-ignore\n // if (header.head) throw new Error('cannot have head in idx header')\n // if (header.indexes === undefined) throw new Error('missing indexes in idx header')\n // // for (const [name, idx] of Object.entries(header.indexes)) {\n // // index({ _crdt: crdt }, name, undefined, idx as IdxMeta)\n // // }\n // })\n }\n\n applyMapFn(name: string, mapFn?: MapFn<T>, meta?: IdxMeta) {\n if (mapFn && meta) throw this.logger.Error().Msg(\"cannot provide both mapFn and meta\").AsError();\n if (this.name && this.name !== name) throw this.logger.Error().Msg(\"cannot change name\").AsError();\n this.name = name;\n try {\n if (meta) {\n // hydrating from header\n if (this.indexHead && this.indexHead.map((c) => c.toString()).join() !== meta.head.map((c) => c.toString()).join()) {\n throw this.logger.Error().Msg(\"cannot apply different head meta\").AsError();\n }\n\n if (this.mapFnString) {\n // we already initialized from application code\n if (this.mapFnString !== meta.map) {\n this.logger\n .Warn()\n .Msg(`cannot apply different mapFn meta: old mapFnString ${this.mapFnString} new mapFnString ${meta.map}`);\n // throw new Error('cannot apply different mapFn meta')\n } else {\n this.byId.cid = meta.byId;\n this.byKey.cid = meta.byKey;\n this.indexHead = meta.head;\n }\n } else {\n // we are first\n this.mapFnString = meta.map;\n this.byId.cid = meta.byId;\n this.byKey.cid = meta.byKey;\n this.indexHead = meta.head;\n }\n } else {\n if (this.mapFn) {\n // we already initialized from application code\n if (mapFn) {\n if (this.mapFn.toString() !== mapFn.toString()) {\n throw this.logger.Error().Msg(\"cannot apply different mapFn app2\").AsError();\n }\n }\n } else {\n // application code is creating an index\n if (!mapFn) {\n mapFn = ((doc) => (doc as unknown as Record<string, unknown>)[name] ?? undefined) as MapFn<T>;\n }\n if (this.mapFnString) {\n // we already loaded from a header\n if (this.mapFnString !== mapFn.toString()) {\n throw this.logger.Error().Msg(\"cannot apply different mapFn app\").AsError();\n }\n } else {\n // we are first\n this.mapFnString = mapFn.toString();\n }\n this.mapFn = mapFn;\n }\n }\n const matches = /=>\\s*(.*)/.test(this.mapFnString);\n this.includeDocsDefault = matches;\n } catch (e) {\n this.initError = e as Error;\n }\n }\n\n async query(opts: QueryOpts<K> = {}): Promise<IndexRows<K, T, R>> {\n await this.ready();\n // this._resetIndex();\n await this._updateIndex();\n await this._hydrateIndex();\n if (!this.byKey.root) {\n return await applyQuery<K, T, R>(this.crdt, { result: [] }, opts);\n }\n if (this.includeDocsDefault && opts.includeDocs === undefined) opts.includeDocs = true;\n if (opts.range) {\n const eRange = encodeRange(opts.range);\n return await applyQuery<K, T, R>(this.crdt, await throwFalsy(this.byKey.root).range(eRange[0], eRange[1]), opts);\n }\n if (opts.key) {\n const encodedKey = encodeKey(opts.key);\n return await applyQuery<K, T, R>(this.crdt, await throwFalsy(this.byKey.root).get(encodedKey), opts);\n }\n if (Array.isArray(opts.keys)) {\n const results = await Promise.all(\n opts.keys.map(async (key: DocFragment) => {\n const encodedKey = encodeKey(key);\n return (await applyQuery<K, T, R>(this.crdt, await throwFalsy(this.byKey.root).get(encodedKey), opts)).rows;\n }),\n );\n return { rows: results.flat() };\n }\n if (opts.prefix) {\n if (!Array.isArray(opts.prefix)) opts.prefix = [opts.prefix];\n // prefix should be always an array\n const start = [...opts.prefix, NaN];\n const end = [...opts.prefix, Infinity];\n const encodedR = encodeRange([start, end]);\n return await applyQuery<K, T, R>(this.crdt, await this.byKey.root.range(...encodedR), opts);\n }\n const all = await this.byKey.root.getAllEntries(); // funky return type\n return await applyQuery<K, T, R>(\n this.crdt,\n {\n // @ts-expect-error getAllEntries returns a different type than range\n result: all.result.map(({ key: [k, id], value }) => ({\n key: k,\n id,\n value,\n })),\n },\n opts,\n );\n }\n\n _resetIndex() {\n this.byId = new IndexTree();\n this.byKey = new IndexTree();\n this.indexHead = undefined;\n }\n\n async _hydrateIndex() {\n if (this.byId.root && this.byKey.root) return;\n if (!this.byId.cid || !this.byKey.cid) return;\n this.byId.root = await loadIndex<K, R, K>(this.blockstore, this.byId.cid, byIdOpts);\n this.byKey.root = await loadIndex<K, R, CompareKey>(this.blockstore, this.byKey.cid, byKeyOpts);\n }\n\n async _updateIndex(): Promise<IndexTransactionMeta> {\n await this.ready();\n if (this.initError) throw this.initError;\n if (!this.mapFn) throw this.logger.Error().Msg(\"No map function defined\").AsError();\n let result: DocUpdate<T>[], head: ClockHead;\n if (!this.indexHead || this.indexHead.length === 0) {\n ({ result, head } = await this.crdt.allDocs());\n } else {\n ({ result, head } = await this.crdt.changes(this.indexHead));\n }\n if (result.length === 0) {\n this.indexHead = head;\n // return { byId: this.byId, byKey: this.byKey } as IndexTransactionMeta;\n }\n let staleKeyIndexEntries: IndexUpdate<K>[] = [];\n let removeIdIndexEntries: IndexUpdateString[] = [];\n if (this.byId.root) {\n const removeIds = result.map(({ id: key }) => key);\n const { result: oldChangeEntries } = await this.byId.root.getMany(removeIds);\n staleKeyIndexEntries = oldChangeEntries.map((key) => ({ key, del: true }));\n removeIdIndexEntries = oldChangeEntries.map((key) => ({ key: key[1], del: true }));\n }\n const indexEntries = indexEntriesForChanges<T, K>(result, this.mapFn); // use a getter to translate from string\n const byIdIndexEntries: IndexDocString[] = indexEntries.map(({ key }) => ({\n key: key[1],\n value: key,\n }));\n const indexerMeta: IdxMetaMap = { indexes: new Map() };\n\n for (const [name, indexer] of this.crdt.indexers) {\n if (indexer.indexHead) {\n indexerMeta.indexes?.set(name, {\n byId: indexer.byId.cid,\n byKey: indexer.byKey.cid,\n head: indexer.indexHead,\n map: indexer.mapFnString,\n name: indexer.name,\n } as IdxMeta);\n }\n }\n if (result.length === 0) {\n return indexerMeta as unknown as IndexTransactionMeta;\n }\n const { meta } = await this.blockstore.transaction<IndexTransactionMeta>(async (tblocks): Promise<IndexTransactionMeta> => {\n this.byId = await bulkIndex<K, R, K>(tblocks, this.byId, removeIdIndexEntries.concat(byIdIndexEntries), byIdOpts);\n this.byKey = await bulkIndex<K, R, CompareKey>(tblocks, this.byKey, staleKeyIndexEntries.concat(indexEntries), byKeyOpts);\n this.indexHead = head;\n if (this.byId.cid && this.byKey.cid) {\n const idxMeta = {\n byId: this.byId.cid,\n byKey: this.byKey.cid,\n head,\n map: this.mapFnString,\n name: this.name,\n } as IdxMeta;\n indexerMeta.indexes?.set(this.name, idxMeta);\n }\n return indexerMeta as unknown as IndexTransactionMeta;\n });\n return meta;\n }\n}\n","import { advance } from \"@web3-storage/pail/clock\";\nimport { root } from \"@web3-storage/pail/crdt\";\nimport { Logger, ResolveOnce } from \"@adviser/cement\";\n\nimport { clockChangesSince } from \"./crdt-helpers.js\";\nimport type { BaseBlockstore, CarTransaction } from \"./blockstore/index.js\";\nimport { type DocUpdate, type ClockHead, type DocTypes, throwFalsy, CRDTMeta } from \"./types.js\";\nimport { applyHeadQueue, ApplyHeadQueue } from \"./apply-head-queue.js\";\nimport { ensureLogger } from \"./utils.js\";\n\nexport class CRDTClock<T extends DocTypes> {\n // todo: track local and remote clocks independently, merge on read\n // that way we can drop the whole remote if we need to\n // should go with making sure the local clock only references locally available blockstore on write\n head: ClockHead = [];\n\n readonly zoomers = new Set<() => void>();\n readonly watchers = new Set<(updates: DocUpdate<T>[]) => void>();\n readonly emptyWatchers = new Set<() => void>();\n\n readonly blockstore: BaseBlockstore;\n\n readonly applyHeadQueue: ApplyHeadQueue<T>;\n\n readonly _ready = new ResolveOnce<void>();\n async ready() {\n return this._ready.once(async () => {\n await this.blockstore.ready();\n });\n }\n\n async close() {\n await this.blockstore.close();\n }\n\n readonly logger: Logger;\n constructor(blockstore: BaseBlockstore) {\n this.blockstore = blockstore;\n this.logger = ensureLogger(blockstore.logger, \"CRDTClock\");\n this.applyHeadQueue = applyHeadQueue(this.int_applyHead.bind(this), this.logger);\n }\n\n setHead(head: ClockHead) {\n this.head = head;\n }\n\n async applyHead(newHead: ClockHead, prevHead: ClockHead, updates?: DocUpdate<T>[]) {\n for await (const { updates: updatesAcc, all } of this.applyHeadQueue.push({\n newHead,\n prevHead,\n updates,\n })) {\n return this.processUpdates(updatesAcc, all, prevHead);\n }\n }\n\n async processUpdates(updatesAcc: DocUpdate<T>[], all: boolean, prevHead: ClockHead) {\n let internalUpdates = updatesAcc;\n if (this.watchers.size && !all) {\n const changes = await clockChangesSince<T>(throwFalsy(this.blockstore), this.head, prevHead, {}, this.logger);\n internalUpdates = changes.result;\n }\n this.zoomers.forEach((fn) => fn());\n this.notifyWatchers(internalUpdates || []);\n }\n\n notifyWatchers(updates: DocUpdate<T>[]) {\n this.emptyWatchers.forEach((fn) => fn());\n this.watchers.forEach((fn) => fn(updates || []));\n }\n\n onTick(fn: (updates: DocUpdate<T>[]) => void) {\n this.watchers.add(fn);\n }\n\n onTock(fn: () => void) {\n this.emptyWatchers.add(fn);\n }\n\n onZoom(fn: () => void) {\n this.zoomers.add(fn);\n }\n\n async int_applyHead(newHead: ClockHead, prevHead: ClockHead, localUpdates: boolean) {\n // if (!(this.head && prevHead && newHead)) {\n // throw new Error(\"missing head\");\n // }\n // console.log(\"int_applyHead\", this.applyHeadQueue.size(), this.head, newHead, prevHead, localUpdates);\n const ogHead = sortClockHead(this.head);\n newHead = sortClockHead(newHead);\n if (compareClockHeads(ogHead, newHead)) {\n return;\n }\n const ogPrev = sortClockHead(prevHead);\n if (compareClockHeads(ogHead, ogPrev)) {\n this.setHead(newHead);\n return;\n }\n\n const noLoader = !localUpdates;\n // const noLoader = this.head.length === 1 && !updates?.length\n if (!this.blockstore) {\n throw this.logger.Error().Msg(\"missing blockstore\").AsError();\n }\n await validateBlocks(this.logger, newHead, this.blockstore);\n const { meta } = await this.blockstore.transaction<CRDTMeta>(\n async (tblocks: CarTransaction) => {\n const advancedHead = await advanceBlocks(this.logger, newHead, tblocks, this.head);\n const result = await root(tblocks, advancedHead);\n for (const { cid, bytes } of [\n ...result.additions,\n // ...result.removals\n ]) {\n tblocks.putSync(cid, bytes);\n }\n return { head: advancedHead };\n },\n { noLoader },\n );\n this.setHead(meta.head);\n }\n}\n\n// Helper functions\nfunction sortClockHead(clockHead: ClockHead) {\n return clockHead.sort((a, b) => a.toString().localeCompare(b.toString()));\n}\n\nasync function validateBlocks(logger: Logger, newHead: ClockHead, blockstore?: BaseBlockstore) {\n if (!blockstore) throw logger.Error().Msg(\"missing blockstore\");\n newHead.map(async (cid) => {\n const got = await blockstore.get(cid);\n if (!got) {\n throw logger.Error().Str(\"cid\", cid.toString()).Msg(\"int_applyHead missing block\").AsError();\n }\n });\n}\n\nfunction compareClockHeads(head1: ClockHead, head2: ClockHead) {\n return head1.toString() === head2.toString();\n}\n\nasync function advanceBlocks(logger: Logger, newHead: ClockHead, tblocks: CarTransaction, head: ClockHead) {\n for (const cid of newHead) {\n try {\n head = await advance(tblocks, head, cid);\n } catch (e) {\n logger.Debug().Err(e).Msg(\"failed to advance head\");\n // console.log('failed to advance head:', cid.toString(), e)\n continue;\n }\n }\n return head;\n}\n","import { Logger } from \"@adviser/cement\";\nimport { ClockHead, DocTypes, DocUpdate } from \"./types.js\";\n\ntype ApplyHeadWorkerFunction = (newHead: ClockHead, prevHead: ClockHead, localUpdates: boolean) => Promise<void>;\n\ninterface ApplyHeadTask<T extends DocTypes> {\n readonly newHead: ClockHead;\n readonly prevHead: ClockHead;\n readonly updates?: DocUpdate<T>[];\n}\n\nexport interface ApplyHeadQueue<T extends DocTypes> {\n push(task: ApplyHeadTask<T>): AsyncGenerator<\n {\n readonly updates: DocUpdate<T>[];\n readonly all: boolean;\n },\n void,\n unknown\n >;\n size(): number;\n}\n\nexport function applyHeadQueue<T extends DocTypes>(worker: ApplyHeadWorkerFunction, logger: Logger): ApplyHeadQueue<T> {\n const queue: ApplyHeadTask<T>[] = [];\n let isProcessing = false;\n\n async function* process() {\n if (isProcessing || queue.length === 0) return;\n isProcessing = true;\n const allUpdates: DocUpdate<T>[] = [];\n try {\n while (queue.length > 0) {\n queue.sort((a, b) => (b.updates ? 1 : -1));\n const task = queue.shift();\n if (!task) continue;\n\n // console.time('int_applyHead worker')\n await worker(task.newHead, task.prevHead, task.updates !== null).catch((e) => {\n throw logger.Error().Err(e).Msg(\"int_applyHead worker error\").AsError();\n });\n // console.timeEnd('int_applyHead worker')\n\n if (task.updates) {\n allUpdates.push(...task.updates);\n }\n // Yield the updates if there are no tasks with updates left in the queue or the current task has updates\n if (!queue.some((t) => t.updates) || task.updates) {\n const allTasksHaveUpdates = queue.every((task) => task.updates !== null);\n yield { updates: allUpdates, all: allTasksHaveUpdates };\n allUpdates.length = 0;\n }\n }\n } finally {\n isProcessing = false;\n const generator = process();\n let result = await generator.next();\n while (!result.done) {\n result = await generator.next();\n }\n }\n }\n\n return {\n push(task: ApplyHeadTask<T>): AsyncGenerator<{ updates: DocUpdate<T>[]; all: boolean }, void, unknown> {\n queue.push(task);\n return process();\n },\n size() {\n return queue.length;\n },\n };\n}\n","export const PACKAGE_VERSION = Object.keys({\n \"0.19.8-dev-global\": \"xxxx\",\n})[0] as string;\n"],"mappings":"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","names":["ResolveOnce","index","ResolveOnce","encode","decode","Block","parse","hasher","codec","cid","pLimit","ResolveOnce","Result","CID","encode","decode","MemoryBlockstore","encode","decode","codec","get","hasher","cache","chunker","root","block","encode","CID","decode","MemoryBlockstore","MemoryBlockstore","MemoryBlockstore","CBW","carLogIncludesGroup","cid","cache","got","batchSize","root","Result","ResolveOnce","pLimit","carLogIncludesGroup","encode","hasher","codec","decode","parse","Block","create","hasher","codec","bf","cache","root","root","ResolveOnce","task","ResolveOnce","root","ResolveOnce","name","ResolveOnce","updates"]}
1
+ {"version":3,"sources":["../../src/database.ts","../../src/write-queue.ts","../../src/crdt.ts","../../src/runtime/wait-pr-multiformats/block.ts","../../src/crdt-helpers.ts","../../src/blockstore/index.ts","../../src/blockstore/types.ts","../../src/blockstore/store-factory.ts","../../src/runtime/files.ts","../../src/blockstore/store.ts","../../src/types.ts","../../src/blockstore/loader.ts","../../src/blockstore/loader-helpers.ts","../../src/blockstore/transaction.ts","../../src/blockstore/commit-queue.ts","../../src/runtime/key-bag.ts","../../src/blockstore/commitor.ts","../../src/runtime/keyed-crypto.ts","../../src/blockstore/fragment-gateway.ts","../../src/blockstore/connection-base.ts","../../src/blockstore/task-manager.ts","../../src/blockstore/store-remote.ts","../../src/indexer-helpers.ts","../../src/indexer.ts","../../src/crdt-clock.ts","../../src/apply-head-queue.ts","../../src/runtime/index.ts","../../src/runtime/wait-pr-multiformats/index.ts","../../src/runtime/wait-pr-multiformats/codec-interface.ts","../../src/version.ts"],"sourcesContent":["import { Logger, ResolveOnce } from \"@adviser/cement\";\n\nimport { WriteQueue, writeQueue } from \"./write-queue.js\";\nimport { CRDT } from \"./crdt.js\";\nimport { index } from \"./indexer.js\";\nimport type {\n DocUpdate,\n ClockHead,\n ConfigOpts,\n MapFn,\n QueryOpts,\n ChangesOptions,\n DocSet,\n DocWithId,\n IndexKeyType,\n ListenerFn,\n DocResponse,\n ChangesResponse,\n DocTypes,\n IndexRows,\n DocFragment,\n ChangesResponseRow,\n CRDTMeta,\n AllDocsQueryOpts,\n AllDocsResponse,\n SuperThis,\n} from \"./types.js\";\nimport { BaseBlockstore, Connectable } from \"./blockstore/index.js\";\nimport { ensureLogger, ensureSuperThis, NotFoundError } from \"./utils.js\";\n\nexport class Database<DT extends DocTypes = NonNullable<unknown>> implements Connectable {\n static databases = new Map<string, Database>();\n\n readonly name?: string;\n readonly opts: ConfigOpts = {};\n\n _listening = false;\n readonly _listeners = new Set<ListenerFn<DT>>();\n readonly _noupdate_listeners = new Set<ListenerFn<DT>>();\n readonly _crdt: CRDT<DT>;\n readonly _writeQueue: WriteQueue<DT>;\n readonly blockstore: BaseBlockstore;\n\n async close() {\n await this.ready();\n await this._crdt.close();\n await this.blockstore.close();\n }\n\n async destroy() {\n await this.ready();\n await this._crdt.destroy();\n await this.blockstore.destroy();\n }\n\n readonly _ready = new ResolveOnce<void>();\n async ready() {\n return this._ready.once(async () => {\n await this.sthis.start();\n await this._crdt.ready();\n await this.blockstore.ready();\n });\n }\n\n readonly logger: Logger;\n readonly sthis: SuperThis;\n\n constructor(name?: string, opts?: ConfigOpts) {\n this.name = name;\n this.opts = opts || this.opts;\n this.sthis = ensureSuperThis(this.opts);\n this.logger = ensureLogger(this.sthis, \"Database\");\n // this.logger.SetDebug(\"Database\")\n this._crdt = new CRDT(this.sthis, name, this.opts);\n this.blockstore = this._crdt.blockstore; // for connector compatibility\n this._writeQueue = writeQueue(async (updates: DocUpdate<DT>[]) => {\n return await this._crdt.bulk(updates);\n }); //, Infinity)\n this._crdt.clock.onTock(() => {\n this._no_update_notify();\n });\n }\n\n async get<T extends DocTypes>(id: string): Promise<DocWithId<T>> {\n if (!id) throw this.logger.Error().Str(\"db\", this.name).Msg(`Doc id is required`).AsError();\n\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"get\");\n const got = await this._crdt.get(id).catch((e) => {\n throw new NotFoundError(`Not found: ${id} - ${e.message}`);\n });\n if (!got) throw new NotFoundError(`Not found: ${id}`);\n const { doc } = got;\n return { ...(doc as unknown as DocWithId<T>), _id: id };\n }\n\n async put<T extends DocTypes>(doc: DocSet<T>): Promise<DocResponse> {\n await this.ready();\n this.logger.Debug().Str(\"id\", doc._id).Msg(\"put\");\n const { _id, ...value } = doc;\n const docId = _id || this.sthis.nextId().str;\n const result = (await this._writeQueue.push({\n id: docId,\n value: {\n ...(value as unknown as DocSet<DT>),\n _id: docId,\n },\n })) as CRDTMeta;\n return { id: docId, clock: result?.head, name: this.name } as DocResponse;\n }\n\n async del(id: string): Promise<DocResponse> {\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"del\");\n const result = (await this._writeQueue.push({ id: id, del: true })) as CRDTMeta;\n return { id, clock: result?.head, name: this.name } as DocResponse;\n }\n\n async changes<T extends DocTypes>(since: ClockHead = [], opts: ChangesOptions = {}): Promise<ChangesResponse<T>> {\n await this.ready();\n this.logger.Debug().Any(\"since\", since).Any(\"opts\", opts).Msg(\"changes\");\n const { result, head } = await this._crdt.changes(since, opts);\n const rows: ChangesResponseRow<T>[] = result.map(({ id: key, value, del, clock }) => ({\n key,\n value: (del ? { _id: key, _deleted: true } : { _id: key, ...value }) as DocWithId<T>,\n clock,\n }));\n return { rows, clock: head, name: this.name };\n }\n\n async allDocs<T extends DocTypes>(opts: AllDocsQueryOpts = {}): Promise<AllDocsResponse<T>> {\n await this.ready();\n void opts;\n this.logger.Debug().Msg(\"allDocs\");\n const { result, head } = await this._crdt.allDocs();\n const rows = result.map(({ id: key, value, del }) => ({\n key,\n value: (del ? { _id: key, _deleted: true } : { _id: key, ...value }) as DocWithId<T>,\n }));\n return { rows, clock: head, name: this.name };\n }\n\n async allDocuments<T extends DocTypes>(): Promise<{\n rows: {\n key: string;\n value: DocWithId<T>;\n }[];\n clock: ClockHead;\n }> {\n return this.allDocs<T>();\n }\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void {\n this.logger.Debug().Bool(\"updates\", updates).Msg(\"subscribe\");\n if (updates) {\n if (!this._listening) {\n this._listening = true;\n this._crdt.clock.onTick((updates: DocUpdate<NonNullable<unknown>>[]) => {\n void this._notify(updates);\n });\n }\n this._listeners.add(listener as ListenerFn<NonNullable<unknown>>);\n return () => {\n this._listeners.delete(listener as ListenerFn<NonNullable<unknown>>);\n };\n } else {\n this._noupdate_listeners.add(listener as ListenerFn<NonNullable<unknown>>);\n return () => {\n this._noupdate_listeners.delete(listener as ListenerFn<NonNullable<unknown>>);\n };\n }\n }\n\n // todo if we add this onto dbs in fireproof.ts then we can make index.ts a separate package\n async query<K extends IndexKeyType, T extends DocTypes, R extends DocFragment = T>(\n field: string | MapFn<T>,\n opts: QueryOpts<K> = {},\n ): Promise<IndexRows<K, T, R>> {\n await this.ready();\n this.logger.Debug().Any(\"field\", field).Any(\"opts\", opts).Msg(\"query\");\n const _crdt = this._crdt as unknown as CRDT<T>;\n const idx =\n typeof field === \"string\"\n ? index<K, T, R>(this.sthis, { _crdt }, field)\n : index<K, T, R>(this.sthis, { _crdt }, makeName(field.toString()), field);\n return await idx.query(opts);\n }\n\n async compact() {\n await this.ready();\n await this._crdt.compact();\n }\n\n async _notify(updates: DocUpdate<NonNullable<unknown>>[]) {\n await this.ready();\n if (this._listeners.size) {\n const docs: DocWithId<NonNullable<unknown>>[] = updates.map(({ id, value }) => ({ ...value, _id: id }));\n for (const listener of this._listeners) {\n await (async () => await listener(docs as DocWithId<DT>[]))().catch((e: Error) => {\n this.logger.Error().Err(e).Msg(\"subscriber error\");\n });\n }\n }\n }\n\n async _no_update_notify() {\n await this.ready();\n if (this._noupdate_listeners.size) {\n for (const listener of this._noupdate_listeners) {\n await (async () => await listener([]))().catch((e: Error) => {\n this.logger.Error().Err(e).Msg(\"subscriber error\");\n });\n }\n }\n }\n}\n\nfunction toSortedArray(set?: Record<string, unknown>): Record<string, unknown>[] {\n if (!set) return [];\n return Object.entries(set)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => ({ [k]: v }));\n}\n\nexport function fireproof(name: string, opts?: ConfigOpts): Database {\n const key = JSON.stringify(\n toSortedArray({\n name,\n stores: toSortedArray(opts?.store?.stores),\n }),\n );\n let db = Database.databases.get(key);\n if (!db) {\n db = new Database(name, opts);\n Database.databases.set(key, db);\n }\n return db;\n}\n\nfunction makeName(fnString: string) {\n const regex = /\\(([^,()]+,\\s*[^,()]+|\\[[^\\]]+\\],\\s*[^,()]+)\\)/g;\n let found: RegExpExecArray | null = null;\n const matches = Array.from(fnString.matchAll(regex), (match) => match[1].trim());\n if (matches.length === 0) {\n found = /=>\\s*{?\\s*([^{}]+)\\s*}?/.exec(fnString);\n if (found && found[1].includes(\"return\")) {\n found = null;\n }\n }\n if (!found) {\n return fnString;\n } else {\n // it's a consise arrow function, match everything after the arrow\n return found[1];\n }\n}\n","import { DocTypes, MetaType, DocUpdate } from \"./types.js\";\n\ntype WorkerFunction<T extends DocTypes> = (tasks: DocUpdate<T>[]) => Promise<MetaType>;\n\nexport interface WriteQueue<T extends DocTypes> {\n push(task: DocUpdate<T>): Promise<MetaType>;\n}\n\ninterface WriteQueueItem<T extends DocTypes> {\n readonly task: DocUpdate<T>;\n resolve(result: MetaType): void;\n reject(error: Error): void;\n}\n\nexport function writeQueue<T extends DocTypes>(worker: WorkerFunction<T>, payload = Infinity, unbounded = false): WriteQueue<T> {\n const queue: WriteQueueItem<T>[] = [];\n let isProcessing = false;\n\n async function process() {\n if (isProcessing || queue.length === 0) return;\n isProcessing = true;\n\n const tasksToProcess = queue.splice(0, payload);\n const updates = tasksToProcess.map((item) => item.task);\n\n if (unbounded) {\n // Run all updates in parallel and resolve/reject them individually\n const promises = updates.map(async (update, index) => {\n try {\n const result = await worker([update]);\n tasksToProcess[index].resolve(result);\n } catch (error) {\n tasksToProcess[index].reject(error as Error);\n }\n });\n\n await Promise.all(promises);\n } else {\n // Original logic: Run updates in a batch and resolve/reject them together\n try {\n const result = await worker(updates);\n tasksToProcess.forEach((task) => task.resolve(result));\n } catch (error) {\n tasksToProcess.forEach((task) => task.reject(error as Error));\n }\n }\n\n isProcessing = false;\n void process();\n }\n\n return {\n push(task: DocUpdate<T>): Promise<MetaType> {\n return new Promise<MetaType>((resolve, reject) => {\n queue.push({ task, resolve, reject });\n void process();\n });\n },\n };\n}\n","import { Block } from \"multiformats\";\nimport { Logger, ResolveOnce } from \"@adviser/cement\";\n\nimport {\n EncryptedBlockstore,\n type TransactionMeta,\n type CarTransaction,\n BaseBlockstore,\n CompactFetcher,\n} from \"./blockstore/index.js\";\nimport {\n clockChangesSince,\n applyBulkUpdateToCrdt,\n getValueFromCrdt,\n readFiles,\n getAllEntries,\n clockVis,\n getBlock,\n doCompact,\n} from \"./crdt-helpers.js\";\nimport type {\n DocUpdate,\n CRDTMeta,\n ClockHead,\n ConfigOpts,\n ChangesOptions,\n IdxMetaMap,\n DocValue,\n IndexKeyType,\n DocWithId,\n DocTypes,\n Falsy,\n SuperThis,\n} from \"./types.js\";\nimport { index, type Index } from \"./indexer.js\";\nimport { CRDTClock } from \"./crdt-clock.js\";\nimport { blockstoreFactory } from \"./blockstore/transaction.js\";\nimport { ensureLogger } from \"./utils.js\";\n\nexport class CRDT<T extends DocTypes> {\n readonly name?: string;\n readonly opts: ConfigOpts;\n\n readonly blockstore: BaseBlockstore;\n readonly indexBlockstore: BaseBlockstore;\n readonly indexers = new Map<string, Index<IndexKeyType, NonNullable<unknown>>>();\n readonly clock: CRDTClock<T>;\n\n readonly logger: Logger;\n readonly sthis: SuperThis;\n\n constructor(sthis: SuperThis, name?: string, opts: ConfigOpts = {}) {\n this.sthis = sthis;\n this.name = name;\n this.logger = ensureLogger(sthis, \"CRDT\");\n this.opts = opts;\n this.blockstore = blockstoreFactory(sthis, {\n name: name,\n applyMeta: async (meta: TransactionMeta) => {\n const crdtMeta = meta as CRDTMeta;\n if (!crdtMeta.head) throw this.logger.Error().Msg(\"missing head\").AsError();\n await this.clock.applyHead(crdtMeta.head, []);\n },\n compact: async (blocks: CompactFetcher) => {\n await doCompact(blocks, this.clock.head, this.logger);\n return { head: this.clock.head } as TransactionMeta;\n },\n autoCompact: this.opts.autoCompact || 100,\n store: { ...this.opts.store, isIndex: undefined },\n public: this.opts.public,\n meta: this.opts.meta,\n threshold: this.opts.threshold,\n });\n this.indexBlockstore = blockstoreFactory(sthis, {\n name: name,\n applyMeta: async (meta: TransactionMeta) => {\n const idxCarMeta = meta as IdxMetaMap;\n if (!idxCarMeta.indexes) throw this.logger.Error().Msg(\"missing indexes\").AsError();\n for (const [name, idx] of Object.entries(idxCarMeta.indexes)) {\n index(this.sthis, { _crdt: this }, name, undefined, idx);\n }\n },\n store: { ...this.opts.store, isIndex: this.opts.store?.isIndex || \"idx\" },\n public: this.opts.public,\n });\n this.clock = new CRDTClock<T>(this.blockstore);\n this.clock.onZoom(() => {\n for (const idx of this.indexers.values()) {\n idx._resetIndex();\n }\n });\n }\n\n async bulk(updates: DocUpdate<T>[]): Promise<CRDTMeta> {\n await this.ready();\n const prevHead = [...this.clock.head];\n\n const done = await this.blockstore.transaction<CRDTMeta>(async (blocks: CarTransaction): Promise<CRDTMeta> => {\n const { head } = await applyBulkUpdateToCrdt<T>(\n this.blockstore.ebOpts.storeRuntime,\n blocks,\n this.clock.head,\n updates,\n this.logger,\n );\n updates = updates.map((dupdate: DocUpdate<T>) => {\n // if (!dupdate.value) throw new Error(\"missing value\");\n readFiles(this.blockstore, { doc: dupdate.value as DocWithId<T> });\n return dupdate;\n });\n return { head };\n });\n await this.clock.applyHead(done.meta.head, prevHead, updates);\n return done.meta;\n }\n\n readonly onceReady = new ResolveOnce<void>();\n async ready(): Promise<void> {\n return this.onceReady.once(async () => {\n try {\n // await this.blockstore.ready();\n // await this.indexBlockstore.ready();\n // await this.clock.ready();\n await Promise.all([this.blockstore.ready(), this.indexBlockstore.ready(), this.clock.ready()]);\n } catch (e) {\n throw this.logger.Error().Err(e).Msg(\"CRDT not ready\").AsError();\n }\n });\n }\n\n async close(): Promise<void> {\n await Promise.all([this.blockstore.close(), this.indexBlockstore.close(), this.clock.close()]);\n }\n\n async destroy(): Promise<void> {\n await Promise.all([this.blockstore.destroy(), this.indexBlockstore.destroy()]);\n }\n\n // if (snap) await this.clock.applyHead(crdtMeta.head, this.clock.head)\n\n async allDocs(): Promise<{ result: DocUpdate<T>[]; head: ClockHead }> {\n await this.ready();\n const result: DocUpdate<T>[] = [];\n for await (const entry of getAllEntries<T>(this.blockstore, this.clock.head, this.logger)) {\n result.push(entry);\n }\n return { result, head: this.clock.head };\n }\n\n async vis(): Promise<string> {\n await this.ready();\n const txt: string[] = [];\n for await (const line of clockVis(this.blockstore, this.clock.head)) {\n txt.push(line);\n }\n return txt.join(\"\\n\");\n }\n\n async getBlock(cidString: string): Promise<Block> {\n await this.ready();\n return await getBlock(this.blockstore, cidString);\n }\n\n async get(key: string): Promise<DocValue<T> | Falsy> {\n await this.ready();\n const result = await getValueFromCrdt<T>(this.blockstore, this.clock.head, key, this.logger);\n if (result.del) return undefined;\n return result;\n }\n\n async changes(\n since: ClockHead = [],\n opts: ChangesOptions = {},\n ): Promise<{\n result: DocUpdate<T>[];\n head: ClockHead;\n }> {\n await this.ready();\n return await clockChangesSince<T>(this.blockstore, this.clock.head, since, opts, this.logger);\n }\n\n async compact(): Promise<void> {\n const blocks = this.blockstore as EncryptedBlockstore;\n return await blocks.compact();\n }\n}\n","// this enable async codec\n// it should be gone if this in multiformats is merged:\n// https://github.com/multiformats/js-multiformats/pull/305\nimport { bytes as binary, CID, MultihashHasher, BlockView, ByteView, Version, Link } from \"multiformats\";\nimport { Block as mfBlock } from \"multiformats/block\";\nimport { BlockDecoder, BlockEncoder } from \"./codec-interface\";\n\n// export type Block<T, C extends number, A extends number, V extends Version> = mfBlock<T, C, A, V>\n\nexport const Block = mfBlock;\n\ninterface DecodeInput<T, Code extends number, Alg extends number> {\n bytes: ByteView<T>;\n codec: BlockDecoder<Code, T>;\n hasher: MultihashHasher<Alg>;\n}\n\nexport async function decode<T, Code extends number, Alg extends number>({\n bytes,\n codec,\n hasher,\n}: DecodeInput<T, Code, Alg>): Promise<BlockView<T, Code, Alg>> {\n if (bytes == null) throw new Error('Missing required argument \"bytes\"');\n if (codec == null || hasher == null) throw new Error(\"Missing required argument: codec or hasher\");\n\n const value = await Promise.resolve(codec.decode(bytes));\n const hash = await hasher.digest(bytes);\n const cid = CID.create(1, codec.code, hash) as CID<T, Code, Alg, 1>;\n\n return new mfBlock({ value, bytes, cid });\n}\n\ninterface EncodeInput<T, Code extends number, Alg extends number> {\n value: T;\n codec: BlockEncoder<Code, T>;\n hasher: MultihashHasher<Alg>;\n}\n\nexport async function encode<T, Code extends number, Alg extends number>({\n value,\n codec,\n hasher,\n}: EncodeInput<T, Code, Alg>): Promise<BlockView<T, Code, Alg>> {\n if (typeof value === \"undefined\") throw new Error('Missing required argument \"value\"');\n if (codec == null || hasher == null) throw new Error(\"Missing required argument: codec or hasher\");\n\n const bytes = await Promise.resolve(codec.encode(value));\n const hash = await hasher.digest(bytes);\n const cid = CID.create(1, codec.code, hash) as CID<T, Code, Alg, 1>;\n\n return new mfBlock({ value, bytes, cid });\n}\n\ninterface CreateInput<T, Code extends number, Alg extends number, V extends Version> {\n bytes: ByteView<T>;\n cid: Link<T, Code, Alg, V>;\n hasher: MultihashHasher<Alg>;\n codec: BlockDecoder<Code, T>;\n}\n\nexport async function create<T, Code extends number, Alg extends number, V extends Version>({\n bytes,\n cid,\n hasher,\n codec,\n}: CreateInput<T, Code, Alg, V>): Promise<BlockView<T, Code, Alg, V>> {\n if (bytes == null) throw new Error('Missing required argument \"bytes\"');\n if (hasher == null) throw new Error('Missing required argument \"hasher\"');\n const value = await Promise.resolve(codec.decode(bytes));\n const hash = await hasher.digest(bytes);\n if (!binary.equals(cid.multihash.bytes, hash.bytes)) {\n throw new Error(\"CID hash does not match bytes\");\n }\n\n return createUnsafe({\n bytes,\n cid,\n value,\n codec,\n });\n}\n\ntype CreateUnsafeInput<T, Code extends number, Alg extends number, V extends Version> =\n | {\n cid: Link<T, Code, Alg, V>;\n value: T;\n codec?: BlockDecoder<Code, T>;\n bytes: ByteView<T>;\n }\n | {\n cid: Link<T, Code, Alg, V>;\n value?: undefined;\n codec: BlockDecoder<Code, T>;\n bytes: ByteView<T>;\n };\n\n/**\n * @template T - Logical type of the data encoded in the block\n * @template Code - multicodec code corresponding to codec used to encode the block\n * @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.\n * @template V - CID version\n */\nexport async function createUnsafe<T, Code extends number, Alg extends number, V extends Version>({\n bytes,\n cid,\n value: maybeValue,\n codec,\n}: CreateUnsafeInput<T, Code, Alg, V>): Promise<BlockView<T, Code, Alg, V>> {\n const value = await Promise.resolve(maybeValue !== undefined ? maybeValue : codec?.decode(bytes));\n\n if (value === undefined) throw new Error('Missing required argument, must either provide \"value\" or \"codec\"');\n\n return new Block({\n cid: cid as CID<T, Code, Alg, V>,\n bytes,\n value,\n });\n}\n","import { encode, decode, Block } from \"./runtime/wait-pr-multiformats/block.js\";\nimport { parse } from \"multiformats/link\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as codec from \"@ipld/dag-cbor\";\nimport { put, get, entries, root } from \"@web3-storage/pail/crdt\";\nimport { EventBlockView, EventLink, Operation, PutOperation } from \"@web3-storage/pail/crdt/api\";\nimport { EventFetcher, vis } from \"@web3-storage/pail/clock\";\nimport * as Batch from \"@web3-storage/pail/crdt/batch\";\nimport {\n type EncryptedBlockstore,\n CarTransaction,\n BlockFetcher,\n TransactionMeta,\n AnyLink,\n StoreRuntime,\n BaseBlockstore,\n CompactFetcher,\n} from \"./blockstore/index.js\";\nimport {\n type IndexKeyType,\n type DocUpdate,\n type ClockHead,\n type DocValue,\n type CRDTMeta,\n type ChangesOptions,\n type DocFileMeta,\n type DocFiles,\n type DocSet,\n type DocWithId,\n type DocTypes,\n throwFalsy,\n} from \"./types.js\";\nimport { Result } from \"@web3-storage/pail/crdt/api\";\nimport { Logger } from \"@adviser/cement\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction time(tag: string) {\n // console.time(tag)\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction timeEnd(tag: string) {\n // console.timeEnd(tag)\n}\n\nfunction toString<K extends IndexKeyType>(key: K, logger: Logger): string {\n switch (typeof key) {\n case \"string\":\n case \"number\":\n return key.toString();\n default:\n throw logger.Error().Msg(\"Invalid key type\").AsError();\n }\n}\n\nexport async function applyBulkUpdateToCrdt<T extends DocTypes>(\n store: StoreRuntime,\n tblocks: CarTransaction,\n head: ClockHead,\n updates: DocUpdate<T>[],\n logger: Logger,\n): Promise<CRDTMeta> {\n let result: Result | null = null;\n if (updates.length > 1) {\n const batch = await Batch.create(tblocks, head);\n for (const update of updates) {\n const link = await writeDocContent(store, tblocks, update, logger);\n await batch.put(toString(update.id, logger), link);\n }\n result = await batch.commit();\n } else if (updates.length === 1) {\n const link = await writeDocContent(store, tblocks, updates[0], logger);\n result = await put(tblocks, head, toString(updates[0].id, logger), link);\n }\n if (!result) throw logger.Error().Uint64(\"updates.len\", updates.length).Msg(\"Missing result\").AsError();\n\n if (result.event) {\n for (const { cid, bytes } of [\n ...result.additions,\n // ...result.removals,\n result.event,\n ]) {\n tblocks.putSync(cid, bytes);\n }\n }\n return { head: result.head } as CRDTMeta;\n}\n\n// this whole thing can get pulled outside of the write queue\nasync function writeDocContent<T extends DocTypes>(\n store: StoreRuntime,\n blocks: CarTransaction,\n update: DocUpdate<T>,\n logger: Logger,\n): Promise<AnyLink> {\n let value: Partial<DocValue<T>>;\n if (update.del) {\n value = { del: true };\n } else {\n if (!update.value) throw logger.Error().Msg(\"Missing value\").AsError();\n await processFiles(store, blocks, update.value, logger);\n value = { doc: update.value as DocWithId<T> };\n }\n const block = await encode({ value, hasher, codec });\n blocks.putSync(block.cid, block.bytes);\n return block.cid;\n}\n\nasync function processFiles<T extends DocTypes>(store: StoreRuntime, blocks: CarTransaction, doc: DocSet<T>, logger: Logger) {\n if (doc._files) {\n await processFileset(logger, store, blocks, doc._files);\n }\n if (doc._publicFiles) {\n await processFileset(logger, store, blocks, doc._publicFiles /*, true*/);\n }\n}\n\nasync function processFileset(\n logger: Logger,\n store: StoreRuntime,\n blocks: CarTransaction,\n files: DocFiles /*, publicFiles = false */,\n) {\n const dbBlockstore = blocks.parent as EncryptedBlockstore;\n if (!dbBlockstore.loader) throw logger.Error().Msg(\"Missing loader, database name is required\").AsError();\n const t = new CarTransaction(dbBlockstore); // maybe this should move to encrypted-blockstore\n const didPut = [];\n // let totalSize = 0\n for (const filename in files) {\n if (File === files[filename].constructor) {\n const file = files[filename] as File;\n\n // totalSize += file.size\n const { cid, blocks: fileBlocks } = await store.encodeFile(file);\n didPut.push(filename);\n for (const block of fileBlocks) {\n t.putSync(block.cid, block.bytes);\n }\n files[filename] = { cid, type: file.type, size: file.size } as DocFileMeta;\n } else {\n const { cid, type, size, car } = files[filename] as DocFileMeta;\n if (cid && type && size && car) {\n files[filename] = { cid, type, size, car };\n }\n }\n }\n\n if (didPut.length) {\n const car = await dbBlockstore.loader.commitFiles(\n t,\n { files } as unknown as TransactionMeta /* {\n public: publicFiles,\n } */,\n );\n if (car) {\n for (const name of didPut) {\n files[name] = { car, ...files[name] } as DocFileMeta;\n }\n }\n }\n}\n\nexport async function getValueFromCrdt<T extends DocTypes>(\n blocks: BaseBlockstore,\n head: ClockHead,\n key: string,\n logger: Logger,\n): Promise<DocValue<T>> {\n if (!head.length) throw logger.Debug().Msg(\"Getting from an empty database\").AsError();\n const link = await get(blocks, head, key);\n if (!link) throw logger.Error().Str(\"key\", key).Msg(`Missing key`).AsError();\n return await getValueFromLink(blocks, link, logger);\n}\n\nexport function readFiles<T extends DocTypes>(blocks: BaseBlockstore, { doc }: Partial<DocValue<T>>) {\n if (!doc) return;\n if (doc._files) {\n readFileset(blocks as EncryptedBlockstore, doc._files);\n }\n if (doc._publicFiles) {\n readFileset(blocks as EncryptedBlockstore, doc._publicFiles, true);\n }\n}\n\nfunction readFileset(blocks: EncryptedBlockstore, files: DocFiles, isPublic = false) {\n for (const filename in files) {\n const fileMeta = files[filename] as DocFileMeta;\n if (fileMeta.cid) {\n if (isPublic) {\n fileMeta.url = `https://${fileMeta.cid.toString()}.ipfs.w3s.link/`;\n }\n if (fileMeta.car) {\n fileMeta.file = async () =>\n await blocks.ebOpts.storeRuntime.decodeFile(\n {\n get: async (cid: AnyLink) => {\n return await blocks.getFile(throwFalsy(fileMeta.car), cid);\n },\n },\n fileMeta.cid,\n fileMeta,\n );\n }\n }\n files[filename] = fileMeta;\n }\n}\n\nasync function getValueFromLink<T extends DocTypes>(blocks: BlockFetcher, link: AnyLink, logger: Logger): Promise<DocValue<T>> {\n const block = await blocks.get(link);\n if (!block) throw logger.Error().Str(\"link\", link.toString()).Msg(`Missing linked block`).AsError();\n const { value } = (await decode({ bytes: block.bytes, hasher, codec })) as { value: DocValue<T> };\n const cvalue = {\n ...value,\n cid: link,\n };\n readFiles(blocks as EncryptedBlockstore, cvalue);\n return cvalue;\n}\n\nclass DirtyEventFetcher<T> extends EventFetcher<T> {\n readonly logger: Logger;\n constructor(logger: Logger, blocks: BlockFetcher) {\n super(blocks);\n this.logger = logger;\n }\n async get(link: EventLink<T>): Promise<EventBlockView<T>> {\n try {\n return super.get(link);\n } catch (e) {\n this.logger.Error().Ref(\"link\", link.toString()).Err(e).Msg(\"Missing event\");\n return { value: undefined } as unknown as EventBlockView<T>;\n }\n }\n}\n\nexport async function clockChangesSince<T extends DocTypes>(\n blocks: BlockFetcher,\n head: ClockHead,\n since: ClockHead,\n opts: ChangesOptions,\n logger: Logger,\n): Promise<{ result: DocUpdate<T>[]; head: ClockHead }> {\n const eventsFetcher = (\n opts.dirty ? new DirtyEventFetcher<Operation>(logger, blocks) : new EventFetcher<Operation>(blocks)\n ) as EventFetcher<Operation>;\n const keys = new Set<string>();\n const updates = await gatherUpdates<T>(\n blocks,\n eventsFetcher,\n head,\n since,\n [],\n keys,\n new Set<string>(),\n opts.limit || Infinity,\n logger,\n );\n return { result: updates.reverse(), head };\n}\n\nasync function gatherUpdates<T extends DocTypes>(\n blocks: BlockFetcher,\n eventsFetcher: EventFetcher<Operation>,\n head: ClockHead,\n since: ClockHead,\n updates: DocUpdate<T>[] = [],\n keys: Set<string>,\n didLinks: Set<string>,\n limit: number,\n logger: Logger,\n): Promise<DocUpdate<T>[]> {\n if (limit <= 0) return updates;\n // if (Math.random() < 0.001) console.log('gatherUpdates', head.length, since.length, updates.length)\n const sHead = head.map((l) => l.toString());\n for (const link of since) {\n if (sHead.includes(link.toString())) {\n return updates;\n }\n }\n for (const link of head) {\n if (didLinks.has(link.toString())) continue;\n didLinks.add(link.toString());\n const { value: event } = await eventsFetcher.get(link);\n if (!event) continue;\n const { type } = event.data;\n let ops = [] as PutOperation[];\n if (type === \"batch\") {\n ops = event.data.ops as PutOperation[];\n } else if (type === \"put\") {\n ops = [event.data] as PutOperation[];\n }\n for (let i = ops.length - 1; i >= 0; i--) {\n const { key, value } = ops[i];\n if (!keys.has(key)) {\n // todo option to see all updates\n const docValue = await getValueFromLink<T>(blocks, value, logger);\n updates.push({ id: key, value: docValue.doc, del: docValue.del, clock: link });\n limit--;\n keys.add(key);\n }\n }\n if (event.parents) {\n updates = await gatherUpdates(blocks, eventsFetcher, event.parents, since, updates, keys, didLinks, limit, logger);\n }\n }\n return updates;\n}\n\nexport async function* getAllEntries<T extends DocTypes>(blocks: BlockFetcher, head: ClockHead, logger: Logger) {\n // return entries(blocks, head)\n for await (const [key, link] of entries(blocks, head)) {\n const docValue = await getValueFromLink(blocks, link, logger);\n yield { id: key, value: docValue.doc, del: docValue.del } as DocUpdate<T>;\n }\n}\n\nexport async function* clockVis(blocks: BlockFetcher, head: ClockHead) {\n for await (const line of vis(blocks, head)) {\n yield line;\n }\n}\n\nlet isCompacting = false;\nexport async function doCompact(blockLog: CompactFetcher, head: ClockHead, logger: Logger) {\n if (isCompacting) {\n // console.log('already compacting')\n return;\n }\n isCompacting = true;\n\n time(\"compact head\");\n for (const cid of head) {\n const bl = await blockLog.get(cid);\n if (!bl) throw logger.Error().Ref(\"cid\", cid).Msg(\"Missing head block\").AsError();\n }\n timeEnd(\"compact head\");\n\n // for await (const blk of blocks.entries()) {\n // const bl = await blockLog.get(blk.cid)\n // if (!bl) throw new Error('Missing tblock: ' + blk.cid.toString())\n // }\n\n // todo maybe remove\n // for await (const blk of blocks.loader!.entries()) {\n // const bl = await blockLog.get(blk.cid)\n // if (!bl) throw new Error('Missing db block: ' + blk.cid.toString())\n // }\n\n time(\"compact all entries\");\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _entry of getAllEntries(blockLog, head, logger)) {\n // result.push(entry)\n // void 1;\n continue;\n }\n timeEnd(\"compact all entries\");\n\n // time(\"compact crdt entries\")\n // for await (const [, link] of entries(blockLog, head)) {\n // const bl = await blockLog.get(link)\n // if (!bl) throw new Error('Missing entry block: ' + link.toString())\n // }\n // timeEnd(\"compact crdt entries\")\n\n time(\"compact clock vis\");\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _line of vis(blockLog, head)) {\n void 1;\n }\n timeEnd(\"compact clock vis\");\n\n time(\"compact root\");\n const result = await root(blockLog, head);\n timeEnd(\"compact root\");\n\n time(\"compact root blocks\");\n for (const { cid, bytes } of [...result.additions, ...result.removals]) {\n blockLog.loggedBlocks.putSync(cid, bytes);\n }\n timeEnd(\"compact root blocks\");\n\n time(\"compact changes\");\n await clockChangesSince(blockLog, head, [], {}, logger);\n timeEnd(\"compact changes\");\n\n isCompacting = false;\n}\n\nexport async function getBlock(blocks: BlockFetcher, cidString: string) {\n const block = await blocks.get(parse(cidString));\n if (!block) throw new Error(`Missing block ${cidString}`);\n const { cid, value } = await decode({ bytes: block.bytes, codec, hasher });\n return new Block({ cid, value, bytes: block.bytes });\n}\n","export * from \"./types.js\";\n\nexport * from \"./store-factory.js\";\nexport * from \"./gateway.js\";\nexport * from \"./fragment-gateway.js\";\n\nimport { type CarClockHead, type Connectable, type DbMetaEventBlock } from \"./connection-base.js\";\nexport { CarClockHead, Connectable, DbMetaEventBlock };\n\nexport { EncryptedBlockstore, BaseBlockstore, CompactionFetcher, type BlockFetcher, CarTransaction } from \"./transaction.js\";\nexport { Loader } from \"./loader.js\";\nexport { parseCarFile } from \"./loader-helpers.js\";\nexport { ConnectionBase } from \"./connection-base.js\";\n","import type { CID, Link, Version } from \"multiformats\";\nimport type { BlockCodec } from \"../runtime/wait-pr-multiformats/codec-interface\";\nimport { DocFileMeta, Falsy, StoreType, SuperThis } from \"../types.js\";\nimport { BlockFetcher, CarTransaction } from \"./transaction.js\";\nimport { Logger, Result } from \"../utils.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport { KeyBagOpts } from \"../runtime/key-bag.js\";\nimport { CoerceURI, CryptoRuntime, CTCryptoKey, URI } from \"@adviser/cement\";\n\nexport type AnyLink = Link<unknown, number, number, Version>;\nexport type CarGroup = AnyLink[];\nexport type CarLog = CarGroup[];\nexport type AnyAnyLink = Link<unknown, number, number, Version>;\n\nexport type AnyLinkFn = (cid: AnyLink) => Promise<AnyBlock | undefined>;\n\nexport interface AnyBlock {\n readonly cid: Link<unknown, number, number, Version>;\n readonly bytes: Uint8Array;\n}\n\nexport interface CIDBlock {\n readonly cid: CID<unknown, number, number, Version>;\n readonly bytes: Uint8Array;\n}\n\nexport function toCIDBlock(block: AnyBlock): CIDBlock {\n return block as CIDBlock;\n}\nexport interface AnyAnyBlock {\n readonly cid: AnyAnyLink;\n readonly bytes: Uint8Array;\n}\n\n// export interface EncryptOpts {\n// readonly key: ArrayBuffer;\n// readonly cid: AnyLink;\n// readonly bytes: Uint8Array;\n// }\n\nexport interface IvKeyIdData {\n readonly iv: Uint8Array;\n readonly keyId: Uint8Array;\n readonly data: Uint8Array;\n}\n\nexport interface IvAndBytes {\n readonly bytes: Uint8Array;\n readonly iv: Uint8Array;\n}\n\nexport interface BytesWithIv {\n readonly bytes: Uint8Array;\n readonly iv?: Uint8Array;\n}\n\n// export interface DecryptOpts {\n// readonly key: ArrayBuffer;\n// readonly value: IvAndBytes;\n// }\n\nexport interface AnyDecodedBlock {\n readonly cid: AnyLink;\n readonly bytes: Uint8Array;\n readonly value: Uint8Array;\n}\n\nexport interface CarMakeable {\n entries(): Iterable<AnyBlock>;\n get(cid: AnyLink): Promise<AnyBlock | undefined>;\n}\n\nexport interface CarHeader<T> {\n readonly cars: CarLog;\n readonly compact: CarLog;\n readonly meta: T;\n}\n\n// type NestedData =\n// | Uint8Array\n// | string\n// | number\n// | boolean\n// | undefined\n// | null\n// | AnyLink\n// | NestedData[]\n// | { [key: string]: NestedData };\n\nexport interface TransactionWrapper<M extends TransactionMeta> {\n meta: M;\n cars?: CarGroup;\n t: CarTransaction;\n}\n\nexport type TransactionMeta = unknown;\n//CRDTMeta | IndexTransactionMeta | FileTransactionMeta;\n\n// export interface MakeCodecCrypto {\n// subtle: {\n// decrypt: (algo: { name: string; iv: Uint8Array; tagLength: number }, key: CryptoKey, data: Uint8Array) => Promise<ArrayBuffer>;\n// encrypt: (algo: { name: string; iv: Uint8Array; tagLength: number }, key: CryptoKey, data: Uint8Array) => Promise<ArrayBuffer>;\n// };\n// }\n\n// an implementation of this Interface contains the keymaterial\n// so that the fp-core can use the decrypt and encrypt without knowing the key\nexport interface EncryptedBlock {\n readonly value: IvAndBytes;\n}\n\nexport interface KeyWithFingerPrint {\n readonly fingerPrint: string;\n readonly key: CTCryptoKey;\n}\n\nexport interface CodecOpts {\n readonly ivCalc: \"random\" | \"hash\";\n readonly noIVVerify: boolean;\n}\nexport interface KeyedCrypto {\n readonly ivLength: number;\n readonly logger: Logger;\n readonly crypto: CryptoRuntime;\n readonly url: URI;\n // readonly codec: BlockCodec<number, IvAndBytes>;\n // readonly isEncrypting: boolean;\n fingerPrint(): Promise<string>;\n algo(iv?: Uint8Array): { name: string; iv: Uint8Array; tagLength: number };\n codec(iv?: Uint8Array, codecOpts?: Partial<CodecOpts>): BlockCodec<number, Uint8Array>;\n _decrypt(data: IvAndBytes): Promise<Uint8Array>;\n _encrypt(data: BytesWithIv): Promise<Uint8Array>;\n // encode(data: Uint8Array): Promise<Uint8Array>;\n // decode(bytes: Uint8Array | ArrayBuffer): Promise<Uint8Array>;\n}\n\nexport interface BlobLike {\n /**\n * Returns a ReadableStream which yields the Blob data.\n */\n stream: () => ReadableStream;\n}\n\nexport interface StoreFactory {\n makeMetaStore?: (loader: Loadable) => Promise<MetaStore>;\n makeDataStore?: (loader: Loadable) => Promise<DataStore>;\n makeWALStore?: (loader: Loadable) => Promise<WALStore>;\n\n encodeFile?: (blob: BlobLike) => Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n decodeFile?: (blocks: unknown, cid: AnyLink, meta: DocFileMeta) => Promise<File>;\n}\n\nexport interface StoreOpts extends StoreFactory {\n readonly isIndex?: string; // index prefix\n readonly stores?: {\n // string means local storage\n // URL means schema selects the storeType\n readonly base?: CoerceURI;\n\n readonly meta?: CoerceURI;\n readonly data?: CoerceURI;\n readonly index?: CoerceURI;\n readonly wal?: CoerceURI;\n };\n}\n\nexport interface StoreRuntime {\n // the factories should produce ready-to-use stores\n // which means they have to call start() on the store\n // to fullfill lifecycle requirements\n // to release resources, like one database connection\n // for all stores a refcount on close() should be used\n makeMetaStore(loader: Loadable): Promise<MetaStore>;\n makeDataStore(loader: Loadable): Promise<DataStore>;\n makeWALStore(loader: Loadable): Promise<WALStore>;\n encodeFile(blob: BlobLike): Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<File>;\n}\n\nexport interface CommitOpts {\n readonly noLoader?: boolean;\n readonly compact?: boolean;\n // readonly public?: boolean;\n}\n\nexport interface DbMeta {\n readonly cars: CarGroup;\n // key?: string;\n}\n\n// export interface UploadMetaFnParams {\n// readonly name: string;\n// readonly branch: string;\n// }\n\n// export type FnParamTypes = \"data\" | \"file\";\n\n// export interface UploadDataFnParams {\n// readonly type: FnParamTypes;\n// readonly name: string;\n// readonly car: string;\n// readonly size: string;\n// }\n\n// export interface DownloadDataFnParams {\n// readonly type: FnParamTypes;\n// readonly name: string;\n// readonly car: string;\n// }\n\n// export interface DownloadMetaFnParams {\n// readonly name: string;\n// readonly branch: string;\n// }\n\nexport type LoadHandler = (dbMetas: DbMeta[]) => Promise<void>;\n\nexport interface Connection {\n readonly loader?: Loadable;\n readonly loaded: Promise<void>;\n connectMeta_X({ loader }: { loader?: Loadable }): void;\n connectStorage_X({ loader }: { loader?: Loadable }): void;\n\n // metaUpload(bytes: Uint8Array, params: UploadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n // dataUpload(bytes: Uint8Array, params: UploadDataFnParams, opts?: { public?: boolean }): Promise<void>;\n // metaDownload(params: DownloadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n // dataDownload(params: DownloadDataFnParams): Promise<Uint8Array | Falsy>;\n}\n\nexport interface BaseStore {\n readonly storeType: StoreType;\n // readonly url: URI\n url(): URI;\n readonly name: string;\n onStarted(fn: () => void): void;\n onClosed(fn: () => void): void;\n\n keyedCrypto(): Promise<KeyedCrypto>;\n\n close(): Promise<Result<void>>;\n destroy(): Promise<Result<void>>;\n readonly ready?: () => Promise<void>;\n start(): Promise<Result<URI>>;\n}\n\nexport interface MetaStore extends BaseStore {\n readonly storeType: \"meta\";\n load(branch?: string): Promise<DbMeta[] | Falsy>;\n // branch is defaulted to \"main\"\n save(meta: DbMeta, branch?: string): Promise<Result<void>>;\n}\n\nexport interface RemoteMetaStore extends MetaStore {\n handleByteHeads(byteHeads: Uint8Array[], branch?: string): Promise<DbMeta[]>;\n}\n\nexport interface DataSaveOpts {\n readonly public: boolean;\n}\n\nexport interface DataStore extends BaseStore {\n readonly storeType: \"data\";\n load(cid: AnyLink): Promise<AnyBlock>;\n save(car: AnyBlock, opts?: DataSaveOpts): Promise</*AnyLink | */ void>;\n remove(cid: AnyLink): Promise<Result<void>>;\n}\n\nexport interface WALState {\n operations: DbMeta[];\n noLoaderOps: DbMeta[];\n fileOperations: {\n readonly cid: AnyLink;\n readonly public: boolean;\n }[];\n}\n\nexport interface WALStore extends BaseStore {\n readonly storeType: \"wal\";\n ready: () => Promise<void>;\n readonly processing?: Promise<void> | undefined;\n readonly processQueue: CommitQueue<void>;\n\n process(): Promise<void>;\n enqueue(dbMeta: DbMeta, opts: CommitOpts): Promise<void>;\n enqueueFile(fileCid: AnyLink /*, publicFile?: boolean*/): Promise<void>;\n load(): Promise<WALState | Falsy>;\n save(state: WALState): Promise<void>;\n}\n\nexport type CompactFetcher = BlockFetcher & {\n readonly loggedBlocks: CarTransaction;\n};\nexport type CompactFn = (blocks: CompactFetcher) => Promise<TransactionMeta>;\n\nexport type BlockstoreOpts = Partial<{\n readonly logger: Logger;\n readonly applyMeta: (meta: TransactionMeta, snap?: boolean) => Promise<void>;\n readonly compact: CompactFn;\n readonly autoCompact: number;\n readonly crypto: CryptoRuntime;\n readonly store: StoreOpts;\n readonly keyBag: KeyBagOpts;\n readonly public: boolean;\n readonly meta: DbMeta;\n readonly name: string;\n readonly threshold: number;\n}>;\n\nexport interface BlockstoreRuntime {\n readonly logger: Logger;\n readonly applyMeta: (meta: TransactionMeta, snap?: boolean) => Promise<void>;\n readonly compact: CompactFn;\n readonly autoCompact: number;\n readonly crypto: CryptoRuntime;\n readonly store: StoreOpts;\n readonly storeRuntime: StoreRuntime;\n readonly keyBag: Partial<KeyBagOpts>;\n // readonly public: boolean;\n readonly meta?: DbMeta;\n readonly name?: string;\n readonly threshold: number;\n}\n\nexport interface Loadable {\n readonly name: string; // = \"\";\n readonly sthis: SuperThis;\n readonly ebOpts: BlockstoreRuntime;\n remoteCarStore?: DataStore;\n carStore(): Promise<DataStore>;\n carLog: CarLog; // = new Array<CarGroup>();\n remoteMetaStore?: RemoteMetaStore;\n remoteFileStore?: DataStore;\n ready(): Promise<void>;\n close(): Promise<void>;\n fileStore(): Promise<DataStore>;\n WALStore(): Promise<WALStore>;\n handleDbMetasFromStore(metas: DbMeta[]): Promise<void>;\n}\n","import { Logger, KeyedResolvOnce, CoerceURI, URI, Result } from \"@adviser/cement\";\n\nimport { decodeFile, encodeFile } from \"../runtime/files.js\";\nimport { DataStoreImpl, MetaStoreImpl, WALStoreImpl } from \"./store.js\";\nimport { Loadable, StoreOpts, StoreRuntime } from \"./types.js\";\nimport { dataDir, ensureLogger, ensureSuperLog } from \"../utils.js\";\nimport { Gateway, TestGateway } from \"./gateway.js\";\nimport { getKeyBag } from \"../runtime/key-bag.js\";\nimport { SuperThis } from \"../types.js\";\n\nfunction ensureIsIndex(url: URI, isIndex?: string): URI {\n if (isIndex) {\n return url.build().setParam(\"index\", isIndex).URI();\n }\n return url.build().delParam(\"index\").URI();\n}\n\nfunction ensureName(name: string, url: URI): URI {\n if (!url.hasParam(\"name\")) {\n return url.build().setParam(\"name\", name).URI();\n }\n return url;\n}\n\nexport interface GatewayFactoryItem {\n readonly protocol: string;\n readonly overrideBaseURL?: string; // if this set it overrides the defaultURL\n readonly overrideRegistration?: boolean; // if this is set, it will override the registration\n\n readonly gateway: (sthis: SuperThis) => Promise<Gateway>;\n readonly test: (sthis: SuperThis) => Promise<TestGateway>;\n // which switches between file and indexdb\n // readonly data: (logger: Logger) => Promise<Gateway>;\n // readonly meta: (logger: Logger) => Promise<Gateway>;\n // readonly wal: (logger: Logger) => Promise<Gateway>;\n // readonly test: (logger: Logger) => Promise<TestStore>;\n}\n\nconst storeFactory = new Map<string, GatewayFactoryItem>();\n\nfunction buildURL(optURL: CoerceURI, loader: Loadable): URI {\n const storeOpts = loader.ebOpts.store;\n const obuItem = Array.from(storeFactory.values()).find((items) => items.overrideBaseURL);\n let obuUrl: URI | undefined;\n if (obuItem && obuItem.overrideBaseURL) {\n obuUrl = URI.from(obuItem.overrideBaseURL);\n }\n const ret = ensureIsIndex(\n URI.from(optURL || obuUrl || dataDir(loader.sthis, loader.name, storeOpts.stores?.base)),\n storeOpts.isIndex,\n );\n // console.log(\"buildURL\", storeOpts.isIndex);\n return ret;\n}\n\ninterface GatewayReady {\n readonly gateway: Gateway;\n readonly test: TestGateway;\n}\nconst onceGateway = new KeyedResolvOnce<GatewayReady>();\nexport async function getGatewayFromURL(url: URI, sthis: SuperThis): Promise<GatewayReady | undefined> {\n return onceGateway.get(url.toString()).once(async () => {\n const item = storeFactory.get(url.protocol);\n if (item) {\n const ret = {\n gateway: await item.gateway(sthis),\n test: await item.test(sthis),\n };\n const res = await ret.gateway.start(url);\n if (res.isErr()) {\n sthis.logger.Error().Result(\"start\", res).Msg(\"start failed\");\n return undefined;\n }\n return ret;\n }\n sthis.logger.Warn().Url(url).Msg(\"unsupported protocol\");\n return undefined;\n });\n}\n\nexport function registerStoreProtocol(item: GatewayFactoryItem): () => void {\n let protocol = item.protocol;\n if (!protocol.endsWith(\":\")) {\n protocol += \":\";\n }\n if (storeFactory.has(protocol)) {\n if (!item.overrideBaseURL && storeFactory.get(protocol) !== item) {\n throw new Error(`we need a logger here`);\n // const logger = ensureLogger(sthis, \"registerStoreProtocol\", { protocol });\n // logger.Warn().Msg(`protocol ${protocol} already registered`);\n return () => {\n /* no-op */\n };\n }\n }\n // we need to clear the overrideBaseURL if it is set\n if (item.overrideBaseURL) {\n Array.from(storeFactory.values()).forEach((items) => {\n (\n items as {\n overrideBaseURL?: string;\n }\n ).overrideBaseURL = undefined;\n });\n }\n storeFactory.set(protocol, item);\n return () => {\n storeFactory.delete(protocol);\n };\n}\n\n// function runStoreFactory<T>(url: URI, logger: Logger, run: (item: StoreFactoryItem) => Promise<T>): Promise<T> {\n// // const store = url.getParam(\"store\");\n// // if (!store) {\n// // throw logger.Error().Url(url).Msg(\"store not found\").AsError();\n// // }\n// // const key = `${url.protocol}:${store}`;\n// const item = storeFactory.get(url.protocol);\n// if (!item) {\n// throw logger\n// .Error()\n// .Url(url.asURL())\n// .Str(\"protocol\", url.protocol)\n// .Any(\"keys\", Array(storeFactory.keys()))\n// .Msg(`unsupported protocol`)\n// .AsError();\n// }\n// logger.Debug().Str(\"protocol\", url.protocol).Msg(\"run\");\n// return run(item);\n// }\n\n// const onceLoadDataGateway = new KeyedResolvOnce<Gateway>();\n// function loadDataGateway(url: URI, logger: Logger) {\n// return onceLoadDataGateway.get(url.protocol).once(async () => {\n// return await getGatewayFromURL(url, logger).then((item) => {\n// if (!item) {\n// throw logger.Error().Url(url).Msg(\"unsupported protocol or store\").AsError();\n// }\n// return item;\n// });\n// })\n// }\n\n// const onceDataStoreFactory = new KeyedResolvOnce<DataStoreImpl>();\nasync function dataStoreFactory(loader: Loadable): Promise<DataStoreImpl> {\n const url = ensureName(loader.name, buildURL(loader.ebOpts.store.stores?.data, loader)).build().setParam(\"store\", \"data\").URI();\n const sthis = ensureSuperLog(loader.sthis, \"dataStoreFactory\", { url: url.toString() });\n // return onceDataStoreFactory.get(url.toString()).once(async () => {\n const gateway = await getGatewayFromURL(url, sthis);\n if (!gateway) {\n throw sthis.logger.Error().Url(url).Msg(\"gateway not found\").AsError();\n }\n const store = new DataStoreImpl(sthis, loader.name, url, {\n gateway: gateway.gateway,\n keybag: () =>\n getKeyBag(loader.sthis, {\n ...loader.ebOpts.keyBag,\n }),\n });\n return store;\n // });\n}\n\n// const onceLoadMetaGateway = new KeyedResolvOnce<Gateway>();\n// function loadMetaGateway(url: URI, logger: Logger) {\n// return onceLoadMetaGateway.get(url.protocol).once(async () => {\n// return await getGatewayFromURL(url, logger).then((item) => {\n// if (!item) {\n// throw logger.Error().Url(url).Msg(\"unsupported protocol or store\").AsError();\n// }\n// return item;\n// });\n// });\n// }\n\n// const onceMetaStoreFactory = new KeyedResolvOnce<MetaStoreImpl>();\nasync function metaStoreFactory(loader: Loadable): Promise<MetaStoreImpl> {\n const url = ensureName(loader.name, buildURL(loader.ebOpts.store.stores?.meta, loader)).build().setParam(\"store\", \"meta\").URI();\n const sthis = ensureSuperLog(loader.sthis, \"metaStoreFactory\", { url: () => url.toString() });\n // return onceMetaStoreFactory.get(url.toString()).once(async () => {\n sthis.logger.Debug().Str(\"protocol\", url.protocol).Msg(\"pre-protocol switch\");\n const gateway = await getGatewayFromURL(url, sthis);\n if (!gateway) {\n throw sthis.logger.Error().Url(url).Msg(\"gateway not found\").AsError();\n }\n const store = new MetaStoreImpl(loader.sthis, loader.name, url, {\n gateway: gateway.gateway,\n keybag: () =>\n getKeyBag(loader.sthis, {\n ...loader.ebOpts.keyBag,\n }),\n });\n // const ret = await store.start();\n // if (ret.isErr()) {\n // throw logger.Error().Result(\"start\", ret).Msg(\"start failed\").AsError();\n // }\n // logger.Debug().Url(ret.Ok(), \"prepared\").Msg(\"produced\");\n return store;\n // });\n}\n\n// const onceWalGateway = new KeyedResolvOnce<Gateway>();\n// function loadWalGateway(url: URI, logger: Logger) {\n// return onceWalGateway.get(url.protocol).once(async () => {\n// return await getGatewayFromURL(url, logger).then((item) => {\n// if (!item) {\n// throw logger.Error().Url(url).Msg(\"unsupported protocol or store\").AsError();\n// }\n// return item;\n// });\n// });\n// }\n\n// const onceRemoteWalFactory = new KeyedResolvOnce<WALStoreImpl>();\nasync function remoteWalFactory(loader: Loadable): Promise<WALStoreImpl> {\n const url = ensureName(loader.name, buildURL(loader.ebOpts.store.stores?.wal, loader)).build().setParam(\"store\", \"wal\").URI();\n const sthis = ensureSuperLog(loader.sthis, \"remoteWalFactory\", { url: url.toString() });\n // return onceRemoteWalFactory.get(url.toString()).once(async () => {\n const gateway = await getGatewayFromURL(url, sthis);\n if (!gateway) {\n throw sthis.logger.Error().Url(url).Msg(\"gateway not found\").AsError();\n }\n sthis.logger.Debug().Str(\"prepared\", url.toString()).Msg(\"produced\");\n const store = new WALStoreImpl(loader, url, {\n gateway: gateway.gateway,\n keybag: () =>\n getKeyBag(loader.sthis, {\n ...loader.ebOpts.keyBag,\n }),\n });\n // const ret = await store.start();\n // if (ret.isErr()) {\n // throw logger.Error().Result(\"start\", ret).Msg(\"start failed\").AsError();\n // }\n // logger.Debug().Url(ret.Ok(), \"prepared\").Msg(\"produced\");\n return store;\n // });\n}\n\nexport async function testStoreFactory(url: URI, sthis: SuperThis): Promise<TestGateway> {\n sthis = ensureSuperLog(sthis, \"testStoreFactory\");\n const gateway = await getGatewayFromURL(url, sthis);\n if (!gateway) {\n throw sthis.logger.Error().Url(url).Msg(\"gateway not found\").AsError();\n }\n return gateway.test;\n}\n\nexport async function ensureStart<T>(store: T & { start: () => Promise<Result<URI>> }, logger: Logger): Promise<T> {\n const ret = await store.start();\n if (ret.isErr()) {\n throw logger.Error().Result(\"start\", ret).Msg(\"start failed\").AsError();\n }\n logger.Debug().Url(ret.Ok(), \"prepared\").Msg(\"produced\");\n return store;\n}\n\nexport function toStoreRuntime(opts: StoreOpts, sthis: SuperThis): StoreRuntime {\n const logger = ensureLogger(sthis, \"toStoreRuntime\", {});\n return {\n makeMetaStore: async (loader: Loadable) => {\n logger\n .Debug()\n .Str(\"fromOpts\", \"\" + !!loader.ebOpts.store.makeMetaStore)\n .Msg(\"makeMetaStore\");\n return ensureStart(await (loader.ebOpts.store.makeMetaStore || metaStoreFactory)(loader), logger);\n },\n makeDataStore: async (loader: Loadable) => {\n logger\n .Debug()\n .Str(\"fromOpts\", \"\" + !!loader.ebOpts.store.makeDataStore)\n .Msg(\"makeDataStore\");\n return ensureStart(await (loader.ebOpts.store.makeDataStore || dataStoreFactory)(loader), logger);\n },\n makeWALStore: async (loader: Loadable) => {\n logger\n .Debug()\n .Str(\"fromOpts\", \"\" + !!loader.ebOpts.store.makeWALStore)\n .Msg(\"makeRemoteWAL\");\n return ensureStart(await (loader.ebOpts.store.makeWALStore || remoteWalFactory)(loader), logger);\n },\n\n encodeFile: opts.encodeFile || encodeFile,\n decodeFile: opts.decodeFile || decodeFile,\n };\n}\n\nregisterStoreProtocol({\n protocol: \"file:\",\n gateway: async (logger) => {\n const { FileGateway } = await import(\"../runtime/gateways/file/gateway.js\");\n return new FileGateway(logger);\n },\n test: async (logger) => {\n const { FileTestStore } = await import(\"../runtime/gateways/file/gateway.js\");\n return new FileTestStore(logger);\n },\n});\n\nregisterStoreProtocol({\n protocol: \"indexdb:\",\n gateway: async (logger) => {\n const { IndexDBGateway } = await import(\"../runtime/gateways/indexdb/gateway.js\");\n return new IndexDBGateway(logger);\n },\n test: async (logger) => {\n const { IndexDBTestStore } = await import(\"../runtime/gateways/indexdb/gateway.js\");\n return new IndexDBTestStore(logger);\n },\n});\n","import * as UnixFS from \"@ipld/unixfs\";\nimport * as raw from \"multiformats/codecs/raw\";\nimport { withMaxChunkSize } from \"@ipld/unixfs/file/chunker/fixed\";\nimport { withWidth } from \"@ipld/unixfs/file/layout/balanced\";\n\nimport type { View } from \"@ipld/unixfs\";\nimport { DocFileMeta } from \"../types.js\";\n\nimport { exporter, ReadableStorage } from \"ipfs-unixfs-exporter\";\nimport { BlobLike, AnyLink, AnyBlock } from \"../blockstore/index.js\";\n\nconst queuingStrategy = UnixFS.withCapacity();\n\nconst settings = UnixFS.configure({\n fileChunkEncoder: raw,\n smallFileEncoder: raw,\n chunker: withMaxChunkSize(1024 * 1024),\n fileLayout: withWidth(1024),\n});\n\nasync function collect<T>(collectable: ReadableStream<T>): Promise<T[]> {\n const chunks: T[] = [];\n await collectable.pipeTo(\n new WritableStream({\n write(chunk) {\n chunks.push(chunk);\n },\n }),\n );\n return chunks;\n}\n\nexport async function encodeFile(blob: BlobLike): Promise<{ cid: AnyLink; blocks: AnyBlock[] }> {\n const readable = createFileEncoderStream(blob);\n const blocks = await collect(readable);\n return { cid: blocks.at(-1).cid, blocks };\n}\n\nexport async function decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<File> {\n const entry = await exporter(cid.toString(), blocks as ReadableStorage, { length: meta.size });\n const chunks = [];\n for await (const chunk of entry.content()) {\n chunks.push(chunk);\n }\n return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });\n}\n\nfunction createFileEncoderStream(blob: BlobLike) {\n const { readable, writable } = new TransformStream({}, queuingStrategy);\n const unixfsWriter = UnixFS.createWriter({ writable, settings });\n const fileBuilder = new UnixFSFileBuilder(\"\", blob);\n void (async () => {\n await fileBuilder.finalize(unixfsWriter);\n await unixfsWriter.close();\n })();\n return readable;\n}\n\nclass UnixFSFileBuilder {\n #file;\n readonly name: string;\n constructor(name: string, file: BlobLike) {\n this.name = name;\n this.#file = file;\n }\n\n async finalize(writer: View) {\n const unixfsFileWriter = UnixFS.createFileWriter(writer);\n await this.#file.stream().pipeTo(\n new WritableStream({\n async write(chunk) {\n await unixfsFileWriter.write(chunk as Uint8Array);\n },\n }),\n );\n return await unixfsFileWriter.close();\n }\n}\n","import pLimit from \"p-limit\";\nimport { format, parse, ToString } from \"@ipld/dag-json\";\nimport { Logger, ResolveOnce, Result, URI } from \"@adviser/cement\";\n\nimport type {\n AnyBlock,\n AnyLink,\n CommitOpts,\n DataSaveOpts,\n DataStore,\n DbMeta,\n MetaStore,\n WALStore as WALStore,\n WALState,\n LoadHandler,\n KeyedCrypto,\n Loadable,\n} from \"./types.js\";\nimport { Falsy, StoreType, SuperThis, throwFalsy } from \"../types.js\";\nimport { Gateway } from \"./gateway.js\";\nimport { ensureLogger, exception2Result, isNotFoundError } from \"../utils.js\";\nimport { carLogIncludesGroup } from \"./loader.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport { keyedCryptoFactory } from \"../runtime/keyed-crypto.js\";\nimport { KeyBag } from \"../runtime/key-bag.js\";\nimport { FragmentGateway } from \"./fragment-gateway.js\";\n\nfunction guardVersion(url: URI): Result<URI> {\n if (!url.hasParam(\"version\")) {\n return Result.Err(`missing version: ${url.toString()}`);\n }\n return Result.Ok(url);\n}\n\nexport interface StoreOpts {\n readonly gateway: Gateway;\n readonly keybag: () => Promise<KeyBag>;\n}\n\nabstract class BaseStoreImpl {\n // should be injectable\n\n abstract readonly storeType: StoreType;\n readonly name: string;\n\n private _url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly gateway: FragmentGateway;\n readonly keybag: () => Promise<KeyBag>;\n constructor(name: string, url: URI, opts: StoreOpts, sthis: SuperThis, logger: Logger) {\n this.name = name;\n this._url = url;\n this.keybag = opts.keybag;\n this.sthis = sthis;\n this.logger = logger\n .With()\n .Ref(\"url\", () => this._url.toString())\n .Str(\"name\", name)\n .Logger();\n this.gateway = new FragmentGateway(this.sthis, opts.gateway);\n }\n\n url(): URI {\n return this._url;\n }\n\n readonly _onStarted: (() => void)[] = [];\n onStarted(fn: () => void) {\n this._onStarted.push(fn);\n }\n readonly _onClosed: (() => void)[] = [];\n onClosed(fn: () => void) {\n this._onClosed.push(fn);\n }\n abstract close(): Promise<Result<void>>;\n\n readonly ready?: () => Promise<void>;\n\n async keyedCrypto(): Promise<KeyedCrypto> {\n return keyedCryptoFactory(this._url, await this.keybag(), this.sthis);\n }\n\n async start(): Promise<Result<URI>> {\n this.logger.Debug().Str(\"storeType\", this.storeType).Msg(\"starting-gateway-pre\");\n this._url = this._url.build().setParam(\"store\", this.storeType).URI();\n const res = await this.gateway.start(this._url);\n if (res.isErr()) {\n this.logger.Error().Result(\"gw-start\", res).Msg(\"started-gateway\");\n return res as Result<URI>;\n }\n this._url = res.Ok();\n // add storekey to url\n const kb = await this.keybag();\n const skRes = await kb.ensureKeyFromUrl(this._url, () => {\n const idx = this._url.getParam(\"index\");\n const storeKeyName = [this.name];\n if (idx) {\n storeKeyName.push(idx);\n }\n storeKeyName.push(this.storeType);\n return storeKeyName.join(\":\");\n });\n if (skRes.isErr()) {\n return skRes as Result<URI>;\n }\n this._url = skRes.Ok();\n const version = guardVersion(this._url);\n if (version.isErr()) {\n this.logger.Error().Result(\"version\", version).Msg(\"guardVersion\");\n await this.close();\n return version;\n }\n if (this.ready) {\n const fn = this.ready.bind(this);\n const ready = await exception2Result(fn);\n if (ready.isErr()) {\n await this.close();\n return ready as Result<URI>;\n }\n }\n this._onStarted.forEach((fn) => fn());\n this.logger.Debug().Msg(\"started\");\n return version;\n }\n}\n\nexport class MetaStoreImpl extends BaseStoreImpl implements MetaStore {\n readonly storeType = \"meta\";\n readonly subscribers = new Map<string, LoadHandler[]>();\n\n constructor(sthis: SuperThis, name: string, url: URI, opts: StoreOpts) {\n // const my = new URL(url.toString());\n // my.searchParams.set(\"storekey\", 'insecure');\n super(\n name,\n url,\n {\n ...opts,\n },\n sthis,\n ensureLogger(sthis, \"MetaStoreImpl\"),\n );\n }\n\n onLoad(branch: string, loadHandler: LoadHandler): () => void {\n const subscribers = this.subscribers.get(branch) || [];\n subscribers.push(loadHandler);\n this.subscribers.set(branch, subscribers);\n return () => {\n const subscribers = this.subscribers.get(branch) || [];\n const idx = subscribers.indexOf(loadHandler);\n if (idx > -1) subscribers.splice(idx, 1);\n };\n }\n\n makeHeader({ cars }: DbMeta): ToString<DbMeta> {\n const toEncode: DbMeta = { cars };\n // if (key) toEncode.key = key;\n return format(toEncode);\n }\n\n parseHeader(headerData: ToString<DbMeta>): DbMeta {\n const got = parse<DbMeta>(headerData);\n return got;\n }\n\n async handleSubscribers(dbMetas: DbMeta[], branch: string) {\n try {\n const subscribers = this.subscribers.get(branch) || [];\n await Promise.all(subscribers.map((subscriber) => subscriber(dbMetas)));\n } catch (e) {\n this.logger.Error().Err(e).Msg(\"handleSubscribers\").AsError();\n }\n }\n\n async handleByteHeads(byteHeads: Uint8Array[], branch = \"main\") {\n let dbMetas: DbMeta[];\n try {\n dbMetas = this.dbMetasForByteHeads(byteHeads);\n } catch (e) {\n throw this.logger.Error().Err(e).Msg(\"parseHeader\").AsError();\n }\n await this.handleSubscribers(dbMetas, branch);\n return dbMetas;\n }\n dbMetasForByteHeads(byteHeads: Uint8Array[]) {\n return byteHeads.map((bytes) => {\n const txt = this.sthis.txt.decode(bytes);\n return this.parseHeader(txt);\n });\n }\n\n async load(branch?: string): Promise<DbMeta[] | Falsy> {\n branch = branch || \"main\";\n this.logger.Debug().Str(\"branch\", branch).Msg(\"loading\");\n const url = await this.gateway.buildUrl(this.url(), branch);\n if (url.isErr()) {\n throw this.logger.Error().Result(\"buidUrl\", url).Str(\"branch\", branch).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const bytes = await this.gateway.get(url.Ok());\n if (bytes.isErr()) {\n if (isNotFoundError(bytes)) {\n return undefined;\n }\n throw this.logger.Error().Url(url.Ok()).Result(\"bytes:\", bytes).Msg(\"gateway get\").AsError();\n }\n return this.handleByteHeads([bytes.Ok()], branch);\n }\n\n async save(meta: DbMeta, branch?: string): Promise<Result<void>> {\n branch = branch || \"main\";\n this.logger.Debug().Str(\"branch\", branch).Any(\"meta\", meta).Msg(\"saving meta\");\n const bytes = this.makeHeader(meta);\n const url = await this.gateway.buildUrl(this.url(), branch);\n if (url.isErr()) {\n throw this.logger.Error().Err(url.Err()).Str(\"branch\", branch).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const res = await this.gateway.put(url.Ok(), this.sthis.txt.encode(bytes));\n if (res.isErr()) {\n throw this.logger.Error().Err(res.Err()).Msg(\"got error from gateway.put\").AsError();\n }\n await this.handleSubscribers([meta], branch);\n return res;\n }\n\n async close(): Promise<Result<void>> {\n await this.gateway.close(this.url());\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n async destroy(): Promise<Result<void>> {\n return this.gateway.destroy(this.url());\n }\n}\n\nexport class DataStoreImpl extends BaseStoreImpl implements DataStore {\n readonly storeType = \"data\";\n // readonly tag: string = \"car-base\";\n\n constructor(sthis: SuperThis, name: string, url: URI, opts: StoreOpts) {\n super(\n name,\n url,\n {\n ...opts,\n },\n sthis,\n ensureLogger(sthis, \"DataStoreImpl\"),\n );\n }\n\n async load(cid: AnyLink): Promise<AnyBlock> {\n this.logger.Debug().Any(\"cid\", cid).Msg(\"loading\");\n const url = await this.gateway.buildUrl(this.url(), cid.toString());\n if (url.isErr()) {\n throw this.logger.Error().Err(url.Err()).Str(\"cid\", cid.toString()).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const res = await this.gateway.get(url.Ok());\n if (res.isErr()) {\n throw res.Err();\n }\n return { cid, bytes: res.Ok() };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async save(car: AnyBlock, opts?: DataSaveOpts): Promise</*AnyLink | */ void> {\n this.logger.Debug().Any(\"cid\", car.cid.toString()).Msg(\"saving\");\n const url = await this.gateway.buildUrl(this.url(), car.cid.toString());\n if (url.isErr()) {\n throw this.logger.Error().Err(url.Err()).Ref(\"cid\", car.cid).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const res = await this.gateway.put(url.Ok(), car.bytes);\n if (res.isErr()) {\n throw this.logger.Error().Err(res.Err()).Msg(\"got error from gateway.put\").AsError();\n }\n return res.Ok();\n }\n async remove(cid: AnyLink): Promise<Result<void>> {\n const url = await this.gateway.buildUrl(this.url(), cid.toString());\n if (url.isErr()) {\n return url;\n }\n return this.gateway.delete(url.Ok());\n }\n async close(): Promise<Result<void>> {\n await this.gateway.close(this.url());\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n destroy(): Promise<Result<void>> {\n return this.gateway.destroy(this.url());\n }\n}\n\nexport class WALStoreImpl extends BaseStoreImpl implements WALStore {\n readonly storeType = \"wal\";\n // readonly tag: string = \"rwal-base\";\n\n readonly loader: Loadable;\n\n readonly _ready = new ResolveOnce<void>();\n\n walState: WALState = { operations: [], noLoaderOps: [], fileOperations: [] };\n readonly processing: Promise<void> | undefined = undefined;\n readonly processQueue: CommitQueue<void> = new CommitQueue<void>();\n\n constructor(loader: Loadable, url: URI, opts: StoreOpts) {\n // const my = new URL(url.toString());\n // my.searchParams.set(\"storekey\", 'insecure');\n super(\n loader.name,\n url,\n {\n ...opts,\n },\n loader.sthis,\n ensureLogger(loader.sthis, \"WALStoreImpl\"),\n );\n this.loader = loader;\n }\n\n ready = async () => {\n return this._ready.once(async () => {\n const walState = await this.load().catch((e) => {\n this.logger.Error().Any(\"error\", e).Msg(\"error loading wal\");\n return undefined;\n });\n if (!walState) {\n this.walState.operations = [];\n this.walState.fileOperations = [];\n } else {\n this.walState.operations = walState.operations || [];\n this.walState.fileOperations = walState.fileOperations || [];\n }\n });\n };\n\n async enqueue(dbMeta: DbMeta, opts: CommitOpts) {\n await this.ready();\n if (opts.noLoader) {\n this.walState.noLoaderOps.push(dbMeta);\n } else {\n this.walState.operations.push(dbMeta);\n }\n await this.save(this.walState);\n void this.process();\n }\n\n async enqueueFile(fileCid: AnyLink, publicFile = false) {\n await this.ready();\n this.walState.fileOperations.push({ cid: fileCid, public: publicFile });\n // await this.save(this.walState)\n }\n\n async process() {\n await this.ready();\n if (!this.loader.remoteCarStore) return;\n await this.processQueue.enqueue(async () => {\n try {\n await this._doProcess();\n } catch (e) {\n this.logger.Error().Any(\"error\", e).Msg(\"error processing wal\");\n }\n if (this.walState.operations.length || this.walState.fileOperations.length || this.walState.noLoaderOps.length) {\n setTimeout(() => void this.process(), 0);\n }\n });\n }\n\n async _doProcess() {\n if (!this.loader.remoteCarStore) return;\n const rmlp = (async () => {\n const operations = [...this.walState.operations];\n const fileOperations = [...this.walState.fileOperations];\n const uploads: Promise<void>[] = [];\n const noLoaderOps = [...this.walState.noLoaderOps];\n const limit = pLimit(5);\n\n if (operations.length + fileOperations.length + noLoaderOps.length === 0) return;\n\n for (const dbMeta of noLoaderOps) {\n const uploadP = limit(async () => {\n for (const cid of dbMeta.cars) {\n const car = await (await this.loader.carStore()).load(cid);\n if (!car) {\n if (carLogIncludesGroup(this.loader.carLog, dbMeta.cars))\n throw this.logger.Error().Ref(\"cid\", cid).Msg(\"missing local car\").AsError();\n } else {\n await throwFalsy(this.loader.remoteCarStore).save(car);\n }\n this.walState.noLoaderOps = this.walState.noLoaderOps.filter((op) => op !== dbMeta);\n }\n });\n uploads.push(uploadP);\n }\n\n for (const dbMeta of operations) {\n const uploadP = limit(async () => {\n for (const cid of dbMeta.cars) {\n const car = await (await this.loader.carStore()).load(cid).catch(() => null);\n if (!car) {\n if (carLogIncludesGroup(this.loader.carLog, dbMeta.cars))\n throw this.logger.Error().Ref(\"cid\", cid).Msg(`missing local car`).AsError();\n } else {\n await throwFalsy(this.loader.remoteCarStore).save(car);\n }\n }\n this.walState.operations = this.walState.operations.filter((op) => op !== dbMeta);\n });\n uploads.push(uploadP);\n }\n\n if (fileOperations.length) {\n const dbLoader = this.loader;\n for (const { cid: fileCid, public: publicFile } of fileOperations) {\n const uploadP = limit(async () => {\n const fileBlock = await (await dbLoader.fileStore()).load(fileCid); // .catch(() => false)\n await dbLoader.remoteFileStore?.save(fileBlock, { public: publicFile });\n this.walState.fileOperations = this.walState.fileOperations.filter((op) => op.cid !== fileCid);\n });\n uploads.push(uploadP);\n }\n }\n\n try {\n const res = await Promise.allSettled(uploads);\n const errors = res.filter((r) => r.status === \"rejected\") as PromiseRejectedResult[];\n if (errors.length) {\n throw this.logger.Error().Any(\"errors\", errors).Msg(\"error uploading\").AsError();\n }\n if (operations.length) {\n const lastOp = operations[operations.length - 1];\n // console.log('saving remote meta', lastOp.car.toString())\n await this.loader.remoteMetaStore?.save(lastOp).catch((e: Error) => {\n this.walState.operations.push(lastOp);\n throw this.logger.Error().Any(\"error\", e).Msg(\"error saving remote meta\").AsError();\n });\n }\n } finally {\n await this.save(this.walState);\n }\n })();\n // this.loader.remoteMetaLoading = rmlp;\n await rmlp;\n }\n\n async load(): Promise<WALState | Falsy> {\n this.logger.Debug().Msg(\"loading\");\n const filepath = await this.gateway.buildUrl(this.url(), \"main\");\n if (filepath.isErr()) {\n throw this.logger.Error().Err(filepath.Err()).Url(this.url()).Msg(\"error building url\").AsError();\n }\n const bytes = await this.gateway.get(filepath.Ok());\n if (bytes.isErr()) {\n if (isNotFoundError(bytes)) {\n return undefined;\n }\n throw this.logger.Error().Err(bytes.Err()).Msg(\"error get\").AsError();\n }\n try {\n return bytes && parse<WALState>(this.sthis.txt.decode(bytes.Ok()));\n } catch (e) {\n throw this.logger.Error().Err(e).Msg(\"error parse\").AsError();\n }\n }\n\n async save(state: WALState) {\n const filepath = await this.gateway.buildUrl(this.url(), \"main\");\n if (filepath.isErr()) {\n throw this.logger.Error().Err(filepath.Err()).Url(this.url()).Msg(\"error building url\").AsError();\n }\n let encoded: ToString<WALState>;\n try {\n encoded = format(state);\n } catch (e) {\n throw this.logger.Error().Err(e).Any(\"state\", state).Msg(\"error format\").AsError();\n }\n const res = await this.gateway.put(filepath.Ok(), this.sthis.txt.encode(encoded));\n if (res.isErr()) {\n throw this.logger.Error().Err(res.Err()).Str(\"filePath\", filepath.Ok().toString()).Msg(\"error saving\").AsError();\n }\n }\n\n async close() {\n await this.gateway.close(this.url());\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n\n destroy() {\n return this.gateway.destroy(this.url());\n }\n}\n","import type { EventLink } from \"@web3-storage/pail/clock/api\";\nimport type { Operation } from \"@web3-storage/pail/crdt/api\";\n\nimport type { DbMeta, StoreOpts, AnyLink } from \"./blockstore/index.js\";\nimport { EnvFactoryOpts, Env, Logger, CryptoRuntime } from \"@adviser/cement\";\n\nimport type { MakeDirectoryOptions, PathLike, Stats } from \"fs\";\n\nexport type Falsy = false | null | undefined;\n\nexport function isFalsy(value: unknown): value is Falsy {\n return value === false && value === null && value === undefined;\n}\n\nexport function throwFalsy<T>(value: T | Falsy): T {\n if (isFalsy(value)) {\n throw new Error(\"value is Falsy\");\n }\n return value;\n}\n\nexport function falsyToUndef<T>(value: T | Falsy): T | undefined {\n if (isFalsy(value)) {\n return undefined;\n }\n return value;\n}\n\nexport type StoreType = \"data\" | \"wal\" | \"meta\";\n\nexport interface SysFileSystem {\n start(): Promise<SysFileSystem>;\n mkdir(path: PathLike, options?: { recursive: boolean }): Promise<string | undefined>;\n readdir(path: PathLike, options?: unknown): Promise<string[]>;\n rm(path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }): Promise<void>;\n copyFile(source: PathLike, destination: PathLike): Promise<void>;\n readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }): Promise<Uint8Array>;\n stat(path: PathLike): Promise<Stats>;\n unlink(path: PathLike): Promise<void>;\n writefile(path: PathLike, data: Uint8Array | string): Promise<void>;\n}\n\nexport interface PathOps {\n join(...args: string[]): string;\n dirname(path: string): string;\n // homedir(): string;\n}\n\n// export interface Sys {\n// // fs: SysFileSystem;\n// fsHelper: PathOps;\n// }\nexport interface TextEndeCoder {\n encode(input: string): Uint8Array;\n decode(input: Uint8Array): string;\n}\nexport interface SuperThisOpts {\n // readonly crypto?: CryptoRuntime;\n readonly logger: Logger;\n readonly pathOps: PathOps;\n readonly crypto: CryptoRuntime;\n readonly env: EnvFactoryOpts;\n readonly txt: TextEndeCoder;\n readonly ctx: Record<string, unknown>;\n}\n\nexport interface SuperThis {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n nextId(bytes?: number): { str: string; bin: Uint8Array };\n start(): Promise<void>;\n clone(override: Partial<SuperThisOpts>): SuperThis;\n}\n\nexport interface ConfigOpts extends Partial<SuperThisOpts> {\n readonly public?: boolean;\n readonly meta?: DbMeta;\n readonly persistIndexes?: boolean;\n readonly autoCompact?: number;\n readonly store?: StoreOpts;\n readonly threshold?: number;\n}\n\nexport type ClockLink = EventLink<Operation>;\n\nexport type ClockHead = ClockLink[];\n\nexport type DocFragment = Uint8Array | string | number | boolean | null | AnyLink | DocFragment[] | object;\n// | { [key: string]: DocFragment };\n\nexport type DocLiteral = string | number | boolean | Uint8Array | unknown;\n\nexport type DocObject = NonNullable<unknown>;\nexport type DocTypes = DocObject;\n\nexport type DocRecord<T extends DocObject> = T;\n\nexport type UnknownDoc = DocRecord<never>;\n\nexport type DocFiles = Record<string, DocFileMeta | File>;\n\nexport interface DocBase {\n readonly _id: string;\n readonly _files?: DocFiles;\n readonly _publicFiles?: DocFiles;\n readonly _deleted?: boolean;\n}\n\nexport type DocWithId<T extends DocTypes> = DocBase & T;\n\nexport type DocSet<T extends DocTypes> = Partial<DocBase> & T;\n\nexport interface DocFileMeta {\n readonly type: string;\n readonly size: number;\n readonly cid: AnyLink;\n readonly car?: AnyLink;\n url?: string;\n file?: () => Promise<File>;\n}\n\nexport interface DocUpdate<T extends DocTypes> {\n readonly id: string;\n readonly value?: DocSet<T>;\n readonly del?: boolean;\n readonly clock?: ClockLink; // would be useful to give ClockLinks a type\n}\n\n// todo merge into above\nexport interface DocValue<T extends DocTypes> {\n readonly doc: DocWithId<T>;\n readonly del: boolean;\n readonly cid: AnyLink;\n}\n\nexport type KeyLiteral = string | number | boolean;\nexport type IndexKeyType = KeyLiteral | KeyLiteral[];\nexport type IndexKey<K extends IndexKeyType> = [K, string];\n\nexport interface IndexUpdate<K extends IndexKeyType> {\n readonly key: IndexKey<K>;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\nexport interface IndexUpdateString {\n readonly key: string;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\n// export interface IndexRowObject<K extends IndexKeyType, T extends DocObject> {\n// readonly id: string;\n// readonly key: K;\n// readonly value: T\n// // readonly row: T // DocFragment;\n// // readonly doc?: DocWithId<T>;\n// // value?: T;\n// // readonly del?: boolean;\n// }\n\n// export interface IndexRowLiteral<K extends IndexKeyType, T extends DocLiteral> {\n// readonly id: string;\n// readonly key: IndexKey<K>;\n// readonly value: T\n// }\n\n// export type IndexRow<K extends IndexKeyType, T extends DocTypes> =\n// T extends DocLiteral ? IndexRowLiteral<K, T> : IndexRowObject<K, T>\n\nexport interface IndexRow<K extends IndexKeyType, T extends DocObject, R extends DocFragment> {\n readonly id: string;\n readonly key: K; // IndexKey<K>;\n readonly value: R;\n readonly doc?: DocWithId<T>;\n}\n\nexport interface IndexRows<K extends IndexKeyType, T extends DocObject, R extends DocFragment = T> {\n readonly rows: IndexRow<K, T, R>[];\n}\nexport interface CRDTMeta {\n readonly head: ClockHead;\n}\n\nexport interface IndexTransactionMeta {\n readonly indexes: Record<string, IdxMeta>;\n}\n\nexport interface FileTransactionMeta {\n readonly files?: AnyLink[];\n}\n\nexport type MetaType = CRDTMeta | IndexTransactionMeta | FileTransactionMeta;\n\nexport interface IdxMeta {\n readonly byId: AnyLink;\n readonly byKey: AnyLink;\n readonly map: string;\n readonly name: string;\n readonly head: ClockHead;\n}\n\nexport interface IdxMetaMap {\n readonly indexes?: Map<string, IdxMeta>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface QueryOpts<K extends IndexKeyType> {\n readonly descending?: boolean;\n readonly limit?: number;\n includeDocs?: boolean;\n readonly range?: [IndexKeyType, IndexKeyType];\n readonly key?: DocFragment;\n readonly keys?: DocFragment[];\n prefix?: IndexKeyType;\n}\n\nexport interface AllDocsQueryOpts extends QueryOpts<string> {\n readonly key?: string;\n readonly keys?: string[];\n prefix?: string;\n}\n\nexport interface AllDocsResponse<T extends DocTypes> {\n readonly rows: {\n readonly key: string;\n readonly value: DocWithId<T>;\n }[];\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\ntype EmitFn = (k: IndexKeyType, v?: DocFragment) => void;\nexport type MapFn<T extends DocTypes> = (doc: DocWithId<T>, emit: EmitFn) => DocFragment | unknown;\n\nexport interface ChangesOptions {\n readonly dirty?: boolean;\n readonly limit?: number;\n}\n\nexport interface ChangesResponseRow<T extends DocTypes> {\n readonly key: string;\n readonly value: DocWithId<T>;\n readonly clock?: ClockLink;\n}\n\nexport interface ChangesResponse<T extends DocTypes> {\n readonly clock: ClockHead;\n readonly rows: ChangesResponseRow<T>[];\n readonly name?: string;\n}\n\nexport interface DocResponse {\n readonly id: string;\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\nexport type UpdateListenerFn<T extends DocTypes> = (docs: DocWithId<T>[]) => Promise<void> | void;\nexport type NoUpdateListenerFn = () => Promise<void> | void;\nexport type ListenerFn<T extends DocTypes> = UpdateListenerFn<T> | NoUpdateListenerFn;\n","import pLimit from \"p-limit\";\nimport { CarReader } from \"@ipld/car\";\nimport { Logger, ResolveOnce } from \"@adviser/cement\";\n// import { uuidv4 } from \"uuidv7\";\n\nimport {\n type AnyBlock,\n type AnyLink,\n type CarHeader,\n type CommitOpts,\n type DbMeta,\n type TransactionMeta,\n type CarGroup,\n type CarLog,\n DataStore,\n WALStore,\n // RemoteMetaStore,\n MetaStore,\n BaseStore,\n type Loadable,\n BlockstoreRuntime,\n BlockstoreOpts,\n} from \"./types.js\";\n\nimport { parseCarFile } from \"./loader-helpers.js\";\n\nimport { CarTransaction, defaultedBlockstoreRuntime } from \"./transaction.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport type { Falsy, SuperThis } from \"../types.js\";\nimport { getKeyBag } from \"../runtime/key-bag.js\";\nimport { commit, commitFiles, CommitParams } from \"./commitor.js\";\nimport { decode } from \"../runtime/wait-pr-multiformats/block.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\n\nexport function carLogIncludesGroup(list: CarLog, cids: CarGroup) {\n return list.some((arr: CarGroup) => {\n return arr.toString() === cids.toString();\n });\n}\n\n// this works for car groups because toString looks like bafy,bafy\nfunction uniqueCids(list: CarLog, remove = new Set<string>()): CarLog {\n const byString = new Map<string, CarGroup>();\n for (const cid of list) {\n if (remove.has(cid.toString())) continue;\n byString.set(cid.toString(), cid);\n }\n return [...byString.values()];\n}\n\n// export interface DecoderAndCarReader extends CarReader {\n// readonly decoder: BlockDecoder<number, Uint8Array>;\n// }\n\nexport class Loader implements Loadable {\n readonly name: string;\n readonly ebOpts: BlockstoreRuntime;\n readonly commitQueue: CommitQueue<CarGroup> = new CommitQueue<CarGroup>();\n readonly isCompacting = false;\n readonly carReaders = new Map<string, Promise<CarReader>>();\n readonly seenCompacted = new Set<string>();\n readonly processedCars = new Set<string>();\n readonly sthis: SuperThis;\n\n carLog: CarLog = [];\n // key?: string;\n // keyId?: string;\n // remoteMetaStore?: RemoteMetaStore;\n remoteCarStore?: DataStore;\n remoteFileStore?: DataStore;\n\n private getBlockCache = new Map<string, AnyBlock>();\n private seenMeta = new Set<string>();\n private writeLimit = pLimit(1);\n\n // readonly id = uuidv4();\n\n async keyBag() {\n return getKeyBag(this.sthis, this.ebOpts.keyBag);\n }\n\n async carStore(): Promise<DataStore> {\n return this.ebOpts.storeRuntime.makeDataStore(this);\n }\n\n async fileStore(): Promise<DataStore> {\n return this.ebOpts.storeRuntime.makeDataStore(this);\n }\n async WALStore(): Promise<WALStore> {\n return this.ebOpts.storeRuntime.makeWALStore(this);\n }\n\n async metaStore(): Promise<MetaStore> {\n return this.ebOpts.storeRuntime.makeMetaStore(this);\n }\n\n readonly onceReady = new ResolveOnce<void>();\n async ready(): Promise<void> {\n return this.onceReady.once(async () => {\n const metas = this.ebOpts.meta ? [this.ebOpts.meta] : await (await this.metaStore()).load(\"main\");\n if (metas) {\n await this.handleDbMetasFromStore(metas);\n }\n });\n }\n\n async close() {\n const toClose = await Promise.all([this.carStore(), this.metaStore(), this.fileStore(), this.WALStore()]);\n await Promise.all(toClose.map((store) => store.close()));\n }\n\n async destroy() {\n const toDestroy = await Promise.all([this.carStore(), this.metaStore(), this.fileStore(), this.WALStore()]);\n await Promise.all(toDestroy.map((store) => store.destroy()));\n }\n\n readonly logger: Logger;\n constructor(name: string, ebOpts: BlockstoreOpts, sthis: SuperThis) {\n this.name = name;\n // console.log(\"Loader\", name, ebOpts)\n this.sthis = sthis;\n this.ebOpts = defaultedBlockstoreRuntime(\n sthis,\n {\n ...ebOpts,\n name,\n },\n \"Loader\",\n );\n this.logger = this.ebOpts.logger;\n }\n\n // async snapToCar(carCid: AnyLink | string) {\n // await this.ready\n // if (typeof carCid === 'string') {\n // carCid = CID.parse(carCid)\n // }\n // const carHeader = await this.loadCarHeaderFromMeta({ car: carCid, key: this.key || null })\n // this.carLog = [carCid, ...carHeader.cars]\n // await this.getMoreReaders(carHeader.cars)\n // await this._applyCarHeader(carHeader, true)\n // }\n\n async handleDbMetasFromStore(metas: DbMeta[]): Promise<void> {\n this.logger.Debug().Any(\"metas\", metas).Msg(\"handleDbMetasFromStore\");\n for (const meta of metas) {\n await this.writeLimit(async () => {\n await this.mergeDbMetaIntoClock(meta);\n });\n }\n }\n\n async mergeDbMetaIntoClock(meta: DbMeta): Promise<void> {\n if (this.isCompacting) {\n throw this.logger.Error().Msg(\"cannot merge while compacting\").AsError();\n }\n\n if (this.seenMeta.has(meta.cars.toString())) return;\n this.seenMeta.add(meta.cars.toString());\n\n // if (meta.key) {\n // await this.setKey(meta.key);\n // }\n if (carLogIncludesGroup(this.carLog, meta.cars)) {\n return;\n }\n const carHeader = await this.loadCarHeaderFromMeta<TransactionMeta>(meta);\n // fetch other cars down the compact log?\n // todo we should use a CID set for the compacted cids (how to expire?)\n // console.log('merge carHeader', carHeader.head.length, carHeader.head.toString(), meta.car.toString())\n carHeader.compact.map((c) => c.toString()).forEach(this.seenCompacted.add, this.seenCompacted);\n await this.getMoreReaders(carHeader.cars.flat());\n this.carLog = [...uniqueCids([meta.cars, ...this.carLog, ...carHeader.cars], this.seenCompacted)];\n await this.ebOpts.applyMeta?.(carHeader.meta);\n }\n\n // protected async ingestKeyFromMeta(meta: DbMeta): Promise<void> {\n // const { key } = meta;\n // if (key) {\n // await this.setKey(key);\n // }\n // }\n\n async loadCarHeaderFromMeta<T>({ cars: cids }: DbMeta): Promise<CarHeader<T>> {\n //Call loadCar for every cid\n const reader = await this.loadCar(cids[0]);\n return await parseCarFile(reader, this.logger);\n }\n\n // async _getKey(): Promise<string | undefined> {\n // if (this.key) return this.key;\n // // generate a random key\n // if (!this.ebOpts.public) {\n // await this.setKey(toHexString(this.ebOpts.crypto.randomBytes(32)));\n // }\n // return this.key || undefined;\n // }\n\n async commitFiles(\n t: CarTransaction,\n done: TransactionMeta,\n // opts: CommitOpts = { noLoader: false, compact: false },\n ): Promise<CarGroup> {\n await this.ready();\n const fstore = await this.fileStore();\n const wstore = await this.WALStore();\n return this.commitQueue.enqueue(() => commitFiles(fstore, wstore, t, done));\n }\n\n async loadFileCar(cid: AnyLink /*, isPublic = false*/): Promise<CarReader> {\n return await this.storesLoadCar(cid, await this.fileStore(), this.remoteFileStore);\n }\n\n async commit<T = TransactionMeta>(\n t: CarTransaction,\n done: T,\n opts: CommitOpts = { noLoader: false, compact: false },\n ): Promise<CarGroup> {\n await this.ready();\n const fstore = await this.fileStore();\n const params: CommitParams = {\n encoder: (await fstore.keyedCrypto()).codec(),\n carLog: this.carLog,\n carStore: fstore,\n WALStore: await this.WALStore(),\n metaStore: await this.metaStore(),\n };\n return this.commitQueue.enqueue(async () => {\n await this.cacheTransaction(t);\n const ret = await commit(params, t, done, opts);\n await this.updateCarLog(ret.cgrp, ret.header, !!opts.compact);\n return ret.cgrp;\n });\n }\n\n async updateCarLog<T>(cids: CarGroup, fp: CarHeader<T>, compact: boolean): Promise<void> {\n if (compact) {\n const previousCompactCid = fp.compact[fp.compact.length - 1];\n fp.compact.map((c) => c.toString()).forEach(this.seenCompacted.add, this.seenCompacted);\n this.carLog = [...uniqueCids([...this.carLog, ...fp.cars, cids], this.seenCompacted)];\n await this.removeCidsForCompact(previousCompactCid[0]).catch((e) => e);\n } else {\n this.carLog.unshift(cids);\n }\n }\n\n async cacheTransaction(t: CarTransaction) {\n for await (const block of t.entries()) {\n const sBlock = block.cid.toString();\n if (!this.getBlockCache.has(sBlock)) {\n this.getBlockCache.set(sBlock, block);\n }\n }\n }\n\n async cacheCarReader(carCidStr: string, reader: CarReader) {\n if (this.processedCars.has(carCidStr)) return;\n this.processedCars.add(carCidStr);\n for await (const block of reader.blocks()) {\n const sBlock = block.cid.toString();\n if (!this.getBlockCache.has(sBlock)) {\n this.getBlockCache.set(sBlock, block);\n }\n }\n }\n\n async removeCidsForCompact(cid: AnyLink) {\n const carHeader = await this.loadCarHeaderFromMeta({\n cars: [cid],\n } as unknown as DbMeta);\n for (const cids of carHeader.compact) {\n for (const cid of cids) {\n await (await this.carStore()).remove(cid);\n }\n }\n }\n\n // async flushCars() {\n // await this.ready\n // // for each cid in car log, make a dbMeta\n // for (const cid of this.carLog) {\n // const dbMeta = { car: cid, key: this.key || null } as DbMeta\n // await this.remoteWAL!.enqueue(dbMeta, { public: false })\n // }\n // }\n\n async *entries(cache = true): AsyncIterableIterator<AnyBlock> {\n await this.ready();\n if (cache) {\n for (const [, block] of this.getBlockCache) {\n yield block;\n }\n } else {\n for (const [, block] of this.getBlockCache) {\n yield block;\n }\n for (const cids of this.carLog) {\n for (const cid of cids) {\n const reader = await this.loadCar(cid);\n if (!reader) throw this.logger.Error().Ref(\"cid\", cid).Msg(\"missing car reader\").AsError();\n for await (const block of reader.blocks()) {\n const sCid = block.cid.toString();\n if (!this.getBlockCache.has(sCid)) {\n yield block;\n }\n }\n }\n }\n }\n }\n\n async getBlock(cid: AnyLink): Promise<AnyBlock | Falsy> {\n await this.ready();\n const sCid = cid.toString();\n if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n\n const getCarCid = async (carCid: AnyLink) => {\n if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n const reader = await this.loadCar(carCid);\n if (!reader) {\n throw this.logger.Error().Ref(\"cid\", carCid).Msg(\"missing car reader\").AsError();\n }\n await this.cacheCarReader(carCid.toString(), reader).catch(() => {\n return;\n });\n if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n throw this.logger.Error().Str(\"cid\", sCid).Msg(\"block not in reader\").AsError();\n };\n\n const getCompactCarCids = async (carCid: AnyLink) => {\n // console.log(\"getCompactCarCids\", carCid.toString())\n\n const reader = await this.loadCar(carCid);\n if (!reader) {\n throw this.logger.Error().Str(\"cid\", carCid.toString()).Msg(\"missing car reader\").AsError();\n }\n\n const header = await parseCarFile(reader, this.logger);\n\n const compacts = header.compact;\n\n let got: AnyBlock | undefined;\n const batchSize = 5;\n for (let i = 0; i < compacts.length; i += batchSize) {\n const promises: Promise<AnyBlock | undefined>[] = [];\n for (let j = i; j < Math.min(i + batchSize, compacts.length); j++) {\n for (const cid of compacts[j]) {\n promises.push(getCarCid(cid));\n }\n }\n try {\n got = await Promise.any(promises);\n } catch {\n // Ignore the error and continue with the next iteration\n }\n if (got) break;\n }\n\n if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n throw this.logger.Error().Str(\"cid\", sCid).Msg(\"block not in compact reader\").AsError();\n };\n\n let got;\n const batchSize = 5;\n for (let i = 0; i < this.carLog.length; i += batchSize) {\n const batch = this.carLog.slice(i, i + batchSize);\n const promises: Promise<AnyBlock | undefined>[] = batch.flatMap((slice) => slice.map(getCarCid));\n try {\n got = await Promise.any(promises);\n } catch {\n // Ignore the error and continue with the next iteration\n }\n if (got) break;\n }\n\n if (!got) {\n try {\n got = await getCompactCarCids(this.carLog[this.carLog.length - 1][0]);\n } catch {\n // Ignore the error and continue with the next iteration\n }\n }\n\n return got;\n }\n\n async loadCar(cid: AnyLink): Promise<CarReader> {\n if (!this.carStore) {\n throw this.logger.Error().Msg(\"car store not initialized\").AsError();\n }\n const loaded = await this.storesLoadCar(cid, await this.carStore(), this.remoteCarStore);\n return loaded;\n }\n\n async makeDecoderAndCarReader(cid: AnyLink, local: DataStore, remote?: DataStore) {\n const cidsString = cid.toString();\n let loadedCar: AnyBlock | undefined = undefined;\n let activeStore: BaseStore = local;\n try {\n //loadedCar now is an array of AnyBlocks\n this.logger.Debug().Str(\"cid\", cidsString).Msg(\"loading car\");\n loadedCar = await local.load(cid);\n this.logger.Debug().Bool(\"loadedCar\", loadedCar).Msg(\"loaded\");\n } catch (e) {\n if (remote) {\n const remoteCar = await remote.load(cid);\n if (remoteCar) {\n // todo test for this\n this.logger.Debug().Ref(\"cid\", remoteCar.cid).Msg(\"saving remote car locally\");\n await local.save(remoteCar);\n loadedCar = remoteCar;\n activeStore = remote;\n }\n } else {\n this.logger.Error().Str(\"cid\", cidsString).Err(e).Msg(\"loading car\");\n }\n }\n if (!loadedCar) {\n throw this.logger.Error().Url(local.url()).Str(\"cid\", cidsString).Msg(\"missing car files\").AsError();\n }\n //This needs a fix as well as the fromBytes function expects a Uint8Array\n //Either we can merge the bytes or return an array of rawReaders\n const bytes = await decode({ bytes: loadedCar.bytes, hasher, codec: (await activeStore.keyedCrypto()).codec() }); // as Uint8Array,\n const rawReader = await CarReader.fromBytes(bytes.value);\n const readerP = Promise.resolve(rawReader);\n // const kc = await activeStore.keyedCrypto()\n // const readerP = !kc.isEncrypting ? Promise.resolve(rawReader) : this.ensureDecryptedReader(activeStore, rawReader);\n\n const cachedReaderP = readerP.then(async (reader) => {\n await this.cacheCarReader(cidsString, reader).catch((e) => {\n this.logger.Error().Err(e).Str(\"cid\", cidsString).Msg(\"error caching car reader\");\n return;\n });\n return reader;\n });\n this.carReaders.set(cidsString, cachedReaderP);\n return readerP;\n }\n\n //What if instead it returns an Array of CarHeader\n protected async storesLoadCar(cid: AnyLink, local: DataStore, remote?: DataStore): Promise<CarReader> {\n const cidsString = cid.toString();\n let dacr = this.carReaders.get(cidsString);\n if (!dacr) {\n dacr = this.makeDecoderAndCarReader(cid, local, remote);\n this.carReaders.set(cidsString, dacr);\n }\n return dacr;\n }\n\n protected async getMoreReaders(cids: AnyLink[]) {\n const limit = pLimit(5);\n const missing = cids.filter((cid) => !this.carReaders.has(cid.toString()));\n await Promise.all(missing.map((cid) => limit(() => this.loadCar(cid))));\n }\n}\n","import { decode } from \"../runtime/wait-pr-multiformats/block.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as dagCodec from \"@ipld/dag-cbor\";\nimport type { Logger } from \"@adviser/cement\";\n\nimport { CarHeader } from \"./types.js\";\n// import { decodeRunLength } from \"../runtime/keyed-crypto.js\";\n// import { base58btc } from \"multiformats/bases/base58\";\nimport { CarReader } from \"@ipld/car\";\n\n// export async function encodeCarHeader<T>(fp: CarHeader<T>) {\n// return (await encode({\n// value: { fp },\n// hasher,\n// codec: dagCodec,\n// })) as AnyBlock;\n// }\n\n// function wrapDagDecoder<T>(dec: BlockDecoder<number, Uint8Array>): BlockDecoder<number, CarDecoded<T>> {\n// return {\n// code: dec.code,\n// decode: async (block: Uint8Array) => dagCodec.decode(await dec.decode(block))\n// }\n// }\n\ninterface CarDecoded<T> {\n readonly fp: CarHeader<T>;\n}\n\nexport async function parseCarFile<T>(reader: CarReader, logger: Logger): Promise<CarHeader<T>> {\n const roots = await reader.getRoots();\n const header = await reader.get(roots[0]);\n if (!header) throw logger.Error().Msg(\"missing header block\").AsError();\n const dec = await decode({ bytes: header.bytes, hasher, codec: dagCodec });\n // console.log(\"parseCarFile-done\", roots[0].toString(), header)\n // const { value } = await decode({\n // bytes: header.bytes,\n // hasher,\n // codec: await wrapDagDecoder<T>({\n // code: dagCodec.code,\n // decode: (block) => {\n // const ui = new Uint8Array(block);\n // const iv = decodeRunLength(ui, 0, logger);\n // const key = decodeRunLength(ui, iv.next, logger);\n // // const fp = decodeRunLength(ui, key.next, logger);\n // console.log(\"parseCarFile\", { iv: iv.data.length, key: base58btc.encode(key.data) }, (new Error()).stack);\n // return ui\n // }\n // })\n // });\n const fpvalue = dec.value as CarDecoded<T>;\n // @jchris where is the fp attribute coming from?\n if (fpvalue && !fpvalue.fp) {\n throw logger.Error().Msg(\"missing fp\").AsError();\n }\n return fpvalue.fp;\n}\n","import { MemoryBlockstore } from \"@web3-storage/pail/block\";\nimport { BlockFetcher as BlockFetcherApi } from \"@web3-storage/pail/api\";\n\nimport {\n AnyAnyLink,\n AnyBlock,\n AnyLink,\n CarMakeable,\n TransactionMeta,\n TransactionWrapper,\n BlockstoreOpts,\n BlockstoreRuntime,\n} from \"./types.js\";\n\nimport { Loader } from \"./loader.js\";\nimport type { CID, Block, Version } from \"multiformats\";\nimport { falsyToUndef, SuperThis } from \"../types.js\";\nimport { toStoreRuntime } from \"./store-factory.js\";\nimport { Logger, toCryptoRuntime } from \"@adviser/cement\";\nimport { ensureLogger, ensureSuperThis } from \"../utils.js\";\n\nexport type BlockFetcher = BlockFetcherApi;\n\nexport interface CarTransactionOpts {\n readonly add: boolean;\n readonly noLoader: boolean;\n}\n\nexport class CarTransaction extends MemoryBlockstore implements CarMakeable {\n readonly parent: BaseBlockstore;\n constructor(parent: BaseBlockstore, opts: CarTransactionOpts = { add: true, noLoader: false }) {\n super();\n if (opts.add) {\n parent.transactions.add(this);\n }\n this.parent = parent;\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined> {\n return ((await this.superGet(cid)) || falsyToUndef(await this.parent.get(cid))) as Block<T, C, A, V>;\n }\n\n async superGet(cid: AnyLink): Promise<AnyBlock | undefined> {\n return super.get(cid);\n }\n}\n\nexport function defaultedBlockstoreRuntime(\n sthis: SuperThis,\n opts: BlockstoreOpts,\n component: string,\n ctx?: Record<string, unknown>,\n): BlockstoreRuntime {\n const logger = ensureLogger(sthis, component, ctx);\n const store = opts.store || {};\n return {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n applyMeta: (meta: TransactionMeta, snap?: boolean): Promise<void> => {\n return Promise.resolve();\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n compact: async (blocks: BlockFetcher) => {\n return {} as unknown as TransactionMeta;\n },\n autoCompact: 100,\n public: false,\n name: undefined,\n threshold: 1000 * 1000,\n ...opts,\n logger,\n keyBag: opts.keyBag || {},\n crypto: toCryptoRuntime(opts.crypto),\n store,\n storeRuntime: toStoreRuntime(store, sthis),\n };\n}\n\nexport function blockstoreFactory(sthis: SuperThis, opts: BlockstoreOpts): BaseBlockstore | EncryptedBlockstore {\n if (opts.name) {\n return new EncryptedBlockstore(sthis, opts);\n } else {\n return new BaseBlockstore(opts);\n }\n}\n\nexport class BaseBlockstore implements BlockFetcher {\n readonly transactions = new Set<CarTransaction>();\n readonly ebOpts: BlockstoreRuntime;\n readonly sthis: SuperThis;\n\n readonly loader?: Loader;\n readonly name?: string;\n\n // ready: Promise<void>;\n ready(): Promise<void> {\n return Promise.resolve();\n }\n\n async close(): Promise<void> {\n // no-op\n }\n\n async destroy(): Promise<void> {\n // no-op\n }\n\n readonly logger: Logger;\n constructor(ebOpts: BlockstoreOpts = {}) {\n // console.log(\"BaseBlockstore\", ebOpts)\n this.sthis = ensureSuperThis(ebOpts);\n this.ebOpts = defaultedBlockstoreRuntime(this.sthis, ebOpts, \"BaseBlockstore\");\n this.logger = this.ebOpts.logger;\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyAnyLink): Promise<Block<T, C, A, V> | undefined> {\n if (!cid) throw this.logger.Error().Msg(\"required cid\").AsError();\n for (const f of this.transactions) {\n // if (Math.random() < 0.001) console.log('get', cid.toString(), this.transactions.size)\n const v = await f.superGet(cid);\n if (v) return v as Block<T, C, A, V>;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async put(cid: AnyAnyLink, block: Uint8Array): Promise<void> {\n throw this.logger.Error().Msg(\"use a transaction to put\").AsError();\n }\n\n lastTxMeta?: unknown; // TransactionMeta\n\n async transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n _opts?: CarTransactionOpts,\n ): Promise<TransactionWrapper<M>> {\n const t = new CarTransaction(this, _opts);\n const done: M = await fn(t);\n this.lastTxMeta = done;\n return { t, meta: done };\n }\n\n async *entries(): AsyncIterableIterator<AnyBlock> {\n const seen = new Set<string>();\n for (const t of this.transactions) {\n for await (const blk of t.entries()) {\n if (seen.has(blk.cid.toString())) continue;\n seen.add(blk.cid.toString());\n yield blk;\n }\n }\n }\n}\n\nexport class EncryptedBlockstore extends BaseBlockstore {\n readonly name: string;\n readonly loader: Loader;\n\n ready(): Promise<void> {\n return this.loader.ready();\n }\n\n close(): Promise<void> {\n return this.loader.close();\n }\n\n destroy(): Promise<void> {\n return this.loader.destroy();\n }\n\n compacting = false;\n readonly logger: Logger;\n\n constructor(sthis: SuperThis, ebOpts: BlockstoreOpts) {\n super(ebOpts);\n this.logger = ensureLogger(this.sthis, \"EncryptedBlockstore\");\n const { name } = ebOpts;\n if (!name) {\n throw this.logger.Error().Msg(\"name required\").AsError();\n }\n this.name = name;\n this.loader = new Loader(this.name, ebOpts, sthis);\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyAnyLink): Promise<Block<T, C, A, V> | undefined> {\n const got = await super.get(cid);\n if (got) return got as Block<T, C, A, V>;\n if (!this.loader) {\n return;\n }\n return falsyToUndef(await this.loader.getBlock(cid)) as Block<T, C, A, V>;\n }\n\n async transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n opts = { noLoader: false },\n ): Promise<TransactionWrapper<M>> {\n const { t, meta: done } = await super.transaction<M>(fn);\n const cars = await this.loader.commit<M>(t, done, opts);\n if (this.ebOpts.autoCompact && this.loader.carLog.length > this.ebOpts.autoCompact) {\n setTimeout(() => void this.compact(), 10);\n }\n if (cars) {\n this.transactions.delete(t);\n return { meta: done, cars, t };\n }\n throw this.logger.Error().Msg(\"failed to commit car files\").AsError();\n }\n\n async getFile(car: AnyLink, cid: AnyLink /*, isPublic = false*/): Promise<Uint8Array> {\n await this.ready();\n if (!this.loader) throw this.logger.Error().Msg(\"loader required to get file, database must be named\").AsError();\n const reader = await this.loader.loadFileCar(car /*, isPublic */);\n const block = await reader.get(cid as CID);\n if (!block) throw this.logger.Error().Str(\"cid\", cid.toString()).Msg(`Missing block`).AsError();\n return block.bytes;\n }\n\n async compact() {\n await this.ready();\n if (!this.loader) throw this.logger.Error().Msg(\"loader required to compact\").AsError();\n if (this.loader.carLog.length < 2) return;\n const compactFn = this.ebOpts.compact || ((blocks: CompactionFetcher) => this.defaultCompact(blocks, this.logger));\n if (!compactFn || this.compacting) return;\n const blockLog = new CompactionFetcher(this);\n this.compacting = true;\n const meta = await compactFn(blockLog);\n await this.loader?.commit(blockLog.loggedBlocks, meta, {\n compact: true,\n noLoader: true,\n });\n this.compacting = false;\n }\n\n async defaultCompact(blocks: CompactionFetcher, logger: Logger): Promise<TransactionMeta> {\n // console.log('eb compact')\n if (!this.loader) {\n throw logger.Error().Msg(\"no loader\").AsError();\n }\n if (!this.lastTxMeta) {\n throw logger.Error().Msg(\"no lastTxMeta\").AsError();\n }\n for await (const blk of this.loader.entries(false)) {\n blocks.loggedBlocks.putSync(blk.cid, blk.bytes);\n }\n for (const t of this.transactions) {\n for await (const blk of t.entries()) {\n blocks.loggedBlocks.putSync(blk.cid, blk.bytes);\n }\n }\n return this.lastTxMeta as TransactionMeta;\n }\n\n async *entries(): AsyncIterableIterator<AnyBlock> {\n // const seen = new Set<string>();\n for await (const blk of this.loader.entries()) {\n // if (seen.has(blk.cid.toString())) continue\n // seen.add(blk.cid.toString())\n yield blk;\n }\n }\n}\n\nexport class CompactionFetcher implements BlockFetcher {\n readonly blockstore: EncryptedBlockstore;\n // loader: Loader | null = null\n readonly loggedBlocks: CarTransaction;\n\n constructor(blocks: EncryptedBlockstore) {\n this.blockstore = blocks;\n // this.loader = blocks.loader\n this.loggedBlocks = new CarTransaction(blocks);\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined> {\n const block = await this.blockstore.get(cid);\n if (block) this.loggedBlocks.putSync(cid, block.bytes);\n return falsyToUndef(block) as Block<T, C, A, V>;\n }\n}\n","import { Future } from \"@adviser/cement\";\n\ntype QueueFunction<T = void> = () => Promise<T>;\n\nexport class CommitQueue<T = void> {\n readonly queue: QueueFunction<void>[] = [];\n processing = false;\n\n readonly _waitIdleItems = new Set<Future<void>>();\n waitIdle() {\n if (this.queue.length === 0 && !this.processing) {\n return Promise.resolve();\n }\n const fn = new Future<void>();\n this._waitIdleItems.add(fn);\n return fn.asPromise();\n }\n\n async enqueue(fn: QueueFunction<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const queueFn = async () => {\n try {\n resolve(await fn());\n } catch (e) {\n reject(e);\n } finally {\n this.processing = false;\n this.processNext();\n }\n };\n this.queue.push(queueFn);\n if (!this.processing) {\n this.processNext();\n }\n });\n }\n\n processNext() {\n if (this.queue.length > 0 && !this.processing) {\n this.processing = true;\n const queueFn = this.queue.shift();\n if (queueFn) {\n queueFn().finally(() => {\n /**/\n });\n }\n }\n if (this.queue.length === 0 && !this.processing) {\n const toResolve = Array.from(this._waitIdleItems);\n this._waitIdleItems.clear();\n toResolve.map((fn) => fn.resolve());\n }\n }\n}\n","import {\n CoerceURI,\n CryptoRuntime,\n KeyedResolvOnce,\n Logger,\n ResolveSeq,\n Result,\n runtimeFn,\n toCryptoRuntime,\n URI,\n} from \"@adviser/cement\";\nimport { KeyWithFingerPrint } from \"../blockstore/types.js\";\nimport { ensureLogger } from \"../utils.js\";\nimport { base58btc } from \"multiformats/bases/base58\";\nimport { SuperThis } from \"../types.js\";\n\nexport type { KeyBagProviderFile } from \"./key-bag-file.js\";\nexport type { KeyBagProviderIndexDB } from \"./key-bag-indexdb.js\";\n\nexport class KeyBag {\n readonly logger: Logger;\n constructor(readonly rt: KeyBagRuntime) {\n this.logger = ensureLogger(rt.sthis, \"KeyBag\", {\n id: rt.id(),\n });\n this.logger.Debug().Msg(\"KeyBag created\");\n }\n async subtleKey(key: string) {\n return await this.rt.crypto.importKey(\n \"raw\", // raw or jwk\n base58btc.decode(key),\n // hexStringToUint8Array(key), // raw data\n \"AES-GCM\",\n false, // extractable\n [\"encrypt\", \"decrypt\"],\n );\n }\n\n async ensureKeyFromUrl(url: URI, keyFactory: () => string): Promise<Result<URI>> {\n // add storekey to url\n const storeKey = url.getParam(\"storekey\");\n if (storeKey === \"insecure\") {\n return Result.Ok(url);\n }\n if (!storeKey) {\n const keyName = `@${keyFactory()}@`;\n const ret = await this.getNamedKey(keyName);\n if (ret.isErr()) {\n return ret as unknown as Result<URI>;\n }\n const urb = url.build().setParam(\"storekey\", keyName);\n return Result.Ok(urb.URI());\n }\n if (storeKey.startsWith(\"@\") && storeKey.endsWith(\"@\")) {\n const ret = await this.getNamedKey(storeKey);\n if (ret.isErr()) {\n return ret as unknown as Result<URI>;\n }\n }\n return Result.Ok(url);\n }\n\n async toKeyWithFingerPrint(keyStr: string): Promise<Result<KeyWithFingerPrint>> {\n const material = base58btc.decode(keyStr); //\n const key = await this.subtleKey(keyStr);\n const fpr = await this.rt.crypto.digestSHA256(material);\n return Result.Ok({\n key,\n fingerPrint: base58btc.encode(new Uint8Array(fpr)),\n });\n }\n\n readonly _seq = new ResolveSeq<Result<KeyWithFingerPrint>>();\n async setNamedKey(name: string, key: string): Promise<Result<KeyWithFingerPrint>> {\n return this._seq.add(() => this._setNamedKey(name, key));\n }\n\n // avoid deadlock\n async _setNamedKey(name: string, key: string): Promise<Result<KeyWithFingerPrint>> {\n const item = {\n name,\n key: key,\n };\n const bag = await this.rt.getBag();\n this.logger.Debug().Str(\"name\", name).Msg(\"setNamedKey\");\n await bag.set(name, item);\n return await this.toKeyWithFingerPrint(item.key);\n }\n\n async getNamedKey(name: string, failIfNotFound = false): Promise<Result<KeyWithFingerPrint>> {\n const id = this.rt.sthis.nextId(4).str;\n return this._seq.add(async () => {\n const bag = await this.rt.getBag();\n const named = await bag.get(name);\n if (named) {\n const fpr = await this.toKeyWithFingerPrint(named.key);\n this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Result(\"fpr\", fpr).Msg(\"fingerPrint getNamedKey\");\n return fpr;\n }\n if (failIfNotFound) {\n this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Msg(\"failIfNotFound getNamedKey\");\n return Result.Err(new Error(`Key not found: ${name}`));\n }\n // this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Msg(\"createKey getNamedKey-pre\");\n const ret = await this._setNamedKey(name, base58btc.encode(this.rt.crypto.randomBytes(this.rt.keyLength)));\n this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Result(\"fpr\", ret).Msg(\"createKey getNamedKey-post\");\n return ret;\n });\n }\n}\n\nexport interface KeyItem {\n readonly name: string;\n readonly key: string;\n}\nexport type KeyBagFile = Record<string, KeyItem>;\n\nexport interface KeyBagOpts {\n // in future you can encrypt the keybag with ?masterkey=xxxxx\n readonly url: CoerceURI;\n // readonly key: string; // key to encrypt the keybag\n readonly crypto: CryptoRuntime;\n readonly keyLength: number; // default: 16\n // readonly logger: Logger;\n readonly keyRuntime: KeyBagRuntime;\n}\n\nexport interface KeyBagProvider {\n get(id: string): Promise<KeyItem | undefined>;\n set(id: string, item: KeyItem): Promise<void>;\n}\nexport interface KeyBagRuntime {\n readonly url: URI;\n readonly crypto: CryptoRuntime;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly keyLength: number;\n // readonly key?: FPCryptoKey;\n getBag(): Promise<KeyBagProvider>;\n id(): string;\n}\n\nexport type KeyBackProviderFactory = (url: URI, sthis: SuperThis) => Promise<KeyBagProvider>;\n\nexport interface KeyBagProviderFactoryItem {\n readonly protocol: string;\n // if this is set the default protocol selection is overridden\n readonly override?: boolean;\n readonly factory: KeyBackProviderFactory;\n}\n\nconst keyBagProviderFactories = new Map<string, KeyBagProviderFactoryItem>(\n [\n {\n protocol: \"file:\",\n factory: async (url: URI, sthis: SuperThis) => {\n const { KeyBagProviderFile } = await import(\"./key-bag-file.js\");\n return new KeyBagProviderFile(url, sthis);\n },\n },\n {\n protocol: \"indexdb:\",\n factory: async (url: URI, sthis: SuperThis) => {\n const { KeyBagProviderIndexDB } = await import(\"./key-bag-indexdb.js\");\n return new KeyBagProviderIndexDB(url, sthis);\n },\n },\n ].map((i) => [i.protocol, i]),\n);\n\nexport function registerKeyBagProviderFactory(item: KeyBagProviderFactoryItem) {\n const protocol = item.protocol.endsWith(\":\") ? item.protocol : item.protocol + \":\";\n keyBagProviderFactories.set(protocol, {\n ...item,\n protocol,\n });\n}\n\nfunction defaultKeyBagOpts(sthis: SuperThis, kbo: Partial<KeyBagOpts>): KeyBagRuntime {\n if (kbo.keyRuntime) {\n return kbo.keyRuntime;\n }\n const logger = ensureLogger(sthis, \"KeyBag\");\n let url: URI;\n if (kbo.url) {\n url = URI.from(kbo.url);\n logger.Debug().Url(url).Msg(\"from opts\");\n } else {\n let bagFnameOrUrl = sthis.env.get(\"FP_KEYBAG_URL\");\n if (runtimeFn().isBrowser) {\n url = URI.from(bagFnameOrUrl || \"indexdb://fp-keybag\");\n } else {\n if (!bagFnameOrUrl) {\n const home = sthis.env.get(\"HOME\");\n bagFnameOrUrl = `${home}/.fireproof/keybag`;\n url = URI.from(`file://${bagFnameOrUrl}`);\n } else {\n url = URI.from(bagFnameOrUrl);\n }\n }\n logger.Debug().Url(url).Msg(\"from env\");\n }\n let keyProviderFactory: () => Promise<KeyBagProvider>;\n switch (url.protocol) {\n case \"file:\":\n keyProviderFactory = async () => {\n const { KeyBagProviderFile } = await import(\"./key-bag-file.js\");\n return new KeyBagProviderFile(url, sthis);\n };\n break;\n case \"indexdb:\":\n keyProviderFactory = async () => {\n const { KeyBagProviderIndexDB } = await import(\"./key-bag-indexdb.js\");\n return new KeyBagProviderIndexDB(url, sthis);\n };\n break;\n default:\n throw logger.Error().Url(url).Msg(\"unsupported protocol\").AsError();\n }\n\n if (url.hasParam(\"masterkey\")) {\n throw logger.Error().Url(url).Msg(\"masterkey is not supported\").AsError();\n }\n return {\n url,\n crypto: kbo.crypto || toCryptoRuntime({}),\n sthis,\n logger,\n keyLength: kbo.keyLength || 16,\n getBag: keyProviderFactory,\n id: () => {\n return url.toString();\n },\n };\n}\n\nconst _keyBags = new KeyedResolvOnce<KeyBag>();\nexport async function getKeyBag(sthis: SuperThis, kbo: Partial<KeyBagOpts> = {}): Promise<KeyBag> {\n await sthis.start();\n const rt = defaultKeyBagOpts(sthis, kbo);\n return _keyBags.get(rt.id()).once(async () => new KeyBag(rt));\n}\n","import { FileTransactionMeta } from \"../types\";\nimport { CarTransaction } from \"./transaction\";\nimport {\n AnyBlock,\n AnyLink,\n CarGroup,\n CarHeader,\n CarLog,\n CarMakeable,\n CommitOpts,\n DataStore,\n DbMeta,\n MetaStore,\n toCIDBlock,\n TransactionMeta,\n WALStore,\n} from \"./types\";\nimport * as CBW from \"@ipld/car/buffer-writer\";\nimport { CID } from \"multiformats\";\nimport { encode } from \"../runtime/wait-pr-multiformats/block.js\";\nimport { BlockEncoder } from \"../runtime/wait-pr-multiformats/codec-interface.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as dagCodec from \"@ipld/dag-cbor\";\n\nasync function encodeCarFile(roots: AnyLink[], t: CarMakeable, codec: BlockEncoder<number, Uint8Array>): Promise<AnyBlock> {\n let size = 0;\n const headerSize = CBW.headerLength({ roots } as { roots: CID<unknown, number, number, 1>[] });\n size += headerSize;\n for (const { cid, bytes } of t.entries()) {\n size += CBW.blockLength({ cid, bytes } as CBW.Block);\n }\n const buffer = new Uint8Array(size);\n const writer = CBW.createWriter(buffer, { headerSize });\n\n for (const r of roots) {\n writer.addRoot(r as CID<unknown, number, number, 1>);\n }\n\n for (const { cid, bytes } of t.entries()) {\n writer.write({ cid, bytes } as CBW.Block);\n }\n writer.close();\n return await encode({ value: writer.bytes, hasher, codec });\n}\n\nexport async function createCarFile(\n encoder: BlockEncoder<number, Uint8Array>,\n cid: AnyLink,\n t: CarTransaction,\n): Promise<{ cid: AnyLink; bytes: Uint8Array }> {\n // try {\n return encodeCarFile([cid], t, encoder);\n // const keycr = await store.keyedCrypto()\n // return keycr.isEncrypting\n // ? await encryptedEncodeCarFile(this.logger, keycr, cid, t)\n // : await encodeCarFile([cid], t);\n // } catch (e) {\n // throw store.logger.Error().Err(e).Msg(\"error creating car file\").AsError();\n // }\n}\n\nexport async function commitFiles(\n fileStore: DataStore,\n walStore: WALStore,\n t: CarTransaction,\n done: TransactionMeta,\n // opts: CommitOpts = { noLoader: false, compact: false },\n): Promise<CarGroup> {\n const { files: roots } = makeFileCarHeader(done as FileTransactionMeta) as {\n files: AnyLink[];\n };\n const cids: AnyLink[] = [];\n // const fileStore = await this.fileStore();\n const codec = (await fileStore.keyedCrypto()).codec();\n const cars = await prepareCarFilesFiles(codec, roots, t);\n for (const car of cars) {\n const { cid, bytes } = car;\n // real deal\n await fileStore.save({ cid, bytes });\n await walStore.enqueueFile(cid /*, !!opts.public*/);\n cids.push(cid);\n }\n return cids;\n}\n\nfunction makeFileCarHeader(result: FileTransactionMeta): TransactionMeta {\n const files: AnyLink[] = [];\n for (const [, meta] of Object.entries(result.files || {})) {\n if (meta && typeof meta === \"object\" && \"cid\" in meta && meta !== null) {\n files.push(meta.cid as AnyLink);\n }\n }\n return { ...result, files };\n}\n\nasync function prepareCarFilesFiles(\n encoder: BlockEncoder<number, Uint8Array>,\n roots: AnyLink[],\n t: CarTransaction,\n // isPublic: boolean,\n): Promise<{ cid: AnyLink; bytes: Uint8Array }[]> {\n // const theKey = isPublic ? null : await this._getKey();\n // const kc = await store.keyedCrypto()\n // const car = kc.isEncrypting\n // ? await encryptedEncodeCarFile(this.logger, kc, roots[0], t)\n // : await encodeCarFile(roots, t);\n return [await encodeCarFile(roots, t, encoder)];\n}\n\n// PUR Commit\n\nfunction makeCarHeader<T>(meta: T, cars: CarLog, compact = false): CarHeader<T> {\n const coreHeader = compact ? { cars: [], compact: cars } : { cars, compact: [] };\n return { ...coreHeader, meta };\n}\n\nasync function encodeCarHeader<T>(fp: CarHeader<T>) {\n return (await encode({\n value: { fp },\n hasher,\n codec: dagCodec,\n })) as AnyBlock;\n}\n\nexport interface CommitParams {\n readonly encoder: BlockEncoder<number, Uint8Array>;\n readonly carLog: CarLog;\n readonly carStore: DataStore;\n readonly WALStore: WALStore;\n readonly metaStore: MetaStore;\n readonly threshold?: number;\n}\n\nexport async function commit<T>(\n params: CommitParams,\n t: CarTransaction,\n done: T,\n opts: CommitOpts = { noLoader: false, compact: false },\n): Promise<{ cgrp: CarGroup; header: CarHeader<T> }> {\n const fp = makeCarHeader<T>(done, params.carLog, !!opts.compact);\n const rootBlock = await encodeCarHeader(fp);\n\n const cars = await prepareCarFiles(params.encoder, params.threshold, rootBlock, t);\n const cids: AnyLink[] = [];\n for (const car of cars) {\n const { cid, bytes } = car;\n await params.carStore.save({ cid, bytes });\n cids.push(cid);\n }\n\n // await this.cacheTransaction(t);\n const newDbMeta = { cars: cids } as DbMeta;\n await params.WALStore.enqueue(newDbMeta, opts);\n await params.metaStore.save(newDbMeta);\n return { cgrp: cids, header: fp };\n}\n\nasync function prepareCarFiles(\n encoder: BlockEncoder<number, Uint8Array>,\n threshold: number | undefined,\n rootBlock: AnyBlock,\n t: CarTransaction,\n): Promise<{ cid: AnyLink; bytes: Uint8Array }[]> {\n // const theKey = isPublic ? undefined : await this._getKey();\n const carFiles: { cid: AnyLink; bytes: Uint8Array }[] = [];\n threshold = threshold || 1000 * 1000;\n let clonedt = new CarTransaction(t.parent, { add: false, noLoader: false });\n clonedt.putSync(rootBlock.cid, rootBlock.bytes);\n let newsize = CBW.blockLength(toCIDBlock(rootBlock));\n let cidRootBlock = rootBlock;\n for (const { cid, bytes } of t.entries()) {\n newsize += CBW.blockLength(toCIDBlock({ cid: cid, bytes }));\n if (newsize >= threshold) {\n carFiles.push(await createCarFile(encoder, cidRootBlock.cid, clonedt));\n clonedt = new CarTransaction(t.parent, { add: false, noLoader: false });\n clonedt.putSync(cid, bytes);\n cidRootBlock = { cid, bytes };\n newsize = CBW.blockLength(toCIDBlock({ cid, bytes })); //+ CBW.blockLength(rootBlock)\n } else {\n clonedt.putSync(cid, bytes);\n }\n }\n // HEREMENO\n carFiles.push(await createCarFile(encoder, cidRootBlock.cid, clonedt));\n // console.log(\"split to \", carFiles.length, \"files\")\n return carFiles;\n}\n","import { CryptoRuntime, Logger, URI } from \"@adviser/cement\";\nimport { BytesWithIv, CodecOpts, IvAndBytes, IvKeyIdData, KeyedCrypto, KeyWithFingerPrint } from \"../blockstore\";\nimport { ensureLogger, UInt8ArrayEqual } from \"../utils.js\";\nimport { KeyBag } from \"./key-bag\";\nimport type { BlockCodec } from \"./wait-pr-multiformats/codec-interface\";\nimport { base58btc } from \"multiformats/bases/base58\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as CBOR from \"cborg\";\nimport { SuperThis } from \"../types.js\";\n\ninterface GenerateIVFn {\n calc(ko: KeyedCrypto, crypto: CryptoRuntime, data: Uint8Array): Promise<Uint8Array>;\n verify(ko: KeyedCrypto, crypto: CryptoRuntime, iv: Uint8Array, data: Uint8Array): Promise<boolean>;\n}\n\nconst generateIV: Record<string, GenerateIVFn> = {\n random: {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n calc: async (ko: KeyedCrypto, crypto: CryptoRuntime, data: Uint8Array): Promise<Uint8Array> => {\n return crypto.randomBytes(ko.ivLength);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n verify: async (ko: KeyedCrypto, crypto: CryptoRuntime, iv: Uint8Array, data: Uint8Array): Promise<boolean> => {\n return true;\n },\n },\n hash: {\n calc: async (ko: KeyedCrypto, crypto: CryptoRuntime, data: Uint8Array): Promise<Uint8Array> => {\n const hash = await hasher.digest(data);\n const hashBytes = new Uint8Array(hash.bytes);\n const hashArray = new Uint8Array(ko.ivLength * 8);\n for (let i = 0; i < hashBytes.length; i++) {\n hashArray[i % ko.ivLength] ^= hashBytes[i];\n }\n return hashArray;\n },\n verify: async function (ko: KeyedCrypto, crypto: CryptoRuntime, iv: Uint8Array, data: Uint8Array): Promise<boolean> {\n return ko.url.getParam(\"ivverify\") !== \"disable\" && UInt8ArrayEqual(iv, await this.calc(ko, crypto, data));\n },\n },\n};\n\nfunction getGenerateIVFn(url: URI, opts: Partial<CodecOpts>): GenerateIVFn {\n const ivhash = opts.ivCalc || url.getParam(\"ivhash\") || \"hash\";\n return generateIV[ivhash] || generateIV[\"hash\"];\n}\n\nexport class BlockIvKeyIdCodec implements BlockCodec<0x300539, Uint8Array> {\n readonly code = 0x300539;\n readonly name = \"Fireproof@encrypted-block:aes-gcm\";\n\n readonly ko: KeyedCrypto;\n readonly iv?: Uint8Array;\n readonly opts: Partial<CodecOpts>;\n constructor(ko: KeyedCrypto, iv?: Uint8Array, opts?: CodecOpts) {\n this.ko = ko;\n this.iv = iv;\n this.opts = opts || {};\n }\n\n async encode(data: Uint8Array): Promise<Uint8Array> {\n const calcIv = this.iv || (await getGenerateIVFn(this.ko.url, this.opts).calc(this.ko, this.ko.crypto, data));\n const { iv } = this.ko.algo(calcIv);\n const fprt = await this.ko.fingerPrint();\n const keyId = base58btc.decode(fprt);\n this.ko.logger.Debug().Str(\"fp\", fprt).Msg(\"encode\");\n return CBOR.encode({\n iv: iv,\n keyId: keyId,\n data: await this.ko._encrypt({ iv, bytes: data }),\n } as IvKeyIdData);\n }\n\n async decode(abytes: Uint8Array | ArrayBuffer): Promise<Uint8Array> {\n let bytes: Uint8Array;\n if (abytes instanceof Uint8Array) {\n bytes = abytes;\n } else {\n bytes = new Uint8Array(abytes);\n }\n const { iv, keyId, data } = CBOR.decode(bytes) as IvKeyIdData;\n const fprt = await this.ko.fingerPrint();\n this.ko.logger.Debug().Str(\"fp\", base58btc.encode(keyId)).Msg(\"decode\");\n if (base58btc.encode(keyId) !== fprt) {\n throw this.ko.logger.Error().Str(\"fp\", fprt).Str(\"keyId\", base58btc.encode(keyId)).Msg(\"keyId mismatch\").AsError();\n }\n const result = await this.ko._decrypt({ iv: iv, bytes: data });\n if (!this.opts?.noIVVerify && !(await getGenerateIVFn(this.ko.url, this.opts).verify(this.ko, this.ko.crypto, iv, result))) {\n throw this.ko.logger.Error().Msg(\"iv missmatch\").AsError();\n }\n return result;\n }\n}\n\nclass keyedCrypto implements KeyedCrypto {\n readonly ivLength = 12;\n readonly logger: Logger;\n readonly crypto: CryptoRuntime;\n readonly key: KeyWithFingerPrint;\n readonly isEncrypting = true;\n readonly url: URI;\n constructor(url: URI, key: KeyWithFingerPrint, cyopt: CryptoRuntime, sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"keyedCrypto\");\n this.crypto = cyopt;\n this.key = key;\n this.url = url;\n }\n fingerPrint(): Promise<string> {\n return Promise.resolve(this.key.fingerPrint);\n }\n codec(iv?: Uint8Array, opts?: CodecOpts): BlockCodec<number, Uint8Array> {\n return new BlockIvKeyIdCodec(this, iv, opts);\n }\n algo(iv?: Uint8Array) {\n return {\n name: \"AES-GCM\",\n iv: iv || this.crypto.randomBytes(this.ivLength),\n tagLength: 128,\n };\n }\n async _decrypt(data: IvAndBytes): Promise<Uint8Array> {\n this.logger\n .Debug()\n .Len(data.bytes)\n .Str(\"fp\", this.key.fingerPrint)\n // .Hash(\"iv\", data.iv).Hash(\"bytes\", data.bytes)\n .Msg(\"decrypting\");\n return new Uint8Array(await this.crypto.decrypt(this.algo(data.iv), this.key.key, data.bytes));\n }\n async _encrypt(data: BytesWithIv): Promise<Uint8Array> {\n this.logger.Debug().Len(data.bytes).Str(\"fp\", this.key.fingerPrint).Msg(\"encrypting\");\n const a = this.algo(data.iv);\n return new Uint8Array(await this.crypto.encrypt(a, this.key.key, data.bytes));\n }\n}\n\nclass nullCodec implements BlockCodec<0x0, Uint8Array> {\n readonly code = 0x0;\n readonly name = \"Fireproof@unencrypted-block\";\n\n encode(data: Uint8Array): Uint8Array {\n return data;\n }\n decode(data: Uint8Array): Uint8Array {\n return data;\n }\n}\n\nclass noCrypto implements KeyedCrypto {\n readonly ivLength = 0;\n readonly code = 0x0;\n readonly name = \"Fireproof@unencrypted-block\";\n readonly logger: Logger;\n readonly crypto: CryptoRuntime;\n readonly isEncrypting = false;\n readonly _fingerPrint = \"noCrypto:\" + Math.random();\n readonly url: URI;\n constructor(url: URI, cyrt: CryptoRuntime, sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"noCrypto\");\n this.crypto = cyrt;\n this.url = url;\n }\n\n fingerPrint(): Promise<string> {\n return Promise.resolve(this._fingerPrint);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n codec(iv?: Uint8Array): BlockCodec<number, Uint8Array> {\n return new nullCodec();\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n algo(iv?: Uint8Array): { name: string; iv: Uint8Array; tagLength: number } {\n return {\n name: \"noCrypto\",\n iv: new Uint8Array(),\n tagLength: 0,\n };\n }\n _decrypt(): Promise<Uint8Array> {\n throw this.logger.Error().Msg(\"noCrypto.decrypt not implemented\").AsError();\n }\n _encrypt(): Promise<Uint8Array> {\n throw this.logger.Error().Msg(\"noCrypto.decrypt not implemented\").AsError();\n }\n}\n\nexport async function keyedCryptoFactory(url: URI, kb: KeyBag, sthis: SuperThis): Promise<KeyedCrypto> {\n const storekey = url.getParam(\"storekey\");\n if (storekey && storekey !== \"insecure\") {\n let rkey = await kb.getNamedKey(storekey, true);\n if (rkey.isErr()) {\n try {\n rkey = await kb.toKeyWithFingerPrint(storekey);\n } catch (e) {\n throw (\n sthis.logger\n .Error()\n .Err(e)\n .Str(\"keybag\", kb.rt.id())\n // .Result(\"key\", rkey)\n .Str(\"name\", storekey)\n .Msg(\"getNamedKey failed\")\n .AsError()\n );\n }\n }\n return new keyedCrypto(url, rkey.Ok(), kb.rt.crypto, sthis);\n }\n return new noCrypto(url, kb.rt.crypto, sthis);\n}\n","import { URI } from \"@adviser/cement\";\nimport { bs, ensureSuperLog, Logger, Result, SuperThis } from \"@fireproof/core\";\n\nimport { base58btc } from \"multiformats/bases/base58\";\nimport { encode, decode } from \"cborg\";\n\nfunction getFragSize(url: URI): number {\n const fragSize = url.getParam(\"fragSize\");\n let ret = 0;\n if (fragSize) {\n ret = parseInt(fragSize);\n }\n if (isNaN(ret) || ret <= 0) {\n ret = 0;\n }\n return ret;\n}\n\nasync function getFrags(url: URI, innerGW: bs.Gateway, headerSize: number, logger: Logger): Promise<Result<Fragment>[]> {\n const fragSize = getFragSize(url);\n if (!fragSize) {\n const res = await innerGW.get(url);\n if (res.isErr()) {\n return [res as unknown as Result<Fragment>];\n }\n const data = res.unwrap();\n return [\n Result.Ok({\n fid: new Uint8Array(0),\n ofs: 0,\n len: data.length,\n data,\n }),\n ];\n }\n const firstRaw = await innerGW.get(url.build().setParam(\"ofs\", \"0\").URI());\n if (firstRaw.isErr()) {\n return [firstRaw as unknown as Result<Fragment>];\n }\n const firstFragment = decode(firstRaw.unwrap()) as Fragment;\n const blockSize = firstFragment.data.length;\n const ops: Promise<Result<Fragment>>[] = [Promise.resolve(Result.Ok(firstFragment))];\n const fidStr = base58btc.encode(firstFragment.fid);\n const fragUrl = url\n .build()\n .setParam(\"fid\", fidStr)\n .setParam(\"len\", firstFragment.len.toString())\n .setParam(\"headerSize\", headerSize.toString());\n\n for (let ofs = blockSize; ofs < firstFragment.len; ofs += blockSize) {\n ops.push(\n (async (furl, ofs): Promise<Result<Fragment>> => {\n const raw = await innerGW.get(furl);\n if (raw.isErr()) {\n return raw as unknown as Result<Fragment>;\n }\n const fragment = decode(raw.unwrap());\n if (base58btc.encode(fragment.fid) !== fidStr) {\n return Result.Err(logger.Error().Msg(\"Fragment fid mismatch\").AsError());\n }\n if (fragment.ofs !== ofs) {\n return Result.Err(logger.Error().Uint64(\"ofs\", ofs).Msg(\"Fragment ofs mismatch\").AsError());\n }\n return Result.Ok(fragment);\n })(fragUrl.setParam(\"ofs\", ofs.toString()).URI(), ofs),\n );\n }\n return Promise.all(ops);\n}\n\ninterface Fragment {\n readonly fid: Uint8Array;\n readonly ofs: number;\n readonly len: number;\n readonly data: Uint8Array;\n}\n\nexport class FragmentGateway implements bs.Gateway {\n readonly sthis: SuperThis;\n readonly logger: Logger;\n readonly fidLength = 4;\n\n readonly innerGW: bs.Gateway;\n headerSize = 32;\n\n constructor(sthis: SuperThis, innerGW: bs.Gateway) {\n this.sthis = ensureSuperLog(sthis, \"FragmentGateway\");\n this.logger = this.sthis.logger;\n this.innerGW = innerGW;\n }\n\n slicer(url: URI, body: Uint8Array): Promise<bs.VoidResult>[] {\n const fragSize = getFragSize(url);\n if (!fragSize) {\n return [this.innerGW.put(url, body)];\n }\n const blocksize = fragSize - this.headerSize;\n if (blocksize <= 0) {\n throw this.logger\n .Error()\n .Uint64(\"fragSize\", fragSize)\n .Uint64(\"headerSize\", this.headerSize)\n .Msg(\"Fragment size is too small\")\n .AsError();\n }\n const ops: Promise<bs.VoidResult>[] = [];\n const fid = this.sthis.nextId(this.fidLength);\n const fragUrl = url\n .build()\n .setParam(\"fid\", fid.str)\n .setParam(\"len\", body.length.toString())\n .setParam(\"headerSize\", this.headerSize.toString());\n for (let ofs = 0; ofs < body.length; ofs += blocksize) {\n const block = encode({\n fid: fid.bin,\n ofs,\n len: body.length,\n data: body.slice(ofs, ofs + blocksize),\n } as Fragment);\n if (block.length > fragSize) {\n throw this.logger.Error().Uint64(\"block\", block.length).Uint64(\"fragSize\", fragSize).Msg(\"Block size to big\").AsError();\n }\n ops.push(this.innerGW.put(fragUrl.setParam(\"ofs\", ofs.toString()).URI(), block));\n }\n return ops;\n }\n\n buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return this.innerGW.buildUrl(baseUrl, key);\n }\n\n async destroy(iurl: URI): Promise<Result<void>> {\n return this.innerGW.destroy(iurl);\n }\n\n async start(url: URI): Promise<Result<URI>> {\n this.headerSize =\n encode({\n fid: this.sthis.nextId(this.fidLength).bin,\n ofs: 1024 * 1024, // 32bit\n len: 16 * 1024 * 1024, // 32bit\n data: new Uint8Array(1024),\n }).length - 1024;\n return this.innerGW.start(url);\n }\n\n async close(url: URI): Promise<bs.VoidResult> {\n return this.innerGW.close(url);\n }\n\n async put(url: URI, body: Uint8Array): Promise<bs.VoidResult> {\n await Promise.all(this.slicer(url, body));\n return Result.Ok(undefined);\n }\n\n async get(url: URI): Promise<bs.GetResult> {\n const rfrags = await getFrags(url, this.innerGW, this.headerSize, this.logger);\n let buffer: Uint8Array | undefined = undefined;\n for (const rfrag of rfrags) {\n if (rfrag.isErr()) {\n return Result.Err(rfrag.Err());\n }\n const frag = rfrag.Ok();\n buffer = buffer || new Uint8Array(frag.len);\n buffer.set(frag.data, frag.ofs);\n }\n return Result.Ok(buffer || new Uint8Array(0));\n }\n\n async delete(url: URI): Promise<bs.VoidResult> {\n const rfrags = await getFrags(url, this.innerGW, this.headerSize, this.logger);\n for (const rfrag of rfrags) {\n if (rfrag.isErr()) {\n return Result.Err(rfrag.Err());\n }\n const frag = rfrag.Ok();\n const fidStr = base58btc.encode(frag.fid);\n const fragUrl = url\n .build()\n .setParam(\"fid\", fidStr)\n .setParam(\"len\", frag.len.toString())\n .setParam(\"headerSize\", this.headerSize.toString())\n .URI();\n await this.innerGW.delete(fragUrl);\n }\n return Result.Ok(undefined);\n }\n}\n","import { EventBlock, decodeEventBlock } from \"@web3-storage/pail/clock\";\nimport { EventView } from \"@web3-storage/pail/clock/api\";\nimport { MemoryBlockstore } from \"@web3-storage/pail/block\";\nimport type { Link, Version } from \"multiformats\";\nimport { Logger, URI } from \"@adviser/cement\";\n\nimport { throwFalsy } from \"../types.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport type { BlockstoreRuntime, Connection, Loadable } from \"./types.js\";\nimport { type Loader } from \"./loader.js\";\nimport { RemoteDataStore, RemoteMetaStore } from \"./store-remote.js\";\nimport { getGatewayFromURL } from \"./store-factory.js\";\nimport { getKeyBag } from \"../runtime/key-bag.js\";\n// import { ensureLogger } from \"../utils.js\";\n\nexport type CarClockHead = Link<DbMetaEventBlock, number, number, Version>[];\n\nexport interface Connectable {\n readonly blockstore: {\n readonly loader?: Loader;\n readonly ebOpts: BlockstoreRuntime;\n };\n readonly name?: string;\n}\n\nexport abstract class ConnectionBase implements Connection {\n // readonly ready: Promise<unknown>;\n // todo move to LRU blockstore https://github.com/web3-storage/w3clock/blob/main/src/worker/block.js\n readonly eventBlocks = new MemoryBlockstore();\n parents: CarClockHead = [];\n loader?: Loadable;\n taskManager?: TaskManager;\n loaded: Promise<void> = Promise.resolve();\n\n readonly url: URI;\n\n // abstract metaUpload(bytes: Uint8Array, params: UploadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n // abstract dataUpload(bytes: Uint8Array, params: UploadDataFnParams, opts?: { public?: boolean }): Promise<void>;\n // abstract metaDownload(params: DownloadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n // abstract dataDownload(params: DownloadDataFnParams): Promise<Uint8Array | Falsy>;\n\n readonly logger: Logger;\n constructor(url: URI, logger: Logger) {\n this.logger = logger;\n this.url = url;\n }\n\n async refresh() {\n await throwFalsy(throwFalsy(this.loader).remoteMetaStore).load(\"main\");\n await (await throwFalsy(this.loader).WALStore()).process();\n }\n\n async connect_X({ loader }: { readonly loader?: Loadable }) {\n if (!loader) throw this.logger.Error().Msg(\"loader is required\").AsError();\n await this.connectMeta_X({ loader });\n await this.connectStorage_X({ loader });\n }\n\n async connectMeta_X({ loader }: { loader?: Loadable }) {\n if (!loader) throw this.logger.Error().Msg(\"connectMeta_X: loader is required\").AsError();\n this.loader = loader;\n this.taskManager = new TaskManager(loader);\n await this.onConnect();\n const metaUrl = this.url.build().defParam(\"store\", \"meta\").URI();\n const gateway = await getGatewayFromURL(metaUrl, this.loader.sthis);\n if (!gateway) throw this.logger.Error().Url(metaUrl).Msg(\"connectMeta_X: gateway is required\").AsError();\n const name = metaUrl.toString();\n const remote = await RemoteMetaStore(loader.sthis, name, metaUrl, {\n gateway: gateway.gateway,\n keybag: () => getKeyBag(loader.sthis, loader.ebOpts.keyBag),\n });\n remote.onLoad(\"main\", async (metas) => {\n if (metas) {\n this.logger.Debug().Any(\"metas\", metas).Bool(\"loader\", this.loader).Msg(\"connectMeta_X: handleDbMetasFromStore pre\");\n await throwFalsy(this.loader).handleDbMetasFromStore(metas);\n this.logger.Debug().Any(\"metas\", metas).Msg(\"connectMeta_X: handleDbMetasFromStore post\");\n }\n });\n this.loader.remoteMetaStore = remote;\n this.loaded = this.loader.ready().then(async () => {\n remote.load(\"main\").then(async () => {\n (await throwFalsy(this.loader).WALStore()).process();\n });\n });\n }\n\n abstract onConnect(): Promise<void>;\n\n async connectStorage_X({ loader }: { loader?: Loadable }) {\n if (!loader) throw this.logger.Error().Msg(\"connectStorage_X: loader is required\").AsError();\n this.loader = loader;\n const dataUrl = this.url.build().defParam(\"store\", \"data\").URI();\n const gateway = await getGatewayFromURL(dataUrl, this.loader.sthis);\n if (!gateway) throw this.logger.Error().Url(dataUrl).Msg(\"connectStorage_X: gateway is required\").AsError();\n const name = dataUrl.toString();\n loader.remoteCarStore = await RemoteDataStore(loader.sthis, name, this.url, {\n gateway: gateway.gateway,\n keybag: () => getKeyBag(loader.sthis, this.loader?.ebOpts.keyBag),\n });\n // @jchris why we have a differention between remoteCarStore and remoteFileStore?\n loader.remoteFileStore = loader.remoteCarStore;\n }\n\n async createEventBlock(bytes: Uint8Array): Promise<DbMetaEventBlock> {\n const data = {\n dbMeta: bytes,\n };\n const event = await EventBlock.create(\n data,\n this.parents as unknown as Link<EventView<{ dbMeta: Uint8Array }>, number, number, 1>[],\n );\n await this.eventBlocks.put(event.cid, event.bytes);\n return event as EventBlock<{ dbMeta: Uint8Array }>; // todo test these `as` casts\n }\n\n async decodeEventBlock(bytes: Uint8Array): Promise<DbMetaEventBlock> {\n const event = await decodeEventBlock<{ dbMeta: Uint8Array }>(bytes);\n return event as EventBlock<{ dbMeta: Uint8Array }>; // todo test these `as` casts\n }\n\n // move this stuff to connect\n // async getDashboardURL(compact = true) {\n // const baseUrl = 'https://dashboard.fireproof.storage/'\n // if (!this.loader?.remoteCarStore) return new URL('/howto', baseUrl)\n // // if (compact) {\n // // await this.compact()\n // // }\n // const currents = await this.loader?.metaStore?.load()\n // if (!currents) throw new Error(\"Can't sync empty database: save data first\")\n // if (currents.length > 1)\n // throw new Error(\"Can't sync database with split heads: make an update first\")\n // const current = currents[0]\n // const params = {\n // car: current.car.toString()\n // }\n // if (current.key) {\n // // @ts-ignore\n // params.key = current.key.toString()\n // }\n // // @ts-ignore\n // if (this.name) {\n // // @ts-ignore\n // params.name = this.name\n // }\n // const url = new URL('/import#' + new URLSearchParams(params).toString(), baseUrl)\n // console.log('Import to dashboard: ' + url.toString())\n // return url\n // }\n\n // openDashboard() {\n // void this.getDashboardURL().then(url => {\n // if (url) window.open(url.toString(), '_blank')\n // })\n // }\n}\n\nexport type DbMetaEventBlock = EventBlock<{ dbMeta: Uint8Array }>;\n","import { Logger } from \"@adviser/cement\";\nimport { DbMetaEventBlock } from \"./connection-base.js\";\nimport { AnyLink, Loadable } from \"./index.js\";\nimport { ensureLogger } from \"../utils.js\";\n\ninterface TaskItem {\n readonly cid: string;\n readonly eventBlock: DbMetaEventBlock;\n retries: number;\n}\n\nexport class TaskManager {\n private readonly eventsWeHandled = new Set<string>();\n private readonly loader: Loadable;\n\n private queue: TaskItem[] = [];\n private isProcessing = false;\n\n readonly logger: Logger;\n constructor(loader: Loadable) {\n this.loader = loader;\n this.logger = ensureLogger(loader.sthis, \"TaskManager\");\n }\n\n async handleEvent(eventBlock: DbMetaEventBlock) {\n const cid = eventBlock.cid.toString();\n const parents = eventBlock.value.parents.map((cid: AnyLink) => cid.toString());\n for (const parent of parents) {\n this.eventsWeHandled.add(parent);\n }\n this.queue.push({ cid, eventBlock, retries: 0 });\n this.queue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));\n void this.processQueue();\n }\n\n private async processQueue() {\n if (this.isProcessing) return;\n this.isProcessing = true;\n const filteredQueue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));\n const first = filteredQueue[0];\n if (!first) {\n return;\n }\n try {\n this.loader?.remoteMetaStore?.handleByteHeads([first.eventBlock.value.data.dbMeta]);\n this.eventsWeHandled.add(first.cid);\n this.queue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));\n } catch (err) {\n if (first.retries++ > 3) {\n this.logger.Error().Str(\"cid\", first.cid).Msg(\"failed to process event block after 3 retries\");\n this.queue = this.queue.filter(({ cid }) => cid !== first.cid);\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n throw this.logger.Error().Err(err).Msg(\"failed to process event block\").AsError();\n } finally {\n this.isProcessing = false;\n if (this.queue.length > 0) {\n void this.processQueue();\n }\n }\n }\n}\n","import { URI } from \"@adviser/cement\";\nimport { DataStoreImpl, MetaStoreImpl, StoreOpts } from \"./store.js\";\nimport { SuperThis } from \"../types.js\";\n\n// export type LoadHandler = (dbMetas: DbMeta[]) => Promise<void>;\n// export function validateDataParams(params: DownloadDataFnParams | UploadDataFnParams, logger: Logger) {\n// const { type, name, car } = params;\n// if (!name) throw logger.Error().Msg(\"name is required\").AsError();\n// if (!car) {\n// throw logger.Error().Msg(\"car is required\").AsError();\n// }\n// if (type !== \"file\" && type !== \"data\") {\n// throw logger.Error().Msg(\"type must be file or data\").AsError();\n// }\n// }\n\n// export function validateMetaParams(params: DownloadMetaFnParams | UploadMetaFnParams, logger: Logger) {\n// const { name, branch } = params;\n// if (!name) throw logger.Error().Msg(\"name is required\").AsError();\n// if (!branch) {\n// throw logger.Error().Msg(\"branch is required\").AsError();\n// }\n// }\n\n// export class RemoteDataStore extends DataStoreImpl {\n// // just for explaining the concept\n// }\n\n// export class RemoteMetaStore extends MetaStoreImpl {\n// // just for explaining the concept\n// }\n\nexport async function RemoteDataStore(sthis: SuperThis, name: string, url: URI, opts: StoreOpts) {\n const ds = new DataStoreImpl(sthis, name, url, opts);\n await ds.start();\n return ds;\n}\nexport async function RemoteMetaStore(sthis: SuperThis, name: string, url: URI, opts: StoreOpts) {\n const ms = new MetaStoreImpl(sthis, name, url, opts);\n await ms.start();\n return ms;\n}\n\n// export class RemoteWALStore extends WALStoreImpl {\n// // basicly do nothing write the WAL into memory\n// constructor(loader: Loadable) {\n\n// //import { FileWALGateway } from \"../runtime/gateways/file/gateway.js\";\n// // super(loader, new URL(\"file:///dummy?fs=mem\"), loader.logger, new FileWALGateway(loader.logger));\n// }\n\n// }\n","import type { Block, Link } from \"multiformats\";\nimport { create } from \"./runtime/wait-pr-multiformats/block.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as codec from \"@ipld/dag-cbor\";\n\n// @ts-expect-error \"charwise\" has no types\nimport charwise from \"charwise\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport * as DbIndex from \"prolly-trees/db-index\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { bf, simpleCompare } from \"prolly-trees/utils\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { nocache as cache } from \"prolly-trees/cache\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { ProllyNode as BaseNode } from \"prolly-trees/db-index\";\n\nimport {\n DocUpdate,\n MapFn,\n DocFragment,\n IndexUpdate,\n QueryOpts,\n IndexRow,\n DocWithId,\n IndexKeyType,\n IndexKey,\n DocTypes,\n DocObject,\n IndexUpdateString,\n} from \"./types.js\";\nimport { CarTransaction, BlockFetcher, AnyLink, AnyBlock } from \"./blockstore/index.js\";\nimport { CRDT } from \"./crdt.js\";\n\nexport class IndexTree<K extends IndexKeyType, R extends DocFragment> {\n cid?: AnyLink;\n root?: ProllyNode<K, R>;\n}\n\ntype CompareRef = string | number;\nexport type CompareKey = [string | number, CompareRef];\n\nfunction refCompare(aRef: CompareRef, bRef: CompareRef) {\n if (Number.isNaN(aRef)) return -1;\n if (Number.isNaN(bRef)) throw new Error(\"ref may not be Infinity or NaN\");\n if (aRef === Infinity) return 1;\n // if (!Number.isFinite(bRef)) throw new Error('ref may not be Infinity or NaN')\n\n return simpleCompare(aRef, bRef) as number;\n}\n\nfunction compare(a: CompareKey, b: CompareKey) {\n const [aKey, aRef] = a;\n const [bKey, bRef] = b;\n\n const comp: number = simpleCompare(aKey, bKey);\n if (comp !== 0) return comp;\n return refCompare(aRef, bRef);\n}\n\nexport const byKeyOpts: StaticProllyOptions<CompareKey> = { cache, chunker: bf(30), codec, hasher, compare };\n\nexport const byIdOpts: StaticProllyOptions<unknown> = { cache, chunker: bf(30), codec, hasher, compare: simpleCompare };\n\nexport interface IndexDoc<K extends IndexKeyType> {\n readonly key: IndexKey<K>;\n readonly value: DocFragment;\n}\n\nexport interface IndexDocString {\n readonly key: string;\n readonly value: DocFragment;\n}\n\nexport function indexEntriesForChanges<T extends DocTypes, K extends IndexKeyType>(\n changes: DocUpdate<T>[],\n mapFn: MapFn<T>,\n): IndexDoc<K>[] {\n const indexEntries: IndexDoc<K>[] = [];\n changes.forEach(({ id: key, value, del }) => {\n if (del || !value) return;\n let mapCalled = false;\n const mapReturn = mapFn({ ...(value as DocWithId<T>), _id: key }, (k: IndexKeyType, v?: DocFragment) => {\n mapCalled = true;\n if (typeof k === \"undefined\") return;\n indexEntries.push({\n key: [charwise.encode(k) as K, key],\n value: v || null,\n });\n });\n if (!mapCalled && mapReturn) {\n indexEntries.push({\n key: [charwise.encode(mapReturn) as K, key],\n value: null,\n });\n }\n });\n return indexEntries;\n}\n\nfunction makeProllyGetBlock(blocks: BlockFetcher): (address: AnyLink) => Promise<AnyBlock> {\n return async (address: AnyLink) => {\n const block = await blocks.get(address);\n if (!block) throw new Error(`Missing block ${address.toString()}`);\n const { cid, bytes } = block;\n return create({ cid, bytes, hasher, codec }) as Promise<AnyBlock>;\n };\n}\n\nexport async function bulkIndex<K extends IndexKeyType, T extends DocFragment, CT>(\n tblocks: CarTransaction,\n inIndex: IndexTree<K, T>,\n indexEntries: (IndexUpdate<K> | IndexUpdateString)[],\n opts: StaticProllyOptions<CT>,\n): Promise<IndexTree<K, T>> {\n if (!indexEntries.length) return inIndex;\n if (!inIndex.root) {\n if (!inIndex.cid) {\n let returnRootBlock: Block | undefined = undefined;\n let returnNode: ProllyNode<K, T> | undefined = undefined;\n\n for await (const node of (await DbIndex.create({\n get: makeProllyGetBlock(tblocks),\n list: indexEntries,\n ...opts,\n })) as ProllyNode<K, T>[]) {\n const block = await node.block;\n await tblocks.put(block.cid, block.bytes);\n returnRootBlock = block;\n returnNode = node;\n }\n if (!returnNode || !returnRootBlock) throw new Error(\"failed to create index\");\n return { root: returnNode, cid: returnRootBlock.cid };\n } else {\n inIndex.root = (await DbIndex.load({ cid: inIndex.cid, get: makeProllyGetBlock(tblocks), ...opts })) as ProllyNode<K, T>;\n }\n }\n const { root, blocks: newBlocks } = await inIndex.root.bulk(indexEntries);\n if (root) {\n for await (const block of newBlocks) {\n await tblocks.put(block.cid, block.bytes);\n }\n return { root, cid: (await root.block).cid };\n } else {\n return { root: undefined, cid: undefined };\n }\n}\n\nexport async function loadIndex<K extends IndexKeyType, T extends DocFragment, CT>(\n tblocks: BlockFetcher,\n cid: AnyLink,\n opts: StaticProllyOptions<CT>,\n): Promise<ProllyNode<K, T>> {\n return (await DbIndex.load({ cid, get: makeProllyGetBlock(tblocks), ...opts })) as ProllyNode<K, T>;\n}\n\nexport async function applyQuery<K extends IndexKeyType, T extends DocObject, R extends DocFragment>(\n crdt: CRDT<T>,\n resp: { result: ProllyIndexRow<K, R>[] },\n query: QueryOpts<K>,\n): Promise<{\n rows: IndexRow<K, T, R>[];\n}> {\n if (query.descending) {\n resp.result = resp.result.reverse();\n }\n if (query.limit) {\n resp.result = resp.result.slice(0, query.limit);\n }\n if (query.includeDocs) {\n resp.result = await Promise.all(\n resp.result.map(async (row) => {\n const val = await crdt.get(row.id);\n const doc = val ? ({ ...val.doc, _id: row.id } as DocWithId<T>) : undefined;\n return { ...row, doc };\n }),\n );\n }\n return {\n rows: resp.result.map(({ key, ...row }) => {\n return {\n key: charwise.decode(key),\n ...row,\n };\n }),\n };\n}\n\nexport function encodeRange(range: [IndexKeyType, IndexKeyType]): [string, string] {\n return [charwise.encode(range[0]), charwise.encode(range[1])];\n}\n\nexport function encodeKey(key: DocFragment): string {\n return charwise.encode(key) as string;\n}\n\nexport interface ProllyIndexRow<K extends IndexKeyType, T extends DocFragment> {\n readonly id: string;\n readonly key: IndexKey<K>;\n readonly value: T;\n}\n\n// ProllyNode type based on the ProllyNode from 'prolly-trees/base'\ninterface ProllyNode<K extends IndexKeyType, T extends DocFragment> extends BaseNode {\n getAllEntries(): PromiseLike<{ [x: string]: unknown; result: ProllyIndexRow<K, T>[] }>;\n getMany<KI extends IndexKeyType>(removeIds: KI[]): Promise<{ /* [x: K]: unknown; */ result: IndexKey<K>[] }>;\n range(a: string, b: string): Promise<{ result: ProllyIndexRow<K, T>[] }>;\n get(key: string): Promise<{ result: ProllyIndexRow<K, T>[] }>;\n bulk(bulk: (IndexUpdate<K> | IndexUpdateString)[]): PromiseLike<{\n readonly root?: ProllyNode<K, T>;\n readonly blocks: Block[];\n }>;\n readonly address: Promise<Link>;\n readonly distance: number;\n compare: (a: unknown, b: unknown) => number;\n readonly cache: unknown;\n readonly block: Promise<Block>;\n}\n\ninterface StaticProllyOptions<T> {\n readonly cache: unknown;\n chunker: (entry: T, distance: number) => boolean;\n readonly codec: unknown;\n readonly hasher: unknown;\n compare: (a: T, b: T) => number;\n}\n","import {\n type ClockHead,\n type DocUpdate,\n type MapFn,\n type IndexUpdate,\n type QueryOpts,\n type IdxMeta,\n type DocFragment,\n type IdxMetaMap,\n type IndexKeyType,\n type IndexRows,\n type DocTypes,\n type IndexUpdateString,\n throwFalsy,\n IndexTransactionMeta,\n SuperThis,\n} from \"./types.js\";\nimport { BaseBlockstore } from \"./blockstore/index.js\";\n\nimport {\n bulkIndex,\n indexEntriesForChanges,\n byIdOpts,\n byKeyOpts,\n IndexTree,\n applyQuery,\n encodeRange,\n encodeKey,\n loadIndex,\n IndexDocString,\n CompareKey,\n} from \"./indexer-helpers.js\";\nimport { CRDT } from \"./crdt.js\";\nimport { ensureLogger } from \"./utils.js\";\nimport { Logger } from \"@adviser/cement\";\n\nexport function index<K extends IndexKeyType = string, T extends DocTypes = NonNullable<unknown>, R extends DocFragment = T>(\n sthis: SuperThis,\n { _crdt }: { _crdt: CRDT<T> | CRDT<NonNullable<unknown>> },\n name: string,\n mapFn?: MapFn<T>,\n meta?: IdxMeta,\n): Index<K, T, R> {\n if (mapFn && meta) throw _crdt.logger.Error().Msg(\"cannot provide both mapFn and meta\").AsError();\n if (mapFn && mapFn.constructor.name !== \"Function\") throw _crdt.logger.Error().Msg(\"mapFn must be a function\").AsError();\n if (_crdt.indexers.has(name)) {\n const idx = _crdt.indexers.get(name) as unknown as Index<K, T>;\n idx.applyMapFn(name, mapFn, meta);\n } else {\n const idx = new Index<K, T>(sthis, _crdt, name, mapFn, meta);\n _crdt.indexers.set(name, idx as unknown as Index<K, NonNullable<unknown>, NonNullable<unknown>>);\n }\n return _crdt.indexers.get(name) as unknown as Index<K, T, R>;\n}\n\n// interface ByIdIndexIten<K extends IndexKeyType> {\n// readonly key: K;\n// readonly value: [K, K];\n// }\n\nexport class Index<K extends IndexKeyType, T extends DocTypes, R extends DocFragment = T> {\n readonly blockstore: BaseBlockstore;\n readonly crdt: CRDT<T>;\n name: string;\n mapFn?: MapFn<T>;\n mapFnString = \"\";\n byKey = new IndexTree<K, R>();\n byId = new IndexTree<K, R>();\n indexHead?: ClockHead;\n includeDocsDefault = false;\n initError?: Error;\n\n ready(): Promise<void> {\n return Promise.all([this.blockstore.ready(), this.crdt.ready()]).then(() => {\n /* noop */\n });\n }\n\n close(): Promise<void> {\n return Promise.all([this.blockstore.close(), this.crdt.close()]).then(() => {\n /* noop */\n });\n }\n destroy(): Promise<void> {\n return Promise.all([this.blockstore.destroy(), this.crdt.destroy()]).then(() => {\n /* noop */\n });\n }\n\n readonly logger: Logger;\n\n constructor(sthis: SuperThis, crdt: CRDT<T> | CRDT<NonNullable<unknown>>, name: string, mapFn?: MapFn<T>, meta?: IdxMeta) {\n this.logger = ensureLogger(sthis, \"Index\");\n this.blockstore = crdt.indexBlockstore;\n this.crdt = crdt as CRDT<T>;\n this.applyMapFn(name, mapFn, meta);\n this.name = name;\n if (!(this.mapFnString || this.initError)) throw this.logger.Error().Msg(\"missing mapFnString\").AsError();\n // this.ready = this.blockstore.ready.then(() => {\n // return;\n // });\n // .then((header: IdxCarHeader) => {\n // // @ts-ignore\n // if (header.head) throw new Error('cannot have head in idx header')\n // if (header.indexes === undefined) throw new Error('missing indexes in idx header')\n // // for (const [name, idx] of Object.entries(header.indexes)) {\n // // index({ _crdt: crdt }, name, undefined, idx as IdxMeta)\n // // }\n // })\n }\n\n applyMapFn(name: string, mapFn?: MapFn<T>, meta?: IdxMeta) {\n if (mapFn && meta) throw this.logger.Error().Msg(\"cannot provide both mapFn and meta\").AsError();\n if (this.name && this.name !== name) throw this.logger.Error().Msg(\"cannot change name\").AsError();\n this.name = name;\n try {\n if (meta) {\n // hydrating from header\n if (this.indexHead && this.indexHead.map((c) => c.toString()).join() !== meta.head.map((c) => c.toString()).join()) {\n throw this.logger.Error().Msg(\"cannot apply different head meta\").AsError();\n }\n\n if (this.mapFnString) {\n // we already initialized from application code\n if (this.mapFnString !== meta.map) {\n this.logger\n .Warn()\n .Msg(`cannot apply different mapFn meta: old mapFnString ${this.mapFnString} new mapFnString ${meta.map}`);\n // throw new Error('cannot apply different mapFn meta')\n } else {\n this.byId.cid = meta.byId;\n this.byKey.cid = meta.byKey;\n this.indexHead = meta.head;\n }\n } else {\n // we are first\n this.mapFnString = meta.map;\n this.byId.cid = meta.byId;\n this.byKey.cid = meta.byKey;\n this.indexHead = meta.head;\n }\n } else {\n if (this.mapFn) {\n // we already initialized from application code\n if (mapFn) {\n if (this.mapFn.toString() !== mapFn.toString()) {\n throw this.logger.Error().Msg(\"cannot apply different mapFn app2\").AsError();\n }\n }\n } else {\n // application code is creating an index\n if (!mapFn) {\n mapFn = ((doc) => (doc as unknown as Record<string, unknown>)[name] ?? undefined) as MapFn<T>;\n }\n if (this.mapFnString) {\n // we already loaded from a header\n if (this.mapFnString !== mapFn.toString()) {\n throw this.logger\n .Error()\n .Str(\"mapFnString\", this.mapFnString)\n .Str(\"mapFn\", mapFn.toString())\n .Msg(\"cannot apply different mapFn app\")\n .AsError();\n }\n } else {\n // we are first\n this.mapFnString = mapFn.toString();\n }\n this.mapFn = mapFn;\n }\n }\n const matches = /=>\\s*(.*)/.test(this.mapFnString);\n this.includeDocsDefault = matches;\n } catch (e) {\n this.initError = e as Error;\n }\n }\n\n async query(opts: QueryOpts<K> = {}): Promise<IndexRows<K, T, R>> {\n await this.ready();\n // this._resetIndex();\n await this._updateIndex();\n await this._hydrateIndex();\n if (!this.byKey.root) {\n return await applyQuery<K, T, R>(this.crdt, { result: [] }, opts);\n }\n if (this.includeDocsDefault && opts.includeDocs === undefined) opts.includeDocs = true;\n if (opts.range) {\n const eRange = encodeRange(opts.range);\n return await applyQuery<K, T, R>(this.crdt, await throwFalsy(this.byKey.root).range(eRange[0], eRange[1]), opts);\n }\n if (opts.key) {\n const encodedKey = encodeKey(opts.key);\n return await applyQuery<K, T, R>(this.crdt, await throwFalsy(this.byKey.root).get(encodedKey), opts);\n }\n if (Array.isArray(opts.keys)) {\n const results = await Promise.all(\n opts.keys.map(async (key: DocFragment) => {\n const encodedKey = encodeKey(key);\n return (await applyQuery<K, T, R>(this.crdt, await throwFalsy(this.byKey.root).get(encodedKey), opts)).rows;\n }),\n );\n return { rows: results.flat() };\n }\n if (opts.prefix) {\n if (!Array.isArray(opts.prefix)) opts.prefix = [opts.prefix];\n // prefix should be always an array\n const start = [...opts.prefix, NaN];\n const end = [...opts.prefix, Infinity];\n const encodedR = encodeRange([start, end]);\n return await applyQuery<K, T, R>(this.crdt, await this.byKey.root.range(...encodedR), opts);\n }\n const all = await this.byKey.root.getAllEntries(); // funky return type\n return await applyQuery<K, T, R>(\n this.crdt,\n {\n // @ts-expect-error getAllEntries returns a different type than range\n result: all.result.map(({ key: [k, id], value }) => ({\n key: k,\n id,\n value,\n })),\n },\n opts,\n );\n }\n\n _resetIndex() {\n this.byId = new IndexTree();\n this.byKey = new IndexTree();\n this.indexHead = undefined;\n }\n\n async _hydrateIndex() {\n if (this.byId.root && this.byKey.root) return;\n if (!this.byId.cid || !this.byKey.cid) return;\n this.byId.root = await loadIndex<K, R, K>(this.blockstore, this.byId.cid, byIdOpts);\n this.byKey.root = await loadIndex<K, R, CompareKey>(this.blockstore, this.byKey.cid, byKeyOpts);\n }\n\n async _updateIndex(): Promise<IndexTransactionMeta> {\n await this.ready();\n if (this.initError) throw this.initError;\n if (!this.mapFn) throw this.logger.Error().Msg(\"No map function defined\").AsError();\n let result: DocUpdate<T>[], head: ClockHead;\n if (!this.indexHead || this.indexHead.length === 0) {\n ({ result, head } = await this.crdt.allDocs());\n } else {\n ({ result, head } = await this.crdt.changes(this.indexHead));\n }\n if (result.length === 0) {\n this.indexHead = head;\n // return { byId: this.byId, byKey: this.byKey } as IndexTransactionMeta;\n }\n let staleKeyIndexEntries: IndexUpdate<K>[] = [];\n let removeIdIndexEntries: IndexUpdateString[] = [];\n if (this.byId.root) {\n const removeIds = result.map(({ id: key }) => key);\n const { result: oldChangeEntries } = await this.byId.root.getMany(removeIds);\n staleKeyIndexEntries = oldChangeEntries.map((key) => ({ key, del: true }));\n removeIdIndexEntries = oldChangeEntries.map((key) => ({ key: key[1], del: true }));\n }\n const indexEntries = indexEntriesForChanges<T, K>(result, this.mapFn); // use a getter to translate from string\n const byIdIndexEntries: IndexDocString[] = indexEntries.map(({ key }) => ({\n key: key[1],\n value: key,\n }));\n const indexerMeta: IdxMetaMap = { indexes: new Map() };\n\n for (const [name, indexer] of this.crdt.indexers) {\n if (indexer.indexHead) {\n indexerMeta.indexes?.set(name, {\n byId: indexer.byId.cid,\n byKey: indexer.byKey.cid,\n head: indexer.indexHead,\n map: indexer.mapFnString,\n name: indexer.name,\n } as IdxMeta);\n }\n }\n if (result.length === 0) {\n return indexerMeta as unknown as IndexTransactionMeta;\n }\n const { meta } = await this.blockstore.transaction<IndexTransactionMeta>(async (tblocks): Promise<IndexTransactionMeta> => {\n this.byId = await bulkIndex<K, R, K>(tblocks, this.byId, removeIdIndexEntries.concat(byIdIndexEntries), byIdOpts);\n this.byKey = await bulkIndex<K, R, CompareKey>(tblocks, this.byKey, staleKeyIndexEntries.concat(indexEntries), byKeyOpts);\n this.indexHead = head;\n if (this.byId.cid && this.byKey.cid) {\n const idxMeta = {\n byId: this.byId.cid,\n byKey: this.byKey.cid,\n head,\n map: this.mapFnString,\n name: this.name,\n } as IdxMeta;\n indexerMeta.indexes?.set(this.name, idxMeta);\n }\n return indexerMeta as unknown as IndexTransactionMeta;\n });\n return meta;\n }\n}\n","import { advance } from \"@web3-storage/pail/clock\";\nimport { root } from \"@web3-storage/pail/crdt\";\nimport { Logger, ResolveOnce } from \"@adviser/cement\";\n\nimport { clockChangesSince } from \"./crdt-helpers.js\";\nimport type { BaseBlockstore, CarTransaction } from \"./blockstore/index.js\";\nimport { type DocUpdate, type ClockHead, type DocTypes, throwFalsy, CRDTMeta } from \"./types.js\";\nimport { applyHeadQueue, ApplyHeadQueue } from \"./apply-head-queue.js\";\nimport { ensureLogger } from \"./utils.js\";\n\nexport class CRDTClock<T extends DocTypes> {\n // todo: track local and remote clocks independently, merge on read\n // that way we can drop the whole remote if we need to\n // should go with making sure the local clock only references locally available blockstore on write\n head: ClockHead = [];\n\n readonly zoomers = new Set<() => void>();\n readonly watchers = new Set<(updates: DocUpdate<T>[]) => void>();\n readonly emptyWatchers = new Set<() => void>();\n\n readonly blockstore: BaseBlockstore;\n\n readonly applyHeadQueue: ApplyHeadQueue<T>;\n\n readonly _ready = new ResolveOnce<void>();\n async ready() {\n return this._ready.once(async () => {\n await this.blockstore.ready();\n });\n }\n\n async close() {\n await this.blockstore.close();\n }\n\n readonly logger: Logger;\n constructor(blockstore: BaseBlockstore) {\n this.blockstore = blockstore;\n this.logger = ensureLogger(blockstore.sthis, \"CRDTClock\");\n this.applyHeadQueue = applyHeadQueue(this.int_applyHead.bind(this), this.logger);\n }\n\n setHead(head: ClockHead) {\n this.head = head;\n }\n\n async applyHead(newHead: ClockHead, prevHead: ClockHead, updates?: DocUpdate<T>[]) {\n for await (const { updates: updatesAcc, all } of this.applyHeadQueue.push({\n newHead,\n prevHead,\n updates,\n })) {\n return this.processUpdates(updatesAcc, all, prevHead);\n }\n }\n\n async processUpdates(updatesAcc: DocUpdate<T>[], all: boolean, prevHead: ClockHead) {\n let internalUpdates = updatesAcc;\n if (this.watchers.size && !all) {\n const changes = await clockChangesSince<T>(throwFalsy(this.blockstore), this.head, prevHead, {}, this.logger);\n internalUpdates = changes.result;\n }\n this.zoomers.forEach((fn) => fn());\n this.notifyWatchers(internalUpdates || []);\n }\n\n notifyWatchers(updates: DocUpdate<T>[]) {\n this.emptyWatchers.forEach((fn) => fn());\n this.watchers.forEach((fn) => fn(updates || []));\n }\n\n onTick(fn: (updates: DocUpdate<T>[]) => void) {\n this.watchers.add(fn);\n }\n\n onTock(fn: () => void) {\n this.emptyWatchers.add(fn);\n }\n\n onZoom(fn: () => void) {\n this.zoomers.add(fn);\n }\n\n async int_applyHead(newHead: ClockHead, prevHead: ClockHead, localUpdates: boolean) {\n // if (!(this.head && prevHead && newHead)) {\n // throw new Error(\"missing head\");\n // }\n // console.log(\"int_applyHead\", this.applyHeadQueue.size(), this.head, newHead, prevHead, localUpdates);\n const ogHead = sortClockHead(this.head);\n newHead = sortClockHead(newHead);\n if (compareClockHeads(ogHead, newHead)) {\n return;\n }\n const ogPrev = sortClockHead(prevHead);\n if (compareClockHeads(ogHead, ogPrev)) {\n this.setHead(newHead);\n return;\n }\n\n const noLoader = !localUpdates;\n // const noLoader = this.head.length === 1 && !updates?.length\n if (!this.blockstore) {\n throw this.logger.Error().Msg(\"missing blockstore\").AsError();\n }\n await validateBlocks(this.logger, newHead, this.blockstore);\n const { meta } = await this.blockstore.transaction<CRDTMeta>(\n async (tblocks: CarTransaction) => {\n const advancedHead = await advanceBlocks(this.logger, newHead, tblocks, this.head);\n const result = await root(tblocks, advancedHead);\n for (const { cid, bytes } of [\n ...result.additions,\n // ...result.removals\n ]) {\n tblocks.putSync(cid, bytes);\n }\n return { head: advancedHead };\n },\n { noLoader, add: false },\n );\n this.setHead(meta.head);\n }\n}\n\n// Helper functions\nfunction sortClockHead(clockHead: ClockHead) {\n return clockHead.sort((a, b) => a.toString().localeCompare(b.toString()));\n}\n\nasync function validateBlocks(logger: Logger, newHead: ClockHead, blockstore?: BaseBlockstore) {\n if (!blockstore) throw logger.Error().Msg(\"missing blockstore\");\n newHead.map(async (cid) => {\n const got = await blockstore.get(cid);\n if (!got) {\n throw logger.Error().Str(\"cid\", cid.toString()).Msg(\"int_applyHead missing block\").AsError();\n }\n });\n}\n\nfunction compareClockHeads(head1: ClockHead, head2: ClockHead) {\n return head1.toString() === head2.toString();\n}\n\nasync function advanceBlocks(logger: Logger, newHead: ClockHead, tblocks: CarTransaction, head: ClockHead) {\n for (const cid of newHead) {\n try {\n head = await advance(tblocks, head, cid);\n } catch (e) {\n logger.Debug().Err(e).Msg(\"failed to advance head\");\n // console.log('failed to advance head:', cid.toString(), e)\n continue;\n }\n }\n return head;\n}\n","import { Logger } from \"@adviser/cement\";\nimport { ClockHead, DocTypes, DocUpdate } from \"./types.js\";\n\ntype ApplyHeadWorkerFunction = (newHead: ClockHead, prevHead: ClockHead, localUpdates: boolean) => Promise<void>;\n\ninterface ApplyHeadTask<T extends DocTypes> {\n readonly newHead: ClockHead;\n readonly prevHead: ClockHead;\n readonly updates?: DocUpdate<T>[];\n}\n\nexport interface ApplyHeadQueue<T extends DocTypes> {\n push(task: ApplyHeadTask<T>): AsyncGenerator<\n {\n readonly updates: DocUpdate<T>[];\n readonly all: boolean;\n },\n void,\n unknown\n >;\n size(): number;\n}\n\nexport function applyHeadQueue<T extends DocTypes>(worker: ApplyHeadWorkerFunction, logger: Logger): ApplyHeadQueue<T> {\n const queue: ApplyHeadTask<T>[] = [];\n let isProcessing = false;\n\n async function* process() {\n if (isProcessing || queue.length === 0) return;\n isProcessing = true;\n const allUpdates: DocUpdate<T>[] = [];\n try {\n while (queue.length > 0) {\n queue.sort((a, b) => (b.updates ? 1 : -1));\n const task = queue.shift();\n if (!task) continue;\n\n // console.time('int_applyHead worker')\n await worker(task.newHead, task.prevHead, task.updates !== null).catch((e) => {\n throw logger.Error().Err(e).Msg(\"int_applyHead worker error\").AsError();\n });\n // console.timeEnd('int_applyHead worker')\n\n if (task.updates) {\n allUpdates.push(...task.updates);\n }\n // Yield the updates if there are no tasks with updates left in the queue or the current task has updates\n if (!queue.some((t) => t.updates) || task.updates) {\n const allTasksHaveUpdates = queue.every((task) => task.updates !== null);\n yield { updates: allUpdates, all: allTasksHaveUpdates };\n allUpdates.length = 0;\n }\n }\n } finally {\n isProcessing = false;\n const generator = process();\n let result = await generator.next();\n while (!result.done) {\n result = await generator.next();\n }\n }\n }\n\n return {\n push(task: ApplyHeadTask<T>): AsyncGenerator<{ updates: DocUpdate<T>[]; all: boolean }, void, unknown> {\n queue.push(task);\n return process();\n },\n size() {\n return queue.length;\n },\n };\n}\n","// export * from \"./sys-container.js\";\nexport * from \"./gateways/file/utils.js\";\n\n// export * as sql from \"./store-sql/index.js\";\nexport * as files from \"./files.js\";\n\nexport * as kb from \"./key-bag.js\";\nexport * as kc from \"./keyed-crypto.js\";\n\nexport * as mf from \"./wait-pr-multiformats/index.js\";\n\nexport { FILESTORE_VERSION } from \"./gateways/file/version.js\";\nexport { INDEXDB_VERSION } from \"./gateways/indexdb/version.js\";\n// export { V0_19SQL_VERSION } from \"./store-sql/v0.19/version.js\";\n","export * as block from \"./block.js\";\nexport * as codec from \"./codec-interface.js\";\n","import type { ArrayBufferView, ByteView } from \"multiformats\";\n\n/**\n * IPLD encoder part of the codec.\n */\nexport interface BlockEncoder<Code extends number, T> {\n name: string;\n code: Code;\n encode(data: T): ByteView<T> | PromiseLike<ByteView<T>>;\n}\n\n/**\n * IPLD decoder part of the codec.\n */\nexport interface BlockDecoder<Code extends number, T> {\n code: Code;\n decode(bytes: ByteView<T> | ArrayBufferView<T>): T | PromiseLike<T>;\n}\n\n/**\n * An IPLD codec is a combination of both encoder and decoder.\n */\nexport interface BlockCodec<Code extends number, T> extends BlockEncoder<Code, T>, BlockDecoder<Code, T> {}\n\nexport type { ArrayBufferView, ByteView };\n","export const PACKAGE_VERSION = Object.keys({\n \"0.19.9-dev-frag\": \"xxxx\",\n})[0] as string;\n"],"mappings":"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","names":["ResolveOnce","index","ResolveOnce","codec","hasher","parse","hasher","KeyedResolvOnce","URI","pLimit","ResolveOnce","Result","Result","toCryptoRuntime","Result","toCryptoRuntime","hasher","dagCodec","codec","hasher","cid","cache","got","batchSize","base58btc","hasher","base58btc","encode","decode","ofs","raw","Result","subscribers","ResolveOnce","pLimit","URI","KeyedResolvOnce","MemoryBlockstore","cid","MemoryBlockstore","hasher","parse","hasher","codec","root","root","ResolveOnce","task","ResolveOnce","root","ResolveOnce","name","ResolveOnce","updates"]}