# ADR 0092: Realtime contracts may bind an existing transport

> Source: https://github.com/max-listov/stitchkit/blob/master/docs/decisions/0092-existing-realtime-transport-binding.md

---

# ADR 0092 — Realtime contracts may bind an existing transport

## Context

Applications may already own one Socket.IO client for authentication,
reconnection and durable subscriptions. `createRealtimeClient` previously made
adopting Stitchkit validation require a second connection or a wholesale
lifecycle migration.

## Decision

`bindRealtimeClient(contract, transport)` accepts the smallest structural
transport used by the canonical validated client: connection state, event
subscription, emit, Promise acknowledgement and connection-change observation.
It returns `BoundRealtimeClient`, which exposes validated event and request
operations but no `connect` or `disconnect` methods.

`createRealtimeClient` constructs the official Socket.IO adapter, delegates all
validation and request behavior to the same binder, then adds lifecycle methods
because it owns that transport. Binding validates required capabilities
immediately. It neither imports Socket.IO eagerly nor creates, connects or
closes a socket.

## Consequences

- Existing subscriptions and reconnect policy remain application-owned.
- Created and bound clients cannot drift in payload, acknowledgement, timeout
  or disconnect semantics.
- Lifecycle ownership is visible in the return type rather than documentation
  alone.

