openrtc-netcode
v2.5.4
Published
A small lobby, mesh, message, and replicated-state netcode layer built on OpenRTC.
Maintainers
Readme
openrtc-netcode
openrtc-netcode is a small multiplayer layer on top of OpenRTC. It treats
OpenRTC rooms as lobbies, observes the runtime-owned P2P mesh between lobby members,
and exposes reliable typed messages, lightweight replicated state, networked
objects, and browser voice-chat media.
Gameplay payloads are sent over OpenRTC peer data paths only: Iroh relay/direct plus WebRTC or MoQ custom Iroh carriers when enabled. Live membership and signaling use the OpenRTC coordination gateway; neither core netcode nor its payload path uses Firebase, Firestore, or RTDB.
preferredTransports filters OpenRTC's typed application-readiness
query; it does not request promotion. OpenRTC owns optional transport promotion
and recovery, while netcode only observes route events. Netcode consumes one
already-activated room handle, so it never retains an unused user or space
avenue.
import { OpenRTC } from 'openrtc';
import { createNetcode } from 'openrtc-netcode';
const rtc = OpenRTC({
apiKey: 'pk_live_...',
transports: { webrtc: true },
});
const room = await rtc.rooms.join('duel-room', {
access: 'capability',
membership: 'ephemeral',
});
const netcode = createNetcode({ room });
await netcode.joinLobby('duel-room');
netcode.onMessage('chat', (message) => {
console.log(message.from, message.payload);
});
await netcode.broadcast('chat', { text: 'hello' });Networked game objects are synchronized through netcode.objects:
await netcode.objects.spawn({
id: 'crate-1',
kind: 'crate',
transform: { position: { x: 0, y: 1, z: 0 } },
physics: { linearVelocity: { x: 0, y: 0, z: 0 } },
});Voice chat publishes microphone tracks through each already-established OpenRTC logical connection. Netcode does not create a second peer connection, exchange SDP/ICE, or own transport recovery:
await netcode.voice.start();
netcode.voice.on('peer:stream', ({ stream }) => {
audioElement.srcObject = stream;
});