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@pubsubjs/transport-sseServer-to-client streamingYesYes

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 ServerYesNoNoYesYes
SSE ClientNoYesNoNoYes

All transports share the same connection states:

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

Monitor connection state:

transport.on("connected", () => console.log("Connected"));
transport.on("disconnected", () => console.log("Disconnected"));
transport.on("reconnecting", () => console.log("Reconnecting..."));
transport.on("error", (error) => console.error("Error:", error));

Configure automatic reconnection:

const publisher = new Publisher({
events,
transport,
autoReconnect: true,
reconnectInterval: 1000, // Start with 1 second
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);
});