@fireproof/core 0.19.5-dev → 0.19.8-dev-alldocs
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{chunk-QHSXUST7.js → chunk-5UFCF36O.js} +3 -3
- package/{chunk-HCXR2M5B.js → chunk-DG6XSV44.js} +175 -7
- package/chunk-DG6XSV44.js.map +1 -0
- package/{chunk-H3A2HMMM.js → chunk-OWQAHX2V.js} +2 -2
- package/chunk-OWQAHX2V.js.map +1 -0
- package/{chunk-7OGPZSGT.js → chunk-PRQHQG4I.js} +2 -2
- package/index.cjs +248 -191
- package/index.cjs.map +1 -1
- package/index.d.cts +174 -68
- package/index.d.ts +174 -68
- package/index.global.js +24688 -0
- package/index.global.js.map +1 -0
- package/index.js +60 -127
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/metafile-iife.json +1 -0
- package/{node-sys-container-E7LADX2Z.js → node-sys-container-TTGEC66A.js} +2 -2
- package/package.json +1 -1
- package/{sqlite-data-store-YS4U7AQ4.js → sqlite-data-store-MA55LVQE.js} +4 -4
- package/{sqlite-meta-store-FJZSZG4R.js → sqlite-meta-store-UNQKVYRM.js} +4 -4
- package/{sqlite-wal-store-6JZ4URNS.js → sqlite-wal-store-KVUOC4PO.js} +4 -4
- package/{store-file-HMHPQTUV.js → store-file-WD746RSY.js} +3 -3
- package/{store-indexdb-MRVZG4OG.js → store-indexdb-NG45BU3Q.js} +4 -4
- package/{store-sql-5XMJ5OWJ.js → store-sql-QVFNIGND.js} +7 -69
- package/store-sql-QVFNIGND.js.map +1 -0
- package/tests/blockstore/loader.test.ts +265 -0
- package/tests/blockstore/store.test.ts +164 -0
- package/tests/blockstore/transaction.test.ts +121 -0
- package/tests/fireproof/config.test.ts +212 -0
- package/tests/fireproof/crdt.test.ts +434 -0
- package/tests/fireproof/database.test.ts +466 -0
- package/tests/fireproof/fireproof.test.ts +602 -0
- package/tests/fireproof/hello.test.ts +54 -0
- package/tests/fireproof/indexer.test.ts +389 -0
- package/tests/helpers.ts +81 -0
- package/tests/react/useFireproof.test.tsx +19 -0
- package/tests/www/gallery.html +132 -0
- package/tests/www/iife.html +42 -0
- package/tests/www/todo-aws.html +232 -0
- package/tests/www/todo-ipfs.html +213 -0
- package/tests/www/todo-local.html +214 -0
- package/tests/www/todo-netlify.html +227 -0
- package/tests/www/todo.html +236 -0
- package/chunk-H3A2HMMM.js.map +0 -1
- package/chunk-HCXR2M5B.js.map +0 -1
- package/store-sql-5XMJ5OWJ.js.map +0 -1
- /package/{chunk-QHSXUST7.js.map → chunk-5UFCF36O.js.map} +0 -0
- /package/{chunk-7OGPZSGT.js.map → chunk-PRQHQG4I.js.map} +0 -0
- /package/{node-sys-container-E7LADX2Z.js.map → node-sys-container-TTGEC66A.js.map} +0 -0
- /package/{sqlite-data-store-YS4U7AQ4.js.map → sqlite-data-store-MA55LVQE.js.map} +0 -0
- /package/{sqlite-meta-store-FJZSZG4R.js.map → sqlite-meta-store-UNQKVYRM.js.map} +0 -0
- /package/{sqlite-wal-store-6JZ4URNS.js.map → sqlite-wal-store-KVUOC4PO.js.map} +0 -0
- /package/{store-file-HMHPQTUV.js.map → store-file-WD746RSY.js.map} +0 -0
- /package/{store-indexdb-MRVZG4OG.js.map → store-indexdb-NG45BU3Q.js.map} +0 -0
package/index.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/types.ts","../../src/runtime/node-sys-container.ts","../../src/runtime/sys-container.ts","../../src/runtime/data-dir.ts","../../src/runtime/store-file-utils.ts","../../src/runtime/store-file-version.ts","../../src/runtime/store-indexdb-version.ts","../../src/runtime/store-sql/v0.19-sqlite/version.ts","../../src/runtime/index.ts","../../src/utils.ts","../../src/blockstore/gateway.ts","../../src/runtime/store-indexdb.ts","../../src/runtime/store-file.ts","../../src/runtime/store-sql/types.ts","../../src/runtime/store-sql/ensurer.ts","../../src/runtime/store-sql/sqlite-adapter-better-sqlite3.ts","../../src/runtime/store-sql/sql-connection-factory.ts","../../src/runtime/store-sql/v0.19-sqlite/sqlite-ensure-version.ts","../../src/runtime/store-sql/v0.19-sqlite/sqlite-wal-store.ts","../../src/runtime/store-sql/v0.19-sqlite/sqlite-data-store.ts","../../src/runtime/store-sql/v0.19-sqlite/sqlite-meta-store.ts","../../src/runtime/store-sql/store-version-factory.ts","../../src/runtime/store-sql/store-sql.ts","../../src/index.ts","../../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/runtime/files.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/runtime/crypto.ts","../../src/blockstore/commit-queue.ts","../../src/indexer.ts","../../src/indexer-helpers.ts","../../src/crdt-clock.ts","../../src/apply-head-queue.ts","../../src/version.ts"],"sourcesContent":["import type { EventLink } from \"@web3-storage/pail/clock/api\";\nimport type { Operation } from \"@web3-storage/pail/crdt/api\";\n\nimport type { DbMeta, CryptoOpts, StoreOpts, AnyLink } from \"./blockstore/index.js\";\nimport { Logger } from \"@adviser/cement\";\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 interface ConfigOpts {\n readonly public?: boolean;\n readonly meta?: DbMeta;\n readonly persistIndexes?: boolean;\n readonly autoCompact?: number;\n readonly crypto?: CryptoOpts;\n readonly store?: StoreOpts;\n // readonly indexStore?: StoreOpts;\n readonly threshold?: number;\n readonly logger?: Logger;\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\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}\n\nexport interface DbResponse {\n readonly id: string;\n readonly clock: ClockHead;\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 { type NodeMap, join } from \"./sys-container.js\";\n\nexport async function createNodeSysContainer(): Promise<NodeMap> {\n const nodePath = \"node:path\";\n const nodeOS = \"node:os\";\n const nodeURL = \"node:url\";\n const nodeFS = \"node:fs\";\n const fs = (await import(nodeFS)).promises;\n // const assert = \"assert\";\n const path = await import(nodePath);\n return {\n state: \"node\",\n ...path,\n ...(await import(nodeOS)),\n ...(await import(nodeURL)),\n ...fs,\n join,\n stat: fs.stat as NodeMap[\"stat\"],\n readdir: fs.readdir as NodeMap[\"readdir\"],\n readfile: fs.readFile as NodeMap[\"readfile\"],\n writefile: fs.writeFile as NodeMap[\"writefile\"],\n };\n}\n","import type { Dirent, MakeDirectoryOptions, ObjectEncodingOptions, PathLike, Stats } from \"node:fs\";\n\nimport * as stdEnv from \"std-env\";\nimport { uuidv4 } from \"uuidv7\";\nimport { ResolveOnce, EnvImpl } from \"@adviser/cement\";\n\nimport { throwFalsy } from \"../types.js\";\n\nexport interface NodeMap {\n state: \"seeded\" | \"browser\" | \"node\";\n join: (...args: string[]) => string;\n dirname: (path: string) => string;\n homedir: () => string;\n fileURLToPath: (url: string | URL) => string;\n // assert: (condition: unknown, message?: string | Error) => void;\n\n mkdir: (path: PathLike, options?: { recursive: boolean }) => Promise<string | undefined>;\n readdir: (path: PathLike, options?: unknown) => Promise<unknown[]>;\n\n rm: (path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }) => Promise<void>;\n copyFile: (source: PathLike, destination: PathLike) => Promise<void>;\n\n readfile: (path: PathLike, options?: { encoding: BufferEncoding; flag?: string }) => Promise<string>;\n\n stat: (path: PathLike) => Promise<Stats>;\n\n unlink: (path: PathLike) => Promise<void>;\n writefile: (path: PathLike, data: Uint8Array | string) => Promise<void>;\n}\n\n// export function assert(condition: unknown, message?: string | Error): asserts condition {\n// SysContainer.freight?.assert(condition, message);\n// }\n\nconst onceStart = new ResolveOnce<void>();\n\nexport function join(...paths: string[]): string {\n return paths.map((i) => i.replace(/\\/+$/, \"\")).join(\"/\");\n}\n\nconst envImpl = new EnvImpl({\n symbol: \"FP_ENV\",\n presetEnv: new Map([\n // [\"FP_DEBUG\", \"xxx\"],\n // [\"FP_ENV\", \"development\"],\n ]),\n});\n// console.log(`EnvImpl`, envImpl);\n\nclass sysContainer {\n freight: NodeMap = {\n state: \"seeded\",\n join,\n dirname: (path: string) => path.split(\"/\").slice(0, -1).join(\"/\"),\n homedir: () => {\n throw new Error(\"SysContainer:homedir is not available in seeded state\");\n },\n fileURLToPath: (strurl: string | URL) => {\n let url: URL;\n if (typeof strurl === \"string\") {\n url = new URL(strurl);\n } else {\n url = strurl;\n }\n return url.pathname;\n },\n // assert: (condition: unknown, message?: string | Error) => {\n // if (!condition) {\n // if (message instanceof Error) {\n // throw message;\n // } else {\n // throw new Error(message);\n // }\n // }\n // },\n mkdir: () => Promise.reject(new Error(\"SysContainer:mkdir is not available in seeded state\")),\n readdir: () => Promise.reject(new Error(\"SysContainer:readdir is not available in seeded state\")),\n rm: () => Promise.reject(new Error(\"SysContainer:rm is not available in seeded state\")),\n copyFile: () => Promise.reject(new Error(\"SysContainer:copyFile is not available in seeded state\")),\n readfile: () => Promise.reject(new Error(\"SysContainer:readfile is not available in seeded state\")),\n unlink: () => Promise.reject(new Error(\"SysContainer:unlink is not available in seeded state\")),\n writefile: () => Promise.reject(new Error(\"SysContainer:writefile is not available in seeded state\")),\n stat: () => Promise.reject(new Error(\"SysContainer:stat is not available in seeded state\")),\n };\n\n readonly id = uuidv4();\n\n async start(): Promise<void> {\n await onceStart.once(async () => {\n switch (this.freight.state) {\n case \"seeded\":\n if (stdEnv.isNode) {\n const { createNodeSysContainer } = await import(\"./node-sys-container.js\");\n // console.log(\"use NodeSysContainer\");\n this.freight = await createNodeSysContainer();\n } else {\n // console.log(\"use BrowserSysContainer\");\n this.freight.state = \"browser\";\n }\n return;\n case \"browser\":\n case \"node\":\n return;\n }\n });\n }\n\n async readdir(\n path: PathLike,\n options?:\n | (ObjectEncodingOptions & { withFileTypes?: false | undefined; recursive?: boolean })\n | BufferEncoding\n | null\n | undefined,\n ) {\n this.logSeeded(\"readdir\");\n return (throwFalsy(this.freight).readdir(path, options) as Promise<string[]>) || [];\n }\n async readdirent(\n path: PathLike,\n options: (ObjectEncodingOptions & { withFileTypes: true; recursive?: boolean }) | BufferEncoding | null | undefined,\n ): Promise<Dirent[]> {\n this.logSeeded(\"readdirent\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (throwFalsy(this.freight).readdir(path, { ...(options as any), withFileTypes: true }) as Promise<Dirent[]>) || [];\n }\n\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }) {\n this.logSeeded(\"readfile\");\n return throwFalsy(this.freight).readfile(path, options) as unknown as Promise<Buffer>;\n }\n\n async mkdir(path: PathLike, options: { recursive: boolean }) {\n this.logSeeded(\"mkdir\");\n return throwFalsy(this.freight).mkdir(path, options);\n }\n\n async rm(path: PathLike, options: MakeDirectoryOptions & { recursive: boolean }) {\n this.logSeeded(\"rm\");\n return throwFalsy(this.freight).rm(path, options);\n }\n\n async unlink(path: PathLike) {\n this.logSeeded(\"unlink\");\n return throwFalsy(this.freight).unlink(path);\n }\n\n async writefile(path: PathLike, data: Uint8Array | string) {\n this.logSeeded(\"writefile\");\n return throwFalsy(this.freight).writefile(path, data);\n }\n\n async copyFile(source: PathLike, destination: PathLike) {\n this.logSeeded(\"copyFile\");\n return throwFalsy(this.freight).copyFile(source, destination);\n }\n\n async stat(path: PathLike) {\n this.logSeeded(\"stat\");\n return throwFalsy(this.freight).stat(path);\n }\n\n fileURLToPath(url: string | URL) {\n this.logSeeded(\"fileURLToPath\");\n return throwFalsy(this.freight).fileURLToPath(url);\n }\n\n dirname(path: string) {\n this.logSeeded(\"dirname\");\n return throwFalsy(this.freight).dirname(path);\n }\n\n join(...args: string[]): string {\n this.logSeeded(\"join\");\n return throwFalsy(this.freight).join(...args);\n }\n\n homedir = () => {\n this.logSeeded(\"homedir\");\n return throwFalsy(this.freight).homedir();\n };\n\n logSeeded(method: string) {\n if (this.freight.state === \"seeded\") {\n const err = new Error();\n console.warn(`SysContainer.${method} is not available in seeded state:`, err.stack);\n }\n }\n readonly env = envImpl;\n}\n\n// // eslint-disable-next-line @typescript-eslint/no-explicit-any\n// export async function saveImport(fName: string): Promise<any> {\n// try {\n// const i = await import(fName);\n// return i;\n// } catch (e: unknown) {\n// console.error(`saveImport failed for ${fName} with`, e);\n// throw e;\n// }\n// }\n\nexport const SysContainer = new sysContainer();\n","import { SysContainer } from \"./sys-container.js\";\nimport { isDeno, isNode } from \"std-env\";\n\nexport function dataDir(name?: string, base?: string | URL): string {\n const dataDir = _dataDir(name, base);\n // console.log(\"dataDir->\", dataDir, name, base);\n return dataDir;\n}\n\nfunction _dataDir(name?: string, base?: string | URL): string {\n if (!base) {\n if (isNode || isDeno) {\n base = SysContainer.env.get(\"FP_STORAGE_URL\") || `file://${SysContainer.join(SysContainer.homedir(), \".fireproof\")}`;\n } else {\n base = `indexdb://fp`;\n }\n }\n let url: URL;\n if (typeof base === \"string\") {\n try {\n url = new URL(base.toString());\n } catch (e) {\n try {\n base = `file://${base}`;\n url = new URL(base);\n } catch (e) {\n throw new Error(`invalid base url: ${base}`);\n }\n }\n } else {\n url = base;\n }\n url.searchParams.set(\"name\", name || \"\");\n return url.toString();\n}\n","import { Logger, getStore } from \"../utils.js\";\nimport { SysContainer } from \"./sys-container.js\";\n\nexport async function getPath(url: URL, logger: Logger): Promise<string> {\n const basePath = url\n .toString()\n .replace(new RegExp(`^${url.protocol}//`), \"\")\n .replace(/\\?.*$/, \"\");\n const name = url.searchParams.get(\"name\");\n if (name) {\n const version = url.searchParams.get(\"version\");\n if (!version) throw logger.Error().Str(\"url\", url.toString()).Msg(`version not found`).AsError();\n return SysContainer.join(basePath, version, name);\n }\n return SysContainer.join(basePath);\n}\n\nexport function getFileName(url: URL, key: string, logger: Logger): string {\n switch (getStore(url, logger, (...a: string[]) => a.join(\"/\"))) {\n case \"data\":\n return key + \".car\";\n case \"meta\":\n return key + \".json\";\n default:\n throw logger.Error().Str(\"url\", url.toString()).Msg(`unsupported store type`).AsError();\n }\n}\n\nexport function ensureIndexName(url: URL, name: string): string {\n if (url.searchParams.has(\"index\")) {\n name = (url.searchParams.get(\"index\")?.replace(/[^a-zA-Z0-9]/g, \"\") || \"idx\") + \"-\" + name;\n }\n return name;\n}\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","export const INDEXDB_VERSION = \"v0.19-indexdb\";\n","export const SQLITE_VERSION = \"v0.19-sqlite\";\n","export * from \"./sys-container.js\";\nexport * from \"./data-dir.js\";\nexport * from \"./store-file-utils.js\";\n\nexport { FILESTORE_VERSION } from \"./store-file-version.js\";\nexport { INDEXDB_VERSION } from \"./store-indexdb-version.js\";\nexport { SQLITE_VERSION } from \"./store-sql/v0.19-sqlite/version.js\";\n","import { Logger, LoggerImpl, IsLogger, Result, ResolveOnce } from \"@adviser/cement\";\nimport { SysContainer } from \"./runtime\";\nimport { uuidv7 } from \"uuidv7\";\n\nexport type { Logger };\n\nconst globalLogger: Logger = new LoggerImpl();\n\nexport interface LoggerOpts {\n readonly logger?: Logger;\n}\n\nconst registerFP_DEBUG = new ResolveOnce();\n\nexport function ensureLogger(\n optsOrLogger: Partial<LoggerOpts> | Logger,\n componentName: string,\n ctx?: Record<string, unknown>,\n): Logger {\n // if (!opts?.logger) {\n // throw new Error(\"logger is required\");\n // }\n let logger = globalLogger;\n if (IsLogger(optsOrLogger)) {\n logger = optsOrLogger;\n } else if (optsOrLogger && IsLogger(optsOrLogger.logger)) {\n logger = optsOrLogger.logger;\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n if (ctx) {\n if (\"debug\" in ctx) {\n if (typeof ctx.debug === \"string\" && ctx.debug.length > 0) {\n debug.push(ctx.debug);\n } else {\n debug.push(componentName);\n }\n delete ctx.debug;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", uuidv7());\n delete ctx.this;\n }\n for (const [key, value] of Object.entries(ctx)) {\n switch (typeof value) {\n case \"string\":\n cLogger.Str(key, value);\n break;\n case \"number\":\n cLogger.Uint64(key, value);\n break;\n default:\n if (value instanceof Date) {\n cLogger.Str(key, value.toISOString());\n } else if (value instanceof URL) {\n cLogger.Str(key, value.toString());\n } else if (typeof value === \"function\") {\n cLogger.Ref(key, value);\n } else {\n cLogger.Any(key, value);\n }\n break;\n }\n }\n }\n registerFP_DEBUG\n .once(async () => {\n // console.log(\"registerFP_DEBUG\", SysContainer.env)\n SysContainer.env.onSet((key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n if (value) {\n logger.SetDebug(value);\n }\n }, \"FP_DEBUG\");\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n const out = cLogger.Logger();\n // out.Debug().Msg(\"logger ready\");\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport function getStore(url: URL, logger: Logger, joiner: Joiner): string {\n let result = url.searchParams.get(\"store\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`store not found`).AsError();\n if (url.searchParams.has(\"index\")) {\n result = joiner(url.searchParams.get(\"index\") || \"idx\", result);\n }\n return result;\n}\n\nexport function getKey(url: URL, logger: Logger): string {\n const result = url.searchParams.get(\"key\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(url: URL, logger: Logger): string {\n let result = url.searchParams.get(\"name\");\n if (!result) {\n result = SysContainer.dirname(url.pathname);\n if (result.length === 0) {\n throw logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\nexport function exception2Result<T = void>(fn: () => Promise<T>): Promise<Result<T>> {\n return fn()\n .then((value) => Result.Ok(value))\n .catch((e) => Result.Err(e));\n}\n\nexport async function exceptionWrapper<T, E extends Error>(fn: () => Promise<Result<T, E>>): Promise<Result<T, E>> {\n return fn().catch((e) => Result.Err(e));\n}\n","import { Result } from \"@adviser/cement\";\n\nexport interface GatewayOpts {\n readonly gateway: Gateway;\n}\n\nexport class NotFoundError extends Error {\n readonly code = \"ENOENT\";\n}\n\nexport function isNotFoundError(e: Error | Result<unknown> | unknown): e is NotFoundError {\n if (Result.Is(e)) {\n if (e.isOk()) return false;\n e = e.Err();\n }\n if ((e as NotFoundError).code === \"ENOENT\") return true;\n return false;\n}\n\nexport type GetResult = Result<Uint8Array, NotFoundError | Error>;\nexport type VoidResult = Result<void>;\n\nexport interface Gateway {\n // all the methods never throw!\n // an error is reported as a Result\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n // start updates URL --> hate this side effect\n start(baseUrl: URL): Promise<VoidResult>;\n close(baseUrl: URL): Promise<VoidResult>;\n destroy(baseUrl: URL): Promise<VoidResult>;\n put(url: URL, body: Uint8Array): Promise<VoidResult>;\n // get could return a NotFoundError if the key is not found\n get(url: URL): Promise<GetResult>;\n delete(url: URL): Promise<VoidResult>;\n}\n","import { openDB, IDBPDatabase } from \"idb\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\n\nimport { TestStore } from \"../blockstore/types.js\";\nimport { INDEXDB_VERSION } from \"./store-indexdb-version.js\";\nimport { ensureLogger, exception2Result, exceptionWrapper, getKey, getStore } from \"../utils.js\";\nimport { Gateway, NotFoundError } from \"../blockstore/gateway.js\";\nimport { SysContainer } from \"./sys-container.js\";\n\nfunction ensureVersion(url: URL): URL {\n const ret = new URL(url.toString());\n ret.searchParams.set(\"version\", url.searchParams.get(\"version\") || INDEXDB_VERSION);\n return ret;\n}\n\nexport function 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\nconst onceIndexDB = new KeyedResolvOnce<{\n readonly db: IDBPDatabase<unknown>;\n readonly dbName: DbName;\n readonly version: string;\n}>();\n\nfunction sanitzeKey(key: string | string[]): string | string[] {\n if (key.length === 1) {\n key = key[0];\n }\n return key;\n}\n\nasync function connectIdb(url: URL, logger: Logger): Promise<IDBPDatabase<unknown>> {\n const dbName = getIndexDBName(url, logger); // `fp.${this.STORAGE_VERSION}.${this.name}`;\n // const urlStr = url.toString().replace(/\\?.*$/, \"\");\n // console.log(`get:${this.id}`);\n // console.log(`connectIdb:pre:`, dbName, url.toString());\n const once = await onceIndexDB.get(dbName.fullDb).once(async () => {\n // console.log(`connectIdb:once:`, dbName, url.toString());\n const db = await openDB(dbName.fullDb, 1, {\n upgrade(db) {\n // console.log('upgrade:', dbName);\n [\"version\", \"data\", \"wal\", \"meta\", \"idx.data\", \"idx.wal\", \"idx.meta\"].map((store) => {\n db.createObjectStore(store, {\n autoIncrement: false,\n });\n });\n },\n });\n const found = await db.get(\"version\", \"version\");\n const version = url.searchParams.get(\"version\") || INDEXDB_VERSION;\n if (!found) {\n await db.put(\"version\", { version }, \"version\");\n } else if (found.version !== version) {\n logger\n .Warn()\n .Str(\"url\", url.toString())\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .Str(\"version\", version!)\n .Str(\"found\", found.version)\n .Msg(\"version mismatch\");\n }\n return { db, dbName, version };\n });\n url.searchParams.set(\"version\", once.version);\n return once.db;\n}\n\nexport interface DbName {\n readonly fullDb: string;\n readonly objStore: string;\n readonly connectionKey: string;\n // readonly version: number;\n // readonly type: \"data\" | \"meta\" | \"wal\";\n readonly dbName: string;\n}\n\nfunction joinDBName(...names: string[]): string {\n return names\n .map((i) => i.replace(/^[^a-zA-Z0-9]+/g, \"\").replace(/[^a-zA-Z0-9]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\".\");\n}\n\n// const schemaVersion = new Map<string, number>();\nexport function getIndexDBName(iurl: URL, logger: Logger): DbName {\n const url = ensureVersion(iurl);\n const fullDb = url.pathname.replace(/^\\/+/, \"\").replace(/\\?.*$/, \"\"); // cut leading slashes\n // const type = getStore(url);\n // const storageVersion = url.searchParams.get(\"version\");\n // not nice but we need to pass the version to the db name\n // url.searchParams.set(\"version\", storageVersion);\n // console.log(\"getIndexDBName:\", url.toString(), { fullDb, type, branch });\n // const dbName = fullDb.replace(new RegExp(`^fp.${storageVersion}.`), \"\"); // cut fp prefix\n const dbName = url.searchParams.get(\"name\");\n if (!dbName) throw logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n const result = joinDBName(fullDb, dbName);\n const objStore = getStore(url, logger, joinDBName);\n const connectionKey = [result, objStore].join(\":\");\n return {\n fullDb: result,\n objStore,\n connectionKey,\n dbName,\n };\n}\n\nabstract class IndexDBGateway implements Gateway {\n readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = logger;\n }\n db: IDBPDatabase<unknown> = {} as IDBPDatabase<unknown>;\n idb() {\n this.db;\n }\n\n async start(baseURL: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseURL).Msg(\"starting\");\n await SysContainer.start();\n this.db = await connectIdb(baseURL, this.logger);\n this.logger.Debug().Url(baseURL).Msg(\"started\");\n });\n }\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n async destroy(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n // return deleteDB(getIndexDBName(this.url).fullDb);\n const type = getStore(baseUrl, this.logger, joinDBName);\n // console.log(\"IndexDBDataStore:destroy\", type);\n const idb = this.db;\n const trans = idb.transaction(type, \"readwrite\");\n const object_store = trans.objectStore(type);\n const toDelete = [];\n for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {\n toDelete.push(cursor.primaryKey);\n }\n for (const key of toDelete) {\n await trans.db.delete(type, key);\n }\n await trans.done;\n });\n }\n\n abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n\n async get(url: URL) {\n return exceptionWrapper(async () => {\n const key = getKey(url, this.logger);\n const store = getStore(url, this.logger, joinDBName);\n this.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"getting\");\n const tx = this.db.transaction([store], \"readonly\");\n const bytes = await tx.objectStore(store).get(sanitzeKey(key));\n await tx.done;\n if (!bytes) {\n return Result.Err(new NotFoundError(`missing ${key}`));\n }\n return Result.Ok(bytes as Uint8Array);\n });\n }\n async put(url: URL, value: Uint8Array) {\n return exception2Result(async () => {\n const key = getKey(url, this.logger);\n const store = getStore(url, this.logger, joinDBName);\n this.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"putting\");\n const tx = this.db.transaction([store], \"readwrite\");\n await tx.objectStore(store).put(value, sanitzeKey(key));\n await tx.done;\n });\n }\n async delete(url: URL) {\n return exception2Result(async () => {\n const key = getKey(url, this.logger);\n const store = getStore(url, this.logger, joinDBName);\n this.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"deleting\");\n const tx = this.db.transaction([store], \"readwrite\");\n await tx.objectStore(store).delete(sanitzeKey(key));\n await tx.done;\n return Result.Ok(undefined);\n });\n }\n}\n\nexport class IndexDBDataGateway extends IndexDBGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"IndexDBDataGateway\", {}));\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n}\n\nexport class IndexDBWalGateway extends IndexDBGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"IndexDBWalGateway\", {}));\n }\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n}\nexport class IndexDBMetaGateway extends IndexDBGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"IndexDBDataGateway\", {}));\n }\n\n readonly branches = new Set<string>();\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n this.branches.add(key);\n url.searchParams.set(\"key\", key);\n return Result.Ok(url);\n }\n}\n\nconst txtEncoder = new TextEncoder();\nexport class IndexDBTestStore implements TestStore {\n readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"IndexDBTestStore\", {});\n }\n async get(url: URL, key: string) {\n const db = await connectIdb(url, this.logger);\n const store = getStore(url, this.logger, joinDBName);\n this.logger.Debug().Str(\"key\", key).Str(\"store\", store).Msg(\"getting\");\n let bytes = await db.get(store, sanitzeKey(key));\n this.logger.Debug().Str(\"key\", key).Str(\"store\", store).Int(\"len\", bytes.length).Msg(\"got\");\n if (typeof bytes === \"string\") {\n bytes = txtEncoder.encode(bytes);\n }\n return bytes as Uint8Array;\n }\n}\n","import { SysContainer } from \"./sys-container.js\";\nimport { TestStore } from \"../blockstore/types.js\";\nimport { FILESTORE_VERSION } from \"./store-file-version.js\";\nimport { Logger, ResolveOnce, Result } from \"@adviser/cement\";\nimport { ensureLogger, exception2Result, exceptionWrapper, getStore } from \"../utils.js\";\nimport { Gateway, GetResult, isNotFoundError, NotFoundError } from \"../blockstore/gateway.js\";\nimport { ensureIndexName, getFileName, getPath } from \"./store-file-utils.js\";\n\nconst versionFiles = new Map<string, ResolveOnce<void>>();\nasync function ensureVersionFile(path: string, logger: Logger): Promise<string> {\n let once = versionFiles.get(path);\n if (!once) {\n once = new ResolveOnce<void>();\n versionFiles.set(path, once);\n }\n await once.once(async () => {\n await SysContainer.mkdir(path, { recursive: true });\n const vFile = SysContainer.join(path, \"version\");\n const vFileStat = await SysContainer.stat(vFile).catch(() => undefined);\n if (!vFileStat) {\n await SysContainer.writefile(SysContainer.join(path, \"version\"), FILESTORE_VERSION);\n return;\n } else if (!vFileStat.isFile()) {\n throw logger.Error().Str(\"file\", vFile).Msg(`version file is a directory`).AsError();\n }\n const v = await SysContainer.readfile(vFile);\n if (v.toString() !== FILESTORE_VERSION) {\n console.warn(`version mismatch:${vFile}: ${v.toString()}!=${FILESTORE_VERSION}`);\n }\n });\n return path;\n}\n\nabstract class FileGateway implements Gateway {\n readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = logger;\n }\n start(baseURL: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n await SysContainer.start();\n baseURL.searchParams.set(\"version\", baseURL.searchParams.get(\"version\") || FILESTORE_VERSION);\n const url = await this.buildUrl(baseURL, \"dummy\");\n if (url.isErr()) return url;\n const dbdir = this.getFilePath(url.Ok());\n // remove dummy\n await SysContainer.mkdir(SysContainer.dirname(dbdir), { recursive: true });\n const dbroot = SysContainer.dirname(dbdir);\n this.logger.Debug().Str(\"url\", url.Ok().toString()).Str(\"dbroot\", SysContainer.dirname(dbroot)).Msg(\"start\");\n await ensureVersionFile(dbroot, this.logger);\n });\n }\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n abstract destroy(baseUrl: URL): Promise<Result<void>>;\n abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n\n getFilePath(url: URL): string {\n const path = url\n .toString()\n .replace(/^file:\\/\\//, \"\")\n .replace(/\\?.*$/, \"\");\n this.logger.Debug().Str(\"url\", url.toString()).Str(\"path\", path).Msg(\"getFilePath\");\n return path;\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const file = this.getFilePath(url);\n this.logger.Debug().Str(\"url\", url.toString()).Str(\"file\", file).Msg(\"put\");\n await SysContainer.writefile(file, body);\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const file = this.getFilePath(url);\n try {\n const res = await SysContainer.readfile(file);\n this.logger.Debug().Url(url).Str(\"file\", file).Msg(\"get\");\n return Result.Ok(new Uint8Array(res));\n } catch (e: unknown) {\n // this.logger.Error().Err(e).Str(\"file\", file).Msg(\"get\");\n if (isNotFoundError(e)) {\n return Result.Err(new NotFoundError(`file not found: ${file}`));\n }\n return Result.Err(e as Error);\n }\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n await SysContainer.unlink(this.getFilePath(url));\n });\n }\n\n async destroyDir(baseURL: URL): Promise<Result<void>> {\n const url = await this.buildUrl(baseURL, \"x\");\n if (url.isErr()) return url;\n const filepath = SysContainer.dirname(this.getFilePath(url.Ok()));\n let dir: string[] = [];\n try {\n dir = await SysContainer.readdir(filepath);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"dir\", filepath).Msg(\"destroy:readdir\").AsError();\n }\n }\n for (const file of dir) {\n const pathed = SysContainer.join(filepath, file);\n try {\n await SysContainer.unlink(pathed);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"file\", pathed).Msg(\"destroy:unlink\").AsError();\n }\n }\n }\n return Result.Ok(undefined);\n }\n}\n\nexport class FileWALGateway extends FileGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"FileWALGateway\"));\n }\n\n async destroy(baseURL: URL): Promise<Result<void>> {\n return this.destroyDir(baseURL);\n }\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, \"wal\"), key + \".json\");\n return Result.Ok(url);\n }\n}\n\nexport class FileMetaGateway extends FileGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"FileMetaGateway\"));\n }\n\n async destroy(baseURL: URL): Promise<Result<void>> {\n return this.destroyDir(baseURL);\n }\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, \"meta\"), key + \".json\");\n return Result.Ok(url);\n }\n}\n\nexport class FileDataGateway extends FileGateway {\n readonly branches = new Set<string>();\n constructor(logger: Logger) {\n // console.log(\"FileDataGateway->\", logger);\n super(ensureLogger(logger, \"FileDataGateway\"));\n }\n\n async destroy(baseURL: URL): Promise<Result<void>> {\n return this.destroyDir(baseURL);\n }\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, \"data\"), key + \".car\");\n return Result.Ok(url);\n }\n}\n\nfunction toArrayBuffer(buffer: Buffer) {\n const ab = new ArrayBuffer(buffer.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buffer.length; ++i) {\n view[i] = buffer[i];\n }\n return view;\n}\n\nexport class FileTestStore implements TestStore {\n readonly logger: Logger;\n constructor(\n // readonly url: URL,\n logger: Logger,\n ) {\n this.logger = ensureLogger(logger, \"FileTestStore\");\n }\n\n async get(url: URL, key: string) {\n const logger = ensureLogger(this.logger, \"get\", { url: url.toString(), key });\n const dbFile = SysContainer.join(\n await getPath(url, this.logger),\n getStore(url, this.logger, SysContainer.join),\n getFileName(url, key, this.logger),\n );\n logger.Debug().Str(\"dbFile\", dbFile).Msg(\"get\");\n const buffer = await SysContainer.readfile(dbFile);\n logger.Debug().Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n return toArrayBuffer(buffer);\n }\n}\n","import { Logger, Result } from \"@adviser/cement\";\nimport type { RunResult } from \"better-sqlite3\";\n\nexport interface DBConnection {\n connect(): Promise<void>;\n readonly opts: SQLOpts;\n}\n\nexport interface SQLStore<IType, KType, OType = IType[]> {\n readonly dbConn: DBConnection;\n start(url: URL): Promise<void>;\n insert(url: URL, ose: IType): Promise<RunResult>;\n select(url: URL, car: KType): Promise<OType>;\n delete(url: URL, car: KType): Promise<RunResult>;\n close(url: URL): Promise<Result<void>>;\n destroy(url: URL): Promise<Result<void>>;\n}\n\nexport interface SQLTableNames {\n readonly data: string;\n readonly meta: string;\n readonly wal: string;\n}\n\nexport const DefaultSQLTableNames: SQLTableNames = {\n data: \"Datas\",\n meta: \"Metas\",\n wal: \"Wals\",\n};\n\nexport interface SQLOpts {\n readonly url: URL;\n readonly sqlFlavor: \"sqlite\" | \"mysql\" | \"postgres\";\n readonly tableNames: SQLTableNames;\n readonly logger: Logger;\n readonly textEncoder: TextEncoder;\n readonly textDecoder: TextDecoder;\n}\n\nexport interface WalKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface WalRecord extends WalKey {\n readonly state: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type WalSQLStore = SQLStore<WalRecord, WalKey>;\n\nexport interface MetaType {\n readonly name: string;\n readonly branch: string;\n readonly meta: Uint8Array;\n}\n\nexport interface MetaRecordKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface MetaRecord extends MetaRecordKey {\n readonly meta: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type MetaSQLStore = SQLStore<MetaRecord, MetaRecordKey>;\n\nexport interface DataRecord {\n readonly name: string;\n readonly car: string;\n readonly data: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type DataSQLStore = SQLStore<DataRecord, string>;\n","import { ensureLogger, type Logger } from \"../../utils\";\nimport { SQLOpts, SQLTableNames, DefaultSQLTableNames } from \"./types\";\n\nfunction sqlTableName(...names: string[]): string {\n return names\n .map((name) => name.replace(/^[^a-zA-Z0-9]+/, \"\").replace(/[^a-zA-Z0-9]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\"_\");\n}\n\nfunction ensureTableNames(url: URL, opts?: Partial<SQLOpts>): SQLTableNames {\n let isIndex = \"\";\n if (url.searchParams.has(\"index\")) {\n isIndex = url.searchParams.get(\"index\") || \".idx\";\n }\n const ret = opts?.tableNames || DefaultSQLTableNames;\n // console.log(\"isIndex->\", opts?.url, isIndex, sqlTableName(isIndex, ret.data));\n if (isIndex.length) {\n return {\n data: sqlTableName(isIndex, ret.data),\n meta: sqlTableName(isIndex, ret.meta),\n wal: sqlTableName(isIndex, ret.wal),\n };\n }\n return {\n data: sqlTableName(ret.data),\n meta: sqlTableName(ret.meta),\n wal: sqlTableName(ret.wal),\n };\n}\n\nconst textEncoder = new TextEncoder();\nfunction ensureTextEncoder(opts?: Partial<SQLOpts>): TextEncoder {\n return opts?.textEncoder || textEncoder;\n}\n\nconst textDecoder = new TextDecoder();\nfunction ensureTextDecoder(opts?: Partial<SQLOpts>): TextDecoder {\n return opts?.textDecoder || textDecoder;\n}\n\nfunction url2sqlFlavor(url: URL, logger: Logger): \"sqlite\" | \"mysql\" | \"postgres\" {\n const flavor = url.protocol.replace(/:.*$/, \"\");\n switch (flavor) {\n case \"sqlite\":\n case \"mysql\":\n case \"postgres\":\n return flavor;\n default:\n throw logger.Error().Str(\"flavor\", flavor).Msg(\"unsupported protocol\").AsError();\n }\n}\n\nexport function ensureSQLOpts(url: URL, opts: Partial<SQLOpts>, componentName: string, ctx?: Record<string, unknown>): SQLOpts {\n const logger = ensureLogger(opts, componentName, ctx);\n return {\n url,\n sqlFlavor: url2sqlFlavor(url, logger),\n tableNames: ensureTableNames(url, opts),\n logger,\n textEncoder: ensureTextEncoder(opts),\n textDecoder: ensureTextDecoder(opts),\n };\n}\n","import type { Database } from \"better-sqlite3\";\nimport { KeyedResolvOnce, Logger } from \"@adviser/cement\";\n\nimport { DBConnection, SQLOpts } from \"./types.js\";\nimport { SysContainer } from \"../sys-container.js\";\nimport { ensureSQLOpts } from \"./ensurer.js\";\n\n// export function SimpleSQLite(filename: string, opts?: Partial<SQLOpts>): StoreOpts {\n// ensureLogger(opts, \"SimpleSQLite\").Debug().Str(\"filename\", filename).Msg(\"SimpleSQLite\")\n// const db = SQLiteConnection.fromFilename(filename, opts)\n// return SQLiteStoreOptions({\n// data: DataStoreFactory(db, opts),\n// meta: MetaStoreFactory(db, opts),\n// wal: WalStoreFactory(db, opts)\n// }, opts)\n// }\n\nconst onceSQLiteConnections = new KeyedResolvOnce<Database>();\nexport class SQLiteConnection implements DBConnection {\n static fromURL(url: URL, opts: Partial<SQLOpts> = {}): DBConnection {\n return new SQLiteConnection(url, opts);\n }\n readonly url: URL;\n readonly logger: Logger;\n _client?: Database;\n\n readonly opts: SQLOpts;\n\n get client(): Database {\n if (!this._client) {\n throw this.logger.Error().Msg(\"client not connected\").AsError();\n }\n return this._client;\n }\n\n private constructor(url: URL, opts: Partial<SQLOpts>) {\n // console.log(\"better-sqlite3->url->\", url);\n this.opts = ensureSQLOpts(url, opts, \"SQLiteConnection\", { url });\n this.logger = this.opts.logger;\n this.url = url;\n this.logger.Debug().Msg(\"constructor\");\n }\n async connect(): Promise<void> {\n let fName = this.url.toString().replace(\"sqlite://\", \"\").replace(/\\?.*$/, \"\");\n if (!fName) {\n throw this.logger.Error().Str(\"url\", this.url.toString()).Msg(\"filename is empty\").AsError();\n }\n // const version = this.url.searchParams.get(\"version\");\n // if (!version) {\n // throw this.logger.Error().Str(\"url\", this.url.toString()).Msg(\"version not found\").AsError();\n // }\n const hasName = this.url.searchParams.get(\"name\");\n if (hasName) {\n fName = SysContainer.join(fName, hasName);\n if (!fName.endsWith(\".sqlite\")) {\n fName += \".sqlite\";\n }\n }\n this._client = await onceSQLiteConnections.get(fName).once(async () => {\n this.logger.Debug().Str(\"filename\", fName).Msg(\"connect\");\n const Sqlite3Database = (await import(\"better-sqlite3\")).default;\n if (hasName) {\n await SysContainer.mkdir(SysContainer.dirname(fName), { recursive: true });\n }\n const db = new Sqlite3Database(fName, {\n // verbose: console.log,\n nativeBinding: \"./node_modules/better-sqlite3/build/Release/better_sqlite3.node\",\n });\n // this.logger.Debug().Any(\"client\", this.client).Msg(\"connected\")\n if (!db) {\n throw this.logger.Error().Msg(\"connect failed\").AsError();\n }\n return db;\n });\n }\n async close(): Promise<void> {\n this.logger.Debug().Msg(\"close\");\n await this.client.close();\n }\n}\n","import { ensureLogger } from \"../../utils.js\";\nimport { SQLiteConnection } from \"./sqlite-adapter-better-sqlite3.js\";\nimport { DBConnection, SQLOpts } from \"./types.js\";\n\nexport function SQLConnectionFactory(databaseURL: URL, opts: Partial<SQLOpts> = {}): DBConnection {\n const logger = ensureLogger(opts, \"SQLFactory\");\n switch (databaseURL.protocol) {\n case \"sqlite:\":\n logger.Debug().Str(\"databaseURL\", databaseURL.toString()).Msg(\"connecting to sqlite\");\n return SQLiteConnection.fromURL(databaseURL, {\n ...opts,\n logger,\n });\n default:\n throw logger\n .Error()\n .Msg(\"unsupported protocol \" + databaseURL.protocol)\n .AsError();\n }\n}\n","import { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3\";\nimport { SQLITE_VERSION } from \"./version\";\nimport { ResolveOnce } from \"@adviser/cement\";\nimport { ensureLogger } from \"../../../utils\";\n\nconst once = new ResolveOnce<string>();\nexport async function ensureSQLiteVersion(url: URL, dbConn: SQLiteConnection) {\n const version = await once.once(async () => {\n const logger = ensureLogger(dbConn.opts, \"ensureSQLiteVersion\", {\n version: SQLITE_VERSION,\n url: dbConn.url.toString(),\n });\n await dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS version (\n version TEXT NOT NULL,\n updated_at TEXT NOT NULL)`,\n )\n .run();\n const rows = (await dbConn.client.prepare(`select version from version`).all()) as { version: string }[];\n if (rows.length > 1) {\n throw logger.Error().Msg(`more than one version row found`).AsError();\n }\n if (rows.length === 0) {\n await dbConn.client\n .prepare(`insert into version (version, updated_at) values (?, ?)`)\n .run(SQLITE_VERSION, new Date().toISOString());\n return SQLITE_VERSION;\n }\n if (rows[0].version !== SQLITE_VERSION) {\n logger.Warn().Any(\"row\", rows[0]).Msg(`version mismatch`);\n }\n return rows[0].version;\n });\n url.searchParams.set(\"version\", version);\n}\n","import type { RunResult, Statement } from \"better-sqlite3\";\nimport { DBConnection, WalKey, WalRecord, WalSQLStore } from \"../types.js\";\nimport { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3.js\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\nimport { ensureSQLiteVersion } from \"./sqlite-ensure-version.js\";\nimport { ensureLogger, exception2Result, getStore } from \"../../../utils.js\";\n\nexport class WalSQLRecordBuilder {\n readonly #record: WalRecord;\n\n constructor(record: WalRecord) {\n this.#record = record;\n }\n\n static fromRecord(record: WalRecord): WalSQLRecordBuilder {\n return new WalSQLRecordBuilder(record);\n }\n\n build(): WalRecord {\n return this.#record;\n }\n}\n\ninterface SQLiteWalRecord {\n readonly name: string;\n readonly branch: string;\n readonly state: Buffer;\n readonly updated_at: string;\n}\n\nexport class V0_18_0SQLiteWalStore implements WalSQLStore {\n readonly dbConn: SQLiteConnection;\n readonly logger: Logger;\n readonly textEncoder: TextEncoder;\n constructor(dbConn: DBConnection) {\n this.dbConn = dbConn as SQLiteConnection;\n this.textEncoder = dbConn.opts.textEncoder;\n this.logger = ensureLogger(dbConn.opts, \"SQLiteWalStore\");\n this.logger.Debug().Msg(\"constructor\");\n }\n async start(url: URL): Promise<void> {\n this.logger.Debug().Msg(\"start\");\n await this.dbConn.connect();\n await ensureSQLiteVersion(url, this.dbConn);\n\n // this._insertStmt =\n // this._selectStmt = this.dbConn.client.prepare(\n // `select name, branch, state, updated_at from ${this.table} where name = ? and branch = ?`,\n // );\n // this._deleteStmt = this.dbConn.client.prepare(`delete from ${this.table} where name = ? and branch = ?`);\n }\n\n table(url: URL): string {\n return getStore(url, this.logger, (...x: string[]) => x.join(\"_\"));\n }\n\n readonly #createTable = new KeyedResolvOnce();\n async createTable(url: URL) {\n return this.#createTable.get(this.table(url)).once(async (table) => {\n await this.dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS ${table} (\n name TEXT not null,\n branch TEXT not null,\n state BLOB NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (name, branch)\n )`,\n )\n .run();\n });\n }\n\n readonly #insertStmt = new KeyedResolvOnce<Statement>();\n private async insertStmt(url: URL) {\n return this.#insertStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`insert into ${table}\n (name, branch, state, updated_at)\n values (?, ?, ?, ?)\n ON CONFLICT(name, branch) DO UPDATE SET state=?, updated_at=?\n `);\n });\n }\n\n readonly #selectStmt = new KeyedResolvOnce<Statement>();\n private async selectStmt(url: URL) {\n return this.#selectStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(\n `select name, branch, state, updated_at from ${table}\n where name = ? and branch = ?`,\n );\n });\n }\n\n readonly #deleteStmt = new KeyedResolvOnce<Statement>();\n private async deleteStmt(url: URL) {\n return this.#deleteStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);\n });\n }\n async insert(url: URL, ose: WalRecord): Promise<RunResult> {\n const wal = WalSQLRecordBuilder.fromRecord(ose).build();\n const bufState = Buffer.from(this.textEncoder.encode(JSON.stringify(wal.state)));\n return this.insertStmt(url).then((i) =>\n i.run(ose.name, ose.branch, bufState, wal.updated_at.toISOString(), bufState, wal.updated_at.toISOString()),\n );\n }\n async select(url: URL, key: WalKey): Promise<WalRecord[]> {\n const res = (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {\n const row = irow as SQLiteWalRecord;\n return {\n name: row.name,\n branch: row.branch,\n state: Uint8Array.from(row.state),\n updated_at: new Date(row.updated_at),\n };\n });\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Uint64(\"res\", res.length).Msg(\"select\");\n return res;\n }\n async delete(url: URL, key: WalKey): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Msg(\"delete\");\n return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async close(url: URL): Promise<Result<void>> {\n this.logger.Debug().Msg(\"close\");\n return Result.Ok(undefined);\n // await this.dbConn.close();\n }\n async destroy(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Msg(\"destroy\");\n await this.createTable(url);\n await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();\n });\n }\n}\n","import type { RunResult, Statement } from \"better-sqlite3\";\nimport { DBConnection, DataRecord, DataSQLStore } from \"../types.js\";\nimport { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3.js\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\nimport { UploadDataFnParams } from \"../../../blockstore/types.js\";\nimport { ensureSQLiteVersion } from \"./sqlite-ensure-version.js\";\nimport { ensureLogger, exception2Result, getStore } from \"../../../utils.js\";\n\nexport class DataSQLRecordBuilder {\n readonly dataRecord: DataRecord;\n constructor(dataRecord: DataRecord) {\n this.dataRecord = dataRecord;\n }\n\n static fromUploadParams(data: Uint8Array, params: UploadDataFnParams): DataSQLRecordBuilder {\n return new DataSQLRecordBuilder({\n name: params.name,\n car: params.car,\n data: data,\n updated_at: new Date(),\n });\n }\n\n build(): DataRecord {\n return this.dataRecord;\n }\n}\n\ninterface SQLiteDataRecord {\n name: string;\n car: string;\n data: Buffer;\n updated_at: string;\n}\n\nexport class V0_18_0SQLiteDataStore implements DataSQLStore {\n readonly dbConn: SQLiteConnection;\n readonly logger: Logger;\n constructor(dbConn: DBConnection) {\n this.dbConn = dbConn as SQLiteConnection;\n this.logger = ensureLogger(dbConn.opts, \"SQLiteDataStore\");\n this.logger.Debug().Msg(\"constructor\");\n }\n\n table(url: URL): string {\n return getStore(url, this.logger, (...x: string[]) => x.join(\"_\"));\n }\n\n readonly #createTable = new KeyedResolvOnce();\n async createTable(url: URL) {\n return this.#createTable.get(this.table(url)).once(async (table) => {\n await this.dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS ${table} (\n name TEXT NOT NULL,\n car TEXT PRIMARY KEY,\n data BLOB NOT NULL,\n updated_at TEXT NOT NULL)`,\n )\n .run();\n });\n }\n\n readonly #insertStmt = new KeyedResolvOnce<Statement>();\n private async insertStmt(url: URL) {\n return this.#insertStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`\n insert into ${table}\n (name, car, data, updated_at) values (?, ?, ?, ?)\n ON CONFLICT(car) DO UPDATE SET updated_at=?`);\n });\n }\n\n readonly #selectStmt = new KeyedResolvOnce<Statement>();\n private async selectStmt(url: URL) {\n return this.#selectStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`select name, car, data, updated_at from ${table} where car = ?`);\n });\n }\n\n readonly #deleteStmt = new KeyedResolvOnce<Statement>();\n private async deleteStmt(url: URL) {\n return this.#deleteStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`delete from ${table} where car = ?`);\n });\n }\n\n async start(url: URL): Promise<void> {\n this.logger.Debug().Msg(\"start-connect\");\n await this.dbConn.connect();\n this.logger.Debug().Msg(\"start-connected\");\n await ensureSQLiteVersion(url, this.dbConn);\n this.logger.Debug().Msg(\"start-set-version\");\n }\n\n async insert(url: URL, ose: DataRecord): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", ose.name).Str(\"car\", ose.car).Uint64(\"data-len\", ose.data.length).Msg(\"insert\");\n const updated_at = ose.updated_at.toISOString();\n return this.insertStmt(url).then((i) => i.run(ose.name, ose.car, Buffer.from(ose.data), updated_at, updated_at));\n }\n\n async select(url: URL, car: string): Promise<DataRecord[]> {\n this.logger.Debug().Str(\"car\", car).Msg(\"select\");\n return (await this.selectStmt(url).then((i) => i.all(car))).map((irow) => {\n const row = irow as SQLiteDataRecord;\n return {\n name: row.name,\n car: row.car,\n data: Uint8Array.from(row.data),\n updated_at: new Date(row.updated_at),\n };\n });\n }\n\n async delete(url: URL, car: string): Promise<RunResult> {\n this.logger.Debug().Str(\"car\", car).Msg(\"delete\");\n const ret = await this.deleteStmt(url).then((i) => i.run(car));\n // await this.select(car);\n return ret;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async close(url: URL): Promise<Result<void>> {\n this.logger.Debug().Msg(\"close\");\n return Result.Ok(undefined);\n // await this.dbConn.close();\n }\n\n async destroy(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Msg(\"destroy\");\n await this.createTable(url);\n await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();\n });\n }\n}\n","import type { RunResult, Statement } from \"better-sqlite3\";\nimport { DBConnection, MetaRecord, MetaRecordKey, MetaSQLStore } from \"../types.js\";\nimport { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3.js\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\nimport { UploadMetaFnParams } from \"../../../blockstore/types.js\";\nimport { ensureSQLiteVersion } from \"./sqlite-ensure-version.js\";\nimport { ensureLogger, exception2Result, getStore } from \"../../../utils.js\";\n\nexport class MetaSQLRecordBuilder {\n readonly record: MetaRecord;\n readonly textEncoder: TextEncoder;\n\n constructor(record: MetaRecord, textEncoder: TextEncoder) {\n this.record = record;\n this.textEncoder = textEncoder;\n }\n\n static fromUploadMetaFnParams(data: Uint8Array, params: UploadMetaFnParams, textEncoder: TextEncoder): MetaSQLRecordBuilder {\n return new MetaSQLRecordBuilder(\n {\n name: params.name,\n branch: params.branch,\n meta: data,\n updated_at: new Date(),\n },\n textEncoder,\n );\n }\n\n static fromBytes(str: string, name: string, branch: string, textEncoder: TextEncoder): MetaSQLRecordBuilder {\n return new MetaSQLRecordBuilder(\n {\n name: name,\n branch: branch,\n meta: textEncoder.encode(str),\n updated_at: new Date(),\n },\n textEncoder,\n );\n }\n\n build(): MetaRecord {\n return this.record;\n }\n}\n\ninterface SQLiteMetaRecord {\n name: string;\n branch: string;\n meta: Buffer;\n updated_at: string;\n}\n\nexport class V0_18_0SQLiteMetaStore implements MetaSQLStore {\n readonly dbConn: SQLiteConnection;\n readonly logger: Logger;\n constructor(dbConn: DBConnection) {\n this.dbConn = dbConn as SQLiteConnection;\n this.logger = ensureLogger(dbConn.opts, \"SQLiteMetaStore\");\n this.logger.Debug().Msg(\"constructor\");\n }\n async start(url: URL): Promise<void> {\n this.logger.Debug().Url(url).Msg(\"starting\");\n await this.dbConn.connect();\n await ensureSQLiteVersion(url, this.dbConn);\n this.logger.Debug().Url(url).Msg(\"started\");\n }\n\n table(url: URL): string {\n return getStore(url, this.logger, (...x: string[]) => x.join(\"_\"));\n }\n\n readonly #createTable = new KeyedResolvOnce();\n async createTable(url: URL) {\n return this.#createTable.get(this.table(url)).once(async (table) => {\n await this.dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS ${table} (\n name TEXT not null,\n branch TEXT not null,\n meta BLOB NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (name, branch)\n )`,\n )\n .run();\n });\n }\n\n readonly #insertStmt = new KeyedResolvOnce<Statement>();\n private async insertStmt(url: URL) {\n return this.#insertStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`insert into ${table}\n (name, branch, meta, updated_at)\n values (?, ?, ?, ?)\n ON CONFLICT(name, branch) DO UPDATE SET meta=?, updated_at=?\n `);\n });\n }\n\n readonly #selectStmt = new KeyedResolvOnce<Statement>();\n private async selectStmt(url: URL) {\n return this.#selectStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`select name, branch, meta, updated_at from ${table} where name = ? and branch = ?`);\n });\n }\n\n readonly #deleteStmt = new KeyedResolvOnce<Statement>();\n private async deleteStmt(url: URL) {\n return this.#deleteStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);\n });\n }\n\n async insert(url: URL, ose: MetaRecord): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", ose.name).Str(\"branch\", ose.branch).Uint64(\"data-len\", ose.meta.length).Msg(\"insert\");\n const bufMeta = Buffer.from(ose.meta);\n return this.insertStmt(url).then((i) =>\n i.run(ose.name, ose.branch, bufMeta, ose.updated_at.toISOString(), bufMeta, ose.updated_at.toISOString()),\n );\n }\n async select(url: URL, key: MetaRecordKey): Promise<MetaRecord[]> {\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Msg(\"select\");\n return (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {\n const row = irow as SQLiteMetaRecord;\n return {\n name: row.name,\n branch: row.branch,\n meta: Uint8Array.from(row.meta),\n updated_at: new Date(row.updated_at),\n };\n });\n }\n\n async delete(url: URL, key: MetaRecordKey): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Msg(\"delete\");\n return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async close(url: URL): Promise<Result<void>> {\n this.logger.Debug().Msg(\"close\");\n // await this.dbConn.close();\n return Result.Ok(undefined);\n }\n async destroy(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Msg(\"destroy\");\n await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();\n });\n }\n}\n","import { Logger } from \"@adviser/cement\";\nimport { ensureLogger, LoggerOpts } from \"../../utils\";\nimport { DBConnection, DataSQLStore, MetaSQLStore, WalSQLStore } from \"./types\";\nimport { SQLITE_VERSION } from \"./v0.19-sqlite/version\";\n\nexport function prepareSQLVersion(iurl: URL, opts: LoggerOpts | Logger): URL {\n if (iurl.searchParams.get(\"version\")) return iurl;\n const url = new URL(iurl.toString());\n switch (url.protocol) {\n case \"sqlite:\":\n {\n url.searchParams.set(\"version\", SQLITE_VERSION);\n }\n break;\n default:\n throw ensureLogger(opts, \"ensureSQLVersion\").Error().Str(\"url\", url.toString()).Msg(\"unsupported protocol\").AsError();\n }\n return url;\n}\n\nexport async function WalStoreFactory(db: DBConnection): Promise<WalSQLStore> {\n switch (db.opts.sqlFlavor) {\n case \"sqlite\": {\n const { V0_18_0SQLiteWalStore } = await import(\"./v0.19-sqlite/sqlite-wal-store.js\");\n const store = new V0_18_0SQLiteWalStore(db);\n return store;\n }\n default:\n throw ensureLogger(db.opts, \"WalStoreFactory\").Error().Msg(\"unsupported db connection\").AsError();\n }\n}\n\nexport async function DataStoreFactory(db: DBConnection): Promise<DataSQLStore> {\n switch (db.opts.sqlFlavor) {\n case \"sqlite\": {\n const { V0_18_0SQLiteDataStore } = await import(\"./v0.19-sqlite/sqlite-data-store.js\");\n const store = new V0_18_0SQLiteDataStore(db);\n return store;\n }\n default:\n throw ensureLogger(db.opts, \"DataStoreFactory\").Error().Msg(\"unsupported db connection\").AsError();\n }\n}\n\nexport async function MetaStoreFactory(db: DBConnection): Promise<MetaSQLStore> {\n switch (db.opts.sqlFlavor) {\n case \"sqlite\": {\n const { V0_18_0SQLiteMetaStore } = await import(\"./v0.19-sqlite/sqlite-meta-store.js\");\n const store = new V0_18_0SQLiteMetaStore(db);\n return store;\n }\n default:\n throw ensureLogger(db.opts, \"MetaStoreFactory\").Error().Msg(\"unsupported db connection\").AsError();\n }\n}\n","import { Logger, Result } from \"@adviser/cement\";\n\nimport { TestStore } from \"../../blockstore/types.js\";\nimport { SQLConnectionFactory } from \"./sql-connection-factory.js\";\nimport { DataSQLStore, MetaSQLStore, WalSQLStore } from \"./types.js\";\nimport { DataStoreFactory, MetaStoreFactory, WalStoreFactory } from \"./store-version-factory.js\";\nimport { ensureLogger, exception2Result, exceptionWrapper, getKey, getName } from \"../../utils.js\";\nimport { Gateway, GetResult, NotFoundError } from \"../../blockstore/gateway.js\";\n\nexport class SQLWalGateway implements Gateway {\n readonly logger: Logger;\n walSQLStore: WalSQLStore = {} as WalSQLStore;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"SQLWalGateway\");\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n\n async start(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseUrl).Msg(\"start\");\n const conn = SQLConnectionFactory(baseUrl);\n const ws = await WalStoreFactory(conn);\n await ws.start(baseUrl);\n this.walSQLStore = ws;\n });\n }\n close(baseUrl: URL) {\n return this.walSQLStore.close(baseUrl);\n }\n destroy(baseUrl: URL) {\n return this.walSQLStore.destroy(baseUrl);\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.walSQLStore.insert(url, {\n state: body,\n updated_at: new Date(),\n name,\n branch,\n });\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n const record = await this.walSQLStore.select(url, { name, branch });\n if (record.length === 0) {\n return Result.Err(new NotFoundError(`not found ${name} ${branch}`));\n }\n return Result.Ok(record[0].state);\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.walSQLStore.delete(url, { name, branch });\n });\n }\n}\n\nexport class SQLMetaGateway implements Gateway {\n readonly logger: Logger;\n metaSQLStore: MetaSQLStore = {} as MetaSQLStore;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"SQLMetaGateway\");\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n\n async start(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseUrl).Msg(\"start\");\n const conn = SQLConnectionFactory(baseUrl);\n const ws = await MetaStoreFactory(conn);\n await ws.start(baseUrl);\n this.metaSQLStore = ws;\n this.logger.Debug().Url(baseUrl).Msg(\"started\");\n });\n }\n close(baseUrl: URL): Promise<Result<void>> {\n return this.metaSQLStore.close(baseUrl);\n }\n destroy(baseUrl: URL): Promise<Result<void>> {\n return this.metaSQLStore.destroy(baseUrl);\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.metaSQLStore.insert(url, {\n meta: body,\n updated_at: new Date(),\n name,\n branch,\n });\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n const record = await this.metaSQLStore.select(url, {\n name,\n branch,\n });\n if (record.length === 0) {\n return Result.Err(new NotFoundError(`not found ${name} ${branch}`));\n }\n return Result.Ok(record[0].meta);\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.metaSQLStore.delete(url, {\n name,\n branch,\n });\n });\n }\n}\n\nexport class SQLDataGateway implements Gateway {\n readonly logger: Logger;\n dataSQLStore: DataSQLStore = {} as DataSQLStore;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"SQLDataGateway\");\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n\n async start(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseUrl).Msg(\"pre-sql-connection\");\n const conn = SQLConnectionFactory(baseUrl);\n this.logger.Debug().Url(baseUrl).Msg(\"post-sql-connection\");\n const ws = await DataStoreFactory(conn);\n this.logger.Debug().Url(baseUrl).Msg(\"post-data-store-factory\");\n await ws.start(baseUrl);\n this.dataSQLStore = ws;\n this.logger.Debug().Url(baseUrl).Msg(\"started\");\n });\n }\n close(baseUrl: URL): Promise<Result<void>> {\n return this.dataSQLStore.close(baseUrl);\n }\n destroy(baseUrl: URL): Promise<Result<void>> {\n return this.dataSQLStore.destroy(baseUrl);\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const cid = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.dataSQLStore.insert(url, {\n data: body,\n updated_at: new Date(),\n name: name,\n car: cid,\n });\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const branch = getKey(url, this.logger);\n const record = await this.dataSQLStore.select(url, branch);\n if (record.length === 0) {\n return Result.Err(new NotFoundError(`not found ${branch}`));\n }\n return Result.Ok(record[0].data);\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n await this.dataSQLStore.delete(url, branch);\n return Result.Ok(undefined);\n });\n }\n}\n\nexport class SQLTestStore implements TestStore {\n readonly logger: Logger;\n constructor(ilogger: Logger) {\n const logger = ensureLogger(ilogger, \"SQLTestStore\");\n this.logger = logger;\n }\n async get(url: URL, key: string): Promise<Uint8Array> {\n const conn = SQLConnectionFactory(url);\n const name = getName(url, this.logger);\n switch (url.searchParams.get(\"store\")) {\n case \"wal\": {\n const sqlStore = await WalStoreFactory(conn);\n await sqlStore.start(url);\n const records = await sqlStore.select(url, {\n name,\n branch: key,\n });\n return records[0].state;\n }\n case \"meta\": {\n const sqlStore = await MetaStoreFactory(conn);\n await sqlStore.start(url);\n const records = await sqlStore.select(url, {\n name,\n branch: key,\n });\n return records[0].meta;\n }\n case \"data\": {\n const sqlStore = await DataStoreFactory(conn);\n await sqlStore.start(url);\n const records = await sqlStore.select(url, key);\n return records[0].data;\n }\n default:\n throw this.logger.Error().Str(\"key\", key).Msg(`Method not implemented`);\n }\n }\n}\n","export * from \"./database.js\";\nexport * from \"./types.js\";\n\nexport * from \"./crdt.js\";\n\nexport * from \"./indexer.js\";\n\nexport * as blockstore from \"./blockstore/index.js\";\n\nexport * as bs from \"./blockstore/index.js\";\nexport * as rt from \"./runtime/index.js\";\n\nexport * from \"./utils.js\";\n\nexport * from \"./version.js\";\n","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 DbResponse,\n ChangesResponse,\n DocTypes,\n IndexRows,\n DocFragment,\n ChangesResponseRow,\n CRDTMeta,\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._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 this.logger.Debug().Str(\"id\", id).Msg(\"get-pre-ready\");\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"get-post-ready\");\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<DbResponse> {\n this.logger.Debug().Str(\"id\", doc._id).Msg(\"put-pre-ready\");\n await this.ready();\n this.logger.Debug().Str(\"id\", doc._id).Msg(\"put-post-ready\");\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 };\n }\n\n async del(id: string): Promise<DbResponse> {\n await this.ready();\n const result = (await this._writeQueue.push({ id: id, del: true })) as CRDTMeta;\n return { id, clock: result?.head } as DbResponse;\n }\n\n async changes<T extends DocTypes>(since: ClockHead = [], opts: ChangesOptions = {}): Promise<ChangesResponse<T>> {\n await this.ready();\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 };\n }\n\n async allDocs<T extends DocTypes>(): Promise<{\n rows: {\n key: string;\n value: DocWithId<T>;\n }[];\n clock: ClockHead;\n }> {\n await this.ready();\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 };\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 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 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\nfunction buildURL(optURL: string | URL | undefined, loader: Loadable): URL {\n const storeOpts = loader.ebOpts.store;\n return toURL(optURL || dataDir(loader.name, storeOpts.stores?.base), storeOpts.isIndex);\n}\n\nexport interface StoreFactoryItem {\n readonly protocol: string;\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\nexport function registerStoreProtocol(item: StoreFactoryItem) {\n if (storeFactory.has(item.protocol)) {\n throw new Error(`protocol ${item.protocol} already registered`);\n }\n storeFactory.set(item.protocol, item);\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 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 await store.start();\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 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 logger.Debug().Msg(\"pre-start\");\n await store.start();\n logger.Debug().Msg(\"post-start\");\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 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 await store.start();\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\nregisterStoreProtocol({\n protocol: \"sqlite:\",\n data: async (logger) => {\n const { SQLDataGateway } = await import(\"../runtime/store-sql/store-sql.js\");\n return new SQLDataGateway(logger);\n },\n meta: async (logger) => {\n const { SQLMetaGateway } = await import(\"../runtime/store-sql/store-sql.js\");\n return new SQLMetaGateway(logger);\n },\n wal: async (logger) => {\n const { SQLWalGateway } = await import(\"../runtime/store-sql/store-sql.js\");\n return new SQLWalGateway(logger);\n },\n test: async (logger) => {\n const { SQLTestStore } = await import(\"../runtime/store-sql/store-sql.js\");\n return new SQLTestStore(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 } 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 { guardVersion } from \"../runtime/store-indexdb.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\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 .Err(url.Err())\n .Str(\"branch\", branch || \"\")\n .Str(\"url\", this.url.toString())\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().Err(bytes.Err()).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().Err(res.Err()).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().Err(res.Err()).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 CryptoOpts {\n // readonly crypto: MakeCodecCrypto; //| unknown;\n readonly importKey: typeof crypto.subtle.importKey;\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: CryptoKey,\n data: Uint8Array,\n ) => Promise<ArrayBuffer>;\n readonly encrypt: (\n algo: { name: string; iv: Uint8Array; tagLength: number },\n key: CryptoKey,\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","import { CryptoOpts } from \"../blockstore/index.js\";\n\nfunction randomBytes(size: number) {\n const bytes = new Uint8Array(size);\n if (size > 0) {\n crypto.getRandomValues(bytes);\n }\n return bytes;\n}\n\nfunction digestSHA256(data: Uint8Array): Promise<ArrayBuffer> {\n return Promise.resolve(crypto.subtle.digest(\"SHA-256\", data));\n}\n\nexport function toCryptoOpts(cryptoOpts: Partial<CryptoOpts> = {}): CryptoOpts {\n const opts = {\n importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),\n encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),\n decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),\n randomBytes: cryptoOpts.randomBytes || randomBytes,\n digestSHA256: cryptoOpts.digestSHA256 || digestSHA256,\n };\n // console.log(\"cryptoOpts\", cryptoOpts, opts)\n return opts;\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 {\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 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 { 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.5-dev\": \"xxxx\",\n})[0] as string;\n"],"mappings":"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","names":["createNodeSysContainer","dataDir","e","import_cement","import_uuidv7","import_cement","once","db","import_cement","once","import_cement","init_types","textEncoder","textDecoder","init_types","import_cement","import_cement","import_cement","import_cement","import_cement","textEncoder","V0_18_0SQLiteWalStore","V0_18_0SQLiteDataStore","V0_18_0SQLiteMetaStore","import_cement","import_uuidv7","import_cement","index","import_cement","import_block","import_sha2","codec","import_clock","cid","import_cement","import_p_limit","import_cement","import_cement","import_block","raw","hasher","import_sha2","import_multiformats","import_block","import_utils","crypto","randomBytes","encode","decode","crypto","randomBytes","codec","get","hasher","cache","chunker","root","block","mfCreate","import_block","CBW","carLogIncludesGroup","pLimit","cid","cache","got","batchSize","root","pLimit","carLogIncludesGroup","FileDataGateway","FileMetaGateway","FileWALGateway","FileTestStore","IndexDBDataGateway","IndexDBMetaGateway","IndexDBTestStore","SQLDataGateway","SQLMetaGateway","SQLWalGateway","SQLTestStore","hasher","codec","import_block","import_sha2","codec","import_utils","import_cache","cache","hasher","charwise","root","import_clock","import_crdt","import_cement","task","name","updates"]}
|
1
|
+
{"version":3,"sources":["../../src/types.ts","../../src/runtime/node-sys-container.ts","../../src/runtime/sys-container.ts","../../src/runtime/data-dir.ts","../../src/runtime/store-file-utils.ts","../../src/runtime/store-sql/types.ts","../../src/runtime/store-sql/ensurer.ts","../../src/runtime/store-sql/index.ts","../../src/runtime/crypto.ts","../../src/runtime/files.ts","../../src/runtime/store-file-version.ts","../../src/runtime/store-indexdb-version.ts","../../src/runtime/store-sql/v0.19-sqlite/version.ts","../../src/runtime/index.ts","../../src/utils.ts","../../src/blockstore/gateway.ts","../../src/runtime/store-indexdb.ts","../../src/runtime/store-file.ts","../../src/runtime/store-sql/sqlite-adapter-better-sqlite3.ts","../../src/runtime/store-sql/sql-connection-factory.ts","../../src/runtime/store-sql/v0.19-sqlite/sqlite-ensure-version.ts","../../src/runtime/store-sql/v0.19-sqlite/sqlite-wal-store.ts","../../src/runtime/store-sql/v0.19-sqlite/sqlite-data-store.ts","../../src/runtime/store-sql/v0.19-sqlite/sqlite-meta-store.ts","../../src/runtime/store-sql/store-version-factory.ts","../../src/runtime/store-sql/store-sql.ts","../../src/index.ts","../../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.ts","../../src/indexer-helpers.ts","../../src/crdt-clock.ts","../../src/apply-head-queue.ts","../../src/version.ts"],"sourcesContent":["import type { EventLink } from \"@web3-storage/pail/clock/api\";\nimport type { Operation } from \"@web3-storage/pail/crdt/api\";\n\nimport type { DbMeta, CryptoOpts, StoreOpts, AnyLink } from \"./blockstore/index.js\";\nimport { Logger } from \"@adviser/cement\";\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 interface ConfigOpts {\n readonly public?: boolean;\n readonly meta?: DbMeta;\n readonly persistIndexes?: boolean;\n readonly autoCompact?: number;\n readonly crypto?: CryptoOpts;\n readonly store?: StoreOpts;\n // readonly indexStore?: StoreOpts;\n readonly threshold?: number;\n readonly logger?: Logger;\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\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}\n\nexport interface DbResponse {\n readonly id: string;\n readonly clock: ClockHead;\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 { type NodeMap, join } from \"./sys-container.js\";\n\nexport async function createNodeSysContainer(): Promise<NodeMap> {\n const nodePath = \"node:path\";\n const nodeOS = \"node:os\";\n const nodeURL = \"node:url\";\n const nodeFS = \"node:fs\";\n const fs = (await import(nodeFS)).promises;\n // const assert = \"assert\";\n const path = await import(nodePath);\n return {\n state: \"node\",\n ...path,\n ...(await import(nodeOS)),\n ...(await import(nodeURL)),\n ...fs,\n join,\n stat: fs.stat as NodeMap[\"stat\"],\n readdir: fs.readdir as NodeMap[\"readdir\"],\n readfile: fs.readFile as NodeMap[\"readfile\"],\n writefile: fs.writeFile as NodeMap[\"writefile\"],\n };\n}\n","import type { Dirent, MakeDirectoryOptions, ObjectEncodingOptions, PathLike, Stats } from \"node:fs\";\n\nimport * as stdEnv from \"std-env\";\nimport { uuidv4 } from \"uuidv7\";\nimport { ResolveOnce, EnvImpl } from \"@adviser/cement\";\n\nimport { throwFalsy } from \"../types.js\";\n\nexport interface NodeMap {\n state: \"seeded\" | \"browser\" | \"node\";\n join: (...args: string[]) => string;\n dirname: (path: string) => string;\n homedir: () => string;\n fileURLToPath: (url: string | URL) => string;\n // assert: (condition: unknown, message?: string | Error) => void;\n\n mkdir: (path: PathLike, options?: { recursive: boolean }) => Promise<string | undefined>;\n readdir: (path: PathLike, options?: unknown) => Promise<unknown[]>;\n\n rm: (path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }) => Promise<void>;\n copyFile: (source: PathLike, destination: PathLike) => Promise<void>;\n\n readfile: (path: PathLike, options?: { encoding: BufferEncoding; flag?: string }) => Promise<string>;\n\n stat: (path: PathLike) => Promise<Stats>;\n\n unlink: (path: PathLike) => Promise<void>;\n writefile: (path: PathLike, data: Uint8Array | string) => Promise<void>;\n}\n\n// export function assert(condition: unknown, message?: string | Error): asserts condition {\n// SysContainer.freight?.assert(condition, message);\n// }\n\nconst onceStart = new ResolveOnce<void>();\n\nexport function join(...paths: string[]): string {\n return paths.map((i) => i.replace(/\\/+$/, \"\")).join(\"/\");\n}\n\nconst envImpl = new EnvImpl({\n symbol: \"FP_ENV\",\n presetEnv: new Map([\n // [\"FP_DEBUG\", \"xxx\"],\n // [\"FP_ENV\", \"development\"],\n ]),\n});\n// console.log(`EnvImpl`, envImpl);\n\nclass sysContainer {\n freight: NodeMap = {\n state: \"seeded\",\n join,\n dirname: (path: string) => path.split(\"/\").slice(0, -1).join(\"/\"),\n homedir: () => {\n throw new Error(\"SysContainer:homedir is not available in seeded state\");\n },\n fileURLToPath: (strurl: string | URL) => {\n let url: URL;\n if (typeof strurl === \"string\") {\n url = new URL(strurl);\n } else {\n url = strurl;\n }\n return url.pathname;\n },\n // assert: (condition: unknown, message?: string | Error) => {\n // if (!condition) {\n // if (message instanceof Error) {\n // throw message;\n // } else {\n // throw new Error(message);\n // }\n // }\n // },\n mkdir: () => Promise.reject(new Error(\"SysContainer:mkdir is not available in seeded state\")),\n readdir: () => Promise.reject(new Error(\"SysContainer:readdir is not available in seeded state\")),\n rm: () => Promise.reject(new Error(\"SysContainer:rm is not available in seeded state\")),\n copyFile: () => Promise.reject(new Error(\"SysContainer:copyFile is not available in seeded state\")),\n readfile: () => Promise.reject(new Error(\"SysContainer:readfile is not available in seeded state\")),\n unlink: () => Promise.reject(new Error(\"SysContainer:unlink is not available in seeded state\")),\n writefile: () => Promise.reject(new Error(\"SysContainer:writefile is not available in seeded state\")),\n stat: () => Promise.reject(new Error(\"SysContainer:stat is not available in seeded state\")),\n };\n\n readonly id = uuidv4();\n\n async start(): Promise<void> {\n await onceStart.once(async () => {\n switch (this.freight.state) {\n case \"seeded\":\n if (stdEnv.isNode) {\n const { createNodeSysContainer } = await import(\"./node-sys-container.js\");\n // console.log(\"use NodeSysContainer\");\n this.freight = await createNodeSysContainer();\n } else {\n // console.log(\"use BrowserSysContainer\");\n this.freight.state = \"browser\";\n }\n return;\n case \"browser\":\n case \"node\":\n return;\n }\n });\n }\n\n async readdir(\n path: PathLike,\n options?:\n | (ObjectEncodingOptions & { withFileTypes?: false | undefined; recursive?: boolean })\n | BufferEncoding\n | null\n | undefined,\n ) {\n this.logSeeded(\"readdir\");\n return (throwFalsy(this.freight).readdir(path, options) as Promise<string[]>) || [];\n }\n async readdirent(\n path: PathLike,\n options: (ObjectEncodingOptions & { withFileTypes: true; recursive?: boolean }) | BufferEncoding | null | undefined,\n ): Promise<Dirent[]> {\n this.logSeeded(\"readdirent\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (throwFalsy(this.freight).readdir(path, { ...(options as any), withFileTypes: true }) as Promise<Dirent[]>) || [];\n }\n\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }) {\n this.logSeeded(\"readfile\");\n return throwFalsy(this.freight).readfile(path, options) as unknown as Promise<Buffer>;\n }\n\n async mkdir(path: PathLike, options: { recursive: boolean }) {\n this.logSeeded(\"mkdir\");\n return throwFalsy(this.freight).mkdir(path, options);\n }\n\n async rm(path: PathLike, options: MakeDirectoryOptions & { recursive: boolean }) {\n this.logSeeded(\"rm\");\n return throwFalsy(this.freight).rm(path, options);\n }\n\n async unlink(path: PathLike) {\n this.logSeeded(\"unlink\");\n return throwFalsy(this.freight).unlink(path);\n }\n\n async writefile(path: PathLike, data: Uint8Array | string) {\n this.logSeeded(\"writefile\");\n return throwFalsy(this.freight).writefile(path, data);\n }\n\n async copyFile(source: PathLike, destination: PathLike) {\n this.logSeeded(\"copyFile\");\n return throwFalsy(this.freight).copyFile(source, destination);\n }\n\n async stat(path: PathLike) {\n this.logSeeded(\"stat\");\n return throwFalsy(this.freight).stat(path);\n }\n\n fileURLToPath(url: string | URL) {\n this.logSeeded(\"fileURLToPath\");\n return throwFalsy(this.freight).fileURLToPath(url);\n }\n\n dirname(path: string) {\n this.logSeeded(\"dirname\");\n return throwFalsy(this.freight).dirname(path);\n }\n\n join(...args: string[]): string {\n this.logSeeded(\"join\");\n return throwFalsy(this.freight).join(...args);\n }\n\n homedir = () => {\n this.logSeeded(\"homedir\");\n return throwFalsy(this.freight).homedir();\n };\n\n logSeeded(method: string) {\n if (this.freight.state === \"seeded\") {\n const err = new Error();\n console.warn(`SysContainer.${method} is not available in seeded state:`, err.stack);\n }\n }\n readonly env = envImpl;\n}\n\n// // eslint-disable-next-line @typescript-eslint/no-explicit-any\n// export async function saveImport(fName: string): Promise<any> {\n// try {\n// const i = await import(fName);\n// return i;\n// } catch (e: unknown) {\n// console.error(`saveImport failed for ${fName} with`, e);\n// throw e;\n// }\n// }\n\nexport const SysContainer = new sysContainer();\n","import { SysContainer } from \"./sys-container.js\";\nimport { isDeno, isNode } from \"std-env\";\n\nexport function dataDir(name?: string, base?: string | URL): string {\n if (!base) {\n if (isNode || isDeno) {\n base = SysContainer.env.get(\"FP_STORAGE_URL\") || `file://${SysContainer.join(SysContainer.homedir(), \".fireproof\")}`;\n } else {\n base = `indexdb://fp`;\n }\n }\n let url: URL;\n if (typeof base === \"string\") {\n try {\n url = new URL(base.toString());\n } catch (e) {\n try {\n base = `file://${base}`;\n url = new URL(base);\n } catch (e) {\n throw new Error(`invalid base url: ${base}`);\n }\n }\n } else {\n url = base;\n }\n url.searchParams.set(\"name\", name || \"\");\n return url.toString();\n}\n","import { Logger, getStore } from \"../utils.js\";\nimport { SysContainer } from \"./sys-container.js\";\n\nexport async function getPath(url: URL, logger: Logger): Promise<string> {\n const basePath = url\n .toString()\n .replace(new RegExp(`^${url.protocol}//`), \"\")\n .replace(/\\?.*$/, \"\");\n const name = url.searchParams.get(\"name\");\n if (name) {\n const version = url.searchParams.get(\"version\");\n if (!version) throw logger.Error().Str(\"url\", url.toString()).Msg(`version not found`).AsError();\n return SysContainer.join(basePath, version, name);\n }\n return SysContainer.join(basePath);\n}\n\nexport function getFileName(url: URL, key: string, logger: Logger): string {\n switch (getStore(url, logger, (...a: string[]) => a.join(\"/\"))) {\n case \"data\":\n return key + \".car\";\n case \"meta\":\n return key + \".json\";\n default:\n throw logger.Error().Str(\"url\", url.toString()).Msg(`unsupported store type`).AsError();\n }\n}\n\nexport function ensureIndexName(url: URL, name: string): string {\n if (url.searchParams.has(\"index\")) {\n name = (url.searchParams.get(\"index\")?.replace(/[^a-zA-Z0-9]/g, \"\") || \"idx\") + \"-\" + name;\n }\n return name;\n}\n","import { Logger, Result } from \"@adviser/cement\";\nimport type { RunResult } from \"better-sqlite3\";\n\nexport interface DBConnection {\n connect(): Promise<void>;\n readonly opts: SQLOpts;\n}\n\nexport interface SQLStore<IType, KType, OType = IType[]> {\n readonly dbConn: DBConnection;\n start(url: URL): Promise<void>;\n insert(url: URL, ose: IType): Promise<RunResult>;\n select(url: URL, car: KType): Promise<OType>;\n delete(url: URL, car: KType): Promise<RunResult>;\n close(url: URL): Promise<Result<void>>;\n destroy(url: URL): Promise<Result<void>>;\n}\n\nexport interface SQLTableNames {\n readonly data: string;\n readonly meta: string;\n readonly wal: string;\n}\n\nexport const DefaultSQLTableNames: SQLTableNames = {\n data: \"Datas\",\n meta: \"Metas\",\n wal: \"Wals\",\n};\n\nexport interface SQLOpts {\n readonly url: URL;\n readonly sqlFlavor: \"sqlite\" | \"mysql\" | \"postgres\";\n readonly tableNames: SQLTableNames;\n readonly logger: Logger;\n readonly textEncoder: TextEncoder;\n readonly textDecoder: TextDecoder;\n}\n\nexport interface WalKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface WalRecord extends WalKey {\n readonly state: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type WalSQLStore = SQLStore<WalRecord, WalKey>;\n\nexport interface MetaType {\n readonly name: string;\n readonly branch: string;\n readonly meta: Uint8Array;\n}\n\nexport interface MetaRecordKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface MetaRecord extends MetaRecordKey {\n readonly meta: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type MetaSQLStore = SQLStore<MetaRecord, MetaRecordKey>;\n\nexport interface DataRecord {\n readonly name: string;\n readonly car: string;\n readonly data: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type DataSQLStore = SQLStore<DataRecord, string>;\n","import { ensureLogger, type Logger } from \"../../utils\";\nimport { SQLOpts, SQLTableNames, DefaultSQLTableNames } from \"./types\";\n\nfunction sqlTableName(...names: string[]): string {\n return names\n .map((name) => name.replace(/^[^a-zA-Z0-9]+/, \"\").replace(/[^a-zA-Z0-9]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\"_\");\n}\n\nfunction ensureTableNames(url: URL, opts?: Partial<SQLOpts>): SQLTableNames {\n let isIndex = \"\";\n if (url.searchParams.has(\"index\")) {\n isIndex = url.searchParams.get(\"index\") || \".idx\";\n }\n const ret = opts?.tableNames || DefaultSQLTableNames;\n // console.log(\"isIndex->\", opts?.url, isIndex, sqlTableName(isIndex, ret.data));\n if (isIndex.length) {\n return {\n data: sqlTableName(isIndex, ret.data),\n meta: sqlTableName(isIndex, ret.meta),\n wal: sqlTableName(isIndex, ret.wal),\n };\n }\n return {\n data: sqlTableName(ret.data),\n meta: sqlTableName(ret.meta),\n wal: sqlTableName(ret.wal),\n };\n}\n\nconst textEncoder = new TextEncoder();\nfunction ensureTextEncoder(opts?: Partial<SQLOpts>): TextEncoder {\n return opts?.textEncoder || textEncoder;\n}\n\nconst textDecoder = new TextDecoder();\nfunction ensureTextDecoder(opts?: Partial<SQLOpts>): TextDecoder {\n return opts?.textDecoder || textDecoder;\n}\n\nfunction url2sqlFlavor(url: URL, logger: Logger): \"sqlite\" | \"mysql\" | \"postgres\" {\n const flavor = url.protocol.replace(/:.*$/, \"\");\n switch (flavor) {\n case \"sqlite\":\n case \"mysql\":\n case \"postgres\":\n return flavor;\n default:\n throw logger.Error().Str(\"flavor\", flavor).Msg(\"unsupported protocol\").AsError();\n }\n}\n\nexport function ensureSQLOpts(url: URL, opts: Partial<SQLOpts>, componentName: string, ctx?: Record<string, unknown>): SQLOpts {\n const logger = ensureLogger(opts, componentName, ctx);\n return {\n url,\n sqlFlavor: url2sqlFlavor(url, logger),\n tableNames: ensureTableNames(url, opts),\n logger,\n textEncoder: ensureTextEncoder(opts),\n textDecoder: ensureTextDecoder(opts),\n };\n}\n","// export * from \"./sqlite-adapter-better-sqlite3.js\";\nexport * from \"./types.js\";\nexport * from \"./ensurer.js\";\n","import { CryptoOpts } from \"../blockstore/index.js\";\n\nfunction randomBytes(size: number) {\n const bytes = new Uint8Array(size);\n if (size > 0) {\n crypto.getRandomValues(bytes);\n }\n return bytes;\n}\n\nfunction digestSHA256(data: Uint8Array): Promise<ArrayBuffer> {\n return Promise.resolve(crypto.subtle.digest(\"SHA-256\", data));\n}\n\nexport function toCryptoOpts(cryptoOpts: Partial<CryptoOpts> = {}): CryptoOpts {\n const opts = {\n importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),\n encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),\n decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),\n randomBytes: cryptoOpts.randomBytes || randomBytes,\n digestSHA256: cryptoOpts.digestSHA256 || digestSHA256,\n };\n // console.log(\"cryptoOpts\", cryptoOpts, opts)\n return opts;\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","export const FILESTORE_VERSION = \"v0.19-file\";\n","export const INDEXDB_VERSION = \"v0.19-indexdb\";\n","export const SQLITE_VERSION = \"v0.19-sqlite\";\n","export * from \"./sys-container.js\";\nexport * from \"./data-dir.js\";\nexport * from \"./store-file-utils.js\";\n\nexport * as sql from \"./store-sql/index.js\";\nexport * as crypto from \"./crypto.js\";\nexport * as files from \"./files.js\";\n\nexport { FILESTORE_VERSION } from \"./store-file-version.js\";\nexport { INDEXDB_VERSION } from \"./store-indexdb-version.js\";\nexport { SQLITE_VERSION } from \"./store-sql/v0.19-sqlite/version.js\";\n","import { Logger, LoggerImpl, IsLogger, Result, ResolveOnce } from \"@adviser/cement\";\nimport { SysContainer } from \"./runtime\";\nimport { uuidv7 } from \"uuidv7\";\n\nexport type { Logger };\n\nconst globalLogger: Logger = new LoggerImpl();\n\nexport interface LoggerOpts {\n readonly logger?: Logger;\n}\n\nconst registerFP_DEBUG = new ResolveOnce();\n\nexport function ensureLogger(\n optsOrLogger: Partial<LoggerOpts> | Logger,\n componentName: string,\n ctx?: Record<string, unknown>,\n): Logger {\n // if (!opts?.logger) {\n // throw new Error(\"logger is required\");\n // }\n let logger = globalLogger;\n if (IsLogger(optsOrLogger)) {\n logger = optsOrLogger;\n } else if (optsOrLogger && IsLogger(optsOrLogger.logger)) {\n logger = optsOrLogger.logger;\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n if (ctx) {\n if (\"debug\" in ctx) {\n if (typeof ctx.debug === \"string\" && ctx.debug.length > 0) {\n debug.push(ctx.debug);\n } else {\n debug.push(componentName);\n }\n delete ctx.debug;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", uuidv7());\n delete ctx.this;\n }\n for (const [key, value] of Object.entries(ctx)) {\n switch (typeof value) {\n case \"string\":\n cLogger.Str(key, value);\n break;\n case \"number\":\n cLogger.Uint64(key, value);\n break;\n default:\n if (value instanceof Date) {\n cLogger.Str(key, value.toISOString());\n } else if (value instanceof URL) {\n cLogger.Str(key, value.toString());\n } else if (typeof value === \"function\") {\n cLogger.Ref(key, value);\n } else {\n cLogger.Any(key, value);\n }\n break;\n }\n }\n }\n registerFP_DEBUG\n .once(async () => {\n // console.log(\"registerFP_DEBUG\", SysContainer.env)\n SysContainer.env.onSet((key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n if (value) {\n logger.SetDebug(value);\n }\n }, \"FP_DEBUG\");\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n const out = cLogger.Logger();\n // out.Debug().Msg(\"logger ready\");\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport function getStore(url: URL, logger: Logger, joiner: Joiner): string {\n let result = url.searchParams.get(\"store\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`store not found`).AsError();\n if (url.searchParams.has(\"index\")) {\n result = joiner(url.searchParams.get(\"index\") || \"idx\", result);\n }\n return result;\n}\n\nexport function getKey(url: URL, logger: Logger): string {\n const result = url.searchParams.get(\"key\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(url: URL, logger: Logger): string {\n let result = url.searchParams.get(\"name\");\n if (!result) {\n result = SysContainer.dirname(url.pathname);\n if (result.length === 0) {\n throw logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\nexport function exception2Result<T = void>(fn: () => Promise<T>): Promise<Result<T>> {\n return fn()\n .then((value) => Result.Ok(value))\n .catch((e) => Result.Err(e));\n}\n\nexport async function exceptionWrapper<T, E extends Error>(fn: () => Promise<Result<T, E>>): Promise<Result<T, E>> {\n return fn().catch((e) => Result.Err(e));\n}\n","import { Result } from \"@adviser/cement\";\n\nexport interface GatewayOpts {\n readonly gateway: Gateway;\n}\n\nexport class NotFoundError extends Error {\n readonly code = \"ENOENT\";\n}\n\nexport function isNotFoundError(e: Error | Result<unknown> | unknown): e is NotFoundError {\n if (Result.Is(e)) {\n if (e.isOk()) return false;\n e = e.Err();\n }\n if ((e as NotFoundError).code === \"ENOENT\") return true;\n return false;\n}\n\nexport type GetResult = Result<Uint8Array, NotFoundError | Error>;\nexport type VoidResult = Result<void>;\n\nexport interface Gateway {\n // all the methods never throw!\n // an error is reported as a Result\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n // start updates URL --> hate this side effect\n start(baseUrl: URL): Promise<VoidResult>;\n close(baseUrl: URL): Promise<VoidResult>;\n destroy(baseUrl: URL): Promise<VoidResult>;\n put(url: URL, body: Uint8Array): Promise<VoidResult>;\n // get could return a NotFoundError if the key is not found\n get(url: URL): Promise<GetResult>;\n delete(url: URL): Promise<VoidResult>;\n}\n","import { openDB, IDBPDatabase } from \"idb\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\n\nimport { TestStore } from \"../blockstore/types.js\";\nimport { INDEXDB_VERSION } from \"./store-indexdb-version.js\";\nimport { ensureLogger, exception2Result, exceptionWrapper, getKey, getStore } from \"../utils.js\";\nimport { Gateway, NotFoundError } from \"../blockstore/gateway.js\";\nimport { SysContainer } from \"./sys-container.js\";\n\nfunction ensureVersion(url: URL): URL {\n const ret = new URL(url.toString());\n ret.searchParams.set(\"version\", url.searchParams.get(\"version\") || INDEXDB_VERSION);\n return ret;\n}\n\nexport function 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\nconst onceIndexDB = new KeyedResolvOnce<{\n readonly db: IDBPDatabase<unknown>;\n readonly dbName: DbName;\n readonly version: string;\n}>();\n\nfunction sanitzeKey(key: string | string[]): string | string[] {\n if (key.length === 1) {\n key = key[0];\n }\n return key;\n}\n\nasync function connectIdb(url: URL, logger: Logger): Promise<IDBPDatabase<unknown>> {\n const dbName = getIndexDBName(url, logger); // `fp.${this.STORAGE_VERSION}.${this.name}`;\n // const urlStr = url.toString().replace(/\\?.*$/, \"\");\n // console.log(`get:${this.id}`);\n // console.log(`connectIdb:pre:`, dbName, url.toString());\n const once = await onceIndexDB.get(dbName.fullDb).once(async () => {\n // console.log(`connectIdb:once:`, dbName, url.toString());\n const db = await openDB(dbName.fullDb, 1, {\n upgrade(db) {\n // console.log('upgrade:', dbName);\n [\"version\", \"data\", \"wal\", \"meta\", \"idx.data\", \"idx.wal\", \"idx.meta\"].map((store) => {\n db.createObjectStore(store, {\n autoIncrement: false,\n });\n });\n },\n });\n const found = await db.get(\"version\", \"version\");\n const version = url.searchParams.get(\"version\") || INDEXDB_VERSION;\n if (!found) {\n await db.put(\"version\", { version }, \"version\");\n } else if (found.version !== version) {\n logger\n .Warn()\n .Str(\"url\", url.toString())\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .Str(\"version\", version!)\n .Str(\"found\", found.version)\n .Msg(\"version mismatch\");\n }\n return { db, dbName, version };\n });\n url.searchParams.set(\"version\", once.version);\n return once.db;\n}\n\nexport interface DbName {\n readonly fullDb: string;\n readonly objStore: string;\n readonly connectionKey: string;\n // readonly version: number;\n // readonly type: \"data\" | \"meta\" | \"wal\";\n readonly dbName: string;\n}\n\nfunction joinDBName(...names: string[]): string {\n return names\n .map((i) => i.replace(/^[^a-zA-Z0-9]+/g, \"\").replace(/[^a-zA-Z0-9]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\".\");\n}\n\n// const schemaVersion = new Map<string, number>();\nexport function getIndexDBName(iurl: URL, logger: Logger): DbName {\n const url = ensureVersion(iurl);\n const fullDb = url.pathname.replace(/^\\/+/, \"\").replace(/\\?.*$/, \"\"); // cut leading slashes\n // const type = getStore(url);\n // const storageVersion = url.searchParams.get(\"version\");\n // not nice but we need to pass the version to the db name\n // url.searchParams.set(\"version\", storageVersion);\n // console.log(\"getIndexDBName:\", url.toString(), { fullDb, type, branch });\n // const dbName = fullDb.replace(new RegExp(`^fp.${storageVersion}.`), \"\"); // cut fp prefix\n const dbName = url.searchParams.get(\"name\");\n if (!dbName) throw logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n const result = joinDBName(fullDb, dbName);\n const objStore = getStore(url, logger, joinDBName);\n const connectionKey = [result, objStore].join(\":\");\n return {\n fullDb: result,\n objStore,\n connectionKey,\n dbName,\n };\n}\n\nabstract class IndexDBGateway implements Gateway {\n readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = logger;\n }\n db: IDBPDatabase<unknown> = {} as IDBPDatabase<unknown>;\n idb() {\n this.db;\n }\n\n async start(baseURL: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseURL).Msg(\"starting\");\n await SysContainer.start();\n this.db = await connectIdb(baseURL, this.logger);\n this.logger.Debug().Url(baseURL).Msg(\"started\");\n });\n }\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n async destroy(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n // return deleteDB(getIndexDBName(this.url).fullDb);\n const type = getStore(baseUrl, this.logger, joinDBName);\n // console.log(\"IndexDBDataStore:destroy\", type);\n const idb = this.db;\n const trans = idb.transaction(type, \"readwrite\");\n const object_store = trans.objectStore(type);\n const toDelete = [];\n for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {\n toDelete.push(cursor.primaryKey);\n }\n for (const key of toDelete) {\n await trans.db.delete(type, key);\n }\n await trans.done;\n });\n }\n\n abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n\n async get(url: URL) {\n return exceptionWrapper(async () => {\n const key = getKey(url, this.logger);\n const store = getStore(url, this.logger, joinDBName);\n this.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"getting\");\n const tx = this.db.transaction([store], \"readonly\");\n const bytes = await tx.objectStore(store).get(sanitzeKey(key));\n await tx.done;\n if (!bytes) {\n return Result.Err(new NotFoundError(`missing ${key}`));\n }\n return Result.Ok(bytes as Uint8Array);\n });\n }\n async put(url: URL, value: Uint8Array) {\n return exception2Result(async () => {\n const key = getKey(url, this.logger);\n const store = getStore(url, this.logger, joinDBName);\n this.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"putting\");\n const tx = this.db.transaction([store], \"readwrite\");\n await tx.objectStore(store).put(value, sanitzeKey(key));\n await tx.done;\n });\n }\n async delete(url: URL) {\n return exception2Result(async () => {\n const key = getKey(url, this.logger);\n const store = getStore(url, this.logger, joinDBName);\n this.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"deleting\");\n const tx = this.db.transaction([store], \"readwrite\");\n await tx.objectStore(store).delete(sanitzeKey(key));\n await tx.done;\n return Result.Ok(undefined);\n });\n }\n}\n\nexport class IndexDBDataGateway extends IndexDBGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"IndexDBDataGateway\", {}));\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n}\n\nexport class IndexDBWalGateway extends IndexDBGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"IndexDBWalGateway\", {}));\n }\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n}\nexport class IndexDBMetaGateway extends IndexDBGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"IndexDBDataGateway\", {}));\n }\n\n readonly branches = new Set<string>();\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n this.branches.add(key);\n url.searchParams.set(\"key\", key);\n return Result.Ok(url);\n }\n}\n\nconst txtEncoder = new TextEncoder();\nexport class IndexDBTestStore implements TestStore {\n readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"IndexDBTestStore\", {});\n }\n async get(url: URL, key: string) {\n const db = await connectIdb(url, this.logger);\n const store = getStore(url, this.logger, joinDBName);\n this.logger.Debug().Str(\"key\", key).Str(\"store\", store).Msg(\"getting\");\n let bytes = await db.get(store, sanitzeKey(key));\n this.logger.Debug().Str(\"key\", key).Str(\"store\", store).Int(\"len\", bytes.length).Msg(\"got\");\n if (typeof bytes === \"string\") {\n bytes = txtEncoder.encode(bytes);\n }\n return bytes as Uint8Array;\n }\n}\n","import { SysContainer } from \"./sys-container.js\";\nimport { TestStore } from \"../blockstore/types.js\";\nimport { FILESTORE_VERSION } from \"./store-file-version.js\";\nimport { Logger, ResolveOnce, Result } from \"@adviser/cement\";\nimport { ensureLogger, exception2Result, exceptionWrapper, getStore } from \"../utils.js\";\nimport { Gateway, GetResult, isNotFoundError, NotFoundError } from \"../blockstore/gateway.js\";\nimport { ensureIndexName, getFileName, getPath } from \"./store-file-utils.js\";\n\nconst versionFiles = new Map<string, ResolveOnce<void>>();\nasync function ensureVersionFile(path: string, logger: Logger): Promise<string> {\n let once = versionFiles.get(path);\n if (!once) {\n once = new ResolveOnce<void>();\n versionFiles.set(path, once);\n }\n await once.once(async () => {\n await SysContainer.mkdir(path, { recursive: true });\n const vFile = SysContainer.join(path, \"version\");\n const vFileStat = await SysContainer.stat(vFile).catch(() => undefined);\n if (!vFileStat) {\n await SysContainer.writefile(SysContainer.join(path, \"version\"), FILESTORE_VERSION);\n return;\n } else if (!vFileStat.isFile()) {\n throw logger.Error().Str(\"file\", vFile).Msg(`version file is a directory`).AsError();\n }\n const v = await SysContainer.readfile(vFile);\n if (v.toString() !== FILESTORE_VERSION) {\n console.warn(`version mismatch:${vFile}: ${v.toString()}!=${FILESTORE_VERSION}`);\n }\n });\n return path;\n}\n\nabstract class FileGateway implements Gateway {\n readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = logger;\n }\n start(baseURL: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n await SysContainer.start();\n baseURL.searchParams.set(\"version\", baseURL.searchParams.get(\"version\") || FILESTORE_VERSION);\n const url = await this.buildUrl(baseURL, \"dummy\");\n if (url.isErr()) return url;\n const dbdir = this.getFilePath(url.Ok());\n // remove dummy\n await SysContainer.mkdir(SysContainer.dirname(dbdir), { recursive: true });\n const dbroot = SysContainer.dirname(dbdir);\n this.logger.Debug().Str(\"url\", url.Ok().toString()).Str(\"dbroot\", SysContainer.dirname(dbroot)).Msg(\"start\");\n await ensureVersionFile(dbroot, this.logger);\n });\n }\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n abstract destroy(baseUrl: URL): Promise<Result<void>>;\n abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n\n getFilePath(url: URL): string {\n const path = url\n .toString()\n .replace(/^file:\\/\\//, \"\")\n .replace(/\\?.*$/, \"\");\n this.logger.Debug().Str(\"url\", url.toString()).Str(\"path\", path).Msg(\"getFilePath\");\n return path;\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const file = this.getFilePath(url);\n this.logger.Debug().Str(\"url\", url.toString()).Str(\"file\", file).Msg(\"put\");\n await SysContainer.writefile(file, body);\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const file = this.getFilePath(url);\n try {\n const res = await SysContainer.readfile(file);\n this.logger.Debug().Url(url).Str(\"file\", file).Msg(\"get\");\n return Result.Ok(new Uint8Array(res));\n } catch (e: unknown) {\n // this.logger.Error().Err(e).Str(\"file\", file).Msg(\"get\");\n if (isNotFoundError(e)) {\n return Result.Err(new NotFoundError(`file not found: ${file}`));\n }\n return Result.Err(e as Error);\n }\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n await SysContainer.unlink(this.getFilePath(url));\n });\n }\n\n async destroyDir(baseURL: URL): Promise<Result<void>> {\n const url = await this.buildUrl(baseURL, \"x\");\n if (url.isErr()) return url;\n const filepath = SysContainer.dirname(this.getFilePath(url.Ok()));\n let dir: string[] = [];\n try {\n dir = await SysContainer.readdir(filepath);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"dir\", filepath).Msg(\"destroy:readdir\").AsError();\n }\n }\n for (const file of dir) {\n const pathed = SysContainer.join(filepath, file);\n try {\n await SysContainer.unlink(pathed);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"file\", pathed).Msg(\"destroy:unlink\").AsError();\n }\n }\n }\n return Result.Ok(undefined);\n }\n}\n\nexport class FileWALGateway extends FileGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"FileWALGateway\"));\n }\n\n async destroy(baseURL: URL): Promise<Result<void>> {\n return this.destroyDir(baseURL);\n }\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, \"wal\"), key + \".json\");\n return Result.Ok(url);\n }\n}\n\nexport class FileMetaGateway extends FileGateway {\n constructor(logger: Logger) {\n super(ensureLogger(logger, \"FileMetaGateway\"));\n }\n\n async destroy(baseURL: URL): Promise<Result<void>> {\n return this.destroyDir(baseURL);\n }\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, \"meta\"), key + \".json\");\n return Result.Ok(url);\n }\n}\n\nexport class FileDataGateway extends FileGateway {\n readonly branches = new Set<string>();\n constructor(logger: Logger) {\n // console.log(\"FileDataGateway->\", logger);\n super(ensureLogger(logger, \"FileDataGateway\"));\n }\n\n async destroy(baseURL: URL): Promise<Result<void>> {\n return this.destroyDir(baseURL);\n }\n async buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, \"data\"), key + \".car\");\n return Result.Ok(url);\n }\n}\n\nfunction toArrayBuffer(buffer: Buffer) {\n const ab = new ArrayBuffer(buffer.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buffer.length; ++i) {\n view[i] = buffer[i];\n }\n return view;\n}\n\nexport class FileTestStore implements TestStore {\n readonly logger: Logger;\n constructor(\n // readonly url: URL,\n logger: Logger,\n ) {\n this.logger = ensureLogger(logger, \"FileTestStore\");\n }\n\n async get(url: URL, key: string) {\n const logger = ensureLogger(this.logger, \"get\", { url: url.toString(), key });\n const dbFile = SysContainer.join(\n await getPath(url, this.logger),\n getStore(url, this.logger, SysContainer.join),\n getFileName(url, key, this.logger),\n );\n logger.Debug().Str(\"dbFile\", dbFile).Msg(\"get\");\n const buffer = await SysContainer.readfile(dbFile);\n logger.Debug().Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n return toArrayBuffer(buffer);\n }\n}\n","import type { Database } from \"better-sqlite3\";\nimport { KeyedResolvOnce, Logger } from \"@adviser/cement\";\n\nimport { DBConnection, SQLOpts } from \"./types.js\";\nimport { SysContainer } from \"../sys-container.js\";\nimport { ensureSQLOpts } from \"./ensurer.js\";\n\n// export function SimpleSQLite(filename: string, opts?: Partial<SQLOpts>): StoreOpts {\n// ensureLogger(opts, \"SimpleSQLite\").Debug().Str(\"filename\", filename).Msg(\"SimpleSQLite\")\n// const db = SQLiteConnection.fromFilename(filename, opts)\n// return SQLiteStoreOptions({\n// data: DataStoreFactory(db, opts),\n// meta: MetaStoreFactory(db, opts),\n// wal: WalStoreFactory(db, opts)\n// }, opts)\n// }\n\nconst onceSQLiteConnections = new KeyedResolvOnce<Database>();\nexport class SQLiteConnection implements DBConnection {\n static fromURL(url: URL, opts: Partial<SQLOpts> = {}): DBConnection {\n return new SQLiteConnection(url, opts);\n }\n readonly url: URL;\n readonly logger: Logger;\n _client?: Database;\n\n readonly opts: SQLOpts;\n\n get client(): Database {\n if (!this._client) {\n throw this.logger.Error().Msg(\"client not connected\").AsError();\n }\n return this._client;\n }\n\n private constructor(url: URL, opts: Partial<SQLOpts>) {\n // console.log(\"better-sqlite3->url->\", url);\n this.opts = ensureSQLOpts(url, opts, \"SQLiteConnection\", { url });\n this.logger = this.opts.logger;\n this.url = url;\n this.logger.Debug().Msg(\"constructor\");\n }\n async connect(): Promise<void> {\n let fName = this.url.toString().replace(\"sqlite://\", \"\").replace(/\\?.*$/, \"\");\n if (!fName) {\n throw this.logger.Error().Str(\"url\", this.url.toString()).Msg(\"filename is empty\").AsError();\n }\n // const version = this.url.searchParams.get(\"version\");\n // if (!version) {\n // throw this.logger.Error().Str(\"url\", this.url.toString()).Msg(\"version not found\").AsError();\n // }\n const hasName = this.url.searchParams.get(\"name\");\n if (hasName) {\n fName = SysContainer.join(fName, hasName);\n if (!fName.endsWith(\".sqlite\")) {\n fName += \".sqlite\";\n }\n }\n this._client = await onceSQLiteConnections.get(fName).once(async () => {\n this.logger.Debug().Str(\"filename\", fName).Msg(\"connect\");\n const Sqlite3Database = (await import(\"better-sqlite3\")).default;\n if (hasName) {\n await SysContainer.mkdir(SysContainer.dirname(fName), { recursive: true });\n }\n const db = new Sqlite3Database(fName, {\n // verbose: console.log,\n nativeBinding: \"./node_modules/better-sqlite3/build/Release/better_sqlite3.node\",\n });\n // this.logger.Debug().Any(\"client\", this.client).Msg(\"connected\")\n if (!db) {\n throw this.logger.Error().Msg(\"connect failed\").AsError();\n }\n return db;\n });\n }\n async close(): Promise<void> {\n this.logger.Debug().Msg(\"close\");\n await this.client.close();\n }\n}\n","import { ensureLogger } from \"../../utils.js\";\nimport { SQLiteConnection } from \"./sqlite-adapter-better-sqlite3.js\";\nimport { DBConnection, SQLOpts } from \"./types.js\";\n\nexport function SQLConnectionFactory(databaseURL: URL, opts: Partial<SQLOpts> = {}): DBConnection {\n const logger = ensureLogger(opts, \"SQLFactory\");\n switch (databaseURL.protocol) {\n case \"sqlite:\":\n logger.Debug().Str(\"databaseURL\", databaseURL.toString()).Msg(\"connecting to sqlite\");\n return SQLiteConnection.fromURL(databaseURL, {\n ...opts,\n logger,\n });\n default:\n throw logger\n .Error()\n .Msg(\"unsupported protocol \" + databaseURL.protocol)\n .AsError();\n }\n}\n","import { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3\";\nimport { SQLITE_VERSION } from \"./version\";\nimport { ResolveOnce } from \"@adviser/cement\";\nimport { ensureLogger } from \"../../../utils\";\n\nconst once = new ResolveOnce<string>();\nexport async function ensureSQLiteVersion(url: URL, dbConn: SQLiteConnection) {\n const version = await once.once(async () => {\n const logger = ensureLogger(dbConn.opts, \"ensureSQLiteVersion\", {\n version: SQLITE_VERSION,\n url: dbConn.url.toString(),\n });\n await dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS version (\n version TEXT NOT NULL,\n updated_at TEXT NOT NULL)`,\n )\n .run();\n const rows = (await dbConn.client.prepare(`select version from version`).all()) as { version: string }[];\n if (rows.length > 1) {\n throw logger.Error().Msg(`more than one version row found`).AsError();\n }\n if (rows.length === 0) {\n await dbConn.client\n .prepare(`insert into version (version, updated_at) values (?, ?)`)\n .run(SQLITE_VERSION, new Date().toISOString());\n return SQLITE_VERSION;\n }\n if (rows[0].version !== SQLITE_VERSION) {\n logger.Warn().Any(\"row\", rows[0]).Msg(`version mismatch`);\n }\n return rows[0].version;\n });\n url.searchParams.set(\"version\", version);\n}\n","import type { RunResult, Statement } from \"better-sqlite3\";\nimport { DBConnection, WalKey, WalRecord, WalSQLStore } from \"../types.js\";\nimport { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3.js\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\nimport { ensureSQLiteVersion } from \"./sqlite-ensure-version.js\";\nimport { ensureLogger, exception2Result, getStore } from \"../../../utils.js\";\n\nexport class WalSQLRecordBuilder {\n readonly #record: WalRecord;\n\n constructor(record: WalRecord) {\n this.#record = record;\n }\n\n static fromRecord(record: WalRecord): WalSQLRecordBuilder {\n return new WalSQLRecordBuilder(record);\n }\n\n build(): WalRecord {\n return this.#record;\n }\n}\n\ninterface SQLiteWalRecord {\n readonly name: string;\n readonly branch: string;\n readonly state: Buffer;\n readonly updated_at: string;\n}\n\nexport class V0_18_0SQLiteWalStore implements WalSQLStore {\n readonly dbConn: SQLiteConnection;\n readonly logger: Logger;\n readonly textEncoder: TextEncoder;\n constructor(dbConn: DBConnection) {\n this.dbConn = dbConn as SQLiteConnection;\n this.textEncoder = dbConn.opts.textEncoder;\n this.logger = ensureLogger(dbConn.opts, \"SQLiteWalStore\");\n this.logger.Debug().Msg(\"constructor\");\n }\n async start(url: URL): Promise<void> {\n this.logger.Debug().Msg(\"start\");\n await this.dbConn.connect();\n await ensureSQLiteVersion(url, this.dbConn);\n\n // this._insertStmt =\n // this._selectStmt = this.dbConn.client.prepare(\n // `select name, branch, state, updated_at from ${this.table} where name = ? and branch = ?`,\n // );\n // this._deleteStmt = this.dbConn.client.prepare(`delete from ${this.table} where name = ? and branch = ?`);\n }\n\n table(url: URL): string {\n return getStore(url, this.logger, (...x: string[]) => x.join(\"_\"));\n }\n\n readonly #createTable = new KeyedResolvOnce();\n async createTable(url: URL) {\n return this.#createTable.get(this.table(url)).once(async (table) => {\n await this.dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS ${table} (\n name TEXT not null,\n branch TEXT not null,\n state BLOB NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (name, branch)\n )`,\n )\n .run();\n });\n }\n\n readonly #insertStmt = new KeyedResolvOnce<Statement>();\n private async insertStmt(url: URL) {\n return this.#insertStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`insert into ${table}\n (name, branch, state, updated_at)\n values (?, ?, ?, ?)\n ON CONFLICT(name, branch) DO UPDATE SET state=?, updated_at=?\n `);\n });\n }\n\n readonly #selectStmt = new KeyedResolvOnce<Statement>();\n private async selectStmt(url: URL) {\n return this.#selectStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(\n `select name, branch, state, updated_at from ${table}\n where name = ? and branch = ?`,\n );\n });\n }\n\n readonly #deleteStmt = new KeyedResolvOnce<Statement>();\n private async deleteStmt(url: URL) {\n return this.#deleteStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);\n });\n }\n async insert(url: URL, ose: WalRecord): Promise<RunResult> {\n const wal = WalSQLRecordBuilder.fromRecord(ose).build();\n const bufState = Buffer.from(this.textEncoder.encode(JSON.stringify(wal.state)));\n return this.insertStmt(url).then((i) =>\n i.run(ose.name, ose.branch, bufState, wal.updated_at.toISOString(), bufState, wal.updated_at.toISOString()),\n );\n }\n async select(url: URL, key: WalKey): Promise<WalRecord[]> {\n const res = (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {\n const row = irow as SQLiteWalRecord;\n return {\n name: row.name,\n branch: row.branch,\n state: Uint8Array.from(row.state),\n updated_at: new Date(row.updated_at),\n };\n });\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Uint64(\"res\", res.length).Msg(\"select\");\n return res;\n }\n async delete(url: URL, key: WalKey): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Msg(\"delete\");\n return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async close(url: URL): Promise<Result<void>> {\n this.logger.Debug().Msg(\"close\");\n return Result.Ok(undefined);\n // await this.dbConn.close();\n }\n async destroy(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Msg(\"destroy\");\n await this.createTable(url);\n await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();\n });\n }\n}\n","import type { RunResult, Statement } from \"better-sqlite3\";\nimport { DBConnection, DataRecord, DataSQLStore } from \"../types.js\";\nimport { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3.js\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\nimport { UploadDataFnParams } from \"../../../blockstore/types.js\";\nimport { ensureSQLiteVersion } from \"./sqlite-ensure-version.js\";\nimport { ensureLogger, exception2Result, getStore } from \"../../../utils.js\";\n\nexport class DataSQLRecordBuilder {\n readonly dataRecord: DataRecord;\n constructor(dataRecord: DataRecord) {\n this.dataRecord = dataRecord;\n }\n\n static fromUploadParams(data: Uint8Array, params: UploadDataFnParams): DataSQLRecordBuilder {\n return new DataSQLRecordBuilder({\n name: params.name,\n car: params.car,\n data: data,\n updated_at: new Date(),\n });\n }\n\n build(): DataRecord {\n return this.dataRecord;\n }\n}\n\ninterface SQLiteDataRecord {\n name: string;\n car: string;\n data: Buffer;\n updated_at: string;\n}\n\nexport class V0_18_0SQLiteDataStore implements DataSQLStore {\n readonly dbConn: SQLiteConnection;\n readonly logger: Logger;\n constructor(dbConn: DBConnection) {\n this.dbConn = dbConn as SQLiteConnection;\n this.logger = ensureLogger(dbConn.opts, \"SQLiteDataStore\");\n this.logger.Debug().Msg(\"constructor\");\n }\n\n table(url: URL): string {\n return getStore(url, this.logger, (...x: string[]) => x.join(\"_\"));\n }\n\n readonly #createTable = new KeyedResolvOnce();\n async createTable(url: URL) {\n return this.#createTable.get(this.table(url)).once(async (table) => {\n await this.dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS ${table} (\n name TEXT NOT NULL,\n car TEXT PRIMARY KEY,\n data BLOB NOT NULL,\n updated_at TEXT NOT NULL)`,\n )\n .run();\n });\n }\n\n readonly #insertStmt = new KeyedResolvOnce<Statement>();\n private async insertStmt(url: URL) {\n return this.#insertStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`\n insert into ${table}\n (name, car, data, updated_at) values (?, ?, ?, ?)\n ON CONFLICT(car) DO UPDATE SET updated_at=?`);\n });\n }\n\n readonly #selectStmt = new KeyedResolvOnce<Statement>();\n private async selectStmt(url: URL) {\n return this.#selectStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`select name, car, data, updated_at from ${table} where car = ?`);\n });\n }\n\n readonly #deleteStmt = new KeyedResolvOnce<Statement>();\n private async deleteStmt(url: URL) {\n return this.#deleteStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`delete from ${table} where car = ?`);\n });\n }\n\n async start(url: URL): Promise<void> {\n this.logger.Debug().Msg(\"start-connect\");\n await this.dbConn.connect();\n this.logger.Debug().Msg(\"start-connected\");\n await ensureSQLiteVersion(url, this.dbConn);\n this.logger.Debug().Msg(\"start-set-version\");\n }\n\n async insert(url: URL, ose: DataRecord): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", ose.name).Str(\"car\", ose.car).Uint64(\"data-len\", ose.data.length).Msg(\"insert\");\n const updated_at = ose.updated_at.toISOString();\n return this.insertStmt(url).then((i) => i.run(ose.name, ose.car, Buffer.from(ose.data), updated_at, updated_at));\n }\n\n async select(url: URL, car: string): Promise<DataRecord[]> {\n this.logger.Debug().Str(\"car\", car).Msg(\"select\");\n return (await this.selectStmt(url).then((i) => i.all(car))).map((irow) => {\n const row = irow as SQLiteDataRecord;\n return {\n name: row.name,\n car: row.car,\n data: Uint8Array.from(row.data),\n updated_at: new Date(row.updated_at),\n };\n });\n }\n\n async delete(url: URL, car: string): Promise<RunResult> {\n this.logger.Debug().Str(\"car\", car).Msg(\"delete\");\n const ret = await this.deleteStmt(url).then((i) => i.run(car));\n // await this.select(car);\n return ret;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async close(url: URL): Promise<Result<void>> {\n this.logger.Debug().Msg(\"close\");\n return Result.Ok(undefined);\n // await this.dbConn.close();\n }\n\n async destroy(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Msg(\"destroy\");\n await this.createTable(url);\n await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();\n });\n }\n}\n","import type { RunResult, Statement } from \"better-sqlite3\";\nimport { DBConnection, MetaRecord, MetaRecordKey, MetaSQLStore } from \"../types.js\";\nimport { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3.js\";\nimport { KeyedResolvOnce, Logger, Result } from \"@adviser/cement\";\nimport { UploadMetaFnParams } from \"../../../blockstore/types.js\";\nimport { ensureSQLiteVersion } from \"./sqlite-ensure-version.js\";\nimport { ensureLogger, exception2Result, getStore } from \"../../../utils.js\";\n\nexport class MetaSQLRecordBuilder {\n readonly record: MetaRecord;\n readonly textEncoder: TextEncoder;\n\n constructor(record: MetaRecord, textEncoder: TextEncoder) {\n this.record = record;\n this.textEncoder = textEncoder;\n }\n\n static fromUploadMetaFnParams(data: Uint8Array, params: UploadMetaFnParams, textEncoder: TextEncoder): MetaSQLRecordBuilder {\n return new MetaSQLRecordBuilder(\n {\n name: params.name,\n branch: params.branch,\n meta: data,\n updated_at: new Date(),\n },\n textEncoder,\n );\n }\n\n static fromBytes(str: string, name: string, branch: string, textEncoder: TextEncoder): MetaSQLRecordBuilder {\n return new MetaSQLRecordBuilder(\n {\n name: name,\n branch: branch,\n meta: textEncoder.encode(str),\n updated_at: new Date(),\n },\n textEncoder,\n );\n }\n\n build(): MetaRecord {\n return this.record;\n }\n}\n\ninterface SQLiteMetaRecord {\n name: string;\n branch: string;\n meta: Buffer;\n updated_at: string;\n}\n\nexport class V0_18_0SQLiteMetaStore implements MetaSQLStore {\n readonly dbConn: SQLiteConnection;\n readonly logger: Logger;\n constructor(dbConn: DBConnection) {\n this.dbConn = dbConn as SQLiteConnection;\n this.logger = ensureLogger(dbConn.opts, \"SQLiteMetaStore\");\n this.logger.Debug().Msg(\"constructor\");\n }\n async start(url: URL): Promise<void> {\n this.logger.Debug().Url(url).Msg(\"starting\");\n await this.dbConn.connect();\n await ensureSQLiteVersion(url, this.dbConn);\n this.logger.Debug().Url(url).Msg(\"started\");\n }\n\n table(url: URL): string {\n return getStore(url, this.logger, (...x: string[]) => x.join(\"_\"));\n }\n\n readonly #createTable = new KeyedResolvOnce();\n async createTable(url: URL) {\n return this.#createTable.get(this.table(url)).once(async (table) => {\n await this.dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS ${table} (\n name TEXT not null,\n branch TEXT not null,\n meta BLOB NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (name, branch)\n )`,\n )\n .run();\n });\n }\n\n readonly #insertStmt = new KeyedResolvOnce<Statement>();\n private async insertStmt(url: URL) {\n return this.#insertStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`insert into ${table}\n (name, branch, meta, updated_at)\n values (?, ?, ?, ?)\n ON CONFLICT(name, branch) DO UPDATE SET meta=?, updated_at=?\n `);\n });\n }\n\n readonly #selectStmt = new KeyedResolvOnce<Statement>();\n private async selectStmt(url: URL) {\n return this.#selectStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`select name, branch, meta, updated_at from ${table} where name = ? and branch = ?`);\n });\n }\n\n readonly #deleteStmt = new KeyedResolvOnce<Statement>();\n private async deleteStmt(url: URL) {\n return this.#deleteStmt.get(this.table(url)).once(async (table) => {\n await this.createTable(url);\n return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);\n });\n }\n\n async insert(url: URL, ose: MetaRecord): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", ose.name).Str(\"branch\", ose.branch).Uint64(\"data-len\", ose.meta.length).Msg(\"insert\");\n const bufMeta = Buffer.from(ose.meta);\n return this.insertStmt(url).then((i) =>\n i.run(ose.name, ose.branch, bufMeta, ose.updated_at.toISOString(), bufMeta, ose.updated_at.toISOString()),\n );\n }\n async select(url: URL, key: MetaRecordKey): Promise<MetaRecord[]> {\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Msg(\"select\");\n return (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {\n const row = irow as SQLiteMetaRecord;\n return {\n name: row.name,\n branch: row.branch,\n meta: Uint8Array.from(row.meta),\n updated_at: new Date(row.updated_at),\n };\n });\n }\n\n async delete(url: URL, key: MetaRecordKey): Promise<RunResult> {\n this.logger.Debug().Str(\"name\", key.name).Str(\"branch\", key.branch).Msg(\"delete\");\n return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async close(url: URL): Promise<Result<void>> {\n this.logger.Debug().Msg(\"close\");\n // await this.dbConn.close();\n return Result.Ok(undefined);\n }\n async destroy(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Msg(\"destroy\");\n await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();\n });\n }\n}\n","import { Logger } from \"@adviser/cement\";\nimport { ensureLogger, LoggerOpts } from \"../../utils\";\nimport { DBConnection, DataSQLStore, MetaSQLStore, WalSQLStore } from \"./types\";\nimport { SQLITE_VERSION } from \"./v0.19-sqlite/version\";\n\nexport function prepareSQLVersion(iurl: URL, opts: LoggerOpts | Logger): URL {\n if (iurl.searchParams.get(\"version\")) return iurl;\n const url = new URL(iurl.toString());\n switch (url.protocol) {\n case \"sqlite:\":\n {\n url.searchParams.set(\"version\", SQLITE_VERSION);\n }\n break;\n default:\n throw ensureLogger(opts, \"ensureSQLVersion\").Error().Str(\"url\", url.toString()).Msg(\"unsupported protocol\").AsError();\n }\n return url;\n}\n\nexport async function WalStoreFactory(db: DBConnection): Promise<WalSQLStore> {\n switch (db.opts.sqlFlavor) {\n case \"sqlite\": {\n const { V0_18_0SQLiteWalStore } = await import(\"./v0.19-sqlite/sqlite-wal-store.js\");\n const store = new V0_18_0SQLiteWalStore(db);\n return store;\n }\n default:\n throw ensureLogger(db.opts, \"WalStoreFactory\").Error().Msg(\"unsupported db connection\").AsError();\n }\n}\n\nexport async function DataStoreFactory(db: DBConnection): Promise<DataSQLStore> {\n switch (db.opts.sqlFlavor) {\n case \"sqlite\": {\n const { V0_18_0SQLiteDataStore } = await import(\"./v0.19-sqlite/sqlite-data-store.js\");\n const store = new V0_18_0SQLiteDataStore(db);\n return store;\n }\n default:\n throw ensureLogger(db.opts, \"DataStoreFactory\").Error().Msg(\"unsupported db connection\").AsError();\n }\n}\n\nexport async function MetaStoreFactory(db: DBConnection): Promise<MetaSQLStore> {\n switch (db.opts.sqlFlavor) {\n case \"sqlite\": {\n const { V0_18_0SQLiteMetaStore } = await import(\"./v0.19-sqlite/sqlite-meta-store.js\");\n const store = new V0_18_0SQLiteMetaStore(db);\n return store;\n }\n default:\n throw ensureLogger(db.opts, \"MetaStoreFactory\").Error().Msg(\"unsupported db connection\").AsError();\n }\n}\n","import { Logger, Result } from \"@adviser/cement\";\n\nimport { TestStore } from \"../../blockstore/types.js\";\nimport { SQLConnectionFactory } from \"./sql-connection-factory.js\";\nimport { DataSQLStore, MetaSQLStore, WalSQLStore } from \"./types.js\";\nimport { DataStoreFactory, MetaStoreFactory, WalStoreFactory } from \"./store-version-factory.js\";\nimport { ensureLogger, exception2Result, exceptionWrapper, getKey, getName } from \"../../utils.js\";\nimport { Gateway, GetResult, NotFoundError } from \"../../blockstore/gateway.js\";\n\nexport class SQLWalGateway implements Gateway {\n readonly logger: Logger;\n walSQLStore: WalSQLStore = {} as WalSQLStore;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"SQLWalGateway\");\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n\n async start(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseUrl).Msg(\"start\");\n const conn = SQLConnectionFactory(baseUrl);\n const ws = await WalStoreFactory(conn);\n await ws.start(baseUrl);\n this.walSQLStore = ws;\n });\n }\n close(baseUrl: URL) {\n return this.walSQLStore.close(baseUrl);\n }\n destroy(baseUrl: URL) {\n return this.walSQLStore.destroy(baseUrl);\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.walSQLStore.insert(url, {\n state: body,\n updated_at: new Date(),\n name,\n branch,\n });\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n const record = await this.walSQLStore.select(url, { name, branch });\n if (record.length === 0) {\n return Result.Err(new NotFoundError(`not found ${name} ${branch}`));\n }\n return Result.Ok(record[0].state);\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.walSQLStore.delete(url, { name, branch });\n });\n }\n}\n\nexport class SQLMetaGateway implements Gateway {\n readonly logger: Logger;\n metaSQLStore: MetaSQLStore = {} as MetaSQLStore;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"SQLMetaGateway\");\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n\n async start(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseUrl).Msg(\"start\");\n const conn = SQLConnectionFactory(baseUrl);\n const ws = await MetaStoreFactory(conn);\n await ws.start(baseUrl);\n this.metaSQLStore = ws;\n this.logger.Debug().Url(baseUrl).Msg(\"started\");\n });\n }\n close(baseUrl: URL): Promise<Result<void>> {\n return this.metaSQLStore.close(baseUrl);\n }\n destroy(baseUrl: URL): Promise<Result<void>> {\n return this.metaSQLStore.destroy(baseUrl);\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.metaSQLStore.insert(url, {\n meta: body,\n updated_at: new Date(),\n name,\n branch,\n });\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n const record = await this.metaSQLStore.select(url, {\n name,\n branch,\n });\n if (record.length === 0) {\n return Result.Err(new NotFoundError(`not found ${name} ${branch}`));\n }\n return Result.Ok(record[0].meta);\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.metaSQLStore.delete(url, {\n name,\n branch,\n });\n });\n }\n}\n\nexport class SQLDataGateway implements Gateway {\n readonly logger: Logger;\n dataSQLStore: DataSQLStore = {} as DataSQLStore;\n constructor(logger: Logger) {\n this.logger = ensureLogger(logger, \"SQLDataGateway\");\n }\n\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>> {\n const url = new URL(baseUrl.toString());\n url.searchParams.set(\"key\", key);\n return Promise.resolve(Result.Ok(url));\n }\n\n async start(baseUrl: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseUrl).Msg(\"pre-sql-connection\");\n const conn = SQLConnectionFactory(baseUrl);\n this.logger.Debug().Url(baseUrl).Msg(\"post-sql-connection\");\n const ws = await DataStoreFactory(conn);\n this.logger.Debug().Url(baseUrl).Msg(\"post-data-store-factory\");\n await ws.start(baseUrl);\n this.dataSQLStore = ws;\n this.logger.Debug().Url(baseUrl).Msg(\"started\");\n });\n }\n close(baseUrl: URL): Promise<Result<void>> {\n return this.dataSQLStore.close(baseUrl);\n }\n destroy(baseUrl: URL): Promise<Result<void>> {\n return this.dataSQLStore.destroy(baseUrl);\n }\n\n async put(url: URL, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const cid = getKey(url, this.logger);\n const name = getName(url, this.logger);\n await this.dataSQLStore.insert(url, {\n data: body,\n updated_at: new Date(),\n name: name,\n car: cid,\n });\n });\n }\n async get(url: URL): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const branch = getKey(url, this.logger);\n const record = await this.dataSQLStore.select(url, branch);\n if (record.length === 0) {\n return Result.Err(new NotFoundError(`not found ${branch}`));\n }\n return Result.Ok(record[0].data);\n });\n }\n async delete(url: URL): Promise<Result<void>> {\n return exception2Result(async () => {\n const branch = getKey(url, this.logger);\n await this.dataSQLStore.delete(url, branch);\n return Result.Ok(undefined);\n });\n }\n}\n\nexport class SQLTestStore implements TestStore {\n readonly logger: Logger;\n constructor(ilogger: Logger) {\n const logger = ensureLogger(ilogger, \"SQLTestStore\");\n this.logger = logger;\n }\n async get(url: URL, key: string): Promise<Uint8Array> {\n const conn = SQLConnectionFactory(url);\n const name = getName(url, this.logger);\n switch (url.searchParams.get(\"store\")) {\n case \"wal\": {\n const sqlStore = await WalStoreFactory(conn);\n await sqlStore.start(url);\n const records = await sqlStore.select(url, {\n name,\n branch: key,\n });\n return records[0].state;\n }\n case \"meta\": {\n const sqlStore = await MetaStoreFactory(conn);\n await sqlStore.start(url);\n const records = await sqlStore.select(url, {\n name,\n branch: key,\n });\n return records[0].meta;\n }\n case \"data\": {\n const sqlStore = await DataStoreFactory(conn);\n await sqlStore.start(url);\n const records = await sqlStore.select(url, key);\n return records[0].data;\n }\n default:\n throw this.logger.Error().Str(\"key\", key).Msg(`Method not implemented`);\n }\n }\n}\n","export * from \"./database.js\";\nexport * from \"./types.js\";\n\nexport * from \"./crdt.js\";\n\nexport * from \"./indexer.js\";\n\nexport * as bs from \"./blockstore/index.js\";\nexport * as blockstore from \"./blockstore/index.js\";\n\nexport * as rt from \"./runtime/index.js\";\nexport * as runtime from \"./runtime/index.js\";\n\nexport * from \"./utils.js\";\n\nexport * from \"./version.js\";\n","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 DbResponse,\n ChangesResponse,\n DocTypes,\n IndexRows,\n DocFragment,\n ChangesResponseRow,\n CRDTMeta,\n AllDocsQueryOpts,\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._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 this.logger.Debug().Str(\"id\", id).Msg(\"get-pre-ready\");\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"get-post-ready\");\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<DbResponse> {\n this.logger.Debug().Str(\"id\", doc._id).Msg(\"put-pre-ready\");\n await this.ready();\n this.logger.Debug().Str(\"id\", doc._id).Msg(\"put-post-ready\");\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 };\n }\n\n async del(id: string): Promise<DbResponse> {\n await this.ready();\n const result = (await this._writeQueue.push({ id: id, del: true })) as CRDTMeta;\n return { id, clock: result?.head } as DbResponse;\n }\n\n async changes<T extends DocTypes>(since: ClockHead = [], opts: ChangesOptions = {}): Promise<ChangesResponse<T>> {\n await this.ready();\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 };\n }\n\n async allDocs<T extends DocTypes>(\n opts: AllDocsQueryOpts = {},\n ): Promise<{\n rows: {\n key: string;\n value: DocWithId<T>;\n }[];\n clock: ClockHead;\n }> {\n await this.ready();\n void opts;\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 };\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 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 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 // 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 if (storeFactory.has(item.protocol)) {\n throw new Error(`protocol ${item.protocol} already registered`);\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(item.protocol, item);\n return () => {\n storeFactory.delete(item.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 await store.start();\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 await store.start();\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 await store.start();\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\nregisterStoreProtocol({\n protocol: \"sqlite:\",\n data: async (logger) => {\n const { SQLDataGateway } = await import(\"../runtime/store-sql/store-sql.js\");\n return new SQLDataGateway(logger);\n },\n meta: async (logger) => {\n const { SQLMetaGateway } = await import(\"../runtime/store-sql/store-sql.js\");\n return new SQLMetaGateway(logger);\n },\n wal: async (logger) => {\n const { SQLWalGateway } = await import(\"../runtime/store-sql/store-sql.js\");\n return new SQLWalGateway(logger);\n },\n test: async (logger) => {\n const { SQLTestStore } = await import(\"../runtime/store-sql/store-sql.js\");\n return new SQLTestStore(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 { guardVersion } from \"../runtime/store-indexdb.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\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 .Err(url.Err())\n .Str(\"branch\", branch || \"\")\n .Str(\"url\", this.url.toString())\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().Err(bytes.Err()).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().Err(res.Err()).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().Err(res.Err()).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 CryptoOpts {\n // readonly crypto: MakeCodecCrypto; //| unknown;\n readonly importKey: typeof crypto.subtle.importKey;\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: CryptoKey,\n data: Uint8Array,\n ) => Promise<ArrayBuffer>;\n readonly encrypt: (\n algo: { name: string; iv: Uint8Array; tagLength: number },\n key: CryptoKey,\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 {\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 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 { 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.0.0-dev\": \"xxxx\",\n})[0] as string;\n"],"mappings":"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","names":["createNodeSysContainer","e","init_types","init_types","init_types","import_cement","import_uuidv7","import_cement","once","db","import_cement","once","import_cement","import_cement","import_cement","import_cement","import_cement","import_cement","textEncoder","V0_18_0SQLiteWalStore","V0_18_0SQLiteDataStore","V0_18_0SQLiteMetaStore","store_sql_exports","import_cement","init_store_sql","import_uuidv7","import_cement","index","import_cement","import_block","import_sha2","codec","import_clock","cid","import_cement","import_p_limit","import_cement","import_cement","import_block","raw","hasher","import_sha2","import_multiformats","import_block","import_utils","crypto","randomBytes","encode","decode","crypto","randomBytes","codec","get","hasher","cache","chunker","root","block","mfCreate","import_block","CBW","carLogIncludesGroup","pLimit","cid","cache","got","batchSize","root","textEncoder","textDecoder","pLimit","carLogIncludesGroup","FileDataGateway","FileMetaGateway","FileWALGateway","FileTestStore","IndexDBDataGateway","IndexDBMetaGateway","IndexDBTestStore","SQLDataGateway","SQLMetaGateway","SQLWalGateway","SQLTestStore","hasher","codec","import_block","import_sha2","codec","import_utils","import_cache","cache","hasher","charwise","root","import_clock","import_crdt","import_cement","task","name","updates"]}
|