@camera.ui/browser 0.1.6 → 0.1.7
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 +26 -7
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -676,6 +676,7 @@ var subscribers = /* @__PURE__ */ new Map();
|
|
|
676
676
|
var pendingLoads$2 = /* @__PURE__ */ new Map();
|
|
677
677
|
var refreshingCameras = reactive(/* @__PURE__ */ new Set());
|
|
678
678
|
var refreshLingers = /* @__PURE__ */ new Map();
|
|
679
|
+
var forcedRefreshes = /* @__PURE__ */ new Map();
|
|
679
680
|
var serverClockOffset = 0;
|
|
680
681
|
function notify(cameraId) {
|
|
681
682
|
subscribers.get(cameraId)?.forEach((cb) => cb());
|
|
@@ -691,7 +692,9 @@ function fetchSnapshotShared(deviceManager, id, forceFresh = false) {
|
|
|
691
692
|
} finally {
|
|
692
693
|
if (device) releaseCameraDevice(device);
|
|
693
694
|
}
|
|
694
|
-
})().finally(() =>
|
|
695
|
+
})().finally(() => {
|
|
696
|
+
if (pendingLoads$2.get(id) === promise) pendingLoads$2.delete(id);
|
|
697
|
+
});
|
|
695
698
|
pendingLoads$2.set(id, promise);
|
|
696
699
|
return promise;
|
|
697
700
|
}
|
|
@@ -700,6 +703,7 @@ function hookReconnectRefresh(cameraUi, deviceManager) {
|
|
|
700
703
|
if (hookedContexts.has(cameraUi)) return;
|
|
701
704
|
hookedContexts.add(cameraUi);
|
|
702
705
|
cameraUi.on("reconnected", () => {
|
|
706
|
+
pendingLoads$2.clear();
|
|
703
707
|
setTimeout(() => {
|
|
704
708
|
let delay = 0;
|
|
705
709
|
for (const id of subscribers.keys()) {
|
|
@@ -723,12 +727,19 @@ function isOutdated(settings, fetchedAt) {
|
|
|
723
727
|
function deferRevoke(url) {
|
|
724
728
|
setTimeout(() => URL.revokeObjectURL(url), REVOKE_DELAY_MS);
|
|
725
729
|
}
|
|
726
|
-
function startSnapshotRefresh(cameraId) {
|
|
730
|
+
function startSnapshotRefresh(cameraId, forced = false) {
|
|
727
731
|
clearTimeout(refreshLingers.get(cameraId));
|
|
728
732
|
refreshLingers.delete(cameraId);
|
|
733
|
+
if (forced) forcedRefreshes.set(cameraId, (forcedRefreshes.get(cameraId) ?? 0) + 1);
|
|
729
734
|
refreshingCameras.add(cameraId);
|
|
730
735
|
}
|
|
731
|
-
function endSnapshotRefresh(cameraId) {
|
|
736
|
+
function endSnapshotRefresh(cameraId, forced = false) {
|
|
737
|
+
const running = (forcedRefreshes.get(cameraId) ?? 0) - (forced ? 1 : 0);
|
|
738
|
+
if (running > 0) {
|
|
739
|
+
forcedRefreshes.set(cameraId, running);
|
|
740
|
+
return;
|
|
741
|
+
}
|
|
742
|
+
forcedRefreshes.delete(cameraId);
|
|
732
743
|
clearTimeout(refreshLingers.get(cameraId));
|
|
733
744
|
const linger = setTimeout(() => {
|
|
734
745
|
refreshLingers.delete(cameraId);
|
|
@@ -801,6 +812,7 @@ function clearSnapshotCache() {
|
|
|
801
812
|
takenAtCache.clear();
|
|
802
813
|
stampCache.clear();
|
|
803
814
|
refreshLingers.clear();
|
|
815
|
+
forcedRefreshes.clear();
|
|
804
816
|
refreshingCameras.clear();
|
|
805
817
|
serverClockOffset = 0;
|
|
806
818
|
}
|
|
@@ -989,8 +1001,15 @@ function useSnapshot(cameraIdOrName) {
|
|
|
989
1001
|
//#endregion
|
|
990
1002
|
//#region src/composables/useCamera.ts
|
|
991
1003
|
var NOT_MODIFIED = "not-modified";
|
|
1004
|
+
var CLOCK_SAMPLE_MAX_MS = 5e3;
|
|
992
1005
|
var snapshotWithMetaSupport = /* @__PURE__ */ new WeakMap();
|
|
993
1006
|
var sensorEventFanouts = /* @__PURE__ */ new WeakMap();
|
|
1007
|
+
function replyTime(result, requestedAt) {
|
|
1008
|
+
if (result.stamp === void 0 || result.fetchedAt === void 0) return result.fetchedAt;
|
|
1009
|
+
if (Date.now() - requestedAt > CLOCK_SAMPLE_MAX_MS) return toBrowserTime(result.stamp);
|
|
1010
|
+
rememberServerClock(result.fetchedAt, result.stamp);
|
|
1011
|
+
return result.fetchedAt;
|
|
1012
|
+
}
|
|
994
1013
|
async function createReactiveCameraDevice(rpcOrContext, initialCamera) {
|
|
995
1014
|
const cameraNamespaces = NamespaceManager.cameraNamespaces(initialCamera._id);
|
|
996
1015
|
const ctx = "rpc" in rpcOrContext && "value" in rpcOrContext.rpc ? rpcOrContext : void 0;
|
|
@@ -1050,7 +1069,7 @@ async function createReactiveCameraDevice(rpcOrContext, initialCamera) {
|
|
|
1050
1069
|
const hasPtz = computed(() => existingSensorTypes.value.has(SensorType.PTZ));
|
|
1051
1070
|
async function fetchSnapshot(sourceId, forceNew) {
|
|
1052
1071
|
snapshotLoading.value = true;
|
|
1053
|
-
startSnapshotRefresh(initialCamera._id);
|
|
1072
|
+
startSnapshotRefresh(initialCamera._id, forceNew);
|
|
1054
1073
|
const requestedAt = Date.now();
|
|
1055
1074
|
try {
|
|
1056
1075
|
const result = await requestSnapshot(sourceId, forceNew);
|
|
@@ -1060,14 +1079,14 @@ async function createReactiveCameraDevice(rpcOrContext, initialCamera) {
|
|
|
1060
1079
|
sourceId,
|
|
1061
1080
|
fetchedAt: result.stamp
|
|
1062
1081
|
};
|
|
1063
|
-
|
|
1064
|
-
setSnapshot(initialCamera._id, result.data,
|
|
1082
|
+
const fetchedAt = replyTime(result, requestedAt);
|
|
1083
|
+
setSnapshot(initialCamera._id, result.data, fetchedAt, fetchedAt ?? requestedAt, stamp);
|
|
1065
1084
|
return result.data;
|
|
1066
1085
|
}
|
|
1067
1086
|
return;
|
|
1068
1087
|
} finally {
|
|
1069
1088
|
snapshotLoading.value = false;
|
|
1070
|
-
endSnapshotRefresh(initialCamera._id);
|
|
1089
|
+
endSnapshotRefresh(initialCamera._id, forceNew);
|
|
1071
1090
|
}
|
|
1072
1091
|
}
|
|
1073
1092
|
async function requestSnapshot(sourceId, forceNew) {
|