@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.
- 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.js +41 -122
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- 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 () => {
|