Skip to content

About

Two-lane & multi-queue WebSocket/WebTransport toolkit to eliminate head-of-line blocking, bufferbloat, and slow-consumer interference (RFC 9330/9332, CATS, RFC 9218)

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

WebSocket Lanes & Multi-Queue Transport Toolkit

Node.js License: MIT Standards: RFC 9330 / RFC 9332 / RFC 9218

A production-grade TypeScript toolkit and specialized agent skill for eliminating Head-of-Line (HoL) blocking, TCP bufferbloat, and slow-consumer interference in web and real-time distributed applications.


⚡ The Problem: Single-Stream WebSocket Mismatch

Traditional WebSockets funnel heterogeneous workloads over a single, strictly-ordered TCP stream:

                       Single FIFO TCP WebSocket Connection
  Client   ========================================================>   Server
               [P4: 5MB File] [P4: Bulk Chunks...] [P0: Heartbeat Ping]
                                                          ▲
                                                          │ STALLED!
                                             (Head-of-Line Blocking)

When an application transmits mixed traffic—such as real-time heartbeat pings, cursor reticles, and UI keystrokes alongside document snapshots, file attachments, and historical telemetry—three critical failure modes emerge:

  1. Head-of-Line (HoL) Blocking: High-priority interactive messages are delayed behind megabytes of bulk data already queued in the socket buffer.
  2. Bufferbloat: Calling socket.send() on large payloads fills OS kernel buffers (SO_SNDBUF), inflating round-trip times from 2ms to over 500ms and causing spurious heartbeat timeouts and reconnect storms.
  3. Slow-Consumer Interference: When a single slow or lossy mobile client stalls, unbuffered or unisolated broadcast loops cause server memory spikes and degrade performance for all connected peers.

🔬 Research & Standards Grounding

This toolkit implements architectural patterns and queue management algorithms derived from international networking standards:

  • IETF RFC 9330 / RFC 9332 (DualQ Coupled AQM & L4S): Mathematically coupled congestion marking: $$p_C = k \cdot (p_L)^2$$ Decoupling low-latency shallow queues ($L$-queue, target delay < 1ms) from classic deep queues ($C$-queue) without sacrificing fair bottleneck capacity.
  • CATS (Conductor-driven Asymmetric Transport Scheme): Transport-native semantic multi-queuing ($P_0$–$P_4$) directly above the transport socket combined with a shallow low-watermark Feeder (4KB–16KB) that prevents OS kernel TCP bufferbloat.
  • IETF RFC 9000 / RFC 9114 / RFC 9218 (WebTransport, HTTP/3, and Extensible Prioritization Scheme): Independent QUIC streams with sendOrder urgency scheduling and unreliable datagrams for loss-tolerant telemetry.
  • Enterprise WebSocket Isolation Patterns: Physical two-lane socket separation (TCP_NODELAY), server-side bounded ring buffers, and key-based message conflation.

📊 Benchmark Results

Under 100% link saturation with concurrent bulk background sync (20 × 20KB payloads) and interactive heartbeats (10 × 10ms intervals):

===============================================================================================
Transport Architecture                     | p50 (ms) | p95 (ms) | p99 (ms) | Jitter | HoL Stalls
-----------------------------------------------------------------------------------------------
Single-Stream FIFO (Standard WS)           |      0.0 |      4.0 |      4.0 |    1.2 |         20
CATS Conductor (Semantic Multi-Lane)       |      1.0 |      2.0 |      2.0 |    0.6 |          0
Dual-Lane WebSocket (Physical Isolation)   |      0.0 |      4.0 |      4.0 |    1.2 |          0
Conflated Ring Buffer (Key-Coalescing)     |      0.1 |      0.2 |      0.3 |    0.1 |          0
===============================================================================================

Key Takeaway: Dual-Lane WebSocket and CATS Conductor reduce Head-of-Line stalls to 0 and maintain sub-millisecond heartbeats even during heavy bulk payloads.


🚀 Quick Start

Installation

git clone https://github.com/alien35/websocket-skill.git
cd websocket-skill
npm install

Running the CLI

# Run comparative latency & HoL blocking benchmark
npm run bench

# Start the reference Two-Lane WebSocket Server
npm run serve

# Run the live interactive dual-lane traffic demo
npm run demo

# Run DualQ Coupled AQM & Bufferbloat diagnostics
npm run diagnose

# Run the unit test suite
npm test

🛠️ Architectural Patterns & Code Examples

Pattern 1: Two-Lane WebSocket Architecture (Physical Isolation)

Separates high-frequency interactive control frames from heavy bulk data across two independent WebSocket connections:

import { TwoLaneWebSocketServer, TwoLaneWebSocketClient, PriorityLane } from 'websocket-skill';

// 1. Server initialization
const server = new TwoLaneWebSocketServer({ fastPort: 8080, slowPort: 8081 });
server.on('fastMessage', ({ clientId, message }) => {
  console.log(`[Fast Lane] Event from ${clientId}:`, message.payload);
});
await server.start();

// 2. Client initialization
const client = new TwoLaneWebSocketClient({
  fastUrl: 'ws://localhost:8080?clientId=user-1',
  slowUrl: 'ws://localhost:8081?clientId=user-1',
  heartbeatIntervalMs: 1000,
});
await client.connect();

// 3. Send interactive keystroke (Fast Lane, zero HoL delay)
client.sendFast({
  priority: PriorityLane.P1_HIGH,
  topic: 'editor:cursor',
  payload: { line: 42, col: 10 },
});

// 4. Send multi-megabyte document state (Slow Lane)
client.sendSlow({
  priority: PriorityLane.P4_BULK,
  topic: 'doc:snapshot',
  payload: { documentBinary: '...' },
});

Pattern 2: CATS Conductor (Semantic Multi-Queuing & Shallow Feeder)

Layered directly on top of an existing single WebSocket connection to prevent socket bufferbloat:

import { CatsConductor, PriorityLane } from 'websocket-skill';

const conductor = new CatsConductor(existingWebSocket, {
  lowWatermarkBytes: 4096,   // 4KB threshold
  highWatermarkBytes: 16384, // 16KB threshold
  strictPriority: true,
});

// Urgent heartbeat automatically leaps over lower-priority bulk frames
await conductor.send({
  id: 'ping-1',
  lane: 'fast',
  priority: PriorityLane.P0_CRITICAL,
  timestamp: Date.now(),
  payload: { ping: true },
});

Pattern 3: Bounded Ring Buffer with Message Conflation

Collapses bursts of rapidly changing state (e.g. cursor positions, market data ticks) so lagging consumers only receive the latest state:

import { BoundedRingBuffer, PriorityLane } from 'websocket-skill';

const ring = new BoundedRingBuffer({
  capacity: 64,
  dropPolicy: 'conflate-by-key',
});

// Pushing updates with the same conflateKey coalesces them in place
ring.push({
  id: 'tick-1',
  lane: 'slow',
  priority: PriorityLane.P2_NORMAL,
  conflateKey: 'ticker:BTC-USD',
  timestamp: Date.now(),
  payload: { price: 92100 },
});

ring.push({
  id: 'tick-2',
  lane: 'slow',
  priority: PriorityLane.P2_NORMAL,
  conflateKey: 'ticker:BTC-USD',
  timestamp: Date.now(),
  payload: { price: 92150 }, // Overwrites tick-1
});

// Reading delivers only the latest tick
const latest = ring.pop();
console.log(latest.payload); // { price: 92150 }

Pattern 4: WebTransport & HTTP/3 Prioritized Streams

Migrates to QUIC streams with RFC 9218 sendOrder urgency and fallback to Dual-Lane WebSocket:

import { AdaptiveMultiLaneTransport } from 'websocket-skill';

const transport = new AdaptiveMultiLaneTransport({
  webTransportUrl: 'https://localhost:4433/wt',
  webSocketFallback: {
    fastUrl: 'ws://localhost:8080',
    slowUrl: 'ws://localhost:8081',
  },
});

await transport.connect();

// Emits via WebTransport unidirectional stream with sendOrder = 1000,
// or via Fast Lane WebSocket if WebTransport is unavailable
await transport.sendCritical({
  payload: { cancelOrder: 'ord-992' },
});

📁 Repository Structure

websocket-skill/
├── SKILL.md                          # Comprehensive Agent Skill specification
├── README.md                         # Documentation and architecture guide
├── package.json                      # Scripts & dependencies (ws)
├── tsconfig.json                     # TypeScript compiler configuration
├── bin/
│   └── websocket-lanes.js            # Executable CLI (benchmark, serve, demo, diagnose)
├── src/
│   ├── index.ts                      # Library barrel export
│   ├── types.ts                      # Core interfaces, lanes (P0-P4), metrics
│   ├── dual-lane.ts                  # TwoLaneWebSocketClient & Server
│   ├── cats-conductor.ts             # CATS multi-lane scheduler & feeder
│   ├── slow-consumer.ts              # BoundedRingBuffer & IsolatedBroadcaster
│   ├── webtransport-adapter.ts       # WebTransport & HTTP/3 prioritized streams
│   ├── dualq-monitor.ts              # RFC 9330/9332 DualQ coupled AQM monitor
│   └── benchmark.ts                  # Comparative benchmark test suite
├── examples/
│   ├── dual-lane-chat.ts             # Real-time chat with file attachment uploads
│   └── conflated-ticker.ts           # High-frequency market data ticker
└── test/
    ├── cats-conductor.test.ts        # Unit tests for CATS priority & watermarks
    ├── dual-lane.test.ts             # Unit tests for Two-Lane WebSocket & ping-pong
    ├── slow-consumer.test.ts         # Unit tests for conflation & consumer isolation
    ├── dualq-monitor.test.ts         # Unit tests for RFC 9332 p_C = p_L^2 calculations
    └── webtransport-adapter.test.ts  # Unit tests for fallback mechanics

📜 License

MIT License. Copyright (c) 2026 Alexander Leon.

About

Two-lane & multi-queue WebSocket/WebTransport toolkit to eliminate head-of-line blocking, bufferbloat, and slow-consumer interference (RFC 9330/9332, CATS, RFC 9218)

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages