@aztec/kv-store 0.73.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
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/dest/config.js +5 -7
- package/dest/indexeddb/array.js +44 -36
- package/dest/indexeddb/index.js +1 -4
- package/dest/indexeddb/map.js +72 -43
- package/dest/indexeddb/set.js +3 -4
- package/dest/indexeddb/singleton.js +17 -22
- package/dest/indexeddb/store.js +97 -93
- package/dest/interfaces/array.js +3 -2
- package/dest/interfaces/array_test_suite.js +29 -25
- package/dest/interfaces/common.js +3 -2
- package/dest/interfaces/counter.js +1 -2
- package/dest/interfaces/index.js +0 -1
- package/dest/interfaces/map.js +3 -2
- package/dest/interfaces/map_test_suite.js +87 -42
- package/dest/interfaces/set.js +1 -2
- package/dest/interfaces/set_test_suite.js +59 -22
- package/dest/interfaces/singleton.js +4 -2
- package/dest/interfaces/singleton_test_suite.js +7 -10
- package/dest/interfaces/store.js +1 -2
- package/dest/interfaces/store_test_suite.js +6 -9
- package/dest/interfaces/utils.js +12 -15
- package/dest/lmdb/array.js +46 -41
- package/dest/lmdb/counter.js +18 -24
- package/dest/lmdb/index.js +2 -6
- package/dest/lmdb/map.js +90 -68
- package/dest/lmdb/set.js +4 -5
- package/dest/lmdb/singleton.js +13 -14
- package/dest/lmdb/store.js +124 -134
- package/dest/lmdb-v2/factory.js +25 -17
- package/dest/lmdb-v2/index.js +0 -1
- package/dest/lmdb-v2/map.js +82 -85
- package/dest/lmdb-v2/message.js +6 -7
- package/dest/lmdb-v2/read_transaction.js +65 -53
- package/dest/lmdb-v2/singleton.js +7 -5
- package/dest/lmdb-v2/store.js +52 -29
- package/dest/lmdb-v2/utils.js +30 -30
- package/dest/lmdb-v2/write_transaction.js +130 -110
- package/dest/stores/index.js +0 -1
- package/dest/stores/l2_tips_store.js +26 -12
- package/dest/utils.js +3 -7
- package/package.json +6 -6
- package/src/interfaces/index.ts +1 -1
- package/src/lmdb-v2/factory.ts +10 -0
- package/src/lmdb-v2/store.ts +29 -3
- package/dest/config.d.ts +0 -17
- package/dest/config.d.ts.map +0 -1
- package/dest/indexeddb/array.d.ts +0 -21
- package/dest/indexeddb/array.d.ts.map +0 -1
- package/dest/indexeddb/index.d.ts +0 -7
- package/dest/indexeddb/index.d.ts.map +0 -1
- package/dest/indexeddb/map.d.ts +0 -26
- package/dest/indexeddb/map.d.ts.map +0 -1
- package/dest/indexeddb/set.d.ts +0 -17
- package/dest/indexeddb/set.d.ts.map +0 -1
- package/dest/indexeddb/singleton.d.ts +0 -16
- package/dest/indexeddb/singleton.d.ts.map +0 -1
- package/dest/indexeddb/store.d.ts +0 -97
- package/dest/indexeddb/store.d.ts.map +0 -1
- package/dest/interfaces/array.d.ts +0 -80
- package/dest/interfaces/array.d.ts.map +0 -1
- package/dest/interfaces/array_test_suite.d.ts +0 -3
- package/dest/interfaces/array_test_suite.d.ts.map +0 -1
- package/dest/interfaces/common.d.ts +0 -23
- package/dest/interfaces/common.d.ts.map +0 -1
- package/dest/interfaces/counter.d.ts +0 -59
- package/dest/interfaces/counter.d.ts.map +0 -1
- package/dest/interfaces/index.d.ts +0 -8
- package/dest/interfaces/index.d.ts.map +0 -1
- package/dest/interfaces/map.d.ts +0 -134
- package/dest/interfaces/map.d.ts.map +0 -1
- package/dest/interfaces/map_test_suite.d.ts +0 -3
- package/dest/interfaces/map_test_suite.d.ts.map +0 -1
- package/dest/interfaces/set.d.ts +0 -44
- package/dest/interfaces/set.d.ts.map +0 -1
- package/dest/interfaces/set_test_suite.d.ts +0 -3
- package/dest/interfaces/set_test_suite.d.ts.map +0 -1
- package/dest/interfaces/singleton.d.ts +0 -29
- package/dest/interfaces/singleton.d.ts.map +0 -1
- package/dest/interfaces/singleton_test_suite.d.ts +0 -3
- package/dest/interfaces/singleton_test_suite.d.ts.map +0 -1
- package/dest/interfaces/store.d.ts +0 -145
- package/dest/interfaces/store.d.ts.map +0 -1
- package/dest/interfaces/store_test_suite.d.ts +0 -3
- package/dest/interfaces/store_test_suite.d.ts.map +0 -1
- package/dest/interfaces/utils.d.ts +0 -16
- package/dest/interfaces/utils.d.ts.map +0 -1
- package/dest/lmdb/array.d.ts +0 -23
- package/dest/lmdb/array.d.ts.map +0 -1
- package/dest/lmdb/counter.d.ts +0 -19
- package/dest/lmdb/counter.d.ts.map +0 -1
- package/dest/lmdb/index.d.ts +0 -12
- package/dest/lmdb/index.d.ts.map +0 -1
- package/dest/lmdb/map.d.ts +0 -52
- package/dest/lmdb/map.d.ts.map +0 -1
- package/dest/lmdb/set.d.ts +0 -18
- package/dest/lmdb/set.d.ts.map +0 -1
- package/dest/lmdb/singleton.d.ts +0 -14
- package/dest/lmdb/singleton.d.ts.map +0 -1
- package/dest/lmdb/store.d.ts +0 -110
- package/dest/lmdb/store.d.ts.map +0 -1
- package/dest/lmdb-v2/factory.d.ts +0 -7
- package/dest/lmdb-v2/factory.d.ts.map +0 -1
- package/dest/lmdb-v2/index.d.ts +0 -3
- package/dest/lmdb-v2/index.d.ts.map +0 -1
- package/dest/lmdb-v2/map.d.ts +0 -86
- package/dest/lmdb-v2/map.d.ts.map +0 -1
- package/dest/lmdb-v2/message.d.ts +0 -112
- package/dest/lmdb-v2/message.d.ts.map +0 -1
- package/dest/lmdb-v2/read_transaction.d.ts +0 -14
- package/dest/lmdb-v2/read_transaction.d.ts.map +0 -1
- package/dest/lmdb-v2/singleton.d.ts +0 -12
- package/dest/lmdb-v2/singleton.d.ts.map +0 -1
- package/dest/lmdb-v2/store.d.ts +0 -41
- package/dest/lmdb-v2/store.d.ts.map +0 -1
- package/dest/lmdb-v2/utils.d.ts +0 -19
- package/dest/lmdb-v2/utils.d.ts.map +0 -1
- package/dest/lmdb-v2/write_transaction.d.ts +0 -19
- package/dest/lmdb-v2/write_transaction.d.ts.map +0 -1
- package/dest/stores/index.d.ts +0 -2
- package/dest/stores/index.d.ts.map +0 -1
- package/dest/stores/l2_tips_store.d.ts +0 -13
- package/dest/stores/l2_tips_store.d.ts.map +0 -1
- package/dest/utils.d.ts +0 -12
- package/dest/utils.d.ts.map +0 -1
package/dest/lmdb-v2/store.js
CHANGED
|
@@ -4,15 +4,24 @@ import { MsgpackChannel, NativeLMDBStore } from '@aztec/native';
|
|
|
4
4
|
import { AsyncLocalStorage } from 'async_hooks';
|
|
5
5
|
import { rm } from 'fs/promises';
|
|
6
6
|
import { LMDBMap, LMDBMultiMap } from './map.js';
|
|
7
|
-
import { Database, LMDBMessageType
|
|
7
|
+
import { Database, LMDBMessageType } from './message.js';
|
|
8
8
|
import { ReadTransaction } from './read_transaction.js';
|
|
9
9
|
import { LMDBSingleValue } from './singleton.js';
|
|
10
10
|
import { WriteTransaction } from './write_transaction.js';
|
|
11
11
|
export class AztecLMDBStoreV2 {
|
|
12
|
-
|
|
12
|
+
dataDir;
|
|
13
|
+
log;
|
|
14
|
+
cleanup;
|
|
15
|
+
open;
|
|
16
|
+
channel;
|
|
17
|
+
writerCtx;
|
|
18
|
+
writerQueue;
|
|
19
|
+
availableCursors;
|
|
20
|
+
constructor(dataDir, mapSize, maxReaders, log, cleanup){
|
|
13
21
|
this.dataDir = dataDir;
|
|
14
22
|
this.log = log;
|
|
15
23
|
this.cleanup = cleanup;
|
|
24
|
+
this.open = false;
|
|
16
25
|
this.writerCtx = new AsyncLocalStorage();
|
|
17
26
|
this.writerQueue = new SerialQueue();
|
|
18
27
|
this.log.info(`Starting data store with maxReaders ${maxReaders}`);
|
|
@@ -20,16 +29,20 @@ export class AztecLMDBStoreV2 {
|
|
|
20
29
|
// leave one reader to always be available for regular, atomic, reads
|
|
21
30
|
this.availableCursors = new Semaphore(maxReaders - 1);
|
|
22
31
|
}
|
|
32
|
+
get dataDirectory() {
|
|
33
|
+
return this.dataDir;
|
|
34
|
+
}
|
|
23
35
|
async start() {
|
|
24
36
|
this.writerQueue.start();
|
|
25
|
-
await this.sendMessage(LMDBMessageType.OPEN_DATABASE, {
|
|
37
|
+
await this.channel.sendMessage(LMDBMessageType.OPEN_DATABASE, {
|
|
26
38
|
db: Database.DATA,
|
|
27
|
-
uniqueKeys: true
|
|
39
|
+
uniqueKeys: true
|
|
28
40
|
});
|
|
29
|
-
await this.sendMessage(LMDBMessageType.OPEN_DATABASE, {
|
|
41
|
+
await this.channel.sendMessage(LMDBMessageType.OPEN_DATABASE, {
|
|
30
42
|
db: Database.INDEX,
|
|
31
|
-
uniqueKeys: false
|
|
43
|
+
uniqueKeys: false
|
|
32
44
|
});
|
|
45
|
+
this.open = true;
|
|
33
46
|
}
|
|
34
47
|
static async new(dataDir, dbMapSizeKb = 10 * 1024 * 1024, maxReaders = 16, cleanup, log = createLogger('kv-store:lmdb-v2')) {
|
|
35
48
|
const db = new AztecLMDBStoreV2(dataDir, dbMapSizeKb, maxReaders, log, cleanup);
|
|
@@ -37,9 +50,15 @@ export class AztecLMDBStoreV2 {
|
|
|
37
50
|
return db;
|
|
38
51
|
}
|
|
39
52
|
getReadTx() {
|
|
53
|
+
if (!this.open) {
|
|
54
|
+
throw new Error('Store is closed');
|
|
55
|
+
}
|
|
40
56
|
return new ReadTransaction(this);
|
|
41
57
|
}
|
|
42
58
|
getCurrentWriteTx() {
|
|
59
|
+
if (!this.open) {
|
|
60
|
+
throw new Error('Store is closed');
|
|
61
|
+
}
|
|
43
62
|
const currentWrite = this.writerCtx.getStore();
|
|
44
63
|
return currentWrite;
|
|
45
64
|
}
|
|
@@ -62,6 +81,9 @@ export class AztecLMDBStoreV2 {
|
|
|
62
81
|
throw new Error('Not implemented');
|
|
63
82
|
}
|
|
64
83
|
async transactionAsync(callback) {
|
|
84
|
+
if (!this.open) {
|
|
85
|
+
throw new Error('Store is closed');
|
|
86
|
+
}
|
|
65
87
|
// transactionAsync might be called recursively
|
|
66
88
|
// send any writes to the parent tx, but don't close it
|
|
67
89
|
// if the callback throws then the parent tx will rollback automatically
|
|
@@ -69,18 +91,16 @@ export class AztecLMDBStoreV2 {
|
|
|
69
91
|
if (currentTx) {
|
|
70
92
|
return await callback(currentTx);
|
|
71
93
|
}
|
|
72
|
-
return this.writerQueue.put(async ()
|
|
94
|
+
return this.writerQueue.put(async ()=>{
|
|
73
95
|
const tx = new WriteTransaction(this);
|
|
74
96
|
try {
|
|
75
97
|
const res = await this.writerCtx.run(tx, callback, tx);
|
|
76
98
|
await tx.commit();
|
|
77
99
|
return res;
|
|
78
|
-
}
|
|
79
|
-
catch (err) {
|
|
100
|
+
} catch (err) {
|
|
80
101
|
this.log.error(`Failed to commit transaction`, err);
|
|
81
102
|
throw err;
|
|
82
|
-
}
|
|
83
|
-
finally {
|
|
103
|
+
} finally{
|
|
84
104
|
tx.close();
|
|
85
105
|
}
|
|
86
106
|
});
|
|
@@ -93,15 +113,26 @@ export class AztecLMDBStoreV2 {
|
|
|
93
113
|
}
|
|
94
114
|
async delete() {
|
|
95
115
|
await this.close();
|
|
96
|
-
await rm(this.dataDir, {
|
|
116
|
+
await rm(this.dataDir, {
|
|
117
|
+
recursive: true,
|
|
118
|
+
force: true
|
|
119
|
+
});
|
|
97
120
|
this.log.verbose(`Deleted database files at ${this.dataDir}`);
|
|
98
121
|
await this.cleanup?.();
|
|
99
122
|
}
|
|
100
123
|
async close() {
|
|
124
|
+
if (!this.open) {
|
|
125
|
+
// already closed
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.open = false;
|
|
101
129
|
await this.writerQueue.cancel();
|
|
102
|
-
await this.sendMessage(LMDBMessageType.CLOSE, undefined);
|
|
130
|
+
await this.channel.sendMessage(LMDBMessageType.CLOSE, undefined);
|
|
103
131
|
}
|
|
104
132
|
async sendMessage(msgType, body) {
|
|
133
|
+
if (!this.open) {
|
|
134
|
+
throw new Error('Store is closed');
|
|
135
|
+
}
|
|
105
136
|
if (msgType === LMDBMessageType.START_CURSOR) {
|
|
106
137
|
await this.availableCursors.acquire();
|
|
107
138
|
}
|
|
@@ -109,13 +140,9 @@ export class AztecLMDBStoreV2 {
|
|
|
109
140
|
try {
|
|
110
141
|
({ response } = await this.channel.sendMessage(msgType, body));
|
|
111
142
|
return response;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
msgType === LMDBMessageType.CLOSE_CURSOR ||
|
|
116
|
-
// it's possible for a START_CURSOR command to not return a cursor (e.g. db is empty)
|
|
117
|
-
(msgType === LMDBMessageType.START_CURSOR &&
|
|
118
|
-
typeof response.cursor !== 'number')) {
|
|
143
|
+
} finally{
|
|
144
|
+
if (msgType === LMDBMessageType.START_CURSOR && response === undefined || msgType === LMDBMessageType.CLOSE_CURSOR || // it's possible for a START_CURSOR command to not return a cursor (e.g. db is empty)
|
|
145
|
+
msgType === LMDBMessageType.START_CURSOR && typeof response.cursor !== 'number') {
|
|
119
146
|
this.availableCursors.release();
|
|
120
147
|
}
|
|
121
148
|
}
|
|
@@ -124,8 +151,8 @@ export class AztecLMDBStoreV2 {
|
|
|
124
151
|
const resp = await this.sendMessage(LMDBMessageType.STATS, undefined);
|
|
125
152
|
return {
|
|
126
153
|
mappingSize: Number(resp.dbMapSizeBytes),
|
|
127
|
-
actualSize: resp.stats.reduce((s, db)
|
|
128
|
-
numItems: resp.stats.reduce((s, db)
|
|
154
|
+
actualSize: resp.stats.reduce((s, db)=>Number(db.totalUsedSize) + s, 0),
|
|
155
|
+
numItems: resp.stats.reduce((s, db)=>Number(db.numDataItems) + s, 0)
|
|
129
156
|
};
|
|
130
157
|
}
|
|
131
158
|
}
|
|
@@ -133,8 +160,7 @@ export function execInWriteTx(store, fn) {
|
|
|
133
160
|
const currentWrite = store.getCurrentWriteTx();
|
|
134
161
|
if (currentWrite) {
|
|
135
162
|
return fn(currentWrite);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
163
|
+
} else {
|
|
138
164
|
return store.transactionAsync(fn);
|
|
139
165
|
}
|
|
140
166
|
}
|
|
@@ -142,15 +168,12 @@ export async function execInReadTx(store, fn) {
|
|
|
142
168
|
const currentWrite = store.getCurrentWriteTx();
|
|
143
169
|
if (currentWrite) {
|
|
144
170
|
return await fn(currentWrite);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
171
|
+
} else {
|
|
147
172
|
const tx = store.getReadTx();
|
|
148
173
|
try {
|
|
149
174
|
return await fn(tx);
|
|
150
|
-
}
|
|
151
|
-
finally {
|
|
175
|
+
} finally{
|
|
152
176
|
tx.close();
|
|
153
177
|
}
|
|
154
178
|
}
|
|
155
179
|
}
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi12Mi9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsUUFBUSxFQUVSLGVBQWUsR0FHaEIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQ1UsT0FBZSxFQUN2QixPQUFlLEVBQ2YsVUFBa0IsRUFDVixHQUFXLEVBQ1gsT0FBNkI7UUFKN0IsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUdmLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFDWCxZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQVQvQixjQUFTLEdBQUcsSUFBSSxpQkFBaUIsRUFBb0IsQ0FBQztRQUN0RCxnQkFBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFVdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUNBQXVDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJ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
|
package/dest/lmdb-v2/utils.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { MAXIMUM_KEY, fromBufferKey, toBufferKey } from 'ordered-binary';
|
|
2
2
|
export function dedupeSortedArray(arr, cmp) {
|
|
3
|
-
for
|
|
3
|
+
for(let i = 0; i < arr.length; i++){
|
|
4
4
|
let j = i + 1;
|
|
5
|
-
for
|
|
5
|
+
for(; j < arr.length; j++){
|
|
6
6
|
const res = cmp(arr[i], arr[j]);
|
|
7
7
|
if (res === 0) {
|
|
8
8
|
continue;
|
|
9
|
-
}
|
|
10
|
-
else if (res < 0) {
|
|
9
|
+
} else if (res < 0) {
|
|
11
10
|
break;
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
11
|
+
} else {
|
|
14
12
|
throw new Error('Array not sorted');
|
|
15
13
|
}
|
|
16
14
|
}
|
|
@@ -22,13 +20,12 @@ export function dedupeSortedArray(arr, cmp) {
|
|
|
22
20
|
export function insertIntoSortedArray(arr, item, cmp) {
|
|
23
21
|
let left = 0;
|
|
24
22
|
let right = arr.length;
|
|
25
|
-
while
|
|
26
|
-
const mid =
|
|
23
|
+
while(left < right){
|
|
24
|
+
const mid = left + right >> 1;
|
|
27
25
|
const comparison = cmp(arr[mid], item);
|
|
28
26
|
if (comparison < 0) {
|
|
29
27
|
left = mid + 1;
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
28
|
+
} else {
|
|
32
29
|
right = mid;
|
|
33
30
|
}
|
|
34
31
|
}
|
|
@@ -37,16 +34,14 @@ export function insertIntoSortedArray(arr, item, cmp) {
|
|
|
37
34
|
export function findIndexInSortedArray(values, needle, cmp) {
|
|
38
35
|
let start = 0;
|
|
39
36
|
let end = values.length - 1;
|
|
40
|
-
while
|
|
41
|
-
const mid = start + ((
|
|
37
|
+
while(start <= end){
|
|
38
|
+
const mid = start + ((end - start) / 2 | 0);
|
|
42
39
|
const res = cmp(values[mid], needle);
|
|
43
40
|
if (res === 0) {
|
|
44
41
|
return mid;
|
|
45
|
-
}
|
|
46
|
-
else if (res > 0) {
|
|
42
|
+
} else if (res > 0) {
|
|
47
43
|
end = mid - 1;
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
44
|
+
} else {
|
|
50
45
|
start = mid + 1;
|
|
51
46
|
}
|
|
52
47
|
}
|
|
@@ -60,19 +55,17 @@ export function removeAnyOf(arr, vals, cmp) {
|
|
|
60
55
|
let writeIdx = 0;
|
|
61
56
|
let readIdx = 0;
|
|
62
57
|
let valIdx = 0;
|
|
63
|
-
while
|
|
58
|
+
while(readIdx < arr.length && valIdx < vals.length){
|
|
64
59
|
const comparison = cmp(arr[readIdx], vals[valIdx]);
|
|
65
60
|
if (comparison < 0) {
|
|
66
61
|
arr[writeIdx++] = arr[readIdx++];
|
|
67
|
-
}
|
|
68
|
-
else if (comparison > 0) {
|
|
62
|
+
} else if (comparison > 0) {
|
|
69
63
|
valIdx++;
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
64
|
+
} else {
|
|
72
65
|
readIdx++;
|
|
73
66
|
}
|
|
74
67
|
}
|
|
75
|
-
while
|
|
68
|
+
while(readIdx < arr.length){
|
|
76
69
|
arr[writeIdx++] = arr[readIdx++];
|
|
77
70
|
}
|
|
78
71
|
arr.length = writeIdx;
|
|
@@ -86,16 +79,16 @@ export function removeFromSortedArray(arr, val, cmp) {
|
|
|
86
79
|
export function merge(arr, toInsert, cmp) {
|
|
87
80
|
const result = new Array(arr.length + toInsert.length);
|
|
88
81
|
let i = 0, j = 0, k = 0;
|
|
89
|
-
while
|
|
82
|
+
while(i < arr.length && j < toInsert.length){
|
|
90
83
|
result[k++] = cmp(arr[i], toInsert[j]) <= 0 ? arr[i++] : toInsert[j++];
|
|
91
84
|
}
|
|
92
|
-
while
|
|
85
|
+
while(i < arr.length){
|
|
93
86
|
result[k++] = arr[i++];
|
|
94
87
|
}
|
|
95
|
-
while
|
|
88
|
+
while(j < toInsert.length){
|
|
96
89
|
result[k++] = toInsert[j++];
|
|
97
90
|
}
|
|
98
|
-
for
|
|
91
|
+
for(i = 0; i < result.length; i++){
|
|
99
92
|
arr[i] = result[i];
|
|
100
93
|
}
|
|
101
94
|
arr.length = result.length;
|
|
@@ -107,13 +100,21 @@ export function singleKeyCmp(a, b) {
|
|
|
107
100
|
return Buffer.compare(a[0], b);
|
|
108
101
|
}
|
|
109
102
|
export function minKey(prefix) {
|
|
110
|
-
return toBufferKey([
|
|
103
|
+
return toBufferKey([
|
|
104
|
+
prefix
|
|
105
|
+
]);
|
|
111
106
|
}
|
|
112
107
|
export function maxKey(prefix) {
|
|
113
|
-
return toBufferKey([
|
|
108
|
+
return toBufferKey([
|
|
109
|
+
prefix,
|
|
110
|
+
MAXIMUM_KEY
|
|
111
|
+
]);
|
|
114
112
|
}
|
|
115
113
|
export function serializeKey(prefix, key) {
|
|
116
|
-
return toBufferKey([
|
|
114
|
+
return toBufferKey([
|
|
115
|
+
prefix,
|
|
116
|
+
key
|
|
117
|
+
]);
|
|
117
118
|
}
|
|
118
119
|
export function deserializeKey(prefix, key) {
|
|
119
120
|
const buf = Buffer.from(key);
|
|
@@ -123,4 +124,3 @@ export function deserializeKey(prefix, key) {
|
|
|
123
124
|
}
|
|
124
125
|
return parsed[1];
|
|
125
126
|
}
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi12Mi91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU16RSxNQUFNLFVBQVUsaUJBQWlCLENBQUksR0FBUSxFQUFFLEdBQVc7SUFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsU0FBUztZQUNYLENBQUM7aUJBQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLE1BQU07WUFDUixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFJLEdBQVEsRUFBRSxJQUFPLEVBQUUsR0FBMkI7SUFDckYsSUFBSSxJ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
|