@aztec/kv-store 5.0.1 → 5.1.0-nightly.20260717

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.
@@ -24,4 +24,22 @@ export declare class SqliteEncryptionError extends Error {
24
24
  * strings.
25
25
  **/
26
26
  export declare function isDecryptFailureMessage(message: string): boolean;
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3FsaXRlLW9wZnMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE1BQU0seUJBQXlCLEdBQ2pDLG9CQUFvQixHQUNwQix3Q0FBd0MsR0FDeEMsZ0JBQWdCLENBQUM7QUFFckI7O0lBRUk7QUFDSixxQkFBYSxxQkFBc0IsU0FBUSxLQUFLO0lBQzlDLFFBQVEsQ0FBQyxJQUFJLEVBQUUseUJBQXlCLENBQUM7SUFFekMsWUFBWSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtRQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQTtLQUFFLEVBSXZGO0NBQ0Y7QUFVRDs7O0lBR0k7QUFDSix3QkFBZ0IsdUJBQXVCLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBRWhFIn0=
27
+ /**
28
+ * Error thrown by sqlite-opfs when the on-disk database image is corrupt
29
+ * (`SQLITE_CORRUPT`, result code 11 — "database disk image is malformed").
30
+ *
31
+ * Distinct from {@link SqliteEncryptionError}: no key recovers a corrupt image,
32
+ * so there is nothing to retry. The only escape is to delete the store and start
33
+ * fresh, so consumers pattern-match on `instanceof SqliteCorruptionError` to wipe
34
+ * and reopen rather than surfacing a dead-end error.
35
+ **/
36
+ export declare class SqliteCorruptionError extends Error {
37
+ constructor(message: string, opts?: {
38
+ cause?: unknown;
39
+ });
40
+ }
41
+ /**
42
+ * Returns `true` if `message` matches one of the known SQLite corruption strings.
43
+ **/
44
+ export declare function isCorruptionMessage(message: string): boolean;
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3FsaXRlLW9wZnMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE1BQU0seUJBQXlCLEdBQ2pDLG9CQUFvQixHQUNwQix3Q0FBd0MsR0FDeEMsZ0JBQWdCLENBQUM7QUFFckI7O0lBRUk7QUFDSixxQkFBYSxxQkFBc0IsU0FBUSxLQUFLO0lBQzlDLFFBQVEsQ0FBQyxJQUFJLEVBQUUseUJBQXlCLENBQUM7SUFFekMsWUFBWSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtRQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQTtLQUFFLEVBSXZGO0NBQ0Y7QUFVRDs7O0lBR0k7QUFDSix3QkFBZ0IsdUJBQXVCLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBRWhFO0FBRUQ7Ozs7Ozs7O0lBUUk7QUFDSixxQkFBYSxxQkFBc0IsU0FBUSxLQUFLO0lBQzlDLFlBQVksT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtRQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQTtLQUFFLEVBR3REO0NBQ0Y7QUFhRDs7SUFFSTtBQUNKLHdCQUFnQixtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FFNUQifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/sqlite-opfs/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,yBAAyB,GACjC,oBAAoB,GACpB,wCAAwC,GACxC,gBAAgB,CAAC;AAErB;;IAEI;AACJ,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IAEzC,YAAY,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAIvF;CACF;AAUD;;;IAGI;AACJ,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEhE"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/sqlite-opfs/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,yBAAyB,GACjC,oBAAoB,GACpB,wCAAwC,GACxC,gBAAgB,CAAC;AAErB;;IAEI;AACJ,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IAEzC,YAAY,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAIvF;CACF;AAUD;;;IAGI;AACJ,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;;;;IAQI;AACJ,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAGtD;CACF;AAaD;;IAEI;AACJ,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5D"}
@@ -32,3 +32,33 @@
32
32
  **/ export function isDecryptFailureMessage(message) {
33
33
  return SQLITE3MC_DECRYPT_ERROR_PATTERNS.some((p)=>p.test(message));
34
34
  }
35
+ /**
36
+ * Error thrown by sqlite-opfs when the on-disk database image is corrupt
37
+ * (`SQLITE_CORRUPT`, result code 11 — "database disk image is malformed").
38
+ *
39
+ * Distinct from {@link SqliteEncryptionError}: no key recovers a corrupt image,
40
+ * so there is nothing to retry. The only escape is to delete the store and start
41
+ * fresh, so consumers pattern-match on `instanceof SqliteCorruptionError` to wipe
42
+ * and reopen rather than surfacing a dead-end error.
43
+ **/ export class SqliteCorruptionError extends Error {
44
+ constructor(message, opts){
45
+ super(message, opts?.cause !== undefined ? {
46
+ cause: opts.cause
47
+ } : undefined);
48
+ this.name = 'SqliteCorruptionError';
49
+ }
50
+ }
51
+ /**
52
+ * Strings/codes raised by SQLite when a database image is corrupt. Kept disjoint
53
+ * from {@link SQLITE3MC_DECRYPT_ERROR_PATTERNS}: "file is not a database"
54
+ * (SQLITE_NOTADB) is the decrypt signal, whereas a malformed image is the
55
+ * genuinely-unrecoverable SQLITE_CORRUPT.
56
+ **/ const SQLITE_CORRUPTION_ERROR_PATTERNS = [
57
+ /database disk image is malformed/i,
58
+ /\bSQLITE_CORRUPT\b/i
59
+ ];
60
+ /**
61
+ * Returns `true` if `message` matches one of the known SQLite corruption strings.
62
+ **/ export function isCorruptionMessage(message) {
63
+ return SQLITE_CORRUPTION_ERROR_PATTERNS.some((p)=>p.test(message));
64
+ }
@@ -1,6 +1,6 @@
1
1
  import { AztecSQLiteOPFSStore } from './store.js';
2
2
  export { AztecSQLiteOPFSStore } from './store.js';
3
- export { SqliteEncryptionError } from './errors.js';
3
+ export { SqliteCorruptionError, SqliteEncryptionError } from './errors.js';
4
4
  export type { SqliteEncryptionErrorCode } from './errors.js';
5
5
  export { OPFS_POOL_DIR_PREFIX, deleteStore, listStores, storePoolDirectory } from './manage.js';
6
6
  export declare function openTmpStore(ephemeral?: boolean): Promise<AztecSQLiteOPFSStore>;
@@ -11,4 +11,4 @@ export declare function openTmpStore(ephemeral?: boolean): Promise<AztecSQLiteOP
11
11
  * on ephemeral `:memory:` databases) in an auto-generated OPFS directory.
12
12
  */
13
13
  export declare function openEncryptedStore(encryptionKey: Uint8Array, name?: string, poolDirectory?: string): Promise<AztecSQLiteOPFSStore>;
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcWxpdGUtb3Bmcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRCxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFaEcsd0JBQWdCLFlBQVksQ0FBQyxTQUFTLEdBQUUsT0FBZSxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUV0RjtBQUVEOzs7OztHQUtHO0FBQ0gsd0JBQWdCLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLE1BQU0saUNBRWxHIn0=
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcWxpdGUtb3Bmcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFaEcsd0JBQWdCLFlBQVksQ0FBQyxTQUFTLEdBQUUsT0FBZSxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUV0RjtBQUVEOzs7OztHQUtHO0FBQ0gsd0JBQWdCLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLE1BQU0saUNBRWxHIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sqlite-opfs/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEhG,wBAAgB,YAAY,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAEtF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,iCAElG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sqlite-opfs/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC3E,YAAY,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEhG,wBAAgB,YAAY,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAEtF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,iCAElG"}
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
2
  import { AztecSQLiteOPFSStore } from './store.js';
3
3
  export { AztecSQLiteOPFSStore } from './store.js';
4
- export { SqliteEncryptionError } from './errors.js';
4
+ export { SqliteCorruptionError, SqliteEncryptionError } from './errors.js';
5
5
  export { OPFS_POOL_DIR_PREFIX, deleteStore, listStores, storePoolDirectory } from './manage.js';
6
6
  export function openTmpStore(ephemeral = false) {
7
7
  return AztecSQLiteOPFSStore.open(createLogger('kv-store:sqlite-opfs'), undefined, ephemeral);
@@ -76,4 +76,4 @@ export declare class AztecSQLiteOPFSStore implements AztecAsyncKVStore {
76
76
  /** Runs a SELECT statement and returns rows in array row-mode. */
77
77
  allAsync(sql: string, bind?: SqlValue[]): Promise<ResultRow[]>;
78
78
  }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcWxpdGUtb3Bmcy9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdwRCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJaEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBaUMsTUFBTSxlQUFlLENBQUM7QUFLeEY7Ozs7Ozs7OztHQVNHO0FBQ0gscUJBQWEsb0JBQXFCLFlBQVcsaUJBQWlCOzthQWMxQyxXQUFXLEVBQUUsT0FBTztJQUp0QyxPQUFPLGVBd0JOO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsT0FBYSxJQUFJLENBQ2YsR0FBRyxFQUFFLE1BQU0sRUFDWCxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQ2IsU0FBUyxHQUFFLE9BQWUsRUFDMUIsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUN0QixhQUFhLENBQUMsRUFBRSxVQUFVLEdBQ3pCLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQWlDL0I7SUFFRCxPQUFPLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FFekU7SUFFRCxPQUFPLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FFckQ7SUFFRCxZQUFZLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUVuRjtJQUVELFdBQVcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBRTlEO0lBRUQsU0FBUyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBRTNEO0lBRUQsYUFBYSxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FFbkU7SUFFRCxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0F3QjFEO0lBRUssS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFM0I7SUFFSyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQVc1QjtJQUVEOzs7Ozs7O09BT0c7SUFDSCxZQUFZLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUVqQztJQUVLLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBUzNCO0lBRUQsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFNUQ7SUFFRDs7OztPQUlHO0lBQ0csUUFBUSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FNcEM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0FNckU7SUFFRCxrRUFBa0U7SUFDbEUsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBSTdEO0NBZ0RGIn0=
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcWxpdGUtb3Bmcy9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdwRCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJaEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBaUMsTUFBTSxlQUFlLENBQUM7QUFLeEY7Ozs7Ozs7OztHQVNHO0FBQ0gscUJBQWEsb0JBQXFCLFlBQVcsaUJBQWlCOzthQWMxQyxXQUFXLEVBQUUsT0FBTztJQUp0QyxPQUFPLGVBd0JOO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsT0FBYSxJQUFJLENBQ2YsR0FBRyxFQUFFLE1BQU0sRUFDWCxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQ2IsU0FBUyxHQUFFLE9BQWUsRUFDMUIsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUN0QixhQUFhLENBQUMsRUFBRSxVQUFVLEdBQ3pCLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQWlDL0I7SUFFRCxPQUFPLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FFekU7SUFFRCxPQUFPLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FFckQ7SUFFRCxZQUFZLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUVuRjtJQUVELFdBQVcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBRTlEO0lBRUQsU0FBUyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBRTNEO0lBRUQsYUFBYSxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FFbkU7SUFFRCxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0F3QjFEO0lBRUssS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFM0I7SUFFSyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQVc1QjtJQUVEOzs7Ozs7O09BT0c7SUFDSCxZQUFZLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUVqQztJQUVLLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBUzNCO0lBRUQsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFNUQ7SUFFRDs7OztPQUlHO0lBQ0csUUFBUSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FNcEM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0FNckU7SUFFRCxrRUFBa0U7SUFDbEUsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBSTdEO0NBb0RGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/sqlite-opfs/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/sqlite-opfs/store.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { SerialQueue } from '@aztec/foundation/queue';
2
2
  import { SQLiteOPFSAztecArray } from './array.js';
3
- import { SqliteEncryptionError } from './errors.js';
3
+ import { SqliteCorruptionError, SqliteEncryptionError, isCorruptionMessage } from './errors.js';
4
4
  import { SQLiteOPFSAztecMap } from './map.js';
5
5
  import { SQLiteOPFSAztecMultiMap } from './multi_map.js';
6
6
  import { SQLiteOPFSAztecSet } from './set.js';
@@ -257,11 +257,15 @@ import { SQLiteOPFSAztecSingleton } from './singleton.js';
257
257
  this.#pending.set(req.id, {
258
258
  resolve: (resp)=>{
259
259
  if (resp.type === 'err') {
260
- // Re-hydrate encryption-shaped errors as the typed class so consumers
261
- // can pattern-match on `instanceof SqliteEncryptionError`. Plain
262
- // errors stay plain the wire protocol only tags encryption paths.
260
+ // Re-hydrate typed errors so consumers can pattern-match on
261
+ // `instanceof`. Encryption is tagged on the wire (some cases are
262
+ // pre-flight throws with no message to match); corruption is a
263
+ // single unambiguous message, so we classify it here rather than
264
+ // adding a redundant wire field. Everything else stays a plain Error.
263
265
  if (resp.encryptionCode !== undefined) {
264
266
  reject(new SqliteEncryptionError(resp.encryptionCode, resp.message));
267
+ } else if (isCorruptionMessage(resp.message)) {
268
+ reject(new SqliteCorruptionError(resp.message));
265
269
  } else {
266
270
  reject(new Error(resp.message));
267
271
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/kv-store",
3
- "version": "5.0.1",
3
+ "version": "5.1.0-nightly.20260717",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/interfaces/index.js",
@@ -36,12 +36,12 @@
36
36
  "./package.local.json"
37
37
  ],
38
38
  "dependencies": {
39
- "@aztec/constants": "5.0.1",
40
- "@aztec/ethereum": "5.0.1",
41
- "@aztec/foundation": "5.0.1",
42
- "@aztec/native": "5.0.1",
43
- "@aztec/sqlite3mc-wasm": "5.0.1",
44
- "@aztec/stdlib": "5.0.1",
39
+ "@aztec/constants": "5.1.0-nightly.20260717",
40
+ "@aztec/ethereum": "5.1.0-nightly.20260717",
41
+ "@aztec/foundation": "5.1.0-nightly.20260717",
42
+ "@aztec/native": "5.1.0-nightly.20260717",
43
+ "@aztec/sqlite3mc-wasm": "5.1.0-nightly.20260717",
44
+ "@aztec/stdlib": "5.1.0-nightly.20260717",
45
45
  "idb": "^8.0.0",
46
46
  "lmdb": "^3.2.0",
47
47
  "msgpackr": "^1.11.2",
@@ -42,3 +42,37 @@ const SQLITE3MC_DECRYPT_ERROR_PATTERNS: readonly RegExp[] = [
42
42
  export function isDecryptFailureMessage(message: string): boolean {
43
43
  return SQLITE3MC_DECRYPT_ERROR_PATTERNS.some(p => p.test(message));
44
44
  }
45
+
46
+ /**
47
+ * Error thrown by sqlite-opfs when the on-disk database image is corrupt
48
+ * (`SQLITE_CORRUPT`, result code 11 — "database disk image is malformed").
49
+ *
50
+ * Distinct from {@link SqliteEncryptionError}: no key recovers a corrupt image,
51
+ * so there is nothing to retry. The only escape is to delete the store and start
52
+ * fresh, so consumers pattern-match on `instanceof SqliteCorruptionError` to wipe
53
+ * and reopen rather than surfacing a dead-end error.
54
+ **/
55
+ export class SqliteCorruptionError extends Error {
56
+ constructor(message: string, opts?: { cause?: unknown }) {
57
+ super(message, opts?.cause !== undefined ? { cause: opts.cause } : undefined);
58
+ this.name = 'SqliteCorruptionError';
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Strings/codes raised by SQLite when a database image is corrupt. Kept disjoint
64
+ * from {@link SQLITE3MC_DECRYPT_ERROR_PATTERNS}: "file is not a database"
65
+ * (SQLITE_NOTADB) is the decrypt signal, whereas a malformed image is the
66
+ * genuinely-unrecoverable SQLITE_CORRUPT.
67
+ **/
68
+ const SQLITE_CORRUPTION_ERROR_PATTERNS: readonly RegExp[] = [
69
+ /database disk image is malformed/i,
70
+ /\bSQLITE_CORRUPT\b/i,
71
+ ];
72
+
73
+ /**
74
+ * Returns `true` if `message` matches one of the known SQLite corruption strings.
75
+ **/
76
+ export function isCorruptionMessage(message: string): boolean {
77
+ return SQLITE_CORRUPTION_ERROR_PATTERNS.some(p => p.test(message));
78
+ }
@@ -3,7 +3,7 @@ import { createLogger } from '@aztec/foundation/log';
3
3
  import { AztecSQLiteOPFSStore } from './store.js';
4
4
 
5
5
  export { AztecSQLiteOPFSStore } from './store.js';
6
- export { SqliteEncryptionError } from './errors.js';
6
+ export { SqliteCorruptionError, SqliteEncryptionError } from './errors.js';
7
7
  export type { SqliteEncryptionErrorCode } from './errors.js';
8
8
  export { OPFS_POOL_DIR_PREFIX, deleteStore, listStores, storePoolDirectory } from './manage.js';
9
9
 
@@ -10,7 +10,7 @@ import type { AztecAsyncSet } from '../interfaces/set.js';
10
10
  import type { AztecAsyncSingleton } from '../interfaces/singleton.js';
11
11
  import type { AztecAsyncKVStore } from '../interfaces/store.js';
12
12
  import { SQLiteOPFSAztecArray } from './array.js';
13
- import { SqliteEncryptionError } from './errors.js';
13
+ import { SqliteCorruptionError, SqliteEncryptionError, isCorruptionMessage } from './errors.js';
14
14
  import { SQLiteOPFSAztecMap } from './map.js';
15
15
  import type { ResultRow, SqlValue, WorkerRequest, WorkerResponse } from './messages.js';
16
16
  import { SQLiteOPFSAztecMultiMap } from './multi_map.js';
@@ -272,11 +272,15 @@ export class AztecSQLiteOPFSStore implements AztecAsyncKVStore {
272
272
  this.#pending.set(req.id, {
273
273
  resolve: resp => {
274
274
  if (resp.type === 'err') {
275
- // Re-hydrate encryption-shaped errors as the typed class so consumers
276
- // can pattern-match on `instanceof SqliteEncryptionError`. Plain
277
- // errors stay plain the wire protocol only tags encryption paths.
275
+ // Re-hydrate typed errors so consumers can pattern-match on
276
+ // `instanceof`. Encryption is tagged on the wire (some cases are
277
+ // pre-flight throws with no message to match); corruption is a
278
+ // single unambiguous message, so we classify it here rather than
279
+ // adding a redundant wire field. Everything else stays a plain Error.
278
280
  if (resp.encryptionCode !== undefined) {
279
281
  reject(new SqliteEncryptionError(resp.encryptionCode, resp.message));
282
+ } else if (isCorruptionMessage(resp.message)) {
283
+ reject(new SqliteCorruptionError(resp.message));
280
284
  } else {
281
285
  reject(new Error(resp.message));
282
286
  }