Getting 1006 close codes every 45 seconds on the /v2/conversations/websocket endpoint. The Node.js client reconnects, but the audio buffer desyncs, leading to 200ms latency spikes in the Cognigy handoff.
ws.on('close', (code, reason) => {
if (code === 1006) {
console.log('Unexpected drop, retrying...');
setTimeout(connect, 1000);
}
});
Is there a keep-alive header I’m missing or a specific ping interval required by the Genesys gateway to prevent the idle timeout?
The 1006 code usually means the connection died without a proper close frame. The Genesys Cloud WebSocket implementation expects specific ping/pong handling to maintain the socket state, especially under load. If your client isn’t responding to pings within the window, the server drops it.
You need to implement explicit ping/pong handlers in your ws library configuration. Also, check if you are hitting the 60-second idle timeout.
const WebSocket = require('ws');
function connect() {
const ws = new WebSocket('wss://api.mypurecloud.com/v2/conversations/websocket', {
headers: {
'Authorization': `Bearer ${process.env.GC_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
}
});
ws.on('open', () => {
console.log('WebSocket connected');
});
ws.on('ping', (data) => {
// Essential: respond to keep-alive pings
ws.pong(data);
});
ws.on('pong', (data) => {
// Optional: track latency for New Relic custom events
const latency = Date.now() - lastPingTime;
// sendLatencyMetric(latency);
});
ws.on('message', (data) => {
// process message
});
ws.on('close', (code, reason) => {
if (code === 1006) {
console.warn('Unexpected drop (1006). Reconnecting...');
// Implement exponential backoff to avoid thundering herd
const delay = Math.min(1000 * Math.pow(2, retryCount), 30000);
setTimeout(() => {
retryCount++;
connect();
}, delay);
} else {
console.log(`Closed: ${code} ${reason}`);
}
});
ws.on('error', (err) => {
console.error('WebSocket error:', err);
});
}
Also, are you filtering the events? If you are subscribing to all conversation types without a filter, the payload size can cause backpressure issues in Node.js, leading to dropped pings. Try adding a filter for only the relevant media types.