@livestore/sqlite-wasm 0.4.0-dev.0 → 0.4.0-dev.10

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 +26 -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 +26 -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,351 @@
1
+ import * as VFS from '@livestore/wa-sqlite/src/VFS.js';
2
+ import { FacadeVFS } from "../FacadeVFS.js";
3
+ import { BlockManager } from "./BlockManager.js";
4
+ const SECTOR_SIZE = 4096;
5
+ // Block size for SQL-based storage (same as CloudflareWorkerVFS for consistency)
6
+ const BLOCK_SIZE = 64 * 1024; // 64 KiB
7
+ // Maximum number of open files
8
+ const DEFAULT_MAX_FILES = 100;
9
+ // These file types are expected to persist in the file system
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
+ /**
12
+ * VFS implementation using Cloudflare Durable Object SQL storage as the backend.
13
+ * This provides a synchronous VFS interface by leveraging SQL's synchronous API.
14
+ *
15
+ * Storage Strategy:
16
+ * - Files are stored as blocks in SQL tables for efficient I/O
17
+ * - File metadata stored in vfs_files table
18
+ * - File data stored as fixed-size blocks in vfs_blocks table
19
+ * - Synchronous operations via SQL's synchronous API
20
+ *
21
+ * Key advantages over async VFS:
22
+ * - No async/await complexity
23
+ * - Native SQL ACID properties
24
+ * - Efficient range queries for file operations
25
+ * - Built-in consistency and durability
26
+ */
27
+ export class CloudflareSqlVFS extends FacadeVFS {
28
+ log = null;
29
+ #sql;
30
+ #initialized = false;
31
+ #blockManager;
32
+ // File management
33
+ #openFiles = new Map();
34
+ #maxFiles;
35
+ static async create(name, sql, module, options = {}) {
36
+ const vfs = new CloudflareSqlVFS(name, sql, module, options);
37
+ await vfs.isReady();
38
+ return vfs;
39
+ }
40
+ constructor(name, sql, module, options = {}) {
41
+ super(name, module);
42
+ this.#sql = sql;
43
+ this.#maxFiles = options.maxFiles || DEFAULT_MAX_FILES;
44
+ this.#blockManager = new BlockManager(options.blockSize || BLOCK_SIZE);
45
+ }
46
+ /**
47
+ * Initialize the VFS by setting up SQL schema
48
+ */
49
+ async isReady() {
50
+ if (this.#initialized) {
51
+ return true;
52
+ }
53
+ try {
54
+ // Initialize SQL schema
55
+ this.#initializeSchema();
56
+ // Clean up non-persistent files from previous sessions
57
+ this.#cleanupNonPersistentFiles();
58
+ this.#initialized = true;
59
+ return true;
60
+ }
61
+ catch (error) {
62
+ console.error('CloudflareSqlVFS initialization failed:', error);
63
+ return false;
64
+ }
65
+ }
66
+ /**
67
+ * Initialize the SQL schema for the VFS
68
+ */
69
+ #initializeSchema() {
70
+ // Execute each statement individually to avoid parsing issues
71
+ const statements = [
72
+ `CREATE TABLE IF NOT EXISTS vfs_files (
73
+ file_path TEXT PRIMARY KEY,
74
+ file_size INTEGER NOT NULL DEFAULT 0,
75
+ flags INTEGER NOT NULL DEFAULT 0,
76
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
77
+ modified_at INTEGER NOT NULL DEFAULT (unixepoch())
78
+ )`,
79
+ `CREATE TABLE IF NOT EXISTS vfs_blocks (
80
+ file_path TEXT NOT NULL,
81
+ block_id INTEGER NOT NULL,
82
+ block_data BLOB NOT NULL,
83
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
84
+ PRIMARY KEY (file_path, block_id),
85
+ FOREIGN KEY (file_path) REFERENCES vfs_files(file_path) ON DELETE CASCADE
86
+ )`,
87
+ `CREATE INDEX IF NOT EXISTS idx_vfs_blocks_range ON vfs_blocks(file_path, block_id)`,
88
+ `CREATE INDEX IF NOT EXISTS idx_vfs_files_modified ON vfs_files(modified_at)`,
89
+ `CREATE TRIGGER IF NOT EXISTS trg_vfs_files_update_modified
90
+ AFTER UPDATE OF file_size ON vfs_files
91
+ BEGIN
92
+ UPDATE vfs_files SET modified_at = unixepoch() WHERE file_path = NEW.file_path;
93
+ END`,
94
+ ];
95
+ for (const statement of statements) {
96
+ try {
97
+ this.#sql.exec(statement);
98
+ }
99
+ catch (error) {
100
+ console.error('Failed to execute schema statement:', statement);
101
+ throw error;
102
+ }
103
+ }
104
+ }
105
+ /**
106
+ * Clean up non-persistent files from previous sessions
107
+ */
108
+ #cleanupNonPersistentFiles() {
109
+ try {
110
+ const cursor = this.#sql.exec('SELECT file_path, flags FROM vfs_files');
111
+ const filesToDelete = [];
112
+ for (const row of cursor) {
113
+ // Check if file should be persistent
114
+ if (!(row.flags & PERSISTENT_FILE_TYPES)) {
115
+ filesToDelete.push(row.file_path);
116
+ }
117
+ }
118
+ // Delete non-persistent files
119
+ for (const filePath of filesToDelete) {
120
+ this.#sql.exec('DELETE FROM vfs_files WHERE file_path = ?', filePath);
121
+ }
122
+ }
123
+ catch (error) {
124
+ console.warn('Error during cleanup:', error);
125
+ }
126
+ }
127
+ // VFS Interface Implementation
128
+ jOpen(path, fileId, flags, pOutFlags) {
129
+ try {
130
+ if (this.#openFiles.size >= this.#maxFiles) {
131
+ return VFS.SQLITE_CANTOPEN;
132
+ }
133
+ // Check if file exists
134
+ const existingFile = this.#getFileMetadata(path);
135
+ if (!existingFile && !(flags & VFS.SQLITE_OPEN_CREATE)) {
136
+ return VFS.SQLITE_CANTOPEN;
137
+ }
138
+ let metadata;
139
+ if (existingFile) {
140
+ metadata = existingFile;
141
+ }
142
+ else {
143
+ // Create new file
144
+ const now = Math.floor(Date.now() / 1000);
145
+ metadata = {
146
+ path,
147
+ size: 0,
148
+ flags,
149
+ created: now,
150
+ modified: now,
151
+ };
152
+ this.#sql.exec('INSERT INTO vfs_files (file_path, file_size, flags, created_at, modified_at) VALUES (?, ?, ?, ?, ?)', path, 0, flags, now, now);
153
+ }
154
+ // Store file handle
155
+ this.#openFiles.set(fileId, {
156
+ path,
157
+ flags,
158
+ metadata,
159
+ });
160
+ pOutFlags.setInt32(0, flags, true);
161
+ return VFS.SQLITE_OK;
162
+ }
163
+ catch (error) {
164
+ console.error('jOpen error:', error);
165
+ return VFS.SQLITE_CANTOPEN;
166
+ }
167
+ }
168
+ jClose(fileId) {
169
+ this.#openFiles.delete(fileId);
170
+ return VFS.SQLITE_OK;
171
+ }
172
+ jRead(fileId, buffer, offset) {
173
+ try {
174
+ const handle = this.#openFiles.get(fileId);
175
+ if (!handle) {
176
+ return VFS.SQLITE_IOERR;
177
+ }
178
+ const range = this.#blockManager.calculateBlockRange(offset, buffer.length);
179
+ const blockIds = [];
180
+ for (let i = range.startBlock; i <= range.endBlock; i++) {
181
+ blockIds.push(i);
182
+ }
183
+ const blocks = this.#blockManager.readBlocks(this.#sql, handle.path, blockIds);
184
+ const data = this.#blockManager.assembleBlocks(blocks, range, buffer.length);
185
+ buffer.set(data);
186
+ return VFS.SQLITE_OK;
187
+ }
188
+ catch (error) {
189
+ console.error('jRead error:', error);
190
+ return VFS.SQLITE_IOERR;
191
+ }
192
+ }
193
+ jWrite(fileId, data, offset) {
194
+ try {
195
+ const handle = this.#openFiles.get(fileId);
196
+ if (!handle) {
197
+ return VFS.SQLITE_IOERR;
198
+ }
199
+ // Split write data into blocks
200
+ const writeBlocks = this.#blockManager.splitIntoBlocks(data, offset);
201
+ const finalBlocks = new Map();
202
+ for (const [blockId, blockInfo] of writeBlocks) {
203
+ let blockData;
204
+ if (blockInfo.blockOffset === 0 && blockInfo.data.length === this.#blockManager.getBlockSize()) {
205
+ // Full block write
206
+ blockData = blockInfo.data;
207
+ }
208
+ else {
209
+ // Partial block write - merge with existing data
210
+ blockData = this.#blockManager.mergePartialBlock(this.#sql, handle.path, blockInfo.blockId, blockInfo.blockOffset, blockInfo.data);
211
+ }
212
+ finalBlocks.set(blockId, blockData);
213
+ }
214
+ // Write blocks to SQL storage
215
+ this.#blockManager.writeBlocks(this.#sql, handle.path, finalBlocks);
216
+ // Update file size if necessary
217
+ const newSize = Math.max(handle.metadata.size, offset + data.length);
218
+ if (newSize !== handle.metadata.size) {
219
+ this.#sql.exec('UPDATE vfs_files SET file_size = ? WHERE file_path = ?', newSize, handle.path);
220
+ handle.metadata.size = newSize;
221
+ }
222
+ return VFS.SQLITE_OK;
223
+ }
224
+ catch (error) {
225
+ console.error('jWrite error:', error);
226
+ return VFS.SQLITE_IOERR;
227
+ }
228
+ }
229
+ jTruncate(fileId, size) {
230
+ try {
231
+ const handle = this.#openFiles.get(fileId);
232
+ if (!handle) {
233
+ return VFS.SQLITE_IOERR;
234
+ }
235
+ // Calculate which block contains the new end of file
236
+ const lastBlockId = Math.floor(size / this.#blockManager.getBlockSize());
237
+ // Delete blocks beyond the truncation point
238
+ this.#blockManager.deleteBlocksAfter(this.#sql, handle.path, lastBlockId + 1);
239
+ // If truncating within a block, we need to truncate that block's data
240
+ if (size % this.#blockManager.getBlockSize() !== 0) {
241
+ const existingBlocks = this.#blockManager.readBlocks(this.#sql, handle.path, [lastBlockId]);
242
+ const blockData = existingBlocks.get(lastBlockId);
243
+ if (blockData) {
244
+ const truncatedBlock = blockData.slice(0, size % this.#blockManager.getBlockSize());
245
+ const paddedBlock = new Uint8Array(this.#blockManager.getBlockSize());
246
+ paddedBlock.set(truncatedBlock);
247
+ const blocksToWrite = new Map([[lastBlockId, paddedBlock]]);
248
+ this.#blockManager.writeBlocks(this.#sql, handle.path, blocksToWrite);
249
+ }
250
+ }
251
+ // Update file metadata
252
+ this.#sql.exec('UPDATE vfs_files SET file_size = ? WHERE file_path = ?', size, handle.path);
253
+ handle.metadata.size = size;
254
+ return VFS.SQLITE_OK;
255
+ }
256
+ catch (error) {
257
+ console.error('jTruncate error:', error);
258
+ return VFS.SQLITE_IOERR;
259
+ }
260
+ }
261
+ jSync(fileId, _flags) {
262
+ // SQL storage provides immediate durability, so sync is effectively a no-op
263
+ const handle = this.#openFiles.get(fileId);
264
+ if (!handle) {
265
+ return VFS.SQLITE_IOERR;
266
+ }
267
+ return VFS.SQLITE_OK;
268
+ }
269
+ jFileSize(fileId, pSize64) {
270
+ try {
271
+ const handle = this.#openFiles.get(fileId);
272
+ if (!handle) {
273
+ return VFS.SQLITE_IOERR;
274
+ }
275
+ pSize64.setBigInt64(0, BigInt(handle.metadata.size), true);
276
+ return VFS.SQLITE_OK;
277
+ }
278
+ catch (error) {
279
+ console.error('jFileSize error:', error);
280
+ return VFS.SQLITE_IOERR;
281
+ }
282
+ }
283
+ jDelete(path, _syncDir) {
284
+ try {
285
+ this.#sql.exec('DELETE FROM vfs_files WHERE file_path = ?', path);
286
+ return VFS.SQLITE_OK;
287
+ }
288
+ catch (error) {
289
+ console.error('jDelete error:', error);
290
+ return VFS.SQLITE_IOERR;
291
+ }
292
+ }
293
+ jAccess(path, _flags, pResOut) {
294
+ try {
295
+ const metadata = this.#getFileMetadata(path);
296
+ pResOut.setInt32(0, metadata ? 1 : 0, true);
297
+ return VFS.SQLITE_OK;
298
+ }
299
+ catch (error) {
300
+ console.error('jAccess error:', error);
301
+ return VFS.SQLITE_IOERR;
302
+ }
303
+ }
304
+ jSectorSize(_fileId) {
305
+ return SECTOR_SIZE;
306
+ }
307
+ jDeviceCharacteristics(_fileId) {
308
+ return VFS.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN;
309
+ }
310
+ // Helper methods
311
+ #getFileMetadata(path) {
312
+ try {
313
+ const cursor = this.#sql.exec('SELECT file_path, file_size, flags, created_at, modified_at FROM vfs_files WHERE file_path = ?', path);
314
+ const row = cursor.one();
315
+ return {
316
+ path: row.file_path,
317
+ size: row.file_size,
318
+ flags: row.flags,
319
+ created: row.created_at,
320
+ modified: row.modified_at,
321
+ };
322
+ }
323
+ catch {
324
+ return undefined;
325
+ }
326
+ }
327
+ // Statistics and debugging
328
+ getStats() {
329
+ try {
330
+ const cursor = this.#sql.exec('SELECT COUNT(*) as total_files, COALESCE(SUM(LENGTH(block_data)), 0) as total_bytes FROM vfs_files LEFT JOIN vfs_blocks USING (file_path)');
331
+ const stats = cursor.one();
332
+ return {
333
+ activeFiles: stats.total_files,
334
+ openFiles: this.#openFiles.size,
335
+ maxFiles: this.#maxFiles,
336
+ blockSize: this.#blockManager.getBlockSize(),
337
+ totalStoredBytes: stats.total_bytes,
338
+ };
339
+ }
340
+ catch {
341
+ return {
342
+ activeFiles: 0,
343
+ openFiles: this.#openFiles.size,
344
+ maxFiles: this.#maxFiles,
345
+ blockSize: this.#blockManager.getBlockSize(),
346
+ totalStoredBytes: 0,
347
+ };
348
+ }
349
+ }
350
+ }
351
+ //# sourceMappingURL=CloudflareSqlVFS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareSqlVFS.js","sourceRoot":"","sources":["../../src/cf/CloudflareSqlVFS.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { CfTypes } from '@livestore/common-cf';
2
+ import { FacadeVFS } from '../FacadeVFS.ts';
3
+ /**
4
+ * VFS implementation using Cloudflare DurableObjectStorage as the backend.
5
+ * Uses chunked storage with in-memory caching for synchronous operations.
6
+ *
7
+ * Storage Strategy:
8
+ * - Files are split into 64 KiB chunks for optimal SQLite I/O patterns
9
+ * - Metadata cached in memory for synchronous access
10
+ * - LRU cache for frequently accessed chunks
11
+ *
12
+ * Key Schema:
13
+ * - file:${path}:meta - File metadata (size, flags, chunkCount, created)
14
+ * - file:${path}:${chunkIndex} - File data chunks (64 KiB max)
15
+ * - index:files - Set of active file paths
16
+ */
17
+ export declare class CloudflareWorkerVFS extends FacadeVFS {
18
+ #private;
19
+ log: null;
20
+ static create(name: string, storage: CfTypes.DurableObjectStorage, module: any): Promise<CloudflareWorkerVFS>;
21
+ constructor(name: string, storage: CfTypes.DurableObjectStorage, module: any);
22
+ jOpen(zName: string, fileId: number, flags: number, pOutFlags: DataView): number;
23
+ jClose(fileId: number): number;
24
+ jRead(fileId: number, pData: Uint8Array, iOffset: number): number;
25
+ jWrite(fileId: number, pData: Uint8Array, iOffset: number): number;
26
+ jTruncate(fileId: number, iSize: number): number;
27
+ jSync(fileId: number, _flags: number): number;
28
+ jFileSize(fileId: number, pSize64: DataView): number;
29
+ jSectorSize(_fileId: number): number;
30
+ jDeviceCharacteristics(_fileId: number): number;
31
+ jAccess(zName: string, _flags: number, pResOut: DataView): number;
32
+ jDelete(zName: string, _syncDir: number): number;
33
+ close(): Promise<void>;
34
+ isReady(): Promise<boolean>;
35
+ /**
36
+ * Returns the number of SQLite files in the file system.
37
+ */
38
+ getSize(): number;
39
+ /**
40
+ * Returns the maximum number of SQLite files the file system can hold.
41
+ */
42
+ getCapacity(): number;
43
+ /**
44
+ * Increase the capacity of the file system by n.
45
+ */
46
+ addCapacity(n: number): Promise<number>;
47
+ /**
48
+ * Decrease the capacity of the file system by n. The capacity cannot be
49
+ * decreased to fewer than the current number of SQLite files in the
50
+ * file system.
51
+ */
52
+ removeCapacity(n: number): Promise<number>;
53
+ /**
54
+ * Flush all pending writes and sync to storage.
55
+ * This is useful for ensuring durability before critical operations.
56
+ */
57
+ syncToStorage(): Promise<void>;
58
+ /**
59
+ * Get statistics about the VFS for debugging and monitoring.
60
+ */
61
+ getStats(): {
62
+ activeFiles: number;
63
+ openFiles: number;
64
+ cachedChunks: number;
65
+ cachedMetadata: number;
66
+ pendingWrites: number;
67
+ maxFiles: number;
68
+ maxCacheSize: number;
69
+ chunkSize: number;
70
+ };
71
+ }
72
+ //# sourceMappingURL=CloudflareWorkerVFS.d.ts.map
@@ -0,0 +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"}