@fireproof/core 0.20.4-dev-preview-1 → 0.20.4-dev-preview-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/ledger.ts","../../src/utils.ts","../../src/types.ts","../../src/write-queue.ts","../../src/runtime/files.ts","../../src/runtime/key-bag.ts","../../src/runtime/gateways/file/sys-file-system-factory.ts","../../src/runtime/gateways/file/key-bag-file.ts","../../src/runtime/key-bag-memory.ts","../../src/blockstore/register-store-protocol.ts","../../src/runtime/gateways/file/version.ts","../../src/runtime/gateways/indexeddb-version.ts","../../src/runtime/gateways/file/gateway-impl.ts","../../src/runtime/gateways/file/utils.ts","../../src/runtime/gateways/memory/gateway.ts","../../src/runtime/gateways/memory/version.ts","../../src/runtime/gateways/def-serde-gateway.ts","../../src/blockstore/fp-envelope.ts","../../src/runtime/gateways/fp-envelope-serialize.ts","../../src/runtime/wait-pr-multiformats/block.ts","../../src/indexer-helpers.ts","../../src/indexer.ts","../../src/database.ts","../../src/crdt.ts","../../src/blockstore/index.ts","../../src/blockstore/types.ts","../../src/blockstore/store-factory.ts","../../src/blockstore/store.ts","../../src/blockstore/loader.ts","../../src/blockstore/loader-helpers.ts","../../src/blockstore/transaction.ts","../../src/blockstore/commit-queue.ts","../../src/blockstore/commitor.ts","../../src/blockstore/task-manager.ts","../../src/blockstore/attachable-store.ts","../../src/runtime/keyed-crypto.ts","../../src/blockstore/interceptor-gateway.ts","../../src/blockstore/uri-interceptor.ts","../../src/crdt-helpers.ts","../../src/crdt-clock.ts","../../src/apply-head-queue.ts","../../src/context.ts","../../src/runtime/index.ts","../../src/runtime/wait-pr-multiformats/index.ts","../../src/runtime/wait-pr-multiformats/codec-interface.ts","../../src/runtime/sts-service/index.ts","../../src/runtime/gateways/index.ts","../../src/runtime/gateways/file/index.ts","../../src/runtime/gateways/cloud/gateway.ts","../../src/protocols/cloud/msg-types.ts","../../src/protocols/cloud/msger.ts","../../src/protocols/cloud/http-connection.ts","../../src/protocols/cloud/msg-raw-connection-base.ts","../../src/protocols/cloud/ws-connection.ts","../../src/protocols/cloud/msg-types-data.ts","../../src/protocols/cloud/msg-types-meta.ts","../../src/runtime/meta-key-hack.ts","../../src/protocols/index.ts","../../src/protocols/cloud/index.ts","../../src/protocols/cloud/msg-types-wal.ts","../../src/version.ts"],"sourcesContent":["export * from \"./ledger.js\";\nexport * from \"./database.js\";\nexport * from \"./types.js\";\n\nexport * from \"./crdt.js\";\n\nexport * from \"./indexer.js\";\n\nexport { defaultWriteQueueOpts } from \"./write-queue.js\";\n\nexport * as bs from \"./blockstore/index.js\";\nexport * as blockstore from \"./blockstore/index.js\";\n\nexport * as rt from \"./runtime/index.js\";\nexport * as runtime from \"./runtime/index.js\";\n\nexport * as ps from \"./protocols/index.js\";\nexport * as protocols from \"./protocols/index.js\";\n\nexport * from \"./utils.js\";\n\nexport * from \"./version.js\";\n","import { BuildURI, KeyedResolvOnce, Logger, ResolveOnce, URI } from \"@adviser/cement\";\n\nimport { defaultWriteQueueOpts, writeQueue } from \"./write-queue.js\";\nimport type {\n DocUpdate,\n ConfigOpts,\n DocWithId,\n ListenerFn,\n DocTypes,\n SuperThis,\n Database,\n Ledger,\n WriteQueue,\n CRDT,\n LedgerOpts,\n Attachable,\n Attached,\n} from \"./types.js\";\nimport { PARAM } from \"./types.js\";\nimport { StoreURIRuntime, StoreUrlsOpts } from \"./blockstore/index.js\";\nimport { ensureLogger, ensureSuperThis, ensureURIDefaults, toSortedArray } from \"./utils.js\";\n\nimport { decodeFile, encodeFile } from \"./runtime/files.js\";\nimport { defaultKeyBagOpts } from \"./runtime/key-bag.js\";\nimport { getDefaultURI } from \"./blockstore/register-store-protocol.js\";\nimport { DatabaseImpl } from \"./database.js\";\nimport { CRDTImpl } from \"./crdt.js\";\nimport { Context } from \"./context.js\";\n\nconst ledgers = new KeyedResolvOnce<Ledger>();\n\nexport function keyConfigOpts(sthis: SuperThis, name: string, opts?: ConfigOpts): string {\n return JSON.stringify(\n toSortedArray({\n name,\n stores: toSortedArray(JSON.parse(JSON.stringify(toStoreURIRuntime(sthis, name, opts?.storeUrls)))),\n }),\n );\n}\n\nexport function isLedger(db: unknown): db is Ledger {\n return db instanceof LedgerImpl || db instanceof LedgerShell;\n}\n\nexport function LedgerFactory(name: string, opts?: ConfigOpts): Ledger {\n const sthis = ensureSuperThis(opts);\n return new LedgerShell(\n ledgers.get(keyConfigOpts(sthis, name, opts)).once((key) => {\n const db = new LedgerImpl(sthis, {\n name,\n meta: opts?.meta,\n keyBag: defaultKeyBagOpts(sthis, opts?.keyBag),\n storeUrls: toStoreURIRuntime(sthis, name, opts?.storeUrls),\n gatewayInterceptor: opts?.gatewayInterceptor,\n writeQueue: defaultWriteQueueOpts(opts?.writeQueue),\n storeEnDe: {\n encodeFile,\n decodeFile,\n ...opts?.storeEnDe,\n },\n });\n db.onClosed(() => {\n ledgers.unget(key);\n });\n return db;\n }),\n );\n}\n\nexport class LedgerShell implements Ledger {\n readonly ref: LedgerImpl;\n readonly writeQueue: WriteQueue<DocUpdate<DocTypes>>;\n readonly name: string;\n\n constructor(ref: LedgerImpl) {\n this.ref = ref;\n this.writeQueue = ref.writeQueue;\n this.name = ref.name;\n ref.addShell(this);\n }\n\n attach(a: Attachable): Promise<Attached> {\n return this.ref.attach(a);\n }\n\n get opts(): LedgerOpts {\n return this.ref.opts;\n }\n\n get context(): Context {\n return this.ref.context;\n }\n\n get id(): string {\n return this.ref.id;\n }\n get logger(): Logger {\n return this.ref.logger;\n }\n get sthis(): SuperThis {\n return this.ref.sthis;\n }\n get crdt(): CRDT {\n return this.ref.crdt;\n }\n\n onClosed(fn: () => void): () => void {\n return this.ref.onClosed(fn);\n }\n close(): Promise<void> {\n return this.ref.shellClose(this);\n }\n destroy(): Promise<void> {\n return this.ref.destroy();\n }\n ready(): Promise<void> {\n return this.ref.ready();\n }\n\n // asDB(): Database {\n // return this.ref.asDB();\n // }\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void {\n return this.ref.subscribe(listener, updates);\n }\n}\n\nclass LedgerImpl implements Ledger {\n // readonly name: string;\n readonly opts: LedgerOpts;\n\n _listening = false;\n readonly _listeners = new Set<ListenerFn<DocTypes>>();\n readonly _noupdate_listeners = new Set<ListenerFn<DocTypes>>();\n readonly crdt: CRDT;\n readonly writeQueue: WriteQueue<DocUpdate<DocTypes>>;\n // readonly blockstore: BaseBlockstore;\n\n readonly shells: Set<LedgerShell> = new Set<LedgerShell>();\n\n readonly context = new Context();\n\n get name(): string {\n return this.opts.name;\n // this.opts.storeUrls.data.data.getParam(PARAM.NAME) ?? \"default\";\n }\n\n addShell(shell: LedgerShell) {\n this.shells.add(shell);\n }\n\n readonly _onClosedFns = new Map<string, () => void>();\n onClosed(fn: () => void): () => void {\n const id = this.sthis.nextId().str;\n this._onClosedFns.set(id, fn);\n return () => {\n this._onClosedFns.delete(id);\n };\n }\n async close() {\n throw this.logger.Error().Str(\"db\", this.name).Msg(`use shellClose`).AsError();\n }\n async shellClose(db: LedgerShell) {\n if (!this.shells.has(db)) {\n throw this.logger.Error().Str(\"db\", this.name).Msg(`LedgerShell mismatch`).AsError();\n }\n this.shells.delete(db);\n if (this.shells.size === 0) {\n await this.ready();\n await this.crdt.close();\n await this.writeQueue.close();\n this._onClosedFns.forEach((fn) => fn());\n }\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: ResolveOnce<void> = new ResolveOnce<void>();\n async ready(): Promise<void> {\n const ret = await this._ready.once(async () => {\n await this.sthis.start();\n await this.crdt.ready();\n // await this.blockstore.ready();\n });\n return ret;\n }\n\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly id: string;\n\n constructor(sthis: SuperThis, opts: LedgerOpts) {\n this.opts = opts; // || this.opts;\n // this.name = opts.storeUrls.data.data.getParam(PARAM.NAME) || \"default\";\n this.sthis = sthis;\n this.id = sthis.timeOrderedNextId().str;\n this.logger = ensureLogger(this.sthis, \"Ledger\");\n this.crdt = new CRDTImpl(this.sthis, this.opts);\n this.writeQueue = writeQueue(\n this.sthis,\n async (updates: DocUpdate<DocTypes>[]) => this.crdt.bulk(updates),\n this.opts.writeQueue,\n );\n this.crdt.clock.onTock(() => this._no_update_notify());\n }\n\n async attach(a: Attachable): Promise<Attached> {\n await this.ready();\n return this.crdt.blockstore.loader.attach(a);\n }\n\n // readonly _asDb = new ResolveOnce<Database>();\n // asDB(): Database {\n // return this._asDb.once(() => new DatabaseImpl(this));\n // }\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void {\n this.ready();\n this.logger.Debug().Bool(\"updates\", updates).Msg(\"subscribe\");\n if (updates) {\n if (!this._listening) {\n this._listening = true;\n this.crdt.clock.onTick((updates: DocUpdate<NonNullable<unknown>>[]) => {\n void this._notify(updates);\n });\n }\n this._listeners.add(listener as ListenerFn<NonNullable<unknown>>);\n return () => {\n this._listeners.delete(listener as ListenerFn<NonNullable<unknown>>);\n };\n } else {\n this._noupdate_listeners.add(listener as ListenerFn<NonNullable<unknown>>);\n return () => {\n this._noupdate_listeners.delete(listener as ListenerFn<NonNullable<unknown>>);\n };\n }\n }\n\n private async _notify(updates: DocUpdate<DocTypes>[]) {\n await this.ready();\n if (this._listeners.size) {\n const docs: DocWithId<DocTypes>[] = updates.map(({ id, value }) => ({ ...value, _id: id }));\n for (const listener of this._listeners) {\n await (async () => await listener(docs as DocWithId<DocTypes>[]))().catch((e: Error) => {\n this.logger.Error().Err(e).Msg(\"subscriber error\");\n });\n }\n }\n }\n\n private 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\nexport function toStoreURIRuntime(sthis: SuperThis, name: string, sopts?: StoreUrlsOpts): StoreURIRuntime {\n sopts = sopts || {};\n if (!sopts.base) {\n const fp_env = sthis.env.get(\"FP_STORAGE_URL\");\n if (fp_env) {\n sopts = { ...sopts, base: BuildURI.from(fp_env).setParam(PARAM.URL_GEN, \"fromEnv\") };\n } else {\n sopts = { ...sopts, base: getDefaultURI(sthis).build().setParam(PARAM.URL_GEN, \"default\") };\n }\n }\n const base = URI.from(sopts.base);\n // bbase.setParam(PARAM.NAME, name);\n // const base = bbase.URI();\n // readonly public?: boolean;\n // readonly meta?: DbMeta;\n // readonly persistIndexes?: boolean;\n // readonly autoCompact?: number;\n // readonly threshold?: number;\n return {\n idx: {\n car: ensureURIDefaults(sthis, name, sopts.idx?.car ?? sopts.data?.car, base, \"car\", { idx: true }),\n file: ensureURIDefaults(sthis, name, sopts.idx?.file ?? sopts.idx?.car ?? sopts.data?.file ?? sopts.data?.car, base, \"file\", {\n file: true,\n idx: true,\n }),\n meta: ensureURIDefaults(sthis, name, sopts.idx?.meta ?? sopts.data?.meta, base, \"meta\", { idx: true }),\n wal: ensureURIDefaults(sthis, name, sopts.idx?.wal ?? sopts.data?.wal, base, \"wal\", { idx: true }),\n },\n data: {\n car: ensureURIDefaults(sthis, name, sopts.data?.car, base, \"car\"),\n file: ensureURIDefaults(sthis, name, sopts.data?.file ?? sopts.data?.car, base, \"file\", { file: true }),\n meta: ensureURIDefaults(sthis, name, sopts.data?.meta, base, \"meta\"),\n wal: ensureURIDefaults(sthis, name, sopts.data?.wal, base, \"wal\"),\n },\n };\n}\n\nexport function fireproof(name: string, opts?: ConfigOpts): Database {\n return new DatabaseImpl(LedgerFactory(name, opts));\n}\n","import {\n Logger,\n LoggerImpl,\n IsLogger,\n Result,\n ResolveOnce,\n isURL,\n URI,\n envFactory,\n Env,\n toCryptoRuntime,\n CryptoRuntime,\n JSONFormatter,\n YAMLFormatter,\n CoerceURI,\n} from \"@adviser/cement\";\nimport { PARAM, PathOps, StoreType, SuperThis, SuperThisOpts, TextEndeCoder, PromiseToUInt8, ToUInt8 } from \"./types.js\";\nimport { base58btc } from \"multiformats/bases/base58\";\n\n//export type { Logger };\n//export { Result };\n\nconst _globalLogger = new ResolveOnce();\nfunction globalLogger(): Logger {\n return _globalLogger.once(() => new LoggerImpl());\n}\n\nconst registerFP_DEBUG = new ResolveOnce();\n\ninterface superThisOpts {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly crypto: CryptoRuntime;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n}\n\nclass SuperThisImpl implements SuperThis {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n readonly crypto: CryptoRuntime;\n\n constructor(opts: superThisOpts) {\n this.logger = opts.logger;\n this.env = opts.env;\n this.crypto = opts.crypto;\n this.pathOps = opts.pathOps;\n this.txt = opts.txt;\n this.ctx = { ...opts.ctx };\n // console.log(\"superThis\", this);\n }\n\n nextId(bytes = 6): { str: string; bin: Uint8Array } {\n const bin = this.crypto.randomBytes(bytes);\n return {\n str: base58btc.encode(bin),\n bin,\n };\n }\n\n timeOrderedNextId(now?: number): { str: string } {\n now = typeof now === \"number\" ? now : new Date().getTime();\n // 49th bit\n const t = (0x1000000000000 + now).toString(16).replace(/^1/, \"\");\n const bin = this.crypto.randomBytes(10);\n bin[1] = (bin[1] & 0xf0) | (bin[1] | 0x08 && 0x0b);\n const hex = Array.from(bin)\n .map((i) => i.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return {\n str: `${t.slice(0, 8)}-${t.slice(8)}-7${hex.slice(0, 3)}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`,\n };\n }\n\n start(): Promise<void> {\n return Promise.resolve();\n }\n\n clone(override: Partial<SuperThisOpts>): SuperThis {\n return new SuperThisImpl({\n logger: override.logger || this.logger,\n env: envFactory(override.env) || this.env,\n crypto: override.crypto || this.crypto,\n pathOps: override.pathOps || this.pathOps,\n txt: override.txt || this.txt,\n ctx: { ...this.ctx, ...override.ctx },\n });\n }\n}\n\n// const pathOps =\nfunction presetEnv(ipreset?: Map<string, string> | Record<string, string>): Map<string, string> {\n let preset: Record<string, string> = {};\n if (ipreset instanceof Map) {\n preset = Object.fromEntries<string>(ipreset.entries());\n } else if (typeof ipreset === \"object\" && ipreset !== null) {\n preset = ipreset;\n }\n const penv = new Map([\n // [\"FP_DEBUG\", \"xxx\"],\n // [\"FP_ENV\", \"development\"],\n ...Array.from(\n Object.entries({\n ...setPresetEnv({}),\n ...preset,\n }),\n ), // .map(([k, v]) => [k, v as string])\n ]);\n // console.log(\">>>>>>\", penv)\n return penv;\n}\n// const envImpl = envFactory({\n// symbol: \"FP_ENV\",\n// presetEnv: presetEnv(),\n// });\nclass pathOpsImpl implements PathOps {\n join(...paths: string[]): string {\n return paths.map((i) => i.replace(/\\/+$/, \"\")).join(\"/\");\n }\n dirname(path: string) {\n return path.split(\"/\").slice(0, -1).join(\"/\");\n }\n basename(path: string): string {\n return path.split(\"/\").pop() || \"\";\n }\n // homedir() {\n // throw new Error(\"SysContainer:homedir is not available in seeded state\");\n // }\n}\nconst pathOps = new pathOpsImpl();\nconst txtOps = ((txtEncoder, txtDecoder) => ({\n encode: (input: string) => txtEncoder.encode(input),\n decode: (input: ToUInt8) => txtDecoder.decode(coerceIntoUint8(input).Ok()),\n // eslint-disable-next-line no-restricted-globals\n}))(new TextEncoder(), new TextDecoder());\n\nconst _onSuperThis = new Map<string, (sthis: SuperThis) => void>();\nexport function onSuperThis(fn: (sthis: SuperThis) => void): () => void {\n const key = `onSuperThis-${Math.random().toString(36).slice(2)}`;\n _onSuperThis.set(key, fn);\n return () => {\n _onSuperThis.delete(key);\n };\n}\n\nexport function ensureSuperThis(osthis?: Partial<SuperThisOpts>): SuperThis {\n const env = envFactory({\n symbol: osthis?.env?.symbol || \"FP_ENV\",\n presetEnv: presetEnv(osthis?.env?.presetEnv),\n });\n const ret = new SuperThisImpl({\n logger: osthis?.logger || globalLogger(),\n env,\n crypto: osthis?.crypto || toCryptoRuntime(),\n ctx: osthis?.ctx || {},\n pathOps,\n txt: osthis?.txt || txtOps,\n });\n _onSuperThis.forEach((fn) => fn(ret));\n return ret;\n}\n\n// // eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function ensureSuperLog(sthis: SuperThis, componentName: string, ctx?: Record<string, unknown>): SuperThis {\n return sthis.clone({\n logger: ensureLogger(sthis, componentName, ctx),\n });\n}\n\nexport function ensureLogger(\n sthis: SuperThis /* 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: Logger;\n if (sthis && IsLogger(sthis.logger)) {\n logger = sthis.logger;\n } else {\n logger = globalLogger();\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n let exposeStack = false;\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 (\"exposeStack\" in ctx) {\n exposeStack = true;\n delete ctx.exposeStack;\n }\n if (\"exposeStack\" in ctx) {\n exposeStack = true;\n delete ctx.exposeStack;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", sthis.nextId(4).str);\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 (isURL(value)) {\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 sthis.env.onSet(\n (key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n switch (key) {\n case \"FP_FORMAT\": {\n switch (value) {\n case \"jsonice\":\n logger.SetFormatter(new JSONFormatter(logger.TxtEnDe(), 2));\n break;\n case \"yaml\":\n logger.SetFormatter(new YAMLFormatter(logger.TxtEnDe(), 2));\n break;\n case \"json\":\n default:\n logger.SetFormatter(new JSONFormatter(logger.TxtEnDe()));\n break;\n }\n break;\n }\n case \"FP_DEBUG\":\n logger.SetDebug(value || []);\n break;\n case \"FP_STACK\":\n logger.SetExposeStack(!!value);\n break;\n }\n },\n \"FP_FORMAT\",\n \"FP_DEBUG\",\n \"FP_STACK\",\n );\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n if (exposeStack) {\n logger.SetExposeStack(true);\n }\n const out = cLogger.Logger();\n if (sthis.env.get(\"FP_CONSTRUCTOR_DEBUG\")) {\n out.Debug().Msg(\"constructor\");\n }\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport interface Store {\n readonly pathPart: \"data\" | \"wal\" | \"meta\";\n readonly fromUrl: StoreType;\n readonly name: string;\n}\n\nexport function getStore(url: URI, sthis: SuperThis, joiner: Joiner): Store {\n const fromUrl = url.getParam(PARAM.STORE) as StoreType;\n let pathPart: Store[\"pathPart\"];\n switch (fromUrl) {\n case \"car\":\n case \"file\":\n pathPart = \"data\";\n break;\n case \"wal\":\n case \"meta\":\n pathPart = fromUrl;\n break;\n default:\n throw sthis.logger.Error().Url(url).Msg(`store not found`).AsError();\n }\n let name: string = pathPart;\n if (url.hasParam(\"index\")) {\n name = joiner(url.getParam(PARAM.INDEX) || \"idx\", name);\n }\n return { pathPart, fromUrl, name };\n}\n\nexport function getKey(url: URI, logger: Logger): string {\n const result = url.getParam(PARAM.KEY);\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(sthis: SuperThis, url: URI): string {\n let result = url.getParam(PARAM.NAME);\n if (!result) {\n result = sthis.pathOps.dirname(url.pathname);\n if (result.length === 0) {\n throw sthis.logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\n// export 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\n// // the big side effect party --- hate it\n// export function sanitizeURL(url: URL) {\n// url.searchParams.sort();\n// // const searchParams = Object.entries(url.searchParams).sort(([a], [b]) => a.localeCompare(b));\n// // console.log(\"searchParams\", searchParams);\n// // for (const [key] of searchParams) {\n// // url.searchParams.delete(key);\n// // }\n// // for (const [key, value] of searchParams) {\n// // url.searchParams.set(key, value);\n// // }\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 function UInt8ArrayEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nexport function inplaceFilter<T>(i: T[], pred: (i: T, idx: number) => boolean): T[] {\n const founds: number[] = [];\n for (let j = 0; j < i.length; j++) {\n if (!pred(i[j], j)) {\n founds.push(j);\n }\n }\n for (let j = founds.length - 1; j >= 0; j--) {\n i.splice(founds[j], 1);\n }\n return i;\n}\n\nexport function 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 coerceIntoUint8(raw: ToUInt8): Result<Uint8Array> {\n if (raw instanceof Uint8Array) {\n return Result.Ok(raw);\n }\n if (Result.Is(raw)) {\n return raw;\n }\n return Result.Err(\"Not a Uint8Array\");\n}\n\nexport async function coercePromiseIntoUint8(raw: PromiseToUInt8): Promise<Result<Uint8Array>> {\n if (raw instanceof Uint8Array) {\n return Result.Ok(raw);\n }\n if (Result.Is(raw)) {\n return raw;\n }\n if (typeof raw.then === \"function\") {\n try {\n return coercePromiseIntoUint8(await raw);\n } catch (e) {\n return Result.Err(e as Error);\n }\n }\n return Result.Err(\"Not a Uint8Array\");\n}\n\nexport function makeName(fnString: string) {\n const regex = /\\(([^,()]+,\\s*[^,()]+|\\[[^\\]]+\\],\\s*[^,()]+)\\)/g;\n let found: RegExpExecArray | null = null;\n const matches = Array.from(fnString.matchAll(regex), (match) => match[1].trim());\n if (matches.length === 0) {\n found = /=>\\s*{?\\s*([^{}]+)\\s*}?/.exec(fnString);\n if (found && found[1].includes(\"return\")) {\n found = null;\n }\n }\n if (!found) {\n return fnString;\n } else {\n // it's a consise arrow function, match everything after the arrow\n return found[1];\n }\n}\n\nexport function storeType2DataMetaWal(store: StoreType) {\n switch (store) {\n case \"car\":\n case \"file\":\n return \"data\";\n case \"meta\":\n case \"wal\":\n return store;\n default:\n throw new Error(`unknown store ${store}`);\n }\n}\n\nexport function ensureURIDefaults(\n sthis: SuperThis,\n name: string,\n curi: CoerceURI | undefined,\n uri: URI,\n store: StoreType,\n ctx?: Partial<{\n readonly idx: boolean;\n readonly file: boolean;\n }>,\n): URI {\n ctx = ctx || {};\n const ret = (curi ? URI.from(curi) : uri).build().setParam(PARAM.STORE, store).defParam(PARAM.NAME, name);\n if (!ret.hasParam(PARAM.NAME)) {\n // const name = sthis.pathOps.basename(ret.URI().pathname);\n // if (!name) {\n throw sthis.logger.Error().Url(ret).Any(\"ctx\", ctx).Msg(\"Ledger name is required\").AsError();\n // }\n // ret.setParam(PARAM.NAME, name);\n }\n if (ctx.idx) {\n ret.defParam(PARAM.INDEX, \"idx\");\n ret.defParam(PARAM.STORE_KEY, `@${ret.getParam(PARAM.NAME)}-${storeType2DataMetaWal(store)}-idx@`);\n } else {\n ret.defParam(PARAM.STORE_KEY, `@${ret.getParam(PARAM.NAME)}-${storeType2DataMetaWal(store)}@`);\n }\n if (store === \"car\") {\n ret.defParam(PARAM.SUFFIX, \".car\");\n }\n return ret.URI();\n}\n\nexport function setPresetEnv(o: Record<string, string>, symbol = \"FP_PRESET_ENV\") {\n const key = Symbol.for(symbol);\n const env = (globalThis as unknown as Record<symbol, Record<string, string>>)[key] ?? {};\n for (const [k, v] of Object.entries(o)) {\n env[k] = v;\n }\n return env;\n}\n","import type { EventLink } from \"@web3-storage/pail/clock/api\";\nimport type { Operation } from \"@web3-storage/pail/crdt/api\";\nimport type { Block, UnknownLink, Version } from \"multiformats\";\nimport type { EnvFactoryOpts, Env, Logger, CryptoRuntime, Result, CoerceURI } from \"@adviser/cement\";\n\nimport type {\n CarTransactionOpts,\n DbMeta,\n AnyLink,\n StoreUrlsOpts,\n StoreEnDeFile,\n SerdeGatewayInterceptor,\n Loadable,\n AnyBlock,\n TransactionMeta,\n TransactionWrapper,\n BlockstoreRuntime,\n StoreURIRuntime,\n DataAndMetaAndWalStore,\n UrlAndInterceptor,\n MetaStore,\n WALStore,\n BaseStore,\n FileStore,\n CarStore,\n} from \"./blockstore/index.js\";\n\n// import type { MakeDirectoryOptions, PathLike, Stats } from \"fs\";\nimport type { KeyBagOpts, KeyBagRuntime } from \"./runtime/key-bag.js\";\nimport type { WriteQueueParams } from \"./write-queue.js\";\nimport type { Index } from \"./indexer.js\";\nimport type { Context } from \"./context.js\";\n\nexport type { DbMeta };\n\nexport type Falsy = false | null | undefined;\n\nexport type Unreg = () => void;\n\nexport function isFalsy(value: unknown): value is Falsy {\n return value === false && value === null && value === undefined;\n}\n\nexport const PARAM = {\n SUFFIX: \"suffix\",\n URL_GEN: \"urlGen\", // \"urlGen\" | \"default\"\n STORE_KEY: \"storekey\",\n STORE: \"store\",\n KEY: \"key\",\n INDEX: \"index\",\n NAME: \"name\",\n VERSION: \"version\",\n RUNTIME: \"runtime\", // \"node\" | \"deno\" | \"browser\"\n FRAG_SIZE: \"fragSize\",\n IV_VERIFY: \"ivVerify\",\n IV_HASH: \"ivHash\",\n FRAG_FID: \"fid\",\n FRAG_OFS: \"ofs\",\n FRAG_LEN: \"len\",\n FRAG_HEAD: \"headerSize\",\n EXTRACTKEY: \"extractKey\",\n SELF_REFLECT: \"selfReflect\", // if no subscribe in Gateway see your own META updates\n CAR_PARALLEL: \"parallel\",\n CAR_CACHE_SIZE: \"carCacheSize\",\n CAR_COMPACT_CACHE_SIZE: \"carCompactCacheSize\",\n CAR_META_CACHE_SIZE: \"carMetaCacheSize\",\n GENESIS_CID: \"baembeiarootfireproofgenesisblockaaaafireproofgenesisblocka\",\n // FS = \"fs\",\n};\nexport type PARAMS = (typeof PARAM)[keyof typeof PARAM];\n\nexport function throwFalsy<T>(value: T | Falsy): T {\n if (isFalsy(value)) {\n throw new Error(\"value is Falsy\");\n }\n return value;\n}\n\nexport function falsyToUndef<T>(value: T | Falsy): T | undefined {\n if (isFalsy(value)) {\n return undefined;\n }\n return value;\n}\n\nexport type StoreType = \"car\" | \"file\" | \"wal\" | \"meta\";\nexport interface FPStats {\n isFile(): boolean;\n isDirectory(): boolean;\n isBlockDevice(): boolean;\n isCharacterDevice(): boolean;\n isSymbolicLink(): boolean;\n isFIFO(): boolean;\n isSocket(): boolean;\n uid: number | Falsy;\n gid: number | Falsy;\n size: number | Falsy;\n atime: Date | Falsy;\n mtime: Date | Falsy;\n ctime: Date | Falsy;\n birthtime: Date | Falsy;\n}\n\nexport interface SysFileSystem {\n start(): Promise<SysFileSystem>;\n mkdir(path: string, options?: { recursive: boolean }): Promise<string | undefined>;\n readdir(path: string /*, options?: unknown*/): Promise<string[]>;\n rm(path: string, options?: { recursive: boolean }): Promise<void>;\n copyFile(source: string, destination: string): Promise<void>;\n readfile(path: string /*, options?: { encoding: BufferEncoding; flag?: string }*/): Promise<Uint8Array>;\n stat(path: string): Promise<FPStats>;\n unlink(path: string): Promise<void>;\n writefile(path: string, data: Uint8Array | string): Promise<void>;\n}\n\nexport interface PathOps {\n join(...args: string[]): string;\n dirname(path: string): string;\n basename(path: string): string;\n}\n\nexport type ToUInt8 = Uint8Array | Result<Uint8Array>;\nexport type PromiseToUInt8 = ToUInt8 | Promise<Uint8Array> | Promise<Result<Uint8Array>>;\n\nexport interface TextEndeCoder {\n encode(input: string): Uint8Array;\n decode(input: ToUInt8): string;\n}\nexport interface SuperThisOpts {\n // readonly crypto?: CryptoRuntime;\n readonly logger: Logger;\n readonly pathOps: PathOps;\n readonly crypto: CryptoRuntime;\n readonly env: Partial<EnvFactoryOpts>;\n readonly txt: TextEndeCoder;\n readonly ctx: Record<string, unknown>;\n}\n\nexport interface SuperThis {\n readonly logger: Logger;\n readonly loggerCollector?: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n timeOrderedNextId(time?: number): { str: string; toString: () => string };\n nextId(bytes?: number): { str: string; bin: Uint8Array; toString: () => string };\n start(): Promise<void>;\n clone(override: Partial<SuperThisOpts>): SuperThis;\n}\n\nexport interface ConfigOpts extends Partial<SuperThisOpts> {\n readonly public?: boolean;\n readonly meta?: DbMeta;\n // readonly persistIndexes?: boolean;\n readonly writeQueue?: Partial<WriteQueueParams>;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n readonly autoCompact?: number;\n readonly storeUrls?: StoreUrlsOpts;\n readonly storeEnDe?: StoreEnDeFile;\n readonly threshold?: number;\n readonly keyBag?: Partial<KeyBagOpts>;\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 readonly lastModified?: number;\n url?: string;\n file?: () => Promise<File>;\n}\n\nexport interface DocUpdate<T extends DocTypes> {\n readonly id: string;\n readonly value?: DocSet<T>;\n readonly del?: boolean;\n readonly clock?: ClockLink; // would be useful to give ClockLinks a type\n}\n\n// todo merge into above\nexport interface DocValue<T extends DocTypes> {\n readonly doc: DocWithId<T>;\n readonly del: boolean;\n readonly cid: AnyLink;\n}\n\nexport type KeyLiteral = string | number | boolean;\nexport type IndexKeyType = KeyLiteral | KeyLiteral[];\nexport type IndexKey<K extends IndexKeyType> = [K, string];\n\nexport interface IndexUpdate<K extends IndexKeyType> {\n readonly key: IndexKey<K>;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\nexport interface IndexUpdateString {\n readonly key: string;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\n// export interface IndexRowObject<K extends IndexKeyType, T extends DocObject> {\n// readonly id: string;\n// readonly key: K;\n// readonly value: T\n// // readonly row: T // DocFragment;\n// // readonly doc?: DocWithId<T>;\n// // value?: T;\n// // readonly del?: boolean;\n// }\n\n// export interface IndexRowLiteral<K extends IndexKeyType, T extends DocLiteral> {\n// readonly id: string;\n// readonly key: IndexKey<K>;\n// readonly value: T\n// }\n\n// export type IndexRow<K extends IndexKeyType, T extends DocTypes> =\n// T extends DocLiteral ? IndexRowLiteral<K, T> : IndexRowObject<K, T>\n\nexport interface IndexRow<K extends IndexKeyType, T extends DocObject, R extends DocFragment> {\n readonly id: string;\n readonly key: K; // IndexKey<K>;\n readonly value: R;\n readonly doc?: DocWithId<T>;\n}\n\nexport interface IndexRows<K extends IndexKeyType, T extends DocObject, R extends DocFragment = T> {\n readonly rows: IndexRow<K, T, R>[];\n}\nexport interface CRDTMeta {\n readonly head: ClockHead;\n}\n\nexport interface IndexTransactionMeta {\n readonly indexes: Record<string, IdxMeta>;\n}\n\nexport interface FileTransactionMeta {\n readonly files?: AnyLink[];\n}\n\nexport type MetaType = CRDTMeta | IndexTransactionMeta | FileTransactionMeta;\n\nexport interface IdxMeta {\n readonly byId: AnyLink;\n readonly byKey: AnyLink;\n readonly map: string;\n readonly name: string;\n readonly head: ClockHead;\n}\n\nexport interface IdxMetaMap {\n readonly indexes?: Map<string, IdxMeta>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface QueryOpts<K extends IndexKeyType> {\n readonly descending?: boolean;\n readonly limit?: number;\n includeDocs?: boolean;\n readonly range?: [IndexKeyType, IndexKeyType];\n readonly key?: DocFragment;\n readonly keys?: DocFragment[];\n prefix?: IndexKeyType;\n}\n\nexport interface AllDocsQueryOpts extends QueryOpts<string> {\n readonly key?: string;\n readonly keys?: string[];\n prefix?: string;\n}\n\nexport interface AllDocsResponse<T extends DocTypes> {\n readonly rows: {\n readonly key: string;\n readonly value: DocWithId<T>;\n }[];\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\ntype EmitFn = (k: IndexKeyType, v?: DocFragment) => void;\nexport type MapFn<T extends DocTypes> = (doc: DocWithId<T>, emit: EmitFn) => DocFragment | unknown;\n\nexport interface ChangesOptions {\n readonly dirty?: boolean;\n readonly limit?: number;\n}\n\nexport interface ChangesResponseRow<T extends DocTypes> {\n readonly key: string;\n readonly value: DocWithId<T>;\n readonly clock?: ClockLink;\n}\n\nexport interface ChangesResponse<T extends DocTypes> {\n readonly clock: ClockHead;\n readonly rows: ChangesResponseRow<T>[];\n readonly name?: string;\n}\n\nexport interface DocResponse {\n readonly id: string;\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\nexport interface BulkResponse {\n readonly ids: string[];\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\nexport type UpdateListenerFn<T extends DocTypes> = (docs: DocWithId<T>[]) => Promise<void> | void;\nexport type NoUpdateListenerFn = () => Promise<void> | void;\nexport type ListenerFn<T extends DocTypes> = UpdateListenerFn<T> | NoUpdateListenerFn;\n\nexport interface CRDTEntry {\n readonly data: string;\n readonly parents: string[];\n readonly cid: string;\n}\n\nexport type VoidFn = () => void;\nexport type UnReg = () => void;\nexport interface CRDTClock {\n readonly head: ClockHead;\n onTock(fn: VoidFn): UnReg;\n onTick(fn: (updates: DocUpdate<DocTypes>[]) => void): UnReg;\n applyHead(newHead: ClockHead, prevHead: ClockHead, updates?: DocUpdate<DocTypes>[]): Promise<void>;\n onZoom(fn: VoidFn): UnReg;\n close(): Promise<void>;\n ready(): Promise<void>;\n}\n\nexport interface CarTransaction {\n readonly parent: BaseBlockstore;\n get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined>;\n\n superGet(cid: AnyLink): Promise<AnyBlock | undefined>;\n\n // needed for genesis block\n unshift(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): void;\n putSync(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): void;\n\n put(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): Promise<void>;\n\n entries(): AsyncIterableIterator<AnyBlock>;\n}\n\nexport interface BaseBlockstore {\n readonly transactions: Set<CarTransaction>;\n readonly sthis: SuperThis;\n readonly loader: Loadable;\n readonly ebOpts: BlockstoreRuntime;\n ready(): Promise<void>;\n close(): Promise<void>;\n destroy(): Promise<void>;\n compact(): Promise<void>;\n readonly logger: Logger;\n\n get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined>;\n put(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): Promise<void>;\n\n transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n _opts?: CarTransactionOpts,\n ): Promise<TransactionWrapper<M>>;\n\n // get<T, C extends number, A extends number, V extends Version>(cid: AnyAnyLink): Promise<Block<T, C, A, V> | undefined>\n // transaction<M extends TransactionMeta>(\n // fn: (t: CarTransaction) => Promise<M>,\n // _opts?: CarTransactionOpts,\n // ): Promise<TransactionWrapper<M>>\n\n openTransaction(opts: CarTransactionOpts /* = { add: true, noLoader: false }*/): CarTransaction;\n\n commitTransaction<M extends TransactionMeta>(\n t: CarTransaction,\n done: M,\n opts: CarTransactionOpts,\n ): Promise<TransactionWrapper<M>>;\n entries(): AsyncIterableIterator<AnyBlock>;\n}\n\nexport interface CRDT extends ReadyCloseDestroy, HasLogger, HasSuperThis, HasCRDT {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n // self reference to fullfill HasCRDT\n readonly crdt: CRDT;\n readonly clock: CRDTClock;\n\n readonly blockstore: BaseBlockstore;\n readonly indexBlockstore: BaseBlockstore;\n readonly indexers: Map<string, Index<IndexKeyType, DocTypes>>;\n\n bulk<T extends DocTypes>(updates: DocUpdate<T>[]): Promise<CRDTMeta>;\n ready(): Promise<void>;\n close(): Promise<void>;\n destroy(): Promise<void>;\n allDocs<T extends DocTypes>(): Promise<{ result: DocUpdate<T>[]; head: ClockHead }>;\n vis(): Promise<string>;\n getBlock(cidString: string): Promise<Block>;\n get(key: string): Promise<DocValue<DocTypes> | Falsy>;\n // defaults by impl\n changes<T extends DocTypes>(\n since?: ClockHead,\n opts?: ChangesOptions,\n ): Promise<{\n result: DocUpdate<T>[];\n head: ClockHead;\n }>;\n compact(): Promise<void>;\n}\n\nexport interface HasCRDT {\n readonly crdt: CRDT;\n}\n\nexport interface RefLedger {\n readonly ledger: Ledger;\n}\n\nexport interface HasLogger {\n readonly logger: Logger;\n}\n\nexport interface HasSuperThis {\n readonly sthis: SuperThis;\n}\n\nexport interface ReadyCloseDestroy {\n close(): Promise<void>;\n destroy(): Promise<void>;\n ready(): Promise<void>;\n}\n\nexport interface CoerceURIandInterceptor {\n readonly url: CoerceURI;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n}\n\n/**\n * @description used by an attachable do define the urls of the attached gateways\n */\nexport interface GatewayUrlsParam {\n readonly car: CoerceURIandInterceptor;\n readonly file: CoerceURIandInterceptor;\n readonly meta: CoerceURIandInterceptor;\n // if set this is a local Attachment\n readonly wal?: CoerceURIandInterceptor;\n}\n\nexport interface GatewayUrls {\n readonly car: UrlAndInterceptor;\n readonly file: UrlAndInterceptor;\n readonly meta: UrlAndInterceptor;\n readonly wal?: UrlAndInterceptor;\n}\n\nexport interface Attachable {\n readonly name: string;\n /**\n * @description prepare allows the Attable to register the gateways and\n * then return the urls of the gateways\n */\n prepare(): Promise<GatewayUrlsParam>;\n}\n\nexport class DataAndMetaAndWalAndBaseStore implements DataAndMetaAndWalStore {\n readonly wal?: WALStore | undefined;\n readonly file: FileStore;\n readonly car: CarStore;\n readonly meta: MetaStore;\n readonly baseStores: BaseStore[];\n\n constructor(dam: DataAndMetaAndWalStore) {\n this.wal = dam.wal;\n this.file = dam.file;\n this.car = dam.car;\n this.meta = dam.meta;\n this.baseStores = [this.file, this.car, this.meta];\n if (this.wal) {\n this.baseStores.push(this.wal);\n }\n }\n}\n\nexport interface Attached {\n readonly gatewayUrls: GatewayUrls;\n\n readonly stores: DataAndMetaAndWalAndBaseStore;\n\n detach(): Promise<void>;\n status(): \"attached\" | \"loading\" | \"loaded\" | \"error\" | \"detached\" | \"syncing\" | \"idle\";\n}\n\nexport interface Database extends ReadyCloseDestroy, HasLogger, HasSuperThis {\n // readonly name: string;\n readonly ledger: Ledger;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly id: string;\n readonly name: string;\n\n onClosed(fn: () => void): void;\n\n attach(a: Attachable): Promise<Attached>;\n\n get<T extends DocTypes>(id: string): Promise<DocWithId<T>>;\n put<T extends DocTypes>(doc: DocSet<T>): Promise<DocResponse>;\n bulk<T extends DocTypes>(docs: DocSet<T>[]): Promise<BulkResponse>;\n del(id: string): Promise<DocResponse>;\n remove(id: string): Promise<DocResponse>;\n changes<T extends DocTypes>(since?: ClockHead, opts?: ChangesOptions): Promise<ChangesResponse<T>>;\n allDocs<T extends DocTypes>(opts?: AllDocsQueryOpts): Promise<AllDocsResponse<T>>;\n allDocuments<T extends DocTypes>(): Promise<{\n rows: {\n key: string;\n value: DocWithId<T>;\n }[];\n clock: ClockHead;\n }>;\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void;\n\n 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 compact(): Promise<void>;\n}\n\nexport interface WriteQueue<T extends DocUpdate<S>, S extends DocTypes = DocTypes> {\n push(task: T): Promise<MetaType>;\n bulk(tasks: T[]): Promise<MetaType>;\n close(): Promise<void>;\n}\n\nexport interface LedgerOpts {\n readonly name: string;\n // readonly public?: boolean;\n readonly meta?: DbMeta;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n\n readonly writeQueue: WriteQueueParams;\n // readonly factoryUnreg?: () => void;\n // readonly persistIndexes?: boolean;\n // readonly autoCompact?: number;\n readonly storeUrls: StoreURIRuntime;\n readonly storeEnDe: StoreEnDeFile;\n readonly keyBag: KeyBagRuntime;\n // readonly threshold?: number;\n}\n\nexport interface Ledger extends HasCRDT {\n readonly opts: LedgerOpts;\n // readonly name: string;\n readonly writeQueue: WriteQueue<DocUpdate<DocTypes>>;\n\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly id: string;\n\n readonly name: string;\n\n readonly context: Context;\n\n onClosed(fn: () => void): () => void;\n\n attach(a: Attachable): Promise<Attached>;\n\n close(): Promise<void>;\n destroy(): Promise<void>;\n ready(): Promise<void>;\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void;\n\n // asDB(): Database;\n\n // get<T extends DocTypes>(id: string): Promise<DocWithId<T>>;\n // put<T extends DocTypes>(doc: DocSet<T>): Promise<DocResponse>;\n // bulk<T extends DocTypes>(docs: DocSet<T>[]): Promise<BulkResponse>;\n // del(id: string): Promise<DocResponse>;\n // changes<T extends DocTypes>(since?: ClockHead, opts?: ChangesOptions): Promise<ChangesResponse<T>>;\n // allDocs<T extends DocTypes>(opts?: AllDocsQueryOpts): Promise<AllDocsResponse<T>>;\n // allDocuments<T extends DocTypes>(): Promise<{\n // rows: {\n // key: string;\n // value: DocWithId<T>;\n // }[];\n // clock: ClockHead;\n // }>;\n // subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void;\n\n // 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 // compact(): Promise<void>;\n}\n","import { ensureLogger } from \"./utils.js\";\nimport { DocTypes, MetaType, DocUpdate, SuperThis, WriteQueue } from \"./types.js\";\nimport { Future, Logger } from \"@adviser/cement\";\n\ntype WorkerFunction<T extends DocTypes> = (tasks: DocUpdate<T>[]) => Promise<MetaType>;\n\ninterface WriteQueueItem<T extends DocTypes> {\n // readonly task?: DocUpdate<T>;\n readonly tasks?: DocUpdate<T>[];\n resolve(result: MetaType): void;\n reject(error: Error): void;\n}\n\nexport interface WriteQueueParams {\n // default 32\n // if chunkSize is 1 the result will be ordered in time\n readonly chunkSize: number;\n}\n\nexport function defaultWriteQueueOpts(opts: Partial<WriteQueueParams> = {}): WriteQueueParams {\n return {\n ...opts,\n chunkSize: opts.chunkSize && opts.chunkSize > 0 ? opts.chunkSize : 32,\n };\n}\n\nclass WriteQueueImpl<T extends DocUpdate<S>, S extends DocTypes = DocTypes> implements WriteQueue<T> {\n private readonly opts: WriteQueueParams;\n\n private readonly queue: WriteQueueItem<S>[] = [];\n private readonly worker: WorkerFunction<S>;\n private isProcessing = false;\n private readonly logger: Logger;\n\n constructor(sthis: SuperThis, worker: WorkerFunction<S>, opts: WriteQueueParams) {\n this.logger = ensureLogger(sthis, \"WriteQueueImpl\");\n this.worker = worker;\n this.opts = defaultWriteQueueOpts(opts);\n }\n\n private waitForEmptyQueue?: Future<void>;\n private testEmptyQueue() {\n if (this.waitForEmptyQueue && this.queue.length === 0) {\n this.waitForEmptyQueue.resolve();\n }\n }\n\n private async process() {\n if (this.isProcessing || this.queue.length === 0) {\n this.testEmptyQueue();\n return;\n }\n this.isProcessing = true;\n try {\n this.logger.Debug().Any(\"opts\", this.opts).Len(this.queue).Msg(\"Processing tasks\");\n const tasksToProcess = this.queue.splice(0, this.opts.chunkSize);\n const updates = tasksToProcess.map((item) => item.tasks).filter((item) => item) as DocUpdate<S>[][];\n const promises = updates.map(async (update, index) => {\n try {\n const result = await this.worker(update);\n tasksToProcess[index].resolve(result);\n } catch (error) {\n tasksToProcess[index].reject(this.logger.Error().Err(error).Msg(\"Error processing task\").AsError());\n }\n });\n await Promise.allSettled(promises);\n this.logger.Debug().Any(\"opts\", this.opts).Len(this.queue).Msg(\"Processed tasks\");\n } catch (error) {\n this.logger.Error().Err(error).Msg(\"Error processing tasks\");\n } finally {\n this.isProcessing = false;\n setTimeout(() => this.process(), 0);\n }\n }\n\n bulk(tasks: DocUpdate<S>[]): Promise<MetaType> {\n return new Promise<MetaType>((resolve, reject) => {\n this.queue.push({ tasks, resolve, reject });\n this.process();\n });\n }\n push(task: DocUpdate<S>): Promise<MetaType> {\n return this.bulk([task]);\n }\n close(): Promise<void> {\n this.waitForEmptyQueue = new Future();\n this.testEmptyQueue();\n return this.waitForEmptyQueue.asPromise();\n }\n}\n\nexport function writeQueue<T extends DocUpdate<S>, S extends DocTypes = DocTypes>(\n sthis: SuperThis,\n worker: WorkerFunction<S>,\n opts: WriteQueueParams,\n): WriteQueue<T, S> {\n return new WriteQueueImpl<T, S>(sthis, worker, opts);\n}\n","import * as raw from \"multiformats/codecs/raw\";\nimport { DocFileMeta } from \"../types.js\";\nimport { AnyLink, AnyBlock } from \"../blockstore/index.js\";\nimport { CID } from \"multiformats/cid\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport { exception2Result, Result, top_uint8 } from \"@adviser/cement\";\n\n/**\n * Encode a file into a single block with a CID\n */\nexport async function encodeFile(blob: Blob): Promise<{ cid: AnyLink; blocks: AnyBlock[] }> {\n // Convert blob to Uint8Array\n const data = await top_uint8(blob);\n\n // Encode with raw codec\n const bytes = raw.encode(data);\n\n // Create CID\n const hash = await hasher.digest(bytes);\n const cid = CID.create(1, raw.code, hash);\n\n // Return single block with CID\n const block = { cid, bytes };\n\n return { cid, blocks: [block] };\n}\n\nexport interface BlockGetter {\n get(cid: AnyLink): Promise<Uint8Array>;\n}\n\nfunction isHasBlockAGet(obj: unknown): obj is BlockGetter {\n return typeof (obj as BlockGetter).get === \"function\";\n}\n\n/**\n * Decode a file from its blocks and CID\n * Returns a Result containing either the File or an Error\n */\nexport async function decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<Result<File>> {\n // The blocks parameter is expected to be a storage interface with a get method\n if (!isHasBlockAGet(blocks)) {\n return Result.Err(new Error(\"Invalid block storage\"));\n }\n return exception2Result(async () => {\n // Get block data\n const bytes = await blocks.get(cid);\n\n // Decode data\n const data = raw.decode(bytes);\n\n // Create File object with the original file metadata\n return new File([data], \"file\", {\n type: meta.type,\n lastModified: meta.lastModified || 0,\n });\n });\n}\n","import {\n CoerceURI,\n CryptoRuntime,\n CTCryptoKey,\n KeyedResolvOnce,\n Logger,\n ResolveOnce,\n ResolveSeq,\n Result,\n runtimeFn,\n toCryptoRuntime,\n URI,\n} from \"@adviser/cement\";\nimport { KeyMaterial, KeysByFingerprint, KeyUpsertResult, KeyWithFingerPrint } from \"../blockstore/types.js\";\nimport { ensureLogger } from \"../utils.js\";\nimport { base58btc } from \"multiformats/bases/base58\";\nimport { PARAM, SuperThis } from \"../types.js\";\nimport { KeyBagProviderFile } from \"./gateways/file/key-bag-file.js\";\nimport { KeyBagProviderMemory } from \"./key-bag-memory.js\";\n\nclass keyWithFingerPrint implements KeyWithFingerPrint {\n readonly default: boolean;\n readonly fingerPrint: string;\n readonly key: CTCryptoKey;\n\n private kfp: KeyWithFingerPrint;\n\n #material: string;\n\n constructor(kfp: KeyWithFingerPrint, material: string | Uint8Array, def: boolean) {\n this.kfp = kfp;\n this.key = kfp.key;\n this.fingerPrint = kfp.fingerPrint;\n this.default = def;\n if (material instanceof Uint8Array) {\n this.#material = base58btc.encode(material);\n } else if (typeof material === \"string\") {\n this.#material = material;\n } else {\n throw new Error(\"material must be string or Uint8Array\");\n }\n }\n\n extract(): Promise<KeyMaterial> {\n return this.kfp.extract();\n }\n\n async asV2StorageKeyItem(): Promise<V2StorageKeyItem> {\n return {\n default: this.default,\n fingerPrint: this.fingerPrint,\n key: this.#material,\n };\n }\n}\n\nexport async function toKeyWithFingerPrint(\n keybag: KeyBag,\n materialStrOrUint8: string | Uint8Array,\n): Promise<Result<KeyWithFingerPrint>> {\n let material: Uint8Array;\n if (typeof materialStrOrUint8 === \"string\") {\n material = base58btc.decode(materialStrOrUint8);\n } else {\n material = materialStrOrUint8;\n }\n const key = await keybag.subtleKey(material);\n const fpr = await keybag.rt.crypto.digestSHA256(material);\n return Result.Ok({\n key,\n fingerPrint: base58btc.encode(new Uint8Array(fpr)),\n extract: async () => {\n if (key.extractable) {\n return {\n key: material,\n keyStr: base58btc.encode(material),\n };\n }\n throw new Error(\"Key is not extractable\");\n },\n });\n}\n\nexport class keysByFingerprint implements KeysByFingerprint {\n readonly keys: Record<string, keyWithFingerPrint> = {};\n readonly keybag: KeyBag;\n readonly name: string;\n readonly id: string;\n\n static async from(keyBag: KeyBag, named: KeysItem): Promise<KeysByFingerprint> {\n const kbf = new keysByFingerprint(keyBag, named.name);\n // reverse to keep the first key as default\n for (const i of Object.entries(named.keys).reverse()) {\n const result = await kbf.upsert(i[1].key, i[1].default, false);\n if (result.isErr()) {\n throw result;\n }\n if (result.Ok().modified) {\n throw keyBag.logger.Error().Msg(\"KeyBag: keysByFingerprint: mismatch unexpected\").AsError();\n }\n if (result.Ok().kfp.fingerPrint !== i[1].fingerPrint) {\n throw keyBag.logger\n .Error()\n .Any(\"fprs\", {\n fromStorage: i[1].fingerPrint,\n calculated: result.Ok().kfp.fingerPrint,\n })\n .Msg(\"KeyBag: keysByFingerprint: mismatch\")\n .AsError();\n }\n }\n return kbf;\n }\n\n constructor(keyBag: KeyBag, name: string) {\n this.keybag = keyBag;\n this.name = name;\n this.id = keyBag.rt.sthis.nextId(4).str;\n }\n\n async get(fingerPrint?: Uint8Array | string): Promise<KeyWithFingerPrint | undefined> {\n if (fingerPrint instanceof Uint8Array) {\n fingerPrint = base58btc.encode(fingerPrint);\n } else {\n fingerPrint = fingerPrint || \"*\";\n }\n const found = this.keys[fingerPrint];\n if (found) {\n return found;\n }\n throw this.keybag.logger\n .Error()\n .Str(\"fpr\", fingerPrint)\n .Any(\"fprs\", Object.keys(this.keys))\n .Msg(\"keysByFingerprint: not found\")\n .AsError();\n }\n\n async upsert(materialStrOrUint8: string | Uint8Array, def?: boolean, keyBagAction = true): Promise<Result<KeyUpsertResult>> {\n def = !!def;\n const rKfp = await toKeyWithFingerPrint(this.keybag, materialStrOrUint8);\n if (rKfp.isErr()) {\n return Result.Err(rKfp);\n }\n const kfp = rKfp.Ok();\n let found = this.keys[kfp.fingerPrint];\n if (found) {\n if (found.default === def) {\n return Result.Ok({\n modified: false,\n kfp: found,\n });\n }\n } else {\n found = new keyWithFingerPrint(kfp, materialStrOrUint8, def);\n }\n if (def) {\n for (const i of Object.values(this.keys)) {\n (i as { default: boolean }).default = false;\n }\n }\n this.keys[kfp.fingerPrint] = found;\n if (def) {\n this.keys[\"*\"] = found;\n }\n if (keyBagAction) {\n this.keybag._upsertNamedKey(this);\n }\n return Result.Ok({\n modified: keyBagAction && true,\n kfp: found,\n });\n }\n\n async asKeysItem(): Promise<KeysItem> {\n const my = { ...this.keys };\n delete my[\"*\"];\n const kis = await Promise.all(Object.values(my).map((i) => i.asV2StorageKeyItem()));\n return {\n name: this.name,\n keys: kis.reduce(\n (acc, i) => {\n acc[i.fingerPrint] = i;\n return acc;\n },\n {} as Record<string, V2StorageKeyItem>,\n ),\n };\n }\n\n // async extract() {\n // const ext = new Uint8Array((await this.rt.crypto.exportKey(\"raw\", named.key)) as ArrayBuffer);\n // return {\n // key: ext,\n // keyStr: base58btc.encode(ext),\n // };\n // }\n}\n\nexport class KeyBag {\n readonly logger: Logger;\n readonly rt: KeyBagRuntime;\n\n constructor(rt: KeyBagRuntime) {\n this.rt = rt;\n this.logger = ensureLogger(rt.sthis, \"KeyBag\");\n }\n\n readonly _warnOnce: ResolveOnce<void> = new ResolveOnce<void>();\n async subtleKey(materialStrOrUint8: string | Uint8Array): Promise<CryptoKey> {\n const extractable = this.rt.url.getParam(PARAM.EXTRACTKEY) === \"_deprecated_internal_api\";\n if (extractable) {\n this._warnOnce.once(() =>\n this.logger.Warn().Msg(\"extractKey is enabled via _deprecated_internal_api --- handle keys safely!!!\"),\n );\n }\n let material: Uint8Array;\n if (typeof materialStrOrUint8 === \"string\") {\n material = base58btc.decode(materialStrOrUint8);\n } else {\n material = materialStrOrUint8;\n }\n return await this.rt.crypto.importKey(\n \"raw\", // raw or jwk\n material,\n // hexStringToUint8Array(key), // raw data\n \"AES-GCM\",\n extractable,\n [\"encrypt\", \"decrypt\"],\n );\n }\n\n async ensureKeyFromUrl(url: URI, keyFactory: () => string): Promise<Result<URI>> {\n // add storekey to url\n const storeKey = url.getParam(PARAM.STORE_KEY);\n if (storeKey === \"insecure\") {\n return Result.Ok(url);\n }\n if (!storeKey) {\n const keyName = `@${keyFactory()}@`;\n const ret = await this.getNamedKey(keyName);\n if (ret.isErr()) {\n return Result.Err(ret);\n }\n const urb = url.build().setParam(PARAM.STORE_KEY, keyName);\n return Result.Ok(urb.URI());\n }\n if (storeKey.startsWith(\"@\") && storeKey.endsWith(\"@\")) {\n const ret = await this.getNamedKey(storeKey);\n if (ret.isErr()) {\n return Result.Err(ret);\n }\n }\n return Result.Ok(url);\n }\n\n private async toKeysItem(ki: V1StorageKeyItem | KeysItem | undefined): Promise<KeysItem | undefined> {\n if (!ki) return undefined;\n if (\"key\" in ki) {\n const fpr = (await toKeyWithFingerPrint(this, ki.key)).Ok().fingerPrint;\n return {\n name: ki.name,\n keys: {\n [fpr]: {\n key: ki.key,\n fingerPrint: fpr,\n default: true,\n },\n },\n };\n }\n // fix default\n let defKI: V2StorageKeyItem | undefined;\n let foundDefKI = false;\n for (const i of Object.entries(ki.keys)) {\n if (i[0] !== i[1].fingerPrint) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete ki.keys[i[0]];\n ki.keys[i[1].fingerPrint] = i[1];\n this.logger.Warn().Str(\"name\", ki.name).Msg(\"fingerPrint mismatch fixed\");\n }\n if (defKI === undefined) {\n defKI = i[1];\n }\n if (!foundDefKI && i[1].default) {\n defKI = i[1];\n foundDefKI = true;\n } else {\n (i[1] as { default: boolean }).default = false;\n }\n }\n if (defKI) {\n ki.keys[\"*\"] = defKI;\n }\n return {\n name: ki.name,\n keys: ki.keys,\n };\n }\n\n flush() {\n return this._seq.flush();\n }\n\n readonly _seq: ResolveSeq<Result<KeysByFingerprint>> = new ResolveSeq<Result<KeysByFingerprint>>();\n // async setNamedKey(name: string, key: string, def?: boolean): Promise<Result<KeysByFingerprint>> {\n // return this._seq.add(() => this._upsertNamedKey(name, key, !!def));\n // }\n\n // avoid deadlock\n async _upsertNamedKey(ksi: KeysByFingerprint): Promise<Result<KeysByFingerprint>> {\n const bag = await this.rt.getBagProvider();\n return this._seq.add(async () => {\n const rKbf = await this._getNamedKey(ksi.name, true);\n if (rKbf.isErr()) {\n this.logger.Error().Err(rKbf).Str(\"name\", ksi.name).Msg(\"_upsertNamedKey: getNamedKey failed\");\n // we updated the cache\n this._namedKeyCache.unget(ksi.name);\n }\n await bag.set(await ksi.asKeysItem());\n return Result.Ok(ksi);\n });\n }\n\n // async getNamedExtractableKey(name: string, failIfNotFound = false): Promise<Result<KeysByFingerprint>> {\n // const ret = await this.getNamedKey(name, failIfNotFound);\n // if (ret.isErr()) {\n // return Result.Err(ret)\n // }\n // const named = ret.Ok();\n // return Result.Ok({\n // ...named,\n // extract: async () => {\n // const ext = new Uint8Array((await this.rt.crypto.exportKey(\"raw\", named.key)) as ArrayBuffer);\n // return {\n // key: ext,\n // keyStr: base58btc.encode(ext),\n // };\n // },\n // });\n // }\n\n private _namedKeyCache = new KeyedResolvOnce<Result<KeysByFingerprint>>();\n\n private async _getNamedKey(\n name: string,\n failIfNotFound: boolean,\n material?: string | Uint8Array,\n ): Promise<Result<KeysByFingerprint>> {\n return await this._namedKeyCache.get(name).once(async () => {\n const id = this.rt.sthis.nextId(4).str;\n const bag = await this.rt.getBagProvider();\n const named = await this.toKeysItem(await bag.get(name));\n if (named) {\n this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Any(\"fprs\", Object.keys(named.keys)).Msg(\"fingerPrint getNamedKey\");\n return Result.Ok(await keysByFingerprint.from(this, named));\n }\n if (!named && failIfNotFound) {\n // do not cache\n this._namedKeyCache.unget(name);\n return this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Msg(\"failIfNotFound getNamedKey\").ResultError();\n }\n\n const kp = new keysByFingerprint(this, name);\n let keyMaterial: Uint8Array;\n if (!material) {\n keyMaterial = this.rt.crypto.randomBytes(this.rt.keyLength);\n } else {\n if (typeof material === \"string\") {\n keyMaterial = base58btc.decode(material);\n } else if (material instanceof Uint8Array) {\n keyMaterial = material;\n } else {\n return this.logger.Error().Msg(\"material must be string or Uint8Array\").ResultError();\n }\n }\n const res = await kp.upsert(keyMaterial, true);\n if (res.isErr()) {\n return Result.Err(res);\n }\n // this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Msg(\"createKey getNamedKey-pre\");\n // const ret = await this._upsertNamedKey(name, base58btc.encode(this.rt.crypto.randomBytes(this.rt.keyLength)), true);\n this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Str(\"fpr\", res.Ok().kfp.fingerPrint).Msg(\"createKey getNamedKey-post\");\n return Result.Ok(kp);\n });\n }\n\n async getNamedKey(name: string, failIfNotFound = false, material?: string | Uint8Array): Promise<Result<KeysByFingerprint>> {\n return this._seq.add(async () => {\n return await this._getNamedKey(name, failIfNotFound, material);\n });\n }\n}\n\nexport interface V1StorageKeyItem {\n readonly name: string;\n readonly key: string;\n}\n\nexport interface V2StorageKeyItem {\n readonly key: string; // material\n readonly fingerPrint: string;\n readonly default: boolean;\n}\nexport interface KeysItem {\n readonly name: string;\n readonly keys: Record<string, V2StorageKeyItem>;\n}\n\nexport type KeyBagFile = Record<string, KeysItem>;\n\nexport interface KeyBagOpts {\n // in future you can encrypt the keybag with ?masterkey=xxxxx\n readonly url: CoerceURI;\n // readonly key: string; // key to encrypt the keybag\n readonly crypto: CryptoRuntime;\n readonly keyLength: number; // default: 16\n // readonly logger: Logger;\n readonly keyRuntime: KeyBagRuntime;\n}\n\nexport interface KeyBagProvider {\n get(id: string): Promise<V1StorageKeyItem | KeysItem | undefined>;\n set(item: KeysItem): Promise<void>;\n}\nexport interface KeyBagRuntime {\n readonly url: URI;\n readonly crypto: CryptoRuntime;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly keyLength: number;\n // readonly key?: FPCryptoKey;\n getBagProvider(): Promise<KeyBagProvider>;\n id(): string;\n}\n\nexport type KeyBackProviderFactory = (url: URI, sthis: SuperThis) => Promise<KeyBagProvider>;\n\nexport interface KeyBagProviderFactoryItem {\n readonly protocol: string;\n // if this is set the default protocol selection is overridden\n readonly override?: boolean;\n readonly factory: KeyBackProviderFactory;\n}\n\nconst keyBagProviderFactories = new Map<string, KeyBagProviderFactoryItem>(\n [\n {\n protocol: \"file:\",\n factory: async (url: URI, sthis: SuperThis) => {\n return new KeyBagProviderFile(url, sthis);\n },\n },\n {\n protocol: \"indexeddb:\",\n factory: async (url: URI, sthis: SuperThis) => {\n const { KeyBagProviderImpl } = await import(\"@fireproof/core/indexeddb\");\n return new KeyBagProviderImpl(url, sthis);\n },\n },\n {\n protocol: \"memory:\",\n factory: async (url: URI, sthis: SuperThis) => {\n return new KeyBagProviderMemory(url, sthis);\n },\n },\n ].map((i) => [i.protocol, i]),\n);\n\nexport function registerKeyBagProviderFactory(item: KeyBagProviderFactoryItem) {\n const protocol = item.protocol.endsWith(\":\") ? item.protocol : item.protocol + \":\";\n keyBagProviderFactories.set(protocol, {\n ...item,\n protocol,\n });\n}\n\nexport function defaultKeyBagUrl(sthis: SuperThis): URI {\n let bagFnameOrUrl = sthis.env.get(\"FP_KEYBAG_URL\");\n let url: URI;\n if (runtimeFn().isBrowser) {\n url = URI.from(bagFnameOrUrl || \"indexeddb://fp-keybag\");\n } else {\n if (!bagFnameOrUrl) {\n const home = sthis.env.get(\"HOME\");\n bagFnameOrUrl = `${home}/.fireproof/keybag`;\n url = URI.from(`file://${bagFnameOrUrl}`);\n } else {\n url = URI.from(bagFnameOrUrl);\n }\n }\n const logger = ensureLogger(sthis, \"defaultKeyBagUrl\");\n logger.Debug().Url(url).Msg(\"from env\");\n return url;\n}\n\nexport function defaultKeyBagOpts(sthis: SuperThis, kbo?: Partial<KeyBagOpts>): KeyBagRuntime {\n kbo = kbo || {};\n if (kbo.keyRuntime) {\n return kbo.keyRuntime;\n }\n const logger = ensureLogger(sthis, \"KeyBag\");\n let url: URI;\n if (kbo.url) {\n url = URI.from(kbo.url);\n logger.Debug().Url(url).Msg(\"from opts\");\n } else {\n let bagFnameOrUrl = sthis.env.get(\"FP_KEYBAG_URL\");\n if (runtimeFn().isBrowser) {\n url = URI.from(bagFnameOrUrl || \"indexeddb://fp-keybag\");\n } else {\n if (!bagFnameOrUrl) {\n const home = sthis.env.get(\"HOME\");\n bagFnameOrUrl = `${home}/.fireproof/keybag`;\n url = URI.from(`file://${bagFnameOrUrl}`);\n } else {\n url = URI.from(bagFnameOrUrl);\n }\n }\n logger.Debug().Url(url).Msg(\"from env\");\n }\n const kitem = keyBagProviderFactories.get(url.protocol);\n if (!kitem) {\n throw logger.Error().Url(url).Msg(\"unsupported protocol\").AsError();\n }\n\n if (url.hasParam(\"masterkey\")) {\n throw logger.Error().Url(url).Msg(\"masterkey is not supported\").AsError();\n }\n\n return {\n url,\n crypto: kbo.crypto || toCryptoRuntime({}),\n sthis,\n logger,\n keyLength: kbo.keyLength || 16,\n getBagProvider: () => kitem.factory(url, sthis),\n id: () => {\n return url.toString();\n },\n };\n}\n\nconst _keyBags = new KeyedResolvOnce<KeyBag>();\nexport async function getKeyBag(sthis: SuperThis, kbo: Partial<KeyBagOpts> = {}): Promise<KeyBag> {\n await sthis.start();\n const rt = defaultKeyBagOpts(sthis, kbo);\n return _keyBags.get(rt.id()).once(async () => new KeyBag(rt));\n}\n","import { runtimeFn, URI } from \"@adviser/cement\";\nimport type { SysFileSystem } from \"../../../types.js\";\n\nexport function sysFileSystemFactory(uri: URI): Promise<SysFileSystem> {\n const rt = runtimeFn();\n switch (true) {\n case rt.isNodeIsh:\n return import(\"@fireproof/core/node\").then((m) => m.getSysFileSystem(uri));\n case rt.isDeno:\n return import(\"@fireproof/core/deno\").then((m) => m.getSysFileSystem(uri));\n default:\n throw new Error(`unsupported runtime:${rt}`);\n }\n}\n","import { Logger, URI } from \"@adviser/cement\";\nimport { SuperThis, SysFileSystem } from \"../../../types.js\";\nimport { KeyBagProvider, KeysItem, V1StorageKeyItem } from \"../../key-bag.js\";\nimport { isNotFoundError } from \"../../../utils.js\";\nimport { sysFileSystemFactory } from \"./sys-file-system-factory.js\";\n\ninterface KeyBagCtx {\n readonly dirName: string;\n readonly sysFS: SysFileSystem;\n readonly fName: string;\n}\n\nexport class KeyBagProviderFile implements KeyBagProvider {\n async _prepare(id: string): Promise<KeyBagCtx> {\n await this.sthis.start();\n const sysFS = await sysFileSystemFactory(this.url);\n const dirName = this.url.pathname;\n await sysFS.mkdir(dirName, { recursive: true });\n return {\n dirName,\n sysFS,\n fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`),\n };\n }\n\n private readonly url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(url: URI, sthis: SuperThis) {\n this.url = url;\n this.sthis = sthis;\n this.logger = sthis.logger;\n }\n\n async get(id: string): Promise<V1StorageKeyItem | KeysItem | undefined> {\n const ctx = await this._prepare(id);\n try {\n const p = await ctx.sysFS.readfile(ctx.fName);\n const ki = JSON.parse(this.sthis.txt.decode(p));\n return ki;\n } catch (e) {\n if (isNotFoundError(e)) {\n return undefined;\n }\n throw this.logger.Error().Err(e).Any(\"file\", ctx).Msg(\"read bag failed\").AsError();\n }\n }\n\n async set(item: KeysItem): Promise<void> {\n const ctx = await this._prepare(item.name);\n const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));\n await ctx.sysFS.writefile(ctx.fName, p);\n }\n}\n","import { URI } from \"@adviser/cement\";\nimport { KeyBagProvider, KeysItem, V1StorageKeyItem } from \"./key-bag.js\";\nimport { SuperThis } from \"../types.js\";\n\nconst memoryKeyBag = new Map<string, Uint8Array>();\n\nexport class KeyBagProviderMemory implements KeyBagProvider {\n private readonly url: URI;\n readonly sthis: SuperThis;\n constructor(url: URI, sthis: SuperThis) {\n this.url = url;\n this.sthis = sthis;\n }\n key(id: string): string {\n return `${this.url.pathname}/${id}`;\n }\n\n // async _prepare(id: string): Promise<KeyBagCtx> {\n // await this.sthis.start();\n // const sysFS = await sysFileSystemFactory(this.url);\n // const dirName = this.url.pathname;\n // await sysFS.mkdir(dirName, { recursive: true });\n // return {\n // dirName,\n // sysFS,\n // fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`),\n // };\n // }\n\n async get(id: string): Promise<KeysItem | V1StorageKeyItem | undefined> {\n const binKeyItem = memoryKeyBag.get(this.key(id));\n if (binKeyItem) {\n const ki = JSON.parse(this.sthis.txt.decode(binKeyItem));\n return ki;\n }\n return undefined;\n }\n\n async set(item: KeysItem): Promise<void> {\n const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));\n memoryKeyBag.set(this.key(item.name), p);\n }\n}\n","import { BuildURI, runtimeFn, URI } from \"@adviser/cement\";\nimport { PARAM, SuperThis } from \"../types.js\";\nimport type { SerdeGateway } from \"./serde-gateway.js\";\nimport { FILESTORE_VERSION } from \"../runtime/gateways/file/version.js\";\nimport { INDEXEDDB_VERSION } from \"../runtime/gateways/indexeddb-version.js\";\nimport type { Gateway } from \"./gateway.js\";\nimport { FileGateway } from \"../runtime/gateways/file/gateway-impl.js\";\nimport { MemoryGateway } from \"../runtime/gateways/memory/gateway.js\";\nimport { sysFileSystemFactory } from \"../runtime/gateways/file/sys-file-system-factory.js\";\nimport { DefSerdeGateway } from \"../runtime/gateways/def-serde-gateway.js\";\n\nexport interface SerdeGatewayFactoryItem {\n readonly protocol: string;\n // readonly overrideBaseURL?: string; // if this set it overrides the defaultURL\n // readonly overrideRegistration?: boolean; // if this is set, it will override the registration\n readonly isDefault?: boolean;\n\n defaultURI(sthis: SuperThis): URI;\n\n serdegateway(sthis: SuperThis): Promise<SerdeGateway>;\n\n // readonly gateway?: (sthis: SuperThis) => Promise<SerdeGateway>;\n // readonly test: (sthis: SuperThis, gfi: GatewayFactoryItem) => Promise<TestGateway>;\n // which switches between file and indexeddb\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, SerdeGatewayFactoryItem>();\n\nexport function getDefaultURI(sthis: SuperThis, protocol?: string): URI {\n if (protocol) {\n if (!protocol.endsWith(\":\")) {\n protocol += \":\";\n }\n const gfi = storeFactory.get(protocol);\n if (gfi) {\n return gfi.defaultURI(sthis);\n }\n }\n const found = Array.from(storeFactory.values()).find((item) => item.isDefault);\n if (!found) {\n throw sthis.logger.Error().Msg(\"no default found\").AsError();\n }\n return found.defaultURI(sthis);\n}\n\nexport interface SerdeOrGatewayFactoryItem {\n readonly protocol: string;\n readonly isDefault?: boolean;\n\n readonly defaultURI: (sthis: SuperThis) => URI;\n\n readonly serdegateway?: (sthis: SuperThis) => Promise<SerdeGateway>;\n readonly gateway?: (sthis: SuperThis) => Promise<Gateway>;\n}\n\nexport function registerStoreProtocol(item: SerdeOrGatewayFactoryItem): () => void {\n let protocol = item.protocol;\n if (!protocol.endsWith(\":\")) {\n protocol += \":\";\n }\n if (!item.serdegateway && !item.gateway) {\n throw new Error(`registerStoreProtocol needs a gateway or serdegateway`);\n }\n let serdegateway: (sthis: SuperThis) => Promise<SerdeGateway>;\n if (item.gateway) {\n serdegateway = async (sthis) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const m = await item.gateway!(sthis);\n // console.log(\"Gateway Plug in DefSerdeGateway\", m);\n return new DefSerdeGateway(m);\n };\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n serdegateway = item.serdegateway!;\n }\n if (item.isDefault) {\n Array.from(storeFactory.values()).forEach((items) => {\n (items as { isDefault: boolean }).isDefault = false;\n });\n }\n storeFactory.set(protocol, {\n ...item,\n serdegateway,\n });\n return () => {\n storeFactory.delete(protocol);\n };\n}\n\nexport function getGatewayFactoryItem(protocol: string): SerdeGatewayFactoryItem | undefined {\n return storeFactory.get(protocol);\n}\n\nexport function defaultGatewayFactoryItem(): SerdeGatewayFactoryItem {\n const found = Array.from(storeFactory.values()).find((item) => item.isDefault);\n if (!found) {\n throw new Error(\"no default found\");\n }\n return found;\n}\n\nfunction defaultURI(sthis: SuperThis) {\n const rt = runtimeFn();\n return (\n BuildURI.from(\"file://\")\n // .pathname(`${sthis.env.get(\"HOME\")}/.fireproof/${FILESTORE_VERSION.replace(/-.*$/, \"\")}`)\n .pathname(`${sthis.env.get(\"HOME\")}/.fireproof/${FILESTORE_VERSION.replace(/-.*$/, \"\")}`)\n .setParam(PARAM.VERSION, FILESTORE_VERSION)\n .setParam(PARAM.URL_GEN, \"default\")\n .setParam(PARAM.RUNTIME, rt.isNodeIsh ? \"node\" : rt.isDeno ? \"deno\" : \"unknown\")\n .URI()\n );\n}\n\nif (runtimeFn().isNodeIsh || runtimeFn().isDeno) {\n registerStoreProtocol({\n protocol: \"file:\",\n isDefault: true,\n defaultURI,\n gateway: async (sthis) => {\n return new FileGateway(sthis, await sysFileSystemFactory(defaultURI(sthis)));\n },\n });\n}\n\nif (runtimeFn().isBrowser) {\n registerStoreProtocol({\n protocol: \"indexeddb:\",\n isDefault: true,\n defaultURI: () => {\n return BuildURI.from(\"indexeddb://\")\n .pathname(\"fp\")\n .setParam(PARAM.VERSION, INDEXEDDB_VERSION)\n .setParam(PARAM.RUNTIME, \"browser\")\n .URI();\n },\n gateway: async () => {\n const { GatewayImpl } = await import(\"@fireproof/core/indexeddb\");\n return new GatewayImpl();\n },\n });\n}\n\nconst memory = new Map<string, Uint8Array>();\nregisterStoreProtocol({\n protocol: \"memory:\",\n isDefault: false,\n defaultURI: () => {\n return BuildURI.from(\"memory://\").pathname(\"ram\").URI();\n },\n gateway: async (sthis) => {\n return new MemoryGateway(sthis, memory);\n },\n});\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","export const INDEXEDDB_VERSION = \"v0.19-indexeddb\";\n","import { FILESTORE_VERSION } from \"./version.js\";\nimport { exception2Result, KeyedResolvOnce, Result, URI } from \"@adviser/cement\";\nimport { getFileName, getPath } from \"./utils.js\";\nimport { PARAM, SuperThis, SysFileSystem } from \"../../../types.js\";\nimport { exceptionWrapper, isNotFoundError, NotFoundError } from \"../../../utils.js\";\nimport type { Gateway, GetResult } from \"../../../blockstore/gateway.js\";\n\nconst versionFiles = new KeyedResolvOnce<string>();\n\nexport class FileGateway implements Gateway {\n // abstract readonly storeType: StoreType;\n readonly fs: SysFileSystem;\n\n constructor(sthis: SuperThis, fs: SysFileSystem) {\n this.fs = fs;\n }\n\n async getVersionFromFile(path: string, sthis: SuperThis): Promise<string> {\n return versionFiles.get(path).once(async () => {\n await this.fs.mkdir(path, { recursive: true });\n const vFile = sthis.pathOps.join(path, \"version\");\n const vFileStat = await this.fs.stat(vFile).catch(() => undefined);\n if (!vFileStat) {\n await this.fs.writefile(sthis.pathOps.join(path, \"version\"), FILESTORE_VERSION);\n return FILESTORE_VERSION;\n } else if (!vFileStat.isFile()) {\n throw sthis.logger.Error().Str(\"file\", vFile).Msg(`version file is a directory`).AsError();\n }\n const v = await this.fs.readfile(vFile);\n const vStr = sthis.txt.decode(v);\n if (vStr !== FILESTORE_VERSION) {\n sthis.logger.Warn().Str(\"file\", vFile).Str(\"from\", vStr).Str(\"expected\", FILESTORE_VERSION).Msg(`version mismatch`);\n }\n return vStr;\n });\n }\n\n start(baseURL: URI, sthis: SuperThis): Promise<Result<URI>> {\n return exception2Result(async () => {\n await this.fs.start();\n const url = baseURL.build();\n url.defParam(PARAM.VERSION, FILESTORE_VERSION);\n // url.defParam(\"store\", this.storeType);\n const dbUrl = await this.buildUrl(url.URI(), \"dummy\");\n const dbdirFile = this.getFilePath(dbUrl.Ok(), sthis);\n await this.fs.mkdir(sthis.pathOps.dirname(dbdirFile), { recursive: true });\n const dbroot = sthis.pathOps.dirname(dbdirFile);\n sthis.logger.Debug().Url(url.URI()).Str(\"dbroot\", dbroot).Msg(\"start\");\n url.setParam(PARAM.VERSION, await this.getVersionFromFile(dbroot, sthis));\n return url.URI();\n });\n }\n\n async buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Result.Ok(baseUrl.build().setParam(PARAM.KEY, key).URI());\n }\n\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n\n getFilePath(url: URI, sthis: SuperThis): string {\n const key = url.getParam(PARAM.KEY);\n if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();\n // const urlGen = url.getParam(PARAM.URL_GEN);\n // switch (urlGen) {\n // case \"default\":\n // return sthis.pathOps.join(getPath(url, sthis), getFileName(url, sthis));\n // case \"fromEnv\":\n // return sthis.pathOps.join(getPath(url, sthis), getFileName(url, sthis));\n // default:\n // break;\n // }\n return sthis.pathOps.join(getPath(url, sthis), getFileName(url, sthis));\n }\n\n async put(url: URI, bytes: Uint8Array, sthis: SuperThis): Promise<Result<void>> {\n return exception2Result(async () => {\n const file = await this.getFilePath(url, sthis);\n sthis.logger.Debug().Str(\"url\", url.toString()).Str(\"file\", file).Msg(\"put\");\n await this.fs.writefile(file, bytes);\n });\n }\n\n async get(url: URI, sthis: SuperThis): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const file = this.getFilePath(url, sthis);\n try {\n sthis.logger.Debug().Url(url).Str(\"file\", file).Msg(\"get\");\n const res = await this.fs.readfile(file);\n return Result.Ok(res);\n } catch (e: unknown) {\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\n async delete(url: URI, sthis: SuperThis): Promise<Result<void>> {\n return exception2Result(async () => {\n await this.fs.unlink(this.getFilePath(url, sthis));\n });\n }\n\n async destroy(baseURL: URI, sthis: SuperThis): Promise<Result<void>> {\n const url = await this.buildUrl(baseURL, \"x\");\n if (url.isErr()) return url;\n const filepath = sthis.pathOps.dirname(this.getFilePath(url.Ok(), sthis));\n let files: string[] = [];\n try {\n files = await this.fs.readdir(filepath);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw sthis.logger.Error().Err(e).Str(\"dir\", filepath).Msg(\"destroy:readdir\").AsError();\n }\n }\n for (const file of files) {\n const pathed = sthis.pathOps.join(filepath, file);\n try {\n await this.fs.unlink(pathed);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw sthis.logger.Error().Err(e).Str(\"file\", pathed).Msg(\"destroy:unlink\").AsError();\n }\n }\n }\n return Result.Ok(undefined);\n }\n\n async getPlain(iurl: URI, key: string, sthis: SuperThis) {\n const url = iurl.build().setParam(PARAM.KEY, key).URI();\n const dbFile = sthis.pathOps.join(getPath(url, sthis), getFileName(url, sthis));\n sthis.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Msg(\"get\");\n const buffer = await this.fs.readfile(dbFile);\n sthis.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n return Result.Ok(buffer);\n }\n}\n","import type { URI } from \"@adviser/cement\";\nimport { SuperThis } from \"../../../types.js\";\nimport { getStore } from \"../../../utils.js\";\n\nexport function getPath(url: URI, sthis: SuperThis): string {\n const basePath = url.pathname;\n // .toString()\n // .replace(new RegExp(`^${url.protocol}//`), \"\")\n // .replace(/\\?.*$/, \"\");\n const name = url.getParam(\"name\");\n if (name) {\n // const urlGen = url.getParam(PARAM.URL_GEN);\n // switch (urlGen) {\n // case \"default\":\n // case \"fromEnv\":\n // default:\n // break;\n // }\n\n // const version = url.getParam(\"version\");\n // if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();\n return sthis.pathOps.join(basePath, name);\n }\n return sthis.pathOps.join(basePath);\n}\n\nexport function getFileName(url: URI, sthis: SuperThis): string {\n const key = url.getParam(\"key\");\n if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();\n const res = getStore(url, sthis, (...a: string[]) => a.join(\"-\"));\n switch (res.fromUrl) {\n case \"file\":\n return sthis.pathOps.join(res.name, key);\n case \"car\":\n return sthis.pathOps.join(res.name, key + \".car\");\n case \"wal\":\n case \"meta\":\n return sthis.pathOps.join(res.name, key + \".json\");\n default:\n throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();\n }\n}\n","import { Result, URI } from \"@adviser/cement\";\nimport { Gateway, GetResult } from \"../../../blockstore/gateway.js\";\nimport { PARAM, SuperThis } from \"../../../types.js\";\nimport { MEMORY_VERSION } from \"./version.js\";\nimport { NotFoundError } from \"../../../utils.js\";\nimport { VoidResult } from \"../../../blockstore/serde-gateway.js\";\n\nexport class MemoryGateway implements Gateway {\n readonly memorys: Map<string, Uint8Array>;\n readonly sthis: SuperThis;\n // readonly logger: Logger;\n constructor(sthis: SuperThis, memorys: Map<string, Uint8Array>) {\n // console.log(\"MemoryGateway\", memorys);\n this.memorys = memorys;\n // this.logger = ensureLogger(sthis, \"MemoryGateway\");\n this.sthis = sthis;\n }\n\n buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Promise.resolve(Result.Ok(baseUrl.build().setParam(PARAM.KEY, key).URI()));\n }\n start(baseUrl: URI): Promise<Result<URI>> {\n return Promise.resolve(Result.Ok(baseUrl.build().setParam(PARAM.VERSION, MEMORY_VERSION).URI()));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n close(baseUrl: URI): Promise<VoidResult> {\n return Promise.resolve(Result.Ok(undefined));\n }\n destroy(baseUrl: URI): Promise<VoidResult> {\n const keyUrl = baseUrl.toString();\n for (const key of this.memorys.keys()) {\n if (key.startsWith(keyUrl)) {\n this.memorys.delete(key);\n }\n }\n this.memorys.clear();\n return Promise.resolve(Result.Ok(undefined));\n }\n\n async put(url: URI, bytes: Uint8Array): Promise<VoidResult> {\n // ensureLogger(sthis, \"MemoryGateway\").Debug().Str(\"url\", url.toString()).Msg(\"put\");\n // this.sthis.logger.Warn().Url(url).Msg(\"put\");\n this.memorys.set(url.toString(), bytes);\n return Result.Ok(undefined);\n }\n // get could return a NotFoundError if the key is not found\n get(url: URI): Promise<GetResult> {\n // ensureLogger(sthis, \"MemoryGateway\").Debug().Str(\"url\", url.toString()).Msg(\"put\");\n const x = this.memorys.get(url.toString());\n if (!x) {\n // const possible = Array.from(this.memorys.keys()).filter(i => i.startsWith(url.build().cleanParams().toString()))\n // this.sthis.logger.Warn().Any(\"possible\", possible).Url(url).Msg(\"not found\");\n return Promise.resolve(Result.Err(new NotFoundError(`not found: ${url.toString()}`)));\n }\n return Promise.resolve(Result.Ok(x));\n }\n delete(url: URI): Promise<VoidResult> {\n this.memorys.delete(url.toString());\n return Promise.resolve(Result.Ok(undefined));\n }\n\n async getPlain(url: URI, key: string): Promise<Result<Uint8Array>> {\n const x = this.memorys.get(url.build().setParam(PARAM.KEY, key).toString());\n if (!x) {\n return Result.Err(new NotFoundError(\"not found\"));\n }\n return Result.Ok(x);\n }\n}\n","export const MEMORY_VERSION = \"v0.19-memory\";\n","import { Result, URI } from \"@adviser/cement\";\nimport type { Gateway } from \"../../blockstore/gateway.js\";\nimport { FPEnvelopeTypes, type FPEnvelope, type FPEnvelopeMeta } from \"../../blockstore/fp-envelope.js\";\nimport { fpDeserialize, fpSerialize } from \"./fp-envelope-serialize.js\";\nimport type { SerdeGateway, SerdeGatewayCtx, SerdeGetResult } from \"../../blockstore/serde-gateway.js\";\nimport type { DbMetaEvent } from \"../../blockstore/types.js\";\nimport { PARAM } from \"../../types.js\";\n\nexport class DefSerdeGateway implements SerdeGateway {\n // abstract readonly storeType: StoreType;\n readonly gw: Gateway;\n\n constructor(gw: Gateway) {\n this.gw = gw;\n }\n\n start({ loader: { sthis } }: SerdeGatewayCtx, baseURL: URI): Promise<Result<URI>> {\n return this.gw.start(baseURL, sthis);\n }\n\n async buildUrl({ loader: { sthis } }: SerdeGatewayCtx, baseUrl: URI, key: string): Promise<Result<URI>> {\n return this.gw.buildUrl(baseUrl, key, sthis);\n }\n\n async close({ loader: { sthis } }: SerdeGatewayCtx, uri: URI): Promise<Result<void>> {\n return this.gw.close(uri, sthis);\n }\n\n private subscribeFn = new Map<string, (raw: Uint8Array) => Promise<void>>();\n\n async put<T>({ loader: { sthis }, encoder }: SerdeGatewayCtx, url: URI, env: FPEnvelope<T>): Promise<Result<void>> {\n const rUint8 = await fpSerialize(sthis, env, encoder);\n if (rUint8.isErr()) return rUint8;\n const ret = this.gw.put(url, rUint8.Ok(), sthis);\n\n if (env.type === FPEnvelopeTypes.META) {\n const urlWithoutKey = url.build().delParam(PARAM.KEY).delParam(PARAM.SELF_REFLECT).toString();\n const subFn = this.subscribeFn.get(urlWithoutKey);\n if (subFn) {\n await subFn(rUint8.Ok());\n }\n }\n return ret;\n }\n\n async get<S>({ loader: { sthis }, decoder }: SerdeGatewayCtx, url: URI): Promise<SerdeGetResult<S>> {\n const res = await this.gw.get(url, sthis);\n if (res.isErr()) return Result.Err(res.Err());\n return fpDeserialize(sthis, url, res, decoder) as Promise<SerdeGetResult<S>>;\n }\n\n async subscribe(\n { loader: { sthis }, decoder }: SerdeGatewayCtx,\n url: URI,\n callback: (meta: FPEnvelopeMeta) => Promise<void>,\n ): Promise<Result<() => void>> {\n function rawCallback(raw: Uint8Array) {\n return fpDeserialize<DbMetaEvent[]>(sthis, url, Result.Ok(raw), decoder).then((res) => {\n if (res.isErr()) {\n sthis.logger.Error().Err(res).Msg(\"Failed to deserialize\");\n return;\n }\n callback(res.Ok() as FPEnvelopeMeta);\n });\n }\n if (!this.gw.subscribe) {\n if (!url.hasParam(PARAM.SELF_REFLECT)) {\n return Result.Ok(() => {\n /* noop */\n });\n }\n // memory leak possible\n const urlWithoutKey = url.build().delParam(PARAM.KEY).delParam(PARAM.SELF_REFLECT).toString();\n this.subscribeFn.set(urlWithoutKey, rawCallback);\n return Result.Ok(() => {\n this.subscribeFn.delete(urlWithoutKey);\n });\n }\n const unreg = await this.gw.subscribe(url, rawCallback, sthis);\n return unreg;\n }\n\n async delete({ loader: { sthis } }: SerdeGatewayCtx, url: URI): Promise<Result<void>> {\n return this.gw.delete(url, sthis);\n }\n\n async destroy({ loader: { sthis } }: SerdeGatewayCtx, baseURL: URI): Promise<Result<void>> {\n return this.gw.destroy(baseURL, sthis);\n }\n\n async getPlain({ loader: { sthis } }: SerdeGatewayCtx, iurl: URI, key: string) {\n return this.gw.getPlain(iurl, key, sthis);\n }\n}\n","import { CID } from \"multiformats\";\nimport { DbMetaEvent, WALState } from \"./types.js\";\nimport { Result } from \"@adviser/cement\";\n\nexport const FPEnvelopeTypes = {\n CAR: \"car\",\n FILE: \"file\",\n META: \"meta\",\n WAL: \"wal\",\n} as const;\n\n// const Colors = {\n// Red: \"red\",\n// Green: \"green\",\n// Blue: \"blue\",\n// } as const; // Important: The \"as const\" assertion is crucial for type safety\n\n// type Color = typeof Colors[keyof typeof Colors]; // Extracts the string literal types\n// let myColor: Color = Colors.Red;\n\nexport type FPEnvelopeType = (typeof FPEnvelopeTypes)[keyof typeof FPEnvelopeTypes];\n\n// export enum FPEnvelopeType {\n// CAR = \"car\",\n// FILE = \"file\",\n// META = \"meta\",\n// WAL = \"wal\",\n// }\n\nexport interface FPEnvelope<T> {\n readonly type: FPEnvelopeType;\n readonly payload: T;\n}\n\nexport interface FPEnvelopeCar extends FPEnvelope<Uint8Array> {\n readonly type: typeof FPEnvelopeTypes.CAR;\n}\n\nexport interface FPEnvelopeFile extends FPEnvelope<Uint8Array> {\n readonly type: typeof FPEnvelopeTypes.FILE;\n}\n\nexport interface FPEnvelopeMeta extends FPEnvelope<DbMetaEvent[]> {\n readonly type: typeof FPEnvelopeTypes.META;\n}\n\nexport interface FPWALCarsOps {\n readonly cars: CID[];\n}\n// export interface FPWAL {\n// // fileOperations: any[]; will be added with connector-fixes\n// // noLoaderOps: any[]; will be added with connector-fixes\n// readonly operations: FPWALCarsOps[];\n// }\nexport interface FPEnvelopeWAL extends FPEnvelope<WALState> {\n readonly type: typeof FPEnvelopeTypes.WAL;\n}\n\n// export function WAL2FPMsg(sthis: SuperThis, ws: WALState): Result<FPEnvelopeWAL> {\n// return Result.Ok({\n// type: \"wal\",\n// payload: ws\n// })\n// }\n\n// export function FPMsg2WAL(fpmsg: FPEnvelopeWAL): Result<WALState> {\n// // const renv = FPMsgMatch2Envelope(fpmsg, \"wal\");\n// // if (renv.isErr()) {\n// // return Result.Err(renv.Err());\n// // }\n// if (fpmsg.type !== \"wal\") {\n// return Result.Err(`expected type to be wal`);\n// }\n// const convertCids = fpmsg.payload as WALState;\n// for (const op of convertCids.operations) {\n// const cars = []\n// for (const strCid of op.cars) {\n// for (const cidVal of Object.values(strCid)) {\n// cars.push(CID.parse(cidVal));\n// }\n// }\n// (op as {cars: CID[]}).cars = cars;\n// }\n// return Result.Ok(convertCids);\n// }\n\n// export function Meta2FPMsg(fpmetas: DbMetaEvent[]): Uint8Array {\n// /*\n// [\n// {\n// \"cid\":\"bafyreibc2rbsszqw5z7xiojra2vgskl3mi7iegf3ynpofm6w6lcxx4r7ha\",\n// \"data\":\"MomRkYXRhoWZkYk1ldGFYU3siY2FycyI6W3siLyI6ImJhZzR5dnFhYmNpcW9peXdlb2Vjd214Z3VmdDV4YmJsMnFxd2c3Z2tmYTV6cG91d2huYWVoN3E1b3o2eTNoMnkifV19Z3BhcmVudHOB2CpYJQABcRIgTXAXVfzn7tghZBnaOrXq0+bmY3kK9f1CCNrGfeA73hk=\",\n// \"parents\":[\"bafyreicnoalvl7hh53mcczaz3i5ll2wt43tgg6ik6x6uecg2yz66ao66de\"]\n// }\n// ]\n// */\n// return encode({ type: \"meta\", payload: fpmetas } as FPEnvelopeMeta);\n// }\n\n// export function FPMsg2Meta(fpmsg: Uint8Array): Result<DbMeta> {\n// const renv = FPMsgMatch2Envelope(fpmsg, \"meta\");\n// if (renv.isErr()) {\n// return Result.Err(renv.Err());\n// }\n// return Result.Ok(renv.Ok().payload as DbMeta);\n// }\n\nexport function Car2FPMsg(fpcar: Uint8Array): Result<FPEnvelopeCar> {\n return Result.Ok({ type: FPEnvelopeTypes.CAR, payload: fpcar });\n}\n\n// export function FPMsg2Car(fpmsg: Uint8Array): Result<Uint8Array> {\n// const renv = FPMsgMatch2Envelope(fpmsg, \"car\");\n// if (renv.isErr()) {\n// return Result.Err(renv.Err());\n// }\n// return Result.Ok(renv.Ok().payload as Uint8Array);\n// }\n\nexport function File2FPMsg(fpfile: Uint8Array): Result<FPEnvelopeFile> {\n return Result.Ok({ type: FPEnvelopeTypes.FILE, payload: fpfile });\n}\n\n// export function FPMsg2File(fpmsg: Uint8Array): Result<Uint8Array> {\n// const renv = FPMsgMatch2Envelope(fpmsg, \"file\");\n// if (renv.isErr()) {\n// return Result.Err(renv.Err());\n// }\n// return Result.Ok(renv.Ok().payload as Uint8Array);\n// }\n\n// export function FPMsgMatch2Envelope(fpmsg: Uint8Array, ...types: string[]): Result<FPEnvelope<unknown>> {\n// let env: FPEnvelope<unknown>;\n// try {\n// env = decode(fpmsg);\n// } catch (e) {\n// return Result.Err(`failed to decode envelope: ${e}`);\n// }\n// if (typeof env !== \"object\") {\n// return Result.Err(`expected envelope to be an object`);\n// }\n// if (typeof env.type !== \"string\") {\n// return Result.Err(`expected type to be a string`);\n// }\n// if (types.length > 0 && !types.includes(env.type)) {\n// return Result.Err(`expected type to be ${types}`);\n// }\n// // need to check if the payload is a valid WAL\n// return Result.Ok(env);\n// }\n","import { exception2Result, Result, URI } from \"@adviser/cement\";\nimport type { CarClockLink, DbMeta, DbMetaBinary, DbMetaEvent, WALState } from \"../../blockstore/index.js\";\nimport {\n FPEnvelope,\n FPEnvelopeCar,\n FPEnvelopeFile,\n FPEnvelopeMeta,\n FPEnvelopeType,\n FPEnvelopeTypes,\n FPEnvelopeWAL,\n} from \"../../blockstore/fp-envelope.js\";\nimport { PARAM, PromiseToUInt8, SuperThis } from \"../../types.js\";\nimport { decodeEventBlock, EventBlock } from \"@web3-storage/pail/clock\";\nimport { base64pad } from \"multiformats/bases/base64\";\nimport { CID, Link } from \"multiformats\";\nimport { fromJSON } from \"multiformats/link\";\nimport { format, parse } from \"@ipld/dag-json\";\nimport { EventView } from \"@web3-storage/pail/clock/api\";\nimport { coercePromiseIntoUint8 } from \"../../utils.js\";\n\nexport interface SerializedMeta {\n readonly data: string; // base64pad encoded\n readonly parents: string[];\n readonly cid: string;\n}\n\nexport async function dbMetaEvent2Serialized(\n sthis: SuperThis,\n dbEvents: Omit<DbMetaEvent, \"eventCid\">[],\n): Promise<SerializedMeta[]> {\n return await Promise.all(\n dbEvents.map(async (dbEvent) => {\n const event = await EventBlock.create<DbMetaBinary>(\n {\n dbMeta: sthis.txt.encode(format(dbEvent.dbMeta)),\n },\n dbEvent.parents as unknown as Link<EventView<DbMetaBinary>, number, number, 1>[],\n );\n return {\n cid: event.cid.toString(),\n parents: dbEvent.parents.map((i) => i.toString()),\n data: base64pad.encode(event.bytes),\n } satisfies SerializedMeta;\n }),\n );\n}\n\nfunction WALState2Serialized(sthis: SuperThis, wal: WALState): SerializedWAL {\n const serializedWAL: SerializedWAL = {\n fileOperations: wal.fileOperations.map((fop) => ({\n cid: fop.cid.toString(),\n public: fop.public,\n })),\n noLoaderOps: wal.noLoaderOps.map((nop) => ({\n cars: nop.cars.map((i) => i.toString()),\n })),\n operations: wal.operations.map((op) => ({\n cars: op.cars.map((i) => i.toString()),\n })),\n };\n return serializedWAL;\n}\n\nexport type CAREncodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\nexport type FILEEncodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\nexport type METAEncodeEnvelope = (sthis: SuperThis, payload: SerializedMeta[]) => Promise<Result<Uint8Array>>;\nexport type WALEncodeEnvelope = (sthis: SuperThis, payload: SerializedWAL) => Promise<Result<Uint8Array>>;\n\n// export type CAREncodeEnvelope = (sthis: SuperThis, payload: Uint8Array, base: CAREncodeEnvelopeBase) => Promise<Uint8Array>;\n// export type FILEEncodeEnvelope = (sthis: SuperThis, payload: Uint8Array, base: CAREncodeEnvelopeBase) => Promise<Uint8Array>;\n// export type METAEncodeEnvelope = (sthis: SuperThis, payload: SerializedMeta[], base: METAEncodeEnvelopeBase) => Promise<Uint8Array>;\n// export type WALEncodeEnvelope = (sthis: SuperThis, payload: SerializedWAL, base: WALEncodeEnvelopeBase) => Promise<Uint8Array>;\nexport interface FPEncoder {\n readonly car: CAREncodeEnvelope;\n readonly file: FILEEncodeEnvelope;\n readonly meta: METAEncodeEnvelope;\n readonly wal: WALEncodeEnvelope;\n}\n\nconst defaultEncoder: FPEncoder = {\n car: async (sthis: SuperThis, payload: Uint8Array) => Result.Ok(payload),\n file: async (sthis: SuperThis, payload: Uint8Array) => Result.Ok(payload),\n meta: async (sthis: SuperThis, payload: SerializedMeta[]) => Result.Ok(sthis.txt.encode(JSON.stringify(payload))),\n wal: async (sthis: SuperThis, payload: SerializedWAL) => Result.Ok(sthis.txt.encode(JSON.stringify(payload))),\n};\n\nexport async function fpSerialize<T>(\n sthis: SuperThis,\n env: FPEnvelope<T>,\n pencoder?: Partial<FPEncoder>,\n): Promise<Result<Uint8Array>> {\n const encoder = {\n ...defaultEncoder,\n ...pencoder,\n };\n switch (env.type) {\n case FPEnvelopeTypes.FILE:\n return encoder.file(sthis, (env as FPEnvelopeFile).payload);\n case FPEnvelopeTypes.CAR:\n return encoder.car(sthis, (env as FPEnvelopeCar).payload);\n case FPEnvelopeTypes.WAL:\n return encoder.wal(sthis, WALState2Serialized(sthis, (env as FPEnvelopeWAL).payload));\n case FPEnvelopeTypes.META:\n return encoder.meta(sthis, await dbMetaEvent2Serialized(sthis, (env as FPEnvelopeMeta).payload));\n default:\n throw sthis.logger.Error().Str(\"type\", env.type).Msg(\"unsupported store\").AsError();\n }\n}\n\nexport async function decode2DbMetaEvents(\n sthis: SuperThis,\n rserializedMeta: Result<SerializedMeta[]>,\n): Promise<Result<DbMetaEvent[]>> {\n if (rserializedMeta.isErr()) {\n return Result.Err(rserializedMeta.Err());\n }\n const serializedMeta = rserializedMeta.unwrap();\n if (!Array.isArray(serializedMeta)) {\n return sthis.logger.Debug().Any(\"metaEntries\", serializedMeta).Msg(\"No data in MetaEntries\").ResultError();\n }\n // if (!serializedMeta.length) {\n // return sthis.logger.Debug().Msg(\"No MetaEntries found\").ResultError();\n // }\n return Result.Ok(\n await Promise.all(\n serializedMeta.map(async (metaEntry) => {\n const eventBlock = await decodeEventBlock<DbMetaBinary>(base64pad.decode(metaEntry.data));\n const dbMeta = parse<DbMeta>(sthis.txt.decode(eventBlock.value.data.dbMeta));\n return {\n eventCid: eventBlock.cid as CarClockLink,\n parents: metaEntry.parents.map((i: string) => CID.parse(i)),\n dbMeta,\n } satisfies DbMetaEvent;\n }),\n ),\n );\n}\n\ntype linkOrCid = { \"/\": string } | string;\n\nexport interface SerializedWAL {\n readonly fileOperations?: { cid: linkOrCid; public: boolean }[];\n readonly noLoaderOps?: { cars: linkOrCid[] }[];\n readonly operations?: { cars: linkOrCid[] }[];\n}\n\nfunction toCid(sthis: SuperThis, link: linkOrCid): CID {\n if (typeof link === \"string\") {\n return CID.parse(link);\n }\n return fromJSON(link);\n}\n\nasync function decode2WalState(sthis: SuperThis, rserializedWAL: Result<SerializedWAL>): Promise<Result<WALState>> {\n if (rserializedWAL.isErr()) {\n return Result.Err(rserializedWAL.Err());\n }\n const serializedWAL = rserializedWAL.unwrap();\n return Result.Ok({\n fileOperations: (serializedWAL.fileOperations || []).map((fop) => ({\n cid: toCid(sthis, fop.cid),\n public: !!fop.public,\n })),\n noLoaderOps: (serializedWAL.noLoaderOps || []).map((nop) => ({\n cars: (nop.cars || []).map((i) => toCid(sthis, i)),\n })),\n operations: (serializedWAL.operations || []).map((op) => ({\n cars: (op.cars || []).map((i) => toCid(sthis, i)),\n })),\n });\n}\n// export type CARDecodeEnvelopeBase = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\n// export type FILEDecodeEnvelopeBase = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\n// export type WALDecodeEnvelopeBase = (sthis: SuperThis, payload: SerializedWAL) => Promise<Result<SerializedWAL>>;\n// export type METADecodeEnvelopeBase = (sthis: SuperThis, payload: SerializedMeta[]) => Promise<Result<SerializedMeta[]>>;\n\nexport type CARDecodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\nexport type FILEDecodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\nexport type METADecodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<SerializedMeta[]>>;\nexport type WALDecodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<SerializedWAL>>;\nexport interface FPDecoder {\n readonly car: CARDecodeEnvelope;\n readonly file: FILEDecodeEnvelope;\n readonly meta: METADecodeEnvelope;\n readonly wal: WALDecodeEnvelope;\n}\n\nconst defaultDecoder = {\n car: async (sthis: SuperThis, payload: Uint8Array) => Result.Ok(payload),\n file: async (sthis: SuperThis, payload: Uint8Array) => Result.Ok(payload),\n meta: async (sthis: SuperThis, payload: Uint8Array) =>\n exception2Result(() => JSON.parse(sthis.txt.decode(payload)) as SerializedMeta[]),\n wal: async (sthis: SuperThis, payload: Uint8Array) =>\n exception2Result(() => JSON.parse(sthis.txt.decode(payload)) as SerializedWAL),\n};\n\nfunction makeFPEnvelope<S>(type: FPEnvelopeType, payload: Result<S>): Result<FPEnvelope<S>> {\n if (payload.isErr()) {\n return Result.Err(payload.Err());\n }\n return Result.Ok({\n type,\n payload: payload.unwrap(),\n });\n}\n\nexport async function fpDeserialize<S>(\n sthis: SuperThis,\n url: URI,\n intoRaw: PromiseToUInt8,\n pdecoder?: Partial<FPDecoder>,\n): Promise<Result<FPEnvelope<S>>> {\n const rraw = await coercePromiseIntoUint8(intoRaw);\n if (rraw.isErr()) {\n return Result.Err(rraw.Err());\n }\n const raw = rraw.unwrap();\n const decoder = {\n ...defaultDecoder,\n ...pdecoder,\n };\n switch (url.getParam(PARAM.STORE)) {\n case \"car\":\n return makeFPEnvelope(FPEnvelopeTypes.CAR, await decoder.car(sthis, raw)) as Result<FPEnvelope<S>>;\n case \"file\":\n return makeFPEnvelope(FPEnvelopeTypes.FILE, await decoder.file(sthis, raw)) as Result<FPEnvelope<S>>;\n case \"wal\":\n return makeFPEnvelope(FPEnvelopeTypes.WAL, await decode2WalState(sthis, await decoder.wal(sthis, raw))) as Result<\n FPEnvelope<S>\n >;\n case \"meta\":\n return makeFPEnvelope(FPEnvelopeTypes.META, await decode2DbMetaEvents(sthis, await decoder.meta(sthis, raw))) as Result<\n FPEnvelope<S>\n >;\n default:\n return sthis.logger.Error().Str(\"store\", url.getParam(PARAM.STORE)).Msg(\"unsupported store\").ResultError();\n }\n}\n","// this enable async codec\n// it should be gone if this in multiformats is merged:\n// https://github.com/multiformats/js-multiformats/pull/305\nimport { bytes as binary, CID, MultihashHasher, BlockView, ByteView, Version, Link, MultihashDigest } from \"multiformats\";\nimport { Block as mfBlock } from \"multiformats/block\";\nimport { AsyncBlockDecoder, AsyncBlockEncoder, BlockDecoder, BlockEncoder } from \"./codec-interface.js\";\n\n// export type Block<T, C extends number, A extends number, V extends Version> = mfBlock<T, C, A, V>\n\nexport const Block = mfBlock;\n\nexport interface DecodeInput<T, Code extends number, Alg extends number> {\n readonly bytes: ByteView<unknown>;\n // readonly hashBytes?: HashBytesGet<T>;\n readonly codec: BlockDecoder<Code, T>;\n readonly hasher: MultihashHasher<Alg>;\n}\n\nexport interface AsyncDecodeInput<T, Code extends number, Alg extends number> {\n readonly bytes: ByteView<unknown>;\n // readonly hashBytes?: AsyncHashBytesGet<T>;\n readonly codec: AsyncBlockDecoder<Code, T>;\n readonly hasher: MultihashHasher<Alg>;\n}\n\nexport async function decode<T, Code extends number, Alg extends number>({\n bytes,\n codec,\n hasher,\n}: AsyncDecodeInput<T, Code, Alg> | DecodeInput<T, Code, Alg>): Promise<BlockView<T, Code, Alg>> {\n if (bytes == null) throw new Error('Missing required argument \"bytes\"');\n if (codec == null || hasher == null) throw new Error(\"Missing required argument: codec or hasher\");\n\n // outer cbor\n const value = (await Promise.resolve(codec.decode(bytes))) as T;\n let toHash = bytes;\n if (codec.valueToHashBytes) {\n toHash = (await Promise.resolve(codec.valueToHashBytes(value))) as ByteView<unknown>;\n }\n const hash = await hasher.digest(toHash);\n const cid = CID.create(1, codec.code, hash) as CID<T, Code, Alg, 1>;\n\n return new mfBlock<T, Code, Alg, 1>({ value, bytes: toHash as ByteView<T>, cid });\n}\n\nexport interface EncodeInput<T, Code extends number, Alg extends number> {\n readonly value: T;\n readonly codec: BlockEncoder<Code, T>;\n // if serializer is not provided, the codec is assumed to be a block encoder\n // if serializer is provided it will run in this order:\n // 1. serializer\n // 2. hasher\n // 3. codec\n // readonly hashBytes?: HashAsBytes<T>;\n readonly hasher: MultihashHasher<Alg>;\n}\n\nexport interface AsyncEncodeInput<T, Code extends number, Alg extends number> {\n readonly value: T;\n readonly codec: AsyncBlockEncoder<Code, T>;\n // if serializer is not provided, the codec is assumed to be a block encoder\n // if serializer is provided it will run in this order:\n // 1. serializer\n // 2. hasher\n // 3. codec\n // readonly hashBytes?: AsyncHashAsBytes<T>;\n readonly hasher: MultihashHasher<Alg>;\n}\n\n/**\n * @template T - Logical type of the data encoded in the block\n * @template Code - multicodec code corresponding to codec used to encode the block\n * @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.\n */\nexport async function encode<T, Code extends number, Alg extends number>({\n value,\n codec,\n hasher,\n}: AsyncEncodeInput<T, Code, Alg> | EncodeInput<T, Code, Alg>): Promise<BlockView<T, Code, Alg>> {\n if (typeof value === \"undefined\") throw new Error('Missing required argument \"value\"');\n if (codec == null || hasher == null) throw new Error(\"Missing required argument: codec or hasher\");\n\n let bytes: ByteView<T>;\n let hash: MultihashDigest;\n if (codec.bytesToHash) {\n const hashable = await Promise.resolve(codec.bytesToHash(value));\n hash = await hasher.digest(hashable);\n bytes = await Promise.resolve(codec.encode(value as T));\n } else {\n bytes = await Promise.resolve(codec.encode(value));\n hash = await hasher.digest(bytes);\n }\n const cid = CID.create(1, codec.code, hash) as CID<T, Code, Alg, 1>;\n return new Block({ value, bytes, cid });\n}\n\ninterface CreateInput<T, Code extends number, Alg extends number, V extends Version> {\n bytes: ByteView<T>;\n cid: Link<T, Code, Alg, V>;\n hasher: MultihashHasher<Alg>;\n codec: BlockDecoder<Code, T>;\n}\n\nexport async function create<T, Code extends number, Alg extends number, V extends Version>({\n bytes,\n cid,\n hasher,\n codec,\n}: CreateInput<T, Code, Alg, V>): Promise<BlockView<T, Code, Alg, V>> {\n if (bytes == null) throw new Error('Missing required argument \"bytes\"');\n if (hasher == null) throw new Error('Missing required argument \"hasher\"');\n const value = await Promise.resolve(codec.decode(bytes));\n const hash = await hasher.digest(bytes);\n if (!binary.equals(cid.multihash.bytes, hash.bytes)) {\n throw new Error(\"CID hash does not match bytes\");\n }\n\n return createUnsafe({\n bytes,\n cid,\n value,\n codec,\n });\n}\n\ntype CreateUnsafeInput<T, Code extends number, Alg extends number, V extends Version> =\n | {\n cid: Link<T, Code, Alg, V>;\n value: T;\n codec?: BlockDecoder<Code, T>;\n bytes: ByteView<T>;\n }\n | {\n cid: Link<T, Code, Alg, V>;\n value?: undefined;\n codec: BlockDecoder<Code, T>;\n bytes: ByteView<T>;\n };\n\n/**\n * @template T - Logical type of the data encoded in the block\n * @template Code - multicodec code corresponding to codec used to encode the block\n * @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.\n * @template V - CID version\n */\nexport async function createUnsafe<T, Code extends number, Alg extends number, V extends Version>({\n bytes,\n cid,\n value: maybeValue,\n codec,\n}: CreateUnsafeInput<T, Code, Alg, V>): Promise<BlockView<T, Code, Alg, V>> {\n const value = await Promise.resolve(maybeValue !== undefined ? maybeValue : codec?.decode(bytes));\n\n if (value === undefined) throw new Error('Missing required argument, must either provide \"value\" or \"codec\"');\n\n return new Block({\n cid: cid as CID<T, Code, Alg, V>,\n bytes,\n value,\n });\n}\n","import type { Block, Link } from \"multiformats\";\nimport { create } from \"./runtime/wait-pr-multiformats/block.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as codec from \"@ipld/dag-cbor\";\n\n// @ts-expect-error \"charwise\" has no types\nimport charwise from \"charwise\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport * as DbIndex from \"prolly-trees/db-index\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { bf, simpleCompare } from \"prolly-trees/utils\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { nocache as cache } from \"prolly-trees/cache\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { ProllyNode as BaseNode } from \"prolly-trees/db-index\";\n\nimport {\n DocUpdate,\n MapFn,\n DocFragment,\n IndexUpdate,\n QueryOpts,\n IndexRow,\n DocWithId,\n IndexKeyType,\n IndexKey,\n DocTypes,\n DocObject,\n IndexUpdateString,\n CarTransaction,\n CRDT,\n} from \"./types.js\";\nimport { BlockFetcher, AnyLink, AnyBlock } from \"./blockstore/index.js\";\nimport { Logger } from \"@adviser/cement\";\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 && typeof mapReturn !== \"undefined\") {\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 logger: Logger,\n tblocks: CarTransaction,\n inIndex: IndexTree<K, T>,\n indexEntries: (IndexUpdate<K> | IndexUpdateString)[],\n opts: StaticProllyOptions<CT>,\n): Promise<IndexTree<K, T>> {\n logger.Debug().Msg(\"enter bulkIndex\");\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 logger.Debug().Msg(\"exit !root bulkIndex\");\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 logger.Debug().Msg(\"pre bulk bulkIndex\");\n const { root, blocks: newBlocks } = await inIndex.root.bulk(indexEntries);\n if (root) {\n logger.Debug().Msg(\"pre root put bulkIndex\");\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 logger.Debug().Msg(\"pre !root bulkIndex\");\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,\n resp: { result: ProllyIndexRow<K, R>[] },\n query: QueryOpts<K>,\n): Promise<{\n rows: IndexRow<K, T, R>[];\n}> {\n if (query.descending) {\n resp.result = resp.result.reverse();\n }\n if (query.limit) {\n resp.result = resp.result.slice(0, query.limit);\n }\n if (query.includeDocs) {\n resp.result = await Promise.all(\n resp.result.map(async (row) => {\n const val = await crdt.get(row.id);\n const doc = val ? ({ ...val.doc, _id: row.id } as DocWithId<T>) : undefined;\n return { ...row, doc };\n }),\n );\n }\n return {\n rows: resp.result.map(({ key, ...row }) => {\n return {\n key: charwise.decode(key),\n ...row,\n };\n }),\n };\n}\n\nexport function encodeRange(range: [IndexKeyType, IndexKeyType]): [string, string] {\n return [charwise.encode(range[0]), charwise.encode(range[1])];\n}\n\nexport function encodeKey(key: DocFragment): string {\n return charwise.encode(key) as string;\n}\n\nexport interface ProllyIndexRow<K extends IndexKeyType, T extends DocFragment> {\n readonly id: string;\n readonly key: IndexKey<K>;\n readonly value: T;\n}\n\n// ProllyNode type based on the ProllyNode from 'prolly-trees/base'\ninterface ProllyNode<K extends IndexKeyType, T extends DocFragment> extends BaseNode {\n getAllEntries(): PromiseLike<{ [x: string]: unknown; result: ProllyIndexRow<K, T>[] }>;\n getMany<KI extends IndexKeyType>(removeIds: KI[]): Promise<{ /* [x: K]: unknown; */ result: IndexKey<K>[] }>;\n range(a: string, b: string): Promise<{ result: ProllyIndexRow<K, T>[] }>;\n get(key: string): Promise<{ result: ProllyIndexRow<K, T>[] }>;\n bulk(bulk: (IndexUpdate<K> | IndexUpdateString)[]): PromiseLike<{\n readonly root?: ProllyNode<K, T>;\n readonly blocks: Block[];\n }>;\n readonly address: Promise<Link>;\n readonly distance: number;\n compare: (a: unknown, b: unknown) => number;\n readonly cache: unknown;\n readonly block: Promise<Block>;\n}\n\ninterface StaticProllyOptions<T> {\n readonly cache: unknown;\n chunker: (entry: T, distance: number) => boolean;\n readonly codec: unknown;\n readonly hasher: unknown;\n compare: (a: T, b: T) => number;\n}\n","import {\n type ClockHead,\n type DocUpdate,\n type MapFn,\n type IndexUpdate,\n type QueryOpts,\n type IdxMeta,\n type DocFragment,\n type IdxMetaMap,\n type IndexKeyType,\n type IndexRows,\n type DocTypes,\n type IndexUpdateString,\n throwFalsy,\n type IndexTransactionMeta,\n type SuperThis,\n type BaseBlockstore,\n type CRDT,\n type HasCRDT,\n type HasLogger,\n type HasSuperThis,\n type RefLedger,\n} from \"./types.js\";\n// import { 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 { ensureLogger } from \"./utils.js\";\nimport { Logger } from \"@adviser/cement\";\n\nfunction refLedger(u: HasCRDT | RefLedger): u is RefLedger {\n return !!(u as RefLedger).ledger;\n}\n\nexport function index<K extends IndexKeyType = string, T extends DocTypes = NonNullable<unknown>, R extends DocFragment = T>(\n refDb: HasLogger & HasSuperThis & (HasCRDT | RefLedger),\n name: string,\n mapFn?: MapFn<T>,\n meta?: IdxMeta,\n): Index<K, T, R> {\n const crdt = refLedger(refDb) ? refDb.ledger.crdt : refDb.crdt;\n\n if (mapFn && meta) throw refDb.logger.Error().Msg(\"cannot provide both mapFn and meta\").AsError();\n if (mapFn && mapFn.constructor.name !== \"Function\") throw refDb.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>(refDb.sthis, crdt, name, mapFn, meta);\n crdt.indexers.set(name, idx as unknown as Index<K, NonNullable<unknown>, NonNullable<unknown>>);\n }\n return crdt.indexers.get(name) as unknown as Index<K, T, R>;\n}\n\n// interface ByIdIndexIten<K extends IndexKeyType> {\n// readonly key: K;\n// readonly value: [K, K];\n// }\n\nexport class Index<K extends IndexKeyType, T extends DocTypes, R extends DocFragment = T> {\n readonly blockstore: BaseBlockstore;\n readonly crdt: CRDT;\n readonly name: string;\n mapFn?: MapFn<T>;\n mapFnString = \"\";\n byKey: IndexTree<K, R> = new IndexTree<K, R>();\n byId: IndexTree<K, R> = new IndexTree<K, R>();\n indexHead?: ClockHead;\n\n initError?: Error;\n\n ready(): Promise<void> {\n return Promise.all([this.blockstore.ready(), this.crdt.ready()]).then(() => {\n /* noop */\n });\n }\n\n // close(): Promise<void> {\n // return Promise.all([this.blockstore.close(), this.crdt.close()]).then(() => {\n // /* noop */\n // });\n // }\n // destroy(): Promise<void> {\n // return Promise.all([this.blockstore.destroy(), this.crdt.destroy()]).then(() => {\n // /* noop */\n // });\n // }\n\n readonly logger: Logger;\n\n constructor(sthis: SuperThis, crdt: CRDT, name: string, mapFn?: MapFn<T>, meta?: IdxMeta) {\n this.logger = ensureLogger(sthis, \"Index\");\n this.blockstore = crdt.indexBlockstore;\n this.crdt = crdt as CRDT;\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 let mapFnChanged = false;\n\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(`applying different mapFn meta: old mapFnString ${this.mapFnString} new mapFnString ${meta.map}`);\n this.mapFnString = meta.map;\n mapFnChanged = true;\n }\n // Always apply the metadata\n this.byId.cid = meta.byId;\n this.byKey.cid = meta.byKey;\n this.indexHead = meta.head;\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 this.logger.Warn().Msg(\"applying different mapFn, resetting index\");\n this.mapFn = mapFn;\n this.mapFnString = mapFn.toString();\n mapFnChanged = true;\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 this.logger\n .Warn()\n .Str(\"old mapFnString\", this.mapFnString)\n .Str(\"new mapFn\", mapFn.toString())\n .Msg(\"applying different mapFn, resetting index\");\n mapFnChanged = true;\n }\n } else {\n // we are first\n this.mapFnString = mapFn.toString();\n }\n this.mapFn = mapFn;\n }\n }\n\n // If the map function changed, reset the index for correctness\n if (mapFnChanged) {\n this._resetIndex();\n }\n } catch (e) {\n this.initError = e as Error;\n }\n }\n\n async query(opts: QueryOpts<K> = {}): Promise<IndexRows<K, T, R>> {\n this.logger.Debug().Msg(\"enter query\");\n await this.ready();\n // this._resetIndex();\n this.logger.Debug().Msg(\"post ready query\");\n await this._updateIndex();\n this.logger.Debug().Msg(\"post _updateIndex query\");\n await this._hydrateIndex();\n this.logger.Debug().Msg(\"post _hydrateIndex query\");\n if (!this.byKey.root) {\n return await applyQuery<K, T, R>(this.crdt, { result: [] }, opts);\n }\n if (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 this.logger.Debug().Msg(\"enter _updateIndex\");\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<T>());\n this.logger.Debug().Msg(\"enter crdt.allDocs\");\n } else {\n ({ result, head } = await this.crdt.changes<T>(this.indexHead));\n this.logger.Debug().Msg(\"enter crdt.changes\");\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 this.logger.Debug().Msg(\"pre this.blockstore.transaction\");\n const { meta } = await this.blockstore.transaction<IndexTransactionMeta>(async (tblocks): Promise<IndexTransactionMeta> => {\n this.byId = await bulkIndex<K, R, K>(\n this.logger,\n tblocks,\n this.byId,\n removeIdIndexEntries.concat(byIdIndexEntries),\n byIdOpts,\n );\n this.byKey = await bulkIndex<K, R, CompareKey>(\n this.logger,\n tblocks,\n this.byKey,\n staleKeyIndexEntries.concat(indexEntries),\n byKeyOpts,\n );\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 this.logger.Debug().Any(\"indexerMeta\", new Array(indexerMeta.indexes?.entries())).Msg(\"exit this.blockstore.transaction fn\");\n return indexerMeta as unknown as IndexTransactionMeta;\n });\n this.logger.Debug().Msg(\"post this.blockstore.transaction\");\n return meta;\n }\n}\n","import { Logger } from \"@adviser/cement\";\nimport { index } from \"./indexer.js\";\nimport type {\n ClockHead,\n MapFn,\n QueryOpts,\n ChangesOptions,\n DocSet,\n DocWithId,\n IndexKeyType,\n ListenerFn,\n DocResponse,\n BulkResponse,\n ChangesResponse,\n DocTypes,\n IndexRows,\n DocFragment,\n ChangesResponseRow,\n CRDTMeta,\n AllDocsQueryOpts,\n AllDocsResponse,\n SuperThis,\n Database,\n Ledger,\n Attachable,\n Attached,\n} from \"./types.js\";\nimport { ensureLogger, NotFoundError, makeName } from \"./utils.js\";\n\nexport function isDatabase(db: unknown): db is Database {\n return db instanceof DatabaseImpl;\n}\n\nexport class DatabaseImpl implements Database {\n onClosed(fn: () => void) {\n this.ledger.onClosed(fn);\n }\n close() {\n return this.ledger.close();\n }\n\n destroy() {\n return this.ledger.destroy();\n }\n\n ready(): Promise<void> {\n return this.ledger.ready();\n }\n\n readonly ledger: Ledger;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly id: string;\n\n constructor(ledger: Ledger) {\n this.sthis = ledger.sthis;\n this.ledger = ledger;\n this.id = ledger.id;\n this.logger = ensureLogger(this.sthis, \"Database\");\n }\n\n attach(a: Attachable): Promise<Attached> {\n return this.ledger.attach(a);\n }\n\n get name() {\n return this.ledger.name;\n }\n async get<T extends DocTypes>(id: string): Promise<DocWithId<T>> {\n if (!id) throw this.logger.Error().Str(\"db\", this.name).Msg(`Doc id is required`).AsError();\n\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"get\");\n try {\n const got = await this.ledger.crdt.get(id);\n if (!got) throw new NotFoundError(`Not found: ${id}`);\n const { doc } = got;\n return { ...(doc as unknown as DocWithId<T>), _id: id };\n } catch (e) {\n throw new NotFoundError(`Not found: ${id} - ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n async put<T extends DocTypes>(doc: DocSet<T>): Promise<DocResponse> {\n await this.ready();\n this.logger.Debug().Str(\"id\", doc._id).Msg(\"put\");\n const { _id, ...value } = doc;\n const docId = _id || this.sthis.timeOrderedNextId().str;\n const result = (await this.ledger.writeQueue.push({\n id: docId,\n value: {\n ...(value as unknown as DocSet<T>),\n _id: docId,\n },\n })) as CRDTMeta;\n return { id: docId, clock: result?.head, name: this.name } as DocResponse;\n }\n\n async bulk<T extends DocTypes>(docs: DocSet<T>[]): Promise<BulkResponse> {\n await this.ready();\n\n const updates = docs.map((doc) => {\n const id = doc._id || this.sthis.timeOrderedNextId().str;\n return {\n id,\n value: {\n ...(doc as unknown as DocSet<T>),\n _id: id,\n },\n };\n });\n const result = (await this.ledger.writeQueue.bulk(updates)) as CRDTMeta;\n return { ids: updates.map((u) => u.id), clock: result.head, name: this.name } as BulkResponse;\n }\n\n async del(id: string): Promise<DocResponse> {\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"del\");\n const result = (await this.ledger.writeQueue.push({ id: id, del: true })) as CRDTMeta;\n return { id, clock: result?.head, name: this.name } as DocResponse;\n }\n\n async remove(id: string): Promise<DocResponse> {\n return this.del(id);\n }\n\n async changes<T extends DocTypes>(since: ClockHead = [], opts: ChangesOptions = {}): Promise<ChangesResponse<T>> {\n await this.ready();\n this.logger.Debug().Any(\"since\", since).Any(\"opts\", opts).Msg(\"changes\");\n const { result, head } = await this.ledger.crdt.changes(since, opts);\n const rows: ChangesResponseRow<T>[] = result.map(({ id: key, value, del, clock }) => ({\n key,\n value: (del ? { _id: key, _deleted: true } : { _id: key, ...value }) as DocWithId<T>,\n clock,\n }));\n return { rows, clock: head, name: this.name };\n }\n\n async allDocs<T extends DocTypes>(opts: AllDocsQueryOpts = {}): Promise<AllDocsResponse<T>> {\n await this.ready();\n void opts;\n this.logger.Debug().Msg(\"allDocs\");\n const { result, head } = await this.ledger.crdt.allDocs();\n const rows = result.map(({ id: key, value, del }) => ({\n key,\n value: (del ? { _id: key, _deleted: true } : { _id: key, ...value }) as DocWithId<T>,\n }));\n return { rows, clock: head, name: this.name };\n }\n\n async allDocuments<T extends DocTypes>(): Promise<{\n rows: {\n key: string;\n value: DocWithId<T>;\n }[];\n clock: ClockHead;\n }> {\n return this.allDocs<T>();\n }\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void {\n return this.ledger.subscribe(listener, updates);\n }\n\n // todo if we add this onto dbs in fireproof.ts then we can make index.ts a separate package\n async query<K extends IndexKeyType, T extends DocTypes, R extends DocFragment = T>(\n field: string | MapFn<T>,\n opts: QueryOpts<K> = {},\n ): Promise<IndexRows<K, T, R>> {\n await this.ready();\n this.logger.Debug().Any(\"field\", field).Any(\"opts\", opts).Msg(\"query\");\n // const _crdt = this.ledger.crdt as unknown as CRDT<T>;\n const idx = typeof field === \"string\" ? index<K, T, R>(this, field) : index<K, T, R>(this, makeName(field.toString()), field);\n return await idx.query(opts);\n }\n\n async compact() {\n await this.ready();\n await this.ledger.crdt.compact();\n }\n}\n","import type { Block } from \"multiformats\";\nimport { Logger, ResolveOnce } from \"@adviser/cement\";\nimport { EncryptedBlockstore, type TransactionMeta, CompactFetcher, toStoreRuntime } from \"./blockstore/index.js\";\nimport {\n clockChangesSince,\n applyBulkUpdateToCrdt,\n getValueFromCrdt,\n readFiles,\n getAllEntries,\n clockVis,\n getBlock,\n doCompact,\n sanitizeDocumentFields,\n} from \"./crdt-helpers.js\";\nimport {\n type DocUpdate,\n type CRDTMeta,\n type ClockHead,\n type ChangesOptions,\n type DocValue,\n type IndexKeyType,\n type DocWithId,\n type Falsy,\n type SuperThis,\n type IndexTransactionMeta,\n type LedgerOpts,\n type BaseBlockstore,\n type CRDT,\n type CRDTClock,\n type CarTransaction,\n type DocTypes,\n PARAM,\n} from \"./types.js\";\nimport { index, type Index } from \"./indexer.js\";\n// import { blockstoreFactory } from \"./blockstore/transaction.js\";\nimport { ensureLogger } from \"./utils.js\";\nimport { CRDTClockImpl } from \"./crdt-clock.js\";\n\nexport class CRDTImpl implements CRDT {\n readonly opts: LedgerOpts;\n\n readonly blockstore: BaseBlockstore;\n readonly indexBlockstore: BaseBlockstore;\n readonly indexers = new Map<string, Index<IndexKeyType, NonNullable<unknown>>>();\n readonly clock: CRDTClock;\n\n readonly logger: Logger;\n readonly sthis: SuperThis;\n // self reference to fullfill HasCRDT\n readonly crdt: CRDT;\n\n constructor(sthis: SuperThis, opts: LedgerOpts) {\n this.sthis = sthis;\n this.crdt = this;\n this.logger = ensureLogger(sthis, \"CRDT\");\n this.opts = opts;\n this.blockstore = new EncryptedBlockstore(sthis, {\n applyMeta: async (meta: TransactionMeta) => {\n const crdtMeta = meta as CRDTMeta;\n if (!crdtMeta.head) throw this.logger.Error().Msg(\"missing head\").AsError();\n await this.clock.applyHead(crdtMeta.head, []);\n },\n compact: async (blocks: CompactFetcher) => {\n await doCompact(blocks, this.clock.head, this.logger);\n return { head: this.clock.head } as TransactionMeta;\n },\n gatewayInterceptor: opts.gatewayInterceptor,\n // autoCompact: this.opts.autoCompact || 100,\n storeRuntime: toStoreRuntime(this.sthis, this.opts.storeEnDe),\n storeUrls: this.opts.storeUrls.data,\n keyBag: this.opts.keyBag,\n // public: this.opts.public,\n meta: this.opts.meta,\n // threshold: this.opts.threshold,\n });\n this.indexBlockstore = new EncryptedBlockstore(sthis, {\n // name: opts.name,\n applyMeta: async (meta: TransactionMeta) => {\n const idxCarMeta = meta as IndexTransactionMeta;\n if (!idxCarMeta.indexes) throw this.logger.Error().Msg(\"missing indexes\").AsError();\n for (const [name, idx] of Object.entries(idxCarMeta.indexes)) {\n index(this, name, undefined, idx);\n }\n },\n gatewayInterceptor: opts.gatewayInterceptor,\n storeRuntime: toStoreRuntime(this.sthis, this.opts.storeEnDe),\n storeUrls: this.opts.storeUrls.idx,\n keyBag: this.opts.keyBag,\n // public: this.opts.public,\n });\n this.clock = new CRDTClockImpl(this.blockstore);\n this.clock.onZoom(() => {\n for (const idx of this.indexers.values()) {\n idx._resetIndex();\n }\n });\n }\n\n async bulk<T extends DocTypes>(updates: DocUpdate<T>[]): Promise<CRDTMeta> {\n await this.ready();\n updates = updates.map((dupdate: DocUpdate<T>) => ({\n ...dupdate,\n value: sanitizeDocumentFields(dupdate.value),\n }));\n\n if (this.clock.head.length === 0) {\n // INJECT GENESIS Block\n const value = { id: PARAM.GENESIS_CID, value: { _id: PARAM.GENESIS_CID } }; // satisfies DocUpdate<DocSet<DocTypes>>;\n // const block = await encode({ value, hasher: sha256, codec: dagCodec });\n await this._bulk([value]);\n }\n return await this._bulk(updates);\n }\n\n async _bulk<T extends DocTypes>(updates: DocUpdate<T>[]): Promise<CRDTMeta> {\n const prevHead = [...this.clock.head];\n const done = await this.blockstore.transaction<CRDTMeta>(async (blocks: CarTransaction): Promise<CRDTMeta> => {\n const { head } = await applyBulkUpdateToCrdt<DocTypes>(\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<DocTypes> });\n return dupdate;\n });\n return { head };\n });\n await this.clock.applyHead(done.meta.head, prevHead, updates);\n return done.meta;\n }\n\n readonly onceReady: ResolveOnce<void> = new ResolveOnce<void>();\n async ready(): Promise<void> {\n return this.onceReady.once(async () => {\n try {\n // console.log(\"bs-ready-pre\")\n // await this.blockstore.ready();\n // console.log(\"bs-ready-post-1\")\n // await this.indexBlockstore.ready();\n // console.log(\"bs-ready-post-2\")\n // await this.clock.ready();\n // console.log(\"bs-ready-post-3\")\n await Promise.all([this.blockstore.ready(), this.indexBlockstore.ready(), this.clock.ready()]);\n } catch (e) {\n throw this.logger.Error().Err(e).Msg(`CRDT is not ready`).AsError();\n }\n });\n }\n\n async close(): Promise<void> {\n // await this.blockstore.close();\n // await this.indexBlockstore.close();\n // await this.clock.close();\n await Promise.all([this.blockstore.close(), this.indexBlockstore.close(), this.clock.close()]);\n }\n\n async destroy(): Promise<void> {\n await Promise.all([this.blockstore.destroy(), this.indexBlockstore.destroy()]);\n }\n\n // if (snap) await this.clock.applyHead(crdtMeta.head, this.clock.head)\n\n async allDocs<T extends DocTypes>(): Promise<{ result: DocUpdate<T>[]; head: ClockHead }> {\n await this.ready();\n const result: DocUpdate<T>[] = [];\n for await (const entry of getAllEntries<DocTypes>(this.blockstore, this.clock.head, this.logger)) {\n result.push(entry as DocUpdate<T>);\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<DocTypes> | Falsy> {\n await this.ready();\n const result = await getValueFromCrdt<DocTypes>(this.blockstore, this.clock.head, key, this.logger);\n if (result.del) return undefined;\n return result;\n }\n\n async changes<T extends DocTypes>(\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","export * from \"./types.js\";\n\nexport * from \"./store-factory.js\";\nexport * from \"./serde-gateway.js\";\nexport * from \"./gateway.js\";\n\nexport * from \"./fp-envelope.js\";\n\nexport * from \"./store-factory.js\";\nexport * from \"./interceptor-gateway.js\";\n\nexport { createDbMetaEvent } from \"./store.js\";\n\nexport * from \"./register-store-protocol.js\";\n\nexport * from \"./attachable-store.js\";\n\nexport * from \"./task-manager.js\";\n\nexport * from \"./uri-interceptor.js\";\n\nexport {\n EncryptedBlockstore,\n BaseBlockstoreImpl,\n CompactionFetcher,\n type BlockFetcher,\n CarTransactionImpl,\n type CarTransactionOpts,\n} from \"./transaction.js\";\nexport { Loader } from \"./loader.js\";\nexport { parseCarFile } from \"./loader-helpers.js\";\n// export { ConnectionBase } from \"./connection-base.js\";\n// export { setCryptoKeyFromGatewayMetaPayload, addCryptoKeyToGatewayMetaPayload } from \"./meta-key-helper.js\";\n","import type { CID, Link, Version } from \"multiformats\";\nimport { Attachable, Attached, CarTransaction, DocFileMeta, Falsy, GatewayUrls, StoreType, SuperThis } from \"../types.js\";\nimport { BlockFetcher } from \"./transaction.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport { KeyBag, KeyBagRuntime, KeysItem } from \"../runtime/key-bag.js\";\nimport { CoerceURI, CryptoRuntime, CTCryptoKey, Future, Logger, Result, URI } from \"@adviser/cement\";\nimport { EventBlock } from \"@web3-storage/pail/clock\";\nimport { TaskManager, TaskManagerParams } from \"./task-manager.js\";\nimport { SerdeGateway, SerdeGatewayInterceptor } from \"./serde-gateway.js\";\nimport { Context } from \"../context.js\";\nimport { AsyncBlockCodec } from \"../runtime/wait-pr-multiformats/codec-interface.js\";\n\nexport type AnyLink = Link<unknown, number, number, Version>;\nexport type CarGroup = AnyLink[];\n// export type CarLog = CarGroup[];\n\nexport type FroozenCarLog = CarGroup[];\nexport class CarLog {\n readonly _logs: CarGroup[] = [];\n\n get length() {\n return this._logs.length;\n }\n last() {\n const x = [...this._logs[this._logs.length - 1]];\n Object.freeze(x);\n return x;\n }\n xunshift(logs: CarGroup) {\n // console.log(\n // \"CarLog-unshift\",\n // logs.map((l) => l.toString()),\n // );\n this._logs.unshift(logs);\n }\n update(logs: FroozenCarLog) {\n // console.log(\n // \"CarLog-update\",\n // logs.map((l) => l.map((l) => l.toString())),\n // );\n this._logs.length = 0;\n this._logs.push(...logs);\n }\n asArray(): FroozenCarLog {\n // in production it should be\n // return this._logs\n\n const a = [\n ...this._logs.map((l) => {\n const x = [...l];\n Object.freeze(x);\n return x;\n }),\n ];\n Object.freeze(a);\n return a;\n }\n}\nexport type AnyAnyLink = Link<unknown, number, number, Version>;\n\nexport type AnyLinkFn = (cid: AnyLink) => Promise<AnyBlock | undefined>;\n\nexport interface AnyBlock {\n readonly cid: Link<unknown, number, number, Version>;\n readonly bytes: Uint8Array;\n}\n\nexport interface CIDBlock {\n readonly cid: CID<unknown, number, number, Version>;\n readonly bytes: Uint8Array;\n}\n\nexport function toCIDBlock(block: AnyBlock): CIDBlock {\n return block as CIDBlock;\n}\nexport interface AnyAnyBlock {\n readonly cid: AnyAnyLink;\n readonly bytes: Uint8Array;\n}\n\n// export interface EncryptOpts {\n// readonly key: ArrayBuffer;\n// readonly cid: AnyLink;\n// readonly bytes: Uint8Array;\n// }\n\nexport interface IvKeyIdData {\n readonly iv: Uint8Array;\n readonly keyId: Uint8Array;\n readonly data: Uint8Array;\n}\n\nexport interface IvAndKeyAndBytes {\n readonly bytes: Uint8Array;\n readonly key: CTCryptoKey;\n readonly iv: Uint8Array;\n}\n\nexport interface BytesAndKeyWithIv {\n readonly bytes: Uint8Array;\n readonly key: CTCryptoKey;\n readonly iv?: Uint8Array;\n}\n\n// export interface DecryptOpts {\n// readonly key: ArrayBuffer;\n// readonly value: IvAndBytes;\n// }\n\nexport interface AnyDecodedBlock {\n readonly cid: AnyLink;\n readonly bytes: Uint8Array;\n readonly value: Uint8Array;\n}\n\nexport interface CarMakeable {\n entries(): AsyncIterable<AnyBlock>;\n get(cid: AnyLink): Promise<AnyBlock | undefined>;\n}\n\nexport interface CarHeader<T> {\n readonly cars: FroozenCarLog;\n readonly compact: FroozenCarLog;\n readonly meta: T;\n}\n\n// type NestedData =\n// | Uint8Array\n// | string\n// | number\n// | boolean\n// | undefined\n// | null\n// | AnyLink\n// | NestedData[]\n// | { [key: string]: NestedData };\n\nexport interface TransactionWrapper<M extends TransactionMeta> {\n meta: M;\n cars?: CarGroup;\n t: CarTransaction;\n}\n\nexport type TransactionMeta = unknown;\n//CRDTMeta | IndexTransactionMeta | FileTransactionMeta;\n\n// export interface MakeCodecCrypto {\n// subtle: {\n// decrypt: (algo: { name: string; iv: Uint8Array; tagLength: number }, key: CryptoKey, data: Uint8Array) => Promise<ArrayBuffer>;\n// encrypt: (algo: { name: string; iv: Uint8Array; tagLength: number }, key: CryptoKey, data: Uint8Array) => Promise<ArrayBuffer>;\n// };\n// }\n\n// an implementation of this Interface contains the keymaterial\n// so that the fp-core can use the decrypt and encrypt without knowing the key\nexport interface EncryptedBlock {\n readonly value: IvAndKeyAndBytes;\n}\n\nexport interface KeyMaterial {\n readonly key: Uint8Array;\n readonly keyStr: string;\n}\n\nexport interface KeyWithFingerPrint {\n readonly fingerPrint: string;\n readonly key: CTCryptoKey;\n extract(): Promise<KeyMaterial>;\n}\n\n// export interface KeyWithFingerExtract extends KeyWithFingerPrint {\n// }\n\nexport interface CodecOpts {\n readonly ivCalc: \"random\" | \"hash\";\n readonly noIVVerify: boolean;\n}\n\nexport interface KeyUpsertResult {\n readonly modified: boolean;\n readonly kfp: KeyWithFingerPrint;\n}\n\nexport interface KeysByFingerprint {\n readonly id: string;\n readonly name: string;\n get(fingerPrint?: Uint8Array | string): Promise<KeyWithFingerPrint | undefined>;\n upsert(key: string | Uint8Array, def?: boolean): Promise<Result<KeyUpsertResult>>;\n asKeysItem(): Promise<KeysItem>;\n}\n\nexport interface CryptoAction {\n readonly ivLength: number; // in bytes only 12 and 16 are allowed\n readonly logger: Logger;\n readonly crypto: CryptoRuntime;\n readonly url: URI;\n readonly key: KeysByFingerprint;\n // readonly codec: BlockCodec<number, IvAndBytes>;\n // readonly isEncrypting: boolean;\n // keyByFingerPrint(id: Uint8Array | string): Promise<Result<KeyWithFingerPrint>>;\n // fingerPrint(): Promise<string>;\n\n algo(iv?: Uint8Array): { name: string; iv: Uint8Array; tagLength: number };\n codec(iv?: Uint8Array, codecOpts?: Partial<CodecOpts>): AsyncBlockCodec<24, Uint8Array, IvKeyIdData>;\n _decrypt(data: IvAndKeyAndBytes): Promise<Uint8Array>;\n _encrypt(data: BytesAndKeyWithIv): Promise<Uint8Array>;\n // encode(data: Uint8Array): Promise<Uint8Array>;\n // decode(bytes: Uint8Array | ArrayBuffer): Promise<Uint8Array>;\n}\n\n// export interface BlobLike {\n// /**\n// * Returns a ReadableStream which yields the Blob data.\n// */\n// stream: () => ReadableStream;\n// }\n\nexport interface StoreFactory {\n // makeMetaStore?: (loader: Loadable) => Promise<MetaStore>;\n // makeDataStore?: (loader: Loadable) => Promise<DataStore>;\n // makeWALStore?: (loader: Loadable) => Promise<WALStore>;\n\n encodeFile?: (blob: Blob) => Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n decodeFile?: (blocks: unknown, cid: AnyLink, meta: DocFileMeta) => Promise<File>;\n}\n\nexport interface StoreUrls {\n // string means local storage\n // URL means schema selects the storeType\n // readonly base: CoerceURI;\n readonly meta: CoerceURI;\n readonly car: CoerceURI;\n readonly file: CoerceURI;\n // readonly index: CoerceURI;\n readonly wal: CoerceURI;\n}\n\n// export interface StoreUrlBaseOpts {\n// readonly base?: CoerceURI;\n// readonly data?: Partial<StoreUrls>\n// readonly idx?: Partial<StoreUrls>\n// }\n\nexport interface StoreEnDeFile {\n readonly encodeFile: (blob: Blob) => Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n readonly decodeFile: (blocks: unknown, cid: AnyLink, meta: DocFileMeta) => Promise<Result<File>>;\n}\n\nexport interface StoreUrlsOpts {\n // readonly urls?: StoreUrlBaseOpts;\n // readonly func?: StoreFactory;\n readonly base?: CoerceURI;\n readonly data?: Partial<StoreUrls>;\n readonly idx?: Partial<StoreUrls>;\n}\n\nexport interface StoreURIs {\n readonly meta: URI;\n readonly car: URI;\n readonly file: URI;\n readonly wal: URI;\n}\n\nexport interface StoreURIRuntime {\n readonly data: StoreURIs;\n readonly idx: StoreURIs;\n}\n\nexport interface UrlAndInterceptor {\n readonly url: URI;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n}\nexport interface StoreFactoryItem {\n // readonly sthis: SuperThis;\n readonly byStore: GatewayUrls;\n // readonly keybag: KeyBag;\n readonly loader: Loadable;\n}\n\nexport interface StoreRuntime {\n // readonly isIndex?: string; // index prefix\n //xx readonly stores: Partial<Stores>;\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 ledger connection\n // for all stores a refcount on close() should be used\n // makeMetaStore(sfi: StoreFactoryItem): Promise<MetaStore>;\n // makeDataStore(sfi: StoreFactoryItem): Promise<DataStore>;\n // makeWALStore(sfi: StoreFactoryItem): Promise<WALStore>;\n\n makeStores(sfi: StoreFactoryItem): Promise<DataAndMetaAndWalStore>;\n\n encodeFile(blob: Blob): Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<Result<File>>;\n}\n\nexport interface CommitOpts {\n readonly noLoader?: boolean;\n readonly compact?: boolean;\n // readonly public?: boolean;\n}\n\n// export interface DbMetaWithSource extends DbMeta {\n// readonly srcUrls: {\n// readonly car: string\n// readonly file: string\n// readonly meta: string\n// readonly local?: string\n// }[]\n// }\n\nexport interface WriteableDataAndMetaStore {\n file: FileStore;\n car: CarStore;\n meta: MetaStore;\n}\n\nexport type DataAndMetaStore = Readonly<WriteableDataAndMetaStore>;\n\nexport interface WriteableDataAndMetaAndWalStore extends WriteableDataAndMetaStore {\n wal?: WALStore;\n}\n\nexport type DataAndMetaAndWalStore = Readonly<WriteableDataAndMetaAndWalStore>;\n\nexport type LocalDataAndMetaAndWalStore = Readonly<Omit<WriteableDataAndMetaAndWalStore, \"wal\">> & { readonly wal: WALStore };\n\n// export interface DbMetaLocalRemoteStores extends DbMeta {\n// readonly store: {\n// readonly local: DataAndMetaStore;\n// readonly remotes: DataAndMetaStore[];\n// };\n// }\n\nexport interface DbMeta {\n readonly cars: CarGroup;\n // key?: string;\n}\n\n// export interface UploadMetaFnParams {\n// readonly name: string;\n// readonly branch: string;\n// }\n\n// export type FnParamTypes = \"data\" | \"file\";\n\n// export interface UploadDataFnParams {\n// readonly type: FnParamTypes;\n// readonly name: string;\n// readonly car: string;\n// readonly size: string;\n// }\n\n// export interface DownloadDataFnParams {\n// readonly type: FnParamTypes;\n// readonly name: string;\n// readonly car: string;\n// }\n\n// export interface DownloadMetaFnParams {\n// readonly name: string;\n// readonly branch: string;\n// }\n\nexport type LoadHandler = (dbMetas: DbMeta[]) => Promise<void>;\n\nexport interface RefLoadable {\n readonly loader: Loadable;\n}\nexport interface RefBlockstore {\n readonly blockstore: RefLoadable;\n}\n\nexport interface Connection {\n // readonly loader?: Loadable;\n // connectMeta(ref: RefLoadable | RefBlockstore): void;\n\n // this indicates if a store is completely loaded from a peer\n loaded(): Future<void>;\n readonly context: Context;\n connectStorage(ref: RefLoadable | RefBlockstore): void;\n\n // metaUpload(bytes: Uint8Array, params: UploadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n // dataUpload(bytes: Uint8Array, params: UploadDataFnParams, opts?: { public?: boolean }): Promise<void>;\n // metaDownload(params: DownloadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n // dataDownload(params: DownloadDataFnParams): Promise<Uint8Array | Falsy>;\n}\n\nexport interface BaseStore {\n readonly storeType: StoreType;\n readonly realGateway: SerdeGateway;\n readonly logger: Logger;\n // readonly url: URI\n url(): URI;\n // readonly name: string;\n // onStarted(fn: () => void): void;\n // onClosed(fn: () => void): void;\n\n keyedCrypto(): Promise<CryptoAction>;\n\n close(): Promise<Result<void>>;\n destroy(): Promise<Result<void>>;\n readonly ready?: () => Promise<void>;\n start(dam: DataAndMetaStore): Promise<Result<URI>>;\n}\n\nexport interface DbMetaEvent {\n readonly eventCid: CarClockLink;\n readonly parents: CarClockHead;\n readonly dbMeta: DbMeta;\n}\n\nexport function DbMetaEventEqual(a: DbMetaEvent, b: DbMetaEvent): boolean {\n return (\n a.eventCid.equals(b.eventCid) &&\n a.parents.length === b.parents.length &&\n a.parents.every((p, i) => p.equals(b.parents[i])) &&\n a.dbMeta.cars.length === b.dbMeta.cars.length &&\n a.dbMeta.cars.every((c, i) => c.equals(b.dbMeta.cars[i]))\n );\n}\n\nexport function DbMetaEventsEqual(a: DbMetaEvent[], b: DbMetaEvent[]): boolean {\n return a.length === b.length && a.every((e, i) => DbMetaEventEqual(e, b[i]));\n}\n\nexport interface MetaStore extends BaseStore {\n readonly storeType: \"meta\";\n load(branch?: string): Promise<DbMeta[] | Falsy>;\n // branch is defaulted to \"main\"\n save(meta: DbMeta, branch?: string): Promise<Result<void>>;\n // onLoad(branch: string, loadHandler: LoadHandler): () => void;\n // handleByteHeads(byteHeads: Uint8Array, branch?: string): Promise<DbMetaEvent[]>;\n}\n\n// export interface RemoteMetaStore extends MetaStore {\n// }\n\nexport interface DataSaveOpts {\n readonly public: boolean;\n}\n\nexport interface CarStore extends BaseStore {\n readonly storeType: \"car\";\n load(cid: AnyLink): Promise<AnyBlock>;\n save(car: AnyBlock, opts?: DataSaveOpts): Promise</*AnyLink | */ void>;\n remove(cid: AnyLink): Promise<Result<void>>;\n}\n\nexport interface FileStore extends BaseStore {\n readonly storeType: \"file\";\n load(cid: AnyLink): Promise<AnyBlock>;\n save(car: AnyBlock, opts?: DataSaveOpts): Promise</*AnyLink | */ void>;\n remove(cid: AnyLink): Promise<Result<void>>;\n}\n\nexport interface WALState {\n readonly operations: DbMeta[];\n readonly noLoaderOps: DbMeta[];\n readonly fileOperations: {\n readonly cid: AnyLink;\n readonly public: boolean;\n }[];\n}\n\nexport interface WALStore extends BaseStore {\n readonly storeType: \"wal\";\n ready(): Promise<void>;\n readonly processing?: Promise<void> | undefined;\n readonly processQueue: CommitQueue<void>;\n\n process(): Promise<void>;\n enqueue(dbMeta: DbMeta, opts: CommitOpts): Promise<void>;\n enqueueFile(fileCid: AnyLink /*, publicFile?: boolean*/): Promise<void>;\n load(): Promise<WALState | Falsy>;\n save(state: WALState): Promise<void>;\n}\n\nexport type CompactFetcher = BlockFetcher & {\n readonly loggedBlocks: CarTransaction;\n};\nexport type CompactFn = (blocks: CompactFetcher) => Promise<TransactionMeta>;\n\nexport interface StoreRuntimeUrls {\n readonly meta: URI;\n readonly data: URI;\n readonly wal: URI;\n}\n\nexport interface BlockstoreParams {\n readonly logger: Logger;\n readonly applyMeta: (meta: TransactionMeta, snap?: boolean) => Promise<void>;\n readonly compact: CompactFn;\n readonly autoCompact: number;\n readonly crypto: CryptoRuntime;\n readonly public: boolean;\n readonly meta: DbMeta;\n readonly threshold: number;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n readonly storeEnDeFile: Partial<StoreEnDeFile>;\n readonly keyBag: KeyBagRuntime;\n readonly storeUrls: StoreURIs;\n readonly storeRuntime: StoreRuntime;\n readonly taskManager: TaskManagerParams;\n}\n\nexport type BlockstoreOpts = Partial<BlockstoreParams> & {\n readonly keyBag: KeyBagRuntime;\n readonly storeUrls: StoreURIs;\n readonly storeRuntime: StoreRuntime;\n};\n\nexport interface BlockstoreRuntime {\n readonly logger: Logger;\n readonly applyMeta: (meta: TransactionMeta, snap?: boolean) => Promise<void>;\n readonly compact: CompactFn;\n readonly autoCompact: number;\n readonly crypto: CryptoRuntime;\n readonly storeRuntime: StoreRuntime;\n readonly keyBag: KeyBagRuntime;\n readonly storeUrls: StoreURIs;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n readonly taskManager: TaskManagerParams;\n // readonly storeEnDeFile: StoreEnDeFile;\n // readonly public: boolean;\n readonly meta?: DbMeta;\n // readonly name?: string;\n readonly threshold: number;\n}\n\nexport type LocalActiveStore = Omit<ActiveStore, \"active\"> & { readonly active: LocalDataAndMetaAndWalStore };\nexport interface AttachedStores {\n // fileStore(): Promise<DataStore>;\n // carStore(): Promise<DataStore>;\n // metaStore(): Promise<MetaStore>;\n\n local(): LocalActiveStore;\n forRemotes(actionFn: (store: ActiveStore) => Promise<unknown>): Promise<void>;\n remotes(): ActiveStore[];\n activate(store: DataAndMetaStore | CoerceURI): ActiveStore;\n attach(attached: Attachable): Promise<Attached>;\n detach(): Promise<void>;\n}\n\nexport interface BaseAttachedStores {\n local(): BaseStore;\n // without local and active\n remotes(): BaseStore[];\n}\n\nexport interface CarAttachedStores extends BaseAttachedStores {\n local(): CarStore;\n // without local and active\n remotes(): CarStore[];\n}\n\nexport abstract class BaseActiveStore {\n abstract readonly ref: ActiveStore;\n abstract readonly active: BaseStore;\n\n // readonly local: ActiveStore;\n // readonly remotes: ActiveStore[];\n\n abstract local(): BaseStore;\n abstract remotes(): BaseStore[];\n\n protected abstract readonly xattached: BaseAttachedStores;\n}\n\n// export abstract class CarActiveStore extends BaseActiveStore {\n// readonly ref: ActiveStore;\n// readonly active: CarStore;\n// readonly xattached: CarAttachedStores;\n// }\n\nexport interface FileAttachedStores extends BaseAttachedStores {\n local(): FileStore;\n // without local and active\n remotes(): FileStore[];\n}\n\nexport abstract class CarActiveStore extends BaseActiveStore {\n // readonly ref: ActiveStore;\n // readonly active: CarStore;\n protected abstract readonly xattached: CarAttachedStores;\n abstract local(): CarStore;\n abstract remotes(): CarStore[];\n}\n\nexport abstract class FileActiveStore extends BaseActiveStore {\n // readonly ref: ActiveStore;\n // readonly active: FileStore;\n protected abstract readonly xattached: FileAttachedStores;\n abstract local(): FileStore;\n abstract remotes(): FileStore[];\n}\n\nexport type CIDActiveStore = CarActiveStore | FileActiveStore;\n\nexport interface MetaAttachedStores extends BaseAttachedStores {\n local(): MetaStore;\n remotes(): MetaStore[];\n}\n\nexport abstract class MetaActiveStore extends BaseActiveStore {\n // readonly ref: ActiveStore;\n // readonly active: MetaStore;\n protected abstract readonly xattached: MetaAttachedStores;\n abstract local(): MetaStore;\n abstract remotes(): MetaStore[];\n}\n\nexport interface WALAttachedStores extends BaseAttachedStores {\n local(): WALStore;\n remotes(): WALStore[];\n}\n\nexport abstract class WALActiveStore extends BaseActiveStore {\n // readonly ref: ActiveStore;\n // readonly active: WALStore;\n protected abstract readonly xattached: WALAttachedStores;\n abstract local(): WALStore;\n abstract remotes(): WALStore[];\n}\n\nexport interface ActiveStore {\n readonly active: DataAndMetaAndWalStore;\n baseStores(): BaseStore[];\n carStore(): CarActiveStore;\n fileStore(): FileActiveStore;\n metaStore(): MetaActiveStore;\n walStore(): WALActiveStore;\n\n local(): LocalActiveStore;\n remotes(): ActiveStore[];\n\n readonly xattached: AttachedStores;\n}\n\nexport interface CarCacheItem {\n readonly type: \"car\" | \"block\";\n readonly cid: AnyLink;\n readonly blocks: AnyBlock[];\n readonly roots: CID[];\n}\n\nexport interface Loadable {\n // readonly name: string; // = \"\";\n readonly sthis: SuperThis;\n readonly ebOpts: BlockstoreRuntime;\n readonly carLog: CarLog;\n\n // xremoteMetaStore?: MetaStore;\n // xremoteFileStore?: DataStore;\n // xremoteCarStore?: DataStore;\n\n readonly attachedStores: AttachedStores;\n\n attach(attached: Attachable): Promise<Attached>;\n\n readonly taskManager: TaskManager;\n\n ready(): Promise<void>;\n close(): Promise<void>;\n\n keyBag(): Promise<KeyBag>;\n // metaStore(): Promise<MetaStore>;\n // fileStore(): Promise<DataStore>;\n // WALStore(): Promise<WALStore>;\n // carStore(): Promise<DataStore>;\n\n handleDbMetasFromStore(metas: DbMeta[], store: ActiveStore): Promise<void>;\n\n commit<T = TransactionMeta>(t: CarTransaction, done: T, opts: CommitOpts): Promise<CarGroup>;\n destroy(): Promise<void>;\n getBlock(cid: AnyLink, store: ActiveStore): Promise<AnyBlock | Falsy>;\n loadFileCar(cid: AnyLink /*, isPublic = false*/, store: ActiveStore): Promise<CarCacheItem>;\n loadCar(cid: AnyLink, store: ActiveStore): Promise<CarCacheItem>;\n commitFiles(\n t: CarTransaction,\n done: TransactionMeta /* opts: CommitOpts = { noLoader: false, compact: false } */,\n ): Promise<CarGroup>;\n entries(cache?: boolean): AsyncIterableIterator<AnyBlock>;\n}\n\nexport interface DbMetaBinary {\n readonly dbMeta: Uint8Array;\n}\nexport type DbMetaEventBlock = EventBlock<DbMetaBinary>;\nexport type CarClockLink = Link<DbMetaEventBlock, number, number, Version>;\nexport type CarClockHead = CarClockLink[];\n","import { Logger, URI, Result } from \"@adviser/cement\";\n\nimport { decodeFile, encodeFile } from \"../runtime/files.js\";\nimport { CarStoreImpl, FileStoreImpl, MetaStoreImpl, WALStoreImpl } from \"./store.js\";\nimport {\n BaseStore,\n CarStore,\n DataAndMetaAndWalStore,\n FileStore,\n StoreEnDeFile,\n StoreFactoryItem,\n StoreRuntime,\n UrlAndInterceptor,\n WriteableDataAndMetaAndWalStore,\n} from \"./types.js\";\nimport { PARAM, SuperThis } from \"../types.js\";\nimport { getGatewayFactoryItem } from \"./register-store-protocol.js\";\nimport { SerdeGatewayCtx, SerdeGatewayInterceptor } from \"./serde-gateway.js\";\nimport { InterceptorGateway } from \"./interceptor-gateway.js\";\n\n// interface SerdeGatewayInstances {\n// readonly gateway: InterceptorGateway;\n// }\n// interface GatewayReady extends SerdeGatewayInstances {\n// // readonly url: URI;\n// }\n\nexport async function getInterceptableGateway(\n ctx: SerdeGatewayCtx,\n url: URI,\n opt: { gatewayInterceptor?: SerdeGatewayInterceptor },\n): Promise<Result<InterceptorGateway>> {\n const item = getGatewayFactoryItem(url.protocol);\n if (item) {\n return Result.Ok(new InterceptorGateway(ctx.loader.sthis, await item.serdegateway(ctx.loader.sthis), opt.gatewayInterceptor));\n }\n return Result.Err(ctx.loader.sthis.logger.Warn().Url(url).Msg(\"unsupported protocol\").AsError());\n}\n\nasync function carStoreFactory(ctx: SerdeGatewayCtx, uai: UrlAndInterceptor): Promise<CarStore> {\n const storeUrl = uai.url.build().setParam(PARAM.STORE, \"car\").URI();\n const rgateway = await getInterceptableGateway(ctx, storeUrl, uai);\n if (rgateway.isErr()) {\n throw ctx.loader.sthis.logger.Error().Result(\"err\", rgateway).Url(uai.url).Msg(\"notfound\").AsError();\n }\n const gateway = rgateway.Ok();\n const store = new CarStoreImpl(ctx.loader.sthis, uai.url, {\n gateway,\n loader: ctx.loader,\n });\n return store;\n}\n\nasync function fileStoreFactory(ctx: SerdeGatewayCtx, uai: UrlAndInterceptor): Promise<FileStore> {\n const storeUrl = uai.url.build().setParam(PARAM.STORE, \"file\").URI();\n const rgateway = await getInterceptableGateway(ctx, storeUrl, uai);\n if (rgateway.isErr()) {\n throw ctx.loader.sthis.logger.Error().Result(\"err\", rgateway).Url(uai.url).Msg(\"notfound\").AsError();\n }\n const gateway = rgateway.Ok();\n const store = new FileStoreImpl(ctx.loader.sthis, uai.url, {\n gateway: gateway,\n loader: ctx.loader,\n });\n return store;\n}\n\n// const onceLoadMetaGateway = new KeyedResolvOnce<Gateway>();\n// function loadMetaGateway(url: URI, logger: Logger) {\n// return onceLoadMetaGateway.get(url.protocol).once(async () => {\n// return await getGatewayFromURL(url, logger).then((item) => {\n// if (!item) {\n// throw logger.Error().Url(url).Msg(\"unsupported protocol or store\").AsError();\n// }\n// return item;\n// });\n// });\n// }\n\n// const onceMetaStoreFactory = new KeyedResolvOnce<MetaStoreImpl>();\nasync function metaStoreFactory(ctx: SerdeGatewayCtx, uai: UrlAndInterceptor): Promise<MetaStoreImpl> {\n const storeUrl = uai.url.build().setParam(PARAM.STORE, \"meta\").URI();\n const rgateway = await getInterceptableGateway(ctx, storeUrl, uai);\n if (rgateway.isErr()) {\n throw ctx.loader.sthis.logger.Error().Result(\"err\", rgateway).Url(uai.url).Msg(\"notfound\").AsError();\n }\n const gateway = rgateway.Ok();\n const store = new MetaStoreImpl(ctx.loader.sthis, uai.url, {\n gateway,\n loader: ctx.loader,\n });\n return store;\n}\n\n// const onceWalGateway = new KeyedResolvOnce<Gateway>();\n// function loadWalGateway(url: URI, logger: Logger) {\n// return onceWalGateway.get(url.protocol).once(async () => {\n// return await getGatewayFromURL(url, logger).then((item) => {\n// if (!item) {\n// throw logger.Error().Url(url).Msg(\"unsupported protocol or store\").AsError();\n// }\n// return item;\n// });\n// });\n// }\n\n// const onceRemoteWalFactory = new KeyedResolvOnce<WALStoreImpl>();\nasync function WALStoreFactory(ctx: SerdeGatewayCtx, uai: UrlAndInterceptor): Promise<WALStoreImpl> {\n const storeUrl = uai.url.build().setParam(PARAM.STORE, \"wal\").URI();\n const rgateway = await getInterceptableGateway(ctx, storeUrl, uai);\n if (rgateway.isErr()) {\n throw ctx.loader.sthis.logger.Error().Result(\"err\", rgateway).Url(uai.url).Msg(\"notfound\").AsError();\n }\n const gateway = rgateway.Ok();\n const store = new WALStoreImpl(ctx.loader.sthis, uai.url, {\n gateway,\n loader: ctx.loader,\n });\n return store;\n}\n\nasync function ensureStart<T extends Pick<BaseStore, \"start\"> & { logger: Logger }>(\n store: T,\n damaw: DataAndMetaAndWalStore,\n): Promise<T> {\n const ret = await store.start(damaw);\n if (ret.isErr()) {\n throw store.logger.Error().Result(\"start\", ret).Msg(\"start failed\").AsError();\n }\n store.logger.Debug().Url(ret.Ok(), \"prepared\").Msg(\"produced\");\n return store;\n}\n\nexport function ensureStoreEnDeFile(ende?: Partial<StoreEnDeFile>): StoreEnDeFile {\n ende = ende || {};\n return {\n encodeFile: ende.encodeFile || encodeFile,\n decodeFile: ende.decodeFile || decodeFile,\n };\n}\n\nexport function toStoreRuntime(sthis: SuperThis, endeOpts: Partial<StoreEnDeFile> = {}): StoreRuntime {\n // const logger = ensureLogger(sthis, \"toStoreRuntime\", {});\n return {\n makeStores: async (sfi: StoreFactoryItem) => {\n const ctx: SerdeGatewayCtx = {\n loader: sfi.loader,\n };\n const storeSet: WriteableDataAndMetaAndWalStore = {} as DataAndMetaAndWalStore;\n storeSet.meta = await metaStoreFactory(ctx, sfi.byStore.meta);\n storeSet.car = await carStoreFactory(ctx, sfi.byStore.car);\n storeSet.file = await fileStoreFactory(ctx, sfi.byStore.file);\n if (sfi.byStore.wal) {\n storeSet.wal = await WALStoreFactory(ctx, sfi.byStore.wal);\n }\n\n await ensureStart(storeSet.meta, storeSet);\n await ensureStart(storeSet.car, storeSet);\n await ensureStart(storeSet.file, storeSet);\n if (storeSet.wal) {\n await ensureStart(storeSet.wal, storeSet);\n }\n\n return storeSet;\n },\n\n // makeMetaStore: async (sfi: StoreFactoryItem) => ensureStart(await metaStoreFactory(sfi)),\n // makeDataStore: async (sfi: StoreFactoryItem) => ensureStart(await dataStoreFactory(sfi)),\n // makeWALStore: async (sfi: StoreFactoryItem) => ensureStart(await WALStoreFactory(sfi)),\n\n ...ensureStoreEnDeFile(endeOpts),\n };\n}\n","import { exception2Result, Logger, ResolveOnce, Result, URI } from \"@adviser/cement\";\nimport type {\n AnyBlock,\n AnyLink,\n CommitOpts,\n DataSaveOpts,\n DbMeta,\n WALStore as WALStore,\n WALState,\n LoadHandler,\n CryptoAction,\n Loadable,\n CarClockHead,\n DbMetaBinary,\n CarClockLink,\n DbMetaEvent,\n MetaStore,\n DataAndMetaStore,\n CarStore,\n FileStore,\n} from \"./types.js\";\nimport { Falsy, PARAM, StoreType, SuperThis } from \"../types.js\";\nimport { SerdeGateway, SerdeGatewayInterceptor } from \"./serde-gateway.js\";\nimport { ensureLogger, inplaceFilter, isNotFoundError } from \"../utils.js\";\nimport { carLogIncludesGroup } from \"./loader.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport { keyedCryptoFactory } from \"../runtime/keyed-crypto.js\";\nimport { Car2FPMsg, File2FPMsg, FPEnvelopeCar, FPEnvelopeFile, FPEnvelopeMeta, FPEnvelopeWAL } from \"./fp-envelope.js\";\nimport { EventView } from \"@web3-storage/pail/clock/api\";\nimport { EventBlock } from \"@web3-storage/pail/clock\";\nimport { format } from \"@ipld/dag-json\";\n// import { createDbMetaEventBlock } from \"./meta-key-helper.js\";\nimport pRetry from \"p-retry\";\nimport pMap from \"p-map\";\nimport { Link } from \"multiformats\";\nimport { InterceptorGateway } from \"./interceptor-gateway.js\";\n\nfunction guardVersion(url: URI): Result<URI> {\n if (!url.hasParam(\"version\")) {\n return Result.Err(`missing version: ${url.toString()}`);\n }\n return Result.Ok(url);\n}\n\nexport interface StoreOpts {\n readonly gateway: SerdeGateway;\n // readonly keybag: KeyBag;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n readonly loader: Loadable;\n}\n\nexport interface BaseStoreOpts {\n readonly gateway: InterceptorGateway;\n readonly loader: Loadable;\n}\n\nexport abstract class BaseStoreImpl {\n // should be injectable\n\n abstract readonly storeType: StoreType;\n // readonly name: string;\n\n private _url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly gateway: InterceptorGateway;\n get realGateway(): SerdeGateway {\n return this.gateway.innerGW;\n }\n // readonly keybag: KeyBag;\n readonly opts: StoreOpts;\n readonly loader: Loadable;\n // readonly loader: Loadable;\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts, logger: Logger) {\n // this.name = name;\n this._url = url;\n this.opts = opts;\n // this.keybag = opts.keybag;\n this.loader = opts.loader;\n this.sthis = sthis;\n const name = this._url.getParam(PARAM.NAME);\n if (!name) {\n throw logger.Error().Url(this._url).Msg(\"missing name\").AsError();\n }\n this.logger = logger\n .With()\n .Str(\"this\", this.sthis.nextId().str)\n .Ref(\"url\", () => this._url.toString())\n // .Str(\"name\", name)\n .Logger();\n // this.realGateway = opts.gateway;\n this.gateway = opts.gateway;\n }\n\n url(): URI {\n return this._url;\n }\n\n readonly _onStarted: ((dam: DataAndMetaStore) => void)[] = [];\n onStarted(fn: (dam: DataAndMetaStore) => void) {\n this._onStarted.push(fn);\n }\n readonly _onClosed: (() => void)[] = [];\n onClosed(fn: () => void) {\n this._onClosed.push(fn);\n }\n abstract close(): Promise<Result<void>>;\n\n async ready() {\n return;\n }\n\n async keyedCrypto(): Promise<CryptoAction> {\n return keyedCryptoFactory(this._url, await this.loader.keyBag(), this.sthis);\n }\n\n async start(dam: DataAndMetaStore): Promise<Result<URI>> {\n this.logger.Debug().Str(\"storeType\", this.storeType).Msg(\"starting-gateway-pre\");\n this._url = this._url.build().setParam(PARAM.STORE, this.storeType).URI();\n const res = await this.gateway.start({ loader: this.loader }, this._url);\n if (res.isErr()) {\n this.logger.Error().Result(\"gw-start\", res).Msg(\"started-gateway\");\n return res as Result<URI>;\n }\n this._url = res.Ok();\n\n // add storekey to url\n const kb = await this.loader.keyBag();\n const skRes = await kb.ensureKeyFromUrl(this._url, () => {\n const key = this._url.getParam(PARAM.KEY);\n return key as string;\n });\n\n if (skRes.isErr()) {\n return skRes as Result<URI>;\n }\n this._url = skRes.Ok();\n const version = guardVersion(this._url);\n if (version.isErr()) {\n this.logger.Error().Result(\"version\", version).Msg(\"guardVersion\");\n await this.close();\n return version;\n }\n if (this.ready) {\n const fn = this.ready.bind(this);\n const ready = await exception2Result(fn);\n if (ready.isErr()) {\n await this.close();\n return ready as Result<URI>;\n }\n }\n this._onStarted.forEach((fn) => fn(dam));\n this.logger.Debug().Msg(\"started\");\n return version;\n }\n}\n\nexport async function createDbMetaEvent(sthis: SuperThis, dbMeta: DbMeta, parents: CarClockHead): Promise<DbMetaEvent> {\n const event = await EventBlock.create<DbMetaBinary>(\n {\n dbMeta: sthis.txt.encode(format(dbMeta)),\n },\n parents as unknown as Link<EventView<DbMetaBinary>, number, number, 1>[],\n );\n return {\n eventCid: event.cid as CarClockLink,\n dbMeta,\n parents,\n };\n}\n\nexport class MetaStoreImpl extends BaseStoreImpl implements MetaStore {\n readonly storeType = \"meta\";\n readonly subscribers = new Map<string, LoadHandler[]>();\n parents: CarClockHead = [];\n // remote: boolean;\n\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts) {\n // const my = new URL(url.toString());\n // my.searchParams.set(\"storekey\", 'insecure');\n super(sthis, url, { ...opts }, ensureLogger(sthis, \"MetaStoreImpl\"));\n // this.remote = !!remote;\n if (/*this.remote && */ opts.gateway.subscribe) {\n this.onStarted(async (dam) => {\n this.logger.Debug().Str(\"url\", this.url().toString()).Msg(\"Subscribing to the gateway\");\n opts.gateway.subscribe({ loader: this.loader }, this.url(), async ({ payload: dbMetas }: FPEnvelopeMeta) => {\n this.logger.Debug().Msg(\"Received message from gateway\");\n await Promise.all(\n dbMetas.map((dbMetaEv) =>\n this.loader.taskManager?.handleEvent(\n dbMetaEv.eventCid,\n dbMetaEv.parents,\n dbMetaEv.dbMeta,\n this.loader.attachedStores.activate(dam),\n ),\n ),\n );\n this.updateParentsFromDbMetas(dbMetas);\n });\n });\n }\n }\n\n private updateParentsFromDbMetas(dbMetas: DbMetaEvent[]) {\n const cids = dbMetas.map((m) => m.eventCid);\n const dbMetaParents = dbMetas.flatMap((m) => m.parents);\n const uniqueParentsMap = new Map([...this.parents, ...cids].map((p) => [p.toString(), p]));\n const dbMetaParentsSet = new Set(dbMetaParents.map((p) => p.toString()));\n this.parents = Array.from(uniqueParentsMap.values()).filter((p) => !dbMetaParentsSet.has(p.toString()));\n }\n\n // async handleByteHeads(byteHeads: Uint8Array) {\n // // return await decodeGatewayMetaBytesToDbMeta(this.sthis, byteHeads);\n // const rDbMeta = await fpDeserialize(this.sthis, byteHeads, this.url());\n // if (rDbMeta.isErr()) {\n // throw this.logger.Error().Err(rDbMeta).Msg(\"error deserializing\").AsError();\n // }\n // return (rDbMeta.Ok() as FPEnvelopeMeta).payload;\n // }\n\n async load(branch = \"main\"): Promise<DbMeta[] | Falsy> {\n const url = await this.gateway.buildUrl({ loader: this.loader }, this.url(), branch);\n if (url.isErr()) {\n throw this.logger.Error().Result(\"buildUrl\", url).Str(\"branch\", branch).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const rfpEnv = await this.gateway.get({ loader: this.loader }, url.Ok());\n if (rfpEnv.isErr()) {\n if (isNotFoundError(rfpEnv)) {\n return undefined;\n }\n throw this.logger.Error().Url(url.Ok()).Err(rfpEnv).Msg(\"gateway get\").AsError();\n }\n const fpMeta = (rfpEnv.Ok() as FPEnvelopeMeta).payload;\n // const dbMetas = await this.handleByteHeads(fpMeta);\n const dbMetas = fpMeta.map((m) => m.dbMeta);\n await this.loader.handleDbMetasFromStore(dbMetas, this.loader.attachedStores.activate(url.Ok()));\n this.updateParentsFromDbMetas(fpMeta);\n return dbMetas;\n }\n\n async save(meta: DbMeta, branch?: string): Promise<Result<void>> {\n branch = branch || \"main\";\n this.logger.Debug().Str(\"branch\", branch).Any(\"meta\", meta).Msg(\"saving meta\");\n\n // const fpMetas = await encodeEventsWithParents(this.sthis, [event], this.parents);\n const url = await this.gateway.buildUrl({ loader: this.loader }, this.url(), branch);\n if (url.isErr()) {\n throw this.logger.Error().Err(url.Err()).Str(\"branch\", branch).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const dbMetaEvent = await createDbMetaEvent(this.sthis, meta, this.parents);\n const res = await this.gateway.put({ loader: this.loader }, url.Ok(), {\n type: \"meta\",\n payload: [dbMetaEvent],\n } as FPEnvelopeMeta);\n if (res.isErr()) {\n throw this.logger.Error().Err(res.Err()).Msg(\"got error from gateway.put\").AsError();\n }\n // await this.loader.handleDbMetasFromStore([meta]);\n // this.loader.taskManager?.eventsWeHandled.add(event.cid.toString());\n return res;\n }\n\n async close(): Promise<Result<void>> {\n await this.gateway.close({ loader: this.loader }, this.url());\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n async destroy(): Promise<Result<void>> {\n this.logger.Debug().Msg(\"destroy\");\n return this.gateway.destroy({ loader: this.loader }, this.url());\n }\n}\n\nabstract class DataStoreImpl extends BaseStoreImpl {\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts, logger: Logger) {\n super(sthis, url, { ...opts }, logger);\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({ loader: this.loader }, 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({ loader: this.loader }, url.Ok());\n if (res.isErr()) {\n throw res.Err();\n }\n const fpenv = res.Ok() as FPEnvelopeFile | FPEnvelopeCar;\n switch (fpenv.type) {\n case \"car\":\n case \"file\":\n return { cid, bytes: fpenv.payload };\n default:\n throw this.logger.Error().Msg(\"unexpected type\").AsError();\n }\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({ loader: this.loader }, 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 // if (url.Ok().getParam(PARAM.KEY) === PARAM.GENESIS_CID) {\n // console.log(\"saving genesis cid\");\n // }\n // if (car.bytes.length === 0) {\n // return;\n // }\n // without URL changes in super-this branch we\n // can distinguish between car and file\n let fpMsg: Result<FPEnvelopeCar | FPEnvelopeFile>;\n switch (url.Ok().getParam(PARAM.STORE)) {\n case \"car\":\n fpMsg = Car2FPMsg(car.bytes);\n break;\n case \"file\":\n fpMsg = File2FPMsg(car.bytes);\n break;\n default:\n throw this.logger.Error().Str(\"store\", url.Ok().getParam(PARAM.STORE)).Msg(\"unexpected store\").AsError();\n }\n if (fpMsg.isErr()) {\n throw this.logger.Error().Err(fpMsg).Msg(\"got error from FPMsg2Car\").AsError();\n }\n const res = await this.gateway.put({ loader: this.loader }, url.Ok(), fpMsg.Ok());\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({ loader: this.loader }, this.url(), cid.toString());\n if (url.isErr()) {\n return url;\n }\n return this.gateway.delete({ loader: this.loader }, url.Ok());\n }\n async close(): Promise<Result<void>> {\n await this.gateway.close({ loader: this.loader }, this.url());\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n destroy(): Promise<Result<void>> {\n this.logger.Debug().Msg(\"destroy\");\n return this.gateway.destroy({ loader: this.loader }, this.url());\n }\n}\n\nexport class CarStoreImpl extends DataStoreImpl implements CarStore {\n readonly storeType = \"car\";\n\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts) {\n super(sthis, url, { ...opts }, ensureLogger(sthis, \"CarStoreImpl\"));\n }\n}\n\nexport class FileStoreImpl extends DataStoreImpl implements FileStore {\n readonly storeType = \"file\";\n\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts) {\n super(sthis, url, { ...opts }, ensureLogger(sthis, \"FileStoreImpl\"));\n }\n}\n\nexport class WALStoreImpl extends BaseStoreImpl implements WALStore {\n readonly storeType = \"wal\";\n // readonly tag: string = \"rwal-base\";\n\n // readonly loader: Loadable;\n\n readonly _ready = new ResolveOnce<void>();\n\n readonly walState: WALState = { operations: [], noLoaderOps: [], fileOperations: [] };\n readonly processing: Promise<void> | undefined = undefined;\n readonly processQueue: CommitQueue<void> = new CommitQueue<void>();\n\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts) {\n // const my = new URL(url.toString());\n // my.searchParams.set(\"storekey\", 'insecure');\n super(sthis, url, { ...opts }, ensureLogger(sthis, \"WALStoreImpl\"));\n // this.loader = loader;\n }\n\n async ready(): Promise<void> {\n return this._ready.once(async () => {\n const walState = await this.load().catch((e) => {\n this.logger.Error().Err(e).Msg(\"error loading wal\");\n return undefined;\n });\n this.walState.operations.splice(0, this.walState.operations.length);\n this.walState.fileOperations.splice(0, this.walState.fileOperations.length);\n if (walState) {\n this.walState.operations.push(...walState.operations);\n this.walState.fileOperations.push(...walState.fileOperations);\n }\n });\n }\n\n async enqueue(dbMeta: DbMeta, opts: CommitOpts) {\n await this.ready();\n if (opts.compact) {\n this.walState.operations.splice(0, this.walState.operations.length);\n this.walState.noLoaderOps.splice(0, this.walState.noLoaderOps.length);\n this.walState.noLoaderOps.push(dbMeta);\n } else 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 if (!opts.noLoader) {\n void this.process();\n }\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.xremoteCarStore) return;\n await this.processQueue.enqueue(async () => {\n try {\n await this._doProcess();\n } catch (e) {\n this.logger.Error().Any(\"error\", e).Msg(\"error processing wal\");\n }\n if (this.walState.operations.length || this.walState.fileOperations.length || this.walState.noLoaderOps.length) {\n setTimeout(() => void this.process(), 0);\n }\n });\n }\n\n async _doProcess() {\n if (!this.loader) return;\n // if (!this.loader.xremoteCarStore) return;\n\n const operations = [...this.walState.operations];\n const noLoaderOps = [...this.walState.noLoaderOps];\n const fileOperations = [...this.walState.fileOperations];\n\n if (operations.length + noLoaderOps.length + fileOperations.length === 0) return;\n\n const concurrencyLimit = 3;\n\n // Helper function to retry uploads\n const retryableUpload = <T>(fn: () => Promise<T>, description: string) =>\n pRetry(fn, {\n retries: 5,\n onFailedAttempt: (error) => {\n this.logger\n .Warn()\n .Any(\"error\", error)\n .Any(\"fn\", fn.toString())\n .Msg(`Attempt ${error.attemptNumber} failed for ${description}. There are ${error.retriesLeft} retries left.`);\n },\n });\n\n try {\n // Process noLoaderOps\n await pMap(\n noLoaderOps,\n async (dbMeta) => {\n await retryableUpload(async () => {\n if (!this.loader) {\n return;\n }\n for (const cid of dbMeta.cars) {\n const car = await this.loader.attachedStores.local().active.car.load(cid);\n // .carStore().then((i) => i.load(cid));\n if (!car) {\n if (carLogIncludesGroup(this.loader.carLog.asArray(), dbMeta.cars)) {\n throw this.logger.Error().Ref(\"cid\", cid).Msg(\"missing local car\").AsError();\n }\n } else {\n await this.loader.attachedStores.forRemotes((x) => x.active.car.save(car));\n // throwFalsy(this.loader.xremoteCarStore).save(car);\n }\n }\n // Remove from walState after successful upload\n inplaceFilter(this.walState.noLoaderOps, (op) => op !== dbMeta);\n }, `noLoaderOp with dbMeta.cars=${dbMeta.cars.toString()}`);\n },\n { concurrency: concurrencyLimit },\n );\n\n // Process operations\n await pMap(\n operations,\n async (dbMeta) => {\n await retryableUpload(async () => {\n if (!this.loader) {\n return;\n }\n for (const cid of dbMeta.cars) {\n const car = await this.loader.attachedStores.local().active.car.load(cid);\n if (!car) {\n if (carLogIncludesGroup(this.loader.carLog.asArray(), dbMeta.cars)) {\n throw this.logger.Error().Ref(\"cid\", cid).Msg(`missing local car`).AsError();\n }\n } else {\n // await throwFalsy(this.loader.xremoteCarStore).save(car);\n await this.loader.attachedStores.forRemotes((x) => x.active.car.save(car));\n }\n }\n // Remove from walState after successful upload\n inplaceFilter(this.walState.operations, (op) => op !== dbMeta);\n }, `operation with dbMeta.cars=${dbMeta.cars.toString()}`);\n },\n { concurrency: concurrencyLimit },\n );\n\n // Process fileOperations\n await pMap(\n fileOperations,\n async ({ cid: fileCid, public: publicFile }) => {\n await retryableUpload(async () => {\n if (!this.loader) {\n return;\n }\n const fileBlock = await this.loader.attachedStores.local().active.file.load(fileCid);\n if (!fileBlock) {\n throw this.logger.Error().Ref(\"cid\", fileCid).Msg(\"missing file block\").AsError();\n }\n await this.loader.attachedStores.forRemotes((x) => x.active.file.save(fileBlock, { public: publicFile }));\n // await this.loader.xremoteFileStore?.save(fileBlock, { public: publicFile });\n // Remove from walState after successful upload\n inplaceFilter(this.walState.fileOperations, (op) => op.cid !== fileCid);\n }, `fileOperation with cid=${fileCid.toString()}`);\n },\n { concurrency: concurrencyLimit },\n );\n\n // If all uploads succeeded, send the last dbMeta to remoteMetaStore\n if (operations.length) {\n const lastOp = operations[operations.length - 1];\n await retryableUpload(async () => {\n if (!this.loader) {\n return;\n }\n // await this.loader.xremoteMetaStore?.save(lastOp);\n await this.loader.attachedStores.forRemotes((x) => x.active.meta.save(lastOp));\n }, `remoteMetaStore save with dbMeta.cars=${lastOp.cars.toString()}`);\n }\n } catch (error) {\n // Log the error\n this.logger.Error().Any(\"error\", error).Msg(\"Processing failed\");\n // Do not proceed to send metadata if any uploads failed\n return;\n } finally {\n // Always save the WAL state\n await this.save(this.walState);\n }\n }\n\n async load(): Promise<WALState | Falsy> {\n this.logger.Debug().Msg(\"loading\");\n const filepath = await this.gateway.buildUrl({ loader: this.loader }, this.url(), \"main\");\n if (filepath.isErr()) {\n throw this.logger.Error().Err(filepath.Err()).Url(this.url()).Msg(\"error building url\").AsError();\n }\n const bytes = (await this.gateway.get({ loader: this.loader }, filepath.Ok())) as Result<FPEnvelopeWAL>;\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 if (bytes.Ok().type !== \"wal\") {\n throw this.logger.Error().Str(\"type\", bytes.Ok().type).Msg(\"unexpected type\").AsError();\n }\n return bytes.Ok().payload;\n }\n\n async save(state: WALState) {\n const filepath = await this.gateway.buildUrl({ loader: this.loader }, this.url(), \"main\");\n if (filepath.isErr()) {\n throw this.logger.Error().Err(filepath.Err()).Url(this.url()).Msg(\"error building url\").AsError();\n }\n // let encoded: ToString<WALState>;\n // try {\n // encoded = format(state);\n // } catch (e) {\n // throw this.logger.Error().Err(e).Any(\"state\", state).Msg(\"error format\").AsError();\n // }\n const res = await this.gateway.put({ loader: this.loader }, filepath.Ok(), {\n type: \"wal\",\n payload: state,\n } as FPEnvelopeWAL);\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({ loader: this.loader }, this.url());\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n\n destroy() {\n this.logger.Debug().Msg(\"destroy\");\n return this.gateway.destroy({ loader: this.loader }, this.url());\n }\n}\n","import pLimit from \"p-limit\";\nimport { CarReader } from \"@ipld/car/reader\";\nimport { KeyedResolvOnce, Logger, LRUSet, 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 TransactionMeta,\n type CarGroup,\n type Loadable,\n BlockstoreRuntime,\n BlockstoreOpts,\n AttachedStores,\n ActiveStore,\n BaseStore,\n CIDActiveStore,\n CarCacheItem,\n CarLog,\n FroozenCarLog,\n CarStore,\n} from \"./types.js\";\n\nimport { parseCarFile } from \"./loader-helpers.js\";\n\nimport { defaultedBlockstoreRuntime } from \"./transaction.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport { PARAM, type Attachable, type Attached, type CarTransaction, type DbMeta, type Falsy, type SuperThis } from \"../types.js\";\nimport { getKeyBag, KeyBag } from \"../runtime/key-bag.js\";\nimport { commit, commitFiles, CommitParams } from \"./commitor.js\";\nimport { decode } from \"../runtime/wait-pr-multiformats/block.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport { TaskManager } from \"./task-manager.js\";\nimport { AttachedRemotesImpl, createAttachedStores } from \"./attachable-store.js\";\nimport { ensureLogger, isNotFoundError } from \"../utils.js\";\n\nexport function carLogIncludesGroup(list: FroozenCarLog, cids: CarGroup) {\n const cidSet = cids\n .map((cid) => cid.toString())\n .sort()\n .join(\",\");\n return list.some(\n (arr: CarGroup) =>\n cidSet ===\n arr\n .map((cid) => cid.toString())\n .sort()\n .join(\",\"),\n );\n}\n\n// this works for car groups because toString looks like bafy,bafy\nfunction uniqueCids(list: FroozenCarLog, remove = new LRUSet<string>()): FroozenCarLog {\n const byString = new Map<string, CarGroup>();\n for (const cid of list) {\n if (remove.has(cid.toString())) continue;\n byString.set(cid.toString(), cid);\n }\n return [...byString.values()];\n}\n\n// export interface DecoderAndCarReader extends CarReader {\n// readonly decoder: BlockDecoder<number, Uint8Array>;\n// }\n\nexport class Loader implements Loadable {\n // readonly name: string;\n readonly ebOpts: BlockstoreRuntime;\n readonly logger: Logger;\n readonly commitQueue: CommitQueue<CarGroup> = new CommitQueue<CarGroup>();\n isCompacting = false;\n private readonly cidCache: KeyedResolvOnce<CarCacheItem>;\n private readonly maxConcurrentCarReader: ReturnType<typeof pLimit>;\n private readonly maxConcurrentWrite = pLimit(1);\n readonly seenCompacted: LRUSet<string>;\n // readonly processedCars: Set<string> = new Set<string>();\n readonly sthis: SuperThis;\n readonly taskManager: TaskManager;\n\n readonly carLog: CarLog = new CarLog();\n // key?: string;\n // keyId?: string;\n // remoteMetaStore?: MetaStore;\n // remoteCarStore?: DataStore;\n // remoteFileStore?: DataStore;\n\n readonly attachedStores: AttachedStores;\n\n async attach(attached: Attachable): Promise<Attached> {\n const at = await this.attachedStores.attach(attached);\n if (!at.stores.wal) {\n try {\n // remote Store need to kick off the sync by requesting the latest meta\n const dbMeta = await at.stores.meta.load();\n if (!Array.isArray(dbMeta)) {\n throw this.logger.Error().Msg(\"missing dbMeta\").AsError();\n }\n await this.handleDbMetasFromStore(dbMeta, this.attachedStores.activate(at.stores));\n } catch (e) {\n this.logger.Error().Err(e).Msg(\"error attaching store\");\n at.detach();\n }\n }\n return at;\n }\n\n // private getBlockCache = new Map<string, AnyBlock>();\n private seenMeta: LRUSet<string>;\n\n keyBag(): Promise<KeyBag> {\n return getKeyBag(this.sthis, this.ebOpts.keyBag);\n }\n\n private readonly onceReady: ResolveOnce<void> = new ResolveOnce<void>();\n async ready(): Promise<void> {\n return this.onceReady.once(async () => {\n await createAttachedStores(\n {\n car: { url: this.ebOpts.storeUrls.car, gatewayInterceptor: this.ebOpts.gatewayInterceptor },\n file: { url: this.ebOpts.storeUrls.file, gatewayInterceptor: this.ebOpts.gatewayInterceptor },\n meta: { url: this.ebOpts.storeUrls.meta, gatewayInterceptor: this.ebOpts.gatewayInterceptor },\n wal: { url: this.ebOpts.storeUrls.wal, gatewayInterceptor: this.ebOpts.gatewayInterceptor },\n },\n this.attachedStores,\n );\n const local = this.attachedStores.local();\n const metas = await local.active.meta.load();\n if (this.ebOpts.meta) {\n await this.handleDbMetasFromStore([this.ebOpts.meta, ...(metas || [])], local);\n } else if (metas) {\n await this.handleDbMetasFromStore(metas, local);\n }\n });\n }\n\n async close() {\n await this.commitQueue.waitIdle();\n await this.attachedStores.detach();\n // const toClose = await Promise.all([this.carStore(), this.metaStore(), this.fileStore(), this.WALStore()]);\n // await Promise.all(toClose.map((store) => store.close()));\n }\n\n async destroy() {\n // console.log(\"destroy\", this.attachedStores.local().baseStores().map((store) => store.url().toString()));\n await Promise.all(\n this.attachedStores\n .local()\n .baseStores()\n .map((store) => store.destroy()),\n );\n }\n\n constructor(sthis: SuperThis, ebOpts: BlockstoreOpts) {\n // this.name = name;\n this.sthis = sthis;\n this.ebOpts = defaultedBlockstoreRuntime(\n sthis,\n {\n ...ebOpts,\n // name,\n },\n \"Loader\",\n );\n this.logger = ensureLogger(sthis, \"Loader\");\n this.cidCache = new KeyedResolvOnce({\n lru: {\n maxEntries: parseInt(this.ebOpts.storeUrls.car.getParam(PARAM.CAR_CACHE_SIZE, \"1000\"), 10),\n },\n });\n this.seenMeta = new LRUSet({\n maxEntries: parseInt(this.ebOpts.storeUrls.meta.getParam(PARAM.CAR_META_CACHE_SIZE, \"1000\"), 10),\n });\n this.seenCompacted = new LRUSet({\n maxEntries: parseInt(this.ebOpts.storeUrls.car.getParam(PARAM.CAR_COMPACT_CACHE_SIZE, \"1000\"), 10),\n });\n this.maxConcurrentCarReader = pLimit(parseInt(this.ebOpts.storeUrls.car.getParam(PARAM.CAR_PARALLEL, \"5\"), 10));\n\n this.taskManager = new TaskManager(\n sthis,\n async (dbMeta: DbMeta, activeStore: ActiveStore) => {\n // console.log(\n // \"taskManager\",\n // dbMeta.cars.map((c) => c.toString()),\n // );\n await this.handleDbMetasFromStore([dbMeta], activeStore);\n },\n this.ebOpts.taskManager,\n );\n this.attachedStores = new AttachedRemotesImpl(this);\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[], activeStore: ActiveStore): Promise<void> {\n // console.log(\n // \"handleDbMetasFromStore\",\n // activeStore.active.car.url().toString(),\n // metas.map((m) => m.cars.map((c) => c.toString())).flat(),\n // );\n this.logger.Debug().Any(\"metas\", metas).Url(activeStore.active.car.url()).Msg(\"handleDbMetasFromStore\");\n for (const meta of metas) {\n await this.maxConcurrentWrite(async () => {\n await this.mergeDbMetaIntoClock(meta, activeStore);\n });\n }\n }\n\n async mergeDbMetaIntoClock(meta: DbMeta, activeStore: ActiveStore): Promise<void> {\n if (this.isCompacting) {\n throw this.logger.Error().Msg(\"cannot merge while compacting\").AsError();\n }\n try {\n this.isCompacting = true;\n // this could be abit more compact\n const metaKey = meta.cars\n .map((i) => i.toString())\n .sort()\n .join(\",\");\n if (this.seenMeta.has(metaKey)) return;\n this.seenMeta.add(metaKey);\n\n // if (meta.key) {\n // await this.setKey(meta.key);\n // }\n if (carLogIncludesGroup(this.carLog.asArray(), meta.cars)) {\n return;\n }\n const carHeader = await this.loadCarHeaderFromMeta<TransactionMeta>(meta, activeStore);\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((k) => this.seenCompacted.add(k), this.seenCompacted);\n try {\n await this.getMoreReaders(carHeader.cars.flat(), activeStore);\n } catch (e) {\n this.logger.Error().Err(e).Msg(\"error getting more readers\");\n }\n this.carLog.update(uniqueCids([meta.cars, ...this.carLog.asArray(), ...carHeader.cars], this.seenCompacted));\n // console.log(\n // \">>>>> pre applyMeta\",\n // this.carLog\n // .asArray()\n // .map((c) => c.map((cc) => cc.toString()))\n // .flat(),\n // );\n await this.ebOpts.applyMeta?.(carHeader.meta);\n // console.log(\">>>>> post applyMeta\");\n } finally {\n this.isCompacting = false;\n }\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>(dbm: DbMeta, astore: ActiveStore): Promise<CarHeader<T>> {\n //Call loadCar for every cid\n const reader = await this.loadCar(dbm.cars[0], astore);\n return await parseCarFile(reader, this.logger);\n }\n\n // async _getKey(): Promise<string | undefined> {\n // if (this.key) return this.key;\n // // generate a random key\n // if (!this.ebOpts.public) {\n // await this.setKey(toHexString(this.ebOpts.crypto.randomBytes(32)));\n // }\n // return this.key || undefined;\n // }\n\n async commitFiles(\n t: CarTransaction,\n done: TransactionMeta,\n // opts: CommitOpts = { noLoader: false, compact: false },\n ): Promise<CarGroup> {\n await this.ready();\n const fstore = this.attachedStores.local().active.file;\n const wstore = this.attachedStores.local().active.wal;\n return this.commitQueue.enqueue(() => commitFiles(fstore, wstore, t, done));\n }\n\n async loadFileCar(cid: AnyLink /*, isPublic = false*/, store: ActiveStore): Promise<CarCacheItem> {\n return await this.storesLoadCar(cid, store.fileStore()); // store.local.file, store.remotes.map((r) => r.file));\n }\n\n async commit<T = TransactionMeta>(\n t: CarTransaction,\n done: T,\n opts: CommitOpts = { noLoader: false, compact: false },\n ): Promise<CarGroup> {\n await this.ready();\n const carStore = this.attachedStores.local().active.car;\n const params: CommitParams = {\n encoder: (await carStore.keyedCrypto()).codec(),\n carLog: this.carLog,\n carStore: carStore,\n WALStore: this.attachedStores.local().active.wal,\n metaStore: this.attachedStores.local().active.meta,\n threshold: this.ebOpts.threshold,\n };\n return this.commitQueue.enqueue(async () => {\n await this.cacheTransaction(t);\n const ret = await commit(params, t, done, opts);\n await this.updateCarLog(ret.cgrp, ret.header, !!opts.compact);\n return ret.cgrp;\n });\n }\n\n async updateCarLog<T>(cids: CarGroup, cHeader: CarHeader<T>, compact: boolean): Promise<void> {\n // if (this.carLog.length === 0) {\n // // console.log(\"updateCarLog\", cids.map((c) => c.toString()));\n // }\n\n if (compact) {\n const previousCompactCid = cHeader.compact[cHeader.compact.length - 1];\n cHeader.compact.map((c) => c.toString()).forEach(this.seenCompacted.add, this.seenCompacted);\n this.carLog.update(uniqueCids([...this.carLog.asArray(), ...cHeader.cars, cids], this.seenCompacted));\n // console.log(\n // \"compact - updateCarLog\",\n // this.carLog\n // .asArray()\n // .map((c) => c.map((cc) => cc.toString()))\n // .flat(),\n // );\n await this.removeCidsForCompact(previousCompactCid[0], this.attachedStores.local()).catch((e) => e);\n } else {\n // console.log(\n // \"update - updateCarLog\",\n // this.carLog\n // .asArray()\n // .map((c) => c.map((cc) => cc.toString()))\n // .flat(),\n // );\n this.carLog.xunshift(cids);\n }\n }\n\n async cacheTransaction(t: CarTransaction) {\n for await (const block of t.entries()) {\n const sBlock = block.cid.toString();\n this.cidCache.get(sBlock).once(\n () =>\n ({\n type: \"block\",\n cid: block.cid,\n blocks: [block],\n roots: [],\n }) satisfies CarCacheItem,\n );\n }\n }\n\n // /**\n // *\n // * @returns the list of blocks which was read from the car file\n // */\n // private async readCar(reader: CarReader): Promise<AnyBlock[]> {\n // const blocks: AnyBlock[] = [];\n // for await (const block of reader.blocks()) {\n // const sBlock = block.cid.toString();\n // this.cidCache.get(sBlock).once(() => {\n // blocks.push(block);\n // return [block];\n // });\n // }\n // return blocks;\n // }\n\n async removeCidsForCompact(cid: AnyLink, store: ActiveStore) {\n const carHeader = await this.loadCarHeaderFromMeta(\n {\n cars: [cid],\n },\n store,\n );\n for (const cids of carHeader.compact) {\n for (const cid of cids) {\n await this.attachedStores.local().active.car.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 // for (const { value } of this.cidCache.values()) {\n // if (value.isOk() && value.Ok().type === \"block\") {\n // for (const block of value.Ok().blocks) {\n // yield block;\n // }\n // }\n // }\n // if (cache) {\n // return;\n // }\n // console.log(\"entries\", this.carLog.map((c) => c.map((cc) => cc.toString())).flat());\n const seen = new Set<string>();\n for (const carCids of this.carLog.asArray()) {\n for (const carCid of carCids) {\n const reader = await this.loadCar(carCid, this.attachedStores.local());\n if (!reader || reader.type !== \"car\") {\n throw this.logger.Error().Any(\"reader\", reader.type).Str(\"cid\", carCid.toString()).Msg(\"missing car reader\").AsError();\n }\n // console.log(\n // \"entries\",\n // carCid.toString(),\n // reader.blocks.map((b) => b.cid.toString()),\n // );\n // const readBlocks = await this.readCar(reader);\n for (const block of reader.blocks) {\n const cidStr = block.cid.toString();\n if (seen.has(cidStr)) continue;\n seen.add(cidStr);\n yield block;\n }\n }\n }\n }\n\n async getBlock(cid: AnyLink, store: ActiveStore): Promise<AnyBlock | Falsy> {\n await this.ready();\n const cidStr = cid.toString();\n const ci = await this.cidCache.get(cidStr).once(async () => {\n // console.log(\"getBlock\", cidStr);\n // const getCarCid = async (carCid: AnyLink) => {\n // const sCid = carCid.toString();\n // if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n // const reader = await this.loadCar(carCid, store);\n // if (!reader) {\n // throw this.logger.Error().Str(\"cid\", sCid).Msg(\"missing car reader\").AsError();\n // }\n // await this.cacheCarReader(sCid, reader).catch((e) => {\n // this.logger.Error().Err(e).Str(\"cid\", sCid).Msg(\"error caching car reader\");\n // return;\n // });\n // if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n // console.log(\"getBlock-error\", sCid);\n // throw this.logger.Error().Str(\"cid\", sCid).Msg(\"block not in reader\").AsError();\n // };\n\n const getCompactCarCids = async (carCid: AnyLink) => {\n const sCid = carCid.toString();\n const reader = await this.loadCar(carCid, store);\n // if (!reader) {\n // throw this.logger.Error().Str(\"cid\", carCid.toString()).Msg(\"missing car reader\").AsError();\n // }\n const header = await parseCarFile(reader, this.logger);\n const compacts = header.compact;\n // let got: AnyBlock | undefined;\n\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 const got = await Promise.allSettled(compacts.map((compact) => compact.map((cid) => this.loadCar(cid, store)).flat()));\n got\n .filter((result) => result.status === \"rejected\")\n .forEach((result) => {\n this.logger.Error().Err(result.reason).Str(\"cid\", sCid).Msg(\"error getting compacted block\");\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: AnyBlock | undefined;\n for (const carCids of this.carLog.asArray()) {\n for (const carCid of carCids) {\n const ci = await this.loadCar(carCid, store);\n if (!ci) {\n this.logger.Error().Str(\"cid\", carCid.toString()).Msg(\"missing CarCID\");\n continue;\n }\n got = ci.blocks.find((block) => block.cid.equals(cid));\n if (got) {\n break;\n }\n }\n }\n if (!got) {\n await getCompactCarCids(this.carLog.last()[0]);\n }\n return {\n type: \"block\",\n cid: cid,\n blocks: got ? [got] : [],\n roots: [],\n };\n });\n if (!(ci.type === \"block\" && ci.blocks.length === 1)) {\n throw this.logger.Error().Str(\"cid\", cidStr).Any(\"block\", ci).Msg(\"missing block\").AsError();\n }\n return ci.blocks[0];\n }\n\n async loadCar(cid: AnyLink, store: ActiveStore): Promise<CarCacheItem> {\n const loaded = await this.storesLoadCar(cid, store.carStore());\n return loaded;\n }\n\n private async makeDecoderAndCarReader(carCid: AnyLink, store: CIDActiveStore): Promise<CarCacheItem> {\n const carCidStr = carCid.toString();\n let loadedCar: AnyBlock | undefined = undefined;\n let activeStore: BaseStore = store.local();\n try {\n //loadedCar now is an array of AnyBlocks\n this.logger.Debug().Any(\"cid\", carCidStr).Msg(\"loading car\");\n loadedCar = await store.local().load(carCid);\n this.logger.Debug().Bool(\"loadedCar\", loadedCar).Msg(\"loaded\");\n } catch (e) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Str(\"cid\", carCidStr).Err(e).Msg(\"loading car\");\n }\n for (const remote of store.remotes() as CarStore[]) {\n // console.log(\"makeDecoderAndCarReader\", remote.url().toString());\n try {\n const remoteCar = await remote.load(carCid);\n if (remoteCar) {\n // todo test for this\n this.logger.Debug().Ref(\"cid\", remoteCar.cid).Msg(\"saving remote car locally\");\n await store.local().save(remoteCar);\n loadedCar = remoteCar;\n activeStore = remote;\n break;\n } else {\n this.logger.Error().Str(\"cid\", carCidStr).Err(e).Msg(\"loading car\");\n }\n } catch (e) {\n this.logger.Warn().Str(\"cid\", carCidStr).Url(remote.url()).Err(e).Msg(\"loading car\");\n }\n }\n }\n if (!loadedCar) {\n throw this.logger.Error().Url(store.local().url()).Str(\"cid\", carCidStr).Msg(\"missing car files\").AsError();\n }\n //This needs a fix as well as the fromBytes function expects a Uint8Array\n //Either we can merge the bytes or return an array of rawReaders\n const bytes = await decode({ bytes: loadedCar.bytes, hasher, codec: (await activeStore.keyedCrypto()).codec() }); // as Uint8Array,\n const rawReader = await CarReader.fromBytes(bytes.value.data);\n // const readerP = Promise.resolve(rawReader);\n // const kc = await activeStore.keyedCrypto()\n // const readerP = !kc.isEncrypting ? Promise.resolve(rawReader) : this.ensureDecryptedReader(activeStore, rawReader);\n\n const blocks: AnyBlock[] = [];\n for await (const block of rawReader.blocks()) {\n const sBlock = block.cid.toString();\n blocks.push(block);\n this.cidCache.get(sBlock).once<CarCacheItem>(() => ({\n type: \"block\",\n cid: block.cid,\n blocks: [block],\n roots: [],\n }));\n }\n return {\n type: \"car\",\n cid: carCid,\n blocks,\n roots: await rawReader.getRoots(),\n };\n // const cachedReaderP = readerP.then(async (reader) => {\n // await this.cacheCarReader(carCidStr, reader).catch((e) => {\n // this.logger.Error().Err(e).Str(\"cid\", carCidStr).Msg(\"error caching car reader\");\n // return;\n // });\n // return reader;\n // });\n // this.cidCache.set(carCidStr, cachedReaderP);\n // return readerP;\n }\n\n //What if instead it returns an Array of CarHeader\n protected async storesLoadCar(carCid: AnyLink, store: CIDActiveStore): Promise<CarCacheItem> {\n const carCidStr = carCid.toString();\n // console.log(\"storesLoadCar\", carCidStr);\n return this.cidCache.get(carCidStr).once(async () => {\n return this.maxConcurrentCarReader(() => this.makeDecoderAndCarReader(carCid, store));\n });\n }\n\n protected async getMoreReaders(cids: AnyLink[], store: ActiveStore) {\n for (const cid of cids) {\n // console.log(\"getMoreReaders>>>\", cid.toString());\n await this.loadCar(cid, store);\n }\n // console.log(\"getMoreReaders<<<\");\n }\n}\n","import { decode } from \"../runtime/wait-pr-multiformats/block.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as dagCodec from \"@ipld/dag-cbor\";\nimport type { Logger } from \"@adviser/cement\";\n\nimport { CarCacheItem, CarHeader } from \"./types.js\";\n// import { decodeRunLength } from \"../runtime/keyed-crypto.js\";\n// import { base58btc } from \"multiformats/bases/base58\";\n// import { CarReader } from \"@ipld/car/reader\";\n\n// export async function encodeCarHeader<T>(fp: CarHeader<T>) {\n// return (await encode({\n// value: { fp },\n// hasher,\n// codec: dagCodec,\n// })) as AnyBlock;\n// }\n\n// function wrapDagDecoder<T>(dec: BlockDecoder<number, Uint8Array>): BlockDecoder<number, CarDecoded<T>> {\n// return {\n// code: dec.code,\n// decode: async (block: Uint8Array) => dagCodec.decode(await dec.decode(block))\n// }\n// }\n\ninterface CarDecoded<T> {\n readonly fp: CarHeader<T>;\n}\n\nexport async function parseCarFile<T>(reader: CarCacheItem, logger: Logger): Promise<CarHeader<T>> {\n const roots = await reader.roots;\n const header = reader.blocks.find((i) => i.cid.equals(roots[0]));\n if (!header) throw logger.Error().Msg(\"missing header block\").AsError();\n const dec = await decode({ bytes: header.bytes, hasher, codec: dagCodec });\n // console.log(\"parseCarFile-done\", roots[0].toString(), header)\n // const { value } = await decode({\n // bytes: header.bytes,\n // hasher,\n // codec: await wrapDagDecoder<T>({\n // code: dagCodec.code,\n // decode: (block) => {\n // const ui = new Uint8Array(block);\n // const iv = decodeRunLength(ui, 0, logger);\n // const key = decodeRunLength(ui, iv.next, logger);\n // // const fp = decodeRunLength(ui, key.next, logger);\n // console.log(\"parseCarFile\", { iv: iv.data.length, key: base58btc.encode(key.data) }, (new Error()).stack);\n // return ui\n // }\n // })\n // });\n const fpvalue = dec.value as CarDecoded<T>;\n // @jchris where is the fp attribute coming from?\n if (fpvalue && !fpvalue.fp) {\n throw logger.Error().Msg(\"missing fp\").AsError();\n }\n return fpvalue.fp;\n}\n","import { MemoryBlockstore } from \"@web3-storage/pail/block\";\nimport { BlockFetcher as BlockFetcherApi } from \"@web3-storage/pail/api\";\n\nimport {\n AnyAnyLink,\n AnyBlock,\n AnyLink,\n CarMakeable,\n TransactionMeta,\n TransactionWrapper,\n BlockstoreOpts,\n BlockstoreRuntime,\n Loadable,\n} from \"./types.js\";\n\nimport { Loader } from \"./loader.js\";\nimport type { Block, Version, UnknownLink } from \"multiformats\";\nimport { BaseBlockstore, CarTransaction, falsyToUndef, SuperThis } from \"../types.js\";\nimport { ensureStoreEnDeFile, toStoreRuntime } from \"./store-factory.js\";\nimport { Logger, toCryptoRuntime } from \"@adviser/cement\";\nimport { ensureLogger, ensureSuperThis } from \"../utils.js\";\n\nexport type BlockFetcher = BlockFetcherApi;\nexport interface CarTransactionOpts {\n readonly add: boolean;\n readonly noLoader: boolean;\n}\n\nexport class CarTransactionImpl implements CarMakeable, CarTransaction {\n readonly parent: BaseBlockstore;\n readonly #memblock = new MemoryBlockstore();\n #hackUnshift?: AnyBlock;\n\n constructor(parent: BaseBlockstore, opts: CarTransactionOpts = { add: true, noLoader: false }) {\n // super();\n if (opts.add) {\n parent.transactions.add(this);\n }\n this.parent = parent;\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined> {\n return ((await this.superGet(cid)) ?? falsyToUndef(await this.parent.get(cid))) as Block<T, C, A, V>;\n }\n\n async superGet(cid: AnyLink): Promise<AnyBlock | undefined> {\n return this.#memblock.get(cid);\n }\n\n async put(cid: AnyLink, block: Uint8Array): Promise<void> {\n await this.#memblock.put(cid, block);\n }\n\n putSync(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): void {\n this.#memblock.putSync(cid, bytes);\n }\n\n unshift(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): void {\n if (this.#hackUnshift) {\n throw new Error(\"unshift already called\");\n }\n this.#hackUnshift = { cid, bytes };\n }\n\n async *entries(): AsyncIterableIterator<AnyBlock> {\n if (this.#hackUnshift) {\n yield this.#hackUnshift;\n }\n for await (const blk of this.#memblock.entries()) {\n yield blk;\n }\n }\n}\n\nexport function defaultedBlockstoreRuntime(\n sthis: SuperThis,\n opts: BlockstoreOpts,\n component: string,\n ctx?: Record<string, unknown>,\n): BlockstoreRuntime {\n const logger = ensureLogger(sthis, component, ctx);\n // const store = opts.store || {};\n return {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n applyMeta: (meta: TransactionMeta, snap?: boolean): Promise<void> => {\n return Promise.resolve();\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n compact: async (blocks: BlockFetcher) => {\n return {} as unknown as TransactionMeta;\n },\n autoCompact: 100,\n public: false,\n // name: undefined,\n threshold: 1000 * 1000,\n ...opts,\n logger,\n keyBag: opts.keyBag || {},\n crypto: toCryptoRuntime(opts.crypto),\n storeUrls: opts.storeUrls,\n taskManager: {\n removeAfter: 3,\n retryTimeout: 50,\n ...opts.taskManager,\n },\n // storeEnDeFile: ensureStoreEnDeFile(opts.storeEnDeFile),\n // store,\n storeRuntime: toStoreRuntime(sthis, ensureStoreEnDeFile(opts.storeEnDeFile)),\n };\n}\n\n// export function blockstoreFactory(sthis: SuperThis, opts: BlockstoreOpts): BaseBlockstore | EncryptedBlockstore {\n// // if (opts.name) {\n// return new EncryptedBlockstore(sthis, opts);\n// // } else {\n// // return new BaseBlockstore(opts);\n// // }\n// }\n\nexport class BaseBlockstoreImpl implements BlockFetcher {\n readonly transactions: Set<CarTransaction> = new Set<CarTransaction>();\n readonly ebOpts: BlockstoreRuntime;\n readonly sthis: SuperThis;\n\n readonly loader: Loadable;\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 async compact(): Promise<void> {\n // no-op\n }\n\n readonly logger: Logger;\n constructor(ebOpts: BlockstoreOpts) {\n this.sthis = ensureSuperThis(ebOpts);\n this.ebOpts = defaultedBlockstoreRuntime(this.sthis, ebOpts, \"BaseBlockstore\");\n this.logger = this.ebOpts.logger;\n this.loader = new Loader(this.sthis, 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 if (!cid) throw this.logger.Error().Msg(\"required cid\").AsError();\n for (const f of this.transactions) {\n // if (Math.random() < 0.001) console.log('get', cid.toString(), this.transactions.size)\n const v = await f.superGet(cid);\n if (v) return v as Block<T, C, A, V>;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async put(cid: AnyAnyLink, block: Uint8Array): Promise<void> {\n throw this.logger.Error().Msg(\"use a transaction to put\").AsError();\n }\n\n lastTxMeta?: unknown; // TransactionMeta\n\n async transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n _opts?: CarTransactionOpts,\n ): Promise<TransactionWrapper<M>> {\n this.logger.Debug().Msg(\"enter transaction\");\n const t = new CarTransactionImpl(this, _opts);\n this.logger.Debug().Msg(\"post CarTransaction\");\n const done: M = await fn(t);\n this.logger.Debug().Msg(\"post fn\");\n this.lastTxMeta = done;\n return { t, meta: done };\n }\n\n openTransaction(opts: CarTransactionOpts = { add: true, noLoader: false }): CarTransaction {\n return new CarTransactionImpl(this, opts);\n }\n\n async commitTransaction<M extends TransactionMeta>(\n t: CarTransaction,\n done: M,\n opts: CarTransactionOpts,\n ): Promise<TransactionWrapper<M>> {\n if (!this.loader) throw this.logger.Error().Msg(\"loader required to commit\").AsError();\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 *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 BaseBlockstoreImpl {\n // readonly name: string;\n\n ready(): Promise<void> {\n return this.loader.ready();\n }\n\n close(): Promise<void> {\n return this.loader.close();\n }\n\n destroy(): Promise<void> {\n return this.loader.destroy();\n }\n\n compacting = false;\n readonly logger: Logger;\n\n constructor(sthis: SuperThis, ebOpts: BlockstoreOpts) {\n super(ebOpts);\n this.logger = ensureLogger(this.sthis, \"EncryptedBlockstore\", {\n this: 1,\n });\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 const ret = falsyToUndef(await this.loader.getBlock(cid, this.loader.attachedStores.local())) as Block<T, C, A, V>;\n return ret;\n }\n\n async transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n opts = { noLoader: false },\n ): Promise<TransactionWrapper<M>> {\n this.logger.Debug().Msg(\"enter transaction\");\n const { t, meta: done } = await super.transaction<M>(fn);\n this.logger.Debug().Msg(\"post super.transaction\");\n const cars = await this.loader.commit<M>(t, done, opts);\n this.logger.Debug().Msg(\"post this.loader.commit\");\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, ledger must be named\").AsError();\n const reader = await this.loader.loadFileCar(car /*, isPublic */, this.loader.attachedStores.local());\n const block = await reader.blocks.find((i) => i.cid.equals(cid));\n if (!block) throw this.logger.Error().Str(\"cid\", cid.toString()).Msg(`Missing block`).AsError();\n return block.bytes;\n }\n\n async compact() {\n await this.ready();\n if (!this.loader) throw this.logger.Error().Msg(\"loader required to compact\").AsError();\n if (this.loader.carLog.length < 2) return;\n const compactFn = this.ebOpts.compact || ((blocks: CompactionFetcher) => this.defaultCompact(blocks, this.logger));\n if (!compactFn || this.compacting) return;\n const blockLog = new CompactionFetcher(this);\n this.compacting = true;\n const meta = await compactFn(blockLog);\n await this.loader.commit(blockLog.loggedBlocks, meta, {\n compact: true,\n noLoader: true,\n });\n this.compacting = false;\n }\n\n async defaultCompact(blocks: CompactionFetcher, logger: Logger): Promise<TransactionMeta> {\n // console.log('eb compact')\n if (!this.loader) {\n throw logger.Error().Msg(\"no loader\").AsError();\n }\n if (!this.lastTxMeta) {\n throw logger.Error().Msg(\"no lastTxMeta\").AsError();\n }\n for await (const blk of this.loader.entries(false)) {\n blocks.loggedBlocks.putSync(blk.cid, blk.bytes);\n }\n for (const t of this.transactions) {\n for await (const blk of t.entries()) {\n blocks.loggedBlocks.putSync(blk.cid, blk.bytes);\n }\n }\n return this.lastTxMeta as TransactionMeta;\n }\n\n async *entries(): AsyncIterableIterator<AnyBlock> {\n // const seen = new Set<string>();\n for await (const blk of this.loader.entries()) {\n // if (seen.has(blk.cid.toString())) continue\n // seen.add(blk.cid.toString())\n yield blk;\n }\n }\n}\n\nexport class CompactionFetcher implements BlockFetcher {\n readonly blockstore: EncryptedBlockstore;\n // loader: Loader | null = null\n readonly loggedBlocks: CarTransaction;\n\n constructor(blocks: EncryptedBlockstore) {\n this.blockstore = blocks;\n // this.loader = blocks.loader\n this.loggedBlocks = new CarTransactionImpl(blocks);\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined> {\n const block = await this.blockstore.get(cid);\n if (block) this.loggedBlocks.putSync(cid, block.bytes);\n return falsyToUndef(block) as Block<T, C, A, V>;\n }\n}\n","import { Future } from \"@adviser/cement\";\n\ntype QueueFunction<T = void> = () => Promise<T>;\n\nexport class CommitQueue<T = void> {\n readonly queue: QueueFunction<void>[] = [];\n processing = false;\n\n readonly _waitIdleItems: Set<Future<void>> = new Set<Future<void>>();\n waitIdle(): Promise<void> {\n if (this.queue.length === 0 && !this.processing) {\n return Promise.resolve();\n }\n const fn = new Future<void>();\n this._waitIdleItems.add(fn);\n return fn.asPromise();\n }\n\n async enqueue(fn: QueueFunction<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const queueFn = async () => {\n try {\n resolve(await fn());\n } catch (e) {\n reject(e);\n } finally {\n this.processing = false;\n this.processNext();\n }\n };\n this.queue.push(queueFn);\n if (!this.processing) {\n this.processNext();\n }\n });\n }\n\n processNext() {\n if (this.queue.length > 0 && !this.processing) {\n this.processing = true;\n const queueFn = this.queue.shift();\n if (queueFn) {\n queueFn().finally(() => {\n /**/\n });\n }\n }\n if (this.queue.length === 0 && !this.processing) {\n const toResolve = Array.from(this._waitIdleItems);\n this._waitIdleItems.clear();\n toResolve.map((fn) => fn.resolve());\n }\n }\n}\n","import { FileTransactionMeta, CarTransaction } from \"../types.js\";\nimport {\n AnyBlock,\n AnyLink,\n CarGroup,\n CarHeader,\n CarLog,\n CarMakeable,\n CarStore,\n CommitOpts,\n DbMeta,\n FileStore,\n FroozenCarLog,\n MetaStore,\n toCIDBlock,\n TransactionMeta,\n WALStore,\n} from \"./types.js\";\nimport * as CBW from \"@ipld/car/buffer-writer\";\nimport { ByteView, CID } from \"multiformats\";\nimport { encode } from \"../runtime/wait-pr-multiformats/block.js\";\nimport { AsyncBlockEncoder } from \"../runtime/wait-pr-multiformats/codec-interface.js\";\n// import { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as dagCodec from \"@ipld/dag-cbor\";\nimport { CarTransactionImpl } from \"./transaction.js\";\nimport { sha256 } from \"multiformats/hashes/sha2\";\n\nasync function encodeCarFile(\n roots: AnyLink[],\n t: CarMakeable,\n codec: AsyncBlockEncoder<24, ByteView<Uint8Array>>,\n): Promise<AnyBlock> {\n let size = 0;\n const headerSize = CBW.headerLength({ roots } as { roots: CID<unknown, number, number, 1>[] });\n size += headerSize;\n for await (const { cid, bytes } of t.entries()) {\n size += CBW.blockLength({ cid, bytes } as CBW.Block);\n }\n const buffer = new Uint8Array(size);\n const writer = CBW.createWriter(buffer.buffer, { headerSize });\n\n for (const r of roots) {\n writer.addRoot(r as CID<unknown, number, number, 1>);\n }\n\n for await (const { cid, bytes } of t.entries()) {\n // console.log(\"encodeCarFile\", cid.toString(), bytes.length);\n writer.write({ cid, bytes } as CBW.Block);\n }\n writer.close();\n return await encode({ value: writer.bytes, hasher: sha256, codec });\n}\n\nexport async function createCarFile(\n encoder: AsyncBlockEncoder<24, Uint8Array>,\n cid: AnyLink,\n t: CarTransaction,\n): Promise<{ cid: AnyLink; bytes: Uint8Array }> {\n // try {\n return encodeCarFile([cid], t, encoder);\n // const keycr = await store.keyedCrypto()\n // return keycr.isEncrypting\n // ? await encryptedEncodeCarFile(this.logger, keycr, cid, t)\n // : await encodeCarFile([cid], t);\n // } catch (e) {\n // throw store.logger.Error().Err(e).Msg(\"error creating car file\").AsError();\n // }\n}\n\nexport async function commitFiles(\n fileStore: FileStore,\n walStore: WALStore,\n t: CarTransaction,\n done: TransactionMeta,\n // opts: CommitOpts = { noLoader: false, compact: false },\n): Promise<CarGroup> {\n const { files: roots } = makeFileCarHeader(done as FileTransactionMeta) as {\n files: AnyLink[];\n };\n const cids: AnyLink[] = [];\n // const fileStore = await this.fileStore();\n const codec = await fileStore.keyedCrypto().then((i) => i.codec());\n const cars = await prepareCarFilesFiles(codec, roots, t);\n for (const car of cars) {\n const { cid, bytes } = car;\n // real deal\n await fileStore.save({ cid, bytes });\n await walStore.enqueueFile(cid /*, !!opts.public*/);\n cids.push(cid);\n }\n return cids;\n}\n\nfunction makeFileCarHeader(result: FileTransactionMeta): TransactionMeta {\n const files: AnyLink[] = [];\n for (const [, meta] of Object.entries(result.files || {})) {\n if (meta && typeof meta === \"object\" && \"cid\" in meta && meta !== null) {\n files.push(meta.cid as AnyLink);\n }\n }\n return { ...result, files };\n}\n\nasync function prepareCarFilesFiles(\n encoder: AsyncBlockEncoder<24, Uint8Array>,\n roots: AnyLink[],\n t: CarTransaction,\n // isPublic: boolean,\n): Promise<{ cid: AnyLink; bytes: Uint8Array }[]> {\n // const theKey = isPublic ? null : await this._getKey();\n // const kc = await store.keyedCrypto()\n // const car = kc.isEncrypting\n // ? await encryptedEncodeCarFile(this.logger, kc, roots[0], t)\n // : await encodeCarFile(roots, t);\n return [await encodeCarFile(roots, t, encoder)];\n}\n\n// PUR Commit\n\nfunction makeCarHeader<T>(meta: T, cars: CarLog, compact = false): CarHeader<T> {\n const coreHeader = compact\n ? { cars: [] as FroozenCarLog, compact: cars.asArray() }\n : { cars: cars.asArray(), compact: [] as FroozenCarLog };\n return { ...coreHeader, meta };\n}\n\nasync function encodeCarHeader<T>(fp: CarHeader<T>) {\n return (await encode({\n value: { fp },\n hasher: sha256,\n codec: dagCodec,\n })) as AnyBlock;\n}\n\nexport interface CommitParams {\n readonly encoder: AsyncBlockEncoder<24, Uint8Array>;\n readonly carLog: CarLog;\n readonly carStore: CarStore;\n readonly WALStore: WALStore;\n readonly metaStore: MetaStore;\n readonly threshold?: number;\n}\n\nexport async function commit<T>(\n params: CommitParams,\n t: CarTransaction,\n done: T,\n opts: CommitOpts = { noLoader: false, compact: false },\n): Promise<{ cgrp: CarGroup; header: CarHeader<T> }> {\n const fp = makeCarHeader<T>(done, params.carLog, !!opts.compact);\n const rootBlock = await encodeCarHeader(fp);\n\n const cars = await prepareCarFiles(params.encoder, params.threshold, rootBlock, t);\n // console.log(\n // \"commit-root\",\n // rootBlock.cid.toString(),\n // fp,\n // cars.map((c) => c.cid.toString()),\n // );\n const cids: AnyLink[] = [];\n // console.log(\"committing\", cars.map((c) => c.cid.toString()));\n for (const car of cars) {\n const { cid, bytes } = car;\n await params.carStore.save({ cid, bytes });\n cids.push(cid);\n }\n\n // await this.cacheTransaction(t);\n const newDbMeta = { cars: cids } as DbMeta;\n await params.WALStore.enqueue(newDbMeta, opts);\n await params.metaStore.save(newDbMeta);\n return { cgrp: cids, header: fp };\n}\n\nasync function prepareCarFiles(\n encoder: AsyncBlockEncoder<24, Uint8Array>,\n threshold: number | undefined,\n rootBlock: AnyBlock,\n t: CarTransaction,\n): Promise<{ cid: AnyLink; bytes: Uint8Array }[]> {\n // const theKey = isPublic ? undefined : await this._getKey();\n const carFiles: { cid: AnyLink; bytes: Uint8Array }[] = [];\n threshold = threshold || 16 * 65536;\n let clonedt = new CarTransactionImpl(t.parent, { add: false, noLoader: false });\n // console.log(\"prepareCarFiles-root\", rootBlock.cid.toString());\n clonedt.putSync(rootBlock.cid, rootBlock.bytes);\n let newsize = CBW.blockLength(toCIDBlock(rootBlock));\n let cidRootBlock = rootBlock;\n for await (const { cid, bytes } of t.entries()) {\n // console.log(\"prepareCarFiles\", cid.toString(), bytes.length);\n newsize += CBW.blockLength(toCIDBlock({ cid: cid, bytes }));\n // console.log(\"prepareCarFiles\", cid.toString(), bytes.length)\n if (newsize >= threshold) {\n carFiles.push(await createCarFile(encoder, cidRootBlock.cid, clonedt));\n clonedt = new CarTransactionImpl(t.parent, { add: false, noLoader: false });\n clonedt.putSync(cid, bytes);\n cidRootBlock = { cid, bytes };\n newsize = CBW.blockLength(toCIDBlock({ cid, bytes })); //+ CBW.blockLength(rootBlock)\n } else {\n clonedt.putSync(cid, bytes);\n }\n }\n // HEREMENO\n carFiles.push(await createCarFile(encoder, cidRootBlock.cid, clonedt));\n // console.log(\"split to \", carFiles.length, \"files\")\n return carFiles;\n}\n","import { Logger } from \"@adviser/cement\";\nimport type { ActiveStore, CarClockHead, CarClockLink, DbMeta } from \"./types.js\";\nimport { ensureLogger } from \"../utils.js\";\nimport { SuperThis } from \"../types.js\";\n\ninterface TaskItem {\n readonly cid: string;\n readonly dbMeta: DbMeta;\n readonly store: ActiveStore;\n retries: number;\n}\n\nexport interface TaskManagerParams {\n readonly removeAfter: number; // default 3\n readonly retryTimeout: number; // default 50\n}\n\nexport class TaskManager {\n // we need to remove the events after some time\n private readonly eventsWeHandled = new Set<string>();\n\n private queue: TaskItem[] = [];\n private isProcessing = false;\n\n readonly logger: Logger;\n readonly params: TaskManagerParams;\n\n readonly callback: (dbMeta: DbMeta, store: ActiveStore) => Promise<void>;\n constructor(sthis: SuperThis, callback: (dbMeta: DbMeta, store: ActiveStore) => Promise<void>, params: TaskManagerParams) {\n this.logger = ensureLogger(sthis, \"TaskManager\");\n this.callback = callback;\n this.params = params;\n }\n\n async handleEvent(cid: CarClockLink, parents: CarClockHead, dbMeta: DbMeta, store: ActiveStore) {\n for (const parent of parents) {\n this.eventsWeHandled.add(parent.toString());\n }\n this.queue.push({ cid: cid.toString(), dbMeta, retries: 0, store });\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 this.isProcessing = false;\n return;\n }\n try {\n await this.callback(first.dbMeta, first.store);\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 this.logger.Warn().Err(err).Msg(\"retry to process event block\");\n } finally {\n this.isProcessing = false;\n if (this.queue.length > 0) {\n void this.processQueue();\n }\n }\n }\n}\n","import { KeyedResolvOnce, CoerceURI, isCoerceURI, URI } from \"@adviser/cement\";\nimport { Attached, Attachable, GatewayUrls, UnReg, GatewayUrlsParam, DataAndMetaAndWalAndBaseStore } from \"../types.js\";\nimport { toStoreRuntime } from \"./store-factory.js\";\nimport {\n AttachedStores,\n Loadable,\n DataAndMetaAndWalStore,\n ActiveStore,\n DataAndMetaStore,\n LocalActiveStore,\n LocalDataAndMetaAndWalStore,\n BaseStore,\n MetaActiveStore,\n WALActiveStore,\n MetaStore,\n WALAttachedStores,\n WALStore,\n MetaAttachedStores,\n FileActiveStore,\n CarActiveStore,\n CarAttachedStores,\n CarStore,\n FileAttachedStores,\n FileStore,\n} from \"./types.js\";\nimport { ensureURIDefaults, toSortedArray } from \"../utils.js\";\n\nclass AttachedImpl implements Attached {\n readonly gatewayUrls: GatewayUrls;\n readonly stores: DataAndMetaAndWalAndBaseStore;\n private readonly unreg: UnReg;\n constructor(gws: GatewayUrls, stores: DataAndMetaAndWalStore, unreg: UnReg) {\n this.gatewayUrls = gws;\n this.stores = new DataAndMetaAndWalAndBaseStore(stores);\n this.unreg = unreg;\n }\n async detach(): Promise<void> {\n const toClose = [this.stores.car.close(), this.stores.file.close(), this.stores.meta.close()];\n if (this.stores.wal) {\n toClose.push(this.stores.wal.close());\n }\n await Promise.all(toClose);\n this.unreg();\n }\n status(): ReturnType<Attached[\"status\"]> {\n return \"attached\";\n }\n}\n\nclass FileActiveStoreImpl extends FileActiveStore {\n readonly ref: ActiveStore;\n readonly active: FileStore;\n protected readonly xattached: FileAttachedStores;\n\n constructor(ref: ActiveStore, active: FileStore, attached: FileAttachedStores) {\n super();\n this.ref = ref;\n this.active = active;\n this.xattached = attached;\n }\n local(): FileStore {\n return this.xattached.local();\n }\n remotes(): FileStore[] {\n return this.xattached.remotes();\n }\n}\n\nclass CarActiveStoreImpl extends CarActiveStore {\n readonly ref: ActiveStore;\n readonly active: CarStore;\n protected readonly xattached: CarAttachedStores;\n\n constructor(ref: ActiveStore, active: CarStore, attached: CarAttachedStores) {\n super();\n this.ref = ref;\n this.active = active;\n this.xattached = attached;\n }\n local(): CarStore {\n return this.xattached.local();\n }\n remotes(): CarStore[] {\n return [this.active, ...this.xattached.remotes().filter((i) => i !== this.active)];\n }\n}\n\nclass CarAttachedStoresImpl implements CarAttachedStores {\n readonly attached: AttachedStores;\n constructor(attached: AttachedStores) {\n this.attached = attached;\n }\n local(): CarStore {\n return this.attached.local().active.car;\n }\n remotes(): CarStore[] {\n return this.attached.remotes().map(({ active }) => active.car);\n }\n}\n\nclass FileAttachedStoresImpl implements FileAttachedStores {\n readonly attached: AttachedStores;\n constructor(attached: AttachedStores) {\n this.attached = attached;\n }\n local(): FileStore {\n return this.attached.local().active.file;\n }\n remotes(): FileStore[] {\n return this.attached.remotes().map(({ active }) => active.file);\n }\n}\n\nclass MetaActiveStoreImpl extends MetaActiveStore {\n readonly ref: ActiveStore;\n readonly active: MetaStore;\n protected readonly xattached: MetaAttachedStores;\n\n constructor(ref: ActiveStore, active: MetaStore, attached: MetaAttachedStores) {\n super();\n this.ref = ref;\n this.active = active;\n this.xattached = attached;\n }\n local(): MetaStore {\n return this.xattached.local();\n }\n remotes(): MetaStore[] {\n return [this.active, ...this.xattached.remotes().filter((i) => i !== this.active)];\n }\n}\n\nclass MetaAttachedStoresImpl implements MetaAttachedStores {\n readonly attached: AttachedStores;\n constructor(attached: AttachedStores) {\n this.attached = attached;\n }\n local(): MetaStore {\n return this.attached.local().active.meta;\n }\n remotes(): MetaStore[] {\n return this.attached.remotes().map(({ active }) => active.meta);\n }\n}\n\nclass WALActiveStoreImpl extends WALActiveStore {\n readonly ref: ActiveStore;\n readonly active: WALStore;\n protected readonly xattached: WALAttachedStores;\n\n constructor(ref: ActiveStore, active: WALStore, attached: WALAttachedStores) {\n super();\n this.ref = ref;\n this.active = active;\n this.xattached = attached;\n }\n\n local(): WALStore {\n return this.xattached.local();\n }\n remotes(): WALStore[] {\n return this.xattached.remotes();\n }\n}\n\nclass WALAttachedStoresImpl implements WALAttachedStores {\n readonly attached: AttachedStores;\n constructor(attached: AttachedStores) {\n this.attached = attached;\n }\n local(): WALStore {\n return this.attached.local().active.wal;\n }\n remotes(): WALStore[] {\n return (\n this.attached\n .remotes()\n .filter(({ active }) => active.wal)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .map(({ active }) => active.wal!)\n );\n }\n}\n\nclass ActiveStoreImpl<T extends DataAndMetaAndWalStore> implements ActiveStore {\n readonly active: T;\n readonly xattached: AttachedRemotesImpl;\n\n constructor(active: T, attached: AttachedRemotesImpl) {\n this.active = active;\n this.xattached = attached;\n }\n\n local(): LocalActiveStore {\n return this.xattached.local();\n }\n remotes(): ActiveStore[] {\n return this.xattached.remotes();\n // return [\n // this.attached.remotes().filter(i => i !== this.active)\n // ]\n }\n\n baseStores(): BaseStore[] {\n const bs: BaseStore[] = [this.active.car, this.active.file, this.active.meta];\n if (this.active.wal) {\n bs.push(this.active.wal);\n }\n return bs;\n }\n carStore(): CarActiveStore {\n return new CarActiveStoreImpl(this, this.active.car, new CarAttachedStoresImpl(this.xattached));\n }\n fileStore(): FileActiveStore {\n return new FileActiveStoreImpl(this, this.active.file, new FileAttachedStoresImpl(this.xattached));\n }\n metaStore(): MetaActiveStore {\n return new MetaActiveStoreImpl(this, this.active.meta, new MetaAttachedStoresImpl(this.xattached));\n }\n walStore(): WALActiveStore {\n if (!this.active.wal) {\n throw this.xattached.loadable.sthis.logger.Error().Msg(\"wal store not set\").AsError();\n }\n return new WALActiveStoreImpl(this, this.active.wal, new WALAttachedStoresImpl(this.xattached));\n }\n}\n\nfunction isLoadable(unknown: AttachedStores | Loadable): unknown is Loadable {\n return !!(unknown as Loadable).sthis && !!(unknown as Loadable).attachedStores;\n}\n\nexport async function createAttachedStores(\n urlOrGup: CoerceURI | GatewayUrlsParam,\n arOrLoadable: AttachedStores | Loadable,\n name = \"local\",\n): Promise<Attached> {\n let ar: AttachedStores;\n if (!isLoadable(arOrLoadable)) {\n ar = arOrLoadable;\n } else {\n ar = arOrLoadable.attachedStores;\n }\n let gup: GatewayUrlsParam;\n if (!urlOrGup) {\n throw new Error(\"urlOrGup is required\");\n }\n if (isCoerceURI(urlOrGup)) {\n const url = urlOrGup;\n gup = {\n car: { url },\n file: { url },\n meta: { url },\n wal: { url },\n };\n } else {\n gup = urlOrGup;\n }\n return await ar.attach({\n name,\n prepare: async () => gup,\n });\n}\n\nexport class AttachedRemotesImpl implements AttachedStores {\n private readonly _remotes = new KeyedResolvOnce<Attached>();\n\n readonly loadable: Loadable;\n // readonly attactedFileStore: DataStore;\n // readonly attactedCarStore: DataStore;\n // readonly attactedMetaStore: MetaStore;\n\n _local?: Attached;\n\n constructor(loadable: Loadable) {\n this.loadable = loadable;\n }\n\n forRemotes(action: (store: ActiveStore) => Promise<unknown>): Promise<void> {\n return Promise.all(this.remotes().map((i) => action(i))).then(() => undefined);\n }\n\n remotes(): ActiveStore[] {\n return this._remotes\n .values()\n .filter(({ value }) => value.isOk() && !value.Ok().stores.wal)\n .map(({ value }) => value.Ok().stores)\n .map((i) => this.activate(i));\n }\n\n local(): LocalActiveStore {\n if (!this._local) {\n throw this.loadable.sthis.logger.Error().Msg(\"local store not set\").AsError();\n }\n return new ActiveStoreImpl(this._local.stores as LocalDataAndMetaAndWalStore, this);\n }\n\n activate(store: DataAndMetaStore | CoerceURI): ActiveStore {\n if (isCoerceURI(store)) {\n const activateUrl = URI.from(store);\n let maxScore = 0;\n let maxStore: DataAndMetaStore | undefined;\n for (const { value } of this._remotes.values()) {\n if (value.isErr()) {\n continue;\n }\n for (const url of value.Ok().stores.baseStores.map((i) => i.url())) {\n const mr = url.match(activateUrl);\n if (mr.score > maxScore) {\n maxScore = mr.score;\n maxStore = value.Ok().stores;\n }\n }\n }\n if (!maxStore) {\n throw this.loadable.sthis.logger.Error().Url(activateUrl).Msg(\"no store found\").AsError();\n }\n store = maxStore;\n }\n return new ActiveStoreImpl(store as DataAndMetaStore, this);\n }\n\n async detach(): Promise<void> {\n await Promise.all(\n this._remotes.values().map(async ({ value: rvalue }) => {\n if (rvalue.isOk()) {\n await rvalue.Ok().detach();\n }\n }),\n );\n }\n\n async attach(attached: Attachable): Promise<Attached> {\n const gwp = await attached.prepare();\n const gws: GatewayUrls = {\n car: {\n ...gwp.car,\n url: ensureURIDefaults(this.loadable.sthis, attached.name, gwp.car.url, URI.from(gwp.car.url), \"car\"),\n },\n file: {\n ...gwp.file,\n url: ensureURIDefaults(this.loadable.sthis, attached.name, undefined, URI.from(gwp.file.url), \"file\", { file: true }),\n },\n meta: {\n ...gwp.meta,\n url: ensureURIDefaults(this.loadable.sthis, attached.name, undefined, URI.from(gwp.meta.url), \"meta\"),\n },\n wal: gwp.wal\n ? {\n ...gwp.wal,\n url: ensureURIDefaults(this.loadable.sthis, attached.name, undefined, URI.from(gwp.wal.url), \"wal\"),\n }\n : undefined,\n };\n const key = JSON.stringify(\n toSortedArray({\n carUrl: gws.car.url.toString(),\n filesUrl: gws.file.url.toString(),\n metaUrl: gws.meta.url.toString(),\n walUrl: gws.wal?.url.toString(),\n }),\n );\n\n return this._remotes.get(key).once(async () => {\n const rt = toStoreRuntime(this.loadable.sthis);\n const result = new AttachedImpl(\n gws,\n await rt.makeStores({\n byStore: gws,\n loader: this.loadable,\n }),\n () => {\n this._remotes.unget(key);\n },\n );\n if (result.stores.wal) {\n if (this._local) {\n throw this.loadable.sthis.logger.Error().Msg(\"local store could only set once\").AsError();\n }\n this._local = result;\n }\n return result;\n });\n }\n}\n","import { CryptoRuntime, Logger, URI } from \"@adviser/cement\";\nimport {\n BytesAndKeyWithIv,\n CodecOpts,\n IvAndKeyAndBytes,\n IvKeyIdData,\n CryptoAction,\n KeysByFingerprint,\n} from \"../blockstore/index.js\";\nimport { ensureLogger, UInt8ArrayEqual } from \"../utils.js\";\nimport { KeyBag } from \"./key-bag.js\";\nimport type { AsyncBlockCodec, ByteView } from \"./wait-pr-multiformats/codec-interface.js\";\nimport { base58btc } from \"multiformats/bases/base58\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as CBOR from \"cborg\";\nimport { PARAM, SuperThis } from \"../types.js\";\n\ninterface GenerateIVFn {\n calc(ko: CryptoAction, crypto: CryptoRuntime, data: Uint8Array): Promise<Uint8Array>;\n verify(ko: CryptoAction, crypto: CryptoRuntime, iv: Uint8Array, data: Uint8Array): Promise<boolean>;\n}\n\nconst generateIV: Record<string, GenerateIVFn> = {\n random: {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n calc: async (ko: CryptoAction, crypto: CryptoRuntime, data: Uint8Array): Promise<Uint8Array> => {\n return crypto.randomBytes(ko.ivLength);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n verify: async (ko: CryptoAction, crypto: CryptoRuntime, iv: Uint8Array, data: Uint8Array): Promise<boolean> => {\n return true;\n },\n },\n hash: {\n calc: async (ko: CryptoAction, crypto: CryptoRuntime, data: Uint8Array): Promise<Uint8Array> => {\n const hash = await hasher.digest(data);\n const hashBytes = new Uint8Array(hash.bytes);\n const hashArray = new Uint8Array(ko.ivLength);\n for (let i = 0; i < hashBytes.length; i++) {\n hashArray[i % ko.ivLength] ^= hashBytes[i];\n }\n return hashArray;\n },\n verify: async function (ko: CryptoAction, crypto: CryptoRuntime, iv: Uint8Array, data: Uint8Array): Promise<boolean> {\n return ko.url.getParam(PARAM.IV_VERIFY) !== \"disable\" && UInt8ArrayEqual(iv, await this.calc(ko, crypto, data));\n },\n },\n};\n\nfunction getGenerateIVFn(url: URI, opts: Partial<CodecOpts>): GenerateIVFn {\n const ivhash = opts.ivCalc || url.getParam(PARAM.IV_HASH) || \"hash\";\n return generateIV[ivhash] || generateIV[\"hash\"];\n}\n\nexport class BlockIvKeyIdCodec implements AsyncBlockCodec<24, Uint8Array, IvKeyIdData> {\n readonly code = 24;\n readonly name = \"Fireproof@encrypted-block:aes-gcm\";\n\n readonly ko: CryptoAction;\n readonly iv?: Uint8Array;\n readonly opts: Partial<CodecOpts>;\n constructor(ko: CryptoAction, iv?: Uint8Array, opts?: CodecOpts) {\n this.ko = ko;\n this.iv = iv;\n this.opts = opts || {};\n }\n\n // hashAsBytes(data: IvKeyIdData): AsyncHashAsBytes<Uint8Array<ArrayBufferLike>> {\n // return data;\n // }\n\n valueToHashBytes(value: IvKeyIdData): Promise<ByteView<unknown>> {\n return Promise.resolve(value.data);\n }\n bytesToHash(data: Uint8Array): Promise<ByteView<unknown>> {\n return Promise.resolve(data);\n }\n\n async encode(data: Uint8Array): Promise<Uint8Array> {\n const calcIv = this.iv || (await getGenerateIVFn(this.ko.url, this.opts).calc(this.ko, this.ko.crypto, data));\n const { iv } = this.ko.algo(calcIv);\n\n const defKey = await this.ko.key.get();\n if (!defKey) {\n throw this.ko.logger.Error().Msg(\"default key not found\").AsError();\n }\n const keyId = base58btc.decode(defKey?.fingerPrint);\n this.ko.logger.Debug().Str(\"fp\", defKey.fingerPrint).Msg(\"encode\");\n return CBOR.encode({\n iv: iv,\n keyId: keyId,\n data: await this.ko._encrypt({ iv, key: defKey.key, bytes: data }),\n } satisfies IvKeyIdData);\n }\n\n async decode(abytes: Uint8Array | ArrayBuffer): Promise<IvKeyIdData> {\n let bytes: Uint8Array;\n if (abytes instanceof Uint8Array) {\n bytes = abytes;\n } else {\n bytes = new Uint8Array(abytes);\n }\n const { iv, keyId, data } = CBOR.decode(bytes) as IvKeyIdData;\n const key = await this.ko.key.get(keyId);\n if (!key) {\n throw this.ko.logger.Error().Str(\"fp\", base58btc.encode(keyId)).Msg(\"keyId not found\").AsError();\n }\n const result = await this.ko._decrypt({ iv: iv, key: key.key, bytes: data });\n if (!this.opts?.noIVVerify && !(await getGenerateIVFn(this.ko.url, this.opts).verify(this.ko, this.ko.crypto, iv, result))) {\n throw this.ko.logger.Error().Msg(\"iv missmatch\").AsError();\n }\n return {\n iv,\n keyId,\n data: result,\n };\n }\n}\n\nclass cryptoAction implements CryptoAction {\n readonly code = 24;\n readonly ivLength = 12;\n readonly logger: Logger;\n readonly crypto: CryptoRuntime;\n readonly key: KeysByFingerprint;\n readonly isEncrypting = true;\n readonly url: URI;\n constructor(url: URI, key: KeysByFingerprint, cyopt: CryptoRuntime, sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"cryptoAction\");\n this.crypto = cyopt;\n this.key = key;\n this.url = url;\n }\n\n // keyByFingerPrint(id: Uint8Array | string): Promise<Result<KeyWithFingerPrint>> {\n // return this.key.get(id)\n // }\n\n // fingerPrint(): Promise<string> {\n // return this.key.get().then((k) => k.fingerPrint);\n // }\n codec(iv?: Uint8Array, opts?: CodecOpts): AsyncBlockCodec<24, Uint8Array, IvKeyIdData> {\n return new BlockIvKeyIdCodec(this, iv, opts);\n }\n algo(iv?: Uint8Array) {\n return {\n name: \"AES-GCM\",\n iv: iv || this.crypto.randomBytes(this.ivLength),\n tagLength: 128,\n };\n }\n async _decrypt(data: IvAndKeyAndBytes): Promise<Uint8Array> {\n // this.logger.Debug().Len(data.bytes, \"bytes\").Len(data.iv, \"iv\").Str(\"fp\", data.key).Msg(\"decrypting\");\n return new Uint8Array(await this.crypto.decrypt(this.algo(data.iv), data.key, data.bytes));\n }\n async _encrypt(data: BytesAndKeyWithIv): Promise<Uint8Array> {\n // const key = await this.key.get()\n // this.logger.Debug().Len(data.bytes).Str(\"fp\", key.fingerPrint).Msg(\"encrypting\");\n const a = this.algo(data.iv);\n return new Uint8Array(await this.crypto.encrypt(a, data.key, data.bytes));\n }\n}\n\nclass nullCodec implements AsyncBlockCodec<24, Uint8Array, IvKeyIdData> {\n readonly code = 24;\n readonly name = \"Fireproof@unencrypted-block\";\n readonly empty = new Uint8Array();\n\n async encode(data: Uint8Array): Promise<Uint8Array> {\n return data;\n }\n async decode(data: Uint8Array): Promise<IvKeyIdData> {\n return {\n iv: this.empty,\n keyId: this.empty,\n data: data,\n };\n }\n}\n\nclass noCrypto implements CryptoAction {\n readonly ivLength = 0;\n readonly code = 0x0;\n readonly name = \"Fireproof@unencrypted-block\";\n readonly logger: Logger;\n readonly crypto: CryptoRuntime;\n readonly key: KeysByFingerprint;\n readonly isEncrypting = false;\n readonly _fingerPrint = \"noCrypto:\" + Math.random();\n readonly url: URI;\n constructor(url: URI, cyrt: CryptoRuntime, sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"noCrypto\");\n this.crypto = cyrt;\n this.key = {\n id: sthis.nextId().str,\n name: \"noCrypto\",\n get: () => {\n throw this.logger.Error().Msg(\"noCrypto.get not implemented\").AsError();\n },\n upsert: () => {\n throw this.logger.Error().Msg(\"noCrypto.upsert not implemented\").AsError();\n },\n asKeysItem: () => {\n throw this.logger.Error().Msg(\"noCrypto.asKeysItem not implemented\").AsError();\n },\n };\n this.url = url;\n }\n\n fingerPrint(): Promise<string> {\n return Promise.resolve(this._fingerPrint);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n codec(iv?: Uint8Array): AsyncBlockCodec<24, Uint8Array, IvKeyIdData> {\n return new nullCodec();\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n algo(iv?: Uint8Array): { name: string; iv: Uint8Array; tagLength: number } {\n return {\n name: \"noCrypto\",\n iv: new Uint8Array(),\n tagLength: 0,\n };\n }\n _decrypt(): Promise<Uint8Array> {\n throw this.logger.Error().Msg(\"noCrypto.decrypt not implemented\").AsError();\n }\n _encrypt(): Promise<Uint8Array> {\n throw this.logger.Error().Msg(\"noCrypto.decrypt not implemented\").AsError();\n }\n}\n\nexport async function keyedCryptoFactory(url: URI, kb: KeyBag, sthis: SuperThis): Promise<CryptoAction> {\n const storekey = url.getParam(PARAM.STORE_KEY);\n if (storekey && storekey !== \"insecure\") {\n const rkey = await kb.getNamedKey(storekey, false);\n if (rkey.isErr()) {\n // try {\n // rkey = await kb.toKeyWithFingerPrint(storekey);\n // } catch (e) {\n throw (\n sthis.logger\n .Error()\n // .Err(e)\n .Str(\"keybag\", kb.rt.id())\n // .Result(\"key\", rkey)\n .Str(\"name\", storekey)\n .Msg(\"getNamedKey failed\")\n .AsError()\n );\n // }\n }\n return new cryptoAction(url, rkey.Ok(), kb.rt.crypto, sthis);\n }\n return new noCrypto(url, kb.rt.crypto, sthis);\n}\n","import { Result, URI } from \"@adviser/cement\";\nimport type {\n SerdeGateway,\n SerdeGatewayBuildUrlReturn,\n SerdeGatewayCloseReturn,\n SerdeGatewayCtx,\n SerdeGatewayDeleteReturn,\n SerdeGatewayDestroyReturn,\n SerdeGatewayGetReturn,\n SerdeGatewayInterceptor,\n SerdeGatewayPutReturn,\n SerdeGatewayStartReturn,\n SerdeGatewaySubscribeReturn,\n SerdeGetResult,\n UnsubscribeResult,\n VoidResult,\n} from \"./serde-gateway.js\";\nimport type { SuperThis } from \"../types.js\";\nimport { FPEnvelope, FPEnvelopeMeta } from \"./fp-envelope.js\";\n\nexport class PassThroughGateway implements SerdeGatewayInterceptor {\n async buildUrl(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<SerdeGatewayBuildUrlReturn>> {\n const op = { url, key };\n return Result.Ok({ op });\n }\n async start(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayStartReturn>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async close(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayCloseReturn>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async delete(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDeleteReturn>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async destroy(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDestroyReturn>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async put<T>(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope<T>): Promise<Result<SerdeGatewayPutReturn<T>>> {\n const op = { url, body };\n return Result.Ok({ op });\n }\n async get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayGetReturn<S>>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async subscribe(\n ctx: SerdeGatewayCtx,\n url: URI,\n callback: (meta: FPEnvelopeMeta) => Promise<void>,\n ): Promise<Result<SerdeGatewaySubscribeReturn>> {\n const op = { url, callback };\n return Result.Ok({ op });\n }\n}\n\nconst passThrougthGateway = new PassThroughGateway();\n\nexport class InterceptorGateway implements SerdeGateway {\n readonly innerGW: SerdeGateway;\n readonly interceptor: SerdeGatewayInterceptor;\n\n constructor(sthis: SuperThis, innerGW: SerdeGateway, interceptor: SerdeGatewayInterceptor | undefined) {\n this.innerGW = innerGW;\n this.interceptor = interceptor || passThrougthGateway;\n }\n\n async buildUrl(ctx: SerdeGatewayCtx, baseUrl: URI, key: string): Promise<Result<URI>> {\n const rret = await this.interceptor.buildUrl(ctx, baseUrl, key);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.buildUrl(ctx, ret.op.url, ret.op.key);\n }\n\n async destroy(ctx: SerdeGatewayCtx, iurl: URI): Promise<Result<void>> {\n const rret = await this.interceptor.destroy(ctx, iurl);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.destroy(ctx, ret.op.url);\n }\n\n async start(ctx: SerdeGatewayCtx, url: URI): Promise<Result<URI>> {\n const rret = await this.interceptor.start(ctx, url);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return await this.innerGW.start(ctx, ret.op.url);\n }\n\n async close(ctx: SerdeGatewayCtx, url: URI): Promise<VoidResult> {\n const rret = await this.interceptor.close(ctx, url);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return await this.innerGW.close(ctx, ret.op.url);\n }\n\n async put<T>(ctx: SerdeGatewayCtx, url: URI, fpEnv: FPEnvelope<T>): Promise<VoidResult> {\n const rret = await this.interceptor.put(ctx, url, fpEnv);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.put(ctx, ret.op.url, ret.op.body);\n }\n\n async get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<SerdeGetResult<S>> {\n const rret = await this.interceptor.get<S>(ctx, url);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.get(ctx, ret.op.url);\n }\n\n async subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (msg: FPEnvelopeMeta) => Promise<void>): Promise<UnsubscribeResult> {\n if (!this.innerGW.subscribe) {\n return Result.Err(ctx.loader.sthis.logger.Error().Url(url).Msg(\"subscribe not supported\").AsError());\n }\n const rret = await this.interceptor.subscribe(ctx, url, callback);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.subscribe(ctx, ret.op.url, ret.op.callback);\n }\n\n async delete(ctx: SerdeGatewayCtx, url: URI): Promise<VoidResult> {\n const rret = await this.interceptor.delete(ctx, url);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.delete(ctx, url);\n }\n\n async getPlain(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<Uint8Array>> {\n return this.innerGW.getPlain(ctx, url, key);\n }\n}\n","import { URI, Promisable, Result } from \"@adviser/cement\";\nimport { PassThroughGateway } from \"./interceptor-gateway.js\";\nimport {\n SerdeGatewayBuildUrlReturn,\n SerdeGatewayCloseReturn,\n SerdeGatewayCtx,\n SerdeGatewayDeleteReturn,\n SerdeGatewayDestroyReturn,\n SerdeGatewayGetReturn,\n SerdeGatewayPutReturn,\n SerdeGatewayStartReturn,\n SerdeGatewaySubscribeReturn,\n} from \"./serde-gateway.js\";\nimport { FPEnvelope, FPEnvelopeMeta } from \"./fp-envelope.js\";\n\nexport type URIMapper = (uri: URI) => Promisable<URI>;\n\nexport class URIInterceptor extends PassThroughGateway {\n static withMapper(mapper: URIMapper): URIInterceptor {\n return new URIInterceptor().addMapper(mapper);\n }\n\n readonly #uriMapper = new Set<URIMapper>();\n\n addMapper(mapper: URIMapper): URIInterceptor {\n this.#uriMapper.add(mapper);\n return this;\n }\n\n async #map(uri: URI): Promise<URI> {\n let ret = uri;\n for (const mapper of this.#uriMapper) {\n ret = await mapper(ret);\n }\n return ret;\n }\n\n async buildUrl(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<SerdeGatewayBuildUrlReturn>> {\n const ret = await super.buildUrl(ctx, await this.#map(url), key);\n return ret;\n }\n async start(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayStartReturn>> {\n const ret = await super.start(ctx, await this.#map(url));\n return ret;\n }\n async close(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayCloseReturn>> {\n const ret = await super.close(ctx, await this.#map(url));\n return ret;\n }\n async delete(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDeleteReturn>> {\n const ret = await super.delete(ctx, await this.#map(url));\n return ret;\n }\n async destroy(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDestroyReturn>> {\n const ret = await super.destroy(ctx, await this.#map(url));\n return ret;\n }\n async put<T>(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope<T>): Promise<Result<SerdeGatewayPutReturn<T>>> {\n const ret = await super.put<T>(ctx, await this.#map(url), body);\n return ret;\n }\n async get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayGetReturn<S>>> {\n const ret = await super.get<S>(ctx, await this.#map(url));\n return ret;\n }\n async subscribe(\n ctx: SerdeGatewayCtx,\n url: URI,\n callback: (meta: FPEnvelopeMeta) => Promise<void>,\n ): Promise<Result<SerdeGatewaySubscribeReturn>> {\n const ret = await super.subscribe(ctx, await this.#map(url), callback);\n return ret;\n }\n}\n","import { encode, decode, Block } from \"./runtime/wait-pr-multiformats/block.js\";\nimport { parse } from \"multiformats/link\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as codec from \"@ipld/dag-cbor\";\nimport { put, get, entries, root } from \"@web3-storage/pail/crdt\";\nimport { EventBlockView, EventLink, Operation, PutOperation, Result } 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 BlockFetcher,\n TransactionMeta,\n AnyLink,\n StoreRuntime,\n CompactFetcher,\n} from \"./blockstore/index.js\";\nimport {\n type IndexKeyType,\n type DocUpdate,\n type ClockHead,\n type DocValue,\n type CRDTMeta,\n type ChangesOptions,\n type DocFileMeta,\n type DocFiles,\n type DocSet,\n type DocWithId,\n type DocTypes,\n throwFalsy,\n CarTransaction,\n BaseBlockstore,\n PARAM,\n} from \"./types.js\";\nimport { Logger } from \"@adviser/cement\";\nimport { CarTransactionImpl } from \"./blockstore/transaction.js\";\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 function sanitizeDocumentFields<T>(obj: T): T {\n if (Array.isArray(obj)) {\n return obj.map((item: unknown) => {\n if (typeof item === \"object\" && item !== null) {\n return sanitizeDocumentFields(item);\n }\n return item;\n }) as T;\n } else if (typeof obj === \"object\" && obj !== null) {\n // Special case for Date objects - convert to ISO string\n if (obj instanceof Date) {\n return obj.toISOString() as unknown as T;\n }\n\n const typedObj = obj as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n for (const key in typedObj) {\n if (Object.hasOwnProperty.call(typedObj, key)) {\n const value = typedObj[key];\n if (value === null || (!Number.isNaN(value) && value !== undefined)) {\n if (typeof value === \"object\" && !key.startsWith(\"_\")) {\n // Handle Date objects in properties\n if (value instanceof Date) {\n result[key] = (value as Date).toISOString();\n } else {\n const sanitized = sanitizeDocumentFields(value);\n result[key] = sanitized;\n }\n } else {\n result[key] = value;\n }\n }\n }\n }\n return result as T;\n }\n return obj;\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 } satisfies CRDTMeta;\n}\n\n// this whole thing can get pulled outside of the write queue\nasync function writeDocContent<T extends DocTypes>(\n store: StoreRuntime,\n blocks: CarTransaction,\n update: DocUpdate<T>,\n logger: Logger,\n): Promise<AnyLink> {\n let value: Partial<DocValue<T>>;\n if (update.del) {\n value = { del: true };\n } else {\n if (!update.value) throw logger.Error().Msg(\"Missing value\").AsError();\n await processFiles(store, blocks, update.value, logger);\n value = { doc: update.value as DocWithId<T> };\n }\n const block = await encode({ value, hasher, codec });\n blocks.putSync(block.cid, block.bytes);\n return block.cid;\n}\n\nasync function processFiles<T extends DocTypes>(store: StoreRuntime, blocks: CarTransaction, doc: DocSet<T>, logger: Logger) {\n if (doc._files) {\n await processFileset(logger, store, blocks, doc._files);\n }\n if (doc._publicFiles) {\n await processFileset(logger, store, blocks, doc._publicFiles /*, true*/);\n }\n}\n\nasync function processFileset(\n logger: Logger,\n store: StoreRuntime,\n blocks: CarTransaction,\n files: DocFiles /*, publicFiles = false */,\n) {\n const dbBlockstore = blocks.parent as unknown as EncryptedBlockstore;\n if (!dbBlockstore.loader) throw logger.Error().Msg(\"Missing loader, ledger name is required\").AsError();\n const t = new CarTransactionImpl(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, lastModified: file.lastModified } as DocFileMeta;\n } else {\n const { cid, type, size, car, lastModified } = files[filename] as DocFileMeta;\n if (cid && type && size && car) {\n files[filename] = { cid, type, size, car, lastModified };\n }\n }\n }\n\n if (didPut.length) {\n const car = await dbBlockstore.loader.commitFiles(\n t,\n { files } as unknown as TransactionMeta /* {\n public: publicFiles,\n } */,\n );\n if (car) {\n for (const name of didPut) {\n files[name] = { car, ...files[name] } as DocFileMeta;\n }\n }\n }\n}\n\nexport async function getValueFromCrdt<T extends DocTypes>(\n blocks: BaseBlockstore,\n head: ClockHead,\n key: string,\n logger: Logger,\n): Promise<DocValue<T>> {\n if (!head.length) throw logger.Debug().Msg(\"Getting from an empty ledger\").AsError();\n // console.log(\"getValueFromCrdt-1\", head, key)\n const link = await get(blocks, head, key);\n // console.log(\"getValueFromCrdt-2\", key)\n if (!link) throw logger.Error().Str(\"key\", key).Msg(`Missing key`).AsError();\n const ret = await getValueFromLink<T>(blocks, link, logger);\n // console.log(\"getValueFromCrdt-3\", key)\n return ret;\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 const result = await blocks.ebOpts.storeRuntime.decodeFile(\n {\n get: async (cid: AnyLink) => {\n return await blocks.getFile(throwFalsy(fileMeta.car), cid);\n },\n },\n fileMeta.cid,\n fileMeta,\n );\n if (result.isErr()) {\n throw blocks.logger.Error().Any(\"error\", result.Err()).Any(\"cid\", fileMeta.cid).Msg(\"Error decoding file\").AsError();\n }\n\n return result.unwrap();\n };\n }\n }\n files[filename] = fileMeta;\n }\n}\n\nasync function getValueFromLink<T extends DocTypes>(blocks: BlockFetcher, link: AnyLink, logger: Logger): Promise<DocValue<T>> {\n const block = await blocks.get(link);\n if (!block) throw logger.Error().Str(\"link\", link.toString()).Msg(`Missing linked block`).AsError();\n const { value } = (await decode({ bytes: block.bytes, hasher, codec })) as { value: DocValue<T> };\n const cvalue = {\n ...value,\n cid: link,\n };\n readFiles(blocks as EncryptedBlockstore, cvalue);\n return cvalue;\n}\n\nclass DirtyEventFetcher<T> extends EventFetcher<T> {\n readonly logger: Logger;\n constructor(logger: Logger, blocks: BlockFetcher) {\n super(blocks);\n this.logger = logger;\n }\n async get(link: EventLink<T>): Promise<EventBlockView<T>> {\n try {\n return super.get(link);\n } catch (e) {\n this.logger.Error().Ref(\"link\", link.toString()).Err(e).Msg(\"Missing event\");\n return { value: undefined } as unknown as EventBlockView<T>;\n }\n }\n}\n\nexport async function clockChangesSince<T extends DocTypes>(\n blocks: BlockFetcher,\n head: ClockHead,\n since: ClockHead,\n opts: ChangesOptions,\n logger: Logger,\n): Promise<{ result: DocUpdate<T>[]; head: ClockHead }> {\n const eventsFetcher = (\n opts.dirty ? new DirtyEventFetcher<Operation>(logger, blocks) : new EventFetcher<Operation>(blocks)\n ) as EventFetcher<Operation>;\n const keys = new Set<string>();\n const updates = await gatherUpdates<T>(\n blocks,\n eventsFetcher,\n head,\n since,\n [],\n keys,\n new Set<string>(),\n opts.limit || Infinity,\n logger,\n );\n return { result: updates.reverse(), head };\n}\n\nasync function gatherUpdates<T extends DocTypes>(\n blocks: BlockFetcher,\n eventsFetcher: EventFetcher<Operation>,\n head: ClockHead,\n since: ClockHead,\n updates: DocUpdate<T>[] = [],\n keys: Set<string>,\n didLinks: Set<string>,\n limit: number,\n logger: Logger,\n): Promise<DocUpdate<T>[]> {\n if (limit <= 0) return updates;\n // if (Math.random() < 0.001) console.log('gatherUpdates', head.length, since.length, updates.length)\n const sHead = head.map((l) => l.toString());\n for (const link of since) {\n if (sHead.includes(link.toString())) {\n return updates;\n }\n }\n for (const link of head) {\n if (didLinks.has(link.toString())) continue;\n didLinks.add(link.toString());\n const { value: event } = await eventsFetcher.get(link);\n if (!event) continue;\n const { type } = event.data;\n let ops = [] as PutOperation[];\n if (type === \"batch\") {\n ops = event.data.ops as PutOperation[];\n } else if (type === \"put\") {\n ops = [event.data] as PutOperation[];\n }\n for (let i = ops.length - 1; i >= 0; i--) {\n const { key, value } = ops[i];\n if (!keys.has(key)) {\n // todo option to see all updates\n const docValue = await getValueFromLink<T>(blocks, value, logger);\n if (key === PARAM.GENESIS_CID) {\n continue;\n }\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 if (key !== PARAM.GENESIS_CID) {\n const docValue = await getValueFromLink(blocks, link, logger);\n yield { id: key, value: docValue.doc, del: docValue.del } as DocUpdate<T>;\n }\n }\n}\n\nexport async function* clockVis(blocks: BlockFetcher, head: ClockHead) {\n for await (const line of vis(blocks, head)) {\n yield line;\n }\n}\n\nlet isCompacting = false;\nexport async function doCompact(blockLog: CompactFetcher, head: ClockHead, logger: Logger) {\n if (isCompacting) {\n // console.log('already compacting')\n return;\n }\n isCompacting = true;\n\n time(\"compact head\");\n for (const cid of head) {\n const bl = await blockLog.get(cid);\n if (!bl) throw logger.Error().Ref(\"cid\", cid).Msg(\"Missing head block\").AsError();\n }\n timeEnd(\"compact head\");\n\n // for await (const blk of blocks.entries()) {\n // const bl = await blockLog.get(blk.cid)\n // if (!bl) throw new Error('Missing tblock: ' + blk.cid.toString())\n // }\n\n // todo maybe remove\n // for await (const blk of blocks.loader!.entries()) {\n // const bl = await blockLog.get(blk.cid)\n // if (!bl) throw new Error('Missing db block: ' + blk.cid.toString())\n // }\n\n time(\"compact all entries\");\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _entry of getAllEntries(blockLog, head, logger)) {\n // result.push(entry)\n // void 1;\n continue;\n }\n timeEnd(\"compact all entries\");\n\n // time(\"compact crdt entries\")\n // for await (const [, link] of entries(blockLog, head)) {\n // const bl = await blockLog.get(link)\n // if (!bl) throw new Error('Missing entry block: ' + link.toString())\n // }\n // timeEnd(\"compact crdt entries\")\n\n time(\"compact clock vis\");\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _line of vis(blockLog, head)) {\n void 1;\n }\n timeEnd(\"compact clock vis\");\n\n time(\"compact root\");\n const result = await root(blockLog, head);\n timeEnd(\"compact root\");\n\n time(\"compact root blocks\");\n for (const { cid, bytes } of [...result.additions, ...result.removals]) {\n blockLog.loggedBlocks.putSync(cid, bytes);\n }\n timeEnd(\"compact root blocks\");\n\n time(\"compact changes\");\n await clockChangesSince(blockLog, head, [], {}, logger);\n timeEnd(\"compact changes\");\n\n isCompacting = false;\n}\n\nexport async function getBlock(blocks: BlockFetcher, cidString: string) {\n const block = await blocks.get(parse(cidString));\n if (!block) throw new Error(`Missing block ${cidString}`);\n const { cid, value } = await decode({ bytes: block.bytes, codec, hasher });\n return new Block({ cid, value, bytes: block.bytes });\n}\n","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 {\n type DocUpdate,\n type ClockHead,\n type DocTypes,\n type VoidFn,\n type UnReg,\n type SuperThis,\n type BaseBlockstore,\n type CarTransaction,\n PARAM,\n} from \"./types.js\";\nimport { applyHeadQueue, ApplyHeadQueue } from \"./apply-head-queue.js\";\nimport { ensureLogger } from \"./utils.js\";\n\nexport class CRDTClockImpl {\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 readonly head: ClockHead = [];\n\n readonly zoomers = new Map<string, VoidFn>();\n readonly watchers = new Map<string, (updates: DocUpdate<DocTypes>[]) => void>();\n readonly emptyWatchers = new Map<string, VoidFn>();\n\n readonly blockstore: BaseBlockstore;\n\n readonly applyHeadQueue: ApplyHeadQueue<DocTypes>;\n transaction?: CarTransaction;\n\n readonly _ready: ResolveOnce<void> = new ResolveOnce<void>();\n async ready(): Promise<void> {\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 readonly sthis: SuperThis;\n constructor(blockstore: BaseBlockstore) {\n this.sthis = blockstore.sthis;\n this.blockstore = blockstore;\n this.logger = ensureLogger(blockstore.sthis, \"CRDTClock\");\n this.applyHeadQueue = applyHeadQueue(this.int_applyHead.bind(this), this.logger);\n }\n\n setHead(head: ClockHead) {\n // this.head = head;\n this.head.splice(0, this.head.length, ...head);\n }\n\n async applyHead(newHead: ClockHead, prevHead: ClockHead, updates?: DocUpdate<DocTypes>[]): Promise<void> {\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<DocTypes>[], all: boolean, prevHead: ClockHead) {\n let internalUpdates = updatesAcc;\n if (this.watchers.size && !all) {\n const changes = await clockChangesSince<DocTypes>(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<DocTypes>[]) {\n updates = updates.filter((update) => update.id !== PARAM.GENESIS_CID);\n if (!updates.length) {\n return;\n }\n this.emptyWatchers.forEach((fn) => fn());\n this.watchers.forEach((fn) => fn(updates || []));\n }\n\n onTick(fn: (updates: DocUpdate<DocTypes>[]) => void): UnReg {\n const key = this.sthis.timeOrderedNextId().str;\n this.watchers.set(key, fn);\n return () => {\n this.watchers.delete(key);\n };\n }\n\n onTock(fn: VoidFn): UnReg {\n const key = this.sthis.timeOrderedNextId().str;\n this.emptyWatchers.set(key, fn);\n return () => {\n this.emptyWatchers.delete(key);\n };\n }\n\n onZoom(fn: VoidFn): UnReg {\n const key = this.sthis.timeOrderedNextId().str;\n this.zoomers.set(key, fn);\n return () => {\n this.zoomers.delete(key);\n };\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\n const noLoader = !localUpdates;\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 = 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 if (!this.transaction) {\n this.transaction = this.blockstore.openTransaction({ noLoader, add: false });\n }\n const tblocks = this.transaction;\n\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 if (!noLoader) {\n await this.blockstore.commitTransaction(tblocks, { head: advancedHead }, { add: false, noLoader });\n this.transaction = undefined;\n }\n this.setHead(advancedHead);\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.Error().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 await worker(task.newHead, task.prevHead, task.updates !== undefined).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","/*\n * Context class to store and retrieve values\n * it's used to store user runtime values like\n * the url to the ledger\n */\nexport class Context {\n private ctx = new Map<string, unknown>();\n\n set<T>(key: string, value: T): void {\n this.ctx.set(key, value);\n }\n get<T>(key: string): T | undefined {\n return this.ctx.get(key) as T;\n }\n delete(key: string): void {\n this.ctx.delete(key);\n }\n}\n","// export * from \"./sys-container.js\";\nexport * from \"./gateways/file/utils.js\";\n\n// export * as sql from \"./store-sql/index.js\";\nexport * as files from \"./files.js\";\n\nexport * as kb from \"./key-bag.js\";\nexport * as kc from \"./keyed-crypto.js\";\n\nexport * as mf from \"./wait-pr-multiformats/index.js\";\n\nexport * as sts from \"./sts-service/index.js\";\n\nexport { runtimeFn } from \"@adviser/cement\";\n\nexport * as gw from \"./gateways/index.js\";\n\nexport * from \"./key-bag.js\";\n\nexport * from \"./meta-key-hack.js\";\n\nexport { FILESTORE_VERSION } from \"./gateways/file/version.js\";\nexport { INDEXEDDB_VERSION } from \"./gateways/indexeddb-version.js\";\n// export { V0_19SQL_VERSION } from \"./store-sql/v0.19/version.js\";\n","export * as block from \"./block.js\";\nexport * as codec from \"./codec-interface.js\";\n","import type { ArrayBufferView, ByteView } from \"multiformats\";\n\n// export type HashAsBytes<T> = (v: T) => ByteView<unknown>;\n// export type AsyncHashAsBytes<T> =(v: T) => Promise<ByteView<unknown>>;\n\n/**\n * IPLD encoder part of the codec.\n */\nexport interface BlockEncoder<Code extends number, T> {\n readonly name: string;\n readonly code: Code;\n\n bytesToHash?(data: T): ByteView<unknown>;\n encode(data: T): ByteView<T>;\n}\n\nexport interface AsyncBlockEncoder<Code extends number, T> {\n readonly name: string;\n readonly code: Code;\n bytesToHash?(data: T): Promise<ByteView<unknown>>;\n encode(data: T): PromiseLike<ByteView<T>>;\n}\n\n/**\n * IPLD decoder part of the codec.\n */\nexport interface BlockDecoder<Code extends number, T> {\n readonly code: Code;\n valueToHashBytes?(value: T): ByteView<unknown>;\n\n // decode(bytes: ByteView<T> | ArrayBufferView<T>): T;\n // decode(bytes: ByteView<T> | ArrayBufferView<T>): PromiseLike<T>;\n decode(bytes: ByteView<unknown>): T;\n}\n\nexport interface AsyncBlockDecoder<Code extends number, T> {\n readonly code: Code;\n valueToHashBytes?(value: T): Promise<ByteView<unknown>>;\n // decode(bytes: ByteView<T> | ArrayBufferView<T>): T;\n // decode(bytes: ByteView<T> | ArrayBufferView<T>): PromiseLike<T>;\n decode(bytes: ByteView<unknown>): PromiseLike<T>;\n}\n\n/**\n * An IPLD codec is a combination of both encoder and decoder.\n */\nexport interface BlockCodec<Code extends number, E, D> extends BlockEncoder<Code, E>, BlockDecoder<Code, D> {}\nexport interface AsyncBlockCodec<Code extends number, E, D> extends AsyncBlockEncoder<Code, E>, AsyncBlockDecoder<Code, D> {}\n\nexport type { ArrayBufferView, ByteView };\n","import { Result, exception2Result } from \"@adviser/cement\";\nimport { exportJWK, importJWK, JWTVerifyResult, jwtVerify, SignJWT } from \"jose\";\nimport { generateKeyPair, GenerateKeyPairOptions } from \"jose/key/generate/keypair\";\nimport { base58btc } from \"multiformats/bases/base58\";\nimport { ensureSuperThis } from \"../../utils.js\";\nimport { SuperThis } from \"../../types.js\";\nimport { BaseTokenParam, FPCloudClaim, TokenForParam } from \"../../protocols/cloud/msg-types.js\";\n\nexport const envKeyDefaults = {\n SECRET: \"CLOUD_SESSION_TOKEN_SECRET\",\n PUBLIC: \"CLOUD_SESSION_TOKEN_PUBLIC\",\n};\n\ninterface SessionTokenServiceParam extends Partial<BaseTokenParam> {\n readonly token: string; // env encoded jwk\n}\n\ninterface SessionTokenServiceFromEnvParam extends Partial<BaseTokenParam> {\n readonly privateEnvKey?: string; // defaults CLOUD_SESSION_TOKEN_SECRET\n readonly publicEnvKey?: string; // defaults CLOUD_SESSION_TOKEN_PUBLIC\n}\n\nexport async function jwk2env(jwk: CryptoKey, sthis = ensureSuperThis()): Promise<string> {\n const inPubKey = await exportJWK(jwk);\n return base58btc.encode(sthis.txt.encode(JSON.stringify(inPubKey)));\n}\n\nexport async function env2jwk(env: string, alg: string, sthis = ensureSuperThis()): Promise<CryptoKey> {\n const inJWT = JSON.parse(sthis.txt.decode(base58btc.decode(env)));\n return importJWK(inJWT, alg, { extractable: true }) as Promise<CryptoKey>;\n}\n\nexport interface KeysResult {\n readonly material: CryptoKeyPair;\n readonly strings: { readonly publicKey: string; readonly privateKey: string };\n}\n\nexport class SessionTokenService {\n readonly #key: CryptoKey;\n readonly #param: SessionTokenServiceParam;\n\n static async generateKeyPair(\n alg = \"ES256\",\n options: GenerateKeyPairOptions = { extractable: true },\n generateKeyPairFN = (alg: string, options: GenerateKeyPairOptions) => generateKeyPair(alg, options),\n ): Promise<KeysResult> {\n const material = await generateKeyPairFN(alg, options);\n return {\n material,\n strings: {\n publicKey: await jwk2env(material.publicKey),\n privateKey: await jwk2env(material.privateKey),\n },\n };\n }\n\n static async createFromEnv(sthis: SuperThis, sp: SessionTokenServiceFromEnvParam = {}) {\n let envToken = sthis.env.get(sp.privateEnvKey ?? envKeyDefaults.SECRET);\n if (!envToken) {\n envToken = sthis.env.get(sp.publicEnvKey ?? envKeyDefaults.PUBLIC);\n }\n if (!envToken) {\n throw new Error(\n `env not found for: ${sp.privateEnvKey ?? envKeyDefaults.SECRET} or ${sp.publicEnvKey ?? envKeyDefaults.PUBLIC}`,\n );\n }\n return SessionTokenService.create({ token: envToken }, sthis);\n }\n\n static async create(stsparam: SessionTokenServiceParam, sthis: SuperThis = ensureSuperThis()) {\n const key = await env2jwk(stsparam.token, stsparam.alg ?? \"ES256\", sthis);\n return new SessionTokenService(key, stsparam);\n }\n\n private constructor(key: CryptoKey, stsparam: SessionTokenServiceParam) {\n this.#key = key;\n this.#param = stsparam;\n }\n\n get validFor() {\n let validFor = this.#param.validFor ?? 3600;\n if (!(0 <= validFor && validFor <= 3600000)) {\n validFor = 3600000;\n }\n return validFor;\n }\n\n get alg() {\n return this.#param.alg ?? \"ES256\";\n }\n\n get isssuer() {\n return this.#param.issuer ?? \"fireproof\";\n }\n\n get audience() {\n return this.#param.audience ?? \"fireproof\";\n }\n\n async validate(token: string): Promise<Result<JWTVerifyResult<FPCloudClaim>>> {\n return exception2Result(async () => {\n const ret = await jwtVerify<FPCloudClaim>(token, this.#key);\n return ret;\n });\n }\n\n // async getEnvKey(): Promise<string> {\n // return jwk2env(ensureSuperThis(), this.#key);\n // }\n\n async tokenFor(p: TokenForParam): Promise<string> {\n if (this.#key.type !== \"private\") {\n throw new Error(\"key must be private\");\n }\n const token = await new SignJWT({\n userId: p.userId,\n tenants: p.tenants,\n ledgers: p.ledgers,\n } satisfies FPCloudClaim)\n .setProtectedHeader({ alg: this.alg }) // algorithm\n .setIssuedAt()\n .setIssuer(p.issuer ?? this.isssuer) // issuer\n .setAudience(p.audience ?? this.audience) // audience\n .setExpirationTime(Date.now() + (p.validFor ?? this.validFor)) // expiration time\n .sign(this.#key);\n return token;\n }\n}\n","export * from \"./fp-envelope-serialize.js\";\nexport * as file from \"./file/index.js\";\nexport * as memory from \"./memory/gateway.js\";\nexport * as cloud from \"./cloud/gateway.js\";\nexport * from \"./def-serde-gateway.js\";\n","export * from \"./key-bag-file.js\";\nexport * from \"./sys-file-system-factory.js\";\n","// import PartySocket, { PartySocketOptions } from \"partysocket\";\nimport {\n Result,\n URI,\n KeyedResolvOnce,\n exception2Result,\n Logger,\n param,\n MatchResult,\n ResolveOnce,\n to_uint8,\n CoerceURI,\n} from \"@adviser/cement\";\nimport type { Attachable, GatewayUrlsParam, SuperThis } from \"../../../types.js\";\nimport {\n buildErrorMsg,\n buildReqOpen,\n FPStoreTypes,\n HttpMethods,\n MsgBase,\n MsgIsError,\n ReqSignedUrl,\n MsgWithError,\n ResSignedUrl,\n GwCtx,\n QSId,\n coerceFPStoreTypes,\n} from \"../../../protocols/cloud/msg-types.js\";\nimport { MsgConnected, MsgConnectedAuth, Msger, authTypeFromUri } from \"../../../protocols/cloud/msger.js\";\nimport {\n MsgIsResDelData,\n MsgIsResGetData,\n MsgIsResPutData,\n ResDelData,\n ResGetData,\n ResPutData,\n} from \"../../../protocols/cloud/msg-types-data.js\";\nimport { ensureLogger, NotFoundError } from \"../../../utils.js\";\nimport { SerdeGateway, SerdeGatewayCtx, SerdeGetResult, UnsubscribeResult, VoidResult } from \"../../../blockstore/serde-gateway.js\";\nimport { registerStoreProtocol } from \"../../../blockstore/register-store-protocol.js\";\nimport { FPEnvelope, FPEnvelopeMeta, FPEnvelopeWAL } from \"../../../blockstore/fp-envelope.js\";\nimport { dbMetaEvent2Serialized, decode2DbMetaEvents, fpDeserialize, fpSerialize } from \"../fp-envelope-serialize.js\";\nimport {\n BindGetMeta,\n buildBindGetMeta,\n buildReqDelMeta,\n buildReqPutMeta,\n EventGetMeta,\n MsgIsEventGetMeta,\n MsgIsResPutMeta,\n ReqDelMeta,\n ReqPutMeta,\n ResDelMeta,\n ResPutMeta,\n} from \"../../../protocols/cloud/msg-types-meta.js\";\nimport { encodeAsV2SerializedMetaKey, V2SerializedMetaKeyExtractKey } from \"../../meta-key-hack.js\";\n\nconst VERSION = \"v0.1-fp-cloud\";\n\ntype ConnectedSerdeGatewayCtx = SerdeGatewayCtx & { conn: AuthedConnection };\n\nexport interface StoreTypeGateway {\n get: <S>(ctx: ConnectedSerdeGatewayCtx, url: URI) => Promise<SerdeGetResult<S>>;\n put: <T>(ctx: ConnectedSerdeGatewayCtx, url: URI, body: FPEnvelope<T>) => Promise<VoidResult>;\n delete: (ctx: ConnectedSerdeGatewayCtx, url: URI) => Promise<VoidResult>;\n}\n\nabstract class BaseGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(sthis: SuperThis, module: string) {\n this.sthis = sthis;\n this.logger = ensureLogger(sthis, module);\n }\n\n async buildReqSignedUrl(\n type: string,\n method: HttpMethods,\n store: FPStoreTypes,\n uri: URI,\n conn: AuthedConnection,\n ): Promise<MsgWithError<ReqSignedUrl>> {\n const rParams = uri.getParamsResult({\n key: param.REQUIRED,\n store: param.REQUIRED,\n path: param.OPTIONAL,\n tenant: param.REQUIRED,\n name: param.REQUIRED,\n index: param.OPTIONAL,\n });\n if (rParams.isErr()) {\n return buildErrorMsg(this, {} as MsgBase, rParams.Err());\n }\n const params = rParams.Ok();\n if (store !== params.store) {\n return buildErrorMsg(this, {} as MsgBase, new Error(\"store mismatch\"));\n }\n const rAuth = await authTypeFromUri(this.logger, uri);\n if (rAuth.isErr()) {\n return buildErrorMsg(this, {} as MsgBase, rAuth.Err());\n }\n return {\n tid: this.sthis.nextId().str,\n auth: rAuth.Ok(),\n type,\n conn: conn.conn.Ok().conn,\n tenant: {\n tenant: params.tenant,\n ledger: params.name,\n },\n // tenant: conn.tenant,\n methodParams: {\n method,\n store,\n },\n params: {\n ...params,\n key: params.key,\n },\n version: VERSION,\n } satisfies ReqSignedUrl;\n }\n\n async getReqSignedUrl<S extends ResSignedUrl>(\n type: string,\n method: HttpMethods,\n store: FPStoreTypes,\n waitForFn: (msg: MsgBase) => boolean,\n uri: URI,\n conn: AuthedConnection,\n ): Promise<MsgWithError<S>> {\n const rsu = await this.buildReqSignedUrl(type, method, store, uri, conn);\n if (MsgIsError(rsu)) {\n return rsu;\n }\n return conn.conn.Ok().request<S, ReqSignedUrl>(rsu, { waitFor: waitForFn });\n }\n\n async putObject(uri: URI, uploadUrl: string, body: Uint8Array, conn: AuthedConnection): Promise<Result<void>> {\n this.logger.Debug().Any(\"url\", { uploadUrl, uri }).Msg(\"put-fetch-url\");\n const rUpload = await exception2Result(async () => fetch(uploadUrl, { method: \"PUT\", body }));\n if (rUpload.isErr()) {\n return this.logger.Error().Url(uploadUrl, \"uploadUrl\").Err(rUpload).Msg(\"Error in put fetch\").ResultError();\n }\n if (!rUpload.Ok().ok) {\n return this.logger.Error().Url(uploadUrl, \"uploadUrl\").Http(rUpload.Ok()).Msg(\"Error in put fetch\").ResultError();\n }\n if (uri.getParam(\"testMode\")) {\n conn.citem.trackPuts.add(uri.toString());\n }\n return Result.Ok(undefined);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async getObject(uri: URI, downloadUrl: string, _conn: AuthedConnection): Promise<Result<Uint8Array>> {\n this.logger.Debug().Any(\"url\", { downloadUrl, uri }).Msg(\"get-fetch-url\");\n const rDownload = await exception2Result(async () => fetch(downloadUrl.toString(), { method: \"GET\" }));\n if (rDownload.isErr()) {\n return this.logger.Error().Url(downloadUrl, \"uploadUrl\").Err(rDownload).Msg(\"Error in get downloadUrl\").ResultError();\n }\n const download = rDownload.Ok();\n if (!download.ok) {\n if (download.status === 404) {\n return Result.Err(new NotFoundError(\"Not found\"));\n }\n return this.logger.Error().Url(downloadUrl, \"uploadUrl\").Err(rDownload).Msg(\"Error in get fetch\").ResultError();\n }\n return Result.Ok(to_uint8(await download.arrayBuffer()));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async delObject(uri: URI, deleteUrl: string, _conn: AuthedConnection): Promise<Result<void>> {\n this.logger.Debug().Any(\"url\", { deleteUrl, uri }).Msg(\"get-fetch-url\");\n const rDelete = await exception2Result(async () => fetch(deleteUrl.toString(), { method: \"DELETE\" }));\n if (rDelete.isErr()) {\n return this.logger.Error().Url(deleteUrl, \"deleteUrl\").Err(rDelete).Msg(\"Error in get deleteURL\").ResultError();\n }\n const download = rDelete.Ok();\n if (!download.ok) {\n if (download.status === 404) {\n return Result.Err(new NotFoundError(\"Not found\"));\n }\n return this.logger.Error().Url(deleteUrl, \"deleteUrl\").Err(rDelete).Msg(\"Error in del fetch\").ResultError();\n }\n return Result.Ok(undefined);\n }\n}\n\nclass DataGateway extends BaseGateway implements StoreTypeGateway {\n constructor(sthis: SuperThis) {\n super(sthis, \"DataGateway\");\n }\n async get<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<SerdeGetResult<S>> {\n // type: string, method: HttpMethods, store: FPStoreTypes, waitForFn:\n const store = coerceFPStoreTypes(uri.getParam(\"store\"));\n const rResSignedUrl = await this.getReqSignedUrl<ResGetData>(\"reqGetData\", \"GET\", store, MsgIsResGetData, uri, ctx.conn);\n if (MsgIsError(rResSignedUrl)) {\n return this.logger.Error().Err(rResSignedUrl).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n const { signedUrl: downloadUrl } = rResSignedUrl;\n const r = await fpDeserialize(this.sthis, uri, this.getObject(uri, downloadUrl, ctx.conn));\n return r as SerdeGetResult<S>;\n }\n async put<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI, data: FPEnvelope<S>): Promise<Result<void>> {\n const store = coerceFPStoreTypes(uri.getParam(\"store\"));\n const rResSignedUrl = await this.getReqSignedUrl<ResPutData>(\"reqPutData\", \"PUT\", store, MsgIsResPutData, uri, ctx.conn);\n if (MsgIsError(rResSignedUrl)) {\n return this.logger.Error().Err(rResSignedUrl).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n const { signedUrl: uploadUrl } = rResSignedUrl;\n const rBlob = await fpSerialize(ctx.loader.sthis, data);\n if (rBlob.isErr()) {\n return rBlob;\n }\n const r = await this.putObject(uri, uploadUrl, rBlob.Ok(), ctx.conn);\n return r;\n }\n async delete(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<Result<void>> {\n const store = coerceFPStoreTypes(uri.getParam(\"store\"));\n const rResSignedUrl = await this.getReqSignedUrl<ResDelData>(\"reqDelData\", \"DELETE\", store, MsgIsResDelData, uri, ctx.conn);\n if (MsgIsError(rResSignedUrl)) {\n return this.logger.Error().Err(rResSignedUrl).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n const { signedUrl: deleteUrl } = rResSignedUrl;\n return this.delObject(uri, deleteUrl, ctx.conn);\n }\n}\n\nfunction getGwCtx(conn: QSId, uri: URI): Result<GwCtx> {\n const rParams = uri.getParamsResult({\n tid: param.OPTIONAL,\n tenant: param.REQUIRED,\n ledger: param.REQUIRED,\n });\n if (rParams.isErr()) {\n return Result.Err(rParams);\n }\n const r = rParams.Ok();\n return Result.Ok({\n tid: r.tid,\n conn,\n tenant: {\n tenant: r.tenant,\n ledger: r.ledger,\n },\n });\n}\n\nclass MetaGateway extends BaseGateway implements StoreTypeGateway {\n constructor(sthis: SuperThis) {\n super(sthis, \"MetaGateway\");\n }\n\n async get<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<SerdeGetResult<S>> {\n // const sp = sup({ method: \"GET\", store: \"meta\" });\n\n const reqSignedUrl = await this.buildReqSignedUrl(\"bindGetMeta\", \"GET\", \"meta\", uri, ctx.conn);\n if (MsgIsError(reqSignedUrl)) {\n return this.logger.Error().Err(reqSignedUrl).Msg(\"Error in buildReqSignedUrl\").ResultError();\n }\n const rGwCtx = getGwCtx(ctx.conn.conn.Ok().conn, uri);\n if (rGwCtx.isErr()) {\n return Result.Err(rGwCtx);\n }\n const rAuthType = await ctx.conn.conn.Ok().authType();\n if (rAuthType.isErr()) {\n return Result.Err(rAuthType);\n }\n const res = await ctx.conn.conn\n .Ok()\n .request<EventGetMeta, BindGetMeta>(buildBindGetMeta(ctx.loader.sthis, rAuthType.Ok(), reqSignedUrl.params, rGwCtx.Ok()), {\n waitFor: MsgIsEventGetMeta,\n });\n if (MsgIsError(res)) {\n return this.logger.Error().Err(res).Msg(\"Error in buildBindGetMeta\").ResultError();\n }\n const rV2Meta = await V2SerializedMetaKeyExtractKey(ctx, res.meta);\n const rMeta = await decode2DbMetaEvents(ctx.loader.sthis, rV2Meta);\n if (rMeta.isErr()) {\n return Result.Err(rMeta);\n }\n return Result.Ok({\n type: \"meta\",\n payload: rMeta.Ok(),\n } satisfies FPEnvelopeMeta as FPEnvelope<S>);\n }\n async put<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI, imeta: FPEnvelope<S>): Promise<Result<void>> {\n const meta = imeta as FPEnvelopeMeta;\n const reqSignedUrl = await this.buildReqSignedUrl(\"reqPutMeta\", \"PUT\", \"meta\", uri, ctx.conn);\n if (MsgIsError(reqSignedUrl)) {\n return this.logger.Error().Err(reqSignedUrl).Msg(\"Error in buildReqSignedUrl\").ResultError();\n }\n const rGwCtx = getGwCtx(ctx.conn.conn.Ok().conn, uri);\n if (rGwCtx.isErr()) {\n return Result.Err(rGwCtx);\n }\n const rAuthType = await ctx.conn.conn.Ok().authType();\n if (rAuthType.isErr()) {\n return Result.Err(rAuthType);\n }\n\n const serializedMeta = await dbMetaEvent2Serialized(ctx.loader.sthis, meta.payload);\n\n const rKeyedMeta = await encodeAsV2SerializedMetaKey(ctx, serializedMeta);\n if (rKeyedMeta.isErr()) {\n return rKeyedMeta;\n }\n const reqPutMeta = buildReqPutMeta(ctx.loader.sthis, rAuthType.Ok(), reqSignedUrl.params, rKeyedMeta.Ok(), rGwCtx.Ok());\n const resMsg = await ctx.conn.conn.Ok().request<ResPutMeta, ReqPutMeta>(reqPutMeta, {\n waitFor: MsgIsResPutMeta,\n });\n if (MsgIsError(resMsg)) {\n return this.logger.Error().Err(resMsg).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n return Result.Ok(undefined);\n }\n\n async delete(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<Result<void>> {\n const reqSignedUrl = await this.getReqSignedUrl<ResDelData>(\"reqDelMeta\", \"DELETE\", \"meta\", MsgIsResDelData, uri, ctx.conn);\n if (MsgIsError(reqSignedUrl)) {\n return this.logger.Error().Err(reqSignedUrl).Msg(\"Error in buildReqSignedUrl\").ResultError();\n }\n const rGwCtx = getGwCtx(ctx.conn.conn.Ok().conn, uri);\n if (rGwCtx.isErr()) {\n return Result.Err(rGwCtx);\n }\n const rAuthType = await ctx.conn.conn.Ok().authType();\n if (rAuthType.isErr()) {\n return Result.Err(rAuthType);\n }\n const reqDelMeta = buildReqDelMeta(ctx.loader.sthis, rAuthType.Ok(), reqSignedUrl.params, rGwCtx.Ok());\n const resMsg = await ctx.conn.conn.Ok().request<ResDelMeta, ReqDelMeta>(reqDelMeta, {\n waitFor: MsgIsResDelData,\n });\n if (MsgIsError(resMsg)) {\n return this.logger.Error().Err(resMsg).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n return Result.Ok(undefined);\n }\n}\n\nclass WALGateway extends BaseGateway implements StoreTypeGateway {\n // WAL will not pollute to the cloud\n readonly wals = new Map<string, FPEnvelopeWAL>();\n constructor(sthis: SuperThis) {\n super(sthis, \"WALGateway\");\n }\n getWalKeyFromUri(uri: URI): Result<string> {\n const rKey = uri.getParamsResult({\n key: 0,\n name: 0,\n });\n if (rKey.isErr()) {\n return Result.Err(rKey.Err());\n }\n const { name, key } = rKey.Ok();\n return Result.Ok(`${name}:${key}`);\n }\n async get<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<SerdeGetResult<S>> {\n const rKey = this.getWalKeyFromUri(uri);\n if (rKey.isErr()) {\n return Result.Err(rKey.Err());\n }\n const wal = this.wals.get(rKey.Ok());\n if (!wal) {\n return Result.Err(new NotFoundError(\"Not found\"));\n }\n return Result.Ok(wal as FPEnvelope<S>);\n }\n async put<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI, body: FPEnvelope<S>): Promise<Result<void>> {\n const rKey = this.getWalKeyFromUri(uri);\n if (rKey.isErr()) {\n return Result.Err(rKey.Err());\n }\n this.wals.set(rKey.Ok(), body as FPEnvelopeWAL);\n return Result.Ok(undefined);\n }\n async delete(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<Result<void>> {\n const rKey = this.getWalKeyFromUri(uri);\n if (rKey.isErr()) {\n return Result.Err(rKey.Err());\n }\n this.wals.delete(rKey.Ok());\n return Result.Ok(undefined);\n }\n}\n\nconst storeTypedGateways = new KeyedResolvOnce<StoreTypeGateway>();\nfunction getStoreTypeGateway(sthis: SuperThis, uri: URI): StoreTypeGateway {\n const store = uri.getParam(\"store\");\n switch (store) {\n case \"file\":\n case \"car\":\n return storeTypedGateways.get(store).once(() => new DataGateway(sthis));\n case \"meta\":\n return storeTypedGateways.get(store).once(() => new MetaGateway(sthis));\n case \"wal\":\n return storeTypedGateways.get(store).once(() => new WALGateway(sthis));\n default:\n throw ensureLogger(sthis, \"getStoreTypeGateway\").Error().Str(\"store\", store).Msg(\"Invalid store type\").ResultError();\n }\n}\n\ninterface ConnectionItem {\n readonly uri: URI;\n readonly matchRes: MatchResult;\n readonly connection: ResolveOnce<Result<MsgConnected>>;\n readonly trackPuts: Set<string>;\n}\n\ninterface AuthedConnection {\n readonly conn: Result<MsgConnectedAuth>;\n readonly citem: ConnectionItem;\n}\n\n// const keyedConnections = new KeyedResolvOnce<Connection>();\ninterface Subscription {\n readonly sid: string;\n readonly uri: string; // optimization\n readonly callback: (msg: Uint8Array) => void;\n readonly unsub: () => void;\n}\nfunction connectionURI(uri: URI): URI {\n return uri.build().delParam(\"authJWK\").delParam(\"key\").delParam(\"store\").delParam(\"suffix\").delParam(\"storekey\").URI();\n}\n\nconst subscriptions = new Map<string, Subscription[]>();\n// const doServerSubscribe = new KeyedResolvOnce();\nexport class FireproofCloudGateway implements SerdeGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly #connectionURIs = new Map<string, ConnectionItem>();\n\n constructor(sthis: SuperThis) {\n this.sthis = sthis;\n this.logger = ensureLogger(sthis, \"FireproofCloudGateway\", {\n this: true,\n });\n // console.log(\"FireproofCloudGateway\", this.sthis.nextId().str);\n }\n\n async buildUrl(ctx: SerdeGatewayCtx, baseUrl: URI, key: string): Promise<Result<URI>> {\n return Result.Ok(baseUrl.build().setParam(\"key\", key).URI());\n }\n\n async start(ctx: SerdeGatewayCtx, uri: URI): Promise<Result<URI>> {\n await this.sthis.start();\n const rName = uri.getParamResult(\"name\");\n if (rName.isErr()) {\n return this.logger.Error().Err(rName).Msg(\"name not found\").ResultError();\n }\n const ret = uri.build().defParam(\"version\", VERSION);\n ret.defParam(\"protocol\", \"wss\");\n const retURI = ret.URI();\n const matchURI = connectionURI(retURI);\n // console.log(\"start\", matchURI.toString());\n this.#connectionURIs.set(matchURI.toString(), {\n uri: matchURI,\n matchRes: matchURI.match(matchURI),\n connection: new ResolveOnce<Result<MsgConnected>>(),\n trackPuts: new Set<string>(),\n });\n return Result.Ok(retURI);\n }\n\n async get<S>(ctx: SerdeGatewayCtx, uri: URI): Promise<SerdeGetResult<S>> {\n const conn = await this.getCloudConnectionItem(uri);\n if (conn.conn.isErr()) {\n return Result.Err(conn.conn);\n }\n const ret = await getStoreTypeGateway(ctx.loader.sthis, uri).get<S>({ ...ctx, conn }, uri);\n // console.log(\"get>>>>>>>>>>>>>\", conn.conn.Ok().conn, uri.toString(), ret);\n return ret;\n }\n\n async put<T>(ctx: SerdeGatewayCtx, uri: URI, body: FPEnvelope<T>): Promise<VoidResult> {\n const conn = await this.getCloudConnectionItem(uri);\n if (conn.conn.isErr()) {\n // console.log(\"put-conn-err\", conn.conn);\n return conn.conn;\n }\n const ret = await getStoreTypeGateway(ctx.loader.sthis, uri).put<T>({ ...ctx, conn }, uri, body);\n // console.log(\"put-conn-r\", ret.isOk());\n if (ret.isOk()) {\n if (uri.getParam(\"testMode\")) {\n conn.citem.trackPuts.add(uri.toString());\n }\n }\n return ret;\n }\n\n async delete(ctx: SerdeGatewayCtx, uri: URI): Promise<VoidResult> {\n const conn = await this.getCloudConnectionItem(uri);\n if (conn.conn.isErr()) {\n return conn.conn;\n }\n conn.citem.trackPuts.delete(uri.toString());\n return getStoreTypeGateway(ctx.loader.sthis, uri).delete({ ...ctx, conn }, uri);\n }\n\n async close(ctx: SerdeGatewayCtx, uri: URI): Promise<VoidResult> {\n const uriStr = uri.toString();\n // CAUTION here is my happen a mutation of subscriptions caused by unsub\n for (const sub of Array.from(subscriptions.values())) {\n for (const s of sub) {\n if (s.uri.toString() === uriStr) {\n s.unsub();\n }\n }\n }\n const rConn = await this.getCloudConnectionItem(uri);\n if (rConn.conn.isErr()) {\n return this.logger.Error().Err(rConn).Msg(\"Error in getCloudConnection\").ResultError();\n }\n const conn = rConn.conn.Ok();\n const rAuth = await conn.msgConnAuth();\n await conn.close(rAuth.Ok());\n this.#connectionURIs.delete(rConn.citem.uri.toString());\n return Result.Ok(undefined);\n }\n\n // fireproof://localhost:1999/?name=test-public-api&protocol=ws&store=meta\n async getCloudConnection(uri: URI): Promise<Result<MsgConnectedAuth>> {\n return this.getCloudConnectionItem(uri).then((r) => {\n return r.conn;\n });\n }\n\n async getCloudConnectionItem(uri: URI): Promise<AuthedConnection> {\n const matchURI = connectionURI(uri);\n let bestMatch: ConnectionItem | undefined;\n for (const ci of this.#connectionURIs.values()) {\n const mci = ci.uri.match(matchURI);\n if (mci.score >= ci.matchRes.score) {\n bestMatch = ci;\n break;\n }\n }\n if (!bestMatch) {\n return {\n conn: this.logger\n .Error()\n .Url(matchURI)\n .Any(\"conns\", Object.fromEntries(this.#connectionURIs.entries()))\n .Msg(\"No connection found\")\n .ResultError(),\n citem: {} as ConnectionItem,\n };\n }\n const conn = await bestMatch.connection.once(async () => {\n const rParams = uri.getParamsResult({\n name: param.REQUIRED,\n protocol: \"https\",\n store: param.REQUIRED,\n storekey: param.OPTIONAL,\n tenant: param.REQUIRED,\n });\n if (rParams.isErr()) {\n return this.logger.Error().Url(uri).Err(rParams).Msg(\"getCloudConnection:err\").ResultError<MsgConnected>();\n }\n const params = rParams.Ok();\n // let tenant: string;\n // if (params.tenant) {\n // tenant = params.tenant;\n // } else {\n // if (!params.storekey) {\n // return this.logger.Error().Url(uri).Msg(\"no tendant or storekey given\").ResultError();\n // }\n // const dataKey = params.storekey.replace(/:(meta|wal)@$/, `:data@`);\n // const kb = await rt.kb.getKeyBag(this.sthis);\n // const rfingerprint = await kb.getNamedKey(dataKey);\n // if (rfingerprint.isErr()) {\n // return this.logger.Error().Err(rfingerprint).Msg(\"Error in getNamedKey\").ResultError();\n // }\n // tenant = rfingerprint.Ok().fingerPrint;\n // }\n\n const rAuth = await authTypeFromUri(this.logger, uri);\n if (rAuth.isErr()) {\n return Result.Err<MsgConnected>(rAuth);\n }\n\n const qOpen = buildReqOpen(this.sthis, rAuth.Ok(), {});\n\n const cUrl = uri.build().protocol(params.protocol).cleanParams().URI();\n // if (cUrl.pathname === \"/\") {\n // cUrl = cUrl.build().pathname(\"/fp\").URI();\n // }\n return Msger.connect(this.sthis, rAuth.Ok(), cUrl, qOpen);\n });\n if (conn.isErr()) {\n return { conn: Result.Err(conn), citem: bestMatch };\n }\n return { conn: Result.Ok(conn.Ok().attachAuth(() => authTypeFromUri(this.logger, uri))), citem: bestMatch };\n // keyedConnections.get(keyTenantLedger(qOpen.conn.key)).once(async () => Msger.open(this.sthis, cUrl, qOpen));\n }\n\n // private notifySubscribers(data: Uint8Array, callbacks: ((msg: Uint8Array) => void)[] = []): void {\n // for (const cb of callbacks) {\n // try {\n // cb(data);\n // } catch (error) {\n // this.logger.Error().Err(error).Msg(\"Error in subscriber callback execution\");\n // }\n // }\n // }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (meta: FPEnvelopeMeta) => Promise<void>): Promise<UnsubscribeResult> {\n return Result.Err(new Error(\"Not implemented\"));\n // const rParams = uri.getParamsResult({\n // store: 0,\n // storekey: 0,\n // });\n // if (rParams.isErr()) {\n // return this.logger.Error().Err(rParams).Msg(\"Error in subscribe\").ResultError();\n // }\n // const { store } = rParams.Ok();\n // if (store !== \"meta\") {\n // return Result.Err(new Error(\"store must be meta\"));\n // }\n // const rConn = await this.getCloudConnection(uri);\n // if (rConn.isErr()) {\n // return this.logger.Error().Err(rConn).Msg(\"Error in subscribe:getCloudConnection\").ResultError();\n // }\n // const conn = rConn.Ok();\n // const rResSubscribeMeta = await doServerSubscribe.get(pkKey(conn.key)).once(async () => {\n // const subId = this.sthis.nextId().str;\n // const fn = (subId: string) => (msg: MsgBase) => {\n // if (MsgIsUpdateMetaEvent(msg) && subId === msg.subscriberId) {\n // // console.log(\"onMessage\", subId, conn.key, msg.metas);\n // const s = subscriptions.get(subId);\n // if (!s) {\n // return;\n // }\n // console.log(\"msg\", JSON.stringify(msg));\n // this.notifySubscribers(\n // this.sthis.txt.encode(JSON.stringify(msg.metas)),\n // s.map((s) => s.callback)\n // );\n // }\n // };\n // conn.onMessage(fn(subId));\n // return conn.request<ResSubscribeMeta>(buildReqSubscriptMeta(this.sthis, conn.key, subId), {\n // waitType: \"resSubscribeMeta\",\n // });\n // });\n // if (rResSubscribeMeta.isErr()) {\n // return this.logger.Error().Err(rResSubscribeMeta).Msg(\"Error in subscribe:request\").ResultError();\n // }\n // const subId = rResSubscribeMeta.Ok().subscriberId;\n // let callbacks = subscriptions.get(subId);\n // if (!callbacks) {\n // callbacks = [];\n // subscriptions.set(subId, callbacks);\n // }\n // const sid = this.sthis.nextId().str;\n // const unsub = () => {\n // const idx = callbacks.findIndex((c) => c.sid === sid);\n // if (idx !== -1) {\n // callbacks.splice(idx, 1);\n // }\n // if (callbacks.length === 0) {\n // subscriptions.delete(subId);\n // }\n // };\n // callbacks.push({ uri: uri.toString(), callback, sid, unsub });\n // return Result.Ok(unsub);\n }\n\n async destroy(ctx: SerdeGatewayCtx, uri: URI): Promise<VoidResult> {\n const item = await this.getCloudConnectionItem(uri);\n if (item.conn.isErr()) {\n return item.conn;\n }\n await Promise.all(Array.from(item.citem.trackPuts).map(async (k) => this.delete(ctx, URI.from(k))));\n return Result.Ok(undefined);\n }\n\n async getPlain(): Promise<Result<Uint8Array>> {\n return Result.Err(new Error(\"Not implemented\"));\n // const url = uri.build().setParam(\"key\", key).URI();\n // const dbFile = this.sthis.pathOps.join(rt.getPath(url, this.sthis), rt.getFileName(url, this.sthis));\n // this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Msg(\"get\");\n // const buffer = await this.gateway.get(url);\n // this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n // return buffer.Ok();\n }\n}\n\nconst onceRegisterFireproofCloudStoreProtocol = new KeyedResolvOnce<() => void>();\nexport function registerFireproofCloudStoreProtocol(protocol = \"fpcloud:\") {\n return onceRegisterFireproofCloudStoreProtocol.get(protocol).once(() => {\n URI.protocolHasHostpart(protocol);\n return registerStoreProtocol({\n protocol,\n defaultURI() {\n return URI.from(\"fpcloud://fireproof.cloud/\");\n },\n serdegateway: async (sthis: SuperThis) => {\n return new FireproofCloudGateway(sthis);\n },\n });\n });\n}\n\nregisterFireproofCloudStoreProtocol();\n\nexport function toCloud(url: CoerceURI): Attachable {\n const urlObj = URI.from(url);\n if (urlObj.protocol !== \"fpcloud:\") {\n throw new Error(\"url must have fireproof protocol\");\n }\n // const existingName = urlObj.getParam(\"name\");\n // urlObj.defParam(\"name\", remoteDbName || existingName || dbName);\n // urlObj.defParam(\"localName\", dbName);\n // urlObj.defParam(\"storekey\", `@${dbName}:data@`);\n return {\n name: urlObj.protocol,\n prepare(): Promise<GatewayUrlsParam> {\n return Promise.resolve({\n car: { url: urlObj },\n file: { url: urlObj },\n meta: { url: urlObj },\n });\n },\n };\n}\n","import { Future, Logger, Result } from \"@adviser/cement\";\nimport { SuperThis } from \"@fireproof/core\";\nimport { CalculatePreSignedUrl } from \"./msg-types-data.js\";\nimport type { JWTPayload } from \"jose\";\n// import { PreSignedMsg } from \"./pre-signed-url.js\";\n\nexport const VERSION = \"FP-MSG-1.0\";\n\nexport interface BaseTokenParam {\n readonly alg: string; // defaults ES256\n readonly issuer: string;\n readonly audience: string;\n readonly validFor: number;\n}\n\nexport interface FPCloudClaim extends JWTPayload {\n readonly userId: string;\n readonly tenants: { readonly id: string; readonly role: string }[];\n readonly ledgers: { readonly id: string; readonly role: string; readonly right: string }[];\n}\n\nexport type TokenForParam = FPCloudClaim & Partial<BaseTokenParam>;\n\nexport type MsgWithError<T extends MsgBase> = T | ErrorMsg;\n\nexport interface PreSignedMsg extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly methodParams: MethodSignedUrlParam;\n readonly params: SignedUrlParam;\n}\n\nexport interface RequestOpts {\n readonly waitFor: (msg: MsgBase) => boolean;\n readonly pollInterval?: number; // 1000ms\n readonly timeout?: number; // ms\n}\n\nexport interface EnDeCoder {\n encode<T>(node: T): Uint8Array;\n decode<T>(data: Uint8Array): T;\n}\n\nexport interface WaitForTid {\n readonly tid: string;\n readonly future: Future<MsgBase>;\n readonly timeout?: number;\n // undefined match all\n readonly waitFor: (msg: MsgBase) => boolean;\n}\n\n// export interface ConnId {\n// readonly connId: string;\n// }\n// type AddConnId<T extends MsgBase, N> = Omit<T, \"type\"> & ConnId & { readonly type: N };\nexport interface NextId {\n readonly nextId: SuperThis[\"nextId\"];\n}\n\nexport interface AuthType {\n readonly type: \"ucan\" | \"error\" | \"fp-cloud-jwk\" | \"fp-cloud\";\n}\n\nexport function isAuthTypeFPCloudJWK(a: AuthType): a is FPJWKCloudAuthType {\n return a.type === \"fp-cloud-jwk\";\n}\n\nexport function isAuthTypeFPCloud(a: AuthType): a is FPCloudAuthType {\n return a.type === \"fp-cloud\";\n}\n\nexport interface UCanAuth extends AuthType {\n readonly type: \"ucan\";\n readonly params: {\n readonly tbd: string;\n };\n}\nexport interface FPJWKCloudAuthType extends AuthType {\n readonly type: \"fp-cloud-jwk\";\n readonly params: {\n readonly jwk: string;\n };\n}\n\nexport interface FPCloudAuthType extends AuthType {\n readonly type: \"fp-cloud\";\n readonly params: {\n readonly claim: TokenForParam;\n readonly jwk: string; // for reply\n };\n}\n\nexport type AuthFactory = (tp?: Partial<TokenForParam>) => Promise<Result<AuthType>>;\n\nexport interface TenantLedger {\n readonly tenant: string;\n readonly ledger: string;\n}\n\nexport function keyTenantLedger(t: TenantLedger): string {\n return `${t.tenant}:${t.ledger}`;\n}\n\nexport interface QSId {\n readonly reqId: string;\n readonly resId: string;\n}\n\nexport function qsidEqual(a: QSId, b: QSId): boolean {\n return a.reqId === b.reqId && a.resId === b.resId;\n}\n\nexport function qsidKey(qsid: QSId): string {\n return `${qsid.reqId}:${qsid.resId}`;\n}\n\n// export interface Connection extends ReqResId{\n// readonly key: TenantLedger;\n// }\n\n// export interface Connected {\n// readonly conn: Connection;\n// }\n\nexport interface MsgBase {\n readonly tid: string;\n readonly type: string;\n readonly version: string;\n readonly auth: AuthType;\n}\n\nexport function MsgIsTid(msg: MsgBase, tid: string): boolean {\n return msg.tid === tid;\n}\n\ntype MsgWithConn<T extends MsgBase = MsgBase> = T & { readonly conn: QSId };\n\nexport type MsgWithConnAuth<T extends MsgBase = MsgBase> = MsgWithConn<T> & { readonly auth: AuthType };\n\n// type MsgWithOptionalConn<T extends MsgBase = MsgBase> = T & { readonly conn?: QSId };\n\n// export type MsgWithOptionalConnAuth<T extends MsgBase = MsgBase> = MsgWithOptionalConn<T> & { readonly auth: AuthType };\n\nexport type MsgWithTenantLedger<T extends MsgWithConnAuth> = T & { readonly tenant: TenantLedger };\n\nexport interface ErrorMsg extends MsgBase {\n readonly type: \"error\";\n readonly src: unknown;\n readonly message: string;\n readonly body?: string;\n readonly stack?: string[];\n}\n\nexport function MsgIsError(rq: MsgBase): rq is ErrorMsg {\n return rq.type === \"error\";\n}\n\nexport function MsgIsQSError(rq: ReqRes<MsgBase, MsgBase>): rq is ReqRes<ErrorMsg, ErrorMsg> {\n return rq.res.type === \"error\" || rq.req.type === \"error\";\n}\n\nexport type HttpMethods = \"GET\" | \"PUT\" | \"DELETE\";\nexport type FPStoreTypes = \"meta\" | \"car\" | \"wal\" | \"file\";\n\nexport function coerceFPStoreTypes(s?: string): FPStoreTypes {\n const x = s?.trim();\n if (x === \"meta\" || x === \"car\" || x === \"wal\" || x === \"file\") {\n return x;\n }\n throw new Error(`Invalid FPStoreTypes: ${s}`);\n}\n\n// reqRes is http\n// stream is WebSocket\nexport type ProtocolCapabilities = \"reqRes\" | \"stream\";\n\nexport function isProtocolCapabilities(s: string): s is ProtocolCapabilities {\n const x = s.trim();\n return x === \"reqRes\" || x === \"stream\";\n}\n\nexport interface Gestalt {\n /**\n * Describes StoreTypes which are handled\n */\n readonly storeTypes: FPStoreTypes[];\n /**\n * A unique identifier\n */\n readonly id: string;\n /**\n * protocol capabilities\n * defaults \"stream\"\n */\n readonly protocolCapabilities: ProtocolCapabilities[];\n /**\n * HttpEndpoints (URL) required atleast one\n * could be absolute or relative\n */\n readonly httpEndpoints: string[];\n /**\n * WebsocketEndpoints (URL) required atleast one\n * could be absolute or relative\n */\n readonly wsEndpoints: string[];\n /**\n * Encodings supported\n * JSON, CBOR\n */\n readonly encodings: (\"JSON\" | \"CBOR\")[];\n /**\n * Authentication methods supported\n */\n readonly auth: AuthType[];\n /**\n * Requires Authentication\n */\n readonly requiresAuth: boolean;\n /**\n * In|Outband Data | Meta | WAL Support\n * Inband Means that the Payload is part of the message\n * Outband Means that the Payload is PUT/GET to a different URL\n * A Clien implementation usally not support reading or writing\n * support\n */\n readonly data?: {\n readonly inband: boolean;\n readonly outband: boolean;\n };\n readonly meta?: {\n readonly inband: true; // meta inband is mandatory\n readonly outband: boolean;\n };\n readonly wal?: {\n readonly inband: boolean;\n readonly outband: boolean;\n };\n /**\n * Request Types supported\n * reqGestalt, reqSubscribeMeta, reqPutMeta, reqGetMeta, reqDelMeta, reqUpdateMeta\n */\n readonly reqTypes: string[];\n /**\n * Response Types supported\n * resGestalt, resSubscribeMeta, resPutMeta, resGetMeta, resDelMeta, updateMeta\n */\n readonly resTypes: string[];\n /**\n * Event Types supported\n * updateMeta\n */\n readonly eventTypes: string[];\n}\n\nexport interface MsgerParams {\n readonly mime: string;\n readonly auth?: AuthType;\n readonly hasPersistent?: boolean;\n readonly protocolCapabilities?: ProtocolCapabilities[];\n // readonly protocol: \"http\" | \"ws\";\n readonly timeout: number; // msec\n}\n\n// force the server id\nexport type GestaltParam = Partial<Gestalt> & { readonly id: string };\n\nexport function defaultGestalt(msgP: MsgerParams, gestalt: GestaltParam): Gestalt {\n return {\n storeTypes: [\"meta\", \"file\", \"car\", \"wal\"],\n httpEndpoints: [\"/fp\"],\n wsEndpoints: [\"/ws\"],\n encodings: [\"JSON\"],\n protocolCapabilities: msgP.protocolCapabilities || [\"reqRes\", \"stream\"],\n auth: [],\n requiresAuth: false,\n data: msgP.hasPersistent\n ? {\n inband: true,\n outband: true,\n }\n : undefined,\n meta: msgP.hasPersistent\n ? {\n inband: true,\n outband: true,\n }\n : undefined,\n wal: msgP.hasPersistent\n ? {\n inband: true,\n outband: true,\n }\n : undefined,\n reqTypes: [\n \"reqOpen\",\n \"reqGestalt\",\n // \"reqSignedUrl\",\n \"reqSubscribeMeta\",\n \"reqPutMeta\",\n \"reqBindMeta\",\n \"reqDelMeta\",\n \"reqPutData\",\n \"reqGetData\",\n \"reqDelData\",\n \"reqPutWAL\",\n \"reqGetWAL\",\n \"reqDelWAL\",\n \"reqUpdateMeta\",\n ],\n resTypes: [\n \"resOpen\",\n \"resGestalt\",\n // \"resSignedUrl\",\n \"resSubscribeMeta\",\n \"resPutMeta\",\n \"resGetMeta\",\n \"resDelMeta\",\n \"resPutData\",\n \"resGetData\",\n \"resDelData\",\n \"resPutWAL\",\n \"resGetWAL\",\n \"resDelWAL\",\n \"updateMeta\",\n ],\n eventTypes: [\"updateMeta\"],\n ...gestalt,\n };\n}\n\nexport interface ReqChat extends MsgWithConn {\n readonly type: \"reqChat\";\n readonly message: string;\n readonly targets: QSId[];\n}\nexport interface ResChat extends MsgWithConn {\n readonly type: \"resChat\";\n readonly message: string;\n readonly targets: QSId[];\n}\n\nexport function buildReqChat(sthis: NextId, auth: AuthType, conn: QSId, message: string, targets?: QSId[]): ReqChat {\n return {\n tid: sthis.nextId().str,\n type: \"reqChat\",\n version: VERSION,\n auth,\n conn,\n message,\n targets: targets ?? [],\n };\n}\n\nexport function buildResChat(req: ReqChat, conn?: QSId, message?: string, targets?: QSId[], auth?: AuthType): ResChat {\n return {\n ...req,\n auth: auth || req.auth,\n conn: conn || req.conn,\n message: message || req.message,\n targets: targets || req.targets,\n type: \"resChat\",\n version: VERSION,\n };\n}\n\nexport function MsgIsReqChat(msg: MsgBase): msg is ReqChat {\n return msg.type === \"reqChat\";\n}\n\nexport function MsgIsResChat(msg: MsgBase): msg is ResChat {\n return msg.type === \"resChat\";\n}\n\n/**\n * The ReqGestalt message is used to request the\n * features of the Responder.\n */\nexport interface ReqGestalt extends MsgBase {\n readonly type: \"reqGestalt\";\n readonly gestalt: Gestalt;\n readonly publish?: boolean; // for testing\n}\n\nexport function MsgIsReqGestalt(msg: MsgBase): msg is ReqGestalt {\n return msg.type === \"reqGestalt\";\n}\n\nexport function buildReqGestalt(sthis: NextId, auth: AuthType, gestalt: Gestalt, publish?: boolean): ReqGestalt {\n return {\n tid: sthis.nextId().str,\n auth,\n type: \"reqGestalt\",\n version: VERSION,\n gestalt,\n publish,\n };\n}\n\nexport interface ConnInfo {\n readonly connIds: string[];\n}\n/**\n * The ResGestalt message is used to respond with\n * the features of the Responder.\n */\nexport interface ResGestalt extends MsgBase {\n readonly type: \"resGestalt\";\n readonly gestalt: Gestalt;\n}\n\nexport function buildResGestalt(req: ReqGestalt, gestalt: Gestalt, auth: AuthType): ResGestalt | ErrorMsg {\n return {\n tid: req.tid,\n auth: auth || req.auth,\n type: \"resGestalt\",\n version: VERSION,\n gestalt,\n };\n}\n\nexport function MsgIsResGestalt(msg: MsgBase): msg is ResGestalt {\n return msg.type === \"resGestalt\";\n}\n\nexport interface ReqOpenConnection {\n // readonly key: TenantLedger;\n readonly reqId?: string;\n readonly resId?: string; // for double open\n}\n\nexport interface ReqOpenConn {\n readonly reqId: string;\n readonly resId?: string;\n}\n\nexport interface ReqOpen extends MsgBase {\n readonly type: \"reqOpen\";\n readonly conn: ReqOpenConn;\n}\n\nexport function buildReqOpen(sthis: NextId, auth: AuthType, conn: ReqOpenConnection): ReqOpen {\n return {\n tid: sthis.nextId().str,\n auth,\n type: \"reqOpen\",\n version: VERSION,\n conn: {\n ...conn,\n reqId: conn.reqId || sthis.nextId().str,\n },\n };\n}\n\n// export function MsgIsReqOpenWithConn(imsg: MsgBase): imsg is MsgWithConn<ReqOpen> {\n// const msg = imsg as MsgWithConn<ReqOpen>;\n// return msg.type === \"reqOpen\" && !!msg.conn && !!msg.conn.reqId;\n// }\n\nexport function MsgIsReqOpen(imsg: MsgBase): imsg is MsgWithConn<ReqOpen> {\n const msg = imsg as MsgWithConn<ReqOpen>;\n return msg.type === \"reqOpen\" && !!msg.conn && !!msg.conn.reqId;\n}\n\nexport interface ResOpen extends MsgBase {\n readonly type: \"resOpen\";\n readonly conn: QSId;\n}\n\nexport function MsgIsWithConn<T extends MsgBase>(msg: T): msg is MsgWithConn<T> {\n const mwc = (msg as MsgWithConn<T>).conn;\n return mwc && !!(mwc as QSId).reqId && !!(mwc as QSId).resId;\n}\n\nexport function MsgIsWithConnAuth<T extends MsgBase>(msg: T): msg is MsgWithConnAuth<T> {\n return MsgIsWithConn(msg) && !!msg.auth && typeof msg.auth.type === \"string\";\n}\n\nexport function MsgIsConnected<T extends MsgBase>(msg: T, qsid: QSId): msg is MsgWithConn<T> {\n return MsgIsWithConn(msg) && msg.conn.reqId === qsid.reqId && msg.conn.resId === qsid.resId;\n}\n\nexport function buildResOpen(sthis: NextId, req: ReqOpen, resStreamId?: string): ResOpen {\n if (!(req.conn && req.conn.reqId)) {\n throw new Error(\"req.conn.reqId is required\");\n }\n return {\n ...req,\n type: \"resOpen\",\n conn: {\n ...req.conn,\n resId: req.conn.resId || resStreamId || sthis.nextId().str,\n },\n };\n}\n\nexport function MsgIsResOpen(msg: MsgBase): msg is ResOpen {\n return msg.type === \"resOpen\";\n}\n\nexport interface ReqClose extends MsgWithConn {\n readonly type: \"reqClose\";\n}\n\nexport function MsgIsReqClose(msg: MsgBase): msg is ReqClose {\n return msg.type === \"reqClose\" && MsgIsWithConn(msg);\n}\n\nexport interface ResClose extends MsgWithConn {\n readonly type: \"resClose\";\n}\n\nexport function MsgIsResClose(msg: MsgBase): msg is ResClose {\n return msg.type === \"resClose\" && MsgIsWithConn(msg);\n}\n\nexport function buildResClose(req: ReqClose, conn: QSId): ResClose {\n return {\n ...req,\n type: \"resClose\",\n conn,\n };\n}\n\nexport function buildReqClose(sthis: NextId, auth: AuthType, conn: QSId): ReqClose {\n return {\n tid: sthis.nextId().str,\n auth,\n type: \"reqClose\",\n version: VERSION,\n conn,\n };\n}\n\nexport interface SignedUrlParam {\n // base path\n readonly path?: string;\n // name of the file\n readonly key: string;\n readonly expires?: number; // seconds\n readonly index?: string;\n}\n\nexport interface MethodSignedUrlParam {\n readonly method: HttpMethods;\n readonly store: FPStoreTypes;\n}\n\n// export type ReqSignedUrlParam = Omit<SignedUrlParam, \"method\" | \"store\">;\nexport interface ReqSignedUrlParam {\n readonly auth: AuthType;\n readonly methodParam: MethodSignedUrlParam;\n readonly params: SignedUrlParam;\n}\n\nexport interface UpdateReqRes<Q extends MsgBase, S extends MsgBase> {\n req: Q;\n res: S;\n}\n\nexport type ReqRes<Q extends MsgBase, S extends MsgBase> = Readonly<UpdateReqRes<Q, S>>;\n\nexport function buildErrorMsg(\n msgCtx: { readonly logger: Logger; readonly sthis: SuperThis },\n base: Partial<MsgBase & { ref?: unknown }>,\n error: Error,\n body?: string,\n stack?: string[],\n): ErrorMsg {\n if (!stack && msgCtx.sthis.env.get(\"FP_STACK\")) {\n stack = error.stack?.split(\"\\n\");\n }\n const msg = {\n auth: base.auth || { type: \"error\" },\n src: base,\n type: \"error\",\n tid: base.tid || \"internal\",\n message: error.message,\n version: VERSION,\n body,\n stack,\n } satisfies ErrorMsg;\n msgCtx.logger.Any(\"ErrorMsg\", msg);\n return msg;\n}\n\nexport function MsgIsTenantLedger<T extends MsgBase>(msg: T): msg is MsgWithTenantLedger<MsgWithConnAuth<T>> {\n if (MsgIsWithConnAuth(msg)) {\n const t = (msg as MsgWithTenantLedger<MsgWithConnAuth<T>>).tenant;\n return !!t && !!t.tenant && !!t.ledger;\n }\n return false;\n}\n\nexport interface ReqSignedUrl extends ReqSignedUrlWithoutMethodParams {\n // readonly type: \"reqSignedUrl\";\n readonly methodParams: MethodSignedUrlParam;\n}\n\nexport interface ReqSignedUrlWithoutMethodParams extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly params: SignedUrlParam;\n}\n\nexport interface GwCtx {\n readonly tid?: string;\n readonly conn: QSId;\n readonly tenant: TenantLedger;\n}\n\nexport interface GwCtxConn {\n readonly tid?: string;\n readonly conn: QSId;\n readonly tenant: TenantLedger;\n}\n\nexport function buildReqSignedUrl<T extends ReqSignedUrl>(sthis: NextId, type: string, rparam: ReqSignedUrlParam, gwCtx: GwCtx): T {\n return {\n tid: sthis.nextId().str,\n type,\n auth: rparam.auth,\n methodParams: rparam.methodParam,\n version: VERSION,\n ...gwCtx,\n params: rparam.params,\n } satisfies ReqSignedUrl as T;\n}\n\nexport interface ResSignedUrl extends MsgWithTenantLedger<MsgWithConn> {\n // readonly type: \"resSignedUrl\";\n readonly methodParams: MethodSignedUrlParam;\n readonly params: SignedUrlParam;\n readonly signedUrl: string;\n}\n\nexport interface ResOptionalSignedUrl extends MsgWithTenantLedger<MsgWithConn> {\n // readonly type: \"resSignedUrl\";\n readonly params: SignedUrlParam;\n readonly methodParams: MethodSignedUrlParam;\n readonly signedUrl?: string;\n}\n\nexport interface MsgTypesCtx {\n readonly sthis: SuperThis;\n readonly logger: Logger;\n // readonly auth: AuthFactory;\n}\n\n// export async function msgTypesCtxSync(msgCtx: MsgTypesCtx): Promise<MsgTypesCtxSync> {\n// return {\n// sthis: msgCtx.sthis,\n// logger: msgCtx.logger,\n// auth: await msgCtx.auth(),\n// };\n// }\n\nexport interface MsgTypesCtxSync {\n readonly sthis: SuperThis;\n readonly logger: Logger;\n readonly auth: AuthType;\n}\n\nexport function resAuth(msg: MsgBase): Promise<AuthType> {\n return msg.auth ? Promise.resolve(msg.auth) : Promise.reject(new Error(\"No Auth\"));\n}\n\nexport async function buildRes<Q extends MsgWithTenantLedger<MsgWithConn<ReqSignedUrlWithoutMethodParams>>, S extends ResSignedUrl>(\n methodParams: MethodSignedUrlParam,\n type: string,\n msgCtx: MsgTypesCtx,\n req: Q,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<S>> {\n const psm = {\n type: \"reqSignedUrl\",\n auth: await resAuth(req),\n version: req.version,\n methodParams,\n params: {\n ...req.params,\n },\n conn: req.conn,\n tenant: req.tenant,\n tid: req.tid,\n } satisfies PreSignedMsg;\n const rSignedUrl = await ctx.calculatePreSignedUrl(msgCtx, psm);\n if (rSignedUrl.isErr()) {\n return buildErrorMsg(msgCtx, req, rSignedUrl.Err());\n }\n return {\n ...req,\n params: psm.params,\n methodParams,\n type,\n signedUrl: rSignedUrl.Ok().toString(),\n } as unknown as MsgWithError<S>;\n}\n","import { BuildURI, CoerceURI, Logger, Result, runtimeFn, URI } from \"@adviser/cement\";\nimport {\n buildReqGestalt,\n defaultGestalt,\n EnDeCoder,\n Gestalt,\n MsgBase,\n MsgerParams,\n MsgIsResGestalt,\n RequestOpts,\n ResGestalt,\n MsgWithError,\n MsgWithConnAuth,\n buildReqOpen,\n MsgIsConnected,\n MsgIsError,\n MsgIsResOpen,\n QSId,\n MsgIsTid,\n ReqGestalt,\n buildReqClose,\n MsgIsResClose,\n AuthFactory,\n AuthType,\n FPJWKCloudAuthType,\n} from \"./msg-types.js\";\nimport { ensurePath, HttpConnection } from \"./http-connection.js\";\nimport { WSConnection } from \"./ws-connection.js\";\nimport { SuperThis } from \"../../types.js\";\n\n// const headers = {\n// \"Content-Type\": \"application/json\",\n// \"Accept\": \"application/json\",\n// };\n\nexport function selectRandom<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nexport function timeout<T>(ms: number, promise: Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`TIMEOUT after ${ms}ms`));\n }, ms);\n promise\n .then(resolve)\n .catch(reject)\n .finally(() => clearTimeout(timer));\n });\n}\n\nexport type OnMsgFn<T extends MsgBase = MsgBase> = (msg: MsgWithError<T>) => void;\nexport type UnReg = () => void;\n\nexport interface ExchangedGestalt {\n readonly my: Gestalt;\n readonly remote: Gestalt;\n}\n\nexport type OnErrorFn = (msg: Partial<MsgBase>, err: Error) => Partial<MsgBase>;\n\nexport interface ActiveStream<S extends MsgBase, Q extends MsgBase> {\n readonly id: string;\n readonly bind: {\n readonly msg: Q;\n readonly opts: RequestOpts;\n };\n timeout?: unknown;\n controller?: ReadableStreamDefaultController<MsgWithError<S>>;\n}\n\nexport interface MsgRawConnection<T extends MsgBase = MsgBase> {\n // readonly ws: WebSocket;\n // readonly params: ConnectionKey;\n // qsOpen: ReqRes<ReqOpen, ResOpen>;\n readonly sthis: SuperThis;\n readonly exchangedGestalt: ExchangedGestalt;\n readonly activeBinds: Map<string, ActiveStream<T, MsgBase>>;\n bind<S extends T, Q extends T>(req: Q, opts: RequestOpts): ReadableStream<MsgWithError<S>>;\n request<S extends T, Q extends T>(req: Q, opts: RequestOpts): Promise<MsgWithError<S>>;\n send<S extends T, Q extends T>(msg: Q): Promise<MsgWithError<S>>;\n start(): Promise<Result<void>>;\n close(o: T): Promise<Result<void>>;\n onMsg(msg: OnMsgFn<T>): UnReg;\n}\n\nexport function jsonEnDe(sthis: SuperThis): EnDeCoder {\n return {\n encode: (node: unknown) => sthis.txt.encode(JSON.stringify(node)),\n decode: (data: Uint8Array) => JSON.parse(sthis.txt.decode(data)),\n };\n}\n\nexport type MsgerParamsWithEnDe = MsgerParams & { readonly ende: EnDeCoder };\n\nexport function defaultMsgParams(sthis: SuperThis, igs: Partial<MsgerParamsWithEnDe>): MsgerParamsWithEnDe {\n return {\n mime: \"application/json\",\n ende: jsonEnDe(sthis),\n timeout: 3000,\n protocolCapabilities: [\"reqRes\", \"stream\"],\n ...igs,\n } satisfies MsgerParamsWithEnDe;\n}\n\nexport interface OpenParams {\n readonly timeout: number;\n}\n\nexport async function applyStart(prC: Promise<Result<MsgRawConnection>>): Promise<Result<MsgRawConnection>> {\n const rC = await prC;\n if (rC.isErr()) {\n return rC;\n }\n const c = rC.Ok();\n const r = await c.start();\n if (r.isErr()) {\n return Result.Err(r.Err());\n }\n return rC;\n}\n\nexport async function authTypeFromUri(logger: Logger, curi: CoerceURI): Promise<Result<FPJWKCloudAuthType>> {\n const uri = URI.from(curi);\n const authJWK = uri.getParam(\"authJWK\");\n if (!authJWK) {\n return logger.Error().Url(uri).Msg(\"authJWK is required\").ResultError();\n }\n // const sts = await SessionTokenService.createFromEnv();\n // const fpc = await sts.validate(authJWK);\n // if (fpc.isErr()) {\n // return logger.Error().Err(fpc).Msg(\"Invalid authJWK\").ResultError();\n // }\n return Result.Ok({\n type: \"fp-cloud-jwk\",\n params: {\n // claim: fpc.Ok().payload,\n jwk: authJWK,\n },\n } satisfies FPJWKCloudAuthType);\n}\n\nexport class MsgConnected {\n static async connect(\n auth: AuthType,\n mrc: Result<MsgRawConnection> | MsgRawConnection,\n conn: Partial<QSId> = {},\n ): Promise<Result<MsgConnected>> {\n if (Result.Is(mrc)) {\n if (mrc.isErr()) {\n return Result.Err(mrc.Err());\n }\n mrc = mrc.Ok();\n }\n const res = await mrc.request(buildReqOpen(mrc.sthis, auth, conn), { waitFor: MsgIsResOpen });\n if (MsgIsError(res) || !MsgIsResOpen(res)) {\n return mrc.sthis.logger.Error().Err(res).Msg(\"unexpected response\").ResultError();\n }\n return Result.Ok(new MsgConnected(mrc, res.conn));\n }\n\n readonly sthis: SuperThis;\n readonly conn: QSId;\n readonly raw: MsgRawConnection;\n readonly exchangedGestalt: ExchangedGestalt;\n readonly activeBinds: Map<string, ActiveStream<MsgWithConnAuth, MsgBase>>;\n readonly id: string;\n private constructor(raw: MsgRawConnection, conn: QSId) {\n this.sthis = raw.sthis;\n this.raw = raw;\n this.exchangedGestalt = raw.exchangedGestalt;\n this.conn = conn;\n this.activeBinds = raw.activeBinds;\n this.id = this.sthis.nextId().str;\n }\n\n attachAuth(auth: AuthFactory): MsgConnectedAuth {\n return new MsgConnectedAuth(this, auth);\n }\n}\n\nexport class MsgConnectedAuth implements MsgRawConnection<MsgWithConnAuth> {\n readonly sthis: SuperThis;\n readonly conn: QSId;\n readonly raw: MsgRawConnection;\n readonly exchangedGestalt: ExchangedGestalt;\n readonly activeBinds: Map<string, ActiveStream<MsgWithConnAuth, MsgBase>>;\n readonly id: string;\n readonly authFactory: AuthFactory;\n\n constructor(conn: MsgConnected, authFactory: AuthFactory) {\n this.id = conn.id;\n this.raw = conn.raw;\n this.conn = conn.conn;\n this.sthis = conn.sthis;\n this.authFactory = authFactory;\n this.exchangedGestalt = conn.exchangedGestalt;\n this.activeBinds = conn.activeBinds;\n }\n\n bind<S extends MsgWithConnAuth, Q extends MsgWithConnAuth>(req: Q, opts: RequestOpts): ReadableStream<MsgWithError<S>> {\n const stream = this.raw.bind({ ...req, conn: req.conn || this.conn }, opts);\n const ts = new TransformStream<MsgWithError<S>, MsgWithError<S>>({\n transform: (chunk, controller) => {\n if (!MsgIsTid(chunk, req.tid)) {\n return;\n }\n if (MsgIsConnected(chunk, this.conn)) {\n if (opts.waitFor?.(chunk) || MsgIsError(chunk)) {\n controller.enqueue(chunk);\n }\n }\n },\n });\n\n // why the hell pipeTo sends an error that is undefined?\n stream.pipeThrough(ts);\n // stream.pipeTo(ts.writable).catch((err) => err && err.message && console.error(\"bind error\", err));\n return ts.readable;\n }\n\n authType(): Promise<Result<AuthType>> {\n return this.authFactory();\n }\n\n msgConnAuth(): Promise<Result<MsgWithConnAuth>> {\n return this.authType().then((r) => {\n if (r.isErr()) {\n return Result.Err(r);\n }\n return Result.Ok({ conn: this.conn, auth: r.Ok() } as MsgWithConnAuth);\n });\n }\n\n request<S extends MsgWithConnAuth, Q extends MsgWithConnAuth>(req: Q, opts: RequestOpts): Promise<MsgWithError<S>> {\n return this.raw.request({ ...req, conn: req.conn || this.conn }, opts);\n }\n\n send<S extends MsgWithConnAuth, Q extends MsgWithConnAuth>(msg: Q): Promise<MsgWithError<S>> {\n return this.raw.send({ ...msg, conn: msg.conn || this.conn });\n }\n\n start(): Promise<Result<void>> {\n return this.raw.start();\n }\n async close(t: MsgWithConnAuth): Promise<Result<void>> {\n await this.request(buildReqClose(this.sthis, t.auth, this.conn), { waitFor: MsgIsResClose });\n return await this.raw.close(t);\n // return Result.Ok(undefined);\n }\n onMsg(msgFn: OnMsgFn<MsgWithConnAuth>): UnReg {\n return this.raw.onMsg((msg) => {\n if (MsgIsConnected(msg, this.conn)) {\n msgFn(msg);\n }\n });\n }\n}\n\nfunction initialFPUri(curl: CoerceURI): URI {\n let gestaltUrl = URI.from(curl);\n if ([\"\", \"/\"].includes(gestaltUrl.pathname)) {\n gestaltUrl = gestaltUrl.build().appendRelative(\"/fp\").URI();\n }\n return gestaltUrl;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class Msger {\n static async openHttp(\n sthis: SuperThis,\n // reqOpen: ReqOpen | undefined,\n urls: URI[],\n msgP: MsgerParamsWithEnDe,\n exGestalt: ExchangedGestalt,\n ): Promise<Result<MsgRawConnection>> {\n return Result.Ok(new HttpConnection(sthis, urls, msgP, exGestalt));\n }\n static async openWS(\n sthis: SuperThis,\n // qOpen: ReqOpen,\n url: URI,\n msgP: MsgerParamsWithEnDe,\n exGestalt: ExchangedGestalt,\n ): Promise<Result<MsgRawConnection>> {\n let ws: WebSocket;\n // const { encode } = jsonEnDe(sthis);\n url = url.build().setParam(\"random\", sthis.nextId().str).URI();\n // console.log(\"openWS\", url.toString());\n // .setParam(\"reqOpen\", sthis.txt.decode(encode(qOpen)))\n const wsUrl = ensurePath(url, \"ws\");\n if (runtimeFn().isNodeIsh) {\n const { WebSocket } = await import(\"ws\");\n ws = new WebSocket(wsUrl) as unknown as WebSocket;\n } else {\n ws = new WebSocket(wsUrl);\n }\n return Result.Ok(new WSConnection(sthis, ws, msgP, exGestalt));\n }\n static async open(\n sthis: SuperThis,\n auth: AuthType,\n curl: CoerceURI,\n imsgP: Partial<MsgerParamsWithEnDe> = {},\n ): Promise<Result<MsgRawConnection>> {\n // initial exchange with JSON encoding\n const jsMsgP = defaultMsgParams(sthis, { ...imsgP, mime: \"application/json\", ende: jsonEnDe(sthis) });\n const gestaltUrl = initialFPUri(curl);\n const gs = defaultGestalt(defaultMsgParams(sthis, imsgP), { id: \"FP-Universal-Client\" });\n /*\n * request Gestalt with Http\n */\n const rHC = await Msger.openHttp(sthis, [gestaltUrl], jsMsgP, { my: gs, remote: gs });\n if (rHC.isErr()) {\n return rHC;\n }\n const hc = rHC.Ok();\n // const rAuth = await authTypeFromUri(sthis.logger, url);\n // if (rAuth.isErr()) {\n // return Result.Err(rAuth)\n // }\n const resGestalt = await hc.request<ResGestalt, ReqGestalt>(buildReqGestalt(sthis, auth, gs), {\n waitFor: MsgIsResGestalt,\n });\n if (!MsgIsResGestalt(resGestalt)) {\n return sthis.logger.Error().Any({ resGestalt }).Msg(\"should be ResGestalt\").ResultError();\n }\n await hc.close(resGestalt /* as MsgWithConnAuth */);\n const exGt = { my: gs, remote: resGestalt.gestalt } satisfies ExchangedGestalt;\n const msgP = defaultMsgParams(sthis, imsgP);\n if (exGt.remote.protocolCapabilities.includes(\"reqRes\") && !exGt.remote.protocolCapabilities.includes(\"stream\")) {\n // console.log(\"openHttp---\", exGt.remote.httpEndpoints, curl?.toString(), exGt.remote.httpEndpoints.map((i) => BuildURI.from(curl).resolve(i).URI().toString()));\n return applyStart(\n Msger.openHttp(\n sthis,\n exGt.remote.httpEndpoints.map((i) => BuildURI.from(curl).resolve(i).URI()),\n msgP,\n exGt,\n ),\n );\n }\n const wsUrl = BuildURI.from(gestaltUrl).resolve(selectRandom(exGt.remote.wsEndpoints)).URI();\n // console.log(\"openWS---\", wsUrl.toString(), \"=====\", exGt.remote.wsEndpoints);\n return applyStart(Msger.openWS(sthis, wsUrl, msgP, exGt));\n }\n\n static connect(\n sthis: SuperThis,\n auth: AuthType,\n curl: CoerceURI,\n imsgP: Partial<MsgerParamsWithEnDe> = {},\n conn: Partial<QSId> = {},\n ): Promise<Result<MsgConnected>> {\n return Msger.open(sthis, auth, curl, imsgP).then((srv) => MsgConnected.connect(auth, srv, conn));\n }\n\n private constructor() {\n /* */\n }\n}\n","import { HttpHeader, Logger, Result, URI, exception2Result } from \"@adviser/cement\";\nimport { ensureLogger } from \"../../utils.js\";\nimport { MsgBase, buildErrorMsg, MsgWithError, RequestOpts, MsgIsError } from \"./msg-types.js\";\nimport {\n ActiveStream,\n ExchangedGestalt,\n MsgerParamsWithEnDe,\n MsgRawConnection,\n OnMsgFn,\n selectRandom,\n timeout,\n UnReg,\n} from \"./msger.js\";\nimport { MsgRawConnectionBase } from \"./msg-raw-connection-base.js\";\nimport { SuperThis } from \"../../types.js\";\n\nfunction toHttpProtocol(uri: URI): URI {\n const protocol = (uri.getParam(\"protocol\") ?? uri.protocol).replace(/:$/, \"\");\n const toFix = uri.build();\n switch (protocol) {\n case \"ws\":\n case \"http\":\n toFix.protocol(\"http\");\n break;\n case \"https\":\n case \"wss\":\n default:\n toFix.protocol(\"https\");\n break;\n }\n return toFix.URI();\n}\n\nexport function ensurePath(uri: URI, fp: string): string {\n const path = uri.pathname.replace(/\\/$/, \"\").replace(/^\\//, \"\");\n const buri = uri.build();\n if (path === \"\") {\n buri.appendRelative(fp);\n }\n return buri.toString();\n}\n\nexport class HttpConnection extends MsgRawConnectionBase implements MsgRawConnection {\n readonly logger: Logger;\n readonly msgP: MsgerParamsWithEnDe;\n\n readonly baseURIs: { in: URI; cleaned: URI }[];\n\n readonly #onMsg = new Map<string, OnMsgFn>();\n\n constructor(sthis: SuperThis, uris: URI[], msgP: MsgerParamsWithEnDe, exGestalt: ExchangedGestalt) {\n super(sthis, exGestalt);\n this.logger = ensureLogger(sthis, \"HttpConnection\");\n // this.msgParam = msgP;\n this.baseURIs = uris.map((uri) => ({\n in: uri,\n cleaned: toHttpProtocol(uri),\n }));\n this.msgP = msgP;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n send<S extends MsgBase, Q extends MsgBase>(_msg: Q): Promise<MsgWithError<S>> {\n throw new Error(\"Method not implemented.\");\n }\n\n async start(): Promise<Result<void>> {\n // if (this._qsOpen.req) {\n // const sOpen = await this.request(this._qsOpen.req, { waitFor: MsgIsResOpen });\n // if (!MsgIsResOpen(sOpen)) {\n // return Result.Err(this.logger.Error().Any(\"Err\", sOpen).Msg(\"unexpected response\").AsError());\n // }\n // this._qsOpen.res = sOpen;\n // }\n return Result.Ok(undefined);\n }\n\n async close(): Promise<Result<void>> {\n await Promise.all(Array.from(this.activeBinds.values()).map((state) => state.controller?.close()));\n this.#onMsg.clear();\n return Result.Ok(undefined);\n }\n\n toMsg<S extends MsgBase>(msg: MsgWithError<S>): MsgWithError<S> {\n this.#onMsg.forEach((fn) => fn(msg));\n return msg;\n }\n\n onMsg(fn: OnMsgFn): UnReg {\n const key = this.sthis.nextId().str;\n this.#onMsg.set(key, fn);\n return () => this.#onMsg.delete(key);\n }\n\n #poll(state: ActiveStream<MsgBase, MsgBase>): void {\n this.request(state.bind.msg, state.bind.opts)\n .then((msg) => {\n try {\n state.controller?.enqueue(msg);\n if (MsgIsError(msg)) {\n state.controller?.close();\n } else {\n state.timeout = setTimeout(() => this.#poll(state), state.bind.opts.pollInterval ?? 1000);\n }\n } catch (err) {\n state.controller?.error(err);\n state.controller?.close();\n }\n })\n .catch((err) => {\n state.controller?.error(err);\n // state.controller?.close();\n });\n }\n\n readonly activeBinds = new Map<string, ActiveStream<MsgBase, MsgBase>>();\n bind<Q extends MsgBase, S extends MsgBase>(req: Q, opts: RequestOpts): ReadableStream<MsgWithError<S>> {\n const state: ActiveStream<S, Q> = {\n id: this.sthis.nextId().str,\n bind: {\n msg: req,\n opts,\n },\n } satisfies ActiveStream<S, Q>;\n this.activeBinds.set(state.id, state);\n return new ReadableStream<MsgWithError<S>>({\n cancel: () => {\n clearTimeout(state.timeout as number);\n this.activeBinds.delete(state.id);\n },\n start: (controller) => {\n state.controller = controller;\n this.#poll(state);\n },\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async request<Q extends MsgBase, S extends MsgBase>(req: Q, _opts: RequestOpts): Promise<MsgWithError<S>> {\n const headers = HttpHeader.from();\n headers.Set(\"Content-Type\", this.msgP.mime);\n headers.Set(\"Accept\", this.msgP.mime);\n\n const rReqBody = exception2Result(() => this.msgP.ende.encode(req));\n if (rReqBody.isErr()) {\n return this.toMsg(\n buildErrorMsg(this, req, this.logger.Error().Err(rReqBody.Err()).Any(\"req\", req).Msg(\"encode error\").AsError()),\n );\n }\n headers.Set(\"Content-Length\", rReqBody.Ok().byteLength.toString());\n const url = selectRandom(this.baseURIs);\n // console.log(\"request\", url.cleaned.toString(), url.in.toString(), req);\n this.logger.Debug().Any(url).Any(\"body\", req).Msg(\"request\");\n const rRes = await exception2Result(() =>\n timeout(\n this.msgP.timeout,\n fetch(ensurePath(url.cleaned, \"fp\"), {\n method: \"PUT\",\n headers: headers.AsHeaderInit(),\n body: rReqBody.Ok(),\n }),\n ),\n );\n this.logger.Debug().Any(url).Any(\"body\", rRes).Msg(\"response\");\n if (rRes.isErr()) {\n return this.toMsg(buildErrorMsg(this, req, this.logger.Error().Err(rRes).Any(url).Msg(\"fetch error\").AsError()));\n }\n const res = rRes.Ok();\n if (!res.ok) {\n const data = new Uint8Array(await res.arrayBuffer());\n const ret = await exception2Result(async () => this.msgP.ende.decode(data) as S);\n if (ret.isErr() || !MsgIsError(ret.Ok())) {\n return this.toMsg(\n buildErrorMsg(\n this,\n req,\n this.logger\n .Error()\n .Any(url)\n .Str(\"status\", res.status.toString())\n .Str(\"statusText\", res.statusText)\n .Msg(\"HTTP Error\")\n .AsError(),\n await res.text().catch(() => \"no body\"),\n ),\n );\n }\n return this.toMsg(ret.Ok());\n }\n const data = new Uint8Array(await res.arrayBuffer());\n const ret = await exception2Result(async () => this.msgP.ende.decode(data) as S);\n if (ret.isErr()) {\n return this.toMsg(\n buildErrorMsg(this, req, this.logger.Error().Err(ret.Err()).Msg(\"decode error\").AsError(), this.sthis.txt.decode(data)),\n );\n }\n return this.toMsg(ret.Ok());\n }\n\n // toOnMessage<T extends MsgBase>(msg: WithErrorMsg<T>): Result<WithErrorMsg<T>> {\n // this.mec.msgFn?.(msg as unknown as MessageEvent<MsgBase>);\n // return Result.Ok(msg);\n // }\n}\n","import { SuperThis } from \"../../types.js\";\nimport { MsgBase, ErrorMsg, buildErrorMsg } from \"./msg-types.js\";\nimport { ExchangedGestalt, OnErrorFn, UnReg } from \"./msger.js\";\nimport { Logger } from \"@adviser/cement\";\n\nexport class MsgRawConnectionBase {\n readonly sthis: SuperThis;\n readonly exchangedGestalt: ExchangedGestalt;\n\n constructor(sthis: SuperThis, exGestalt: ExchangedGestalt) {\n this.sthis = sthis;\n this.exchangedGestalt = exGestalt;\n }\n\n readonly onErrorFns = new Map<string, OnErrorFn>();\n onError(fn: OnErrorFn): UnReg {\n const key = this.sthis.nextId().str;\n this.onErrorFns.set(key, fn);\n return () => this.onErrorFns.delete(key);\n }\n\n buildErrorMsg(\n msgCtx: {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n },\n msg: Partial<MsgBase>,\n err: Error,\n ): ErrorMsg {\n // const logLine = this.sthis.logger.Error().Err(err).Any(\"msg\", msg);\n const rmsg = Array.from(this.onErrorFns.values()).reduce((msg, fn) => {\n return fn(msg, err);\n }, msg);\n const emsg = buildErrorMsg(msgCtx, rmsg, err);\n msgCtx.logger.Error().Err(err).Any(\"msg\", rmsg).Msg(\"connection error\");\n return emsg;\n }\n}\n","import { exception2Result, Future, Logger, Result } from \"@adviser/cement\";\nimport { MsgBase, MsgIsError, buildErrorMsg, ReqOpen, WaitForTid, MsgWithError, RequestOpts, MsgIsTid } from \"./msg-types.js\";\nimport { ActiveStream, ExchangedGestalt, MsgerParamsWithEnDe, MsgRawConnection, OnMsgFn, UnReg } from \"./msger.js\";\nimport { MsgRawConnectionBase } from \"./msg-raw-connection-base.js\";\nimport { SuperThis } from \"../../types.js\";\nimport { ensureLogger } from \"../../utils.js\";\n\nexport interface WSReqOpen {\n readonly reqOpen: ReqOpen;\n readonly ws: WebSocket; // this WS is opened with a specific URL-Param\n}\n\nexport class WSConnection extends MsgRawConnectionBase implements MsgRawConnection {\n readonly logger: Logger;\n readonly msgP: MsgerParamsWithEnDe;\n readonly ws: WebSocket;\n // readonly baseURI: URI;\n\n readonly #onMsg = new Map<string, OnMsgFn>();\n readonly #onClose = new Map<string, UnReg>();\n\n readonly waitForTid = new Map<string, WaitForTid>();\n\n opened = false;\n\n readonly id: string;\n\n constructor(sthis: SuperThis, ws: WebSocket, msgP: MsgerParamsWithEnDe, exGestalt: ExchangedGestalt) {\n super(sthis, exGestalt);\n this.id = sthis.nextId().str;\n this.logger = ensureLogger(sthis, \"WSConnection\");\n this.msgP = msgP;\n this.ws = ws;\n // this.wqs = { ...wsq };\n }\n\n async start(): Promise<Result<void>> {\n const onOpenFuture: Future<Result<unknown>> = new Future<Result<unknown>>();\n const timer = setTimeout(() => {\n const err = this.logger.Error().Dur(\"timeout\", this.msgP.timeout).Msg(\"Timeout\").AsError();\n this.toMsg(buildErrorMsg(this, {} as MsgBase, err));\n onOpenFuture.resolve(Result.Err(err));\n }, this.msgP.timeout);\n this.ws.onopen = () => {\n onOpenFuture.resolve(Result.Ok(undefined));\n this.opened = true;\n };\n this.ws.onerror = (ierr) => {\n const err = this.logger.Error().Err(ierr).Msg(\"WS Error\").AsError();\n onOpenFuture.resolve(Result.Err(err));\n const res = this.buildErrorMsg(this, {}, err);\n this.toMsg(res);\n };\n this.ws.onmessage = (evt) => {\n if (!this.opened) {\n this.toMsg(buildErrorMsg(this, {} as MsgBase, this.logger.Error().Msg(\"Received message before onOpen\").AsError()));\n }\n this.#wsOnMessage(evt);\n };\n this.ws.onclose = () => {\n this.opened = false;\n // console.log(\"onclose\", this.id);\n this.close().catch((ierr) => {\n const err = this.logger.Error().Err(ierr).Msg(\"close error\").AsError();\n onOpenFuture.resolve(Result.Err(err));\n this.toMsg(buildErrorMsg(this, { tid: \"internal\" } as MsgBase, err));\n });\n };\n /* wait for onOpen */\n const rOpen = await onOpenFuture.asPromise().finally(() => {\n clearTimeout(timer);\n });\n if (rOpen.isErr()) {\n return rOpen;\n }\n // const resOpen = await this.request(this.wqs.reqOpen, { waitFor: MsgIsResOpen });\n // if (!MsgIsResOpen(resOpen)) {\n // return Result.Err(this.logger.Error().Any(\"ErrMsg\", resOpen).Msg(\"Invalid response\").AsError());\n // }\n // this.wqs.resOpen = resOpen;\n return Result.Ok(undefined);\n }\n\n readonly #wsOnMessage = async (event: MessageEvent) => {\n const rMsg = await exception2Result(() => this.msgP.ende.decode(event.data) as MsgBase);\n if (rMsg.isErr()) {\n this.logger.Error().Err(rMsg).Any(event.data).Msg(\"Invalid message\");\n return;\n }\n const msg = rMsg.Ok();\n const waitFor = this.waitForTid.get(msg.tid);\n Array.from(this.#onMsg.values()).forEach((cb) => {\n // console.log(\"cb-onmessage\", this.id, msg, cb.toString());\n cb(msg);\n });\n if (waitFor) {\n if (MsgIsError(msg)) {\n this.waitForTid.delete(msg.tid);\n waitFor.future.resolve(msg);\n } else if (waitFor.waitFor(msg)) {\n // what for a specific type\n this.waitForTid.delete(msg.tid);\n waitFor.future.resolve(msg);\n } else {\n // wild-card\n this.waitForTid.delete(msg.tid);\n waitFor.future.resolve(msg);\n }\n }\n };\n\n async close(): Promise<Result<void>> {\n this.#onClose.forEach((fn) => fn());\n this.#onClose.clear();\n this.#onMsg.clear();\n this.ws.close();\n return Result.Ok(undefined);\n }\n\n toMsg<S extends MsgBase>(msg: MsgWithError<S>): MsgWithError<S> {\n this.#onMsg.forEach((fn) => fn(msg));\n return msg;\n }\n\n send<Q extends MsgBase, S extends MsgBase>(msg: Q): Promise<S> {\n this.ws.send(this.msgP.ende.encode(msg));\n return Promise.resolve(msg as unknown as S);\n }\n\n onMsg<S extends MsgBase>(fn: OnMsgFn<S>): UnReg {\n const key = this.sthis.nextId().str;\n this.#onMsg.set(key, fn as OnMsgFn);\n return () => this.#onMsg.delete(key);\n }\n\n onClose(fn: UnReg): UnReg {\n const key = this.sthis.nextId().str;\n this.#onClose.set(key, fn);\n return () => this.#onClose.delete(key);\n }\n\n readonly activeBinds = new Map<string, ActiveStream<MsgBase, MsgBase>>();\n bind<Q extends MsgBase, S extends MsgBase>(req: Q, opts: RequestOpts): ReadableStream<MsgWithError<S>> {\n const state: ActiveStream<S, Q> = {\n id: this.sthis.nextId().str,\n bind: {\n msg: req,\n opts,\n },\n // timeout: undefined,\n // controller: undefined,\n } satisfies ActiveStream<S, Q>;\n this.activeBinds.set(state.id, state);\n return new ReadableStream<MsgWithError<S>>({\n cancel: () => {\n // clearTimeout(state.timeout as number);\n this.activeBinds.delete(state.id);\n },\n start: (controller) => {\n this.onMsg<S>((msg) => {\n if (MsgIsError(msg)) {\n controller.enqueue(msg);\n return;\n }\n if (!MsgIsTid(msg, req.tid)) {\n return;\n }\n if (opts.waitFor && opts.waitFor(msg)) {\n controller.enqueue(msg);\n }\n });\n this.send(req);\n const future = new Future<S>();\n this.waitForTid.set(req.tid, { tid: req.tid, future, waitFor: opts.waitFor, timeout: opts.timeout });\n future.asPromise().then((msg) => {\n if (MsgIsError(msg)) {\n // double err emitting\n controller.enqueue(msg);\n controller.close();\n }\n });\n },\n });\n }\n\n async request<Q extends MsgBase, S extends MsgBase>(req: Q, opts: RequestOpts): Promise<MsgWithError<S>> {\n if (!this.opened) {\n return buildErrorMsg(this, req, this.logger.Error().Msg(\"Connection not open\").AsError());\n }\n const future = new Future<S>();\n this.waitForTid.set(req.tid, { tid: req.tid, future, waitFor: opts.waitFor, timeout: opts.timeout });\n await this.send(req);\n return future.asPromise();\n }\n\n // toOnMessage<T extends MsgBase>(msg: WithErrorMsg<T>): Result<WithErrorMsg<T>> {\n // this.mec.msgFn?.(msg as unknown as MessageEvent<MsgBase>);\n // return Result.Ok(msg);\n // }\n}\n","import { Result, URI } from \"@adviser/cement\";\nimport {\n ReqSignedUrl,\n NextId,\n MsgBase,\n ResSignedUrl,\n MsgWithError,\n buildRes,\n ReqSignedUrlParam,\n buildReqSignedUrl,\n GwCtx,\n MsgIsTenantLedger,\n MsgTypesCtx,\n MsgWithConnAuth,\n PreSignedMsg,\n} from \"./msg-types.js\";\n\nexport interface ReqGetData extends ReqSignedUrl {\n readonly type: \"reqGetData\";\n}\n\nexport function buildReqGetData(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqGetData {\n return buildReqSignedUrl<ReqGetData>(sthis, \"reqGetData\", sup, ctx);\n}\n\nexport function MsgIsReqGetData(msg: MsgBase): msg is ReqGetData {\n return msg.type === \"reqGetData\";\n}\n\nexport interface ResGetData extends ResSignedUrl {\n readonly type: \"resGetData\";\n // readonly payload: Uint8Array; // transfered via JSON base64\n}\n\nexport function MsgIsResGetData(msg: MsgBase): msg is ResGetData {\n return msg.type === \"resGetData\" && MsgIsTenantLedger(msg);\n}\n\nexport interface CalculatePreSignedUrl {\n calculatePreSignedUrl(ctx: MsgTypesCtx, p: PreSignedMsg): Promise<Result<URI>>;\n}\n\nexport function buildResGetData(\n msgCtx: MsgTypesCtx,\n req: MsgWithConnAuth<ReqGetData>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResGetData>> {\n return buildRes<MsgWithConnAuth<ReqGetData>, ResGetData>(\n { method: \"GET\", store: req.methodParams.store },\n \"resGetData\",\n msgCtx,\n req,\n ctx,\n );\n}\n\nexport interface ReqPutData extends ReqSignedUrl {\n readonly type: \"reqPutData\";\n // readonly payload: Uint8Array; // transfered via JSON base64\n}\n\nexport function MsgIsReqPutData(msg: MsgBase): msg is ReqPutData {\n return msg.type === \"reqPutData\";\n}\n\nexport function buildReqPutData(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqPutData {\n return buildReqSignedUrl<ReqPutData>(sthis, \"reqPutData\", sup, ctx);\n}\n\nexport interface ResPutData extends ResSignedUrl {\n readonly type: \"resPutData\";\n}\n\nexport function MsgIsResPutData(msg: MsgBase): msg is ResPutData {\n return msg.type === \"resPutData\";\n}\n\nexport function buildResPutData(\n msgCtx: MsgTypesCtx,\n req: MsgWithConnAuth<ReqPutData>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResPutData>> {\n return buildRes<MsgWithConnAuth<ReqPutData>, ResPutData>(\n { method: \"PUT\", store: req.methodParams.store },\n \"resPutData\",\n msgCtx,\n req,\n ctx,\n );\n}\n\nexport interface ReqDelData extends ReqSignedUrl {\n readonly type: \"reqDelData\";\n}\n\nexport function MsgIsReqDelData(msg: MsgBase): msg is ReqDelData {\n return msg.type === \"reqDelData\";\n}\n\nexport function buildReqDelData(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqDelData {\n return buildReqSignedUrl<ReqDelData>(sthis, \"reqDelData\", sup, ctx);\n}\n\nexport interface ResDelData extends ResSignedUrl {\n readonly type: \"resDelData\";\n}\n\nexport function MsgIsResDelData(msg: MsgBase): msg is ResDelData {\n return msg.type === \"resDelData\";\n}\n\nexport function buildResDelData(\n msgCtx: MsgTypesCtx,\n req: MsgWithConnAuth<ReqDelData>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResDelData>> {\n return buildRes<MsgWithConnAuth<ReqDelData>, ResDelData>(\n { method: \"DELETE\", store: req.methodParams.store },\n \"resDelData\",\n msgCtx,\n req,\n ctx,\n );\n}\n","import {\n AuthType,\n GwCtx,\n MsgBase,\n MsgWithTenantLedger,\n NextId,\n ResOptionalSignedUrl,\n MsgTypesCtx,\n MsgWithConnAuth,\n SignedUrlParam,\n MethodSignedUrlParam,\n ResSignedUrl,\n VERSION,\n} from \"./msg-types.js\";\nimport { V2SerializedMetaKey } from \"../../runtime/meta-key-hack.js\";\n\n/* Put Meta */\nexport interface ReqPutMeta extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly type: \"reqPutMeta\";\n readonly methodParams: MethodSignedUrlParam;\n readonly params: SignedUrlParam;\n readonly meta: V2SerializedMetaKey;\n}\n\nexport interface ResPutMeta extends MsgWithTenantLedger<MsgWithConnAuth>, ResSignedUrl {\n readonly type: \"resPutMeta\";\n // readonly signedUrl?: string;\n readonly meta: V2SerializedMetaKey;\n}\n\nexport function buildReqPutMeta(\n sthis: NextId,\n auth: AuthType,\n signedUrlParams: SignedUrlParam,\n meta: V2SerializedMetaKey,\n gwCtx: GwCtx,\n): ReqPutMeta {\n return {\n auth,\n tid: sthis.nextId().str,\n type: \"reqPutMeta\",\n ...gwCtx,\n version: VERSION,\n methodParams: {\n method: \"PUT\",\n store: \"meta\",\n },\n params: signedUrlParams,\n meta,\n };\n}\n\nexport function MsgIsReqPutMeta(msg: MsgBase): msg is ReqPutMeta {\n return msg.type === \"reqPutMeta\";\n}\n\nexport function buildResPutMeta(\n _msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqPutMeta>>,\n meta: V2SerializedMetaKey,\n signedUrl: string,\n): ResPutMeta {\n return {\n meta,\n tid: req.tid,\n conn: req.conn,\n auth: req.auth,\n methodParams: req.methodParams,\n params: req.params,\n tenant: req.tenant,\n type: \"resPutMeta\",\n signedUrl,\n version: VERSION,\n };\n}\n\nexport function MsgIsResPutMeta(qs: MsgBase): qs is ResPutMeta {\n return qs.type === \"resPutMeta\";\n}\n\n/* Bind Meta */\nexport interface BindGetMeta extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly type: \"bindGetMeta\";\n readonly params: SignedUrlParam;\n}\n\nexport function MsgIsBindGetMeta(msg: MsgBase): msg is BindGetMeta {\n return msg.type === \"bindGetMeta\";\n}\n\nexport interface EventGetMeta extends MsgWithTenantLedger<MsgWithConnAuth>, ResSignedUrl {\n readonly type: \"eventGetMeta\";\n readonly meta: V2SerializedMetaKey;\n}\n\nexport function buildBindGetMeta(sthis: NextId, auth: AuthType, params: SignedUrlParam, gwCtx: GwCtx): BindGetMeta {\n return {\n auth,\n tid: sthis.nextId().str,\n ...gwCtx,\n type: \"bindGetMeta\",\n version: VERSION,\n params,\n };\n}\n\nexport function buildEventGetMeta(\n _msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<BindGetMeta>>,\n meta: V2SerializedMetaKey,\n gwCtx: GwCtx,\n signedUrl: string,\n): EventGetMeta {\n return {\n conn: gwCtx.conn,\n tenant: req.tenant,\n auth: req.auth,\n tid: req.tid,\n meta,\n signedUrl,\n type: \"eventGetMeta\",\n params: req.params,\n methodParams: { method: \"GET\", store: \"meta\" },\n version: VERSION,\n };\n}\n\nexport function MsgIsEventGetMeta(qs: MsgBase): qs is EventGetMeta {\n return qs.type === \"eventGetMeta\";\n}\n\n/* Del Meta */\nexport interface ReqDelMeta extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly type: \"reqDelMeta\";\n readonly params: SignedUrlParam;\n readonly meta?: V2SerializedMetaKey;\n}\n\nexport function buildReqDelMeta(\n sthis: NextId,\n auth: AuthType,\n params: SignedUrlParam,\n gwCtx: GwCtx,\n meta?: V2SerializedMetaKey,\n): ReqDelMeta {\n return {\n auth,\n tid: sthis.nextId().str,\n tenant: gwCtx.tenant,\n conn: gwCtx.conn,\n params,\n meta,\n type: \"reqDelMeta\",\n version: VERSION,\n // params: signedUrlParams,\n };\n}\n\nexport function MsgIsReqDelMeta(msg: MsgBase): msg is ReqDelMeta {\n return msg.type === \"reqDelMeta\";\n}\n\nexport interface ResDelMeta extends MsgWithTenantLedger<MsgWithConnAuth>, ResOptionalSignedUrl {\n readonly type: \"resDelMeta\";\n}\n\nexport function buildResDelMeta(\n // msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqDelMeta>>,\n params: SignedUrlParam,\n signedUrl?: string,\n): ResDelMeta {\n return {\n auth: req.auth,\n methodParams: { method: \"DELETE\", store: \"meta\" },\n params,\n signedUrl,\n tid: req.tid,\n conn: req.conn,\n tenant: req.tenant,\n type: \"resDelMeta\",\n // key: req.key,\n version: VERSION,\n };\n}\n\nexport function MsgIsResDelMeta(qs: MsgBase): qs is ResDelMeta {\n return qs.type === \"resDelMeta\";\n}\n","import { exception2Result, Result, URI } from \"@adviser/cement\";\nimport { SerializedMeta } from \"./gateways/fp-envelope-serialize.js\";\nimport { SerdeGateway, SerdeGatewayCtx } from \"../blockstore/serde-gateway.js\";\nimport { PARAM, SuperThis } from \"../types.js\";\nimport { FPEnvelope, FPEnvelopeMeta } from \"../blockstore/fp-envelope.js\";\nimport { NotFoundError } from \"../utils.js\";\nimport { DefSerdeGateway } from \"./gateways/def-serde-gateway.js\";\nimport { Gateway } from \"../blockstore/gateway.js\";\nimport { Loadable } from \"../blockstore/types.js\";\n\ntype V1SerializedMetaKey = SerializedMeta & {\n // old version\n readonly key?: string | string[];\n // new version\n readonly keys?: string[];\n};\n\nexport interface V2SerializedMetaKey {\n readonly metas: SerializedMeta[];\n readonly keys: string[];\n}\n\n// type SerializedMetaWithKey = V1SerializedMetaKey[] | V2SerializedMetaKey;\n\nfunction fromV1toV2SerializedMetaKey(v1s: unknown[], keys: string[] = []): V2SerializedMetaKey {\n const res = (v1s as Partial<V1SerializedMetaKey>[]).reduce(\n (acc, v1) => {\n const keys: string[] = [];\n if (v1.key) {\n if (typeof v1.key === \"string\") {\n acc.keys.add(v1.key);\n } else {\n keys.push(...v1.key);\n }\n }\n if (v1.keys) {\n keys.push(...v1.keys);\n }\n for (const key of keys) {\n acc.keys.add(key);\n }\n if (typeof v1.cid === \"string\" && (!v1.data || typeof v1.data === \"string\") && (!v1.parents || Array.isArray(v1.parents))) {\n acc.metas.set(v1.cid, {\n data: v1.data ?? \"\",\n parents: v1.parents ?? [],\n cid: v1.cid,\n });\n }\n return acc;\n },\n {\n metas: new Map<string, SerializedMeta>(),\n keys: new Set<string>(keys),\n },\n );\n return {\n metas: Array.from(res.metas.values()),\n keys: Array.from(res.keys),\n };\n}\n\nfunction isV2SerializedMetaKey(or: NonNullable<unknown>): or is Partial<V2SerializedMetaKey> {\n const my = or as Partial<V2SerializedMetaKey>;\n return my !== null && (!my.keys || Array.isArray(my.keys)) && (!my.metas || Array.isArray(my.metas));\n}\n\nfunction toV2SerializedMetaKey(or: NonNullable<unknown>): V2SerializedMetaKey {\n if (Array.isArray(or)) {\n return fromV1toV2SerializedMetaKey(or);\n }\n if (isV2SerializedMetaKey(or)) {\n return fromV1toV2SerializedMetaKey(or.metas ?? [], or.keys ?? []);\n }\n throw new Error(\"not a valid serialized meta key\");\n}\n\nexport async function V2SerializedMetaKeyExtractKey(\n ctx: SerdeGatewayCtx,\n v2: V2SerializedMetaKey,\n): Promise<Result<SerializedMeta[]>> {\n const kb = await ctx.loader.keyBag();\n if (!kb) {\n return Promise.resolve(Result.Err(new Error(\"missing keybag\")));\n }\n const dataUrl = await ctx.loader.attachedStores.local().active.car.url();\n const keyName = dataUrl.getParam(PARAM.STORE_KEY);\n if (!keyName) {\n ctx.loader.sthis.logger.Warn().Url(dataUrl).Msg(\"missing store key\");\n } else {\n const rKey = await kb.getNamedKey(keyName);\n if (rKey.isErr()) {\n ctx.loader.sthis.logger.Warn().Str(\"keyName\", keyName).Msg(\"did not found a extractable key\");\n } else {\n for (const keyStr of v2.keys) {\n // side effect: in the keybag\n // this is the key gossip protocol\n // it basically collects all the keys that are used distributed metas\n const res = await rKey.Ok().upsert(keyStr, false);\n if (res.isErr()) {\n ctx.loader.sthis.logger.Warn().Str(\"keyStr\", keyStr).Msg(\"failed to upsert key\");\n }\n }\n }\n }\n return Promise.resolve(Result.Ok(v2.metas));\n}\n\nexport async function decodeAsToSerializedMeta(ctx: SerdeGatewayCtx, raw: Uint8Array): Promise<Result<V2SerializedMetaKey>> {\n const rJsObj = exception2Result(() => JSON.parse(ctx.loader.sthis.txt.decode(raw))) as Result<NonNullable<unknown>>;\n if (rJsObj.isErr()) {\n return Result.Err(rJsObj);\n }\n const v2 = toV2SerializedMetaKey(rJsObj.unwrap());\n const metas = await V2SerializedMetaKeyExtractKey(ctx, v2);\n if (metas.isErr()) {\n return Result.Err(metas);\n }\n return Result.Ok({\n metas: metas.Ok(),\n keys: v2.keys,\n });\n}\n\nexport function addKeyToDbMetaDecoder(\n ctx: SerdeGatewayCtx & { readonly lastDecodedMetas?: V2SerializedMetaKey[] },\n): SerdeGatewayCtx & { lastDecodedMetas: V2SerializedMetaKey[] } {\n const lastDecodedMetas: V2SerializedMetaKey[] = ctx.lastDecodedMetas ?? [];\n return {\n ...ctx,\n lastDecodedMetas,\n decoder: {\n meta: async (sthis: SuperThis, raw: Uint8Array): Promise<Result<SerializedMeta[]>> => {\n const r = await decodeAsToSerializedMeta(ctx, raw);\n if (r.isErr()) {\n return Promise.resolve(Result.Err(r));\n }\n // we only want to keep the last 2 metas\n if (lastDecodedMetas.length > 2) {\n lastDecodedMetas.shift();\n }\n lastDecodedMetas.push(r.Ok());\n return Promise.resolve(Result.Ok(r.Ok().metas));\n },\n },\n };\n}\n\nasync function wrapEncode<T extends V1SerializedMetaKey[] | V2SerializedMetaKey>(\n ctx: SerdeGatewayCtx,\n payload: SerializedMeta[],\n fn: (payload: SerializedMeta[], keyM: string[]) => T,\n): Promise<Result<T>> {\n const carStore = ctx.loader.attachedStores.local().active.car;\n const kb = await ctx.loader.keyBag();\n if (!kb) {\n return Promise.resolve(Result.Err(new Error(\"missing keybag\")));\n }\n const keyName = carStore.url().getParam(PARAM.STORE_KEY) ?? \"\";\n const rKex = await kb.getNamedKey(keyName);\n if (rKex.isErr()) {\n return Promise.resolve(Result.Err(rKex.Err()));\n }\n /* security: we don't want to log the key */\n const keyMaterials = await rKex\n .Ok()\n .asKeysItem()\n .then((i) => Object.values(i.keys).map((i) => i.key));\n\n return Promise.resolve(Result.Ok(fn(payload, keyMaterials)));\n}\n\nexport function encodeAsV1SerializedMetaKey(\n ctx: SerdeGatewayCtx,\n payload: SerializedMeta[],\n): Promise<Result<V1SerializedMetaKey[]>> {\n return wrapEncode(ctx, payload, (payload, keyM) => payload.map((p) => ({ ...p, key: keyM }) satisfies V1SerializedMetaKey));\n}\n\nexport function encodeAsV2SerializedMetaKey(ctx: SerdeGatewayCtx, payload: SerializedMeta[]): Promise<Result<V2SerializedMetaKey>> {\n return wrapEncode(\n ctx,\n payload,\n (payload, keyM) =>\n ({\n metas: payload,\n keys: keyM,\n }) satisfies V2SerializedMetaKey,\n );\n}\n\nexport function addKeyToDbMetaEncoder(ctx: SerdeGatewayCtx, version: \"v1\" | \"v2\"): SerdeGatewayCtx {\n return {\n ...ctx,\n encoder: {\n meta: async (sthis: SuperThis, payload: SerializedMeta[]): Promise<Result<Uint8Array>> => {\n let obj: Result<V1SerializedMetaKey[] | V2SerializedMetaKey>;\n switch (version) {\n case \"v1\":\n obj = await encodeAsV1SerializedMetaKey(ctx, payload);\n break;\n case \"v2\":\n obj = await encodeAsV2SerializedMetaKey(ctx, payload);\n break;\n default:\n return Promise.resolve(Result.Err(`unknown version:[${version}]`));\n }\n if (obj.isErr()) {\n return Promise.resolve(Result.Err(obj));\n }\n try {\n return Promise.resolve(Result.Ok(sthis.txt.encode(JSON.stringify(obj.Ok()))));\n } catch (e) {\n return Promise.resolve(Result.Err(e as Error));\n }\n },\n },\n };\n}\n\nexport class AddKeyToDbMetaGateway implements SerdeGateway {\n private readonly sdGw: DefSerdeGateway;\n readonly version: \"v1\" | \"v2\";\n constructor(gw: Gateway, version: \"v1\" | \"v2\") {\n this.sdGw = new DefSerdeGateway(gw);\n this.version = version;\n }\n\n buildUrl(ctx: SerdeGatewayCtx, baseUrl: URI, key: string): Promise<Result<URI>> {\n return this.sdGw.buildUrl(ctx, baseUrl, key);\n }\n start(ctx: SerdeGatewayCtx, baseUrl: URI): Promise<Result<URI>> {\n return this.sdGw.start(ctx, baseUrl);\n }\n close(ctx: SerdeGatewayCtx, baseUrl: URI): Promise<Result<void, Error>> {\n return this.sdGw.close(ctx, baseUrl);\n }\n async put<T>(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope<T>): Promise<Result<void, Error>> {\n return this.sdGw.put(addKeyToDbMetaEncoder(ctx, this.version), url, body);\n }\n async get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<Result<FPEnvelope<S>, Error | NotFoundError>> {\n return this.sdGw.get(addKeyToDbMetaDecoder({ ...ctx, lastDecodedMetas: this.lastDecodedMetas }), url);\n }\n\n // only for tests\n readonly lastDecodedMetas: V2SerializedMetaKey[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n delete(ctx: SerdeGatewayCtx, url: URI, loader?: Loadable): Promise<Result<void, Error>> {\n return this.sdGw.delete(ctx, url);\n }\n subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (meta: FPEnvelopeMeta) => Promise<void>): Promise<Result<() => void, Error>> {\n return this.sdGw.subscribe(addKeyToDbMetaDecoder({ ...ctx, lastDecodedMetas: this.lastDecodedMetas }), url, callback);\n }\n getPlain(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<Uint8Array>> {\n return this.sdGw.getPlain(ctx, url, key);\n }\n destroy(ctx: SerdeGatewayCtx, baseUrl: URI): Promise<Result<void, Error>> {\n return this.sdGw.destroy(ctx, baseUrl);\n }\n}\n","export * as cloud from \"./cloud/index.js\";\n","export * from \"./http-connection.js\";\nexport * from \"./msg-raw-connection-base.js\";\nexport * from \"./msg-types-data.js\";\nexport * from \"./msg-types-meta.js\";\nexport * from \"./msg-types-meta.js\";\nexport * from \"./msg-types-wal.js\";\nexport * from \"./msg-types.js\";\nexport * from \"./msger.js\";\nexport * from \"./ws-connection.js\";\n","import {\n MsgBase,\n MsgWithError,\n buildRes,\n NextId,\n ReqSignedUrl,\n ResSignedUrl,\n ReqSignedUrlParam,\n buildReqSignedUrl,\n GwCtx,\n MsgIsTenantLedger,\n MsgWithTenantLedger,\n MsgTypesCtx,\n MsgWithConnAuth,\n} from \"./msg-types.js\";\nimport { CalculatePreSignedUrl } from \"./msg-types-data.js\";\n\nexport interface ReqGetWAL extends ReqSignedUrl {\n readonly type: \"reqGetWAL\";\n}\n\nexport function MsgIsReqGetWAL(msg: MsgBase): msg is ReqGetWAL {\n return msg.type === \"reqGetWAL\";\n}\n\nexport function buildReqGetWAL(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqGetWAL {\n return buildReqSignedUrl<ReqGetWAL>(sthis, \"reqGetWAL\", sup, ctx);\n}\n\nexport interface ResGetWAL extends ResSignedUrl {\n readonly type: \"resGetWAL\";\n // readonly payload: Uint8Array; // transfered via JSON base64\n}\n\nexport function MsgIsResGetWAL(msg: MsgBase): msg is ResGetWAL {\n return msg.type === \"resGetWAL\";\n}\n\nexport function buildResGetWAL(\n msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqGetWAL>>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResGetWAL>> {\n return buildRes<MsgWithTenantLedger<MsgWithConnAuth<ReqGetWAL>>, ResGetWAL>(\n { method: \"GET\", store: \"wal\" },\n \"resGetWAL\",\n msgCtx,\n req,\n ctx,\n );\n}\n\nexport interface ReqPutWAL extends Omit<ReqSignedUrl, \"type\"> {\n readonly type: \"reqPutWAL\";\n // readonly payload: Uint8Array; // transfered via JSON base64\n}\n\nexport function MsgIsReqPutWAL(msg: MsgBase): msg is ReqPutWAL {\n return msg.type === \"reqPutWAL\";\n}\n\nexport function buildReqPutWAL(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqPutWAL {\n return buildReqSignedUrl<ReqPutWAL>(sthis, \"reqPutWAL\", sup, ctx);\n}\n\nexport interface ResPutWAL extends Omit<ResSignedUrl, \"type\"> {\n readonly type: \"resPutWAL\";\n}\n\nexport function MsgIsResPutWAL(msg: MsgBase): msg is ResPutWAL {\n return msg.type === \"resPutWAL\";\n}\n\nexport function buildResPutWAL(\n msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqPutWAL>>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResPutWAL>> {\n return buildRes<MsgWithTenantLedger<MsgWithConnAuth<ReqPutWAL>>, ResPutWAL>(\n { method: \"PUT\", store: \"wal\" },\n \"resPutWAL\",\n msgCtx,\n req,\n ctx,\n );\n}\n\nexport interface ReqDelWAL extends Omit<ReqSignedUrl, \"type\"> {\n readonly type: \"reqDelWAL\";\n}\n\nexport function MsgIsReqDelWAL(msg: MsgBase): msg is ReqDelWAL {\n return msg.type === \"reqDelWAL\";\n}\n\nexport function buildReqDelWAL(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqDelWAL {\n return buildReqSignedUrl<ReqDelWAL>(sthis, \"reqDelWAL\", sup, ctx);\n}\n\nexport interface ResDelWAL extends Omit<ResSignedUrl, \"type\"> {\n readonly type: \"resDelWAL\";\n}\n\nexport function MsgIsResDelWAL(msg: MsgBase): msg is ResDelWAL {\n return msg.type === \"resDelWAL\" && MsgIsTenantLedger(msg);\n}\n\nexport function buildResDelWAL(\n msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqDelWAL>>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResDelWAL>> {\n return buildRes<MsgWithTenantLedger<MsgWithConnAuth<ReqDelWAL>>, ResDelWAL>(\n { method: \"DELETE\", store: \"wal\" },\n \"resDelWAL\",\n msgCtx,\n req,\n ctx,\n );\n}\n","export const PACKAGE_VERSION = Object.keys({\n \"0.20.4-dev-preview-1\": \"xxxx\",\n})[0] as string;\n"],"mappings":"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","names":["import_cement","raw","import_cement","index","import_cement","hasher","import_cement","import_base58","import_cement","import_cement","import_cement","import_cement","import_cement","import_cement","import_cement","raw","raw","decode","encode","import_multiformats","mfBlock","codec","hasher","binary","import_sha2","import_utils","cache","hasher","charwise","root","import_cement","import_cement","import_cement","import_cement","import_sha2","decode","hasher","import_block","import_cement","import_cement","dagCodec","import_sha2","codec","encode","dagCodec","import_sha2","cid","import_cement","pLimit","cid","got","ci","e","decode","hasher","import_base58","import_sha2","hasher","import_clock","import_dag_json","pRetry","pMap","import_cement","import_link","import_sha2","codec","import_clock","encode","hasher","codec","decode","import_clock","import_crdt","import_cement","task","updates","import_cement","import_base58","alg","options","import_cement","gateway_exports","gateway_exports","import_cement","import_cement","import_cement","msg","data","ret","import_cement","raw","WebSocket","import_cement","keys","raw","i","payload","VERSION","module"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/ledger.ts","../../src/utils.ts","../../src/types.ts","../../src/write-queue.ts","../../src/runtime/files.ts","../../src/runtime/key-bag.ts","../../src/runtime/gateways/file/sys-file-system-factory.ts","../../src/runtime/gateways/file/key-bag-file.ts","../../src/runtime/key-bag-memory.ts","../../src/blockstore/register-store-protocol.ts","../../src/runtime/gateways/file/version.ts","../../src/runtime/gateways/indexeddb-version.ts","../../src/runtime/gateways/file/gateway-impl.ts","../../src/runtime/gateways/file/utils.ts","../../src/runtime/gateways/memory/gateway.ts","../../src/runtime/gateways/memory/version.ts","../../src/runtime/gateways/def-serde-gateway.ts","../../src/blockstore/fp-envelope.ts","../../src/runtime/gateways/fp-envelope-serialize.ts","../../src/runtime/wait-pr-multiformats/block.ts","../../src/indexer-helpers.ts","../../src/indexer.ts","../../src/database.ts","../../src/crdt.ts","../../src/blockstore/index.ts","../../src/blockstore/types.ts","../../src/blockstore/store-factory.ts","../../src/blockstore/store.ts","../../src/blockstore/loader.ts","../../src/blockstore/loader-helpers.ts","../../src/blockstore/transaction.ts","../../src/blockstore/commit-queue.ts","../../src/blockstore/commitor.ts","../../src/blockstore/task-manager.ts","../../src/blockstore/attachable-store.ts","../../src/runtime/keyed-crypto.ts","../../src/blockstore/interceptor-gateway.ts","../../src/blockstore/uri-interceptor.ts","../../src/crdt-helpers.ts","../../src/crdt-clock.ts","../../src/apply-head-queue.ts","../../src/context.ts","../../src/runtime/index.ts","../../src/runtime/wait-pr-multiformats/index.ts","../../src/runtime/wait-pr-multiformats/codec-interface.ts","../../src/runtime/sts-service/index.ts","../../src/runtime/gateways/index.ts","../../src/runtime/gateways/file/index.ts","../../src/runtime/gateways/cloud/gateway.ts","../../src/protocols/cloud/msg-types.ts","../../src/protocols/cloud/msger.ts","../../src/protocols/cloud/http-connection.ts","../../src/protocols/cloud/msg-raw-connection-base.ts","../../src/protocols/cloud/ws-connection.ts","../../src/protocols/cloud/msg-types-data.ts","../../src/protocols/cloud/msg-types-meta.ts","../../src/runtime/meta-key-hack.ts","../../src/protocols/index.ts","../../src/protocols/cloud/index.ts","../../src/protocols/cloud/msg-types-wal.ts","../../src/version.ts"],"sourcesContent":["export * from \"./ledger.js\";\nexport * from \"./database.js\";\nexport * from \"./types.js\";\n\nexport * from \"./crdt.js\";\n\nexport * from \"./indexer.js\";\n\nexport { defaultWriteQueueOpts } from \"./write-queue.js\";\n\nexport * as bs from \"./blockstore/index.js\";\nexport * as blockstore from \"./blockstore/index.js\";\n\nexport * as rt from \"./runtime/index.js\";\nexport * as runtime from \"./runtime/index.js\";\n\nexport * as ps from \"./protocols/index.js\";\nexport * as protocols from \"./protocols/index.js\";\n\nexport * from \"./utils.js\";\n\nexport * from \"./version.js\";\n","import { BuildURI, KeyedResolvOnce, Logger, ResolveOnce, URI } from \"@adviser/cement\";\n\nimport { defaultWriteQueueOpts, writeQueue } from \"./write-queue.js\";\nimport type {\n DocUpdate,\n ConfigOpts,\n DocWithId,\n ListenerFn,\n DocTypes,\n SuperThis,\n Database,\n Ledger,\n WriteQueue,\n CRDT,\n LedgerOpts,\n Attachable,\n Attached,\n} from \"./types.js\";\nimport { PARAM } from \"./types.js\";\nimport { StoreURIRuntime, StoreUrlsOpts } from \"./blockstore/index.js\";\nimport { ensureLogger, ensureSuperThis, ensureURIDefaults, toSortedArray } from \"./utils.js\";\n\nimport { decodeFile, encodeFile } from \"./runtime/files.js\";\nimport { defaultKeyBagOpts } from \"./runtime/key-bag.js\";\nimport { getDefaultURI } from \"./blockstore/register-store-protocol.js\";\nimport { DatabaseImpl } from \"./database.js\";\nimport { CRDTImpl } from \"./crdt.js\";\nimport { Context } from \"./context.js\";\n\nconst ledgers = new KeyedResolvOnce<Ledger>();\n\nexport function keyConfigOpts(sthis: SuperThis, name: string, opts?: ConfigOpts): string {\n return JSON.stringify(\n toSortedArray({\n name,\n stores: toSortedArray(JSON.parse(JSON.stringify(toStoreURIRuntime(sthis, name, opts?.storeUrls)))),\n }),\n );\n}\n\nexport function isLedger(db: unknown): db is Ledger {\n return db instanceof LedgerImpl || db instanceof LedgerShell;\n}\n\nexport function LedgerFactory(name: string, opts?: ConfigOpts): Ledger {\n const sthis = ensureSuperThis(opts);\n return new LedgerShell(\n ledgers.get(keyConfigOpts(sthis, name, opts)).once((key) => {\n const db = new LedgerImpl(sthis, {\n name,\n meta: opts?.meta,\n keyBag: defaultKeyBagOpts(sthis, opts?.keyBag),\n storeUrls: toStoreURIRuntime(sthis, name, opts?.storeUrls),\n gatewayInterceptor: opts?.gatewayInterceptor,\n writeQueue: defaultWriteQueueOpts(opts?.writeQueue),\n storeEnDe: {\n encodeFile,\n decodeFile,\n ...opts?.storeEnDe,\n },\n });\n db.onClosed(() => {\n ledgers.unget(key);\n });\n return db;\n }),\n );\n}\n\nexport class LedgerShell implements Ledger {\n readonly ref: LedgerImpl;\n readonly writeQueue: WriteQueue<DocUpdate<DocTypes>>;\n readonly name: string;\n\n constructor(ref: LedgerImpl) {\n this.ref = ref;\n this.writeQueue = ref.writeQueue;\n this.name = ref.name;\n ref.addShell(this);\n }\n\n attach(a: Attachable): Promise<Attached> {\n return this.ref.attach(a);\n }\n\n get opts(): LedgerOpts {\n return this.ref.opts;\n }\n\n get context(): Context {\n return this.ref.context;\n }\n\n get id(): string {\n return this.ref.id;\n }\n get logger(): Logger {\n return this.ref.logger;\n }\n get sthis(): SuperThis {\n return this.ref.sthis;\n }\n get crdt(): CRDT {\n return this.ref.crdt;\n }\n\n onClosed(fn: () => void): () => void {\n return this.ref.onClosed(fn);\n }\n close(): Promise<void> {\n return this.ref.shellClose(this);\n }\n destroy(): Promise<void> {\n return this.ref.destroy();\n }\n ready(): Promise<void> {\n return this.ref.ready();\n }\n\n // asDB(): Database {\n // return this.ref.asDB();\n // }\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void {\n return this.ref.subscribe(listener, updates);\n }\n}\n\nclass LedgerImpl implements Ledger {\n // readonly name: string;\n readonly opts: LedgerOpts;\n\n _listening = false;\n readonly _listeners = new Set<ListenerFn<DocTypes>>();\n readonly _noupdate_listeners = new Set<ListenerFn<DocTypes>>();\n readonly crdt: CRDT;\n readonly writeQueue: WriteQueue<DocUpdate<DocTypes>>;\n // readonly blockstore: BaseBlockstore;\n\n readonly shells: Set<LedgerShell> = new Set<LedgerShell>();\n\n readonly context = new Context();\n\n get name(): string {\n return this.opts.name;\n // this.opts.storeUrls.data.data.getParam(PARAM.NAME) ?? \"default\";\n }\n\n addShell(shell: LedgerShell) {\n this.shells.add(shell);\n }\n\n readonly _onClosedFns = new Map<string, () => void>();\n onClosed(fn: () => void): () => void {\n const id = this.sthis.nextId().str;\n this._onClosedFns.set(id, fn);\n return () => {\n this._onClosedFns.delete(id);\n };\n }\n async close() {\n throw this.logger.Error().Str(\"db\", this.name).Msg(`use shellClose`).AsError();\n }\n async shellClose(db: LedgerShell) {\n if (!this.shells.has(db)) {\n throw this.logger.Error().Str(\"db\", this.name).Msg(`LedgerShell mismatch`).AsError();\n }\n this.shells.delete(db);\n if (this.shells.size === 0) {\n await this.ready();\n await this.crdt.close();\n await this.writeQueue.close();\n this._onClosedFns.forEach((fn) => fn());\n }\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: ResolveOnce<void> = new ResolveOnce<void>();\n async ready(): Promise<void> {\n const ret = await this._ready.once(async () => {\n await this.sthis.start();\n await this.crdt.ready();\n // await this.blockstore.ready();\n });\n return ret;\n }\n\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly id: string;\n\n constructor(sthis: SuperThis, opts: LedgerOpts) {\n this.opts = opts; // || this.opts;\n // this.name = opts.storeUrls.data.data.getParam(PARAM.NAME) || \"default\";\n this.sthis = sthis;\n this.id = sthis.timeOrderedNextId().str;\n this.logger = ensureLogger(this.sthis, \"Ledger\");\n this.crdt = new CRDTImpl(this.sthis, this.opts);\n this.writeQueue = writeQueue(\n this.sthis,\n async (updates: DocUpdate<DocTypes>[]) => this.crdt.bulk(updates),\n this.opts.writeQueue,\n );\n this.crdt.clock.onTock(() => this._no_update_notify());\n }\n\n async attach(a: Attachable): Promise<Attached> {\n await this.ready();\n return this.crdt.blockstore.loader.attach(a);\n }\n\n // readonly _asDb = new ResolveOnce<Database>();\n // asDB(): Database {\n // return this._asDb.once(() => new DatabaseImpl(this));\n // }\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void {\n this.ready();\n this.logger.Debug().Bool(\"updates\", updates).Msg(\"subscribe\");\n if (updates) {\n if (!this._listening) {\n this._listening = true;\n this.crdt.clock.onTick((updates: DocUpdate<NonNullable<unknown>>[]) => {\n void this._notify(updates);\n });\n }\n this._listeners.add(listener as ListenerFn<NonNullable<unknown>>);\n return () => {\n this._listeners.delete(listener as ListenerFn<NonNullable<unknown>>);\n };\n } else {\n this._noupdate_listeners.add(listener as ListenerFn<NonNullable<unknown>>);\n return () => {\n this._noupdate_listeners.delete(listener as ListenerFn<NonNullable<unknown>>);\n };\n }\n }\n\n private async _notify(updates: DocUpdate<DocTypes>[]) {\n await this.ready();\n if (this._listeners.size) {\n const docs: DocWithId<DocTypes>[] = updates.map(({ id, value }) => ({ ...value, _id: id }));\n for (const listener of this._listeners) {\n await (async () => await listener(docs as DocWithId<DocTypes>[]))().catch((e: Error) => {\n this.logger.Error().Err(e).Msg(\"subscriber error\");\n });\n }\n }\n }\n\n private 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\nexport function toStoreURIRuntime(sthis: SuperThis, name: string, sopts?: StoreUrlsOpts): StoreURIRuntime {\n sopts = sopts || {};\n if (!sopts.base) {\n const fp_env = sthis.env.get(\"FP_STORAGE_URL\");\n if (fp_env) {\n sopts = { ...sopts, base: BuildURI.from(fp_env).setParam(PARAM.URL_GEN, \"fromEnv\") };\n } else {\n sopts = { ...sopts, base: getDefaultURI(sthis).build().setParam(PARAM.URL_GEN, \"default\") };\n }\n }\n const base = URI.from(sopts.base);\n // bbase.setParam(PARAM.NAME, name);\n // const base = bbase.URI();\n // readonly public?: boolean;\n // readonly meta?: DbMeta;\n // readonly persistIndexes?: boolean;\n // readonly autoCompact?: number;\n // readonly threshold?: number;\n return {\n idx: {\n car: ensureURIDefaults(sthis, name, sopts.idx?.car ?? sopts.data?.car, base, \"car\", { idx: true }),\n file: ensureURIDefaults(sthis, name, sopts.idx?.file ?? sopts.idx?.car ?? sopts.data?.file ?? sopts.data?.car, base, \"file\", {\n file: true,\n idx: true,\n }),\n meta: ensureURIDefaults(sthis, name, sopts.idx?.meta ?? sopts.data?.meta, base, \"meta\", { idx: true }),\n wal: ensureURIDefaults(sthis, name, sopts.idx?.wal ?? sopts.data?.wal, base, \"wal\", { idx: true }),\n },\n data: {\n car: ensureURIDefaults(sthis, name, sopts.data?.car, base, \"car\"),\n file: ensureURIDefaults(sthis, name, sopts.data?.file ?? sopts.data?.car, base, \"file\", { file: true }),\n meta: ensureURIDefaults(sthis, name, sopts.data?.meta, base, \"meta\"),\n wal: ensureURIDefaults(sthis, name, sopts.data?.wal, base, \"wal\"),\n },\n };\n}\n\nexport function fireproof(name: string, opts?: ConfigOpts): Database {\n return new DatabaseImpl(LedgerFactory(name, opts));\n}\n","import {\n Logger,\n LoggerImpl,\n IsLogger,\n Result,\n ResolveOnce,\n isURL,\n URI,\n envFactory,\n Env,\n toCryptoRuntime,\n CryptoRuntime,\n JSONFormatter,\n YAMLFormatter,\n CoerceURI,\n} from \"@adviser/cement\";\nimport { PARAM, PathOps, StoreType, SuperThis, SuperThisOpts, TextEndeCoder, PromiseToUInt8, ToUInt8 } from \"./types.js\";\nimport { base58btc } from \"multiformats/bases/base58\";\n\n//export type { Logger };\n//export { Result };\n\nconst _globalLogger = new ResolveOnce();\nfunction globalLogger(): Logger {\n return _globalLogger.once(() => new LoggerImpl());\n}\n\nconst registerFP_DEBUG = new ResolveOnce();\n\ninterface superThisOpts {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly crypto: CryptoRuntime;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n}\n\nclass SuperThisImpl implements SuperThis {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n readonly crypto: CryptoRuntime;\n\n constructor(opts: superThisOpts) {\n this.logger = opts.logger;\n this.env = opts.env;\n this.crypto = opts.crypto;\n this.pathOps = opts.pathOps;\n this.txt = opts.txt;\n this.ctx = { ...opts.ctx };\n // console.log(\"superThis\", this);\n }\n\n nextId(bytes = 6): { str: string; bin: Uint8Array } {\n const bin = this.crypto.randomBytes(bytes);\n return {\n str: base58btc.encode(bin),\n bin,\n };\n }\n\n timeOrderedNextId(now?: number): { str: string } {\n now = typeof now === \"number\" ? now : new Date().getTime();\n // 49th bit\n const t = (0x1000000000000 + now).toString(16).replace(/^1/, \"\");\n const bin = this.crypto.randomBytes(10);\n bin[1] = (bin[1] & 0xf0) | (bin[1] | 0x08 && 0x0b);\n const hex = Array.from(bin)\n .map((i) => i.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return {\n str: `${t.slice(0, 8)}-${t.slice(8)}-7${hex.slice(0, 3)}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`,\n };\n }\n\n start(): Promise<void> {\n return Promise.resolve();\n }\n\n clone(override: Partial<SuperThisOpts>): SuperThis {\n return new SuperThisImpl({\n logger: override.logger || this.logger,\n env: envFactory(override.env) || this.env,\n crypto: override.crypto || this.crypto,\n pathOps: override.pathOps || this.pathOps,\n txt: override.txt || this.txt,\n ctx: { ...this.ctx, ...override.ctx },\n });\n }\n}\n\n// const pathOps =\nfunction presetEnv(ipreset?: Map<string, string> | Record<string, string>): Map<string, string> {\n let preset: Record<string, string> = {};\n if (ipreset instanceof Map) {\n preset = Object.fromEntries<string>(ipreset.entries());\n } else if (typeof ipreset === \"object\" && ipreset !== null) {\n preset = ipreset;\n }\n const penv = new Map([\n // [\"FP_DEBUG\", \"xxx\"],\n // [\"FP_ENV\", \"development\"],\n ...Array.from(\n Object.entries({\n ...setPresetEnv({}),\n ...preset,\n }),\n ), // .map(([k, v]) => [k, v as string])\n ]);\n // console.log(\">>>>>>\", penv)\n return penv;\n}\n// const envImpl = envFactory({\n// symbol: \"FP_ENV\",\n// presetEnv: presetEnv(),\n// });\nclass pathOpsImpl implements PathOps {\n join(...paths: string[]): string {\n return paths.map((i) => i.replace(/\\/+$/, \"\")).join(\"/\");\n }\n dirname(path: string) {\n return path.split(\"/\").slice(0, -1).join(\"/\");\n }\n basename(path: string): string {\n return path.split(\"/\").pop() || \"\";\n }\n // homedir() {\n // throw new Error(\"SysContainer:homedir is not available in seeded state\");\n // }\n}\nconst pathOps = new pathOpsImpl();\nconst txtOps = ((txtEncoder, txtDecoder) => ({\n encode: (input: string) => txtEncoder.encode(input),\n decode: (input: ToUInt8) => txtDecoder.decode(coerceIntoUint8(input).Ok()),\n // eslint-disable-next-line no-restricted-globals\n}))(new TextEncoder(), new TextDecoder());\n\nconst _onSuperThis = new Map<string, (sthis: SuperThis) => void>();\nexport function onSuperThis(fn: (sthis: SuperThis) => void): () => void {\n const key = `onSuperThis-${Math.random().toString(36).slice(2)}`;\n _onSuperThis.set(key, fn);\n return () => {\n _onSuperThis.delete(key);\n };\n}\n\nexport function ensureSuperThis(osthis?: Partial<SuperThisOpts>): SuperThis {\n const env = envFactory({\n symbol: osthis?.env?.symbol || \"FP_ENV\",\n presetEnv: presetEnv(osthis?.env?.presetEnv),\n });\n const ret = new SuperThisImpl({\n logger: osthis?.logger || globalLogger(),\n env,\n crypto: osthis?.crypto || toCryptoRuntime(),\n ctx: osthis?.ctx || {},\n pathOps,\n txt: osthis?.txt || txtOps,\n });\n _onSuperThis.forEach((fn) => fn(ret));\n return ret;\n}\n\n// // eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function ensureSuperLog(sthis: SuperThis, componentName: string, ctx?: Record<string, unknown>): SuperThis {\n return sthis.clone({\n logger: ensureLogger(sthis, componentName, ctx),\n });\n}\n\nexport function ensureLogger(\n sthis: SuperThis /* 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: Logger;\n if (sthis && IsLogger(sthis.logger)) {\n logger = sthis.logger;\n } else {\n logger = globalLogger();\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n let exposeStack = false;\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 (\"exposeStack\" in ctx) {\n exposeStack = true;\n delete ctx.exposeStack;\n }\n if (\"exposeStack\" in ctx) {\n exposeStack = true;\n delete ctx.exposeStack;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", sthis.nextId(4).str);\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 (isURL(value)) {\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 sthis.env.onSet(\n (key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n switch (key) {\n case \"FP_FORMAT\": {\n switch (value) {\n case \"jsonice\":\n logger.SetFormatter(new JSONFormatter(logger.TxtEnDe(), 2));\n break;\n case \"yaml\":\n logger.SetFormatter(new YAMLFormatter(logger.TxtEnDe(), 2));\n break;\n case \"json\":\n default:\n logger.SetFormatter(new JSONFormatter(logger.TxtEnDe()));\n break;\n }\n break;\n }\n case \"FP_DEBUG\":\n logger.SetDebug(value || []);\n break;\n case \"FP_STACK\":\n logger.SetExposeStack(!!value);\n break;\n }\n },\n \"FP_FORMAT\",\n \"FP_DEBUG\",\n \"FP_STACK\",\n );\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n if (exposeStack) {\n logger.SetExposeStack(true);\n }\n const out = cLogger.Logger();\n if (sthis.env.get(\"FP_CONSTRUCTOR_DEBUG\")) {\n out.Debug().Msg(\"constructor\");\n }\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport interface Store {\n readonly pathPart: \"data\" | \"wal\" | \"meta\";\n readonly fromUrl: StoreType;\n readonly name: string;\n}\n\nexport function getStore(url: URI, sthis: SuperThis, joiner: Joiner): Store {\n const fromUrl = url.getParam(PARAM.STORE) as StoreType;\n let pathPart: Store[\"pathPart\"];\n switch (fromUrl) {\n case \"car\":\n case \"file\":\n pathPart = \"data\";\n break;\n case \"wal\":\n case \"meta\":\n pathPart = fromUrl;\n break;\n default:\n throw sthis.logger.Error().Url(url).Msg(`store not found`).AsError();\n }\n let name: string = pathPart;\n if (url.hasParam(\"index\")) {\n name = joiner(url.getParam(PARAM.INDEX) || \"idx\", name);\n }\n return { pathPart, fromUrl, name };\n}\n\nexport function getKey(url: URI, logger: Logger): string {\n const result = url.getParam(PARAM.KEY);\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(sthis: SuperThis, url: URI): string {\n let result = url.getParam(PARAM.NAME);\n if (!result) {\n result = sthis.pathOps.dirname(url.pathname);\n if (result.length === 0) {\n throw sthis.logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\n// export 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\n// // the big side effect party --- hate it\n// export function sanitizeURL(url: URL) {\n// url.searchParams.sort();\n// // const searchParams = Object.entries(url.searchParams).sort(([a], [b]) => a.localeCompare(b));\n// // console.log(\"searchParams\", searchParams);\n// // for (const [key] of searchParams) {\n// // url.searchParams.delete(key);\n// // }\n// // for (const [key, value] of searchParams) {\n// // url.searchParams.set(key, value);\n// // }\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 function UInt8ArrayEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nexport function inplaceFilter<T>(i: T[], pred: (i: T, idx: number) => boolean): T[] {\n const founds: number[] = [];\n for (let j = 0; j < i.length; j++) {\n if (!pred(i[j], j)) {\n founds.push(j);\n }\n }\n for (let j = founds.length - 1; j >= 0; j--) {\n i.splice(founds[j], 1);\n }\n return i;\n}\n\nexport function 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 coerceIntoUint8(raw: ToUInt8): Result<Uint8Array> {\n if (raw instanceof Uint8Array) {\n return Result.Ok(raw);\n }\n if (Result.Is(raw)) {\n return raw;\n }\n return Result.Err(\"Not a Uint8Array\");\n}\n\nexport async function coercePromiseIntoUint8(raw: PromiseToUInt8): Promise<Result<Uint8Array>> {\n if (raw instanceof Uint8Array) {\n return Result.Ok(raw);\n }\n if (Result.Is(raw)) {\n return raw;\n }\n if (typeof raw.then === \"function\") {\n try {\n return coercePromiseIntoUint8(await raw);\n } catch (e) {\n return Result.Err(e as Error);\n }\n }\n return Result.Err(\"Not a Uint8Array\");\n}\n\nexport function makeName(fnString: string) {\n const regex = /\\(([^,()]+,\\s*[^,()]+|\\[[^\\]]+\\],\\s*[^,()]+)\\)/g;\n let found: RegExpExecArray | null = null;\n const matches = Array.from(fnString.matchAll(regex), (match) => match[1].trim());\n if (matches.length === 0) {\n found = /=>\\s*{?\\s*([^{}]+)\\s*}?/.exec(fnString);\n if (found && found[1].includes(\"return\")) {\n found = null;\n }\n }\n if (!found) {\n return fnString;\n } else {\n // it's a consise arrow function, match everything after the arrow\n return found[1];\n }\n}\n\nexport function storeType2DataMetaWal(store: StoreType) {\n switch (store) {\n case \"car\":\n case \"file\":\n return \"data\";\n case \"meta\":\n case \"wal\":\n return store;\n default:\n throw new Error(`unknown store ${store}`);\n }\n}\n\nexport function ensureURIDefaults(\n sthis: SuperThis,\n name: string,\n curi: CoerceURI | undefined,\n uri: URI,\n store: StoreType,\n ctx?: Partial<{\n readonly idx: boolean;\n readonly file: boolean;\n }>,\n): URI {\n ctx = ctx || {};\n const ret = (curi ? URI.from(curi) : uri).build().setParam(PARAM.STORE, store).defParam(PARAM.NAME, name);\n if (!ret.hasParam(PARAM.NAME)) {\n // const name = sthis.pathOps.basename(ret.URI().pathname);\n // if (!name) {\n throw sthis.logger.Error().Url(ret).Any(\"ctx\", ctx).Msg(\"Ledger name is required\").AsError();\n // }\n // ret.setParam(PARAM.NAME, name);\n }\n if (ctx.idx) {\n ret.defParam(PARAM.INDEX, \"idx\");\n ret.defParam(PARAM.STORE_KEY, `@${ret.getParam(PARAM.NAME)}-${storeType2DataMetaWal(store)}-idx@`);\n } else {\n ret.defParam(PARAM.STORE_KEY, `@${ret.getParam(PARAM.NAME)}-${storeType2DataMetaWal(store)}@`);\n }\n if (store === \"car\") {\n ret.defParam(PARAM.SUFFIX, \".car\");\n }\n return ret.URI();\n}\n\nexport function setPresetEnv(o: Record<string, string>, symbol = \"FP_PRESET_ENV\") {\n const key = Symbol.for(symbol);\n const env = (globalThis as unknown as Record<symbol, Record<string, string>>)[key] ?? {};\n for (const [k, v] of Object.entries(o)) {\n env[k] = v;\n }\n return env;\n}\n","import type { EventLink } from \"@web3-storage/pail/clock/api\";\nimport type { Operation } from \"@web3-storage/pail/crdt/api\";\nimport type { Block, UnknownLink, Version } from \"multiformats\";\nimport type { EnvFactoryOpts, Env, Logger, CryptoRuntime, Result, CoerceURI } from \"@adviser/cement\";\n\nimport type {\n CarTransactionOpts,\n DbMeta,\n AnyLink,\n StoreUrlsOpts,\n StoreEnDeFile,\n SerdeGatewayInterceptor,\n Loadable,\n AnyBlock,\n TransactionMeta,\n TransactionWrapper,\n BlockstoreRuntime,\n StoreURIRuntime,\n DataAndMetaAndWalStore,\n UrlAndInterceptor,\n MetaStore,\n WALStore,\n BaseStore,\n FileStore,\n CarStore,\n} from \"./blockstore/index.js\";\n\n// import type { MakeDirectoryOptions, PathLike, Stats } from \"fs\";\nimport type { KeyBagOpts, KeyBagRuntime } from \"./runtime/key-bag.js\";\nimport type { WriteQueueParams } from \"./write-queue.js\";\nimport type { Index } from \"./indexer.js\";\nimport type { Context } from \"./context.js\";\n\nexport type { DbMeta };\n\nexport type Falsy = false | null | undefined;\n\nexport type Unreg = () => void;\n\nexport function isFalsy(value: unknown): value is Falsy {\n return value === false && value === null && value === undefined;\n}\n\nexport const PARAM = {\n SUFFIX: \"suffix\",\n URL_GEN: \"urlGen\", // \"urlGen\" | \"default\"\n STORE_KEY: \"storekey\",\n STORE: \"store\",\n KEY: \"key\",\n INDEX: \"index\",\n NAME: \"name\",\n VERSION: \"version\",\n RUNTIME: \"runtime\", // \"node\" | \"deno\" | \"browser\"\n FRAG_SIZE: \"fragSize\",\n IV_VERIFY: \"ivVerify\",\n IV_HASH: \"ivHash\",\n FRAG_FID: \"fid\",\n FRAG_OFS: \"ofs\",\n FRAG_LEN: \"len\",\n FRAG_HEAD: \"headerSize\",\n EXTRACTKEY: \"extractKey\",\n SELF_REFLECT: \"selfReflect\", // if no subscribe in Gateway see your own META updates\n CAR_PARALLEL: \"parallel\",\n CAR_CACHE_SIZE: \"carCacheSize\",\n CAR_COMPACT_CACHE_SIZE: \"carCompactCacheSize\",\n CAR_META_CACHE_SIZE: \"carMetaCacheSize\",\n GENESIS_CID: \"baembeiarootfireproofgenesisblockaaaafireproofgenesisblocka\",\n // FS = \"fs\",\n};\nexport type PARAMS = (typeof PARAM)[keyof typeof PARAM];\n\nexport function throwFalsy<T>(value: T | Falsy): T {\n if (isFalsy(value)) {\n throw new Error(\"value is Falsy\");\n }\n return value;\n}\n\nexport function falsyToUndef<T>(value: T | Falsy): T | undefined {\n if (isFalsy(value)) {\n return undefined;\n }\n return value;\n}\n\nexport type StoreType = \"car\" | \"file\" | \"wal\" | \"meta\";\nexport interface FPStats {\n isFile(): boolean;\n isDirectory(): boolean;\n isBlockDevice(): boolean;\n isCharacterDevice(): boolean;\n isSymbolicLink(): boolean;\n isFIFO(): boolean;\n isSocket(): boolean;\n uid: number | Falsy;\n gid: number | Falsy;\n size: number | Falsy;\n atime: Date | Falsy;\n mtime: Date | Falsy;\n ctime: Date | Falsy;\n birthtime: Date | Falsy;\n}\n\nexport interface SysFileSystem {\n start(): Promise<SysFileSystem>;\n mkdir(path: string, options?: { recursive: boolean }): Promise<string | undefined>;\n readdir(path: string /*, options?: unknown*/): Promise<string[]>;\n rm(path: string, options?: { recursive: boolean }): Promise<void>;\n copyFile(source: string, destination: string): Promise<void>;\n readfile(path: string /*, options?: { encoding: BufferEncoding; flag?: string }*/): Promise<Uint8Array>;\n stat(path: string): Promise<FPStats>;\n unlink(path: string): Promise<void>;\n writefile(path: string, data: Uint8Array | string): Promise<void>;\n}\n\nexport interface PathOps {\n join(...args: string[]): string;\n dirname(path: string): string;\n basename(path: string): string;\n}\n\nexport type ToUInt8 = Uint8Array | Result<Uint8Array>;\nexport type PromiseToUInt8 = ToUInt8 | Promise<Uint8Array> | Promise<Result<Uint8Array>>;\n\nexport interface TextEndeCoder {\n encode(input: string): Uint8Array;\n decode(input: ToUInt8): string;\n}\nexport interface SuperThisOpts {\n // readonly crypto?: CryptoRuntime;\n readonly logger: Logger;\n readonly pathOps: PathOps;\n readonly crypto: CryptoRuntime;\n readonly env: Partial<EnvFactoryOpts>;\n readonly txt: TextEndeCoder;\n readonly ctx: Record<string, unknown>;\n}\n\nexport interface SuperThis {\n readonly logger: Logger;\n readonly loggerCollector?: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n timeOrderedNextId(time?: number): { str: string; toString: () => string };\n nextId(bytes?: number): { str: string; bin: Uint8Array; toString: () => string };\n start(): Promise<void>;\n clone(override: Partial<SuperThisOpts>): SuperThis;\n}\n\nexport interface ConfigOpts extends Partial<SuperThisOpts> {\n readonly public?: boolean;\n readonly meta?: DbMeta;\n // readonly persistIndexes?: boolean;\n readonly writeQueue?: Partial<WriteQueueParams>;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n readonly autoCompact?: number;\n readonly storeUrls?: StoreUrlsOpts;\n readonly storeEnDe?: StoreEnDeFile;\n readonly threshold?: number;\n readonly keyBag?: Partial<KeyBagOpts>;\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 readonly lastModified?: number;\n url?: string;\n file?: () => Promise<File>;\n}\n\nexport interface DocUpdate<T extends DocTypes> {\n readonly id: string;\n readonly value?: DocSet<T>;\n readonly del?: boolean;\n readonly clock?: ClockLink; // would be useful to give ClockLinks a type\n}\n\n// todo merge into above\nexport interface DocValue<T extends DocTypes> {\n readonly doc: DocWithId<T>;\n readonly del: boolean;\n readonly cid: AnyLink;\n}\n\nexport type KeyLiteral = string | number | boolean;\nexport type IndexKeyType = KeyLiteral | KeyLiteral[];\nexport type IndexKey<K extends IndexKeyType> = [K, string];\n\nexport interface IndexUpdate<K extends IndexKeyType> {\n readonly key: IndexKey<K>;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\nexport interface IndexUpdateString {\n readonly key: string;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\n// export interface IndexRowObject<K extends IndexKeyType, T extends DocObject> {\n// readonly id: string;\n// readonly key: K;\n// readonly value: T\n// // readonly row: T // DocFragment;\n// // readonly doc?: DocWithId<T>;\n// // value?: T;\n// // readonly del?: boolean;\n// }\n\n// export interface IndexRowLiteral<K extends IndexKeyType, T extends DocLiteral> {\n// readonly id: string;\n// readonly key: IndexKey<K>;\n// readonly value: T\n// }\n\n// export type IndexRow<K extends IndexKeyType, T extends DocTypes> =\n// T extends DocLiteral ? IndexRowLiteral<K, T> : IndexRowObject<K, T>\n\nexport interface IndexRow<K extends IndexKeyType, T extends DocObject, R extends DocFragment> {\n readonly id: string;\n readonly key: K; // IndexKey<K>;\n readonly value: R;\n readonly doc?: DocWithId<T>;\n}\n\nexport interface IndexRows<K extends IndexKeyType, T extends DocObject, R extends DocFragment = T> {\n readonly rows: IndexRow<K, T, R>[];\n}\nexport interface CRDTMeta {\n readonly head: ClockHead;\n}\n\nexport interface IndexTransactionMeta {\n readonly indexes: Record<string, IdxMeta>;\n}\n\nexport interface FileTransactionMeta {\n readonly files?: AnyLink[];\n}\n\nexport type MetaType = CRDTMeta | IndexTransactionMeta | FileTransactionMeta;\n\nexport interface IdxMeta {\n readonly byId: AnyLink;\n readonly byKey: AnyLink;\n readonly map: string;\n readonly name: string;\n readonly head: ClockHead;\n}\n\nexport interface IdxMetaMap {\n readonly indexes?: Map<string, IdxMeta>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface QueryOpts<K extends IndexKeyType> {\n readonly descending?: boolean;\n readonly limit?: number;\n includeDocs?: boolean;\n readonly range?: [IndexKeyType, IndexKeyType];\n readonly key?: DocFragment;\n readonly keys?: DocFragment[];\n prefix?: IndexKeyType;\n}\n\nexport interface AllDocsQueryOpts extends QueryOpts<string> {\n readonly key?: string;\n readonly keys?: string[];\n prefix?: string;\n}\n\nexport interface AllDocsResponse<T extends DocTypes> {\n readonly rows: {\n readonly key: string;\n readonly value: DocWithId<T>;\n }[];\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\ntype EmitFn = (k: IndexKeyType, v?: DocFragment) => void;\nexport type MapFn<T extends DocTypes> = (doc: DocWithId<T>, emit: EmitFn) => DocFragment | unknown;\n\nexport interface ChangesOptions {\n readonly dirty?: boolean;\n readonly limit?: number;\n}\n\nexport interface ChangesResponseRow<T extends DocTypes> {\n readonly key: string;\n readonly value: DocWithId<T>;\n readonly clock?: ClockLink;\n}\n\nexport interface ChangesResponse<T extends DocTypes> {\n readonly clock: ClockHead;\n readonly rows: ChangesResponseRow<T>[];\n readonly name?: string;\n}\n\nexport interface DocResponse {\n readonly id: string;\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\nexport interface BulkResponse {\n readonly ids: string[];\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\nexport type UpdateListenerFn<T extends DocTypes> = (docs: DocWithId<T>[]) => Promise<void> | void;\nexport type NoUpdateListenerFn = () => Promise<void> | void;\nexport type ListenerFn<T extends DocTypes> = UpdateListenerFn<T> | NoUpdateListenerFn;\n\nexport interface CRDTEntry {\n readonly data: string;\n readonly parents: string[];\n readonly cid: string;\n}\n\nexport type VoidFn = () => void;\nexport type UnReg = () => void;\nexport interface CRDTClock {\n readonly head: ClockHead;\n onTock(fn: VoidFn): UnReg;\n onTick(fn: (updates: DocUpdate<DocTypes>[]) => void): UnReg;\n applyHead(newHead: ClockHead, prevHead: ClockHead, updates?: DocUpdate<DocTypes>[]): Promise<void>;\n onZoom(fn: VoidFn): UnReg;\n close(): Promise<void>;\n ready(): Promise<void>;\n}\n\nexport interface CarTransaction {\n readonly parent: BaseBlockstore;\n get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined>;\n\n superGet(cid: AnyLink): Promise<AnyBlock | undefined>;\n\n // needed for genesis block\n unshift(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): void;\n putSync(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): void;\n\n put(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): Promise<void>;\n\n entries(): AsyncIterableIterator<AnyBlock>;\n}\n\nexport interface BaseBlockstore {\n readonly transactions: Set<CarTransaction>;\n readonly sthis: SuperThis;\n readonly loader: Loadable;\n readonly ebOpts: BlockstoreRuntime;\n ready(): Promise<void>;\n close(): Promise<void>;\n destroy(): Promise<void>;\n compact(): Promise<void>;\n readonly logger: Logger;\n\n get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined>;\n put(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): Promise<void>;\n\n transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n _opts?: CarTransactionOpts,\n ): Promise<TransactionWrapper<M>>;\n\n // get<T, C extends number, A extends number, V extends Version>(cid: AnyAnyLink): Promise<Block<T, C, A, V> | undefined>\n // transaction<M extends TransactionMeta>(\n // fn: (t: CarTransaction) => Promise<M>,\n // _opts?: CarTransactionOpts,\n // ): Promise<TransactionWrapper<M>>\n\n openTransaction(opts: CarTransactionOpts /* = { add: true, noLoader: false }*/): CarTransaction;\n\n commitTransaction<M extends TransactionMeta>(\n t: CarTransaction,\n done: M,\n opts: CarTransactionOpts,\n ): Promise<TransactionWrapper<M>>;\n entries(): AsyncIterableIterator<AnyBlock>;\n}\n\nexport interface CRDT extends ReadyCloseDestroy, HasLogger, HasSuperThis, HasCRDT {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n // self reference to fullfill HasCRDT\n readonly crdt: CRDT;\n readonly clock: CRDTClock;\n\n readonly blockstore: BaseBlockstore;\n readonly indexBlockstore: BaseBlockstore;\n readonly indexers: Map<string, Index<IndexKeyType, DocTypes>>;\n\n bulk<T extends DocTypes>(updates: DocUpdate<T>[]): Promise<CRDTMeta>;\n ready(): Promise<void>;\n close(): Promise<void>;\n destroy(): Promise<void>;\n allDocs<T extends DocTypes>(): Promise<{ result: DocUpdate<T>[]; head: ClockHead }>;\n vis(): Promise<string>;\n getBlock(cidString: string): Promise<Block>;\n get(key: string): Promise<DocValue<DocTypes> | Falsy>;\n // defaults by impl\n changes<T extends DocTypes>(\n since?: ClockHead,\n opts?: ChangesOptions,\n ): Promise<{\n result: DocUpdate<T>[];\n head: ClockHead;\n }>;\n compact(): Promise<void>;\n}\n\nexport interface HasCRDT {\n readonly crdt: CRDT;\n}\n\nexport interface RefLedger {\n readonly ledger: Ledger;\n}\n\nexport interface HasLogger {\n readonly logger: Logger;\n}\n\nexport interface HasSuperThis {\n readonly sthis: SuperThis;\n}\n\nexport interface ReadyCloseDestroy {\n close(): Promise<void>;\n destroy(): Promise<void>;\n ready(): Promise<void>;\n}\n\nexport interface CoerceURIandInterceptor {\n readonly url: CoerceURI;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n}\n\n/**\n * @description used by an attachable do define the urls of the attached gateways\n */\nexport interface GatewayUrlsParam {\n readonly car: CoerceURIandInterceptor;\n readonly file: CoerceURIandInterceptor;\n readonly meta: CoerceURIandInterceptor;\n // if set this is a local Attachment\n readonly wal?: CoerceURIandInterceptor;\n}\n\nexport interface GatewayUrls {\n readonly car: UrlAndInterceptor;\n readonly file: UrlAndInterceptor;\n readonly meta: UrlAndInterceptor;\n readonly wal?: UrlAndInterceptor;\n}\n\nexport interface Attachable {\n readonly name: string;\n /**\n * @description prepare allows the Attable to register the gateways and\n * then return the urls of the gateways\n */\n prepare(): Promise<GatewayUrlsParam>;\n}\n\nexport class DataAndMetaAndWalAndBaseStore implements DataAndMetaAndWalStore {\n readonly wal?: WALStore | undefined;\n readonly file: FileStore;\n readonly car: CarStore;\n readonly meta: MetaStore;\n readonly baseStores: BaseStore[];\n\n constructor(dam: DataAndMetaAndWalStore) {\n this.wal = dam.wal;\n this.file = dam.file;\n this.car = dam.car;\n this.meta = dam.meta;\n this.baseStores = [this.file, this.car, this.meta];\n if (this.wal) {\n this.baseStores.push(this.wal);\n }\n }\n}\n\nexport interface Attached {\n readonly gatewayUrls: GatewayUrls;\n\n readonly stores: DataAndMetaAndWalAndBaseStore;\n\n detach(): Promise<void>;\n status(): \"attached\" | \"loading\" | \"loaded\" | \"error\" | \"detached\" | \"syncing\" | \"idle\";\n}\n\nexport interface Database extends ReadyCloseDestroy, HasLogger, HasSuperThis {\n // readonly name: string;\n readonly ledger: Ledger;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly id: string;\n readonly name: string;\n\n onClosed(fn: () => void): void;\n\n attach(a: Attachable): Promise<Attached>;\n\n get<T extends DocTypes>(id: string): Promise<DocWithId<T>>;\n put<T extends DocTypes>(doc: DocSet<T>): Promise<DocResponse>;\n bulk<T extends DocTypes>(docs: DocSet<T>[]): Promise<BulkResponse>;\n del(id: string): Promise<DocResponse>;\n remove(id: string): Promise<DocResponse>;\n changes<T extends DocTypes>(since?: ClockHead, opts?: ChangesOptions): Promise<ChangesResponse<T>>;\n allDocs<T extends DocTypes>(opts?: AllDocsQueryOpts): Promise<AllDocsResponse<T>>;\n allDocuments<T extends DocTypes>(): Promise<{\n rows: {\n key: string;\n value: DocWithId<T>;\n }[];\n clock: ClockHead;\n }>;\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void;\n\n 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 compact(): Promise<void>;\n}\n\nexport interface WriteQueue<T extends DocUpdate<S>, S extends DocTypes = DocTypes> {\n push(task: T): Promise<MetaType>;\n bulk(tasks: T[]): Promise<MetaType>;\n close(): Promise<void>;\n}\n\nexport interface LedgerOpts {\n readonly name: string;\n // readonly public?: boolean;\n readonly meta?: DbMeta;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n\n readonly writeQueue: WriteQueueParams;\n // readonly factoryUnreg?: () => void;\n // readonly persistIndexes?: boolean;\n // readonly autoCompact?: number;\n readonly storeUrls: StoreURIRuntime;\n readonly storeEnDe: StoreEnDeFile;\n readonly keyBag: KeyBagRuntime;\n // readonly threshold?: number;\n}\n\nexport interface Ledger extends HasCRDT {\n readonly opts: LedgerOpts;\n // readonly name: string;\n readonly writeQueue: WriteQueue<DocUpdate<DocTypes>>;\n\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly id: string;\n\n readonly name: string;\n\n readonly context: Context;\n\n onClosed(fn: () => void): () => void;\n\n attach(a: Attachable): Promise<Attached>;\n\n close(): Promise<void>;\n destroy(): Promise<void>;\n ready(): Promise<void>;\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void;\n\n // asDB(): Database;\n\n // get<T extends DocTypes>(id: string): Promise<DocWithId<T>>;\n // put<T extends DocTypes>(doc: DocSet<T>): Promise<DocResponse>;\n // bulk<T extends DocTypes>(docs: DocSet<T>[]): Promise<BulkResponse>;\n // del(id: string): Promise<DocResponse>;\n // changes<T extends DocTypes>(since?: ClockHead, opts?: ChangesOptions): Promise<ChangesResponse<T>>;\n // allDocs<T extends DocTypes>(opts?: AllDocsQueryOpts): Promise<AllDocsResponse<T>>;\n // allDocuments<T extends DocTypes>(): Promise<{\n // rows: {\n // key: string;\n // value: DocWithId<T>;\n // }[];\n // clock: ClockHead;\n // }>;\n // subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void;\n\n // 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 // compact(): Promise<void>;\n}\n","import { ensureLogger } from \"./utils.js\";\nimport { DocTypes, MetaType, DocUpdate, SuperThis, WriteQueue } from \"./types.js\";\nimport { Future, Logger } from \"@adviser/cement\";\n\ntype WorkerFunction<T extends DocTypes> = (tasks: DocUpdate<T>[]) => Promise<MetaType>;\n\ninterface WriteQueueItem<T extends DocTypes> {\n // readonly task?: DocUpdate<T>;\n readonly tasks?: DocUpdate<T>[];\n resolve(result: MetaType): void;\n reject(error: Error): void;\n}\n\nexport interface WriteQueueParams {\n // default 32\n // if chunkSize is 1 the result will be ordered in time\n readonly chunkSize: number;\n}\n\nexport function defaultWriteQueueOpts(opts: Partial<WriteQueueParams> = {}): WriteQueueParams {\n return {\n ...opts,\n chunkSize: opts.chunkSize && opts.chunkSize > 0 ? opts.chunkSize : 32,\n };\n}\n\nclass WriteQueueImpl<T extends DocUpdate<S>, S extends DocTypes = DocTypes> implements WriteQueue<T> {\n private readonly opts: WriteQueueParams;\n\n private readonly queue: WriteQueueItem<S>[] = [];\n private readonly worker: WorkerFunction<S>;\n private isProcessing = false;\n private readonly logger: Logger;\n\n constructor(sthis: SuperThis, worker: WorkerFunction<S>, opts: WriteQueueParams) {\n this.logger = ensureLogger(sthis, \"WriteQueueImpl\");\n this.worker = worker;\n this.opts = defaultWriteQueueOpts(opts);\n }\n\n private waitForEmptyQueue?: Future<void>;\n private testEmptyQueue() {\n if (this.waitForEmptyQueue && this.queue.length === 0) {\n this.waitForEmptyQueue.resolve();\n }\n }\n\n private async process() {\n if (this.isProcessing || this.queue.length === 0) {\n this.testEmptyQueue();\n return;\n }\n this.isProcessing = true;\n try {\n this.logger.Debug().Any(\"opts\", this.opts).Len(this.queue).Msg(\"Processing tasks\");\n const tasksToProcess = this.queue.splice(0, this.opts.chunkSize);\n const updates = tasksToProcess.map((item) => item.tasks).filter((item) => item) as DocUpdate<S>[][];\n const promises = updates.map(async (update, index) => {\n try {\n const result = await this.worker(update);\n tasksToProcess[index].resolve(result);\n } catch (error) {\n tasksToProcess[index].reject(this.logger.Error().Err(error).Msg(\"Error processing task\").AsError());\n }\n });\n await Promise.allSettled(promises);\n this.logger.Debug().Any(\"opts\", this.opts).Len(this.queue).Msg(\"Processed tasks\");\n } catch (error) {\n this.logger.Error().Err(error).Msg(\"Error processing tasks\");\n } finally {\n this.isProcessing = false;\n setTimeout(() => this.process(), 0);\n }\n }\n\n bulk(tasks: DocUpdate<S>[]): Promise<MetaType> {\n return new Promise<MetaType>((resolve, reject) => {\n this.queue.push({ tasks, resolve, reject });\n this.process();\n });\n }\n push(task: DocUpdate<S>): Promise<MetaType> {\n return this.bulk([task]);\n }\n close(): Promise<void> {\n this.waitForEmptyQueue = new Future();\n this.testEmptyQueue();\n return this.waitForEmptyQueue.asPromise();\n }\n}\n\nexport function writeQueue<T extends DocUpdate<S>, S extends DocTypes = DocTypes>(\n sthis: SuperThis,\n worker: WorkerFunction<S>,\n opts: WriteQueueParams,\n): WriteQueue<T, S> {\n return new WriteQueueImpl<T, S>(sthis, worker, opts);\n}\n","import * as raw from \"multiformats/codecs/raw\";\nimport { DocFileMeta } from \"../types.js\";\nimport { AnyLink, AnyBlock } from \"../blockstore/index.js\";\nimport { CID } from \"multiformats/cid\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport { exception2Result, Result, top_uint8 } from \"@adviser/cement\";\n\n/**\n * Encode a file into a single block with a CID\n */\nexport async function encodeFile(blob: Blob): Promise<{ cid: AnyLink; blocks: AnyBlock[] }> {\n // Convert blob to Uint8Array\n const data = await top_uint8(blob);\n\n // Encode with raw codec\n const bytes = raw.encode(data);\n\n // Create CID\n const hash = await hasher.digest(bytes);\n const cid = CID.create(1, raw.code, hash);\n\n // Return single block with CID\n const block = { cid, bytes };\n\n return { cid, blocks: [block] };\n}\n\nexport interface BlockGetter {\n get(cid: AnyLink): Promise<Uint8Array>;\n}\n\nfunction isHasBlockAGet(obj: unknown): obj is BlockGetter {\n return typeof (obj as BlockGetter).get === \"function\";\n}\n\n/**\n * Decode a file from its blocks and CID\n * Returns a Result containing either the File or an Error\n */\nexport async function decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<Result<File>> {\n // The blocks parameter is expected to be a storage interface with a get method\n if (!isHasBlockAGet(blocks)) {\n return Result.Err(new Error(\"Invalid block storage\"));\n }\n return exception2Result(async () => {\n // Get block data\n const bytes = await blocks.get(cid);\n\n // Decode data\n const data = raw.decode(bytes);\n\n // Create File object with the original file metadata\n return new File([data], \"file\", {\n type: meta.type,\n lastModified: meta.lastModified || 0,\n });\n });\n}\n","import {\n CoerceURI,\n CryptoRuntime,\n CTCryptoKey,\n KeyedResolvOnce,\n Logger,\n ResolveOnce,\n ResolveSeq,\n Result,\n runtimeFn,\n toCryptoRuntime,\n URI,\n} from \"@adviser/cement\";\nimport { KeyMaterial, KeysByFingerprint, KeyUpsertResult, KeyWithFingerPrint } from \"../blockstore/types.js\";\nimport { ensureLogger } from \"../utils.js\";\nimport { base58btc } from \"multiformats/bases/base58\";\nimport { PARAM, SuperThis } from \"../types.js\";\nimport { KeyBagProviderFile } from \"./gateways/file/key-bag-file.js\";\nimport { KeyBagProviderMemory } from \"./key-bag-memory.js\";\n\nclass keyWithFingerPrint implements KeyWithFingerPrint {\n readonly default: boolean;\n readonly fingerPrint: string;\n readonly key: CTCryptoKey;\n\n private kfp: KeyWithFingerPrint;\n\n #material: string;\n\n constructor(kfp: KeyWithFingerPrint, material: string | Uint8Array, def: boolean) {\n this.kfp = kfp;\n this.key = kfp.key;\n this.fingerPrint = kfp.fingerPrint;\n this.default = def;\n if (material instanceof Uint8Array) {\n this.#material = base58btc.encode(material);\n } else if (typeof material === \"string\") {\n this.#material = material;\n } else {\n throw new Error(\"material must be string or Uint8Array\");\n }\n }\n\n extract(): Promise<KeyMaterial> {\n return this.kfp.extract();\n }\n\n async asV2StorageKeyItem(): Promise<V2StorageKeyItem> {\n return {\n default: this.default,\n fingerPrint: this.fingerPrint,\n key: this.#material,\n };\n }\n}\n\nexport async function toKeyWithFingerPrint(\n keybag: KeyBag,\n materialStrOrUint8: string | Uint8Array,\n): Promise<Result<KeyWithFingerPrint>> {\n let material: Uint8Array;\n if (typeof materialStrOrUint8 === \"string\") {\n material = base58btc.decode(materialStrOrUint8);\n } else {\n material = materialStrOrUint8;\n }\n const key = await keybag.subtleKey(material);\n const fpr = await keybag.rt.crypto.digestSHA256(material);\n return Result.Ok({\n key,\n fingerPrint: base58btc.encode(new Uint8Array(fpr)),\n extract: async () => {\n if (key.extractable) {\n return {\n key: material,\n keyStr: base58btc.encode(material),\n };\n }\n throw new Error(\"Key is not extractable\");\n },\n });\n}\n\nexport class keysByFingerprint implements KeysByFingerprint {\n readonly keys: Record<string, keyWithFingerPrint> = {};\n readonly keybag: KeyBag;\n readonly name: string;\n readonly id: string;\n\n static async from(keyBag: KeyBag, named: KeysItem): Promise<KeysByFingerprint> {\n const kbf = new keysByFingerprint(keyBag, named.name);\n // reverse to keep the first key as default\n for (const i of Object.entries(named.keys).reverse()) {\n const result = await kbf.upsert(i[1].key, i[1].default, false);\n if (result.isErr()) {\n throw result;\n }\n if (result.Ok().modified) {\n throw keyBag.logger.Error().Msg(\"KeyBag: keysByFingerprint: mismatch unexpected\").AsError();\n }\n if (result.Ok().kfp.fingerPrint !== i[1].fingerPrint) {\n throw keyBag.logger\n .Error()\n .Any(\"fprs\", {\n fromStorage: i[1].fingerPrint,\n calculated: result.Ok().kfp.fingerPrint,\n })\n .Msg(\"KeyBag: keysByFingerprint: mismatch\")\n .AsError();\n }\n }\n return kbf;\n }\n\n constructor(keyBag: KeyBag, name: string) {\n this.keybag = keyBag;\n this.name = name;\n this.id = keyBag.rt.sthis.nextId(4).str;\n }\n\n async get(fingerPrint?: Uint8Array | string): Promise<KeyWithFingerPrint | undefined> {\n if (fingerPrint instanceof Uint8Array) {\n fingerPrint = base58btc.encode(fingerPrint);\n } else {\n fingerPrint = fingerPrint || \"*\";\n }\n const found = this.keys[fingerPrint];\n if (found) {\n return found;\n }\n throw this.keybag.logger\n .Error()\n .Str(\"fpr\", fingerPrint)\n .Any(\"fprs\", Object.keys(this.keys))\n .Msg(\"keysByFingerprint: not found\")\n .AsError();\n }\n\n async upsert(materialStrOrUint8: string | Uint8Array, def?: boolean, keyBagAction = true): Promise<Result<KeyUpsertResult>> {\n def = !!def;\n const rKfp = await toKeyWithFingerPrint(this.keybag, materialStrOrUint8);\n if (rKfp.isErr()) {\n return Result.Err(rKfp);\n }\n const kfp = rKfp.Ok();\n let found = this.keys[kfp.fingerPrint];\n if (found) {\n if (found.default === def) {\n return Result.Ok({\n modified: false,\n kfp: found,\n });\n }\n } else {\n found = new keyWithFingerPrint(kfp, materialStrOrUint8, def);\n }\n if (def) {\n for (const i of Object.values(this.keys)) {\n (i as { default: boolean }).default = false;\n }\n }\n this.keys[kfp.fingerPrint] = found;\n if (def) {\n this.keys[\"*\"] = found;\n }\n if (keyBagAction) {\n this.keybag._upsertNamedKey(this);\n }\n return Result.Ok({\n modified: keyBagAction && true,\n kfp: found,\n });\n }\n\n async asKeysItem(): Promise<KeysItem> {\n const my = { ...this.keys };\n delete my[\"*\"];\n const kis = await Promise.all(Object.values(my).map((i) => i.asV2StorageKeyItem()));\n return {\n name: this.name,\n keys: kis.reduce(\n (acc, i) => {\n acc[i.fingerPrint] = i;\n return acc;\n },\n {} as Record<string, V2StorageKeyItem>,\n ),\n };\n }\n\n // async extract() {\n // const ext = new Uint8Array((await this.rt.crypto.exportKey(\"raw\", named.key)) as ArrayBuffer);\n // return {\n // key: ext,\n // keyStr: base58btc.encode(ext),\n // };\n // }\n}\n\nexport class KeyBag {\n readonly logger: Logger;\n readonly rt: KeyBagRuntime;\n\n constructor(rt: KeyBagRuntime) {\n this.rt = rt;\n this.logger = ensureLogger(rt.sthis, \"KeyBag\");\n }\n\n readonly _warnOnce: ResolveOnce<void> = new ResolveOnce<void>();\n async subtleKey(materialStrOrUint8: string | Uint8Array): Promise<CryptoKey> {\n const extractable = this.rt.url.getParam(PARAM.EXTRACTKEY) === \"_deprecated_internal_api\";\n if (extractable) {\n this._warnOnce.once(() =>\n this.logger.Warn().Msg(\"extractKey is enabled via _deprecated_internal_api --- handle keys safely!!!\"),\n );\n }\n let material: Uint8Array;\n if (typeof materialStrOrUint8 === \"string\") {\n material = base58btc.decode(materialStrOrUint8);\n } else {\n material = materialStrOrUint8;\n }\n return await this.rt.crypto.importKey(\n \"raw\", // raw or jwk\n material,\n // hexStringToUint8Array(key), // raw data\n \"AES-GCM\",\n extractable,\n [\"encrypt\", \"decrypt\"],\n );\n }\n\n async ensureKeyFromUrl(url: URI, keyFactory: () => string): Promise<Result<URI>> {\n // add storekey to url\n const storeKey = url.getParam(PARAM.STORE_KEY);\n if (storeKey === \"insecure\") {\n return Result.Ok(url);\n }\n if (!storeKey) {\n const keyName = `@${keyFactory()}@`;\n const ret = await this.getNamedKey(keyName);\n if (ret.isErr()) {\n return Result.Err(ret);\n }\n const urb = url.build().setParam(PARAM.STORE_KEY, keyName);\n return Result.Ok(urb.URI());\n }\n if (storeKey.startsWith(\"@\") && storeKey.endsWith(\"@\")) {\n const ret = await this.getNamedKey(storeKey);\n if (ret.isErr()) {\n return Result.Err(ret);\n }\n }\n return Result.Ok(url);\n }\n\n private async toKeysItem(ki: V1StorageKeyItem | KeysItem | undefined): Promise<KeysItem | undefined> {\n if (!ki) return undefined;\n if (\"key\" in ki) {\n const fpr = (await toKeyWithFingerPrint(this, ki.key)).Ok().fingerPrint;\n return {\n name: ki.name,\n keys: {\n [fpr]: {\n key: ki.key,\n fingerPrint: fpr,\n default: true,\n },\n },\n };\n }\n // fix default\n let defKI: V2StorageKeyItem | undefined;\n let foundDefKI = false;\n for (const i of Object.entries(ki.keys)) {\n if (i[0] !== i[1].fingerPrint) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete ki.keys[i[0]];\n ki.keys[i[1].fingerPrint] = i[1];\n this.logger.Warn().Str(\"name\", ki.name).Msg(\"fingerPrint mismatch fixed\");\n }\n if (defKI === undefined) {\n defKI = i[1];\n }\n if (!foundDefKI && i[1].default) {\n defKI = i[1];\n foundDefKI = true;\n } else {\n (i[1] as { default: boolean }).default = false;\n }\n }\n if (defKI) {\n ki.keys[\"*\"] = defKI;\n }\n return {\n name: ki.name,\n keys: ki.keys,\n };\n }\n\n flush() {\n return this._seq.flush();\n }\n\n readonly _seq: ResolveSeq<Result<KeysByFingerprint>> = new ResolveSeq<Result<KeysByFingerprint>>();\n // async setNamedKey(name: string, key: string, def?: boolean): Promise<Result<KeysByFingerprint>> {\n // return this._seq.add(() => this._upsertNamedKey(name, key, !!def));\n // }\n\n // avoid deadlock\n async _upsertNamedKey(ksi: KeysByFingerprint): Promise<Result<KeysByFingerprint>> {\n const bag = await this.rt.getBagProvider();\n return this._seq.add(async () => {\n const rKbf = await this._getNamedKey(ksi.name, true);\n if (rKbf.isErr()) {\n this.logger.Error().Err(rKbf).Str(\"name\", ksi.name).Msg(\"_upsertNamedKey: getNamedKey failed\");\n // we updated the cache\n this._namedKeyCache.unget(ksi.name);\n }\n await bag.set(await ksi.asKeysItem());\n return Result.Ok(ksi);\n });\n }\n\n // async getNamedExtractableKey(name: string, failIfNotFound = false): Promise<Result<KeysByFingerprint>> {\n // const ret = await this.getNamedKey(name, failIfNotFound);\n // if (ret.isErr()) {\n // return Result.Err(ret)\n // }\n // const named = ret.Ok();\n // return Result.Ok({\n // ...named,\n // extract: async () => {\n // const ext = new Uint8Array((await this.rt.crypto.exportKey(\"raw\", named.key)) as ArrayBuffer);\n // return {\n // key: ext,\n // keyStr: base58btc.encode(ext),\n // };\n // },\n // });\n // }\n\n private _namedKeyCache = new KeyedResolvOnce<Result<KeysByFingerprint>>();\n\n private async _getNamedKey(\n name: string,\n failIfNotFound: boolean,\n material?: string | Uint8Array,\n ): Promise<Result<KeysByFingerprint>> {\n return await this._namedKeyCache.get(name).once(async () => {\n const id = this.rt.sthis.nextId(4).str;\n const bag = await this.rt.getBagProvider();\n const named = await this.toKeysItem(await bag.get(name));\n if (named) {\n this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Any(\"fprs\", Object.keys(named.keys)).Msg(\"fingerPrint getNamedKey\");\n return Result.Ok(await keysByFingerprint.from(this, named));\n }\n if (!named && failIfNotFound) {\n // do not cache\n this._namedKeyCache.unget(name);\n return this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Msg(\"failIfNotFound getNamedKey\").ResultError();\n }\n\n const kp = new keysByFingerprint(this, name);\n let keyMaterial: Uint8Array;\n if (!material) {\n keyMaterial = this.rt.crypto.randomBytes(this.rt.keyLength);\n } else {\n if (typeof material === \"string\") {\n keyMaterial = base58btc.decode(material);\n } else if (material instanceof Uint8Array) {\n keyMaterial = material;\n } else {\n return this.logger.Error().Msg(\"material must be string or Uint8Array\").ResultError();\n }\n }\n const res = await kp.upsert(keyMaterial, true);\n if (res.isErr()) {\n return Result.Err(res);\n }\n // this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Msg(\"createKey getNamedKey-pre\");\n // const ret = await this._upsertNamedKey(name, base58btc.encode(this.rt.crypto.randomBytes(this.rt.keyLength)), true);\n this.logger.Debug().Str(\"id\", id).Str(\"name\", name).Str(\"fpr\", res.Ok().kfp.fingerPrint).Msg(\"createKey getNamedKey-post\");\n return Result.Ok(kp);\n });\n }\n\n async getNamedKey(name: string, failIfNotFound = false, material?: string | Uint8Array): Promise<Result<KeysByFingerprint>> {\n return this._seq.add(async () => {\n return await this._getNamedKey(name, failIfNotFound, material);\n });\n }\n}\n\nexport interface V1StorageKeyItem {\n readonly name: string;\n readonly key: string;\n}\n\nexport interface V2StorageKeyItem {\n readonly key: string; // material\n readonly fingerPrint: string;\n readonly default: boolean;\n}\nexport interface KeysItem {\n readonly name: string;\n readonly keys: Record<string, V2StorageKeyItem>;\n}\n\nexport type KeyBagFile = Record<string, KeysItem>;\n\nexport interface KeyBagOpts {\n // in future you can encrypt the keybag with ?masterkey=xxxxx\n readonly url: CoerceURI;\n // readonly key: string; // key to encrypt the keybag\n readonly crypto: CryptoRuntime;\n readonly keyLength: number; // default: 16\n // readonly logger: Logger;\n readonly keyRuntime: KeyBagRuntime;\n}\n\nexport interface KeyBagProvider {\n get(id: string): Promise<V1StorageKeyItem | KeysItem | undefined>;\n set(item: KeysItem): Promise<void>;\n}\nexport interface KeyBagRuntime {\n readonly url: URI;\n readonly crypto: CryptoRuntime;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly keyLength: number;\n // readonly key?: FPCryptoKey;\n getBagProvider(): Promise<KeyBagProvider>;\n id(): string;\n}\n\nexport type KeyBackProviderFactory = (url: URI, sthis: SuperThis) => Promise<KeyBagProvider>;\n\nexport interface KeyBagProviderFactoryItem {\n readonly protocol: string;\n // if this is set the default protocol selection is overridden\n readonly override?: boolean;\n readonly factory: KeyBackProviderFactory;\n}\n\nconst keyBagProviderFactories = new Map<string, KeyBagProviderFactoryItem>(\n [\n {\n protocol: \"file:\",\n factory: async (url: URI, sthis: SuperThis) => {\n return new KeyBagProviderFile(url, sthis);\n },\n },\n {\n protocol: \"indexeddb:\",\n factory: async (url: URI, sthis: SuperThis) => {\n const { KeyBagProviderImpl } = await import(\"@fireproof/core/indexeddb\");\n return new KeyBagProviderImpl(url, sthis);\n },\n },\n {\n protocol: \"memory:\",\n factory: async (url: URI, sthis: SuperThis) => {\n return new KeyBagProviderMemory(url, sthis);\n },\n },\n ].map((i) => [i.protocol, i]),\n);\n\nexport function registerKeyBagProviderFactory(item: KeyBagProviderFactoryItem) {\n const protocol = item.protocol.endsWith(\":\") ? item.protocol : item.protocol + \":\";\n keyBagProviderFactories.set(protocol, {\n ...item,\n protocol,\n });\n}\n\nexport function defaultKeyBagUrl(sthis: SuperThis): URI {\n let bagFnameOrUrl = sthis.env.get(\"FP_KEYBAG_URL\");\n let url: URI;\n if (runtimeFn().isBrowser) {\n url = URI.from(bagFnameOrUrl || \"indexeddb://fp-keybag\");\n } else {\n if (!bagFnameOrUrl) {\n const home = sthis.env.get(\"HOME\");\n bagFnameOrUrl = `${home}/.fireproof/keybag`;\n url = URI.from(`file://${bagFnameOrUrl}`);\n } else {\n url = URI.from(bagFnameOrUrl);\n }\n }\n const logger = ensureLogger(sthis, \"defaultKeyBagUrl\");\n logger.Debug().Url(url).Msg(\"from env\");\n return url;\n}\n\nexport function defaultKeyBagOpts(sthis: SuperThis, kbo?: Partial<KeyBagOpts>): KeyBagRuntime {\n kbo = kbo || {};\n if (kbo.keyRuntime) {\n return kbo.keyRuntime;\n }\n const logger = ensureLogger(sthis, \"KeyBag\");\n let url: URI;\n if (kbo.url) {\n url = URI.from(kbo.url);\n logger.Debug().Url(url).Msg(\"from opts\");\n } else {\n let bagFnameOrUrl = sthis.env.get(\"FP_KEYBAG_URL\");\n if (runtimeFn().isBrowser) {\n url = URI.from(bagFnameOrUrl || \"indexeddb://fp-keybag\");\n } else {\n if (!bagFnameOrUrl) {\n const home = sthis.env.get(\"HOME\");\n bagFnameOrUrl = `${home}/.fireproof/keybag`;\n url = URI.from(`file://${bagFnameOrUrl}`);\n } else {\n url = URI.from(bagFnameOrUrl);\n }\n }\n logger.Debug().Url(url).Msg(\"from env\");\n }\n const kitem = keyBagProviderFactories.get(url.protocol);\n if (!kitem) {\n throw logger.Error().Url(url).Msg(\"unsupported protocol\").AsError();\n }\n\n if (url.hasParam(\"masterkey\")) {\n throw logger.Error().Url(url).Msg(\"masterkey is not supported\").AsError();\n }\n\n return {\n url,\n crypto: kbo.crypto || toCryptoRuntime({}),\n sthis,\n logger,\n keyLength: kbo.keyLength || 16,\n getBagProvider: () => kitem.factory(url, sthis),\n id: () => {\n return url.toString();\n },\n };\n}\n\nconst _keyBags = new KeyedResolvOnce<KeyBag>();\nexport async function getKeyBag(sthis: SuperThis, kbo: Partial<KeyBagOpts> = {}): Promise<KeyBag> {\n await sthis.start();\n const rt = defaultKeyBagOpts(sthis, kbo);\n return _keyBags.get(rt.id()).once(async () => new KeyBag(rt));\n}\n","import { runtimeFn, URI } from \"@adviser/cement\";\nimport type { SysFileSystem } from \"../../../types.js\";\n\nexport function sysFileSystemFactory(uri: URI): Promise<SysFileSystem> {\n const rt = runtimeFn();\n switch (true) {\n case rt.isNodeIsh:\n return import(\"@fireproof/core/node\").then((m) => m.getSysFileSystem(uri));\n case rt.isDeno:\n return import(\"@fireproof/core/deno\").then((m) => m.getSysFileSystem(uri));\n default:\n throw new Error(`unsupported runtime:${rt}`);\n }\n}\n","import { Logger, URI } from \"@adviser/cement\";\nimport { SuperThis, SysFileSystem } from \"../../../types.js\";\nimport { KeyBagProvider, KeysItem, V1StorageKeyItem } from \"../../key-bag.js\";\nimport { isNotFoundError } from \"../../../utils.js\";\nimport { sysFileSystemFactory } from \"./sys-file-system-factory.js\";\n\ninterface KeyBagCtx {\n readonly dirName: string;\n readonly sysFS: SysFileSystem;\n readonly fName: string;\n}\n\nexport class KeyBagProviderFile implements KeyBagProvider {\n async _prepare(id: string): Promise<KeyBagCtx> {\n await this.sthis.start();\n const sysFS = await sysFileSystemFactory(this.url);\n const dirName = this.url.pathname;\n await sysFS.mkdir(dirName, { recursive: true });\n return {\n dirName,\n sysFS,\n fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`),\n };\n }\n\n private readonly url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(url: URI, sthis: SuperThis) {\n this.url = url;\n this.sthis = sthis;\n this.logger = sthis.logger;\n }\n\n async get(id: string): Promise<V1StorageKeyItem | KeysItem | undefined> {\n const ctx = await this._prepare(id);\n try {\n const p = await ctx.sysFS.readfile(ctx.fName);\n const ki = JSON.parse(this.sthis.txt.decode(p));\n return ki;\n } catch (e) {\n if (isNotFoundError(e)) {\n return undefined;\n }\n throw this.logger.Error().Err(e).Any(\"file\", ctx).Msg(\"read bag failed\").AsError();\n }\n }\n\n async set(item: KeysItem): Promise<void> {\n const ctx = await this._prepare(item.name);\n const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));\n await ctx.sysFS.writefile(ctx.fName, p);\n }\n}\n","import { URI } from \"@adviser/cement\";\nimport { KeyBagProvider, KeysItem, V1StorageKeyItem } from \"./key-bag.js\";\nimport { SuperThis } from \"../types.js\";\n\nconst memoryKeyBag = new Map<string, Uint8Array>();\n\nexport class KeyBagProviderMemory implements KeyBagProvider {\n private readonly url: URI;\n readonly sthis: SuperThis;\n constructor(url: URI, sthis: SuperThis) {\n this.url = url;\n this.sthis = sthis;\n }\n key(id: string): string {\n return `${this.url.pathname}/${id}`;\n }\n\n // async _prepare(id: string): Promise<KeyBagCtx> {\n // await this.sthis.start();\n // const sysFS = await sysFileSystemFactory(this.url);\n // const dirName = this.url.pathname;\n // await sysFS.mkdir(dirName, { recursive: true });\n // return {\n // dirName,\n // sysFS,\n // fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`),\n // };\n // }\n\n async get(id: string): Promise<KeysItem | V1StorageKeyItem | undefined> {\n const binKeyItem = memoryKeyBag.get(this.key(id));\n if (binKeyItem) {\n const ki = JSON.parse(this.sthis.txt.decode(binKeyItem));\n return ki;\n }\n return undefined;\n }\n\n async set(item: KeysItem): Promise<void> {\n const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));\n memoryKeyBag.set(this.key(item.name), p);\n }\n}\n","import { BuildURI, runtimeFn, URI } from \"@adviser/cement\";\nimport { PARAM, SuperThis } from \"../types.js\";\nimport type { SerdeGateway } from \"./serde-gateway.js\";\nimport { FILESTORE_VERSION } from \"../runtime/gateways/file/version.js\";\nimport { INDEXEDDB_VERSION } from \"../runtime/gateways/indexeddb-version.js\";\nimport type { Gateway } from \"./gateway.js\";\nimport { FileGateway } from \"../runtime/gateways/file/gateway-impl.js\";\nimport { MemoryGateway } from \"../runtime/gateways/memory/gateway.js\";\nimport { sysFileSystemFactory } from \"../runtime/gateways/file/sys-file-system-factory.js\";\nimport { DefSerdeGateway } from \"../runtime/gateways/def-serde-gateway.js\";\n\nexport interface SerdeGatewayFactoryItem {\n readonly protocol: string;\n // readonly overrideBaseURL?: string; // if this set it overrides the defaultURL\n // readonly overrideRegistration?: boolean; // if this is set, it will override the registration\n readonly isDefault?: boolean;\n\n defaultURI(sthis: SuperThis): URI;\n\n serdegateway(sthis: SuperThis): Promise<SerdeGateway>;\n\n // readonly gateway?: (sthis: SuperThis) => Promise<SerdeGateway>;\n // readonly test: (sthis: SuperThis, gfi: GatewayFactoryItem) => Promise<TestGateway>;\n // which switches between file and indexeddb\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, SerdeGatewayFactoryItem>();\n\nexport function getDefaultURI(sthis: SuperThis, protocol?: string): URI {\n if (protocol) {\n if (!protocol.endsWith(\":\")) {\n protocol += \":\";\n }\n const gfi = storeFactory.get(protocol);\n if (gfi) {\n return gfi.defaultURI(sthis);\n }\n }\n const found = Array.from(storeFactory.values()).find((item) => item.isDefault);\n if (!found) {\n throw sthis.logger.Error().Msg(\"no default found\").AsError();\n }\n return found.defaultURI(sthis);\n}\n\nexport interface SerdeOrGatewayFactoryItem {\n readonly protocol: string;\n readonly isDefault?: boolean;\n\n readonly defaultURI: (sthis: SuperThis) => URI;\n\n readonly serdegateway?: (sthis: SuperThis) => Promise<SerdeGateway>;\n readonly gateway?: (sthis: SuperThis) => Promise<Gateway>;\n}\n\nexport function registerStoreProtocol(item: SerdeOrGatewayFactoryItem): () => void {\n let protocol = item.protocol;\n if (!protocol.endsWith(\":\")) {\n protocol += \":\";\n }\n if (!item.serdegateway && !item.gateway) {\n throw new Error(`registerStoreProtocol needs a gateway or serdegateway`);\n }\n let serdegateway: (sthis: SuperThis) => Promise<SerdeGateway>;\n if (item.gateway) {\n serdegateway = async (sthis) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const m = await item.gateway!(sthis);\n // console.log(\"Gateway Plug in DefSerdeGateway\", m);\n return new DefSerdeGateway(m);\n };\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n serdegateway = item.serdegateway!;\n }\n if (item.isDefault) {\n Array.from(storeFactory.values()).forEach((items) => {\n (items as { isDefault: boolean }).isDefault = false;\n });\n }\n storeFactory.set(protocol, {\n ...item,\n serdegateway,\n });\n return () => {\n storeFactory.delete(protocol);\n };\n}\n\nexport function getGatewayFactoryItem(protocol: string): SerdeGatewayFactoryItem | undefined {\n return storeFactory.get(protocol);\n}\n\nexport function defaultGatewayFactoryItem(): SerdeGatewayFactoryItem {\n const found = Array.from(storeFactory.values()).find((item) => item.isDefault);\n if (!found) {\n throw new Error(\"no default found\");\n }\n return found;\n}\n\nfunction defaultURI(sthis: SuperThis) {\n const rt = runtimeFn();\n return (\n BuildURI.from(\"file://\")\n // .pathname(`${sthis.env.get(\"HOME\")}/.fireproof/${FILESTORE_VERSION.replace(/-.*$/, \"\")}`)\n .pathname(`${sthis.env.get(\"HOME\")}/.fireproof/${FILESTORE_VERSION.replace(/-.*$/, \"\")}`)\n .setParam(PARAM.VERSION, FILESTORE_VERSION)\n .setParam(PARAM.URL_GEN, \"default\")\n .setParam(PARAM.RUNTIME, rt.isNodeIsh ? \"node\" : rt.isDeno ? \"deno\" : \"unknown\")\n .URI()\n );\n}\n\nif (runtimeFn().isNodeIsh || runtimeFn().isDeno) {\n registerStoreProtocol({\n protocol: \"file:\",\n isDefault: true,\n defaultURI,\n gateway: async (sthis) => {\n return new FileGateway(sthis, await sysFileSystemFactory(defaultURI(sthis)));\n },\n });\n}\n\nif (runtimeFn().isBrowser) {\n registerStoreProtocol({\n protocol: \"indexeddb:\",\n isDefault: true,\n defaultURI: () => {\n return BuildURI.from(\"indexeddb://\")\n .pathname(\"fp\")\n .setParam(PARAM.VERSION, INDEXEDDB_VERSION)\n .setParam(PARAM.RUNTIME, \"browser\")\n .URI();\n },\n gateway: async () => {\n const { GatewayImpl } = await import(\"@fireproof/core/indexeddb\");\n return new GatewayImpl();\n },\n });\n}\n\nconst memory = new Map<string, Uint8Array>();\nregisterStoreProtocol({\n protocol: \"memory:\",\n isDefault: false,\n defaultURI: () => {\n return BuildURI.from(\"memory://\").pathname(\"ram\").URI();\n },\n gateway: async (sthis) => {\n return new MemoryGateway(sthis, memory);\n },\n});\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","export const INDEXEDDB_VERSION = \"v0.19-indexeddb\";\n","import { FILESTORE_VERSION } from \"./version.js\";\nimport { exception2Result, KeyedResolvOnce, Result, URI } from \"@adviser/cement\";\nimport { getFileName, getPath } from \"./utils.js\";\nimport { PARAM, SuperThis, SysFileSystem } from \"../../../types.js\";\nimport { exceptionWrapper, isNotFoundError, NotFoundError } from \"../../../utils.js\";\nimport type { Gateway, GetResult } from \"../../../blockstore/gateway.js\";\n\nconst versionFiles = new KeyedResolvOnce<string>();\n\nexport class FileGateway implements Gateway {\n // abstract readonly storeType: StoreType;\n readonly fs: SysFileSystem;\n\n constructor(sthis: SuperThis, fs: SysFileSystem) {\n this.fs = fs;\n }\n\n async getVersionFromFile(path: string, sthis: SuperThis): Promise<string> {\n return versionFiles.get(path).once(async () => {\n await this.fs.mkdir(path, { recursive: true });\n const vFile = sthis.pathOps.join(path, \"version\");\n const vFileStat = await this.fs.stat(vFile).catch(() => undefined);\n if (!vFileStat) {\n await this.fs.writefile(sthis.pathOps.join(path, \"version\"), FILESTORE_VERSION);\n return FILESTORE_VERSION;\n } else if (!vFileStat.isFile()) {\n throw sthis.logger.Error().Str(\"file\", vFile).Msg(`version file is a directory`).AsError();\n }\n const v = await this.fs.readfile(vFile);\n const vStr = sthis.txt.decode(v);\n if (vStr !== FILESTORE_VERSION) {\n sthis.logger.Warn().Str(\"file\", vFile).Str(\"from\", vStr).Str(\"expected\", FILESTORE_VERSION).Msg(`version mismatch`);\n }\n return vStr;\n });\n }\n\n start(baseURL: URI, sthis: SuperThis): Promise<Result<URI>> {\n return exception2Result(async () => {\n await this.fs.start();\n const url = baseURL.build();\n url.defParam(PARAM.VERSION, FILESTORE_VERSION);\n // url.defParam(\"store\", this.storeType);\n const dbUrl = await this.buildUrl(url.URI(), \"dummy\");\n const dbdirFile = this.getFilePath(dbUrl.Ok(), sthis);\n await this.fs.mkdir(sthis.pathOps.dirname(dbdirFile), { recursive: true });\n const dbroot = sthis.pathOps.dirname(dbdirFile);\n sthis.logger.Debug().Url(url.URI()).Str(\"dbroot\", dbroot).Msg(\"start\");\n url.setParam(PARAM.VERSION, await this.getVersionFromFile(dbroot, sthis));\n return url.URI();\n });\n }\n\n async buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Result.Ok(baseUrl.build().setParam(PARAM.KEY, key).URI());\n }\n\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n\n getFilePath(url: URI, sthis: SuperThis): string {\n const key = url.getParam(PARAM.KEY);\n if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();\n // const urlGen = url.getParam(PARAM.URL_GEN);\n // switch (urlGen) {\n // case \"default\":\n // return sthis.pathOps.join(getPath(url, sthis), getFileName(url, sthis));\n // case \"fromEnv\":\n // return sthis.pathOps.join(getPath(url, sthis), getFileName(url, sthis));\n // default:\n // break;\n // }\n return sthis.pathOps.join(getPath(url, sthis), getFileName(url, sthis));\n }\n\n async put(url: URI, bytes: Uint8Array, sthis: SuperThis): Promise<Result<void>> {\n return exception2Result(async () => {\n const file = await this.getFilePath(url, sthis);\n sthis.logger.Debug().Str(\"url\", url.toString()).Str(\"file\", file).Msg(\"put\");\n await this.fs.writefile(file, bytes);\n });\n }\n\n async get(url: URI, sthis: SuperThis): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const file = this.getFilePath(url, sthis);\n try {\n sthis.logger.Debug().Url(url).Str(\"file\", file).Msg(\"get\");\n const res = await this.fs.readfile(file);\n return Result.Ok(res);\n } catch (e: unknown) {\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\n async delete(url: URI, sthis: SuperThis): Promise<Result<void>> {\n return exception2Result(async () => {\n await this.fs.unlink(this.getFilePath(url, sthis));\n });\n }\n\n async destroy(baseURL: URI, sthis: SuperThis): Promise<Result<void>> {\n const url = await this.buildUrl(baseURL, \"x\");\n if (url.isErr()) return url;\n const filepath = sthis.pathOps.dirname(this.getFilePath(url.Ok(), sthis));\n let files: string[] = [];\n try {\n files = await this.fs.readdir(filepath);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw sthis.logger.Error().Err(e).Str(\"dir\", filepath).Msg(\"destroy:readdir\").AsError();\n }\n }\n for (const file of files) {\n const pathed = sthis.pathOps.join(filepath, file);\n try {\n await this.fs.unlink(pathed);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw sthis.logger.Error().Err(e).Str(\"file\", pathed).Msg(\"destroy:unlink\").AsError();\n }\n }\n }\n return Result.Ok(undefined);\n }\n\n async getPlain(iurl: URI, key: string, sthis: SuperThis) {\n const url = iurl.build().setParam(PARAM.KEY, key).URI();\n const dbFile = sthis.pathOps.join(getPath(url, sthis), getFileName(url, sthis));\n sthis.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Msg(\"get\");\n const buffer = await this.fs.readfile(dbFile);\n sthis.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n return Result.Ok(buffer);\n }\n}\n","import type { URI } from \"@adviser/cement\";\nimport { SuperThis } from \"../../../types.js\";\nimport { getStore } from \"../../../utils.js\";\n\nexport function getPath(url: URI, sthis: SuperThis): string {\n const basePath = url.pathname;\n // .toString()\n // .replace(new RegExp(`^${url.protocol}//`), \"\")\n // .replace(/\\?.*$/, \"\");\n const name = url.getParam(\"name\");\n if (name) {\n // const urlGen = url.getParam(PARAM.URL_GEN);\n // switch (urlGen) {\n // case \"default\":\n // case \"fromEnv\":\n // default:\n // break;\n // }\n\n // const version = url.getParam(\"version\");\n // if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();\n return sthis.pathOps.join(basePath, name);\n }\n return sthis.pathOps.join(basePath);\n}\n\nexport function getFileName(url: URI, sthis: SuperThis): string {\n const key = url.getParam(\"key\");\n if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();\n const res = getStore(url, sthis, (...a: string[]) => a.join(\"-\"));\n switch (res.fromUrl) {\n case \"file\":\n return sthis.pathOps.join(res.name, key);\n case \"car\":\n return sthis.pathOps.join(res.name, key + \".car\");\n case \"wal\":\n case \"meta\":\n return sthis.pathOps.join(res.name, key + \".json\");\n default:\n throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();\n }\n}\n","import { Result, URI } from \"@adviser/cement\";\nimport { Gateway, GetResult } from \"../../../blockstore/gateway.js\";\nimport { PARAM, SuperThis } from \"../../../types.js\";\nimport { MEMORY_VERSION } from \"./version.js\";\nimport { NotFoundError } from \"../../../utils.js\";\nimport { VoidResult } from \"../../../blockstore/serde-gateway.js\";\n\nexport class MemoryGateway implements Gateway {\n readonly memorys: Map<string, Uint8Array>;\n readonly sthis: SuperThis;\n // readonly logger: Logger;\n constructor(sthis: SuperThis, memorys: Map<string, Uint8Array>) {\n // console.log(\"MemoryGateway\", memorys);\n this.memorys = memorys;\n // this.logger = ensureLogger(sthis, \"MemoryGateway\");\n this.sthis = sthis;\n }\n\n buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Promise.resolve(Result.Ok(baseUrl.build().setParam(PARAM.KEY, key).URI()));\n }\n start(baseUrl: URI): Promise<Result<URI>> {\n return Promise.resolve(Result.Ok(baseUrl.build().setParam(PARAM.VERSION, MEMORY_VERSION).URI()));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n close(baseUrl: URI): Promise<VoidResult> {\n return Promise.resolve(Result.Ok(undefined));\n }\n destroy(baseUrl: URI): Promise<VoidResult> {\n const keyUrl = baseUrl.toString();\n for (const key of this.memorys.keys()) {\n if (key.startsWith(keyUrl)) {\n this.memorys.delete(key);\n }\n }\n this.memorys.clear();\n return Promise.resolve(Result.Ok(undefined));\n }\n\n async put(url: URI, bytes: Uint8Array): Promise<VoidResult> {\n // ensureLogger(sthis, \"MemoryGateway\").Debug().Str(\"url\", url.toString()).Msg(\"put\");\n // this.sthis.logger.Warn().Url(url).Msg(\"put\");\n this.memorys.set(url.toString(), bytes);\n return Result.Ok(undefined);\n }\n // get could return a NotFoundError if the key is not found\n get(url: URI): Promise<GetResult> {\n // ensureLogger(sthis, \"MemoryGateway\").Debug().Str(\"url\", url.toString()).Msg(\"put\");\n const x = this.memorys.get(url.toString());\n if (!x) {\n // const possible = Array.from(this.memorys.keys()).filter(i => i.startsWith(url.build().cleanParams().toString()))\n // this.sthis.logger.Warn().Any(\"possible\", possible).Url(url).Msg(\"not found\");\n return Promise.resolve(Result.Err(new NotFoundError(`not found: ${url.toString()}`)));\n }\n return Promise.resolve(Result.Ok(x));\n }\n delete(url: URI): Promise<VoidResult> {\n this.memorys.delete(url.toString());\n return Promise.resolve(Result.Ok(undefined));\n }\n\n async getPlain(url: URI, key: string): Promise<Result<Uint8Array>> {\n const x = this.memorys.get(url.build().setParam(PARAM.KEY, key).toString());\n if (!x) {\n return Result.Err(new NotFoundError(\"not found\"));\n }\n return Result.Ok(x);\n }\n}\n","export const MEMORY_VERSION = \"v0.19-memory\";\n","import { Result, URI } from \"@adviser/cement\";\nimport type { Gateway } from \"../../blockstore/gateway.js\";\nimport { FPEnvelopeTypes, type FPEnvelope, type FPEnvelopeMeta } from \"../../blockstore/fp-envelope.js\";\nimport { fpDeserialize, fpSerialize } from \"./fp-envelope-serialize.js\";\nimport type { SerdeGateway, SerdeGatewayCtx, SerdeGetResult } from \"../../blockstore/serde-gateway.js\";\nimport type { DbMetaEvent } from \"../../blockstore/types.js\";\nimport { PARAM } from \"../../types.js\";\n\nexport class DefSerdeGateway implements SerdeGateway {\n // abstract readonly storeType: StoreType;\n readonly gw: Gateway;\n\n constructor(gw: Gateway) {\n this.gw = gw;\n }\n\n start({ loader: { sthis } }: SerdeGatewayCtx, baseURL: URI): Promise<Result<URI>> {\n return this.gw.start(baseURL, sthis);\n }\n\n async buildUrl({ loader: { sthis } }: SerdeGatewayCtx, baseUrl: URI, key: string): Promise<Result<URI>> {\n return this.gw.buildUrl(baseUrl, key, sthis);\n }\n\n async close({ loader: { sthis } }: SerdeGatewayCtx, uri: URI): Promise<Result<void>> {\n return this.gw.close(uri, sthis);\n }\n\n private subscribeFn = new Map<string, (raw: Uint8Array) => Promise<void>>();\n\n async put<T>({ loader: { sthis }, encoder }: SerdeGatewayCtx, url: URI, env: FPEnvelope<T>): Promise<Result<void>> {\n const rUint8 = await fpSerialize(sthis, env, encoder);\n if (rUint8.isErr()) return rUint8;\n const ret = this.gw.put(url, rUint8.Ok(), sthis);\n\n if (env.type === FPEnvelopeTypes.META) {\n const urlWithoutKey = url.build().delParam(PARAM.KEY).delParam(PARAM.SELF_REFLECT).toString();\n const subFn = this.subscribeFn.get(urlWithoutKey);\n if (subFn) {\n await subFn(rUint8.Ok());\n }\n }\n return ret;\n }\n\n async get<S>({ loader: { sthis }, decoder }: SerdeGatewayCtx, url: URI): Promise<SerdeGetResult<S>> {\n const res = await this.gw.get(url, sthis);\n if (res.isErr()) return Result.Err(res.Err());\n return fpDeserialize(sthis, url, res, decoder) as Promise<SerdeGetResult<S>>;\n }\n\n async subscribe(\n { loader: { sthis }, decoder }: SerdeGatewayCtx,\n url: URI,\n callback: (meta: FPEnvelopeMeta) => Promise<void>,\n ): Promise<Result<() => void>> {\n function rawCallback(raw: Uint8Array) {\n return fpDeserialize<DbMetaEvent[]>(sthis, url, Result.Ok(raw), decoder).then((res) => {\n if (res.isErr()) {\n sthis.logger.Error().Err(res).Msg(\"Failed to deserialize\");\n return;\n }\n callback(res.Ok() as FPEnvelopeMeta);\n });\n }\n if (!this.gw.subscribe) {\n if (!url.hasParam(PARAM.SELF_REFLECT)) {\n return Result.Ok(() => {\n /* noop */\n });\n }\n // memory leak possible\n const urlWithoutKey = url.build().delParam(PARAM.KEY).delParam(PARAM.SELF_REFLECT).toString();\n this.subscribeFn.set(urlWithoutKey, rawCallback);\n return Result.Ok(() => {\n this.subscribeFn.delete(urlWithoutKey);\n });\n }\n const unreg = await this.gw.subscribe(url, rawCallback, sthis);\n return unreg;\n }\n\n async delete({ loader: { sthis } }: SerdeGatewayCtx, url: URI): Promise<Result<void>> {\n return this.gw.delete(url, sthis);\n }\n\n async destroy({ loader: { sthis } }: SerdeGatewayCtx, baseURL: URI): Promise<Result<void>> {\n return this.gw.destroy(baseURL, sthis);\n }\n\n async getPlain({ loader: { sthis } }: SerdeGatewayCtx, iurl: URI, key: string) {\n return this.gw.getPlain(iurl, key, sthis);\n }\n}\n","import { CID } from \"multiformats\";\nimport { DbMetaEvent, WALState } from \"./types.js\";\nimport { Result } from \"@adviser/cement\";\n\nexport const FPEnvelopeTypes = {\n CAR: \"car\",\n FILE: \"file\",\n META: \"meta\",\n WAL: \"wal\",\n} as const;\n\n// const Colors = {\n// Red: \"red\",\n// Green: \"green\",\n// Blue: \"blue\",\n// } as const; // Important: The \"as const\" assertion is crucial for type safety\n\n// type Color = typeof Colors[keyof typeof Colors]; // Extracts the string literal types\n// let myColor: Color = Colors.Red;\n\nexport type FPEnvelopeType = (typeof FPEnvelopeTypes)[keyof typeof FPEnvelopeTypes];\n\n// export enum FPEnvelopeType {\n// CAR = \"car\",\n// FILE = \"file\",\n// META = \"meta\",\n// WAL = \"wal\",\n// }\n\nexport interface FPEnvelope<T> {\n readonly type: FPEnvelopeType;\n readonly payload: T;\n}\n\nexport interface FPEnvelopeCar extends FPEnvelope<Uint8Array> {\n readonly type: typeof FPEnvelopeTypes.CAR;\n}\n\nexport interface FPEnvelopeFile extends FPEnvelope<Uint8Array> {\n readonly type: typeof FPEnvelopeTypes.FILE;\n}\n\nexport interface FPEnvelopeMeta extends FPEnvelope<DbMetaEvent[]> {\n readonly type: typeof FPEnvelopeTypes.META;\n}\n\nexport interface FPWALCarsOps {\n readonly cars: CID[];\n}\n// export interface FPWAL {\n// // fileOperations: any[]; will be added with connector-fixes\n// // noLoaderOps: any[]; will be added with connector-fixes\n// readonly operations: FPWALCarsOps[];\n// }\nexport interface FPEnvelopeWAL extends FPEnvelope<WALState> {\n readonly type: typeof FPEnvelopeTypes.WAL;\n}\n\n// export function WAL2FPMsg(sthis: SuperThis, ws: WALState): Result<FPEnvelopeWAL> {\n// return Result.Ok({\n// type: \"wal\",\n// payload: ws\n// })\n// }\n\n// export function FPMsg2WAL(fpmsg: FPEnvelopeWAL): Result<WALState> {\n// // const renv = FPMsgMatch2Envelope(fpmsg, \"wal\");\n// // if (renv.isErr()) {\n// // return Result.Err(renv.Err());\n// // }\n// if (fpmsg.type !== \"wal\") {\n// return Result.Err(`expected type to be wal`);\n// }\n// const convertCids = fpmsg.payload as WALState;\n// for (const op of convertCids.operations) {\n// const cars = []\n// for (const strCid of op.cars) {\n// for (const cidVal of Object.values(strCid)) {\n// cars.push(CID.parse(cidVal));\n// }\n// }\n// (op as {cars: CID[]}).cars = cars;\n// }\n// return Result.Ok(convertCids);\n// }\n\n// export function Meta2FPMsg(fpmetas: DbMetaEvent[]): Uint8Array {\n// /*\n// [\n// {\n// \"cid\":\"bafyreibc2rbsszqw5z7xiojra2vgskl3mi7iegf3ynpofm6w6lcxx4r7ha\",\n// \"data\":\"MomRkYXRhoWZkYk1ldGFYU3siY2FycyI6W3siLyI6ImJhZzR5dnFhYmNpcW9peXdlb2Vjd214Z3VmdDV4YmJsMnFxd2c3Z2tmYTV6cG91d2huYWVoN3E1b3o2eTNoMnkifV19Z3BhcmVudHOB2CpYJQABcRIgTXAXVfzn7tghZBnaOrXq0+bmY3kK9f1CCNrGfeA73hk=\",\n// \"parents\":[\"bafyreicnoalvl7hh53mcczaz3i5ll2wt43tgg6ik6x6uecg2yz66ao66de\"]\n// }\n// ]\n// */\n// return encode({ type: \"meta\", payload: fpmetas } as FPEnvelopeMeta);\n// }\n\n// export function FPMsg2Meta(fpmsg: Uint8Array): Result<DbMeta> {\n// const renv = FPMsgMatch2Envelope(fpmsg, \"meta\");\n// if (renv.isErr()) {\n// return Result.Err(renv.Err());\n// }\n// return Result.Ok(renv.Ok().payload as DbMeta);\n// }\n\nexport function Car2FPMsg(fpcar: Uint8Array): Result<FPEnvelopeCar> {\n return Result.Ok({ type: FPEnvelopeTypes.CAR, payload: fpcar });\n}\n\n// export function FPMsg2Car(fpmsg: Uint8Array): Result<Uint8Array> {\n// const renv = FPMsgMatch2Envelope(fpmsg, \"car\");\n// if (renv.isErr()) {\n// return Result.Err(renv.Err());\n// }\n// return Result.Ok(renv.Ok().payload as Uint8Array);\n// }\n\nexport function File2FPMsg(fpfile: Uint8Array): Result<FPEnvelopeFile> {\n return Result.Ok({ type: FPEnvelopeTypes.FILE, payload: fpfile });\n}\n\n// export function FPMsg2File(fpmsg: Uint8Array): Result<Uint8Array> {\n// const renv = FPMsgMatch2Envelope(fpmsg, \"file\");\n// if (renv.isErr()) {\n// return Result.Err(renv.Err());\n// }\n// return Result.Ok(renv.Ok().payload as Uint8Array);\n// }\n\n// export function FPMsgMatch2Envelope(fpmsg: Uint8Array, ...types: string[]): Result<FPEnvelope<unknown>> {\n// let env: FPEnvelope<unknown>;\n// try {\n// env = decode(fpmsg);\n// } catch (e) {\n// return Result.Err(`failed to decode envelope: ${e}`);\n// }\n// if (typeof env !== \"object\") {\n// return Result.Err(`expected envelope to be an object`);\n// }\n// if (typeof env.type !== \"string\") {\n// return Result.Err(`expected type to be a string`);\n// }\n// if (types.length > 0 && !types.includes(env.type)) {\n// return Result.Err(`expected type to be ${types}`);\n// }\n// // need to check if the payload is a valid WAL\n// return Result.Ok(env);\n// }\n","import { exception2Result, Result, URI } from \"@adviser/cement\";\nimport type { CarClockLink, DbMeta, DbMetaBinary, DbMetaEvent, WALState } from \"../../blockstore/index.js\";\nimport {\n FPEnvelope,\n FPEnvelopeCar,\n FPEnvelopeFile,\n FPEnvelopeMeta,\n FPEnvelopeType,\n FPEnvelopeTypes,\n FPEnvelopeWAL,\n} from \"../../blockstore/fp-envelope.js\";\nimport { PARAM, PromiseToUInt8, SuperThis } from \"../../types.js\";\nimport { decodeEventBlock, EventBlock } from \"@web3-storage/pail/clock\";\nimport { base64pad } from \"multiformats/bases/base64\";\nimport { CID, Link } from \"multiformats\";\nimport { fromJSON } from \"multiformats/link\";\nimport { format, parse } from \"@ipld/dag-json\";\nimport { EventView } from \"@web3-storage/pail/clock/api\";\nimport { coercePromiseIntoUint8 } from \"../../utils.js\";\n\nexport interface SerializedMeta {\n readonly data: string; // base64pad encoded\n readonly parents: string[];\n readonly cid: string;\n}\n\nexport async function dbMetaEvent2Serialized(\n sthis: SuperThis,\n dbEvents: Omit<DbMetaEvent, \"eventCid\">[],\n): Promise<SerializedMeta[]> {\n return await Promise.all(\n dbEvents.map(async (dbEvent) => {\n const event = await EventBlock.create<DbMetaBinary>(\n {\n dbMeta: sthis.txt.encode(format(dbEvent.dbMeta)),\n },\n dbEvent.parents as unknown as Link<EventView<DbMetaBinary>, number, number, 1>[],\n );\n return {\n cid: event.cid.toString(),\n parents: dbEvent.parents.map((i) => i.toString()),\n data: base64pad.encode(event.bytes),\n } satisfies SerializedMeta;\n }),\n );\n}\n\nfunction WALState2Serialized(sthis: SuperThis, wal: WALState): SerializedWAL {\n const serializedWAL: SerializedWAL = {\n fileOperations: wal.fileOperations.map((fop) => ({\n cid: fop.cid.toString(),\n public: fop.public,\n })),\n noLoaderOps: wal.noLoaderOps.map((nop) => ({\n cars: nop.cars.map((i) => i.toString()),\n })),\n operations: wal.operations.map((op) => ({\n cars: op.cars.map((i) => i.toString()),\n })),\n };\n return serializedWAL;\n}\n\nexport type CAREncodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\nexport type FILEEncodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\nexport type METAEncodeEnvelope = (sthis: SuperThis, payload: SerializedMeta[]) => Promise<Result<Uint8Array>>;\nexport type WALEncodeEnvelope = (sthis: SuperThis, payload: SerializedWAL) => Promise<Result<Uint8Array>>;\n\n// export type CAREncodeEnvelope = (sthis: SuperThis, payload: Uint8Array, base: CAREncodeEnvelopeBase) => Promise<Uint8Array>;\n// export type FILEEncodeEnvelope = (sthis: SuperThis, payload: Uint8Array, base: CAREncodeEnvelopeBase) => Promise<Uint8Array>;\n// export type METAEncodeEnvelope = (sthis: SuperThis, payload: SerializedMeta[], base: METAEncodeEnvelopeBase) => Promise<Uint8Array>;\n// export type WALEncodeEnvelope = (sthis: SuperThis, payload: SerializedWAL, base: WALEncodeEnvelopeBase) => Promise<Uint8Array>;\nexport interface FPEncoder {\n readonly car: CAREncodeEnvelope;\n readonly file: FILEEncodeEnvelope;\n readonly meta: METAEncodeEnvelope;\n readonly wal: WALEncodeEnvelope;\n}\n\nconst defaultEncoder: FPEncoder = {\n car: async (sthis: SuperThis, payload: Uint8Array) => Result.Ok(payload),\n file: async (sthis: SuperThis, payload: Uint8Array) => Result.Ok(payload),\n meta: async (sthis: SuperThis, payload: SerializedMeta[]) => Result.Ok(sthis.txt.encode(JSON.stringify(payload))),\n wal: async (sthis: SuperThis, payload: SerializedWAL) => Result.Ok(sthis.txt.encode(JSON.stringify(payload))),\n};\n\nexport async function fpSerialize<T>(\n sthis: SuperThis,\n env: FPEnvelope<T>,\n pencoder?: Partial<FPEncoder>,\n): Promise<Result<Uint8Array>> {\n const encoder = {\n ...defaultEncoder,\n ...pencoder,\n };\n switch (env.type) {\n case FPEnvelopeTypes.FILE:\n return encoder.file(sthis, (env as FPEnvelopeFile).payload);\n case FPEnvelopeTypes.CAR:\n return encoder.car(sthis, (env as FPEnvelopeCar).payload);\n case FPEnvelopeTypes.WAL:\n return encoder.wal(sthis, WALState2Serialized(sthis, (env as FPEnvelopeWAL).payload));\n case FPEnvelopeTypes.META:\n return encoder.meta(sthis, await dbMetaEvent2Serialized(sthis, (env as FPEnvelopeMeta).payload));\n default:\n throw sthis.logger.Error().Str(\"type\", env.type).Msg(\"unsupported store\").AsError();\n }\n}\n\nexport async function decode2DbMetaEvents(\n sthis: SuperThis,\n rserializedMeta: Result<SerializedMeta[]>,\n): Promise<Result<DbMetaEvent[]>> {\n if (rserializedMeta.isErr()) {\n return Result.Err(rserializedMeta.Err());\n }\n const serializedMeta = rserializedMeta.unwrap();\n if (!Array.isArray(serializedMeta)) {\n return sthis.logger.Debug().Any(\"metaEntries\", serializedMeta).Msg(\"No data in MetaEntries\").ResultError();\n }\n // if (!serializedMeta.length) {\n // return sthis.logger.Debug().Msg(\"No MetaEntries found\").ResultError();\n // }\n return Result.Ok(\n await Promise.all(\n serializedMeta.map(async (metaEntry) => {\n const eventBlock = await decodeEventBlock<DbMetaBinary>(base64pad.decode(metaEntry.data));\n const dbMeta = parse<DbMeta>(sthis.txt.decode(eventBlock.value.data.dbMeta));\n return {\n eventCid: eventBlock.cid as CarClockLink,\n parents: metaEntry.parents.map((i: string) => CID.parse(i)),\n dbMeta,\n } satisfies DbMetaEvent;\n }),\n ),\n );\n}\n\ntype linkOrCid = { \"/\": string } | string;\n\nexport interface SerializedWAL {\n readonly fileOperations?: { cid: linkOrCid; public: boolean }[];\n readonly noLoaderOps?: { cars: linkOrCid[] }[];\n readonly operations?: { cars: linkOrCid[] }[];\n}\n\nfunction toCid(sthis: SuperThis, link: linkOrCid): CID {\n if (typeof link === \"string\") {\n return CID.parse(link);\n }\n return fromJSON(link);\n}\n\nasync function decode2WalState(sthis: SuperThis, rserializedWAL: Result<SerializedWAL>): Promise<Result<WALState>> {\n if (rserializedWAL.isErr()) {\n return Result.Err(rserializedWAL.Err());\n }\n const serializedWAL = rserializedWAL.unwrap();\n return Result.Ok({\n fileOperations: (serializedWAL.fileOperations || []).map((fop) => ({\n cid: toCid(sthis, fop.cid),\n public: !!fop.public,\n })),\n noLoaderOps: (serializedWAL.noLoaderOps || []).map((nop) => ({\n cars: (nop.cars || []).map((i) => toCid(sthis, i)),\n })),\n operations: (serializedWAL.operations || []).map((op) => ({\n cars: (op.cars || []).map((i) => toCid(sthis, i)),\n })),\n });\n}\n// export type CARDecodeEnvelopeBase = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\n// export type FILEDecodeEnvelopeBase = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\n// export type WALDecodeEnvelopeBase = (sthis: SuperThis, payload: SerializedWAL) => Promise<Result<SerializedWAL>>;\n// export type METADecodeEnvelopeBase = (sthis: SuperThis, payload: SerializedMeta[]) => Promise<Result<SerializedMeta[]>>;\n\nexport type CARDecodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\nexport type FILEDecodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<Uint8Array>>;\nexport type METADecodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<SerializedMeta[]>>;\nexport type WALDecodeEnvelope = (sthis: SuperThis, payload: Uint8Array) => Promise<Result<SerializedWAL>>;\nexport interface FPDecoder {\n readonly car: CARDecodeEnvelope;\n readonly file: FILEDecodeEnvelope;\n readonly meta: METADecodeEnvelope;\n readonly wal: WALDecodeEnvelope;\n}\n\nconst defaultDecoder = {\n car: async (sthis: SuperThis, payload: Uint8Array) => Result.Ok(payload),\n file: async (sthis: SuperThis, payload: Uint8Array) => Result.Ok(payload),\n meta: async (sthis: SuperThis, payload: Uint8Array) =>\n exception2Result(() => JSON.parse(sthis.txt.decode(payload)) as SerializedMeta[]),\n wal: async (sthis: SuperThis, payload: Uint8Array) =>\n exception2Result(() => JSON.parse(sthis.txt.decode(payload)) as SerializedWAL),\n};\n\nfunction makeFPEnvelope<S>(type: FPEnvelopeType, payload: Result<S>): Result<FPEnvelope<S>> {\n if (payload.isErr()) {\n return Result.Err(payload.Err());\n }\n return Result.Ok({\n type,\n payload: payload.unwrap(),\n });\n}\n\nexport async function fpDeserialize<S>(\n sthis: SuperThis,\n url: URI,\n intoRaw: PromiseToUInt8,\n pdecoder?: Partial<FPDecoder>,\n): Promise<Result<FPEnvelope<S>>> {\n const rraw = await coercePromiseIntoUint8(intoRaw);\n if (rraw.isErr()) {\n return Result.Err(rraw.Err());\n }\n const raw = rraw.unwrap();\n const decoder = {\n ...defaultDecoder,\n ...pdecoder,\n };\n switch (url.getParam(PARAM.STORE)) {\n case \"car\":\n return makeFPEnvelope(FPEnvelopeTypes.CAR, await decoder.car(sthis, raw)) as Result<FPEnvelope<S>>;\n case \"file\":\n return makeFPEnvelope(FPEnvelopeTypes.FILE, await decoder.file(sthis, raw)) as Result<FPEnvelope<S>>;\n case \"wal\":\n return makeFPEnvelope(FPEnvelopeTypes.WAL, await decode2WalState(sthis, await decoder.wal(sthis, raw))) as Result<\n FPEnvelope<S>\n >;\n case \"meta\":\n return makeFPEnvelope(FPEnvelopeTypes.META, await decode2DbMetaEvents(sthis, await decoder.meta(sthis, raw))) as Result<\n FPEnvelope<S>\n >;\n default:\n return sthis.logger.Error().Str(\"store\", url.getParam(PARAM.STORE)).Msg(\"unsupported store\").ResultError();\n }\n}\n","// this enable async codec\n// it should be gone if this in multiformats is merged:\n// https://github.com/multiformats/js-multiformats/pull/305\nimport { bytes as binary, CID, MultihashHasher, BlockView, ByteView, Version, Link, MultihashDigest } from \"multiformats\";\nimport { Block as mfBlock } from \"multiformats/block\";\nimport { AsyncBlockDecoder, AsyncBlockEncoder, BlockDecoder, BlockEncoder } from \"./codec-interface.js\";\n\n// export type Block<T, C extends number, A extends number, V extends Version> = mfBlock<T, C, A, V>\n\nexport const Block = mfBlock;\n\nexport interface DecodeInput<T, Code extends number, Alg extends number> {\n readonly bytes: ByteView<unknown>;\n // readonly hashBytes?: HashBytesGet<T>;\n readonly codec: BlockDecoder<Code, T>;\n readonly hasher: MultihashHasher<Alg>;\n}\n\nexport interface AsyncDecodeInput<T, Code extends number, Alg extends number> {\n readonly bytes: ByteView<unknown>;\n // readonly hashBytes?: AsyncHashBytesGet<T>;\n readonly codec: AsyncBlockDecoder<Code, T>;\n readonly hasher: MultihashHasher<Alg>;\n}\n\nexport async function decode<T, Code extends number, Alg extends number>({\n bytes,\n codec,\n hasher,\n}: AsyncDecodeInput<T, Code, Alg> | DecodeInput<T, Code, Alg>): Promise<BlockView<T, Code, Alg>> {\n if (bytes == null) throw new Error('Missing required argument \"bytes\"');\n if (codec == null || hasher == null) throw new Error(\"Missing required argument: codec or hasher\");\n\n // outer cbor\n const value = (await Promise.resolve(codec.decode(bytes))) as T;\n let toHash = bytes;\n if (codec.valueToHashBytes) {\n toHash = (await Promise.resolve(codec.valueToHashBytes(value))) as ByteView<unknown>;\n }\n const hash = await hasher.digest(toHash);\n const cid = CID.create(1, codec.code, hash) as CID<T, Code, Alg, 1>;\n\n return new mfBlock<T, Code, Alg, 1>({ value, bytes: toHash as ByteView<T>, cid });\n}\n\nexport interface EncodeInput<T, Code extends number, Alg extends number> {\n readonly value: T;\n readonly codec: BlockEncoder<Code, T>;\n // if serializer is not provided, the codec is assumed to be a block encoder\n // if serializer is provided it will run in this order:\n // 1. serializer\n // 2. hasher\n // 3. codec\n // readonly hashBytes?: HashAsBytes<T>;\n readonly hasher: MultihashHasher<Alg>;\n}\n\nexport interface AsyncEncodeInput<T, Code extends number, Alg extends number> {\n readonly value: T;\n readonly codec: AsyncBlockEncoder<Code, T>;\n // if serializer is not provided, the codec is assumed to be a block encoder\n // if serializer is provided it will run in this order:\n // 1. serializer\n // 2. hasher\n // 3. codec\n // readonly hashBytes?: AsyncHashAsBytes<T>;\n readonly hasher: MultihashHasher<Alg>;\n}\n\n/**\n * @template T - Logical type of the data encoded in the block\n * @template Code - multicodec code corresponding to codec used to encode the block\n * @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.\n */\nexport async function encode<T, Code extends number, Alg extends number>({\n value,\n codec,\n hasher,\n}: AsyncEncodeInput<T, Code, Alg> | EncodeInput<T, Code, Alg>): Promise<BlockView<T, Code, Alg>> {\n if (typeof value === \"undefined\") throw new Error('Missing required argument \"value\"');\n if (codec == null || hasher == null) throw new Error(\"Missing required argument: codec or hasher\");\n\n let bytes: ByteView<T>;\n let hash: MultihashDigest;\n if (codec.bytesToHash) {\n const hashable = await Promise.resolve(codec.bytesToHash(value));\n hash = await hasher.digest(hashable);\n bytes = await Promise.resolve(codec.encode(value as T));\n } else {\n bytes = await Promise.resolve(codec.encode(value));\n hash = await hasher.digest(bytes);\n }\n const cid = CID.create(1, codec.code, hash) as CID<T, Code, Alg, 1>;\n return new Block({ value, bytes, cid });\n}\n\ninterface CreateInput<T, Code extends number, Alg extends number, V extends Version> {\n bytes: ByteView<T>;\n cid: Link<T, Code, Alg, V>;\n hasher: MultihashHasher<Alg>;\n codec: BlockDecoder<Code, T>;\n}\n\nexport async function create<T, Code extends number, Alg extends number, V extends Version>({\n bytes,\n cid,\n hasher,\n codec,\n}: CreateInput<T, Code, Alg, V>): Promise<BlockView<T, Code, Alg, V>> {\n if (bytes == null) throw new Error('Missing required argument \"bytes\"');\n if (hasher == null) throw new Error('Missing required argument \"hasher\"');\n const value = await Promise.resolve(codec.decode(bytes));\n const hash = await hasher.digest(bytes);\n if (!binary.equals(cid.multihash.bytes, hash.bytes)) {\n throw new Error(\"CID hash does not match bytes\");\n }\n\n return createUnsafe({\n bytes,\n cid,\n value,\n codec,\n });\n}\n\ntype CreateUnsafeInput<T, Code extends number, Alg extends number, V extends Version> =\n | {\n cid: Link<T, Code, Alg, V>;\n value: T;\n codec?: BlockDecoder<Code, T>;\n bytes: ByteView<T>;\n }\n | {\n cid: Link<T, Code, Alg, V>;\n value?: undefined;\n codec: BlockDecoder<Code, T>;\n bytes: ByteView<T>;\n };\n\n/**\n * @template T - Logical type of the data encoded in the block\n * @template Code - multicodec code corresponding to codec used to encode the block\n * @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.\n * @template V - CID version\n */\nexport async function createUnsafe<T, Code extends number, Alg extends number, V extends Version>({\n bytes,\n cid,\n value: maybeValue,\n codec,\n}: CreateUnsafeInput<T, Code, Alg, V>): Promise<BlockView<T, Code, Alg, V>> {\n const value = await Promise.resolve(maybeValue !== undefined ? maybeValue : codec?.decode(bytes));\n\n if (value === undefined) throw new Error('Missing required argument, must either provide \"value\" or \"codec\"');\n\n return new Block({\n cid: cid as CID<T, Code, Alg, V>,\n bytes,\n value,\n });\n}\n","import type { Block, Link } from \"multiformats\";\nimport { create } from \"./runtime/wait-pr-multiformats/block.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as codec from \"@ipld/dag-cbor\";\n\n// @ts-expect-error \"charwise\" has no types\nimport charwise from \"charwise\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport * as DbIndex from \"prolly-trees/db-index\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { bf, simpleCompare } from \"prolly-trees/utils\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { nocache as cache } from \"prolly-trees/cache\";\n// @ts-expect-error \"prolly-trees\" has no types\nimport { ProllyNode as BaseNode } from \"prolly-trees/db-index\";\n\nimport {\n DocUpdate,\n MapFn,\n DocFragment,\n IndexUpdate,\n QueryOpts,\n IndexRow,\n DocWithId,\n IndexKeyType,\n IndexKey,\n DocTypes,\n DocObject,\n IndexUpdateString,\n CarTransaction,\n CRDT,\n} from \"./types.js\";\nimport { BlockFetcher, AnyLink, AnyBlock } from \"./blockstore/index.js\";\nimport { Logger } from \"@adviser/cement\";\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 && typeof mapReturn !== \"undefined\") {\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 logger: Logger,\n tblocks: CarTransaction,\n inIndex: IndexTree<K, T>,\n indexEntries: (IndexUpdate<K> | IndexUpdateString)[],\n opts: StaticProllyOptions<CT>,\n): Promise<IndexTree<K, T>> {\n logger.Debug().Msg(\"enter bulkIndex\");\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 logger.Debug().Msg(\"exit !root bulkIndex\");\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 logger.Debug().Msg(\"pre bulk bulkIndex\");\n const { root, blocks: newBlocks } = await inIndex.root.bulk(indexEntries);\n if (root) {\n logger.Debug().Msg(\"pre root put bulkIndex\");\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 logger.Debug().Msg(\"pre !root bulkIndex\");\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,\n resp: { result: ProllyIndexRow<K, R>[] },\n query: QueryOpts<K>,\n): Promise<{\n rows: IndexRow<K, T, R>[];\n}> {\n if (query.descending) {\n resp.result = resp.result.reverse();\n }\n if (query.limit) {\n resp.result = resp.result.slice(0, query.limit);\n }\n if (query.includeDocs) {\n resp.result = await Promise.all(\n resp.result.map(async (row) => {\n const val = await crdt.get(row.id);\n const doc = val ? ({ ...val.doc, _id: row.id } as DocWithId<T>) : undefined;\n return { ...row, doc };\n }),\n );\n }\n return {\n rows: resp.result.map(({ key, ...row }) => {\n return {\n key: charwise.decode(key),\n ...row,\n };\n }),\n };\n}\n\nexport function encodeRange(range: [IndexKeyType, IndexKeyType]): [string, string] {\n return [charwise.encode(range[0]), charwise.encode(range[1])];\n}\n\nexport function encodeKey(key: DocFragment): string {\n return charwise.encode(key) as string;\n}\n\nexport interface ProllyIndexRow<K extends IndexKeyType, T extends DocFragment> {\n readonly id: string;\n readonly key: IndexKey<K>;\n readonly value: T;\n}\n\n// ProllyNode type based on the ProllyNode from 'prolly-trees/base'\ninterface ProllyNode<K extends IndexKeyType, T extends DocFragment> extends BaseNode {\n getAllEntries(): PromiseLike<{ [x: string]: unknown; result: ProllyIndexRow<K, T>[] }>;\n getMany<KI extends IndexKeyType>(removeIds: KI[]): Promise<{ /* [x: K]: unknown; */ result: IndexKey<K>[] }>;\n range(a: string, b: string): Promise<{ result: ProllyIndexRow<K, T>[] }>;\n get(key: string): Promise<{ result: ProllyIndexRow<K, T>[] }>;\n bulk(bulk: (IndexUpdate<K> | IndexUpdateString)[]): PromiseLike<{\n readonly root?: ProllyNode<K, T>;\n readonly blocks: Block[];\n }>;\n readonly address: Promise<Link>;\n readonly distance: number;\n compare: (a: unknown, b: unknown) => number;\n readonly cache: unknown;\n readonly block: Promise<Block>;\n}\n\ninterface StaticProllyOptions<T> {\n readonly cache: unknown;\n chunker: (entry: T, distance: number) => boolean;\n readonly codec: unknown;\n readonly hasher: unknown;\n compare: (a: T, b: T) => number;\n}\n","import {\n type ClockHead,\n type DocUpdate,\n type MapFn,\n type IndexUpdate,\n type QueryOpts,\n type IdxMeta,\n type DocFragment,\n type IdxMetaMap,\n type IndexKeyType,\n type IndexRows,\n type DocTypes,\n type IndexUpdateString,\n throwFalsy,\n type IndexTransactionMeta,\n type SuperThis,\n type BaseBlockstore,\n type CRDT,\n type HasCRDT,\n type HasLogger,\n type HasSuperThis,\n type RefLedger,\n} from \"./types.js\";\n// import { 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 { ensureLogger } from \"./utils.js\";\nimport { Logger } from \"@adviser/cement\";\n\nfunction refLedger(u: HasCRDT | RefLedger): u is RefLedger {\n return !!(u as RefLedger).ledger;\n}\n\nexport function index<K extends IndexKeyType = string, T extends DocTypes = NonNullable<unknown>, R extends DocFragment = T>(\n refDb: HasLogger & HasSuperThis & (HasCRDT | RefLedger),\n name: string,\n mapFn?: MapFn<T>,\n meta?: IdxMeta,\n): Index<K, T, R> {\n const crdt = refLedger(refDb) ? refDb.ledger.crdt : refDb.crdt;\n\n if (mapFn && meta) throw refDb.logger.Error().Msg(\"cannot provide both mapFn and meta\").AsError();\n if (mapFn && mapFn.constructor.name !== \"Function\") throw refDb.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>(refDb.sthis, crdt, name, mapFn, meta);\n crdt.indexers.set(name, idx as unknown as Index<K, NonNullable<unknown>, NonNullable<unknown>>);\n }\n return crdt.indexers.get(name) as unknown as Index<K, T, R>;\n}\n\n// interface ByIdIndexIten<K extends IndexKeyType> {\n// readonly key: K;\n// readonly value: [K, K];\n// }\n\nexport class Index<K extends IndexKeyType, T extends DocTypes, R extends DocFragment = T> {\n readonly blockstore: BaseBlockstore;\n readonly crdt: CRDT;\n readonly name: string;\n mapFn?: MapFn<T>;\n mapFnString = \"\";\n byKey: IndexTree<K, R> = new IndexTree<K, R>();\n byId: IndexTree<K, R> = new IndexTree<K, R>();\n indexHead?: ClockHead;\n\n initError?: Error;\n\n ready(): Promise<void> {\n return Promise.all([this.blockstore.ready(), this.crdt.ready()]).then(() => {\n /* noop */\n });\n }\n\n // close(): Promise<void> {\n // return Promise.all([this.blockstore.close(), this.crdt.close()]).then(() => {\n // /* noop */\n // });\n // }\n // destroy(): Promise<void> {\n // return Promise.all([this.blockstore.destroy(), this.crdt.destroy()]).then(() => {\n // /* noop */\n // });\n // }\n\n readonly logger: Logger;\n\n constructor(sthis: SuperThis, crdt: CRDT, name: string, mapFn?: MapFn<T>, meta?: IdxMeta) {\n this.logger = ensureLogger(sthis, \"Index\");\n this.blockstore = crdt.indexBlockstore;\n this.crdt = crdt as CRDT;\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 let mapFnChanged = false;\n\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.mapFnString = meta.map;\n mapFnChanged = true;\n }\n // Always apply the metadata\n this.byId.cid = meta.byId;\n this.byKey.cid = meta.byKey;\n this.indexHead = meta.head;\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 this.mapFn = mapFn;\n this.mapFnString = mapFn.toString();\n mapFnChanged = true;\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 mapFnChanged = true;\n }\n } else {\n // we are first\n this.mapFnString = mapFn.toString();\n }\n this.mapFn = mapFn;\n }\n }\n\n // If the map function changed, reset the index for correctness\n if (mapFnChanged) {\n this._resetIndex();\n }\n } catch (e) {\n this.initError = e as Error;\n }\n }\n\n async query(opts: QueryOpts<K> = {}): Promise<IndexRows<K, T, R>> {\n this.logger.Debug().Msg(\"enter query\");\n await this.ready();\n // this._resetIndex();\n this.logger.Debug().Msg(\"post ready query\");\n await this._updateIndex();\n this.logger.Debug().Msg(\"post _updateIndex query\");\n await this._hydrateIndex();\n this.logger.Debug().Msg(\"post _hydrateIndex query\");\n if (!this.byKey.root) {\n return await applyQuery<K, T, R>(this.crdt, { result: [] }, opts);\n }\n if (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 this.logger.Debug().Msg(\"enter _updateIndex\");\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<T>());\n this.logger.Debug().Msg(\"enter crdt.allDocs\");\n } else {\n ({ result, head } = await this.crdt.changes<T>(this.indexHead));\n this.logger.Debug().Msg(\"enter crdt.changes\");\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 this.logger.Debug().Msg(\"pre this.blockstore.transaction\");\n const { meta } = await this.blockstore.transaction<IndexTransactionMeta>(async (tblocks): Promise<IndexTransactionMeta> => {\n this.byId = await bulkIndex<K, R, K>(\n this.logger,\n tblocks,\n this.byId,\n removeIdIndexEntries.concat(byIdIndexEntries),\n byIdOpts,\n );\n this.byKey = await bulkIndex<K, R, CompareKey>(\n this.logger,\n tblocks,\n this.byKey,\n staleKeyIndexEntries.concat(indexEntries),\n byKeyOpts,\n );\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 this.logger.Debug().Any(\"indexerMeta\", new Array(indexerMeta.indexes?.entries())).Msg(\"exit this.blockstore.transaction fn\");\n return indexerMeta as unknown as IndexTransactionMeta;\n });\n this.logger.Debug().Msg(\"post this.blockstore.transaction\");\n return meta;\n }\n}\n","import { Logger } from \"@adviser/cement\";\nimport { index } from \"./indexer.js\";\nimport type {\n ClockHead,\n MapFn,\n QueryOpts,\n ChangesOptions,\n DocSet,\n DocWithId,\n IndexKeyType,\n ListenerFn,\n DocResponse,\n BulkResponse,\n ChangesResponse,\n DocTypes,\n IndexRows,\n DocFragment,\n ChangesResponseRow,\n CRDTMeta,\n AllDocsQueryOpts,\n AllDocsResponse,\n SuperThis,\n Database,\n Ledger,\n Attachable,\n Attached,\n} from \"./types.js\";\nimport { ensureLogger, NotFoundError, makeName } from \"./utils.js\";\n\nexport function isDatabase(db: unknown): db is Database {\n return db instanceof DatabaseImpl;\n}\n\nexport class DatabaseImpl implements Database {\n onClosed(fn: () => void) {\n this.ledger.onClosed(fn);\n }\n close() {\n return this.ledger.close();\n }\n\n destroy() {\n return this.ledger.destroy();\n }\n\n ready(): Promise<void> {\n return this.ledger.ready();\n }\n\n readonly ledger: Ledger;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly id: string;\n\n constructor(ledger: Ledger) {\n this.sthis = ledger.sthis;\n this.ledger = ledger;\n this.id = ledger.id;\n this.logger = ensureLogger(this.sthis, \"Database\");\n }\n\n attach(a: Attachable): Promise<Attached> {\n return this.ledger.attach(a);\n }\n\n get name() {\n return this.ledger.name;\n }\n async get<T extends DocTypes>(id: string): Promise<DocWithId<T>> {\n if (!id) throw this.logger.Error().Str(\"db\", this.name).Msg(`Doc id is required`).AsError();\n\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"get\");\n try {\n const got = await this.ledger.crdt.get(id);\n if (!got) throw new NotFoundError(`Not found: ${id}`);\n const { doc } = got;\n return { ...(doc as unknown as DocWithId<T>), _id: id };\n } catch (e) {\n throw new NotFoundError(`Not found: ${id} - ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n async put<T extends DocTypes>(doc: DocSet<T>): Promise<DocResponse> {\n await this.ready();\n this.logger.Debug().Str(\"id\", doc._id).Msg(\"put\");\n const { _id, ...value } = doc;\n const docId = _id || this.sthis.timeOrderedNextId().str;\n const result = (await this.ledger.writeQueue.push({\n id: docId,\n value: {\n ...(value as unknown as DocSet<T>),\n _id: docId,\n },\n })) as CRDTMeta;\n return { id: docId, clock: result?.head, name: this.name } as DocResponse;\n }\n\n async bulk<T extends DocTypes>(docs: DocSet<T>[]): Promise<BulkResponse> {\n await this.ready();\n\n const updates = docs.map((doc) => {\n const id = doc._id || this.sthis.timeOrderedNextId().str;\n return {\n id,\n value: {\n ...(doc as unknown as DocSet<T>),\n _id: id,\n },\n };\n });\n const result = (await this.ledger.writeQueue.bulk(updates)) as CRDTMeta;\n return { ids: updates.map((u) => u.id), clock: result.head, name: this.name } as BulkResponse;\n }\n\n async del(id: string): Promise<DocResponse> {\n await this.ready();\n this.logger.Debug().Str(\"id\", id).Msg(\"del\");\n const result = (await this.ledger.writeQueue.push({ id: id, del: true })) as CRDTMeta;\n return { id, clock: result?.head, name: this.name } as DocResponse;\n }\n\n async remove(id: string): Promise<DocResponse> {\n return this.del(id);\n }\n\n async changes<T extends DocTypes>(since: ClockHead = [], opts: ChangesOptions = {}): Promise<ChangesResponse<T>> {\n await this.ready();\n this.logger.Debug().Any(\"since\", since).Any(\"opts\", opts).Msg(\"changes\");\n const { result, head } = await this.ledger.crdt.changes(since, opts);\n const rows: ChangesResponseRow<T>[] = result.map(({ id: key, value, del, clock }) => ({\n key,\n value: (del ? { _id: key, _deleted: true } : { _id: key, ...value }) as DocWithId<T>,\n clock,\n }));\n return { rows, clock: head, name: this.name };\n }\n\n async allDocs<T extends DocTypes>(opts: AllDocsQueryOpts = {}): Promise<AllDocsResponse<T>> {\n await this.ready();\n void opts;\n this.logger.Debug().Msg(\"allDocs\");\n const { result, head } = await this.ledger.crdt.allDocs();\n const rows = result.map(({ id: key, value, del }) => ({\n key,\n value: (del ? { _id: key, _deleted: true } : { _id: key, ...value }) as DocWithId<T>,\n }));\n return { rows, clock: head, name: this.name };\n }\n\n async allDocuments<T extends DocTypes>(): Promise<{\n rows: {\n key: string;\n value: DocWithId<T>;\n }[];\n clock: ClockHead;\n }> {\n return this.allDocs<T>();\n }\n\n subscribe<T extends DocTypes>(listener: ListenerFn<T>, updates?: boolean): () => void {\n return this.ledger.subscribe(listener, updates);\n }\n\n // todo if we add this onto dbs in fireproof.ts then we can make index.ts a separate package\n async query<K extends IndexKeyType, T extends DocTypes, R extends DocFragment = T>(\n field: string | MapFn<T>,\n opts: QueryOpts<K> = {},\n ): Promise<IndexRows<K, T, R>> {\n await this.ready();\n this.logger.Debug().Any(\"field\", field).Any(\"opts\", opts).Msg(\"query\");\n // const _crdt = this.ledger.crdt as unknown as CRDT<T>;\n const idx = typeof field === \"string\" ? index<K, T, R>(this, field) : index<K, T, R>(this, makeName(field.toString()), field);\n return await idx.query(opts);\n }\n\n async compact() {\n await this.ready();\n await this.ledger.crdt.compact();\n }\n}\n","import type { Block } from \"multiformats\";\nimport { Logger, ResolveOnce } from \"@adviser/cement\";\nimport { EncryptedBlockstore, type TransactionMeta, CompactFetcher, toStoreRuntime } from \"./blockstore/index.js\";\nimport {\n clockChangesSince,\n applyBulkUpdateToCrdt,\n getValueFromCrdt,\n readFiles,\n getAllEntries,\n clockVis,\n getBlock,\n doCompact,\n sanitizeDocumentFields,\n} from \"./crdt-helpers.js\";\nimport {\n type DocUpdate,\n type CRDTMeta,\n type ClockHead,\n type ChangesOptions,\n type DocValue,\n type IndexKeyType,\n type DocWithId,\n type Falsy,\n type SuperThis,\n type IndexTransactionMeta,\n type LedgerOpts,\n type BaseBlockstore,\n type CRDT,\n type CRDTClock,\n type CarTransaction,\n type DocTypes,\n PARAM,\n} from \"./types.js\";\nimport { index, type Index } from \"./indexer.js\";\n// import { blockstoreFactory } from \"./blockstore/transaction.js\";\nimport { ensureLogger } from \"./utils.js\";\nimport { CRDTClockImpl } from \"./crdt-clock.js\";\n\nexport class CRDTImpl implements CRDT {\n readonly opts: LedgerOpts;\n\n readonly blockstore: BaseBlockstore;\n readonly indexBlockstore: BaseBlockstore;\n readonly indexers = new Map<string, Index<IndexKeyType, NonNullable<unknown>>>();\n readonly clock: CRDTClock;\n\n readonly logger: Logger;\n readonly sthis: SuperThis;\n // self reference to fullfill HasCRDT\n readonly crdt: CRDT;\n\n constructor(sthis: SuperThis, opts: LedgerOpts) {\n this.sthis = sthis;\n this.crdt = this;\n this.logger = ensureLogger(sthis, \"CRDT\");\n this.opts = opts;\n this.blockstore = new EncryptedBlockstore(sthis, {\n applyMeta: async (meta: TransactionMeta) => {\n const crdtMeta = meta as CRDTMeta;\n if (!crdtMeta.head) throw this.logger.Error().Msg(\"missing head\").AsError();\n await this.clock.applyHead(crdtMeta.head, []);\n },\n compact: async (blocks: CompactFetcher) => {\n await doCompact(blocks, this.clock.head, this.logger);\n return { head: this.clock.head } as TransactionMeta;\n },\n gatewayInterceptor: opts.gatewayInterceptor,\n // autoCompact: this.opts.autoCompact || 100,\n storeRuntime: toStoreRuntime(this.sthis, this.opts.storeEnDe),\n storeUrls: this.opts.storeUrls.data,\n keyBag: this.opts.keyBag,\n // public: this.opts.public,\n meta: this.opts.meta,\n // threshold: this.opts.threshold,\n });\n this.indexBlockstore = new EncryptedBlockstore(sthis, {\n // name: opts.name,\n applyMeta: async (meta: TransactionMeta) => {\n const idxCarMeta = meta as IndexTransactionMeta;\n if (!idxCarMeta.indexes) throw this.logger.Error().Msg(\"missing indexes\").AsError();\n for (const [name, idx] of Object.entries(idxCarMeta.indexes)) {\n index(this, name, undefined, idx);\n }\n },\n gatewayInterceptor: opts.gatewayInterceptor,\n storeRuntime: toStoreRuntime(this.sthis, this.opts.storeEnDe),\n storeUrls: this.opts.storeUrls.idx,\n keyBag: this.opts.keyBag,\n // public: this.opts.public,\n });\n this.clock = new CRDTClockImpl(this.blockstore);\n this.clock.onZoom(() => {\n for (const idx of this.indexers.values()) {\n idx._resetIndex();\n }\n });\n }\n\n async bulk<T extends DocTypes>(updates: DocUpdate<T>[]): Promise<CRDTMeta> {\n await this.ready();\n updates = updates.map((dupdate: DocUpdate<T>) => ({\n ...dupdate,\n value: sanitizeDocumentFields(dupdate.value),\n }));\n\n if (this.clock.head.length === 0) {\n // INJECT GENESIS Block\n const value = { id: PARAM.GENESIS_CID, value: { _id: PARAM.GENESIS_CID } }; // satisfies DocUpdate<DocSet<DocTypes>>;\n // const block = await encode({ value, hasher: sha256, codec: dagCodec });\n await this._bulk([value]);\n }\n return await this._bulk(updates);\n }\n\n async _bulk<T extends DocTypes>(updates: DocUpdate<T>[]): Promise<CRDTMeta> {\n const prevHead = [...this.clock.head];\n const done = await this.blockstore.transaction<CRDTMeta>(async (blocks: CarTransaction): Promise<CRDTMeta> => {\n const { head } = await applyBulkUpdateToCrdt<DocTypes>(\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<DocTypes> });\n return dupdate;\n });\n return { head };\n });\n await this.clock.applyHead(done.meta.head, prevHead, updates);\n return done.meta;\n }\n\n readonly onceReady: ResolveOnce<void> = new ResolveOnce<void>();\n async ready(): Promise<void> {\n return this.onceReady.once(async () => {\n try {\n // console.log(\"bs-ready-pre\")\n // await this.blockstore.ready();\n // console.log(\"bs-ready-post-1\")\n // await this.indexBlockstore.ready();\n // console.log(\"bs-ready-post-2\")\n // await this.clock.ready();\n // console.log(\"bs-ready-post-3\")\n await Promise.all([this.blockstore.ready(), this.indexBlockstore.ready(), this.clock.ready()]);\n } catch (e) {\n throw this.logger.Error().Err(e).Msg(`CRDT is not ready`).AsError();\n }\n });\n }\n\n async close(): Promise<void> {\n // await this.blockstore.close();\n // await this.indexBlockstore.close();\n // await this.clock.close();\n await Promise.all([this.blockstore.close(), this.indexBlockstore.close(), this.clock.close()]);\n }\n\n async destroy(): Promise<void> {\n await Promise.all([this.blockstore.destroy(), this.indexBlockstore.destroy()]);\n }\n\n // if (snap) await this.clock.applyHead(crdtMeta.head, this.clock.head)\n\n async allDocs<T extends DocTypes>(): Promise<{ result: DocUpdate<T>[]; head: ClockHead }> {\n await this.ready();\n const result: DocUpdate<T>[] = [];\n for await (const entry of getAllEntries<DocTypes>(this.blockstore, this.clock.head, this.logger)) {\n result.push(entry as DocUpdate<T>);\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<DocTypes> | Falsy> {\n await this.ready();\n const result = await getValueFromCrdt<DocTypes>(this.blockstore, this.clock.head, key, this.logger);\n if (result.del) return undefined;\n return result;\n }\n\n async changes<T extends DocTypes>(\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","export * from \"./types.js\";\n\nexport * from \"./store-factory.js\";\nexport * from \"./serde-gateway.js\";\nexport * from \"./gateway.js\";\n\nexport * from \"./fp-envelope.js\";\n\nexport * from \"./store-factory.js\";\nexport * from \"./interceptor-gateway.js\";\n\nexport { createDbMetaEvent } from \"./store.js\";\n\nexport * from \"./register-store-protocol.js\";\n\nexport * from \"./attachable-store.js\";\n\nexport * from \"./task-manager.js\";\n\nexport * from \"./uri-interceptor.js\";\n\nexport {\n EncryptedBlockstore,\n BaseBlockstoreImpl,\n CompactionFetcher,\n type BlockFetcher,\n CarTransactionImpl,\n type CarTransactionOpts,\n} from \"./transaction.js\";\nexport { Loader } from \"./loader.js\";\nexport { parseCarFile } from \"./loader-helpers.js\";\n// export { ConnectionBase } from \"./connection-base.js\";\n// export { setCryptoKeyFromGatewayMetaPayload, addCryptoKeyToGatewayMetaPayload } from \"./meta-key-helper.js\";\n","import type { CID, Link, Version } from \"multiformats\";\nimport { Attachable, Attached, CarTransaction, DocFileMeta, Falsy, GatewayUrls, StoreType, SuperThis } from \"../types.js\";\nimport { BlockFetcher } from \"./transaction.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport { KeyBag, KeyBagRuntime, KeysItem } from \"../runtime/key-bag.js\";\nimport { CoerceURI, CryptoRuntime, CTCryptoKey, Future, Logger, Result, URI } from \"@adviser/cement\";\nimport { EventBlock } from \"@web3-storage/pail/clock\";\nimport { TaskManager, TaskManagerParams } from \"./task-manager.js\";\nimport { SerdeGateway, SerdeGatewayInterceptor } from \"./serde-gateway.js\";\nimport { Context } from \"../context.js\";\nimport { AsyncBlockCodec } from \"../runtime/wait-pr-multiformats/codec-interface.js\";\n\nexport type AnyLink = Link<unknown, number, number, Version>;\nexport type CarGroup = AnyLink[];\n// export type CarLog = CarGroup[];\n\nexport type FroozenCarLog = CarGroup[];\nexport class CarLog {\n readonly _logs: CarGroup[] = [];\n\n get length() {\n return this._logs.length;\n }\n last() {\n const x = [...this._logs[this._logs.length - 1]];\n Object.freeze(x);\n return x;\n }\n xunshift(logs: CarGroup) {\n // console.log(\n // \"CarLog-unshift\",\n // logs.map((l) => l.toString()),\n // );\n this._logs.unshift(logs);\n }\n update(logs: FroozenCarLog) {\n // console.log(\n // \"CarLog-update\",\n // logs.map((l) => l.map((l) => l.toString())),\n // );\n this._logs.length = 0;\n this._logs.push(...logs);\n }\n asArray(): FroozenCarLog {\n // in production it should be\n // return this._logs\n\n const a = [\n ...this._logs.map((l) => {\n const x = [...l];\n Object.freeze(x);\n return x;\n }),\n ];\n Object.freeze(a);\n return a;\n }\n}\nexport type AnyAnyLink = Link<unknown, number, number, Version>;\n\nexport type AnyLinkFn = (cid: AnyLink) => Promise<AnyBlock | undefined>;\n\nexport interface AnyBlock {\n readonly cid: Link<unknown, number, number, Version>;\n readonly bytes: Uint8Array;\n}\n\nexport interface CIDBlock {\n readonly cid: CID<unknown, number, number, Version>;\n readonly bytes: Uint8Array;\n}\n\nexport function toCIDBlock(block: AnyBlock): CIDBlock {\n return block as CIDBlock;\n}\nexport interface AnyAnyBlock {\n readonly cid: AnyAnyLink;\n readonly bytes: Uint8Array;\n}\n\n// export interface EncryptOpts {\n// readonly key: ArrayBuffer;\n// readonly cid: AnyLink;\n// readonly bytes: Uint8Array;\n// }\n\nexport interface IvKeyIdData {\n readonly iv: Uint8Array;\n readonly keyId: Uint8Array;\n readonly data: Uint8Array;\n}\n\nexport interface IvAndKeyAndBytes {\n readonly bytes: Uint8Array;\n readonly key: CTCryptoKey;\n readonly iv: Uint8Array;\n}\n\nexport interface BytesAndKeyWithIv {\n readonly bytes: Uint8Array;\n readonly key: CTCryptoKey;\n readonly iv?: Uint8Array;\n}\n\n// export interface DecryptOpts {\n// readonly key: ArrayBuffer;\n// readonly value: IvAndBytes;\n// }\n\nexport interface AnyDecodedBlock {\n readonly cid: AnyLink;\n readonly bytes: Uint8Array;\n readonly value: Uint8Array;\n}\n\nexport interface CarMakeable {\n entries(): AsyncIterable<AnyBlock>;\n get(cid: AnyLink): Promise<AnyBlock | undefined>;\n}\n\nexport interface CarHeader<T> {\n readonly cars: FroozenCarLog;\n readonly compact: FroozenCarLog;\n readonly meta: T;\n}\n\n// type NestedData =\n// | Uint8Array\n// | string\n// | number\n// | boolean\n// | undefined\n// | null\n// | AnyLink\n// | NestedData[]\n// | { [key: string]: NestedData };\n\nexport interface TransactionWrapper<M extends TransactionMeta> {\n meta: M;\n cars?: CarGroup;\n t: CarTransaction;\n}\n\nexport type TransactionMeta = unknown;\n//CRDTMeta | IndexTransactionMeta | FileTransactionMeta;\n\n// export interface MakeCodecCrypto {\n// subtle: {\n// decrypt: (algo: { name: string; iv: Uint8Array; tagLength: number }, key: CryptoKey, data: Uint8Array) => Promise<ArrayBuffer>;\n// encrypt: (algo: { name: string; iv: Uint8Array; tagLength: number }, key: CryptoKey, data: Uint8Array) => Promise<ArrayBuffer>;\n// };\n// }\n\n// an implementation of this Interface contains the keymaterial\n// so that the fp-core can use the decrypt and encrypt without knowing the key\nexport interface EncryptedBlock {\n readonly value: IvAndKeyAndBytes;\n}\n\nexport interface KeyMaterial {\n readonly key: Uint8Array;\n readonly keyStr: string;\n}\n\nexport interface KeyWithFingerPrint {\n readonly fingerPrint: string;\n readonly key: CTCryptoKey;\n extract(): Promise<KeyMaterial>;\n}\n\n// export interface KeyWithFingerExtract extends KeyWithFingerPrint {\n// }\n\nexport interface CodecOpts {\n readonly ivCalc: \"random\" | \"hash\";\n readonly noIVVerify: boolean;\n}\n\nexport interface KeyUpsertResult {\n readonly modified: boolean;\n readonly kfp: KeyWithFingerPrint;\n}\n\nexport interface KeysByFingerprint {\n readonly id: string;\n readonly name: string;\n get(fingerPrint?: Uint8Array | string): Promise<KeyWithFingerPrint | undefined>;\n upsert(key: string | Uint8Array, def?: boolean): Promise<Result<KeyUpsertResult>>;\n asKeysItem(): Promise<KeysItem>;\n}\n\nexport interface CryptoAction {\n readonly ivLength: number; // in bytes only 12 and 16 are allowed\n readonly logger: Logger;\n readonly crypto: CryptoRuntime;\n readonly url: URI;\n readonly key: KeysByFingerprint;\n // readonly codec: BlockCodec<number, IvAndBytes>;\n // readonly isEncrypting: boolean;\n // keyByFingerPrint(id: Uint8Array | string): Promise<Result<KeyWithFingerPrint>>;\n // fingerPrint(): Promise<string>;\n\n algo(iv?: Uint8Array): { name: string; iv: Uint8Array; tagLength: number };\n codec(iv?: Uint8Array, codecOpts?: Partial<CodecOpts>): AsyncBlockCodec<24, Uint8Array, IvKeyIdData>;\n _decrypt(data: IvAndKeyAndBytes): Promise<Uint8Array>;\n _encrypt(data: BytesAndKeyWithIv): Promise<Uint8Array>;\n // encode(data: Uint8Array): Promise<Uint8Array>;\n // decode(bytes: Uint8Array | ArrayBuffer): Promise<Uint8Array>;\n}\n\n// export interface BlobLike {\n// /**\n// * Returns a ReadableStream which yields the Blob data.\n// */\n// stream: () => ReadableStream;\n// }\n\nexport interface StoreFactory {\n // makeMetaStore?: (loader: Loadable) => Promise<MetaStore>;\n // makeDataStore?: (loader: Loadable) => Promise<DataStore>;\n // makeWALStore?: (loader: Loadable) => Promise<WALStore>;\n\n encodeFile?: (blob: Blob) => Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n decodeFile?: (blocks: unknown, cid: AnyLink, meta: DocFileMeta) => Promise<File>;\n}\n\nexport interface StoreUrls {\n // string means local storage\n // URL means schema selects the storeType\n // readonly base: CoerceURI;\n readonly meta: CoerceURI;\n readonly car: CoerceURI;\n readonly file: CoerceURI;\n // readonly index: CoerceURI;\n readonly wal: CoerceURI;\n}\n\n// export interface StoreUrlBaseOpts {\n// readonly base?: CoerceURI;\n// readonly data?: Partial<StoreUrls>\n// readonly idx?: Partial<StoreUrls>\n// }\n\nexport interface StoreEnDeFile {\n readonly encodeFile: (blob: Blob) => Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n readonly decodeFile: (blocks: unknown, cid: AnyLink, meta: DocFileMeta) => Promise<Result<File>>;\n}\n\nexport interface StoreUrlsOpts {\n // readonly urls?: StoreUrlBaseOpts;\n // readonly func?: StoreFactory;\n readonly base?: CoerceURI;\n readonly data?: Partial<StoreUrls>;\n readonly idx?: Partial<StoreUrls>;\n}\n\nexport interface StoreURIs {\n readonly meta: URI;\n readonly car: URI;\n readonly file: URI;\n readonly wal: URI;\n}\n\nexport interface StoreURIRuntime {\n readonly data: StoreURIs;\n readonly idx: StoreURIs;\n}\n\nexport interface UrlAndInterceptor {\n readonly url: URI;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n}\nexport interface StoreFactoryItem {\n // readonly sthis: SuperThis;\n readonly byStore: GatewayUrls;\n // readonly keybag: KeyBag;\n readonly loader: Loadable;\n}\n\nexport interface StoreRuntime {\n // readonly isIndex?: string; // index prefix\n //xx readonly stores: Partial<Stores>;\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 ledger connection\n // for all stores a refcount on close() should be used\n // makeMetaStore(sfi: StoreFactoryItem): Promise<MetaStore>;\n // makeDataStore(sfi: StoreFactoryItem): Promise<DataStore>;\n // makeWALStore(sfi: StoreFactoryItem): Promise<WALStore>;\n\n makeStores(sfi: StoreFactoryItem): Promise<DataAndMetaAndWalStore>;\n\n encodeFile(blob: Blob): Promise<{ cid: AnyLink; blocks: AnyBlock[] }>;\n decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<Result<File>>;\n}\n\nexport interface CommitOpts {\n readonly noLoader?: boolean;\n readonly compact?: boolean;\n // readonly public?: boolean;\n}\n\n// export interface DbMetaWithSource extends DbMeta {\n// readonly srcUrls: {\n// readonly car: string\n// readonly file: string\n// readonly meta: string\n// readonly local?: string\n// }[]\n// }\n\nexport interface WriteableDataAndMetaStore {\n file: FileStore;\n car: CarStore;\n meta: MetaStore;\n}\n\nexport type DataAndMetaStore = Readonly<WriteableDataAndMetaStore>;\n\nexport interface WriteableDataAndMetaAndWalStore extends WriteableDataAndMetaStore {\n wal?: WALStore;\n}\n\nexport type DataAndMetaAndWalStore = Readonly<WriteableDataAndMetaAndWalStore>;\n\nexport type LocalDataAndMetaAndWalStore = Readonly<Omit<WriteableDataAndMetaAndWalStore, \"wal\">> & { readonly wal: WALStore };\n\n// export interface DbMetaLocalRemoteStores extends DbMeta {\n// readonly store: {\n// readonly local: DataAndMetaStore;\n// readonly remotes: DataAndMetaStore[];\n// };\n// }\n\nexport interface DbMeta {\n readonly cars: CarGroup;\n // key?: string;\n}\n\n// export interface UploadMetaFnParams {\n// readonly name: string;\n// readonly branch: string;\n// }\n\n// export type FnParamTypes = \"data\" | \"file\";\n\n// export interface UploadDataFnParams {\n// readonly type: FnParamTypes;\n// readonly name: string;\n// readonly car: string;\n// readonly size: string;\n// }\n\n// export interface DownloadDataFnParams {\n// readonly type: FnParamTypes;\n// readonly name: string;\n// readonly car: string;\n// }\n\n// export interface DownloadMetaFnParams {\n// readonly name: string;\n// readonly branch: string;\n// }\n\nexport type LoadHandler = (dbMetas: DbMeta[]) => Promise<void>;\n\nexport interface RefLoadable {\n readonly loader: Loadable;\n}\nexport interface RefBlockstore {\n readonly blockstore: RefLoadable;\n}\n\nexport interface Connection {\n // readonly loader?: Loadable;\n // connectMeta(ref: RefLoadable | RefBlockstore): void;\n\n // this indicates if a store is completely loaded from a peer\n loaded(): Future<void>;\n readonly context: Context;\n connectStorage(ref: RefLoadable | RefBlockstore): void;\n\n // metaUpload(bytes: Uint8Array, params: UploadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n // dataUpload(bytes: Uint8Array, params: UploadDataFnParams, opts?: { public?: boolean }): Promise<void>;\n // metaDownload(params: DownloadMetaFnParams): Promise<Uint8Array[] | Falsy>;\n // dataDownload(params: DownloadDataFnParams): Promise<Uint8Array | Falsy>;\n}\n\nexport interface BaseStore {\n readonly storeType: StoreType;\n readonly realGateway: SerdeGateway;\n readonly logger: Logger;\n // readonly url: URI\n url(): URI;\n // readonly name: string;\n // onStarted(fn: () => void): void;\n // onClosed(fn: () => void): void;\n\n keyedCrypto(): Promise<CryptoAction>;\n\n close(): Promise<Result<void>>;\n destroy(): Promise<Result<void>>;\n readonly ready?: () => Promise<void>;\n start(dam: DataAndMetaStore): Promise<Result<URI>>;\n}\n\nexport interface DbMetaEvent {\n readonly eventCid: CarClockLink;\n readonly parents: CarClockHead;\n readonly dbMeta: DbMeta;\n}\n\nexport function DbMetaEventEqual(a: DbMetaEvent, b: DbMetaEvent): boolean {\n return (\n a.eventCid.equals(b.eventCid) &&\n a.parents.length === b.parents.length &&\n a.parents.every((p, i) => p.equals(b.parents[i])) &&\n a.dbMeta.cars.length === b.dbMeta.cars.length &&\n a.dbMeta.cars.every((c, i) => c.equals(b.dbMeta.cars[i]))\n );\n}\n\nexport function DbMetaEventsEqual(a: DbMetaEvent[], b: DbMetaEvent[]): boolean {\n return a.length === b.length && a.every((e, i) => DbMetaEventEqual(e, b[i]));\n}\n\nexport interface MetaStore extends BaseStore {\n readonly storeType: \"meta\";\n load(branch?: string): Promise<DbMeta[] | Falsy>;\n // branch is defaulted to \"main\"\n save(meta: DbMeta, branch?: string): Promise<Result<void>>;\n // onLoad(branch: string, loadHandler: LoadHandler): () => void;\n // handleByteHeads(byteHeads: Uint8Array, branch?: string): Promise<DbMetaEvent[]>;\n}\n\n// export interface RemoteMetaStore extends MetaStore {\n// }\n\nexport interface DataSaveOpts {\n readonly public: boolean;\n}\n\nexport interface CarStore extends BaseStore {\n readonly storeType: \"car\";\n load(cid: AnyLink): Promise<AnyBlock>;\n save(car: AnyBlock, opts?: DataSaveOpts): Promise</*AnyLink | */ void>;\n remove(cid: AnyLink): Promise<Result<void>>;\n}\n\nexport interface FileStore extends BaseStore {\n readonly storeType: \"file\";\n load(cid: AnyLink): Promise<AnyBlock>;\n save(car: AnyBlock, opts?: DataSaveOpts): Promise</*AnyLink | */ void>;\n remove(cid: AnyLink): Promise<Result<void>>;\n}\n\nexport interface WALState {\n readonly operations: DbMeta[];\n readonly noLoaderOps: DbMeta[];\n readonly fileOperations: {\n readonly cid: AnyLink;\n readonly public: boolean;\n }[];\n}\n\nexport interface WALStore extends BaseStore {\n readonly storeType: \"wal\";\n ready(): Promise<void>;\n readonly processing?: Promise<void> | undefined;\n readonly processQueue: CommitQueue<void>;\n\n process(): Promise<void>;\n enqueue(dbMeta: DbMeta, opts: CommitOpts): Promise<void>;\n enqueueFile(fileCid: AnyLink /*, publicFile?: boolean*/): Promise<void>;\n load(): Promise<WALState | Falsy>;\n save(state: WALState): Promise<void>;\n}\n\nexport type CompactFetcher = BlockFetcher & {\n readonly loggedBlocks: CarTransaction;\n};\nexport type CompactFn = (blocks: CompactFetcher) => Promise<TransactionMeta>;\n\nexport interface StoreRuntimeUrls {\n readonly meta: URI;\n readonly data: URI;\n readonly wal: URI;\n}\n\nexport interface BlockstoreParams {\n readonly logger: Logger;\n readonly applyMeta: (meta: TransactionMeta, snap?: boolean) => Promise<void>;\n readonly compact: CompactFn;\n readonly autoCompact: number;\n readonly crypto: CryptoRuntime;\n readonly public: boolean;\n readonly meta: DbMeta;\n readonly threshold: number;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n readonly storeEnDeFile: Partial<StoreEnDeFile>;\n readonly keyBag: KeyBagRuntime;\n readonly storeUrls: StoreURIs;\n readonly storeRuntime: StoreRuntime;\n readonly taskManager: TaskManagerParams;\n}\n\nexport type BlockstoreOpts = Partial<BlockstoreParams> & {\n readonly keyBag: KeyBagRuntime;\n readonly storeUrls: StoreURIs;\n readonly storeRuntime: StoreRuntime;\n};\n\nexport interface BlockstoreRuntime {\n readonly logger: Logger;\n readonly applyMeta: (meta: TransactionMeta, snap?: boolean) => Promise<void>;\n readonly compact: CompactFn;\n readonly autoCompact: number;\n readonly crypto: CryptoRuntime;\n readonly storeRuntime: StoreRuntime;\n readonly keyBag: KeyBagRuntime;\n readonly storeUrls: StoreURIs;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n readonly taskManager: TaskManagerParams;\n // readonly storeEnDeFile: StoreEnDeFile;\n // readonly public: boolean;\n readonly meta?: DbMeta;\n // readonly name?: string;\n readonly threshold: number;\n}\n\nexport type LocalActiveStore = Omit<ActiveStore, \"active\"> & { readonly active: LocalDataAndMetaAndWalStore };\nexport interface AttachedStores {\n // fileStore(): Promise<DataStore>;\n // carStore(): Promise<DataStore>;\n // metaStore(): Promise<MetaStore>;\n\n local(): LocalActiveStore;\n forRemotes(actionFn: (store: ActiveStore) => Promise<unknown>): Promise<void>;\n remotes(): ActiveStore[];\n activate(store: DataAndMetaStore | CoerceURI): ActiveStore;\n attach(attached: Attachable): Promise<Attached>;\n detach(): Promise<void>;\n}\n\nexport interface BaseAttachedStores {\n local(): BaseStore;\n // without local and active\n remotes(): BaseStore[];\n}\n\nexport interface CarAttachedStores extends BaseAttachedStores {\n local(): CarStore;\n // without local and active\n remotes(): CarStore[];\n}\n\nexport abstract class BaseActiveStore {\n abstract readonly ref: ActiveStore;\n abstract readonly active: BaseStore;\n\n // readonly local: ActiveStore;\n // readonly remotes: ActiveStore[];\n\n abstract local(): BaseStore;\n abstract remotes(): BaseStore[];\n\n protected abstract readonly xattached: BaseAttachedStores;\n}\n\n// export abstract class CarActiveStore extends BaseActiveStore {\n// readonly ref: ActiveStore;\n// readonly active: CarStore;\n// readonly xattached: CarAttachedStores;\n// }\n\nexport interface FileAttachedStores extends BaseAttachedStores {\n local(): FileStore;\n // without local and active\n remotes(): FileStore[];\n}\n\nexport abstract class CarActiveStore extends BaseActiveStore {\n // readonly ref: ActiveStore;\n // readonly active: CarStore;\n protected abstract readonly xattached: CarAttachedStores;\n abstract local(): CarStore;\n abstract remotes(): CarStore[];\n}\n\nexport abstract class FileActiveStore extends BaseActiveStore {\n // readonly ref: ActiveStore;\n // readonly active: FileStore;\n protected abstract readonly xattached: FileAttachedStores;\n abstract local(): FileStore;\n abstract remotes(): FileStore[];\n}\n\nexport type CIDActiveStore = CarActiveStore | FileActiveStore;\n\nexport interface MetaAttachedStores extends BaseAttachedStores {\n local(): MetaStore;\n remotes(): MetaStore[];\n}\n\nexport abstract class MetaActiveStore extends BaseActiveStore {\n // readonly ref: ActiveStore;\n // readonly active: MetaStore;\n protected abstract readonly xattached: MetaAttachedStores;\n abstract local(): MetaStore;\n abstract remotes(): MetaStore[];\n}\n\nexport interface WALAttachedStores extends BaseAttachedStores {\n local(): WALStore;\n remotes(): WALStore[];\n}\n\nexport abstract class WALActiveStore extends BaseActiveStore {\n // readonly ref: ActiveStore;\n // readonly active: WALStore;\n protected abstract readonly xattached: WALAttachedStores;\n abstract local(): WALStore;\n abstract remotes(): WALStore[];\n}\n\nexport interface ActiveStore {\n readonly active: DataAndMetaAndWalStore;\n baseStores(): BaseStore[];\n carStore(): CarActiveStore;\n fileStore(): FileActiveStore;\n metaStore(): MetaActiveStore;\n walStore(): WALActiveStore;\n\n local(): LocalActiveStore;\n remotes(): ActiveStore[];\n\n readonly xattached: AttachedStores;\n}\n\nexport interface CarCacheItem {\n readonly type: \"car\" | \"block\";\n readonly cid: AnyLink;\n readonly blocks: AnyBlock[];\n readonly roots: CID[];\n}\n\nexport interface Loadable {\n // readonly name: string; // = \"\";\n readonly sthis: SuperThis;\n readonly ebOpts: BlockstoreRuntime;\n readonly carLog: CarLog;\n\n // xremoteMetaStore?: MetaStore;\n // xremoteFileStore?: DataStore;\n // xremoteCarStore?: DataStore;\n\n readonly attachedStores: AttachedStores;\n\n attach(attached: Attachable): Promise<Attached>;\n\n readonly taskManager: TaskManager;\n\n ready(): Promise<void>;\n close(): Promise<void>;\n\n keyBag(): Promise<KeyBag>;\n // metaStore(): Promise<MetaStore>;\n // fileStore(): Promise<DataStore>;\n // WALStore(): Promise<WALStore>;\n // carStore(): Promise<DataStore>;\n\n handleDbMetasFromStore(metas: DbMeta[], store: ActiveStore): Promise<void>;\n\n commit<T = TransactionMeta>(t: CarTransaction, done: T, opts: CommitOpts): Promise<CarGroup>;\n destroy(): Promise<void>;\n getBlock(cid: AnyLink, store: ActiveStore): Promise<AnyBlock | Falsy>;\n loadFileCar(cid: AnyLink /*, isPublic = false*/, store: ActiveStore): Promise<CarCacheItem>;\n loadCar(cid: AnyLink, store: ActiveStore): Promise<CarCacheItem>;\n commitFiles(\n t: CarTransaction,\n done: TransactionMeta /* opts: CommitOpts = { noLoader: false, compact: false } */,\n ): Promise<CarGroup>;\n entries(cache?: boolean): AsyncIterableIterator<AnyBlock>;\n}\n\nexport interface DbMetaBinary {\n readonly dbMeta: Uint8Array;\n}\nexport type DbMetaEventBlock = EventBlock<DbMetaBinary>;\nexport type CarClockLink = Link<DbMetaEventBlock, number, number, Version>;\nexport type CarClockHead = CarClockLink[];\n","import { Logger, URI, Result } from \"@adviser/cement\";\n\nimport { decodeFile, encodeFile } from \"../runtime/files.js\";\nimport { CarStoreImpl, FileStoreImpl, MetaStoreImpl, WALStoreImpl } from \"./store.js\";\nimport {\n BaseStore,\n CarStore,\n DataAndMetaAndWalStore,\n FileStore,\n StoreEnDeFile,\n StoreFactoryItem,\n StoreRuntime,\n UrlAndInterceptor,\n WriteableDataAndMetaAndWalStore,\n} from \"./types.js\";\nimport { PARAM, SuperThis } from \"../types.js\";\nimport { getGatewayFactoryItem } from \"./register-store-protocol.js\";\nimport { SerdeGatewayCtx, SerdeGatewayInterceptor } from \"./serde-gateway.js\";\nimport { InterceptorGateway } from \"./interceptor-gateway.js\";\n\n// interface SerdeGatewayInstances {\n// readonly gateway: InterceptorGateway;\n// }\n// interface GatewayReady extends SerdeGatewayInstances {\n// // readonly url: URI;\n// }\n\nexport async function getInterceptableGateway(\n ctx: SerdeGatewayCtx,\n url: URI,\n opt: { gatewayInterceptor?: SerdeGatewayInterceptor },\n): Promise<Result<InterceptorGateway>> {\n const item = getGatewayFactoryItem(url.protocol);\n if (item) {\n return Result.Ok(new InterceptorGateway(ctx.loader.sthis, await item.serdegateway(ctx.loader.sthis), opt.gatewayInterceptor));\n }\n return Result.Err(ctx.loader.sthis.logger.Warn().Url(url).Msg(\"unsupported protocol\").AsError());\n}\n\nasync function carStoreFactory(ctx: SerdeGatewayCtx, uai: UrlAndInterceptor): Promise<CarStore> {\n const storeUrl = uai.url.build().setParam(PARAM.STORE, \"car\").URI();\n const rgateway = await getInterceptableGateway(ctx, storeUrl, uai);\n if (rgateway.isErr()) {\n throw ctx.loader.sthis.logger.Error().Result(\"err\", rgateway).Url(uai.url).Msg(\"notfound\").AsError();\n }\n const gateway = rgateway.Ok();\n const store = new CarStoreImpl(ctx.loader.sthis, uai.url, {\n gateway,\n loader: ctx.loader,\n });\n return store;\n}\n\nasync function fileStoreFactory(ctx: SerdeGatewayCtx, uai: UrlAndInterceptor): Promise<FileStore> {\n const storeUrl = uai.url.build().setParam(PARAM.STORE, \"file\").URI();\n const rgateway = await getInterceptableGateway(ctx, storeUrl, uai);\n if (rgateway.isErr()) {\n throw ctx.loader.sthis.logger.Error().Result(\"err\", rgateway).Url(uai.url).Msg(\"notfound\").AsError();\n }\n const gateway = rgateway.Ok();\n const store = new FileStoreImpl(ctx.loader.sthis, uai.url, {\n gateway: gateway,\n loader: ctx.loader,\n });\n return store;\n}\n\n// const onceLoadMetaGateway = new KeyedResolvOnce<Gateway>();\n// function loadMetaGateway(url: URI, logger: Logger) {\n// return onceLoadMetaGateway.get(url.protocol).once(async () => {\n// return await getGatewayFromURL(url, logger).then((item) => {\n// if (!item) {\n// throw logger.Error().Url(url).Msg(\"unsupported protocol or store\").AsError();\n// }\n// return item;\n// });\n// });\n// }\n\n// const onceMetaStoreFactory = new KeyedResolvOnce<MetaStoreImpl>();\nasync function metaStoreFactory(ctx: SerdeGatewayCtx, uai: UrlAndInterceptor): Promise<MetaStoreImpl> {\n const storeUrl = uai.url.build().setParam(PARAM.STORE, \"meta\").URI();\n const rgateway = await getInterceptableGateway(ctx, storeUrl, uai);\n if (rgateway.isErr()) {\n throw ctx.loader.sthis.logger.Error().Result(\"err\", rgateway).Url(uai.url).Msg(\"notfound\").AsError();\n }\n const gateway = rgateway.Ok();\n const store = new MetaStoreImpl(ctx.loader.sthis, uai.url, {\n gateway,\n loader: ctx.loader,\n });\n return store;\n}\n\n// const onceWalGateway = new KeyedResolvOnce<Gateway>();\n// function loadWalGateway(url: URI, logger: Logger) {\n// return onceWalGateway.get(url.protocol).once(async () => {\n// return await getGatewayFromURL(url, logger).then((item) => {\n// if (!item) {\n// throw logger.Error().Url(url).Msg(\"unsupported protocol or store\").AsError();\n// }\n// return item;\n// });\n// });\n// }\n\n// const onceRemoteWalFactory = new KeyedResolvOnce<WALStoreImpl>();\nasync function WALStoreFactory(ctx: SerdeGatewayCtx, uai: UrlAndInterceptor): Promise<WALStoreImpl> {\n const storeUrl = uai.url.build().setParam(PARAM.STORE, \"wal\").URI();\n const rgateway = await getInterceptableGateway(ctx, storeUrl, uai);\n if (rgateway.isErr()) {\n throw ctx.loader.sthis.logger.Error().Result(\"err\", rgateway).Url(uai.url).Msg(\"notfound\").AsError();\n }\n const gateway = rgateway.Ok();\n const store = new WALStoreImpl(ctx.loader.sthis, uai.url, {\n gateway,\n loader: ctx.loader,\n });\n return store;\n}\n\nasync function ensureStart<T extends Pick<BaseStore, \"start\"> & { logger: Logger }>(\n store: T,\n damaw: DataAndMetaAndWalStore,\n): Promise<T> {\n const ret = await store.start(damaw);\n if (ret.isErr()) {\n throw store.logger.Error().Result(\"start\", ret).Msg(\"start failed\").AsError();\n }\n store.logger.Debug().Url(ret.Ok(), \"prepared\").Msg(\"produced\");\n return store;\n}\n\nexport function ensureStoreEnDeFile(ende?: Partial<StoreEnDeFile>): StoreEnDeFile {\n ende = ende || {};\n return {\n encodeFile: ende.encodeFile || encodeFile,\n decodeFile: ende.decodeFile || decodeFile,\n };\n}\n\nexport function toStoreRuntime(sthis: SuperThis, endeOpts: Partial<StoreEnDeFile> = {}): StoreRuntime {\n // const logger = ensureLogger(sthis, \"toStoreRuntime\", {});\n return {\n makeStores: async (sfi: StoreFactoryItem) => {\n const ctx: SerdeGatewayCtx = {\n loader: sfi.loader,\n };\n const storeSet: WriteableDataAndMetaAndWalStore = {} as DataAndMetaAndWalStore;\n storeSet.meta = await metaStoreFactory(ctx, sfi.byStore.meta);\n storeSet.car = await carStoreFactory(ctx, sfi.byStore.car);\n storeSet.file = await fileStoreFactory(ctx, sfi.byStore.file);\n if (sfi.byStore.wal) {\n storeSet.wal = await WALStoreFactory(ctx, sfi.byStore.wal);\n }\n\n await ensureStart(storeSet.meta, storeSet);\n await ensureStart(storeSet.car, storeSet);\n await ensureStart(storeSet.file, storeSet);\n if (storeSet.wal) {\n await ensureStart(storeSet.wal, storeSet);\n }\n\n return storeSet;\n },\n\n // makeMetaStore: async (sfi: StoreFactoryItem) => ensureStart(await metaStoreFactory(sfi)),\n // makeDataStore: async (sfi: StoreFactoryItem) => ensureStart(await dataStoreFactory(sfi)),\n // makeWALStore: async (sfi: StoreFactoryItem) => ensureStart(await WALStoreFactory(sfi)),\n\n ...ensureStoreEnDeFile(endeOpts),\n };\n}\n","import { exception2Result, Logger, ResolveOnce, Result, URI } from \"@adviser/cement\";\nimport type {\n AnyBlock,\n AnyLink,\n CommitOpts,\n DataSaveOpts,\n DbMeta,\n WALStore as WALStore,\n WALState,\n LoadHandler,\n CryptoAction,\n Loadable,\n CarClockHead,\n DbMetaBinary,\n CarClockLink,\n DbMetaEvent,\n MetaStore,\n DataAndMetaStore,\n CarStore,\n FileStore,\n} from \"./types.js\";\nimport { Falsy, PARAM, StoreType, SuperThis } from \"../types.js\";\nimport { SerdeGateway, SerdeGatewayInterceptor } from \"./serde-gateway.js\";\nimport { ensureLogger, inplaceFilter, isNotFoundError } from \"../utils.js\";\nimport { carLogIncludesGroup } from \"./loader.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport { keyedCryptoFactory } from \"../runtime/keyed-crypto.js\";\nimport { Car2FPMsg, File2FPMsg, FPEnvelopeCar, FPEnvelopeFile, FPEnvelopeMeta, FPEnvelopeWAL } from \"./fp-envelope.js\";\nimport { EventView } from \"@web3-storage/pail/clock/api\";\nimport { EventBlock } from \"@web3-storage/pail/clock\";\nimport { format } from \"@ipld/dag-json\";\n// import { createDbMetaEventBlock } from \"./meta-key-helper.js\";\nimport pRetry from \"p-retry\";\nimport pMap from \"p-map\";\nimport { Link } from \"multiformats\";\nimport { InterceptorGateway } from \"./interceptor-gateway.js\";\n\nfunction guardVersion(url: URI): Result<URI> {\n if (!url.hasParam(\"version\")) {\n return Result.Err(`missing version: ${url.toString()}`);\n }\n return Result.Ok(url);\n}\n\nexport interface StoreOpts {\n readonly gateway: SerdeGateway;\n // readonly keybag: KeyBag;\n readonly gatewayInterceptor?: SerdeGatewayInterceptor;\n readonly loader: Loadable;\n}\n\nexport interface BaseStoreOpts {\n readonly gateway: InterceptorGateway;\n readonly loader: Loadable;\n}\n\nexport abstract class BaseStoreImpl {\n // should be injectable\n\n abstract readonly storeType: StoreType;\n // readonly name: string;\n\n private _url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly gateway: InterceptorGateway;\n get realGateway(): SerdeGateway {\n return this.gateway.innerGW;\n }\n // readonly keybag: KeyBag;\n readonly opts: StoreOpts;\n readonly loader: Loadable;\n // readonly loader: Loadable;\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts, logger: Logger) {\n // this.name = name;\n this._url = url;\n this.opts = opts;\n // this.keybag = opts.keybag;\n this.loader = opts.loader;\n this.sthis = sthis;\n const name = this._url.getParam(PARAM.NAME);\n if (!name) {\n throw logger.Error().Url(this._url).Msg(\"missing name\").AsError();\n }\n this.logger = logger\n .With()\n .Str(\"this\", this.sthis.nextId().str)\n .Ref(\"url\", () => this._url.toString())\n // .Str(\"name\", name)\n .Logger();\n // this.realGateway = opts.gateway;\n this.gateway = opts.gateway;\n }\n\n url(): URI {\n return this._url;\n }\n\n readonly _onStarted: ((dam: DataAndMetaStore) => void)[] = [];\n onStarted(fn: (dam: DataAndMetaStore) => void) {\n this._onStarted.push(fn);\n }\n readonly _onClosed: (() => void)[] = [];\n onClosed(fn: () => void) {\n this._onClosed.push(fn);\n }\n abstract close(): Promise<Result<void>>;\n\n async ready() {\n return;\n }\n\n async keyedCrypto(): Promise<CryptoAction> {\n return keyedCryptoFactory(this._url, await this.loader.keyBag(), this.sthis);\n }\n\n async start(dam: DataAndMetaStore): Promise<Result<URI>> {\n this.logger.Debug().Str(\"storeType\", this.storeType).Msg(\"starting-gateway-pre\");\n this._url = this._url.build().setParam(PARAM.STORE, this.storeType).URI();\n const res = await this.gateway.start({ loader: this.loader }, this._url);\n if (res.isErr()) {\n this.logger.Error().Result(\"gw-start\", res).Msg(\"started-gateway\");\n return res as Result<URI>;\n }\n this._url = res.Ok();\n\n // add storekey to url\n const kb = await this.loader.keyBag();\n const skRes = await kb.ensureKeyFromUrl(this._url, () => {\n const key = this._url.getParam(PARAM.KEY);\n return key as string;\n });\n\n if (skRes.isErr()) {\n return skRes as Result<URI>;\n }\n this._url = skRes.Ok();\n const version = guardVersion(this._url);\n if (version.isErr()) {\n this.logger.Error().Result(\"version\", version).Msg(\"guardVersion\");\n await this.close();\n return version;\n }\n if (this.ready) {\n const fn = this.ready.bind(this);\n const ready = await exception2Result(fn);\n if (ready.isErr()) {\n await this.close();\n return ready as Result<URI>;\n }\n }\n this._onStarted.forEach((fn) => fn(dam));\n this.logger.Debug().Msg(\"started\");\n return version;\n }\n}\n\nexport async function createDbMetaEvent(sthis: SuperThis, dbMeta: DbMeta, parents: CarClockHead): Promise<DbMetaEvent> {\n const event = await EventBlock.create<DbMetaBinary>(\n {\n dbMeta: sthis.txt.encode(format(dbMeta)),\n },\n parents as unknown as Link<EventView<DbMetaBinary>, number, number, 1>[],\n );\n return {\n eventCid: event.cid as CarClockLink,\n dbMeta,\n parents,\n };\n}\n\nexport class MetaStoreImpl extends BaseStoreImpl implements MetaStore {\n readonly storeType = \"meta\";\n readonly subscribers = new Map<string, LoadHandler[]>();\n parents: CarClockHead = [];\n // remote: boolean;\n\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts) {\n // const my = new URL(url.toString());\n // my.searchParams.set(\"storekey\", 'insecure');\n super(sthis, url, { ...opts }, ensureLogger(sthis, \"MetaStoreImpl\"));\n // this.remote = !!remote;\n if (/*this.remote && */ opts.gateway.subscribe) {\n this.onStarted(async (dam) => {\n this.logger.Debug().Str(\"url\", this.url().toString()).Msg(\"Subscribing to the gateway\");\n opts.gateway.subscribe({ loader: this.loader }, this.url(), async ({ payload: dbMetas }: FPEnvelopeMeta) => {\n this.logger.Debug().Msg(\"Received message from gateway\");\n await Promise.all(\n dbMetas.map((dbMetaEv) =>\n this.loader.taskManager?.handleEvent(\n dbMetaEv.eventCid,\n dbMetaEv.parents,\n dbMetaEv.dbMeta,\n this.loader.attachedStores.activate(dam),\n ),\n ),\n );\n this.updateParentsFromDbMetas(dbMetas);\n });\n });\n }\n }\n\n private updateParentsFromDbMetas(dbMetas: DbMetaEvent[]) {\n const cids = dbMetas.map((m) => m.eventCid);\n const dbMetaParents = dbMetas.flatMap((m) => m.parents);\n const uniqueParentsMap = new Map([...this.parents, ...cids].map((p) => [p.toString(), p]));\n const dbMetaParentsSet = new Set(dbMetaParents.map((p) => p.toString()));\n this.parents = Array.from(uniqueParentsMap.values()).filter((p) => !dbMetaParentsSet.has(p.toString()));\n }\n\n // async handleByteHeads(byteHeads: Uint8Array) {\n // // return await decodeGatewayMetaBytesToDbMeta(this.sthis, byteHeads);\n // const rDbMeta = await fpDeserialize(this.sthis, byteHeads, this.url());\n // if (rDbMeta.isErr()) {\n // throw this.logger.Error().Err(rDbMeta).Msg(\"error deserializing\").AsError();\n // }\n // return (rDbMeta.Ok() as FPEnvelopeMeta).payload;\n // }\n\n async load(branch = \"main\"): Promise<DbMeta[] | Falsy> {\n const url = await this.gateway.buildUrl({ loader: this.loader }, this.url(), branch);\n if (url.isErr()) {\n throw this.logger.Error().Result(\"buildUrl\", url).Str(\"branch\", branch).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const rfpEnv = await this.gateway.get({ loader: this.loader }, url.Ok());\n if (rfpEnv.isErr()) {\n if (isNotFoundError(rfpEnv)) {\n return undefined;\n }\n throw this.logger.Error().Url(url.Ok()).Err(rfpEnv).Msg(\"gateway get\").AsError();\n }\n const fpMeta = (rfpEnv.Ok() as FPEnvelopeMeta).payload;\n // const dbMetas = await this.handleByteHeads(fpMeta);\n const dbMetas = fpMeta.map((m) => m.dbMeta);\n await this.loader.handleDbMetasFromStore(dbMetas, this.loader.attachedStores.activate(url.Ok()));\n this.updateParentsFromDbMetas(fpMeta);\n return dbMetas;\n }\n\n async save(meta: DbMeta, branch?: string): Promise<Result<void>> {\n branch = branch || \"main\";\n this.logger.Debug().Str(\"branch\", branch).Any(\"meta\", meta).Msg(\"saving meta\");\n\n // const fpMetas = await encodeEventsWithParents(this.sthis, [event], this.parents);\n const url = await this.gateway.buildUrl({ loader: this.loader }, this.url(), branch);\n if (url.isErr()) {\n throw this.logger.Error().Err(url.Err()).Str(\"branch\", branch).Msg(\"got error from gateway.buildUrl\").AsError();\n }\n const dbMetaEvent = await createDbMetaEvent(this.sthis, meta, this.parents);\n const res = await this.gateway.put({ loader: this.loader }, url.Ok(), {\n type: \"meta\",\n payload: [dbMetaEvent],\n } as FPEnvelopeMeta);\n if (res.isErr()) {\n throw this.logger.Error().Err(res.Err()).Msg(\"got error from gateway.put\").AsError();\n }\n // await this.loader.handleDbMetasFromStore([meta]);\n // this.loader.taskManager?.eventsWeHandled.add(event.cid.toString());\n return res;\n }\n\n async close(): Promise<Result<void>> {\n await this.gateway.close({ loader: this.loader }, this.url());\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n async destroy(): Promise<Result<void>> {\n this.logger.Debug().Msg(\"destroy\");\n return this.gateway.destroy({ loader: this.loader }, this.url());\n }\n}\n\nabstract class DataStoreImpl extends BaseStoreImpl {\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts, logger: Logger) {\n super(sthis, url, { ...opts }, logger);\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({ loader: this.loader }, 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({ loader: this.loader }, url.Ok());\n if (res.isErr()) {\n throw res.Err();\n }\n const fpenv = res.Ok() as FPEnvelopeFile | FPEnvelopeCar;\n switch (fpenv.type) {\n case \"car\":\n case \"file\":\n return { cid, bytes: fpenv.payload };\n default:\n throw this.logger.Error().Msg(\"unexpected type\").AsError();\n }\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({ loader: this.loader }, 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 // if (url.Ok().getParam(PARAM.KEY) === PARAM.GENESIS_CID) {\n // console.log(\"saving genesis cid\");\n // }\n // if (car.bytes.length === 0) {\n // return;\n // }\n // without URL changes in super-this branch we\n // can distinguish between car and file\n let fpMsg: Result<FPEnvelopeCar | FPEnvelopeFile>;\n switch (url.Ok().getParam(PARAM.STORE)) {\n case \"car\":\n fpMsg = Car2FPMsg(car.bytes);\n break;\n case \"file\":\n fpMsg = File2FPMsg(car.bytes);\n break;\n default:\n throw this.logger.Error().Str(\"store\", url.Ok().getParam(PARAM.STORE)).Msg(\"unexpected store\").AsError();\n }\n if (fpMsg.isErr()) {\n throw this.logger.Error().Err(fpMsg).Msg(\"got error from FPMsg2Car\").AsError();\n }\n const res = await this.gateway.put({ loader: this.loader }, url.Ok(), fpMsg.Ok());\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({ loader: this.loader }, this.url(), cid.toString());\n if (url.isErr()) {\n return url;\n }\n return this.gateway.delete({ loader: this.loader }, url.Ok());\n }\n async close(): Promise<Result<void>> {\n await this.gateway.close({ loader: this.loader }, this.url());\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n destroy(): Promise<Result<void>> {\n this.logger.Debug().Msg(\"destroy\");\n return this.gateway.destroy({ loader: this.loader }, this.url());\n }\n}\n\nexport class CarStoreImpl extends DataStoreImpl implements CarStore {\n readonly storeType = \"car\";\n\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts) {\n super(sthis, url, { ...opts }, ensureLogger(sthis, \"CarStoreImpl\"));\n }\n}\n\nexport class FileStoreImpl extends DataStoreImpl implements FileStore {\n readonly storeType = \"file\";\n\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts) {\n super(sthis, url, { ...opts }, ensureLogger(sthis, \"FileStoreImpl\"));\n }\n}\n\nexport class WALStoreImpl extends BaseStoreImpl implements WALStore {\n readonly storeType = \"wal\";\n // readonly tag: string = \"rwal-base\";\n\n // readonly loader: Loadable;\n\n readonly _ready = new ResolveOnce<void>();\n\n readonly walState: WALState = { operations: [], noLoaderOps: [], fileOperations: [] };\n readonly processing: Promise<void> | undefined = undefined;\n readonly processQueue: CommitQueue<void> = new CommitQueue<void>();\n\n constructor(sthis: SuperThis, url: URI, opts: BaseStoreOpts) {\n // const my = new URL(url.toString());\n // my.searchParams.set(\"storekey\", 'insecure');\n super(sthis, url, { ...opts }, ensureLogger(sthis, \"WALStoreImpl\"));\n // this.loader = loader;\n }\n\n async ready(): Promise<void> {\n return this._ready.once(async () => {\n const walState = await this.load().catch((e) => {\n this.logger.Error().Err(e).Msg(\"error loading wal\");\n return undefined;\n });\n this.walState.operations.splice(0, this.walState.operations.length);\n this.walState.fileOperations.splice(0, this.walState.fileOperations.length);\n if (walState) {\n this.walState.operations.push(...walState.operations);\n this.walState.fileOperations.push(...walState.fileOperations);\n }\n });\n }\n\n async enqueue(dbMeta: DbMeta, opts: CommitOpts) {\n await this.ready();\n if (opts.compact) {\n this.walState.operations.splice(0, this.walState.operations.length);\n this.walState.noLoaderOps.splice(0, this.walState.noLoaderOps.length);\n this.walState.noLoaderOps.push(dbMeta);\n } else 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 if (!opts.noLoader) {\n void this.process();\n }\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.xremoteCarStore) return;\n await this.processQueue.enqueue(async () => {\n try {\n await this._doProcess();\n } catch (e) {\n this.logger.Error().Any(\"error\", e).Msg(\"error processing wal\");\n }\n if (this.walState.operations.length || this.walState.fileOperations.length || this.walState.noLoaderOps.length) {\n setTimeout(() => void this.process(), 0);\n }\n });\n }\n\n async _doProcess() {\n if (!this.loader) return;\n // if (!this.loader.xremoteCarStore) return;\n\n const operations = [...this.walState.operations];\n const noLoaderOps = [...this.walState.noLoaderOps];\n const fileOperations = [...this.walState.fileOperations];\n\n if (operations.length + noLoaderOps.length + fileOperations.length === 0) return;\n\n const concurrencyLimit = 3;\n\n // Helper function to retry uploads\n const retryableUpload = <T>(fn: () => Promise<T>, description: string) =>\n pRetry(fn, {\n retries: 5,\n onFailedAttempt: (error) => {\n this.logger\n .Warn()\n .Any(\"error\", error)\n .Any(\"fn\", fn.toString())\n .Msg(`Attempt ${error.attemptNumber} failed for ${description}. There are ${error.retriesLeft} retries left.`);\n },\n });\n\n try {\n // Process noLoaderOps\n await pMap(\n noLoaderOps,\n async (dbMeta) => {\n await retryableUpload(async () => {\n if (!this.loader) {\n return;\n }\n for (const cid of dbMeta.cars) {\n const car = await this.loader.attachedStores.local().active.car.load(cid);\n // .carStore().then((i) => i.load(cid));\n if (!car) {\n if (carLogIncludesGroup(this.loader.carLog.asArray(), dbMeta.cars)) {\n throw this.logger.Error().Ref(\"cid\", cid).Msg(\"missing local car\").AsError();\n }\n } else {\n await this.loader.attachedStores.forRemotes((x) => x.active.car.save(car));\n // throwFalsy(this.loader.xremoteCarStore).save(car);\n }\n }\n // Remove from walState after successful upload\n inplaceFilter(this.walState.noLoaderOps, (op) => op !== dbMeta);\n }, `noLoaderOp with dbMeta.cars=${dbMeta.cars.toString()}`);\n },\n { concurrency: concurrencyLimit },\n );\n\n // Process operations\n await pMap(\n operations,\n async (dbMeta) => {\n await retryableUpload(async () => {\n if (!this.loader) {\n return;\n }\n for (const cid of dbMeta.cars) {\n const car = await this.loader.attachedStores.local().active.car.load(cid);\n if (!car) {\n if (carLogIncludesGroup(this.loader.carLog.asArray(), dbMeta.cars)) {\n throw this.logger.Error().Ref(\"cid\", cid).Msg(`missing local car`).AsError();\n }\n } else {\n // await throwFalsy(this.loader.xremoteCarStore).save(car);\n await this.loader.attachedStores.forRemotes((x) => x.active.car.save(car));\n }\n }\n // Remove from walState after successful upload\n inplaceFilter(this.walState.operations, (op) => op !== dbMeta);\n }, `operation with dbMeta.cars=${dbMeta.cars.toString()}`);\n },\n { concurrency: concurrencyLimit },\n );\n\n // Process fileOperations\n await pMap(\n fileOperations,\n async ({ cid: fileCid, public: publicFile }) => {\n await retryableUpload(async () => {\n if (!this.loader) {\n return;\n }\n const fileBlock = await this.loader.attachedStores.local().active.file.load(fileCid);\n if (!fileBlock) {\n throw this.logger.Error().Ref(\"cid\", fileCid).Msg(\"missing file block\").AsError();\n }\n await this.loader.attachedStores.forRemotes((x) => x.active.file.save(fileBlock, { public: publicFile }));\n // await this.loader.xremoteFileStore?.save(fileBlock, { public: publicFile });\n // Remove from walState after successful upload\n inplaceFilter(this.walState.fileOperations, (op) => op.cid !== fileCid);\n }, `fileOperation with cid=${fileCid.toString()}`);\n },\n { concurrency: concurrencyLimit },\n );\n\n // If all uploads succeeded, send the last dbMeta to remoteMetaStore\n if (operations.length) {\n const lastOp = operations[operations.length - 1];\n await retryableUpload(async () => {\n if (!this.loader) {\n return;\n }\n // await this.loader.xremoteMetaStore?.save(lastOp);\n await this.loader.attachedStores.forRemotes((x) => x.active.meta.save(lastOp));\n }, `remoteMetaStore save with dbMeta.cars=${lastOp.cars.toString()}`);\n }\n } catch (error) {\n // Log the error\n this.logger.Error().Any(\"error\", error).Msg(\"Processing failed\");\n // Do not proceed to send metadata if any uploads failed\n return;\n } finally {\n // Always save the WAL state\n await this.save(this.walState);\n }\n }\n\n async load(): Promise<WALState | Falsy> {\n this.logger.Debug().Msg(\"loading\");\n const filepath = await this.gateway.buildUrl({ loader: this.loader }, this.url(), \"main\");\n if (filepath.isErr()) {\n throw this.logger.Error().Err(filepath.Err()).Url(this.url()).Msg(\"error building url\").AsError();\n }\n const bytes = (await this.gateway.get({ loader: this.loader }, filepath.Ok())) as Result<FPEnvelopeWAL>;\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 if (bytes.Ok().type !== \"wal\") {\n throw this.logger.Error().Str(\"type\", bytes.Ok().type).Msg(\"unexpected type\").AsError();\n }\n return bytes.Ok().payload;\n }\n\n async save(state: WALState) {\n const filepath = await this.gateway.buildUrl({ loader: this.loader }, this.url(), \"main\");\n if (filepath.isErr()) {\n throw this.logger.Error().Err(filepath.Err()).Url(this.url()).Msg(\"error building url\").AsError();\n }\n // let encoded: ToString<WALState>;\n // try {\n // encoded = format(state);\n // } catch (e) {\n // throw this.logger.Error().Err(e).Any(\"state\", state).Msg(\"error format\").AsError();\n // }\n const res = await this.gateway.put({ loader: this.loader }, filepath.Ok(), {\n type: \"wal\",\n payload: state,\n } as FPEnvelopeWAL);\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({ loader: this.loader }, this.url());\n this._onClosed.forEach((fn) => fn());\n return Result.Ok(undefined);\n }\n\n destroy() {\n this.logger.Debug().Msg(\"destroy\");\n return this.gateway.destroy({ loader: this.loader }, this.url());\n }\n}\n","import pLimit from \"p-limit\";\nimport { CarReader } from \"@ipld/car/reader\";\nimport { KeyedResolvOnce, Logger, LRUSet, 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 TransactionMeta,\n type CarGroup,\n type Loadable,\n BlockstoreRuntime,\n BlockstoreOpts,\n AttachedStores,\n ActiveStore,\n BaseStore,\n CIDActiveStore,\n CarCacheItem,\n CarLog,\n FroozenCarLog,\n CarStore,\n} from \"./types.js\";\n\nimport { parseCarFile } from \"./loader-helpers.js\";\n\nimport { defaultedBlockstoreRuntime } from \"./transaction.js\";\nimport { CommitQueue } from \"./commit-queue.js\";\nimport { PARAM, type Attachable, type Attached, type CarTransaction, type DbMeta, type Falsy, type SuperThis } from \"../types.js\";\nimport { getKeyBag, KeyBag } from \"../runtime/key-bag.js\";\nimport { commit, commitFiles, CommitParams } from \"./commitor.js\";\nimport { decode } from \"../runtime/wait-pr-multiformats/block.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport { TaskManager } from \"./task-manager.js\";\nimport { AttachedRemotesImpl, createAttachedStores } from \"./attachable-store.js\";\nimport { ensureLogger, isNotFoundError } from \"../utils.js\";\n\nexport function carLogIncludesGroup(list: FroozenCarLog, cids: CarGroup) {\n const cidSet = cids\n .map((cid) => cid.toString())\n .sort()\n .join(\",\");\n return list.some(\n (arr: CarGroup) =>\n cidSet ===\n arr\n .map((cid) => cid.toString())\n .sort()\n .join(\",\"),\n );\n}\n\n// this works for car groups because toString looks like bafy,bafy\nfunction uniqueCids(list: FroozenCarLog, remove = new LRUSet<string>()): FroozenCarLog {\n const byString = new Map<string, CarGroup>();\n for (const cid of list) {\n if (remove.has(cid.toString())) continue;\n byString.set(cid.toString(), cid);\n }\n return [...byString.values()];\n}\n\n// export interface DecoderAndCarReader extends CarReader {\n// readonly decoder: BlockDecoder<number, Uint8Array>;\n// }\n\nexport class Loader implements Loadable {\n // readonly name: string;\n readonly ebOpts: BlockstoreRuntime;\n readonly logger: Logger;\n readonly commitQueue: CommitQueue<CarGroup> = new CommitQueue<CarGroup>();\n isCompacting = false;\n private readonly cidCache: KeyedResolvOnce<CarCacheItem>;\n private readonly maxConcurrentCarReader: ReturnType<typeof pLimit>;\n private readonly maxConcurrentWrite = pLimit(1);\n readonly seenCompacted: LRUSet<string>;\n // readonly processedCars: Set<string> = new Set<string>();\n readonly sthis: SuperThis;\n readonly taskManager: TaskManager;\n\n readonly carLog: CarLog = new CarLog();\n // key?: string;\n // keyId?: string;\n // remoteMetaStore?: MetaStore;\n // remoteCarStore?: DataStore;\n // remoteFileStore?: DataStore;\n\n readonly attachedStores: AttachedStores;\n\n async attach(attached: Attachable): Promise<Attached> {\n const at = await this.attachedStores.attach(attached);\n if (!at.stores.wal) {\n try {\n // remote Store need to kick off the sync by requesting the latest meta\n const dbMeta = await at.stores.meta.load();\n if (!Array.isArray(dbMeta)) {\n throw this.logger.Error().Msg(\"missing dbMeta\").AsError();\n }\n await this.handleDbMetasFromStore(dbMeta, this.attachedStores.activate(at.stores));\n } catch (e) {\n this.logger.Error().Err(e).Msg(\"error attaching store\");\n at.detach();\n }\n }\n return at;\n }\n\n // private getBlockCache = new Map<string, AnyBlock>();\n private seenMeta: LRUSet<string>;\n\n keyBag(): Promise<KeyBag> {\n return getKeyBag(this.sthis, this.ebOpts.keyBag);\n }\n\n private readonly onceReady: ResolveOnce<void> = new ResolveOnce<void>();\n async ready(): Promise<void> {\n return this.onceReady.once(async () => {\n await createAttachedStores(\n {\n car: { url: this.ebOpts.storeUrls.car, gatewayInterceptor: this.ebOpts.gatewayInterceptor },\n file: { url: this.ebOpts.storeUrls.file, gatewayInterceptor: this.ebOpts.gatewayInterceptor },\n meta: { url: this.ebOpts.storeUrls.meta, gatewayInterceptor: this.ebOpts.gatewayInterceptor },\n wal: { url: this.ebOpts.storeUrls.wal, gatewayInterceptor: this.ebOpts.gatewayInterceptor },\n },\n this.attachedStores,\n );\n const local = this.attachedStores.local();\n const metas = await local.active.meta.load();\n if (this.ebOpts.meta) {\n await this.handleDbMetasFromStore([this.ebOpts.meta, ...(metas || [])], local);\n } else if (metas) {\n await this.handleDbMetasFromStore(metas, local);\n }\n });\n }\n\n async close() {\n await this.commitQueue.waitIdle();\n await this.attachedStores.detach();\n // const toClose = await Promise.all([this.carStore(), this.metaStore(), this.fileStore(), this.WALStore()]);\n // await Promise.all(toClose.map((store) => store.close()));\n }\n\n async destroy() {\n // console.log(\"destroy\", this.attachedStores.local().baseStores().map((store) => store.url().toString()));\n await Promise.all(\n this.attachedStores\n .local()\n .baseStores()\n .map((store) => store.destroy()),\n );\n }\n\n constructor(sthis: SuperThis, ebOpts: BlockstoreOpts) {\n // this.name = name;\n this.sthis = sthis;\n this.ebOpts = defaultedBlockstoreRuntime(\n sthis,\n {\n ...ebOpts,\n // name,\n },\n \"Loader\",\n );\n this.logger = ensureLogger(sthis, \"Loader\");\n this.cidCache = new KeyedResolvOnce({\n lru: {\n maxEntries: parseInt(this.ebOpts.storeUrls.car.getParam(PARAM.CAR_CACHE_SIZE, \"1000\"), 10),\n },\n });\n this.seenMeta = new LRUSet({\n maxEntries: parseInt(this.ebOpts.storeUrls.meta.getParam(PARAM.CAR_META_CACHE_SIZE, \"1000\"), 10),\n });\n this.seenCompacted = new LRUSet({\n maxEntries: parseInt(this.ebOpts.storeUrls.car.getParam(PARAM.CAR_COMPACT_CACHE_SIZE, \"1000\"), 10),\n });\n this.maxConcurrentCarReader = pLimit(parseInt(this.ebOpts.storeUrls.car.getParam(PARAM.CAR_PARALLEL, \"5\"), 10));\n\n this.taskManager = new TaskManager(\n sthis,\n async (dbMeta: DbMeta, activeStore: ActiveStore) => {\n // console.log(\n // \"taskManager\",\n // dbMeta.cars.map((c) => c.toString()),\n // );\n await this.handleDbMetasFromStore([dbMeta], activeStore);\n },\n this.ebOpts.taskManager,\n );\n this.attachedStores = new AttachedRemotesImpl(this);\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[], activeStore: ActiveStore): Promise<void> {\n // console.log(\n // \"handleDbMetasFromStore\",\n // activeStore.active.car.url().toString(),\n // metas.map((m) => m.cars.map((c) => c.toString())).flat(),\n // );\n this.logger.Debug().Any(\"metas\", metas).Url(activeStore.active.car.url()).Msg(\"handleDbMetasFromStore\");\n for (const meta of metas) {\n await this.maxConcurrentWrite(async () => {\n await this.mergeDbMetaIntoClock(meta, activeStore);\n });\n }\n }\n\n async mergeDbMetaIntoClock(meta: DbMeta, activeStore: ActiveStore): Promise<void> {\n if (this.isCompacting) {\n throw this.logger.Error().Msg(\"cannot merge while compacting\").AsError();\n }\n try {\n this.isCompacting = true;\n // this could be abit more compact\n const metaKey = meta.cars\n .map((i) => i.toString())\n .sort()\n .join(\",\");\n if (this.seenMeta.has(metaKey)) return;\n this.seenMeta.add(metaKey);\n\n // if (meta.key) {\n // await this.setKey(meta.key);\n // }\n if (carLogIncludesGroup(this.carLog.asArray(), meta.cars)) {\n return;\n }\n const carHeader = await this.loadCarHeaderFromMeta<TransactionMeta>(meta, activeStore);\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((k) => this.seenCompacted.add(k), this.seenCompacted);\n try {\n await this.getMoreReaders(carHeader.cars.flat(), activeStore);\n } catch (e) {\n this.logger.Error().Err(e).Msg(\"error getting more readers\");\n }\n this.carLog.update(uniqueCids([meta.cars, ...this.carLog.asArray(), ...carHeader.cars], this.seenCompacted));\n // console.log(\n // \">>>>> pre applyMeta\",\n // this.carLog\n // .asArray()\n // .map((c) => c.map((cc) => cc.toString()))\n // .flat(),\n // );\n await this.ebOpts.applyMeta?.(carHeader.meta);\n // console.log(\">>>>> post applyMeta\");\n } finally {\n this.isCompacting = false;\n }\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>(dbm: DbMeta, astore: ActiveStore): Promise<CarHeader<T>> {\n //Call loadCar for every cid\n const reader = await this.loadCar(dbm.cars[0], astore);\n return await parseCarFile(reader, this.logger);\n }\n\n // async _getKey(): Promise<string | undefined> {\n // if (this.key) return this.key;\n // // generate a random key\n // if (!this.ebOpts.public) {\n // await this.setKey(toHexString(this.ebOpts.crypto.randomBytes(32)));\n // }\n // return this.key || undefined;\n // }\n\n async commitFiles(\n t: CarTransaction,\n done: TransactionMeta,\n // opts: CommitOpts = { noLoader: false, compact: false },\n ): Promise<CarGroup> {\n await this.ready();\n const fstore = this.attachedStores.local().active.file;\n const wstore = this.attachedStores.local().active.wal;\n return this.commitQueue.enqueue(() => commitFiles(fstore, wstore, t, done));\n }\n\n async loadFileCar(cid: AnyLink /*, isPublic = false*/, store: ActiveStore): Promise<CarCacheItem> {\n return await this.storesLoadCar(cid, store.fileStore()); // store.local.file, store.remotes.map((r) => r.file));\n }\n\n async commit<T = TransactionMeta>(\n t: CarTransaction,\n done: T,\n opts: CommitOpts = { noLoader: false, compact: false },\n ): Promise<CarGroup> {\n await this.ready();\n const carStore = this.attachedStores.local().active.car;\n const params: CommitParams = {\n encoder: (await carStore.keyedCrypto()).codec(),\n carLog: this.carLog,\n carStore: carStore,\n WALStore: this.attachedStores.local().active.wal,\n metaStore: this.attachedStores.local().active.meta,\n threshold: this.ebOpts.threshold,\n };\n return this.commitQueue.enqueue(async () => {\n await this.cacheTransaction(t);\n const ret = await commit(params, t, done, opts);\n await this.updateCarLog(ret.cgrp, ret.header, !!opts.compact);\n return ret.cgrp;\n });\n }\n\n async updateCarLog<T>(cids: CarGroup, cHeader: CarHeader<T>, compact: boolean): Promise<void> {\n // if (this.carLog.length === 0) {\n // // console.log(\"updateCarLog\", cids.map((c) => c.toString()));\n // }\n\n if (compact) {\n const previousCompactCid = cHeader.compact[cHeader.compact.length - 1];\n cHeader.compact.map((c) => c.toString()).forEach(this.seenCompacted.add, this.seenCompacted);\n this.carLog.update(uniqueCids([...this.carLog.asArray(), ...cHeader.cars, cids], this.seenCompacted));\n // console.log(\n // \"compact - updateCarLog\",\n // this.carLog\n // .asArray()\n // .map((c) => c.map((cc) => cc.toString()))\n // .flat(),\n // );\n await this.removeCidsForCompact(previousCompactCid[0], this.attachedStores.local()).catch((e) => e);\n } else {\n // console.log(\n // \"update - updateCarLog\",\n // this.carLog\n // .asArray()\n // .map((c) => c.map((cc) => cc.toString()))\n // .flat(),\n // );\n this.carLog.xunshift(cids);\n }\n }\n\n async cacheTransaction(t: CarTransaction) {\n for await (const block of t.entries()) {\n const sBlock = block.cid.toString();\n this.cidCache.get(sBlock).once(\n () =>\n ({\n type: \"block\",\n cid: block.cid,\n blocks: [block],\n roots: [],\n }) satisfies CarCacheItem,\n );\n }\n }\n\n // /**\n // *\n // * @returns the list of blocks which was read from the car file\n // */\n // private async readCar(reader: CarReader): Promise<AnyBlock[]> {\n // const blocks: AnyBlock[] = [];\n // for await (const block of reader.blocks()) {\n // const sBlock = block.cid.toString();\n // this.cidCache.get(sBlock).once(() => {\n // blocks.push(block);\n // return [block];\n // });\n // }\n // return blocks;\n // }\n\n async removeCidsForCompact(cid: AnyLink, store: ActiveStore) {\n const carHeader = await this.loadCarHeaderFromMeta(\n {\n cars: [cid],\n },\n store,\n );\n for (const cids of carHeader.compact) {\n for (const cid of cids) {\n await this.attachedStores.local().active.car.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 // for (const { value } of this.cidCache.values()) {\n // if (value.isOk() && value.Ok().type === \"block\") {\n // for (const block of value.Ok().blocks) {\n // yield block;\n // }\n // }\n // }\n // if (cache) {\n // return;\n // }\n // console.log(\"entries\", this.carLog.map((c) => c.map((cc) => cc.toString())).flat());\n const seen = new Set<string>();\n for (const carCids of this.carLog.asArray()) {\n for (const carCid of carCids) {\n const reader = await this.loadCar(carCid, this.attachedStores.local());\n if (!reader || reader.type !== \"car\") {\n throw this.logger.Error().Any(\"reader\", reader.type).Str(\"cid\", carCid.toString()).Msg(\"missing car reader\").AsError();\n }\n // console.log(\n // \"entries\",\n // carCid.toString(),\n // reader.blocks.map((b) => b.cid.toString()),\n // );\n // const readBlocks = await this.readCar(reader);\n for (const block of reader.blocks) {\n const cidStr = block.cid.toString();\n if (seen.has(cidStr)) continue;\n seen.add(cidStr);\n yield block;\n }\n }\n }\n }\n\n async getBlock(cid: AnyLink, store: ActiveStore): Promise<AnyBlock | Falsy> {\n await this.ready();\n const cidStr = cid.toString();\n const ci = await this.cidCache.get(cidStr).once(async () => {\n // console.log(\"getBlock\", cidStr);\n // const getCarCid = async (carCid: AnyLink) => {\n // const sCid = carCid.toString();\n // if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n // const reader = await this.loadCar(carCid, store);\n // if (!reader) {\n // throw this.logger.Error().Str(\"cid\", sCid).Msg(\"missing car reader\").AsError();\n // }\n // await this.cacheCarReader(sCid, reader).catch((e) => {\n // this.logger.Error().Err(e).Str(\"cid\", sCid).Msg(\"error caching car reader\");\n // return;\n // });\n // if (this.getBlockCache.has(sCid)) return this.getBlockCache.get(sCid);\n // console.log(\"getBlock-error\", sCid);\n // throw this.logger.Error().Str(\"cid\", sCid).Msg(\"block not in reader\").AsError();\n // };\n\n const getCompactCarCids = async (carCid: AnyLink) => {\n const sCid = carCid.toString();\n const reader = await this.loadCar(carCid, store);\n // if (!reader) {\n // throw this.logger.Error().Str(\"cid\", carCid.toString()).Msg(\"missing car reader\").AsError();\n // }\n const header = await parseCarFile(reader, this.logger);\n const compacts = header.compact;\n // let got: AnyBlock | undefined;\n\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 const got = await Promise.allSettled(compacts.map((compact) => compact.map((cid) => this.loadCar(cid, store)).flat()));\n got\n .filter((result) => result.status === \"rejected\")\n .forEach((result) => {\n this.logger.Error().Err(result.reason).Str(\"cid\", sCid).Msg(\"error getting compacted block\");\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: AnyBlock | undefined;\n for (const carCids of this.carLog.asArray()) {\n for (const carCid of carCids) {\n const ci = await this.loadCar(carCid, store);\n if (!ci) {\n this.logger.Error().Str(\"cid\", carCid.toString()).Msg(\"missing CarCID\");\n continue;\n }\n got = ci.blocks.find((block) => block.cid.equals(cid));\n if (got) {\n break;\n }\n }\n }\n if (!got) {\n await getCompactCarCids(this.carLog.last()[0]);\n }\n return {\n type: \"block\",\n cid: cid,\n blocks: got ? [got] : [],\n roots: [],\n };\n });\n if (!(ci.type === \"block\" && ci.blocks.length === 1)) {\n throw this.logger.Error().Str(\"cid\", cidStr).Any(\"block\", ci).Msg(\"missing block\").AsError();\n }\n return ci.blocks[0];\n }\n\n async loadCar(cid: AnyLink, store: ActiveStore): Promise<CarCacheItem> {\n const loaded = await this.storesLoadCar(cid, store.carStore());\n return loaded;\n }\n\n private async makeDecoderAndCarReader(carCid: AnyLink, store: CIDActiveStore): Promise<CarCacheItem> {\n const carCidStr = carCid.toString();\n let loadedCar: AnyBlock | undefined = undefined;\n let activeStore: BaseStore = store.local();\n try {\n //loadedCar now is an array of AnyBlocks\n this.logger.Debug().Any(\"cid\", carCidStr).Msg(\"loading car\");\n loadedCar = await store.local().load(carCid);\n this.logger.Debug().Bool(\"loadedCar\", loadedCar).Msg(\"loaded\");\n } catch (e) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Str(\"cid\", carCidStr).Err(e).Msg(\"loading car\");\n }\n for (const remote of store.remotes() as CarStore[]) {\n // console.log(\"makeDecoderAndCarReader\", remote.url().toString());\n try {\n const remoteCar = await remote.load(carCid);\n if (remoteCar) {\n // todo test for this\n this.logger.Debug().Ref(\"cid\", remoteCar.cid).Msg(\"saving remote car locally\");\n await store.local().save(remoteCar);\n loadedCar = remoteCar;\n activeStore = remote;\n break;\n } else {\n this.logger.Error().Str(\"cid\", carCidStr).Err(e).Msg(\"loading car\");\n }\n } catch (e) {\n this.logger.Warn().Str(\"cid\", carCidStr).Url(remote.url()).Err(e).Msg(\"loading car\");\n }\n }\n }\n if (!loadedCar) {\n throw this.logger.Error().Url(store.local().url()).Str(\"cid\", carCidStr).Msg(\"missing car files\").AsError();\n }\n //This needs a fix as well as the fromBytes function expects a Uint8Array\n //Either we can merge the bytes or return an array of rawReaders\n const bytes = await decode({ bytes: loadedCar.bytes, hasher, codec: (await activeStore.keyedCrypto()).codec() }); // as Uint8Array,\n const rawReader = await CarReader.fromBytes(bytes.value.data);\n // const readerP = Promise.resolve(rawReader);\n // const kc = await activeStore.keyedCrypto()\n // const readerP = !kc.isEncrypting ? Promise.resolve(rawReader) : this.ensureDecryptedReader(activeStore, rawReader);\n\n const blocks: AnyBlock[] = [];\n for await (const block of rawReader.blocks()) {\n const sBlock = block.cid.toString();\n blocks.push(block);\n this.cidCache.get(sBlock).once<CarCacheItem>(() => ({\n type: \"block\",\n cid: block.cid,\n blocks: [block],\n roots: [],\n }));\n }\n return {\n type: \"car\",\n cid: carCid,\n blocks,\n roots: await rawReader.getRoots(),\n };\n // const cachedReaderP = readerP.then(async (reader) => {\n // await this.cacheCarReader(carCidStr, reader).catch((e) => {\n // this.logger.Error().Err(e).Str(\"cid\", carCidStr).Msg(\"error caching car reader\");\n // return;\n // });\n // return reader;\n // });\n // this.cidCache.set(carCidStr, cachedReaderP);\n // return readerP;\n }\n\n //What if instead it returns an Array of CarHeader\n protected async storesLoadCar(carCid: AnyLink, store: CIDActiveStore): Promise<CarCacheItem> {\n const carCidStr = carCid.toString();\n // console.log(\"storesLoadCar\", carCidStr);\n return this.cidCache.get(carCidStr).once(async () => {\n return this.maxConcurrentCarReader(() => this.makeDecoderAndCarReader(carCid, store));\n });\n }\n\n protected async getMoreReaders(cids: AnyLink[], store: ActiveStore) {\n for (const cid of cids) {\n // console.log(\"getMoreReaders>>>\", cid.toString());\n await this.loadCar(cid, store);\n }\n // console.log(\"getMoreReaders<<<\");\n }\n}\n","import { decode } from \"../runtime/wait-pr-multiformats/block.js\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as dagCodec from \"@ipld/dag-cbor\";\nimport type { Logger } from \"@adviser/cement\";\n\nimport { CarCacheItem, CarHeader } from \"./types.js\";\n// import { decodeRunLength } from \"../runtime/keyed-crypto.js\";\n// import { base58btc } from \"multiformats/bases/base58\";\n// import { CarReader } from \"@ipld/car/reader\";\n\n// export async function encodeCarHeader<T>(fp: CarHeader<T>) {\n// return (await encode({\n// value: { fp },\n// hasher,\n// codec: dagCodec,\n// })) as AnyBlock;\n// }\n\n// function wrapDagDecoder<T>(dec: BlockDecoder<number, Uint8Array>): BlockDecoder<number, CarDecoded<T>> {\n// return {\n// code: dec.code,\n// decode: async (block: Uint8Array) => dagCodec.decode(await dec.decode(block))\n// }\n// }\n\ninterface CarDecoded<T> {\n readonly fp: CarHeader<T>;\n}\n\nexport async function parseCarFile<T>(reader: CarCacheItem, logger: Logger): Promise<CarHeader<T>> {\n const roots = await reader.roots;\n const header = reader.blocks.find((i) => i.cid.equals(roots[0]));\n if (!header) throw logger.Error().Msg(\"missing header block\").AsError();\n const dec = await decode({ bytes: header.bytes, hasher, codec: dagCodec });\n // console.log(\"parseCarFile-done\", roots[0].toString(), header)\n // const { value } = await decode({\n // bytes: header.bytes,\n // hasher,\n // codec: await wrapDagDecoder<T>({\n // code: dagCodec.code,\n // decode: (block) => {\n // const ui = new Uint8Array(block);\n // const iv = decodeRunLength(ui, 0, logger);\n // const key = decodeRunLength(ui, iv.next, logger);\n // // const fp = decodeRunLength(ui, key.next, logger);\n // console.log(\"parseCarFile\", { iv: iv.data.length, key: base58btc.encode(key.data) }, (new Error()).stack);\n // return ui\n // }\n // })\n // });\n const fpvalue = dec.value as CarDecoded<T>;\n // @jchris where is the fp attribute coming from?\n if (fpvalue && !fpvalue.fp) {\n throw logger.Error().Msg(\"missing fp\").AsError();\n }\n return fpvalue.fp;\n}\n","import { MemoryBlockstore } from \"@web3-storage/pail/block\";\nimport { BlockFetcher as BlockFetcherApi } from \"@web3-storage/pail/api\";\n\nimport {\n AnyAnyLink,\n AnyBlock,\n AnyLink,\n CarMakeable,\n TransactionMeta,\n TransactionWrapper,\n BlockstoreOpts,\n BlockstoreRuntime,\n Loadable,\n} from \"./types.js\";\n\nimport { Loader } from \"./loader.js\";\nimport type { Block, Version, UnknownLink } from \"multiformats\";\nimport { BaseBlockstore, CarTransaction, falsyToUndef, SuperThis } from \"../types.js\";\nimport { ensureStoreEnDeFile, toStoreRuntime } from \"./store-factory.js\";\nimport { Logger, toCryptoRuntime } from \"@adviser/cement\";\nimport { ensureLogger, ensureSuperThis } from \"../utils.js\";\n\nexport type BlockFetcher = BlockFetcherApi;\nexport interface CarTransactionOpts {\n readonly add: boolean;\n readonly noLoader: boolean;\n}\n\nexport class CarTransactionImpl implements CarMakeable, CarTransaction {\n readonly parent: BaseBlockstore;\n readonly #memblock = new MemoryBlockstore();\n #hackUnshift?: AnyBlock;\n\n constructor(parent: BaseBlockstore, opts: CarTransactionOpts = { add: true, noLoader: false }) {\n // super();\n if (opts.add) {\n parent.transactions.add(this);\n }\n this.parent = parent;\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined> {\n return ((await this.superGet(cid)) ?? falsyToUndef(await this.parent.get(cid))) as Block<T, C, A, V>;\n }\n\n async superGet(cid: AnyLink): Promise<AnyBlock | undefined> {\n return this.#memblock.get(cid);\n }\n\n async put(cid: AnyLink, block: Uint8Array): Promise<void> {\n await this.#memblock.put(cid, block);\n }\n\n putSync(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): void {\n this.#memblock.putSync(cid, bytes);\n }\n\n unshift(cid: UnknownLink, bytes: Uint8Array<ArrayBufferLike>): void {\n if (this.#hackUnshift) {\n throw new Error(\"unshift already called\");\n }\n this.#hackUnshift = { cid, bytes };\n }\n\n async *entries(): AsyncIterableIterator<AnyBlock> {\n if (this.#hackUnshift) {\n yield this.#hackUnshift;\n }\n for await (const blk of this.#memblock.entries()) {\n yield blk;\n }\n }\n}\n\nexport function defaultedBlockstoreRuntime(\n sthis: SuperThis,\n opts: BlockstoreOpts,\n component: string,\n ctx?: Record<string, unknown>,\n): BlockstoreRuntime {\n const logger = ensureLogger(sthis, component, ctx);\n // const store = opts.store || {};\n return {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n applyMeta: (meta: TransactionMeta, snap?: boolean): Promise<void> => {\n return Promise.resolve();\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n compact: async (blocks: BlockFetcher) => {\n return {} as unknown as TransactionMeta;\n },\n autoCompact: 100,\n public: false,\n // name: undefined,\n threshold: 1000 * 1000,\n ...opts,\n logger,\n keyBag: opts.keyBag || {},\n crypto: toCryptoRuntime(opts.crypto),\n storeUrls: opts.storeUrls,\n taskManager: {\n removeAfter: 3,\n retryTimeout: 50,\n ...opts.taskManager,\n },\n // storeEnDeFile: ensureStoreEnDeFile(opts.storeEnDeFile),\n // store,\n storeRuntime: toStoreRuntime(sthis, ensureStoreEnDeFile(opts.storeEnDeFile)),\n };\n}\n\n// export function blockstoreFactory(sthis: SuperThis, opts: BlockstoreOpts): BaseBlockstore | EncryptedBlockstore {\n// // if (opts.name) {\n// return new EncryptedBlockstore(sthis, opts);\n// // } else {\n// // return new BaseBlockstore(opts);\n// // }\n// }\n\nexport class BaseBlockstoreImpl implements BlockFetcher {\n readonly transactions: Set<CarTransaction> = new Set<CarTransaction>();\n readonly ebOpts: BlockstoreRuntime;\n readonly sthis: SuperThis;\n\n readonly loader: Loadable;\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 async compact(): Promise<void> {\n // no-op\n }\n\n readonly logger: Logger;\n constructor(ebOpts: BlockstoreOpts) {\n this.sthis = ensureSuperThis(ebOpts);\n this.ebOpts = defaultedBlockstoreRuntime(this.sthis, ebOpts, \"BaseBlockstore\");\n this.logger = this.ebOpts.logger;\n this.loader = new Loader(this.sthis, 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 if (!cid) throw this.logger.Error().Msg(\"required cid\").AsError();\n for (const f of this.transactions) {\n // if (Math.random() < 0.001) console.log('get', cid.toString(), this.transactions.size)\n const v = await f.superGet(cid);\n if (v) return v as Block<T, C, A, V>;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async put(cid: AnyAnyLink, block: Uint8Array): Promise<void> {\n throw this.logger.Error().Msg(\"use a transaction to put\").AsError();\n }\n\n lastTxMeta?: unknown; // TransactionMeta\n\n async transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n _opts?: CarTransactionOpts,\n ): Promise<TransactionWrapper<M>> {\n this.logger.Debug().Msg(\"enter transaction\");\n const t = new CarTransactionImpl(this, _opts);\n this.logger.Debug().Msg(\"post CarTransaction\");\n const done: M = await fn(t);\n this.logger.Debug().Msg(\"post fn\");\n this.lastTxMeta = done;\n return { t, meta: done };\n }\n\n openTransaction(opts: CarTransactionOpts = { add: true, noLoader: false }): CarTransaction {\n return new CarTransactionImpl(this, opts);\n }\n\n async commitTransaction<M extends TransactionMeta>(\n t: CarTransaction,\n done: M,\n opts: CarTransactionOpts,\n ): Promise<TransactionWrapper<M>> {\n if (!this.loader) throw this.logger.Error().Msg(\"loader required to commit\").AsError();\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 *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 BaseBlockstoreImpl {\n // readonly name: string;\n\n ready(): Promise<void> {\n return this.loader.ready();\n }\n\n close(): Promise<void> {\n return this.loader.close();\n }\n\n destroy(): Promise<void> {\n return this.loader.destroy();\n }\n\n compacting = false;\n readonly logger: Logger;\n\n constructor(sthis: SuperThis, ebOpts: BlockstoreOpts) {\n super(ebOpts);\n this.logger = ensureLogger(this.sthis, \"EncryptedBlockstore\", {\n this: 1,\n });\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 const ret = falsyToUndef(await this.loader.getBlock(cid, this.loader.attachedStores.local())) as Block<T, C, A, V>;\n return ret;\n }\n\n async transaction<M extends TransactionMeta>(\n fn: (t: CarTransaction) => Promise<M>,\n opts = { noLoader: false },\n ): Promise<TransactionWrapper<M>> {\n this.logger.Debug().Msg(\"enter transaction\");\n const { t, meta: done } = await super.transaction<M>(fn);\n this.logger.Debug().Msg(\"post super.transaction\");\n const cars = await this.loader.commit<M>(t, done, opts);\n this.logger.Debug().Msg(\"post this.loader.commit\");\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, ledger must be named\").AsError();\n const reader = await this.loader.loadFileCar(car /*, isPublic */, this.loader.attachedStores.local());\n const block = await reader.blocks.find((i) => i.cid.equals(cid));\n if (!block) throw this.logger.Error().Str(\"cid\", cid.toString()).Msg(`Missing block`).AsError();\n return block.bytes;\n }\n\n async compact() {\n await this.ready();\n if (!this.loader) throw this.logger.Error().Msg(\"loader required to compact\").AsError();\n if (this.loader.carLog.length < 2) return;\n const compactFn = this.ebOpts.compact || ((blocks: CompactionFetcher) => this.defaultCompact(blocks, this.logger));\n if (!compactFn || this.compacting) return;\n const blockLog = new CompactionFetcher(this);\n this.compacting = true;\n const meta = await compactFn(blockLog);\n await this.loader.commit(blockLog.loggedBlocks, meta, {\n compact: true,\n noLoader: true,\n });\n this.compacting = false;\n }\n\n async defaultCompact(blocks: CompactionFetcher, logger: Logger): Promise<TransactionMeta> {\n // console.log('eb compact')\n if (!this.loader) {\n throw logger.Error().Msg(\"no loader\").AsError();\n }\n if (!this.lastTxMeta) {\n throw logger.Error().Msg(\"no lastTxMeta\").AsError();\n }\n for await (const blk of this.loader.entries(false)) {\n blocks.loggedBlocks.putSync(blk.cid, blk.bytes);\n }\n for (const t of this.transactions) {\n for await (const blk of t.entries()) {\n blocks.loggedBlocks.putSync(blk.cid, blk.bytes);\n }\n }\n return this.lastTxMeta as TransactionMeta;\n }\n\n async *entries(): AsyncIterableIterator<AnyBlock> {\n // const seen = new Set<string>();\n for await (const blk of this.loader.entries()) {\n // if (seen.has(blk.cid.toString())) continue\n // seen.add(blk.cid.toString())\n yield blk;\n }\n }\n}\n\nexport class CompactionFetcher implements BlockFetcher {\n readonly blockstore: EncryptedBlockstore;\n // loader: Loader | null = null\n readonly loggedBlocks: CarTransaction;\n\n constructor(blocks: EncryptedBlockstore) {\n this.blockstore = blocks;\n // this.loader = blocks.loader\n this.loggedBlocks = new CarTransactionImpl(blocks);\n }\n\n async get<T, C extends number, A extends number, V extends Version>(cid: AnyLink): Promise<Block<T, C, A, V> | undefined> {\n const block = await this.blockstore.get(cid);\n if (block) this.loggedBlocks.putSync(cid, block.bytes);\n return falsyToUndef(block) as Block<T, C, A, V>;\n }\n}\n","import { Future } from \"@adviser/cement\";\n\ntype QueueFunction<T = void> = () => Promise<T>;\n\nexport class CommitQueue<T = void> {\n readonly queue: QueueFunction<void>[] = [];\n processing = false;\n\n readonly _waitIdleItems: Set<Future<void>> = new Set<Future<void>>();\n waitIdle(): Promise<void> {\n if (this.queue.length === 0 && !this.processing) {\n return Promise.resolve();\n }\n const fn = new Future<void>();\n this._waitIdleItems.add(fn);\n return fn.asPromise();\n }\n\n async enqueue(fn: QueueFunction<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const queueFn = async () => {\n try {\n resolve(await fn());\n } catch (e) {\n reject(e);\n } finally {\n this.processing = false;\n this.processNext();\n }\n };\n this.queue.push(queueFn);\n if (!this.processing) {\n this.processNext();\n }\n });\n }\n\n processNext() {\n if (this.queue.length > 0 && !this.processing) {\n this.processing = true;\n const queueFn = this.queue.shift();\n if (queueFn) {\n queueFn().finally(() => {\n /**/\n });\n }\n }\n if (this.queue.length === 0 && !this.processing) {\n const toResolve = Array.from(this._waitIdleItems);\n this._waitIdleItems.clear();\n toResolve.map((fn) => fn.resolve());\n }\n }\n}\n","import { FileTransactionMeta, CarTransaction } from \"../types.js\";\nimport {\n AnyBlock,\n AnyLink,\n CarGroup,\n CarHeader,\n CarLog,\n CarMakeable,\n CarStore,\n CommitOpts,\n DbMeta,\n FileStore,\n FroozenCarLog,\n MetaStore,\n toCIDBlock,\n TransactionMeta,\n WALStore,\n} from \"./types.js\";\nimport * as CBW from \"@ipld/car/buffer-writer\";\nimport { ByteView, CID } from \"multiformats\";\nimport { encode } from \"../runtime/wait-pr-multiformats/block.js\";\nimport { AsyncBlockEncoder } from \"../runtime/wait-pr-multiformats/codec-interface.js\";\n// import { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as dagCodec from \"@ipld/dag-cbor\";\nimport { CarTransactionImpl } from \"./transaction.js\";\nimport { sha256 } from \"multiformats/hashes/sha2\";\n\nasync function encodeCarFile(\n roots: AnyLink[],\n t: CarMakeable,\n codec: AsyncBlockEncoder<24, ByteView<Uint8Array>>,\n): Promise<AnyBlock> {\n let size = 0;\n const headerSize = CBW.headerLength({ roots } as { roots: CID<unknown, number, number, 1>[] });\n size += headerSize;\n for await (const { cid, bytes } of t.entries()) {\n size += CBW.blockLength({ cid, bytes } as CBW.Block);\n }\n const buffer = new Uint8Array(size);\n const writer = CBW.createWriter(buffer.buffer, { headerSize });\n\n for (const r of roots) {\n writer.addRoot(r as CID<unknown, number, number, 1>);\n }\n\n for await (const { cid, bytes } of t.entries()) {\n // console.log(\"encodeCarFile\", cid.toString(), bytes.length);\n writer.write({ cid, bytes } as CBW.Block);\n }\n writer.close();\n return await encode({ value: writer.bytes, hasher: sha256, codec });\n}\n\nexport async function createCarFile(\n encoder: AsyncBlockEncoder<24, Uint8Array>,\n cid: AnyLink,\n t: CarTransaction,\n): Promise<{ cid: AnyLink; bytes: Uint8Array }> {\n // try {\n return encodeCarFile([cid], t, encoder);\n // const keycr = await store.keyedCrypto()\n // return keycr.isEncrypting\n // ? await encryptedEncodeCarFile(this.logger, keycr, cid, t)\n // : await encodeCarFile([cid], t);\n // } catch (e) {\n // throw store.logger.Error().Err(e).Msg(\"error creating car file\").AsError();\n // }\n}\n\nexport async function commitFiles(\n fileStore: FileStore,\n walStore: WALStore,\n t: CarTransaction,\n done: TransactionMeta,\n // opts: CommitOpts = { noLoader: false, compact: false },\n): Promise<CarGroup> {\n const { files: roots } = makeFileCarHeader(done as FileTransactionMeta) as {\n files: AnyLink[];\n };\n const cids: AnyLink[] = [];\n // const fileStore = await this.fileStore();\n const codec = await fileStore.keyedCrypto().then((i) => i.codec());\n const cars = await prepareCarFilesFiles(codec, roots, t);\n for (const car of cars) {\n const { cid, bytes } = car;\n // real deal\n await fileStore.save({ cid, bytes });\n await walStore.enqueueFile(cid /*, !!opts.public*/);\n cids.push(cid);\n }\n return cids;\n}\n\nfunction makeFileCarHeader(result: FileTransactionMeta): TransactionMeta {\n const files: AnyLink[] = [];\n for (const [, meta] of Object.entries(result.files || {})) {\n if (meta && typeof meta === \"object\" && \"cid\" in meta && meta !== null) {\n files.push(meta.cid as AnyLink);\n }\n }\n return { ...result, files };\n}\n\nasync function prepareCarFilesFiles(\n encoder: AsyncBlockEncoder<24, Uint8Array>,\n roots: AnyLink[],\n t: CarTransaction,\n // isPublic: boolean,\n): Promise<{ cid: AnyLink; bytes: Uint8Array }[]> {\n // const theKey = isPublic ? null : await this._getKey();\n // const kc = await store.keyedCrypto()\n // const car = kc.isEncrypting\n // ? await encryptedEncodeCarFile(this.logger, kc, roots[0], t)\n // : await encodeCarFile(roots, t);\n return [await encodeCarFile(roots, t, encoder)];\n}\n\n// PUR Commit\n\nfunction makeCarHeader<T>(meta: T, cars: CarLog, compact = false): CarHeader<T> {\n const coreHeader = compact\n ? { cars: [] as FroozenCarLog, compact: cars.asArray() }\n : { cars: cars.asArray(), compact: [] as FroozenCarLog };\n return { ...coreHeader, meta };\n}\n\nasync function encodeCarHeader<T>(fp: CarHeader<T>) {\n return (await encode({\n value: { fp },\n hasher: sha256,\n codec: dagCodec,\n })) as AnyBlock;\n}\n\nexport interface CommitParams {\n readonly encoder: AsyncBlockEncoder<24, Uint8Array>;\n readonly carLog: CarLog;\n readonly carStore: CarStore;\n readonly WALStore: WALStore;\n readonly metaStore: MetaStore;\n readonly threshold?: number;\n}\n\nexport async function commit<T>(\n params: CommitParams,\n t: CarTransaction,\n done: T,\n opts: CommitOpts = { noLoader: false, compact: false },\n): Promise<{ cgrp: CarGroup; header: CarHeader<T> }> {\n const fp = makeCarHeader<T>(done, params.carLog, !!opts.compact);\n const rootBlock = await encodeCarHeader(fp);\n\n const cars = await prepareCarFiles(params.encoder, params.threshold, rootBlock, t);\n // console.log(\n // \"commit-root\",\n // rootBlock.cid.toString(),\n // fp,\n // cars.map((c) => c.cid.toString()),\n // );\n const cids: AnyLink[] = [];\n // console.log(\"committing\", cars.map((c) => c.cid.toString()));\n for (const car of cars) {\n const { cid, bytes } = car;\n await params.carStore.save({ cid, bytes });\n cids.push(cid);\n }\n\n // await this.cacheTransaction(t);\n const newDbMeta = { cars: cids } as DbMeta;\n await params.WALStore.enqueue(newDbMeta, opts);\n await params.metaStore.save(newDbMeta);\n return { cgrp: cids, header: fp };\n}\n\nasync function prepareCarFiles(\n encoder: AsyncBlockEncoder<24, Uint8Array>,\n threshold: number | undefined,\n rootBlock: AnyBlock,\n t: CarTransaction,\n): Promise<{ cid: AnyLink; bytes: Uint8Array }[]> {\n // const theKey = isPublic ? undefined : await this._getKey();\n const carFiles: { cid: AnyLink; bytes: Uint8Array }[] = [];\n threshold = threshold || 16 * 65536;\n let clonedt = new CarTransactionImpl(t.parent, { add: false, noLoader: false });\n // console.log(\"prepareCarFiles-root\", rootBlock.cid.toString());\n clonedt.putSync(rootBlock.cid, rootBlock.bytes);\n let newsize = CBW.blockLength(toCIDBlock(rootBlock));\n let cidRootBlock = rootBlock;\n for await (const { cid, bytes } of t.entries()) {\n // console.log(\"prepareCarFiles\", cid.toString(), bytes.length);\n newsize += CBW.blockLength(toCIDBlock({ cid: cid, bytes }));\n // console.log(\"prepareCarFiles\", cid.toString(), bytes.length)\n if (newsize >= threshold) {\n carFiles.push(await createCarFile(encoder, cidRootBlock.cid, clonedt));\n clonedt = new CarTransactionImpl(t.parent, { add: false, noLoader: false });\n clonedt.putSync(cid, bytes);\n cidRootBlock = { cid, bytes };\n newsize = CBW.blockLength(toCIDBlock({ cid, bytes })); //+ CBW.blockLength(rootBlock)\n } else {\n clonedt.putSync(cid, bytes);\n }\n }\n // HEREMENO\n carFiles.push(await createCarFile(encoder, cidRootBlock.cid, clonedt));\n // console.log(\"split to \", carFiles.length, \"files\")\n return carFiles;\n}\n","import { Logger } from \"@adviser/cement\";\nimport type { ActiveStore, CarClockHead, CarClockLink, DbMeta } from \"./types.js\";\nimport { ensureLogger } from \"../utils.js\";\nimport { SuperThis } from \"../types.js\";\n\ninterface TaskItem {\n readonly cid: string;\n readonly dbMeta: DbMeta;\n readonly store: ActiveStore;\n retries: number;\n}\n\nexport interface TaskManagerParams {\n readonly removeAfter: number; // default 3\n readonly retryTimeout: number; // default 50\n}\n\nexport class TaskManager {\n // we need to remove the events after some time\n private readonly eventsWeHandled = new Set<string>();\n\n private queue: TaskItem[] = [];\n private isProcessing = false;\n\n readonly logger: Logger;\n readonly params: TaskManagerParams;\n\n readonly callback: (dbMeta: DbMeta, store: ActiveStore) => Promise<void>;\n constructor(sthis: SuperThis, callback: (dbMeta: DbMeta, store: ActiveStore) => Promise<void>, params: TaskManagerParams) {\n this.logger = ensureLogger(sthis, \"TaskManager\");\n this.callback = callback;\n this.params = params;\n }\n\n async handleEvent(cid: CarClockLink, parents: CarClockHead, dbMeta: DbMeta, store: ActiveStore) {\n for (const parent of parents) {\n this.eventsWeHandled.add(parent.toString());\n }\n this.queue.push({ cid: cid.toString(), dbMeta, retries: 0, store });\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 this.isProcessing = false;\n return;\n }\n try {\n await this.callback(first.dbMeta, first.store);\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 this.logger.Warn().Err(err).Msg(\"retry to process event block\");\n } finally {\n this.isProcessing = false;\n if (this.queue.length > 0) {\n void this.processQueue();\n }\n }\n }\n}\n","import { KeyedResolvOnce, CoerceURI, isCoerceURI, URI } from \"@adviser/cement\";\nimport { Attached, Attachable, GatewayUrls, UnReg, GatewayUrlsParam, DataAndMetaAndWalAndBaseStore } from \"../types.js\";\nimport { toStoreRuntime } from \"./store-factory.js\";\nimport {\n AttachedStores,\n Loadable,\n DataAndMetaAndWalStore,\n ActiveStore,\n DataAndMetaStore,\n LocalActiveStore,\n LocalDataAndMetaAndWalStore,\n BaseStore,\n MetaActiveStore,\n WALActiveStore,\n MetaStore,\n WALAttachedStores,\n WALStore,\n MetaAttachedStores,\n FileActiveStore,\n CarActiveStore,\n CarAttachedStores,\n CarStore,\n FileAttachedStores,\n FileStore,\n} from \"./types.js\";\nimport { ensureURIDefaults, toSortedArray } from \"../utils.js\";\n\nclass AttachedImpl implements Attached {\n readonly gatewayUrls: GatewayUrls;\n readonly stores: DataAndMetaAndWalAndBaseStore;\n private readonly unreg: UnReg;\n constructor(gws: GatewayUrls, stores: DataAndMetaAndWalStore, unreg: UnReg) {\n this.gatewayUrls = gws;\n this.stores = new DataAndMetaAndWalAndBaseStore(stores);\n this.unreg = unreg;\n }\n async detach(): Promise<void> {\n const toClose = [this.stores.car.close(), this.stores.file.close(), this.stores.meta.close()];\n if (this.stores.wal) {\n toClose.push(this.stores.wal.close());\n }\n await Promise.all(toClose);\n this.unreg();\n }\n status(): ReturnType<Attached[\"status\"]> {\n return \"attached\";\n }\n}\n\nclass FileActiveStoreImpl extends FileActiveStore {\n readonly ref: ActiveStore;\n readonly active: FileStore;\n protected readonly xattached: FileAttachedStores;\n\n constructor(ref: ActiveStore, active: FileStore, attached: FileAttachedStores) {\n super();\n this.ref = ref;\n this.active = active;\n this.xattached = attached;\n }\n local(): FileStore {\n return this.xattached.local();\n }\n remotes(): FileStore[] {\n return this.xattached.remotes();\n }\n}\n\nclass CarActiveStoreImpl extends CarActiveStore {\n readonly ref: ActiveStore;\n readonly active: CarStore;\n protected readonly xattached: CarAttachedStores;\n\n constructor(ref: ActiveStore, active: CarStore, attached: CarAttachedStores) {\n super();\n this.ref = ref;\n this.active = active;\n this.xattached = attached;\n }\n local(): CarStore {\n return this.xattached.local();\n }\n remotes(): CarStore[] {\n return [this.active, ...this.xattached.remotes().filter((i) => i !== this.active)];\n }\n}\n\nclass CarAttachedStoresImpl implements CarAttachedStores {\n readonly attached: AttachedStores;\n constructor(attached: AttachedStores) {\n this.attached = attached;\n }\n local(): CarStore {\n return this.attached.local().active.car;\n }\n remotes(): CarStore[] {\n return this.attached.remotes().map(({ active }) => active.car);\n }\n}\n\nclass FileAttachedStoresImpl implements FileAttachedStores {\n readonly attached: AttachedStores;\n constructor(attached: AttachedStores) {\n this.attached = attached;\n }\n local(): FileStore {\n return this.attached.local().active.file;\n }\n remotes(): FileStore[] {\n return this.attached.remotes().map(({ active }) => active.file);\n }\n}\n\nclass MetaActiveStoreImpl extends MetaActiveStore {\n readonly ref: ActiveStore;\n readonly active: MetaStore;\n protected readonly xattached: MetaAttachedStores;\n\n constructor(ref: ActiveStore, active: MetaStore, attached: MetaAttachedStores) {\n super();\n this.ref = ref;\n this.active = active;\n this.xattached = attached;\n }\n local(): MetaStore {\n return this.xattached.local();\n }\n remotes(): MetaStore[] {\n return [this.active, ...this.xattached.remotes().filter((i) => i !== this.active)];\n }\n}\n\nclass MetaAttachedStoresImpl implements MetaAttachedStores {\n readonly attached: AttachedStores;\n constructor(attached: AttachedStores) {\n this.attached = attached;\n }\n local(): MetaStore {\n return this.attached.local().active.meta;\n }\n remotes(): MetaStore[] {\n return this.attached.remotes().map(({ active }) => active.meta);\n }\n}\n\nclass WALActiveStoreImpl extends WALActiveStore {\n readonly ref: ActiveStore;\n readonly active: WALStore;\n protected readonly xattached: WALAttachedStores;\n\n constructor(ref: ActiveStore, active: WALStore, attached: WALAttachedStores) {\n super();\n this.ref = ref;\n this.active = active;\n this.xattached = attached;\n }\n\n local(): WALStore {\n return this.xattached.local();\n }\n remotes(): WALStore[] {\n return this.xattached.remotes();\n }\n}\n\nclass WALAttachedStoresImpl implements WALAttachedStores {\n readonly attached: AttachedStores;\n constructor(attached: AttachedStores) {\n this.attached = attached;\n }\n local(): WALStore {\n return this.attached.local().active.wal;\n }\n remotes(): WALStore[] {\n return (\n this.attached\n .remotes()\n .filter(({ active }) => active.wal)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .map(({ active }) => active.wal!)\n );\n }\n}\n\nclass ActiveStoreImpl<T extends DataAndMetaAndWalStore> implements ActiveStore {\n readonly active: T;\n readonly xattached: AttachedRemotesImpl;\n\n constructor(active: T, attached: AttachedRemotesImpl) {\n this.active = active;\n this.xattached = attached;\n }\n\n local(): LocalActiveStore {\n return this.xattached.local();\n }\n remotes(): ActiveStore[] {\n return this.xattached.remotes();\n // return [\n // this.attached.remotes().filter(i => i !== this.active)\n // ]\n }\n\n baseStores(): BaseStore[] {\n const bs: BaseStore[] = [this.active.car, this.active.file, this.active.meta];\n if (this.active.wal) {\n bs.push(this.active.wal);\n }\n return bs;\n }\n carStore(): CarActiveStore {\n return new CarActiveStoreImpl(this, this.active.car, new CarAttachedStoresImpl(this.xattached));\n }\n fileStore(): FileActiveStore {\n return new FileActiveStoreImpl(this, this.active.file, new FileAttachedStoresImpl(this.xattached));\n }\n metaStore(): MetaActiveStore {\n return new MetaActiveStoreImpl(this, this.active.meta, new MetaAttachedStoresImpl(this.xattached));\n }\n walStore(): WALActiveStore {\n if (!this.active.wal) {\n throw this.xattached.loadable.sthis.logger.Error().Msg(\"wal store not set\").AsError();\n }\n return new WALActiveStoreImpl(this, this.active.wal, new WALAttachedStoresImpl(this.xattached));\n }\n}\n\nfunction isLoadable(unknown: AttachedStores | Loadable): unknown is Loadable {\n return !!(unknown as Loadable).sthis && !!(unknown as Loadable).attachedStores;\n}\n\nexport async function createAttachedStores(\n urlOrGup: CoerceURI | GatewayUrlsParam,\n arOrLoadable: AttachedStores | Loadable,\n name = \"local\",\n): Promise<Attached> {\n let ar: AttachedStores;\n if (!isLoadable(arOrLoadable)) {\n ar = arOrLoadable;\n } else {\n ar = arOrLoadable.attachedStores;\n }\n let gup: GatewayUrlsParam;\n if (!urlOrGup) {\n throw new Error(\"urlOrGup is required\");\n }\n if (isCoerceURI(urlOrGup)) {\n const url = urlOrGup;\n gup = {\n car: { url },\n file: { url },\n meta: { url },\n wal: { url },\n };\n } else {\n gup = urlOrGup;\n }\n return await ar.attach({\n name,\n prepare: async () => gup,\n });\n}\n\nexport class AttachedRemotesImpl implements AttachedStores {\n private readonly _remotes = new KeyedResolvOnce<Attached>();\n\n readonly loadable: Loadable;\n // readonly attactedFileStore: DataStore;\n // readonly attactedCarStore: DataStore;\n // readonly attactedMetaStore: MetaStore;\n\n _local?: Attached;\n\n constructor(loadable: Loadable) {\n this.loadable = loadable;\n }\n\n forRemotes(action: (store: ActiveStore) => Promise<unknown>): Promise<void> {\n return Promise.all(this.remotes().map((i) => action(i))).then(() => undefined);\n }\n\n remotes(): ActiveStore[] {\n return this._remotes\n .values()\n .filter(({ value }) => value.isOk() && !value.Ok().stores.wal)\n .map(({ value }) => value.Ok().stores)\n .map((i) => this.activate(i));\n }\n\n local(): LocalActiveStore {\n if (!this._local) {\n throw this.loadable.sthis.logger.Error().Msg(\"local store not set\").AsError();\n }\n return new ActiveStoreImpl(this._local.stores as LocalDataAndMetaAndWalStore, this);\n }\n\n activate(store: DataAndMetaStore | CoerceURI): ActiveStore {\n if (isCoerceURI(store)) {\n const activateUrl = URI.from(store);\n let maxScore = 0;\n let maxStore: DataAndMetaStore | undefined;\n for (const { value } of this._remotes.values()) {\n if (value.isErr()) {\n continue;\n }\n for (const url of value.Ok().stores.baseStores.map((i) => i.url())) {\n const mr = url.match(activateUrl);\n if (mr.score > maxScore) {\n maxScore = mr.score;\n maxStore = value.Ok().stores;\n }\n }\n }\n if (!maxStore) {\n throw this.loadable.sthis.logger.Error().Url(activateUrl).Msg(\"no store found\").AsError();\n }\n store = maxStore;\n }\n return new ActiveStoreImpl(store as DataAndMetaStore, this);\n }\n\n async detach(): Promise<void> {\n await Promise.all(\n this._remotes.values().map(async ({ value: rvalue }) => {\n if (rvalue.isOk()) {\n await rvalue.Ok().detach();\n }\n }),\n );\n }\n\n async attach(attached: Attachable): Promise<Attached> {\n const gwp = await attached.prepare();\n const gws: GatewayUrls = {\n car: {\n ...gwp.car,\n url: ensureURIDefaults(this.loadable.sthis, attached.name, gwp.car.url, URI.from(gwp.car.url), \"car\"),\n },\n file: {\n ...gwp.file,\n url: ensureURIDefaults(this.loadable.sthis, attached.name, undefined, URI.from(gwp.file.url), \"file\", { file: true }),\n },\n meta: {\n ...gwp.meta,\n url: ensureURIDefaults(this.loadable.sthis, attached.name, undefined, URI.from(gwp.meta.url), \"meta\"),\n },\n wal: gwp.wal\n ? {\n ...gwp.wal,\n url: ensureURIDefaults(this.loadable.sthis, attached.name, undefined, URI.from(gwp.wal.url), \"wal\"),\n }\n : undefined,\n };\n const key = JSON.stringify(\n toSortedArray({\n carUrl: gws.car.url.toString(),\n filesUrl: gws.file.url.toString(),\n metaUrl: gws.meta.url.toString(),\n walUrl: gws.wal?.url.toString(),\n }),\n );\n\n return this._remotes.get(key).once(async () => {\n const rt = toStoreRuntime(this.loadable.sthis);\n const result = new AttachedImpl(\n gws,\n await rt.makeStores({\n byStore: gws,\n loader: this.loadable,\n }),\n () => {\n this._remotes.unget(key);\n },\n );\n if (result.stores.wal) {\n if (this._local) {\n throw this.loadable.sthis.logger.Error().Msg(\"local store could only set once\").AsError();\n }\n this._local = result;\n }\n return result;\n });\n }\n}\n","import { CryptoRuntime, Logger, URI } from \"@adviser/cement\";\nimport {\n BytesAndKeyWithIv,\n CodecOpts,\n IvAndKeyAndBytes,\n IvKeyIdData,\n CryptoAction,\n KeysByFingerprint,\n} from \"../blockstore/index.js\";\nimport { ensureLogger, UInt8ArrayEqual } from \"../utils.js\";\nimport { KeyBag } from \"./key-bag.js\";\nimport type { AsyncBlockCodec, ByteView } from \"./wait-pr-multiformats/codec-interface.js\";\nimport { base58btc } from \"multiformats/bases/base58\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as CBOR from \"cborg\";\nimport { PARAM, SuperThis } from \"../types.js\";\n\ninterface GenerateIVFn {\n calc(ko: CryptoAction, crypto: CryptoRuntime, data: Uint8Array): Promise<Uint8Array>;\n verify(ko: CryptoAction, crypto: CryptoRuntime, iv: Uint8Array, data: Uint8Array): Promise<boolean>;\n}\n\nconst generateIV: Record<string, GenerateIVFn> = {\n random: {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n calc: async (ko: CryptoAction, crypto: CryptoRuntime, data: Uint8Array): Promise<Uint8Array> => {\n return crypto.randomBytes(ko.ivLength);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n verify: async (ko: CryptoAction, crypto: CryptoRuntime, iv: Uint8Array, data: Uint8Array): Promise<boolean> => {\n return true;\n },\n },\n hash: {\n calc: async (ko: CryptoAction, crypto: CryptoRuntime, data: Uint8Array): Promise<Uint8Array> => {\n const hash = await hasher.digest(data);\n const hashBytes = new Uint8Array(hash.bytes);\n const hashArray = new Uint8Array(ko.ivLength);\n for (let i = 0; i < hashBytes.length; i++) {\n hashArray[i % ko.ivLength] ^= hashBytes[i];\n }\n return hashArray;\n },\n verify: async function (ko: CryptoAction, crypto: CryptoRuntime, iv: Uint8Array, data: Uint8Array): Promise<boolean> {\n return ko.url.getParam(PARAM.IV_VERIFY) !== \"disable\" && UInt8ArrayEqual(iv, await this.calc(ko, crypto, data));\n },\n },\n};\n\nfunction getGenerateIVFn(url: URI, opts: Partial<CodecOpts>): GenerateIVFn {\n const ivhash = opts.ivCalc || url.getParam(PARAM.IV_HASH) || \"hash\";\n return generateIV[ivhash] || generateIV[\"hash\"];\n}\n\nexport class BlockIvKeyIdCodec implements AsyncBlockCodec<24, Uint8Array, IvKeyIdData> {\n readonly code = 24;\n readonly name = \"Fireproof@encrypted-block:aes-gcm\";\n\n readonly ko: CryptoAction;\n readonly iv?: Uint8Array;\n readonly opts: Partial<CodecOpts>;\n constructor(ko: CryptoAction, iv?: Uint8Array, opts?: CodecOpts) {\n this.ko = ko;\n this.iv = iv;\n this.opts = opts || {};\n }\n\n // hashAsBytes(data: IvKeyIdData): AsyncHashAsBytes<Uint8Array<ArrayBufferLike>> {\n // return data;\n // }\n\n valueToHashBytes(value: IvKeyIdData): Promise<ByteView<unknown>> {\n return Promise.resolve(value.data);\n }\n bytesToHash(data: Uint8Array): Promise<ByteView<unknown>> {\n return Promise.resolve(data);\n }\n\n async encode(data: Uint8Array): Promise<Uint8Array> {\n const calcIv = this.iv || (await getGenerateIVFn(this.ko.url, this.opts).calc(this.ko, this.ko.crypto, data));\n const { iv } = this.ko.algo(calcIv);\n\n const defKey = await this.ko.key.get();\n if (!defKey) {\n throw this.ko.logger.Error().Msg(\"default key not found\").AsError();\n }\n const keyId = base58btc.decode(defKey?.fingerPrint);\n this.ko.logger.Debug().Str(\"fp\", defKey.fingerPrint).Msg(\"encode\");\n return CBOR.encode({\n iv: iv,\n keyId: keyId,\n data: await this.ko._encrypt({ iv, key: defKey.key, bytes: data }),\n } satisfies IvKeyIdData);\n }\n\n async decode(abytes: Uint8Array | ArrayBuffer): Promise<IvKeyIdData> {\n let bytes: Uint8Array;\n if (abytes instanceof Uint8Array) {\n bytes = abytes;\n } else {\n bytes = new Uint8Array(abytes);\n }\n const { iv, keyId, data } = CBOR.decode(bytes) as IvKeyIdData;\n const key = await this.ko.key.get(keyId);\n if (!key) {\n throw this.ko.logger.Error().Str(\"fp\", base58btc.encode(keyId)).Msg(\"keyId not found\").AsError();\n }\n const result = await this.ko._decrypt({ iv: iv, key: key.key, bytes: data });\n if (!this.opts?.noIVVerify && !(await getGenerateIVFn(this.ko.url, this.opts).verify(this.ko, this.ko.crypto, iv, result))) {\n throw this.ko.logger.Error().Msg(\"iv missmatch\").AsError();\n }\n return {\n iv,\n keyId,\n data: result,\n };\n }\n}\n\nclass cryptoAction implements CryptoAction {\n readonly code = 24;\n readonly ivLength = 12;\n readonly logger: Logger;\n readonly crypto: CryptoRuntime;\n readonly key: KeysByFingerprint;\n readonly isEncrypting = true;\n readonly url: URI;\n constructor(url: URI, key: KeysByFingerprint, cyopt: CryptoRuntime, sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"cryptoAction\");\n this.crypto = cyopt;\n this.key = key;\n this.url = url;\n }\n\n // keyByFingerPrint(id: Uint8Array | string): Promise<Result<KeyWithFingerPrint>> {\n // return this.key.get(id)\n // }\n\n // fingerPrint(): Promise<string> {\n // return this.key.get().then((k) => k.fingerPrint);\n // }\n codec(iv?: Uint8Array, opts?: CodecOpts): AsyncBlockCodec<24, Uint8Array, IvKeyIdData> {\n return new BlockIvKeyIdCodec(this, iv, opts);\n }\n algo(iv?: Uint8Array) {\n return {\n name: \"AES-GCM\",\n iv: iv || this.crypto.randomBytes(this.ivLength),\n tagLength: 128,\n };\n }\n async _decrypt(data: IvAndKeyAndBytes): Promise<Uint8Array> {\n // this.logger.Debug().Len(data.bytes, \"bytes\").Len(data.iv, \"iv\").Str(\"fp\", data.key).Msg(\"decrypting\");\n return new Uint8Array(await this.crypto.decrypt(this.algo(data.iv), data.key, data.bytes));\n }\n async _encrypt(data: BytesAndKeyWithIv): Promise<Uint8Array> {\n // const key = await this.key.get()\n // this.logger.Debug().Len(data.bytes).Str(\"fp\", key.fingerPrint).Msg(\"encrypting\");\n const a = this.algo(data.iv);\n return new Uint8Array(await this.crypto.encrypt(a, data.key, data.bytes));\n }\n}\n\nclass nullCodec implements AsyncBlockCodec<24, Uint8Array, IvKeyIdData> {\n readonly code = 24;\n readonly name = \"Fireproof@unencrypted-block\";\n readonly empty = new Uint8Array();\n\n async encode(data: Uint8Array): Promise<Uint8Array> {\n return data;\n }\n async decode(data: Uint8Array): Promise<IvKeyIdData> {\n return {\n iv: this.empty,\n keyId: this.empty,\n data: data,\n };\n }\n}\n\nclass noCrypto implements CryptoAction {\n readonly ivLength = 0;\n readonly code = 0x0;\n readonly name = \"Fireproof@unencrypted-block\";\n readonly logger: Logger;\n readonly crypto: CryptoRuntime;\n readonly key: KeysByFingerprint;\n readonly isEncrypting = false;\n readonly _fingerPrint = \"noCrypto:\" + Math.random();\n readonly url: URI;\n constructor(url: URI, cyrt: CryptoRuntime, sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"noCrypto\");\n this.crypto = cyrt;\n this.key = {\n id: sthis.nextId().str,\n name: \"noCrypto\",\n get: () => {\n throw this.logger.Error().Msg(\"noCrypto.get not implemented\").AsError();\n },\n upsert: () => {\n throw this.logger.Error().Msg(\"noCrypto.upsert not implemented\").AsError();\n },\n asKeysItem: () => {\n throw this.logger.Error().Msg(\"noCrypto.asKeysItem not implemented\").AsError();\n },\n };\n this.url = url;\n }\n\n fingerPrint(): Promise<string> {\n return Promise.resolve(this._fingerPrint);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n codec(iv?: Uint8Array): AsyncBlockCodec<24, Uint8Array, IvKeyIdData> {\n return new nullCodec();\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n algo(iv?: Uint8Array): { name: string; iv: Uint8Array; tagLength: number } {\n return {\n name: \"noCrypto\",\n iv: new Uint8Array(),\n tagLength: 0,\n };\n }\n _decrypt(): Promise<Uint8Array> {\n throw this.logger.Error().Msg(\"noCrypto.decrypt not implemented\").AsError();\n }\n _encrypt(): Promise<Uint8Array> {\n throw this.logger.Error().Msg(\"noCrypto.decrypt not implemented\").AsError();\n }\n}\n\nexport async function keyedCryptoFactory(url: URI, kb: KeyBag, sthis: SuperThis): Promise<CryptoAction> {\n const storekey = url.getParam(PARAM.STORE_KEY);\n if (storekey && storekey !== \"insecure\") {\n const rkey = await kb.getNamedKey(storekey, false);\n if (rkey.isErr()) {\n // try {\n // rkey = await kb.toKeyWithFingerPrint(storekey);\n // } catch (e) {\n throw (\n sthis.logger\n .Error()\n // .Err(e)\n .Str(\"keybag\", kb.rt.id())\n // .Result(\"key\", rkey)\n .Str(\"name\", storekey)\n .Msg(\"getNamedKey failed\")\n .AsError()\n );\n // }\n }\n return new cryptoAction(url, rkey.Ok(), kb.rt.crypto, sthis);\n }\n return new noCrypto(url, kb.rt.crypto, sthis);\n}\n","import { Result, URI } from \"@adviser/cement\";\nimport type {\n SerdeGateway,\n SerdeGatewayBuildUrlReturn,\n SerdeGatewayCloseReturn,\n SerdeGatewayCtx,\n SerdeGatewayDeleteReturn,\n SerdeGatewayDestroyReturn,\n SerdeGatewayGetReturn,\n SerdeGatewayInterceptor,\n SerdeGatewayPutReturn,\n SerdeGatewayStartReturn,\n SerdeGatewaySubscribeReturn,\n SerdeGetResult,\n UnsubscribeResult,\n VoidResult,\n} from \"./serde-gateway.js\";\nimport type { SuperThis } from \"../types.js\";\nimport { FPEnvelope, FPEnvelopeMeta } from \"./fp-envelope.js\";\n\nexport class PassThroughGateway implements SerdeGatewayInterceptor {\n async buildUrl(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<SerdeGatewayBuildUrlReturn>> {\n const op = { url, key };\n return Result.Ok({ op });\n }\n async start(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayStartReturn>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async close(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayCloseReturn>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async delete(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDeleteReturn>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async destroy(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDestroyReturn>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async put<T>(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope<T>): Promise<Result<SerdeGatewayPutReturn<T>>> {\n const op = { url, body };\n return Result.Ok({ op });\n }\n async get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayGetReturn<S>>> {\n const op = { url };\n return Result.Ok({ op });\n }\n async subscribe(\n ctx: SerdeGatewayCtx,\n url: URI,\n callback: (meta: FPEnvelopeMeta) => Promise<void>,\n ): Promise<Result<SerdeGatewaySubscribeReturn>> {\n const op = { url, callback };\n return Result.Ok({ op });\n }\n}\n\nconst passThrougthGateway = new PassThroughGateway();\n\nexport class InterceptorGateway implements SerdeGateway {\n readonly innerGW: SerdeGateway;\n readonly interceptor: SerdeGatewayInterceptor;\n\n constructor(sthis: SuperThis, innerGW: SerdeGateway, interceptor: SerdeGatewayInterceptor | undefined) {\n this.innerGW = innerGW;\n this.interceptor = interceptor || passThrougthGateway;\n }\n\n async buildUrl(ctx: SerdeGatewayCtx, baseUrl: URI, key: string): Promise<Result<URI>> {\n const rret = await this.interceptor.buildUrl(ctx, baseUrl, key);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.buildUrl(ctx, ret.op.url, ret.op.key);\n }\n\n async destroy(ctx: SerdeGatewayCtx, iurl: URI): Promise<Result<void>> {\n const rret = await this.interceptor.destroy(ctx, iurl);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.destroy(ctx, ret.op.url);\n }\n\n async start(ctx: SerdeGatewayCtx, url: URI): Promise<Result<URI>> {\n const rret = await this.interceptor.start(ctx, url);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return await this.innerGW.start(ctx, ret.op.url);\n }\n\n async close(ctx: SerdeGatewayCtx, url: URI): Promise<VoidResult> {\n const rret = await this.interceptor.close(ctx, url);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return await this.innerGW.close(ctx, ret.op.url);\n }\n\n async put<T>(ctx: SerdeGatewayCtx, url: URI, fpEnv: FPEnvelope<T>): Promise<VoidResult> {\n const rret = await this.interceptor.put(ctx, url, fpEnv);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.put(ctx, ret.op.url, ret.op.body);\n }\n\n async get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<SerdeGetResult<S>> {\n const rret = await this.interceptor.get<S>(ctx, url);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.get(ctx, ret.op.url);\n }\n\n async subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (msg: FPEnvelopeMeta) => Promise<void>): Promise<UnsubscribeResult> {\n if (!this.innerGW.subscribe) {\n return Result.Err(ctx.loader.sthis.logger.Error().Url(url).Msg(\"subscribe not supported\").AsError());\n }\n const rret = await this.interceptor.subscribe(ctx, url, callback);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.subscribe(ctx, ret.op.url, ret.op.callback);\n }\n\n async delete(ctx: SerdeGatewayCtx, url: URI): Promise<VoidResult> {\n const rret = await this.interceptor.delete(ctx, url);\n if (rret.isErr()) {\n return Result.Err(rret.Err());\n }\n const ret = rret.unwrap();\n if (ret.stop && ret.value) {\n return ret.value;\n }\n return this.innerGW.delete(ctx, url);\n }\n\n async getPlain(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<Uint8Array>> {\n return this.innerGW.getPlain(ctx, url, key);\n }\n}\n","import { URI, Promisable, Result } from \"@adviser/cement\";\nimport { PassThroughGateway } from \"./interceptor-gateway.js\";\nimport {\n SerdeGatewayBuildUrlReturn,\n SerdeGatewayCloseReturn,\n SerdeGatewayCtx,\n SerdeGatewayDeleteReturn,\n SerdeGatewayDestroyReturn,\n SerdeGatewayGetReturn,\n SerdeGatewayPutReturn,\n SerdeGatewayStartReturn,\n SerdeGatewaySubscribeReturn,\n} from \"./serde-gateway.js\";\nimport { FPEnvelope, FPEnvelopeMeta } from \"./fp-envelope.js\";\n\nexport type URIMapper = (uri: URI) => Promisable<URI>;\n\nexport class URIInterceptor extends PassThroughGateway {\n static withMapper(mapper: URIMapper): URIInterceptor {\n return new URIInterceptor().addMapper(mapper);\n }\n\n readonly #uriMapper = new Set<URIMapper>();\n\n addMapper(mapper: URIMapper): URIInterceptor {\n this.#uriMapper.add(mapper);\n return this;\n }\n\n async #map(uri: URI): Promise<URI> {\n let ret = uri;\n for (const mapper of this.#uriMapper) {\n ret = await mapper(ret);\n }\n return ret;\n }\n\n async buildUrl(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<SerdeGatewayBuildUrlReturn>> {\n const ret = await super.buildUrl(ctx, await this.#map(url), key);\n return ret;\n }\n async start(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayStartReturn>> {\n const ret = await super.start(ctx, await this.#map(url));\n return ret;\n }\n async close(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayCloseReturn>> {\n const ret = await super.close(ctx, await this.#map(url));\n return ret;\n }\n async delete(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDeleteReturn>> {\n const ret = await super.delete(ctx, await this.#map(url));\n return ret;\n }\n async destroy(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDestroyReturn>> {\n const ret = await super.destroy(ctx, await this.#map(url));\n return ret;\n }\n async put<T>(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope<T>): Promise<Result<SerdeGatewayPutReturn<T>>> {\n const ret = await super.put<T>(ctx, await this.#map(url), body);\n return ret;\n }\n async get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayGetReturn<S>>> {\n const ret = await super.get<S>(ctx, await this.#map(url));\n return ret;\n }\n async subscribe(\n ctx: SerdeGatewayCtx,\n url: URI,\n callback: (meta: FPEnvelopeMeta) => Promise<void>,\n ): Promise<Result<SerdeGatewaySubscribeReturn>> {\n const ret = await super.subscribe(ctx, await this.#map(url), callback);\n return ret;\n }\n}\n","import { encode, decode, Block } from \"./runtime/wait-pr-multiformats/block.js\";\nimport { parse } from \"multiformats/link\";\nimport { sha256 as hasher } from \"multiformats/hashes/sha2\";\nimport * as codec from \"@ipld/dag-cbor\";\nimport { put, get, entries, root } from \"@web3-storage/pail/crdt\";\nimport { EventBlockView, EventLink, Operation, PutOperation, Result } 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 BlockFetcher,\n TransactionMeta,\n AnyLink,\n StoreRuntime,\n CompactFetcher,\n} from \"./blockstore/index.js\";\nimport {\n type IndexKeyType,\n type DocUpdate,\n type ClockHead,\n type DocValue,\n type CRDTMeta,\n type ChangesOptions,\n type DocFileMeta,\n type DocFiles,\n type DocSet,\n type DocWithId,\n type DocTypes,\n throwFalsy,\n CarTransaction,\n BaseBlockstore,\n PARAM,\n} from \"./types.js\";\nimport { Logger } from \"@adviser/cement\";\nimport { CarTransactionImpl } from \"./blockstore/transaction.js\";\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 function sanitizeDocumentFields<T>(obj: T): T {\n if (Array.isArray(obj)) {\n return obj.map((item: unknown) => {\n if (typeof item === \"object\" && item !== null) {\n return sanitizeDocumentFields(item);\n }\n return item;\n }) as T;\n } else if (typeof obj === \"object\" && obj !== null) {\n // Special case for Date objects - convert to ISO string\n if (obj instanceof Date) {\n return obj.toISOString() as unknown as T;\n }\n\n const typedObj = obj as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n for (const key in typedObj) {\n if (Object.hasOwnProperty.call(typedObj, key)) {\n const value = typedObj[key];\n if (value === null || (!Number.isNaN(value) && value !== undefined)) {\n if (typeof value === \"object\" && !key.startsWith(\"_\")) {\n // Handle Date objects in properties\n if (value instanceof Date) {\n result[key] = (value as Date).toISOString();\n } else {\n const sanitized = sanitizeDocumentFields(value);\n result[key] = sanitized;\n }\n } else {\n result[key] = value;\n }\n }\n }\n }\n return result as T;\n }\n return obj;\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 } satisfies CRDTMeta;\n}\n\n// this whole thing can get pulled outside of the write queue\nasync function writeDocContent<T extends DocTypes>(\n store: StoreRuntime,\n blocks: CarTransaction,\n update: DocUpdate<T>,\n logger: Logger,\n): Promise<AnyLink> {\n let value: Partial<DocValue<T>>;\n if (update.del) {\n value = { del: true };\n } else {\n if (!update.value) throw logger.Error().Msg(\"Missing value\").AsError();\n await processFiles(store, blocks, update.value, logger);\n value = { doc: update.value as DocWithId<T> };\n }\n const block = await encode({ value, hasher, codec });\n blocks.putSync(block.cid, block.bytes);\n return block.cid;\n}\n\nasync function processFiles<T extends DocTypes>(store: StoreRuntime, blocks: CarTransaction, doc: DocSet<T>, logger: Logger) {\n if (doc._files) {\n await processFileset(logger, store, blocks, doc._files);\n }\n if (doc._publicFiles) {\n await processFileset(logger, store, blocks, doc._publicFiles /*, true*/);\n }\n}\n\nasync function processFileset(\n logger: Logger,\n store: StoreRuntime,\n blocks: CarTransaction,\n files: DocFiles /*, publicFiles = false */,\n) {\n const dbBlockstore = blocks.parent as unknown as EncryptedBlockstore;\n if (!dbBlockstore.loader) throw logger.Error().Msg(\"Missing loader, ledger name is required\").AsError();\n const t = new CarTransactionImpl(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, lastModified: file.lastModified } as DocFileMeta;\n } else {\n const { cid, type, size, car, lastModified } = files[filename] as DocFileMeta;\n if (cid && type && size && car) {\n files[filename] = { cid, type, size, car, lastModified };\n }\n }\n }\n\n if (didPut.length) {\n const car = await dbBlockstore.loader.commitFiles(\n t,\n { files } as unknown as TransactionMeta /* {\n public: publicFiles,\n } */,\n );\n if (car) {\n for (const name of didPut) {\n files[name] = { car, ...files[name] } as DocFileMeta;\n }\n }\n }\n}\n\nexport async function getValueFromCrdt<T extends DocTypes>(\n blocks: BaseBlockstore,\n head: ClockHead,\n key: string,\n logger: Logger,\n): Promise<DocValue<T>> {\n if (!head.length) throw logger.Debug().Msg(\"Getting from an empty ledger\").AsError();\n // console.log(\"getValueFromCrdt-1\", head, key)\n const link = await get(blocks, head, key);\n // console.log(\"getValueFromCrdt-2\", key)\n if (!link) throw logger.Error().Str(\"key\", key).Msg(`Missing key`).AsError();\n const ret = await getValueFromLink<T>(blocks, link, logger);\n // console.log(\"getValueFromCrdt-3\", key)\n return ret;\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 const result = await blocks.ebOpts.storeRuntime.decodeFile(\n {\n get: async (cid: AnyLink) => {\n return await blocks.getFile(throwFalsy(fileMeta.car), cid);\n },\n },\n fileMeta.cid,\n fileMeta,\n );\n if (result.isErr()) {\n throw blocks.logger.Error().Any(\"error\", result.Err()).Any(\"cid\", fileMeta.cid).Msg(\"Error decoding file\").AsError();\n }\n\n return result.unwrap();\n };\n }\n }\n files[filename] = fileMeta;\n }\n}\n\nasync function getValueFromLink<T extends DocTypes>(blocks: BlockFetcher, link: AnyLink, logger: Logger): Promise<DocValue<T>> {\n const block = await blocks.get(link);\n if (!block) throw logger.Error().Str(\"link\", link.toString()).Msg(`Missing linked block`).AsError();\n const { value } = (await decode({ bytes: block.bytes, hasher, codec })) as { value: DocValue<T> };\n const cvalue = {\n ...value,\n cid: link,\n };\n readFiles(blocks as EncryptedBlockstore, cvalue);\n return cvalue;\n}\n\nclass DirtyEventFetcher<T> extends EventFetcher<T> {\n readonly logger: Logger;\n constructor(logger: Logger, blocks: BlockFetcher) {\n super(blocks);\n this.logger = logger;\n }\n async get(link: EventLink<T>): Promise<EventBlockView<T>> {\n try {\n return super.get(link);\n } catch (e) {\n this.logger.Error().Ref(\"link\", link.toString()).Err(e).Msg(\"Missing event\");\n return { value: undefined } as unknown as EventBlockView<T>;\n }\n }\n}\n\nexport async function clockChangesSince<T extends DocTypes>(\n blocks: BlockFetcher,\n head: ClockHead,\n since: ClockHead,\n opts: ChangesOptions,\n logger: Logger,\n): Promise<{ result: DocUpdate<T>[]; head: ClockHead }> {\n const eventsFetcher = (\n opts.dirty ? new DirtyEventFetcher<Operation>(logger, blocks) : new EventFetcher<Operation>(blocks)\n ) as EventFetcher<Operation>;\n const keys = new Set<string>();\n const updates = await gatherUpdates<T>(\n blocks,\n eventsFetcher,\n head,\n since,\n [],\n keys,\n new Set<string>(),\n opts.limit || Infinity,\n logger,\n );\n return { result: updates.reverse(), head };\n}\n\nasync function gatherUpdates<T extends DocTypes>(\n blocks: BlockFetcher,\n eventsFetcher: EventFetcher<Operation>,\n head: ClockHead,\n since: ClockHead,\n updates: DocUpdate<T>[] = [],\n keys: Set<string>,\n didLinks: Set<string>,\n limit: number,\n logger: Logger,\n): Promise<DocUpdate<T>[]> {\n if (limit <= 0) return updates;\n // if (Math.random() < 0.001) console.log('gatherUpdates', head.length, since.length, updates.length)\n const sHead = head.map((l) => l.toString());\n for (const link of since) {\n if (sHead.includes(link.toString())) {\n return updates;\n }\n }\n for (const link of head) {\n if (didLinks.has(link.toString())) continue;\n didLinks.add(link.toString());\n const { value: event } = await eventsFetcher.get(link);\n if (!event) continue;\n const { type } = event.data;\n let ops = [] as PutOperation[];\n if (type === \"batch\") {\n ops = event.data.ops as PutOperation[];\n } else if (type === \"put\") {\n ops = [event.data] as PutOperation[];\n }\n for (let i = ops.length - 1; i >= 0; i--) {\n const { key, value } = ops[i];\n if (!keys.has(key)) {\n // todo option to see all updates\n const docValue = await getValueFromLink<T>(blocks, value, logger);\n if (key === PARAM.GENESIS_CID) {\n continue;\n }\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 if (key !== PARAM.GENESIS_CID) {\n const docValue = await getValueFromLink(blocks, link, logger);\n yield { id: key, value: docValue.doc, del: docValue.del } as DocUpdate<T>;\n }\n }\n}\n\nexport async function* clockVis(blocks: BlockFetcher, head: ClockHead) {\n for await (const line of vis(blocks, head)) {\n yield line;\n }\n}\n\nlet isCompacting = false;\nexport async function doCompact(blockLog: CompactFetcher, head: ClockHead, logger: Logger) {\n if (isCompacting) {\n // console.log('already compacting')\n return;\n }\n isCompacting = true;\n\n time(\"compact head\");\n for (const cid of head) {\n const bl = await blockLog.get(cid);\n if (!bl) throw logger.Error().Ref(\"cid\", cid).Msg(\"Missing head block\").AsError();\n }\n timeEnd(\"compact head\");\n\n // for await (const blk of blocks.entries()) {\n // const bl = await blockLog.get(blk.cid)\n // if (!bl) throw new Error('Missing tblock: ' + blk.cid.toString())\n // }\n\n // todo maybe remove\n // for await (const blk of blocks.loader!.entries()) {\n // const bl = await blockLog.get(blk.cid)\n // if (!bl) throw new Error('Missing db block: ' + blk.cid.toString())\n // }\n\n time(\"compact all entries\");\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _entry of getAllEntries(blockLog, head, logger)) {\n // result.push(entry)\n // void 1;\n continue;\n }\n timeEnd(\"compact all entries\");\n\n // time(\"compact crdt entries\")\n // for await (const [, link] of entries(blockLog, head)) {\n // const bl = await blockLog.get(link)\n // if (!bl) throw new Error('Missing entry block: ' + link.toString())\n // }\n // timeEnd(\"compact crdt entries\")\n\n time(\"compact clock vis\");\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _line of vis(blockLog, head)) {\n void 1;\n }\n timeEnd(\"compact clock vis\");\n\n time(\"compact root\");\n const result = await root(blockLog, head);\n timeEnd(\"compact root\");\n\n time(\"compact root blocks\");\n for (const { cid, bytes } of [...result.additions, ...result.removals]) {\n blockLog.loggedBlocks.putSync(cid, bytes);\n }\n timeEnd(\"compact root blocks\");\n\n time(\"compact changes\");\n await clockChangesSince(blockLog, head, [], {}, logger);\n timeEnd(\"compact changes\");\n\n isCompacting = false;\n}\n\nexport async function getBlock(blocks: BlockFetcher, cidString: string) {\n const block = await blocks.get(parse(cidString));\n if (!block) throw new Error(`Missing block ${cidString}`);\n const { cid, value } = await decode({ bytes: block.bytes, codec, hasher });\n return new Block({ cid, value, bytes: block.bytes });\n}\n","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 {\n type DocUpdate,\n type ClockHead,\n type DocTypes,\n type VoidFn,\n type UnReg,\n type SuperThis,\n type BaseBlockstore,\n type CarTransaction,\n PARAM,\n} from \"./types.js\";\nimport { applyHeadQueue, ApplyHeadQueue } from \"./apply-head-queue.js\";\nimport { ensureLogger } from \"./utils.js\";\n\nexport class CRDTClockImpl {\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 readonly head: ClockHead = [];\n\n readonly zoomers = new Map<string, VoidFn>();\n readonly watchers = new Map<string, (updates: DocUpdate<DocTypes>[]) => void>();\n readonly emptyWatchers = new Map<string, VoidFn>();\n\n readonly blockstore: BaseBlockstore;\n\n readonly applyHeadQueue: ApplyHeadQueue<DocTypes>;\n transaction?: CarTransaction;\n\n readonly _ready: ResolveOnce<void> = new ResolveOnce<void>();\n async ready(): Promise<void> {\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 readonly sthis: SuperThis;\n constructor(blockstore: BaseBlockstore) {\n this.sthis = blockstore.sthis;\n this.blockstore = blockstore;\n this.logger = ensureLogger(blockstore.sthis, \"CRDTClock\");\n this.applyHeadQueue = applyHeadQueue(this.int_applyHead.bind(this), this.logger);\n }\n\n setHead(head: ClockHead) {\n // this.head = head;\n this.head.splice(0, this.head.length, ...head);\n }\n\n async applyHead(newHead: ClockHead, prevHead: ClockHead, updates?: DocUpdate<DocTypes>[]): Promise<void> {\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<DocTypes>[], all: boolean, prevHead: ClockHead) {\n let internalUpdates = updatesAcc;\n if (this.watchers.size && !all) {\n const changes = await clockChangesSince<DocTypes>(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<DocTypes>[]) {\n updates = updates.filter((update) => update.id !== PARAM.GENESIS_CID);\n if (!updates.length) {\n return;\n }\n this.emptyWatchers.forEach((fn) => fn());\n this.watchers.forEach((fn) => fn(updates || []));\n }\n\n onTick(fn: (updates: DocUpdate<DocTypes>[]) => void): UnReg {\n const key = this.sthis.timeOrderedNextId().str;\n this.watchers.set(key, fn);\n return () => {\n this.watchers.delete(key);\n };\n }\n\n onTock(fn: VoidFn): UnReg {\n const key = this.sthis.timeOrderedNextId().str;\n this.emptyWatchers.set(key, fn);\n return () => {\n this.emptyWatchers.delete(key);\n };\n }\n\n onZoom(fn: VoidFn): UnReg {\n const key = this.sthis.timeOrderedNextId().str;\n this.zoomers.set(key, fn);\n return () => {\n this.zoomers.delete(key);\n };\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\n const noLoader = !localUpdates;\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 = 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 if (!this.transaction) {\n this.transaction = this.blockstore.openTransaction({ noLoader, add: false });\n }\n const tblocks = this.transaction;\n\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 if (!noLoader) {\n await this.blockstore.commitTransaction(tblocks, { head: advancedHead }, { add: false, noLoader });\n this.transaction = undefined;\n }\n this.setHead(advancedHead);\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.Error().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 await worker(task.newHead, task.prevHead, task.updates !== undefined).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","/*\n * Context class to store and retrieve values\n * it's used to store user runtime values like\n * the url to the ledger\n */\nexport class Context {\n private ctx = new Map<string, unknown>();\n\n set<T>(key: string, value: T): void {\n this.ctx.set(key, value);\n }\n get<T>(key: string): T | undefined {\n return this.ctx.get(key) as T;\n }\n delete(key: string): void {\n this.ctx.delete(key);\n }\n}\n","// export * from \"./sys-container.js\";\nexport * from \"./gateways/file/utils.js\";\n\n// export * as sql from \"./store-sql/index.js\";\nexport * as files from \"./files.js\";\n\nexport * as kb from \"./key-bag.js\";\nexport * as kc from \"./keyed-crypto.js\";\n\nexport * as mf from \"./wait-pr-multiformats/index.js\";\n\nexport * as sts from \"./sts-service/index.js\";\n\nexport { runtimeFn } from \"@adviser/cement\";\n\nexport * as gw from \"./gateways/index.js\";\n\nexport * from \"./key-bag.js\";\n\nexport * from \"./meta-key-hack.js\";\n\nexport { FILESTORE_VERSION } from \"./gateways/file/version.js\";\nexport { INDEXEDDB_VERSION } from \"./gateways/indexeddb-version.js\";\n// export { V0_19SQL_VERSION } from \"./store-sql/v0.19/version.js\";\n","export * as block from \"./block.js\";\nexport * as codec from \"./codec-interface.js\";\n","import type { ArrayBufferView, ByteView } from \"multiformats\";\n\n// export type HashAsBytes<T> = (v: T) => ByteView<unknown>;\n// export type AsyncHashAsBytes<T> =(v: T) => Promise<ByteView<unknown>>;\n\n/**\n * IPLD encoder part of the codec.\n */\nexport interface BlockEncoder<Code extends number, T> {\n readonly name: string;\n readonly code: Code;\n\n bytesToHash?(data: T): ByteView<unknown>;\n encode(data: T): ByteView<T>;\n}\n\nexport interface AsyncBlockEncoder<Code extends number, T> {\n readonly name: string;\n readonly code: Code;\n bytesToHash?(data: T): Promise<ByteView<unknown>>;\n encode(data: T): PromiseLike<ByteView<T>>;\n}\n\n/**\n * IPLD decoder part of the codec.\n */\nexport interface BlockDecoder<Code extends number, T> {\n readonly code: Code;\n valueToHashBytes?(value: T): ByteView<unknown>;\n\n // decode(bytes: ByteView<T> | ArrayBufferView<T>): T;\n // decode(bytes: ByteView<T> | ArrayBufferView<T>): PromiseLike<T>;\n decode(bytes: ByteView<unknown>): T;\n}\n\nexport interface AsyncBlockDecoder<Code extends number, T> {\n readonly code: Code;\n valueToHashBytes?(value: T): Promise<ByteView<unknown>>;\n // decode(bytes: ByteView<T> | ArrayBufferView<T>): T;\n // decode(bytes: ByteView<T> | ArrayBufferView<T>): PromiseLike<T>;\n decode(bytes: ByteView<unknown>): PromiseLike<T>;\n}\n\n/**\n * An IPLD codec is a combination of both encoder and decoder.\n */\nexport interface BlockCodec<Code extends number, E, D> extends BlockEncoder<Code, E>, BlockDecoder<Code, D> {}\nexport interface AsyncBlockCodec<Code extends number, E, D> extends AsyncBlockEncoder<Code, E>, AsyncBlockDecoder<Code, D> {}\n\nexport type { ArrayBufferView, ByteView };\n","import { Result, exception2Result } from \"@adviser/cement\";\nimport { exportJWK, importJWK, JWTVerifyResult, jwtVerify, SignJWT } from \"jose\";\nimport { generateKeyPair, GenerateKeyPairOptions } from \"jose/key/generate/keypair\";\nimport { base58btc } from \"multiformats/bases/base58\";\nimport { ensureSuperThis } from \"../../utils.js\";\nimport { SuperThis } from \"../../types.js\";\nimport { BaseTokenParam, FPCloudClaim, TokenForParam } from \"../../protocols/cloud/msg-types.js\";\n\nexport const envKeyDefaults = {\n SECRET: \"CLOUD_SESSION_TOKEN_SECRET\",\n PUBLIC: \"CLOUD_SESSION_TOKEN_PUBLIC\",\n};\n\ninterface SessionTokenServiceParam extends Partial<BaseTokenParam> {\n readonly token: string; // env encoded jwk\n}\n\ninterface SessionTokenServiceFromEnvParam extends Partial<BaseTokenParam> {\n readonly privateEnvKey?: string; // defaults CLOUD_SESSION_TOKEN_SECRET\n readonly publicEnvKey?: string; // defaults CLOUD_SESSION_TOKEN_PUBLIC\n}\n\nexport async function jwk2env(jwk: CryptoKey, sthis = ensureSuperThis()): Promise<string> {\n const inPubKey = await exportJWK(jwk);\n return base58btc.encode(sthis.txt.encode(JSON.stringify(inPubKey)));\n}\n\nexport async function env2jwk(env: string, alg: string, sthis = ensureSuperThis()): Promise<CryptoKey> {\n const inJWT = JSON.parse(sthis.txt.decode(base58btc.decode(env)));\n return importJWK(inJWT, alg, { extractable: true }) as Promise<CryptoKey>;\n}\n\nexport interface KeysResult {\n readonly material: CryptoKeyPair;\n readonly strings: { readonly publicKey: string; readonly privateKey: string };\n}\n\nexport class SessionTokenService {\n readonly #key: CryptoKey;\n readonly #param: SessionTokenServiceParam;\n\n static async generateKeyPair(\n alg = \"ES256\",\n options: GenerateKeyPairOptions = { extractable: true },\n generateKeyPairFN = (alg: string, options: GenerateKeyPairOptions) => generateKeyPair(alg, options),\n ): Promise<KeysResult> {\n const material = await generateKeyPairFN(alg, options);\n return {\n material,\n strings: {\n publicKey: await jwk2env(material.publicKey),\n privateKey: await jwk2env(material.privateKey),\n },\n };\n }\n\n static async createFromEnv(sthis: SuperThis, sp: SessionTokenServiceFromEnvParam = {}) {\n let envToken = sthis.env.get(sp.privateEnvKey ?? envKeyDefaults.SECRET);\n if (!envToken) {\n envToken = sthis.env.get(sp.publicEnvKey ?? envKeyDefaults.PUBLIC);\n }\n if (!envToken) {\n throw new Error(\n `env not found for: ${sp.privateEnvKey ?? envKeyDefaults.SECRET} or ${sp.publicEnvKey ?? envKeyDefaults.PUBLIC}`,\n );\n }\n return SessionTokenService.create({ token: envToken }, sthis);\n }\n\n static async create(stsparam: SessionTokenServiceParam, sthis: SuperThis = ensureSuperThis()) {\n const key = await env2jwk(stsparam.token, stsparam.alg ?? \"ES256\", sthis);\n return new SessionTokenService(key, stsparam);\n }\n\n private constructor(key: CryptoKey, stsparam: SessionTokenServiceParam) {\n this.#key = key;\n this.#param = stsparam;\n }\n\n get validFor() {\n let validFor = this.#param.validFor ?? 3600;\n if (!(0 <= validFor && validFor <= 3600000)) {\n validFor = 3600000;\n }\n return validFor;\n }\n\n get alg() {\n return this.#param.alg ?? \"ES256\";\n }\n\n get isssuer() {\n return this.#param.issuer ?? \"fireproof\";\n }\n\n get audience() {\n return this.#param.audience ?? \"fireproof\";\n }\n\n async validate(token: string): Promise<Result<JWTVerifyResult<FPCloudClaim>>> {\n return exception2Result(async () => {\n const ret = await jwtVerify<FPCloudClaim>(token, this.#key);\n return ret;\n });\n }\n\n // async getEnvKey(): Promise<string> {\n // return jwk2env(ensureSuperThis(), this.#key);\n // }\n\n async tokenFor(p: TokenForParam): Promise<string> {\n if (this.#key.type !== \"private\") {\n throw new Error(\"key must be private\");\n }\n const token = await new SignJWT({\n userId: p.userId,\n tenants: p.tenants,\n ledgers: p.ledgers,\n } satisfies FPCloudClaim)\n .setProtectedHeader({ alg: this.alg }) // algorithm\n .setIssuedAt()\n .setIssuer(p.issuer ?? this.isssuer) // issuer\n .setAudience(p.audience ?? this.audience) // audience\n .setExpirationTime(Date.now() + (p.validFor ?? this.validFor)) // expiration time\n .sign(this.#key);\n return token;\n }\n}\n","export * from \"./fp-envelope-serialize.js\";\nexport * as file from \"./file/index.js\";\nexport * as memory from \"./memory/gateway.js\";\nexport * as cloud from \"./cloud/gateway.js\";\nexport * from \"./def-serde-gateway.js\";\n","export * from \"./key-bag-file.js\";\nexport * from \"./sys-file-system-factory.js\";\n","// import PartySocket, { PartySocketOptions } from \"partysocket\";\nimport {\n Result,\n URI,\n KeyedResolvOnce,\n exception2Result,\n Logger,\n param,\n MatchResult,\n ResolveOnce,\n to_uint8,\n CoerceURI,\n} from \"@adviser/cement\";\nimport type { Attachable, GatewayUrlsParam, SuperThis } from \"../../../types.js\";\nimport {\n buildErrorMsg,\n buildReqOpen,\n FPStoreTypes,\n HttpMethods,\n MsgBase,\n MsgIsError,\n ReqSignedUrl,\n MsgWithError,\n ResSignedUrl,\n GwCtx,\n QSId,\n coerceFPStoreTypes,\n} from \"../../../protocols/cloud/msg-types.js\";\nimport { MsgConnected, MsgConnectedAuth, Msger, authTypeFromUri } from \"../../../protocols/cloud/msger.js\";\nimport {\n MsgIsResDelData,\n MsgIsResGetData,\n MsgIsResPutData,\n ResDelData,\n ResGetData,\n ResPutData,\n} from \"../../../protocols/cloud/msg-types-data.js\";\nimport { ensureLogger, NotFoundError } from \"../../../utils.js\";\nimport { SerdeGateway, SerdeGatewayCtx, SerdeGetResult, UnsubscribeResult, VoidResult } from \"../../../blockstore/serde-gateway.js\";\nimport { registerStoreProtocol } from \"../../../blockstore/register-store-protocol.js\";\nimport { FPEnvelope, FPEnvelopeMeta, FPEnvelopeWAL } from \"../../../blockstore/fp-envelope.js\";\nimport { dbMetaEvent2Serialized, decode2DbMetaEvents, fpDeserialize, fpSerialize } from \"../fp-envelope-serialize.js\";\nimport {\n BindGetMeta,\n buildBindGetMeta,\n buildReqDelMeta,\n buildReqPutMeta,\n EventGetMeta,\n MsgIsEventGetMeta,\n MsgIsResPutMeta,\n ReqDelMeta,\n ReqPutMeta,\n ResDelMeta,\n ResPutMeta,\n} from \"../../../protocols/cloud/msg-types-meta.js\";\nimport { encodeAsV2SerializedMetaKey, V2SerializedMetaKeyExtractKey } from \"../../meta-key-hack.js\";\n\nconst VERSION = \"v0.1-fp-cloud\";\n\ntype ConnectedSerdeGatewayCtx = SerdeGatewayCtx & { conn: AuthedConnection };\n\nexport interface StoreTypeGateway {\n get: <S>(ctx: ConnectedSerdeGatewayCtx, url: URI) => Promise<SerdeGetResult<S>>;\n put: <T>(ctx: ConnectedSerdeGatewayCtx, url: URI, body: FPEnvelope<T>) => Promise<VoidResult>;\n delete: (ctx: ConnectedSerdeGatewayCtx, url: URI) => Promise<VoidResult>;\n}\n\nabstract class BaseGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(sthis: SuperThis, module: string) {\n this.sthis = sthis;\n this.logger = ensureLogger(sthis, module);\n }\n\n async buildReqSignedUrl(\n type: string,\n method: HttpMethods,\n store: FPStoreTypes,\n uri: URI,\n conn: AuthedConnection,\n ): Promise<MsgWithError<ReqSignedUrl>> {\n const rParams = uri.getParamsResult({\n key: param.REQUIRED,\n store: param.REQUIRED,\n path: param.OPTIONAL,\n tenant: param.REQUIRED,\n name: param.REQUIRED,\n index: param.OPTIONAL,\n });\n if (rParams.isErr()) {\n return buildErrorMsg(this, {} as MsgBase, rParams.Err());\n }\n const params = rParams.Ok();\n if (store !== params.store) {\n return buildErrorMsg(this, {} as MsgBase, new Error(\"store mismatch\"));\n }\n const rAuth = await authTypeFromUri(this.logger, uri);\n if (rAuth.isErr()) {\n return buildErrorMsg(this, {} as MsgBase, rAuth.Err());\n }\n return {\n tid: this.sthis.nextId().str,\n auth: rAuth.Ok(),\n type,\n conn: conn.conn.Ok().conn,\n tenant: {\n tenant: params.tenant,\n ledger: params.name,\n },\n // tenant: conn.tenant,\n methodParams: {\n method,\n store,\n },\n params: {\n ...params,\n key: params.key,\n },\n version: VERSION,\n } satisfies ReqSignedUrl;\n }\n\n async getReqSignedUrl<S extends ResSignedUrl>(\n type: string,\n method: HttpMethods,\n store: FPStoreTypes,\n waitForFn: (msg: MsgBase) => boolean,\n uri: URI,\n conn: AuthedConnection,\n ): Promise<MsgWithError<S>> {\n const rsu = await this.buildReqSignedUrl(type, method, store, uri, conn);\n if (MsgIsError(rsu)) {\n return rsu;\n }\n return conn.conn.Ok().request<S, ReqSignedUrl>(rsu, { waitFor: waitForFn });\n }\n\n async putObject(uri: URI, uploadUrl: string, body: Uint8Array, conn: AuthedConnection): Promise<Result<void>> {\n this.logger.Debug().Any(\"url\", { uploadUrl, uri }).Msg(\"put-fetch-url\");\n const rUpload = await exception2Result(async () => fetch(uploadUrl, { method: \"PUT\", body }));\n if (rUpload.isErr()) {\n return this.logger.Error().Url(uploadUrl, \"uploadUrl\").Err(rUpload).Msg(\"Error in put fetch\").ResultError();\n }\n if (!rUpload.Ok().ok) {\n return this.logger.Error().Url(uploadUrl, \"uploadUrl\").Http(rUpload.Ok()).Msg(\"Error in put fetch\").ResultError();\n }\n if (uri.getParam(\"testMode\")) {\n conn.citem.trackPuts.add(uri.toString());\n }\n return Result.Ok(undefined);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async getObject(uri: URI, downloadUrl: string, _conn: AuthedConnection): Promise<Result<Uint8Array>> {\n this.logger.Debug().Any(\"url\", { downloadUrl, uri }).Msg(\"get-fetch-url\");\n const rDownload = await exception2Result(async () => fetch(downloadUrl.toString(), { method: \"GET\" }));\n if (rDownload.isErr()) {\n return this.logger.Error().Url(downloadUrl, \"uploadUrl\").Err(rDownload).Msg(\"Error in get downloadUrl\").ResultError();\n }\n const download = rDownload.Ok();\n if (!download.ok) {\n if (download.status === 404) {\n return Result.Err(new NotFoundError(\"Not found\"));\n }\n return this.logger.Error().Url(downloadUrl, \"uploadUrl\").Err(rDownload).Msg(\"Error in get fetch\").ResultError();\n }\n return Result.Ok(to_uint8(await download.arrayBuffer()));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async delObject(uri: URI, deleteUrl: string, _conn: AuthedConnection): Promise<Result<void>> {\n this.logger.Debug().Any(\"url\", { deleteUrl, uri }).Msg(\"get-fetch-url\");\n const rDelete = await exception2Result(async () => fetch(deleteUrl.toString(), { method: \"DELETE\" }));\n if (rDelete.isErr()) {\n return this.logger.Error().Url(deleteUrl, \"deleteUrl\").Err(rDelete).Msg(\"Error in get deleteURL\").ResultError();\n }\n const download = rDelete.Ok();\n if (!download.ok) {\n if (download.status === 404) {\n return Result.Err(new NotFoundError(\"Not found\"));\n }\n return this.logger.Error().Url(deleteUrl, \"deleteUrl\").Err(rDelete).Msg(\"Error in del fetch\").ResultError();\n }\n return Result.Ok(undefined);\n }\n}\n\nclass DataGateway extends BaseGateway implements StoreTypeGateway {\n constructor(sthis: SuperThis) {\n super(sthis, \"DataGateway\");\n }\n async get<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<SerdeGetResult<S>> {\n // type: string, method: HttpMethods, store: FPStoreTypes, waitForFn:\n const store = coerceFPStoreTypes(uri.getParam(\"store\"));\n const rResSignedUrl = await this.getReqSignedUrl<ResGetData>(\"reqGetData\", \"GET\", store, MsgIsResGetData, uri, ctx.conn);\n if (MsgIsError(rResSignedUrl)) {\n return this.logger.Error().Err(rResSignedUrl).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n const { signedUrl: downloadUrl } = rResSignedUrl;\n const r = await fpDeserialize(this.sthis, uri, this.getObject(uri, downloadUrl, ctx.conn));\n return r as SerdeGetResult<S>;\n }\n async put<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI, data: FPEnvelope<S>): Promise<Result<void>> {\n const store = coerceFPStoreTypes(uri.getParam(\"store\"));\n const rResSignedUrl = await this.getReqSignedUrl<ResPutData>(\"reqPutData\", \"PUT\", store, MsgIsResPutData, uri, ctx.conn);\n if (MsgIsError(rResSignedUrl)) {\n return this.logger.Error().Err(rResSignedUrl).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n const { signedUrl: uploadUrl } = rResSignedUrl;\n const rBlob = await fpSerialize(ctx.loader.sthis, data);\n if (rBlob.isErr()) {\n return rBlob;\n }\n const r = await this.putObject(uri, uploadUrl, rBlob.Ok(), ctx.conn);\n return r;\n }\n async delete(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<Result<void>> {\n const store = coerceFPStoreTypes(uri.getParam(\"store\"));\n const rResSignedUrl = await this.getReqSignedUrl<ResDelData>(\"reqDelData\", \"DELETE\", store, MsgIsResDelData, uri, ctx.conn);\n if (MsgIsError(rResSignedUrl)) {\n return this.logger.Error().Err(rResSignedUrl).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n const { signedUrl: deleteUrl } = rResSignedUrl;\n return this.delObject(uri, deleteUrl, ctx.conn);\n }\n}\n\nfunction getGwCtx(conn: QSId, uri: URI): Result<GwCtx> {\n const rParams = uri.getParamsResult({\n tid: param.OPTIONAL,\n tenant: param.REQUIRED,\n ledger: param.REQUIRED,\n });\n if (rParams.isErr()) {\n return Result.Err(rParams);\n }\n const r = rParams.Ok();\n return Result.Ok({\n tid: r.tid,\n conn,\n tenant: {\n tenant: r.tenant,\n ledger: r.ledger,\n },\n });\n}\n\nclass MetaGateway extends BaseGateway implements StoreTypeGateway {\n constructor(sthis: SuperThis) {\n super(sthis, \"MetaGateway\");\n }\n\n async get<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<SerdeGetResult<S>> {\n // const sp = sup({ method: \"GET\", store: \"meta\" });\n\n const reqSignedUrl = await this.buildReqSignedUrl(\"bindGetMeta\", \"GET\", \"meta\", uri, ctx.conn);\n if (MsgIsError(reqSignedUrl)) {\n return this.logger.Error().Err(reqSignedUrl).Msg(\"Error in buildReqSignedUrl\").ResultError();\n }\n const rGwCtx = getGwCtx(ctx.conn.conn.Ok().conn, uri);\n if (rGwCtx.isErr()) {\n return Result.Err(rGwCtx);\n }\n const rAuthType = await ctx.conn.conn.Ok().authType();\n if (rAuthType.isErr()) {\n return Result.Err(rAuthType);\n }\n const res = await ctx.conn.conn\n .Ok()\n .request<EventGetMeta, BindGetMeta>(buildBindGetMeta(ctx.loader.sthis, rAuthType.Ok(), reqSignedUrl.params, rGwCtx.Ok()), {\n waitFor: MsgIsEventGetMeta,\n });\n if (MsgIsError(res)) {\n return this.logger.Error().Err(res).Msg(\"Error in buildBindGetMeta\").ResultError();\n }\n const rV2Meta = await V2SerializedMetaKeyExtractKey(ctx, res.meta);\n const rMeta = await decode2DbMetaEvents(ctx.loader.sthis, rV2Meta);\n if (rMeta.isErr()) {\n return Result.Err(rMeta);\n }\n return Result.Ok({\n type: \"meta\",\n payload: rMeta.Ok(),\n } satisfies FPEnvelopeMeta as FPEnvelope<S>);\n }\n async put<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI, imeta: FPEnvelope<S>): Promise<Result<void>> {\n const meta = imeta as FPEnvelopeMeta;\n const reqSignedUrl = await this.buildReqSignedUrl(\"reqPutMeta\", \"PUT\", \"meta\", uri, ctx.conn);\n if (MsgIsError(reqSignedUrl)) {\n return this.logger.Error().Err(reqSignedUrl).Msg(\"Error in buildReqSignedUrl\").ResultError();\n }\n const rGwCtx = getGwCtx(ctx.conn.conn.Ok().conn, uri);\n if (rGwCtx.isErr()) {\n return Result.Err(rGwCtx);\n }\n const rAuthType = await ctx.conn.conn.Ok().authType();\n if (rAuthType.isErr()) {\n return Result.Err(rAuthType);\n }\n\n const serializedMeta = await dbMetaEvent2Serialized(ctx.loader.sthis, meta.payload);\n\n const rKeyedMeta = await encodeAsV2SerializedMetaKey(ctx, serializedMeta);\n if (rKeyedMeta.isErr()) {\n return rKeyedMeta;\n }\n const reqPutMeta = buildReqPutMeta(ctx.loader.sthis, rAuthType.Ok(), reqSignedUrl.params, rKeyedMeta.Ok(), rGwCtx.Ok());\n const resMsg = await ctx.conn.conn.Ok().request<ResPutMeta, ReqPutMeta>(reqPutMeta, {\n waitFor: MsgIsResPutMeta,\n });\n if (MsgIsError(resMsg)) {\n return this.logger.Error().Err(resMsg).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n return Result.Ok(undefined);\n }\n\n async delete(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<Result<void>> {\n const reqSignedUrl = await this.getReqSignedUrl<ResDelData>(\"reqDelMeta\", \"DELETE\", \"meta\", MsgIsResDelData, uri, ctx.conn);\n if (MsgIsError(reqSignedUrl)) {\n return this.logger.Error().Err(reqSignedUrl).Msg(\"Error in buildReqSignedUrl\").ResultError();\n }\n const rGwCtx = getGwCtx(ctx.conn.conn.Ok().conn, uri);\n if (rGwCtx.isErr()) {\n return Result.Err(rGwCtx);\n }\n const rAuthType = await ctx.conn.conn.Ok().authType();\n if (rAuthType.isErr()) {\n return Result.Err(rAuthType);\n }\n const reqDelMeta = buildReqDelMeta(ctx.loader.sthis, rAuthType.Ok(), reqSignedUrl.params, rGwCtx.Ok());\n const resMsg = await ctx.conn.conn.Ok().request<ResDelMeta, ReqDelMeta>(reqDelMeta, {\n waitFor: MsgIsResDelData,\n });\n if (MsgIsError(resMsg)) {\n return this.logger.Error().Err(resMsg).Msg(\"Error in buildResSignedUrl\").ResultError();\n }\n return Result.Ok(undefined);\n }\n}\n\nclass WALGateway extends BaseGateway implements StoreTypeGateway {\n // WAL will not pollute to the cloud\n readonly wals = new Map<string, FPEnvelopeWAL>();\n constructor(sthis: SuperThis) {\n super(sthis, \"WALGateway\");\n }\n getWalKeyFromUri(uri: URI): Result<string> {\n const rKey = uri.getParamsResult({\n key: 0,\n name: 0,\n });\n if (rKey.isErr()) {\n return Result.Err(rKey.Err());\n }\n const { name, key } = rKey.Ok();\n return Result.Ok(`${name}:${key}`);\n }\n async get<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<SerdeGetResult<S>> {\n const rKey = this.getWalKeyFromUri(uri);\n if (rKey.isErr()) {\n return Result.Err(rKey.Err());\n }\n const wal = this.wals.get(rKey.Ok());\n if (!wal) {\n return Result.Err(new NotFoundError(\"Not found\"));\n }\n return Result.Ok(wal as FPEnvelope<S>);\n }\n async put<S>(ctx: ConnectedSerdeGatewayCtx, uri: URI, body: FPEnvelope<S>): Promise<Result<void>> {\n const rKey = this.getWalKeyFromUri(uri);\n if (rKey.isErr()) {\n return Result.Err(rKey.Err());\n }\n this.wals.set(rKey.Ok(), body as FPEnvelopeWAL);\n return Result.Ok(undefined);\n }\n async delete(ctx: ConnectedSerdeGatewayCtx, uri: URI): Promise<Result<void>> {\n const rKey = this.getWalKeyFromUri(uri);\n if (rKey.isErr()) {\n return Result.Err(rKey.Err());\n }\n this.wals.delete(rKey.Ok());\n return Result.Ok(undefined);\n }\n}\n\nconst storeTypedGateways = new KeyedResolvOnce<StoreTypeGateway>();\nfunction getStoreTypeGateway(sthis: SuperThis, uri: URI): StoreTypeGateway {\n const store = uri.getParam(\"store\");\n switch (store) {\n case \"file\":\n case \"car\":\n return storeTypedGateways.get(store).once(() => new DataGateway(sthis));\n case \"meta\":\n return storeTypedGateways.get(store).once(() => new MetaGateway(sthis));\n case \"wal\":\n return storeTypedGateways.get(store).once(() => new WALGateway(sthis));\n default:\n throw ensureLogger(sthis, \"getStoreTypeGateway\").Error().Str(\"store\", store).Msg(\"Invalid store type\").ResultError();\n }\n}\n\ninterface ConnectionItem {\n readonly uri: URI;\n readonly matchRes: MatchResult;\n readonly connection: ResolveOnce<Result<MsgConnected>>;\n readonly trackPuts: Set<string>;\n}\n\ninterface AuthedConnection {\n readonly conn: Result<MsgConnectedAuth>;\n readonly citem: ConnectionItem;\n}\n\n// const keyedConnections = new KeyedResolvOnce<Connection>();\ninterface Subscription {\n readonly sid: string;\n readonly uri: string; // optimization\n readonly callback: (msg: Uint8Array) => void;\n readonly unsub: () => void;\n}\nfunction connectionURI(uri: URI): URI {\n return uri.build().delParam(\"authJWK\").delParam(\"key\").delParam(\"store\").delParam(\"suffix\").delParam(\"storekey\").URI();\n}\n\nconst subscriptions = new Map<string, Subscription[]>();\n// const doServerSubscribe = new KeyedResolvOnce();\nexport class FireproofCloudGateway implements SerdeGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly #connectionURIs = new Map<string, ConnectionItem>();\n\n constructor(sthis: SuperThis) {\n this.sthis = sthis;\n this.logger = ensureLogger(sthis, \"FireproofCloudGateway\", {\n this: true,\n });\n // console.log(\"FireproofCloudGateway\", this.sthis.nextId().str);\n }\n\n async buildUrl(ctx: SerdeGatewayCtx, baseUrl: URI, key: string): Promise<Result<URI>> {\n return Result.Ok(baseUrl.build().setParam(\"key\", key).URI());\n }\n\n async start(ctx: SerdeGatewayCtx, uri: URI): Promise<Result<URI>> {\n await this.sthis.start();\n const rName = uri.getParamResult(\"name\");\n if (rName.isErr()) {\n return this.logger.Error().Err(rName).Msg(\"name not found\").ResultError();\n }\n const ret = uri.build().defParam(\"version\", VERSION);\n ret.defParam(\"protocol\", \"wss\");\n const retURI = ret.URI();\n const matchURI = connectionURI(retURI);\n // console.log(\"start\", matchURI.toString());\n this.#connectionURIs.set(matchURI.toString(), {\n uri: matchURI,\n matchRes: matchURI.match(matchURI),\n connection: new ResolveOnce<Result<MsgConnected>>(),\n trackPuts: new Set<string>(),\n });\n return Result.Ok(retURI);\n }\n\n async get<S>(ctx: SerdeGatewayCtx, uri: URI): Promise<SerdeGetResult<S>> {\n const conn = await this.getCloudConnectionItem(uri);\n if (conn.conn.isErr()) {\n return Result.Err(conn.conn);\n }\n const ret = await getStoreTypeGateway(ctx.loader.sthis, uri).get<S>({ ...ctx, conn }, uri);\n // console.log(\"get>>>>>>>>>>>>>\", conn.conn.Ok().conn, uri.toString(), ret);\n return ret;\n }\n\n async put<T>(ctx: SerdeGatewayCtx, uri: URI, body: FPEnvelope<T>): Promise<VoidResult> {\n const conn = await this.getCloudConnectionItem(uri);\n if (conn.conn.isErr()) {\n // console.log(\"put-conn-err\", conn.conn);\n return conn.conn;\n }\n const ret = await getStoreTypeGateway(ctx.loader.sthis, uri).put<T>({ ...ctx, conn }, uri, body);\n // console.log(\"put-conn-r\", ret.isOk());\n if (ret.isOk()) {\n if (uri.getParam(\"testMode\")) {\n conn.citem.trackPuts.add(uri.toString());\n }\n }\n return ret;\n }\n\n async delete(ctx: SerdeGatewayCtx, uri: URI): Promise<VoidResult> {\n const conn = await this.getCloudConnectionItem(uri);\n if (conn.conn.isErr()) {\n return conn.conn;\n }\n conn.citem.trackPuts.delete(uri.toString());\n return getStoreTypeGateway(ctx.loader.sthis, uri).delete({ ...ctx, conn }, uri);\n }\n\n async close(ctx: SerdeGatewayCtx, uri: URI): Promise<VoidResult> {\n const uriStr = uri.toString();\n // CAUTION here is my happen a mutation of subscriptions caused by unsub\n for (const sub of Array.from(subscriptions.values())) {\n for (const s of sub) {\n if (s.uri.toString() === uriStr) {\n s.unsub();\n }\n }\n }\n const rConn = await this.getCloudConnectionItem(uri);\n if (rConn.conn.isErr()) {\n return this.logger.Error().Err(rConn).Msg(\"Error in getCloudConnection\").ResultError();\n }\n const conn = rConn.conn.Ok();\n const rAuth = await conn.msgConnAuth();\n await conn.close(rAuth.Ok());\n this.#connectionURIs.delete(rConn.citem.uri.toString());\n return Result.Ok(undefined);\n }\n\n // fireproof://localhost:1999/?name=test-public-api&protocol=ws&store=meta\n async getCloudConnection(uri: URI): Promise<Result<MsgConnectedAuth>> {\n return this.getCloudConnectionItem(uri).then((r) => {\n return r.conn;\n });\n }\n\n async getCloudConnectionItem(uri: URI): Promise<AuthedConnection> {\n const matchURI = connectionURI(uri);\n let bestMatch: ConnectionItem | undefined;\n for (const ci of this.#connectionURIs.values()) {\n const mci = ci.uri.match(matchURI);\n if (mci.score >= ci.matchRes.score) {\n bestMatch = ci;\n break;\n }\n }\n if (!bestMatch) {\n return {\n conn: this.logger\n .Error()\n .Url(matchURI)\n .Any(\"conns\", Object.fromEntries(this.#connectionURIs.entries()))\n .Msg(\"No connection found\")\n .ResultError(),\n citem: {} as ConnectionItem,\n };\n }\n const conn = await bestMatch.connection.once(async () => {\n const rParams = uri.getParamsResult({\n name: param.REQUIRED,\n protocol: \"https\",\n store: param.REQUIRED,\n storekey: param.OPTIONAL,\n tenant: param.REQUIRED,\n });\n if (rParams.isErr()) {\n return this.logger.Error().Url(uri).Err(rParams).Msg(\"getCloudConnection:err\").ResultError<MsgConnected>();\n }\n const params = rParams.Ok();\n // let tenant: string;\n // if (params.tenant) {\n // tenant = params.tenant;\n // } else {\n // if (!params.storekey) {\n // return this.logger.Error().Url(uri).Msg(\"no tendant or storekey given\").ResultError();\n // }\n // const dataKey = params.storekey.replace(/:(meta|wal)@$/, `:data@`);\n // const kb = await rt.kb.getKeyBag(this.sthis);\n // const rfingerprint = await kb.getNamedKey(dataKey);\n // if (rfingerprint.isErr()) {\n // return this.logger.Error().Err(rfingerprint).Msg(\"Error in getNamedKey\").ResultError();\n // }\n // tenant = rfingerprint.Ok().fingerPrint;\n // }\n\n const rAuth = await authTypeFromUri(this.logger, uri);\n if (rAuth.isErr()) {\n return Result.Err<MsgConnected>(rAuth);\n }\n\n const qOpen = buildReqOpen(this.sthis, rAuth.Ok(), {});\n\n const cUrl = uri.build().protocol(params.protocol).cleanParams().URI();\n // if (cUrl.pathname === \"/\") {\n // cUrl = cUrl.build().pathname(\"/fp\").URI();\n // }\n return Msger.connect(this.sthis, rAuth.Ok(), cUrl, qOpen);\n });\n if (conn.isErr()) {\n return { conn: Result.Err(conn), citem: bestMatch };\n }\n return { conn: Result.Ok(conn.Ok().attachAuth(() => authTypeFromUri(this.logger, uri))), citem: bestMatch };\n // keyedConnections.get(keyTenantLedger(qOpen.conn.key)).once(async () => Msger.open(this.sthis, cUrl, qOpen));\n }\n\n // private notifySubscribers(data: Uint8Array, callbacks: ((msg: Uint8Array) => void)[] = []): void {\n // for (const cb of callbacks) {\n // try {\n // cb(data);\n // } catch (error) {\n // this.logger.Error().Err(error).Msg(\"Error in subscriber callback execution\");\n // }\n // }\n // }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (meta: FPEnvelopeMeta) => Promise<void>): Promise<UnsubscribeResult> {\n return Result.Err(new Error(\"Not implemented\"));\n // const rParams = uri.getParamsResult({\n // store: 0,\n // storekey: 0,\n // });\n // if (rParams.isErr()) {\n // return this.logger.Error().Err(rParams).Msg(\"Error in subscribe\").ResultError();\n // }\n // const { store } = rParams.Ok();\n // if (store !== \"meta\") {\n // return Result.Err(new Error(\"store must be meta\"));\n // }\n // const rConn = await this.getCloudConnection(uri);\n // if (rConn.isErr()) {\n // return this.logger.Error().Err(rConn).Msg(\"Error in subscribe:getCloudConnection\").ResultError();\n // }\n // const conn = rConn.Ok();\n // const rResSubscribeMeta = await doServerSubscribe.get(pkKey(conn.key)).once(async () => {\n // const subId = this.sthis.nextId().str;\n // const fn = (subId: string) => (msg: MsgBase) => {\n // if (MsgIsUpdateMetaEvent(msg) && subId === msg.subscriberId) {\n // // console.log(\"onMessage\", subId, conn.key, msg.metas);\n // const s = subscriptions.get(subId);\n // if (!s) {\n // return;\n // }\n // console.log(\"msg\", JSON.stringify(msg));\n // this.notifySubscribers(\n // this.sthis.txt.encode(JSON.stringify(msg.metas)),\n // s.map((s) => s.callback)\n // );\n // }\n // };\n // conn.onMessage(fn(subId));\n // return conn.request<ResSubscribeMeta>(buildReqSubscriptMeta(this.sthis, conn.key, subId), {\n // waitType: \"resSubscribeMeta\",\n // });\n // });\n // if (rResSubscribeMeta.isErr()) {\n // return this.logger.Error().Err(rResSubscribeMeta).Msg(\"Error in subscribe:request\").ResultError();\n // }\n // const subId = rResSubscribeMeta.Ok().subscriberId;\n // let callbacks = subscriptions.get(subId);\n // if (!callbacks) {\n // callbacks = [];\n // subscriptions.set(subId, callbacks);\n // }\n // const sid = this.sthis.nextId().str;\n // const unsub = () => {\n // const idx = callbacks.findIndex((c) => c.sid === sid);\n // if (idx !== -1) {\n // callbacks.splice(idx, 1);\n // }\n // if (callbacks.length === 0) {\n // subscriptions.delete(subId);\n // }\n // };\n // callbacks.push({ uri: uri.toString(), callback, sid, unsub });\n // return Result.Ok(unsub);\n }\n\n async destroy(ctx: SerdeGatewayCtx, uri: URI): Promise<VoidResult> {\n const item = await this.getCloudConnectionItem(uri);\n if (item.conn.isErr()) {\n return item.conn;\n }\n await Promise.all(Array.from(item.citem.trackPuts).map(async (k) => this.delete(ctx, URI.from(k))));\n return Result.Ok(undefined);\n }\n\n async getPlain(): Promise<Result<Uint8Array>> {\n return Result.Err(new Error(\"Not implemented\"));\n // const url = uri.build().setParam(\"key\", key).URI();\n // const dbFile = this.sthis.pathOps.join(rt.getPath(url, this.sthis), rt.getFileName(url, this.sthis));\n // this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Msg(\"get\");\n // const buffer = await this.gateway.get(url);\n // this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n // return buffer.Ok();\n }\n}\n\nconst onceRegisterFireproofCloudStoreProtocol = new KeyedResolvOnce<() => void>();\nexport function registerFireproofCloudStoreProtocol(protocol = \"fpcloud:\") {\n return onceRegisterFireproofCloudStoreProtocol.get(protocol).once(() => {\n URI.protocolHasHostpart(protocol);\n return registerStoreProtocol({\n protocol,\n defaultURI() {\n return URI.from(\"fpcloud://fireproof.cloud/\");\n },\n serdegateway: async (sthis: SuperThis) => {\n return new FireproofCloudGateway(sthis);\n },\n });\n });\n}\n\nregisterFireproofCloudStoreProtocol();\n\nexport function toCloud(url: CoerceURI): Attachable {\n const urlObj = URI.from(url);\n if (urlObj.protocol !== \"fpcloud:\") {\n throw new Error(\"url must have fireproof protocol\");\n }\n // const existingName = urlObj.getParam(\"name\");\n // urlObj.defParam(\"name\", remoteDbName || existingName || dbName);\n // urlObj.defParam(\"localName\", dbName);\n // urlObj.defParam(\"storekey\", `@${dbName}:data@`);\n return {\n name: urlObj.protocol,\n prepare(): Promise<GatewayUrlsParam> {\n return Promise.resolve({\n car: { url: urlObj },\n file: { url: urlObj },\n meta: { url: urlObj },\n });\n },\n };\n}\n","import { Future, Logger, Result } from \"@adviser/cement\";\nimport { SuperThis } from \"@fireproof/core\";\nimport { CalculatePreSignedUrl } from \"./msg-types-data.js\";\nimport type { JWTPayload } from \"jose\";\n// import { PreSignedMsg } from \"./pre-signed-url.js\";\n\nexport const VERSION = \"FP-MSG-1.0\";\n\nexport interface BaseTokenParam {\n readonly alg: string; // defaults ES256\n readonly issuer: string;\n readonly audience: string;\n readonly validFor: number;\n}\n\nexport interface FPCloudClaim extends JWTPayload {\n readonly userId: string;\n readonly tenants: { readonly id: string; readonly role: string }[];\n readonly ledgers: { readonly id: string; readonly role: string; readonly right: string }[];\n}\n\nexport type TokenForParam = FPCloudClaim & Partial<BaseTokenParam>;\n\nexport type MsgWithError<T extends MsgBase> = T | ErrorMsg;\n\nexport interface PreSignedMsg extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly methodParams: MethodSignedUrlParam;\n readonly params: SignedUrlParam;\n}\n\nexport interface RequestOpts {\n readonly waitFor: (msg: MsgBase) => boolean;\n readonly pollInterval?: number; // 1000ms\n readonly timeout?: number; // ms\n}\n\nexport interface EnDeCoder {\n encode<T>(node: T): Uint8Array;\n decode<T>(data: Uint8Array): T;\n}\n\nexport interface WaitForTid {\n readonly tid: string;\n readonly future: Future<MsgBase>;\n readonly timeout?: number;\n // undefined match all\n readonly waitFor: (msg: MsgBase) => boolean;\n}\n\n// export interface ConnId {\n// readonly connId: string;\n// }\n// type AddConnId<T extends MsgBase, N> = Omit<T, \"type\"> & ConnId & { readonly type: N };\nexport interface NextId {\n readonly nextId: SuperThis[\"nextId\"];\n}\n\nexport interface AuthType {\n readonly type: \"ucan\" | \"error\" | \"fp-cloud-jwk\" | \"fp-cloud\";\n}\n\nexport function isAuthTypeFPCloudJWK(a: AuthType): a is FPJWKCloudAuthType {\n return a.type === \"fp-cloud-jwk\";\n}\n\nexport function isAuthTypeFPCloud(a: AuthType): a is FPCloudAuthType {\n return a.type === \"fp-cloud\";\n}\n\nexport interface UCanAuth extends AuthType {\n readonly type: \"ucan\";\n readonly params: {\n readonly tbd: string;\n };\n}\nexport interface FPJWKCloudAuthType extends AuthType {\n readonly type: \"fp-cloud-jwk\";\n readonly params: {\n readonly jwk: string;\n };\n}\n\nexport interface FPCloudAuthType extends AuthType {\n readonly type: \"fp-cloud\";\n readonly params: {\n readonly claim: TokenForParam;\n readonly jwk: string; // for reply\n };\n}\n\nexport type AuthFactory = (tp?: Partial<TokenForParam>) => Promise<Result<AuthType>>;\n\nexport interface TenantLedger {\n readonly tenant: string;\n readonly ledger: string;\n}\n\nexport function keyTenantLedger(t: TenantLedger): string {\n return `${t.tenant}:${t.ledger}`;\n}\n\nexport interface QSId {\n readonly reqId: string;\n readonly resId: string;\n}\n\nexport function qsidEqual(a: QSId, b: QSId): boolean {\n return a.reqId === b.reqId && a.resId === b.resId;\n}\n\nexport function qsidKey(qsid: QSId): string {\n return `${qsid.reqId}:${qsid.resId}`;\n}\n\n// export interface Connection extends ReqResId{\n// readonly key: TenantLedger;\n// }\n\n// export interface Connected {\n// readonly conn: Connection;\n// }\n\nexport interface MsgBase {\n readonly tid: string;\n readonly type: string;\n readonly version: string;\n readonly auth: AuthType;\n}\n\nexport function MsgIsTid(msg: MsgBase, tid: string): boolean {\n return msg.tid === tid;\n}\n\ntype MsgWithConn<T extends MsgBase = MsgBase> = T & { readonly conn: QSId };\n\nexport type MsgWithConnAuth<T extends MsgBase = MsgBase> = MsgWithConn<T> & { readonly auth: AuthType };\n\n// type MsgWithOptionalConn<T extends MsgBase = MsgBase> = T & { readonly conn?: QSId };\n\n// export type MsgWithOptionalConnAuth<T extends MsgBase = MsgBase> = MsgWithOptionalConn<T> & { readonly auth: AuthType };\n\nexport type MsgWithTenantLedger<T extends MsgWithConnAuth> = T & { readonly tenant: TenantLedger };\n\nexport interface ErrorMsg extends MsgBase {\n readonly type: \"error\";\n readonly src: unknown;\n readonly message: string;\n readonly body?: string;\n readonly stack?: string[];\n}\n\nexport function MsgIsError(rq: MsgBase): rq is ErrorMsg {\n return rq.type === \"error\";\n}\n\nexport function MsgIsQSError(rq: ReqRes<MsgBase, MsgBase>): rq is ReqRes<ErrorMsg, ErrorMsg> {\n return rq.res.type === \"error\" || rq.req.type === \"error\";\n}\n\nexport type HttpMethods = \"GET\" | \"PUT\" | \"DELETE\";\nexport type FPStoreTypes = \"meta\" | \"car\" | \"wal\" | \"file\";\n\nexport function coerceFPStoreTypes(s?: string): FPStoreTypes {\n const x = s?.trim();\n if (x === \"meta\" || x === \"car\" || x === \"wal\" || x === \"file\") {\n return x;\n }\n throw new Error(`Invalid FPStoreTypes: ${s}`);\n}\n\n// reqRes is http\n// stream is WebSocket\nexport type ProtocolCapabilities = \"reqRes\" | \"stream\";\n\nexport function isProtocolCapabilities(s: string): s is ProtocolCapabilities {\n const x = s.trim();\n return x === \"reqRes\" || x === \"stream\";\n}\n\nexport interface Gestalt {\n /**\n * Describes StoreTypes which are handled\n */\n readonly storeTypes: FPStoreTypes[];\n /**\n * A unique identifier\n */\n readonly id: string;\n /**\n * protocol capabilities\n * defaults \"stream\"\n */\n readonly protocolCapabilities: ProtocolCapabilities[];\n /**\n * HttpEndpoints (URL) required atleast one\n * could be absolute or relative\n */\n readonly httpEndpoints: string[];\n /**\n * WebsocketEndpoints (URL) required atleast one\n * could be absolute or relative\n */\n readonly wsEndpoints: string[];\n /**\n * Encodings supported\n * JSON, CBOR\n */\n readonly encodings: (\"JSON\" | \"CBOR\")[];\n /**\n * Authentication methods supported\n */\n readonly auth: AuthType[];\n /**\n * Requires Authentication\n */\n readonly requiresAuth: boolean;\n /**\n * In|Outband Data | Meta | WAL Support\n * Inband Means that the Payload is part of the message\n * Outband Means that the Payload is PUT/GET to a different URL\n * A Clien implementation usally not support reading or writing\n * support\n */\n readonly data?: {\n readonly inband: boolean;\n readonly outband: boolean;\n };\n readonly meta?: {\n readonly inband: true; // meta inband is mandatory\n readonly outband: boolean;\n };\n readonly wal?: {\n readonly inband: boolean;\n readonly outband: boolean;\n };\n /**\n * Request Types supported\n * reqGestalt, reqSubscribeMeta, reqPutMeta, reqGetMeta, reqDelMeta, reqUpdateMeta\n */\n readonly reqTypes: string[];\n /**\n * Response Types supported\n * resGestalt, resSubscribeMeta, resPutMeta, resGetMeta, resDelMeta, updateMeta\n */\n readonly resTypes: string[];\n /**\n * Event Types supported\n * updateMeta\n */\n readonly eventTypes: string[];\n}\n\nexport interface MsgerParams {\n readonly mime: string;\n readonly auth?: AuthType;\n readonly hasPersistent?: boolean;\n readonly protocolCapabilities?: ProtocolCapabilities[];\n // readonly protocol: \"http\" | \"ws\";\n readonly timeout: number; // msec\n}\n\n// force the server id\nexport type GestaltParam = Partial<Gestalt> & { readonly id: string };\n\nexport function defaultGestalt(msgP: MsgerParams, gestalt: GestaltParam): Gestalt {\n return {\n storeTypes: [\"meta\", \"file\", \"car\", \"wal\"],\n httpEndpoints: [\"/fp\"],\n wsEndpoints: [\"/ws\"],\n encodings: [\"JSON\"],\n protocolCapabilities: msgP.protocolCapabilities || [\"reqRes\", \"stream\"],\n auth: [],\n requiresAuth: false,\n data: msgP.hasPersistent\n ? {\n inband: true,\n outband: true,\n }\n : undefined,\n meta: msgP.hasPersistent\n ? {\n inband: true,\n outband: true,\n }\n : undefined,\n wal: msgP.hasPersistent\n ? {\n inband: true,\n outband: true,\n }\n : undefined,\n reqTypes: [\n \"reqOpen\",\n \"reqGestalt\",\n // \"reqSignedUrl\",\n \"reqSubscribeMeta\",\n \"reqPutMeta\",\n \"reqBindMeta\",\n \"reqDelMeta\",\n \"reqPutData\",\n \"reqGetData\",\n \"reqDelData\",\n \"reqPutWAL\",\n \"reqGetWAL\",\n \"reqDelWAL\",\n \"reqUpdateMeta\",\n ],\n resTypes: [\n \"resOpen\",\n \"resGestalt\",\n // \"resSignedUrl\",\n \"resSubscribeMeta\",\n \"resPutMeta\",\n \"resGetMeta\",\n \"resDelMeta\",\n \"resPutData\",\n \"resGetData\",\n \"resDelData\",\n \"resPutWAL\",\n \"resGetWAL\",\n \"resDelWAL\",\n \"updateMeta\",\n ],\n eventTypes: [\"updateMeta\"],\n ...gestalt,\n };\n}\n\nexport interface ReqChat extends MsgWithConn {\n readonly type: \"reqChat\";\n readonly message: string;\n readonly targets: QSId[];\n}\nexport interface ResChat extends MsgWithConn {\n readonly type: \"resChat\";\n readonly message: string;\n readonly targets: QSId[];\n}\n\nexport function buildReqChat(sthis: NextId, auth: AuthType, conn: QSId, message: string, targets?: QSId[]): ReqChat {\n return {\n tid: sthis.nextId().str,\n type: \"reqChat\",\n version: VERSION,\n auth,\n conn,\n message,\n targets: targets ?? [],\n };\n}\n\nexport function buildResChat(req: ReqChat, conn?: QSId, message?: string, targets?: QSId[], auth?: AuthType): ResChat {\n return {\n ...req,\n auth: auth || req.auth,\n conn: conn || req.conn,\n message: message || req.message,\n targets: targets || req.targets,\n type: \"resChat\",\n version: VERSION,\n };\n}\n\nexport function MsgIsReqChat(msg: MsgBase): msg is ReqChat {\n return msg.type === \"reqChat\";\n}\n\nexport function MsgIsResChat(msg: MsgBase): msg is ResChat {\n return msg.type === \"resChat\";\n}\n\n/**\n * The ReqGestalt message is used to request the\n * features of the Responder.\n */\nexport interface ReqGestalt extends MsgBase {\n readonly type: \"reqGestalt\";\n readonly gestalt: Gestalt;\n readonly publish?: boolean; // for testing\n}\n\nexport function MsgIsReqGestalt(msg: MsgBase): msg is ReqGestalt {\n return msg.type === \"reqGestalt\";\n}\n\nexport function buildReqGestalt(sthis: NextId, auth: AuthType, gestalt: Gestalt, publish?: boolean): ReqGestalt {\n return {\n tid: sthis.nextId().str,\n auth,\n type: \"reqGestalt\",\n version: VERSION,\n gestalt,\n publish,\n };\n}\n\nexport interface ConnInfo {\n readonly connIds: string[];\n}\n/**\n * The ResGestalt message is used to respond with\n * the features of the Responder.\n */\nexport interface ResGestalt extends MsgBase {\n readonly type: \"resGestalt\";\n readonly gestalt: Gestalt;\n}\n\nexport function buildResGestalt(req: ReqGestalt, gestalt: Gestalt, auth: AuthType): ResGestalt | ErrorMsg {\n return {\n tid: req.tid,\n auth: auth || req.auth,\n type: \"resGestalt\",\n version: VERSION,\n gestalt,\n };\n}\n\nexport function MsgIsResGestalt(msg: MsgBase): msg is ResGestalt {\n return msg.type === \"resGestalt\";\n}\n\nexport interface ReqOpenConnection {\n // readonly key: TenantLedger;\n readonly reqId?: string;\n readonly resId?: string; // for double open\n}\n\nexport interface ReqOpenConn {\n readonly reqId: string;\n readonly resId?: string;\n}\n\nexport interface ReqOpen extends MsgBase {\n readonly type: \"reqOpen\";\n readonly conn: ReqOpenConn;\n}\n\nexport function buildReqOpen(sthis: NextId, auth: AuthType, conn: ReqOpenConnection): ReqOpen {\n return {\n tid: sthis.nextId().str,\n auth,\n type: \"reqOpen\",\n version: VERSION,\n conn: {\n ...conn,\n reqId: conn.reqId || sthis.nextId().str,\n },\n };\n}\n\n// export function MsgIsReqOpenWithConn(imsg: MsgBase): imsg is MsgWithConn<ReqOpen> {\n// const msg = imsg as MsgWithConn<ReqOpen>;\n// return msg.type === \"reqOpen\" && !!msg.conn && !!msg.conn.reqId;\n// }\n\nexport function MsgIsReqOpen(imsg: MsgBase): imsg is MsgWithConn<ReqOpen> {\n const msg = imsg as MsgWithConn<ReqOpen>;\n return msg.type === \"reqOpen\" && !!msg.conn && !!msg.conn.reqId;\n}\n\nexport interface ResOpen extends MsgBase {\n readonly type: \"resOpen\";\n readonly conn: QSId;\n}\n\nexport function MsgIsWithConn<T extends MsgBase>(msg: T): msg is MsgWithConn<T> {\n const mwc = (msg as MsgWithConn<T>).conn;\n return mwc && !!(mwc as QSId).reqId && !!(mwc as QSId).resId;\n}\n\nexport function MsgIsWithConnAuth<T extends MsgBase>(msg: T): msg is MsgWithConnAuth<T> {\n return MsgIsWithConn(msg) && !!msg.auth && typeof msg.auth.type === \"string\";\n}\n\nexport function MsgIsConnected<T extends MsgBase>(msg: T, qsid: QSId): msg is MsgWithConn<T> {\n return MsgIsWithConn(msg) && msg.conn.reqId === qsid.reqId && msg.conn.resId === qsid.resId;\n}\n\nexport function buildResOpen(sthis: NextId, req: ReqOpen, resStreamId?: string): ResOpen {\n if (!(req.conn && req.conn.reqId)) {\n throw new Error(\"req.conn.reqId is required\");\n }\n return {\n ...req,\n type: \"resOpen\",\n conn: {\n ...req.conn,\n resId: req.conn.resId || resStreamId || sthis.nextId().str,\n },\n };\n}\n\nexport function MsgIsResOpen(msg: MsgBase): msg is ResOpen {\n return msg.type === \"resOpen\";\n}\n\nexport interface ReqClose extends MsgWithConn {\n readonly type: \"reqClose\";\n}\n\nexport function MsgIsReqClose(msg: MsgBase): msg is ReqClose {\n return msg.type === \"reqClose\" && MsgIsWithConn(msg);\n}\n\nexport interface ResClose extends MsgWithConn {\n readonly type: \"resClose\";\n}\n\nexport function MsgIsResClose(msg: MsgBase): msg is ResClose {\n return msg.type === \"resClose\" && MsgIsWithConn(msg);\n}\n\nexport function buildResClose(req: ReqClose, conn: QSId): ResClose {\n return {\n ...req,\n type: \"resClose\",\n conn,\n };\n}\n\nexport function buildReqClose(sthis: NextId, auth: AuthType, conn: QSId): ReqClose {\n return {\n tid: sthis.nextId().str,\n auth,\n type: \"reqClose\",\n version: VERSION,\n conn,\n };\n}\n\nexport interface SignedUrlParam {\n // base path\n readonly path?: string;\n // name of the file\n readonly key: string;\n readonly expires?: number; // seconds\n readonly index?: string;\n}\n\nexport interface MethodSignedUrlParam {\n readonly method: HttpMethods;\n readonly store: FPStoreTypes;\n}\n\n// export type ReqSignedUrlParam = Omit<SignedUrlParam, \"method\" | \"store\">;\nexport interface ReqSignedUrlParam {\n readonly auth: AuthType;\n readonly methodParam: MethodSignedUrlParam;\n readonly params: SignedUrlParam;\n}\n\nexport interface UpdateReqRes<Q extends MsgBase, S extends MsgBase> {\n req: Q;\n res: S;\n}\n\nexport type ReqRes<Q extends MsgBase, S extends MsgBase> = Readonly<UpdateReqRes<Q, S>>;\n\nexport function buildErrorMsg(\n msgCtx: { readonly logger: Logger; readonly sthis: SuperThis },\n base: Partial<MsgBase & { ref?: unknown }>,\n error: Error,\n body?: string,\n stack?: string[],\n): ErrorMsg {\n if (!stack && msgCtx.sthis.env.get(\"FP_STACK\")) {\n stack = error.stack?.split(\"\\n\");\n }\n const msg = {\n auth: base.auth || { type: \"error\" },\n src: base,\n type: \"error\",\n tid: base.tid || \"internal\",\n message: error.message,\n version: VERSION,\n body,\n stack,\n } satisfies ErrorMsg;\n msgCtx.logger.Any(\"ErrorMsg\", msg);\n return msg;\n}\n\nexport function MsgIsTenantLedger<T extends MsgBase>(msg: T): msg is MsgWithTenantLedger<MsgWithConnAuth<T>> {\n if (MsgIsWithConnAuth(msg)) {\n const t = (msg as MsgWithTenantLedger<MsgWithConnAuth<T>>).tenant;\n return !!t && !!t.tenant && !!t.ledger;\n }\n return false;\n}\n\nexport interface ReqSignedUrl extends ReqSignedUrlWithoutMethodParams {\n // readonly type: \"reqSignedUrl\";\n readonly methodParams: MethodSignedUrlParam;\n}\n\nexport interface ReqSignedUrlWithoutMethodParams extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly params: SignedUrlParam;\n}\n\nexport interface GwCtx {\n readonly tid?: string;\n readonly conn: QSId;\n readonly tenant: TenantLedger;\n}\n\nexport interface GwCtxConn {\n readonly tid?: string;\n readonly conn: QSId;\n readonly tenant: TenantLedger;\n}\n\nexport function buildReqSignedUrl<T extends ReqSignedUrl>(sthis: NextId, type: string, rparam: ReqSignedUrlParam, gwCtx: GwCtx): T {\n return {\n tid: sthis.nextId().str,\n type,\n auth: rparam.auth,\n methodParams: rparam.methodParam,\n version: VERSION,\n ...gwCtx,\n params: rparam.params,\n } satisfies ReqSignedUrl as T;\n}\n\nexport interface ResSignedUrl extends MsgWithTenantLedger<MsgWithConn> {\n // readonly type: \"resSignedUrl\";\n readonly methodParams: MethodSignedUrlParam;\n readonly params: SignedUrlParam;\n readonly signedUrl: string;\n}\n\nexport interface ResOptionalSignedUrl extends MsgWithTenantLedger<MsgWithConn> {\n // readonly type: \"resSignedUrl\";\n readonly params: SignedUrlParam;\n readonly methodParams: MethodSignedUrlParam;\n readonly signedUrl?: string;\n}\n\nexport interface MsgTypesCtx {\n readonly sthis: SuperThis;\n readonly logger: Logger;\n // readonly auth: AuthFactory;\n}\n\n// export async function msgTypesCtxSync(msgCtx: MsgTypesCtx): Promise<MsgTypesCtxSync> {\n// return {\n// sthis: msgCtx.sthis,\n// logger: msgCtx.logger,\n// auth: await msgCtx.auth(),\n// };\n// }\n\nexport interface MsgTypesCtxSync {\n readonly sthis: SuperThis;\n readonly logger: Logger;\n readonly auth: AuthType;\n}\n\nexport function resAuth(msg: MsgBase): Promise<AuthType> {\n return msg.auth ? Promise.resolve(msg.auth) : Promise.reject(new Error(\"No Auth\"));\n}\n\nexport async function buildRes<Q extends MsgWithTenantLedger<MsgWithConn<ReqSignedUrlWithoutMethodParams>>, S extends ResSignedUrl>(\n methodParams: MethodSignedUrlParam,\n type: string,\n msgCtx: MsgTypesCtx,\n req: Q,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<S>> {\n const psm = {\n type: \"reqSignedUrl\",\n auth: await resAuth(req),\n version: req.version,\n methodParams,\n params: {\n ...req.params,\n },\n conn: req.conn,\n tenant: req.tenant,\n tid: req.tid,\n } satisfies PreSignedMsg;\n const rSignedUrl = await ctx.calculatePreSignedUrl(msgCtx, psm);\n if (rSignedUrl.isErr()) {\n return buildErrorMsg(msgCtx, req, rSignedUrl.Err());\n }\n return {\n ...req,\n params: psm.params,\n methodParams,\n type,\n signedUrl: rSignedUrl.Ok().toString(),\n } as unknown as MsgWithError<S>;\n}\n","import { BuildURI, CoerceURI, Logger, Result, runtimeFn, URI } from \"@adviser/cement\";\nimport {\n buildReqGestalt,\n defaultGestalt,\n EnDeCoder,\n Gestalt,\n MsgBase,\n MsgerParams,\n MsgIsResGestalt,\n RequestOpts,\n ResGestalt,\n MsgWithError,\n MsgWithConnAuth,\n buildReqOpen,\n MsgIsConnected,\n MsgIsError,\n MsgIsResOpen,\n QSId,\n MsgIsTid,\n ReqGestalt,\n buildReqClose,\n MsgIsResClose,\n AuthFactory,\n AuthType,\n FPJWKCloudAuthType,\n} from \"./msg-types.js\";\nimport { ensurePath, HttpConnection } from \"./http-connection.js\";\nimport { WSConnection } from \"./ws-connection.js\";\nimport { SuperThis } from \"../../types.js\";\n\n// const headers = {\n// \"Content-Type\": \"application/json\",\n// \"Accept\": \"application/json\",\n// };\n\nexport function selectRandom<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nexport function timeout<T>(ms: number, promise: Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`TIMEOUT after ${ms}ms`));\n }, ms);\n promise\n .then(resolve)\n .catch(reject)\n .finally(() => clearTimeout(timer));\n });\n}\n\nexport type OnMsgFn<T extends MsgBase = MsgBase> = (msg: MsgWithError<T>) => void;\nexport type UnReg = () => void;\n\nexport interface ExchangedGestalt {\n readonly my: Gestalt;\n readonly remote: Gestalt;\n}\n\nexport type OnErrorFn = (msg: Partial<MsgBase>, err: Error) => Partial<MsgBase>;\n\nexport interface ActiveStream<S extends MsgBase, Q extends MsgBase> {\n readonly id: string;\n readonly bind: {\n readonly msg: Q;\n readonly opts: RequestOpts;\n };\n timeout?: unknown;\n controller?: ReadableStreamDefaultController<MsgWithError<S>>;\n}\n\nexport interface MsgRawConnection<T extends MsgBase = MsgBase> {\n // readonly ws: WebSocket;\n // readonly params: ConnectionKey;\n // qsOpen: ReqRes<ReqOpen, ResOpen>;\n readonly sthis: SuperThis;\n readonly exchangedGestalt: ExchangedGestalt;\n readonly activeBinds: Map<string, ActiveStream<T, MsgBase>>;\n bind<S extends T, Q extends T>(req: Q, opts: RequestOpts): ReadableStream<MsgWithError<S>>;\n request<S extends T, Q extends T>(req: Q, opts: RequestOpts): Promise<MsgWithError<S>>;\n send<S extends T, Q extends T>(msg: Q): Promise<MsgWithError<S>>;\n start(): Promise<Result<void>>;\n close(o: T): Promise<Result<void>>;\n onMsg(msg: OnMsgFn<T>): UnReg;\n}\n\nexport function jsonEnDe(sthis: SuperThis): EnDeCoder {\n return {\n encode: (node: unknown) => sthis.txt.encode(JSON.stringify(node)),\n decode: (data: Uint8Array) => JSON.parse(sthis.txt.decode(data)),\n };\n}\n\nexport type MsgerParamsWithEnDe = MsgerParams & { readonly ende: EnDeCoder };\n\nexport function defaultMsgParams(sthis: SuperThis, igs: Partial<MsgerParamsWithEnDe>): MsgerParamsWithEnDe {\n return {\n mime: \"application/json\",\n ende: jsonEnDe(sthis),\n timeout: 3000,\n protocolCapabilities: [\"reqRes\", \"stream\"],\n ...igs,\n } satisfies MsgerParamsWithEnDe;\n}\n\nexport interface OpenParams {\n readonly timeout: number;\n}\n\nexport async function applyStart(prC: Promise<Result<MsgRawConnection>>): Promise<Result<MsgRawConnection>> {\n const rC = await prC;\n if (rC.isErr()) {\n return rC;\n }\n const c = rC.Ok();\n const r = await c.start();\n if (r.isErr()) {\n return Result.Err(r.Err());\n }\n return rC;\n}\n\nexport async function authTypeFromUri(logger: Logger, curi: CoerceURI): Promise<Result<FPJWKCloudAuthType>> {\n const uri = URI.from(curi);\n const authJWK = uri.getParam(\"authJWK\");\n if (!authJWK) {\n return logger.Error().Url(uri).Msg(\"authJWK is required\").ResultError();\n }\n // const sts = await SessionTokenService.createFromEnv();\n // const fpc = await sts.validate(authJWK);\n // if (fpc.isErr()) {\n // return logger.Error().Err(fpc).Msg(\"Invalid authJWK\").ResultError();\n // }\n return Result.Ok({\n type: \"fp-cloud-jwk\",\n params: {\n // claim: fpc.Ok().payload,\n jwk: authJWK,\n },\n } satisfies FPJWKCloudAuthType);\n}\n\nexport class MsgConnected {\n static async connect(\n auth: AuthType,\n mrc: Result<MsgRawConnection> | MsgRawConnection,\n conn: Partial<QSId> = {},\n ): Promise<Result<MsgConnected>> {\n if (Result.Is(mrc)) {\n if (mrc.isErr()) {\n return Result.Err(mrc.Err());\n }\n mrc = mrc.Ok();\n }\n const res = await mrc.request(buildReqOpen(mrc.sthis, auth, conn), { waitFor: MsgIsResOpen });\n if (MsgIsError(res) || !MsgIsResOpen(res)) {\n return mrc.sthis.logger.Error().Err(res).Msg(\"unexpected response\").ResultError();\n }\n return Result.Ok(new MsgConnected(mrc, res.conn));\n }\n\n readonly sthis: SuperThis;\n readonly conn: QSId;\n readonly raw: MsgRawConnection;\n readonly exchangedGestalt: ExchangedGestalt;\n readonly activeBinds: Map<string, ActiveStream<MsgWithConnAuth, MsgBase>>;\n readonly id: string;\n private constructor(raw: MsgRawConnection, conn: QSId) {\n this.sthis = raw.sthis;\n this.raw = raw;\n this.exchangedGestalt = raw.exchangedGestalt;\n this.conn = conn;\n this.activeBinds = raw.activeBinds;\n this.id = this.sthis.nextId().str;\n }\n\n attachAuth(auth: AuthFactory): MsgConnectedAuth {\n return new MsgConnectedAuth(this, auth);\n }\n}\n\nexport class MsgConnectedAuth implements MsgRawConnection<MsgWithConnAuth> {\n readonly sthis: SuperThis;\n readonly conn: QSId;\n readonly raw: MsgRawConnection;\n readonly exchangedGestalt: ExchangedGestalt;\n readonly activeBinds: Map<string, ActiveStream<MsgWithConnAuth, MsgBase>>;\n readonly id: string;\n readonly authFactory: AuthFactory;\n\n constructor(conn: MsgConnected, authFactory: AuthFactory) {\n this.id = conn.id;\n this.raw = conn.raw;\n this.conn = conn.conn;\n this.sthis = conn.sthis;\n this.authFactory = authFactory;\n this.exchangedGestalt = conn.exchangedGestalt;\n this.activeBinds = conn.activeBinds;\n }\n\n bind<S extends MsgWithConnAuth, Q extends MsgWithConnAuth>(req: Q, opts: RequestOpts): ReadableStream<MsgWithError<S>> {\n const stream = this.raw.bind({ ...req, conn: req.conn || this.conn }, opts);\n const ts = new TransformStream<MsgWithError<S>, MsgWithError<S>>({\n transform: (chunk, controller) => {\n if (!MsgIsTid(chunk, req.tid)) {\n return;\n }\n if (MsgIsConnected(chunk, this.conn)) {\n if (opts.waitFor?.(chunk) || MsgIsError(chunk)) {\n controller.enqueue(chunk);\n }\n }\n },\n });\n\n // why the hell pipeTo sends an error that is undefined?\n stream.pipeThrough(ts);\n // stream.pipeTo(ts.writable).catch((err) => err && err.message && console.error(\"bind error\", err));\n return ts.readable;\n }\n\n authType(): Promise<Result<AuthType>> {\n return this.authFactory();\n }\n\n msgConnAuth(): Promise<Result<MsgWithConnAuth>> {\n return this.authType().then((r) => {\n if (r.isErr()) {\n return Result.Err(r);\n }\n return Result.Ok({ conn: this.conn, auth: r.Ok() } as MsgWithConnAuth);\n });\n }\n\n request<S extends MsgWithConnAuth, Q extends MsgWithConnAuth>(req: Q, opts: RequestOpts): Promise<MsgWithError<S>> {\n return this.raw.request({ ...req, conn: req.conn || this.conn }, opts);\n }\n\n send<S extends MsgWithConnAuth, Q extends MsgWithConnAuth>(msg: Q): Promise<MsgWithError<S>> {\n return this.raw.send({ ...msg, conn: msg.conn || this.conn });\n }\n\n start(): Promise<Result<void>> {\n return this.raw.start();\n }\n async close(t: MsgWithConnAuth): Promise<Result<void>> {\n await this.request(buildReqClose(this.sthis, t.auth, this.conn), { waitFor: MsgIsResClose });\n return await this.raw.close(t);\n // return Result.Ok(undefined);\n }\n onMsg(msgFn: OnMsgFn<MsgWithConnAuth>): UnReg {\n return this.raw.onMsg((msg) => {\n if (MsgIsConnected(msg, this.conn)) {\n msgFn(msg);\n }\n });\n }\n}\n\nfunction initialFPUri(curl: CoerceURI): URI {\n let gestaltUrl = URI.from(curl);\n if ([\"\", \"/\"].includes(gestaltUrl.pathname)) {\n gestaltUrl = gestaltUrl.build().appendRelative(\"/fp\").URI();\n }\n return gestaltUrl;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class Msger {\n static async openHttp(\n sthis: SuperThis,\n // reqOpen: ReqOpen | undefined,\n urls: URI[],\n msgP: MsgerParamsWithEnDe,\n exGestalt: ExchangedGestalt,\n ): Promise<Result<MsgRawConnection>> {\n return Result.Ok(new HttpConnection(sthis, urls, msgP, exGestalt));\n }\n static async openWS(\n sthis: SuperThis,\n // qOpen: ReqOpen,\n url: URI,\n msgP: MsgerParamsWithEnDe,\n exGestalt: ExchangedGestalt,\n ): Promise<Result<MsgRawConnection>> {\n let ws: WebSocket;\n // const { encode } = jsonEnDe(sthis);\n url = url.build().setParam(\"random\", sthis.nextId().str).URI();\n // console.log(\"openWS\", url.toString());\n // .setParam(\"reqOpen\", sthis.txt.decode(encode(qOpen)))\n const wsUrl = ensurePath(url, \"ws\");\n if (runtimeFn().isNodeIsh) {\n const { WebSocket } = await import(\"ws\");\n ws = new WebSocket(wsUrl) as unknown as WebSocket;\n } else {\n ws = new WebSocket(wsUrl);\n }\n return Result.Ok(new WSConnection(sthis, ws, msgP, exGestalt));\n }\n static async open(\n sthis: SuperThis,\n auth: AuthType,\n curl: CoerceURI,\n imsgP: Partial<MsgerParamsWithEnDe> = {},\n ): Promise<Result<MsgRawConnection>> {\n // initial exchange with JSON encoding\n const jsMsgP = defaultMsgParams(sthis, { ...imsgP, mime: \"application/json\", ende: jsonEnDe(sthis) });\n const gestaltUrl = initialFPUri(curl);\n const gs = defaultGestalt(defaultMsgParams(sthis, imsgP), { id: \"FP-Universal-Client\" });\n /*\n * request Gestalt with Http\n */\n const rHC = await Msger.openHttp(sthis, [gestaltUrl], jsMsgP, { my: gs, remote: gs });\n if (rHC.isErr()) {\n return rHC;\n }\n const hc = rHC.Ok();\n // const rAuth = await authTypeFromUri(sthis.logger, url);\n // if (rAuth.isErr()) {\n // return Result.Err(rAuth)\n // }\n const resGestalt = await hc.request<ResGestalt, ReqGestalt>(buildReqGestalt(sthis, auth, gs), {\n waitFor: MsgIsResGestalt,\n });\n if (!MsgIsResGestalt(resGestalt)) {\n return sthis.logger.Error().Any({ resGestalt }).Msg(\"should be ResGestalt\").ResultError();\n }\n await hc.close(resGestalt /* as MsgWithConnAuth */);\n const exGt = { my: gs, remote: resGestalt.gestalt } satisfies ExchangedGestalt;\n const msgP = defaultMsgParams(sthis, imsgP);\n if (exGt.remote.protocolCapabilities.includes(\"reqRes\") && !exGt.remote.protocolCapabilities.includes(\"stream\")) {\n // console.log(\"openHttp---\", exGt.remote.httpEndpoints, curl?.toString(), exGt.remote.httpEndpoints.map((i) => BuildURI.from(curl).resolve(i).URI().toString()));\n return applyStart(\n Msger.openHttp(\n sthis,\n exGt.remote.httpEndpoints.map((i) => BuildURI.from(curl).resolve(i).URI()),\n msgP,\n exGt,\n ),\n );\n }\n const wsUrl = BuildURI.from(gestaltUrl).resolve(selectRandom(exGt.remote.wsEndpoints)).URI();\n // console.log(\"openWS---\", wsUrl.toString(), \"=====\", exGt.remote.wsEndpoints);\n return applyStart(Msger.openWS(sthis, wsUrl, msgP, exGt));\n }\n\n static connect(\n sthis: SuperThis,\n auth: AuthType,\n curl: CoerceURI,\n imsgP: Partial<MsgerParamsWithEnDe> = {},\n conn: Partial<QSId> = {},\n ): Promise<Result<MsgConnected>> {\n return Msger.open(sthis, auth, curl, imsgP).then((srv) => MsgConnected.connect(auth, srv, conn));\n }\n\n private constructor() {\n /* */\n }\n}\n","import { HttpHeader, Logger, Result, URI, exception2Result } from \"@adviser/cement\";\nimport { ensureLogger } from \"../../utils.js\";\nimport { MsgBase, buildErrorMsg, MsgWithError, RequestOpts, MsgIsError } from \"./msg-types.js\";\nimport {\n ActiveStream,\n ExchangedGestalt,\n MsgerParamsWithEnDe,\n MsgRawConnection,\n OnMsgFn,\n selectRandom,\n timeout,\n UnReg,\n} from \"./msger.js\";\nimport { MsgRawConnectionBase } from \"./msg-raw-connection-base.js\";\nimport { SuperThis } from \"../../types.js\";\n\nfunction toHttpProtocol(uri: URI): URI {\n const protocol = (uri.getParam(\"protocol\") ?? uri.protocol).replace(/:$/, \"\");\n const toFix = uri.build();\n switch (protocol) {\n case \"ws\":\n case \"http\":\n toFix.protocol(\"http\");\n break;\n case \"https\":\n case \"wss\":\n default:\n toFix.protocol(\"https\");\n break;\n }\n return toFix.URI();\n}\n\nexport function ensurePath(uri: URI, fp: string): string {\n const path = uri.pathname.replace(/\\/$/, \"\").replace(/^\\//, \"\");\n const buri = uri.build();\n if (path === \"\") {\n buri.appendRelative(fp);\n }\n return buri.toString();\n}\n\nexport class HttpConnection extends MsgRawConnectionBase implements MsgRawConnection {\n readonly logger: Logger;\n readonly msgP: MsgerParamsWithEnDe;\n\n readonly baseURIs: { in: URI; cleaned: URI }[];\n\n readonly #onMsg = new Map<string, OnMsgFn>();\n\n constructor(sthis: SuperThis, uris: URI[], msgP: MsgerParamsWithEnDe, exGestalt: ExchangedGestalt) {\n super(sthis, exGestalt);\n this.logger = ensureLogger(sthis, \"HttpConnection\");\n // this.msgParam = msgP;\n this.baseURIs = uris.map((uri) => ({\n in: uri,\n cleaned: toHttpProtocol(uri),\n }));\n this.msgP = msgP;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n send<S extends MsgBase, Q extends MsgBase>(_msg: Q): Promise<MsgWithError<S>> {\n throw new Error(\"Method not implemented.\");\n }\n\n async start(): Promise<Result<void>> {\n // if (this._qsOpen.req) {\n // const sOpen = await this.request(this._qsOpen.req, { waitFor: MsgIsResOpen });\n // if (!MsgIsResOpen(sOpen)) {\n // return Result.Err(this.logger.Error().Any(\"Err\", sOpen).Msg(\"unexpected response\").AsError());\n // }\n // this._qsOpen.res = sOpen;\n // }\n return Result.Ok(undefined);\n }\n\n async close(): Promise<Result<void>> {\n await Promise.all(Array.from(this.activeBinds.values()).map((state) => state.controller?.close()));\n this.#onMsg.clear();\n return Result.Ok(undefined);\n }\n\n toMsg<S extends MsgBase>(msg: MsgWithError<S>): MsgWithError<S> {\n this.#onMsg.forEach((fn) => fn(msg));\n return msg;\n }\n\n onMsg(fn: OnMsgFn): UnReg {\n const key = this.sthis.nextId().str;\n this.#onMsg.set(key, fn);\n return () => this.#onMsg.delete(key);\n }\n\n #poll(state: ActiveStream<MsgBase, MsgBase>): void {\n this.request(state.bind.msg, state.bind.opts)\n .then((msg) => {\n try {\n state.controller?.enqueue(msg);\n if (MsgIsError(msg)) {\n state.controller?.close();\n } else {\n state.timeout = setTimeout(() => this.#poll(state), state.bind.opts.pollInterval ?? 1000);\n }\n } catch (err) {\n state.controller?.error(err);\n state.controller?.close();\n }\n })\n .catch((err) => {\n state.controller?.error(err);\n // state.controller?.close();\n });\n }\n\n readonly activeBinds = new Map<string, ActiveStream<MsgBase, MsgBase>>();\n bind<Q extends MsgBase, S extends MsgBase>(req: Q, opts: RequestOpts): ReadableStream<MsgWithError<S>> {\n const state: ActiveStream<S, Q> = {\n id: this.sthis.nextId().str,\n bind: {\n msg: req,\n opts,\n },\n } satisfies ActiveStream<S, Q>;\n this.activeBinds.set(state.id, state);\n return new ReadableStream<MsgWithError<S>>({\n cancel: () => {\n clearTimeout(state.timeout as number);\n this.activeBinds.delete(state.id);\n },\n start: (controller) => {\n state.controller = controller;\n this.#poll(state);\n },\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async request<Q extends MsgBase, S extends MsgBase>(req: Q, _opts: RequestOpts): Promise<MsgWithError<S>> {\n const headers = HttpHeader.from();\n headers.Set(\"Content-Type\", this.msgP.mime);\n headers.Set(\"Accept\", this.msgP.mime);\n\n const rReqBody = exception2Result(() => this.msgP.ende.encode(req));\n if (rReqBody.isErr()) {\n return this.toMsg(\n buildErrorMsg(this, req, this.logger.Error().Err(rReqBody.Err()).Any(\"req\", req).Msg(\"encode error\").AsError()),\n );\n }\n headers.Set(\"Content-Length\", rReqBody.Ok().byteLength.toString());\n const url = selectRandom(this.baseURIs);\n // console.log(\"request\", url.cleaned.toString(), url.in.toString(), req);\n this.logger.Debug().Any(url).Any(\"body\", req).Msg(\"request\");\n const rRes = await exception2Result(() =>\n timeout(\n this.msgP.timeout,\n fetch(ensurePath(url.cleaned, \"fp\"), {\n method: \"PUT\",\n headers: headers.AsHeaderInit(),\n body: rReqBody.Ok(),\n }),\n ),\n );\n this.logger.Debug().Any(url).Any(\"body\", rRes).Msg(\"response\");\n if (rRes.isErr()) {\n return this.toMsg(buildErrorMsg(this, req, this.logger.Error().Err(rRes).Any(url).Msg(\"fetch error\").AsError()));\n }\n const res = rRes.Ok();\n if (!res.ok) {\n const data = new Uint8Array(await res.arrayBuffer());\n const ret = await exception2Result(async () => this.msgP.ende.decode(data) as S);\n if (ret.isErr() || !MsgIsError(ret.Ok())) {\n return this.toMsg(\n buildErrorMsg(\n this,\n req,\n this.logger\n .Error()\n .Any(url)\n .Str(\"status\", res.status.toString())\n .Str(\"statusText\", res.statusText)\n .Msg(\"HTTP Error\")\n .AsError(),\n await res.text().catch(() => \"no body\"),\n ),\n );\n }\n return this.toMsg(ret.Ok());\n }\n const data = new Uint8Array(await res.arrayBuffer());\n const ret = await exception2Result(async () => this.msgP.ende.decode(data) as S);\n if (ret.isErr()) {\n return this.toMsg(\n buildErrorMsg(this, req, this.logger.Error().Err(ret.Err()).Msg(\"decode error\").AsError(), this.sthis.txt.decode(data)),\n );\n }\n return this.toMsg(ret.Ok());\n }\n\n // toOnMessage<T extends MsgBase>(msg: WithErrorMsg<T>): Result<WithErrorMsg<T>> {\n // this.mec.msgFn?.(msg as unknown as MessageEvent<MsgBase>);\n // return Result.Ok(msg);\n // }\n}\n","import { SuperThis } from \"../../types.js\";\nimport { MsgBase, ErrorMsg, buildErrorMsg } from \"./msg-types.js\";\nimport { ExchangedGestalt, OnErrorFn, UnReg } from \"./msger.js\";\nimport { Logger } from \"@adviser/cement\";\n\nexport class MsgRawConnectionBase {\n readonly sthis: SuperThis;\n readonly exchangedGestalt: ExchangedGestalt;\n\n constructor(sthis: SuperThis, exGestalt: ExchangedGestalt) {\n this.sthis = sthis;\n this.exchangedGestalt = exGestalt;\n }\n\n readonly onErrorFns = new Map<string, OnErrorFn>();\n onError(fn: OnErrorFn): UnReg {\n const key = this.sthis.nextId().str;\n this.onErrorFns.set(key, fn);\n return () => this.onErrorFns.delete(key);\n }\n\n buildErrorMsg(\n msgCtx: {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n },\n msg: Partial<MsgBase>,\n err: Error,\n ): ErrorMsg {\n // const logLine = this.sthis.logger.Error().Err(err).Any(\"msg\", msg);\n const rmsg = Array.from(this.onErrorFns.values()).reduce((msg, fn) => {\n return fn(msg, err);\n }, msg);\n const emsg = buildErrorMsg(msgCtx, rmsg, err);\n msgCtx.logger.Error().Err(err).Any(\"msg\", rmsg).Msg(\"connection error\");\n return emsg;\n }\n}\n","import { exception2Result, Future, Logger, Result } from \"@adviser/cement\";\nimport { MsgBase, MsgIsError, buildErrorMsg, ReqOpen, WaitForTid, MsgWithError, RequestOpts, MsgIsTid } from \"./msg-types.js\";\nimport { ActiveStream, ExchangedGestalt, MsgerParamsWithEnDe, MsgRawConnection, OnMsgFn, UnReg } from \"./msger.js\";\nimport { MsgRawConnectionBase } from \"./msg-raw-connection-base.js\";\nimport { SuperThis } from \"../../types.js\";\nimport { ensureLogger } from \"../../utils.js\";\n\nexport interface WSReqOpen {\n readonly reqOpen: ReqOpen;\n readonly ws: WebSocket; // this WS is opened with a specific URL-Param\n}\n\nexport class WSConnection extends MsgRawConnectionBase implements MsgRawConnection {\n readonly logger: Logger;\n readonly msgP: MsgerParamsWithEnDe;\n readonly ws: WebSocket;\n // readonly baseURI: URI;\n\n readonly #onMsg = new Map<string, OnMsgFn>();\n readonly #onClose = new Map<string, UnReg>();\n\n readonly waitForTid = new Map<string, WaitForTid>();\n\n opened = false;\n\n readonly id: string;\n\n constructor(sthis: SuperThis, ws: WebSocket, msgP: MsgerParamsWithEnDe, exGestalt: ExchangedGestalt) {\n super(sthis, exGestalt);\n this.id = sthis.nextId().str;\n this.logger = ensureLogger(sthis, \"WSConnection\");\n this.msgP = msgP;\n this.ws = ws;\n // this.wqs = { ...wsq };\n }\n\n async start(): Promise<Result<void>> {\n const onOpenFuture: Future<Result<unknown>> = new Future<Result<unknown>>();\n const timer = setTimeout(() => {\n const err = this.logger.Error().Dur(\"timeout\", this.msgP.timeout).Msg(\"Timeout\").AsError();\n this.toMsg(buildErrorMsg(this, {} as MsgBase, err));\n onOpenFuture.resolve(Result.Err(err));\n }, this.msgP.timeout);\n this.ws.onopen = () => {\n onOpenFuture.resolve(Result.Ok(undefined));\n this.opened = true;\n };\n this.ws.onerror = (ierr) => {\n const err = this.logger.Error().Err(ierr).Msg(\"WS Error\").AsError();\n onOpenFuture.resolve(Result.Err(err));\n const res = this.buildErrorMsg(this, {}, err);\n this.toMsg(res);\n };\n this.ws.onmessage = (evt) => {\n if (!this.opened) {\n this.toMsg(buildErrorMsg(this, {} as MsgBase, this.logger.Error().Msg(\"Received message before onOpen\").AsError()));\n }\n this.#wsOnMessage(evt);\n };\n this.ws.onclose = () => {\n this.opened = false;\n // console.log(\"onclose\", this.id);\n this.close().catch((ierr) => {\n const err = this.logger.Error().Err(ierr).Msg(\"close error\").AsError();\n onOpenFuture.resolve(Result.Err(err));\n this.toMsg(buildErrorMsg(this, { tid: \"internal\" } as MsgBase, err));\n });\n };\n /* wait for onOpen */\n const rOpen = await onOpenFuture.asPromise().finally(() => {\n clearTimeout(timer);\n });\n if (rOpen.isErr()) {\n return rOpen;\n }\n // const resOpen = await this.request(this.wqs.reqOpen, { waitFor: MsgIsResOpen });\n // if (!MsgIsResOpen(resOpen)) {\n // return Result.Err(this.logger.Error().Any(\"ErrMsg\", resOpen).Msg(\"Invalid response\").AsError());\n // }\n // this.wqs.resOpen = resOpen;\n return Result.Ok(undefined);\n }\n\n readonly #wsOnMessage = async (event: MessageEvent) => {\n const rMsg = await exception2Result(() => this.msgP.ende.decode(event.data) as MsgBase);\n if (rMsg.isErr()) {\n this.logger.Error().Err(rMsg).Any(event.data).Msg(\"Invalid message\");\n return;\n }\n const msg = rMsg.Ok();\n const waitFor = this.waitForTid.get(msg.tid);\n Array.from(this.#onMsg.values()).forEach((cb) => {\n // console.log(\"cb-onmessage\", this.id, msg, cb.toString());\n cb(msg);\n });\n if (waitFor) {\n if (MsgIsError(msg)) {\n this.waitForTid.delete(msg.tid);\n waitFor.future.resolve(msg);\n } else if (waitFor.waitFor(msg)) {\n // what for a specific type\n this.waitForTid.delete(msg.tid);\n waitFor.future.resolve(msg);\n } else {\n // wild-card\n this.waitForTid.delete(msg.tid);\n waitFor.future.resolve(msg);\n }\n }\n };\n\n async close(): Promise<Result<void>> {\n this.#onClose.forEach((fn) => fn());\n this.#onClose.clear();\n this.#onMsg.clear();\n this.ws.close();\n return Result.Ok(undefined);\n }\n\n toMsg<S extends MsgBase>(msg: MsgWithError<S>): MsgWithError<S> {\n this.#onMsg.forEach((fn) => fn(msg));\n return msg;\n }\n\n send<Q extends MsgBase, S extends MsgBase>(msg: Q): Promise<S> {\n this.ws.send(this.msgP.ende.encode(msg));\n return Promise.resolve(msg as unknown as S);\n }\n\n onMsg<S extends MsgBase>(fn: OnMsgFn<S>): UnReg {\n const key = this.sthis.nextId().str;\n this.#onMsg.set(key, fn as OnMsgFn);\n return () => this.#onMsg.delete(key);\n }\n\n onClose(fn: UnReg): UnReg {\n const key = this.sthis.nextId().str;\n this.#onClose.set(key, fn);\n return () => this.#onClose.delete(key);\n }\n\n readonly activeBinds = new Map<string, ActiveStream<MsgBase, MsgBase>>();\n bind<Q extends MsgBase, S extends MsgBase>(req: Q, opts: RequestOpts): ReadableStream<MsgWithError<S>> {\n const state: ActiveStream<S, Q> = {\n id: this.sthis.nextId().str,\n bind: {\n msg: req,\n opts,\n },\n // timeout: undefined,\n // controller: undefined,\n } satisfies ActiveStream<S, Q>;\n this.activeBinds.set(state.id, state);\n return new ReadableStream<MsgWithError<S>>({\n cancel: () => {\n // clearTimeout(state.timeout as number);\n this.activeBinds.delete(state.id);\n },\n start: (controller) => {\n this.onMsg<S>((msg) => {\n if (MsgIsError(msg)) {\n controller.enqueue(msg);\n return;\n }\n if (!MsgIsTid(msg, req.tid)) {\n return;\n }\n if (opts.waitFor && opts.waitFor(msg)) {\n controller.enqueue(msg);\n }\n });\n this.send(req);\n const future = new Future<S>();\n this.waitForTid.set(req.tid, { tid: req.tid, future, waitFor: opts.waitFor, timeout: opts.timeout });\n future.asPromise().then((msg) => {\n if (MsgIsError(msg)) {\n // double err emitting\n controller.enqueue(msg);\n controller.close();\n }\n });\n },\n });\n }\n\n async request<Q extends MsgBase, S extends MsgBase>(req: Q, opts: RequestOpts): Promise<MsgWithError<S>> {\n if (!this.opened) {\n return buildErrorMsg(this, req, this.logger.Error().Msg(\"Connection not open\").AsError());\n }\n const future = new Future<S>();\n this.waitForTid.set(req.tid, { tid: req.tid, future, waitFor: opts.waitFor, timeout: opts.timeout });\n await this.send(req);\n return future.asPromise();\n }\n\n // toOnMessage<T extends MsgBase>(msg: WithErrorMsg<T>): Result<WithErrorMsg<T>> {\n // this.mec.msgFn?.(msg as unknown as MessageEvent<MsgBase>);\n // return Result.Ok(msg);\n // }\n}\n","import { Result, URI } from \"@adviser/cement\";\nimport {\n ReqSignedUrl,\n NextId,\n MsgBase,\n ResSignedUrl,\n MsgWithError,\n buildRes,\n ReqSignedUrlParam,\n buildReqSignedUrl,\n GwCtx,\n MsgIsTenantLedger,\n MsgTypesCtx,\n MsgWithConnAuth,\n PreSignedMsg,\n} from \"./msg-types.js\";\n\nexport interface ReqGetData extends ReqSignedUrl {\n readonly type: \"reqGetData\";\n}\n\nexport function buildReqGetData(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqGetData {\n return buildReqSignedUrl<ReqGetData>(sthis, \"reqGetData\", sup, ctx);\n}\n\nexport function MsgIsReqGetData(msg: MsgBase): msg is ReqGetData {\n return msg.type === \"reqGetData\";\n}\n\nexport interface ResGetData extends ResSignedUrl {\n readonly type: \"resGetData\";\n // readonly payload: Uint8Array; // transfered via JSON base64\n}\n\nexport function MsgIsResGetData(msg: MsgBase): msg is ResGetData {\n return msg.type === \"resGetData\" && MsgIsTenantLedger(msg);\n}\n\nexport interface CalculatePreSignedUrl {\n calculatePreSignedUrl(ctx: MsgTypesCtx, p: PreSignedMsg): Promise<Result<URI>>;\n}\n\nexport function buildResGetData(\n msgCtx: MsgTypesCtx,\n req: MsgWithConnAuth<ReqGetData>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResGetData>> {\n return buildRes<MsgWithConnAuth<ReqGetData>, ResGetData>(\n { method: \"GET\", store: req.methodParams.store },\n \"resGetData\",\n msgCtx,\n req,\n ctx,\n );\n}\n\nexport interface ReqPutData extends ReqSignedUrl {\n readonly type: \"reqPutData\";\n // readonly payload: Uint8Array; // transfered via JSON base64\n}\n\nexport function MsgIsReqPutData(msg: MsgBase): msg is ReqPutData {\n return msg.type === \"reqPutData\";\n}\n\nexport function buildReqPutData(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqPutData {\n return buildReqSignedUrl<ReqPutData>(sthis, \"reqPutData\", sup, ctx);\n}\n\nexport interface ResPutData extends ResSignedUrl {\n readonly type: \"resPutData\";\n}\n\nexport function MsgIsResPutData(msg: MsgBase): msg is ResPutData {\n return msg.type === \"resPutData\";\n}\n\nexport function buildResPutData(\n msgCtx: MsgTypesCtx,\n req: MsgWithConnAuth<ReqPutData>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResPutData>> {\n return buildRes<MsgWithConnAuth<ReqPutData>, ResPutData>(\n { method: \"PUT\", store: req.methodParams.store },\n \"resPutData\",\n msgCtx,\n req,\n ctx,\n );\n}\n\nexport interface ReqDelData extends ReqSignedUrl {\n readonly type: \"reqDelData\";\n}\n\nexport function MsgIsReqDelData(msg: MsgBase): msg is ReqDelData {\n return msg.type === \"reqDelData\";\n}\n\nexport function buildReqDelData(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqDelData {\n return buildReqSignedUrl<ReqDelData>(sthis, \"reqDelData\", sup, ctx);\n}\n\nexport interface ResDelData extends ResSignedUrl {\n readonly type: \"resDelData\";\n}\n\nexport function MsgIsResDelData(msg: MsgBase): msg is ResDelData {\n return msg.type === \"resDelData\";\n}\n\nexport function buildResDelData(\n msgCtx: MsgTypesCtx,\n req: MsgWithConnAuth<ReqDelData>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResDelData>> {\n return buildRes<MsgWithConnAuth<ReqDelData>, ResDelData>(\n { method: \"DELETE\", store: req.methodParams.store },\n \"resDelData\",\n msgCtx,\n req,\n ctx,\n );\n}\n","import {\n AuthType,\n GwCtx,\n MsgBase,\n MsgWithTenantLedger,\n NextId,\n ResOptionalSignedUrl,\n MsgTypesCtx,\n MsgWithConnAuth,\n SignedUrlParam,\n MethodSignedUrlParam,\n ResSignedUrl,\n VERSION,\n} from \"./msg-types.js\";\nimport { V2SerializedMetaKey } from \"../../runtime/meta-key-hack.js\";\n\n/* Put Meta */\nexport interface ReqPutMeta extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly type: \"reqPutMeta\";\n readonly methodParams: MethodSignedUrlParam;\n readonly params: SignedUrlParam;\n readonly meta: V2SerializedMetaKey;\n}\n\nexport interface ResPutMeta extends MsgWithTenantLedger<MsgWithConnAuth>, ResSignedUrl {\n readonly type: \"resPutMeta\";\n // readonly signedUrl?: string;\n readonly meta: V2SerializedMetaKey;\n}\n\nexport function buildReqPutMeta(\n sthis: NextId,\n auth: AuthType,\n signedUrlParams: SignedUrlParam,\n meta: V2SerializedMetaKey,\n gwCtx: GwCtx,\n): ReqPutMeta {\n return {\n auth,\n tid: sthis.nextId().str,\n type: \"reqPutMeta\",\n ...gwCtx,\n version: VERSION,\n methodParams: {\n method: \"PUT\",\n store: \"meta\",\n },\n params: signedUrlParams,\n meta,\n };\n}\n\nexport function MsgIsReqPutMeta(msg: MsgBase): msg is ReqPutMeta {\n return msg.type === \"reqPutMeta\";\n}\n\nexport function buildResPutMeta(\n _msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqPutMeta>>,\n meta: V2SerializedMetaKey,\n signedUrl: string,\n): ResPutMeta {\n return {\n meta,\n tid: req.tid,\n conn: req.conn,\n auth: req.auth,\n methodParams: req.methodParams,\n params: req.params,\n tenant: req.tenant,\n type: \"resPutMeta\",\n signedUrl,\n version: VERSION,\n };\n}\n\nexport function MsgIsResPutMeta(qs: MsgBase): qs is ResPutMeta {\n return qs.type === \"resPutMeta\";\n}\n\n/* Bind Meta */\nexport interface BindGetMeta extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly type: \"bindGetMeta\";\n readonly params: SignedUrlParam;\n}\n\nexport function MsgIsBindGetMeta(msg: MsgBase): msg is BindGetMeta {\n return msg.type === \"bindGetMeta\";\n}\n\nexport interface EventGetMeta extends MsgWithTenantLedger<MsgWithConnAuth>, ResSignedUrl {\n readonly type: \"eventGetMeta\";\n readonly meta: V2SerializedMetaKey;\n}\n\nexport function buildBindGetMeta(sthis: NextId, auth: AuthType, params: SignedUrlParam, gwCtx: GwCtx): BindGetMeta {\n return {\n auth,\n tid: sthis.nextId().str,\n ...gwCtx,\n type: \"bindGetMeta\",\n version: VERSION,\n params,\n };\n}\n\nexport function buildEventGetMeta(\n _msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<BindGetMeta>>,\n meta: V2SerializedMetaKey,\n gwCtx: GwCtx,\n signedUrl: string,\n): EventGetMeta {\n return {\n conn: gwCtx.conn,\n tenant: req.tenant,\n auth: req.auth,\n tid: req.tid,\n meta,\n signedUrl,\n type: \"eventGetMeta\",\n params: req.params,\n methodParams: { method: \"GET\", store: \"meta\" },\n version: VERSION,\n };\n}\n\nexport function MsgIsEventGetMeta(qs: MsgBase): qs is EventGetMeta {\n return qs.type === \"eventGetMeta\";\n}\n\n/* Del Meta */\nexport interface ReqDelMeta extends MsgWithTenantLedger<MsgWithConnAuth> {\n readonly type: \"reqDelMeta\";\n readonly params: SignedUrlParam;\n readonly meta?: V2SerializedMetaKey;\n}\n\nexport function buildReqDelMeta(\n sthis: NextId,\n auth: AuthType,\n params: SignedUrlParam,\n gwCtx: GwCtx,\n meta?: V2SerializedMetaKey,\n): ReqDelMeta {\n return {\n auth,\n tid: sthis.nextId().str,\n tenant: gwCtx.tenant,\n conn: gwCtx.conn,\n params,\n meta,\n type: \"reqDelMeta\",\n version: VERSION,\n // params: signedUrlParams,\n };\n}\n\nexport function MsgIsReqDelMeta(msg: MsgBase): msg is ReqDelMeta {\n return msg.type === \"reqDelMeta\";\n}\n\nexport interface ResDelMeta extends MsgWithTenantLedger<MsgWithConnAuth>, ResOptionalSignedUrl {\n readonly type: \"resDelMeta\";\n}\n\nexport function buildResDelMeta(\n // msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqDelMeta>>,\n params: SignedUrlParam,\n signedUrl?: string,\n): ResDelMeta {\n return {\n auth: req.auth,\n methodParams: { method: \"DELETE\", store: \"meta\" },\n params,\n signedUrl,\n tid: req.tid,\n conn: req.conn,\n tenant: req.tenant,\n type: \"resDelMeta\",\n // key: req.key,\n version: VERSION,\n };\n}\n\nexport function MsgIsResDelMeta(qs: MsgBase): qs is ResDelMeta {\n return qs.type === \"resDelMeta\";\n}\n","import { exception2Result, Result, URI } from \"@adviser/cement\";\nimport { SerializedMeta } from \"./gateways/fp-envelope-serialize.js\";\nimport { SerdeGateway, SerdeGatewayCtx } from \"../blockstore/serde-gateway.js\";\nimport { PARAM, SuperThis } from \"../types.js\";\nimport { FPEnvelope, FPEnvelopeMeta } from \"../blockstore/fp-envelope.js\";\nimport { NotFoundError } from \"../utils.js\";\nimport { DefSerdeGateway } from \"./gateways/def-serde-gateway.js\";\nimport { Gateway } from \"../blockstore/gateway.js\";\nimport { Loadable } from \"../blockstore/types.js\";\n\ntype V1SerializedMetaKey = SerializedMeta & {\n // old version\n readonly key?: string | string[];\n // new version\n readonly keys?: string[];\n};\n\nexport interface V2SerializedMetaKey {\n readonly metas: SerializedMeta[];\n readonly keys: string[];\n}\n\n// type SerializedMetaWithKey = V1SerializedMetaKey[] | V2SerializedMetaKey;\n\nfunction fromV1toV2SerializedMetaKey(v1s: unknown[], keys: string[] = []): V2SerializedMetaKey {\n const res = (v1s as Partial<V1SerializedMetaKey>[]).reduce(\n (acc, v1) => {\n const keys: string[] = [];\n if (v1.key) {\n if (typeof v1.key === \"string\") {\n acc.keys.add(v1.key);\n } else {\n keys.push(...v1.key);\n }\n }\n if (v1.keys) {\n keys.push(...v1.keys);\n }\n for (const key of keys) {\n acc.keys.add(key);\n }\n if (typeof v1.cid === \"string\" && (!v1.data || typeof v1.data === \"string\") && (!v1.parents || Array.isArray(v1.parents))) {\n acc.metas.set(v1.cid, {\n data: v1.data ?? \"\",\n parents: v1.parents ?? [],\n cid: v1.cid,\n });\n }\n return acc;\n },\n {\n metas: new Map<string, SerializedMeta>(),\n keys: new Set<string>(keys),\n },\n );\n return {\n metas: Array.from(res.metas.values()),\n keys: Array.from(res.keys),\n };\n}\n\nfunction isV2SerializedMetaKey(or: NonNullable<unknown>): or is Partial<V2SerializedMetaKey> {\n const my = or as Partial<V2SerializedMetaKey>;\n return my !== null && (!my.keys || Array.isArray(my.keys)) && (!my.metas || Array.isArray(my.metas));\n}\n\nfunction toV2SerializedMetaKey(or: NonNullable<unknown>): V2SerializedMetaKey {\n if (Array.isArray(or)) {\n return fromV1toV2SerializedMetaKey(or);\n }\n if (isV2SerializedMetaKey(or)) {\n return fromV1toV2SerializedMetaKey(or.metas ?? [], or.keys ?? []);\n }\n throw new Error(\"not a valid serialized meta key\");\n}\n\nexport async function V2SerializedMetaKeyExtractKey(\n ctx: SerdeGatewayCtx,\n v2: V2SerializedMetaKey,\n): Promise<Result<SerializedMeta[]>> {\n const kb = await ctx.loader.keyBag();\n if (!kb) {\n return Promise.resolve(Result.Err(new Error(\"missing keybag\")));\n }\n const dataUrl = await ctx.loader.attachedStores.local().active.car.url();\n const keyName = dataUrl.getParam(PARAM.STORE_KEY);\n if (!keyName) {\n ctx.loader.sthis.logger.Warn().Url(dataUrl).Msg(\"missing store key\");\n } else {\n const rKey = await kb.getNamedKey(keyName);\n if (rKey.isErr()) {\n ctx.loader.sthis.logger.Warn().Str(\"keyName\", keyName).Msg(\"did not found a extractable key\");\n } else {\n for (const keyStr of v2.keys) {\n // side effect: in the keybag\n // this is the key gossip protocol\n // it basically collects all the keys that are used distributed metas\n const res = await rKey.Ok().upsert(keyStr, false);\n if (res.isErr()) {\n ctx.loader.sthis.logger.Warn().Str(\"keyStr\", keyStr).Msg(\"failed to upsert key\");\n }\n }\n }\n }\n return Promise.resolve(Result.Ok(v2.metas));\n}\n\nexport async function decodeAsToSerializedMeta(ctx: SerdeGatewayCtx, raw: Uint8Array): Promise<Result<V2SerializedMetaKey>> {\n const rJsObj = exception2Result(() => JSON.parse(ctx.loader.sthis.txt.decode(raw))) as Result<NonNullable<unknown>>;\n if (rJsObj.isErr()) {\n return Result.Err(rJsObj);\n }\n const v2 = toV2SerializedMetaKey(rJsObj.unwrap());\n const metas = await V2SerializedMetaKeyExtractKey(ctx, v2);\n if (metas.isErr()) {\n return Result.Err(metas);\n }\n return Result.Ok({\n metas: metas.Ok(),\n keys: v2.keys,\n });\n}\n\nexport function addKeyToDbMetaDecoder(\n ctx: SerdeGatewayCtx & { readonly lastDecodedMetas?: V2SerializedMetaKey[] },\n): SerdeGatewayCtx & { lastDecodedMetas: V2SerializedMetaKey[] } {\n const lastDecodedMetas: V2SerializedMetaKey[] = ctx.lastDecodedMetas ?? [];\n return {\n ...ctx,\n lastDecodedMetas,\n decoder: {\n meta: async (sthis: SuperThis, raw: Uint8Array): Promise<Result<SerializedMeta[]>> => {\n const r = await decodeAsToSerializedMeta(ctx, raw);\n if (r.isErr()) {\n return Promise.resolve(Result.Err(r));\n }\n // we only want to keep the last 2 metas\n if (lastDecodedMetas.length > 2) {\n lastDecodedMetas.shift();\n }\n lastDecodedMetas.push(r.Ok());\n return Promise.resolve(Result.Ok(r.Ok().metas));\n },\n },\n };\n}\n\nasync function wrapEncode<T extends V1SerializedMetaKey[] | V2SerializedMetaKey>(\n ctx: SerdeGatewayCtx,\n payload: SerializedMeta[],\n fn: (payload: SerializedMeta[], keyM: string[]) => T,\n): Promise<Result<T>> {\n const carStore = ctx.loader.attachedStores.local().active.car;\n const kb = await ctx.loader.keyBag();\n if (!kb) {\n return Promise.resolve(Result.Err(new Error(\"missing keybag\")));\n }\n const keyName = carStore.url().getParam(PARAM.STORE_KEY) ?? \"\";\n const rKex = await kb.getNamedKey(keyName);\n if (rKex.isErr()) {\n return Promise.resolve(Result.Err(rKex.Err()));\n }\n /* security: we don't want to log the key */\n const keyMaterials = await rKex\n .Ok()\n .asKeysItem()\n .then((i) => Object.values(i.keys).map((i) => i.key));\n\n return Promise.resolve(Result.Ok(fn(payload, keyMaterials)));\n}\n\nexport function encodeAsV1SerializedMetaKey(\n ctx: SerdeGatewayCtx,\n payload: SerializedMeta[],\n): Promise<Result<V1SerializedMetaKey[]>> {\n return wrapEncode(ctx, payload, (payload, keyM) => payload.map((p) => ({ ...p, key: keyM }) satisfies V1SerializedMetaKey));\n}\n\nexport function encodeAsV2SerializedMetaKey(ctx: SerdeGatewayCtx, payload: SerializedMeta[]): Promise<Result<V2SerializedMetaKey>> {\n return wrapEncode(\n ctx,\n payload,\n (payload, keyM) =>\n ({\n metas: payload,\n keys: keyM,\n }) satisfies V2SerializedMetaKey,\n );\n}\n\nexport function addKeyToDbMetaEncoder(ctx: SerdeGatewayCtx, version: \"v1\" | \"v2\"): SerdeGatewayCtx {\n return {\n ...ctx,\n encoder: {\n meta: async (sthis: SuperThis, payload: SerializedMeta[]): Promise<Result<Uint8Array>> => {\n let obj: Result<V1SerializedMetaKey[] | V2SerializedMetaKey>;\n switch (version) {\n case \"v1\":\n obj = await encodeAsV1SerializedMetaKey(ctx, payload);\n break;\n case \"v2\":\n obj = await encodeAsV2SerializedMetaKey(ctx, payload);\n break;\n default:\n return Promise.resolve(Result.Err(`unknown version:[${version}]`));\n }\n if (obj.isErr()) {\n return Promise.resolve(Result.Err(obj));\n }\n try {\n return Promise.resolve(Result.Ok(sthis.txt.encode(JSON.stringify(obj.Ok()))));\n } catch (e) {\n return Promise.resolve(Result.Err(e as Error));\n }\n },\n },\n };\n}\n\nexport class AddKeyToDbMetaGateway implements SerdeGateway {\n private readonly sdGw: DefSerdeGateway;\n readonly version: \"v1\" | \"v2\";\n constructor(gw: Gateway, version: \"v1\" | \"v2\") {\n this.sdGw = new DefSerdeGateway(gw);\n this.version = version;\n }\n\n buildUrl(ctx: SerdeGatewayCtx, baseUrl: URI, key: string): Promise<Result<URI>> {\n return this.sdGw.buildUrl(ctx, baseUrl, key);\n }\n start(ctx: SerdeGatewayCtx, baseUrl: URI): Promise<Result<URI>> {\n return this.sdGw.start(ctx, baseUrl);\n }\n close(ctx: SerdeGatewayCtx, baseUrl: URI): Promise<Result<void, Error>> {\n return this.sdGw.close(ctx, baseUrl);\n }\n async put<T>(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope<T>): Promise<Result<void, Error>> {\n return this.sdGw.put(addKeyToDbMetaEncoder(ctx, this.version), url, body);\n }\n async get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<Result<FPEnvelope<S>, Error | NotFoundError>> {\n return this.sdGw.get(addKeyToDbMetaDecoder({ ...ctx, lastDecodedMetas: this.lastDecodedMetas }), url);\n }\n\n // only for tests\n readonly lastDecodedMetas: V2SerializedMetaKey[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n delete(ctx: SerdeGatewayCtx, url: URI, loader?: Loadable): Promise<Result<void, Error>> {\n return this.sdGw.delete(ctx, url);\n }\n subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (meta: FPEnvelopeMeta) => Promise<void>): Promise<Result<() => void, Error>> {\n return this.sdGw.subscribe(addKeyToDbMetaDecoder({ ...ctx, lastDecodedMetas: this.lastDecodedMetas }), url, callback);\n }\n getPlain(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<Uint8Array>> {\n return this.sdGw.getPlain(ctx, url, key);\n }\n destroy(ctx: SerdeGatewayCtx, baseUrl: URI): Promise<Result<void, Error>> {\n return this.sdGw.destroy(ctx, baseUrl);\n }\n}\n","export * as cloud from \"./cloud/index.js\";\n","export * from \"./http-connection.js\";\nexport * from \"./msg-raw-connection-base.js\";\nexport * from \"./msg-types-data.js\";\nexport * from \"./msg-types-meta.js\";\nexport * from \"./msg-types-meta.js\";\nexport * from \"./msg-types-wal.js\";\nexport * from \"./msg-types.js\";\nexport * from \"./msger.js\";\nexport * from \"./ws-connection.js\";\n","import {\n MsgBase,\n MsgWithError,\n buildRes,\n NextId,\n ReqSignedUrl,\n ResSignedUrl,\n ReqSignedUrlParam,\n buildReqSignedUrl,\n GwCtx,\n MsgIsTenantLedger,\n MsgWithTenantLedger,\n MsgTypesCtx,\n MsgWithConnAuth,\n} from \"./msg-types.js\";\nimport { CalculatePreSignedUrl } from \"./msg-types-data.js\";\n\nexport interface ReqGetWAL extends ReqSignedUrl {\n readonly type: \"reqGetWAL\";\n}\n\nexport function MsgIsReqGetWAL(msg: MsgBase): msg is ReqGetWAL {\n return msg.type === \"reqGetWAL\";\n}\n\nexport function buildReqGetWAL(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqGetWAL {\n return buildReqSignedUrl<ReqGetWAL>(sthis, \"reqGetWAL\", sup, ctx);\n}\n\nexport interface ResGetWAL extends ResSignedUrl {\n readonly type: \"resGetWAL\";\n // readonly payload: Uint8Array; // transfered via JSON base64\n}\n\nexport function MsgIsResGetWAL(msg: MsgBase): msg is ResGetWAL {\n return msg.type === \"resGetWAL\";\n}\n\nexport function buildResGetWAL(\n msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqGetWAL>>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResGetWAL>> {\n return buildRes<MsgWithTenantLedger<MsgWithConnAuth<ReqGetWAL>>, ResGetWAL>(\n { method: \"GET\", store: \"wal\" },\n \"resGetWAL\",\n msgCtx,\n req,\n ctx,\n );\n}\n\nexport interface ReqPutWAL extends Omit<ReqSignedUrl, \"type\"> {\n readonly type: \"reqPutWAL\";\n // readonly payload: Uint8Array; // transfered via JSON base64\n}\n\nexport function MsgIsReqPutWAL(msg: MsgBase): msg is ReqPutWAL {\n return msg.type === \"reqPutWAL\";\n}\n\nexport function buildReqPutWAL(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqPutWAL {\n return buildReqSignedUrl<ReqPutWAL>(sthis, \"reqPutWAL\", sup, ctx);\n}\n\nexport interface ResPutWAL extends Omit<ResSignedUrl, \"type\"> {\n readonly type: \"resPutWAL\";\n}\n\nexport function MsgIsResPutWAL(msg: MsgBase): msg is ResPutWAL {\n return msg.type === \"resPutWAL\";\n}\n\nexport function buildResPutWAL(\n msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqPutWAL>>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResPutWAL>> {\n return buildRes<MsgWithTenantLedger<MsgWithConnAuth<ReqPutWAL>>, ResPutWAL>(\n { method: \"PUT\", store: \"wal\" },\n \"resPutWAL\",\n msgCtx,\n req,\n ctx,\n );\n}\n\nexport interface ReqDelWAL extends Omit<ReqSignedUrl, \"type\"> {\n readonly type: \"reqDelWAL\";\n}\n\nexport function MsgIsReqDelWAL(msg: MsgBase): msg is ReqDelWAL {\n return msg.type === \"reqDelWAL\";\n}\n\nexport function buildReqDelWAL(sthis: NextId, sup: ReqSignedUrlParam, ctx: GwCtx): ReqDelWAL {\n return buildReqSignedUrl<ReqDelWAL>(sthis, \"reqDelWAL\", sup, ctx);\n}\n\nexport interface ResDelWAL extends Omit<ResSignedUrl, \"type\"> {\n readonly type: \"resDelWAL\";\n}\n\nexport function MsgIsResDelWAL(msg: MsgBase): msg is ResDelWAL {\n return msg.type === \"resDelWAL\" && MsgIsTenantLedger(msg);\n}\n\nexport function buildResDelWAL(\n msgCtx: MsgTypesCtx,\n req: MsgWithTenantLedger<MsgWithConnAuth<ReqDelWAL>>,\n ctx: CalculatePreSignedUrl,\n): Promise<MsgWithError<ResDelWAL>> {\n return buildRes<MsgWithTenantLedger<MsgWithConnAuth<ReqDelWAL>>, ResDelWAL>(\n { method: \"DELETE\", store: \"wal\" },\n \"resDelWAL\",\n msgCtx,\n req,\n ctx,\n );\n}\n","export const PACKAGE_VERSION = Object.keys({\n \"0.20.4-dev-preview-3\": \"xxxx\",\n})[0] as string;\n"],"mappings":"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","names":["import_cement","raw","import_cement","index","import_cement","hasher","import_cement","import_base58","import_cement","import_cement","import_cement","import_cement","import_cement","import_cement","import_cement","raw","raw","decode","encode","import_multiformats","mfBlock","codec","hasher","binary","import_sha2","import_utils","cache","hasher","charwise","root","import_cement","import_cement","import_cement","import_cement","import_sha2","decode","hasher","import_block","import_cement","import_cement","dagCodec","import_sha2","codec","encode","dagCodec","import_sha2","cid","import_cement","pLimit","cid","got","ci","e","decode","hasher","import_base58","import_sha2","hasher","import_clock","import_dag_json","pRetry","pMap","import_cement","import_link","import_sha2","codec","import_clock","encode","hasher","codec","decode","import_clock","import_crdt","import_cement","task","updates","import_cement","import_base58","alg","options","import_cement","gateway_exports","gateway_exports","import_cement","import_cement","import_cement","msg","data","ret","import_cement","raw","WebSocket","import_cement","keys","raw","i","payload","VERSION","module"]}