@lodestar/db 1.39.1 → 1.40.0-dev.193b2e2047

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.
@@ -22,6 +22,15 @@ export interface KeyValue<K, V> {
22
22
  key: K;
23
23
  value: V;
24
24
  }
25
+ export type DbBatchOperation<K, V> = {
26
+ type: "del";
27
+ key: K;
28
+ } | {
29
+ type: "put";
30
+ key: K;
31
+ value: V;
32
+ };
33
+ export type DbBatch<K, V> = DbBatchOperation<K, V>[];
25
34
  export interface DatabaseController<K, V> {
26
35
  close(): Promise<void>;
27
36
  /** To inject metrics after CLI initialization */
@@ -32,6 +41,7 @@ export interface DatabaseController<K, V> {
32
41
  delete(key: K, opts?: DbReqOpts): Promise<void>;
33
42
  batchPut(items: KeyValue<K, V>[], opts?: DbReqOpts): Promise<void>;
34
43
  batchDelete(keys: K[], opts?: DbReqOpts): Promise<void>;
44
+ batch(batch: DbBatch<K, V>, opts?: DbReqOpts): Promise<void>;
35
45
  keysStream(opts?: FilterOptions<K>): AsyncIterable<K>;
36
46
  keys(opts?: FilterOptions<K>): Promise<K[]>;
37
47
  valuesStream(opts?: FilterOptions<K>): AsyncIterable<V>;
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/controller/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,cAAc,CAAC;AAEtD,uDAAuD;AACvD,MAAM,MAAM,EAAE,GAAG,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,EAAE,CAAC,EAAE,CAAC,CAAC;IACP,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,EAAE,CAAC,EAAE,CAAC,CAAC;IACP,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,kBAAkB;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC;IACP,KAAK,EAAE,CAAC,CAAC;CACV;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC;IAGtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,iDAAiD;IACjD,UAAU,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAIpD,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAEhE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAIhD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAIxD,UAAU,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAE5C,YAAY,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9C,aAAa,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;CAC7D"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/controller/interface.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ClassicLevel } from "classic-level";
2
2
  import { Logger } from "@lodestar/utils";
3
- import { DatabaseController, DatabaseOptions, DbReqOpts, FilterOptions, KeyValue } from "./interface.js";
3
+ import { DatabaseController, DatabaseOptions, DbBatch, DbReqOpts, FilterOptions, KeyValue } from "./interface.js";
4
4
  import { LevelDbControllerMetrics } from "./metrics.js";
5
5
  export interface LevelDBOptions extends DatabaseOptions {
6
6
  db?: ClassicLevel<Uint8Array, Uint8Array>;
@@ -36,6 +36,7 @@ export declare class LevelDbController implements DatabaseController<Uint8Array,
36
36
  delete(key: Uint8Array, opts?: DbReqOpts): Promise<void>;
37
37
  batchPut(items: KeyValue<Uint8Array, Uint8Array>[], opts?: DbReqOpts): Promise<void>;
38
38
  batchDelete(keys: Uint8Array[], opts?: DbReqOpts): Promise<void>;
39
+ batch(batch: DbBatch<Uint8Array, Uint8Array>, opts?: DbReqOpts): Promise<void>;
39
40
  keysStream(opts?: FilterOptions<Uint8Array>): AsyncIterable<Uint8Array>;
40
41
  valuesStream(opts?: FilterOptions<Uint8Array>): AsyncIterable<Uint8Array>;
41
42
  entriesStream(opts?: FilterOptions<Uint8Array>): AsyncIterable<KeyValue<Uint8Array, Uint8Array>>;
@@ -1 +1 @@
1
- {"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../src/controller/level.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../src/controller/level.ts"],"names":[],"mappings":"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"}
@@ -109,6 +109,11 @@ export class LevelDbController {
109
109
  this.metrics?.dbWriteItems.inc({ bucket: opts?.bucketId ?? BUCKET_ID_UNKNOWN }, keys.length);
110
110
  return this.db.batch(keys.map((key) => ({ type: "del", key: key })));
111
111
  }
112
+ batch(batch, opts) {
113
+ this.metrics?.dbWriteReq.inc({ bucket: opts?.bucketId ?? BUCKET_ID_UNKNOWN }, 1);
114
+ this.metrics?.dbWriteItems.inc({ bucket: opts?.bucketId ?? BUCKET_ID_UNKNOWN }, batch.length);
115
+ return this.db.batch(batch);
116
+ }
112
117
  keysStream(opts = {}) {
113
118
  return this.metricsIterator(this.db.keys(opts), (key) => key, opts.bucketId ?? BUCKET_ID_UNKNOWN);
114
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"level.js","sourceRoot":"","sources":["../../src/controller/level.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"level.js","sourceRoot":"","sources":["../../src/controller/level.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lodestar/db",
3
- "version": "1.39.1",
3
+ "version": "1.40.0-dev.193b2e2047",
4
4
  "description": "DB modules of Lodestar",
5
5
  "author": "ChainSafe Systems",
6
6
  "homepage": "https://github.com/ChainSafe/lodestar#readme",
@@ -44,13 +44,13 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "@chainsafe/ssz": "^1.2.2",
47
- "@lodestar/config": "^1.39.1",
48
- "@lodestar/utils": "^1.39.1",
47
+ "@lodestar/config": "^1.40.0-dev.193b2e2047",
48
+ "@lodestar/utils": "^1.40.0-dev.193b2e2047",
49
49
  "classic-level": "^1.4.1",
50
50
  "it-all": "^3.0.4"
51
51
  },
52
52
  "devDependencies": {
53
- "@lodestar/logger": "^1.39.1"
53
+ "@lodestar/logger": "^1.40.0-dev.193b2e2047"
54
54
  },
55
- "gitHead": "bc422a01a15970001ba5c94a36d09d6afd498483"
55
+ "gitHead": "6df77fd926652de8fbbd235f81fe1a8b443ea2c3"
56
56
  }
@@ -2,7 +2,7 @@ import {Type} from "@chainsafe/ssz";
2
2
  import {ChainForkConfig} from "@lodestar/config";
3
3
  import {BUCKET_LENGTH} from "./const.js";
4
4
  import {KeyValue} from "./controller/index.js";
5
- import {Db, DbReqOpts, FilterOptions} from "./controller/interface.js";
5
+ import {Db, DbBatch, DbReqOpts, FilterOptions} from "./controller/interface.js";
6
6
  import {encodeKey} from "./util.js";
7
7
 
8
8
  type Id = Uint8Array | string | number | bigint;
@@ -148,6 +148,58 @@ export abstract class PrefixedRepository<P, I extends Id, T> {
148
148
  await this.db.batchDelete(keys.flat(), this.dbReqOpts);
149
149
  }
150
150
 
151
+ async batch(prefix: P, batch: DbBatch<I, T>): Promise<void> {
152
+ const batchWithKeys = [];
153
+ for (const b of batch) {
154
+ if (b.type === "del") {
155
+ batchWithKeys.push({type: b.type, key: this.wrapKey(this.encodeKeyRaw(prefix, b.key))});
156
+ } else {
157
+ batchWithKeys.push({
158
+ type: b.type,
159
+ key: this.wrapKey(this.encodeKeyRaw(prefix, b.key)),
160
+ value: this.encodeValue(b.value),
161
+ });
162
+ }
163
+ }
164
+ await this.db.batch(batchWithKeys, this.dbReqOpts);
165
+ }
166
+
167
+ async batchBinary(prefix: P, batch: DbBatch<I, Uint8Array>): Promise<void> {
168
+ const batchWithKeys = [];
169
+ for (const b of batch) {
170
+ batchWithKeys.push({...b, key: this.wrapKey(this.encodeKeyRaw(prefix, b.key))});
171
+ }
172
+ await this.db.batch(batchWithKeys, this.dbReqOpts);
173
+ }
174
+
175
+ async values(prefix: P | P[]): Promise<T[]> {
176
+ const result: T[] = [];
177
+ for (const p of Array.isArray(prefix) ? prefix : [prefix]) {
178
+ for await (const vb of this.db.valuesStream({
179
+ gte: this.wrapKey(this.getMinKeyRaw(p)),
180
+ lte: this.wrapKey(this.getMaxKeyRaw(p)),
181
+ bucketId: this.bucketId,
182
+ })) {
183
+ result.push(this.decodeValue(vb));
184
+ }
185
+ }
186
+ return result;
187
+ }
188
+
189
+ async valuesBinary(prefix: P | P[]): Promise<Uint8Array[]> {
190
+ const result: Uint8Array[] = [];
191
+ for (const p of Array.isArray(prefix) ? prefix : [prefix]) {
192
+ for await (const vb of this.db.valuesStream({
193
+ gte: this.wrapKey(this.getMinKeyRaw(p)),
194
+ lte: this.wrapKey(this.getMaxKeyRaw(p)),
195
+ bucketId: this.bucketId,
196
+ })) {
197
+ result.push(vb);
198
+ }
199
+ }
200
+ return result;
201
+ }
202
+
151
203
  async *valuesStream(prefix: P | P[]): AsyncIterable<T> {
152
204
  for (const p of Array.isArray(prefix) ? prefix : [prefix]) {
153
205
  for await (const vb of this.db.valuesStream({
@@ -2,30 +2,26 @@ import {Type} from "@chainsafe/ssz";
2
2
  import {ChainForkConfig} from "@lodestar/config";
3
3
  import {BUCKET_LENGTH} from "./const.js";
4
4
  import {FilterOptions, KeyValue} from "./controller/index.js";
5
- import {Db, DbReqOpts} from "./controller/interface.js";
5
+ import {Db, DbBatch, DbReqOpts} from "./controller/interface.js";
6
6
  import {encodeKey as _encodeKey} from "./util.js";
7
7
 
8
8
  export type Id = Uint8Array | string | number | bigint;
9
9
 
10
10
  /**
11
- * Repository is a high level kv storage
11
+ * BinaryRepository is a high level kv storage
12
12
  * managing a Uint8Array to Uint8Array kv database
13
- * It translates typed keys and values to Uint8Arrays required by the underlying database
14
- *
15
- * By default, SSZ-encoded values,
16
- * indexed by root
13
+ * It translates typed keys and Uint8Array values required by the underlying database
17
14
  */
18
- export abstract class Repository<I extends Id, T> {
19
- private readonly dbReqOpts: DbReqOpts;
15
+ export abstract class BinaryRepository<I extends Id> {
16
+ protected readonly dbReqOpts: DbReqOpts;
20
17
 
21
- private readonly minKey: Uint8Array;
22
- private readonly maxKey: Uint8Array;
18
+ protected readonly minKey: Uint8Array;
19
+ protected readonly maxKey: Uint8Array;
23
20
 
24
21
  protected constructor(
25
22
  protected config: ChainForkConfig,
26
23
  protected db: Db,
27
24
  protected bucket: number,
28
- protected type: Type<T>,
29
25
  protected readonly bucketId: string
30
26
  ) {
31
27
  this.dbReqOpts = {bucketId: this.bucketId};
@@ -33,12 +29,35 @@ export abstract class Repository<I extends Id, T> {
33
29
  this.maxKey = _encodeKey(bucket + 1, Buffer.alloc(0));
34
30
  }
35
31
 
36
- encodeValue(value: T): Uint8Array {
37
- return this.type.serialize(value);
32
+ async keys(opts?: FilterOptions<I>): Promise<I[]> {
33
+ const data = await this.db.keys(this.dbFilterOptions(opts));
34
+ return (data ?? []).map((data) => this.decodeKey(data));
38
35
  }
39
36
 
40
- decodeValue(data: Uint8Array): T {
41
- return this.type.deserialize(data);
37
+ async *keysStream(opts?: FilterOptions<I>): AsyncIterable<I> {
38
+ const keysStream = this.db.keysStream(this.dbFilterOptions(opts));
39
+ const decodeKey = this.decodeKey.bind(this);
40
+ for await (const key of keysStream) {
41
+ yield decodeKey(key);
42
+ }
43
+ }
44
+
45
+ async firstKey(): Promise<I | null> {
46
+ // Metrics accounted in this.keys()
47
+ const keys = await this.keys({limit: 1, bucketId: this.bucketId});
48
+ if (!keys.length) {
49
+ return null;
50
+ }
51
+ return keys[0];
52
+ }
53
+
54
+ async lastKey(): Promise<I | null> {
55
+ // Metrics accounted in this.keys()
56
+ const keys = await this.keys({limit: 1, reverse: true, bucketId: this.bucketId});
57
+ if (!keys.length) {
58
+ return null;
59
+ }
60
+ return keys[0];
42
61
  }
43
62
 
44
63
  encodeKey(id: I): Uint8Array {
@@ -49,34 +68,147 @@ export abstract class Repository<I extends Id, T> {
49
68
  return key.slice(BUCKET_LENGTH) as I;
50
69
  }
51
70
 
52
- async get(id: I): Promise<T | null> {
53
- const value = await this.db.get(this.encodeKey(id), this.dbReqOpts);
54
- if (!value) return null;
55
- return this.decodeValue(value);
56
- }
57
-
58
71
  async getBinary(id: I): Promise<Uint8Array | null> {
59
72
  const value = await this.db.get(this.encodeKey(id), this.dbReqOpts);
60
73
  if (!value) return null;
61
74
  return value;
62
75
  }
63
76
 
64
- async has(id: I): Promise<boolean> {
65
- return (await this.get(id)) !== null;
77
+ async putBinary(id: I, value: Uint8Array): Promise<void> {
78
+ await this.db.put(this.encodeKey(id), value, this.dbReqOpts);
66
79
  }
67
80
 
68
- async put(id: I, value: T): Promise<void> {
69
- await this.db.put(this.encodeKey(id), this.encodeValue(value), this.dbReqOpts);
81
+ async binaries(opts?: FilterOptions<I>): Promise<Uint8Array[]> {
82
+ const data = await this.db.values(this.dbFilterOptions(opts));
83
+ return data ?? [];
70
84
  }
71
85
 
72
- async putBinary(id: I, value: Uint8Array): Promise<void> {
73
- await this.db.put(this.encodeKey(id), value, this.dbReqOpts);
86
+ async lastBinary(): Promise<Uint8Array | null> {
87
+ // Metrics accounted in this.values()
88
+ const binaryValues = await this.binaries({limit: 1, reverse: true, bucketId: this.bucketId});
89
+ if (!binaryValues.length) {
90
+ return null;
91
+ }
92
+ return binaryValues[0];
93
+ }
94
+
95
+ // Similar to batchPut but we support value as Uint8Array
96
+ async batchPutBinary(items: KeyValue<I, Uint8Array>[]): Promise<void> {
97
+ if (items.length === 1) {
98
+ return this.db.put(this.encodeKey(items[0].key), items[0].value, this.dbReqOpts);
99
+ }
100
+
101
+ await this.db.batchPut(
102
+ Array.from({length: items.length}, (_, i) => ({
103
+ key: this.encodeKey(items[i].key),
104
+ value: items[i].value,
105
+ })),
106
+ this.dbReqOpts
107
+ );
108
+ }
109
+
110
+ async *binaryEntriesStream(opts?: FilterOptions<I>): AsyncIterable<KeyValue<Uint8Array, Uint8Array>> {
111
+ yield* this.db.entriesStream(this.dbFilterOptions(opts));
112
+ }
113
+
114
+ async has(id: I): Promise<boolean> {
115
+ return (await this.getBinary(id)) !== null;
74
116
  }
75
117
 
76
118
  async delete(id: I): Promise<void> {
77
119
  await this.db.delete(this.encodeKey(id), this.dbReqOpts);
78
120
  }
79
121
 
122
+ async batchDelete(ids: I[]): Promise<void> {
123
+ if (ids.length === 1) {
124
+ return this.delete(ids[0]);
125
+ }
126
+
127
+ await this.db.batchDelete(
128
+ Array.from({length: ids.length}, (_, i) => this.encodeKey(ids[i])),
129
+ this.dbReqOpts
130
+ );
131
+ }
132
+
133
+ async batchBinary(batch: DbBatch<I, Uint8Array>): Promise<void> {
134
+ const batchWithKeys: DbBatch<Uint8Array, Uint8Array> = [];
135
+ for (const b of batch) {
136
+ batchWithKeys.push({...b, key: this.encodeKey(b.key)});
137
+ }
138
+ await this.db.batch(batchWithKeys, this.dbReqOpts);
139
+ }
140
+
141
+ /**
142
+ * Transforms opts from I to Uint8Array
143
+ */
144
+ protected dbFilterOptions(opts?: FilterOptions<I>): FilterOptions<Uint8Array> {
145
+ const optsBuff: FilterOptions<Uint8Array> = {
146
+ bucketId: this.bucketId,
147
+ };
148
+
149
+ // Set at least one min key
150
+ if (opts?.lt !== undefined) {
151
+ optsBuff.lt = this.encodeKey(opts.lt);
152
+ } else if (opts?.lte !== undefined) {
153
+ optsBuff.lte = this.encodeKey(opts.lte);
154
+ } else {
155
+ optsBuff.lt = this.maxKey;
156
+ }
157
+
158
+ // Set at least one max key
159
+ if (opts?.gt !== undefined) {
160
+ optsBuff.gt = this.encodeKey(opts.gt);
161
+ } else if (opts?.gte !== undefined) {
162
+ optsBuff.gte = this.encodeKey(opts.gte);
163
+ } else {
164
+ optsBuff.gte = this.minKey;
165
+ }
166
+
167
+ if (opts?.reverse !== undefined) optsBuff.reverse = opts.reverse;
168
+ if (opts?.limit !== undefined) optsBuff.limit = opts.limit;
169
+
170
+ return optsBuff;
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Repository is a high level kv storage
176
+ * managing a Uint8Array to Uint8Array kv database
177
+ * It translates typed keys and values to Uint8Arrays required by the underlying database
178
+ *
179
+ * By default, SSZ-encoded values,
180
+ * indexed by root
181
+ */
182
+ export abstract class Repository<I extends Id, T> extends BinaryRepository<I> {
183
+ protected constructor(
184
+ config: ChainForkConfig,
185
+ db: Db,
186
+ bucket: number,
187
+ protected type: Type<T>,
188
+ bucketId: string
189
+ ) {
190
+ super(config, db, bucket, bucketId);
191
+ this.type = type;
192
+ }
193
+
194
+ encodeValue(value: T): Uint8Array {
195
+ return this.type.serialize(value);
196
+ }
197
+
198
+ decodeValue(data: Uint8Array): T {
199
+ return this.type.deserialize(data);
200
+ }
201
+
202
+ async get(id: I): Promise<T | null> {
203
+ const value = await this.db.get(this.encodeKey(id), this.dbReqOpts);
204
+ if (!value) return null;
205
+ return this.decodeValue(value);
206
+ }
207
+
208
+ async put(id: I, value: T): Promise<void> {
209
+ await this.db.put(this.encodeKey(id), this.encodeValue(value), this.dbReqOpts);
210
+ }
211
+
80
212
  // The Id can be inferred from the value
81
213
  getId(value: T): I {
82
214
  return this.type.hashTreeRoot(value) as I;
@@ -104,30 +236,16 @@ export abstract class Repository<I extends Id, T> {
104
236
  );
105
237
  }
106
238
 
107
- // Similar to batchPut but we support value as Uint8Array
108
- async batchPutBinary(items: KeyValue<I, Uint8Array>[]): Promise<void> {
109
- if (items.length === 1) {
110
- return this.db.put(this.encodeKey(items[0].key), items[0].value, this.dbReqOpts);
111
- }
112
-
113
- await this.db.batchPut(
114
- Array.from({length: items.length}, (_, i) => ({
115
- key: this.encodeKey(items[i].key),
116
- value: items[i].value,
117
- })),
118
- this.dbReqOpts
119
- );
120
- }
121
-
122
- async batchDelete(ids: I[]): Promise<void> {
123
- if (ids.length === 1) {
124
- return this.delete(ids[0]);
239
+ async batch(batch: DbBatch<I, T>): Promise<void> {
240
+ const batchWithKeys: DbBatch<Uint8Array, Uint8Array> = [];
241
+ for (const b of batch) {
242
+ if (b.type === "del") {
243
+ batchWithKeys.push({...b, key: this.encodeKey(b.key)});
244
+ } else {
245
+ batchWithKeys.push({...b, key: this.encodeKey(b.key), value: this.encodeValue(b.value)});
246
+ }
125
247
  }
126
-
127
- await this.db.batchDelete(
128
- Array.from({length: ids.length}, (_, i) => this.encodeKey(ids[i])),
129
- this.dbReqOpts
130
- );
248
+ await this.db.batch(batchWithKeys, this.dbReqOpts);
131
249
  }
132
250
 
133
251
  async batchAdd(values: T[]): Promise<void> {
@@ -145,21 +263,8 @@ export abstract class Repository<I extends Id, T> {
145
263
  await this.batchDelete(Array.from({length: values.length}, (_ignored, i) => this.getId(values[i])));
146
264
  }
147
265
 
148
- async keys(opts?: FilterOptions<I>): Promise<I[]> {
149
- const data = await this.db.keys(this.dbFilterOptions(opts));
150
- return (data ?? []).map((data) => this.decodeKey(data));
151
- }
152
-
153
- async *keysStream(opts?: FilterOptions<I>): AsyncIterable<I> {
154
- const keysStream = this.db.keysStream(this.dbFilterOptions(opts));
155
- const decodeKey = this.decodeKey.bind(this);
156
- for await (const key of keysStream) {
157
- yield decodeKey(key);
158
- }
159
- }
160
-
161
266
  async values(opts?: FilterOptions<I>): Promise<T[]> {
162
- const data = await this.db.values(this.dbFilterOptions(opts));
267
+ const data = await this.binaries(opts);
163
268
  return (data ?? []).map((data) => this.decodeValue(data));
164
269
  }
165
270
 
@@ -171,10 +276,6 @@ export abstract class Repository<I extends Id, T> {
171
276
  }
172
277
  }
173
278
 
174
- async *binaryEntriesStream(opts?: FilterOptions<I>): AsyncIterable<KeyValue<Uint8Array, Uint8Array>> {
175
- yield* this.db.entriesStream(this.dbFilterOptions(opts));
176
- }
177
-
178
279
  async entries(opts?: FilterOptions<I>): Promise<KeyValue<I, T>[]> {
179
280
  const data = await this.db.entries(this.dbFilterOptions(opts));
180
281
  return (data ?? []).map((data) => ({
@@ -195,24 +296,6 @@ export abstract class Repository<I extends Id, T> {
195
296
  }
196
297
  }
197
298
 
198
- async firstKey(): Promise<I | null> {
199
- // Metrics accounted in this.keys()
200
- const keys = await this.keys({limit: 1, bucketId: this.bucketId});
201
- if (!keys.length) {
202
- return null;
203
- }
204
- return keys[0];
205
- }
206
-
207
- async lastKey(): Promise<I | null> {
208
- // Metrics accounted in this.keys()
209
- const keys = await this.keys({limit: 1, reverse: true, bucketId: this.bucketId});
210
- if (!keys.length) {
211
- return null;
212
- }
213
- return keys[0];
214
- }
215
-
216
299
  async firstValue(): Promise<T | null> {
217
300
  // Metrics accounted in this.values()
218
301
  const values = await this.values({limit: 1, bucketId: this.bucketId});
@@ -248,36 +331,4 @@ export abstract class Repository<I extends Id, T> {
248
331
  }
249
332
  return entries[0];
250
333
  }
251
-
252
- /**
253
- * Transforms opts from I to Uint8Array
254
- */
255
- protected dbFilterOptions(opts?: FilterOptions<I>): FilterOptions<Uint8Array> {
256
- const optsBuff: FilterOptions<Uint8Array> = {
257
- bucketId: this.bucketId,
258
- };
259
-
260
- // Set at least one min key
261
- if (opts?.lt !== undefined) {
262
- optsBuff.lt = this.encodeKey(opts.lt);
263
- } else if (opts?.lte !== undefined) {
264
- optsBuff.lte = this.encodeKey(opts.lte);
265
- } else {
266
- optsBuff.lt = this.maxKey;
267
- }
268
-
269
- // Set at least on max key
270
- if (opts?.gt !== undefined) {
271
- optsBuff.gt = this.encodeKey(opts.gt);
272
- } else if (opts?.gte !== undefined) {
273
- optsBuff.gte = this.encodeKey(opts.gte);
274
- } else {
275
- optsBuff.gte = this.minKey;
276
- }
277
-
278
- if (opts?.reverse !== undefined) optsBuff.reverse = opts.reverse;
279
- if (opts?.limit !== undefined) optsBuff.limit = opts.limit;
280
-
281
- return optsBuff;
282
- }
283
334
  }
@@ -1,3 +1,11 @@
1
- export type {DatabaseController, Db, DbReqOpts, FilterOptions, KeyValue} from "./interface.js";
1
+ export type {
2
+ DatabaseController,
3
+ Db,
4
+ DbBatch,
5
+ DbBatchOperation,
6
+ DbReqOpts,
7
+ FilterOptions,
8
+ KeyValue,
9
+ } from "./interface.js";
2
10
  export {LevelDbController} from "./level.js";
3
11
  export type {LevelDbControllerMetrics} from "./metrics.js";
@@ -28,6 +28,9 @@ export interface KeyValue<K, V> {
28
28
  value: V;
29
29
  }
30
30
 
31
+ export type DbBatchOperation<K, V> = {type: "del"; key: K} | {type: "put"; key: K; value: V};
32
+ export type DbBatch<K, V> = DbBatchOperation<K, V>[];
33
+
31
34
  export interface DatabaseController<K, V> {
32
35
  // service start / stop
33
36
 
@@ -48,6 +51,7 @@ export interface DatabaseController<K, V> {
48
51
 
49
52
  batchPut(items: KeyValue<K, V>[], opts?: DbReqOpts): Promise<void>;
50
53
  batchDelete(keys: K[], opts?: DbReqOpts): Promise<void>;
54
+ batch(batch: DbBatch<K, V>, opts?: DbReqOpts): Promise<void>;
51
55
 
52
56
  // Iterate over entries
53
57
 
@@ -1,6 +1,6 @@
1
1
  import {ClassicLevel} from "classic-level";
2
2
  import {Logger} from "@lodestar/utils";
3
- import {DatabaseController, DatabaseOptions, DbReqOpts, FilterOptions, KeyValue} from "./interface.js";
3
+ import {DatabaseController, DatabaseOptions, DbBatch, DbReqOpts, FilterOptions, KeyValue} from "./interface.js";
4
4
  import {LevelDbControllerMetrics} from "./metrics.js";
5
5
 
6
6
  enum Status {
@@ -143,6 +143,13 @@ export class LevelDbController implements DatabaseController<Uint8Array, Uint8Ar
143
143
  return this.db.batch(keys.map((key) => ({type: "del", key: key})));
144
144
  }
145
145
 
146
+ batch(batch: DbBatch<Uint8Array, Uint8Array>, opts?: DbReqOpts): Promise<void> {
147
+ this.metrics?.dbWriteReq.inc({bucket: opts?.bucketId ?? BUCKET_ID_UNKNOWN}, 1);
148
+ this.metrics?.dbWriteItems.inc({bucket: opts?.bucketId ?? BUCKET_ID_UNKNOWN}, batch.length);
149
+
150
+ return this.db.batch(batch);
151
+ }
152
+
146
153
  keysStream(opts: FilterOptions<Uint8Array> = {}): AsyncIterable<Uint8Array> {
147
154
  return this.metricsIterator(this.db.keys(opts), (key) => key, opts.bucketId ?? BUCKET_ID_UNKNOWN);
148
155
  }