@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.
- package/lib/abstractPrefixedRepository.d.ts +5 -1
- package/lib/abstractPrefixedRepository.d.ts.map +1 -1
- package/lib/abstractPrefixedRepository.js +49 -0
- package/lib/abstractPrefixedRepository.js.map +1 -1
- package/lib/abstractRepository.d.ts +38 -26
- package/lib/abstractRepository.d.ts.map +1 -1
- package/lib/abstractRepository.js +145 -103
- package/lib/abstractRepository.js.map +1 -1
- package/lib/controller/index.d.ts +1 -1
- package/lib/controller/index.d.ts.map +1 -1
- package/lib/controller/index.js.map +1 -1
- package/lib/controller/interface.d.ts +10 -0
- package/lib/controller/interface.d.ts.map +1 -1
- package/lib/controller/level.d.ts +2 -1
- package/lib/controller/level.d.ts.map +1 -1
- package/lib/controller/level.js +5 -0
- package/lib/controller/level.js.map +1 -1
- package/package.json +5 -5
- package/src/abstractPrefixedRepository.ts +53 -1
- package/src/abstractRepository.ts +169 -118
- package/src/controller/index.ts +9 -1
- package/src/controller/interface.ts +4 -0
- package/src/controller/level.ts +8 -1
|
@@ -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;
|
|
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":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAC,kBAAkB,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../src/controller/level.ts"],"names":[],"mappings":"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"}
|
package/lib/controller/level.js
CHANGED
|
@@ -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.
|
|
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.
|
|
48
|
-
"@lodestar/utils": "^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.
|
|
53
|
+
"@lodestar/logger": "^1.40.0-dev.193b2e2047"
|
|
54
54
|
},
|
|
55
|
-
"gitHead": "
|
|
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
|
-
*
|
|
11
|
+
* BinaryRepository is a high level kv storage
|
|
12
12
|
* managing a Uint8Array to Uint8Array kv database
|
|
13
|
-
* It translates typed keys and values
|
|
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
|
|
19
|
-
|
|
15
|
+
export abstract class BinaryRepository<I extends Id> {
|
|
16
|
+
protected readonly dbReqOpts: DbReqOpts;
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
|
65
|
-
|
|
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
|
|
69
|
-
await this.db.
|
|
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
|
|
73
|
-
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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.
|
|
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
|
}
|
package/src/controller/index.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
export type {
|
|
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
|
|
package/src/controller/level.ts
CHANGED
|
@@ -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
|
}
|