Skip to content

Add Fusion WebSocket Support - #10367

Open
michaelstaib wants to merge 26 commits into
mainfrom
mst/websocket-transport
Open

Add Fusion WebSocket Support#10367
michaelstaib wants to merge 26 commits into
mainfrom
mst/websocket-transport

Conversation

@michaelstaib

Copy link
Copy Markdown
Member

No description provided.

Copilot AI lite review requested due to automatic review settings September 8, 2026 06:49
@github-actions github-actions Bot added 📚 documentation This issue is about working on our documentation. 🌶️ hot chocolate labels Sep 8, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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.

Comment on lines +128 to +137
if (!subscribe
&& request.Variables.Length > 1
&& !Capabilities.HasFlag(SourceSchemaClientCapabilities.VariableBatching))
{
socketResult = await client.ExecuteBatchAsync(
CreateVariableOperationBatch(request),
context.MemorySource,
cancellationToken).ConfigureAwait(false);
}
else
Comment on lines +34 to +36
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
Comment on lines 604 to 608
### `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")`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📚 documentation This issue is about working on our documentation. 🌶️ hot chocolate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants