@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.
- package/dist/transports/nats.js +12 -1
- package/dist/transports/socketio.js +10 -1
- package/package.json +2 -2
package/dist/transports/nats.js
CHANGED
|
@@ -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(() =>
|
|
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(() =>
|
|
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.
|
|
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.
|
|
59
|
+
"@camera.ui/rpc": ">=1.0.12",
|
|
60
60
|
"axios": ">=1.20.0",
|
|
61
61
|
"socket.io-client": ">=4.8.3"
|
|
62
62
|
},
|