@fireproof/core 0.19.0-dev-publish → 0.19.0-dev-use-fix

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.
Files changed (46) hide show
  1. package/{chunk-EVSZA26U.js → chunk-AZVWSRER.js} +2 -2
  2. package/{chunk-UCMXU3DH.js → chunk-NZNG6TQT.js} +103 -1
  3. package/chunk-NZNG6TQT.js.map +1 -0
  4. package/{chunk-5X6APJDY.js → chunk-ZHO4NMWL.js} +2 -2
  5. package/index.cjs +122 -92
  6. package/index.cjs.map +1 -1
  7. package/index.d.cts +21 -1
  8. package/index.d.ts +21 -1
  9. package/index.js +41 -122
  10. package/index.js.map +1 -1
  11. package/metafile-cjs.json +1 -1
  12. package/metafile-esm.json +1 -1
  13. package/package.json +1 -1
  14. package/{sqlite-data-store-RIH56645.js → sqlite-data-store-3ST7XOLX.js} +3 -3
  15. package/{sqlite-meta-store-6347MWOR.js → sqlite-meta-store-QOIMCSJ7.js} +3 -3
  16. package/{sqlite-wal-store-G5YGK77N.js → sqlite-wal-store-JFBQPOYT.js} +3 -3
  17. package/{store-file-D472VFCS.js → store-file-CSS5THFH.js} +2 -2
  18. package/{store-indexdb-FRX5PTKR.js → store-indexdb-DR4HELVP.js} +3 -3
  19. package/{store-sql-MDSU23Y7.js → store-sql-BG6SMGQJ.js} +5 -5
  20. package/tests/blockstore/loader.test.ts +265 -0
  21. package/tests/blockstore/store.test.ts +164 -0
  22. package/tests/blockstore/transaction.test.ts +121 -0
  23. package/tests/fireproof/config.test.ts +212 -0
  24. package/tests/fireproof/crdt.test.ts +434 -0
  25. package/tests/fireproof/database.test.ts +466 -0
  26. package/tests/fireproof/fireproof.test.ts +602 -0
  27. package/tests/fireproof/hello.test.ts +54 -0
  28. package/tests/fireproof/indexer.test.ts +389 -0
  29. package/tests/helpers.ts +81 -0
  30. package/tests/react/useFireproof.test.tsx +19 -0
  31. package/tests/www/gallery.html +132 -0
  32. package/tests/www/iife.html +42 -0
  33. package/tests/www/todo-aws.html +232 -0
  34. package/tests/www/todo-ipfs.html +213 -0
  35. package/tests/www/todo-local.html +214 -0
  36. package/tests/www/todo-netlify.html +227 -0
  37. package/tests/www/todo.html +236 -0
  38. package/chunk-UCMXU3DH.js.map +0 -1
  39. /package/{chunk-EVSZA26U.js.map → chunk-AZVWSRER.js.map} +0 -0
  40. /package/{chunk-5X6APJDY.js.map → chunk-ZHO4NMWL.js.map} +0 -0
  41. /package/{sqlite-data-store-RIH56645.js.map → sqlite-data-store-3ST7XOLX.js.map} +0 -0
  42. /package/{sqlite-meta-store-6347MWOR.js.map → sqlite-meta-store-QOIMCSJ7.js.map} +0 -0
  43. /package/{sqlite-wal-store-G5YGK77N.js.map → sqlite-wal-store-JFBQPOYT.js.map} +0 -0
  44. /package/{store-file-D472VFCS.js.map → store-file-CSS5THFH.js.map} +0 -0
  45. /package/{store-indexdb-FRX5PTKR.js.map → store-indexdb-DR4HELVP.js.map} +0 -0
  46. /package/{store-sql-MDSU23Y7.js.map → store-sql-BG6SMGQJ.js.map} +0 -0
@@ -8,7 +8,7 @@ import {
8
8
  exceptionWrapper,
9
9
  getKey,
10
10
  getStore
11
- } from "./chunk-UCMXU3DH.js";
11
+ } from "./chunk-NZNG6TQT.js";
12
12
  import {
13
13
  SysContainer
14
14
  } from "./chunk-H3A2HMMM.js";
@@ -205,4 +205,4 @@ export {
205
205
  IndexDBMetaGateway,
206
206
  IndexDBTestStore
207
207
  };
208
- //# sourceMappingURL=chunk-EVSZA26U.js.map
208
+ //# sourceMappingURL=chunk-AZVWSRER.js.map
@@ -14,8 +14,10 @@ __export(runtime_exports, {
14
14
  INDEXDB_VERSION: () => INDEXDB_VERSION,
15
15
  SQLITE_VERSION: () => SQLITE_VERSION,
16
16
  SysContainer: () => SysContainer,
17
+ crypto: () => crypto_exports,
17
18
  dataDir: () => dataDir,
18
19
  ensureIndexName: () => ensureIndexName,
20
+ files: () => files_exports,
19
21
  getFileName: () => getFileName,
20
22
  getPath: () => getPath,
21
23
  join: () => join,
@@ -119,6 +121,103 @@ function ensureSQLOpts(url, opts, componentName, ctx) {
119
121
  };
120
122
  }
121
123
 
124
+ // src/runtime/crypto.ts
125
+ var crypto_exports = {};
126
+ __export(crypto_exports, {
127
+ toCryptoOpts: () => toCryptoOpts
128
+ });
129
+ function randomBytes(size) {
130
+ const bytes = new Uint8Array(size);
131
+ if (size > 0) {
132
+ crypto.getRandomValues(bytes);
133
+ }
134
+ return bytes;
135
+ }
136
+ function digestSHA256(data) {
137
+ return Promise.resolve(crypto.subtle.digest("SHA-256", data));
138
+ }
139
+ function toCryptoOpts(cryptoOpts = {}) {
140
+ const opts = {
141
+ importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),
142
+ encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),
143
+ decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),
144
+ randomBytes: cryptoOpts.randomBytes || randomBytes,
145
+ digestSHA256: cryptoOpts.digestSHA256 || digestSHA256
146
+ };
147
+ return opts;
148
+ }
149
+
150
+ // src/runtime/files.ts
151
+ var files_exports = {};
152
+ __export(files_exports, {
153
+ decodeFile: () => decodeFile,
154
+ encodeFile: () => encodeFile
155
+ });
156
+ import * as UnixFS from "@ipld/unixfs";
157
+ import * as raw from "multiformats/codecs/raw";
158
+ import { withMaxChunkSize } from "@ipld/unixfs/file/chunker/fixed";
159
+ import { withWidth } from "@ipld/unixfs/file/layout/balanced";
160
+ import { exporter } from "ipfs-unixfs-exporter";
161
+ var queuingStrategy = UnixFS.withCapacity();
162
+ var settings = UnixFS.configure({
163
+ fileChunkEncoder: raw,
164
+ smallFileEncoder: raw,
165
+ chunker: withMaxChunkSize(1024 * 1024),
166
+ fileLayout: withWidth(1024)
167
+ });
168
+ async function collect(collectable) {
169
+ const chunks = [];
170
+ await collectable.pipeTo(
171
+ new WritableStream({
172
+ write(chunk) {
173
+ chunks.push(chunk);
174
+ }
175
+ })
176
+ );
177
+ return chunks;
178
+ }
179
+ async function encodeFile(blob) {
180
+ const readable = createFileEncoderStream(blob);
181
+ const blocks = await collect(readable);
182
+ return { cid: blocks.at(-1).cid, blocks };
183
+ }
184
+ async function decodeFile(blocks, cid, meta) {
185
+ const entry = await exporter(cid.toString(), blocks, { length: meta.size });
186
+ const chunks = [];
187
+ for await (const chunk of entry.content()) {
188
+ chunks.push(chunk);
189
+ }
190
+ return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });
191
+ }
192
+ function createFileEncoderStream(blob) {
193
+ const { readable, writable } = new TransformStream({}, queuingStrategy);
194
+ const unixfsWriter = UnixFS.createWriter({ writable, settings });
195
+ const fileBuilder = new UnixFSFileBuilder("", blob);
196
+ void (async () => {
197
+ await fileBuilder.finalize(unixfsWriter);
198
+ await unixfsWriter.close();
199
+ })();
200
+ return readable;
201
+ }
202
+ var UnixFSFileBuilder = class {
203
+ #file;
204
+ constructor(name, file) {
205
+ this.name = name;
206
+ this.#file = file;
207
+ }
208
+ async finalize(writer) {
209
+ const unixfsFileWriter = UnixFS.createFileWriter(writer);
210
+ await this.#file.stream().pipeTo(
211
+ new WritableStream({
212
+ async write(chunk) {
213
+ await unixfsFileWriter.write(chunk);
214
+ }
215
+ })
216
+ );
217
+ return await unixfsFileWriter.close();
218
+ }
219
+ };
220
+
122
221
  // src/runtime/store-file-version.ts
123
222
  var FILESTORE_VERSION = "v0.19-file";
124
223
 
@@ -254,6 +353,9 @@ export {
254
353
  getFileName,
255
354
  ensureIndexName,
256
355
  ensureSQLOpts,
356
+ toCryptoOpts,
357
+ encodeFile,
358
+ decodeFile,
257
359
  FILESTORE_VERSION,
258
360
  INDEXDB_VERSION,
259
361
  SQLITE_VERSION,
@@ -265,4 +367,4 @@ export {
265
367
  exception2Result,
266
368
  exceptionWrapper
267
369
  };
268
- //# sourceMappingURL=chunk-UCMXU3DH.js.map
370
+ //# sourceMappingURL=chunk-NZNG6TQT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils.ts","../../src/runtime/index.ts","../../src/runtime/data-dir.ts","../../src/runtime/store-sql/index.ts","../../src/runtime/store-sql/types.ts","../../src/runtime/store-sql/ensurer.ts","../../src/runtime/crypto.ts","../../src/runtime/files.ts","../../src/runtime/store-file-version.ts","../../src/runtime/store-indexdb-version.ts","../../src/runtime/store-sql/v0.19-sqlite/version.ts","../../src/runtime/store-file-utils.ts"],"sourcesContent":["import { Logger, LoggerImpl, IsLogger, Result, ResolveOnce } from \"@adviser/cement\";\nimport { SysContainer } from \"./runtime\";\nimport { uuidv7 } from \"uuidv7\";\n\nexport type { Logger };\n\nconst globalLogger: Logger = new LoggerImpl();\n\nexport interface LoggerOpts {\n readonly logger?: Logger;\n}\n\nconst registerFP_DEBUG = new ResolveOnce();\n\nexport function ensureLogger(\n optsOrLogger: Partial<LoggerOpts> | Logger,\n componentName: string,\n ctx?: Record<string, unknown>,\n): Logger {\n // if (!opts?.logger) {\n // throw new Error(\"logger is required\");\n // }\n let logger = globalLogger;\n if (IsLogger(optsOrLogger)) {\n logger = optsOrLogger;\n } else if (optsOrLogger && IsLogger(optsOrLogger.logger)) {\n logger = optsOrLogger.logger;\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n if (ctx) {\n if (\"debug\" in ctx) {\n if (typeof ctx.debug === \"string\" && ctx.debug.length > 0) {\n debug.push(ctx.debug);\n } else {\n debug.push(componentName);\n }\n delete ctx.debug;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", uuidv7());\n delete ctx.this;\n }\n for (const [key, value] of Object.entries(ctx)) {\n switch (typeof value) {\n case \"string\":\n cLogger.Str(key, value);\n break;\n case \"number\":\n cLogger.Uint64(key, value);\n break;\n default:\n if (value instanceof Date) {\n cLogger.Str(key, value.toISOString());\n } else if (value instanceof URL) {\n cLogger.Str(key, value.toString());\n } else if (typeof value === \"function\") {\n cLogger.Ref(key, value);\n } else {\n cLogger.Any(key, value);\n }\n break;\n }\n }\n }\n registerFP_DEBUG\n .once(async () => {\n // console.log(\"registerFP_DEBUG\", SysContainer.env)\n SysContainer.env.onSet((key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n if (value) {\n logger.SetDebug(value);\n }\n }, \"FP_DEBUG\");\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n const out = cLogger.Logger();\n // out.Debug().Msg(\"logger ready\");\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport function getStore(url: URL, logger: Logger, joiner: Joiner): string {\n let result = url.searchParams.get(\"store\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`store not found`).AsError();\n if (url.searchParams.has(\"index\")) {\n result = joiner(url.searchParams.get(\"index\") || \"idx\", result);\n }\n return result;\n}\n\nexport function getKey(url: URL, logger: Logger): string {\n const result = url.searchParams.get(\"key\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(url: URL, logger: Logger): string {\n let result = url.searchParams.get(\"name\");\n if (!result) {\n result = SysContainer.dirname(url.pathname);\n if (result.length === 0) {\n throw logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\nexport function exception2Result<T = void>(fn: () => Promise<T>): Promise<Result<T>> {\n return fn()\n .then((value) => Result.Ok(value))\n .catch((e) => Result.Err(e));\n}\n\nexport async function exceptionWrapper<T, E extends Error>(fn: () => Promise<Result<T, E>>): Promise<Result<T, E>> {\n return fn().catch((e) => Result.Err(e));\n}\n","export * from \"./sys-container.js\";\nexport * from \"./data-dir.js\";\nexport * from \"./store-file-utils.js\";\n\nexport * as sql from \"./store-sql/index.js\";\nexport * as crypto from \"./crypto.js\";\nexport * as files from \"./files.js\";\n\nexport { FILESTORE_VERSION } from \"./store-file-version.js\";\nexport { INDEXDB_VERSION } from \"./store-indexdb-version.js\";\nexport { SQLITE_VERSION } from \"./store-sql/v0.19-sqlite/version.js\";\n","import { SysContainer } from \"./sys-container.js\";\nimport { isDeno, isNode } from \"std-env\";\n\nexport function dataDir(name?: string, base?: string | URL): string {\n if (!base) {\n if (isNode || isDeno) {\n base = SysContainer.env.get(\"FP_STORAGE_URL\") || `file://${SysContainer.join(SysContainer.homedir(), \".fireproof\")}`;\n } else {\n base = `indexdb://fp`;\n }\n }\n let url: URL;\n if (typeof base === \"string\") {\n try {\n url = new URL(base.toString());\n } catch (e) {\n try {\n base = `file://${base}`;\n url = new URL(base);\n } catch (e) {\n throw new Error(`invalid base url: ${base}`);\n }\n }\n } else {\n url = base;\n }\n url.searchParams.set(\"name\", name || \"\");\n return url.toString();\n}\n","// export * from \"./sqlite-adapter-better-sqlite3.js\";\nexport * from \"./types.js\";\nexport * from \"./ensurer.js\";\n","import { Logger, Result } from \"@adviser/cement\";\nimport type { RunResult } from \"better-sqlite3\";\n\nexport interface DBConnection {\n connect(): Promise<void>;\n readonly opts: SQLOpts;\n}\n\nexport interface SQLStore<IType, KType, OType = IType[]> {\n readonly dbConn: DBConnection;\n start(url: URL): Promise<void>;\n insert(url: URL, ose: IType): Promise<RunResult>;\n select(url: URL, car: KType): Promise<OType>;\n delete(url: URL, car: KType): Promise<RunResult>;\n close(url: URL): Promise<Result<void>>;\n destroy(url: URL): Promise<Result<void>>;\n}\n\nexport interface SQLTableNames {\n readonly data: string;\n readonly meta: string;\n readonly wal: string;\n}\n\nexport const DefaultSQLTableNames: SQLTableNames = {\n data: \"Datas\",\n meta: \"Metas\",\n wal: \"Wals\",\n};\n\nexport interface SQLOpts {\n readonly url: URL;\n readonly sqlFlavor: \"sqlite\" | \"mysql\" | \"postgres\";\n readonly tableNames: SQLTableNames;\n readonly logger: Logger;\n readonly textEncoder: TextEncoder;\n readonly textDecoder: TextDecoder;\n}\n\nexport interface WalKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface WalRecord extends WalKey {\n readonly state: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type WalSQLStore = SQLStore<WalRecord, WalKey>;\n\nexport interface MetaType {\n readonly name: string;\n readonly branch: string;\n readonly meta: Uint8Array;\n}\n\nexport interface MetaRecordKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface MetaRecord extends MetaRecordKey {\n readonly meta: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type MetaSQLStore = SQLStore<MetaRecord, MetaRecordKey>;\n\nexport interface DataRecord {\n readonly name: string;\n readonly car: string;\n readonly data: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type DataSQLStore = SQLStore<DataRecord, string>;\n","import { ensureLogger, type Logger } from \"../../utils\";\nimport { SQLOpts, SQLTableNames, DefaultSQLTableNames } from \"./types\";\n\nfunction sqlTableName(...names: string[]): string {\n return names\n .map((name) => name.replace(/^[^a-zA-Z0-9]+/, \"\").replace(/[^a-zA-Z0-9]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\"_\");\n}\n\nfunction ensureTableNames(url: URL, opts?: Partial<SQLOpts>): SQLTableNames {\n let isIndex = \"\";\n if (url.searchParams.has(\"index\")) {\n isIndex = url.searchParams.get(\"index\") || \".idx\";\n }\n const ret = opts?.tableNames || DefaultSQLTableNames;\n // console.log(\"isIndex->\", opts?.url, isIndex, sqlTableName(isIndex, ret.data));\n if (isIndex.length) {\n return {\n data: sqlTableName(isIndex, ret.data),\n meta: sqlTableName(isIndex, ret.meta),\n wal: sqlTableName(isIndex, ret.wal),\n };\n }\n return {\n data: sqlTableName(ret.data),\n meta: sqlTableName(ret.meta),\n wal: sqlTableName(ret.wal),\n };\n}\n\nconst textEncoder = new TextEncoder();\nfunction ensureTextEncoder(opts?: Partial<SQLOpts>): TextEncoder {\n return opts?.textEncoder || textEncoder;\n}\n\nconst textDecoder = new TextDecoder();\nfunction ensureTextDecoder(opts?: Partial<SQLOpts>): TextDecoder {\n return opts?.textDecoder || textDecoder;\n}\n\nfunction url2sqlFlavor(url: URL, logger: Logger): \"sqlite\" | \"mysql\" | \"postgres\" {\n const flavor = url.protocol.replace(/:.*$/, \"\");\n switch (flavor) {\n case \"sqlite\":\n case \"mysql\":\n case \"postgres\":\n return flavor;\n default:\n throw logger.Error().Str(\"flavor\", flavor).Msg(\"unsupported protocol\").AsError();\n }\n}\n\nexport function ensureSQLOpts(url: URL, opts: Partial<SQLOpts>, componentName: string, ctx?: Record<string, unknown>): SQLOpts {\n const logger = ensureLogger(opts, componentName, ctx);\n return {\n url,\n sqlFlavor: url2sqlFlavor(url, logger),\n tableNames: ensureTableNames(url, opts),\n logger,\n textEncoder: ensureTextEncoder(opts),\n textDecoder: ensureTextDecoder(opts),\n };\n}\n","import { CryptoOpts } from \"../blockstore/index.js\";\n\nfunction randomBytes(size: number) {\n const bytes = new Uint8Array(size);\n if (size > 0) {\n crypto.getRandomValues(bytes);\n }\n return bytes;\n}\n\nfunction digestSHA256(data: Uint8Array): Promise<ArrayBuffer> {\n return Promise.resolve(crypto.subtle.digest(\"SHA-256\", data));\n}\n\nexport function toCryptoOpts(cryptoOpts: Partial<CryptoOpts> = {}): CryptoOpts {\n const opts = {\n importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),\n encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),\n decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),\n randomBytes: cryptoOpts.randomBytes || randomBytes,\n digestSHA256: cryptoOpts.digestSHA256 || digestSHA256,\n };\n // console.log(\"cryptoOpts\", cryptoOpts, opts)\n return opts;\n}\n","import * as UnixFS from \"@ipld/unixfs\";\nimport * as raw from \"multiformats/codecs/raw\";\nimport { withMaxChunkSize } from \"@ipld/unixfs/file/chunker/fixed\";\nimport { withWidth } from \"@ipld/unixfs/file/layout/balanced\";\n\nimport type { View } from \"@ipld/unixfs\";\nimport { DocFileMeta } from \"../types.js\";\n\nimport { exporter, ReadableStorage } from \"ipfs-unixfs-exporter\";\nimport { BlobLike, AnyLink, AnyBlock } from \"../blockstore/index.js\";\n\nconst queuingStrategy = UnixFS.withCapacity();\n\nconst settings = UnixFS.configure({\n fileChunkEncoder: raw,\n smallFileEncoder: raw,\n chunker: withMaxChunkSize(1024 * 1024),\n fileLayout: withWidth(1024),\n});\n\nasync function collect<T>(collectable: ReadableStream<T>): Promise<T[]> {\n const chunks: T[] = [];\n await collectable.pipeTo(\n new WritableStream({\n write(chunk) {\n chunks.push(chunk);\n },\n }),\n );\n return chunks;\n}\n\nexport async function encodeFile(blob: BlobLike): Promise<{ cid: AnyLink; blocks: AnyBlock[] }> {\n const readable = createFileEncoderStream(blob);\n const blocks = await collect(readable);\n return { cid: blocks.at(-1).cid, blocks };\n}\n\nexport async function decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<File> {\n const entry = await exporter(cid.toString(), blocks as ReadableStorage, { length: meta.size });\n const chunks = [];\n for await (const chunk of entry.content()) {\n chunks.push(chunk);\n }\n return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });\n}\n\nfunction createFileEncoderStream(blob: BlobLike) {\n const { readable, writable } = new TransformStream({}, queuingStrategy);\n const unixfsWriter = UnixFS.createWriter({ writable, settings });\n const fileBuilder = new UnixFSFileBuilder(\"\", blob);\n void (async () => {\n await fileBuilder.finalize(unixfsWriter);\n await unixfsWriter.close();\n })();\n return readable;\n}\n\nclass UnixFSFileBuilder {\n #file;\n readonly name: string;\n constructor(name: string, file: BlobLike) {\n this.name = name;\n this.#file = file;\n }\n\n async finalize(writer: View) {\n const unixfsFileWriter = UnixFS.createFileWriter(writer);\n await this.#file.stream().pipeTo(\n new WritableStream({\n async write(chunk) {\n await unixfsFileWriter.write(chunk as Uint8Array);\n },\n }),\n );\n return await unixfsFileWriter.close();\n }\n}\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","export const INDEXDB_VERSION = \"v0.19-indexdb\";\n","export const SQLITE_VERSION = \"v0.19-sqlite\";\n","import { Logger, getStore } from \"../utils.js\";\nimport { SysContainer } from \"./sys-container.js\";\n\nexport async function getPath(url: URL, logger: Logger): Promise<string> {\n const basePath = url\n .toString()\n .replace(new RegExp(`^${url.protocol}//`), \"\")\n .replace(/\\?.*$/, \"\");\n const name = url.searchParams.get(\"name\");\n if (name) {\n const version = url.searchParams.get(\"version\");\n if (!version) throw logger.Error().Str(\"url\", url.toString()).Msg(`version not found`).AsError();\n return SysContainer.join(basePath, version, name);\n }\n return SysContainer.join(basePath);\n}\n\nexport function getFileName(url: URL, key: string, logger: Logger): string {\n switch (getStore(url, logger, (...a: string[]) => a.join(\"/\"))) {\n case \"data\":\n return key + \".car\";\n case \"meta\":\n return key + \".json\";\n default:\n throw logger.Error().Str(\"url\", url.toString()).Msg(`unsupported store type`).AsError();\n }\n}\n\nexport function ensureIndexName(url: URL, name: string): string {\n if (url.searchParams.has(\"index\")) {\n name = (url.searchParams.get(\"index\")?.replace(/[^a-zA-Z0-9]/g, \"\") || \"idx\") + \"-\" + name;\n }\n return name;\n}\n"],"mappings":";;;;;;;AAAA,SAAiB,YAAY,UAAU,QAAQ,mBAAmB;;;ACAlE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,SAAS,QAAQ,cAAc;AAExB,SAAS,QAAQ,MAAe,MAA6B;AAClE,MAAI,CAAC,MAAM;AACT,QAAI,UAAU,QAAQ;AACpB,aAAO,aAAa,IAAI,IAAI,gBAAgB,KAAK,UAAU,aAAa,KAAK,aAAa,QAAQ,GAAG,YAAY,CAAC;AAAA,IACpH,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI;AACF,YAAM,IAAI,IAAI,KAAK,SAAS,CAAC;AAAA,IAC/B,SAAS,GAAG;AACV,UAAI;AACF,eAAO,UAAU,IAAI;AACrB,cAAM,IAAI,IAAI,IAAI;AAAA,MACpB,SAASA,IAAG;AACV,cAAM,IAAI,MAAM,qBAAqB,IAAI,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM;AAAA,EACR;AACA,MAAI,aAAa,IAAI,QAAQ,QAAQ,EAAE;AACvC,SAAO,IAAI,SAAS;AACtB;;;AC5BA;AAAA;AAAA;AAAA;AAAA;;;ACwBO,IAAM,uBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AACP;;;ACzBA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,MACJ,IAAI,CAAC,SAAS,KAAK,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,kBAAkB,GAAG,CAAC,EAC/E,OAAO,CAAC,MAAM,EAAE,MAAM,EACtB,KAAK,GAAG;AACb;AAEA,SAAS,iBAAiB,KAAU,MAAwC;AAC1E,MAAI,UAAU;AACd,MAAI,IAAI,aAAa,IAAI,OAAO,GAAG;AACjC,cAAU,IAAI,aAAa,IAAI,OAAO,KAAK;AAAA,EAC7C;AACA,QAAM,MAAM,MAAM,cAAc;AAEhC,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,MACL,MAAM,aAAa,SAAS,IAAI,IAAI;AAAA,MACpC,MAAM,aAAa,SAAS,IAAI,IAAI;AAAA,MACpC,KAAK,aAAa,SAAS,IAAI,GAAG;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,aAAa,IAAI,IAAI;AAAA,IAC3B,MAAM,aAAa,IAAI,IAAI;AAAA,IAC3B,KAAK,aAAa,IAAI,GAAG;AAAA,EAC3B;AACF;AAEA,IAAM,cAAc,IAAI,YAAY;AACpC,SAAS,kBAAkB,MAAsC;AAC/D,SAAO,MAAM,eAAe;AAC9B;AAEA,IAAM,cAAc,IAAI,YAAY;AACpC,SAAS,kBAAkB,MAAsC;AAC/D,SAAO,MAAM,eAAe;AAC9B;AAEA,SAAS,cAAc,KAAU,QAAiD;AAChF,QAAM,SAAS,IAAI,SAAS,QAAQ,QAAQ,EAAE;AAC9C,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,YAAM,OAAO,MAAM,EAAE,IAAI,UAAU,MAAM,EAAE,IAAI,sBAAsB,EAAE,QAAQ;AAAA,EACnF;AACF;AAEO,SAAS,cAAc,KAAU,MAAwB,eAAuB,KAAwC;AAC7H,QAAM,SAAS,aAAa,MAAM,eAAe,GAAG;AACpD,SAAO;AAAA,IACL;AAAA,IACA,WAAW,cAAc,KAAK,MAAM;AAAA,IACpC,YAAY,iBAAiB,KAAK,IAAI;AAAA,IACtC;AAAA,IACA,aAAa,kBAAkB,IAAI;AAAA,IACnC,aAAa,kBAAkB,IAAI;AAAA,EACrC;AACF;;;AC/DA;AAAA;AAAA;AAAA;AAEA,SAAS,YAAY,MAAc;AACjC,QAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,MAAI,OAAO,GAAG;AACZ,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAwC;AAC5D,SAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,WAAW,IAAI,CAAC;AAC9D;AAEO,SAAS,aAAa,aAAkC,CAAC,GAAe;AAC7E,QAAM,OAAO;AAAA,IACX,WAAW,WAAW,aAAa,OAAO,OAAO,UAAU,KAAK,OAAO,MAAM;AAAA,IAC7E,SAAS,WAAW,WAAW,OAAO,OAAO,QAAQ,KAAK,OAAO,MAAM;AAAA,IACvE,SAAS,WAAW,WAAW,OAAO,OAAO,QAAQ,KAAK,OAAO,MAAM;AAAA,IACvE,aAAa,WAAW,eAAe;AAAA,IACvC,cAAc,WAAW,gBAAgB;AAAA,EAC3C;AAEA,SAAO;AACT;;;ACxBA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAY,YAAY;AACxB,YAAY,SAAS;AACrB,SAAS,wBAAwB;AACjC,SAAS,iBAAiB;AAK1B,SAAS,gBAAiC;AAG1C,IAAM,kBAAyB,oBAAa;AAE5C,IAAM,WAAkB,iBAAU;AAAA,EAChC,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,SAAS,iBAAiB,OAAO,IAAI;AAAA,EACrC,YAAY,UAAU,IAAI;AAC5B,CAAC;AAED,eAAe,QAAW,aAA8C;AACtE,QAAM,SAAc,CAAC;AACrB,QAAM,YAAY;AAAA,IAChB,IAAI,eAAe;AAAA,MACjB,MAAM,OAAO;AACX,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,eAAsB,WAAW,MAA+D;AAC9F,QAAM,WAAW,wBAAwB,IAAI;AAC7C,QAAM,SAAS,MAAM,QAAQ,QAAQ;AACrC,SAAO,EAAE,KAAK,OAAO,GAAG,EAAE,EAAE,KAAK,OAAO;AAC1C;AAEA,eAAsB,WAAW,QAAiB,KAAc,MAAkC;AAChG,QAAM,QAAQ,MAAM,SAAS,IAAI,SAAS,GAAG,QAA2B,EAAE,QAAQ,KAAK,KAAK,CAAC;AAC7F,QAAM,SAAS,CAAC;AAChB,mBAAiB,SAAS,MAAM,QAAQ,GAAG;AACzC,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAO,IAAI,KAAK,QAAQ,MAAM,MAAM,EAAE,MAAM,KAAK,MAAM,cAAc,EAAE,CAAC;AAC1E;AAEA,SAAS,wBAAwB,MAAgB;AAC/C,QAAM,EAAE,UAAU,SAAS,IAAI,IAAI,gBAAgB,CAAC,GAAG,eAAe;AACtE,QAAM,eAAsB,oBAAa,EAAE,UAAU,SAAS,CAAC;AAC/D,QAAM,cAAc,IAAI,kBAAkB,IAAI,IAAI;AAClD,QAAM,YAAY;AAChB,UAAM,YAAY,SAAS,YAAY;AACvC,UAAM,aAAa,MAAM;AAAA,EAC3B,GAAG;AACH,SAAO;AACT;AAEA,IAAM,oBAAN,MAAwB;AAAA,EACtB;AAAA,EAEA,YAAY,MAAc,MAAgB;AACxC,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,MAAM,SAAS,QAAc;AAC3B,UAAM,mBAA0B,wBAAiB,MAAM;AACvD,UAAM,KAAK,MAAM,OAAO,EAAE;AAAA,MACxB,IAAI,eAAe;AAAA,QACjB,MAAM,MAAM,OAAO;AACjB,gBAAM,iBAAiB,MAAM,KAAmB;AAAA,QAClD;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,MAAM,iBAAiB,MAAM;AAAA,EACtC;AACF;;;AC7EO,IAAM,oBAAoB;;;ACA1B,IAAM,kBAAkB;;;ACAxB,IAAM,iBAAiB;;;AVE9B,SAAS,cAAc;AAIvB,IAAM,eAAuB,IAAI,WAAW;AAM5C,IAAM,mBAAmB,IAAI,YAAY;AAElC,SAAS,aACd,cACA,eACA,KACQ;AAIR,MAAI,SAAS;AACb,MAAI,SAAS,YAAY,GAAG;AAC1B,aAAS;AAAA,EACX,WAAW,gBAAgB,SAAS,aAAa,MAAM,GAAG;AACxD,aAAS,aAAa;AAAA,EACxB;AACA,QAAM,UAAU,OAAO,KAAK,EAAE,OAAO,aAAa;AAClD,QAAM,QAAkB,CAAC;AACzB,MAAI,KAAK;AACP,QAAI,WAAW,KAAK;AAClB,UAAI,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,SAAS,GAAG;AACzD,cAAM,KAAK,IAAI,KAAK;AAAA,MACtB,OAAO;AACL,cAAM,KAAK,aAAa;AAAA,MAC1B;AACA,aAAO,IAAI;AAAA,IACb;AACA,QAAI,UAAU,KAAK;AACjB,cAAQ,IAAI,QAAQ,OAAO,CAAC;AAC5B,aAAO,IAAI;AAAA,IACb;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,cAAQ,OAAO,OAAO;AAAA,QACpB,KAAK;AACH,kBAAQ,IAAI,KAAK,KAAK;AACtB;AAAA,QACF,KAAK;AACH,kBAAQ,OAAO,KAAK,KAAK;AACzB;AAAA,QACF;AACE,cAAI,iBAAiB,MAAM;AACzB,oBAAQ,IAAI,KAAK,MAAM,YAAY,CAAC;AAAA,UACtC,WAAW,iBAAiB,KAAK;AAC/B,oBAAQ,IAAI,KAAK,MAAM,SAAS,CAAC;AAAA,UACnC,WAAW,OAAO,UAAU,YAAY;AACtC,oBAAQ,IAAI,KAAK,KAAK;AAAA,UACxB,OAAO;AACL,oBAAQ,IAAI,KAAK,KAAK;AAAA,UACxB;AACA;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,mBACG,KAAK,YAAY;AAEhB,iBAAa,IAAI,MAAM,CAAC,KAAK,UAAU;AAErC,UAAI,OAAO;AACT,eAAO,SAAS,KAAK;AAAA,MACvB;AAAA,IACF,GAAG,UAAU;AAAA,EACf,CAAC,EACA,QAAQ,MAAM;AAAA,EAEf,CAAC;AAEH,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,QAAM,MAAM,QAAQ,OAAO;AAE3B,SAAO;AACT;AAIO,SAAS,SAAS,KAAU,QAAgB,QAAwB;AACzE,MAAI,SAAS,IAAI,aAAa,IAAI,OAAO;AACzC,MAAI,CAAC,OAAQ,OAAM,OAAO,MAAM,EAAE,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,iBAAiB,EAAE,QAAQ;AAC5F,MAAI,IAAI,aAAa,IAAI,OAAO,GAAG;AACjC,aAAS,OAAO,IAAI,aAAa,IAAI,OAAO,KAAK,OAAO,MAAM;AAAA,EAChE;AACA,SAAO;AACT;AAEO,SAAS,OAAO,KAAU,QAAwB;AACvD,QAAM,SAAS,IAAI,aAAa,IAAI,KAAK;AACzC,MAAI,CAAC,OAAQ,OAAM,OAAO,MAAM,EAAE,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,eAAe,EAAE,QAAQ;AAC1F,SAAO;AACT;AAEO,SAAS,QAAQ,KAAU,QAAwB;AACxD,MAAI,SAAS,IAAI,aAAa,IAAI,MAAM;AACxC,MAAI,CAAC,QAAQ;AACX,aAAS,aAAa,QAAQ,IAAI,QAAQ;AAC1C,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,OAAO,MAAM,EAAE,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,gBAAgB,EAAE,QAAQ;AAAA,IAChF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBAA2B,IAA0C;AACnF,SAAO,GAAG,EACP,KAAK,CAAC,UAAU,OAAO,GAAG,KAAK,CAAC,EAChC,MAAM,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAC/B;AAEA,eAAsB,iBAAqC,IAAwD;AACjH,SAAO,GAAG,EAAE,MAAM,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AACxC;;;AWxHA,eAAsB,QAAQ,KAAU,QAAiC;AACvE,QAAM,WAAW,IACd,SAAS,EACT,QAAQ,IAAI,OAAO,IAAI,IAAI,QAAQ,IAAI,GAAG,EAAE,EAC5C,QAAQ,SAAS,EAAE;AACtB,QAAM,OAAO,IAAI,aAAa,IAAI,MAAM;AACxC,MAAI,MAAM;AACR,UAAM,UAAU,IAAI,aAAa,IAAI,SAAS;AAC9C,QAAI,CAAC,QAAS,OAAM,OAAO,MAAM,EAAE,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,mBAAmB,EAAE,QAAQ;AAC/F,WAAO,aAAa,KAAK,UAAU,SAAS,IAAI;AAAA,EAClD;AACA,SAAO,aAAa,KAAK,QAAQ;AACnC;AAEO,SAAS,YAAY,KAAU,KAAa,QAAwB;AACzE,UAAQ,SAAS,KAAK,QAAQ,IAAI,MAAgB,EAAE,KAAK,GAAG,CAAC,GAAG;AAAA,IAC9D,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf;AACE,YAAM,OAAO,MAAM,EAAE,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,wBAAwB,EAAE,QAAQ;AAAA,EAC1F;AACF;AAEO,SAAS,gBAAgB,KAAU,MAAsB;AAC9D,MAAI,IAAI,aAAa,IAAI,OAAO,GAAG;AACjC,YAAQ,IAAI,aAAa,IAAI,OAAO,GAAG,QAAQ,iBAAiB,EAAE,KAAK,SAAS,MAAM;AAAA,EACxF;AACA,SAAO;AACT;","names":["e"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SQLITE_VERSION,
3
3
  ensureLogger
4
- } from "./chunk-UCMXU3DH.js";
4
+ } from "./chunk-NZNG6TQT.js";
5
5
 
6
6
  // src/runtime/store-sql/v0.19-sqlite/sqlite-ensure-version.ts
7
7
  import { ResolveOnce } from "@adviser/cement";
@@ -36,4 +36,4 @@ async function ensureSQLiteVersion(url, dbConn) {
36
36
  export {
37
37
  ensureSQLiteVersion
38
38
  };
39
- //# sourceMappingURL=chunk-5X6APJDY.js.map
39
+ //# sourceMappingURL=chunk-ZHO4NMWL.js.map
package/index.cjs CHANGED
@@ -383,6 +383,114 @@ var init_store_sql = __esm({
383
383
  }
384
384
  });
385
385
 
386
+ // src/runtime/crypto.ts
387
+ var crypto_exports = {};
388
+ __export(crypto_exports, {
389
+ toCryptoOpts: () => toCryptoOpts
390
+ });
391
+ function randomBytes(size) {
392
+ const bytes = new Uint8Array(size);
393
+ if (size > 0) {
394
+ crypto.getRandomValues(bytes);
395
+ }
396
+ return bytes;
397
+ }
398
+ function digestSHA256(data) {
399
+ return Promise.resolve(crypto.subtle.digest("SHA-256", data));
400
+ }
401
+ function toCryptoOpts(cryptoOpts = {}) {
402
+ const opts = {
403
+ importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),
404
+ encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),
405
+ decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),
406
+ randomBytes: cryptoOpts.randomBytes || randomBytes,
407
+ digestSHA256: cryptoOpts.digestSHA256 || digestSHA256
408
+ };
409
+ return opts;
410
+ }
411
+ var init_crypto = __esm({
412
+ "src/runtime/crypto.ts"() {
413
+ "use strict";
414
+ }
415
+ });
416
+
417
+ // src/runtime/files.ts
418
+ var files_exports = {};
419
+ __export(files_exports, {
420
+ decodeFile: () => decodeFile,
421
+ encodeFile: () => encodeFile
422
+ });
423
+ async function collect(collectable) {
424
+ const chunks = [];
425
+ await collectable.pipeTo(
426
+ new WritableStream({
427
+ write(chunk) {
428
+ chunks.push(chunk);
429
+ }
430
+ })
431
+ );
432
+ return chunks;
433
+ }
434
+ async function encodeFile(blob) {
435
+ const readable = createFileEncoderStream(blob);
436
+ const blocks = await collect(readable);
437
+ return { cid: blocks.at(-1).cid, blocks };
438
+ }
439
+ async function decodeFile(blocks, cid, meta) {
440
+ const entry = await (0, import_ipfs_unixfs_exporter.exporter)(cid.toString(), blocks, { length: meta.size });
441
+ const chunks = [];
442
+ for await (const chunk of entry.content()) {
443
+ chunks.push(chunk);
444
+ }
445
+ return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });
446
+ }
447
+ function createFileEncoderStream(blob) {
448
+ const { readable, writable } = new TransformStream({}, queuingStrategy);
449
+ const unixfsWriter = UnixFS.createWriter({ writable, settings });
450
+ const fileBuilder = new UnixFSFileBuilder("", blob);
451
+ void (async () => {
452
+ await fileBuilder.finalize(unixfsWriter);
453
+ await unixfsWriter.close();
454
+ })();
455
+ return readable;
456
+ }
457
+ var UnixFS, raw, import_fixed, import_balanced, import_ipfs_unixfs_exporter, queuingStrategy, settings, UnixFSFileBuilder;
458
+ var init_files = __esm({
459
+ "src/runtime/files.ts"() {
460
+ "use strict";
461
+ UnixFS = __toESM(require("@ipld/unixfs"), 1);
462
+ raw = __toESM(require("multiformats/codecs/raw"), 1);
463
+ import_fixed = require("@ipld/unixfs/file/chunker/fixed");
464
+ import_balanced = require("@ipld/unixfs/file/layout/balanced");
465
+ import_ipfs_unixfs_exporter = require("ipfs-unixfs-exporter");
466
+ queuingStrategy = UnixFS.withCapacity();
467
+ settings = UnixFS.configure({
468
+ fileChunkEncoder: raw,
469
+ smallFileEncoder: raw,
470
+ chunker: (0, import_fixed.withMaxChunkSize)(1024 * 1024),
471
+ fileLayout: (0, import_balanced.withWidth)(1024)
472
+ });
473
+ UnixFSFileBuilder = class {
474
+ #file;
475
+ constructor(name, file) {
476
+ this.name = name;
477
+ this.#file = file;
478
+ }
479
+ async finalize(writer) {
480
+ const unixfsFileWriter = UnixFS.createFileWriter(writer);
481
+ await this.#file.stream().pipeTo(
482
+ new WritableStream({
483
+ async write(chunk) {
484
+ await unixfsFileWriter.write(chunk);
485
+ }
486
+ })
487
+ );
488
+ return await unixfsFileWriter.close();
489
+ }
490
+ };
491
+ }
492
+ });
493
+
386
494
  // src/runtime/store-file-version.ts
387
495
  var FILESTORE_VERSION;
388
496
  var init_store_file_version = __esm({
@@ -417,8 +525,10 @@ __export(runtime_exports, {
417
525
  INDEXDB_VERSION: () => INDEXDB_VERSION,
418
526
  SQLITE_VERSION: () => SQLITE_VERSION,
419
527
  SysContainer: () => SysContainer,
528
+ crypto: () => crypto_exports,
420
529
  dataDir: () => dataDir,
421
530
  ensureIndexName: () => ensureIndexName,
531
+ files: () => files_exports,
422
532
  getFileName: () => getFileName,
423
533
  getPath: () => getPath,
424
534
  join: () => join,
@@ -431,6 +541,8 @@ var init_runtime = __esm({
431
541
  init_data_dir();
432
542
  init_store_file_utils();
433
543
  init_store_sql();
544
+ init_crypto();
545
+ init_files();
434
546
  init_store_file_version();
435
547
  init_store_indexdb_version();
436
548
  init_version();
@@ -2005,72 +2117,7 @@ var ConnectREST = class extends ConnectionBase {
2005
2117
  // src/blockstore/store-factory.ts
2006
2118
  var import_cement14 = require("@adviser/cement");
2007
2119
  init_data_dir();
2008
-
2009
- // src/runtime/files.ts
2010
- var UnixFS = __toESM(require("@ipld/unixfs"), 1);
2011
- var raw = __toESM(require("multiformats/codecs/raw"), 1);
2012
- var import_fixed = require("@ipld/unixfs/file/chunker/fixed");
2013
- var import_balanced = require("@ipld/unixfs/file/layout/balanced");
2014
- var import_ipfs_unixfs_exporter = require("ipfs-unixfs-exporter");
2015
- var queuingStrategy = UnixFS.withCapacity();
2016
- var settings = UnixFS.configure({
2017
- fileChunkEncoder: raw,
2018
- smallFileEncoder: raw,
2019
- chunker: (0, import_fixed.withMaxChunkSize)(1024 * 1024),
2020
- fileLayout: (0, import_balanced.withWidth)(1024)
2021
- });
2022
- async function collect(collectable) {
2023
- const chunks = [];
2024
- await collectable.pipeTo(
2025
- new WritableStream({
2026
- write(chunk) {
2027
- chunks.push(chunk);
2028
- }
2029
- })
2030
- );
2031
- return chunks;
2032
- }
2033
- async function encodeFile(blob) {
2034
- const readable = createFileEncoderStream(blob);
2035
- const blocks = await collect(readable);
2036
- return { cid: blocks.at(-1).cid, blocks };
2037
- }
2038
- async function decodeFile(blocks, cid, meta) {
2039
- const entry = await (0, import_ipfs_unixfs_exporter.exporter)(cid.toString(), blocks, { length: meta.size });
2040
- const chunks = [];
2041
- for await (const chunk of entry.content()) {
2042
- chunks.push(chunk);
2043
- }
2044
- return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });
2045
- }
2046
- function createFileEncoderStream(blob) {
2047
- const { readable, writable } = new TransformStream({}, queuingStrategy);
2048
- const unixfsWriter = UnixFS.createWriter({ writable, settings });
2049
- const fileBuilder = new UnixFSFileBuilder("", blob);
2050
- void (async () => {
2051
- await fileBuilder.finalize(unixfsWriter);
2052
- await unixfsWriter.close();
2053
- })();
2054
- return readable;
2055
- }
2056
- var UnixFSFileBuilder = class {
2057
- #file;
2058
- constructor(name, file) {
2059
- this.name = name;
2060
- this.#file = file;
2061
- }
2062
- async finalize(writer) {
2063
- const unixfsFileWriter = UnixFS.createFileWriter(writer);
2064
- await this.#file.stream().pipeTo(
2065
- new WritableStream({
2066
- async write(chunk) {
2067
- await unixfsFileWriter.write(chunk);
2068
- }
2069
- })
2070
- );
2071
- return await unixfsFileWriter.close();
2072
- }
2073
- };
2120
+ init_files();
2074
2121
 
2075
2122
  // src/blockstore/store.ts
2076
2123
  var import_p_limit2 = __toESM(require("p-limit"), 1);
@@ -2393,30 +2440,7 @@ async function decodeCarBlocks(logger, crypto2, root3, get2, keyMaterial) {
2393
2440
  // src/blockstore/transaction.ts
2394
2441
  var import_block5 = require("@web3-storage/pail/block");
2395
2442
  init_types();
2396
-
2397
- // src/runtime/crypto.ts
2398
- function randomBytes(size) {
2399
- const bytes = new Uint8Array(size);
2400
- if (size > 0) {
2401
- crypto.getRandomValues(bytes);
2402
- }
2403
- return bytes;
2404
- }
2405
- function digestSHA256(data) {
2406
- return Promise.resolve(crypto.subtle.digest("SHA-256", data));
2407
- }
2408
- function toCryptoOpts(cryptoOpts = {}) {
2409
- const opts = {
2410
- importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),
2411
- encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),
2412
- decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),
2413
- randomBytes: cryptoOpts.randomBytes || randomBytes,
2414
- digestSHA256: cryptoOpts.digestSHA256 || digestSHA256
2415
- };
2416
- return opts;
2417
- }
2418
-
2419
- // src/blockstore/transaction.ts
2443
+ init_crypto();
2420
2444
  init_utils();
2421
2445
  var CarTransaction = class extends import_block5.MemoryBlockstore {
2422
2446
  constructor(parent, opts = { add: true }) {
@@ -3429,6 +3453,11 @@ function toURL(pathOrUrl, isIndex) {
3429
3453
  }
3430
3454
  }
3431
3455
  var storeFactory = /* @__PURE__ */ new Map();
3456
+ function ensureName(name, url) {
3457
+ if (!url.searchParams.has("name")) {
3458
+ url.searchParams.set("name", name);
3459
+ }
3460
+ }
3432
3461
  function buildURL(optURL, loader) {
3433
3462
  const storeOpts = loader.ebOpts.store;
3434
3463
  const obuItem = Array.from(storeFactory.values()).find((items) => items.overrideBaseURL);
@@ -3469,6 +3498,7 @@ function loadDataGateway(url, logger) {
3469
3498
  var onceDataStoreFactory = new import_cement14.KeyedResolvOnce();
3470
3499
  async function dataStoreFactory(loader) {
3471
3500
  const url = buildURL(loader.ebOpts.store.stores?.data, loader);
3501
+ ensureName(loader.name, url);
3472
3502
  const logger = ensureLogger(loader.logger, "dataStoreFactory", { url: url.toString() });
3473
3503
  url.searchParams.set("store", "data");
3474
3504
  return onceDataStoreFactory.get(url.toString()).once(async () => {
@@ -3488,15 +3518,14 @@ function loadMetaGateway(url, logger) {
3488
3518
  var onceMetaStoreFactory = new import_cement14.KeyedResolvOnce();
3489
3519
  async function metaStoreFactory(loader) {
3490
3520
  const url = buildURL(loader.ebOpts.store.stores?.meta, loader);
3521
+ ensureName(loader.name, url);
3491
3522
  const logger = ensureLogger(loader.logger, "metaStoreFactory", { url: () => url.toString() });
3492
3523
  url.searchParams.set("store", "meta");
3493
3524
  return onceMetaStoreFactory.get(url.toString()).once(async () => {
3494
3525
  logger.Debug().Str("protocol", url.protocol).Msg("pre-protocol switch");
3495
3526
  const gateway = await loadMetaGateway(url, logger);
3496
3527
  const store = new MetaStore(loader.name, url, loader.logger, gateway);
3497
- logger.Debug().Msg("pre-start");
3498
3528
  await store.start();
3499
- logger.Debug().Msg("post-start");
3500
3529
  return store;
3501
3530
  });
3502
3531
  }
@@ -3509,6 +3538,7 @@ function loadWalGateway(url, logger) {
3509
3538
  var onceRemoteWalFactory = new import_cement14.KeyedResolvOnce();
3510
3539
  async function remoteWalFactory(loader) {
3511
3540
  const url = buildURL(loader.ebOpts.store.stores?.meta, loader);
3541
+ ensureName(loader.name, url);
3512
3542
  const logger = ensureLogger(loader.logger, "remoteWalFactory", { url: url.toString() });
3513
3543
  url.searchParams.set("store", "wal");
3514
3544
  return onceRemoteWalFactory.get(url.toString()).once(async () => {