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