@tianshu-ai/local-bridge 0.7.2 → 0.7.4
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/connection.js +62 -34
- package/dist/connection.js.map +1 -1
- package/package.json +1 -1
package/dist/connection.js
CHANGED
|
@@ -10,19 +10,18 @@ const RECONNECT_BASE_MS = 1000;
|
|
|
10
10
|
// promptly instead of getting stuck on a long backoff. The first
|
|
11
11
|
// retry after a drop is immediate (see the close handler).
|
|
12
12
|
const RECONNECT_MAX_MS = 10_000;
|
|
13
|
-
// Heartbeat
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
const DEAD_AFTER_MS = 65_000;
|
|
13
|
+
// Heartbeat = periodic re-registration. Every HEARTBEAT_MS we re-send
|
|
14
|
+
// `reverse_mcp_register` on the live socket so the server's in-memory
|
|
15
|
+
// tool catalogue stays current and self-heals after a server restart
|
|
16
|
+
// (see the block comment on startHeartbeat for why ping/pong isn't
|
|
17
|
+
// enough). If the link goes fully silent + idle past DEAD_AFTER_MS we
|
|
18
|
+
// terminate the socket to force a clean reconnect (covers half-open
|
|
19
|
+
// sockets that never fire `close`: Wi-Fi switch, sleep, NAT timeout).
|
|
20
|
+
const HEARTBEAT_MS = 20_000;
|
|
21
|
+
// Declared dead after this much total silence while idle. Comfortably
|
|
22
|
+
// above HEARTBEAT_MS so a couple of missed cycles don't nuke a healthy
|
|
23
|
+
// link, but low enough to recover from a wedged half-open socket.
|
|
24
|
+
const DEAD_AFTER_MS = 60_000;
|
|
26
25
|
export class BridgeConnection {
|
|
27
26
|
opts;
|
|
28
27
|
ws = null;
|
|
@@ -37,6 +36,9 @@ export class BridgeConnection {
|
|
|
37
36
|
lastActivityAt = 0;
|
|
38
37
|
inFlight = 0;
|
|
39
38
|
heartbeatTimer = null;
|
|
39
|
+
// Only log the 'registered device' line on the FIRST ack of a
|
|
40
|
+
// connection; heartbeat re-registers ack every ~20s and would spam it.
|
|
41
|
+
announcedRegistration = false;
|
|
40
42
|
constructor(opts) {
|
|
41
43
|
this.opts = opts;
|
|
42
44
|
this.log = opts.log ?? ((m) => console.log(m));
|
|
@@ -66,19 +68,46 @@ export class BridgeConnection {
|
|
|
66
68
|
isBusy() {
|
|
67
69
|
return this.inFlight > 0 || (this.ws?.bufferedAmount ?? 0) > 0;
|
|
68
70
|
}
|
|
69
|
-
// ── heartbeat
|
|
71
|
+
// ── heartbeat = periodic re-register ─────────────────────────
|
|
72
|
+
//
|
|
73
|
+
// We deliberately DON'T rely on WS ping/pong. The problem isn't
|
|
74
|
+
// "is the socket alive" — it's "does the server still know my
|
|
75
|
+
// tools". The server's tool registry is in-memory and keyed to the
|
|
76
|
+
// live socket: after a server restart (or any dropped+re-formed
|
|
77
|
+
// link) the registration is gone even if TCP looks fine, so the
|
|
78
|
+
// agent sees `tool not found`. A pong wouldn't detect that.
|
|
79
|
+
//
|
|
80
|
+
// Instead we periodically re-send `reverse_mcp_register` on the
|
|
81
|
+
// current socket. onRegister is idempotent server-side:
|
|
82
|
+
// - live socket the server knows → refreshes the entry; pending
|
|
83
|
+
// calls are PRESERVED (same socket path), so in-flight tool
|
|
84
|
+
// calls are NOT interrupted.
|
|
85
|
+
// - server restarted (new process) → re-registers our tools, so
|
|
86
|
+
// they come back automatically.
|
|
87
|
+
// - half-open socket → the send eventually triggers a TCP reset
|
|
88
|
+
// → 'close' → reconnect (new socket re-registers on open).
|
|
89
|
+
// A `registered` reply (or any inbound frame) bumps lastActivityAt;
|
|
90
|
+
// if the link goes fully silent past DEAD_AFTER_MS while idle we
|
|
91
|
+
// terminate it to force a clean reconnect.
|
|
92
|
+
sendRegister(ws) {
|
|
93
|
+
const reg = {
|
|
94
|
+
type: MSG.register,
|
|
95
|
+
deviceId: this.opts.deviceId,
|
|
96
|
+
label: this.opts.label,
|
|
97
|
+
tools: this.opts.tools.map((t) => t.descriptor),
|
|
98
|
+
};
|
|
99
|
+
ws.send(JSON.stringify(reg));
|
|
100
|
+
}
|
|
70
101
|
startHeartbeat(ws) {
|
|
71
102
|
this.stopHeartbeat();
|
|
72
103
|
this.heartbeatTimer = setInterval(() => {
|
|
73
104
|
if (this.ws !== ws || ws.readyState !== WebSocket.OPEN)
|
|
74
105
|
return;
|
|
75
|
-
// A busy or recently-active socket is alive by definition —
|
|
76
|
-
// don't judge it dead, just keep pinging.
|
|
77
106
|
const silentFor = Date.now() - this.lastActivityAt;
|
|
107
|
+
// Fully silent + idle past the deadline → assume the link is
|
|
108
|
+
// dead (half-open); terminate to trigger reconnect.
|
|
78
109
|
if (silentFor >= DEAD_AFTER_MS && !this.isBusy()) {
|
|
79
110
|
this.log(`no response for ${Math.round(silentFor / 1000)}s — assuming dead link, forcing reconnect`);
|
|
80
|
-
// terminate() (not close()) drops a half-open socket
|
|
81
|
-
// immediately; the 'close' handler then runs reconnect.
|
|
82
111
|
try {
|
|
83
112
|
ws.terminate();
|
|
84
113
|
}
|
|
@@ -87,15 +116,16 @@ export class BridgeConnection {
|
|
|
87
116
|
}
|
|
88
117
|
return;
|
|
89
118
|
}
|
|
90
|
-
// Otherwise
|
|
119
|
+
// Otherwise re-assert our registration so the server's tool
|
|
120
|
+
// catalogue stays current (and recovers after a restart).
|
|
121
|
+
// No log on success — this fires every heartbeat and is pure noise.
|
|
91
122
|
try {
|
|
92
|
-
|
|
93
|
-
this.log(`heartbeat: ping (silent ${Math.round(silentFor / 1000)}s, busy=${this.isBusy()})`);
|
|
123
|
+
this.sendRegister(ws);
|
|
94
124
|
}
|
|
95
125
|
catch (err) {
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
this.log(`heartbeat:
|
|
126
|
+
// Send failed → socket is broken; force reconnect now rather
|
|
127
|
+
// than waiting out the silence deadline.
|
|
128
|
+
this.log(`heartbeat: re-register failed (${err instanceof Error ? err.message : String(err)}), terminating`);
|
|
99
129
|
try {
|
|
100
130
|
ws.terminate();
|
|
101
131
|
}
|
|
@@ -123,19 +153,12 @@ export class BridgeConnection {
|
|
|
123
153
|
this.attempt = 0;
|
|
124
154
|
this.lastActivityAt = Date.now();
|
|
125
155
|
this.log(`connected to ${this.opts.server} (heartbeat ${HEARTBEAT_MS / 1000}s, dead-after ${DEAD_AFTER_MS / 1000}s)`);
|
|
126
|
-
|
|
127
|
-
type: MSG.register,
|
|
128
|
-
deviceId: this.opts.deviceId,
|
|
129
|
-
label: this.opts.label,
|
|
130
|
-
tools: this.opts.tools.map((t) => t.descriptor),
|
|
131
|
-
};
|
|
132
|
-
ws.send(JSON.stringify(reg));
|
|
156
|
+
this.sendRegister(ws);
|
|
133
157
|
this.startHeartbeat(ws);
|
|
134
158
|
});
|
|
135
|
-
// Any pong
|
|
159
|
+
// Any pong (unsolicited server keepalive) counts as a sign of life.
|
|
136
160
|
ws.on("pong", () => {
|
|
137
161
|
this.lastActivityAt = Date.now();
|
|
138
|
-
this.log("heartbeat: pong");
|
|
139
162
|
});
|
|
140
163
|
ws.on("message", (raw) => {
|
|
141
164
|
this.lastActivityAt = Date.now();
|
|
@@ -149,7 +172,10 @@ export class BridgeConnection {
|
|
|
149
172
|
switch (msg.type) {
|
|
150
173
|
case MSG.registered:
|
|
151
174
|
if (msg.ok) {
|
|
152
|
-
|
|
175
|
+
if (!this.announcedRegistration) {
|
|
176
|
+
this.announcedRegistration = true;
|
|
177
|
+
this.log(`registered device "${this.opts.deviceId}" (${this.toolsByName.size} tools)`);
|
|
178
|
+
}
|
|
153
179
|
}
|
|
154
180
|
else {
|
|
155
181
|
this.log(`register rejected: ${msg.error ?? "unknown"}`);
|
|
@@ -166,6 +192,8 @@ export class BridgeConnection {
|
|
|
166
192
|
ws.on("close", (code, reason) => {
|
|
167
193
|
this.stopHeartbeat();
|
|
168
194
|
this.ws = null;
|
|
195
|
+
// Re-announce the 'registered device' line on the next reconnect.
|
|
196
|
+
this.announcedRegistration = false;
|
|
169
197
|
const why = `code=${code}${reason?.length ? ` reason=${reason.toString()}` : ""}`;
|
|
170
198
|
if (this.closed) {
|
|
171
199
|
this.log(`socket closed after stop (${why})`);
|
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,0EAA0E;AAC1E,mEAAmE;AACnE,2DAA2D;AAE3D,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,GAAG,EAAE,UAAU,EAAuE,MAAM,eAAe,CAAC;AAWrH,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,qEAAqE;AACrE,iEAAiE;AACjE,2DAA2D;AAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tianshu-ai/local-bridge",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.4",
|
|
4
4
|
"description": "Local bridge for tianshu — dial into a tianshu server over WebSocket and expose your machine's tools (browser, files, shell) to the agent via reverse-MCP.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|