catcher_core 0.5.0
catcher_core: ^0.5.0 copied to clipboard
Resilient HTTP/WebSocket client backed by Rust core for Flutter
0.4.0 #
Packaging #
- Add Swift Package Manager support for the Flutter iOS plugin:
ios/catcher_core/Package.swiftexposescatcher_ffi.xcframeworkas a binary target, so Flutter apps can linkcatcher_corewithout CocoaPods. - Build scripts and the pub.dev release workflow now also assemble
ios/catcher_core/catcher_ffi.xcframeworkfor SPM consumers.
0.5.0 - 2026-09-21 #
Features #
- add application-layer compression support with gzip and zstd (10f43f4)
- bindings: expose networkChanged() in napi, uniffi and dart bindings (ebdf7d7)
- catcher-ffi umbrella crate + real FFI integration tests (97a5b1e)
- catcher-ws: add send_timeout_ms so half-open sends cannot stall the event loop (88d36e0)
- complete platform coverage — napi-http/ws full API, @catcher/web, Flutter dart:ffi, UniFFI, docs sync (3c5197f)
- Dart FFI bindings + napi-ws types + CI update (39ac501)
- Enhance catcher_core with native FFI support and platform-specific builds (07e83cc)
- update iOS deployment target to 15.0 and adjust framework generation (d06bbe9)
Bug Fixes #
- #022 stream chunk base64, #023 quality race, #024 SSE block_on panic (9ba65a8)
- address PR #13–15 review findings (issues #28–34) (b51c10b)
- bindings: align old-addon guards and error messages (0ad6380)
- catcher_core: set iOS framework minimum OS version (09601c0)
- catcher_core: set iOS framework minimum OS version (abb6713)
- critical review issues — use-after-free, async UniFFI, timeout race (03753f0)
- dart: fix Dart FFI compilation errors (78b9c4a)
- dart: sync Flutter/Dart with actual API surface (ede4129)
- dart: wire dns and msgpack config (d419a36)
- FFI HttpError as response JSON + Dart body_base64/data_base64 compat (04d03a3)
- flutter: restore WebSocket connection and prevent startup crash (#21) (9882a08)
- PR #13–15 review findings + release 0.3.13 (issues #28–34) (0320595)
- review round 2 — 36 issues across Rust/Dart/infra (fe0893e)
- review round 3 — 11 issues across Rust/Dart/infra (7e62159)
- support explicit proxy for mobile clients (a45368d)
- support proxy dns behavior across http and ws (d8ff3df)
- support proxy DNS behavior across HTTP and WS (15b1233)
- UniFFI setup_scaffolding, add catcher_free_result, remove UDL (1da6f30)
- wire Flutter FFI calls, implement UniFFI WsClient, fix test scripts, add CI/release infra (670f915)
- ws: restore Flutter Android socket connectivity (7787c61)
- ws: restore Flutter WebSocket direct connections (8455329)
0.3.19 #
Bug Fixes #
- Preserve structured transport failure details through NAPI HTTP retries, including error codes and chained causes, so host applications can diagnose connection failures after retries are exhausted.
Packaging #
- Synchronize the Flutter package version with the unified Catcher
0.3.19release; the Dart API surface is otherwise unchanged.
0.3.18 #
Bug Fixes #
- HTTP 421 recovery: native HTTP requests rebuild the current transport's connection pool and retry once after a
421 Misdirected Request, without cancelling unrelated in-flight requests. - Structured NAPI HTTP errors: the Node.js NAPI wrapper exports
HttpErrorwithstatus,body, andcausefields so host applications can inspect HTTP status failures directly.
Packaging #
- Synchronize all Catcher package versions to
0.3.18; the Flutter API surface is otherwise unchanged.
0.3.17 #
Bug Fixes #
- Flutter WebSocket direct connections: default simple WebSocket connections now use the yawc native backend, restoring Android Flutter socket connectivity while keeping reqwest for proxy, Catcher DNS, and advanced TLS configurations.
- WebSocket network change recovery:
networkChanged()immediately reconnects, resets reconnect backoff, re-races all endpoints for multi-endpoint configs, and replays buffered send commands after reconnect. - WebSocket old native library compatibility: missing
catcher_ws_network_changedis handled lazily so older native libraries can still construct clients; callingnetworkChanged()reports a clear rebuild requirement. - Apple framework metadata: generated iOS/macOS
catcher_ffi.xcframeworkbundles include minimum OS metadata, and podspec versions are synchronized for this release.
Behavior Changes #
- Rust
EndpointRacerinternalized: multi-endpoint racing is now an implementation detail ofWsTransport::connect()and is no longer exposed ascatcher_ws::EndpointRacer. ConfigureWsClientConfig.urls/race_countinstead.
0.3.16 #
Bug Fixes #
- napi
system-proxyfeature not enabled: 0.3.15 introduced system proxy auto-detection (proxy.mode = "system"), but both napi bindings (catcher-napi-http,catcher-napi-ws) did not enable thesystem-proxycargo feature on their dependency, sodetect_system_proxy()compiled to a no-op stub andproxy.mode = "system"silently did nothing in the published npm packages. The feature is now enabled on both napi crates. - napi TypeScript types synced:
ProxyConfigis now modeled as a discriminated union in the published TS types —ManualProxyConfig(default) requiresurl,SystemProxyConfig(mode: 'system') may omit it. This tightens the types so url-less manual configs (which would panic intransport_url()) no longer type-check. The Dart package is unaffected (no napi binding).
0.3.15 #
Features #
ProxyModeenum (Manual/System): caller can setproxy.mode = "system"to let catcher auto-detect the system proxy from the OS instead of passing a URL manually.- System proxy auto-detection via
proxy-cfg: macOS (SystemConfiguration), Windows (WinINET registry + WinHTTP), Linux (env vars + /etc/sysconfig/proxy). networkChanged()re-detects system proxy: when the network environment changes, system proxy is re-read and the reqwest client is rebuilt if the proxy address changed.
⚠️ #
ProxyConfig.url:String→Option<String>: a pre-1.0 breaking change. JSON deserialization is backward-compatible (#[serde(default)]ensuresmodedefaults toManualwhen absent).
0.3.13 #
Behavior Changes #
- DNS is now opt-in: without a
dnsconfig the platform's native resolver is used (previously the Catcher resolver was always built). Passdnsto re-enable caching / host mapping / custom nameservers. socks5://proxies are normalized tosocks5h://so the target domain is resolved remotely at the proxy (fixes Clash / VPN domain routing).tls_sni_overrideis rejected on the native transport (was silently ignored).
Bug Fixes #
- FFI lifecycle: destroying a client now stops in-flight requests/SSE and no longer invokes the host callback afterwards (prevents use-after-free).
0.3.12 #
Packaging #
- Add
MinimumOSVersion15.0 to the bundled iOScatcher_ffi.frameworkInfo.plist for App Store upload validation. - Rebuild the bundled Apple native frameworks.
0.3.11 #
New features #
- Update the native WebSocket transport to use
yawc, enabling native permessage-deflate (RFC 7692) support in the bundled Rust implementation. - Add
application_compressionconfig toWsClientConfigwith gzip and zstd support for application-layer compression fallback.
Fixes #
- Improve Android native build reliability by exporting NDK
CC_*andAR_*variables for cross-compiled native dependencies. - Buffer and replay messages sent during WebSocket reconnection instead of silently dropping them.
- Add fast pong timeout detection within a single heartbeat cycle.
- Echo Close frames on receipt before disconnecting (RFC 6455 §5.5.1).
- Report actual reconnect latency in
Connectedevents instead of 0 ms. - Remove
native-tlsfeature; TLS is handled entirely byyawc/rustls-ring.
Packaging #
- Refresh bundled native Rust dependency versions for the 0.3.11 release.
0.3.10 #
Packaging #
- Bump the Flutter package to
0.3.10to keep it aligned with the fresh npm and Rust release. - Rebuild the native bundles through the full release workflow.
0.3.9 #
New features #
- Add native DNS cache controls to
DnsConfig:cacheSize,negativeTtlSecs,staleTtlSecs, andstaleOnError. - Add
msgpacktoHttpClientConfigfor native HTTP JSON ↔ MessagePack body conversion. - Add
dnsandmsgpacktoWsClientConfigso Flutter WebSocket clients can use DNS cache settings and native MessagePack conversion.
Fixes #
- Fix DNS config not being passed through the Dart FFI layer to the native HTTP and WebSocket clients.
- Fix built-in MessagePack config not being passed through the Dart FFI layer.
Packaging #
- Keep bundled Android, iOS, macOS, Linux, and Windows native libraries below pub.dev package size limits.
0.3.8 #
- Publish
catcher_coreas a Flutter FFI plugin with platform native bundle metadata. - Bundle prebuilt Android, iOS, macOS, Linux, and Windows native libraries during pub.dev release.
- Refresh README installation guidance for the current package version.
0.3.1 #
- Package
catcher_coreas a Flutter FFI plugin with platform native bundle metadata. - Bundle prebuilt Android, iOS, macOS, Linux, and Windows native libraries during pub.dev release.
- Load Apple builds from
catcher_ffi.framework/catcher_ffiand desktop/mobile dynamic libraries from app bundle search paths.
0.2.2 #
- SSE client:
CatcherSseClient(persistent + auto-reconnect) andsseStream()(one-shot). - Per-request headers + timeout in
get(),post(),sseStream(). cancelAll(),circuitBreakerState,metrics,setAdaptiveTimeout().- Full config passthrough:
TlsConfig,DnsConfig,ProxyConfig,RedirectConfig. WsClientConfignow includesheaders,protocols,deflateThresholdBytes,raceCount.qualityHistory()for persistent sliding window network quality data.
0.1.0 #
- Initial release.
- HTTP client with retries, timeouts, keep-alive.
- WebSocket client with reconnection and permessage-deflate.
- FFI bindings to Rust core.