@fireproof/core 0.14.8 → 0.15.0-dev
Sign up to get free protection for your applications and to get access to all the features.
- 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
package/dist/node/fireproof.cjs
CHANGED
@@ -20987,7 +20987,7 @@ var import_os = require("os");
|
|
20987
20987
|
var import_promises = require("fs/promises");
|
20988
20988
|
|
20989
20989
|
// src/version.ts
|
20990
|
-
var PACKAGE_VERSION = "0.
|
20990
|
+
var PACKAGE_VERSION = "0.15.0-dev";
|
20991
20991
|
|
20992
20992
|
// src/store.ts
|
20993
20993
|
var match = PACKAGE_VERSION.match(/^([^.]*\.[^.]*)/);
|
@@ -21015,9 +21015,9 @@ var MetaStore = class extends VersionedStore {
|
|
21015
21015
|
var DataStore = class {
|
21016
21016
|
tag = "car-base";
|
21017
21017
|
STORAGE_VERSION = STORAGE_VERSION;
|
21018
|
-
|
21019
|
-
constructor(
|
21020
|
-
this.
|
21018
|
+
name;
|
21019
|
+
constructor(name8) {
|
21020
|
+
this.name = name8;
|
21021
21021
|
}
|
21022
21022
|
};
|
21023
21023
|
|
@@ -21224,7 +21224,7 @@ var DataStore2 = class _DataStore extends DataStore {
|
|
21224
21224
|
await writePathFile(filepath, car.bytes);
|
21225
21225
|
}
|
21226
21226
|
cidPath(cid) {
|
21227
|
-
return (0, import_path.join)(_DataStore.dataDir, this.
|
21227
|
+
return (0, import_path.join)(_DataStore.dataDir, this.name, "data", cid.toString() + ".car");
|
21228
21228
|
}
|
21229
21229
|
async load(cid) {
|
21230
21230
|
const filepath = this.cidPath(cid);
|
@@ -21282,7 +21282,7 @@ var Loader = class {
|
|
21282
21282
|
this.name = name8;
|
21283
21283
|
this.opts = opts || this.opts;
|
21284
21284
|
this.metaStore = new MetaStore2(this.name);
|
21285
|
-
this.carStore = new DataStore2(this);
|
21285
|
+
this.carStore = new DataStore2(this.name);
|
21286
21286
|
this.remoteWAL = new RemoteWAL2(this);
|
21287
21287
|
this.ready = Promise.resolve().then(async () => {
|
21288
21288
|
if (!this.metaStore || !this.carStore || !this.remoteWAL)
|
@@ -30347,7 +30347,7 @@ var DbLoader = class _DbLoader extends Loader {
|
|
30347
30347
|
fileStore;
|
30348
30348
|
constructor(name8, clock, opts) {
|
30349
30349
|
super(name8, opts);
|
30350
|
-
this.fileStore = new DataStore2(this);
|
30350
|
+
this.fileStore = new DataStore2(this.name);
|
30351
30351
|
this.clock = clock;
|
30352
30352
|
}
|
30353
30353
|
async _readyForMerge() {
|
@@ -30552,7 +30552,7 @@ function applyHeadQueue(worker) {
|
|
30552
30552
|
const task = queue.shift();
|
30553
30553
|
if (!task)
|
30554
30554
|
continue;
|
30555
|
-
await worker(task.
|
30555
|
+
await worker(task.newHead, task.prevHead);
|
30556
30556
|
if (task.updates) {
|
30557
30557
|
allUpdates.push(...task.updates);
|
30558
30558
|
}
|
@@ -30581,7 +30581,7 @@ function applyHeadQueue(worker) {
|
|
30581
30581
|
|
30582
30582
|
// src/crdt-clock.ts
|
30583
30583
|
var CRDTClock = class {
|
30584
|
-
// todo:
|
30584
|
+
// todo: track local and remote clocks independently, merge on read
|
30585
30585
|
// that way we can drop the whole remote if we need to
|
30586
30586
|
// should go with making sure the local clock only references locally available blocks on write
|
30587
30587
|
head = [];
|
@@ -30597,68 +30597,22 @@ var CRDTClock = class {
|
|
30597
30597
|
this.head = head;
|
30598
30598
|
}
|
30599
30599
|
async applyHead(newHead, prevHead, updates = null) {
|
30600
|
-
const taskId = Math.random().toString().slice(2, 8);
|
30601
30600
|
for await (const { updates: updatesAcc, all } of this.applyHeadQueue.push({
|
30602
|
-
id: taskId,
|
30603
|
-
// tblocks,
|
30604
30601
|
newHead,
|
30605
30602
|
prevHead,
|
30606
30603
|
updates
|
30607
30604
|
})) {
|
30608
|
-
;
|
30609
|
-
((updatesAcc2, all2) => {
|
30610
|
-
void Promise.resolve().then(async () => {
|
30611
|
-
let intUpdates = updatesAcc2;
|
30612
|
-
if (this.watchers.size && !all2) {
|
30613
|
-
const changes = await clockChangesSince(this.blocks, this.head, prevHead, {});
|
30614
|
-
intUpdates = changes.result;
|
30615
|
-
}
|
30616
|
-
this.zoomers.forEach((fn) => fn());
|
30617
|
-
this.notifyWatchers(intUpdates || []);
|
30618
|
-
});
|
30619
|
-
})([...updatesAcc], all);
|
30605
|
+
this.processUpdates(updatesAcc, all, prevHead);
|
30620
30606
|
}
|
30621
30607
|
}
|
30622
|
-
async
|
30623
|
-
|
30624
|
-
|
30625
|
-
|
30626
|
-
|
30627
|
-
if (!got) {
|
30628
|
-
throw new Error("int_applyHead missing block: " + cid.toString());
|
30629
|
-
}
|
30630
|
-
});
|
30631
|
-
if (ogHead.toString() === newHead.toString()) {
|
30632
|
-
return;
|
30633
|
-
}
|
30634
|
-
const ogPrev = prevHead.sort((a, b) => a.toString().localeCompare(b.toString()));
|
30635
|
-
if (ogHead.toString() === ogPrev.toString()) {
|
30636
|
-
this.setHead(newHead);
|
30637
|
-
return;
|
30608
|
+
async processUpdates(updatesAcc, all, prevHead) {
|
30609
|
+
let internalUpdates = updatesAcc;
|
30610
|
+
if (this.watchers.size && !all) {
|
30611
|
+
const changes = await clockChangesSince(this.blocks, this.head, prevHead, {});
|
30612
|
+
internalUpdates = changes.result;
|
30638
30613
|
}
|
30639
|
-
|
30640
|
-
|
30641
|
-
const withBlocks = async (fn) => {
|
30642
|
-
if (!this.blocks)
|
30643
|
-
throw new Error("missing blocks");
|
30644
|
-
return await this.blocks.transaction(fn, void 0, { noLoader });
|
30645
|
-
};
|
30646
|
-
await withBlocks(async (tblocks) => {
|
30647
|
-
for (const cid of newHead) {
|
30648
|
-
try {
|
30649
|
-
head = await advance(tblocks, head, cid);
|
30650
|
-
} catch (e) {
|
30651
|
-
console.error("failed to advance", cid.toString(), e);
|
30652
|
-
continue;
|
30653
|
-
}
|
30654
|
-
}
|
30655
|
-
const result = await root(tblocks, head);
|
30656
|
-
for (const { cid, bytes } of [...result.additions, ...result.removals]) {
|
30657
|
-
tblocks.putSync(cid, bytes);
|
30658
|
-
}
|
30659
|
-
return { head };
|
30660
|
-
});
|
30661
|
-
this.setHead(head);
|
30614
|
+
this.zoomers.forEach((fn) => fn());
|
30615
|
+
this.notifyWatchers(internalUpdates || []);
|
30662
30616
|
}
|
30663
30617
|
notifyWatchers(updates) {
|
30664
30618
|
this.emptyWatchers.forEach((fn) => fn());
|
@@ -30673,7 +30627,62 @@ var CRDTClock = class {
|
|
30673
30627
|
onZoom(fn) {
|
30674
30628
|
this.zoomers.add(fn);
|
30675
30629
|
}
|
30630
|
+
async int_applyHead(newHead, prevHead) {
|
30631
|
+
const ogHead = sortClockHead(this.head);
|
30632
|
+
newHead = sortClockHead(newHead);
|
30633
|
+
await validateBlocks(newHead, this.blocks);
|
30634
|
+
if (compareClockHeads(ogHead, newHead)) {
|
30635
|
+
return;
|
30636
|
+
}
|
30637
|
+
const ogPrev = sortClockHead(prevHead);
|
30638
|
+
if (compareClockHeads(ogHead, ogPrev)) {
|
30639
|
+
this.setHead(newHead);
|
30640
|
+
return;
|
30641
|
+
}
|
30642
|
+
let head = this.head;
|
30643
|
+
const noLoader = false;
|
30644
|
+
if (!this.blocks)
|
30645
|
+
throw new Error("missing blocks");
|
30646
|
+
await this.blocks.transaction(
|
30647
|
+
async (tblocks) => {
|
30648
|
+
head = await advanceBlocks(newHead, tblocks, head);
|
30649
|
+
const result = await root(tblocks, head);
|
30650
|
+
for (const { cid, bytes } of [...result.additions, ...result.removals]) {
|
30651
|
+
tblocks.putSync(cid, bytes);
|
30652
|
+
}
|
30653
|
+
return { head };
|
30654
|
+
},
|
30655
|
+
void 0,
|
30656
|
+
{ noLoader }
|
30657
|
+
);
|
30658
|
+
this.setHead(head);
|
30659
|
+
}
|
30676
30660
|
};
|
30661
|
+
function sortClockHead(clockHead) {
|
30662
|
+
return clockHead.sort((a, b) => a.toString().localeCompare(b.toString()));
|
30663
|
+
}
|
30664
|
+
async function validateBlocks(newHead, blocks) {
|
30665
|
+
newHead.map(async (cid) => {
|
30666
|
+
const got = await blocks.get(cid);
|
30667
|
+
if (!got) {
|
30668
|
+
throw new Error("int_applyHead missing block: " + cid.toString());
|
30669
|
+
}
|
30670
|
+
});
|
30671
|
+
}
|
30672
|
+
function compareClockHeads(head1, head2) {
|
30673
|
+
return head1.toString() === head2.toString();
|
30674
|
+
}
|
30675
|
+
async function advanceBlocks(newHead, tblocks, head) {
|
30676
|
+
for (const cid of newHead) {
|
30677
|
+
try {
|
30678
|
+
head = await advance(tblocks, head, cid);
|
30679
|
+
} catch (e) {
|
30680
|
+
console.error("failed to advance", cid.toString(), e);
|
30681
|
+
continue;
|
30682
|
+
}
|
30683
|
+
}
|
30684
|
+
return head;
|
30685
|
+
}
|
30677
30686
|
|
30678
30687
|
// src/crdt.ts
|
30679
30688
|
var CRDT = class {
|
@@ -30848,6 +30857,9 @@ var Database = class {
|
|
30848
30857
|
}));
|
30849
30858
|
return { rows, clock: head };
|
30850
30859
|
}
|
30860
|
+
async allDocuments() {
|
30861
|
+
return this.allDocs();
|
30862
|
+
}
|
30851
30863
|
subscribe(listener, updates) {
|
30852
30864
|
if (updates) {
|
30853
30865
|
if (!this._listening) {
|