Add Fusion WebSocket Support - #10367
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
There are at least two blocking issues: capability/config mismatches in WebSocket variable execution fallback, and a new Microsoft.AspNetCore.App framework dependency that materially impacts hosting/runtime requirements for Fusion.Execution.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR adds first-class WebSocket support to Fusion source-schema execution by introducing a WebSocket-based ISourceSchemaClient, wiring it into client configuration parsing/DI, and extending the shared socket client/protocol stack to support Fusion’s SourceResultDocument pipeline and subscription lifecycle.
Changes:
- Add
WebSocketSourceSchemaClient+ configuration/factory and integrate it into Fusion’s client configuration parsing and DI. - Add WebSocket context-forwarding (headers + connection_init payload) and propagate inbound connection init payload into request features for downstream use.
- Extend/conditionalize the socket client/protocol implementation for Fusion, plus substantial new test coverage for teardown, parsing, batching, and subscription cleanup.
File summaries
| File | Description |
|---|---|
| website/content/docs/fusion/cli.md | Updates CLI docs around transports; subscription transport field removed. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Transport/Sockets/FusionSocketTeardownTests.cs | Tests close/teardown behavior for shared socket client. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Transport/Sockets/FusionSocketReaderTests.cs | Tests message parsing, pooling, and queue/overflow behavior. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Planning/RequirementReentrancyTests.cs | Adds planning coverage for subscription re-entrancy scenario. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Planning/snapshots/RequirementReentrancyTests.Plan_Should_Reenter_SubscriptionSource_When_EntityHopReturnsToSource.yaml | Snapshot for the new planning test. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/OperationPlanContextPoolingTests.cs | Tests borrowed client-scope behavior across pooled context reuse. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/OperationExecutionNodeTests.cs | Adds extensive subscription cleanup/scope/diagnostic coverage. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Clients/WebSocketSourceSchemaClientTests.cs | End-to-end tests for WebSocket source-schema client behavior. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Clients/WebSocketContextForwardingTests.cs | Tests forwarding rules from request context into socket init/headers. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Clients/DefaultSourceSchemaClientScopeTests.cs | Validates scope caching semantics for WebSocket vs other clients. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Configuration/DefaultGraphQLClientConfigurationParserTests.cs | Adds coverage for parsing transports.websockets and capability splits. |
| src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/GatewayBuilderInterceptorTests.cs | Ensures connection_init payload is preserved into request features. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Transport/Sockets/Client/SocketOperationException.cs | Adds operation-scoped socket exception type. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Transport/Sockets/Client/SocketClientOptions.cs | Adds Fusion socket client options (queue sizing, pool). |
| src/HotChocolate/Fusion/src/Fusion.Execution/Transport/Sockets/Client/Protocols/GraphQLOverWebSocket/WebSocketMessageParser.cs | Adds fast message location + pooled payload copy + parsing hooks. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Transport/Sockets/Client/Protocols/GraphQLOverWebSocket/Messages/FusionDataMessage.cs | Base type for Fusion data messages with pooled payload lifetime. |
| src/HotChocolate/Fusion/src/Fusion.Execution/HotChocolate.Fusion.Execution.csproj | Pulls in socket client sources; adds AspNetCore shared framework reference. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/ThrowHelper.cs | Adds throw helpers for borrowed client-scope invariants. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/OperationPlanContext.Pooling.cs | Ensures borrowed scope is cleared before pooling/disposal. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/OperationPlanContext.cs | Adds borrowed client-scope support and guards around reuse. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Nodes/OperationExecutionNode.cs | Reworks subscription enumerator init + cleanup error handling and scope borrowing. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/FusionRequestExecutorManager.cs | Applies WebSocket context forwarding to WebSocket client configurations. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Clients/WebSocketSourceSchemaClientFactory.cs | Factory for request-scoped WebSocket clients with invoker reuse. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Clients/WebSocketSourceSchemaClientConfiguration.cs | Configuration type for WS source-schema client and its capabilities. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Clients/WebSocketSourceSchemaClient.cs | Implements WebSocket-based execution/batching/subscriptions for subgraphs. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Clients/WebSocketContextForwarding.cs | New forwarding rule model + builder for init payload and upgrade headers. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Clients/DefaultSourceSchemaClientScope.cs | Adds special caching path for WebSocketSourceSchemaClient reuse by config. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Execution/Clients/ClientConnectionInitPayload.cs | Internal feature wrapper for connection_init payload. |
| src/HotChocolate/Fusion/src/Fusion.Execution/DependencyInjection/HotChocolateFusionServiceCollectionExtensions.cs | Registers WebSocketSourceSchemaClientFactory in Fusion DI. |
| src/HotChocolate/Fusion/src/Fusion.Execution/DependencyInjection/CoreFusionGatewayBuilderExtensions.SourceSchemaClients.cs | Adds gateway builder APIs for WS client configs and context forwarding. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Configuration/Parsers/DefaultGraphQLClientConfigurationParser.cs | Parses transports.websockets and splits supported ops between transports. |
| src/HotChocolate/Fusion/src/Fusion.Execution/Configuration/FusionGatewaySetup.cs | Stores global and per-schema forwarding modifiers for WS connections. |
| src/HotChocolate/Fusion/src/Fusion.AspNetCore/FusionSocketSessionInterceptor.cs | Captures inbound connection_init payload into connection/request features. |
| src/HotChocolate/Fusion/src/Fusion.AspNetCore/DependencyInjection/FusionServerServiceCollectionExtensions.cs | Installs Fusion socket session interceptor by default. |
| src/HotChocolate/AspNetCore/test/Transport.Sockets.Client.Tests/GraphQLOverWebSocket/MessageStreamTests.cs | Tests payload disposal when no observer claims a message. |
| src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/GraphQLOverWebSocket/WebSocketProtocolTests.cs | Ensures server persists connection_init payload in connection features. |
| src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/Apollo/WebSocketProtocolTests.cs | Same payload persistence behavior for Apollo protocol. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets/WellKnownProtocols.cs | Makes protocols usable from Fusion namespace via #if FUSION. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets/WebSocketExtensions.cs | Same namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets/SocketDefaults.cs | Same namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets/MessageReceiver.cs | Namespace + delimiter import switches for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets/MessageProcessor.cs | Namespace + delimiter import switches for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets/MessagePipeline.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets/ISocket.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets/IMessageHandler.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets/Delimiter.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/ThrowHelper.cs | Adds Fusion-specific helpers (queue overflow, payload parsing errors). |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/SocketResult.cs | Adds Fusion async completion + Fusion document yielding/disposal pattern. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/SocketClosedException.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/SocketClient.cs | Adds Fusion connect/options + close semantics + arena-based execution APIs. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/SocketClientContext.cs | Adds Fusion options + serialized sender to avoid concurrent sends. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/MessageStream.cs | Adjusts message handling logic for Fusion vs non-Fusion builds. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/IProtocolHandler.cs | Adds Fusion overloads supporting arena parsing and deferred parsing. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/IOperationMessage.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/IDataMessage.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/IDataCompletion.cs | Adds async complete for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/GraphQLOverWebSocket/Utf8Messages.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/GraphQLOverWebSocket/Utf8MessageProperties.cs | Namespace/import switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/GraphQLOverWebSocket/Messages/NextMessage.cs | Adds Fusion payload handling variant using pooled payload + arena parsing. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/GraphQLOverWebSocket/Messages/Messages.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/GraphQLOverWebSocket/Messages/ErrorMessage.cs | Fusion variant wraps payload into { errors: ... } with pooled buffer. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/GraphQLOverWebSocket/Messages/CompleteMessage.cs | Fusion variant supports direct id-based creation. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/GraphQLOverWebSocket/MessageHelper.cs | Adds Fusion-specific subscribe writers and removes static WS message type import. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs | Adds Fusion parsing/dispatch path with message locating + pooling. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/GraphQLOverWebSocket/ConnectionAcceptMessage.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/DataMessageObserver.cs | Fusion observer implements queue byte limits + deferred payload parsing. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Protocols/ConnectionMessageObserver.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/HotChocolate.Transport.Sockets.Client.csproj | Adds InternalsVisibleTo for socket client tests. |
| src/HotChocolate/AspNetCore/src/Transport.Sockets.Client/Extensions/ArrayWriterExtensions.cs | Namespace switch for Fusion build. |
| src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs | Clones init payload before storing to avoid lifetime issues. |
| src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs | Same payload cloning for Apollo protocol. |
Review details
- Files reviewed: 72/72 changed files
- Comments generated: 3
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| if (!subscribe | ||
| && request.Variables.Length > 1 | ||
| && !Capabilities.HasFlag(SourceSchemaClientCapabilities.VariableBatching)) | ||
| { | ||
| socketResult = await client.ExecuteBatchAsync( | ||
| CreateVariableOperationBatch(request), | ||
| context.MemorySource, | ||
| cancellationToken).ConfigureAwait(false); | ||
| } | ||
| else |
| <ItemGroup> | ||
| <FrameworkReference Include="Microsoft.AspNetCore.App" /> | ||
| </ItemGroup> |
| ### `transports.http.clientName` | ||
|
|
||
| **Type:** `string` (optional, defaults to `"fusion"`) | ||
|
|
||
| The named HTTP client the gateway uses to communicate with this subgraph. Must match what the gateway configures via `builder.Services.AddHttpClient("fusion")`. |
No description provided.