@fireproof/core 0.19.0-dev-publish → 0.19.0-dev-global
Sign up to get free protection for your applications and to get access to all the features.
- package/{chunk-EVSZA26U.js → chunk-AZVWSRER.js} +2 -2
- package/{chunk-UCMXU3DH.js → chunk-NZNG6TQT.js} +103 -1
- package/chunk-NZNG6TQT.js.map +1 -0
- package/{chunk-5X6APJDY.js → chunk-ZHO4NMWL.js} +2 -2
- package/index.cjs +122 -92
- package/index.cjs.map +1 -1
- package/index.d.cts +21 -1
- package/index.d.ts +21 -1
- package/index.global.js +24688 -0
- package/index.global.js.map +1 -0
- package/index.js +41 -122
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/metafile-iife.json +1 -0
- package/package.json +1 -1
- package/{sqlite-data-store-RIH56645.js → sqlite-data-store-3ST7XOLX.js} +3 -3
- package/{sqlite-meta-store-6347MWOR.js → sqlite-meta-store-QOIMCSJ7.js} +3 -3
- package/{sqlite-wal-store-G5YGK77N.js → sqlite-wal-store-JFBQPOYT.js} +3 -3
- package/{store-file-D472VFCS.js → store-file-CSS5THFH.js} +2 -2
- package/{store-indexdb-FRX5PTKR.js → store-indexdb-DR4HELVP.js} +3 -3
- package/{store-sql-MDSU23Y7.js → store-sql-BG6SMGQJ.js} +5 -5
- package/tests/blockstore/loader.test.ts +265 -0
- package/tests/blockstore/store.test.ts +164 -0
- package/tests/blockstore/transaction.test.ts +121 -0
- package/tests/fireproof/config.test.ts +212 -0
- package/tests/fireproof/crdt.test.ts +434 -0
- package/tests/fireproof/database.test.ts +466 -0
- package/tests/fireproof/fireproof.test.ts +602 -0
- package/tests/fireproof/hello.test.ts +54 -0
- package/tests/fireproof/indexer.test.ts +389 -0
- package/tests/helpers.ts +81 -0
- package/tests/react/useFireproof.test.tsx +19 -0
- package/tests/www/gallery.html +132 -0
- package/tests/www/iife.html +42 -0
- package/tests/www/todo-aws.html +232 -0
- package/tests/www/todo-ipfs.html +213 -0
- package/tests/www/todo-local.html +214 -0
- package/tests/www/todo-netlify.html +227 -0
- package/tests/www/todo.html +236 -0
- package/chunk-UCMXU3DH.js.map +0 -1
- /package/{chunk-EVSZA26U.js.map → chunk-AZVWSRER.js.map} +0 -0
- /package/{chunk-5X6APJDY.js.map → chunk-ZHO4NMWL.js.map} +0 -0
- /package/{sqlite-data-store-RIH56645.js.map → sqlite-data-store-3ST7XOLX.js.map} +0 -0
- /package/{sqlite-meta-store-6347MWOR.js.map → sqlite-meta-store-QOIMCSJ7.js.map} +0 -0
- /package/{sqlite-wal-store-G5YGK77N.js.map → sqlite-wal-store-JFBQPOYT.js.map} +0 -0
- /package/{store-file-D472VFCS.js.map → store-file-CSS5THFH.js.map} +0 -0
- /package/{store-indexdb-FRX5PTKR.js.map → store-indexdb-DR4HELVP.js.map} +0 -0
- /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-
|
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-
|
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-
|
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":"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","names":["e"]}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import {
|
2
2
|
SQLITE_VERSION,
|
3
3
|
ensureLogger
|
4
|
-
} from "./chunk-
|
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-
|
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 () => {
|