Skip to content

[new tool] @agent-tools/webrtc — WebRTC peer-to-peer data channels and media transport #203

@burner-agent

Description

@burner-agent

Tool Name

@agent-tools/webrtc

Description

Pure-TypeScript WebRTC implementation for Node.js providing peer-to-peer data channels and media transport without native dependencies. Enables agents to establish direct encrypted connections for real-time data exchange, file transfer, and media streaming.

Why It's Useful for Agents

AI agents coordinating in distributed systems need low-latency, direct communication channels. WebRTC data channels provide encrypted peer-to-peer messaging without a central relay, enabling multi-agent collaboration, real-time tool output streaming, and file transfer between agent instances. Unlike WebSocket (server-mediated), WebRTC enables true peer-to-peer with NAT traversal.

Key reference: werift-webrtc (601 stars, MIT, 100% TypeScript, active — pushed Apr 26 2026) implements the full WebRTC stack in pure TypeScript (ICE/DTLS/SCTP/RTP/SRTP) with no native addons. Also evaluated node-datachannel (403 stars, MPL-2.0, C++ bindings to libdatachannel) and PeerJS (13.3k stars, MIT, browser-focused high-level abstraction).

Proposed API

import { createPeer, createSignaler } from "@agent-tools/webrtc";

// Create a peer with STUN/TURN config
const peer = createPeer({
  iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
});

// Offer/answer signaling (transport-agnostic)
const offer = await peer.createOffer();
// ... exchange offer/answer via any signaling channel ...
await peer.acceptAnswer(answer);

// Data channels — reliable, ordered messaging
const channel = await peer.createDataChannel("control", {
  ordered: true,
  maxRetransmits: 3,
});
channel.onMessage((data: Buffer | string) => { /* handle */ });
await channel.send(JSON.stringify({ action: "run-tool", tool: "grep" }));

// Media tracks — send/receive audio/video
const track = await peer.addTrack(mediaSource, { direction: "sendrecv" });
peer.onTrack((track, stream) => { /* consume remote media */ });

// Connection lifecycle
peer.onConnectionStateChange((state) => { /* connected | disconnected | failed */ });
await peer.close();

// Built-in signaling helper (WebSocket-based)
const signaler = createSignaler({ url: "wss://signal.example.com" });
await signaler.connect(peer, { room: "agent-collab-123" });

Scope

In scope:

  • Peer connection creation with ICE/DTLS/SCTP (pure TypeScript, no native deps)
  • Data channel creation (reliable/unreliable, ordered/unordered)
  • Offer/answer SDP generation and consumption
  • ICE candidate gathering and trickle ICE
  • STUN/TURN server configuration
  • Connection state management and events
  • Optional WebSocket-based signaling helper
  • NAT traversal

Out of scope:

  • Media codec encoding/decoding (use dedicated media tools)
  • Signaling server implementation (only client helper provided)
  • Browser-side WebRTC (use native browser APIs)
  • SFU/MCU media server functionality

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedExtra attention is neededinfrastructureCI, workflows, build toolingnew-toolProposal for a new tool packagetier:perceptionTier 2 — browser, DOM, web understanding

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions