@fireproof/core 0.19.4-dev → 0.19.5-dev
Sign up to get free protection for your applications and to get access to all the features.
- package/index.cjs +1 -1
- package/index.cjs.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/package.json +6 -2
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.4-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-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"]}
|