Skip to content

Transport Overview

Transports handle the communication between publishers and subscribers. PubSubJS provides several built-in transports for different use cases.

TransportPackageUse CaseBrowserServer
WebSocket@pubsubjs/transport-websocketReal-time bidirectionalYesYes
Redis@pubsubjs/transport-redisDistributed systemsNoYes
SSE (client)@pubsubjs/transport-sseServer-to-client streamingYesNo

Best for:

  • Real-time browser applications
  • Chat applications
  • Live collaboration tools
  • Gaming
import { WebSocketServerTransport } from "@pubsubjs/transport-websocket";
const transport = new WebSocketServerTransport({ port: 8080 });

Best for:

  • Microservices communication
  • Distributed systems
  • Serverless functions
  • High-throughput applications
import { RedisTransport } from "@pubsubjs/transport-redis";
const transport = new RedisTransport({ url: "redis://localhost:6379" });

Best for:

  • Server-to-client notifications
  • Live feeds and dashboards
  • Mobile applications
  • Environments where WebSocket is blocked
import { SSEServerTransport } from "@pubsubjs/transport-sse";
const transport = new SSEServerTransport();

Each transport has different capabilities:

interface TransportCapabilities {
canPublish: boolean; // Can send messages
canSubscribe: boolean; // Can receive messages
bidirectional: boolean; // Both directions
supportsTargeting: boolean; // Target specific connections
supportsChannels: boolean; // Channel-based routing
}
TransportPublishSubscribeBidirectionalTargetingChannels
WebSocket ServerYesYesYesYesYes
WebSocket ClientYesYesYesNoYes
RedisYesYesYesNoYes
SSE ClientNoYesNoNoYes

All transports share the same connection states:

type ConnectionState = "disconnected" | "connecting" | "connected" | "reconnecting";

Monitor connection state:

transport.on("connect", ({ connectionId }) => console.log(`Connected: ${connectionId}`));
transport.on("disconnect", ({ connectionId }) => console.log(`Disconnected: ${connectionId}`));
transport.on("reconnecting", ({ attempt }) => console.log(`Reconnecting... attempt ${attempt}`));
transport.on("error", ({ error }) => console.error("Error:", error));

Configure automatic reconnection:

const publisher = new Publisher({
events,
transport,
reconnectBaseDelay: 1000, // Start with 1 second
reconnectMaxDelay: 30000, // Cap backoff
maxReconnectAttempts: 10, // Give up after 10 attempts
});

Use different transports for different purposes:

// Internal microservice communication
const redisTransport = new RedisTransport({ url: "redis://localhost:6379" });
const internalPublisher = new Publisher({ events, transport: redisTransport });
// Browser clients
const wsTransport = new WebSocketServerTransport({ port: 8080 });
const clientPublisher = new Publisher({ events, transport: wsTransport });
// Bridge events between transports
const subscriber = new Subscriber({
events,
transport: redisTransport,
publisher: clientPublisher,
});
subscriber.on("notification.created", async (payload, { publisher }) => {
// Forward internal events to browser clients
await publisher.publish("notification.created", payload);
});