@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.js CHANGED
@@ -441,22 +441,30 @@ function trace(...args) {
441
441
  if (debugTrace) console.log('[OPFS-T2]', ...args);
442
442
  }
443
443
 
444
- // Minimal timer for legacy mode only
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 debounce)');
459
- }, LEGACY_RELEASE_DELAY);
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 after ready
942
- function processQueue() {
943
- while (messageQueue.length > 0) {
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
- handleMessage(msg);
957
+ activeOperations++;
958
+ handleMessage(msg).finally(() => {
959
+ activeOperations--;
960
+ processQueue(); // Process next queued message
961
+ });
946
962
  }
947
963
  }
948
964
 
949
- // Handle messages directly - no serialization needed because:
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
- handleMessage(event.data);
955
- } else {
956
- messageQueue.push(event.data);
969
+ processQueue();
957
970
  }
958
971
  };
959
972