@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.
Files changed (2) hide show
  1. package/dist/index.js +26 -7
  2. 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(() => pendingLoads$2.delete(id));
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
- if (stamp && result.fetchedAt !== void 0) rememberServerClock(result.fetchedAt, stamp.fetchedAt);
1064
- setSnapshot(initialCamera._id, result.data, result.fetchedAt, result.fetchedAt ?? requestedAt, stamp);
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camera.ui/browser",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "camera.ui browser client",
5
5
  "author": "seydx (https://github.com/cameraui/clients)",
6
6
  "type": "module",