Skip to content

@seydx/rtsp / RtspServerSink

Class: RtspServerSink ​

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:332

Sink that re-publishes a relayed stream as a multi-client RTSP server.

Each track is packetized exactly once and the resulting RTP is fanned out to every playing viewer over interleaved TCP, so the upstream is pulled a single time regardless of how many clients are connected. The server is created lazily via the relay, attaching to it on the first client and detaching a grace period after the last viewer leaves (so a quickly retrying client finds the stream still warm), and can optionally advertise an ONVIF talkback channel and require authentication.

Examples ​

typescript
import { Relay } from '@seydx/rtsp';

const relay = new Relay({ source });
const server = await relay.serveRtsp({ port: 8554, path: 'live' });
console.log('playing at', server.url);
typescript
import { Relay, RtspAuth } from '@seydx/rtsp';

const relay = new Relay({ source });
const server = await relay.serveRtsp({
  port: 8554,
  auth: new RtspAuth({ username: 'admin', password: 'secret' }),
  backchannel: true,
});

server.on('viewer:added', (count) => console.log('viewers:', count));

See ​

  • Relay For the relay that feeds this sink
  • RtspAuth For securing the endpoint

Extends ​

Implements ​

Constructors ​

Constructor ​

new RtspServerSink(relay, options?): RtspServerSink

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:376

Create an RTSP server sink bound to a relay.

Prefer Relay.serveRtsp, which constructs the sink, starts listening, and wires up backchannel handling for you.

Parameters ​

relay ​

Relay

The relay whose stream is re-published.

options? ​

RtspServerSinkOptions = {}

Server configuration such as bind address, path, MTU, auth, and backchannel.

Returns ​

RtspServerSink

Overrides ​

TypedEmitter<RtspServerEvents>.constructor

Properties ​

auth? ​

readonly optional auth?: RtspAuth

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:333

Optional authenticator for incoming requests.

When present, every request is checked against this authenticator before it is dispatched; unauthenticated requests receive a 401 challenge. When absent, all requests are served without authentication.

Implementation of ​

RtspSessionHost.auth


backchannelStreamId? ​

optional backchannelStreamId?: number

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:362

SDP streamid of the talkback (backchannel) media, if advertised.

When set, a viewer that sets up this stream may push audio back to the source over its interleaved RTP channel. Undefined when the source exposes no backchannel.

Implementation of ​

RtspSessionHost.backchannelStreamId


logger? ​

readonly optional logger?: Logger

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:334

Optional logger for diagnostics.

Used to surface parse failures and request-handling errors. All logging is best-effort and guarded, so a missing logger silently disables it.

Implementation of ​

RtspSessionHost.logger


trackKinds ​

trackKinds: readonly TrackKind[] = []

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:364

Track kinds indexed by SDP streamid.

The element at index n describes the media kind (for example video or audio) of the track advertised with streamid=n in the SDP. Used to decide whether a viewer's subscription must be keyframe-gated.

Implementation of ​

RtspSessionHost.trackKinds

Accessors ​

backchannelFormat ​

Get Signature ​

get backchannelFormat(): BackchannelAdvertise | undefined

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:407

The talkback codec actually advertised to viewers, once the upstream is known.

Resolves to the negotiated format only after init has run and the upstream's backchannel (or the configured override) has been determined; otherwise undefined.

Example ​
typescript
const format = server.backchannelFormat;
if (format) console.log('talkback codec:', format.codec);
Returns ​

BackchannelAdvertise | undefined


url ​

Get Signature ​

get url(): string

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:424

The fully qualified rtsp:// URL viewers connect to.

Includes the bound host and port (resolved after listen) and the stream path; when authentication is configured the username is shown with the password masked.

Example ​
typescript
await server.listen();
console.log('connect to', server.url);
Returns ​

string


viewers ​

Get Signature ​

get viewers(): number

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:437

The number of viewers currently in the playing state.

Example ​
typescript
console.log('active viewers:', server.viewers);
Returns ​

number

Methods ​

activate() ​

activate(): Promise<string>

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:549

Ensure the upstream is live and resolve the DESCRIBE SDP.

Invoked by a session handling its first DESCRIBE. Attaches to the relay on the first call (which lazily opens the upstream) and returns a promise for the SDP, which resolves once headers for every track have been seen.

Returns ​

Promise<string>

The SDP describing the available media, including any talkback section.

Throws ​

If the sink is torn down (e.g. the upstream failed to start) before the SDP became available.

Example ​

typescript
const sdp = await server.activate();

Implementation of ​

RtspSessionHost.activate


close() ​

close(): Promise<void>

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:849

Release all per-track muxers and reset state for a fresh upstream.

Closes every muxer, clears the track bookkeeping, and re-arms the deferred SDP so the sink can be reused when the relay reattaches. Called by the relay when the upstream ends or is detached.

Returns ​

Promise<void>

A promise that resolves once all muxers are closed.

Example ​

typescript
await server.close();

Implementation of ​

Sink.close


emit() ​

emit<E>(event, ...args): boolean

Defined in: util/emitter.ts:123

Emit an event, invoking all registered listeners synchronously.

The arguments are type-checked against the listener signature for the given event. Unlike a raw Node.js EventEmitter, emitting error without a registered listener does not throw — a consumer that opted out of error events must never crash the process over one.

Type Parameters ​

E ​

E extends keyof RtspServerEvents

Parameters ​

event ​

E

Name of the event to emit

args ​

...Parameters<RtspServerEvents[E]>

Payload forwarded to each listener, matching the event's signature

Returns ​

boolean

true if the event had listeners, false otherwise

Example ​

typescript
service.emit('ready');

Inherited from ​

TypedEmitter.emit


init() ​

init(info): Promise<void>

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:680

Initialize the sink for a freshly opened upstream.

Creates one RTP muxer per relayable source track, records the track kinds, and (when requested) resolves the talkback media to advertise. Data tracks and tracks without a native stream handle are skipped: they cannot be RTP packetized, and waiting for a header from a track that rarely (or never) produces packets would stall SDP generation and hang every DESCRIBE. Called by the relay when the upstream stream description becomes available.

Parameters ​

info ​

StreamInfo

Description of the upstream tracks and any backchannel it offers.

Returns ​

Promise<void>

A promise that resolves once all per-track muxers are open.

Throws ​

If the upstream carries no track that can be served over RTP.

Example ​

typescript
await server.init(streamInfo);

Implementation of ​

Sink.init


listen() ​

listen(): Promise<RtspServerSink>

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:459

Start the TCP listener and begin accepting RTSP clients.

Binding is idempotent: calling this again after the server is already listening returns immediately. When no explicit port was configured, the chosen ephemeral port is filled in and becomes visible via url.

Returns ​

Promise<RtspServerSink>

This sink, once the socket is bound.

Throws ​

If the socket cannot bind (for example, the port is in use).

Example ​

typescript
const server = new RtspServerSink(relay, { port: 8554 });
await server.listen();
console.log(server.url);

off() ​

off<E>(event, listener): this

Defined in: util/emitter.ts:99

Remove a previously registered listener for an event.

Only the exact listener reference passed to on or once is removed; passing a different function has no effect.

Type Parameters ​

E ​

E extends keyof RtspServerEvents

Parameters ​

event ​

E

Name of the event to unsubscribe from

listener ​

RtspServerEvents[E]

The exact listener reference to remove

Returns ​

this

This emitter, for chaining

Example ​

typescript
service.off('data', handler);

Inherited from ​

TypedEmitter.off


on() ​

on<E>(event, listener): this

Defined in: util/emitter.ts:55

Register a listener for an event.

The listener is invoked every time the event is emitted, until it is removed via off or removeAllListeners.

Type Parameters ​

E ​

E extends keyof RtspServerEvents

Parameters ​

event ​

E

Name of the event to subscribe to

listener ​

RtspServerEvents[E]

Callback invoked with the event's typed payload

Returns ​

this

This emitter, for chaining

Example ​

typescript
service.on('data', (chunk) => handle(chunk));

Inherited from ​

TypedEmitter.on


onBackchannelRtp() ​

onBackchannelRtp(rtp): void

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:528

Handle one inbound talkback RTP packet received from a viewer.

Forwards the packet to listeners by re-emitting it as a backchannel event; the relay (or application) is responsible for routing it toward the camera.

Parameters ​

rtp ​

Buffer

The raw RTP packet sent by the viewer.

Returns ​

void

Example ​

typescript
server.on('backchannel', (rtp) => camera.sendAudio(rtp));

Implementation of ​

RtspSessionHost.onBackchannelRtp


once() ​

once<E>(event, listener): this

Defined in: util/emitter.ts:77

Register a one-time listener for an event.

The listener is invoked at most once, on the next emission of the event, and is then automatically removed.

Type Parameters ​

E ​

E extends keyof RtspServerEvents

Parameters ​

event ​

E

Name of the event to subscribe to

listener ​

RtspServerEvents[E]

Callback invoked once with the event's typed payload

Returns ​

this

This emitter, for chaining

Example ​

typescript
service.once('ready', () => console.log('ready'));

Inherited from ​

TypedEmitter.once


removeAllListeners() ​

removeAllListeners(): this

Defined in: util/emitter.ts:143

Remove all listeners for every event.

Typically used during teardown to ensure no callbacks fire after the owning object has been disposed.

Returns ​

this

This emitter, for chaining

Example ​

typescript
service.removeAllListeners();

Inherited from ​

TypedEmitter.removeAllListeners


sessionClosed() ​

sessionClosed(session): void

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:597

Deregister a session that has disconnected.

Removes the session from the connected and playing sets, emitting viewer:removed if it was playing. When no sessions remain, a detach from the relay is scheduled after the configured grace period (so a quickly retrying client finds the sink still warm); once it fires, the relay — and thus the upstream — can go idle.

Parameters ​

session ​

RtspSession

The session that closed.

Returns ​

void

Example ​

typescript
server.sessionClosed(session);

Implementation of ​

RtspSessionHost.sessionClosed


sessionPlaying() ​

sessionPlaying(session): void

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:576

Register a session as actively playing.

Tracks the session for fan-out and emits a viewer:added event with the new viewer count.

Parameters ​

session ​

RtspSession

The session that just entered the playing state.

Returns ​

void

Example ​

typescript
server.sessionPlaying(session);

Implementation of ​

RtspSessionHost.sessionPlaying


shutdown() ​

shutdown(): Promise<void>

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:502

Fully tear the server down.

Closes every connected viewer, stops the TCP listener, and detaches from the relay so the upstream can go idle. Safe to call even if the server was never started.

Returns ​

Promise<void>

A promise that resolves once the listener is closed and the relay is detached.

Example ​

typescript
await server.shutdown();

write() ​

write(packet): Promise<void>

Defined in: sinks/rtsp-server/rtsp-server-sink.ts:765

Packetize and fan out one media packet to all playing viewers.

Routes the packet to its track's muxer (which emits RTP via onRtp); packets for unknown tracks or without native data are dropped. Once the muxer for every track has produced its header, the deferred SDP is resolved.

Parameters ​

packet ​

MediaPacket

The media packet to packetize and deliver.

Returns ​

Promise<void>

A promise that resolves once the packet has been written to its muxer.

Example ​

typescript
await server.write(packet);

Implementation of ​

Sink.write