Skip to main content
OpenPX exposes a single multiplexed WebSocket per exchange. One connection handles every subscribed market, and consumers read from two streams:
StreamTypeWhat it carries
updates()WsUpdatePer-market events: Snapshot, Delta, Clear, Trade, Fill
session_events()SessionEventConnection-level events: Connected, Reconnected, Lagged, BookInvalidated, Error
Both are single-consumer. Calling updates() or session_events() twice returns None (Rust) or raises (Python/TS) — cloning a receiver would silently split messages between holders. Fan out by running one consumer that re-broadcasts.

Driver trait

Defined at engine/core/src/websocket/traits.rs:
pub trait OrderBookWebSocket: Send + Sync {
    async fn connect(&mut self) -> Result<(), WebSocketError>;
    async fn disconnect(&mut self) -> Result<(), WebSocketError>;
    async fn subscribe(&mut self, market_id: &str) -> Result<(), WebSocketError>;
    async fn unsubscribe(&mut self, market_id: &str) -> Result<(), WebSocketError>;
    fn state(&self) -> WebSocketState;
    fn updates(&self) -> Option<UpdateStream>;
    fn session_events(&self) -> Option<SessionStream>;
}
WebSocketState is one of: Disconnected, Connecting, Connected, Reconnecting, Closed.

What’s next

Connecting

connect, subscribe, and per-exchange targets.

Events

Every variant of WsUpdate.

Session events

Reconnects, lag, and book invalidation.