@fireproof/core 0.19.11-dev-dryrun → 0.19.11-dev-dryrun2
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-MAK4D54P.js → chunk-OFGPKRCM.js} +11 -1
- package/chunk-OFGPKRCM.js.map +1 -0
- package/{chunk-XINRLWR3.js → chunk-WS3YRPIA.js} +4 -4
- package/{gateway-VWWKLHUI.js → gateway-5FCWPX5W.js} +3 -3
- package/{gateway-7OM6OSYK.js → gateway-H7UD6TNB.js} +2 -2
- package/index.cjs +331 -378
- package/index.cjs.map +1 -1
- package/index.d.cts +9 -5
- package/index.d.ts +9 -5
- package/index.global.js +270 -318
- package/index.global.js.map +1 -1
- package/index.js +273 -329
- package/index.js.map +1 -1
- package/{key-bag-file-DFMW6ZM6.js → key-bag-file-WADZBHYG.js} +3 -3
- package/{key-bag-indexdb-R2RWGSQ4.js → key-bag-indexdb-PGVAI3FJ.js} +3 -3
- package/{mem-filesystem-BZQZLUR6.js → mem-filesystem-YPPJV7Q2.js} +3 -3
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/metafile-iife.json +1 -1
- package/{node-filesystem-7YZR3POJ.js → node-filesystem-INX4ZTHE.js} +3 -3
- package/package.json +1 -1
- package/tests/fireproof/all-gateway.test.ts +12 -13
- package/tests/fireproof/utils.test.ts +19 -0
- package/tests/www/todo-local.html +1 -1
- package/tests/www/todo.html +12 -15
- package/{utils-AISQB3PB.js → utils-QO2HIWGI.js} +3 -3
- package/chunk-MAK4D54P.js.map +0 -1
- package/tests/fireproof/convert_uint8.py +0 -27
- /package/{chunk-XINRLWR3.js.map → chunk-WS3YRPIA.js.map} +0 -0
- /package/{gateway-VWWKLHUI.js.map → gateway-5FCWPX5W.js.map} +0 -0
- /package/{gateway-7OM6OSYK.js.map → gateway-H7UD6TNB.js.map} +0 -0
- /package/{key-bag-file-DFMW6ZM6.js.map → key-bag-file-WADZBHYG.js.map} +0 -0
- /package/{key-bag-indexdb-R2RWGSQ4.js.map → key-bag-indexdb-PGVAI3FJ.js.map} +0 -0
- /package/{mem-filesystem-BZQZLUR6.js.map → mem-filesystem-YPPJV7Q2.js.map} +0 -0
- /package/{node-filesystem-7YZR3POJ.js.map → node-filesystem-INX4ZTHE.js.map} +0 -0
- /package/tests/fireproof/cars/{bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js → bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts} +0 -0
- /package/{utils-AISQB3PB.js.map → utils-QO2HIWGI.js.map} +0 -0
package/index.global.js
CHANGED
@@ -12058,6 +12058,16 @@ ${end.comment}` : end.comment;
|
|
12058
12058
|
bin
|
12059
12059
|
};
|
12060
12060
|
}
|
12061
|
+
timeOrderedNextId(now) {
|
12062
|
+
now = typeof now === "number" ? now : (/* @__PURE__ */ new Date()).getTime();
|
12063
|
+
const t = (281474976710656 + now).toString(16).replace(/^1/, "");
|
12064
|
+
const bin = this.crypto.randomBytes(10);
|
12065
|
+
bin[1] = bin[1] & 240 | (bin[1] | 8 && 11);
|
12066
|
+
const hex = Array.from(bin).map((i) => i.toString(16).padStart(2, "0")).join("");
|
12067
|
+
return {
|
12068
|
+
str: `${t.slice(0, 8)}-${t.slice(8)}-7${hex.slice(0, 3)}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`
|
12069
|
+
};
|
12070
|
+
}
|
12061
12071
|
start() {
|
12062
12072
|
return Promise.resolve();
|
12063
12073
|
}
|
@@ -26262,7 +26272,7 @@ You can use close({ resize: true }) to resize header`);
|
|
26262
26272
|
}
|
26263
26273
|
async function prepareCarFiles(encoder2, threshold, rootBlock, t) {
|
26264
26274
|
const carFiles = [];
|
26265
|
-
threshold = threshold ||
|
26275
|
+
threshold = threshold || 128e3 * 8;
|
26266
26276
|
let clonedt = new CarTransaction(t.parent, { add: false, noLoader: false });
|
26267
26277
|
clonedt.putSync(rootBlock.cid, rootBlock.bytes);
|
26268
26278
|
let newsize = blockLength(toCIDBlock(rootBlock));
|
@@ -26472,7 +26482,8 @@ You can use close({ resize: true }) to resize header`);
|
|
26472
26482
|
carLog: this.carLog,
|
26473
26483
|
carStore: fstore,
|
26474
26484
|
WALStore: await this.WALStore(),
|
26475
|
-
metaStore: await this.metaStore()
|
26485
|
+
metaStore: await this.metaStore(),
|
26486
|
+
threshold: this.ebOpts.threshold
|
26476
26487
|
};
|
26477
26488
|
return this.commitQueue.enqueue(async () => {
|
26478
26489
|
await this.cacheTransaction(t);
|
@@ -26979,26 +26990,7 @@ You can use close({ resize: true }) to resize header`);
|
|
26979
26990
|
if (this.innerGW.subscribe) {
|
26980
26991
|
return this.innerGW.subscribe(url, callback);
|
26981
26992
|
} else {
|
26982
|
-
|
26983
|
-
let interval = 100;
|
26984
|
-
const fetchData = async () => {
|
26985
|
-
const result = await this.innerGW.get(url);
|
26986
|
-
if (result.isOk()) {
|
26987
|
-
const data = result.Ok();
|
26988
|
-
if (!lastData || !data.every((value, index2) => lastData && value === lastData[index2])) {
|
26989
|
-
lastData = data;
|
26990
|
-
callback(data);
|
26991
|
-
interval = 100;
|
26992
|
-
} else {
|
26993
|
-
interval *= 2;
|
26994
|
-
}
|
26995
|
-
}
|
26996
|
-
timeoutId = setTimeout(fetchData, interval);
|
26997
|
-
};
|
26998
|
-
let timeoutId = setTimeout(fetchData, interval);
|
26999
|
-
return Result.Ok(() => {
|
27000
|
-
clearTimeout(timeoutId);
|
27001
|
-
});
|
26993
|
+
return Result.Err(this.logger.Error().Url(url).Msg("subscribe not supported").AsError());
|
27002
26994
|
}
|
27003
26995
|
}
|
27004
26996
|
async delete(url) {
|
@@ -27016,6 +27008,109 @@ You can use close({ resize: true }) to resize header`);
|
|
27016
27008
|
}
|
27017
27009
|
};
|
27018
27010
|
|
27011
|
+
// src/blockstore/meta-key-helper.ts
|
27012
|
+
init_cement();
|
27013
|
+
async function decodeGatewayMetaBytesToDbMeta(sthis, byteHeads) {
|
27014
|
+
const crdtEntries = JSON.parse(sthis.txt.decode(byteHeads));
|
27015
|
+
if (!crdtEntries.length) {
|
27016
|
+
sthis.logger.Debug().Str("byteHeads", new TextDecoder().decode(byteHeads)).Msg("No CRDT entries found");
|
27017
|
+
return [];
|
27018
|
+
}
|
27019
|
+
if (!crdtEntries.map) {
|
27020
|
+
sthis.logger.Debug().Str("crdtEntries", JSON.stringify(crdtEntries)).Msg("No data in CRDT entries");
|
27021
|
+
return [];
|
27022
|
+
}
|
27023
|
+
return Promise.all(
|
27024
|
+
crdtEntries.map(async (crdtEntry) => {
|
27025
|
+
const eventBlock = await decodeEventBlock(base64pad.decode(crdtEntry.data));
|
27026
|
+
const dbMeta = parse3(sthis.txt.decode(eventBlock.value.data.dbMeta));
|
27027
|
+
return {
|
27028
|
+
eventCid: eventBlock.cid,
|
27029
|
+
parents: crdtEntry.parents,
|
27030
|
+
dbMeta
|
27031
|
+
};
|
27032
|
+
})
|
27033
|
+
);
|
27034
|
+
}
|
27035
|
+
async function setCryptoKeyFromGatewayMetaPayload(uri, sthis, data) {
|
27036
|
+
try {
|
27037
|
+
sthis.logger.Debug().Str("uri", uri.toString()).Msg("Setting crypto key from gateway meta payload");
|
27038
|
+
const keyInfo = await decodeGatewayMetaBytesToDbMeta(sthis, data);
|
27039
|
+
if (keyInfo.length) {
|
27040
|
+
const dbMeta = keyInfo[0].dbMeta;
|
27041
|
+
if (dbMeta.key) {
|
27042
|
+
const kb = await getKeyBag(sthis);
|
27043
|
+
const keyName = getStoreKeyName(uri);
|
27044
|
+
const res = await kb.setNamedKey(keyName, dbMeta.key);
|
27045
|
+
if (res.isErr()) {
|
27046
|
+
sthis.logger.Debug().Str("keyName", keyName).Str("dbMeta.key", dbMeta.key).Msg("Failed to set named key");
|
27047
|
+
throw res.Err();
|
27048
|
+
}
|
27049
|
+
}
|
27050
|
+
sthis.logger.Debug().Str("dbMeta.key", dbMeta.key).Str("uri", uri.toString()).Msg("Set crypto key from gateway meta payload");
|
27051
|
+
return Result.Ok(dbMeta);
|
27052
|
+
}
|
27053
|
+
sthis.logger.Debug().Str("data", new TextDecoder().decode(data)).Msg("No crypto in gateway meta payload");
|
27054
|
+
return Result.Ok(void 0);
|
27055
|
+
} catch (error) {
|
27056
|
+
sthis.logger.Debug().Err(error).Msg("Failed to set crypto key from gateway meta payload");
|
27057
|
+
return Result.Err(error);
|
27058
|
+
}
|
27059
|
+
}
|
27060
|
+
async function addCryptoKeyToGatewayMetaPayload(uri, sthis, body) {
|
27061
|
+
try {
|
27062
|
+
sthis.logger.Debug().Str("uri", uri.toString()).Msg("Adding crypto key to gateway meta payload");
|
27063
|
+
const keyName = getStoreKeyName(uri);
|
27064
|
+
const kb = await getKeyBag(sthis);
|
27065
|
+
const res = await kb.getNamedExtractableKey(keyName, true);
|
27066
|
+
if (res.isErr()) {
|
27067
|
+
sthis.logger.Error().Str("keyName", keyName).Msg("Failed to get named extractable key");
|
27068
|
+
throw res.Err();
|
27069
|
+
}
|
27070
|
+
const keyData = await res.Ok().extract();
|
27071
|
+
const dbMetas = await decodeGatewayMetaBytesToDbMeta(sthis, body);
|
27072
|
+
const { dbMeta, parents } = dbMetas[0];
|
27073
|
+
const parentLinks = parents.map((p) => CID.parse(p));
|
27074
|
+
dbMeta.key = keyData.keyStr;
|
27075
|
+
const events = await Promise.all([dbMeta].map((dbMeta2) => createDbMetaEventBlock(sthis, dbMeta2, parentLinks)));
|
27076
|
+
const encoded = await encodeEventsWithParents(sthis, events, parentLinks);
|
27077
|
+
sthis.logger.Debug().Str("uri", uri.toString()).Msg("Added crypto key to gateway meta payload");
|
27078
|
+
return Result.Ok(encoded);
|
27079
|
+
} catch (error) {
|
27080
|
+
sthis.logger.Error().Err(error).Msg("Failed to add crypto key to gateway meta payload");
|
27081
|
+
return Result.Err(error);
|
27082
|
+
}
|
27083
|
+
}
|
27084
|
+
function getStoreKeyName(url) {
|
27085
|
+
const storeKeyName = [url.getParam("localName") || url.getParam("name")];
|
27086
|
+
const idx = url.getParam("index");
|
27087
|
+
if (idx) {
|
27088
|
+
storeKeyName.push(idx);
|
27089
|
+
}
|
27090
|
+
storeKeyName.push("data");
|
27091
|
+
return `@${storeKeyName.join(":")}@`;
|
27092
|
+
}
|
27093
|
+
async function createDbMetaEventBlock(sthis, dbMeta, parents) {
|
27094
|
+
const event = await EventBlock.create(
|
27095
|
+
{
|
27096
|
+
dbMeta: sthis.txt.encode(format2(dbMeta))
|
27097
|
+
},
|
27098
|
+
parents
|
27099
|
+
);
|
27100
|
+
return event;
|
27101
|
+
}
|
27102
|
+
async function encodeEventsWithParents(sthis, events, parents) {
|
27103
|
+
const crdtEntries = events.map((event) => {
|
27104
|
+
const base64String = base64pad.encode(event.bytes);
|
27105
|
+
return {
|
27106
|
+
cid: event.cid.toString(),
|
27107
|
+
data: base64String,
|
27108
|
+
parents: parents.map((p) => p.toString())
|
27109
|
+
};
|
27110
|
+
});
|
27111
|
+
return sthis.txt.encode(JSON.stringify(crdtEntries));
|
27112
|
+
}
|
27113
|
+
|
27019
27114
|
// src/blockstore/store.ts
|
27020
27115
|
function guardVersion(url) {
|
27021
27116
|
if (!url.hasParam("version")) {
|
@@ -27044,6 +27139,9 @@ You can use close({ resize: true }) to resize header`);
|
|
27044
27139
|
onClosed(fn) {
|
27045
27140
|
this._onClosed.push(fn);
|
27046
27141
|
}
|
27142
|
+
async ready() {
|
27143
|
+
return;
|
27144
|
+
}
|
27047
27145
|
async keyedCrypto() {
|
27048
27146
|
return keyedCryptoFactory(this._url, await this.keybag(), this.sthis);
|
27049
27147
|
}
|
@@ -27089,18 +27187,87 @@ You can use close({ resize: true }) to resize header`);
|
|
27089
27187
|
return version;
|
27090
27188
|
}
|
27091
27189
|
};
|
27190
|
+
var MetaStoreImpl = class extends BaseStoreImpl {
|
27191
|
+
// remote: boolean;
|
27192
|
+
constructor(sthis, name6, url, opts) {
|
27193
|
+
super(name6, url, { ...opts }, sthis, ensureLogger(sthis, "MetaStoreImpl"));
|
27194
|
+
this.storeType = "meta";
|
27195
|
+
this.subscribers = /* @__PURE__ */ new Map();
|
27196
|
+
this.parents = [];
|
27197
|
+
if (
|
27198
|
+
/*this.remote && */
|
27199
|
+
opts.gateway.subscribe
|
27200
|
+
) {
|
27201
|
+
this.onStarted(async () => {
|
27202
|
+
this.logger.Debug().Str("url", this.url().toString()).Msg("Subscribing to the gateway");
|
27203
|
+
opts.gateway.subscribe?.(this.url(), async (message2) => {
|
27204
|
+
this.logger.Debug().Msg("Received message from gateway");
|
27205
|
+
const dbMetas = await decodeGatewayMetaBytesToDbMeta(this.sthis, message2);
|
27206
|
+
await Promise.all(
|
27207
|
+
dbMetas.map((dbMeta) => this.loader?.taskManager?.handleEvent(dbMeta.eventCid, dbMeta.parents, dbMeta.dbMeta))
|
27208
|
+
);
|
27209
|
+
this.updateParentsFromDbMetas(dbMetas);
|
27210
|
+
});
|
27211
|
+
});
|
27212
|
+
}
|
27213
|
+
}
|
27214
|
+
updateParentsFromDbMetas(dbMetas) {
|
27215
|
+
const cids = dbMetas.map((m) => m.eventCid);
|
27216
|
+
const dbMetaParents = dbMetas.flatMap((m) => m.parents);
|
27217
|
+
const uniqueParentsMap = new Map([...this.parents, ...cids].map((p) => [p.toString(), p]));
|
27218
|
+
const dbMetaParentsSet = new Set(dbMetaParents.map((p) => p.toString()));
|
27219
|
+
this.parents = Array.from(uniqueParentsMap.values()).filter((p) => !dbMetaParentsSet.has(p.toString()));
|
27220
|
+
}
|
27221
|
+
async handleByteHeads(byteHeads) {
|
27222
|
+
return await decodeGatewayMetaBytesToDbMeta(this.sthis, byteHeads);
|
27223
|
+
}
|
27224
|
+
async load() {
|
27225
|
+
const branch = "main";
|
27226
|
+
const url = await this.gateway.buildUrl(this.url(), branch);
|
27227
|
+
if (url.isErr()) {
|
27228
|
+
throw this.logger.Error().Result("buildUrl", url).Str("branch", branch).Msg("got error from gateway.buildUrl").AsError();
|
27229
|
+
}
|
27230
|
+
const bytes = await this.gateway.get(url.Ok());
|
27231
|
+
if (bytes.isErr()) {
|
27232
|
+
if (isNotFoundError(bytes)) {
|
27233
|
+
return void 0;
|
27234
|
+
}
|
27235
|
+
throw this.logger.Error().Url(url.Ok()).Result("bytes:", bytes).Msg("gateway get").AsError();
|
27236
|
+
}
|
27237
|
+
const dbMetas = await this.handleByteHeads(bytes.Ok());
|
27238
|
+
await this.loader?.handleDbMetasFromStore(dbMetas.map((m) => m.dbMeta));
|
27239
|
+
this.updateParentsFromDbMetas(dbMetas);
|
27240
|
+
return dbMetas.map((m) => m.dbMeta);
|
27241
|
+
}
|
27242
|
+
async save(meta, branch) {
|
27243
|
+
branch = branch || "main";
|
27244
|
+
this.logger.Debug().Str("branch", branch).Any("meta", meta).Msg("saving meta");
|
27245
|
+
const event = await createDbMetaEventBlock(this.sthis, meta, this.parents);
|
27246
|
+
const bytes = await encodeEventsWithParents(this.sthis, [event], this.parents);
|
27247
|
+
const url = await this.gateway.buildUrl(this.url(), branch);
|
27248
|
+
if (url.isErr()) {
|
27249
|
+
throw this.logger.Error().Err(url.Err()).Str("branch", branch).Msg("got error from gateway.buildUrl").AsError();
|
27250
|
+
}
|
27251
|
+
this.parents = [event.cid];
|
27252
|
+
const res = await this.gateway.put(url.Ok(), bytes);
|
27253
|
+
if (res.isErr()) {
|
27254
|
+
throw this.logger.Error().Err(res.Err()).Msg("got error from gateway.put").AsError();
|
27255
|
+
}
|
27256
|
+
return res;
|
27257
|
+
}
|
27258
|
+
async close() {
|
27259
|
+
await this.gateway.close(this.url());
|
27260
|
+
this._onClosed.forEach((fn) => fn());
|
27261
|
+
return Result.Ok(void 0);
|
27262
|
+
}
|
27263
|
+
async destroy() {
|
27264
|
+
return this.gateway.destroy(this.url());
|
27265
|
+
}
|
27266
|
+
};
|
27092
27267
|
var DataStoreImpl = class extends BaseStoreImpl {
|
27093
27268
|
// readonly tag: string = "car-base";
|
27094
27269
|
constructor(sthis, name6, url, opts) {
|
27095
|
-
super(
|
27096
|
-
name6,
|
27097
|
-
url,
|
27098
|
-
{
|
27099
|
-
...opts
|
27100
|
-
},
|
27101
|
-
sthis,
|
27102
|
-
ensureLogger(sthis, "DataStoreImpl")
|
27103
|
-
);
|
27270
|
+
super(name6, url, { ...opts }, sthis, ensureLogger(sthis, "DataStoreImpl"));
|
27104
27271
|
this.storeType = "data";
|
27105
27272
|
}
|
27106
27273
|
async load(cid) {
|
@@ -27146,46 +27313,43 @@ You can use close({ resize: true }) to resize header`);
|
|
27146
27313
|
};
|
27147
27314
|
var WALStoreImpl = class extends BaseStoreImpl {
|
27148
27315
|
constructor(loader, url, opts) {
|
27149
|
-
super(
|
27150
|
-
loader.name,
|
27151
|
-
url,
|
27152
|
-
{
|
27153
|
-
...opts
|
27154
|
-
},
|
27155
|
-
loader.sthis,
|
27156
|
-
ensureLogger(loader.sthis, "WALStoreImpl")
|
27157
|
-
);
|
27316
|
+
super(loader.name, url, { ...opts }, loader.sthis, ensureLogger(loader.sthis, "WALStoreImpl"));
|
27158
27317
|
this.storeType = "wal";
|
27159
27318
|
this._ready = new ResolveOnce();
|
27160
27319
|
this.walState = { operations: [], noLoaderOps: [], fileOperations: [] };
|
27161
27320
|
this.processing = void 0;
|
27162
27321
|
this.processQueue = new CommitQueue();
|
27163
|
-
this.ready = async () => {
|
27164
|
-
return this._ready.once(async () => {
|
27165
|
-
const walState = await this.load().catch((e) => {
|
27166
|
-
this.logger.Error().Any("error", e).Msg("error loading wal");
|
27167
|
-
return void 0;
|
27168
|
-
});
|
27169
|
-
if (!walState) {
|
27170
|
-
this.walState.operations = [];
|
27171
|
-
this.walState.fileOperations = [];
|
27172
|
-
} else {
|
27173
|
-
this.walState.operations = walState.operations || [];
|
27174
|
-
this.walState.fileOperations = walState.fileOperations || [];
|
27175
|
-
}
|
27176
|
-
});
|
27177
|
-
};
|
27178
27322
|
this.loader = loader;
|
27179
27323
|
}
|
27324
|
+
async ready() {
|
27325
|
+
return this._ready.once(async () => {
|
27326
|
+
const walState = await this.load().catch((e) => {
|
27327
|
+
this.logger.Error().Any("error", e).Msg("error loading wal");
|
27328
|
+
return void 0;
|
27329
|
+
});
|
27330
|
+
if (!walState) {
|
27331
|
+
this.walState.operations = [];
|
27332
|
+
this.walState.fileOperations = [];
|
27333
|
+
} else {
|
27334
|
+
this.walState.operations = walState.operations || [];
|
27335
|
+
this.walState.fileOperations = walState.fileOperations || [];
|
27336
|
+
}
|
27337
|
+
});
|
27338
|
+
}
|
27180
27339
|
async enqueue(dbMeta, opts) {
|
27181
27340
|
await this.ready();
|
27182
|
-
if (opts.
|
27341
|
+
if (opts.compact) {
|
27342
|
+
this.walState.operations = [];
|
27343
|
+
this.walState.noLoaderOps = [dbMeta];
|
27344
|
+
} else if (opts.noLoader) {
|
27183
27345
|
this.walState.noLoaderOps.push(dbMeta);
|
27184
27346
|
} else {
|
27185
27347
|
this.walState.operations.push(dbMeta);
|
27186
27348
|
}
|
27187
27349
|
await this.save(this.walState);
|
27188
|
-
|
27350
|
+
if (!opts.noLoader) {
|
27351
|
+
void this.process();
|
27352
|
+
}
|
27189
27353
|
}
|
27190
27354
|
async enqueueFile(fileCid, publicFile = false) {
|
27191
27355
|
await this.ready();
|
@@ -27212,7 +27376,7 @@ You can use close({ resize: true }) to resize header`);
|
|
27212
27376
|
const fileOperations = [...this.walState.fileOperations];
|
27213
27377
|
const uploads = [];
|
27214
27378
|
const noLoaderOps = [...this.walState.noLoaderOps];
|
27215
|
-
const limit = pLimit(
|
27379
|
+
const limit = pLimit(3);
|
27216
27380
|
if (operations.length + fileOperations.length + noLoaderOps.length === 0) return;
|
27217
27381
|
for (const dbMeta of noLoaderOps) {
|
27218
27382
|
const uploadP = limit(async () => {
|
@@ -27319,259 +27483,6 @@ You can use close({ resize: true }) to resize header`);
|
|
27319
27483
|
}
|
27320
27484
|
};
|
27321
27485
|
|
27322
|
-
// src/blockstore/store-meta.ts
|
27323
|
-
init_cement();
|
27324
|
-
init_utils();
|
27325
|
-
|
27326
|
-
// src/runtime/index.ts
|
27327
|
-
var runtime_exports = {};
|
27328
|
-
__export(runtime_exports, {
|
27329
|
-
FILESTORE_VERSION: () => FILESTORE_VERSION,
|
27330
|
-
INDEXDB_VERSION: () => INDEXDB_VERSION,
|
27331
|
-
files: () => files_exports,
|
27332
|
-
getFileName: () => getFileName,
|
27333
|
-
getFileSystem: () => getFileSystem,
|
27334
|
-
getPath: () => getPath,
|
27335
|
-
kb: () => key_bag_exports,
|
27336
|
-
kc: () => keyed_crypto_exports,
|
27337
|
-
mf: () => wait_pr_multiformats_exports,
|
27338
|
-
runtimeFn: () => runtimeFn,
|
27339
|
-
toArrayBuffer: () => toArrayBuffer
|
27340
|
-
});
|
27341
|
-
init_utils2();
|
27342
|
-
|
27343
|
-
// src/runtime/wait-pr-multiformats/index.ts
|
27344
|
-
var wait_pr_multiformats_exports = {};
|
27345
|
-
__export(wait_pr_multiformats_exports, {
|
27346
|
-
block: () => block_exports,
|
27347
|
-
codec: () => codec_interface_exports
|
27348
|
-
});
|
27349
|
-
|
27350
|
-
// src/runtime/wait-pr-multiformats/codec-interface.ts
|
27351
|
-
var codec_interface_exports = {};
|
27352
|
-
|
27353
|
-
// src/runtime/index.ts
|
27354
|
-
init_cement();
|
27355
|
-
|
27356
|
-
// src/runtime/gateways/file/version.ts
|
27357
|
-
var FILESTORE_VERSION = "v0.19-file";
|
27358
|
-
|
27359
|
-
// src/runtime/index.ts
|
27360
|
-
init_version();
|
27361
|
-
|
27362
|
-
// src/blockstore/store-meta.ts
|
27363
|
-
async function decodeGatewayMetaBytesToDbMeta(sthis, byteHeads) {
|
27364
|
-
const crdtEntries = JSON.parse(sthis.txt.decode(byteHeads));
|
27365
|
-
return Promise.all(
|
27366
|
-
crdtEntries.map(async (crdtEntry) => {
|
27367
|
-
const eventBlock = await decodeEventBlock(decodeFromBase64(crdtEntry.data));
|
27368
|
-
const dbMeta = parse3(sthis.txt.decode(eventBlock.value.data.dbMeta));
|
27369
|
-
return {
|
27370
|
-
eventCid: eventBlock.cid,
|
27371
|
-
parents: crdtEntry.parents,
|
27372
|
-
dbMeta
|
27373
|
-
};
|
27374
|
-
})
|
27375
|
-
);
|
27376
|
-
}
|
27377
|
-
async function setCryptoKeyFromGatewayMetaPayload(uri, sthis, data) {
|
27378
|
-
try {
|
27379
|
-
sthis.logger.Debug().Str("uri", uri.toString()).Msg("Setting crypto key from gateway meta payload");
|
27380
|
-
const keyInfo = await decodeGatewayMetaBytesToDbMeta(sthis, data);
|
27381
|
-
if (keyInfo.length) {
|
27382
|
-
const dbMeta = keyInfo[0].dbMeta;
|
27383
|
-
if (dbMeta.key) {
|
27384
|
-
const kb = await key_bag_exports.getKeyBag(sthis);
|
27385
|
-
const keyName = getStoreKeyName(uri);
|
27386
|
-
const res = await kb.setNamedKey(keyName, dbMeta.key);
|
27387
|
-
if (res.isErr()) {
|
27388
|
-
sthis.logger.Debug().Str("keyName", keyName).Str("dbMeta.key", dbMeta.key).Msg("Failed to set named key");
|
27389
|
-
throw res.Err();
|
27390
|
-
}
|
27391
|
-
}
|
27392
|
-
sthis.logger.Debug().Str("dbMeta.key", dbMeta.key).Str("uri", uri.toString()).Msg("Set crypto key from gateway meta payload");
|
27393
|
-
return Result.Ok(dbMeta);
|
27394
|
-
}
|
27395
|
-
sthis.logger.Debug().Str("data", new TextDecoder().decode(data)).Msg("No crypto in gateway meta payload");
|
27396
|
-
return Result.Ok(void 0);
|
27397
|
-
} catch (error) {
|
27398
|
-
sthis.logger.Debug().Err(error).Msg("Failed to set crypto key from gateway meta payload");
|
27399
|
-
return Result.Err(error);
|
27400
|
-
}
|
27401
|
-
}
|
27402
|
-
async function addCryptoKeyToGatewayMetaPayload(uri, sthis, body) {
|
27403
|
-
try {
|
27404
|
-
sthis.logger.Debug().Str("uri", uri.toString()).Msg("Adding crypto key to gateway meta payload");
|
27405
|
-
const keyName = getStoreKeyName(uri);
|
27406
|
-
const kb = await key_bag_exports.getKeyBag(sthis);
|
27407
|
-
const res = await kb.getNamedExtractableKey(keyName, true);
|
27408
|
-
if (res.isErr()) {
|
27409
|
-
sthis.logger.Error().Str("keyName", keyName).Msg("Failed to get named extractable key");
|
27410
|
-
throw res.Err();
|
27411
|
-
}
|
27412
|
-
const keyData = await res.Ok().extract();
|
27413
|
-
const dbMetas = await decodeGatewayMetaBytesToDbMeta(sthis, body);
|
27414
|
-
const { dbMeta, parents } = dbMetas[0];
|
27415
|
-
const parentLinks = parents.map((p) => CID.parse(p));
|
27416
|
-
dbMeta.key = keyData.keyStr;
|
27417
|
-
const events = await Promise.all([dbMeta].map((dbMeta2) => createDbMetaEventBlock(sthis, dbMeta2, parentLinks)));
|
27418
|
-
const encoded = await encodeEventsWithParents(sthis, events, parentLinks);
|
27419
|
-
sthis.logger.Debug().Str("uri", uri.toString()).Msg("Added crypto key to gateway meta payload");
|
27420
|
-
return Result.Ok(encoded);
|
27421
|
-
} catch (error) {
|
27422
|
-
sthis.logger.Error().Err(error).Msg("Failed to add crypto key to gateway meta payload");
|
27423
|
-
return Result.Err(error);
|
27424
|
-
}
|
27425
|
-
}
|
27426
|
-
function getStoreKeyName(url) {
|
27427
|
-
const storeKeyName = [url.getParam("localName") || url.getParam("name")];
|
27428
|
-
const idx = url.getParam("index");
|
27429
|
-
if (idx) {
|
27430
|
-
storeKeyName.push(idx);
|
27431
|
-
}
|
27432
|
-
storeKeyName.push("data");
|
27433
|
-
return `@${storeKeyName.join(":")}@`;
|
27434
|
-
}
|
27435
|
-
async function createDbMetaEventBlock(sthis, dbMeta, parents) {
|
27436
|
-
const event = await EventBlock.create(
|
27437
|
-
{
|
27438
|
-
dbMeta: sthis.txt.encode(format2(dbMeta))
|
27439
|
-
},
|
27440
|
-
parents
|
27441
|
-
);
|
27442
|
-
return event;
|
27443
|
-
}
|
27444
|
-
async function encodeEventsWithParents(sthis, events, parents) {
|
27445
|
-
const crdtEntries = events.map((event) => {
|
27446
|
-
const base64String = encodeToBase64(event.bytes);
|
27447
|
-
return {
|
27448
|
-
cid: event.cid.toString(),
|
27449
|
-
data: base64String,
|
27450
|
-
parents: parents.map((p) => p.toString())
|
27451
|
-
};
|
27452
|
-
});
|
27453
|
-
return sthis.txt.encode(JSON.stringify(crdtEntries));
|
27454
|
-
}
|
27455
|
-
var MetaStoreImpl = class extends BaseStoreImpl {
|
27456
|
-
constructor(sthis, name6, url, opts, remote) {
|
27457
|
-
super(
|
27458
|
-
name6,
|
27459
|
-
url,
|
27460
|
-
{
|
27461
|
-
...opts
|
27462
|
-
},
|
27463
|
-
sthis,
|
27464
|
-
ensureLogger(sthis, "MetaStoreImpl")
|
27465
|
-
);
|
27466
|
-
this.storeType = "meta";
|
27467
|
-
this.subscribers = /* @__PURE__ */ new Map();
|
27468
|
-
this.parents = [];
|
27469
|
-
if (remote && opts.gateway.subscribe) {
|
27470
|
-
this.onStarted(async () => {
|
27471
|
-
this.logger.Debug().Str("url", this.url().toString()).Msg("Subscribing to the gateway");
|
27472
|
-
opts.gateway.subscribe?.(this.url(), async (message2) => {
|
27473
|
-
this.logger.Debug().Msg("Received message from gateway");
|
27474
|
-
const dbMetas = await decodeGatewayMetaBytesToDbMeta(this.sthis, message2);
|
27475
|
-
await Promise.all(
|
27476
|
-
dbMetas.map((dbMeta) => this.loader?.taskManager?.handleEvent(dbMeta.eventCid, dbMeta.parents, dbMeta.dbMeta))
|
27477
|
-
);
|
27478
|
-
});
|
27479
|
-
});
|
27480
|
-
}
|
27481
|
-
}
|
27482
|
-
async handleByteHeads(byteHeads) {
|
27483
|
-
return await decodeGatewayMetaBytesToDbMeta(this.sthis, byteHeads);
|
27484
|
-
}
|
27485
|
-
async load() {
|
27486
|
-
const branch = "main";
|
27487
|
-
const url = await this.gateway.buildUrl(this.url(), branch);
|
27488
|
-
if (url.isErr()) {
|
27489
|
-
throw this.logger.Error().Result("buildUrl", url).Str("branch", branch).Msg("got error from gateway.buildUrl").AsError();
|
27490
|
-
}
|
27491
|
-
const bytes = await this.gateway.get(url.Ok());
|
27492
|
-
if (bytes.isErr()) {
|
27493
|
-
if (isNotFoundError(bytes)) {
|
27494
|
-
return void 0;
|
27495
|
-
}
|
27496
|
-
throw this.logger.Error().Url(url.Ok()).Result("bytes:", bytes).Msg("gateway get").AsError();
|
27497
|
-
}
|
27498
|
-
const dbMetas = await this.handleByteHeads(bytes.Ok());
|
27499
|
-
await this.loader?.handleDbMetasFromStore(dbMetas.map((m) => m.dbMeta));
|
27500
|
-
const cids = dbMetas.map((m) => m.eventCid);
|
27501
|
-
const uniqueParentsMap = new Map([...this.parents, ...cids].map((p) => [p.toString(), p]));
|
27502
|
-
this.parents = Array.from(uniqueParentsMap.values());
|
27503
|
-
return dbMetas.map((m) => m.dbMeta);
|
27504
|
-
}
|
27505
|
-
async save(meta, branch) {
|
27506
|
-
branch = branch || "main";
|
27507
|
-
this.logger.Debug().Str("branch", branch).Any("meta", meta).Msg("saving meta");
|
27508
|
-
const event = await createDbMetaEventBlock(this.sthis, meta, this.parents);
|
27509
|
-
const bytes = await encodeEventsWithParents(this.sthis, [event], this.parents);
|
27510
|
-
const url = await this.gateway.buildUrl(this.url(), branch);
|
27511
|
-
if (url.isErr()) {
|
27512
|
-
throw this.logger.Error().Err(url.Err()).Str("branch", branch).Msg("got error from gateway.buildUrl").AsError();
|
27513
|
-
}
|
27514
|
-
const res = await this.gateway.put(url.Ok(), bytes);
|
27515
|
-
if (res.isErr()) {
|
27516
|
-
throw this.logger.Error().Err(res.Err()).Msg("got error from gateway.put").AsError();
|
27517
|
-
}
|
27518
|
-
await this.loader?.handleDbMetasFromStore([meta]);
|
27519
|
-
this.parents = [event.cid];
|
27520
|
-
return res;
|
27521
|
-
}
|
27522
|
-
async close() {
|
27523
|
-
await this.gateway.close(this.url());
|
27524
|
-
this._onClosed.forEach((fn) => fn());
|
27525
|
-
return Result.Ok(void 0);
|
27526
|
-
}
|
27527
|
-
async destroy() {
|
27528
|
-
return this.gateway.destroy(this.url());
|
27529
|
-
}
|
27530
|
-
};
|
27531
|
-
function encodeToBase64(bytes) {
|
27532
|
-
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
27533
|
-
let base642 = "";
|
27534
|
-
let i;
|
27535
|
-
for (i = 0; i < bytes.length - 2; i += 3) {
|
27536
|
-
base642 += chars[bytes[i] >> 2];
|
27537
|
-
base642 += chars[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];
|
27538
|
-
base642 += chars[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];
|
27539
|
-
base642 += chars[bytes[i + 2] & 63];
|
27540
|
-
}
|
27541
|
-
if (i < bytes.length) {
|
27542
|
-
base642 += chars[bytes[i] >> 2];
|
27543
|
-
if (i === bytes.length - 1) {
|
27544
|
-
base642 += chars[(bytes[i] & 3) << 4];
|
27545
|
-
base642 += "==";
|
27546
|
-
} else {
|
27547
|
-
base642 += chars[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];
|
27548
|
-
base642 += chars[(bytes[i + 1] & 15) << 2];
|
27549
|
-
base642 += "=";
|
27550
|
-
}
|
27551
|
-
}
|
27552
|
-
return base642;
|
27553
|
-
}
|
27554
|
-
function decodeFromBase64(base642) {
|
27555
|
-
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
27556
|
-
const bytes = new Uint8Array(base642.length * 3 / 4);
|
27557
|
-
let i;
|
27558
|
-
let j = 0;
|
27559
|
-
for (i = 0; i < base642.length; i += 4) {
|
27560
|
-
const a = chars.indexOf(base642[i]);
|
27561
|
-
const b = chars.indexOf(base642[i + 1]);
|
27562
|
-
const c = chars.indexOf(base642[i + 2]);
|
27563
|
-
const d = chars.indexOf(base642[i + 3]);
|
27564
|
-
bytes[j++] = a << 2 | b >> 4;
|
27565
|
-
if (base642[i + 2] !== "=") {
|
27566
|
-
bytes[j++] = (b & 15) << 4 | c >> 2;
|
27567
|
-
}
|
27568
|
-
if (base642[i + 3] !== "=") {
|
27569
|
-
bytes[j++] = (c & 3) << 6 | d;
|
27570
|
-
}
|
27571
|
-
}
|
27572
|
-
return bytes.slice(0, j);
|
27573
|
-
}
|
27574
|
-
|
27575
27486
|
// src/blockstore/store-factory.ts
|
27576
27487
|
init_utils();
|
27577
27488
|
function ensureIsIndex(url, isIndex) {
|
@@ -27763,7 +27674,13 @@ You can use close({ resize: true }) to resize header`);
|
|
27763
27674
|
return ds;
|
27764
27675
|
}
|
27765
27676
|
async function RemoteMetaStore(sthis, name6, url, opts) {
|
27766
|
-
const ms = new MetaStoreImpl(
|
27677
|
+
const ms = new MetaStoreImpl(
|
27678
|
+
sthis,
|
27679
|
+
name6,
|
27680
|
+
url,
|
27681
|
+
opts
|
27682
|
+
/* , true*/
|
27683
|
+
);
|
27767
27684
|
await ms.start();
|
27768
27685
|
return ms;
|
27769
27686
|
}
|
@@ -29650,7 +29567,7 @@ You can use close({ resize: true }) to resize header`);
|
|
29650
29567
|
queue.sort((a, b) => b.updates ? 1 : -1);
|
29651
29568
|
const task = queue.shift();
|
29652
29569
|
if (!task) continue;
|
29653
|
-
await worker(task.newHead, task.prevHead, task.updates !==
|
29570
|
+
await worker(task.newHead, task.prevHead, task.updates !== void 0).catch((e) => {
|
29654
29571
|
throw logger.Error().Err(e).Msg("int_applyHead worker error").AsError();
|
29655
29572
|
});
|
29656
29573
|
if (task.updates) {
|
@@ -29741,6 +29658,7 @@ You can use close({ resize: true }) to resize header`);
|
|
29741
29658
|
this.zoomers.add(fn);
|
29742
29659
|
}
|
29743
29660
|
async int_applyHead(newHead, prevHead, localUpdates) {
|
29661
|
+
const noLoader = !localUpdates;
|
29744
29662
|
const ogHead = sortClockHead(this.head);
|
29745
29663
|
newHead = sortClockHead(newHead);
|
29746
29664
|
if (compareClockHeads(ogHead, newHead)) {
|
@@ -29751,7 +29669,6 @@ You can use close({ resize: true }) to resize header`);
|
|
29751
29669
|
this.setHead(newHead);
|
29752
29670
|
return;
|
29753
29671
|
}
|
29754
|
-
const noLoader = !localUpdates;
|
29755
29672
|
if (!this.blockstore) {
|
29756
29673
|
throw this.logger.Error().Msg("missing blockstore").AsError();
|
29757
29674
|
}
|
@@ -29871,8 +29788,7 @@ You can use close({ resize: true }) to resize header`);
|
|
29871
29788
|
try {
|
29872
29789
|
await Promise.all([this.blockstore.ready(), this.indexBlockstore.ready(), this.clock.ready()]);
|
29873
29790
|
} catch (e) {
|
29874
|
-
|
29875
|
-
throw this.logger.Error().Err(e).Msg(`CRDT is not ready: ${ee.stack}`).AsError();
|
29791
|
+
throw this.logger.Error().Err(e).Msg(`CRDT is not ready`).AsError();
|
29876
29792
|
}
|
29877
29793
|
});
|
29878
29794
|
}
|
@@ -29976,7 +29892,7 @@ You can use close({ resize: true }) to resize header`);
|
|
29976
29892
|
await this.ready();
|
29977
29893
|
this.logger.Debug().Str("id", doc._id).Msg("put");
|
29978
29894
|
const { _id, ...value } = doc;
|
29979
|
-
const docId = _id || this.sthis.
|
29895
|
+
const docId = _id || this.sthis.timeOrderedNextId().str;
|
29980
29896
|
const result = await this._writeQueue.push({
|
29981
29897
|
id: docId,
|
29982
29898
|
value: {
|
@@ -30105,12 +30021,48 @@ You can use close({ resize: true }) to resize header`);
|
|
30105
30021
|
}
|
30106
30022
|
}
|
30107
30023
|
|
30024
|
+
// src/runtime/index.ts
|
30025
|
+
var runtime_exports = {};
|
30026
|
+
__export(runtime_exports, {
|
30027
|
+
FILESTORE_VERSION: () => FILESTORE_VERSION,
|
30028
|
+
INDEXDB_VERSION: () => INDEXDB_VERSION,
|
30029
|
+
files: () => files_exports,
|
30030
|
+
getFileName: () => getFileName,
|
30031
|
+
getFileSystem: () => getFileSystem,
|
30032
|
+
getPath: () => getPath,
|
30033
|
+
kb: () => key_bag_exports,
|
30034
|
+
kc: () => keyed_crypto_exports,
|
30035
|
+
mf: () => wait_pr_multiformats_exports,
|
30036
|
+
runtimeFn: () => runtimeFn,
|
30037
|
+
toArrayBuffer: () => toArrayBuffer
|
30038
|
+
});
|
30039
|
+
init_utils2();
|
30040
|
+
|
30041
|
+
// src/runtime/wait-pr-multiformats/index.ts
|
30042
|
+
var wait_pr_multiformats_exports = {};
|
30043
|
+
__export(wait_pr_multiformats_exports, {
|
30044
|
+
block: () => block_exports,
|
30045
|
+
codec: () => codec_interface_exports
|
30046
|
+
});
|
30047
|
+
|
30048
|
+
// src/runtime/wait-pr-multiformats/codec-interface.ts
|
30049
|
+
var codec_interface_exports = {};
|
30050
|
+
|
30051
|
+
// src/runtime/index.ts
|
30052
|
+
init_cement();
|
30053
|
+
|
30054
|
+
// src/runtime/gateways/file/version.ts
|
30055
|
+
var FILESTORE_VERSION = "v0.19-file";
|
30056
|
+
|
30057
|
+
// src/runtime/index.ts
|
30058
|
+
init_version();
|
30059
|
+
|
30108
30060
|
// src/index.ts
|
30109
30061
|
init_utils();
|
30110
30062
|
|
30111
30063
|
// src/version.ts
|
30112
30064
|
var PACKAGE_VERSION = Object.keys({
|
30113
|
-
"0.19.11-dev-
|
30065
|
+
"0.19.11-dev-dryrun2": "xxxx"
|
30114
30066
|
})[0];
|
30115
30067
|
return __toCommonJS(src_exports6);
|
30116
30068
|
})();
|