@aztec/kv-store 0.0.0-test.0 → 0.0.1-commit.001888fc

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.
Files changed (163) hide show
  1. package/dest/indexeddb/array.d.ts +3 -2
  2. package/dest/indexeddb/array.d.ts.map +1 -1
  3. package/dest/indexeddb/array.js +24 -7
  4. package/dest/indexeddb/index.d.ts +3 -3
  5. package/dest/indexeddb/index.d.ts.map +1 -1
  6. package/dest/indexeddb/index.js +4 -7
  7. package/dest/indexeddb/map.d.ts +18 -6
  8. package/dest/indexeddb/map.d.ts.map +1 -1
  9. package/dest/indexeddb/map.js +51 -63
  10. package/dest/indexeddb/multi_map.d.ts +14 -0
  11. package/dest/indexeddb/multi_map.d.ts.map +1 -0
  12. package/dest/indexeddb/multi_map.js +107 -0
  13. package/dest/indexeddb/set.d.ts +1 -1
  14. package/dest/indexeddb/set.d.ts.map +1 -1
  15. package/dest/indexeddb/singleton.d.ts +3 -2
  16. package/dest/indexeddb/singleton.d.ts.map +1 -1
  17. package/dest/indexeddb/singleton.js +6 -2
  18. package/dest/indexeddb/store.d.ts +15 -16
  19. package/dest/indexeddb/store.d.ts.map +1 -1
  20. package/dest/indexeddb/store.js +51 -46
  21. package/dest/interfaces/array.d.ts +5 -4
  22. package/dest/interfaces/array.d.ts.map +1 -1
  23. package/dest/interfaces/array.js +1 -3
  24. package/dest/interfaces/array_test_suite.d.ts +1 -1
  25. package/dest/interfaces/common.d.ts +11 -9
  26. package/dest/interfaces/common.d.ts.map +1 -1
  27. package/dest/interfaces/common.js +8 -3
  28. package/dest/interfaces/counter.d.ts +1 -1
  29. package/dest/interfaces/index.d.ts +4 -2
  30. package/dest/interfaces/index.d.ts.map +1 -1
  31. package/dest/interfaces/index.js +2 -0
  32. package/dest/interfaces/map.d.ts +21 -49
  33. package/dest/interfaces/map.d.ts.map +1 -1
  34. package/dest/interfaces/map.js +1 -1
  35. package/dest/interfaces/map_test_suite.d.ts +1 -1
  36. package/dest/interfaces/map_test_suite.d.ts.map +1 -1
  37. package/dest/interfaces/map_test_suite.js +181 -70
  38. package/dest/interfaces/multi_map.d.ts +41 -0
  39. package/dest/interfaces/multi_map.d.ts.map +1 -0
  40. package/dest/interfaces/multi_map.js +3 -0
  41. package/dest/interfaces/multi_map_test_suite.d.ts +3 -0
  42. package/dest/interfaces/multi_map_test_suite.d.ts.map +1 -0
  43. package/dest/interfaces/multi_map_test_suite.js +364 -0
  44. package/dest/interfaces/set.d.ts +1 -1
  45. package/dest/interfaces/set_test_suite.d.ts +1 -1
  46. package/dest/interfaces/singleton.d.ts +1 -1
  47. package/dest/interfaces/singleton_test_suite.d.ts +1 -1
  48. package/dest/interfaces/store.d.ts +18 -43
  49. package/dest/interfaces/store.d.ts.map +1 -1
  50. package/dest/interfaces/utils.d.ts +3 -1
  51. package/dest/interfaces/utils.d.ts.map +1 -1
  52. package/dest/interfaces/utils.js +3 -1
  53. package/dest/lmdb/array.d.ts +3 -2
  54. package/dest/lmdb/array.d.ts.map +1 -1
  55. package/dest/lmdb/array.js +4 -2
  56. package/dest/lmdb/counter.d.ts +1 -1
  57. package/dest/lmdb/counter.d.ts.map +1 -1
  58. package/dest/lmdb/index.d.ts +3 -3
  59. package/dest/lmdb/index.d.ts.map +1 -1
  60. package/dest/lmdb/index.js +5 -5
  61. package/dest/lmdb/map.d.ts +11 -23
  62. package/dest/lmdb/map.d.ts.map +1 -1
  63. package/dest/lmdb/map.js +15 -81
  64. package/dest/lmdb/multi_map.d.ts +13 -0
  65. package/dest/lmdb/multi_map.d.ts.map +1 -0
  66. package/dest/lmdb/multi_map.js +44 -0
  67. package/dest/lmdb/set.d.ts +1 -1
  68. package/dest/lmdb/set.d.ts.map +1 -1
  69. package/dest/lmdb/singleton.d.ts +1 -1
  70. package/dest/lmdb/singleton.d.ts.map +1 -1
  71. package/dest/lmdb/store.d.ts +11 -27
  72. package/dest/lmdb/store.d.ts.map +1 -1
  73. package/dest/lmdb/store.js +24 -40
  74. package/dest/lmdb-v2/array.d.ts +4 -3
  75. package/dest/lmdb-v2/array.d.ts.map +1 -1
  76. package/dest/lmdb-v2/array.js +4 -2
  77. package/dest/lmdb-v2/factory.d.ts +7 -10
  78. package/dest/lmdb-v2/factory.d.ts.map +1 -1
  79. package/dest/lmdb-v2/factory.js +26 -12
  80. package/dest/lmdb-v2/index.d.ts +1 -1
  81. package/dest/lmdb-v2/map.d.ts +12 -45
  82. package/dest/lmdb-v2/map.d.ts.map +1 -1
  83. package/dest/lmdb-v2/map.js +17 -104
  84. package/dest/lmdb-v2/message.d.ts +24 -5
  85. package/dest/lmdb-v2/message.d.ts.map +1 -1
  86. package/dest/lmdb-v2/message.js +6 -4
  87. package/dest/lmdb-v2/multi_map.d.ts +52 -0
  88. package/dest/lmdb-v2/multi_map.d.ts.map +1 -0
  89. package/dest/lmdb-v2/multi_map.js +123 -0
  90. package/dest/lmdb-v2/read_transaction.d.ts +3 -1
  91. package/dest/lmdb-v2/read_transaction.d.ts.map +1 -1
  92. package/dest/lmdb-v2/read_transaction.js +34 -0
  93. package/dest/lmdb-v2/set.d.ts +15 -0
  94. package/dest/lmdb-v2/set.d.ts.map +1 -0
  95. package/dest/lmdb-v2/set.js +23 -0
  96. package/dest/lmdb-v2/singleton.d.ts +2 -2
  97. package/dest/lmdb-v2/singleton.d.ts.map +1 -1
  98. package/dest/lmdb-v2/singleton.js +1 -1
  99. package/dest/lmdb-v2/store.d.ts +13 -13
  100. package/dest/lmdb-v2/store.d.ts.map +1 -1
  101. package/dest/lmdb-v2/store.js +19 -29
  102. package/dest/lmdb-v2/tx-helpers.d.ts +6 -0
  103. package/dest/lmdb-v2/tx-helpers.d.ts.map +1 -0
  104. package/dest/lmdb-v2/tx-helpers.js +21 -0
  105. package/dest/lmdb-v2/utils.d.ts +3 -14
  106. package/dest/lmdb-v2/utils.d.ts.map +1 -1
  107. package/dest/lmdb-v2/utils.js +0 -94
  108. package/dest/lmdb-v2/write_transaction.d.ts +3 -5
  109. package/dest/lmdb-v2/write_transaction.d.ts.map +1 -1
  110. package/dest/lmdb-v2/write_transaction.js +9 -5
  111. package/dest/stores/index.d.ts +2 -1
  112. package/dest/stores/index.d.ts.map +1 -1
  113. package/dest/stores/index.js +1 -0
  114. package/dest/stores/l2_tips_store.d.ts +24 -8
  115. package/dest/stores/l2_tips_store.d.ts.map +1 -1
  116. package/dest/stores/l2_tips_store.js +63 -45
  117. package/dest/utils.d.ts +9 -6
  118. package/dest/utils.d.ts.map +1 -1
  119. package/dest/utils.js +51 -16
  120. package/package.json +30 -22
  121. package/src/indexeddb/array.ts +9 -5
  122. package/src/indexeddb/index.ts +11 -9
  123. package/src/indexeddb/map.ts +51 -56
  124. package/src/indexeddb/multi_map.ts +105 -0
  125. package/src/indexeddb/singleton.ts +5 -2
  126. package/src/indexeddb/store.ts +77 -60
  127. package/src/interfaces/array.ts +5 -3
  128. package/src/interfaces/common.ts +20 -9
  129. package/src/interfaces/index.ts +3 -1
  130. package/src/interfaces/map.ts +19 -53
  131. package/src/interfaces/map_test_suite.ts +101 -44
  132. package/src/interfaces/multi_map.ts +45 -0
  133. package/src/interfaces/multi_map_test_suite.ts +374 -0
  134. package/src/interfaces/store.ts +18 -53
  135. package/src/interfaces/utils.ts +2 -0
  136. package/src/lmdb/array.ts +2 -1
  137. package/src/lmdb/index.ts +12 -7
  138. package/src/lmdb/map.ts +23 -94
  139. package/src/lmdb/multi_map.ts +51 -0
  140. package/src/lmdb/store.ts +36 -56
  141. package/src/lmdb-v2/array.ts +8 -3
  142. package/src/lmdb-v2/factory.ts +30 -19
  143. package/src/lmdb-v2/map.ts +30 -127
  144. package/src/lmdb-v2/message.ts +23 -0
  145. package/src/lmdb-v2/multi_map.ts +150 -0
  146. package/src/lmdb-v2/read_transaction.ts +40 -0
  147. package/src/lmdb-v2/set.ts +33 -0
  148. package/src/lmdb-v2/singleton.ts +6 -2
  149. package/src/lmdb-v2/store.ts +24 -42
  150. package/src/lmdb-v2/tx-helpers.ts +29 -0
  151. package/src/lmdb-v2/utils.ts +0 -118
  152. package/src/lmdb-v2/write_transaction.ts +11 -10
  153. package/src/stores/index.ts +2 -0
  154. package/src/stores/l2_tips_store.ts +67 -49
  155. package/src/utils.ts +79 -21
  156. package/dest/config.d.ts +0 -17
  157. package/dest/config.d.ts.map +0 -1
  158. package/dest/config.js +0 -24
  159. package/dest/interfaces/store_test_suite.d.ts +0 -3
  160. package/dest/interfaces/store_test_suite.d.ts.map +0 -1
  161. package/dest/interfaces/store_test_suite.js +0 -37
  162. package/src/config.ts +0 -34
  163. package/src/interfaces/store_test_suite.ts +0 -56
@@ -1,10 +1,11 @@
1
1
  import type { IDBPDatabase, IDBPObjectStore } from 'idb';
2
2
  import type { AztecAsyncArray } from '../interfaces/array.js';
3
+ import type { Value } from '../interfaces/common.js';
3
4
  import type { AztecIDBSchema } from './store.js';
4
5
  /**
5
6
  * A persistent array backed by IndexedDB.
6
7
  */
7
- export declare class IndexedDBAztecArray<T> implements AztecAsyncArray<T> {
8
+ export declare class IndexedDBAztecArray<T extends Value> implements AztecAsyncArray<T> {
8
9
  #private;
9
10
  constructor(rootDB: IDBPDatabase<AztecIDBSchema>, name: string);
10
11
  set db(db: IDBPObjectStore<AztecIDBSchema, ['data'], 'data', 'readwrite'> | undefined);
@@ -18,4 +19,4 @@ export declare class IndexedDBAztecArray<T> implements AztecAsyncArray<T> {
18
19
  valuesAsync(): AsyncIterableIterator<T>;
19
20
  [Symbol.asyncIterator](): AsyncIterableIterator<T>;
20
21
  }
21
- //# sourceMappingURL=array.d.ts.map
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleGVkZGIvYXJyYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUd6RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQ7O0dBRUc7QUFDSCxxQkFBYSxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFFLFlBQVcsZUFBZSxDQUFDLENBQUMsQ0FBQzs7SUFNN0UsWUFBWSxNQUFNLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBSTdEO0lBRUQsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsU0FBUyxFQUVwRjtJQUVELElBQUksRUFBRSxJQUFJLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBRXZFO0lBRUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FNbkM7SUFFSyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQWN4QztJQUVLLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQVdsQztJQUVLLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBU25EO0lBRUssS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBb0JuRDtJQUVNLFlBQVksSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQU14RDtJQUVNLFdBQVcsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FJN0M7SUFFRCxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FFakQ7Q0FLRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/indexeddb/array.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,mBAAmB,CAAC,CAAC,CAAE,YAAW,eAAe,CAAC,CAAC,CAAC;;gBAMnD,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM;IAM9D,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,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ9B,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAenC,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAa7B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAW9C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB7C,YAAY,IAAI,qBAAqB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAQlD,WAAW,IAAI,qBAAqB,CAAC,CAAC,CAAC;IAM9C,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC;CAOnD"}
1
+ {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/indexeddb/array.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAGzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,mBAAmB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,eAAe,CAAC,CAAC,CAAC;;IAM7E,YAAY,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAI7D;IAED,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,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAMnC;IAEK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAcxC;IAEK,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAWlC;IAEK,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CASnD;IAEK,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBnD;IAEM,YAAY,IAAI,qBAAqB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAMxD;IAEM,WAAW,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAI7C;IAED,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAEjD;CAKF"}
@@ -1,3 +1,6 @@
1
+ var _computedKey;
2
+ import { hash } from 'ohash';
3
+ _computedKey = Symbol.asyncIterator;
1
4
  /**
2
5
  * A persistent array backed by IndexedDB.
3
6
  */ export class IndexedDBAztecArray {
@@ -19,10 +22,14 @@
19
22
  async lengthAsync() {
20
23
  return await this.db.index('key').count(IDBKeyRange.bound([
21
24
  this.#container,
22
- this.#name
25
+ [
26
+ this.#name
27
+ ]
23
28
  ], [
24
29
  this.#container,
25
- this.#name
30
+ [
31
+ this.#name
32
+ ]
26
33
  ])) ?? 0;
27
34
  }
28
35
  async push(...vals) {
@@ -30,8 +37,11 @@
30
37
  for (const val of vals){
31
38
  await this.db.put({
32
39
  value: val,
40
+ hash: hash(val),
33
41
  container: this.#container,
34
- key: this.#name,
42
+ key: [
43
+ this.#name
44
+ ],
35
45
  keyCount: length + 1,
36
46
  slot: this.#slot(length)
37
47
  });
@@ -67,8 +77,11 @@
67
77
  }
68
78
  await this.db.put({
69
79
  value: val,
80
+ hash: hash(val),
70
81
  container: this.#container,
71
- key: this.#name,
82
+ key: [
83
+ this.#name
84
+ ],
72
85
  keyCount: index + 1,
73
86
  slot: this.#slot(index)
74
87
  });
@@ -78,10 +91,14 @@
78
91
  const index = this.db.index('key');
79
92
  const rangeQuery = IDBKeyRange.bound([
80
93
  this.#container,
81
- this.#name
94
+ [
95
+ this.#name
96
+ ]
82
97
  ], [
83
98
  this.#container,
84
- this.#name
99
+ [
100
+ this.#name
101
+ ]
85
102
  ]);
86
103
  for await (const cursor of index.iterate(rangeQuery)){
87
104
  yield [
@@ -95,7 +112,7 @@
95
112
  yield value;
96
113
  }
97
114
  }
98
- [Symbol.asyncIterator]() {
115
+ [_computedKey]() {
99
116
  return this.valuesAsync();
100
117
  }
101
118
  #slot(index) {
@@ -1,7 +1,7 @@
1
1
  import { type Logger } from '@aztec/foundation/log';
2
- import type { DataStoreConfig } from '../config.js';
2
+ import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
3
3
  import { AztecIndexedDBStore } from './store.js';
4
4
  export { AztecIndexedDBStore } from './store.js';
5
- export declare function createStore(name: string, config: DataStoreConfig, log?: Logger): Promise<AztecIndexedDBStore>;
5
+ export declare function createStore(name: string, config: DataStoreConfig, schemaVersion?: number | undefined, log?: Logger): Promise<AztecIndexedDBStore>;
6
6
  export declare function openTmpStore(ephemeral?: boolean): Promise<AztecIndexedDBStore>;
7
- //# sourceMappingURL=index.d.ts.map
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleGVkZGIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQsd0JBQXNCLFdBQVcsQ0FDL0IsSUFBSSxFQUFFLE1BQU0sRUFDWixNQUFNLEVBQUUsZUFBZSxFQUN2QixhQUFhLEdBQUUsTUFBTSxHQUFHLFNBQXFCLEVBQzdDLEdBQUcsR0FBRSxNQUFpQyxnQ0FjdkM7QUFFRCx3QkFBZ0IsWUFBWSxDQUFDLFNBQVMsR0FBRSxPQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBRXJGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexeddb/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,GAAE,MAAiC,gCAgB9G;AAED,wBAAgB,YAAY,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAErF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexeddb/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EACvB,aAAa,GAAE,MAAM,GAAG,SAAqB,EAC7C,GAAG,GAAE,MAAiC,gCAcvC;AAED,wBAAgB,YAAY,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAErF"}
@@ -1,18 +1,15 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
- import { initStoreForRollup } from '../utils.js';
2
+ import { initStoreForRollupAndSchemaVersion } from '../utils.js';
3
3
  import { AztecIndexedDBStore } from './store.js';
4
4
  export { AztecIndexedDBStore } from './store.js';
5
- export async function createStore(name, config, log = createLogger('kv-store')) {
5
+ export async function createStore(name, config, schemaVersion = undefined, log = createLogger('kv-store')) {
6
6
  let { dataDirectory } = config;
7
7
  if (typeof dataDirectory !== 'undefined') {
8
8
  dataDirectory = `${dataDirectory}/${name}`;
9
9
  }
10
- log.info(dataDirectory ? `Creating ${name} data store at directory ${dataDirectory} with map size ${config.dataStoreMapSizeKB} KB` : `Creating ${name} ephemeral data store with map size ${config.dataStoreMapSizeKB} KB`);
10
+ log.info(dataDirectory ? `Creating ${name} data store at directory ${dataDirectory} with map size ${config.dataStoreMapSizeKb} KB` : `Creating ${name} ephemeral data store with map size ${config.dataStoreMapSizeKb} KB`);
11
11
  const store = await AztecIndexedDBStore.open(createLogger('kv-store:indexeddb'), dataDirectory ?? '', false);
12
- if (config.l1Contracts?.rollupAddress) {
13
- return initStoreForRollup(store, config.l1Contracts.rollupAddress, log);
14
- }
15
- return store;
12
+ return initStoreForRollupAndSchemaVersion(store, schemaVersion, config.l1Contracts?.rollupAddress, log);
16
13
  }
17
14
  export function openTmpStore(ephemeral = false) {
18
15
  return AztecIndexedDBStore.open(createLogger('kv-store:indexeddb'), undefined, ephemeral);
@@ -1,26 +1,38 @@
1
1
  import type { IDBPDatabase, IDBPObjectStore } from 'idb';
2
- import type { Key, Range } from '../interfaces/common.js';
3
- import type { AztecAsyncMultiMap } from '../interfaces/map.js';
2
+ import type { Key, Range, Value } from '../interfaces/common.js';
3
+ import type { AztecAsyncMap } from '../interfaces/map.js';
4
4
  import type { AztecIDBSchema } from './store.js';
5
5
  /**
6
6
  * A map backed by IndexedDB.
7
7
  */
8
- export declare class IndexedDBAztecMap<K extends Key, V> implements AztecAsyncMultiMap<K, V> {
8
+ export declare class IndexedDBAztecMap<K extends Key, V extends Value> implements AztecAsyncMap<K, V> {
9
9
  #private;
10
10
  protected name: string;
11
+ protected container: string;
11
12
  constructor(rootDB: IDBPDatabase<AztecIDBSchema>, mapName: string);
12
13
  set db(db: IDBPObjectStore<AztecIDBSchema, ['data'], 'data', 'readwrite'> | undefined);
13
14
  get db(): IDBPObjectStore<AztecIDBSchema, ['data'], 'data', 'readwrite'>;
14
15
  getAsync(key: K): Promise<V | undefined>;
15
- getValuesAsync(key: K): AsyncIterableIterator<V>;
16
16
  hasAsync(key: K): Promise<boolean>;
17
+ sizeAsync(): Promise<number>;
17
18
  set(key: K, val: V): Promise<void>;
19
+ setMany(entries: {
20
+ key: K;
21
+ value: V;
22
+ }[]): Promise<void>;
18
23
  swap(_key: K, _fn: (val: V | undefined) => V): Promise<void>;
19
24
  setIfNotExists(key: K, val: V): Promise<boolean>;
20
25
  delete(key: K): Promise<void>;
21
- deleteValue(key: K, val: V): Promise<void>;
22
26
  entriesAsync(range?: Range<K>): AsyncIterableIterator<[K, V]>;
23
27
  valuesAsync(range?: Range<K>): AsyncIterableIterator<V>;
24
28
  keysAsync(range?: Range<K>): AsyncIterableIterator<K>;
29
+ /**
30
+ * IndexedDB's structured clone downcasts Buffer (a Node.js subclass of Uint8Array) to plain Uint8Array.
31
+ * This breaks .toString() behavior: Buffer.toString() returns UTF-8, Uint8Array.toString() returns
32
+ * comma-separated decimal bytes. We restore Buffer identity on read so callers get consistent behavior.
33
+ */
34
+ protected restoreBuffers(val: V): V;
35
+ protected normalizeKey(key: K): (string | number | Uint8Array)[];
36
+ protected slot(key: K, index?: number): string;
25
37
  }
26
- //# sourceMappingURL=map.d.ts.map
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXhlZGRiL21hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBR3pELE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpEOztHQUVHO0FBQ0gscUJBQWEsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsS0FBSyxDQUFFLFlBQVcsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O0lBQzNGLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ3ZCLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO0lBSzVCLFlBQVksTUFBTSxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUloRTtJQUVELElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHLFNBQVMsRUFFcEY7SUFFRCxJQUFJLEVBQUUsSUFBSSxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUV2RTtJQUVLLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBRzdDO0lBRUssUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUd2QztJQUVLLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBSWpDO0lBRUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBU3ZDO0lBRUssT0FBTyxDQUFDLE9BQU8sRUFBRTtRQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0tBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FJNUQ7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLFNBQVMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUUzRDtJQUVLLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQU1yRDtJQUVLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFbEM7SUFFTSxZQUFZLENBQUMsS0FBSyxHQUFFLEtBQUssQ0FBQyxDQUFDLENBQU0sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQW1CdkU7SUFFTSxXQUFXLENBQUMsS0FBSyxHQUFFLEtBQUssQ0FBQyxDQUFDLENBQU0sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FJakU7SUFFTSxTQUFTLENBQUMsS0FBSyxHQUFFLEtBQUssQ0FBQyxDQUFDLENBQU0sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FJL0Q7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FLbEM7SUFNRCxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBRS9EO0lBRUQsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRSxNQUFVLEdBQUcsTUFBTSxDQUVoRDtDQUNGIn0=
@@ -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;AAEzD,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAE,YAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;;IAClF,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;gBAMX,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;IAKvC,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAajD,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,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;IAI7B,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzC,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;CAmBjE"}
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;IAK5B,YAAY,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAIhE;IAED,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,CAG7C;IAEK,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAGvC;IAEK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAIjC;IAEK,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CASvC;IAEK,OAAO,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5D;IAED,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAEK,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAMrD;IAEK,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAElC;IAEM,YAAY,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAmBvE;IAEM,WAAW,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAIjE;IAEM,SAAS,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAI/D;IAED;;;;OAIG;IACH,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAKlC;IAMD,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC,EAAE,CAE/D;IAED,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,GAAE,MAAU,GAAG,MAAM,CAEhD;CACF"}
@@ -1,13 +1,14 @@
1
+ import { hash } from 'ohash';
1
2
  /**
2
3
  * A map backed by IndexedDB.
3
4
  */ export class IndexedDBAztecMap {
4
5
  name;
5
- #container;
6
+ container;
6
7
  #_db;
7
8
  #rootDB;
8
9
  constructor(rootDB, mapName){
9
10
  this.name = mapName;
10
- this.#container = `map:${mapName}`;
11
+ this.container = `map:${mapName}`;
11
12
  this.#rootDB = rootDB;
12
13
  }
13
14
  set db(db) {
@@ -17,44 +18,37 @@
17
18
  return this.#_db ? this.#_db : this.#rootDB.transaction('data', 'readwrite').store;
18
19
  }
19
20
  async getAsync(key) {
20
- const data = await this.db.get(this.#slot(key));
21
- return data?.value;
22
- }
23
- async *getValuesAsync(key) {
24
- const index = this.db.index('keyCount');
25
- const rangeQuery = IDBKeyRange.bound([
26
- this.#container,
27
- this.#normalizeKey(key),
28
- 0
29
- ], [
30
- this.#container,
31
- this.#normalizeKey(key),
32
- Number.MAX_SAFE_INTEGER
33
- ], false, false);
34
- for await (const cursor of index.iterate(rangeQuery)){
35
- yield cursor.value.value;
36
- }
21
+ const data = await this.db.get(this.slot(key));
22
+ return data ? this.restoreBuffers(data.value) : undefined;
37
23
  }
38
24
  async hasAsync(key) {
39
25
  const result = await this.getAsync(key) !== undefined;
40
26
  return result;
41
27
  }
42
- async set(key, val) {
43
- const count = await this.db.index('key').count(IDBKeyRange.bound([
44
- this.#container,
45
- this.#normalizeKey(key)
28
+ async sizeAsync() {
29
+ const index = this.db.index('key');
30
+ const rangeQuery = IDBKeyRange.bound([
31
+ this.container
46
32
  ], [
47
- this.#container,
48
- this.#normalizeKey(key)
49
- ]));
33
+ this.container + '\uffff'
34
+ ], true, true);
35
+ return await index.count(rangeQuery);
36
+ }
37
+ async set(key, val) {
50
38
  await this.db.put({
51
39
  value: val,
52
- container: this.#container,
53
- key: this.#normalizeKey(key),
54
- keyCount: count + 1,
55
- slot: this.#slot(key, count)
40
+ hash: hash(val),
41
+ container: this.container,
42
+ key: this.normalizeKey(key),
43
+ keyCount: 1,
44
+ slot: this.slot(key)
56
45
  });
57
46
  }
47
+ async setMany(entries) {
48
+ for (const { key, value } of entries){
49
+ await this.set(key, value);
50
+ }
51
+ }
58
52
  swap(_key, _fn) {
59
53
  throw new Error('Not implemented');
60
54
  }
@@ -66,34 +60,20 @@
66
60
  return false;
67
61
  }
68
62
  async delete(key) {
69
- await this.db.delete(this.#slot(key));
70
- }
71
- async deleteValue(key, val) {
72
- const index = this.db.index('keyCount');
73
- const rangeQuery = IDBKeyRange.bound([
74
- this.#container,
75
- this.#normalizeKey(key),
76
- 0
77
- ], [
78
- this.#container,
79
- this.#normalizeKey(key),
80
- Number.MAX_SAFE_INTEGER
81
- ], false, false);
82
- for await (const cursor of index.iterate(rangeQuery)){
83
- if (JSON.stringify(cursor.value.value) === JSON.stringify(val)) {
84
- await cursor.delete();
85
- return;
86
- }
87
- }
63
+ await this.db.delete(this.slot(key));
88
64
  }
89
65
  async *entriesAsync(range = {}) {
90
66
  const index = this.db.index('key');
67
+ const startKey = range.start ? this.normalizeKey(range.start) : [];
68
+ const endKey = range.end ? this.normalizeKey(range.end) : [
69
+ '\uffff'
70
+ ];
91
71
  const rangeQuery = IDBKeyRange.bound([
92
- this.#container,
93
- range.start ?? ''
72
+ this.container,
73
+ startKey
94
74
  ], [
95
- this.#container,
96
- range.end ?? '\uffff'
75
+ this.container,
76
+ endKey
97
77
  ], !!range.reverse, !range.reverse);
98
78
  let count = 0;
99
79
  for await (const cursor of index.iterate(rangeQuery, range.reverse ? 'prev' : 'next')){
@@ -101,8 +81,8 @@
101
81
  return;
102
82
  }
103
83
  yield [
104
- cursor.value.key,
105
- cursor.value.value
84
+ this.#denormalizeKey(cursor.value.key),
85
+ this.restoreBuffers(cursor.value.value)
106
86
  ];
107
87
  count++;
108
88
  }
@@ -114,20 +94,28 @@
114
94
  }
115
95
  async *keysAsync(range = {}) {
116
96
  for await (const [key, _] of this.entriesAsync(range)){
117
- yield this.#denormalizeKey(key);
97
+ yield key;
98
+ }
99
+ }
100
+ /**
101
+ * IndexedDB's structured clone downcasts Buffer (a Node.js subclass of Uint8Array) to plain Uint8Array.
102
+ * This breaks .toString() behavior: Buffer.toString() returns UTF-8, Uint8Array.toString() returns
103
+ * comma-separated decimal bytes. We restore Buffer identity on read so callers get consistent behavior.
104
+ */ restoreBuffers(val) {
105
+ if (val instanceof Uint8Array && !Buffer.isBuffer(val)) {
106
+ return Buffer.from(val);
118
107
  }
108
+ return val;
119
109
  }
120
110
  #denormalizeKey(key) {
121
- const denormalizedKey = key.split(',').map((part)=>isNaN(parseInt(part)) ? part : parseInt(part));
122
- return denormalizedKey.length > 1 ? denormalizedKey : key;
111
+ return key.length > 1 ? key : key[0];
123
112
  }
124
- #normalizeKey(key) {
125
- const arrayKey = Array.isArray(key) ? key : [
113
+ normalizeKey(key) {
114
+ return Array.isArray(key) ? key : [
126
115
  key
127
116
  ];
128
- return arrayKey.join(',');
129
117
  }
130
- #slot(key, index = 0) {
131
- return `map:${this.name}:slot:${this.#normalizeKey(key)}:${index}`;
118
+ slot(key, index = 0) {
119
+ return `map:${this.name}:slot:${this.normalizeKey(key)}:${index}`;
132
120
  }
133
121
  }
@@ -0,0 +1,14 @@
1
+ import type { Key, Value } from '../interfaces/common.js';
2
+ import type { AztecAsyncMultiMap } from '../interfaces/multi_map.js';
3
+ import { IndexedDBAztecMap } from './map.js';
4
+ /**
5
+ * A multi map backed by IndexedDB.
6
+ */
7
+ export declare class IndexedDBAztecMultiMap<K extends Key, V extends Value> extends IndexedDBAztecMap<K, V> implements AztecAsyncMultiMap<K, V> {
8
+ set(key: K, val: V): Promise<void>;
9
+ getValuesAsync(key: K): AsyncIterableIterator<V>;
10
+ getValueCountAsync(key: K): Promise<number>;
11
+ deleteValue(key: K, val: V): Promise<void>;
12
+ delete(key: K): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlfbWFwLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXhlZGRiL211bHRpX21hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFN0M7O0dBRUc7QUFDSCxxQkFBYSxzQkFBc0IsQ0FBQyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxLQUFLLENBQ2hFLFNBQVEsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDOUIsWUFBVyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXBCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWtDaEQ7SUFFTSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FZdEQ7SUFFRCxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FVMUM7SUFFSyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FjL0M7SUFFYyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBWTNDO0NBQ0YifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi_map.d.ts","sourceRoot":"","sources":["../../src/indexeddb/multi_map.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C;;GAEG;AACH,qBAAa,sBAAsB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,CAChE,SAAQ,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAC9B,YAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;IAEpB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChD;IAEM,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAYtD;IAED,kBAAkB,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAU1C;IAEK,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/C;IAEc,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3C;CACF"}
@@ -0,0 +1,107 @@
1
+ import { hash } from 'ohash';
2
+ import { IndexedDBAztecMap } from './map.js';
3
+ /**
4
+ * A multi map backed by IndexedDB.
5
+ */ export class IndexedDBAztecMultiMap extends IndexedDBAztecMap {
6
+ async set(key, val) {
7
+ // Inserting repeated values is a no-op
8
+ const exists = !!await this.db.index('hash').get(IDBKeyRange.bound([
9
+ this.container,
10
+ this.normalizeKey(key),
11
+ hash(val)
12
+ ], [
13
+ this.container,
14
+ this.normalizeKey(key),
15
+ hash(val)
16
+ ]));
17
+ if (exists) {
18
+ return;
19
+ }
20
+ // Get the maximum keyCount for the given key
21
+ // In order to support sparse multimaps, we cannot rely
22
+ // on just counting the number of entries for the key, since we would repeat slots
23
+ // if we delete an entry
24
+ // set -> container:key:0 (keyCount = 1)
25
+ // set -> container:key:1 (keyCount = 2)
26
+ // delete -> container:key:0 (keyCount = 1)
27
+ // set -> container:key:1 <--- already exists!
28
+ // Instead, we iterate in reverse order to get the last inserted entry
29
+ const index = this.db.index('keyCount');
30
+ const rangeQuery = IDBKeyRange.upperBound([
31
+ this.container,
32
+ this.normalizeKey(key),
33
+ Number.MAX_SAFE_INTEGER
34
+ ]);
35
+ const maxEntry = (await index.iterate(rangeQuery, 'prevunique').next()).value;
36
+ const count = maxEntry?.value?.keyCount ?? 0;
37
+ await this.db.put({
38
+ value: val,
39
+ hash: hash(val),
40
+ container: this.container,
41
+ key: this.normalizeKey(key),
42
+ keyCount: count + 1,
43
+ slot: this.slot(key, count)
44
+ });
45
+ }
46
+ async *getValuesAsync(key) {
47
+ // Iterate over the whole range of keyCount for the given key
48
+ const index = this.db.index('keyCount');
49
+ const rangeQuery = IDBKeyRange.bound([
50
+ this.container,
51
+ this.normalizeKey(key),
52
+ 0
53
+ ], [
54
+ this.container,
55
+ this.normalizeKey(key),
56
+ Number.MAX_SAFE_INTEGER
57
+ ], false, false);
58
+ for await (const cursor of index.iterate(rangeQuery)){
59
+ yield this.restoreBuffers(cursor.value.value);
60
+ }
61
+ }
62
+ getValueCountAsync(key) {
63
+ // Count entries over the keyCount index range for this key
64
+ const index = this.db.index('keyCount');
65
+ const rangeQuery = IDBKeyRange.bound([
66
+ this.container,
67
+ this.normalizeKey(key),
68
+ 0
69
+ ], [
70
+ this.container,
71
+ this.normalizeKey(key),
72
+ Number.MAX_SAFE_INTEGER
73
+ ], false, false);
74
+ return index.count(rangeQuery);
75
+ }
76
+ async deleteValue(key, val) {
77
+ // Since we know the value, we can hash it and directly query the "hash" index
78
+ // to avoid having to iterate over all the values
79
+ const fullKey = await this.db.index('hash').getKey(IDBKeyRange.bound([
80
+ this.container,
81
+ this.normalizeKey(key),
82
+ hash(val)
83
+ ], [
84
+ this.container,
85
+ this.normalizeKey(key),
86
+ hash(val)
87
+ ]));
88
+ if (fullKey) {
89
+ await this.db.delete(fullKey);
90
+ }
91
+ }
92
+ async delete(key) {
93
+ const index = this.db.index('keyCount');
94
+ const rangeQuery = IDBKeyRange.bound([
95
+ this.container,
96
+ this.normalizeKey(key),
97
+ 0
98
+ ], [
99
+ this.container,
100
+ this.normalizeKey(key),
101
+ Number.MAX_SAFE_INTEGER
102
+ ], false, false);
103
+ for await (const cursor of index.iterate(rangeQuery)){
104
+ await cursor.delete();
105
+ }
106
+ }
107
+ }
@@ -14,4 +14,4 @@ export declare class IndexedDBAztecSet<K extends Key> implements AztecAsyncSet<K
14
14
  delete(key: K): Promise<void>;
15
15
  entriesAsync(range?: Range<K>): AsyncIterableIterator<K>;
16
16
  }
17
- //# sourceMappingURL=set.d.ts.map
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXhlZGRiL3NldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXpELE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQ7O0dBRUc7QUFDSCxxQkFBYSxpQkFBaUIsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFFLFlBQVcsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN2RSxPQUFPLENBQUMsR0FBRyxDQUFnQztJQUUzQyxZQUFZLE1BQU0sRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFFaEU7SUFFRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsR0FBRyxTQUFTLEVBRXBGO0lBRUQsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUVqQztJQUVELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFekI7SUFFRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRTVCO0lBRU0sWUFBWSxDQUFDLEtBQUssR0FBRSxLQUFLLENBQUMsQ0FBQyxDQUFNLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBRWxFO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/indexeddb/set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,GAAG,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAgC;gBAE/B,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM;IAIjE,IAAI,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,EAEpF;IAED,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAItB,YAAY,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC;CAGpE"}
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/indexeddb/set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,GAAG,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAgC;IAE3C,YAAY,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAEhE;IAED,IAAI,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,EAEpF;IAED,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjC;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzB;IAED,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5B;IAEM,YAAY,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAElE;CACF"}
@@ -1,10 +1,11 @@
1
1
  import type { IDBPDatabase, IDBPObjectStore } from 'idb';
2
+ import type { Value } from '../interfaces/common.js';
2
3
  import type { AztecAsyncSingleton } from '../interfaces/singleton.js';
3
4
  import type { AztecIDBSchema } from './store.js';
4
5
  /**
5
6
  * Stores a single value in IndexedDB.
6
7
  */
7
- export declare class IndexedDBAztecSingleton<T> implements AztecAsyncSingleton<T> {
8
+ export declare class IndexedDBAztecSingleton<T extends Value> implements AztecAsyncSingleton<T> {
8
9
  #private;
9
10
  constructor(rootDB: IDBPDatabase<AztecIDBSchema>, name: string);
10
11
  set db(db: IDBPObjectStore<AztecIDBSchema, ['data'], 'data', 'readwrite'> | undefined);
@@ -13,4 +14,4 @@ export declare class IndexedDBAztecSingleton<T> implements AztecAsyncSingleton<T
13
14
  set(val: T): Promise<boolean>;
14
15
  delete(): Promise<boolean>;
15
16
  }
16
- //# sourceMappingURL=singleton.d.ts.map
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xldG9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXhlZGRiL3NpbmdsZXRvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBR3pELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpEOztHQUVHO0FBQ0gscUJBQWEsdUJBQXVCLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBRSxZQUFXLG1CQUFtQixDQUFDLENBQUMsQ0FBQzs7SUFNckYsWUFBWSxNQUFNLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBSTdEO0lBRUQsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsU0FBUyxFQUVwRjtJQUVELElBQUksRUFBRSxJQUFJLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBRXZFO0lBRUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBR3ZDO0lBRUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQVVsQztJQUVLLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBRy9CO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/indexeddb/singleton.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,uBAAuB,CAAC,CAAC,CAAE,YAAW,mBAAmB,CAAC,CAAC,CAAC;;gBAM3D,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM;IAM9D,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,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAKlC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAW7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAIjC"}
1
+ {"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/indexeddb/singleton.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAGzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,uBAAuB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,mBAAmB,CAAC,CAAC,CAAC;;IAMrF,YAAY,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAI7D;IAED,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,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAGvC;IAEK,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAUlC;IAEK,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAG/B;CACF"}
@@ -1,3 +1,4 @@
1
+ import { hash } from 'ohash';
1
2
  /**
2
3
  * Stores a single value in IndexedDB.
3
4
  */ export class IndexedDBAztecSingleton {
@@ -24,9 +25,12 @@
24
25
  const result = await this.db.put({
25
26
  container: this.#container,
26
27
  slot: this.#slot,
27
- key: this.#slot,
28
+ key: [
29
+ this.#slot
30
+ ],
28
31
  keyCount: 1,
29
- value: val
32
+ value: val,
33
+ hash: hash(val)
30
34
  });
31
35
  return result !== undefined;
32
36
  }