@camera.ui/transport 0.0.27 → 0.0.28

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.
@@ -7,6 +7,7 @@ var NATS_SPEC = {
7
7
  kind: "persistent",
8
8
  phaseGating: true
9
9
  };
10
+ var RESOLVE_RETRY_MIN_MS = 3e3;
10
11
  function newConnId() {
11
12
  const c = globalThis.crypto;
12
13
  if (c?.randomUUID) return c.randomUUID();
@@ -48,6 +49,8 @@ function createNatsTransport(options = {}) {
48
49
  let connId = null;
49
50
  let applyEpoch = 0;
50
51
  let pendingConnectAbort = null;
52
+ let poolRefreshAt = 0;
53
+ let poolRefreshing = false;
51
54
  function buildServers(target) {
52
55
  const url = new URL(target.endpoint.url);
53
56
  const wsProtocol = url.protocol === "https:" ? "wss:" : "ws:";
@@ -70,11 +73,16 @@ function createNatsTransport(options = {}) {
70
73
  async function refreshPool(p) {
71
74
  const target = currentTarget;
72
75
  if (!resolveServers || !target || disposed) return;
76
+ if (poolRefreshing || Date.now() - poolRefreshAt < RESOLVE_RETRY_MIN_MS) return;
77
+ poolRefreshing = true;
73
78
  try {
74
79
  const servers = await serversFor(target);
75
80
  if (proxy === p && !disposed) p.setServers(servers);
76
81
  } catch (err) {
77
82
  logger?.warn(`server refresh failed: ${stringifyError(err)}`);
83
+ } finally {
84
+ poolRefreshing = false;
85
+ poolRefreshAt = Date.now();
78
86
  }
79
87
  }
80
88
  function stopRefresh() {
@@ -86,7 +94,7 @@ function createNatsTransport(options = {}) {
86
94
  function startRefresh(p) {
87
95
  stopRefresh();
88
96
  if (!resolveServers || resolveRefreshMs <= 0) return;
89
- refreshTimer = setInterval(() => void refreshPool(p), resolveRefreshMs);
97
+ refreshTimer = setInterval(() => refreshPool(p), resolveRefreshMs);
90
98
  }
91
99
  async function resign(reason) {
92
100
  const target = currentTarget;
@@ -150,6 +158,9 @@ function createNatsTransport(options = {}) {
150
158
  notifyClient();
151
159
  if (resolveServers) refreshPool(p);
152
160
  break;
161
+ case "reconnecting":
162
+ if (resolveServers) refreshPool(p);
163
+ break;
153
164
  case "staleConnection":
154
165
  markDown("staleConnection");
155
166
  notifyClient();
@@ -2,6 +2,7 @@ import { n as isEndpointChange, r as isSameTarget, t as TransportEmitter } from
2
2
  import { t as classifyClose } from "../closeCodes-ClWJVOpq.js";
3
3
  import { Manager, io } from "socket.io-client";
4
4
  //#region src/transports/socketio.ts
5
+ var RESOLVE_RETRY_MIN_MS = 3e3;
5
6
  var SOCKETIO_SPEC = {
6
7
  id: "socketio",
7
8
  kind: "persistent",
@@ -27,6 +28,8 @@ function createSocketioTransport(options = {}) {
27
28
  let currentTarget = null;
28
29
  let currentQuery = {};
29
30
  let refreshTimer = null;
31
+ let queryRefreshAt = 0;
32
+ let queryRefreshing = false;
30
33
  let status = { up: false };
31
34
  let disposed = false;
32
35
  const staleAfterMs = options.staleAfterMs ?? 6e4;
@@ -59,6 +62,8 @@ function createSocketioTransport(options = {}) {
59
62
  async function refreshQuery() {
60
63
  const target = currentTarget;
61
64
  if (!resolveQuery || !target || disposed) return;
65
+ if (queryRefreshing || Date.now() - queryRefreshAt < RESOLVE_RETRY_MIN_MS) return;
66
+ queryRefreshing = true;
62
67
  try {
63
68
  const query = await queryFor(target);
64
69
  if (currentTarget !== target || disposed) return;
@@ -66,6 +71,9 @@ function createSocketioTransport(options = {}) {
66
71
  for (const sock of sockets.values()) sock.io.opts.query = query;
67
72
  } catch (err) {
68
73
  logger?.warn(`query refresh failed: ${err instanceof Error ? err.message : String(err)}`);
74
+ } finally {
75
+ queryRefreshing = false;
76
+ queryRefreshAt = Date.now();
69
77
  }
70
78
  }
71
79
  function stopRefresh() {
@@ -77,7 +85,7 @@ function createSocketioTransport(options = {}) {
77
85
  function startRefresh() {
78
86
  stopRefresh();
79
87
  if (!resolveQuery || resolveRefreshMs <= 0) return;
80
- refreshTimer = setInterval(() => void refreshQuery(), resolveRefreshMs);
88
+ refreshTimer = setInterval(() => refreshQuery(), resolveRefreshMs);
81
89
  }
82
90
  function markUp() {
83
91
  if (status.up) return;
@@ -106,6 +114,7 @@ function createSocketioTransport(options = {}) {
106
114
  socket.on("connect_error", (err) => {
107
115
  const msg = err?.message ?? "connect_error";
108
116
  logger?.debug(`connect_error (main): ${msg}`);
117
+ if (resolveQuery) refreshQuery();
109
118
  if (isAuthError(msg)) {
110
119
  emitter.emit("auth-error", { message: msg });
111
120
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camera.ui/transport",
3
- "version": "0.0.27",
3
+ "version": "0.0.28",
4
4
  "description": "camera.ui transport layer — framework-agnostic connection kernel, reducer state, pluggable transports (HTTP/WS/Socket.IO/NATS), lifecycle effects and worker bridge",
5
5
  "author": "seydx (https://github.com/cameraui/clients)",
6
6
  "type": "module",
@@ -56,7 +56,7 @@
56
56
  },
57
57
  "dependencies": {
58
58
  "@camera.ui/logger": ">=0.0.3",
59
- "@camera.ui/rpc": ">=1.0.11",
59
+ "@camera.ui/rpc": ">=1.0.12",
60
60
  "axios": ">=1.20.0",
61
61
  "socket.io-client": ">=4.8.3"
62
62
  },