@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 CHANGED
@@ -445,22 +445,30 @@ function trace(...args) {
445
445
  if (debugTrace) console.log('[OPFS-T2]', ...args);
446
446
  }
447
447
 
448
- // Minimal timer for legacy mode only
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 debounce)');
463
- }, LEGACY_RELEASE_DELAY);
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 after ready
946
- function processQueue() {
947
- while (messageQueue.length > 0) {
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
- handleMessage(msg);
961
+ activeOperations++;
962
+ handleMessage(msg).finally(() => {
963
+ activeOperations--;
964
+ processQueue(); // Process next queued message
965
+ });
950
966
  }
951
967
  }
952
968
 
953
- // Handle messages directly - no serialization needed because:
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
- handleMessage(event.data);
959
- } else {
960
- messageQueue.push(event.data);
973
+ processQueue();
961
974
  }
962
975
  };
963
976