@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/CHANGELOG.md +27 -0
- package/dist/core.cjs +18 -6
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +4 -0
- package/dist/core.d.ts +4 -0
- package/dist/core.js +18 -6
- package/dist/core.js.map +1 -1
- package/dist/react.cjs +52 -12
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +52 -12
- package/dist/react.js.map +1 -1
- package/package.json +2 -2
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
|
-
|
|
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
|
|