@jellyfish-dev/react-client-sdk
Version:
React client library for Jellyfish.
202 lines • 12.5 kB
TypeScript
import TypedEmitter from "typed-emitter";
import { AuthErrorReason, BandwidthLimit, Component, ConnectConfig, CreateConfig, MessageEvents, Peer, SimulcastConfig, TrackBandwidthLimit, TrackContext, TrackEncoding } from "@jellyfish-dev/ts-client-sdk";
import { PeerId, PeerState, PeerStatus, TrackId, TrackWithOrigin } from "./state.types";
import { DeviceManager, DeviceManagerEvents } from "./DeviceManager";
import { MediaDeviceType, ScreenShareManager, ScreenShareManagerConfig } from "./ScreenShareManager";
import { DeviceManagerConfig, DeviceState, UseCameraAndMicrophoneResult, UseUserMediaState } from "./types";
export type ClientApi<PeerMetadata, TrackMetadata> = {
local: PeerState<PeerMetadata, TrackMetadata> | null;
peers: Record<PeerId, PeerState<PeerMetadata, TrackMetadata>>;
peersTracks: Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
components: Record<PeerId, PeerState<PeerMetadata, TrackMetadata>>;
componentsTracks: Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
bandwidthEstimation: bigint;
status: PeerStatus;
media: UseUserMediaState | null;
devices: UseCameraAndMicrophoneResult<TrackMetadata>;
deviceManager: DeviceManager;
screenShareManager: ScreenShareManager;
};
export interface ClientEvents<PeerMetadata, TrackMetadata> {
/**
* Emitted when the websocket connection is closed
*
* @param {CloseEvent} event - Close event object from the websocket
*/
socketClose: (event: CloseEvent, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Emitted when occurs an error in the websocket connection
*
* @param {Event} event - Event object from the websocket
*/
socketError: (event: Event, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Emitted when the websocket connection is opened
*
* @param {Event} event - Event object from the websocket
*/
socketOpen: (event: Event, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/** Emitted when authentication is successful */
authSuccess: (client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/** Emitted when authentication fails */
authError: (reason: AuthErrorReason, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/** Emitted when the connection is closed */
disconnected: (client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called when peer was accepted.
*/
joined: (event: {
peerId: string;
peers: Peer<PeerMetadata, TrackMetadata>[];
components: Component<PeerMetadata, TrackMetadata>[];
}, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called when peer was not accepted
* @param metadata - Pass through for client application to communicate further actions to frontend
*/
joinError: (metadata: any, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called when data in a new track arrives.
*
* This callback is always called after {@link MessageEvents.trackAdded}.
* It informs user that data related to the given track arrives and can be played or displayed.
*/
trackReady: (ctx: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called each time the peer which was already in the room, adds new track. Fields track and stream will be set to null.
* These fields will be set to non-null value in {@link MessageEvents.trackReady}
*/
trackAdded: (ctx: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called when some track will no longer be sent.
*
* It will also be called before {@link MessageEvents.peerLeft} for each track of this peer.
*/
trackRemoved: (ctx: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called each time peer has its track metadata updated.
*/
trackUpdated: (ctx: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called each time new peer joins the room.
*/
peerJoined: (peer: Peer<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called each time peer leaves the room.
*/
peerLeft: (peer: Peer<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called each time peer has its metadata updated.
*/
peerUpdated: (peer: Peer<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called each time new Component is added to the room.
*/
componentAdded: (peer: Component<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called each time Component is removed from the room.
*/
componentRemoved: (peer: Component<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called each time Component has its metadata updated.
*/
componentUpdated: (peer: Component<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called in case of errors related to multimedia session e.g. ICE connection.
*/
connectionError: (message: string, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Called every time the server estimates client's bandiwdth.
*
* @param {bigint} estimation - client's available incoming bitrate estimated
* by the server. It's measured in bits per second.
*/
bandwidthEstimationChanged: (estimation: bigint, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
encodingChanged: (context: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
/**
* Emitted every time an update about voice activity is received from the server.
*/
voiceActivityChanged: (context: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
managerStarted: (event: Parameters<DeviceManagerEvents["managerInitialized"]>[0] & {
mediaDeviceType: MediaDeviceType;
}, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
managerInitialized: (event: {
audio?: DeviceState;
video?: DeviceState;
mediaDeviceType: MediaDeviceType;
}, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
deviceReady: (event: Parameters<DeviceManagerEvents["deviceReady"]>[0] & {
mediaDeviceType: MediaDeviceType;
}, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
devicesStarted: (event: Parameters<DeviceManagerEvents["devicesStarted"]>[0] & {
mediaDeviceType: MediaDeviceType;
}, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
devicesReady: (event: Parameters<DeviceManagerEvents["devicesReady"]>[0] & {
mediaDeviceType: MediaDeviceType;
}, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
deviceStopped: (event: Parameters<DeviceManagerEvents["deviceStopped"]>[0] & {
mediaDeviceType: MediaDeviceType;
}, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
deviceEnabled: (event: Parameters<DeviceManagerEvents["deviceEnabled"]>[0] & {
mediaDeviceType: MediaDeviceType;
}, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
deviceDisabled: (event: Parameters<DeviceManagerEvents["deviceDisabled"]>[0] & {
mediaDeviceType: MediaDeviceType;
}, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
error: (arg: any, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
targetTrackEncodingRequested: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["targetTrackEncodingRequested"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
localTrackAdded: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackAdded"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
localTrackRemoved: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackRemoved"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
localTrackReplaced: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackReplaced"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
localTrackBandwidthSet: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackBandwidthSet"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
localTrackEncodingBandwidthSet: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackEncodingBandwidthSet"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
localTrackEncodingEnabled: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackEncodingEnabled"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
localTrackEncodingDisabled: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackEncodingDisabled"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
localEndpointMetadataChanged: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localEndpointMetadataChanged"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
localTrackMetadataChanged: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackMetadataChanged"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
disconnectRequested: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["disconnectRequested"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
}
export type ReactClientCreteConfig<PeerMetadata, TrackMetadata> = {
clientConfig?: CreateConfig<PeerMetadata, TrackMetadata>;
deviceManagerDefaultConfig?: DeviceManagerConfig;
screenShareManagerDefaultConfig?: ScreenShareManagerConfig;
};
declare const Client_base: new <PeerMetadata_1, TrackMetadata_1>() => TypedEmitter<Required<ClientEvents<PeerMetadata_1, TrackMetadata_1>>>;
export declare class Client<PeerMetadata, TrackMetadata> extends Client_base<PeerMetadata, TrackMetadata> {
private readonly tsClient;
readonly deviceManager: DeviceManager;
readonly screenShareManager: ScreenShareManager;
local: PeerState<PeerMetadata, TrackMetadata> | null;
peers: Record<PeerId, PeerState<PeerMetadata, TrackMetadata>>;
components: Record<PeerId, PeerState<PeerMetadata, TrackMetadata>>;
peersTracks: Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
componentsTracks: Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
bandwidthEstimation: bigint;
status: PeerStatus;
media: UseUserMediaState | null;
devices: UseCameraAndMicrophoneResult<TrackMetadata>;
private currentMicrophoneTrackId;
private currentCameraTrackId;
private currentScreenShareTrackId;
constructor(config?: ReactClientCreteConfig<PeerMetadata, TrackMetadata>);
setScreenManagerConfig(config: ScreenShareManagerConfig): void;
setDeviceManagerConfig(config: DeviceManagerConfig): void;
private trackContextToTrack;
connect(config: ConnectConfig<PeerMetadata>): void;
disconnect(): void;
addTrack(track: MediaStreamTrack, stream: MediaStream, trackMetadata?: TrackMetadata, simulcastConfig?: SimulcastConfig, maxBandwidth?: TrackBandwidthLimit): Promise<string>;
removeTrack(trackId: string): Promise<void>;
replaceTrack(trackId: string, newTrack: MediaStreamTrack, newTrackMetadata?: TrackMetadata): Promise<void>;
getStatistics(selector?: MediaStreamTrack | null): Promise<RTCStatsReport>;
getBandwidthEstimation(): bigint;
setTrackBandwidth(trackId: string, bandwidth: BandwidthLimit): Promise<boolean>;
setEncodingBandwidth(trackId: string, rid: string, bandwidth: BandwidthLimit): Promise<boolean>;
setTargetTrackEncoding(trackId: string, encoding: TrackEncoding): void;
enableTrackEncoding(trackId: string, encoding: TrackEncoding): void;
disableTrackEncoding(trackId: string, encoding: TrackEncoding): void;
updatePeerMetadata: (peerMetadata: PeerMetadata) => void;
updateTrackMetadata: (trackId: string, trackMetadata: TrackMetadata) => void;
private stateToSnapshot;
}
export {};
//# sourceMappingURL=Client.d.ts.map