@fireproof/core 0.14.8 → 0.15.0-dev
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/dist/browser/fireproof.cjs +75 -63
- package/dist/browser/fireproof.cjs.map +3 -3
- package/dist/browser/fireproof.esm.js +75 -63
- package/dist/browser/fireproof.esm.js.map +3 -3
- package/dist/browser/fireproof.iife.js +75 -63
- package/dist/browser/fireproof.iife.js.map +3 -3
- package/dist/memory/fireproof.esm.js +93 -81
- package/dist/memory/fireproof.esm.js.map +3 -3
- package/dist/node/fireproof.cjs +75 -63
- package/dist/node/fireproof.cjs.map +3 -3
- package/dist/node/fireproof.esm.js +75 -63
- package/dist/node/fireproof.esm.js.map +3 -3
- package/dist/types/apply-head-queue.d.ts +1 -2
- package/dist/types/crdt-clock.d.ts +2 -1
- package/dist/types/database.d.ts +7 -0
- package/dist/types/store-memory.d.ts +6 -6
- package/dist/types/store.d.ts +2 -3
- package/dist/types/version.d.ts +1 -1
- package/package.json +1 -7
@@ -11583,7 +11583,7 @@ replaceTraps((oldTraps) => ({
|
|
11583
11583
|
}));
|
11584
11584
|
|
11585
11585
|
// src/version.ts
|
11586
|
-
var PACKAGE_VERSION = "0.
|
11586
|
+
var PACKAGE_VERSION = "0.15.0-dev";
|
11587
11587
|
|
11588
11588
|
// src/store.ts
|
11589
11589
|
var match = PACKAGE_VERSION.match(/^([^.]*\.[^.]*)/);
|
@@ -11612,11 +11612,11 @@ var MetaStore = class extends VersionedStore {
|
|
11612
11612
|
}
|
11613
11613
|
};
|
11614
11614
|
var DataStore = class {
|
11615
|
-
constructor(
|
11615
|
+
constructor(name8) {
|
11616
11616
|
__publicField(this, "tag", "car-base");
|
11617
11617
|
__publicField(this, "STORAGE_VERSION", STORAGE_VERSION);
|
11618
|
-
__publicField(this, "
|
11619
|
-
this.
|
11618
|
+
__publicField(this, "name");
|
11619
|
+
this.name = name8;
|
11620
11620
|
}
|
11621
11621
|
};
|
11622
11622
|
|
@@ -11781,7 +11781,7 @@ var DataStore2 = class extends DataStore {
|
|
11781
11781
|
}
|
11782
11782
|
async _withDB(dbWorkFun) {
|
11783
11783
|
if (!this.idb) {
|
11784
|
-
const dbName = `fp.${this.STORAGE_VERSION}.${this.
|
11784
|
+
const dbName = `fp.${this.STORAGE_VERSION}.${this.name}`;
|
11785
11785
|
this.idb = await openDB(dbName, 1, {
|
11786
11786
|
upgrade(db) {
|
11787
11787
|
db.createObjectStore("cars");
|
@@ -11916,7 +11916,7 @@ var Loader = class {
|
|
11916
11916
|
this.name = name8;
|
11917
11917
|
this.opts = opts || this.opts;
|
11918
11918
|
this.metaStore = new MetaStore2(this.name);
|
11919
|
-
this.carStore = new DataStore2(this);
|
11919
|
+
this.carStore = new DataStore2(this.name);
|
11920
11920
|
this.remoteWAL = new RemoteWAL2(this);
|
11921
11921
|
this.ready = Promise.resolve().then(async () => {
|
11922
11922
|
if (!this.metaStore || !this.carStore || !this.remoteWAL)
|
@@ -20990,7 +20990,7 @@ var _DbLoader = class _DbLoader extends Loader {
|
|
20990
20990
|
__publicField(this, "writing", Promise.resolve());
|
20991
20991
|
__publicField(this, "remoteFileStore");
|
20992
20992
|
__publicField(this, "fileStore");
|
20993
|
-
this.fileStore = new DataStore2(this);
|
20993
|
+
this.fileStore = new DataStore2(this.name);
|
20994
20994
|
this.clock = clock;
|
20995
20995
|
}
|
20996
20996
|
async _readyForMerge() {
|
@@ -21198,7 +21198,7 @@ function applyHeadQueue(worker) {
|
|
21198
21198
|
const task = queue.shift();
|
21199
21199
|
if (!task)
|
21200
21200
|
continue;
|
21201
|
-
await worker(task.
|
21201
|
+
await worker(task.newHead, task.prevHead);
|
21202
21202
|
if (task.updates) {
|
21203
21203
|
allUpdates.push(...task.updates);
|
21204
21204
|
}
|
@@ -21228,7 +21228,7 @@ function applyHeadQueue(worker) {
|
|
21228
21228
|
// src/crdt-clock.ts
|
21229
21229
|
var CRDTClock = class {
|
21230
21230
|
constructor() {
|
21231
|
-
// todo:
|
21231
|
+
// todo: track local and remote clocks independently, merge on read
|
21232
21232
|
// that way we can drop the whole remote if we need to
|
21233
21233
|
// should go with making sure the local clock only references locally available blocks on write
|
21234
21234
|
__publicField(this, "head", []);
|
@@ -21243,68 +21243,22 @@ var CRDTClock = class {
|
|
21243
21243
|
this.head = head;
|
21244
21244
|
}
|
21245
21245
|
async applyHead(newHead, prevHead, updates = null) {
|
21246
|
-
const taskId = Math.random().toString().slice(2, 8);
|
21247
21246
|
for await (const { updates: updatesAcc, all } of this.applyHeadQueue.push({
|
21248
|
-
id: taskId,
|
21249
|
-
// tblocks,
|
21250
21247
|
newHead,
|
21251
21248
|
prevHead,
|
21252
21249
|
updates
|
21253
21250
|
})) {
|
21254
|
-
;
|
21255
|
-
((updatesAcc2, all2) => {
|
21256
|
-
void Promise.resolve().then(async () => {
|
21257
|
-
let intUpdates = updatesAcc2;
|
21258
|
-
if (this.watchers.size && !all2) {
|
21259
|
-
const changes = await clockChangesSince(this.blocks, this.head, prevHead, {});
|
21260
|
-
intUpdates = changes.result;
|
21261
|
-
}
|
21262
|
-
this.zoomers.forEach((fn) => fn());
|
21263
|
-
this.notifyWatchers(intUpdates || []);
|
21264
|
-
});
|
21265
|
-
})([...updatesAcc], all);
|
21251
|
+
this.processUpdates(updatesAcc, all, prevHead);
|
21266
21252
|
}
|
21267
21253
|
}
|
21268
|
-
async
|
21269
|
-
|
21270
|
-
|
21271
|
-
|
21272
|
-
|
21273
|
-
if (!got) {
|
21274
|
-
throw new Error("int_applyHead missing block: " + cid.toString());
|
21275
|
-
}
|
21276
|
-
});
|
21277
|
-
if (ogHead.toString() === newHead.toString()) {
|
21278
|
-
return;
|
21279
|
-
}
|
21280
|
-
const ogPrev = prevHead.sort((a, b) => a.toString().localeCompare(b.toString()));
|
21281
|
-
if (ogHead.toString() === ogPrev.toString()) {
|
21282
|
-
this.setHead(newHead);
|
21283
|
-
return;
|
21254
|
+
async processUpdates(updatesAcc, all, prevHead) {
|
21255
|
+
let internalUpdates = updatesAcc;
|
21256
|
+
if (this.watchers.size && !all) {
|
21257
|
+
const changes = await clockChangesSince(this.blocks, this.head, prevHead, {});
|
21258
|
+
internalUpdates = changes.result;
|
21284
21259
|
}
|
21285
|
-
|
21286
|
-
|
21287
|
-
const withBlocks = async (fn) => {
|
21288
|
-
if (!this.blocks)
|
21289
|
-
throw new Error("missing blocks");
|
21290
|
-
return await this.blocks.transaction(fn, void 0, { noLoader });
|
21291
|
-
};
|
21292
|
-
await withBlocks(async (tblocks) => {
|
21293
|
-
for (const cid of newHead) {
|
21294
|
-
try {
|
21295
|
-
head = await advance(tblocks, head, cid);
|
21296
|
-
} catch (e) {
|
21297
|
-
console.error("failed to advance", cid.toString(), e);
|
21298
|
-
continue;
|
21299
|
-
}
|
21300
|
-
}
|
21301
|
-
const result = await root(tblocks, head);
|
21302
|
-
for (const { cid, bytes } of [...result.additions, ...result.removals]) {
|
21303
|
-
tblocks.putSync(cid, bytes);
|
21304
|
-
}
|
21305
|
-
return { head };
|
21306
|
-
});
|
21307
|
-
this.setHead(head);
|
21260
|
+
this.zoomers.forEach((fn) => fn());
|
21261
|
+
this.notifyWatchers(internalUpdates || []);
|
21308
21262
|
}
|
21309
21263
|
notifyWatchers(updates) {
|
21310
21264
|
this.emptyWatchers.forEach((fn) => fn());
|
@@ -21319,7 +21273,62 @@ var CRDTClock = class {
|
|
21319
21273
|
onZoom(fn) {
|
21320
21274
|
this.zoomers.add(fn);
|
21321
21275
|
}
|
21276
|
+
async int_applyHead(newHead, prevHead) {
|
21277
|
+
const ogHead = sortClockHead(this.head);
|
21278
|
+
newHead = sortClockHead(newHead);
|
21279
|
+
await validateBlocks(newHead, this.blocks);
|
21280
|
+
if (compareClockHeads(ogHead, newHead)) {
|
21281
|
+
return;
|
21282
|
+
}
|
21283
|
+
const ogPrev = sortClockHead(prevHead);
|
21284
|
+
if (compareClockHeads(ogHead, ogPrev)) {
|
21285
|
+
this.setHead(newHead);
|
21286
|
+
return;
|
21287
|
+
}
|
21288
|
+
let head = this.head;
|
21289
|
+
const noLoader = false;
|
21290
|
+
if (!this.blocks)
|
21291
|
+
throw new Error("missing blocks");
|
21292
|
+
await this.blocks.transaction(
|
21293
|
+
async (tblocks) => {
|
21294
|
+
head = await advanceBlocks(newHead, tblocks, head);
|
21295
|
+
const result = await root(tblocks, head);
|
21296
|
+
for (const { cid, bytes } of [...result.additions, ...result.removals]) {
|
21297
|
+
tblocks.putSync(cid, bytes);
|
21298
|
+
}
|
21299
|
+
return { head };
|
21300
|
+
},
|
21301
|
+
void 0,
|
21302
|
+
{ noLoader }
|
21303
|
+
);
|
21304
|
+
this.setHead(head);
|
21305
|
+
}
|
21322
21306
|
};
|
21307
|
+
function sortClockHead(clockHead) {
|
21308
|
+
return clockHead.sort((a, b) => a.toString().localeCompare(b.toString()));
|
21309
|
+
}
|
21310
|
+
async function validateBlocks(newHead, blocks) {
|
21311
|
+
newHead.map(async (cid) => {
|
21312
|
+
const got = await blocks.get(cid);
|
21313
|
+
if (!got) {
|
21314
|
+
throw new Error("int_applyHead missing block: " + cid.toString());
|
21315
|
+
}
|
21316
|
+
});
|
21317
|
+
}
|
21318
|
+
function compareClockHeads(head1, head2) {
|
21319
|
+
return head1.toString() === head2.toString();
|
21320
|
+
}
|
21321
|
+
async function advanceBlocks(newHead, tblocks, head) {
|
21322
|
+
for (const cid of newHead) {
|
21323
|
+
try {
|
21324
|
+
head = await advance(tblocks, head, cid);
|
21325
|
+
} catch (e) {
|
21326
|
+
console.error("failed to advance", cid.toString(), e);
|
21327
|
+
continue;
|
21328
|
+
}
|
21329
|
+
}
|
21330
|
+
return head;
|
21331
|
+
}
|
21323
21332
|
|
21324
21333
|
// src/crdt.ts
|
21325
21334
|
var CRDT = class {
|
@@ -21493,6 +21502,9 @@ var Database = class {
|
|
21493
21502
|
}));
|
21494
21503
|
return { rows, clock: head };
|
21495
21504
|
}
|
21505
|
+
async allDocuments() {
|
21506
|
+
return this.allDocs();
|
21507
|
+
}
|
21496
21508
|
subscribe(listener, updates) {
|
21497
21509
|
if (updates) {
|
21498
21510
|
if (!this._listening) {
|