You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SSE silent-stall fix (Layer 1, qfg-47c2.7). The SDK now wraps the eventsource library's
underlying fetch with an AbortController whose deadline resets on every chunk. If no chunk
arrives within sseReadDeadlineMs (default 90s = 3x the 30s server heartbeat), the socket is
dropped and the eventsource library reconnects. Previously the SDK relied on the OS TCP timeout
(often 2+ hours), so a silent server-side stall could go unnoticed for hours.
Polling is now a fallback, not a parallel stream (Layer 2, qfg-47c2.7). New options fallbackPollEnabled (default true) and fallbackPollIntervalMs (default 60000) configure an
HTTP poll that only runs when SSE is unavailable — either because the initial SSE connection
failed (DNS, TLS, HTTP error before any successful onopen) or because SSE has been disconnected
for >= 2x the poll interval (default 120s) without recovering. When SSE recovers (next successful connected transition), the fallback poller stops. The previous enablePolling / pollInterval
options are deprecated and now map onto the new options with a deprecation warning; the behavior
changes — those options previously ran a parallel poller on top of SSE (double bandwidth, no
reconcile logic). Alpha-phase, no semver hold per resolved Q1 in project/plans/sdk-hardening-and-verification.md.
Boot log.init() now emits a single info-level log line announcing the chosen update channel
(SSE-with-fallback / SSE-only / polling-only / none) so deployers can see the new default at
startup.
Health getters (qfg-47c2.14). New public methods lastSuccessfulRefresh() and connectionState() expose diagnostic state for composing custom freshness checks. The aggregate ConnectionState type (initializing / connected / disconnected / falling_back) is now
exported. Diagnostic only — see the README on why these must not be wired into a k8s liveness
probe.
datadir: exclude schemas/ and reject empty-key files (qfg-2inx). Files under a workspace's schemas/ directory are no longer loaded as configs, and a config file whose key is empty is
rejected with a clear error instead of being silently mis-keyed.
Chaos harness (qfg-47c2.7, qfg-47c2.29, qfg-47c2.32, qfg-mzg2). sdk-node ships a chaos-test
runner under chaos/ (invoked via npm run test:chaos / npm run chaos) that drives the
cross-SDK scenarios in integration-test-data/chaos/scenarios/ against the SDK via toxiproxy.
Scenario 07 switched to proxy-disable instead of the limit_data toxic; the runner identifies its
session to the shared chaos lock; and scripts/run-chaos.sh boots api-delivery + toxiproxy and
tears them down on exit. The chaos smoke suite now runs on every push and PR and gates the release
workflow.
Dependencies.eventsource^3.0.0 → ^4.1.0; dev deps typescript^5.3.0 → ^6.0.3
(tsconfig gains types: ["node"] + ignoreDeprecations: "6.0" for the TS 6 lib/baseUrl changes), vitest^1.0.0 → ^4.1.6 (CI test-matrix floor raised to Node 20.19.0 for vitest 4's rolldown
binding), pino9.14.0 → 10.3.1, @types/node^20.11.0 → ^25.6.0. CI actions actions/checkout → v6.0.2 and actions/setup-node → v6.4.0.