@ai-matrx/media 0.5.0 → 0.5.2

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/react.js CHANGED
@@ -628,13 +628,18 @@ function useMediaBlobLoadRecovery(ref, source, options) {
628
628
  const refKey = stableRefKey(ref);
629
629
  const [failed, setFailed] = useState2(false);
630
630
  const attemptRef = useRef2(0);
631
+ const generationRef = useRef2(0);
631
632
  const recoveryInFlightRef = useRef2(false);
632
633
  const onRetry = options.onRetry;
633
634
  const onTerminal = options.onTerminal;
634
635
  useEffect2(() => {
636
+ generationRef.current += 1;
635
637
  attemptRef.current = 0;
636
638
  recoveryInFlightRef.current = false;
637
639
  setFailed(false);
640
+ return () => {
641
+ generationRef.current += 1;
642
+ };
638
643
  }, [refKey]);
639
644
  useEffect2(() => {
640
645
  recoveryInFlightRef.current = false;
@@ -659,6 +664,7 @@ function useMediaBlobLoadRecovery(ref, source, options) {
659
664
  recoveryInFlightRef.current = true;
660
665
  attemptRef.current += 1;
661
666
  const attempt = attemptRef.current;
667
+ const generation = generationRef.current;
662
668
  const recover = client.recoverBlobLoadError;
663
669
  if (!ref || !recover) {
664
670
  finishTerminal(
@@ -670,6 +676,7 @@ function useMediaBlobLoadRecovery(ref, source, options) {
670
676
  }
671
677
  recover(ref, attempt).then(
672
678
  (verdict) => {
679
+ if (generation !== generationRef.current) return;
673
680
  if (verdict === "retry") {
674
681
  setFailed(false);
675
682
  onRetry();
@@ -682,6 +689,7 @@ function useMediaBlobLoadRecovery(ref, source, options) {
682
689
  );
683
690
  },
684
691
  (err) => {
692
+ if (generation !== generationRef.current) return;
685
693
  finishTerminal(
686
694
  event,
687
695
  attempt,
@@ -1392,7 +1400,9 @@ function useThumbnailSource(ref, options = {}) {
1392
1400
  mode: "thumbnail",
1393
1401
  loading: false,
1394
1402
  resolution,
1395
- recoverable: explicitThumb.recoverable !== false
1403
+ recoverable: explicitThumb.recoverable !== false,
1404
+ blobBacked: false,
1405
+ retryBlob: blob.retry
1396
1406
  };
1397
1407
  }
1398
1408
  if (resolution?.thumbnailSrc) {
@@ -1401,7 +1411,9 @@ function useThumbnailSource(ref, options = {}) {
1401
1411
  mode: "thumbnail",
1402
1412
  loading: false,
1403
1413
  resolution,
1404
- recoverable: resolution.recoverable !== false
1414
+ recoverable: resolution.recoverable !== false,
1415
+ blobBacked: false,
1416
+ retryBlob: blob.retry
1405
1417
  };
1406
1418
  }
1407
1419
  if (allowSourceFallback && resolution) {
@@ -1411,7 +1423,9 @@ function useThumbnailSource(ref, options = {}) {
1411
1423
  mode: blob.url ? resolution.kind === "video" ? "live-video-poster" : "live-image" : "icon",
1412
1424
  loading: blob.loading,
1413
1425
  resolution,
1414
- recoverable: false
1426
+ recoverable: false,
1427
+ blobBacked: true,
1428
+ retryBlob: blob.retry
1415
1429
  };
1416
1430
  }
1417
1431
  if (resolution.kind === "image") {
@@ -1420,7 +1434,9 @@ function useThumbnailSource(ref, options = {}) {
1420
1434
  mode: "live-image",
1421
1435
  loading: false,
1422
1436
  resolution,
1423
- recoverable: resolution.recoverable !== false
1437
+ recoverable: resolution.recoverable !== false,
1438
+ blobBacked: false,
1439
+ retryBlob: blob.retry
1424
1440
  };
1425
1441
  }
1426
1442
  if (resolution.kind === "video") {
@@ -1429,7 +1445,9 @@ function useThumbnailSource(ref, options = {}) {
1429
1445
  mode: "live-video-poster",
1430
1446
  loading: false,
1431
1447
  resolution,
1432
- recoverable: resolution.recoverable !== false
1448
+ recoverable: resolution.recoverable !== false,
1449
+ blobBacked: false,
1450
+ retryBlob: blob.retry
1433
1451
  };
1434
1452
  }
1435
1453
  }
@@ -1438,7 +1456,9 @@ function useThumbnailSource(ref, options = {}) {
1438
1456
  mode: "icon",
1439
1457
  loading: false,
1440
1458
  resolution,
1441
- recoverable: false
1459
+ recoverable: false,
1460
+ blobBacked: false,
1461
+ retryBlob: blob.retry
1442
1462
  };
1443
1463
  }
1444
1464
 
@@ -1468,6 +1488,8 @@ function MediaThumbnail({
1468
1488
  url: source.src,
1469
1489
  mediaRef,
1470
1490
  recoverable: source.recoverable,
1491
+ blobBacked: source.blobBacked,
1492
+ retryBlob: source.retryBlob,
1471
1493
  fallback
1472
1494
  }
1473
1495
  );
@@ -1479,6 +1501,8 @@ function MediaThumbnail({
1479
1501
  alt: fileName,
1480
1502
  mediaRef,
1481
1503
  recoverable: source.recoverable,
1504
+ blobBacked: source.blobBacked,
1505
+ retryBlob: source.retryBlob,
1482
1506
  fallback
1483
1507
  }
1484
1508
  );
@@ -1497,13 +1521,21 @@ function ImageThumb({
1497
1521
  alt,
1498
1522
  mediaRef,
1499
1523
  recoverable,
1524
+ blobBacked,
1525
+ retryBlob,
1500
1526
  fallback
1501
1527
  }) {
1502
1528
  const { retryKey, onLoadError, failed } = useMediaLoadRecovery(url, {
1503
1529
  recoverable,
1504
1530
  failureRef: mediaRef
1505
1531
  });
1506
- if (failed) return /* @__PURE__ */ jsx4(Fragment2, { children: fallback });
1532
+ const blobRecovery = useMediaBlobLoadRecovery(
1533
+ blobBacked ? mediaRef : null,
1534
+ blobBacked ? url : null,
1535
+ { onRetry: retryBlob }
1536
+ );
1537
+ const activeRecovery = blobBacked ? { retryKey: 0, ...blobRecovery } : { retryKey, onLoadError, failed };
1538
+ if (activeRecovery.failed) return /* @__PURE__ */ jsx4(Fragment2, { children: fallback });
1507
1539
  return /* @__PURE__ */ jsx4(
1508
1540
  "img",
1509
1541
  {
@@ -1511,21 +1543,29 @@ function ImageThumb({
1511
1543
  alt,
1512
1544
  loading: url.startsWith("blob:") ? "eager" : "lazy",
1513
1545
  className: "h-full w-full object-cover",
1514
- onError: onLoadError
1546
+ onError: activeRecovery.onLoadError
1515
1547
  },
1516
- retryKey
1548
+ activeRecovery.retryKey
1517
1549
  );
1518
1550
  }
1519
1551
  function VideoPosterThumb({
1520
1552
  url,
1521
1553
  mediaRef,
1522
1554
  recoverable,
1555
+ blobBacked,
1556
+ retryBlob,
1523
1557
  fallback
1524
1558
  }) {
1525
1559
  const { retryKey, onLoadError, failed } = useMediaLoadRecovery(url, {
1526
1560
  recoverable,
1527
1561
  failureRef: mediaRef
1528
1562
  });
1563
+ const blobRecovery = useMediaBlobLoadRecovery(
1564
+ blobBacked ? mediaRef : null,
1565
+ blobBacked ? url : null,
1566
+ { onRetry: retryBlob }
1567
+ );
1568
+ const activeRecovery = blobBacked ? { retryKey: 0, ...blobRecovery } : { retryKey, onLoadError, failed };
1529
1569
  const ref = useRef5(null);
1530
1570
  useEffect6(() => {
1531
1571
  const v = ref.current;
@@ -1539,7 +1579,7 @@ function VideoPosterThumb({
1539
1579
  v.addEventListener("loadedmetadata", onMeta);
1540
1580
  return () => v.removeEventListener("loadedmetadata", onMeta);
1541
1581
  }, []);
1542
- if (failed) return /* @__PURE__ */ jsx4(Fragment2, { children: fallback });
1582
+ if (activeRecovery.failed) return /* @__PURE__ */ jsx4(Fragment2, { children: fallback });
1543
1583
  return /* @__PURE__ */ jsx4(
1544
1584
  "video",
1545
1585
  {
@@ -1549,9 +1589,9 @@ function VideoPosterThumb({
1549
1589
  preload: "metadata",
1550
1590
  muted: true,
1551
1591
  playsInline: true,
1552
- onError: onLoadError
1592
+ onError: activeRecovery.onLoadError
1553
1593
  },
1554
- retryKey
1594
+ activeRecovery.retryKey
1555
1595
  );
1556
1596
  }
1557
1597