@livestore/sqlite-wasm 0.4.0-dev.2 → 0.4.0-dev.20
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/dist/.tsbuildinfo +1 -1
- package/dist/FacadeVFS.d.ts.map +1 -1
- package/dist/FacadeVFS.js +4 -0
- package/dist/FacadeVFS.js.map +1 -1
- package/dist/browser/mod.d.ts +15 -7
- 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 +40 -17
- package/dist/browser/opfs/AccessHandlePoolVFS.d.ts.map +1 -1
- package/dist/browser/opfs/AccessHandlePoolVFS.js +211 -143
- 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 +1 -1
- package/dist/browser/opfs/opfs-sah-pool.js.map +1 -1
- package/dist/cf/BlockManager.d.ts +61 -0
- package/dist/cf/BlockManager.d.ts.map +1 -0
- package/dist/cf/BlockManager.js +157 -0
- package/dist/cf/BlockManager.js.map +1 -0
- package/dist/cf/CloudflareSqlVFS.d.ts +51 -0
- package/dist/cf/CloudflareSqlVFS.d.ts.map +1 -0
- package/dist/cf/CloudflareSqlVFS.js +351 -0
- package/dist/cf/CloudflareSqlVFS.js.map +1 -0
- package/dist/cf/CloudflareWorkerVFS.d.ts +72 -0
- package/dist/cf/CloudflareWorkerVFS.d.ts.map +1 -0
- package/dist/cf/CloudflareWorkerVFS.js +552 -0
- package/dist/cf/CloudflareWorkerVFS.js.map +1 -0
- package/dist/cf/mod.d.ts +43 -0
- package/dist/cf/mod.d.ts.map +1 -0
- package/dist/cf/mod.js +74 -0
- package/dist/cf/mod.js.map +1 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.d.ts +2 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.d.ts.map +1 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js +314 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js.map +1 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.d.ts +2 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.d.ts.map +1 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js +266 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js.map +1 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.d.ts +2 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.d.ts.map +1 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js +462 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js.map +1 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.d.ts +2 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.d.ts.map +1 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js +334 -0
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js.map +1 -0
- package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.d.ts +2 -0
- package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.d.ts.map +1 -0
- package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js +354 -0
- package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js.map +1 -0
- package/dist/load-wasm/mod.node.d.ts.map +1 -1
- package/dist/load-wasm/mod.node.js +1 -2
- package/dist/load-wasm/mod.node.js.map +1 -1
- package/dist/load-wasm/mod.workerd.d.ts +2 -0
- package/dist/load-wasm/mod.workerd.d.ts.map +1 -0
- package/dist/load-wasm/mod.workerd.js +28 -0
- package/dist/load-wasm/mod.workerd.js.map +1 -0
- package/dist/make-sqlite-db.d.ts +1 -0
- package/dist/make-sqlite-db.d.ts.map +1 -1
- package/dist/make-sqlite-db.js +29 -8
- package/dist/make-sqlite-db.js.map +1 -1
- package/dist/node/NodeFS.d.ts +1 -2
- package/dist/node/NodeFS.d.ts.map +1 -1
- package/dist/node/NodeFS.js +1 -6
- package/dist/node/NodeFS.js.map +1 -1
- package/dist/node/mod.d.ts.map +1 -1
- package/dist/node/mod.js +5 -10
- package/dist/node/mod.js.map +1 -1
- package/package.json +21 -8
- package/src/FacadeVFS.ts +5 -0
- package/src/browser/mod.ts +39 -13
- package/src/browser/opfs/AccessHandlePoolVFS.ts +387 -225
- package/src/browser/opfs/index.ts +4 -3
- package/src/browser/opfs/opfs-sah-pool.ts +1 -1
- package/src/cf/BlockManager.ts +225 -0
- package/src/cf/CloudflareSqlVFS.ts +450 -0
- package/src/cf/CloudflareWorkerVFS.ts +664 -0
- package/src/cf/README.md +60 -0
- package/src/cf/mod.ts +143 -0
- package/src/cf/test/README.md +224 -0
- package/src/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.ts +389 -0
- package/src/cf/test/async-storage/cloudflare-worker-vfs-core.test.ts +322 -0
- package/src/cf/test/async-storage/cloudflare-worker-vfs-integration.test.ts +585 -0
- package/src/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.ts +403 -0
- package/src/cf/test/sql/cloudflare-sql-vfs-core.test.ts +433 -0
- package/src/load-wasm/mod.node.ts +1 -2
- package/src/load-wasm/mod.workerd.ts +28 -0
- package/src/make-sqlite-db.ts +39 -8
- package/src/node/NodeFS.ts +1 -9
- package/src/node/mod.ts +5 -12
- package/src/ambient.d.ts +0 -18
|
@@ -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 @@
|
|
|
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":""}
|