@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
@@ -11605,7 +11605,7 @@ replaceTraps((oldTraps) => ({
|
|
11605
11605
|
}));
|
11606
11606
|
|
11607
11607
|
// src/version.ts
|
11608
|
-
var PACKAGE_VERSION = "0.
|
11608
|
+
var PACKAGE_VERSION = "0.15.0-dev";
|
11609
11609
|
|
11610
11610
|
// src/store.ts
|
11611
11611
|
var match = PACKAGE_VERSION.match(/^([^.]*\.[^.]*)/);
|
@@ -11634,11 +11634,11 @@ var MetaStore = class extends VersionedStore {
|
|
11634
11634
|
}
|
11635
11635
|
};
|
11636
11636
|
var DataStore = class {
|
11637
|
-
constructor(
|
11637
|
+
constructor(name8) {
|
11638
11638
|
__publicField(this, "tag", "car-base");
|
11639
11639
|
__publicField(this, "STORAGE_VERSION", STORAGE_VERSION);
|
11640
|
-
__publicField(this, "
|
11641
|
-
this.
|
11640
|
+
__publicField(this, "name");
|
11641
|
+
this.name = name8;
|
11642
11642
|
}
|
11643
11643
|
};
|
11644
11644
|
|
@@ -11803,7 +11803,7 @@ var DataStore2 = class extends DataStore {
|
|
11803
11803
|
}
|
11804
11804
|
async _withDB(dbWorkFun) {
|
11805
11805
|
if (!this.idb) {
|
11806
|
-
const dbName = `fp.${this.STORAGE_VERSION}.${this.
|
11806
|
+
const dbName = `fp.${this.STORAGE_VERSION}.${this.name}`;
|
11807
11807
|
this.idb = await openDB(dbName, 1, {
|
11808
11808
|
upgrade(db) {
|
11809
11809
|
db.createObjectStore("cars");
|
@@ -11938,7 +11938,7 @@ var Loader = class {
|
|
11938
11938
|
this.name = name8;
|
11939
11939
|
this.opts = opts || this.opts;
|
11940
11940
|
this.metaStore = new MetaStore2(this.name);
|
11941
|
-
this.carStore = new DataStore2(this);
|
11941
|
+
this.carStore = new DataStore2(this.name);
|
11942
11942
|
this.remoteWAL = new RemoteWAL2(this);
|
11943
11943
|
this.ready = Promise.resolve().then(async () => {
|
11944
11944
|
if (!this.metaStore || !this.carStore || !this.remoteWAL)
|
@@ -21012,7 +21012,7 @@ var _DbLoader = class _DbLoader extends Loader {
|
|
21012
21012
|
__publicField(this, "writing", Promise.resolve());
|
21013
21013
|
__publicField(this, "remoteFileStore");
|
21014
21014
|
__publicField(this, "fileStore");
|
21015
|
-
this.fileStore = new DataStore2(this);
|
21015
|
+
this.fileStore = new DataStore2(this.name);
|
21016
21016
|
this.clock = clock;
|
21017
21017
|
}
|
21018
21018
|
async _readyForMerge() {
|
@@ -21220,7 +21220,7 @@ function applyHeadQueue(worker) {
|
|
21220
21220
|
const task = queue.shift();
|
21221
21221
|
if (!task)
|
21222
21222
|
continue;
|
21223
|
-
await worker(task.
|
21223
|
+
await worker(task.newHead, task.prevHead);
|
21224
21224
|
if (task.updates) {
|
21225
21225
|
allUpdates.push(...task.updates);
|
21226
21226
|
}
|
@@ -21250,7 +21250,7 @@ function applyHeadQueue(worker) {
|
|
21250
21250
|
// src/crdt-clock.ts
|
21251
21251
|
var CRDTClock = class {
|
21252
21252
|
constructor() {
|
21253
|
-
// todo:
|
21253
|
+
// todo: track local and remote clocks independently, merge on read
|
21254
21254
|
// that way we can drop the whole remote if we need to
|
21255
21255
|
// should go with making sure the local clock only references locally available blocks on write
|
21256
21256
|
__publicField(this, "head", []);
|
@@ -21265,68 +21265,22 @@ var CRDTClock = class {
|
|
21265
21265
|
this.head = head;
|
21266
21266
|
}
|
21267
21267
|
async applyHead(newHead, prevHead, updates = null) {
|
21268
|
-
const taskId = Math.random().toString().slice(2, 8);
|
21269
21268
|
for await (const { updates: updatesAcc, all } of this.applyHeadQueue.push({
|
21270
|
-
id: taskId,
|
21271
|
-
// tblocks,
|
21272
21269
|
newHead,
|
21273
21270
|
prevHead,
|
21274
21271
|
updates
|
21275
21272
|
})) {
|
21276
|
-
;
|
21277
|
-
((updatesAcc2, all2) => {
|
21278
|
-
void Promise.resolve().then(async () => {
|
21279
|
-
let intUpdates = updatesAcc2;
|
21280
|
-
if (this.watchers.size && !all2) {
|
21281
|
-
const changes = await clockChangesSince(this.blocks, this.head, prevHead, {});
|
21282
|
-
intUpdates = changes.result;
|
21283
|
-
}
|
21284
|
-
this.zoomers.forEach((fn) => fn());
|
21285
|
-
this.notifyWatchers(intUpdates || []);
|
21286
|
-
});
|
21287
|
-
})([...updatesAcc], all);
|
21273
|
+
this.processUpdates(updatesAcc, all, prevHead);
|
21288
21274
|
}
|
21289
21275
|
}
|
21290
|
-
async
|
21291
|
-
|
21292
|
-
|
21293
|
-
|
21294
|
-
|
21295
|
-
if (!got) {
|
21296
|
-
throw new Error("int_applyHead missing block: " + cid.toString());
|
21297
|
-
}
|
21298
|
-
});
|
21299
|
-
if (ogHead.toString() === newHead.toString()) {
|
21300
|
-
return;
|
21301
|
-
}
|
21302
|
-
const ogPrev = prevHead.sort((a, b) => a.toString().localeCompare(b.toString()));
|
21303
|
-
if (ogHead.toString() === ogPrev.toString()) {
|
21304
|
-
this.setHead(newHead);
|
21305
|
-
return;
|
21276
|
+
async processUpdates(updatesAcc, all, prevHead) {
|
21277
|
+
let internalUpdates = updatesAcc;
|
21278
|
+
if (this.watchers.size && !all) {
|
21279
|
+
const changes = await clockChangesSince(this.blocks, this.head, prevHead, {});
|
21280
|
+
internalUpdates = changes.result;
|
21306
21281
|
}
|
21307
|
-
|
21308
|
-
|
21309
|
-
const withBlocks = async (fn) => {
|
21310
|
-
if (!this.blocks)
|
21311
|
-
throw new Error("missing blocks");
|
21312
|
-
return await this.blocks.transaction(fn, void 0, { noLoader });
|
21313
|
-
};
|
21314
|
-
await withBlocks(async (tblocks) => {
|
21315
|
-
for (const cid of newHead) {
|
21316
|
-
try {
|
21317
|
-
head = await advance(tblocks, head, cid);
|
21318
|
-
} catch (e) {
|
21319
|
-
console.error("failed to advance", cid.toString(), e);
|
21320
|
-
continue;
|
21321
|
-
}
|
21322
|
-
}
|
21323
|
-
const result = await root(tblocks, head);
|
21324
|
-
for (const { cid, bytes } of [...result.additions, ...result.removals]) {
|
21325
|
-
tblocks.putSync(cid, bytes);
|
21326
|
-
}
|
21327
|
-
return { head };
|
21328
|
-
});
|
21329
|
-
this.setHead(head);
|
21282
|
+
this.zoomers.forEach((fn) => fn());
|
21283
|
+
this.notifyWatchers(internalUpdates || []);
|
21330
21284
|
}
|
21331
21285
|
notifyWatchers(updates) {
|
21332
21286
|
this.emptyWatchers.forEach((fn) => fn());
|
@@ -21341,7 +21295,62 @@ var CRDTClock = class {
|
|
21341
21295
|
onZoom(fn) {
|
21342
21296
|
this.zoomers.add(fn);
|
21343
21297
|
}
|
21298
|
+
async int_applyHead(newHead, prevHead) {
|
21299
|
+
const ogHead = sortClockHead(this.head);
|
21300
|
+
newHead = sortClockHead(newHead);
|
21301
|
+
await validateBlocks(newHead, this.blocks);
|
21302
|
+
if (compareClockHeads(ogHead, newHead)) {
|
21303
|
+
return;
|
21304
|
+
}
|
21305
|
+
const ogPrev = sortClockHead(prevHead);
|
21306
|
+
if (compareClockHeads(ogHead, ogPrev)) {
|
21307
|
+
this.setHead(newHead);
|
21308
|
+
return;
|
21309
|
+
}
|
21310
|
+
let head = this.head;
|
21311
|
+
const noLoader = false;
|
21312
|
+
if (!this.blocks)
|
21313
|
+
throw new Error("missing blocks");
|
21314
|
+
await this.blocks.transaction(
|
21315
|
+
async (tblocks) => {
|
21316
|
+
head = await advanceBlocks(newHead, tblocks, head);
|
21317
|
+
const result = await root(tblocks, head);
|
21318
|
+
for (const { cid, bytes } of [...result.additions, ...result.removals]) {
|
21319
|
+
tblocks.putSync(cid, bytes);
|
21320
|
+
}
|
21321
|
+
return { head };
|
21322
|
+
},
|
21323
|
+
void 0,
|
21324
|
+
{ noLoader }
|
21325
|
+
);
|
21326
|
+
this.setHead(head);
|
21327
|
+
}
|
21344
21328
|
};
|
21329
|
+
function sortClockHead(clockHead) {
|
21330
|
+
return clockHead.sort((a, b) => a.toString().localeCompare(b.toString()));
|
21331
|
+
}
|
21332
|
+
async function validateBlocks(newHead, blocks) {
|
21333
|
+
newHead.map(async (cid) => {
|
21334
|
+
const got = await blocks.get(cid);
|
21335
|
+
if (!got) {
|
21336
|
+
throw new Error("int_applyHead missing block: " + cid.toString());
|
21337
|
+
}
|
21338
|
+
});
|
21339
|
+
}
|
21340
|
+
function compareClockHeads(head1, head2) {
|
21341
|
+
return head1.toString() === head2.toString();
|
21342
|
+
}
|
21343
|
+
async function advanceBlocks(newHead, tblocks, head) {
|
21344
|
+
for (const cid of newHead) {
|
21345
|
+
try {
|
21346
|
+
head = await advance(tblocks, head, cid);
|
21347
|
+
} catch (e) {
|
21348
|
+
console.error("failed to advance", cid.toString(), e);
|
21349
|
+
continue;
|
21350
|
+
}
|
21351
|
+
}
|
21352
|
+
return head;
|
21353
|
+
}
|
21345
21354
|
|
21346
21355
|
// src/crdt.ts
|
21347
21356
|
var CRDT = class {
|
@@ -21515,6 +21524,9 @@ var Database = class {
|
|
21515
21524
|
}));
|
21516
21525
|
return { rows, clock: head };
|
21517
21526
|
}
|
21527
|
+
async allDocuments() {
|
21528
|
+
return this.allDocs();
|
21529
|
+
}
|
21518
21530
|
subscribe(listener, updates) {
|
21519
21531
|
if (updates) {
|
21520
21532
|
if (!this._listening) {
|