@livestore/sqlite-wasm 0.4.0-dev.8 → 0.4.0
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/README.md +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/FacadeVFS.d.ts +0 -1
- package/dist/FacadeVFS.d.ts.map +1 -1
- package/dist/FacadeVFS.js +13 -14
- package/dist/FacadeVFS.js.map +1 -1
- package/dist/browser/mod.d.ts +13 -6
- package/dist/browser/mod.d.ts.map +1 -1
- package/dist/browser/mod.js +49 -43
- package/dist/browser/mod.js.map +1 -1
- package/dist/browser/opfs/AccessHandlePoolVFS.d.ts +33 -17
- package/dist/browser/opfs/AccessHandlePoolVFS.d.ts.map +1 -1
- package/dist/browser/opfs/AccessHandlePoolVFS.js +187 -152
- package/dist/browser/opfs/AccessHandlePoolVFS.js.map +1 -1
- package/dist/browser/opfs/index.d.ts +3 -2
- package/dist/browser/opfs/index.d.ts.map +1 -1
- package/dist/browser/opfs/index.js +1 -1
- package/dist/browser/opfs/index.js.map +1 -1
- package/dist/browser/opfs/opfs-sah-pool.d.ts +1 -1
- package/dist/browser/opfs/opfs-sah-pool.d.ts.map +1 -1
- package/dist/browser/opfs/opfs-sah-pool.js +4 -4
- package/dist/browser/opfs/opfs-sah-pool.js.map +1 -1
- package/dist/cf/CloudflareDurableObjectVFS.d.ts +104 -0
- package/dist/cf/CloudflareDurableObjectVFS.d.ts.map +1 -0
- package/dist/cf/CloudflareDurableObjectVFS.js +281 -0
- package/dist/cf/CloudflareDurableObjectVFS.js.map +1 -0
- package/dist/cf/CloudflareWorkerVFS.d.ts.map +1 -1
- package/dist/cf/CloudflareWorkerVFS.js +29 -28
- package/dist/cf/CloudflareWorkerVFS.js.map +1 -1
- package/dist/cf/mod.d.ts +3 -4
- package/dist/cf/mod.d.ts.map +1 -1
- package/dist/cf/mod.js +6 -14
- package/dist/cf/mod.js.map +1 -1
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js +5 -4
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js.map +1 -1
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js +3 -3
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js.map +1 -1
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js +21 -3
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js.map +1 -1
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js +3 -3
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js.map +1 -1
- package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js +194 -179
- package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js.map +1 -1
- package/dist/in-memory-vfs.d.ts.map +1 -1
- package/dist/in-memory-vfs.js +0 -1
- package/dist/in-memory-vfs.js.map +1 -1
- package/dist/load-wasm/mod.node.js +1 -1
- package/dist/load-wasm/mod.node.js.map +1 -1
- package/dist/load-wasm/mod.workerd.d.ts.map +1 -1
- package/dist/load-wasm/mod.workerd.js +2 -0
- package/dist/load-wasm/mod.workerd.js.map +1 -1
- package/dist/make-sqlite-db.d.ts.map +1 -1
- package/dist/make-sqlite-db.js +45 -12
- package/dist/make-sqlite-db.js.map +1 -1
- package/dist/node/NodeFS.d.ts.map +1 -1
- package/dist/node/NodeFS.js +13 -13
- package/dist/node/NodeFS.js.map +1 -1
- package/dist/node/mod.d.ts.map +1 -1
- package/dist/node/mod.js +2 -2
- package/dist/node/mod.js.map +1 -1
- package/package.json +56 -17
- package/src/FacadeVFS.ts +14 -14
- package/src/browser/mod.ts +38 -13
- package/src/browser/opfs/AccessHandlePoolVFS.ts +374 -240
- package/src/browser/opfs/index.ts +4 -3
- package/src/browser/opfs/opfs-sah-pool.ts +4 -4
- package/src/cf/CloudflareDurableObjectVFS.ts +325 -0
- package/src/cf/CloudflareWorkerVFS.ts +41 -39
- package/src/cf/README.md +3 -3
- package/src/cf/mod.ts +12 -17
- package/src/cf/test/README.md +55 -26
- package/src/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.ts +6 -4
- package/src/cf/test/async-storage/cloudflare-worker-vfs-core.test.ts +4 -3
- package/src/cf/test/async-storage/cloudflare-worker-vfs-integration.test.ts +22 -3
- package/src/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.ts +4 -3
- package/src/cf/test/sql/cloudflare-sql-vfs-core.test.ts +228 -197
- package/src/in-memory-vfs.ts +0 -1
- package/src/load-wasm/mod.node.ts +1 -1
- package/src/load-wasm/mod.workerd.ts +2 -1
- package/src/make-sqlite-db.ts +62 -12
- package/src/node/NodeFS.ts +24 -23
- package/src/node/mod.ts +2 -2
- package/dist/cf/BlockManager.d.ts +0 -61
- package/dist/cf/BlockManager.d.ts.map +0 -1
- package/dist/cf/BlockManager.js +0 -157
- package/dist/cf/BlockManager.js.map +0 -1
- package/dist/cf/CloudflareSqlVFS.d.ts +0 -51
- package/dist/cf/CloudflareSqlVFS.d.ts.map +0 -1
- package/dist/cf/CloudflareSqlVFS.js +0 -351
- package/dist/cf/CloudflareSqlVFS.js.map +0 -1
- package/src/ambient.d.ts +0 -18
- package/src/cf/BlockManager.ts +0 -225
- package/src/cf/CloudflareSqlVFS.ts +0 -450
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opfs-sah-pool.d.ts","sourceRoot":"","sources":["../../../src/browser/opfs/opfs-sah-pool.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,kBAAkB,OAAc,CAAA;AAO7C,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"opfs-sah-pool.d.ts","sourceRoot":"","sources":["../../../src/browser/opfs/opfs-sah-pool.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,kBAAkB,OAAc,CAAA;AAO7C,eAAO,MAAM,8BAA8B,GAAU,MAAM,IAAI,KAAG,OAAO,CAAC,MAAM,CA+B/E,CAAA"}
|
|
@@ -9,20 +9,20 @@ const HEADER_OFFSET_DIGEST = HEADER_CORPUS_SIZE;
|
|
|
9
9
|
export const HEADER_OFFSET_DATA = SECTOR_SIZE;
|
|
10
10
|
const PERSISTENT_FILE_TYPES = VFS.SQLITE_OPEN_MAIN_DB | VFS.SQLITE_OPEN_MAIN_JOURNAL | VFS.SQLITE_OPEN_SUPER_JOURNAL | VFS.SQLITE_OPEN_WAL;
|
|
11
11
|
const textDecoder = new TextDecoder();
|
|
12
|
-
export const
|
|
12
|
+
export const decodeAccessHandlePoolFilename = async (file) => {
|
|
13
13
|
// Read the path and digest of the path from the file.
|
|
14
14
|
const corpus = new Uint8Array(await file.slice(0, HEADER_CORPUS_SIZE).arrayBuffer());
|
|
15
15
|
// Delete files not expected to be present.
|
|
16
16
|
const dataView = new DataView(corpus.buffer, corpus.byteOffset);
|
|
17
17
|
const flags = dataView.getUint32(HEADER_OFFSET_FLAGS);
|
|
18
|
-
if (corpus[0] && (flags & VFS.SQLITE_OPEN_DELETEONCLOSE || (flags & PERSISTENT_FILE_TYPES) === 0)) {
|
|
18
|
+
if (corpus[0] !== 0 && ((flags & VFS.SQLITE_OPEN_DELETEONCLOSE) !== 0 || (flags & PERSISTENT_FILE_TYPES) === 0)) {
|
|
19
19
|
console.warn(`Remove file with unexpected flags ${flags.toString(16)}`);
|
|
20
20
|
return '';
|
|
21
21
|
}
|
|
22
22
|
const fileDigest = new Uint32Array(await file.slice(HEADER_OFFSET_DIGEST, HEADER_OFFSET_DIGEST + HEADER_DIGEST_SIZE).arrayBuffer());
|
|
23
23
|
// Verify the digest.
|
|
24
24
|
const computedDigest = computeDigest(corpus);
|
|
25
|
-
if (fileDigest.every((value, i) => value === computedDigest[i])) {
|
|
25
|
+
if (fileDigest.every((value, i) => value === computedDigest[i]) === true) {
|
|
26
26
|
// Good digest. Decode the null-terminated path string.
|
|
27
27
|
const pathBytes = corpus.indexOf(0);
|
|
28
28
|
if (pathBytes === 0) {
|
|
@@ -38,7 +38,7 @@ export const decodeSAHPoolFilename = async (file) => {
|
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
40
|
const computeDigest = (corpus) => {
|
|
41
|
-
if (
|
|
41
|
+
if (corpus[0] === 0) {
|
|
42
42
|
// Optimization for deleted file.
|
|
43
43
|
return new Uint32Array([0xfe_cc_5f_80, 0xac_ce_c0_37]);
|
|
44
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opfs-sah-pool.js","sourceRoot":"","sources":["../../../src/browser/opfs/opfs-sah-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,iCAAiC,CAAA;AAEtD,MAAM,WAAW,GAAG,IAAI,CAAA;AACxB,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAChC,MAAM,iBAAiB,GAAG,CAAC,CAAA;AAC3B,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAC5B,MAAM,kBAAkB,GAAG,oBAAoB,GAAG,iBAAiB,CAAA;AACnE,MAAM,mBAAmB,GAAG,oBAAoB,CAAA;AAChD,MAAM,oBAAoB,GAAG,kBAAkB,CAAA;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAA;AAE7C,MAAM,qBAAqB,GACzB,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC,yBAAyB,GAAG,GAAG,CAAC,eAAe,CAAA;AAE9G,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;AAErC,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"opfs-sah-pool.js","sourceRoot":"","sources":["../../../src/browser/opfs/opfs-sah-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { CfTypes } from '@livestore/common-cf';
|
|
2
|
+
import { FacadeVFS } from '../FacadeVFS.ts';
|
|
3
|
+
export declare const PAGE_SIZE: number;
|
|
4
|
+
/**
|
|
5
|
+
* The {@link CloudflareDurableObjectVFS} VFS assumes SQLite is configured with these pragmas.
|
|
6
|
+
* These pragmas are required both for correctness and for minimizing SQLite writes
|
|
7
|
+
* to the underlying storage.
|
|
8
|
+
*/
|
|
9
|
+
export declare const REQUIRED_PRAGMAS: string[];
|
|
10
|
+
/**
|
|
11
|
+
* wa-sqlite VFS for the LiveStore **state database** (dbState), backed by
|
|
12
|
+
* {@link https://developers.cloudflare.com/durable-objects/api/sql-storage/ | SQLite in Durable Objects}.
|
|
13
|
+
*
|
|
14
|
+
* ## Why wa-sqlite on top of SQLite in Durable Objects
|
|
15
|
+
*
|
|
16
|
+
* LiveStore's state database depends on SQLite APIs that SQLite in
|
|
17
|
+
* Durable Objects does not expose. This VFS persists wa-sqlite's pages as
|
|
18
|
+
* rows in the DO's SQLite storage, giving the state database durable
|
|
19
|
+
* persistence while retaining full access to the SQLite API.
|
|
20
|
+
*
|
|
21
|
+
* ## Write Optimization
|
|
22
|
+
*
|
|
23
|
+
* Every VFS write becomes a (billable) row write in the DO's SQLite. To
|
|
24
|
+
* reduce costs, this VFS assumes a wa-sqlite configured with {@link REQUIRED_PRAGMAS}
|
|
25
|
+
* for minimizing writes.
|
|
26
|
+
*
|
|
27
|
+
* ## File Identity
|
|
28
|
+
*
|
|
29
|
+
* LiveStore currently only persists the main database file through this VFS,
|
|
30
|
+
* but pages still stay keyed by file path, so schema-hashed filenames open
|
|
31
|
+
* isolated databases across process restarts.
|
|
32
|
+
*/
|
|
33
|
+
export declare class CloudflareDurableObjectVFS extends FacadeVFS {
|
|
34
|
+
#private;
|
|
35
|
+
/**
|
|
36
|
+
* @param name - VFS name registered with wa-sqlite (must be unique per database).
|
|
37
|
+
* @param sql - The Durable Object's {@link CfTypes.SqlStorage} handle.
|
|
38
|
+
* @param module - The wa-sqlite WASM module instance.
|
|
39
|
+
*/
|
|
40
|
+
constructor(name: string, sql: CfTypes.SqlStorage, module: any);
|
|
41
|
+
/**
|
|
42
|
+
* Accepts any open request unconditionally and records which path each fileId refers to.
|
|
43
|
+
*
|
|
44
|
+
* @remarks
|
|
45
|
+
*
|
|
46
|
+
* SQLite's fileId is only an in-memory open-handle identifier. Persisted
|
|
47
|
+
* data must stay keyed by filename so schema-hashed state DB filenames
|
|
48
|
+
* remain isolated from each other across restarts.
|
|
49
|
+
*/
|
|
50
|
+
jOpen(path: string | null, fileId: number, flags: number, pOutFlags: DataView): number;
|
|
51
|
+
jClose(fileId: number): number;
|
|
52
|
+
/**
|
|
53
|
+
* Reads a single page from `vfs_pages` and copies the requested byte range
|
|
54
|
+
* into {@link buffer}.
|
|
55
|
+
*
|
|
56
|
+
* @remarks
|
|
57
|
+
*
|
|
58
|
+
* Missing pages are zero-filled and still return `SQLITE_OK` (not `SQLITE_IOERR_SHORT_READ`)
|
|
59
|
+
* because wa-sqlite expects this during initial database creation.
|
|
60
|
+
*/
|
|
61
|
+
jRead(fileId: number, buffer: Uint8Array, offset: number): number;
|
|
62
|
+
/**
|
|
63
|
+
* Writes a single page to `vfs_pages`.
|
|
64
|
+
*
|
|
65
|
+
* @remarks
|
|
66
|
+
*
|
|
67
|
+
* The VFS only supports canonical SQLite page writes. Rejecting any other
|
|
68
|
+
* shape turns page-size mismatches into a hard failure instead of silently
|
|
69
|
+
* aliasing multiple SQLite pages onto the same `vfs_pages` row.
|
|
70
|
+
*
|
|
71
|
+
* The data is copied out of the WASM heap via `data.slice()` because
|
|
72
|
+
* Cloudflare's SQL storage cannot persist the {@link FacadeVFS}
|
|
73
|
+
* Proxy-wrapped buffer across DO restarts.
|
|
74
|
+
*/
|
|
75
|
+
jWrite(fileId: number, data: Uint8Array, offset: number): number;
|
|
76
|
+
/** Deletes all pages beyond the new file size boundary. */
|
|
77
|
+
jTruncate(fileId: number, size: number): number;
|
|
78
|
+
/**
|
|
79
|
+
* Derives file size from `MAX(page_no)`.
|
|
80
|
+
*
|
|
81
|
+
* @remarks
|
|
82
|
+
*
|
|
83
|
+
* Possible because all writes are page-aligned (page size matches `PRAGMA page_size`).
|
|
84
|
+
*/
|
|
85
|
+
jFileSize(fileId: number, pSize64: DataView): number;
|
|
86
|
+
/** Wipes all pages for the requested file path. */
|
|
87
|
+
jDelete(path: string, _syncDir: number): number;
|
|
88
|
+
/** Always reports "not found".
|
|
89
|
+
*
|
|
90
|
+
* @remarks
|
|
91
|
+
*
|
|
92
|
+
* With `locking_mode=EXCLUSIVE` and `journal_mode=MEMORY`, the only `jAccess` call SQLite makes is for
|
|
93
|
+
* hot-journal detection, which does not apply. Returning 1 (found) would
|
|
94
|
+
* trigger hot-journal recovery writes on every cold start.
|
|
95
|
+
*/
|
|
96
|
+
jAccess(_path: string, _flags: number, pResOut: DataView): number;
|
|
97
|
+
/** Returns page count and total stored bytes for diagnostics. */
|
|
98
|
+
getStats(): {
|
|
99
|
+
pageSize: number;
|
|
100
|
+
totalPages: number;
|
|
101
|
+
totalStoredBytes: number;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=CloudflareDurableObjectVFS.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudflareDurableObjectVFS.d.ts","sourceRoot":"","sources":["../../src/cf/CloudflareDurableObjectVFS.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,eAAO,MAAM,SAAS,QAAW,CAAA;AAEjC;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,UAqB5B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,0BAA2B,SAAQ,SAAS;;IAcvD;;;;OAIG;gBACS,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG;IAa9D;;;;;;;;OAQG;IACM,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,MAAM;IAOtF,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAkBvC;;;;;;;;OAQG;IACM,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAmC1E;;;;;;;;;;;;OAYG;IACM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAmBzE,2DAA2D;IAClD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAYxD;;;;;;OAMG;IACM,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM;IAgB7D,mDAAmD;IAC1C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAUxD;;;;;;;OAOG;IACM,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM;IAK1E,iEAAiE;IACjE,QAAQ,IAAI;QACV,QAAQ,EAAE,MAAM,CAAA;QAChB,UAAU,EAAE,MAAM,CAAA;QAClB,gBAAgB,EAAE,MAAM,CAAA;KACzB;CAyDF"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import * as VFS from '@livestore/wa-sqlite/src/VFS.js';
|
|
2
|
+
import { FacadeVFS } from "../FacadeVFS.js";
|
|
3
|
+
// Page size for SQL-based storage. Matches dbState page size (PRAGMA page_size=8192)
|
|
4
|
+
// so each SQLite page write maps to exactly one vfs_pages row write — no read-merge-write.
|
|
5
|
+
export const PAGE_SIZE = 8 * 1024; // 8 KiB
|
|
6
|
+
/**
|
|
7
|
+
* The {@link CloudflareDurableObjectVFS} VFS assumes SQLite is configured with these pragmas.
|
|
8
|
+
* These pragmas are required both for correctness and for minimizing SQLite writes
|
|
9
|
+
* to the underlying storage.
|
|
10
|
+
*/
|
|
11
|
+
export const REQUIRED_PRAGMAS = [
|
|
12
|
+
// Must match the fixed VFS page size so each SQLite page maps to one vfs_pages row.
|
|
13
|
+
`page_size=${PAGE_SIZE}`,
|
|
14
|
+
// The rollback journal is the largest source of VFS writes. Keeping it
|
|
15
|
+
// in WASM memory avoids writing journal pages through the VFS entirely.
|
|
16
|
+
// This is acceptable because the state database is rebuildable from the
|
|
17
|
+
// eventlog in case of a crash. We still, however, need the journal for
|
|
18
|
+
// transaction rollbacks.
|
|
19
|
+
'journal_mode=MEMORY',
|
|
20
|
+
// Skips jSync VFS calls (already a no-op, but avoids the dispatch).
|
|
21
|
+
'synchronous=OFF',
|
|
22
|
+
// A Durable Object is single-threaded with a single connection, so shared
|
|
23
|
+
// locking is unnecessary. Exclusive mode skips per-transaction lock/unlock
|
|
24
|
+
// VFS calls and hot-journal jAccess checks.
|
|
25
|
+
'locking_mode=EXCLUSIVE',
|
|
26
|
+
// Temp tables and indices stay in WASM memory, preventing temp-file VFS writes.
|
|
27
|
+
'temp_store=MEMORY',
|
|
28
|
+
// Keeps all dirty pages in the WASM page cache until commit. Without this,
|
|
29
|
+
// SQLite may spill pages to the VFS mid-transaction, and if those pages are
|
|
30
|
+
// dirtied again before commit, the same page gets written twice.
|
|
31
|
+
'cache_spill=OFF',
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* wa-sqlite VFS for the LiveStore **state database** (dbState), backed by
|
|
35
|
+
* {@link https://developers.cloudflare.com/durable-objects/api/sql-storage/ | SQLite in Durable Objects}.
|
|
36
|
+
*
|
|
37
|
+
* ## Why wa-sqlite on top of SQLite in Durable Objects
|
|
38
|
+
*
|
|
39
|
+
* LiveStore's state database depends on SQLite APIs that SQLite in
|
|
40
|
+
* Durable Objects does not expose. This VFS persists wa-sqlite's pages as
|
|
41
|
+
* rows in the DO's SQLite storage, giving the state database durable
|
|
42
|
+
* persistence while retaining full access to the SQLite API.
|
|
43
|
+
*
|
|
44
|
+
* ## Write Optimization
|
|
45
|
+
*
|
|
46
|
+
* Every VFS write becomes a (billable) row write in the DO's SQLite. To
|
|
47
|
+
* reduce costs, this VFS assumes a wa-sqlite configured with {@link REQUIRED_PRAGMAS}
|
|
48
|
+
* for minimizing writes.
|
|
49
|
+
*
|
|
50
|
+
* ## File Identity
|
|
51
|
+
*
|
|
52
|
+
* LiveStore currently only persists the main database file through this VFS,
|
|
53
|
+
* but pages still stay keyed by file path, so schema-hashed filenames open
|
|
54
|
+
* isolated databases across process restarts.
|
|
55
|
+
*/
|
|
56
|
+
export class CloudflareDurableObjectVFS extends FacadeVFS {
|
|
57
|
+
#sql;
|
|
58
|
+
/**
|
|
59
|
+
* Tracks the path and open flags for each SQLite file handle.
|
|
60
|
+
*
|
|
61
|
+
* @remarks
|
|
62
|
+
*
|
|
63
|
+
* After `jOpen`, SQLite calls the VFS with `fileId` for reads, writes,
|
|
64
|
+
* truncates, size checks, and close, so we need this in-memory map to get
|
|
65
|
+
* back to the persisted `file_path` key and honor handle-specific flags
|
|
66
|
+
* such as `SQLITE_OPEN_DELETEONCLOSE`.
|
|
67
|
+
*/
|
|
68
|
+
#openFiles = new Map();
|
|
69
|
+
/**
|
|
70
|
+
* @param name - VFS name registered with wa-sqlite (must be unique per database).
|
|
71
|
+
* @param sql - The Durable Object's {@link CfTypes.SqlStorage} handle.
|
|
72
|
+
* @param module - The wa-sqlite WASM module instance.
|
|
73
|
+
*/
|
|
74
|
+
constructor(name, sql, module) {
|
|
75
|
+
super(name, module);
|
|
76
|
+
this.#sql = sql;
|
|
77
|
+
this.#sql.exec(`CREATE TABLE IF NOT EXISTS vfs_pages (
|
|
78
|
+
file_path TEXT NOT NULL,
|
|
79
|
+
page_no INTEGER NOT NULL,
|
|
80
|
+
page_data BLOB NOT NULL,
|
|
81
|
+
PRIMARY KEY (file_path, page_no)
|
|
82
|
+
)`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Accepts any open request unconditionally and records which path each fileId refers to.
|
|
86
|
+
*
|
|
87
|
+
* @remarks
|
|
88
|
+
*
|
|
89
|
+
* SQLite's fileId is only an in-memory open-handle identifier. Persisted
|
|
90
|
+
* data must stay keyed by filename so schema-hashed state DB filenames
|
|
91
|
+
* remain isolated from each other across restarts.
|
|
92
|
+
*/
|
|
93
|
+
jOpen(path, fileId, flags, pOutFlags) {
|
|
94
|
+
const resolvedPath = this.#resolveOpenPath(path);
|
|
95
|
+
this.#openFiles.set(fileId, { path: resolvedPath, flags });
|
|
96
|
+
pOutFlags.setInt32(0, flags, true);
|
|
97
|
+
return VFS.SQLITE_OK;
|
|
98
|
+
}
|
|
99
|
+
jClose(fileId) {
|
|
100
|
+
try {
|
|
101
|
+
const openFile = this.#openFiles.get(fileId);
|
|
102
|
+
if (openFile === undefined)
|
|
103
|
+
return VFS.SQLITE_OK;
|
|
104
|
+
this.#openFiles.delete(fileId);
|
|
105
|
+
if ((openFile.flags & VFS.SQLITE_OPEN_DELETEONCLOSE) !== 0) {
|
|
106
|
+
this.#deleteFilePages(openFile.path);
|
|
107
|
+
}
|
|
108
|
+
return VFS.SQLITE_OK;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error('jClose error:', error);
|
|
112
|
+
return VFS.SQLITE_IOERR_CLOSE;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Reads a single page from `vfs_pages` and copies the requested byte range
|
|
117
|
+
* into {@link buffer}.
|
|
118
|
+
*
|
|
119
|
+
* @remarks
|
|
120
|
+
*
|
|
121
|
+
* Missing pages are zero-filled and still return `SQLITE_OK` (not `SQLITE_IOERR_SHORT_READ`)
|
|
122
|
+
* because wa-sqlite expects this during initial database creation.
|
|
123
|
+
*/
|
|
124
|
+
jRead(fileId, buffer, offset) {
|
|
125
|
+
try {
|
|
126
|
+
const { path } = this.#getOpenFile(fileId);
|
|
127
|
+
const pageNo = Math.floor(offset / PAGE_SIZE);
|
|
128
|
+
const cursor = this.#sql.exec('SELECT page_data FROM vfs_pages WHERE file_path = ? AND page_no = ?', path, pageNo);
|
|
129
|
+
const rows = cursor.toArray();
|
|
130
|
+
if (rows.length === 0) {
|
|
131
|
+
buffer.fill(0);
|
|
132
|
+
return VFS.SQLITE_OK;
|
|
133
|
+
}
|
|
134
|
+
const src = new Uint8Array(rows[0].page_data);
|
|
135
|
+
const pageOffset = offset % PAGE_SIZE;
|
|
136
|
+
const available = src.byteLength - pageOffset;
|
|
137
|
+
if (available >= buffer.byteLength) {
|
|
138
|
+
buffer.set(src.subarray(pageOffset, pageOffset + buffer.byteLength));
|
|
139
|
+
return VFS.SQLITE_OK;
|
|
140
|
+
}
|
|
141
|
+
buffer.set(src.subarray(pageOffset));
|
|
142
|
+
buffer.fill(0, available);
|
|
143
|
+
return VFS.SQLITE_OK;
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error('jRead error:', error);
|
|
147
|
+
return VFS.SQLITE_IOERR;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Writes a single page to `vfs_pages`.
|
|
152
|
+
*
|
|
153
|
+
* @remarks
|
|
154
|
+
*
|
|
155
|
+
* The VFS only supports canonical SQLite page writes. Rejecting any other
|
|
156
|
+
* shape turns page-size mismatches into a hard failure instead of silently
|
|
157
|
+
* aliasing multiple SQLite pages onto the same `vfs_pages` row.
|
|
158
|
+
*
|
|
159
|
+
* The data is copied out of the WASM heap via `data.slice()` because
|
|
160
|
+
* Cloudflare's SQL storage cannot persist the {@link FacadeVFS}
|
|
161
|
+
* Proxy-wrapped buffer across DO restarts.
|
|
162
|
+
*/
|
|
163
|
+
jWrite(fileId, data, offset) {
|
|
164
|
+
try {
|
|
165
|
+
const { path } = this.#getOpenFile(fileId);
|
|
166
|
+
this.#assertCanonicalPageWrite(data, offset);
|
|
167
|
+
const pageNo = Math.floor(offset / PAGE_SIZE);
|
|
168
|
+
// data.slice() copies out of the WASM heap Proxy so CF SQL storage can persist the BLOB correctly.
|
|
169
|
+
this.#sql.exec('INSERT OR REPLACE INTO vfs_pages (file_path, page_no, page_data) VALUES (?, ?, ?)', path, pageNo, data.slice());
|
|
170
|
+
return VFS.SQLITE_OK;
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
console.error('jWrite error:', error);
|
|
174
|
+
return VFS.SQLITE_IOERR;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** Deletes all pages beyond the new file size boundary. */
|
|
178
|
+
jTruncate(fileId, size) {
|
|
179
|
+
try {
|
|
180
|
+
const { path } = this.#getOpenFile(fileId);
|
|
181
|
+
const lastPageNo = Math.ceil(size / PAGE_SIZE);
|
|
182
|
+
this.#sql.exec('DELETE FROM vfs_pages WHERE file_path = ? AND page_no >= ?', path, lastPageNo);
|
|
183
|
+
return VFS.SQLITE_OK;
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
console.error('jTruncate error:', error);
|
|
187
|
+
return VFS.SQLITE_IOERR;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Derives file size from `MAX(page_no)`.
|
|
192
|
+
*
|
|
193
|
+
* @remarks
|
|
194
|
+
*
|
|
195
|
+
* Possible because all writes are page-aligned (page size matches `PRAGMA page_size`).
|
|
196
|
+
*/
|
|
197
|
+
jFileSize(fileId, pSize64) {
|
|
198
|
+
try {
|
|
199
|
+
const { path } = this.#getOpenFile(fileId);
|
|
200
|
+
const row = this.#sql.exec('SELECT MAX(page_no) AS max_page FROM vfs_pages WHERE file_path = ?', path).one();
|
|
201
|
+
const fileSize = row.max_page === null ? 0 : (row.max_page + 1) * PAGE_SIZE;
|
|
202
|
+
pSize64.setBigInt64(0, BigInt(fileSize), true);
|
|
203
|
+
return VFS.SQLITE_OK;
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
console.error('jFileSize error:', error);
|
|
207
|
+
return VFS.SQLITE_IOERR;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** Wipes all pages for the requested file path. */
|
|
211
|
+
jDelete(path, _syncDir) {
|
|
212
|
+
try {
|
|
213
|
+
this.#deleteFilePages(this.#getPath(path));
|
|
214
|
+
return VFS.SQLITE_OK;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
console.error('jDelete error:', error);
|
|
218
|
+
return VFS.SQLITE_IOERR;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** Always reports "not found".
|
|
222
|
+
*
|
|
223
|
+
* @remarks
|
|
224
|
+
*
|
|
225
|
+
* With `locking_mode=EXCLUSIVE` and `journal_mode=MEMORY`, the only `jAccess` call SQLite makes is for
|
|
226
|
+
* hot-journal detection, which does not apply. Returning 1 (found) would
|
|
227
|
+
* trigger hot-journal recovery writes on every cold start.
|
|
228
|
+
*/
|
|
229
|
+
jAccess(_path, _flags, pResOut) {
|
|
230
|
+
pResOut.setInt32(0, 0, true);
|
|
231
|
+
return VFS.SQLITE_OK;
|
|
232
|
+
}
|
|
233
|
+
/** Returns page count and total stored bytes for diagnostics. */
|
|
234
|
+
getStats() {
|
|
235
|
+
try {
|
|
236
|
+
const cursor = this.#sql.exec('SELECT COUNT(*) AS total_pages, COALESCE(SUM(LENGTH(page_data)), 0) AS total_bytes FROM vfs_pages');
|
|
237
|
+
const stats = cursor.one();
|
|
238
|
+
return {
|
|
239
|
+
pageSize: PAGE_SIZE,
|
|
240
|
+
totalPages: stats.total_pages,
|
|
241
|
+
totalStoredBytes: stats.total_bytes,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return {
|
|
246
|
+
pageSize: PAGE_SIZE,
|
|
247
|
+
totalPages: 0,
|
|
248
|
+
totalStoredBytes: 0,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Convert a bare filename, path, or URL to a UNIX-style path.
|
|
254
|
+
*/
|
|
255
|
+
#getPath(nameOrURL) {
|
|
256
|
+
const url = typeof nameOrURL === 'string' ? new URL(nameOrURL, 'file://localhost/') : nameOrURL;
|
|
257
|
+
return url.pathname;
|
|
258
|
+
}
|
|
259
|
+
#resolveOpenPath(path) {
|
|
260
|
+
const pathOrHandleId = path !== null && path !== '' ? path : Math.random().toString(36).slice(2);
|
|
261
|
+
return this.#getPath(pathOrHandleId);
|
|
262
|
+
}
|
|
263
|
+
#getOpenFile(fileId) {
|
|
264
|
+
const openFile = this.#openFiles.get(fileId);
|
|
265
|
+
if (openFile === undefined)
|
|
266
|
+
throw new Error(`Unknown fileId ${fileId}`);
|
|
267
|
+
return openFile;
|
|
268
|
+
}
|
|
269
|
+
#assertCanonicalPageWrite(data, offset) {
|
|
270
|
+
if (offset % PAGE_SIZE !== 0) {
|
|
271
|
+
throw new Error(`CloudflareDurableObjectVFS expected page-aligned writes, got offset=${offset} for pageSize=${PAGE_SIZE}`);
|
|
272
|
+
}
|
|
273
|
+
if (data.byteLength !== PAGE_SIZE) {
|
|
274
|
+
throw new Error(`CloudflareDurableObjectVFS expected single-page writes of ${PAGE_SIZE} bytes, got ${data.byteLength}. Check that SQLite PRAGMA page_size matches the VFS page size.`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
#deleteFilePages(path) {
|
|
278
|
+
this.#sql.exec('DELETE FROM vfs_pages WHERE file_path = ?', path);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=CloudflareDurableObjectVFS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudflareDurableObjectVFS.js","sourceRoot":"","sources":["../../src/cf/CloudflareDurableObjectVFS.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudflareWorkerVFS.d.ts","sourceRoot":"","sources":["../../src/cf/CloudflareWorkerVFS.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"CloudflareWorkerVFS.d.ts","sourceRoot":"","sources":["../../src/cf/CloudflareWorkerVFS.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAoC3C;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;;IAChD,GAAG,OAAO;WAeG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,oBAAoB,EAAE,MAAM,EAAE,GAAG;gBAMxE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,oBAAoB,EAAE,MAAM,EAAE,GAAG;IAoJnE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,MAAM;IA8ChF,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAY9B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IA6DjE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IA6DlE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAuDhD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAe7C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM;IAapD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIpC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI/C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM;IAYjE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAcnD,KAAK;IASL,OAAO;IAyCb;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACG,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7C;;;;OAIG;IACG,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoChD;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAKpC;;OAEG;IACH,QAAQ;;;;;;;;;;CAoBT"}
|