@songsid/agend 2.1.2-beta.2 → 2.1.2-beta.3
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.
|
@@ -18,8 +18,16 @@ export declare class IpcServer extends EventEmitter {
|
|
|
18
18
|
export declare class IpcClient extends EventEmitter {
|
|
19
19
|
private sockPath;
|
|
20
20
|
private socket;
|
|
21
|
+
/** A socket lifecycle must produce at most one disconnect notification. */
|
|
22
|
+
private disconnected;
|
|
21
23
|
constructor(sockPath: string);
|
|
22
24
|
connect(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Converge overflow/error/close into one notification, then make the client
|
|
27
|
+
* inert. EventEmitter invokes listeners synchronously, so FleetManager sees
|
|
28
|
+
* the disconnect before listeners are removed.
|
|
29
|
+
*/
|
|
30
|
+
private handleDisconnect;
|
|
23
31
|
get connected(): boolean;
|
|
24
32
|
send(msg: unknown): void;
|
|
25
33
|
close(): Promise<void>;
|
|
@@ -169,6 +169,8 @@ export class IpcServer extends EventEmitter {
|
|
|
169
169
|
export class IpcClient extends EventEmitter {
|
|
170
170
|
sockPath;
|
|
171
171
|
socket = null;
|
|
172
|
+
/** A socket lifecycle must produce at most one disconnect notification. */
|
|
173
|
+
disconnected = false;
|
|
172
174
|
constructor(sockPath) {
|
|
173
175
|
super();
|
|
174
176
|
this.sockPath = sockPath;
|
|
@@ -177,27 +179,51 @@ export class IpcClient extends EventEmitter {
|
|
|
177
179
|
return new Promise((resolve, reject) => {
|
|
178
180
|
const socket = createConnection(this.sockPath);
|
|
179
181
|
this.socket = socket;
|
|
182
|
+
this.disconnected = false;
|
|
183
|
+
let connectSettled = false;
|
|
180
184
|
const parse = makeLineParser((msg) => {
|
|
181
185
|
this.emit("message", msg);
|
|
182
186
|
}, () => {
|
|
183
187
|
this.emit("overflow");
|
|
184
|
-
|
|
185
|
-
this.emit("disconnect", new Error("IPC buffer overflow"));
|
|
188
|
+
this.handleDisconnect(new Error("IPC buffer overflow"), socket);
|
|
186
189
|
});
|
|
187
190
|
socket.on("data", parse);
|
|
188
191
|
socket.on("error", (err) => {
|
|
189
|
-
|
|
192
|
+
if (!connectSettled) {
|
|
193
|
+
connectSettled = true;
|
|
194
|
+
reject(err);
|
|
195
|
+
}
|
|
196
|
+
this.handleDisconnect(err, socket);
|
|
190
197
|
});
|
|
191
198
|
socket.on("close", () => {
|
|
192
|
-
|
|
199
|
+
if (!connectSettled) {
|
|
200
|
+
connectSettled = true;
|
|
201
|
+
reject(new Error("socket closed before connect"));
|
|
202
|
+
}
|
|
203
|
+
this.handleDisconnect(new Error("socket closed"), socket);
|
|
193
204
|
});
|
|
194
|
-
socket.once("error", reject);
|
|
195
205
|
socket.once("connect", () => {
|
|
196
|
-
|
|
206
|
+
connectSettled = true;
|
|
197
207
|
resolve();
|
|
198
208
|
});
|
|
199
209
|
});
|
|
200
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Converge overflow/error/close into one notification, then make the client
|
|
213
|
+
* inert. EventEmitter invokes listeners synchronously, so FleetManager sees
|
|
214
|
+
* the disconnect before listeners are removed.
|
|
215
|
+
*/
|
|
216
|
+
handleDisconnect(error, socket) {
|
|
217
|
+
if (this.disconnected || this.socket !== socket)
|
|
218
|
+
return;
|
|
219
|
+
this.disconnected = true;
|
|
220
|
+
this.emit("disconnect", error);
|
|
221
|
+
socket.removeAllListeners();
|
|
222
|
+
if (!socket.destroyed)
|
|
223
|
+
socket.destroy();
|
|
224
|
+
this.socket = null;
|
|
225
|
+
this.removeAllListeners();
|
|
226
|
+
}
|
|
201
227
|
get connected() {
|
|
202
228
|
return this.socket != null && !this.socket.destroyed;
|
|
203
229
|
}
|
|
@@ -207,14 +233,15 @@ export class IpcClient extends EventEmitter {
|
|
|
207
233
|
}
|
|
208
234
|
}
|
|
209
235
|
async close() {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
236
|
+
const socket = this.socket;
|
|
237
|
+
this.disconnected = true;
|
|
238
|
+
this.socket = null;
|
|
239
|
+
this.removeAllListeners();
|
|
240
|
+
if (!socket)
|
|
241
|
+
return;
|
|
242
|
+
socket.removeAllListeners();
|
|
243
|
+
if (!socket.destroyed)
|
|
244
|
+
socket.destroy();
|
|
218
245
|
}
|
|
219
246
|
}
|
|
220
247
|
//# sourceMappingURL=ipc-bridge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc-bridge.js","sourceRoot":"","sources":["../../src/channel/ipc-bridge.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ipc-bridge.js","sourceRoot":"","sources":["../../src/channel/ipc-bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/fleet-manager.d.ts
CHANGED
|
@@ -107,6 +107,10 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
|
|
|
107
107
|
private pendingModelSelects;
|
|
108
108
|
private failoverActive;
|
|
109
109
|
readonly ipcStoppingInstances: Set<string>;
|
|
110
|
+
/** Coalesce concurrent connection attempts for the same daemon socket. */
|
|
111
|
+
private ipcConnectInFlight;
|
|
112
|
+
/** At most one reconnect/backoff loop may exist per instance. */
|
|
113
|
+
private ipcReconnectInFlight;
|
|
110
114
|
private adapterRestarting;
|
|
111
115
|
private adapterState;
|
|
112
116
|
private collabInstances;
|
|
@@ -253,8 +257,10 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
|
|
|
253
257
|
private startAdditionalAdapter;
|
|
254
258
|
/** Connect IPC to a single instance with all handlers */
|
|
255
259
|
connectIpcToInstance(name: string): Promise<void>;
|
|
260
|
+
private connectIpcToInstanceInternal;
|
|
256
261
|
/** Attempt IPC reconnection with exponential backoff */
|
|
257
262
|
private ipcReconnect;
|
|
263
|
+
private runIpcReconnect;
|
|
258
264
|
/** Restart a channel adapter after fatal error with infinite retry + 60s cap */
|
|
259
265
|
private restartAdapter;
|
|
260
266
|
/** Handle inbound message — transcribe voice if present, then route */
|
package/dist/fleet-manager.js
CHANGED
|
@@ -163,6 +163,10 @@ export class FleetManager {
|
|
|
163
163
|
failoverActive = new Map(); // instance → current failover model
|
|
164
164
|
// IPC reconnect: tracks instances being intentionally stopped (skip reconnect)
|
|
165
165
|
ipcStoppingInstances = new Set();
|
|
166
|
+
/** Coalesce concurrent connection attempts for the same daemon socket. */
|
|
167
|
+
ipcConnectInFlight = new Map();
|
|
168
|
+
/** At most one reconnect/backoff loop may exist per instance. */
|
|
169
|
+
ipcReconnectInFlight = new Map();
|
|
166
170
|
// Adapter restart: prevents re-entrant restart attempts
|
|
167
171
|
adapterRestarting = new Set();
|
|
168
172
|
// Adapter isolation: track state per adapter for retry + visibility
|
|
@@ -1931,19 +1935,38 @@ export class FleetManager {
|
|
|
1931
1935
|
this.logger.info({ adapterId, type: channelConfig.type }, "Additional adapter started");
|
|
1932
1936
|
}
|
|
1933
1937
|
/** Connect IPC to a single instance with all handlers */
|
|
1934
|
-
|
|
1938
|
+
connectIpcToInstance(name) {
|
|
1939
|
+
const inFlight = this.ipcConnectInFlight.get(name);
|
|
1940
|
+
if (inFlight)
|
|
1941
|
+
return inFlight;
|
|
1942
|
+
const connection = this.connectIpcToInstanceInternal(name)
|
|
1943
|
+
.finally(() => {
|
|
1944
|
+
if (this.ipcConnectInFlight.get(name) === connection) {
|
|
1945
|
+
this.ipcConnectInFlight.delete(name);
|
|
1946
|
+
}
|
|
1947
|
+
});
|
|
1948
|
+
this.ipcConnectInFlight.set(name, connection);
|
|
1949
|
+
return connection;
|
|
1950
|
+
}
|
|
1951
|
+
async connectIpcToInstanceInternal(name) {
|
|
1935
1952
|
// Close existing client to prevent socket leak on reconnect
|
|
1936
1953
|
const existing = this.instanceIpcClients.get(name);
|
|
1937
1954
|
if (existing) {
|
|
1938
|
-
|
|
1955
|
+
// Remove application listeners before destroying the socket. Even if a
|
|
1956
|
+
// future regression creates two clients, the replaced one cannot keep
|
|
1957
|
+
// handling fleet_outbound messages as an orphan.
|
|
1958
|
+
existing.removeAllListeners();
|
|
1939
1959
|
try {
|
|
1940
|
-
existing.close();
|
|
1960
|
+
await existing.close();
|
|
1941
1961
|
}
|
|
1942
1962
|
catch (err) {
|
|
1943
1963
|
this.logger.debug({ err, name }, "IPC client close failed (likely already closed)");
|
|
1944
1964
|
}
|
|
1945
|
-
|
|
1946
|
-
|
|
1965
|
+
finally {
|
|
1966
|
+
if (this.instanceIpcClients.get(name) === existing) {
|
|
1967
|
+
this.instanceIpcClients.delete(name);
|
|
1968
|
+
}
|
|
1969
|
+
}
|
|
1947
1970
|
}
|
|
1948
1971
|
const sockPath = join(this.getInstanceDir(name), "channel.sock");
|
|
1949
1972
|
if (!existsSync(sockPath))
|
|
@@ -2021,6 +2044,10 @@ export class FleetManager {
|
|
|
2021
2044
|
}
|
|
2022
2045
|
// Auto-reconnect on disconnect (unless intentionally stopping)
|
|
2023
2046
|
ipc.on("disconnect", () => {
|
|
2047
|
+
// A delayed event from a replaced/stale client must never delete the
|
|
2048
|
+
// current connection or start another reconnect loop.
|
|
2049
|
+
if (this.instanceIpcClients.get(name) !== ipc)
|
|
2050
|
+
return;
|
|
2024
2051
|
this.instanceIpcClients.delete(name);
|
|
2025
2052
|
if (this.ipcStoppingInstances.has(name))
|
|
2026
2053
|
return;
|
|
@@ -2032,7 +2059,20 @@ export class FleetManager {
|
|
|
2032
2059
|
}
|
|
2033
2060
|
}
|
|
2034
2061
|
/** Attempt IPC reconnection with exponential backoff */
|
|
2035
|
-
|
|
2062
|
+
ipcReconnect(name) {
|
|
2063
|
+
const inFlight = this.ipcReconnectInFlight.get(name);
|
|
2064
|
+
if (inFlight)
|
|
2065
|
+
return inFlight;
|
|
2066
|
+
const reconnect = this.runIpcReconnect(name)
|
|
2067
|
+
.finally(() => {
|
|
2068
|
+
if (this.ipcReconnectInFlight.get(name) === reconnect) {
|
|
2069
|
+
this.ipcReconnectInFlight.delete(name);
|
|
2070
|
+
}
|
|
2071
|
+
});
|
|
2072
|
+
this.ipcReconnectInFlight.set(name, reconnect);
|
|
2073
|
+
return reconnect;
|
|
2074
|
+
}
|
|
2075
|
+
async runIpcReconnect(name) {
|
|
2036
2076
|
for (let attempt = 1;; attempt++) {
|
|
2037
2077
|
if (this.ipcStoppingInstances.has(name) || !this.daemons.has(name))
|
|
2038
2078
|
return;
|