Skip to content

@seydx/rtsp / RtspServerSink

Class: RtspServerSink

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

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 once the last viewer leaves, 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:336

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:300

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:322

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:301

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:324

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:364

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:381

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:394

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:492

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.

Example

typescript
const sdp = await server.activate();

Implementation of

RtspSessionHost.activate


close()

close(): Promise<void>

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

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:121

Emit an event, invoking all registered listeners synchronously.

The arguments are type-checked against the listener signature for the given event.

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:559

Initialize the sink for a freshly opened upstream.

Creates one RTP muxer per source track, records the track kinds, and (when requested) resolves the talkback media to advertise. 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.

Example

typescript
await server.init(streamInfo);

Implementation of

Sink.init


listen()

listen(): Promise<RtspServerSink>

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

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:474

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:138

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:532

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, the sink detaches from the relay so 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:513

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:452

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:618

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