wonderful-beach-39533
08/05/2026, 1:04 PMsuccess: true
◦ count: 30
◦ featureCount: 280,
◦ all returned in under ~2.5s
• source: "timeout", success: false
◦ count: 2,
◦ error: "Timeout"
◦ featureCount: 0
Details for failing records (UTC):
2026-08-05T122005.109Z { success: false, source: "timeout", error: "Timeout", featureCount: 0 }
2026-08-05T122006.722Z { success: false, source: "timeout", error: "Timeout", featureCount: 0 }
Earlier occurrences, all coinciding with a rolling deploy:
2026-08-03T02:15Z - 1 of 4 tasks affected
2026-08-03T11:43Z - 1 of 4 tasks affected
2026-08-05T10:42Z - 3 of 4 tasks affectedwooden-pillow-75591
08/06/2026, 12:08 AMinit({ timeout: 5000 }) times out, the SDK doesn't throw or retry, but simply resolves with success: false and leaves the client permanently in its default state. Since streaming is only wired up as part of a successful init, a process that times out never gets a live SSE connection either, so there's nothing left to self-heal it.
The timeouts themselves are likely a side effect of your deploy pattern: 32 processes (8 PM2 workers × 4 Fargate tasks) all calling init() within a ~3 second window, all sharing one NAT gateway's egress IP. That burst of simultaneous new connections occasionally pushes a couple of requests past the 5s threshold, not because GrowthBook is unreachable, just briefly slower under that concurrent load. Before you added the timeout, those same slow requests would have taken longer to succeed rather than being abandoned.
If you could try:
1. Add a background safety-net poll, even with streaming enabled — this alone prevents the "stuck forever" outcome:
setInterval(() => gbClient.refreshFeatures(), 5 * 60 * 1000);
2. Reduce concurrent connections at deploy time
That should help prevent the same patterns. I hope this helps.