@componentor/fs 2.0.8 → 2.0.9
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/index.cjs +27 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +27 -14
- package/dist/index.js.map +1 -1
- package/dist/kernel.js +20 -4
- package/dist/kernel.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -445,22 +445,30 @@ function trace(...args) {
|
|
|
445
445
|
if (debugTrace) console.log('[OPFS-T2]', ...args);
|
|
446
446
|
}
|
|
447
447
|
|
|
448
|
-
//
|
|
448
|
+
// Handle release timing
|
|
449
|
+
// - Legacy mode (readwrite): 100ms delay (handles block, release ASAP)
|
|
450
|
+
// - Unsafe mode (readwrite-unsafe): 500ms delay (handles don't block each other,
|
|
451
|
+
// but DO block external tools using default mode like OPFS Explorer)
|
|
449
452
|
let releaseTimer = null;
|
|
450
453
|
const LEGACY_RELEASE_DELAY = 100;
|
|
454
|
+
const UNSAFE_RELEASE_DELAY = 500;
|
|
451
455
|
|
|
452
456
|
function scheduleHandleRelease() {
|
|
453
|
-
if (unsafeModeSupported) return; // No release needed for readwrite-unsafe
|
|
454
457
|
if (releaseTimer) return; // Already scheduled
|
|
458
|
+
|
|
459
|
+
const delay = unsafeModeSupported ? UNSAFE_RELEASE_DELAY : LEGACY_RELEASE_DELAY;
|
|
460
|
+
|
|
455
461
|
releaseTimer = setTimeout(() => {
|
|
456
462
|
releaseTimer = null;
|
|
457
463
|
const count = syncHandleCache.size;
|
|
464
|
+
if (count === 0) return;
|
|
465
|
+
|
|
458
466
|
for (const h of syncHandleCache.values()) {
|
|
459
467
|
try { h.flush(); h.close(); } catch {}
|
|
460
468
|
}
|
|
461
469
|
syncHandleCache.clear();
|
|
462
|
-
trace('Released ' + count + ' handles (legacy mode
|
|
463
|
-
},
|
|
470
|
+
trace('Released ' + count + ' handles (' + (unsafeModeSupported ? 'unsafe' : 'legacy') + ' mode, ' + delay + 'ms delay)');
|
|
471
|
+
}, delay);
|
|
464
472
|
}
|
|
465
473
|
|
|
466
474
|
async function getSyncHandle(filePath, create) {
|
|
@@ -942,22 +950,27 @@ async function handleMessage(msg) {
|
|
|
942
950
|
}
|
|
943
951
|
}
|
|
944
952
|
|
|
945
|
-
// Process queued messages
|
|
946
|
-
|
|
947
|
-
|
|
953
|
+
// Process queued messages with concurrency limit
|
|
954
|
+
// Allows multiple operations to run in parallel but prevents overwhelming the worker
|
|
955
|
+
const MAX_CONCURRENT = 8;
|
|
956
|
+
let activeOperations = 0;
|
|
957
|
+
|
|
958
|
+
async function processQueue() {
|
|
959
|
+
while (messageQueue.length > 0 && activeOperations < MAX_CONCURRENT) {
|
|
948
960
|
const msg = messageQueue.shift();
|
|
949
|
-
|
|
961
|
+
activeOperations++;
|
|
962
|
+
handleMessage(msg).finally(() => {
|
|
963
|
+
activeOperations--;
|
|
964
|
+
processQueue(); // Process next queued message
|
|
965
|
+
});
|
|
950
966
|
}
|
|
951
967
|
}
|
|
952
968
|
|
|
953
|
-
//
|
|
954
|
-
// - Tier 2: Client awaits response before sending next message
|
|
955
|
-
// - Each OPFSFileSystem instance has its own worker
|
|
969
|
+
// Queue messages and process with controlled concurrency
|
|
956
970
|
self.onmessage = (event) => {
|
|
971
|
+
messageQueue.push(event.data);
|
|
957
972
|
if (isReady) {
|
|
958
|
-
|
|
959
|
-
} else {
|
|
960
|
-
messageQueue.push(event.data);
|
|
973
|
+
processQueue();
|
|
961
974
|
}
|
|
962
975
|
};
|
|
963
976
|
|