# SignalR — TODO ## Priority legend - **P0** blocker · **P1** important · **P2** nice-to-have · **P3** idea --- ## TODO-01: Diagnose first-call null in PostDataAsync **Priority:** P2 · **Type:** Investigation · **Related:** `SIGNALR_ISSUES.md#issue-02` Reproduce the `GetProductDtos_80`-style first-call null. Add trace logs to `PostDataAsync` awaiter path and `OnReceiveMessage → pending request` dictionary lookup. Verify `requestId → Task` correlation on the very first chunked response of a fresh connection. ## TODO-02: Document asymmetric send/receive capability **Priority:** P1 · **Type:** Docs Current behaviour: sender selects `BinaryProtocolMode` independently; receiver detects the wire format from the first byte (`CHUNK_START=200` → chunked path; else non-chunked). This means client and server can run DIFFERENT `ProtocolMode` settings independently — a core feature amplifying interoperability. Document in `SIGNALR_BINARY_PROTOCOL.md` as a dedicated "Asymmetric send/receive contract" section. Key selling points: - WASM client + AsyncSegment server → works (WASM downgrades send, receives chunked happily) - Third-party client on NuGet can pick any mode → server doesn't care - Gradual mode rollouts possible (no synchronized deploy) ## TODO-03: Code-level guard for FlushTimeout < ClientTimeoutInterval **Priority:** P2 · **Type:** Feature `AcBinaryHubProtocolOptions.Validate()` currently documents (in XML doc) that `FlushTimeout` should be less than the SignalR `HubOptions.ClientTimeoutInterval`, but there is no code-level check. Add validation at protocol registration time — if both options are resolvable from the DI scope, verify the constraint and emit a startup warning (or throw, pending decision). ## TODO-04: `BinaryProtocolMode.Auto` — adaptive send-mode **Priority:** P3 · **Type:** Feature · **Related:** `SIGNALR_BINARY_PROTOCOL_TODO.md#todo-03` Design: on first received message, inspect first byte to determine peer's send format. On subsequent sends, match it (subject to local-platform constraints, e.g. WASM never actually sends AsyncSegment). Per-`HubConnection` state. Optional upfront handshake-extension negotiation as an alternative — see wire-level TODO.