@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.
- package/dest/sqlite-opfs/errors.d.ts +19 -1
- package/dest/sqlite-opfs/errors.d.ts.map +1 -1
- package/dest/sqlite-opfs/errors.js +30 -0
- package/dest/sqlite-opfs/index.d.ts +2 -2
- package/dest/sqlite-opfs/index.d.ts.map +1 -1
- package/dest/sqlite-opfs/index.js +1 -1
- package/dest/sqlite-opfs/store.d.ts +1 -1
- package/dest/sqlite-opfs/store.d.ts.map +1 -1
- package/dest/sqlite-opfs/store.js +8 -4
- package/package.json +7 -7
- package/src/sqlite-opfs/errors.ts +34 -0
- package/src/sqlite-opfs/index.ts +1 -1
- package/src/sqlite-opfs/store.ts +8 -4
|
@@ -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
|
-
|
|
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,
|
|
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;
|
|
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,
|
|
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":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,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;AAIhE,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAiC,MAAM,eAAe,CAAC;AAKxF;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,YAAW,iBAAiB;;aAc1C,WAAW,EAAE,OAAO;IAJtC,OAAO,eAwBN;IAED;;;;;;;;;;;;;;;OAeG;IACH,OAAa,IAAI,CACf,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,GAAE,OAAe,EAC1B,aAAa,CAAC,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,UAAU,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAiC/B;IAED,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAEzE;IAED,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAErD;IAED,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAEnF;IAED,WAAW,CAAC,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAE9D;IAED,SAAS,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAE3D;IAED,aAAa,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAEnE;IAED,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAwB1D;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAW5B;IAED;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC,CAEjC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAS3B;IAED,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;IAED;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,CAMpC;IAED;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAMrE;IAED,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAI7D;
|
|
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
|
|
261
|
-
//
|
|
262
|
-
//
|
|
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.
|
|
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.
|
|
40
|
-
"@aztec/ethereum": "5.0.
|
|
41
|
-
"@aztec/foundation": "5.0.
|
|
42
|
-
"@aztec/native": "5.0.
|
|
43
|
-
"@aztec/sqlite3mc-wasm": "5.0.
|
|
44
|
-
"@aztec/stdlib": "5.0.
|
|
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
|
+
}
|
package/src/sqlite-opfs/index.ts
CHANGED
|
@@ -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
|
|
package/src/sqlite-opfs/store.ts
CHANGED
|
@@ -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
|
|
276
|
-
//
|
|
277
|
-
//
|
|
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
|
}
|