@livestore/sqlite-wasm 0.4.0-dev.1 → 0.4.0-dev.11

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 (80) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/browser/mod.d.ts +1 -0
  3. package/dist/browser/mod.d.ts.map +1 -1
  4. package/dist/browser/mod.js.map +1 -1
  5. package/dist/browser/opfs/AccessHandlePoolVFS.d.ts +17 -0
  6. package/dist/browser/opfs/AccessHandlePoolVFS.d.ts.map +1 -1
  7. package/dist/browser/opfs/AccessHandlePoolVFS.js +72 -1
  8. package/dist/browser/opfs/AccessHandlePoolVFS.js.map +1 -1
  9. package/dist/cf/BlockManager.d.ts +61 -0
  10. package/dist/cf/BlockManager.d.ts.map +1 -0
  11. package/dist/cf/BlockManager.js +157 -0
  12. package/dist/cf/BlockManager.js.map +1 -0
  13. package/dist/cf/CloudflareSqlVFS.d.ts +51 -0
  14. package/dist/cf/CloudflareSqlVFS.d.ts.map +1 -0
  15. package/dist/cf/CloudflareSqlVFS.js +351 -0
  16. package/dist/cf/CloudflareSqlVFS.js.map +1 -0
  17. package/dist/cf/CloudflareWorkerVFS.d.ts +72 -0
  18. package/dist/cf/CloudflareWorkerVFS.d.ts.map +1 -0
  19. package/dist/cf/CloudflareWorkerVFS.js +552 -0
  20. package/dist/cf/CloudflareWorkerVFS.js.map +1 -0
  21. package/dist/cf/mod.d.ts +43 -0
  22. package/dist/cf/mod.d.ts.map +1 -0
  23. package/dist/cf/mod.js +74 -0
  24. package/dist/cf/mod.js.map +1 -0
  25. package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.d.ts +2 -0
  26. package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.d.ts.map +1 -0
  27. package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js +314 -0
  28. package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js.map +1 -0
  29. package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.d.ts +2 -0
  30. package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.d.ts.map +1 -0
  31. package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js +266 -0
  32. package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js.map +1 -0
  33. package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.d.ts +2 -0
  34. package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.d.ts.map +1 -0
  35. package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js +462 -0
  36. package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js.map +1 -0
  37. package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.d.ts +2 -0
  38. package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.d.ts.map +1 -0
  39. package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js +334 -0
  40. package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js.map +1 -0
  41. package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.d.ts +2 -0
  42. package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.d.ts.map +1 -0
  43. package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js +354 -0
  44. package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js.map +1 -0
  45. package/dist/load-wasm/mod.node.d.ts.map +1 -1
  46. package/dist/load-wasm/mod.node.js +1 -2
  47. package/dist/load-wasm/mod.node.js.map +1 -1
  48. package/dist/load-wasm/mod.workerd.d.ts +2 -0
  49. package/dist/load-wasm/mod.workerd.d.ts.map +1 -0
  50. package/dist/load-wasm/mod.workerd.js +28 -0
  51. package/dist/load-wasm/mod.workerd.js.map +1 -0
  52. package/dist/make-sqlite-db.d.ts +1 -0
  53. package/dist/make-sqlite-db.d.ts.map +1 -1
  54. package/dist/make-sqlite-db.js +28 -4
  55. package/dist/make-sqlite-db.js.map +1 -1
  56. package/dist/node/NodeFS.d.ts +1 -2
  57. package/dist/node/NodeFS.d.ts.map +1 -1
  58. package/dist/node/NodeFS.js +1 -6
  59. package/dist/node/NodeFS.js.map +1 -1
  60. package/dist/node/mod.js +3 -8
  61. package/dist/node/mod.js.map +1 -1
  62. package/package.json +21 -8
  63. package/src/browser/mod.ts +1 -0
  64. package/src/browser/opfs/AccessHandlePoolVFS.ts +79 -1
  65. package/src/cf/BlockManager.ts +225 -0
  66. package/src/cf/CloudflareSqlVFS.ts +450 -0
  67. package/src/cf/CloudflareWorkerVFS.ts +664 -0
  68. package/src/cf/README.md +60 -0
  69. package/src/cf/mod.ts +143 -0
  70. package/src/cf/test/README.md +224 -0
  71. package/src/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.ts +389 -0
  72. package/src/cf/test/async-storage/cloudflare-worker-vfs-core.test.ts +322 -0
  73. package/src/cf/test/async-storage/cloudflare-worker-vfs-integration.test.ts +585 -0
  74. package/src/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.ts +403 -0
  75. package/src/cf/test/sql/cloudflare-sql-vfs-core.test.ts +433 -0
  76. package/src/load-wasm/mod.node.ts +1 -2
  77. package/src/load-wasm/mod.workerd.ts +28 -0
  78. package/src/make-sqlite-db.ts +38 -4
  79. package/src/node/NodeFS.ts +1 -9
  80. package/src/node/mod.ts +3 -10
@@ -0,0 +1,462 @@
1
+ /// <reference types="vitest/globals" />
2
+ import * as VFS from '@livestore/wa-sqlite/src/VFS.js';
3
+ import { beforeEach, describe, expect, it } from 'vitest';
4
+ import { CloudflareWorkerVFS } from "../../mod.js";
5
+ describe('CloudflareWorkerVFS - Integration Tests', () => {
6
+ let vfs;
7
+ let mockStorage;
8
+ let storageData;
9
+ let storageOperations;
10
+ beforeEach(async () => {
11
+ storageData = new Map();
12
+ storageOperations = [];
13
+ mockStorage = {
14
+ get: (async (_key) => {
15
+ if (Array.isArray(_key)) {
16
+ storageOperations.push(`get-batch: ${_key.length} keys`);
17
+ const result = new Map();
18
+ for (const k of _key) {
19
+ const value = storageData.get(k);
20
+ if (value !== undefined) {
21
+ result.set(k, value);
22
+ }
23
+ }
24
+ return result;
25
+ }
26
+ else {
27
+ storageOperations.push(`get: ${_key}`);
28
+ return storageData.get(_key);
29
+ }
30
+ }),
31
+ put: async (_key, _value) => {
32
+ if (typeof _key === 'string') {
33
+ storageOperations.push(`put: ${_key}`);
34
+ storageData.set(_key, _value);
35
+ }
36
+ else {
37
+ storageOperations.push(`put-batch: ${Object.keys(_key).length} keys`);
38
+ for (const [k, v] of Object.entries(_key)) {
39
+ storageData.set(k, v);
40
+ }
41
+ }
42
+ },
43
+ delete: (async (_key) => {
44
+ if (Array.isArray(_key)) {
45
+ storageOperations.push(`delete-batch: ${_key.length} keys`);
46
+ let count = 0;
47
+ for (const k of _key) {
48
+ if (storageData.delete(k))
49
+ count++;
50
+ }
51
+ return count;
52
+ }
53
+ else {
54
+ storageOperations.push(`delete: ${_key}`);
55
+ return storageData.delete(_key);
56
+ }
57
+ }),
58
+ list: async () => {
59
+ storageOperations.push('list');
60
+ return new Map(storageData);
61
+ },
62
+ sync: async () => {
63
+ storageOperations.push('sync');
64
+ },
65
+ transactionSync: (fn) => {
66
+ storageOperations.push('transactionSync');
67
+ return fn();
68
+ },
69
+ deleteAll: async () => {
70
+ storageOperations.push('deleteAll');
71
+ storageData.clear();
72
+ },
73
+ transaction: async (fn) => {
74
+ storageOperations.push('transaction');
75
+ return await fn({});
76
+ },
77
+ getCurrentBookmark: async () => {
78
+ storageOperations.push('getCurrentBookmark');
79
+ return '';
80
+ },
81
+ getBookmarkForTime: async (_time) => {
82
+ storageOperations.push('getBookmarkForTime');
83
+ return '';
84
+ },
85
+ onNextSessionRestoreBookmark: async (_bookmark) => {
86
+ storageOperations.push('onNextSessionRestoreBookmark');
87
+ return '';
88
+ },
89
+ getAlarm: async () => null,
90
+ setAlarm: async (_timestamp) => { },
91
+ deleteAlarm: async () => { },
92
+ sql: {},
93
+ kv: {
94
+ get: (key) => {
95
+ storageOperations.push(`kv-get: ${key}`);
96
+ return storageData.get(key);
97
+ },
98
+ put: (key, value) => {
99
+ storageOperations.push(`kv-put: ${key}`);
100
+ storageData.set(key, value);
101
+ },
102
+ delete: (key) => {
103
+ storageOperations.push(`kv-delete: ${key}`);
104
+ return storageData.delete(key);
105
+ },
106
+ list: () => {
107
+ storageOperations.push('kv-list');
108
+ return storageData.entries();
109
+ },
110
+ },
111
+ };
112
+ vfs = new CloudflareWorkerVFS('test-integration-vfs', mockStorage, {});
113
+ await vfs.isReady();
114
+ });
115
+ describe('Storage Integration', () => {
116
+ it('should integrate properly with DurableObjectStorage API', async () => {
117
+ const path = '/test/storage-integration.db';
118
+ const fileId = 1;
119
+ const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
120
+ const pOutFlags = new DataView(new ArrayBuffer(4));
121
+ storageOperations.length = 0;
122
+ vfs.jOpen(path, fileId, flags, pOutFlags);
123
+ // Write data that will trigger storage operations
124
+ const testData = new TextEncoder().encode('Storage integration test');
125
+ expect(vfs.jWrite(fileId, testData, 0)).toBe(VFS.SQLITE_OK);
126
+ // Sync to ensure storage operations occur
127
+ expect(vfs.jSync(fileId, VFS.SQLITE_SYNC_NORMAL)).toBe(VFS.SQLITE_OK);
128
+ expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
129
+ // Wait for async operations
130
+ await new Promise((resolve) => setTimeout(resolve, 20));
131
+ // Verify storage operations occurred
132
+ expect(storageOperations.length).toBeGreaterThan(0);
133
+ // Verify metadata and chunk keys exist in storage
134
+ const metadataKey = `file:${path}:meta`;
135
+ const chunkKey = `file:${path}:0`;
136
+ expect(storageData.has(metadataKey)).toBe(true);
137
+ expect(storageData.has(chunkKey)).toBe(true);
138
+ // Verify stored data integrity
139
+ const metadata = storageData.get(metadataKey);
140
+ expect(metadata.size).toBe(testData.length);
141
+ expect(metadata.flags).toBe(flags);
142
+ const chunk = storageData.get(chunkKey);
143
+ expect(chunk.slice(0, testData.length)).toEqual(testData);
144
+ });
145
+ it('should handle storage key collisions gracefully', async () => {
146
+ const paths = ['/test/path:with:colons.db', '/test/path_with_colons.db', '/test/pathwithcolons.db'];
147
+ for (let i = 0; i < paths.length; i++) {
148
+ const fileId = i + 1;
149
+ const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
150
+ const pOutFlags = new DataView(new ArrayBuffer(4));
151
+ expect(vfs.jOpen(paths[i] ?? '', fileId, flags, pOutFlags)).toBe(VFS.SQLITE_OK);
152
+ const testData = new TextEncoder().encode(`Data for file ${i}`);
153
+ expect(vfs.jWrite(fileId, testData, 0)).toBe(VFS.SQLITE_OK);
154
+ expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
155
+ }
156
+ // Wait for async operations
157
+ await new Promise((resolve) => setTimeout(resolve, 20));
158
+ // Verify all files have separate storage entries
159
+ for (const path of paths) {
160
+ const metadataKey = `file:${path}:meta`;
161
+ expect(storageData.has(metadataKey)).toBe(true);
162
+ }
163
+ // Verify no data corruption between files
164
+ for (let i = 0; i < paths.length; i++) {
165
+ const fileId = i + 1;
166
+ const flags = VFS.SQLITE_OPEN_READWRITE;
167
+ const pOutFlags = new DataView(new ArrayBuffer(4));
168
+ expect(vfs.jOpen(paths[i] ?? '', fileId, flags, pOutFlags)).toBe(VFS.SQLITE_OK);
169
+ const expectedData = new TextEncoder().encode(`Data for file ${i}`);
170
+ const readData = new Uint8Array(expectedData.length);
171
+ expect(vfs.jRead(fileId, readData, 0)).toBe(VFS.SQLITE_OK);
172
+ expect(readData).toEqual(expectedData);
173
+ expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
174
+ }
175
+ });
176
+ it('should handle storage size limits correctly', async () => {
177
+ const path = '/test/size-limits.db';
178
+ const fileId = 1;
179
+ const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
180
+ const pOutFlags = new DataView(new ArrayBuffer(4));
181
+ vfs.jOpen(path, fileId, flags, pOutFlags);
182
+ // Write data that approaches DurableObjectStorage limits (128 KiB per value)
183
+ const chunkSize = 64 * 1024; // VFS chunk size
184
+ const testData = new Uint8Array(chunkSize);
185
+ testData.fill(0xaa);
186
+ expect(vfs.jWrite(fileId, testData, 0)).toBe(VFS.SQLITE_OK);
187
+ expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
188
+ // Wait for async operations
189
+ await new Promise((resolve) => setTimeout(resolve, 10));
190
+ // Verify chunk was stored correctly
191
+ const chunkKey = `file:${path}:0`;
192
+ expect(storageData.has(chunkKey)).toBe(true);
193
+ const storedChunk = storageData.get(chunkKey);
194
+ expect(storedChunk.length).toBe(chunkSize);
195
+ expect(storedChunk.length).toBeLessThanOrEqual(128 * 1024); // Within DO Storage limit
196
+ });
197
+ it('should handle batch operations efficiently', async () => {
198
+ const path = '/test/batch-operations.db';
199
+ const fileId = 1;
200
+ const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
201
+ const pOutFlags = new DataView(new ArrayBuffer(4));
202
+ vfs.jOpen(path, fileId, flags, pOutFlags);
203
+ // Write data that spans multiple chunks
204
+ const chunkSize = 64 * 1024;
205
+ const numChunks = 3;
206
+ const totalData = new Uint8Array(chunkSize * numChunks);
207
+ for (let i = 0; i < totalData.length; i++) {
208
+ totalData[i] = (i * 3) % 256;
209
+ }
210
+ storageOperations.length = 0;
211
+ expect(vfs.jWrite(fileId, totalData, 0)).toBe(VFS.SQLITE_OK);
212
+ expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
213
+ // Wait for async operations
214
+ await new Promise((resolve) => setTimeout(resolve, 20));
215
+ // Verify storage operations were batched efficiently
216
+ expect(storageOperations.length).toBeGreaterThan(0);
217
+ // Verify all chunks were stored
218
+ for (let i = 0; i < numChunks; i++) {
219
+ const chunkKey = `file:${path}:${i}`;
220
+ expect(storageData.has(chunkKey)).toBe(true);
221
+ }
222
+ // Verify data integrity
223
+ vfs.jOpen(path, fileId, flags, pOutFlags);
224
+ const readData = new Uint8Array(totalData.length);
225
+ expect(vfs.jRead(fileId, readData, 0)).toBe(VFS.SQLITE_OK);
226
+ expect(readData).toEqual(totalData);
227
+ expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
228
+ });
229
+ });
230
+ describe('SQLite Integration', () => {
231
+ it('should handle SQLite database file format correctly', async () => {
232
+ const path = '/test/sqlite-format.db';
233
+ const fileId = 1;
234
+ const flags = VFS.SQLITE_OPEN_MAIN_DB | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
235
+ const pOutFlags = new DataView(new ArrayBuffer(4));
236
+ expect(vfs.jOpen(path, fileId, flags, pOutFlags)).toBe(VFS.SQLITE_OK);
237
+ // Write SQLite header
238
+ const sqliteHeader = new TextEncoder().encode('SQLite format 3\0');
239
+ expect(vfs.jWrite(fileId, sqliteHeader, 0)).toBe(VFS.SQLITE_OK);
240
+ // Write page size (typical SQLite page size is 4096)
241
+ const pageSize = new DataView(new ArrayBuffer(2));
242
+ pageSize.setUint16(0, 4096, false); // Big-endian as per SQLite format
243
+ const pageSizeBytes = new Uint8Array(pageSize.buffer);
244
+ expect(vfs.jWrite(fileId, pageSizeBytes, 16)).toBe(VFS.SQLITE_OK);
245
+ // Read back and verify header
246
+ const readHeader = new Uint8Array(sqliteHeader.length);
247
+ expect(vfs.jRead(fileId, readHeader, 0)).toBe(VFS.SQLITE_OK);
248
+ expect(readHeader).toEqual(sqliteHeader);
249
+ // Read back and verify page size
250
+ const readPageSize = new Uint8Array(2);
251
+ expect(vfs.jRead(fileId, readPageSize, 16)).toBe(VFS.SQLITE_OK);
252
+ expect(readPageSize).toEqual(pageSizeBytes);
253
+ expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
254
+ });
255
+ it('should handle SQLite page-based I/O operations', async () => {
256
+ const path = '/test/sqlite-pages.db';
257
+ const fileId = 1;
258
+ const flags = VFS.SQLITE_OPEN_MAIN_DB | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
259
+ const pOutFlags = new DataView(new ArrayBuffer(4));
260
+ vfs.jOpen(path, fileId, flags, pOutFlags);
261
+ const pageSize = 4096;
262
+ const numPages = 10;
263
+ // Write multiple SQLite pages
264
+ for (let pageNum = 0; pageNum < numPages; pageNum++) {
265
+ const pageData = new Uint8Array(pageSize);
266
+ // Fill page with pattern (page number repeated)
267
+ pageData.fill(pageNum % 256);
268
+ const offset = pageNum * pageSize;
269
+ expect(vfs.jWrite(fileId, pageData, offset)).toBe(VFS.SQLITE_OK);
270
+ }
271
+ // Read back pages in different order
272
+ const readOrder = [3, 1, 7, 0, 9, 2, 5, 8, 4, 6];
273
+ for (const pageNum of readOrder) {
274
+ const readData = new Uint8Array(pageSize);
275
+ const offset = pageNum * pageSize;
276
+ expect(vfs.jRead(fileId, readData, offset)).toBe(VFS.SQLITE_OK);
277
+ // Verify page content
278
+ const expectedValue = pageNum % 256;
279
+ expect(readData.every((byte) => byte === expectedValue)).toBe(true);
280
+ }
281
+ expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
282
+ });
283
+ it('should handle WAL mode operations', async () => {
284
+ const mainPath = '/test/wal-mode.db';
285
+ const walPath = '/test/wal-mode.db-wal';
286
+ const mainFileId = 1;
287
+ const walFileId = 2;
288
+ const mainFlags = VFS.SQLITE_OPEN_MAIN_DB | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
289
+ const walFlags = VFS.SQLITE_OPEN_WAL | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
290
+ const pOutFlags = new DataView(new ArrayBuffer(4));
291
+ // Open main database file
292
+ expect(vfs.jOpen(mainPath, mainFileId, mainFlags, pOutFlags)).toBe(VFS.SQLITE_OK);
293
+ // Write main database content
294
+ const dbContent = new TextEncoder().encode('SQLite format 3\0Main database content');
295
+ expect(vfs.jWrite(mainFileId, dbContent, 0)).toBe(VFS.SQLITE_OK);
296
+ // Open WAL file
297
+ expect(vfs.jOpen(walPath, walFileId, walFlags, pOutFlags)).toBe(VFS.SQLITE_OK);
298
+ // Write WAL header and entries
299
+ const walHeader = new Uint8Array(32);
300
+ walHeader.fill(0x37); // WAL magic number pattern
301
+ expect(vfs.jWrite(walFileId, walHeader, 0)).toBe(VFS.SQLITE_OK);
302
+ // Write WAL frames
303
+ const frameSize = 4096 + 24; // Page size + frame header
304
+ const numFrames = 5;
305
+ for (let frameNum = 0; frameNum < numFrames; frameNum++) {
306
+ const frameData = new Uint8Array(frameSize);
307
+ frameData.fill((frameNum + 1) % 256);
308
+ const offset = 32 + frameNum * frameSize; // After WAL header
309
+ expect(vfs.jWrite(walFileId, frameData, offset)).toBe(VFS.SQLITE_OK);
310
+ }
311
+ // Read back WAL header
312
+ const readWalHeader = new Uint8Array(32);
313
+ expect(vfs.jRead(walFileId, readWalHeader, 0)).toBe(VFS.SQLITE_OK);
314
+ expect(readWalHeader).toEqual(walHeader);
315
+ // Read back WAL frames
316
+ for (let frameNum = 0; frameNum < numFrames; frameNum++) {
317
+ const readFrameData = new Uint8Array(frameSize);
318
+ const offset = 32 + frameNum * frameSize;
319
+ expect(vfs.jRead(walFileId, readFrameData, offset)).toBe(VFS.SQLITE_OK);
320
+ const expectedValue = (frameNum + 1) % 256;
321
+ expect(readFrameData.every((byte) => byte === expectedValue)).toBe(true);
322
+ }
323
+ // Close both files
324
+ expect(vfs.jClose(mainFileId)).toBe(VFS.SQLITE_OK);
325
+ expect(vfs.jClose(walFileId)).toBe(VFS.SQLITE_OK);
326
+ });
327
+ it('should handle journal mode operations', async () => {
328
+ const mainPath = '/test/journal-mode.db';
329
+ const journalPath = '/test/journal-mode.db-journal';
330
+ const mainFileId = 1;
331
+ const journalFileId = 2;
332
+ const mainFlags = VFS.SQLITE_OPEN_MAIN_DB | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
333
+ const journalFlags = VFS.SQLITE_OPEN_MAIN_JOURNAL | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
334
+ const pOutFlags = new DataView(new ArrayBuffer(4));
335
+ // Open main database
336
+ expect(vfs.jOpen(mainPath, mainFileId, mainFlags, pOutFlags)).toBe(VFS.SQLITE_OK);
337
+ // Write database pages
338
+ const pageSize = 4096;
339
+ const dbPage = new Uint8Array(pageSize);
340
+ dbPage.fill(0xdb); // DB page pattern
341
+ expect(vfs.jWrite(mainFileId, dbPage, 0)).toBe(VFS.SQLITE_OK);
342
+ // Open journal file
343
+ expect(vfs.jOpen(journalPath, journalFileId, journalFlags, pOutFlags)).toBe(VFS.SQLITE_OK);
344
+ // Write journal header
345
+ const journalHeader = new TextEncoder().encode('Journal header\0\0\0\0');
346
+ expect(vfs.jWrite(journalFileId, journalHeader, 0)).toBe(VFS.SQLITE_OK);
347
+ // Write journal page (copy of original page for rollback)
348
+ const journalPage = new Uint8Array(pageSize);
349
+ journalPage.fill(0x4a); // Journal page pattern
350
+ expect(vfs.jWrite(journalFileId, journalPage, 512)).toBe(VFS.SQLITE_OK);
351
+ // Verify journal operations
352
+ const readJournalHeader = new Uint8Array(journalHeader.length);
353
+ expect(vfs.jRead(journalFileId, readJournalHeader, 0)).toBe(VFS.SQLITE_OK);
354
+ expect(readJournalHeader).toEqual(journalHeader);
355
+ const readJournalPage = new Uint8Array(pageSize);
356
+ expect(vfs.jRead(journalFileId, readJournalPage, 512)).toBe(VFS.SQLITE_OK);
357
+ expect(readJournalPage).toEqual(journalPage);
358
+ // Close files
359
+ expect(vfs.jClose(mainFileId)).toBe(VFS.SQLITE_OK);
360
+ expect(vfs.jClose(journalFileId)).toBe(VFS.SQLITE_OK);
361
+ });
362
+ it('should handle database file locking simulation', async () => {
363
+ const path = '/test/locking-simulation.db';
364
+ const fileId1 = 1;
365
+ const fileId2 = 2;
366
+ const flags = VFS.SQLITE_OPEN_MAIN_DB | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
367
+ const pOutFlags = new DataView(new ArrayBuffer(4));
368
+ // Open file with first handle
369
+ expect(vfs.jOpen(path, fileId1, flags, pOutFlags)).toBe(VFS.SQLITE_OK);
370
+ // Write data with first handle
371
+ const testData1 = new TextEncoder().encode('First connection data');
372
+ expect(vfs.jWrite(fileId1, testData1, 0)).toBe(VFS.SQLITE_OK);
373
+ // Open same file with second handle (simulates multiple connections)
374
+ expect(vfs.jOpen(path, fileId2, flags, pOutFlags)).toBe(VFS.SQLITE_OK);
375
+ // Read with second handle should see data from first handle
376
+ const readData = new Uint8Array(testData1.length);
377
+ expect(vfs.jRead(fileId2, readData, 0)).toBe(VFS.SQLITE_OK);
378
+ expect(readData).toEqual(testData1);
379
+ // Write with second handle
380
+ const testData2 = new TextEncoder().encode('Second connection data');
381
+ expect(vfs.jWrite(fileId2, testData2, 100)).toBe(VFS.SQLITE_OK);
382
+ // First handle should see data from second handle
383
+ const readData2 = new Uint8Array(testData2.length);
384
+ expect(vfs.jRead(fileId1, readData2, 100)).toBe(VFS.SQLITE_OK);
385
+ expect(readData2).toEqual(testData2);
386
+ // Close both handles
387
+ expect(vfs.jClose(fileId1)).toBe(VFS.SQLITE_OK);
388
+ expect(vfs.jClose(fileId2)).toBe(VFS.SQLITE_OK);
389
+ });
390
+ });
391
+ describe('End-to-End Integration', () => {
392
+ it('should handle complete SQLite workflow', async () => {
393
+ const dbPath = '/test/complete-workflow.db';
394
+ const walPath = '/test/complete-workflow.db-wal';
395
+ const journalPath = '/test/complete-workflow.db-journal';
396
+ const dbFileId = 1;
397
+ const walFileId = 2;
398
+ const journalFileId = 3;
399
+ const pOutFlags = new DataView(new ArrayBuffer(4));
400
+ // 1. Create main database
401
+ const dbFlags = VFS.SQLITE_OPEN_MAIN_DB | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
402
+ expect(vfs.jOpen(dbPath, dbFileId, dbFlags, pOutFlags)).toBe(VFS.SQLITE_OK);
403
+ // Write SQLite header and initial pages
404
+ const sqliteHeader = new TextEncoder().encode('SQLite format 3\0');
405
+ expect(vfs.jWrite(dbFileId, sqliteHeader, 0)).toBe(VFS.SQLITE_OK);
406
+ const pageSize = 4096;
407
+ const dbPage1 = new Uint8Array(pageSize);
408
+ dbPage1.fill(0x01);
409
+ expect(vfs.jWrite(dbFileId, dbPage1, pageSize)).toBe(VFS.SQLITE_OK);
410
+ // 2. Create journal for transaction
411
+ const journalFlags = VFS.SQLITE_OPEN_MAIN_JOURNAL | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
412
+ expect(vfs.jOpen(journalPath, journalFileId, journalFlags, pOutFlags)).toBe(VFS.SQLITE_OK);
413
+ // Write journal header and backup page
414
+ const journalHeader = new Uint8Array(512);
415
+ journalHeader.fill(0x30); // Journal header pattern
416
+ expect(vfs.jWrite(journalFileId, journalHeader, 0)).toBe(VFS.SQLITE_OK);
417
+ // 3. Modify database page (transaction)
418
+ const modifiedPage = new Uint8Array(pageSize);
419
+ modifiedPage.fill(0x02); // Modified page pattern
420
+ expect(vfs.jWrite(dbFileId, modifiedPage, pageSize)).toBe(VFS.SQLITE_OK);
421
+ // 4. Sync database (commit transaction)
422
+ expect(vfs.jSync(dbFileId, VFS.SQLITE_SYNC_NORMAL)).toBe(VFS.SQLITE_OK);
423
+ // 5. Delete journal (transaction committed)
424
+ expect(vfs.jClose(journalFileId)).toBe(VFS.SQLITE_OK);
425
+ expect(vfs.jDelete(journalPath, 0)).toBe(VFS.SQLITE_OK);
426
+ // 6. Switch to WAL mode
427
+ const walFlags = VFS.SQLITE_OPEN_WAL | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
428
+ expect(vfs.jOpen(walPath, walFileId, walFlags, pOutFlags)).toBe(VFS.SQLITE_OK);
429
+ // Write WAL header
430
+ const walHeader = new Uint8Array(32);
431
+ walHeader.fill(0x37); // WAL header pattern
432
+ expect(vfs.jWrite(walFileId, walHeader, 0)).toBe(VFS.SQLITE_OK);
433
+ // Write WAL frame
434
+ const walFrame = new Uint8Array(pageSize + 24); // Page + frame header
435
+ walFrame.fill(0x03); // WAL frame pattern
436
+ expect(vfs.jWrite(walFileId, walFrame, 32)).toBe(VFS.SQLITE_OK);
437
+ // 7. Verify all files are accessible and contain expected data
438
+ // Database file
439
+ const readHeader = new Uint8Array(sqliteHeader.length);
440
+ expect(vfs.jRead(dbFileId, readHeader, 0)).toBe(VFS.SQLITE_OK);
441
+ expect(readHeader).toEqual(sqliteHeader);
442
+ const readDbPage = new Uint8Array(pageSize);
443
+ expect(vfs.jRead(dbFileId, readDbPage, pageSize)).toBe(VFS.SQLITE_OK);
444
+ expect(readDbPage).toEqual(modifiedPage);
445
+ // WAL file
446
+ const readWalHeader = new Uint8Array(32);
447
+ expect(vfs.jRead(walFileId, readWalHeader, 0)).toBe(VFS.SQLITE_OK);
448
+ expect(readWalHeader).toEqual(walHeader);
449
+ // 8. Close all files
450
+ expect(vfs.jClose(dbFileId)).toBe(VFS.SQLITE_OK);
451
+ expect(vfs.jClose(walFileId)).toBe(VFS.SQLITE_OK);
452
+ // 9. Verify persistence across VFS sessions
453
+ await new Promise((resolve) => setTimeout(resolve, 20));
454
+ expect(vfs.jOpen(dbPath, dbFileId, dbFlags, pOutFlags)).toBe(VFS.SQLITE_OK);
455
+ const persistentReadHeader = new Uint8Array(sqliteHeader.length);
456
+ expect(vfs.jRead(dbFileId, persistentReadHeader, 0)).toBe(VFS.SQLITE_OK);
457
+ expect(persistentReadHeader).toEqual(sqliteHeader);
458
+ expect(vfs.jClose(dbFileId)).toBe(VFS.SQLITE_OK);
459
+ });
460
+ });
461
+ });
462
+ //# sourceMappingURL=cloudflare-worker-vfs-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-worker-vfs-integration.test.js","sourceRoot":"","sources":["../../../../src/cf/test/async-storage/cloudflare-worker-vfs-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cloudflare-worker-vfs-reliability.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-worker-vfs-reliability.test.d.ts","sourceRoot":"","sources":["../../../../src/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.ts"],"names":[],"mappings":""}