@fireproof/core 0.19.121 → 0.20.0-dev-preview-05
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/README.md +13 -12
- package/deno/index.d.ts +7 -0
- package/deno/index.js +66 -0
- package/deno/index.js.map +1 -0
- package/deno/metafile-esm.json +1 -0
- package/deno.json +2 -3
- package/index.cjs +1827 -1059
- package/index.cjs.map +1 -1
- package/index.d.cts +747 -334
- package/index.d.ts +747 -334
- package/index.js +1800 -1034
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/node/index.cjs +16 -293
- package/node/index.cjs.map +1 -1
- package/node/index.d.cts +4 -40
- package/node/index.d.ts +4 -40
- package/node/index.js +22 -237
- package/node/index.js.map +1 -1
- package/node/metafile-cjs.json +1 -1
- package/node/metafile-esm.json +1 -1
- package/package.json +14 -6
- package/react/index.cjs +22 -22
- package/react/index.cjs.map +1 -1
- package/react/index.d.cts +7 -7
- package/react/index.d.ts +7 -7
- package/react/index.js +22 -22
- package/react/index.js.map +1 -1
- package/react/metafile-cjs.json +1 -1
- package/react/metafile-esm.json +1 -1
- package/tests/blockstore/fp-envelope.test.ts-off +65 -0
- package/tests/blockstore/interceptor-gateway.test.ts +122 -0
- package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +130 -0
- package/tests/blockstore/keyed-crypto.test.ts +73 -118
- package/tests/blockstore/loader.test.ts +18 -9
- package/tests/blockstore/store.test.ts +40 -31
- package/tests/blockstore/transaction.test.ts +14 -13
- package/tests/fireproof/all-gateway.test.ts +286 -216
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -316
- package/tests/fireproof/crdt.test.ts +78 -19
- package/tests/fireproof/fireproof.test.ts +111 -92
- package/tests/fireproof/hello.test.ts +21 -17
- package/tests/fireproof/indexer.test.ts +74 -50
- package/tests/fireproof/{database.test.ts → ledger.test.ts} +241 -45
- package/tests/fireproof/multiple-ledger.test.ts +2 -2
- package/tests/fireproof/utils.test.ts +47 -6
- package/tests/gateway/file/loader-config.test.ts +307 -0
- package/tests/gateway/fp-envelope-serialize.test.ts +256 -0
- package/tests/gateway/indexdb/loader-config.test.ts +79 -0
- package/tests/helpers.ts +44 -17
- package/tests/react/useFireproof.test.tsx +2 -2
- package/tests/www/gallery.html +2 -2
- package/tests/www/todo-aws.html +1 -1
- package/tests/www/todo-ipfs.html +1 -1
- package/tests/www/todo-local.html +1 -1
- package/tests/www/todo.html +25 -4
- package/web/index.cjs +102 -116
- package/web/index.cjs.map +1 -1
- package/web/index.d.cts +15 -29
- package/web/index.d.ts +15 -29
- package/web/index.js +91 -105
- package/web/index.js.map +1 -1
- package/web/metafile-cjs.json +1 -1
- package/web/metafile-esm.json +1 -1
- package/node/chunk-4A4RAVNS.js +0 -17
- package/node/chunk-4A4RAVNS.js.map +0 -1
- package/node/mem-filesystem-LPPT7QV5.js +0 -40
- package/node/mem-filesystem-LPPT7QV5.js.map +0 -1
- package/tests/fireproof/config.test.ts +0 -163
- /package/tests/blockstore/{fragment-gateway.test.ts → fragment-gateway.test.ts-off} +0 -0
package/node/index.js
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
// src/runtime/gateways/file/node/to-array-buffer.ts
|
2
|
+
function toArrayBuffer(buffer) {
|
3
|
+
if (typeof buffer === "string") {
|
4
|
+
buffer = Buffer.from(buffer);
|
5
|
+
}
|
6
|
+
const ab = new ArrayBuffer(buffer.length);
|
7
|
+
const view = new Uint8Array(ab);
|
8
|
+
for (let i = 0; i < buffer.length; ++i) {
|
9
|
+
view[i] = buffer[i];
|
10
|
+
}
|
11
|
+
return view;
|
12
|
+
}
|
10
13
|
|
11
14
|
// src/runtime/gateways/file/node/node-filesystem.ts
|
12
15
|
import { runtimeFn } from "@adviser/cement";
|
@@ -45,235 +48,17 @@ var NodeFileSystem = class {
|
|
45
48
|
}
|
46
49
|
};
|
47
50
|
|
48
|
-
// src/runtime/gateways/file/node/get-file-system.ts
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
return new MemFileSystem();
|
58
|
-
});
|
59
|
-
break;
|
60
|
-
// case 'deno': {
|
61
|
-
// const { DenoFileSystem } = await import("./deno-filesystem.js");
|
62
|
-
// fs = new DenoFileSystem();
|
63
|
-
// break;
|
64
|
-
// }
|
65
|
-
default:
|
66
|
-
fs = await externalLoaders.get(name).once(async () => {
|
67
|
-
return new NodeFileSystem();
|
68
|
-
});
|
69
|
-
}
|
70
|
-
return fs.start();
|
71
|
-
}
|
72
|
-
|
73
|
-
// src/runtime/gateways/file/node/key-bag-file.ts
|
74
|
-
var KeyBagProviderFile = class {
|
75
|
-
async _prepare(id) {
|
76
|
-
await this.sthis.start();
|
77
|
-
let sysFS;
|
78
|
-
switch (this.url.protocol) {
|
79
|
-
case "file:": {
|
80
|
-
sysFS = await getFileSystem(this.url);
|
81
|
-
break;
|
82
|
-
}
|
83
|
-
default:
|
84
|
-
throw this.logger.Error().Url(this.url).Msg("unsupported protocol").AsError();
|
85
|
-
}
|
86
|
-
const dirName = this.url.pathname;
|
87
|
-
await sysFS.mkdir(dirName, { recursive: true });
|
88
|
-
return {
|
89
|
-
dirName,
|
90
|
-
sysFS,
|
91
|
-
fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, "_")}.json`)
|
92
|
-
};
|
93
|
-
}
|
94
|
-
constructor(url, sthis) {
|
95
|
-
this.url = url;
|
96
|
-
this.sthis = sthis;
|
97
|
-
this.logger = sthis.logger;
|
98
|
-
}
|
99
|
-
async get(id) {
|
100
|
-
const ctx = await this._prepare(id);
|
101
|
-
try {
|
102
|
-
const p = await ctx.sysFS.readfile(ctx.fName);
|
103
|
-
const ki = JSON.parse(this.sthis.txt.decode(p));
|
104
|
-
return ki;
|
105
|
-
} catch (e) {
|
106
|
-
if (isNotFoundError(e)) {
|
107
|
-
return void 0;
|
108
|
-
}
|
109
|
-
throw this.logger.Error().Err(e).Str("file", ctx.dirName).Msg("read bag failed").AsError();
|
110
|
-
}
|
111
|
-
}
|
112
|
-
async set(id, item) {
|
113
|
-
const ctx = await this._prepare(id);
|
114
|
-
const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));
|
115
|
-
await ctx.sysFS.writefile(ctx.fName, p);
|
116
|
-
}
|
117
|
-
};
|
118
|
-
|
119
|
-
// src/runtime/gateways/file/version.ts
|
120
|
-
var FILESTORE_VERSION = "v0.19-file";
|
121
|
-
|
122
|
-
// src/runtime/gateways/file/node/gateway-impl.ts
|
123
|
-
import { exception2Result, KeyedResolvOnce as KeyedResolvOnce2, Result } from "@adviser/cement";
|
124
|
-
import { ensureLogger, exceptionWrapper, isNotFoundError as isNotFoundError2, NotFoundError } from "@fireproof/core";
|
125
|
-
|
126
|
-
// src/runtime/gateways/file/node/utils.ts
|
127
|
-
import { getStore } from "@fireproof/core";
|
128
|
-
function getPath(url, sthis) {
|
129
|
-
const basePath = url.pathname;
|
130
|
-
const name = url.getParam("name");
|
131
|
-
if (name) {
|
132
|
-
const version = url.getParam("version");
|
133
|
-
if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();
|
134
|
-
return sthis.pathOps.join(basePath, version, name);
|
135
|
-
}
|
136
|
-
return sthis.pathOps.join(basePath);
|
51
|
+
// src/runtime/gateways/file/node/get-sys-file-system.ts
|
52
|
+
import { ResolveOnce } from "@adviser/cement";
|
53
|
+
var nfs = new ResolveOnce();
|
54
|
+
async function getSysFileSystem(url) {
|
55
|
+
return nfs.once(async () => {
|
56
|
+
const nfs2 = new NodeFileSystem();
|
57
|
+
await nfs2.start();
|
58
|
+
return nfs2;
|
59
|
+
});
|
137
60
|
}
|
138
|
-
function getFileName(url, sthis) {
|
139
|
-
const key = url.getParam("key");
|
140
|
-
if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();
|
141
|
-
const res = getStore(url, sthis, (...a) => a.join("-"));
|
142
|
-
switch (res.store) {
|
143
|
-
case "data":
|
144
|
-
return sthis.pathOps.join(res.name, key + ".car");
|
145
|
-
case "wal":
|
146
|
-
case "meta":
|
147
|
-
return sthis.pathOps.join(res.name, key + ".json");
|
148
|
-
default:
|
149
|
-
throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();
|
150
|
-
}
|
151
|
-
}
|
152
|
-
|
153
|
-
// src/runtime/gateways/file/node/gateway-impl.ts
|
154
|
-
var versionFiles = new KeyedResolvOnce2();
|
155
|
-
var FileGateway = class {
|
156
|
-
constructor(sthis) {
|
157
|
-
this.sthis = sthis;
|
158
|
-
this.logger = sthis.logger;
|
159
|
-
}
|
160
|
-
async getVersionFromFile(fs, path, logger) {
|
161
|
-
return versionFiles.get(path).once(async () => {
|
162
|
-
await fs.mkdir(path, { recursive: true });
|
163
|
-
const vFile = this.sthis.pathOps.join(path, "version");
|
164
|
-
const vFileStat = await fs.stat(vFile).catch(() => void 0);
|
165
|
-
if (!vFileStat) {
|
166
|
-
await fs.writefile(this.sthis.pathOps.join(path, "version"), FILESTORE_VERSION);
|
167
|
-
return FILESTORE_VERSION;
|
168
|
-
} else if (!vFileStat.isFile()) {
|
169
|
-
throw logger.Error().Str("file", vFile).Msg(`version file is a directory`).AsError();
|
170
|
-
}
|
171
|
-
const v = await fs.readfile(vFile);
|
172
|
-
const vStr = this.sthis.txt.decode(v);
|
173
|
-
if (vStr !== FILESTORE_VERSION) {
|
174
|
-
logger.Warn().Str("file", vFile).Str("from", vStr).Str("expected", FILESTORE_VERSION).Msg(`version mismatch`);
|
175
|
-
}
|
176
|
-
return vStr;
|
177
|
-
});
|
178
|
-
}
|
179
|
-
start(baseURL) {
|
180
|
-
return exception2Result(async () => {
|
181
|
-
const fs = await getFileSystem(baseURL);
|
182
|
-
const url = baseURL.build();
|
183
|
-
url.defParam("version", FILESTORE_VERSION);
|
184
|
-
const dbUrl = await this.buildUrl(url.URI(), "dummy");
|
185
|
-
const dbdirFile = this.getFilePath(dbUrl.Ok());
|
186
|
-
await fs.mkdir(this.sthis.pathOps.dirname(dbdirFile), { recursive: true });
|
187
|
-
const dbroot = this.sthis.pathOps.dirname(dbdirFile);
|
188
|
-
this.logger.Debug().Url(url.URI()).Str("dbroot", dbroot).Msg("start");
|
189
|
-
url.setParam("version", await this.getVersionFromFile(fs, dbroot, this.logger));
|
190
|
-
return url.URI();
|
191
|
-
});
|
192
|
-
}
|
193
|
-
async buildUrl(baseUrl, key) {
|
194
|
-
return Result.Ok(baseUrl.build().setParam("key", key).URI());
|
195
|
-
}
|
196
|
-
async close() {
|
197
|
-
return Result.Ok(void 0);
|
198
|
-
}
|
199
|
-
// abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;
|
200
|
-
getFilePath(url) {
|
201
|
-
const key = url.getParam("key");
|
202
|
-
if (!key) throw this.logger.Error().Url(url).Msg(`key not found`).AsError();
|
203
|
-
return this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));
|
204
|
-
}
|
205
|
-
async put(url, body) {
|
206
|
-
return exception2Result(async () => {
|
207
|
-
const file = await this.getFilePath(url);
|
208
|
-
this.logger.Debug().Str("url", url.toString()).Str("file", file).Msg("put");
|
209
|
-
await getFileSystem(url).then((fs) => fs.writefile(file, body));
|
210
|
-
});
|
211
|
-
}
|
212
|
-
async get(url) {
|
213
|
-
return exceptionWrapper(async () => {
|
214
|
-
const file = this.getFilePath(url);
|
215
|
-
try {
|
216
|
-
const res = await getFileSystem(url).then((fs) => fs.readfile(file));
|
217
|
-
this.logger.Debug().Url(url.asURL()).Str("file", file).Msg("get");
|
218
|
-
return Result.Ok(new Uint8Array(res));
|
219
|
-
} catch (e) {
|
220
|
-
if (isNotFoundError2(e)) {
|
221
|
-
return Result.Err(new NotFoundError(`file not found: ${file}`));
|
222
|
-
}
|
223
|
-
return Result.Err(e);
|
224
|
-
}
|
225
|
-
});
|
226
|
-
}
|
227
|
-
async delete(url) {
|
228
|
-
return exception2Result(async () => {
|
229
|
-
await getFileSystem(url).then((fs) => fs.unlink(this.getFilePath(url)));
|
230
|
-
});
|
231
|
-
}
|
232
|
-
async destroy(baseURL) {
|
233
|
-
const url = await this.buildUrl(baseURL, "x");
|
234
|
-
if (url.isErr()) return url;
|
235
|
-
const filepath = this.sthis.pathOps.dirname(this.getFilePath(url.Ok()));
|
236
|
-
const fs = await getFileSystem(baseURL);
|
237
|
-
let files = [];
|
238
|
-
try {
|
239
|
-
files = await fs.readdir(filepath);
|
240
|
-
} catch (e) {
|
241
|
-
if (!isNotFoundError2(e)) {
|
242
|
-
throw this.logger.Error().Err(e).Str("dir", filepath).Msg("destroy:readdir").AsError();
|
243
|
-
}
|
244
|
-
}
|
245
|
-
for (const file of files) {
|
246
|
-
const pathed = this.sthis.pathOps.join(filepath, file);
|
247
|
-
try {
|
248
|
-
await fs.unlink(pathed);
|
249
|
-
} catch (e) {
|
250
|
-
if (!isNotFoundError2(e)) {
|
251
|
-
throw this.logger.Error().Err(e).Str("file", pathed).Msg("destroy:unlink").AsError();
|
252
|
-
}
|
253
|
-
}
|
254
|
-
}
|
255
|
-
return Result.Ok(void 0);
|
256
|
-
}
|
257
|
-
};
|
258
|
-
var FileTestGateway = class {
|
259
|
-
constructor(sthis) {
|
260
|
-
this.logger = ensureLogger(sthis, "FileTestStore");
|
261
|
-
this.sthis = sthis;
|
262
|
-
}
|
263
|
-
async get(iurl, key) {
|
264
|
-
const url = iurl.build().setParam("key", key).URI();
|
265
|
-
const dbFile = this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));
|
266
|
-
this.logger.Debug().Url(url).Str("dbFile", dbFile).Msg("get");
|
267
|
-
const buffer = await (await getFileSystem(url)).readfile(dbFile);
|
268
|
-
this.logger.Debug().Url(url).Str("dbFile", dbFile).Len(buffer).Msg("got");
|
269
|
-
return buffer;
|
270
|
-
}
|
271
|
-
};
|
272
61
|
export {
|
273
|
-
|
274
|
-
FileTestGateway as GatewayTestImpl,
|
275
|
-
KeyBagProviderFile,
|
276
|
-
KeyBagProviderFile as KeyBagProviderImpl,
|
277
|
-
getFileSystem
|
62
|
+
getSysFileSystem
|
278
63
|
};
|
279
64
|
//# sourceMappingURL=index.js.map
|
package/node/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/runtime/gateways/file/node/key-bag-file.ts","../../../src/runtime/gateways/file/node/get-file-system.ts","../../../src/runtime/gateways/file/node/node-filesystem.ts","../../../src/runtime/gateways/file/version.ts","../../../src/runtime/gateways/file/node/gateway-impl.ts","../../../src/runtime/gateways/file/node/utils.ts"],"sourcesContent":["import { URI } from \"@adviser/cement\";\nimport { isNotFoundError, Logger } from \"@fireproof/core\";\nimport type { rt, SuperThis, SysFileSystem } from \"@fireproof/core\";\nimport { getFileSystem } from \"./get-file-system.js\";\n\ninterface KeyBagCtx {\n readonly dirName: string;\n readonly sysFS: SysFileSystem;\n readonly fName: string;\n}\n\nexport class KeyBagProviderFile implements rt.kb.KeyBagProvider {\n async _prepare(id: string): Promise<KeyBagCtx> {\n await this.sthis.start();\n let sysFS: SysFileSystem;\n switch (this.url.protocol) {\n case \"file:\": {\n sysFS = await getFileSystem(this.url);\n break;\n }\n default:\n throw this.logger.Error().Url(this.url).Msg(\"unsupported protocol\").AsError();\n }\n const dirName = this.url.pathname;\n await sysFS.mkdir(dirName, { recursive: true });\n return {\n dirName,\n sysFS,\n fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`),\n };\n }\n\n private readonly url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(url: URI, sthis: SuperThis) {\n this.url = url;\n this.sthis = sthis;\n this.logger = sthis.logger;\n }\n\n async get(id: string): Promise<rt.kb.KeyItem | undefined> {\n const ctx = await this._prepare(id);\n try {\n const p = await ctx.sysFS.readfile(ctx.fName);\n const ki = JSON.parse(this.sthis.txt.decode(p)) as rt.kb.KeyItem;\n return ki;\n } catch (e) {\n if (isNotFoundError(e)) {\n return undefined;\n }\n throw this.logger.Error().Err(e).Str(\"file\", ctx.dirName).Msg(\"read bag failed\").AsError();\n }\n }\n\n async set(id: string, item: rt.kb.KeyItem): Promise<void> {\n const ctx = await this._prepare(id);\n const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));\n await ctx.sysFS.writefile(ctx.fName, p);\n }\n}\n","import { KeyedResolvOnce, type URI } from \"@adviser/cement\";\nimport type { SysFileSystem } from \"@fireproof/core\";\nimport { NodeFileSystem } from \"./node-filesystem.js\";\n\nconst externalLoaders = new KeyedResolvOnce<SysFileSystem>();\nexport async function getFileSystem(url: URI): Promise<SysFileSystem> {\n const name = url.getParam(\"fs\", \"node\");\n let fs: SysFileSystem;\n switch (name) {\n case \"mem\":\n fs = await externalLoaders.get(name).once(async () => {\n const { MemFileSystem } = await import(\"./mem-filesystem.js\");\n return new MemFileSystem();\n });\n break;\n // case 'deno': {\n // const { DenoFileSystem } = await import(\"./deno-filesystem.js\");\n // fs = new DenoFileSystem();\n // break;\n // }\n default:\n fs = await externalLoaders.get(name).once(async () => {\n return new NodeFileSystem();\n });\n }\n return fs.start();\n}\n","import type { PathLike, MakeDirectoryOptions, Stats, ObjectEncodingOptions } from \"node:fs\";\nimport type { mkdir, readdir, rm, copyFile, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { toArrayBuffer } from \"./to-array-buffer.js\";\nimport type { SysFileSystem } from \"@fireproof/core\";\nimport { runtimeFn } from \"@adviser/cement\";\n\nexport class NodeFileSystem implements SysFileSystem {\n fs?: {\n mkdir: typeof mkdir;\n readdir: typeof readdir;\n rm: typeof rm;\n copyFile: typeof copyFile;\n readFile: typeof readFile;\n stat: typeof stat;\n unlink: typeof unlink;\n writeFile: typeof writeFile;\n };\n\n async start(): Promise<SysFileSystem> {\n this.fs = await import(\"node:fs/promises\");\n return this;\n }\n async mkdir(path: PathLike, options?: { recursive: boolean }): Promise<string | undefined> {\n return this.fs?.mkdir(path, options);\n }\n async readdir(path: PathLike, options?: ObjectEncodingOptions): Promise<string[]> {\n return this.fs?.readdir(path, options) as Promise<string[]>;\n }\n async rm(path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }): Promise<void> {\n return this.fs?.rm(path, options);\n }\n async copyFile(source: PathLike, destination: PathLike): Promise<void> {\n return this.fs?.copyFile(source, destination);\n }\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }): Promise<Uint8Array> {\n const ret = (await this.fs?.readFile(path, options)) as Buffer;\n return toArrayBuffer(ret);\n }\n stat(path: PathLike): Promise<Stats> {\n return this.fs?.stat(path) as Promise<Stats>;\n }\n async unlink(path: PathLike): Promise<void> {\n return this.fs?.unlink(path);\n }\n async writefile(path: PathLike, data: Uint8Array | string): Promise<void> {\n if (runtimeFn().isDeno) {\n return this.fs?.writeFile(path, data);\n }\n return this.fs?.writeFile(path, Buffer.from(data));\n }\n}\n\n// import { type NodeMap, join } from \"../../sys-container.js\";\n// import type { ObjectEncodingOptions, PathLike } from \"fs\";\n// import * as fs from \"fs/promises\";\n// import * as path from \"path\";\n// import * as os from \"os\";\n// import * as url from \"url\";\n// import { toArrayBuffer } from \"./utils.js\";\n\n// export async function createNodeSysContainer(): Promise<NodeMap> {\n// // const nodePath = \"node:path\";\n// // const nodeOS = \"node:os\";\n// // const nodeURL = \"node:url\";\n// // const nodeFS = \"node:fs\";\n// // const fs = (await import(\"node:fs\")).promises;\n// // const assert = \"assert\";\n// // const path = await import(\"node:path\");\n// return {\n// state: \"node\",\n// ...path,\n// // ...(await import(\"node:os\")),\n// // ...(await import(\"node:url\")),\n// ...os,\n// ...url,\n// ...fs,\n// join,\n// stat: fs.stat as NodeMap[\"stat\"],\n// readdir: fs.readdir as NodeMap[\"readdir\"],\n// readfile: async (path: PathLike, options?: ObjectEncodingOptions): Promise<Uint8Array> => {\n// const rs = await fs.readFile(path, options);\n// return toArrayBuffer(rs);\n// },\n// writefile: fs.writeFile as NodeMap[\"writefile\"],\n// };\n// }\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","import { FILESTORE_VERSION } from \"../version.js\";\nimport { exception2Result, KeyedResolvOnce, Logger, Result, URI } from \"@adviser/cement\";\nimport { ensureLogger, exceptionWrapper, isNotFoundError, NotFoundError, bs } from \"@fireproof/core\";\nimport { getFileName, getPath } from \"./utils.js\";\nimport type { SuperThis, SysFileSystem } from \"@fireproof/core\";\nimport { getFileSystem } from \"./get-file-system.js\";\n\nconst versionFiles = new KeyedResolvOnce<string>();\n\nexport class FileGateway implements bs.Gateway {\n // abstract readonly storeType: StoreType;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n\n constructor(sthis: SuperThis) {\n this.sthis = sthis;\n this.logger = sthis.logger;\n }\n\n async getVersionFromFile(fs: SysFileSystem, path: string, logger: Logger): Promise<string> {\n return versionFiles.get(path).once(async () => {\n await fs.mkdir(path, { recursive: true });\n const vFile = this.sthis.pathOps.join(path, \"version\");\n const vFileStat = await fs.stat(vFile).catch(() => undefined);\n if (!vFileStat) {\n await fs.writefile(this.sthis.pathOps.join(path, \"version\"), FILESTORE_VERSION);\n return FILESTORE_VERSION;\n } else if (!vFileStat.isFile()) {\n throw logger.Error().Str(\"file\", vFile).Msg(`version file is a directory`).AsError();\n }\n const v = await fs.readfile(vFile);\n const vStr = this.sthis.txt.decode(v);\n if (vStr !== FILESTORE_VERSION) {\n logger.Warn().Str(\"file\", vFile).Str(\"from\", vStr).Str(\"expected\", FILESTORE_VERSION).Msg(`version mismatch`);\n }\n return vStr;\n });\n }\n\n start(baseURL: URI): Promise<Result<URI>> {\n return exception2Result(async () => {\n const fs = await getFileSystem(baseURL);\n const url = baseURL.build();\n url.defParam(\"version\", FILESTORE_VERSION);\n // url.defParam(\"store\", this.storeType);\n const dbUrl = await this.buildUrl(url.URI(), \"dummy\");\n const dbdirFile = this.getFilePath(dbUrl.Ok());\n await fs.mkdir(this.sthis.pathOps.dirname(dbdirFile), { recursive: true });\n const dbroot = this.sthis.pathOps.dirname(dbdirFile);\n this.logger.Debug().Url(url.URI()).Str(\"dbroot\", dbroot).Msg(\"start\");\n url.setParam(\"version\", await this.getVersionFromFile(fs, dbroot, this.logger));\n return url.URI();\n });\n }\n\n async buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Result.Ok(baseUrl.build().setParam(\"key\", key).URI());\n }\n\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n // abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n\n getFilePath(url: URI): string {\n const key = url.getParam(\"key\");\n if (!key) throw this.logger.Error().Url(url).Msg(`key not found`).AsError();\n return this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));\n }\n\n async put(url: URI, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const file = await this.getFilePath(url);\n this.logger.Debug().Str(\"url\", url.toString()).Str(\"file\", file).Msg(\"put\");\n await getFileSystem(url).then((fs) => fs.writefile(file, body));\n });\n }\n\n async get(url: URI): Promise<bs.GetResult> {\n return exceptionWrapper(async () => {\n const file = this.getFilePath(url);\n try {\n const res = await getFileSystem(url).then((fs) => fs.readfile(file));\n this.logger.Debug().Url(url.asURL()).Str(\"file\", file).Msg(\"get\");\n return Result.Ok(new Uint8Array(res));\n } catch (e: unknown) {\n // this.logger.Error().Err(e).Str(\"file\", file).Msg(\"get\");\n if (isNotFoundError(e)) {\n return Result.Err(new NotFoundError(`file not found: ${file}`));\n }\n return Result.Err(e as Error);\n }\n });\n }\n\n async delete(url: URI): Promise<Result<void>> {\n return exception2Result(async () => {\n await getFileSystem(url).then((fs) => fs.unlink(this.getFilePath(url)));\n });\n }\n\n async destroy(baseURL: URI): Promise<Result<void>> {\n const url = await this.buildUrl(baseURL, \"x\");\n if (url.isErr()) return url;\n const filepath = this.sthis.pathOps.dirname(this.getFilePath(url.Ok()));\n const fs = await getFileSystem(baseURL);\n let files: string[] = [];\n try {\n files = await fs.readdir(filepath);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"dir\", filepath).Msg(\"destroy:readdir\").AsError();\n }\n }\n for (const file of files) {\n const pathed = this.sthis.pathOps.join(filepath, file);\n try {\n await fs.unlink(pathed);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"file\", pathed).Msg(\"destroy:unlink\").AsError();\n }\n }\n }\n return Result.Ok(undefined);\n }\n}\n\nexport class FileTestGateway implements bs.TestGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"FileTestStore\");\n this.sthis = sthis;\n }\n\n async get(iurl: URI, key: string) {\n const url = iurl.build().setParam(\"key\", key).URI();\n const dbFile = this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));\n this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Msg(\"get\");\n const buffer = await (await getFileSystem(url)).readfile(dbFile);\n this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n return buffer;\n }\n}\n","import type { URI } from \"@adviser/cement\";\nimport { getStore } from \"@fireproof/core\";\nimport type { SuperThis } from \"@fireproof/core\";\n\nexport function getPath(url: URI, sthis: SuperThis): string {\n const basePath = url.pathname;\n // .toString()\n // .replace(new RegExp(`^${url.protocol}//`), \"\")\n // .replace(/\\?.*$/, \"\");\n const name = url.getParam(\"name\");\n if (name) {\n const version = url.getParam(\"version\");\n if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();\n return sthis.pathOps.join(basePath, version, name);\n }\n return sthis.pathOps.join(basePath);\n}\n\nexport function getFileName(url: URI, sthis: SuperThis): string {\n const key = url.getParam(\"key\");\n if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();\n const res = getStore(url, sthis, (...a: string[]) => a.join(\"-\"));\n switch (res.store) {\n case \"data\":\n return sthis.pathOps.join(res.name, key + \".car\");\n case \"wal\":\n case \"meta\":\n return sthis.pathOps.join(res.name, key + \".json\");\n default:\n throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();\n }\n}\n"],"mappings":"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","names":["KeyedResolvOnce","isNotFoundError","KeyedResolvOnce","isNotFoundError"]}
|
1
|
+
{"version":3,"sources":["../../../src/runtime/gateways/file/node/to-array-buffer.ts","../../../src/runtime/gateways/file/node/node-filesystem.ts","../../../src/runtime/gateways/file/node/get-sys-file-system.ts"],"sourcesContent":["export function toArrayBuffer(buffer: Buffer | string): Uint8Array {\n if (typeof buffer === \"string\") {\n buffer = Buffer.from(buffer);\n }\n const ab = new ArrayBuffer(buffer.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buffer.length; ++i) {\n view[i] = buffer[i];\n }\n return view;\n}\n","import type { PathLike, MakeDirectoryOptions, Stats, ObjectEncodingOptions } from \"node:fs\";\nimport type { mkdir, readdir, rm, copyFile, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { toArrayBuffer } from \"./to-array-buffer.js\";\nimport type { SysFileSystem } from \"@fireproof/core\";\nimport { runtimeFn } from \"@adviser/cement\";\n\nexport class NodeFileSystem implements SysFileSystem {\n fs?: {\n mkdir: typeof mkdir;\n readdir: typeof readdir;\n rm: typeof rm;\n copyFile: typeof copyFile;\n readFile: typeof readFile;\n stat: typeof stat;\n unlink: typeof unlink;\n writeFile: typeof writeFile;\n };\n\n async start(): Promise<SysFileSystem> {\n this.fs = await import(\"node:fs/promises\");\n return this;\n }\n async mkdir(path: PathLike, options?: { recursive: boolean }): Promise<string | undefined> {\n return this.fs?.mkdir(path, options);\n }\n async readdir(path: PathLike, options?: ObjectEncodingOptions): Promise<string[]> {\n return this.fs?.readdir(path, options) as Promise<string[]>;\n }\n async rm(path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }): Promise<void> {\n return this.fs?.rm(path, options);\n }\n async copyFile(source: PathLike, destination: PathLike): Promise<void> {\n return this.fs?.copyFile(source, destination);\n }\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }): Promise<Uint8Array> {\n const ret = (await this.fs?.readFile(path, options)) as Buffer;\n return toArrayBuffer(ret);\n }\n stat(path: PathLike): Promise<Stats> {\n return this.fs?.stat(path) as Promise<Stats>;\n }\n async unlink(path: PathLike): Promise<void> {\n return this.fs?.unlink(path);\n }\n async writefile(path: PathLike, data: Uint8Array | string): Promise<void> {\n if (runtimeFn().isDeno) {\n return this.fs?.writeFile(path, data);\n }\n return this.fs?.writeFile(path, Buffer.from(data));\n }\n}\n\n// import { type NodeMap, join } from \"../../sys-container.js\";\n// import type { ObjectEncodingOptions, PathLike } from \"fs\";\n// import * as fs from \"fs/promises\";\n// import * as path from \"path\";\n// import * as os from \"os\";\n// import * as url from \"url\";\n// import { toArrayBuffer } from \"./utils.js\";\n\n// export async function createNodeSysContainer(): Promise<NodeMap> {\n// // const nodePath = \"node:path\";\n// // const nodeOS = \"node:os\";\n// // const nodeURL = \"node:url\";\n// // const nodeFS = \"node:fs\";\n// // const fs = (await import(\"node:fs\")).promises;\n// // const assert = \"assert\";\n// // const path = await import(\"node:path\");\n// return {\n// state: \"node\",\n// ...path,\n// // ...(await import(\"node:os\")),\n// // ...(await import(\"node:url\")),\n// ...os,\n// ...url,\n// ...fs,\n// join,\n// stat: fs.stat as NodeMap[\"stat\"],\n// readdir: fs.readdir as NodeMap[\"readdir\"],\n// readfile: async (path: PathLike, options?: ObjectEncodingOptions): Promise<Uint8Array> => {\n// const rs = await fs.readFile(path, options);\n// return toArrayBuffer(rs);\n// },\n// writefile: fs.writeFile as NodeMap[\"writefile\"],\n// };\n// }\n","import type { SysFileSystem } from \"@fireproof/core\";\nimport { NodeFileSystem } from \"./node-filesystem.js\";\nimport { ResolveOnce, URI } from \"@adviser/cement\";\n\nconst nfs = new ResolveOnce<SysFileSystem>();\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport async function getSysFileSystem(url: URI): Promise<SysFileSystem> {\n return nfs.once(async () => {\n const nfs = new NodeFileSystem();\n await nfs.start();\n return nfs;\n });\n}\n"],"mappings":";AAAO,SAAS,cAAc,QAAqC;AACjE,MAAI,OAAO,WAAW,UAAU;AAC9B,aAAS,OAAO,KAAK,MAAM;AAAA,EAC7B;AACA,QAAM,KAAK,IAAI,YAAY,OAAO,MAAM;AACxC,QAAM,OAAO,IAAI,WAAW,EAAE;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;AACtC,SAAK,CAAC,IAAI,OAAO,CAAC;AAAA,EACpB;AACA,SAAO;AACT;;;ACNA,SAAS,iBAAiB;AAEnB,IAAM,iBAAN,MAA8C;AAAA,EAYnD,MAAM,QAAgC;AACpC,SAAK,KAAK,MAAM,OAAO,kBAAkB;AACzC,WAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM,MAAgB,SAA+D;AACzF,WAAO,KAAK,IAAI,MAAM,MAAM,OAAO;AAAA,EACrC;AAAA,EACA,MAAM,QAAQ,MAAgB,SAAoD;AAChF,WAAO,KAAK,IAAI,QAAQ,MAAM,OAAO;AAAA,EACvC;AAAA,EACA,MAAM,GAAG,MAAgB,SAAwE;AAC/F,WAAO,KAAK,IAAI,GAAG,MAAM,OAAO;AAAA,EAClC;AAAA,EACA,MAAM,SAAS,QAAkB,aAAsC;AACrE,WAAO,KAAK,IAAI,SAAS,QAAQ,WAAW;AAAA,EAC9C;AAAA,EACA,MAAM,SAAS,MAAgB,SAA4E;AACzG,UAAM,MAAO,MAAM,KAAK,IAAI,SAAS,MAAM,OAAO;AAClD,WAAO,cAAc,GAAG;AAAA,EAC1B;AAAA,EACA,KAAK,MAAgC;AACnC,WAAO,KAAK,IAAI,KAAK,IAAI;AAAA,EAC3B;AAAA,EACA,MAAM,OAAO,MAA+B;AAC1C,WAAO,KAAK,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EACA,MAAM,UAAU,MAAgB,MAA0C;AACxE,QAAI,UAAU,EAAE,QAAQ;AACtB,aAAO,KAAK,IAAI,UAAU,MAAM,IAAI;AAAA,IACtC;AACA,WAAO,KAAK,IAAI,UAAU,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,EACnD;AACF;;;AChDA,SAAS,mBAAwB;AAEjC,IAAM,MAAM,IAAI,YAA2B;AAE3C,eAAsB,iBAAiB,KAAkC;AACvE,SAAO,IAAI,KAAK,YAAY;AAC1B,UAAMA,OAAM,IAAI,eAAe;AAC/B,UAAMA,KAAI,MAAM;AAChB,WAAOA;AAAA,EACT,CAAC;AACH;","names":["nfs"]}
|
package/node/metafile-cjs.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytes":313,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytes":3138,"imports":[{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"fs/promises","kind":"dynamic-import","external":true}],"format":"esm"},"src/runtime/gateways/file/node/
|
1
|
+
{"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytes":313,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytes":3138,"imports":[{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"fs/promises","kind":"dynamic-import","external":true}],"format":"esm"},"src/runtime/gateways/file/node/get-sys-file-system.ts":{"bytes":462,"imports":[{"path":"src/runtime/gateways/file/node/node-filesystem.ts","kind":"import-statement","original":"./node-filesystem.js"},{"path":"@adviser/cement","kind":"import-statement","external":true}],"format":"esm"},"src/runtime/gateways/file/node/index.ts":{"bytes":61,"imports":[{"path":"src/runtime/gateways/file/node/get-sys-file-system.ts","kind":"import-statement","original":"./get-sys-file-system.js"}],"format":"esm"}},"outputs":{"dist/fireproof-core/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5849},"dist/fireproof-core/node/index.cjs":{"imports":[{"path":"@adviser/cement","kind":"require-call","external":true},{"path":"fs/promises","kind":"dynamic-import","external":true},{"path":"@adviser/cement","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/runtime/gateways/file/node/index.ts","inputs":{"src/runtime/gateways/file/node/index.ts":{"bytesInOutput":143},"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytesInOutput":277},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytesInOutput":915},"src/runtime/gateways/file/node/get-sys-file-system.ts":{"bytesInOutput":252}},"bytes":3193}}}
|
package/node/metafile-esm.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytes":313,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytes":3138,"imports":[{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"dynamic-import","external":true}],"format":"esm"},"src/runtime/gateways/file/node/
|
1
|
+
{"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytes":313,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytes":3138,"imports":[{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"dynamic-import","external":true}],"format":"esm"},"src/runtime/gateways/file/node/get-sys-file-system.ts":{"bytes":462,"imports":[{"path":"src/runtime/gateways/file/node/node-filesystem.ts","kind":"import-statement","original":"./node-filesystem.js"},{"path":"@adviser/cement","kind":"import-statement","external":true}],"format":"esm"},"src/runtime/gateways/file/node/index.ts":{"bytes":61,"imports":[{"path":"src/runtime/gateways/file/node/get-sys-file-system.ts","kind":"import-statement","original":"./get-sys-file-system.js"}],"format":"esm"}},"outputs":{"dist/fireproof-core/node/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":5658},"dist/fireproof-core/node/index.js":{"imports":[{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"dynamic-import","external":true},{"path":"@adviser/cement","kind":"import-statement","external":true}],"exports":["getSysFileSystem"],"entryPoint":"src/runtime/gateways/file/node/index.ts","inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytesInOutput":277},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytesInOutput":898},"src/runtime/gateways/file/node/get-sys-file-system.ts":{"bytesInOutput":235},"src/runtime/gateways/file/node/index.ts":{"bytesInOutput":0}},"bytes":1606}}}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@fireproof/core",
|
3
|
-
"version": "0.
|
4
|
-
"description": "Live
|
3
|
+
"version": "0.20.0-dev-preview-05",
|
4
|
+
"description": "Live ledger for the web.",
|
5
5
|
"type": "module",
|
6
6
|
"module": "./index.js",
|
7
7
|
"main": "./index.cjs",
|
@@ -22,6 +22,15 @@
|
|
22
22
|
"require": "./node/index.cjs",
|
23
23
|
"types": "./node/index.d.ts"
|
24
24
|
},
|
25
|
+
"./deno": {
|
26
|
+
"import": {
|
27
|
+
"browser": "./web/index.js",
|
28
|
+
"default": "./deno/index.js"
|
29
|
+
},
|
30
|
+
"browser": "./web/index.js",
|
31
|
+
"require": "./deno/index.cjs",
|
32
|
+
"types": "./deno/index.d.ts"
|
33
|
+
},
|
25
34
|
"./web": {
|
26
35
|
"import": "./web/index.js",
|
27
36
|
"browser": "./web/index.js",
|
@@ -36,7 +45,7 @@
|
|
36
45
|
}
|
37
46
|
},
|
38
47
|
"keywords": [
|
39
|
-
"
|
48
|
+
"ledger",
|
40
49
|
"JSON",
|
41
50
|
"document",
|
42
51
|
"IPLD",
|
@@ -66,14 +75,13 @@
|
|
66
75
|
"react": "^18.3.1"
|
67
76
|
},
|
68
77
|
"dependencies": {
|
69
|
-
"@adviser/cement": "^0.3.
|
78
|
+
"@adviser/cement": "^0.3.5",
|
70
79
|
"@fireproof/vendor": "^1.0.4",
|
71
|
-
"@ipld/unixfs": "^3.0.0",
|
72
80
|
"multiformats": "^13.3.1",
|
81
|
+
"@ipld/unixfs": "^3.0.0",
|
73
82
|
"charwise": "^3.0.1",
|
74
83
|
"prolly-trees": "^1.0.4",
|
75
84
|
"idb": "^8.0.1",
|
76
|
-
"memfs": "^4.15.1",
|
77
85
|
"p-limit": "^6.2.0",
|
78
86
|
"p-map": "^7.0.3",
|
79
87
|
"p-retry": "^6.2.1"
|
package/react/index.cjs
CHANGED
@@ -34,7 +34,7 @@ var import_core = require("@fireproof/core");
|
|
34
34
|
var import_react = require("react");
|
35
35
|
var FireproofCtx = {};
|
36
36
|
function useFireproof(name = "useFireproof", config = {}) {
|
37
|
-
const
|
37
|
+
const ledger = typeof name === "string" ? (0, import_core.fireproof)(name, config) : name;
|
38
38
|
function useDocument2(initialDocOrFn) {
|
39
39
|
let initialDoc;
|
40
40
|
if (typeof initialDocOrFn === "function") {
|
@@ -45,12 +45,12 @@ function useFireproof(name = "useFireproof", config = {}) {
|
|
45
45
|
const docId = initialDoc._id ?? "";
|
46
46
|
const [doc, setDoc] = (0, import_react.useState)(initialDoc);
|
47
47
|
const refreshDoc = (0, import_react.useCallback)(async () => {
|
48
|
-
const doc2 = docId ? await
|
48
|
+
const doc2 = docId ? await ledger.get(docId).catch(() => initialDoc) : initialDoc;
|
49
49
|
setDoc(doc2);
|
50
50
|
}, [docId]);
|
51
51
|
const saveDoc = (0, import_react.useCallback)(
|
52
52
|
async (existingDoc) => {
|
53
|
-
const res = await
|
53
|
+
const res = await ledger.put(existingDoc ?? doc);
|
54
54
|
if (!existingDoc && !doc._id) setDoc((d) => ({ ...d, _id: res.id }));
|
55
55
|
return res;
|
56
56
|
},
|
@@ -59,9 +59,9 @@ function useFireproof(name = "useFireproof", config = {}) {
|
|
59
59
|
const deleteDoc = (0, import_react.useCallback)(
|
60
60
|
async (existingDoc) => {
|
61
61
|
const id = existingDoc?._id ?? docId;
|
62
|
-
const doc2 = await
|
63
|
-
if (!doc2) throw
|
64
|
-
const res = await
|
62
|
+
const doc2 = await ledger.get(id).catch(() => void 0);
|
63
|
+
if (!doc2) throw ledger.logger.Error().Str("id", id).Msg(`Document not found`).AsError();
|
64
|
+
const res = await ledger.del(id);
|
65
65
|
setDoc(initialDoc);
|
66
66
|
return res;
|
67
67
|
},
|
@@ -76,7 +76,7 @@ function useFireproof(name = "useFireproof", config = {}) {
|
|
76
76
|
);
|
77
77
|
(0, import_react.useEffect)(() => {
|
78
78
|
if (!docId) return;
|
79
|
-
return
|
79
|
+
return ledger.subscribe((changes) => {
|
80
80
|
if (changes.find((c) => c._id === docId)) {
|
81
81
|
void refreshDoc();
|
82
82
|
}
|
@@ -95,12 +95,12 @@ function useFireproof(name = "useFireproof", config = {}) {
|
|
95
95
|
const queryString = (0, import_react.useMemo)(() => JSON.stringify(query), [query]);
|
96
96
|
const mapFnString = (0, import_react.useMemo)(() => mapFn.toString(), [mapFn]);
|
97
97
|
const refreshRows = (0, import_react.useCallback)(async () => {
|
98
|
-
const res = await
|
98
|
+
const res = await ledger.query(mapFn, query);
|
99
99
|
setResult({ ...res, docs: res.rows.map((r) => r.doc) });
|
100
100
|
}, [mapFnString, queryString]);
|
101
101
|
(0, import_react.useEffect)(() => {
|
102
102
|
refreshRows();
|
103
|
-
return
|
103
|
+
return ledger.subscribe(refreshRows);
|
104
104
|
}, [refreshRows]);
|
105
105
|
return result;
|
106
106
|
}
|
@@ -110,12 +110,12 @@ function useFireproof(name = "useFireproof", config = {}) {
|
|
110
110
|
});
|
111
111
|
const queryString = (0, import_react.useMemo)(() => JSON.stringify(query), [query]);
|
112
112
|
const refreshRows = (0, import_react.useCallback)(async () => {
|
113
|
-
const res = await
|
113
|
+
const res = await ledger.allDocs(query);
|
114
114
|
setResult({ ...res, docs: res.rows.map((r) => r.value) });
|
115
115
|
}, [queryString]);
|
116
116
|
(0, import_react.useEffect)(() => {
|
117
117
|
refreshRows();
|
118
|
-
return
|
118
|
+
return ledger.subscribe(refreshRows);
|
119
119
|
}, [refreshRows]);
|
120
120
|
return result;
|
121
121
|
}
|
@@ -125,46 +125,46 @@ function useFireproof(name = "useFireproof", config = {}) {
|
|
125
125
|
});
|
126
126
|
const queryString = (0, import_react.useMemo)(() => JSON.stringify(opts), [opts]);
|
127
127
|
const refreshRows = (0, import_react.useCallback)(async () => {
|
128
|
-
const res = await
|
128
|
+
const res = await ledger.changes(since, opts);
|
129
129
|
setResult({ ...res, docs: res.rows.map((r) => r.value) });
|
130
130
|
}, [since, queryString]);
|
131
131
|
(0, import_react.useEffect)(() => {
|
132
132
|
refreshRows();
|
133
|
-
return
|
133
|
+
return ledger.subscribe(refreshRows);
|
134
134
|
}, [refreshRows]);
|
135
135
|
return result;
|
136
136
|
}
|
137
|
-
return {
|
137
|
+
return { ledger, useLiveQuery: useLiveQuery2, useDocument: useDocument2, useAllDocs: useAllDocs2, useChanges: useChanges2 };
|
138
138
|
}
|
139
139
|
|
140
140
|
// src/react/useDocument.ts
|
141
141
|
function topLevelUseDocument(...args) {
|
142
|
-
const { useDocument: useDocument2,
|
143
|
-
topLevelUseDocument.
|
142
|
+
const { useDocument: useDocument2, ledger } = useFireproof();
|
143
|
+
topLevelUseDocument.ledger = ledger;
|
144
144
|
return useDocument2(...args);
|
145
145
|
}
|
146
146
|
var useDocument = topLevelUseDocument;
|
147
147
|
|
148
148
|
// src/react/useLiveQuery.ts
|
149
149
|
function topLevelUseLiveQuery(...args) {
|
150
|
-
const { useLiveQuery: useLiveQuery2,
|
151
|
-
topLevelUseLiveQuery.
|
150
|
+
const { useLiveQuery: useLiveQuery2, ledger } = useFireproof();
|
151
|
+
topLevelUseLiveQuery.ledger = ledger;
|
152
152
|
return useLiveQuery2(...args);
|
153
153
|
}
|
154
154
|
var useLiveQuery = topLevelUseLiveQuery;
|
155
155
|
|
156
156
|
// src/react/useAllDocs.ts
|
157
157
|
function topLevelUseAllDocs(...args) {
|
158
|
-
const { useAllDocs: useAllDocs2,
|
159
|
-
topLevelUseAllDocs.
|
158
|
+
const { useAllDocs: useAllDocs2, ledger } = useFireproof();
|
159
|
+
topLevelUseAllDocs.ledger = ledger;
|
160
160
|
return useAllDocs2(...args);
|
161
161
|
}
|
162
162
|
var useAllDocs = topLevelUseAllDocs;
|
163
163
|
|
164
164
|
// src/react/useChanges.ts
|
165
165
|
function topLevelUseChanges(...args) {
|
166
|
-
const { useChanges: useChanges2,
|
167
|
-
topLevelUseChanges.
|
166
|
+
const { useChanges: useChanges2, ledger } = useFireproof();
|
167
|
+
topLevelUseChanges.ledger = ledger;
|
168
168
|
return useChanges2(...args);
|
169
169
|
}
|
170
170
|
var useChanges = topLevelUseChanges;
|