fix(core): Improve heartbeat handling and transport routing; forward heartbeat timeout events; include clientId routing and probe improvements
This commit is contained in:
@@ -49,6 +49,7 @@ export class IpcChannel<TRequest = any, TResponse = any> extends plugins.EventEm
|
||||
private reconnectTimer?: NodeJS.Timeout;
|
||||
private heartbeatTimer?: NodeJS.Timeout;
|
||||
private heartbeatCheckTimer?: NodeJS.Timeout;
|
||||
private heartbeatGraceTimer?: NodeJS.Timeout;
|
||||
private lastHeartbeat: number = Date.now();
|
||||
private connectionStartTime: number = Date.now();
|
||||
private isReconnecting = false;
|
||||
@@ -217,16 +218,27 @@ export class IpcChannel<TRequest = any, TResponse = any> extends plugins.EventEm
|
||||
});
|
||||
}, this.options.heartbeatInterval!);
|
||||
|
||||
// Delay starting the check until after the grace period
|
||||
const gracePeriod = this.options.heartbeatInitialGracePeriodMs || 0;
|
||||
|
||||
if (gracePeriod > 0) {
|
||||
// Use a timer to delay the first check
|
||||
this.heartbeatGraceTimer = setTimeout(() => {
|
||||
this.startHeartbeatCheck();
|
||||
}, gracePeriod);
|
||||
} else {
|
||||
// No grace period, start checking immediately
|
||||
this.startHeartbeatCheck();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start heartbeat timeout checking (separated for grace period handling)
|
||||
*/
|
||||
private startHeartbeatCheck(): void {
|
||||
// Check for heartbeat timeout
|
||||
this.heartbeatCheckTimer = setInterval(() => {
|
||||
const timeSinceLastHeartbeat = Date.now() - this.lastHeartbeat;
|
||||
const timeSinceConnection = Date.now() - this.connectionStartTime;
|
||||
const gracePeriod = this.options.heartbeatInitialGracePeriodMs || 0;
|
||||
|
||||
// Skip timeout check during initial grace period
|
||||
if (timeSinceConnection < gracePeriod) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (timeSinceLastHeartbeat > this.options.heartbeatTimeout!) {
|
||||
const error = new Error('Heartbeat timeout');
|
||||
@@ -238,9 +250,11 @@ export class IpcChannel<TRequest = any, TResponse = any> extends plugins.EventEm
|
||||
} else {
|
||||
// Emit heartbeatTimeout event instead of error
|
||||
this.emit('heartbeatTimeout', error);
|
||||
// Clear timers to avoid repeated events
|
||||
this.stopHeartbeat();
|
||||
}
|
||||
}
|
||||
}, this.options.heartbeatTimeout! / 2);
|
||||
}, Math.max(1000, Math.floor(this.options.heartbeatTimeout! / 2)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -256,6 +270,11 @@ export class IpcChannel<TRequest = any, TResponse = any> extends plugins.EventEm
|
||||
clearInterval(this.heartbeatCheckTimer);
|
||||
this.heartbeatCheckTimer = undefined;
|
||||
}
|
||||
|
||||
if (this.heartbeatGraceTimer) {
|
||||
clearTimeout(this.heartbeatGraceTimer);
|
||||
this.heartbeatGraceTimer = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user