@aztec/kv-store 1.2.1 → 2.0.0-nightly.20250813
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/indexeddb/map.d.ts.map +1 -1
- package/dest/indexeddb/map.js +10 -9
- package/dest/interfaces/map_test_suite.d.ts.map +1 -1
- package/dest/interfaces/map_test_suite.js +10 -9
- package/dest/interfaces/utils.d.ts +1 -0
- package/dest/interfaces/utils.d.ts.map +1 -1
- package/dest/interfaces/utils.js +2 -1
- package/package.json +5 -5
- package/src/indexeddb/map.ts +10 -9
- package/src/interfaces/map_test_suite.ts +9 -1
- package/src/interfaces/utils.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/indexeddb/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAGzD,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,CAAE,YAAW,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;;IAC3F,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;gBAKhB,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM;IAMjE,IAAI,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,EAEpF;IAED,IAAI,EAAE,IAAI,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAEvE;IAEK,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAKxC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/indexeddb/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAGzD,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,CAAE,YAAW,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;;IAC3F,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;gBAKhB,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM;IAMjE,IAAI,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,EAEpF;IAED,IAAI,EAAE,IAAI,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAEvE;IAEK,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAKxC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAM5B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlC,OAAO,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAQhD,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5B,YAAY,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAkBjE,WAAW,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAM3D,SAAS,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAWhE,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;IAKtC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,GAAE,MAAU,GAAG,MAAM;CAGlD"}
|
package/dest/indexeddb/map.js
CHANGED
|
@@ -25,7 +25,8 @@ import { hash } from 'ohash';
|
|
|
25
25
|
const result = await this.getAsync(key) !== undefined;
|
|
26
26
|
return result;
|
|
27
27
|
}
|
|
28
|
-
sizeAsync() {
|
|
28
|
+
async sizeAsync() {
|
|
29
|
+
const index = this.db.index('key');
|
|
29
30
|
const rangeQuery = IDBKeyRange.bound([
|
|
30
31
|
this.container,
|
|
31
32
|
''
|
|
@@ -33,7 +34,7 @@ import { hash } from 'ohash';
|
|
|
33
34
|
this.container,
|
|
34
35
|
'\uffff'
|
|
35
36
|
]);
|
|
36
|
-
return
|
|
37
|
+
return await index.count(rangeQuery);
|
|
37
38
|
}
|
|
38
39
|
async set(key, val) {
|
|
39
40
|
await this.db.put({
|
|
@@ -67,10 +68,10 @@ import { hash } from 'ohash';
|
|
|
67
68
|
const index = this.db.index('key');
|
|
68
69
|
const rangeQuery = IDBKeyRange.bound([
|
|
69
70
|
this.container,
|
|
70
|
-
range.start
|
|
71
|
+
range.start ? this.normalizeKey(range.start) : ''
|
|
71
72
|
], [
|
|
72
73
|
this.container,
|
|
73
|
-
range.end
|
|
74
|
+
range.end ? this.normalizeKey(range.end) : '\uffff'
|
|
74
75
|
], !!range.reverse, !range.reverse);
|
|
75
76
|
let count = 0;
|
|
76
77
|
for await (const cursor of index.iterate(rangeQuery, range.reverse ? 'prev' : 'next')){
|
|
@@ -78,7 +79,7 @@ import { hash } from 'ohash';
|
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
81
|
yield [
|
|
81
|
-
cursor.value.key,
|
|
82
|
+
this.#denormalizeKey(cursor.value.key),
|
|
82
83
|
cursor.value.value
|
|
83
84
|
];
|
|
84
85
|
count++;
|
|
@@ -91,18 +92,18 @@ import { hash } from 'ohash';
|
|
|
91
92
|
}
|
|
92
93
|
async *keysAsync(range = {}) {
|
|
93
94
|
for await (const [key, _] of this.entriesAsync(range)){
|
|
94
|
-
yield
|
|
95
|
+
yield key;
|
|
95
96
|
}
|
|
96
97
|
}
|
|
97
98
|
#denormalizeKey(key) {
|
|
98
|
-
const denormalizedKey = key.split(',').map((part)=>
|
|
99
|
-
return denormalizedKey.length > 1 ? denormalizedKey :
|
|
99
|
+
const denormalizedKey = key.split(',').map((part)=>part.startsWith('n_') ? Number(part.slice(2)) : part);
|
|
100
|
+
return denormalizedKey.length > 1 ? denormalizedKey : denormalizedKey[0];
|
|
100
101
|
}
|
|
101
102
|
normalizeKey(key) {
|
|
102
103
|
const arrayKey = Array.isArray(key) ? key : [
|
|
103
104
|
key
|
|
104
105
|
];
|
|
105
|
-
return arrayKey.join(',');
|
|
106
|
+
return arrayKey.map((element)=>typeof element === 'number' ? `n_${element}` : element).join(',');
|
|
106
107
|
}
|
|
107
108
|
slot(key, index = 0) {
|
|
108
109
|
return `map:${this.name}:slot:${this.normalizeKey(key)}:${index}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map_test_suite.d.ts","sourceRoot":"","sources":["../../src/interfaces/map_test_suite.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACzD,UAAU,GAAE,OAAe,
|
|
1
|
+
{"version":3,"file":"map_test_suite.d.ts","sourceRoot":"","sources":["../../src/interfaces/map_test_suite.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACzD,UAAU,GAAE,OAAe,QA+J5B"}
|
|
@@ -104,6 +104,14 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
104
104
|
'foo'
|
|
105
105
|
]);
|
|
106
106
|
});
|
|
107
|
+
it('should be able to iterate over string keys that represent numbers', async ()=>{
|
|
108
|
+
await map.set('0x22', 'bar');
|
|
109
|
+
await map.set('0x31', 'qux');
|
|
110
|
+
expect(await keys()).to.deep.equal([
|
|
111
|
+
'0x22',
|
|
112
|
+
'0x31'
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
107
115
|
for (const [name, data] of [
|
|
108
116
|
[
|
|
109
117
|
'chars',
|
|
@@ -123,15 +131,8 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
123
131
|
4
|
|
124
132
|
]
|
|
125
133
|
],
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
[
|
|
129
|
-
-4,
|
|
130
|
-
-3,
|
|
131
|
-
-2,
|
|
132
|
-
-1
|
|
133
|
-
]
|
|
134
|
-
],
|
|
134
|
+
// disabled because indexeddb sorts lexigographically
|
|
135
|
+
// ['negative numbers', [-4, -3, -2, -1]],
|
|
135
136
|
[
|
|
136
137
|
'strings',
|
|
137
138
|
[
|
|
@@ -11,6 +11,7 @@ export declare const mockLogger: {
|
|
|
11
11
|
level: "trace";
|
|
12
12
|
isLevelEnabled: (_level: string) => boolean;
|
|
13
13
|
module: string;
|
|
14
|
+
createChild: () => /*elided*/ any;
|
|
14
15
|
};
|
|
15
16
|
export declare function isSyncStore(store: AztecKVStore | AztecAsyncKVStore): store is AztecAsyncKVStore;
|
|
16
17
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/interfaces/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlE,eAAO,MAAM,UAAU;iBACR,MAAM,QAAQ,GAAG;gBAClB,MAAM,QAAQ,GAAG;gBACjB,MAAM,QAAQ,GAAG;iBAChB,MAAM,QAAQ,GAAG;iBACjB,MAAM,QAAQ,GAAG;mBACf,MAAM,SAAS,GAAG;mBAClB,MAAM,QAAQ,GAAG;iBACnB,MAAM,QAAQ,GAAG;;6BAEL,MAAM
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/interfaces/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlE,eAAO,MAAM,UAAU;iBACR,MAAM,QAAQ,GAAG;gBAClB,MAAM,QAAQ,GAAG;gBACjB,MAAM,QAAQ,GAAG;iBAChB,MAAM,QAAQ,GAAG;iBACjB,MAAM,QAAQ,GAAG;mBACf,MAAM,SAAS,GAAG;mBAClB,MAAM,QAAQ,GAAG;iBACnB,MAAM,QAAQ,GAAG;;6BAEL,MAAM;;;CAGhC,CAAC;AAGF,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,GAAG,KAAK,IAAI,iBAAiB,CAE/F"}
|
package/dest/interfaces/utils.js
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
trace: (msg, data)=>console.log(msg, data),
|
|
10
10
|
level: 'trace',
|
|
11
11
|
isLevelEnabled: (_level)=>true,
|
|
12
|
-
module: 'kv-store:mock-logger'
|
|
12
|
+
module: 'kv-store:mock-logger',
|
|
13
|
+
createChild: ()=>mockLogger
|
|
13
14
|
};
|
|
14
15
|
/* eslint-enable no-console */ export function isSyncStore(store) {
|
|
15
16
|
return store.syncGetters === true;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/kv-store",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-nightly.20250813",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/interfaces/index.js",
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
"./package.local.json"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@aztec/ethereum": "
|
|
28
|
-
"@aztec/foundation": "
|
|
29
|
-
"@aztec/native": "
|
|
30
|
-
"@aztec/stdlib": "
|
|
27
|
+
"@aztec/ethereum": "2.0.0-nightly.20250813",
|
|
28
|
+
"@aztec/foundation": "2.0.0-nightly.20250813",
|
|
29
|
+
"@aztec/native": "2.0.0-nightly.20250813",
|
|
30
|
+
"@aztec/stdlib": "2.0.0-nightly.20250813",
|
|
31
31
|
"idb": "^8.0.0",
|
|
32
32
|
"lmdb": "^3.2.0",
|
|
33
33
|
"msgpackr": "^1.11.2",
|
package/src/indexeddb/map.ts
CHANGED
|
@@ -39,9 +39,10 @@ export class IndexedDBAztecMap<K extends Key, V extends Value> implements AztecA
|
|
|
39
39
|
return result;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
sizeAsync(): Promise<number> {
|
|
42
|
+
async sizeAsync(): Promise<number> {
|
|
43
|
+
const index = this.db.index('key');
|
|
43
44
|
const rangeQuery = IDBKeyRange.bound([this.container, ''], [this.container, '\uffff']);
|
|
44
|
-
return
|
|
45
|
+
return await index.count(rangeQuery);
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
async set(key: K, val: V): Promise<void> {
|
|
@@ -80,8 +81,8 @@ export class IndexedDBAztecMap<K extends Key, V extends Value> implements AztecA
|
|
|
80
81
|
async *entriesAsync(range: Range<K> = {}): AsyncIterableIterator<[K, V]> {
|
|
81
82
|
const index = this.db.index('key');
|
|
82
83
|
const rangeQuery = IDBKeyRange.bound(
|
|
83
|
-
[this.container, range.start
|
|
84
|
-
[this.container, range.end
|
|
84
|
+
[this.container, range.start ? this.normalizeKey(range.start) : ''],
|
|
85
|
+
[this.container, range.end ? this.normalizeKey(range.end) : '\uffff'],
|
|
85
86
|
!!range.reverse,
|
|
86
87
|
!range.reverse,
|
|
87
88
|
);
|
|
@@ -90,7 +91,7 @@ export class IndexedDBAztecMap<K extends Key, V extends Value> implements AztecA
|
|
|
90
91
|
if (range.limit && count >= range.limit) {
|
|
91
92
|
return;
|
|
92
93
|
}
|
|
93
|
-
yield [cursor.value.key, cursor.value.value] as [K, V];
|
|
94
|
+
yield [this.#denormalizeKey(cursor.value.key), cursor.value.value] as [K, V];
|
|
94
95
|
count++;
|
|
95
96
|
}
|
|
96
97
|
}
|
|
@@ -103,18 +104,18 @@ export class IndexedDBAztecMap<K extends Key, V extends Value> implements AztecA
|
|
|
103
104
|
|
|
104
105
|
async *keysAsync(range: Range<K> = {}): AsyncIterableIterator<K> {
|
|
105
106
|
for await (const [key, _] of this.entriesAsync(range)) {
|
|
106
|
-
yield
|
|
107
|
+
yield key;
|
|
107
108
|
}
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
#denormalizeKey(key: string): K {
|
|
111
|
-
const denormalizedKey =
|
|
112
|
-
return (denormalizedKey.length > 1 ? denormalizedKey :
|
|
112
|
+
const denormalizedKey = key.split(',').map(part => (part.startsWith('n_') ? Number(part.slice(2)) : part));
|
|
113
|
+
return (denormalizedKey.length > 1 ? denormalizedKey : denormalizedKey[0]) as K;
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
protected normalizeKey(key: K): string {
|
|
116
117
|
const arrayKey = Array.isArray(key) ? key : [key];
|
|
117
|
-
return arrayKey.join(',');
|
|
118
|
+
return (arrayKey as K[]).map((element: K) => (typeof element === 'number' ? `n_${element}` : element)).join(',');
|
|
118
119
|
}
|
|
119
120
|
|
|
120
121
|
protected slot(key: K, index: number = 0): string {
|
|
@@ -135,10 +135,18 @@ export function describeAztecMap(
|
|
|
135
135
|
expect(await keys()).to.deep.equal(['baz', 'foo']);
|
|
136
136
|
});
|
|
137
137
|
|
|
138
|
+
it('should be able to iterate over string keys that represent numbers', async () => {
|
|
139
|
+
await map.set('0x22', 'bar');
|
|
140
|
+
await map.set('0x31', 'qux');
|
|
141
|
+
|
|
142
|
+
expect(await keys()).to.deep.equal(['0x22', '0x31']);
|
|
143
|
+
});
|
|
144
|
+
|
|
138
145
|
for (const [name, data] of [
|
|
139
146
|
['chars', ['a', 'b', 'c', 'd']],
|
|
140
147
|
['numbers', [1, 2, 3, 4]],
|
|
141
|
-
|
|
148
|
+
// disabled because indexeddb sorts lexigographically
|
|
149
|
+
// ['negative numbers', [-4, -3, -2, -1]],
|
|
142
150
|
['strings', ['aaa', 'bbb', 'ccc', 'ddd']],
|
|
143
151
|
['zero-based numbers', [0, 1, 2, 3]],
|
|
144
152
|
]) {
|