@peerbit/log 6.0.7 → 6.0.8
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/benchmark/payload-path.d.ts +2 -0
- package/dist/benchmark/payload-path.d.ts.map +1 -0
- package/dist/benchmark/payload-path.js +276 -0
- package/dist/benchmark/payload-path.js.map +1 -0
- package/dist/src/entry-index.d.ts +13 -2
- package/dist/src/entry-index.d.ts.map +1 -1
- package/dist/src/entry-index.js +155 -12
- package/dist/src/entry-index.js.map +1 -1
- package/dist/src/entry-v0.d.ts +1 -0
- package/dist/src/entry-v0.d.ts.map +1 -1
- package/dist/src/entry-v0.js +5 -3
- package/dist/src/entry-v0.js.map +1 -1
- package/dist/src/entry.d.ts +2 -0
- package/dist/src/entry.d.ts.map +1 -1
- package/dist/src/entry.js +7 -1
- package/dist/src/entry.js.map +1 -1
- package/dist/src/log.d.ts +5 -0
- package/dist/src/log.d.ts.map +1 -1
- package/dist/src/log.js +25 -3
- package/dist/src/log.js.map +1 -1
- package/dist/src/trim.d.ts.map +1 -1
- package/dist/src/trim.js +3 -2
- package/dist/src/trim.js.map +1 -1
- package/package.json +9 -8
- package/src/entry-index.ts +189 -17
- package/src/entry-v0.ts +6 -3
- package/src/entry.ts +9 -1
- package/src/log.ts +35 -5
- package/src/trim.ts +3 -4
package/dist/src/trim.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trim.js","sourceRoot":"","sources":["../../src/trim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,MAAM,MAAM,SAAS,CAAC;AAM7B,MAAM,gBAAgB,GAAG,CAAC,CAAc,EAAE,CAAc,EAAE,EAAE;IAC3D,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,CACN,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;gBACjB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;gBACb,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CACvC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACxD,OAAO,CACN,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;gBACjB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;gBACb,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CACvC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5C,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC;QACzE,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,IAAiB,EAAE,EAAe,EAAE,EAAE;IAClE,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QAC1E,uBAAuB;QACvB,OAAO,IAAI,CAAC,CAAC,uBAAuB;IACrC,CAAC;IAED,IACC,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;QACtD,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,EACjD,CAAC;QACF,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QAChC,OAAO,QAAQ,GAAG,MAAM,CAAC;IAC1B,CAAC;SAAM,CAAC;QACP,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QAChC,CAAC;IACF,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC,CAAC;AAiCF,MAAM,OAAO,IAAI;IACR,KAAK,CAAe;IACpB,qBAAqB,CAAkC;IACvD,aAAa,CAAkC;IAC/C,aAAa,CAAkC;IAC/C,eAAe,GAAG,CAAC,CAAC;IAEpB,gBAAgB,CAAe;IAC/B,aAAa,CAA8B;IAC3C,2BAA2B,CAAiB;IAC5C,IAAI,CAAS;IACb,MAAM,CAAS;IACvB,YAAY,GAAW,EAAE,OAAqB;QAC7C,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC,2BAA2B,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QACjC,IAAI,IAAI,CAAC,qBAAqB,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;YAC/C,qJAAqJ;YACrJ,IAAI,CAAC,qBAAqB,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAC1D,IAAI,CAAC,qBAAqB,EAC1B,KAAK,CACL,CAAC;QACH,CAAC;IACF,CAAC;IAED,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,QAAQ,CACrB,SAAkC,IAAI,CAAC,KAAK;QAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACX,CAAC;QACD,oCAAoC;QACpC,MAAM,OAAO,GAAe,EAAE,CAAC;QAE/B,IAAI,IAAsC,CAAC;QAC3C,sFAAsF;QACtF,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC;gBAClC,OAAO,EAAE,CAAC;YACX,CAAC;YACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QAChD,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACzC,
|
|
1
|
+
{"version":3,"file":"trim.js","sourceRoot":"","sources":["../../src/trim.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peerbit/log",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.8",
|
|
4
4
|
"description": "Append-only log CRDT",
|
|
5
5
|
"author": "dao.xyz",
|
|
6
6
|
"license": "MIT",
|
|
@@ -69,19 +69,19 @@
|
|
|
69
69
|
"pino": "^9.4.0",
|
|
70
70
|
"uuid": "^10.0.0",
|
|
71
71
|
"uint8arrays": "^5.1.0",
|
|
72
|
-
"@peerbit/blocks-interface": "2.0.1",
|
|
73
72
|
"@peerbit/blocks": "4.0.3",
|
|
74
73
|
"@peerbit/cache": "3.0.0",
|
|
75
74
|
"@peerbit/crypto": "3.0.0",
|
|
76
75
|
"@peerbit/any-store": "2.2.5",
|
|
77
|
-
"@peerbit/
|
|
78
|
-
"@peerbit/indexer-
|
|
76
|
+
"@peerbit/blocks-interface": "2.0.1",
|
|
77
|
+
"@peerbit/indexer-sqlite3": "3.0.1",
|
|
79
78
|
"@peerbit/indexer-simple": "1.2.3",
|
|
80
79
|
"@peerbit/pubsub-interface": "5.0.2",
|
|
81
|
-
"@peerbit/
|
|
80
|
+
"@peerbit/indexer-interface": "3.0.0",
|
|
82
81
|
"@peerbit/keychain": "1.2.5",
|
|
83
82
|
"@peerbit/logger": "2.0.0",
|
|
84
|
-
"@peerbit/time": "3.0.0"
|
|
83
|
+
"@peerbit/time": "3.0.0",
|
|
84
|
+
"@peerbit/stream-interface": "6.0.1"
|
|
85
85
|
},
|
|
86
86
|
"devDependencies": {
|
|
87
87
|
"@types/libsodium-wrappers": "^0.7.14",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"assert": "^2.0.0",
|
|
91
91
|
"json-stringify-deterministic": "^1.0.7",
|
|
92
92
|
"tty-table": "^4.2.1",
|
|
93
|
-
"@peerbit/test-utils": "3.0.
|
|
93
|
+
"@peerbit/test-utils": "3.0.8"
|
|
94
94
|
},
|
|
95
95
|
"contributors": [
|
|
96
96
|
"haadcode",
|
|
@@ -114,6 +114,7 @@
|
|
|
114
114
|
"clean": "aegir clean",
|
|
115
115
|
"build": "aegir build --no-bundle",
|
|
116
116
|
"test": "aegir test --target node",
|
|
117
|
-
"lint": "aegir lint"
|
|
117
|
+
"lint": "aegir lint",
|
|
118
|
+
"test:cov": "aegir test -t node --cov"
|
|
118
119
|
}
|
|
119
120
|
}
|
package/src/entry-index.ts
CHANGED
|
@@ -32,6 +32,7 @@ export type ResultsIterator<T> = {
|
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
const ENTRY_CACHE_MAX_SIZE = 10; // TODO as param for log
|
|
35
|
+
const DEFERRED_INDEX_FLUSH_IDLE_MS = 250;
|
|
35
36
|
type ResolveFullyOptions =
|
|
36
37
|
| true
|
|
37
38
|
| {
|
|
@@ -66,6 +67,8 @@ export class EntryIndex<T> {
|
|
|
66
67
|
private initialied = false;
|
|
67
68
|
private _length: number;
|
|
68
69
|
private insertionPromises: Map<string, Promise<void>>;
|
|
70
|
+
private pendingIndexWrites: Map<string, ShallowEntry>;
|
|
71
|
+
private pendingIndexFlushTimer?: ReturnType<typeof setTimeout>;
|
|
69
72
|
constructor(
|
|
70
73
|
readonly properties: {
|
|
71
74
|
store: Blocks;
|
|
@@ -94,6 +97,48 @@ export class EntryIndex<T> {
|
|
|
94
97
|
this.cache = properties.cache ?? new Cache({ max: ENTRY_CACHE_MAX_SIZE });
|
|
95
98
|
this._length = 0;
|
|
96
99
|
this.insertionPromises = new Map();
|
|
100
|
+
this.pendingIndexWrites = new Map();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private schedulePendingIndexWriteFlush() {
|
|
104
|
+
if (this.pendingIndexFlushTimer) {
|
|
105
|
+
clearTimeout(this.pendingIndexFlushTimer);
|
|
106
|
+
}
|
|
107
|
+
this.pendingIndexFlushTimer = setTimeout(() => {
|
|
108
|
+
void this.flushPendingWrites().catch((error) => {
|
|
109
|
+
log.error("Failed to flush deferred entry-index writes", error);
|
|
110
|
+
});
|
|
111
|
+
}, DEFERRED_INDEX_FLUSH_IDLE_MS);
|
|
112
|
+
this.pendingIndexFlushTimer.unref?.();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private clearPendingIndexFlushTimer() {
|
|
116
|
+
if (!this.pendingIndexFlushTimer) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
clearTimeout(this.pendingIndexFlushTimer);
|
|
120
|
+
this.pendingIndexFlushTimer = undefined;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async flushPendingWrites(hashes?: Iterable<string>) {
|
|
124
|
+
const keys = hashes
|
|
125
|
+
? [...new Set([...hashes].filter((hash): hash is string => !!hash))]
|
|
126
|
+
: [...this.pendingIndexWrites.keys()];
|
|
127
|
+
if (keys.length === 0) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this.clearPendingIndexFlushTimer();
|
|
131
|
+
for (const hash of keys) {
|
|
132
|
+
const pending = this.pendingIndexWrites.get(hash);
|
|
133
|
+
if (!pending) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
await this.properties.index.put(pending);
|
|
137
|
+
this.pendingIndexWrites.delete(hash);
|
|
138
|
+
}
|
|
139
|
+
if (this.pendingIndexWrites.size > 0) {
|
|
140
|
+
this.schedulePendingIndexWriteFlush();
|
|
141
|
+
}
|
|
97
142
|
}
|
|
98
143
|
|
|
99
144
|
getHeads<R extends MaybeResolveOptions = false>(
|
|
@@ -131,6 +176,14 @@ export class EntryIndex<T> {
|
|
|
131
176
|
}
|
|
132
177
|
|
|
133
178
|
countHasNext(next: string, excludeHash: string | undefined = undefined) {
|
|
179
|
+
return this._countHasNext(next, excludeHash);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
private async _countHasNext(
|
|
183
|
+
next: string,
|
|
184
|
+
excludeHash: string | undefined = undefined,
|
|
185
|
+
) {
|
|
186
|
+
await this.flushPendingWrites();
|
|
134
187
|
const query: Query[] = [
|
|
135
188
|
new StringMatch({
|
|
136
189
|
key: ["meta", "next"],
|
|
@@ -172,20 +225,32 @@ export class EntryIndex<T> {
|
|
|
172
225
|
? ({ hash: true } as const)
|
|
173
226
|
: ((options as { shape: Shape })?.shape as Shape);
|
|
174
227
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
228
|
+
let iteratorRef: ReturnType<typeof this.properties.index.iterate> | undefined;
|
|
229
|
+
let iteratorPromise:
|
|
230
|
+
| Promise<ReturnType<typeof this.properties.index.iterate>>
|
|
231
|
+
| undefined;
|
|
232
|
+
|
|
233
|
+
const getIterator = async () => {
|
|
234
|
+
await this.flushPendingWrites();
|
|
235
|
+
if (!iteratorPromise) {
|
|
236
|
+
iteratorRef = this.properties.index.iterate(
|
|
237
|
+
{ query, sort },
|
|
238
|
+
{ shape: nextShape },
|
|
239
|
+
);
|
|
240
|
+
iteratorPromise = Promise.resolve(iteratorRef);
|
|
241
|
+
}
|
|
242
|
+
return iteratorPromise;
|
|
243
|
+
};
|
|
179
244
|
|
|
180
245
|
const next = async (
|
|
181
246
|
amount: number,
|
|
182
247
|
): Promise<ReturnTypeFromResolveOptions<R, T>[]> => {
|
|
183
|
-
const results = await
|
|
248
|
+
const results = await (await getIterator()).next(amount);
|
|
184
249
|
return coerce(results);
|
|
185
250
|
};
|
|
186
251
|
|
|
187
252
|
const all = async (): Promise<ReturnTypeFromResolveOptions<R, T>[]> => {
|
|
188
|
-
const results = await
|
|
253
|
+
const results = await (await getIterator()).all();
|
|
189
254
|
return coerce(results);
|
|
190
255
|
};
|
|
191
256
|
|
|
@@ -211,8 +276,8 @@ export class EntryIndex<T> {
|
|
|
211
276
|
};
|
|
212
277
|
|
|
213
278
|
return {
|
|
214
|
-
close:
|
|
215
|
-
done:
|
|
279
|
+
close: async () => iteratorRef?.close(),
|
|
280
|
+
done: () => iteratorRef?.done(),
|
|
216
281
|
next,
|
|
217
282
|
all,
|
|
218
283
|
};
|
|
@@ -271,6 +336,10 @@ export class EntryIndex<T> {
|
|
|
271
336
|
}
|
|
272
337
|
|
|
273
338
|
async getShallow(k: string) {
|
|
339
|
+
const pending = this.pendingIndexWrites.get(k);
|
|
340
|
+
if (pending) {
|
|
341
|
+
return { id: toId(k), value: pending };
|
|
342
|
+
}
|
|
274
343
|
return this.properties.index.get(toId(k));
|
|
275
344
|
}
|
|
276
345
|
|
|
@@ -279,15 +348,76 @@ export class EntryIndex<T> {
|
|
|
279
348
|
if (mem) {
|
|
280
349
|
return true;
|
|
281
350
|
}
|
|
351
|
+
if (this.pendingIndexWrites.has(k)) {
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
282
354
|
const result = await this.properties.index.get(toId(k), {
|
|
283
355
|
shape: { hash: true },
|
|
284
356
|
});
|
|
285
357
|
return result != null;
|
|
286
358
|
}
|
|
287
359
|
|
|
360
|
+
async hasMany(hashes: Iterable<string>) {
|
|
361
|
+
const batchSize = 64;
|
|
362
|
+
const existing = new Set<string>();
|
|
363
|
+
const missing: string[] = [];
|
|
364
|
+
for (const hash of new Set([...hashes].filter(Boolean))) {
|
|
365
|
+
if (this.cache.get(hash) || this.pendingIndexWrites.has(hash)) {
|
|
366
|
+
existing.add(hash);
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
missing.push(hash);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (missing.length === 0) {
|
|
373
|
+
return existing;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
for (let i = 0; i < missing.length; i += batchSize) {
|
|
377
|
+
const batch = missing.slice(i, i + batchSize);
|
|
378
|
+
const iterator = this.properties.index.iterate(
|
|
379
|
+
{
|
|
380
|
+
query:
|
|
381
|
+
batch.length === 1
|
|
382
|
+
? new StringMatch({
|
|
383
|
+
key: "hash",
|
|
384
|
+
value: batch[0]!,
|
|
385
|
+
})
|
|
386
|
+
: new Or(
|
|
387
|
+
batch.map(
|
|
388
|
+
(hash) =>
|
|
389
|
+
new StringMatch({
|
|
390
|
+
key: "hash",
|
|
391
|
+
value: hash,
|
|
392
|
+
}),
|
|
393
|
+
),
|
|
394
|
+
),
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
shape: { hash: true },
|
|
398
|
+
},
|
|
399
|
+
);
|
|
400
|
+
try {
|
|
401
|
+
const indexed = await iterator.all();
|
|
402
|
+
for (const entry of indexed) {
|
|
403
|
+
existing.add(entry.value.hash);
|
|
404
|
+
}
|
|
405
|
+
} finally {
|
|
406
|
+
await iterator.close();
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
return existing;
|
|
411
|
+
}
|
|
412
|
+
|
|
288
413
|
async put(
|
|
289
414
|
entry: Entry<any>,
|
|
290
|
-
properties: {
|
|
415
|
+
properties: {
|
|
416
|
+
unique: boolean;
|
|
417
|
+
isHead: boolean;
|
|
418
|
+
toMultiHash: boolean;
|
|
419
|
+
deferIndexWrite?: boolean;
|
|
420
|
+
},
|
|
291
421
|
) {
|
|
292
422
|
if (properties.toMultiHash) {
|
|
293
423
|
const existingHash = entry.hash;
|
|
@@ -322,8 +452,20 @@ export class EntryIndex<T> {
|
|
|
322
452
|
|
|
323
453
|
// add cache after .has check before .has uses the cache
|
|
324
454
|
this.cache.add(entry.hash, entry);
|
|
325
|
-
|
|
326
|
-
|
|
455
|
+
const shallowEntry = entry.toShallow(properties.isHead);
|
|
456
|
+
const shouldDeferIndexWrite =
|
|
457
|
+
properties.deferIndexWrite === true &&
|
|
458
|
+
properties.isHead &&
|
|
459
|
+
entry.meta.type !== EntryType.CUT &&
|
|
460
|
+
entry.meta.next.length === 0;
|
|
461
|
+
|
|
462
|
+
if (shouldDeferIndexWrite) {
|
|
463
|
+
this.pendingIndexWrites.set(entry.hash, shallowEntry);
|
|
464
|
+
this.schedulePendingIndexWriteFlush();
|
|
465
|
+
} else {
|
|
466
|
+
await this.flushPendingWrites(entry.meta.next);
|
|
467
|
+
await this.properties.index.put(shallowEntry);
|
|
468
|
+
}
|
|
327
469
|
|
|
328
470
|
// check if gids has been shadowed, by query all nexts that have a different gid
|
|
329
471
|
if (this.properties.onGidRemoved && entry.meta.next.length > 0) {
|
|
@@ -388,10 +530,18 @@ export class EntryIndex<T> {
|
|
|
388
530
|
throw new Error("Shallow hash doesn't match the key");
|
|
389
531
|
}
|
|
390
532
|
|
|
391
|
-
|
|
533
|
+
const pending = this.pendingIndexWrites.get(k);
|
|
534
|
+
from = from || pending || (await this.getShallow(k))?.value;
|
|
392
535
|
if (!from) {
|
|
393
536
|
return; // already deleted
|
|
394
537
|
}
|
|
538
|
+
if (pending) {
|
|
539
|
+
this.pendingIndexWrites.delete(k);
|
|
540
|
+
await this.properties.store.rm(k);
|
|
541
|
+
this._length--;
|
|
542
|
+
await this.privateUpdateNextHeadProperty(from, true);
|
|
543
|
+
return from;
|
|
544
|
+
}
|
|
395
545
|
|
|
396
546
|
let deleted = await this.properties.index.del({ query: { hash: k } });
|
|
397
547
|
await this.properties.store.rm(k);
|
|
@@ -406,7 +556,13 @@ export class EntryIndex<T> {
|
|
|
406
556
|
}
|
|
407
557
|
|
|
408
558
|
async getMemoryUsage() {
|
|
409
|
-
|
|
559
|
+
const indexed =
|
|
560
|
+
(await this.properties.index.sum({ key: "payloadSize" })) || 0;
|
|
561
|
+
const pending = [...this.pendingIndexWrites.values()].reduce(
|
|
562
|
+
(sum, entry) => sum + (entry.payloadSize || 0),
|
|
563
|
+
0,
|
|
564
|
+
);
|
|
565
|
+
return typeof indexed === "bigint" ? indexed + BigInt(pending) : indexed + pending;
|
|
410
566
|
}
|
|
411
567
|
|
|
412
568
|
private async privateUpdateNextHeadProperty(
|
|
@@ -419,7 +575,10 @@ export class EntryIndex<T> {
|
|
|
419
575
|
}
|
|
420
576
|
|
|
421
577
|
for (const next of from.meta.next) {
|
|
422
|
-
const
|
|
578
|
+
const pending = this.pendingIndexWrites.get(next);
|
|
579
|
+
const indexedEntry = pending
|
|
580
|
+
? { id: toId(next), value: pending }
|
|
581
|
+
: await this.properties.index.get(toId(next));
|
|
423
582
|
|
|
424
583
|
if (!indexedEntry) {
|
|
425
584
|
continue; // we could end up here because another entry with same next ref is of CUT and has removed it from the index
|
|
@@ -429,13 +588,17 @@ export class EntryIndex<T> {
|
|
|
429
588
|
const noPointersToNext = (await this.countHasNext(next)) === 0;
|
|
430
589
|
if (noPointersToNext) {
|
|
431
590
|
indexedEntry.value.head = true;
|
|
432
|
-
if (
|
|
591
|
+
if (pending) {
|
|
592
|
+
this.pendingIndexWrites.set(next, indexedEntry.value);
|
|
593
|
+
} else {
|
|
433
594
|
await this.properties.index.put(indexedEntry.value);
|
|
434
595
|
}
|
|
435
596
|
}
|
|
436
597
|
} else {
|
|
437
598
|
indexedEntry.value.head = false;
|
|
438
|
-
if (
|
|
599
|
+
if (pending) {
|
|
600
|
+
this.pendingIndexWrites.set(next, indexedEntry.value);
|
|
601
|
+
} else {
|
|
439
602
|
await this.properties.index.put(indexedEntry.value);
|
|
440
603
|
}
|
|
441
604
|
}
|
|
@@ -443,16 +606,23 @@ export class EntryIndex<T> {
|
|
|
443
606
|
}
|
|
444
607
|
|
|
445
608
|
async clear() {
|
|
609
|
+
this.clearPendingIndexFlushTimer();
|
|
610
|
+
const hashes = new Set<string>(this.pendingIndexWrites.keys());
|
|
446
611
|
const iterator = this.iterate([], undefined, false);
|
|
447
612
|
while (!iterator.done()) {
|
|
448
613
|
const results = await iterator.next(100);
|
|
449
614
|
for (const result of results) {
|
|
450
|
-
|
|
615
|
+
hashes.add(result.hash);
|
|
451
616
|
}
|
|
452
617
|
}
|
|
618
|
+
this.pendingIndexWrites.clear();
|
|
619
|
+
for (const hash of hashes) {
|
|
620
|
+
await this.properties.store.rm(hash);
|
|
621
|
+
}
|
|
453
622
|
await this.properties.index.drop();
|
|
454
623
|
await this.properties.index.start();
|
|
455
624
|
this.cache.clear();
|
|
625
|
+
this._length = 0;
|
|
456
626
|
}
|
|
457
627
|
|
|
458
628
|
get length() {
|
|
@@ -463,6 +633,8 @@ export class EntryIndex<T> {
|
|
|
463
633
|
}
|
|
464
634
|
|
|
465
635
|
async init() {
|
|
636
|
+
this.clearPendingIndexFlushTimer();
|
|
637
|
+
this.pendingIndexWrites.clear();
|
|
466
638
|
this._length = await this.properties.index.getSize();
|
|
467
639
|
this.initialied = true;
|
|
468
640
|
}
|
package/src/entry-v0.ts
CHANGED
|
@@ -338,8 +338,7 @@ export class EntryV0<T>
|
|
|
338
338
|
return false;
|
|
339
339
|
}
|
|
340
340
|
|
|
341
|
-
const
|
|
342
|
-
const signableBytes = serialize(signable);
|
|
341
|
+
const signableBytes = this.getSignableBytes();
|
|
343
342
|
for (const signature of signatures) {
|
|
344
343
|
if (!(await verify(signature, signableBytes))) {
|
|
345
344
|
return false;
|
|
@@ -371,6 +370,10 @@ export class EntryV0<T>
|
|
|
371
370
|
return EntryV0.toSignable(this);
|
|
372
371
|
}
|
|
373
372
|
|
|
373
|
+
override getSignableBytes(): Uint8Array {
|
|
374
|
+
return serialize(EntryV0.toSignable(this));
|
|
375
|
+
}
|
|
376
|
+
|
|
374
377
|
equals(other: Entry<T>) {
|
|
375
378
|
if (other instanceof EntryV0) {
|
|
376
379
|
return (
|
|
@@ -533,7 +536,7 @@ export class EntryV0<T>
|
|
|
533
536
|
properties.identity.sign.bind(properties.identity),
|
|
534
537
|
];
|
|
535
538
|
|
|
536
|
-
const signableBytes =
|
|
539
|
+
const signableBytes = entry.getSignableBytes();
|
|
537
540
|
let signatures = await Promise.all(
|
|
538
541
|
signers.map((signer) => signer(signableBytes)),
|
|
539
542
|
);
|
package/src/entry.ts
CHANGED
|
@@ -49,6 +49,14 @@ export abstract class Entry<T> {
|
|
|
49
49
|
abstract getPayloadValue(): Promise<T> | T;
|
|
50
50
|
abstract toSignable(): Entry<T>;
|
|
51
51
|
|
|
52
|
+
getSignableBytes(): Uint8Array {
|
|
53
|
+
return serialize(this.toSignable());
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
getStorageBytes(): Uint8Array {
|
|
57
|
+
return serialize(this);
|
|
58
|
+
}
|
|
59
|
+
|
|
52
60
|
async getPublicKeys(): Promise<PublicSignKey[]> {
|
|
53
61
|
const signatures = await this.getSignatures();
|
|
54
62
|
return signatures.map((s) => s.publicKey);
|
|
@@ -76,7 +84,7 @@ export abstract class Entry<T> {
|
|
|
76
84
|
throw new Error("Expected hash to be missing");
|
|
77
85
|
}
|
|
78
86
|
|
|
79
|
-
const bytes =
|
|
87
|
+
const bytes = entry.getStorageBytes();
|
|
80
88
|
entry.size = bytes.length;
|
|
81
89
|
return store.put(bytes);
|
|
82
90
|
}
|
package/src/log.ts
CHANGED
|
@@ -70,6 +70,7 @@ export type LogProperties<T> = {
|
|
|
70
70
|
keychain?: CryptoKeychain;
|
|
71
71
|
encoding?: Encoding<T>;
|
|
72
72
|
clock?: LamportClock;
|
|
73
|
+
appendDurability?: AppendDurability;
|
|
73
74
|
sortFn?: Sorting.SortFn;
|
|
74
75
|
trim?: TrimOptions;
|
|
75
76
|
canAppend?: CanAppend<T>;
|
|
@@ -81,7 +82,11 @@ export type LogProperties<T> = {
|
|
|
81
82
|
|
|
82
83
|
export type LogOptions<T> = LogProperties<T> & LogEvents<T> & MemoryProperties;
|
|
83
84
|
|
|
85
|
+
export type AppendDurability = "strict" | "buffered";
|
|
86
|
+
|
|
84
87
|
export type AppendOptions<T> = {
|
|
88
|
+
durability?: AppendDurability;
|
|
89
|
+
deferIndexWrite?: boolean;
|
|
85
90
|
meta?: {
|
|
86
91
|
type?: EntryType;
|
|
87
92
|
gidSeed?: Uint8Array;
|
|
@@ -159,6 +164,7 @@ export class Log<T> {
|
|
|
159
164
|
private _closeController!: AbortController;
|
|
160
165
|
private _loadedOnce = false;
|
|
161
166
|
private _indexer!: Indices;
|
|
167
|
+
private _appendDurability!: AppendDurability;
|
|
162
168
|
private _joining!: Map<string, Promise<any>>; // entry hashes that are currently joining into this log
|
|
163
169
|
private _sortFn!: Sorting.SortFn;
|
|
164
170
|
|
|
@@ -227,6 +233,11 @@ export class Log<T> {
|
|
|
227
233
|
resolveRemotePeers,
|
|
228
234
|
});
|
|
229
235
|
await this._entryIndex.init();
|
|
236
|
+
this._appendDurability =
|
|
237
|
+
options.appendDurability ??
|
|
238
|
+
((await this._entryIndex.properties.index.persisted())
|
|
239
|
+
? "strict"
|
|
240
|
+
: "buffered");
|
|
230
241
|
/* this._values = new Values(this._entryIndex, this._sortFn); */
|
|
231
242
|
|
|
232
243
|
this._trim = new Trim(
|
|
@@ -562,6 +573,11 @@ export class Log<T> {
|
|
|
562
573
|
unique: true,
|
|
563
574
|
isHead: true,
|
|
564
575
|
toMultiHash: false,
|
|
576
|
+
deferIndexWrite:
|
|
577
|
+
options.deferIndexWrite ??
|
|
578
|
+
(options.durability
|
|
579
|
+
? options.durability === "buffered"
|
|
580
|
+
: this._appendDurability === "buffered"),
|
|
565
581
|
});
|
|
566
582
|
|
|
567
583
|
const pendingDeletes: (
|
|
@@ -681,17 +697,33 @@ export class Log<T> {
|
|
|
681
697
|
for (const element of entries) references.set(element.hash, element);
|
|
682
698
|
} else if (Array.isArray(entriesOrLog)) {
|
|
683
699
|
if (entriesOrLog.length === 0) return;
|
|
700
|
+
const existingHashes = options?.reset
|
|
701
|
+
? new Set<string>()
|
|
702
|
+
: await this.entryIndex.hasMany(
|
|
703
|
+
entriesOrLog.map((element) =>
|
|
704
|
+
typeof element === "string"
|
|
705
|
+
? element
|
|
706
|
+
: element instanceof Entry
|
|
707
|
+
? element.hash
|
|
708
|
+
: element instanceof ShallowEntry
|
|
709
|
+
? element.hash
|
|
710
|
+
: element.entry.hash,
|
|
711
|
+
),
|
|
712
|
+
);
|
|
684
713
|
|
|
685
714
|
entries = [];
|
|
686
715
|
for (const element of entriesOrLog) {
|
|
687
716
|
if (element instanceof Entry) {
|
|
717
|
+
if (existingHashes.has(element.hash)) {
|
|
718
|
+
continue;
|
|
719
|
+
}
|
|
688
720
|
entries.push(element);
|
|
689
721
|
references.set(element.hash, element);
|
|
690
722
|
continue;
|
|
691
723
|
}
|
|
692
724
|
|
|
693
725
|
if (typeof element === "string") {
|
|
694
|
-
if (
|
|
726
|
+
if (existingHashes.has(element)) {
|
|
695
727
|
continue; // already in log
|
|
696
728
|
}
|
|
697
729
|
|
|
@@ -709,10 +741,7 @@ export class Log<T> {
|
|
|
709
741
|
}
|
|
710
742
|
|
|
711
743
|
if (element instanceof ShallowEntry) {
|
|
712
|
-
if (
|
|
713
|
-
(await this.entryIndex.getShallow(element.hash)) != null &&
|
|
714
|
-
!options?.reset
|
|
715
|
-
) {
|
|
744
|
+
if (existingHashes.has(element.hash)) {
|
|
716
745
|
continue; // already in log
|
|
717
746
|
}
|
|
718
747
|
|
|
@@ -1063,6 +1092,7 @@ export class Log<T> {
|
|
|
1063
1092
|
// Don't return early here if closed = true, because "load" might create processes that needs to be closed
|
|
1064
1093
|
this._closed = true; // closed = true before doing below, else we might try to open the headsIndex cache because it is closed as we assume log is still open
|
|
1065
1094
|
this._closeController.abort();
|
|
1095
|
+
await this._entryIndex.flushPendingWrites();
|
|
1066
1096
|
await this._indexer?.stop?.();
|
|
1067
1097
|
this._indexer = undefined as any;
|
|
1068
1098
|
this._loadedOnce = false;
|
package/src/trim.ts
CHANGED
|
@@ -137,11 +137,10 @@ export class Trim<T> {
|
|
|
137
137
|
}
|
|
138
138
|
done = async () => this._log.getLength() <= to;
|
|
139
139
|
} else if (option.type === "bytelength") {
|
|
140
|
-
//
|
|
140
|
+
// Include buffered head-index writes so trim decisions stay correct for
|
|
141
|
+
// ephemeral/buffered append durability too.
|
|
141
142
|
const byteLengthFn = async () =>
|
|
142
|
-
BigInt(
|
|
143
|
-
await this._log.index.properties.index.sum({ key: "payloadSize" }),
|
|
144
|
-
);
|
|
143
|
+
BigInt(await this._log.index.getMemoryUsage());
|
|
145
144
|
|
|
146
145
|
// prune to max sum payload sizes in bytes
|
|
147
146
|
const byteLengthFrom = BigInt(option.from ?? option.to);
|