@aztec/kv-store 1.0.0 → 1.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/indexeddb/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAA0C,MAAM,KAAK,CAAC;AAE/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAOhE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,KAAK,IAAI;IACxC,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,IAAI,EAAE;QACJ,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QACvB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KAC7E,CAAC;CACH;AAED;;GAEG;AAEH,qBAAa,mBAAoB,YAAW,iBAAiB;;aAezC,WAAW,EAAE,OAAO;gBADpC,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EACpB,WAAW,EAAE,OAAO,EACpC,IAAI,EAAE,MAAM;IAKd;;;;;;;;;OASG;WACU,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAqBvG;;;;OAIG;IACH,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAM1E;;;;OAIG;IACH,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;IAMtD;;;;OAIG;IACH,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;IAMpF,WAAW,CAAC,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAI/D;;;;OAIG;IACH,SAAS,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;IAM5D;;;;OAIG;IACH,aAAa,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC;IAMpE;;;;OAIG;IACG,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAwBjE;;OAEG;IACG,KAAK;IAIX,kDAAkD;IAClD,MAAM;IAMN,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9D"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/indexeddb/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAoB,MAAM,KAAK,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAOhE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,KAAK,IAAI;IACxC,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,IAAI,EAAE;QACJ,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QACvB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KAC7E,CAAC;CACH;AAED;;GAEG;AAEH,qBAAa,mBAAoB,YAAW,iBAAiB;;aAezC,WAAW,EAAE,OAAO;gBADpC,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EACpB,WAAW,EAAE,OAAO,EACpC,IAAI,EAAE,MAAM;IAOd;;;;;;;;;OASG;WACU,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAqBvG;;;;OAIG;IACH,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAM1E;;;;OAIG;IACH,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;IAMtD;;;;OAIG;IACH,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;IAMpF,WAAW,CAAC,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAI/D;;;;OAIG;IACH,SAAS,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;IAM5D;;;;OAIG;IACH,aAAa,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC;IAMpE;;;;OAIG;IACH,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAuB3D;;OAEG;IACG,KAAK;IAIX,kDAAkD;IAClD,MAAM;IAMN,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9D"}
@@ -1,3 +1,4 @@
1
+ import { SerialQueue } from '@aztec/foundation/queue';
1
2
  import { deleteDB, openDB } from 'idb';
2
3
  import { IndexedDBAztecArray } from './array.js';
3
4
  import { IndexedDBAztecMap } from './map.js';
@@ -10,13 +11,15 @@ import { IndexedDBAztecSingleton } from './singleton.js';
10
11
  isEphemeral;
11
12
  #rootDB;
12
13
  #name;
13
- #currentTx;
14
+ #txQueue;
14
15
  #containers;
15
16
  constructor(rootDB, isEphemeral, name){
16
17
  this.isEphemeral = isEphemeral;
17
18
  this.#containers = new Set();
18
19
  this.#rootDB = rootDB;
19
20
  this.#name = name;
21
+ this.#txQueue = new SerialQueue();
22
+ this.#txQueue.start();
20
23
  }
21
24
  /**
22
25
  * Creates a new AztecKVStore backed by IndexedDB. The path to the database is optional. If not provided,
@@ -116,27 +119,26 @@ import { IndexedDBAztecSingleton } from './singleton.js';
116
119
  * Runs a callback in a transaction.
117
120
  * @param callback - Function to execute in a transaction
118
121
  * @returns A promise that resolves to the return value of the callback
119
- */ async transactionAsync(callback) {
122
+ */ transactionAsync(callback) {
120
123
  // We can only have one transaction at a time for the same store
121
124
  // So we need to wait for the current one to finish
122
- if (this.#currentTx) {
123
- await this.#currentTx.done;
124
- }
125
- this.#currentTx = this.#rootDB.transaction('data', 'readwrite');
126
- for (const container of this.#containers){
127
- container.db = this.#currentTx.store;
128
- }
129
- // Avoid awaiting this promise so it doesn't get scheduled in the next microtask
130
- // By then, the tx would be closed
131
- const runningPromise = callback();
132
- // Wait for the transaction to finish
133
- await this.#currentTx.done;
134
- for (const container of this.#containers){
135
- container.db = undefined;
136
- }
137
- // Return the result of the callback.
138
- // Tx is guaranteed to already be closed, so the await doesn't hurt anything here
139
- return await runningPromise;
125
+ return this.#txQueue.put(async ()=>{
126
+ const tx = this.#rootDB.transaction('data', 'readwrite');
127
+ for (const container of this.#containers){
128
+ container.db = tx.store;
129
+ }
130
+ // Avoid awaiting this promise so it doesn't get scheduled in the next microtask
131
+ // By then, the tx would be closed
132
+ const runningPromise = callback();
133
+ // Wait for the transaction to finish
134
+ await tx.done;
135
+ for (const container of this.#containers){
136
+ container.db = undefined;
137
+ }
138
+ // Return the result of the callback.
139
+ // Tx is guaranteed to already be closed, so the await doesn't hurt anything here
140
+ return await runningPromise;
141
+ });
140
142
  }
141
143
  /**
142
144
  * Clears all entries in the store & sub DBs.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/kv-store",
3
- "version": "1.0.0",
3
+ "version": "1.1.2",
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": "1.0.0",
28
- "@aztec/foundation": "1.0.0",
29
- "@aztec/native": "1.0.0",
30
- "@aztec/stdlib": "1.0.0",
27
+ "@aztec/ethereum": "1.1.2",
28
+ "@aztec/foundation": "1.1.2",
29
+ "@aztec/native": "1.1.2",
30
+ "@aztec/stdlib": "1.1.2",
31
31
  "idb": "^8.0.0",
32
32
  "lmdb": "^3.2.0",
33
33
  "msgpackr": "^1.11.2",
@@ -1,6 +1,7 @@
1
1
  import type { Logger } from '@aztec/foundation/log';
2
+ import { SerialQueue } from '@aztec/foundation/queue';
2
3
 
3
- import { type DBSchema, type IDBPDatabase, type IDBPTransaction, deleteDB, openDB } from 'idb';
4
+ import { type DBSchema, type IDBPDatabase, deleteDB, openDB } from 'idb';
4
5
 
5
6
  import type { AztecAsyncArray } from '../interfaces/array.js';
6
7
  import type { Key, StoreSize, Value } from '../interfaces/common.js';
@@ -40,7 +41,7 @@ export interface AztecIDBSchema extends DBSchema {
40
41
  export class AztecIndexedDBStore implements AztecAsyncKVStore {
41
42
  #rootDB: IDBPDatabase<AztecIDBSchema>;
42
43
  #name: string;
43
- #currentTx: IDBPTransaction<AztecIDBSchema, ['data'], 'readwrite'> | undefined;
44
+ #txQueue: SerialQueue;
44
45
 
45
46
  #containers = new Set<
46
47
  | IndexedDBAztecArray<any>
@@ -57,6 +58,8 @@ export class AztecIndexedDBStore implements AztecAsyncKVStore {
57
58
  ) {
58
59
  this.#rootDB = rootDB;
59
60
  this.#name = name;
61
+ this.#txQueue = new SerialQueue();
62
+ this.#txQueue.start();
60
63
  }
61
64
  /**
62
65
  * Creates a new AztecKVStore backed by IndexedDB. The path to the database is optional. If not provided,
@@ -153,28 +156,27 @@ export class AztecIndexedDBStore implements AztecAsyncKVStore {
153
156
  * @param callback - Function to execute in a transaction
154
157
  * @returns A promise that resolves to the return value of the callback
155
158
  */
156
- async transactionAsync<T>(callback: () => Promise<T>): Promise<T> {
159
+ transactionAsync<T>(callback: () => Promise<T>): Promise<T> {
157
160
  // We can only have one transaction at a time for the same store
158
161
  // So we need to wait for the current one to finish
159
- if (this.#currentTx) {
160
- await this.#currentTx.done;
161
- }
162
- this.#currentTx = this.#rootDB.transaction('data', 'readwrite');
163
- for (const container of this.#containers) {
164
- container.db = this.#currentTx.store;
165
- }
166
- // Avoid awaiting this promise so it doesn't get scheduled in the next microtask
167
- // By then, the tx would be closed
168
- const runningPromise = callback();
169
- // Wait for the transaction to finish
170
- await this.#currentTx.done;
171
- for (const container of this.#containers) {
172
- container.db = undefined;
173
- }
174
-
175
- // Return the result of the callback.
176
- // Tx is guaranteed to already be closed, so the await doesn't hurt anything here
177
- return await runningPromise;
162
+ return this.#txQueue.put(async () => {
163
+ const tx = this.#rootDB.transaction('data', 'readwrite');
164
+ for (const container of this.#containers) {
165
+ container.db = tx.store;
166
+ }
167
+ // Avoid awaiting this promise so it doesn't get scheduled in the next microtask
168
+ // By then, the tx would be closed
169
+ const runningPromise = callback();
170
+ // Wait for the transaction to finish
171
+ await tx.done;
172
+ for (const container of this.#containers) {
173
+ container.db = undefined;
174
+ }
175
+
176
+ // Return the result of the callback.
177
+ // Tx is guaranteed to already be closed, so the await doesn't hurt anything here
178
+ return await runningPromise;
179
+ });
178
180
  }
179
181
 
180
182
  /**