@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
@@ -20977,7 +20977,7 @@ import { homedir } from "os";
|
|
20977
20977
|
import { mkdir, readFile, writeFile, unlink } from "fs/promises";
|
20978
20978
|
|
20979
20979
|
// src/version.ts
|
20980
|
-
var PACKAGE_VERSION = "0.
|
20980
|
+
var PACKAGE_VERSION = "0.15.0-dev";
|
20981
20981
|
|
20982
20982
|
// src/store.ts
|
20983
20983
|
var match = PACKAGE_VERSION.match(/^([^.]*\.[^.]*)/);
|
@@ -21005,9 +21005,9 @@ var MetaStore = class extends VersionedStore {
|
|
21005
21005
|
var DataStore = class {
|
21006
21006
|
tag = "car-base";
|
21007
21007
|
STORAGE_VERSION = STORAGE_VERSION;
|
21008
|
-
|
21009
|
-
constructor(
|
21010
|
-
this.
|
21008
|
+
name;
|
21009
|
+
constructor(name8) {
|
21010
|
+
this.name = name8;
|
21011
21011
|
}
|
21012
21012
|
};
|
21013
21013
|
|
@@ -21214,7 +21214,7 @@ var DataStore2 = class _DataStore extends DataStore {
|
|
21214
21214
|
await writePathFile(filepath, car.bytes);
|
21215
21215
|
}
|
21216
21216
|
cidPath(cid) {
|
21217
|
-
return join(_DataStore.dataDir, this.
|
21217
|
+
return join(_DataStore.dataDir, this.name, "data", cid.toString() + ".car");
|
21218
21218
|
}
|
21219
21219
|
async load(cid) {
|
21220
21220
|
const filepath = this.cidPath(cid);
|
@@ -21272,7 +21272,7 @@ var Loader = class {
|
|
21272
21272
|
this.name = name8;
|
21273
21273
|
this.opts = opts || this.opts;
|
21274
21274
|
this.metaStore = new MetaStore2(this.name);
|
21275
|
-
this.carStore = new DataStore2(this);
|
21275
|
+
this.carStore = new DataStore2(this.name);
|
21276
21276
|
this.remoteWAL = new RemoteWAL2(this);
|
21277
21277
|
this.ready = Promise.resolve().then(async () => {
|
21278
21278
|
if (!this.metaStore || !this.carStore || !this.remoteWAL)
|
@@ -30337,7 +30337,7 @@ var DbLoader = class _DbLoader extends Loader {
|
|
30337
30337
|
fileStore;
|
30338
30338
|
constructor(name8, clock, opts) {
|
30339
30339
|
super(name8, opts);
|
30340
|
-
this.fileStore = new DataStore2(this);
|
30340
|
+
this.fileStore = new DataStore2(this.name);
|
30341
30341
|
this.clock = clock;
|
30342
30342
|
}
|
30343
30343
|
async _readyForMerge() {
|
@@ -30542,7 +30542,7 @@ function applyHeadQueue(worker) {
|
|
30542
30542
|
const task = queue.shift();
|
30543
30543
|
if (!task)
|
30544
30544
|
continue;
|
30545
|
-
await worker(task.
|
30545
|
+
await worker(task.newHead, task.prevHead);
|
30546
30546
|
if (task.updates) {
|
30547
30547
|
allUpdates.push(...task.updates);
|
30548
30548
|
}
|
@@ -30571,7 +30571,7 @@ function applyHeadQueue(worker) {
|
|
30571
30571
|
|
30572
30572
|
// src/crdt-clock.ts
|
30573
30573
|
var CRDTClock = class {
|
30574
|
-
// todo:
|
30574
|
+
// todo: track local and remote clocks independently, merge on read
|
30575
30575
|
// that way we can drop the whole remote if we need to
|
30576
30576
|
// should go with making sure the local clock only references locally available blocks on write
|
30577
30577
|
head = [];
|
@@ -30587,68 +30587,22 @@ var CRDTClock = class {
|
|
30587
30587
|
this.head = head;
|
30588
30588
|
}
|
30589
30589
|
async applyHead(newHead, prevHead, updates = null) {
|
30590
|
-
const taskId = Math.random().toString().slice(2, 8);
|
30591
30590
|
for await (const { updates: updatesAcc, all } of this.applyHeadQueue.push({
|
30592
|
-
id: taskId,
|
30593
|
-
// tblocks,
|
30594
30591
|
newHead,
|
30595
30592
|
prevHead,
|
30596
30593
|
updates
|
30597
30594
|
})) {
|
30598
|
-
;
|
30599
|
-
((updatesAcc2, all2) => {
|
30600
|
-
void Promise.resolve().then(async () => {
|
30601
|
-
let intUpdates = updatesAcc2;
|
30602
|
-
if (this.watchers.size && !all2) {
|
30603
|
-
const changes = await clockChangesSince(this.blocks, this.head, prevHead, {});
|
30604
|
-
intUpdates = changes.result;
|
30605
|
-
}
|
30606
|
-
this.zoomers.forEach((fn) => fn());
|
30607
|
-
this.notifyWatchers(intUpdates || []);
|
30608
|
-
});
|
30609
|
-
})([...updatesAcc], all);
|
30595
|
+
this.processUpdates(updatesAcc, all, prevHead);
|
30610
30596
|
}
|
30611
30597
|
}
|
30612
|
-
async
|
30613
|
-
|
30614
|
-
|
30615
|
-
|
30616
|
-
|
30617
|
-
if (!got) {
|
30618
|
-
throw new Error("int_applyHead missing block: " + cid.toString());
|
30619
|
-
}
|
30620
|
-
});
|
30621
|
-
if (ogHead.toString() === newHead.toString()) {
|
30622
|
-
return;
|
30623
|
-
}
|
30624
|
-
const ogPrev = prevHead.sort((a, b) => a.toString().localeCompare(b.toString()));
|
30625
|
-
if (ogHead.toString() === ogPrev.toString()) {
|
30626
|
-
this.setHead(newHead);
|
30627
|
-
return;
|
30598
|
+
async processUpdates(updatesAcc, all, prevHead) {
|
30599
|
+
let internalUpdates = updatesAcc;
|
30600
|
+
if (this.watchers.size && !all) {
|
30601
|
+
const changes = await clockChangesSince(this.blocks, this.head, prevHead, {});
|
30602
|
+
internalUpdates = changes.result;
|
30628
30603
|
}
|
30629
|
-
|
30630
|
-
|
30631
|
-
const withBlocks = async (fn) => {
|
30632
|
-
if (!this.blocks)
|
30633
|
-
throw new Error("missing blocks");
|
30634
|
-
return await this.blocks.transaction(fn, void 0, { noLoader });
|
30635
|
-
};
|
30636
|
-
await withBlocks(async (tblocks) => {
|
30637
|
-
for (const cid of newHead) {
|
30638
|
-
try {
|
30639
|
-
head = await advance(tblocks, head, cid);
|
30640
|
-
} catch (e) {
|
30641
|
-
console.error("failed to advance", cid.toString(), e);
|
30642
|
-
continue;
|
30643
|
-
}
|
30644
|
-
}
|
30645
|
-
const result = await root(tblocks, head);
|
30646
|
-
for (const { cid, bytes } of [...result.additions, ...result.removals]) {
|
30647
|
-
tblocks.putSync(cid, bytes);
|
30648
|
-
}
|
30649
|
-
return { head };
|
30650
|
-
});
|
30651
|
-
this.setHead(head);
|
30604
|
+
this.zoomers.forEach((fn) => fn());
|
30605
|
+
this.notifyWatchers(internalUpdates || []);
|
30652
30606
|
}
|
30653
30607
|
notifyWatchers(updates) {
|
30654
30608
|
this.emptyWatchers.forEach((fn) => fn());
|
@@ -30663,7 +30617,62 @@ var CRDTClock = class {
|
|
30663
30617
|
onZoom(fn) {
|
30664
30618
|
this.zoomers.add(fn);
|
30665
30619
|
}
|
30620
|
+
async int_applyHead(newHead, prevHead) {
|
30621
|
+
const ogHead = sortClockHead(this.head);
|
30622
|
+
newHead = sortClockHead(newHead);
|
30623
|
+
await validateBlocks(newHead, this.blocks);
|
30624
|
+
if (compareClockHeads(ogHead, newHead)) {
|
30625
|
+
return;
|
30626
|
+
}
|
30627
|
+
const ogPrev = sortClockHead(prevHead);
|
30628
|
+
if (compareClockHeads(ogHead, ogPrev)) {
|
30629
|
+
this.setHead(newHead);
|
30630
|
+
return;
|
30631
|
+
}
|
30632
|
+
let head = this.head;
|
30633
|
+
const noLoader = false;
|
30634
|
+
if (!this.blocks)
|
30635
|
+
throw new Error("missing blocks");
|
30636
|
+
await this.blocks.transaction(
|
30637
|
+
async (tblocks) => {
|
30638
|
+
head = await advanceBlocks(newHead, tblocks, head);
|
30639
|
+
const result = await root(tblocks, head);
|
30640
|
+
for (const { cid, bytes } of [...result.additions, ...result.removals]) {
|
30641
|
+
tblocks.putSync(cid, bytes);
|
30642
|
+
}
|
30643
|
+
return { head };
|
30644
|
+
},
|
30645
|
+
void 0,
|
30646
|
+
{ noLoader }
|
30647
|
+
);
|
30648
|
+
this.setHead(head);
|
30649
|
+
}
|
30666
30650
|
};
|
30651
|
+
function sortClockHead(clockHead) {
|
30652
|
+
return clockHead.sort((a, b) => a.toString().localeCompare(b.toString()));
|
30653
|
+
}
|
30654
|
+
async function validateBlocks(newHead, blocks) {
|
30655
|
+
newHead.map(async (cid) => {
|
30656
|
+
const got = await blocks.get(cid);
|
30657
|
+
if (!got) {
|
30658
|
+
throw new Error("int_applyHead missing block: " + cid.toString());
|
30659
|
+
}
|
30660
|
+
});
|
30661
|
+
}
|
30662
|
+
function compareClockHeads(head1, head2) {
|
30663
|
+
return head1.toString() === head2.toString();
|
30664
|
+
}
|
30665
|
+
async function advanceBlocks(newHead, tblocks, head) {
|
30666
|
+
for (const cid of newHead) {
|
30667
|
+
try {
|
30668
|
+
head = await advance(tblocks, head, cid);
|
30669
|
+
} catch (e) {
|
30670
|
+
console.error("failed to advance", cid.toString(), e);
|
30671
|
+
continue;
|
30672
|
+
}
|
30673
|
+
}
|
30674
|
+
return head;
|
30675
|
+
}
|
30667
30676
|
|
30668
30677
|
// src/crdt.ts
|
30669
30678
|
var CRDT = class {
|
@@ -30838,6 +30847,9 @@ var Database = class {
|
|
30838
30847
|
}));
|
30839
30848
|
return { rows, clock: head };
|
30840
30849
|
}
|
30850
|
+
async allDocuments() {
|
30851
|
+
return this.allDocs();
|
30852
|
+
}
|
30841
30853
|
subscribe(listener, updates) {
|
30842
30854
|
if (updates) {
|
30843
30855
|
if (!this._listening) {
|