@livestore/sqlite-wasm 0.4.0-dev.9 → 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.
Files changed (93) hide show
  1. package/README.md +1 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/FacadeVFS.d.ts +0 -1
  4. package/dist/FacadeVFS.d.ts.map +1 -1
  5. package/dist/FacadeVFS.js +13 -14
  6. package/dist/FacadeVFS.js.map +1 -1
  7. package/dist/browser/mod.d.ts +13 -6
  8. package/dist/browser/mod.d.ts.map +1 -1
  9. package/dist/browser/mod.js +49 -43
  10. package/dist/browser/mod.js.map +1 -1
  11. package/dist/browser/opfs/AccessHandlePoolVFS.d.ts +24 -18
  12. package/dist/browser/opfs/AccessHandlePoolVFS.d.ts.map +1 -1
  13. package/dist/browser/opfs/AccessHandlePoolVFS.js +165 -166
  14. package/dist/browser/opfs/AccessHandlePoolVFS.js.map +1 -1
  15. package/dist/browser/opfs/index.d.ts +3 -2
  16. package/dist/browser/opfs/index.d.ts.map +1 -1
  17. package/dist/browser/opfs/index.js +1 -1
  18. package/dist/browser/opfs/index.js.map +1 -1
  19. package/dist/browser/opfs/opfs-sah-pool.d.ts +1 -1
  20. package/dist/browser/opfs/opfs-sah-pool.d.ts.map +1 -1
  21. package/dist/browser/opfs/opfs-sah-pool.js +4 -4
  22. package/dist/browser/opfs/opfs-sah-pool.js.map +1 -1
  23. package/dist/cf/CloudflareDurableObjectVFS.d.ts +104 -0
  24. package/dist/cf/CloudflareDurableObjectVFS.d.ts.map +1 -0
  25. package/dist/cf/CloudflareDurableObjectVFS.js +281 -0
  26. package/dist/cf/CloudflareDurableObjectVFS.js.map +1 -0
  27. package/dist/cf/CloudflareWorkerVFS.d.ts.map +1 -1
  28. package/dist/cf/CloudflareWorkerVFS.js +29 -28
  29. package/dist/cf/CloudflareWorkerVFS.js.map +1 -1
  30. package/dist/cf/mod.d.ts +3 -4
  31. package/dist/cf/mod.d.ts.map +1 -1
  32. package/dist/cf/mod.js +6 -14
  33. package/dist/cf/mod.js.map +1 -1
  34. package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js +5 -4
  35. package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js.map +1 -1
  36. package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js +3 -3
  37. package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js.map +1 -1
  38. package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js +3 -3
  39. package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js.map +1 -1
  40. package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js +3 -3
  41. package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js.map +1 -1
  42. package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js +194 -179
  43. package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js.map +1 -1
  44. package/dist/in-memory-vfs.d.ts.map +1 -1
  45. package/dist/in-memory-vfs.js +0 -1
  46. package/dist/in-memory-vfs.js.map +1 -1
  47. package/dist/load-wasm/mod.node.js +1 -1
  48. package/dist/load-wasm/mod.node.js.map +1 -1
  49. package/dist/load-wasm/mod.workerd.d.ts.map +1 -1
  50. package/dist/load-wasm/mod.workerd.js +2 -0
  51. package/dist/load-wasm/mod.workerd.js.map +1 -1
  52. package/dist/make-sqlite-db.d.ts.map +1 -1
  53. package/dist/make-sqlite-db.js +17 -8
  54. package/dist/make-sqlite-db.js.map +1 -1
  55. package/dist/node/NodeFS.d.ts.map +1 -1
  56. package/dist/node/NodeFS.js +13 -13
  57. package/dist/node/NodeFS.js.map +1 -1
  58. package/dist/node/mod.d.ts.map +1 -1
  59. package/dist/node/mod.js +2 -2
  60. package/dist/node/mod.js.map +1 -1
  61. package/package.json +56 -17
  62. package/src/FacadeVFS.ts +14 -14
  63. package/src/browser/mod.ts +38 -13
  64. package/src/browser/opfs/AccessHandlePoolVFS.ts +360 -268
  65. package/src/browser/opfs/index.ts +4 -3
  66. package/src/browser/opfs/opfs-sah-pool.ts +4 -4
  67. package/src/cf/CloudflareDurableObjectVFS.ts +325 -0
  68. package/src/cf/CloudflareWorkerVFS.ts +41 -39
  69. package/src/cf/README.md +3 -3
  70. package/src/cf/mod.ts +12 -17
  71. package/src/cf/test/README.md +55 -26
  72. package/src/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.ts +6 -4
  73. package/src/cf/test/async-storage/cloudflare-worker-vfs-core.test.ts +4 -3
  74. package/src/cf/test/async-storage/cloudflare-worker-vfs-integration.test.ts +4 -3
  75. package/src/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.ts +4 -3
  76. package/src/cf/test/sql/cloudflare-sql-vfs-core.test.ts +228 -197
  77. package/src/in-memory-vfs.ts +0 -1
  78. package/src/load-wasm/mod.node.ts +1 -1
  79. package/src/load-wasm/mod.workerd.ts +2 -1
  80. package/src/make-sqlite-db.ts +25 -8
  81. package/src/node/NodeFS.ts +24 -23
  82. package/src/node/mod.ts +2 -2
  83. package/dist/cf/BlockManager.d.ts +0 -61
  84. package/dist/cf/BlockManager.d.ts.map +0 -1
  85. package/dist/cf/BlockManager.js +0 -157
  86. package/dist/cf/BlockManager.js.map +0 -1
  87. package/dist/cf/CloudflareSqlVFS.d.ts +0 -51
  88. package/dist/cf/CloudflareSqlVFS.d.ts.map +0 -1
  89. package/dist/cf/CloudflareSqlVFS.js +0 -351
  90. package/dist/cf/CloudflareSqlVFS.js.map +0 -1
  91. package/src/ambient.d.ts +0 -18
  92. package/src/cf/BlockManager.ts +0 -225
  93. package/src/cf/CloudflareSqlVFS.ts +0 -450
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/browser/opfs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAC9D,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAA;AAEzD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACzB,OAAO,EACP,SAAS,EACT,QAAQ,GAKT,EAAE,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,kDAAkD;IAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC,CAAA;IAC3D,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAA;IAC/D,MAAM,OAAO,GAAG,OAAO,WAAW,EAAE,CAAA;IAEpC,IAAI,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAG,OAAe,CAAC,MAAM,CAAC,CAAC,CAAA;QAEhH,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAChC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;IACnE,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAE,CAAA;IAEpC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;AAC3B,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/browser/opfs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,MAAM,yBAAyB,CAAA;AAI5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAC9D,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAA;AAEzD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACzB,OAAO,EACP,SAAS,EACT,QAAQ,GAKT,EAAkG,EAAE,CACnG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,kDAAkD;IAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC,CAAA;IAC3D,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAA;IAC/D,MAAM,OAAO,GAAG,OAAO,WAAW,EAAE,CAAA;IAEpC,IAAI,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAG,OAAe,CAAC,MAAM,CAAC,CAAA;QAE1F,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAChC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;IACnE,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAE,CAAA;IAEpC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;AAC3B,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA"}
@@ -1,3 +1,3 @@
1
1
  export declare const HEADER_OFFSET_DATA = 4096;
2
- export declare const decodeSAHPoolFilename: (file: File) => Promise<string>;
2
+ export declare const decodeAccessHandlePoolFilename: (file: File) => Promise<string>;
3
3
  //# sourceMappingURL=opfs-sah-pool.d.ts.map
@@ -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,qBAAqB,GAAU,MAAM,IAAI,KAAG,OAAO,CAAC,MAAM,CA+BtE,CAAA"}
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 decodeSAHPoolFilename = async (file) => {
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 (!corpus[0]) {
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":"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"}
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;AAEnD,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;IAoJ5E,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,MAAM;IA6ChF,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;IAc1C,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"}
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"}