WebSocket subscription hanging on conversation:detail event type in Node.js

Running the dashboard aggregator on a t3.medium instance and the WebSocket connection keeps dropping right after the subscription handshake. Trying to switch from polling /api/v2/analytics/conversations/details/queued to real-time pushes using the Notification API. The connection opens fine with wss://api.mypurecloud.com/v2/notification/websocket, but the conversation:detail subscription never fires the actual payload. Just getting periodic ping frames and a 1001 close code after about forty seconds.

Here is the subscription payload I’m sending right after the open event:
{"type": "subscribe", "data": {"channel": "conversation:detail", "criteria": {"interval": "real-time", "dateRangeType": "absolute", "startDate": "2024-01-01T00:00:00Z", "endDate": "2025-01-01T00:00:00Z"}}}

The Node ws client doesn’t throw an error on send. It just buffers. Checked the server response headers and the Sec-WebSocket-Accept looks valid. Tried swapping to conversation:summary and it works fine, so the auth token can’t be the issue. The bearer token gets refreshed every fifty minutes via the standard OAuth flow.

Wondering if a specific header is missing for the conversation:detail channel. The docs mention a X-Genesys-Client-Version but leaving it out didn’t break the summary channel. Also wondering if the criteria object needs select fields defined upfront, or if the platform handles projection on the wire. Memory usage on the aggregator spikes to 85% when the connection stays idle, which suggests the event loop is blocking on a pending acknowledgment.

Already tried adding Sec-WebSocket-Extensions: permessage-deflate to the initial request headers. Didn’t change the behavior. The dashboard needs these events to calculate wrap-up time deltas without waiting for the next fifteen-minute interval window. Looking at the network trace, the server sends a 200 OK on the HTTP upgrade but the WebSocket protocol version stays at 13. Could be something with the criteria structure for detail queries. The event loop just sits there spinning. Memory climbs past the threshold and the OOM killer takes over.