@peerbit/log 6.0.7-dac5207 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"trim.js","sourceRoot":"","sources":["../../src/trim.ts"],"names":[],"mappings":"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"}
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.7-dac5207",
3
+ "version": "6.0.8",
4
4
  "description": "Append-only log CRDT",
5
5
  "author": "dao.xyz",
6
6
  "license": "MIT",
@@ -61,19 +61,6 @@
61
61
  ],
62
62
  "dependencies": {
63
63
  "@dao-xyz/borsh": "^6.0.0",
64
- "@peerbit/any-store": "2.2.5-dac5207",
65
- "@peerbit/blocks": "4.0.3-dac5207",
66
- "@peerbit/blocks-interface": "2.0.1-dac5207",
67
- "@peerbit/cache": "3.0.0-dac5207",
68
- "@peerbit/crypto": "3.0.0-dac5207",
69
- "@peerbit/indexer-sqlite3": "3.0.0-dac5207",
70
- "@peerbit/indexer-interface": "3.0.0-dac5207",
71
- "@peerbit/indexer-simple": "1.2.3-dac5207",
72
- "@peerbit/keychain": "1.2.5-dac5207",
73
- "@peerbit/pubsub-interface": "5.0.2-dac5207",
74
- "@peerbit/stream-interface": "6.0.1-dac5207",
75
- "@peerbit/logger": "2.0.0-dac5207",
76
- "@peerbit/time": "3.0.0-dac5207",
77
64
  "libsodium-wrappers": "0.7.15",
78
65
  "libp2p": "^3.1.0",
79
66
  "pidusage": "^4.0.1",
@@ -81,16 +68,29 @@
81
68
  "path-browserify": "^1.0.1",
82
69
  "pino": "^9.4.0",
83
70
  "uuid": "^10.0.0",
84
- "uint8arrays": "^5.1.0"
71
+ "uint8arrays": "^5.1.0",
72
+ "@peerbit/blocks": "4.0.3",
73
+ "@peerbit/cache": "3.0.0",
74
+ "@peerbit/crypto": "3.0.0",
75
+ "@peerbit/any-store": "2.2.5",
76
+ "@peerbit/blocks-interface": "2.0.1",
77
+ "@peerbit/indexer-sqlite3": "3.0.1",
78
+ "@peerbit/indexer-simple": "1.2.3",
79
+ "@peerbit/pubsub-interface": "5.0.2",
80
+ "@peerbit/indexer-interface": "3.0.0",
81
+ "@peerbit/keychain": "1.2.5",
82
+ "@peerbit/logger": "2.0.0",
83
+ "@peerbit/time": "3.0.0",
84
+ "@peerbit/stream-interface": "6.0.1"
85
85
  },
86
86
  "devDependencies": {
87
- "@peerbit/test-utils": "3.0.7-dac5207",
88
87
  "@types/libsodium-wrappers": "^0.7.14",
89
88
  "@types/pidusage": "^2.0.5",
90
89
  "@types/path-browserify": "^1.0.2",
91
90
  "assert": "^2.0.0",
92
91
  "json-stringify-deterministic": "^1.0.7",
93
- "tty-table": "^4.2.1"
92
+ "tty-table": "^4.2.1",
93
+ "@peerbit/test-utils": "3.0.8"
94
94
  },
95
95
  "contributors": [
96
96
  "haadcode",
@@ -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
- const iterator = this.properties.index.iterate(
176
- { query, sort },
177
- { shape: nextShape },
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 iterator.next(amount);
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 iterator.all();
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: iterator.close,
215
- done: iterator.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: { unique: boolean; isHead: boolean; toMultiHash: boolean },
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
- await this.properties.index.put(entry.toShallow(properties.isHead));
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
- from = from || (await this.getShallow(k))?.value;
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
- return this.properties.index.sum({ key: "payloadSize" });
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 indexedEntry = await this.properties.index.get(toId(next));
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 (indexedEntry) {
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 (indexedEntry) {
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
- await this.delete(result.hash);
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 signable = EntryV0.toSignable(this);
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 = serialize(entry.toSignable());
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 = serialize(entry);
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 ((await this.entryIndex.getShallow(element)) != null && !options?.reset) {
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
- // TODO calculate the sum and cache it and update it only when entries are added or removed
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);