@peerbit/log 6.0.7 → 6.0.9

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=payload-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-path.d.ts","sourceRoot":"","sources":["../../benchmark/payload-path.ts"],"names":[],"mappings":""}
@@ -0,0 +1,276 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { field, serialize, variant } from "@dao-xyz/borsh";
36
+ import { AnyBlockStore } from "@peerbit/blocks";
37
+ import { DecryptedThing, Ed25519Keypair, createLocalEncryptProvider, randomBytes, ready, } from "@peerbit/crypto";
38
+ import { DataMessage, MessageHeader, SilentDelivery, } from "@peerbit/stream-interface";
39
+ import { BORSH_ENCODING } from "../src/encoding.js";
40
+ import { EntryV0, Meta, Signatures } from "../src/entry-v0.js";
41
+ import { EntryType } from "../src/entry-type.js";
42
+ import { Payload } from "../src/payload.js";
43
+ let BenchDocument = (() => {
44
+ let _classDecorators = [variant("bench-document")];
45
+ let _classDescriptor;
46
+ let _classExtraInitializers = [];
47
+ let _classThis;
48
+ let _id_decorators;
49
+ let _id_initializers = [];
50
+ let _id_extraInitializers = [];
51
+ let _bytes_decorators;
52
+ let _bytes_initializers = [];
53
+ let _bytes_extraInitializers = [];
54
+ var BenchDocument = class {
55
+ static { _classThis = this; }
56
+ static {
57
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
58
+ _id_decorators = [field({ type: "string" })];
59
+ _bytes_decorators = [field({ type: Uint8Array })];
60
+ __esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
61
+ __esDecorate(null, null, _bytes_decorators, { kind: "field", name: "bytes", static: false, private: false, access: { has: obj => "bytes" in obj, get: obj => obj.bytes, set: (obj, value) => { obj.bytes = value; } }, metadata: _metadata }, _bytes_initializers, _bytes_extraInitializers);
62
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
63
+ BenchDocument = _classThis = _classDescriptor.value;
64
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
65
+ __runInitializers(_classThis, _classExtraInitializers);
66
+ }
67
+ id = __runInitializers(this, _id_initializers, void 0);
68
+ bytes = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _bytes_initializers, void 0));
69
+ constructor(props) {
70
+ __runInitializers(this, _bytes_extraInitializers);
71
+ this.id = props.id;
72
+ this.bytes = props.bytes;
73
+ }
74
+ };
75
+ return BenchDocument = _classThis;
76
+ })();
77
+ let BenchPutOperation = (() => {
78
+ let _classDecorators = [variant(3)];
79
+ let _classDescriptor;
80
+ let _classExtraInitializers = [];
81
+ let _classThis;
82
+ let _data_decorators;
83
+ let _data_initializers = [];
84
+ let _data_extraInitializers = [];
85
+ var BenchPutOperation = class {
86
+ static { _classThis = this; }
87
+ static {
88
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
89
+ _data_decorators = [field({ type: Uint8Array })];
90
+ __esDecorate(null, null, _data_decorators, { kind: "field", name: "data", static: false, private: false, access: { has: obj => "data" in obj, get: obj => obj.data, set: (obj, value) => { obj.data = value; } }, metadata: _metadata }, _data_initializers, _data_extraInitializers);
91
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
92
+ BenchPutOperation = _classThis = _classDescriptor.value;
93
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
94
+ __runInitializers(_classThis, _classExtraInitializers);
95
+ }
96
+ data = __runInitializers(this, _data_initializers, void 0);
97
+ constructor(props) {
98
+ __runInitializers(this, _data_extraInitializers);
99
+ this.data = props.data;
100
+ }
101
+ };
102
+ return BenchPutOperation = _classThis;
103
+ })();
104
+ const BENCH_OPERATION_ENCODING = BORSH_ENCODING(BenchPutOperation);
105
+ const parseArgs = (argv) => {
106
+ const out = {};
107
+ for (let i = 0; i < argv.length; i++) {
108
+ const arg = argv[i];
109
+ if (arg === "--" || !arg.startsWith("--")) {
110
+ continue;
111
+ }
112
+ const value = argv[i + 1];
113
+ if (value == null || value.startsWith("--")) {
114
+ throw new Error(`Missing value for ${arg}`);
115
+ }
116
+ out[arg.slice(2)] = value;
117
+ i++;
118
+ }
119
+ return out;
120
+ };
121
+ const measure = async (fn) => {
122
+ const started = performance.now();
123
+ const value = await fn();
124
+ return {
125
+ value,
126
+ ms: Number((performance.now() - started).toFixed(3)),
127
+ };
128
+ };
129
+ const formatBytes = (value) => Number(value.toFixed(2));
130
+ const toUint8Array = (bytes) => (bytes instanceof Uint8Array ? bytes : bytes.subarray());
131
+ const summarize = async (payloadBytes) => {
132
+ const key = await Ed25519Keypair.create();
133
+ const symmetricKey = randomBytes(32);
134
+ const encryptionProvider = createLocalEncryptProvider(symmetricKey);
135
+ const documentEncoding = BORSH_ENCODING(BenchDocument);
136
+ const document = new BenchDocument({
137
+ id: `doc-${payloadBytes}`,
138
+ bytes: randomBytes(payloadBytes),
139
+ });
140
+ const store = new AnyBlockStore();
141
+ await store.start();
142
+ try {
143
+ const encodedDocument = await measure(() => documentEncoding.encoder(document));
144
+ const operation = new BenchPutOperation({ data: encodedDocument.value });
145
+ const encodedOperation = await measure(() => BENCH_OPERATION_ENCODING.encoder(operation));
146
+ const payload = new Payload({
147
+ data: encodedOperation.value,
148
+ value: operation,
149
+ encoding: BENCH_OPERATION_ENCODING,
150
+ });
151
+ const encodedPayload = await measure(() => serialize(payload));
152
+ const meta = new Meta({
153
+ clock: new (await import("../src/clock.js")).LamportClock({
154
+ id: key.publicKey.bytes,
155
+ }),
156
+ gid: "gid-bench",
157
+ type: EntryType.APPEND,
158
+ next: [],
159
+ });
160
+ const encodedMeta = await measure(() => serialize(meta));
161
+ const unsignedEntry = new EntryV0({
162
+ meta: new DecryptedThing({ data: encodedMeta.value, value: meta }),
163
+ payload: new DecryptedThing({ data: encodedPayload.value, value: payload }),
164
+ signatures: undefined,
165
+ createdLocally: true,
166
+ });
167
+ const signable = await measure(() => unsignedEntry.getSignableBytes());
168
+ const signature = await measure(() => key.sign(signable.value));
169
+ const encodedSignature = await measure(() => serialize(signature.value));
170
+ const entry = new EntryV0({
171
+ meta: unsignedEntry._meta,
172
+ payload: unsignedEntry._payload,
173
+ signatures: new Signatures({
174
+ signatures: [
175
+ new DecryptedThing({
176
+ data: encodedSignature.value,
177
+ value: signature.value,
178
+ }),
179
+ ],
180
+ }),
181
+ createdLocally: true,
182
+ });
183
+ const encodedEntry = await measure(() => entry.getStorageBytes());
184
+ const storedEntry = await measure(async () => store.put(encodedEntry.value));
185
+ const message = new DataMessage({
186
+ header: new MessageHeader({
187
+ session: 1,
188
+ mode: new SilentDelivery({ to: [], redundancy: 1 }),
189
+ }),
190
+ data: encodedEntry.value,
191
+ });
192
+ const genericEncodedMessage = await measure(() => serialize(message));
193
+ const encodedMessage = await measure(() => message.bytes());
194
+ const encodedMessageBytes = toUint8Array(encodedMessage.value);
195
+ if (genericEncodedMessage.value.byteLength !== encodedMessageBytes.byteLength ||
196
+ !genericEncodedMessage.value.every((byte, index) => byte === encodedMessageBytes[index])) {
197
+ throw new Error("Optimized message bytes do not match");
198
+ }
199
+ const encryptedMessage = await measure(() => encryptionProvider(encodedMessageBytes, { type: "hash" }));
200
+ const totalSerializedBytes = encodedDocument.value.byteLength +
201
+ encodedOperation.value.byteLength +
202
+ encodedPayload.value.byteLength +
203
+ signable.value.byteLength +
204
+ encodedEntry.value.byteLength +
205
+ encodedMessageBytes.byteLength +
206
+ encryptedMessage.value.cipher.byteLength;
207
+ return {
208
+ payloadBytes,
209
+ stages: {
210
+ documentEncodeMs: encodedDocument.ms,
211
+ operationEncodeMs: encodedOperation.ms,
212
+ payloadEncodeMs: encodedPayload.ms,
213
+ metaEncodeMs: encodedMeta.ms,
214
+ signableEncodeMs: signable.ms,
215
+ signMs: signature.ms,
216
+ signatureEncodeMs: encodedSignature.ms,
217
+ entryEncodeMs: encodedEntry.ms,
218
+ blockPutMs: storedEntry.ms,
219
+ messageEncodeGenericMs: genericEncodedMessage.ms,
220
+ messageEncodeMs: encodedMessage.ms,
221
+ symmetricEncryptMs: encryptedMessage.ms,
222
+ },
223
+ sizes: {
224
+ documentBytes: encodedDocument.value.byteLength,
225
+ operationBytes: encodedOperation.value.byteLength,
226
+ payloadBytes: encodedPayload.value.byteLength,
227
+ signableBytes: signable.value.byteLength,
228
+ entryBytes: encodedEntry.value.byteLength,
229
+ messageBytes: encodedMessageBytes.byteLength,
230
+ encryptedBytes: encryptedMessage.value.cipher.byteLength,
231
+ },
232
+ amplification: {
233
+ operationOverDocument: formatBytes(encodedOperation.value.byteLength / encodedDocument.value.byteLength),
234
+ payloadOverDocument: formatBytes(encodedPayload.value.byteLength / encodedDocument.value.byteLength),
235
+ entryOverDocument: formatBytes(encodedEntry.value.byteLength / encodedDocument.value.byteLength),
236
+ messageOverDocument: formatBytes(encodedMessage.value.byteLength / encodedDocument.value.byteLength),
237
+ totalSerializedOverDocument: formatBytes(totalSerializedBytes / encodedDocument.value.byteLength),
238
+ },
239
+ };
240
+ }
241
+ finally {
242
+ await store.stop();
243
+ }
244
+ };
245
+ const main = async () => {
246
+ await ready;
247
+ const args = parseArgs(process.argv.slice(2));
248
+ const sizes = (args.sizes ?? "4096,262144,1048576")
249
+ .split(",")
250
+ .map((value) => Number(value.trim()))
251
+ .filter((value) => Number.isFinite(value) && value > 0);
252
+ const results = [];
253
+ for (const payloadBytes of sizes) {
254
+ console.log(`Running payload-path benchmark payloadBytes=${payloadBytes}`);
255
+ results.push(await summarize(payloadBytes));
256
+ }
257
+ console.table(results.map((result) => ({
258
+ payloadBytes: result.payloadBytes,
259
+ documentEncodeMs: result.stages.documentEncodeMs,
260
+ operationEncodeMs: result.stages.operationEncodeMs,
261
+ payloadEncodeMs: result.stages.payloadEncodeMs,
262
+ signableEncodeMs: result.stages.signableEncodeMs,
263
+ entryEncodeMs: result.stages.entryEncodeMs,
264
+ blockPutMs: result.stages.blockPutMs,
265
+ messageEncodeGenericMs: result.stages.messageEncodeGenericMs,
266
+ messageEncodeMs: result.stages.messageEncodeMs,
267
+ symmetricEncryptMs: result.stages.symmetricEncryptMs,
268
+ totalSerializedOverDocument: result.amplification.totalSerializedOverDocument,
269
+ })));
270
+ console.log(JSON.stringify(results, null, 2));
271
+ };
272
+ main().catch((error) => {
273
+ console.error(error);
274
+ process.exitCode = 1;
275
+ });
276
+ //# sourceMappingURL=payload-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-path.js","sourceRoot":"","sources":["../../benchmark/payload-path.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,8 @@ export declare class EntryIndex<T> {
47
47
  private initialied;
48
48
  private _length;
49
49
  private insertionPromises;
50
+ private pendingIndexWrites;
51
+ private pendingIndexFlushTimer?;
50
52
  constructor(properties: {
51
53
  store: Blocks;
52
54
  publicKey: PublicSignKey;
@@ -59,21 +61,30 @@ export declare class EntryIndex<T> {
59
61
  signal?: AbortSignal;
60
62
  }) => Promise<string[] | undefined> | string[] | undefined;
61
63
  });
64
+ private schedulePendingIndexWriteFlush;
65
+ private clearPendingIndexFlushTimer;
66
+ flushPendingWrites(hashes?: Iterable<string>): Promise<void>;
62
67
  getHeads<R extends MaybeResolveOptions = false>(gid?: string, resolve?: R): ResultsIterator<ReturnTypeFromResolveOptions<R, T>>;
63
68
  getHasNext<R extends MaybeResolveOptions>(next: string, resolve?: R): ResultsIterator<ReturnTypeFromResolveOptions<R, T>>;
64
- countHasNext(next: string, excludeHash?: string | undefined): number | Promise<number>;
69
+ countHasNext(next: string, excludeHash?: string | undefined): Promise<number>;
70
+ private _countHasNext;
65
71
  iterate<R extends MaybeResolveOptions>(query: Query[], sort?: Sort[], options?: R): ResultsIterator<ReturnTypeFromResolveOptions<R, T>>;
66
72
  getOldest<T extends boolean, R = T extends true ? Entry<any> : ShallowEntry>(resolve?: T): Promise<R | undefined>;
67
73
  getNewest<T extends boolean, R = T extends true ? Entry<any> : ShallowEntry>(resolve?: T): Promise<R | undefined>;
68
74
  getBefore<T extends boolean, R = T extends true ? Entry<any> : ShallowEntry>(before: ShallowOrFullEntry<any>, resolve?: T): Promise<R | undefined>;
69
75
  getAfter<T extends boolean, R = T extends true ? Entry<any> : ShallowEntry>(before: ShallowOrFullEntry<any>, resolve?: T): Promise<R | undefined>;
70
76
  get(k: string, options?: ResolveFullyOptions): Promise<Entry<T> | undefined>;
71
- getShallow(k: string): Promise<import("@peerbit/indexer-interface").IndexedResult<ShallowEntry> | undefined>;
77
+ getShallow(k: string): Promise<{
78
+ id: import("@peerbit/indexer-interface").IdKey;
79
+ value: ShallowEntry;
80
+ } | undefined>;
72
81
  has(k: string): Promise<boolean>;
82
+ hasMany(hashes: Iterable<string>): Promise<Set<string>>;
73
83
  put(entry: Entry<any>, properties: {
74
84
  unique: boolean;
75
85
  isHead: boolean;
76
86
  toMultiHash: boolean;
87
+ deferIndexWrite?: boolean;
77
88
  }): Promise<void>;
78
89
  delete(k: string, from?: Entry<any> | ShallowEntry): Promise<ShallowEntry | Entry<any> | undefined>;
79
90
  getMemoryUsage(): Promise<number | bigint>;
@@ -1 +1 @@
1
- {"version":3,"file":"entry-index.d.ts","sourceRoot":"","sources":["../../src/entry-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entry-index.d.ts","sourceRoot":"","sources":["../../src/entry-index.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import { Entry } from "./entry.js";
7
7
  import { logger as baseLogger } from "./logger.js";
8
8
  const log = baseLogger.newScope("entry-index");
9
9
  const ENTRY_CACHE_MAX_SIZE = 10; // TODO as param for log
10
+ const DEFERRED_INDEX_FLUSH_IDLE_MS = 250;
10
11
  export class EntryIndex {
11
12
  properties;
12
13
  cache;
@@ -14,6 +15,8 @@ export class EntryIndex {
14
15
  initialied = false;
15
16
  _length;
16
17
  insertionPromises;
18
+ pendingIndexWrites;
19
+ pendingIndexFlushTimer;
17
20
  constructor(properties) {
18
21
  this.properties = properties;
19
22
  this.sortReversed = properties.sort.sort.map((x) => deserialize(serialize(x), Sort));
@@ -24,6 +27,45 @@ export class EntryIndex {
24
27
  this.cache = properties.cache ?? new Cache({ max: ENTRY_CACHE_MAX_SIZE });
25
28
  this._length = 0;
26
29
  this.insertionPromises = new Map();
30
+ this.pendingIndexWrites = new Map();
31
+ }
32
+ schedulePendingIndexWriteFlush() {
33
+ if (this.pendingIndexFlushTimer) {
34
+ clearTimeout(this.pendingIndexFlushTimer);
35
+ }
36
+ this.pendingIndexFlushTimer = setTimeout(() => {
37
+ void this.flushPendingWrites().catch((error) => {
38
+ log.error("Failed to flush deferred entry-index writes", error);
39
+ });
40
+ }, DEFERRED_INDEX_FLUSH_IDLE_MS);
41
+ this.pendingIndexFlushTimer.unref?.();
42
+ }
43
+ clearPendingIndexFlushTimer() {
44
+ if (!this.pendingIndexFlushTimer) {
45
+ return;
46
+ }
47
+ clearTimeout(this.pendingIndexFlushTimer);
48
+ this.pendingIndexFlushTimer = undefined;
49
+ }
50
+ async flushPendingWrites(hashes) {
51
+ const keys = hashes
52
+ ? [...new Set([...hashes].filter((hash) => !!hash))]
53
+ : [...this.pendingIndexWrites.keys()];
54
+ if (keys.length === 0) {
55
+ return;
56
+ }
57
+ this.clearPendingIndexFlushTimer();
58
+ for (const hash of keys) {
59
+ const pending = this.pendingIndexWrites.get(hash);
60
+ if (!pending) {
61
+ continue;
62
+ }
63
+ await this.properties.index.put(pending);
64
+ this.pendingIndexWrites.delete(hash);
65
+ }
66
+ if (this.pendingIndexWrites.size > 0) {
67
+ this.schedulePendingIndexWriteFlush();
68
+ }
27
69
  }
28
70
  getHeads(gid, resolve = false) {
29
71
  const query = [];
@@ -50,6 +92,10 @@ export class EntryIndex {
50
92
  return this.iterate(query, undefined, resolve);
51
93
  }
52
94
  countHasNext(next, excludeHash = undefined) {
95
+ return this._countHasNext(next, excludeHash);
96
+ }
97
+ async _countHasNext(next, excludeHash = undefined) {
98
+ await this.flushPendingWrites();
53
99
  const query = [
54
100
  new StringMatch({
55
101
  key: ["meta", "next"],
@@ -80,13 +126,22 @@ export class EntryIndex {
80
126
  let nextShape = resolveInFull
81
127
  ? { hash: true }
82
128
  : options?.shape;
83
- const iterator = this.properties.index.iterate({ query, sort }, { shape: nextShape });
129
+ let iteratorRef;
130
+ let iteratorPromise;
131
+ const getIterator = async () => {
132
+ await this.flushPendingWrites();
133
+ if (!iteratorPromise) {
134
+ iteratorRef = this.properties.index.iterate({ query, sort }, { shape: nextShape });
135
+ iteratorPromise = Promise.resolve(iteratorRef);
136
+ }
137
+ return iteratorPromise;
138
+ };
84
139
  const next = async (amount) => {
85
- const results = await iterator.next(amount);
140
+ const results = await (await getIterator()).next(amount);
86
141
  return coerce(results);
87
142
  };
88
143
  const all = async () => {
89
- const results = await iterator.all();
144
+ const results = await (await getIterator()).all();
90
145
  return coerce(results);
91
146
  };
92
147
  const coerce = async (results) => {
@@ -99,8 +154,8 @@ export class EntryIndex {
99
154
  }
100
155
  };
101
156
  return {
102
- close: iterator.close,
103
- done: iterator.done,
157
+ close: async () => iteratorRef?.close(),
158
+ done: () => iteratorRef?.done(),
104
159
  next,
105
160
  all,
106
161
  };
@@ -133,6 +188,10 @@ export class EntryIndex {
133
188
  return this.resolve(k, options);
134
189
  }
135
190
  async getShallow(k) {
191
+ const pending = this.pendingIndexWrites.get(k);
192
+ if (pending) {
193
+ return { id: toId(k), value: pending };
194
+ }
136
195
  return this.properties.index.get(toId(k));
137
196
  }
138
197
  async has(k) {
@@ -140,11 +199,55 @@ export class EntryIndex {
140
199
  if (mem) {
141
200
  return true;
142
201
  }
202
+ if (this.pendingIndexWrites.has(k)) {
203
+ return true;
204
+ }
143
205
  const result = await this.properties.index.get(toId(k), {
144
206
  shape: { hash: true },
145
207
  });
146
208
  return result != null;
147
209
  }
210
+ async hasMany(hashes) {
211
+ const batchSize = 64;
212
+ const existing = new Set();
213
+ const missing = [];
214
+ for (const hash of new Set([...hashes].filter(Boolean))) {
215
+ if (this.cache.get(hash) || this.pendingIndexWrites.has(hash)) {
216
+ existing.add(hash);
217
+ continue;
218
+ }
219
+ missing.push(hash);
220
+ }
221
+ if (missing.length === 0) {
222
+ return existing;
223
+ }
224
+ for (let i = 0; i < missing.length; i += batchSize) {
225
+ const batch = missing.slice(i, i + batchSize);
226
+ const iterator = this.properties.index.iterate({
227
+ query: batch.length === 1
228
+ ? new StringMatch({
229
+ key: "hash",
230
+ value: batch[0],
231
+ })
232
+ : new Or(batch.map((hash) => new StringMatch({
233
+ key: "hash",
234
+ value: hash,
235
+ }))),
236
+ }, {
237
+ shape: { hash: true },
238
+ });
239
+ try {
240
+ const indexed = await iterator.all();
241
+ for (const entry of indexed) {
242
+ existing.add(entry.value.hash);
243
+ }
244
+ }
245
+ finally {
246
+ await iterator.close();
247
+ }
248
+ }
249
+ return existing;
250
+ }
148
251
  async put(entry, properties) {
149
252
  if (properties.toMultiHash) {
150
253
  const existingHash = entry.hash;
@@ -181,7 +284,19 @@ export class EntryIndex {
181
284
  }
182
285
  // add cache after .has check before .has uses the cache
183
286
  this.cache.add(entry.hash, entry);
184
- await this.properties.index.put(entry.toShallow(properties.isHead));
287
+ const shallowEntry = entry.toShallow(properties.isHead);
288
+ const shouldDeferIndexWrite = properties.deferIndexWrite === true &&
289
+ properties.isHead &&
290
+ entry.meta.type !== EntryType.CUT &&
291
+ entry.meta.next.length === 0;
292
+ if (shouldDeferIndexWrite) {
293
+ this.pendingIndexWrites.set(entry.hash, shallowEntry);
294
+ this.schedulePendingIndexWriteFlush();
295
+ }
296
+ else {
297
+ await this.flushPendingWrites(entry.meta.next);
298
+ await this.properties.index.put(shallowEntry);
299
+ }
185
300
  // check if gids has been shadowed, by query all nexts that have a different gid
186
301
  if (this.properties.onGidRemoved && entry.meta.next.length > 0) {
187
302
  let nextMatches = [];
@@ -227,10 +342,18 @@ export class EntryIndex {
227
342
  if (from && from.hash !== k) {
228
343
  throw new Error("Shallow hash doesn't match the key");
229
344
  }
230
- from = from || (await this.getShallow(k))?.value;
345
+ const pending = this.pendingIndexWrites.get(k);
346
+ from = from || pending || (await this.getShallow(k))?.value;
231
347
  if (!from) {
232
348
  return; // already deleted
233
349
  }
350
+ if (pending) {
351
+ this.pendingIndexWrites.delete(k);
352
+ await this.properties.store.rm(k);
353
+ this._length--;
354
+ await this.privateUpdateNextHeadProperty(from, true);
355
+ return from;
356
+ }
234
357
  let deleted = await this.properties.index.del({ query: { hash: k } });
235
358
  await this.properties.store.rm(k);
236
359
  if (deleted.length > 0) {
@@ -241,7 +364,9 @@ export class EntryIndex {
241
364
  }
242
365
  }
243
366
  async getMemoryUsage() {
244
- return this.properties.index.sum({ key: "payloadSize" });
367
+ const indexed = (await this.properties.index.sum({ key: "payloadSize" })) || 0;
368
+ const pending = [...this.pendingIndexWrites.values()].reduce((sum, entry) => sum + (entry.payloadSize || 0), 0);
369
+ return typeof indexed === "bigint" ? indexed + BigInt(pending) : indexed + pending;
245
370
  }
246
371
  async privateUpdateNextHeadProperty(from, isHead) {
247
372
  if (from.meta.type === EntryType.CUT) {
@@ -249,7 +374,10 @@ export class EntryIndex {
249
374
  return;
250
375
  }
251
376
  for (const next of from.meta.next) {
252
- const indexedEntry = await this.properties.index.get(toId(next));
377
+ const pending = this.pendingIndexWrites.get(next);
378
+ const indexedEntry = pending
379
+ ? { id: toId(next), value: pending }
380
+ : await this.properties.index.get(toId(next));
253
381
  if (!indexedEntry) {
254
382
  continue; // we could end up here because another entry with same next ref is of CUT and has removed it from the index
255
383
  }
@@ -257,30 +385,43 @@ export class EntryIndex {
257
385
  const noPointersToNext = (await this.countHasNext(next)) === 0;
258
386
  if (noPointersToNext) {
259
387
  indexedEntry.value.head = true;
260
- if (indexedEntry) {
388
+ if (pending) {
389
+ this.pendingIndexWrites.set(next, indexedEntry.value);
390
+ }
391
+ else {
261
392
  await this.properties.index.put(indexedEntry.value);
262
393
  }
263
394
  }
264
395
  }
265
396
  else {
266
397
  indexedEntry.value.head = false;
267
- if (indexedEntry) {
398
+ if (pending) {
399
+ this.pendingIndexWrites.set(next, indexedEntry.value);
400
+ }
401
+ else {
268
402
  await this.properties.index.put(indexedEntry.value);
269
403
  }
270
404
  }
271
405
  }
272
406
  }
273
407
  async clear() {
408
+ this.clearPendingIndexFlushTimer();
409
+ const hashes = new Set(this.pendingIndexWrites.keys());
274
410
  const iterator = this.iterate([], undefined, false);
275
411
  while (!iterator.done()) {
276
412
  const results = await iterator.next(100);
277
413
  for (const result of results) {
278
- await this.delete(result.hash);
414
+ hashes.add(result.hash);
279
415
  }
280
416
  }
417
+ this.pendingIndexWrites.clear();
418
+ for (const hash of hashes) {
419
+ await this.properties.store.rm(hash);
420
+ }
281
421
  await this.properties.index.drop();
282
422
  await this.properties.index.start();
283
423
  this.cache.clear();
424
+ this._length = 0;
284
425
  }
285
426
  get length() {
286
427
  if (!this.initialied) {
@@ -289,6 +430,8 @@ export class EntryIndex {
289
430
  return this._length;
290
431
  }
291
432
  async init() {
433
+ this.clearPendingIndexFlushTimer();
434
+ this.pendingIndexWrites.clear();
292
435
  this._length = await this.properties.index.getSize();
293
436
  this.initialied = true;
294
437
  }