Skip to content

Conversation

@mordhaus
Copy link

Connects the graphql-transport-ws subprotocol to the main HTTP
handler. The handler now inspects the negotiated subprotocol and routes
the connection to the new transport package for processing.

This change activates the new protocol without affecting the existing
legacy implementation.

Changes:

  • Added a case to the subprotocol switch to route connections to
    transport.Connect.
  • Implemented transportOptions to pass handler settings to the new
    transport package.
  • Updated the corresponding test to assert a successful handshake
    for the new protocol.

This pull request refactors how the websocket subprotocol is handled.

Previously, the code iterated through the Sec-WebSocket-Protocol
header to find a supported protocol. This change removes that manual
iteration and relies on the websocket upgrader (e.g.,
gorilla/websocket) to correctly negotiate and select the subprotocol
from the list provided by the client.

The handler logic has been moved into a dispatcher, which makes it
easier to extend the codebase with support for additional subprotocols
in the future, such as the newer graphql-transport-ws protocol (as
mentioned in issue graph-gophers#38).

Changes:
- Removed the manual for loop that iterated over websocket
subprotocols.
- Delegated subprotocol detection to the websocket upgrader.
- Introduced a dispatcher to route connections based on the negotiated
subprotocol.
- This change is foundational for adding support for the
graphql-transport-ws subprotocol.
Chris Schofield added 2 commits November 4, 2025 17:21
Introduces the transport package to handle the GraphQL over
WebSocket protocol. This abstracts the underlying communication layer
from core service logic, decoupling network I/O from business
operations.

The package manages the connection lifecycle, message serialization, and
graceful shutdowns. This improves testability by allowing the transport
to be mocked and provides a clear separation of concerns.

Changes:

- Added a new shared GraphQL subscription interface.
- Added Connect function to manage the connection lifecycle.
- Implemented readLoop and writeLoop for handling messages.
- Added support for GraphQL-WS protocol messages (e..g, subscribe,
  next, complete).
- Implemented operationMap for managing active subscriptions.
- Created mock connection and service for comprehensive unit tests.
Connects the `graphql-transport-ws` subprotocol to the main HTTP
handler. The handler now inspects the negotiated subprotocol and routes
the connection to the new transport package for processing.

This change activates the new protocol without affecting the existing
legacy implementation.

Changes:
- Added a case to the subprotocol switch to route connections to
  `transport.Connect`.
- Implemented `transportOptions` to pass handler settings to the new
  transport package.
- Updated the corresponding test to assert a successful handshake
  for the new protocol.
@mordhaus mordhaus force-pushed the feature/update-dispatcher branch from f0a2982 to aeefd0b Compare November 4, 2025 06:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant