or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

index.mdserver.mdsocket.mdtransports.mdtypes.md
tile.json

transports.mddocs/

Transport System

Pluggable transport layer with automatic fallback and upgrade capabilities supporting polling, WebSocket, and WebTransport protocols.

Capabilities

Transport Base Class

Abstract base class for all transport implementations.

/**
 * Base class for all transport implementations
 */
abstract class Transport extends EventEmitter {
  /** Transport name identifier */
  abstract readonly name: string;
  
  /** Session ID for this transport */
  readonly sid: string;
  
  /** Protocol version */
  readonly protocol: number;
  
  /** Whether transport can send data */
  writable: boolean;
  
  /** Current transport state */
  readyState: ReadyState;
  
  /**
   * Create transport instance (internal use)
   * @param req - HTTP request object
   */
  constructor(req: IncomingMessage);
  
  /**
   * Send packets through this transport
   * @param packets - Array of packets to send
   */
  abstract send(packets: Packet[]): void;
  
  /**
   * Handle incoming request for this transport
   * @param req - HTTP request
   */
  onRequest(req: IncomingMessage): void;
  
  /**
   * Close transport connection
   * @param fn - Optional callback
   */
  close(fn?: () => void): void;
  
  /**
   * Mark transport as discarded
   */
  discard(): void;
  
  /**
   * Implementation-specific close method
   * @param fn - Optional callback
   */
  protected abstract doClose(fn?: () => void): void;
}

Available Transports

Polling Transport

HTTP long-polling transport for fallback compatibility and cross-domain support.

/**
 * HTTP long-polling transport
 */
class Polling extends Transport {
  readonly name: "polling";
  
  /** Maximum HTTP buffer size */
  maxHttpBufferSize: number;
  
  /** HTTP compression settings */
  httpCompression: any;
  
  /** Whether compression is supported */
  supportsCompression: boolean;
  
  /**
   * Send packets via HTTP response
   */
  send(packets: Packet[]): void;
  
  /**
   * Handle polling request
   */
  onPollRequest(req: IncomingMessage, res: ServerResponse): void;
  
  /**
   * Handle data submission request  
   */
  onDataRequest(req: IncomingMessage, res: ServerResponse): void;
}

JSONP Transport

JSONP polling transport for cross-domain support in legacy browsers.

/**
 * JSONP polling transport extending Polling
 */
class JSONP extends Polling {
  readonly name: "polling";
  
  /** JSONP callback parameter name */
  jsonp: string;
  
  /**
   * Override to send JSONP-wrapped responses
   */
  send(packets: Packet[]): void;
}

WebSocket Transport

WebSocket transport for real-time bidirectional communication.

/**
 * WebSocket transport for real-time communication
 */
class WebSocket extends Transport {
  readonly name: "websocket";
  
  /** Handles transport upgrades */
  readonly handlesUpgrades: true;
  
  /** WebSocket permessage-deflate settings */
  perMessageDeflate: any;
  
  /** WebSocket instance */
  socket: any;
  
  /**
   * Send packets through WebSocket
   */
  send(packets: Packet[]): void;
  
  /**
   * Handle WebSocket connection
   */
  onWebSocket(socket: any): void;
}

WebTransport

Modern WebTransport implementation for HTTP/3 connections.

/**
 * WebTransport implementation for HTTP/3
 */
class WebTransport extends Transport {
  readonly name: "webtransport";
  
  /** WebTransport session */
  session: any;
  
  /** Readable stream */
  readable: ReadableStream;
  
  /** Writable stream */
  writable: WritableStream;
  
  /**
   * Send packets through WebTransport
   */
  send(packets: Packet[]): void;
  
  /**
   * Handle WebTransport session
   */
  onSession(session: any): void;
}

Transport Registry

/**
 * Registry of available transport implementations
 */
interface TransportRegistry {
  /** Polling transport factory (returns XHR or JSONP based on request) */
  polling: (req: IncomingMessage) => Polling | JSONP;
  
  /** WebSocket transport class */
  websocket: typeof WebSocket;
  
  /** WebTransport class */
  webtransport: typeof WebTransport;
}

/**
 * Available transport registry
 */
const transports: TransportRegistry;

Transport Selection and Upgrades

Transport Priority

Engine.IO uses a priority system for transport selection:

  1. Polling - Always available as fallback
  2. WebSocket - Preferred for real-time communication
  3. WebTransport - Most efficient when available (HTTP/3)
// Configure transport priority
const server = new Server({
  transports: ['polling', 'websocket', 'webtransport']
});

Automatic Upgrades

server.on('connection', (socket) => {
  console.log('Initial transport:', socket.transport.name);
  
  socket.on('upgrade', (transport) => {
    console.log('Upgraded to:', transport.name);
  });
  
  socket.on('upgrading', (transport) => {
    console.log('Upgrading to:', transport.name);
  });
});

Transport Configuration

Polling Configuration

const server = new Server({
  // HTTP compression for polling
  httpCompression: {
    threshold: 1024,
    level: 6,
    memLevel: 8
  },
  
  // Maximum buffer size for HTTP requests
  maxHttpBufferSize: 1e6, // 1MB
  
  // CORS settings for polling
  cors: {
    origin: true,
    credentials: true
  }
});

WebSocket Configuration

const server = new Server({
  // Custom WebSocket engine (e.g., eiows for better performance)
  wsEngine: require('eiows').Server,
  
  // WebSocket compression
  perMessageDeflate: {
    threshold: 1024,
    concurrencyLimit: 10,
    deflateOptions: {
      chunkSize: 1024,
      windowBits: 13,
      memLevel: 7
    }
  }
});

WebTransport Configuration

const server = new Server({
  // Enable WebTransport (disabled by default)
  transports: ['polling', 'websocket', 'webtransport'],
  
  // WebTransport-specific options would go here
  // (implementation-specific)
});

Transport Events

interface TransportEvents {
  /** Emitted when transport is ready */
  open: () => void;
  
  /** Emitted when transport is closed */
  close: () => void;
  
  /** Emitted when packet is received */
  packet: (packet: Packet) => void;
  
  /** Emitted when data is received */
  data: (data: string | Buffer) => void;
  
  /** Emitted on transport error */
  error: (error: Error) => void;
  
  /** Emitted when transport is discarded */
  drain: () => void;
}

Custom Transport Implementation

// Example custom transport
class CustomTransport extends Transport {
  readonly name = "custom";
  
  constructor(req: IncomingMessage) {
    super(req);
    // Custom initialization
  }
  
  send(packets: Packet[]): void {
    // Implement packet sending
    packets.forEach(packet => {
      this.sendPacket(packet);
    });
  }
  
  protected doClose(fn?: () => void): void {
    // Implement transport-specific cleanup
    this.cleanup();
    fn?.();
  }
  
  private sendPacket(packet: Packet): void {
    // Custom packet sending logic
  }
  
  private cleanup(): void {
    // Custom cleanup logic
  }
}

// Register custom transport
server.transports.custom = CustomTransport;

Transport Performance Considerations

Polling Optimizations

// Optimize polling for your use case
const server = new Server({
  // Reduce HTTP overhead
  maxHttpBufferSize: 100 * 1024, // 100KB
  
  // Enable compression for large payloads
  httpCompression: {
    threshold: 512 // Compress messages > 512 bytes
  },
  
  // Faster heartbeat for quicker connection detection
  pingInterval: 10000, // 10 seconds
  pingTimeout: 5000    // 5 seconds
});

WebSocket Optimizations

// Optimize WebSocket performance
const server = new Server({
  // Use high-performance WebSocket engine
  wsEngine: require('eiows').Server,
  
  // Optimize compression
  perMessageDeflate: {
    threshold: 1024,
    deflateOptions: {
      level: 1, // Fast compression
      windowBits: 13
    }
  }
});

Transport Debugging

// Enable transport debugging
process.env.DEBUG = 'engine:transport:*';

server.on('connection', (socket) => {
  // Log transport changes
  socket.on('upgrading', (transport) => {
    console.log(`${socket.id}: Upgrading from ${socket.transport.name} to ${transport.name}`);
  });
  
  socket.on('upgrade', (transport) => {
    console.log(`${socket.id}: Successfully upgraded to ${transport.name}`);
  });
  
  // Monitor transport errors
  socket.transport.on('error', (error) => {
    console.error(`Transport error for ${socket.id}:`, error);
  });
});