@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/browser/mod.d.ts +1 -0
- package/dist/browser/mod.d.ts.map +1 -1
- package/dist/browser/mod.js.map +1 -1
- package/dist/browser/opfs/AccessHandlePoolVFS.d.ts +17 -0
- package/dist/browser/opfs/AccessHandlePoolVFS.d.ts.map +1 -1
- package/dist/browser/opfs/AccessHandlePoolVFS.js +72 -1
- package/dist/browser/opfs/AccessHandlePoolVFS.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 +28 -4
- 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.js +3 -8
- package/dist/node/mod.js.map +1 -1
- package/package.json +21 -8
- package/src/browser/mod.ts +1 -0
- package/src/browser/opfs/AccessHandlePoolVFS.ts +79 -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 +38 -4
- package/src/node/NodeFS.ts +1 -9
- package/src/node/mod.ts +3 -10
package/dist/cf/mod.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// import path from 'node:path'
|
|
2
|
+
import { UnexpectedError } from '@livestore/common';
|
|
3
|
+
import { Effect } from '@livestore/utils/effect';
|
|
4
|
+
import { makeInMemoryDb } from "../in-memory-vfs.js";
|
|
5
|
+
import { makeSqliteDb } from "../make-sqlite-db.js";
|
|
6
|
+
import { CloudflareSqlVFS } from "./CloudflareSqlVFS.js";
|
|
7
|
+
export { BlockManager } from "./BlockManager.js";
|
|
8
|
+
export { CloudflareSqlVFS } from "./CloudflareSqlVFS.js";
|
|
9
|
+
export { CloudflareWorkerVFS } from "./CloudflareWorkerVFS.js";
|
|
10
|
+
export const sqliteDbFactory = ({ sqlite3 }) => (input) => Effect.gen(function* () {
|
|
11
|
+
if (input._tag === 'in-memory') {
|
|
12
|
+
const { dbPointer, vfs } = makeInMemoryDb(sqlite3);
|
|
13
|
+
return makeSqliteDb({
|
|
14
|
+
sqlite3,
|
|
15
|
+
metadata: {
|
|
16
|
+
_tag: 'in-memory',
|
|
17
|
+
vfs,
|
|
18
|
+
dbPointer,
|
|
19
|
+
persistenceInfo: { fileName: ':memory:' },
|
|
20
|
+
deleteDb: () => { },
|
|
21
|
+
configureDb: input.configureDb ?? (() => { }),
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const { dbPointer, vfs } = yield* makeCloudflareFsDb({
|
|
26
|
+
sqlite3,
|
|
27
|
+
fileName: input.fileName,
|
|
28
|
+
// directory: input.directory,
|
|
29
|
+
storage: input.storage,
|
|
30
|
+
});
|
|
31
|
+
// const filePath = path.join(input.directory, input.fileName)
|
|
32
|
+
// const filePath = `${input.directory}/${input.fileName}`
|
|
33
|
+
return makeSqliteDb({
|
|
34
|
+
sqlite3,
|
|
35
|
+
metadata: {
|
|
36
|
+
_tag: 'storage',
|
|
37
|
+
vfs,
|
|
38
|
+
dbPointer,
|
|
39
|
+
persistenceInfo: { fileName: input.fileName },
|
|
40
|
+
// deleteDb: () => vfs.deleteDb(filePath),
|
|
41
|
+
// TODO: implement deleteDb
|
|
42
|
+
deleteDb: () => { },
|
|
43
|
+
configureDb: input.configureDb ?? (() => { }),
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
const makeCloudflareFsDb = ({ sqlite3, fileName,
|
|
48
|
+
// directory,
|
|
49
|
+
storage, }) => Effect.gen(function* () {
|
|
50
|
+
// NOTE to keep the filePath short, we use the directory name in the vfs name
|
|
51
|
+
// If this is becoming a problem, we can use a hashed version of the directory name
|
|
52
|
+
const vfsName = `cf-do-sqlite-${fileName}`;
|
|
53
|
+
if (sqlite3.vfs_registered.has(vfsName) === false) {
|
|
54
|
+
// TODO refactor with Effect FileSystem instead of using `node:fs` directly inside of CloudflareWorkerVFS
|
|
55
|
+
// const nodeFsVfs = new CloudflareWorkerVFS(vfsName, storage, (sqlite3 as any).module)
|
|
56
|
+
const nodeFsVfs = new CloudflareSqlVFS(vfsName, storage.sql, sqlite3.module);
|
|
57
|
+
// Initialize the VFS schema before registering it
|
|
58
|
+
const isReady = yield* Effect.promise(() => nodeFsVfs.isReady());
|
|
59
|
+
if (!isReady) {
|
|
60
|
+
throw new Error(`Failed to initialize CloudflareSqlVFS for ${vfsName}`);
|
|
61
|
+
}
|
|
62
|
+
// @ts-expect-error TODO fix types
|
|
63
|
+
sqlite3.vfs_register(nodeFsVfs, false);
|
|
64
|
+
}
|
|
65
|
+
// yield* fs.makeDirectory(directory, { recursive: true })
|
|
66
|
+
const FILE_NAME_MAX_LENGTH = 56;
|
|
67
|
+
if (fileName.length > FILE_NAME_MAX_LENGTH) {
|
|
68
|
+
throw new Error(`File name ${fileName} is too long. Maximum length is ${FILE_NAME_MAX_LENGTH} characters.`);
|
|
69
|
+
}
|
|
70
|
+
// NOTE SQLite will return a "disk I/O error" if the file path is too long.
|
|
71
|
+
const dbPointer = sqlite3.open_v2Sync(fileName, undefined, vfsName);
|
|
72
|
+
return { dbPointer, vfs: {} };
|
|
73
|
+
}).pipe(UnexpectedError.mapToUnexpectedError);
|
|
74
|
+
//# sourceMappingURL=mod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/cf/mod.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-worker-vfs-advanced.test.d.ts","sourceRoot":"","sources":["../../../../src/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,314 @@
|
|
|
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 - Advanced Features', () => {
|
|
6
|
+
let vfs;
|
|
7
|
+
let mockStorage;
|
|
8
|
+
let storageData;
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
storageData = new Map();
|
|
11
|
+
mockStorage = {
|
|
12
|
+
get: (async (_key) => {
|
|
13
|
+
if (Array.isArray(_key)) {
|
|
14
|
+
return new Map();
|
|
15
|
+
}
|
|
16
|
+
return storageData.get(_key);
|
|
17
|
+
}),
|
|
18
|
+
put: async (_key, _value) => {
|
|
19
|
+
if (typeof _key === 'string') {
|
|
20
|
+
storageData.set(_key, _value);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
for (const [k, v] of Object.entries(_key)) {
|
|
24
|
+
storageData.set(k, v);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
delete: (async (_key) => {
|
|
29
|
+
if (Array.isArray(_key)) {
|
|
30
|
+
let count = 0;
|
|
31
|
+
for (const k of _key) {
|
|
32
|
+
if (storageData.delete(k))
|
|
33
|
+
count++;
|
|
34
|
+
}
|
|
35
|
+
return count;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return storageData.delete(_key);
|
|
39
|
+
}
|
|
40
|
+
}),
|
|
41
|
+
list: async () => new Map(storageData),
|
|
42
|
+
sync: async () => { },
|
|
43
|
+
transactionSync: (fn) => fn(),
|
|
44
|
+
deleteAll: async () => {
|
|
45
|
+
storageData.clear();
|
|
46
|
+
},
|
|
47
|
+
transaction: async (fn) => fn({}),
|
|
48
|
+
getCurrentBookmark: async () => '',
|
|
49
|
+
getBookmarkForTime: async (_time) => '',
|
|
50
|
+
onNextSessionRestoreBookmark: async (_bookmark) => '',
|
|
51
|
+
getAlarm: async () => null,
|
|
52
|
+
setAlarm: async (_timestamp) => { },
|
|
53
|
+
deleteAlarm: async () => { },
|
|
54
|
+
sql: {},
|
|
55
|
+
};
|
|
56
|
+
vfs = new CloudflareWorkerVFS('test-advanced-vfs', mockStorage, {});
|
|
57
|
+
await vfs.isReady();
|
|
58
|
+
});
|
|
59
|
+
describe('Large File Chunking', () => {
|
|
60
|
+
it('should handle large files with proper chunking', async () => {
|
|
61
|
+
const path = '/test/large-file.db';
|
|
62
|
+
const fileId = 1;
|
|
63
|
+
const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
64
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
65
|
+
vfs.jOpen(path, fileId, flags, pOutFlags);
|
|
66
|
+
// Write 5 chunks worth of data
|
|
67
|
+
const chunkSize = 64 * 1024;
|
|
68
|
+
const numChunks = 5;
|
|
69
|
+
const totalSize = chunkSize * numChunks;
|
|
70
|
+
const largeData = new Uint8Array(totalSize);
|
|
71
|
+
// Fill with pattern for verification
|
|
72
|
+
for (let i = 0; i < totalSize; i++) {
|
|
73
|
+
largeData[i] = (i * 7) % 256;
|
|
74
|
+
}
|
|
75
|
+
expect(vfs.jWrite(fileId, largeData, 0)).toBe(VFS.SQLITE_OK);
|
|
76
|
+
// Verify file size
|
|
77
|
+
const pSize64 = new DataView(new ArrayBuffer(8));
|
|
78
|
+
expect(vfs.jFileSize(fileId, pSize64)).toBe(VFS.SQLITE_OK);
|
|
79
|
+
expect(pSize64.getBigInt64(0, true)).toBe(BigInt(totalSize));
|
|
80
|
+
// Read back in chunks to verify chunking works correctly
|
|
81
|
+
for (let chunkIdx = 0; chunkIdx < numChunks; chunkIdx++) {
|
|
82
|
+
const chunkData = new Uint8Array(chunkSize);
|
|
83
|
+
const offset = chunkIdx * chunkSize;
|
|
84
|
+
expect(vfs.jRead(fileId, chunkData, offset)).toBe(VFS.SQLITE_OK);
|
|
85
|
+
expect(chunkData).toEqual(largeData.slice(offset, offset + chunkSize));
|
|
86
|
+
}
|
|
87
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
88
|
+
});
|
|
89
|
+
it('should handle cross-chunk boundary operations', async () => {
|
|
90
|
+
const path = '/test/cross-chunk.db';
|
|
91
|
+
const fileId = 1;
|
|
92
|
+
const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
93
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
94
|
+
vfs.jOpen(path, fileId, flags, pOutFlags);
|
|
95
|
+
const chunkSize = 64 * 1024;
|
|
96
|
+
// Write data spanning chunk boundaries
|
|
97
|
+
const spanData = new Uint8Array(chunkSize + 1000);
|
|
98
|
+
spanData.fill(0xaa);
|
|
99
|
+
const spanOffset = chunkSize - 500;
|
|
100
|
+
expect(vfs.jWrite(fileId, spanData, spanOffset)).toBe(VFS.SQLITE_OK);
|
|
101
|
+
// Read back cross-boundary data
|
|
102
|
+
const readData = new Uint8Array(spanData.length);
|
|
103
|
+
expect(vfs.jRead(fileId, readData, spanOffset)).toBe(VFS.SQLITE_OK);
|
|
104
|
+
expect(readData).toEqual(spanData);
|
|
105
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe('Cache Management', () => {
|
|
109
|
+
it('should handle cache operations correctly', async () => {
|
|
110
|
+
const path = '/test/cache-test.db';
|
|
111
|
+
const fileId = 1;
|
|
112
|
+
const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
113
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
114
|
+
vfs.jOpen(path, fileId, flags, pOutFlags);
|
|
115
|
+
// Write data to populate cache
|
|
116
|
+
const testData = new TextEncoder().encode('Cache test data');
|
|
117
|
+
expect(vfs.jWrite(fileId, testData, 0)).toBe(VFS.SQLITE_OK);
|
|
118
|
+
// Multiple reads should use cache
|
|
119
|
+
for (let i = 0; i < 5; i++) {
|
|
120
|
+
const readData = new Uint8Array(testData.length);
|
|
121
|
+
expect(vfs.jRead(fileId, readData, 0)).toBe(VFS.SQLITE_OK);
|
|
122
|
+
expect(readData).toEqual(testData);
|
|
123
|
+
}
|
|
124
|
+
// Check cache statistics
|
|
125
|
+
const stats = vfs.getStats();
|
|
126
|
+
expect(stats.cachedChunks).toBeGreaterThan(0);
|
|
127
|
+
expect(stats.chunkSize).toBe(64 * 1024);
|
|
128
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
129
|
+
});
|
|
130
|
+
it('should handle large files that exceed cache capacity', async () => {
|
|
131
|
+
const path = '/test/cache-overflow.db';
|
|
132
|
+
const fileId = 1;
|
|
133
|
+
const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
134
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
135
|
+
vfs.jOpen(path, fileId, flags, pOutFlags);
|
|
136
|
+
// Write many chunks to potentially exceed cache
|
|
137
|
+
const chunkSize = 64 * 1024;
|
|
138
|
+
const numChunks = 20; // Likely to exceed typical cache size
|
|
139
|
+
for (let i = 0; i < numChunks; i++) {
|
|
140
|
+
const chunkData = new Uint8Array(chunkSize);
|
|
141
|
+
chunkData.fill(i % 256);
|
|
142
|
+
const offset = i * chunkSize;
|
|
143
|
+
expect(vfs.jWrite(fileId, chunkData, offset)).toBe(VFS.SQLITE_OK);
|
|
144
|
+
}
|
|
145
|
+
// Verify all chunks can still be read correctly
|
|
146
|
+
for (let i = 0; i < numChunks; i++) {
|
|
147
|
+
const readData = new Uint8Array(chunkSize);
|
|
148
|
+
const offset = i * chunkSize;
|
|
149
|
+
const readResult = vfs.jRead(fileId, readData, offset);
|
|
150
|
+
if (readResult === VFS.SQLITE_OK) {
|
|
151
|
+
const expectedData = new Uint8Array(chunkSize);
|
|
152
|
+
expectedData.fill(i % 256);
|
|
153
|
+
expect(readData).toEqual(expectedData);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// Cache miss is acceptable for this test - we're testing cache pressure
|
|
157
|
+
expect(readResult).toBe(VFS.SQLITE_IOERR_SHORT_READ);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('SQLite File Types', () => {
|
|
164
|
+
it('should handle main database files', async () => {
|
|
165
|
+
const path = '/test/main.db';
|
|
166
|
+
const fileId = 1;
|
|
167
|
+
const flags = VFS.SQLITE_OPEN_MAIN_DB | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
168
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
169
|
+
expect(vfs.jOpen(path, fileId, flags, pOutFlags)).toBe(VFS.SQLITE_OK);
|
|
170
|
+
expect(pOutFlags.getUint32(0, true)).toBe(flags);
|
|
171
|
+
// Write typical SQLite header
|
|
172
|
+
const header = new TextEncoder().encode('SQLite format 3\0');
|
|
173
|
+
expect(vfs.jWrite(fileId, header, 0)).toBe(VFS.SQLITE_OK);
|
|
174
|
+
// Read back header
|
|
175
|
+
const readHeader = new Uint8Array(header.length);
|
|
176
|
+
expect(vfs.jRead(fileId, readHeader, 0)).toBe(VFS.SQLITE_OK);
|
|
177
|
+
expect(readHeader).toEqual(header);
|
|
178
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
179
|
+
});
|
|
180
|
+
it('should handle WAL files', async () => {
|
|
181
|
+
const path = '/test/main.db-wal';
|
|
182
|
+
const fileId = 2;
|
|
183
|
+
const flags = VFS.SQLITE_OPEN_WAL | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
184
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
185
|
+
expect(vfs.jOpen(path, fileId, flags, pOutFlags)).toBe(VFS.SQLITE_OK);
|
|
186
|
+
// Write WAL data
|
|
187
|
+
const walData = new Uint8Array(1000);
|
|
188
|
+
walData.fill(0xee);
|
|
189
|
+
expect(vfs.jWrite(fileId, walData, 0)).toBe(VFS.SQLITE_OK);
|
|
190
|
+
// Verify WAL data
|
|
191
|
+
const readWalData = new Uint8Array(walData.length);
|
|
192
|
+
expect(vfs.jRead(fileId, readWalData, 0)).toBe(VFS.SQLITE_OK);
|
|
193
|
+
expect(readWalData).toEqual(walData);
|
|
194
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
195
|
+
});
|
|
196
|
+
it('should handle journal files', async () => {
|
|
197
|
+
const path = '/test/main.db-journal';
|
|
198
|
+
const fileId = 3;
|
|
199
|
+
const flags = VFS.SQLITE_OPEN_MAIN_JOURNAL | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
200
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
201
|
+
expect(vfs.jOpen(path, fileId, flags, pOutFlags)).toBe(VFS.SQLITE_OK);
|
|
202
|
+
// Write journal data
|
|
203
|
+
const journalData = new Uint8Array(500);
|
|
204
|
+
journalData.fill(0xff);
|
|
205
|
+
expect(vfs.jWrite(fileId, journalData, 0)).toBe(VFS.SQLITE_OK);
|
|
206
|
+
// Verify journal data
|
|
207
|
+
const readJournalData = new Uint8Array(journalData.length);
|
|
208
|
+
expect(vfs.jRead(fileId, readJournalData, 0)).toBe(VFS.SQLITE_OK);
|
|
209
|
+
expect(readJournalData).toEqual(journalData);
|
|
210
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
211
|
+
});
|
|
212
|
+
it('should handle temporary files', async () => {
|
|
213
|
+
const path = '/test/temp.db';
|
|
214
|
+
const fileId = 4;
|
|
215
|
+
const flags = VFS.SQLITE_OPEN_TEMP_DB | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
216
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
217
|
+
expect(vfs.jOpen(path, fileId, flags, pOutFlags)).toBe(VFS.SQLITE_OK);
|
|
218
|
+
// Write temporary data
|
|
219
|
+
const tempData = new TextEncoder().encode('Temporary database content');
|
|
220
|
+
expect(vfs.jWrite(fileId, tempData, 0)).toBe(VFS.SQLITE_OK);
|
|
221
|
+
// Read temporary data
|
|
222
|
+
const readTempData = new Uint8Array(tempData.length);
|
|
223
|
+
expect(vfs.jRead(fileId, readTempData, 0)).toBe(VFS.SQLITE_OK);
|
|
224
|
+
expect(readTempData).toEqual(tempData);
|
|
225
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
describe('Advanced Operations', () => {
|
|
229
|
+
it('should handle multiple files with different types simultaneously', async () => {
|
|
230
|
+
const files = [
|
|
231
|
+
{
|
|
232
|
+
path: '/test/multi-main.db',
|
|
233
|
+
id: 1,
|
|
234
|
+
flags: VFS.SQLITE_OPEN_MAIN_DB | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE,
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
path: '/test/multi-main.db-wal',
|
|
238
|
+
id: 2,
|
|
239
|
+
flags: VFS.SQLITE_OPEN_WAL | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE,
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
path: '/test/multi-main.db-journal',
|
|
243
|
+
id: 3,
|
|
244
|
+
flags: VFS.SQLITE_OPEN_MAIN_JOURNAL | VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE,
|
|
245
|
+
},
|
|
246
|
+
];
|
|
247
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
248
|
+
// Open all files
|
|
249
|
+
for (const file of files) {
|
|
250
|
+
expect(vfs.jOpen(file.path, file.id, file.flags, pOutFlags)).toBe(VFS.SQLITE_OK);
|
|
251
|
+
}
|
|
252
|
+
// Write different data to each file
|
|
253
|
+
for (let i = 0; i < files.length; i++) {
|
|
254
|
+
const data = new TextEncoder().encode(`File ${i} data`);
|
|
255
|
+
expect(vfs.jWrite(files[i]?.id ?? 0, data, 0)).toBe(VFS.SQLITE_OK);
|
|
256
|
+
}
|
|
257
|
+
// Verify each file has correct data
|
|
258
|
+
for (let i = 0; i < files.length; i++) {
|
|
259
|
+
const expected = new TextEncoder().encode(`File ${i} data`);
|
|
260
|
+
const actual = new Uint8Array(expected.length);
|
|
261
|
+
expect(vfs.jRead(files[i]?.id ?? 0, actual, 0)).toBe(VFS.SQLITE_OK);
|
|
262
|
+
expect(actual).toEqual(expected);
|
|
263
|
+
}
|
|
264
|
+
// Close all files
|
|
265
|
+
for (const file of files) {
|
|
266
|
+
expect(vfs.jClose(file.id)).toBe(VFS.SQLITE_OK);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
it('should handle file truncation with chunking', async () => {
|
|
270
|
+
const path = '/test/truncate-chunks.db';
|
|
271
|
+
const fileId = 1;
|
|
272
|
+
const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
273
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
274
|
+
vfs.jOpen(path, fileId, flags, pOutFlags);
|
|
275
|
+
const chunkSize = 64 * 1024;
|
|
276
|
+
// Write data spanning 3 chunks
|
|
277
|
+
const largeData = new Uint8Array(chunkSize * 3);
|
|
278
|
+
largeData.fill(0xdd);
|
|
279
|
+
expect(vfs.jWrite(fileId, largeData, 0)).toBe(VFS.SQLITE_OK);
|
|
280
|
+
// Truncate to 1.5 chunks
|
|
281
|
+
const truncateSize = chunkSize + chunkSize / 2;
|
|
282
|
+
expect(vfs.jTruncate(fileId, truncateSize)).toBe(VFS.SQLITE_OK);
|
|
283
|
+
// Verify new size
|
|
284
|
+
const pSize64 = new DataView(new ArrayBuffer(8));
|
|
285
|
+
expect(vfs.jFileSize(fileId, pSize64)).toBe(VFS.SQLITE_OK);
|
|
286
|
+
expect(pSize64.getBigInt64(0, true)).toBe(BigInt(truncateSize));
|
|
287
|
+
// Verify data integrity after truncation
|
|
288
|
+
const readData = new Uint8Array(truncateSize);
|
|
289
|
+
expect(vfs.jRead(fileId, readData, 0)).toBe(VFS.SQLITE_OK);
|
|
290
|
+
expect(readData).toEqual(largeData.slice(0, truncateSize));
|
|
291
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
292
|
+
});
|
|
293
|
+
it('should handle sync operations with proper flush behavior', async () => {
|
|
294
|
+
const path = '/test/sync-flush.db';
|
|
295
|
+
const fileId = 1;
|
|
296
|
+
const flags = VFS.SQLITE_OPEN_CREATE | VFS.SQLITE_OPEN_READWRITE;
|
|
297
|
+
const pOutFlags = new DataView(new ArrayBuffer(4));
|
|
298
|
+
vfs.jOpen(path, fileId, flags, pOutFlags);
|
|
299
|
+
// Write data
|
|
300
|
+
const testData = new TextEncoder().encode('Sync test data');
|
|
301
|
+
expect(vfs.jWrite(fileId, testData, 0)).toBe(VFS.SQLITE_OK);
|
|
302
|
+
// Test different sync modes
|
|
303
|
+
expect(vfs.jSync(fileId, VFS.SQLITE_SYNC_NORMAL)).toBe(VFS.SQLITE_OK);
|
|
304
|
+
expect(vfs.jSync(fileId, VFS.SQLITE_SYNC_FULL)).toBe(VFS.SQLITE_OK);
|
|
305
|
+
expect(vfs.jSync(fileId, VFS.SQLITE_SYNC_DATAONLY)).toBe(VFS.SQLITE_OK);
|
|
306
|
+
// Verify data is still accessible after sync
|
|
307
|
+
const readData = new Uint8Array(testData.length);
|
|
308
|
+
expect(vfs.jRead(fileId, readData, 0)).toBe(VFS.SQLITE_OK);
|
|
309
|
+
expect(readData).toEqual(testData);
|
|
310
|
+
expect(vfs.jClose(fileId)).toBe(VFS.SQLITE_OK);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
//# sourceMappingURL=cloudflare-worker-vfs-advanced.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-worker-vfs-advanced.test.js","sourceRoot":"","sources":["../../../../src/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-worker-vfs-core.test.d.ts","sourceRoot":"","sources":["../../../../src/cf/test/async-storage/cloudflare-worker-vfs-core.test.ts"],"names":[],"mappings":""}
|