DefinitelyTyped/types/twilio-video/index.d.ts

543 lines
18 KiB
TypeScript

// Type definitions for twilio-video 2.0
// Project: https://twilio.com/video, https://twilio.com
// Definitions by: MindDoc <https://github.com/minddocdev>
// Darío Blanco <https://github.com/darioblanco>
// katashin <https://github.com/ktsn>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
import { EventEmitter } from 'events';
/**
* Classes
*/
export class AccessTokenExpiredError extends TwilioError {
code: 20104;
message: 'Access Token expired or expiration date invalid';
}
export class AccessTokenGrantsInvalidError extends TwilioError {
code: 20106;
message: 'Invalid Access Token grants';
}
export class AccessTokenHeaderInvalidError extends TwilioError {
code: 20102;
message: 'Invalid Access Token header';
}
export class AccessTokenIssuerInvalidError extends TwilioError {
code: 20103;
message: 'Invalid Access Token issuer/subject';
}
export class AccessTokenNotYetValidError extends TwilioError {
code: 20105;
message: 'Access Token not yet valid';
}
export class AccessTokenSignatureInvalidError extends TwilioError {
code: 20107;
message: 'Invalid Access Token signature';
}
export class AudioTrack extends Track {
isStarted: boolean;
isEnabled: boolean;
kind: 'audio';
mediaStreamTrack: MediaStreamTrack;
// Required for Safari if you want to detach without errors
// See: https://github.com/twilio/twilio-video.js/issues/294#issuecomment-389708981
_attachments?: HTMLMediaElement[];
attach(element?: HTMLMediaElement | string): HTMLMediaElement;
detach(element?: HTMLMediaElement | string): HTMLMediaElement[];
}
export class ConfigurationAcquireFailedError extends TwilioError {
code: 53500;
message: 'Unable to acquire configuration';
}
export class ConfigurationAcquireTurnFailedError extends TwilioError {
code: 53501;
message: 'Unable to acquire TURN credentials';
}
export class LocalAudioTrack extends AudioTrack {
constructor(mediaStreamTrack: MediaStreamTrack, options?: LocalTrackOptions);
id: Track.ID;
isStopped: boolean;
disable(): LocalAudioTrack;
enable(enabled?: boolean): LocalAudioTrack;
stop(): LocalAudioTrack;
}
export class LocalAudioTrackPublication extends LocalTrackPublication {
kind: 'audio';
track: LocalAudioTrack;
unpublish(): LocalAudioTrackPublication;
}
export class LocalAudioTrackStats extends LocalTrackStats {
audioLevel: AudioLevel | null;
jitter: number | null;
}
export class LocalDataTrack extends Track {
constructor(options?: LocalDataTrackOptions);
id: Track.ID;
kind: 'data';
maxPacketLifeTime: number | null;
maxRetransmits: number | null;
ordered: boolean;
reliable: boolean;
send(data: string | Blob | ArrayBuffer | ArrayBufferView): void;
}
export class LocalDataTrackPublication extends LocalTrackPublication {
kind: 'data';
track: LocalDataTrack;
unpublish(): LocalDataTrackPublication;
}
export class LocalParticipant extends Participant {
audioTracks: Map<Track.SID, LocalAudioTrackPublication>;
dataTracks: Map<Track.SID, LocalDataTrackPublication>;
tracks: Map<Track.SID, LocalTrackPublication>;
videoTracks: Map<Track.SID, LocalVideoTrackPublication>;
publishTrack(track: LocalTrack): Promise<LocalTrackPublication>;
publishTrack(
mediaStreamTrack: MediaStreamTrack, options?: LocalTrackOptions,
): Promise<LocalTrackPublication>;
publishTracks(
tracks: Array<LocalTrack | MediaStreamTrack>,
): Promise<LocalTrackPublication[]>;
setParameters(encodingParameters?: EncodingParameters | null): LocalParticipant;
unpublishTrack(track: LocalTrack | MediaStreamTrack): LocalTrackPublication;
unpublishTracks(tracks: Array<LocalTrack | MediaStreamTrack>): LocalTrackPublication[];
}
export class LocalTrackPublication extends TrackPublication {
isTrackEnabled: boolean;
kind: Track.Kind;
track: LocalTrack;
unpublish(): LocalTrackPublication;
}
export class LocalTrackStats extends TrackStats {
bytesSent: number | null;
packetsSent: number | null;
roundTripTime: number | null;
}
export class LocalVideoTrack extends VideoTrack {
constructor(mediaStreamTrack: MediaStreamTrack, options?: LocalTrackOptions);
id: Track.ID;
isStopped: boolean;
disable(): LocalVideoTrack;
enable(enabled?: boolean): LocalVideoTrack;
stop(): LocalVideoTrack;
}
export class LocalVideoTrackPublication extends LocalTrackPublication {
kind: 'video';
track: LocalVideoTrack;
unpublish(): LocalVideoTrackPublication;
}
export class LocalVideoTrackStats extends LocalTrackStats {
captureDimensions: VideoTrack.Dimensions | null;
dimensions: VideoTrack.Dimensions | null;
captureFrameRate: number | null;
frameRate: number | null;
}
export class MediaClientLocalDescFailedError extends TwilioError {
code: 53400;
message: 'Client is unable to create or apply a local media description';
}
export class MediaClientRemoteDescFailedError extends TwilioError {
code: 53402;
message: 'Client is unable to apply a remote media description';
}
export class MediaConnectionError extends TwilioError {
code: 53405;
message: 'Media connection failed';
}
export class MediaNoSupportedCodecError extends TwilioError {
code: 53404;
message: 'No supported codec';
}
export class MediaServerLocalDescFailedError extends TwilioError {
code: 53401;
message: 'Server is unable to create or apply a local media description';
}
export class MediaServerRemoteDescFailedError extends TwilioError {
code: 53403;
message: 'Server is unable to apply a remote media description';
}
export namespace Participant {
type Identity = string;
type SID = string;
}
export class Participant extends EventEmitter {
audioTracks: Map<Track.SID, AudioTrackPublication>;
dataTracks: Map<Track.SID, DataTrackPublication>;
identity: Participant.Identity;
networkQualityLevel: NetworkQualityLevel | null;
sid: Participant.SID;
state: string;
tracks: Map<Track.SID, TrackPublication>;
videoTracks: Map<Track.SID, VideoTrackPublication>;
}
export class ParticipantDuplicateIdentityError extends TwilioError {
code: 53205;
message: 'Participant disconnected because of duplicate identity';
}
export class ParticipantIdentityCharsInvalidError extends TwilioError {
code: 53202;
message: 'Participant identity contains invalid characters';
}
export class ParticipantIdentityInvalidError extends TwilioError {
code: 53200;
message: 'Participant identity is invalid';
}
export class ParticipantIdentityTooLongError extends TwilioError {
code: 53201;
message: 'Participant identity is too long';
}
export class ParticipantMaxTracksExceededError extends TwilioError {
code: 53203;
message: 'Participant has too many Tracks';
}
export class ParticipantNotFoundError extends TwilioError {
code: 53204;
message: 'Participant not found';
}
export class RemoteAudioTrack extends AudioTrack {
sid: Track.SID;
}
export class RemoteAudioTrackPublication extends RemoteTrackPublication {
kind: 'audio';
track: RemoteAudioTrack | null;
}
export class RemoteAudioTrackStats extends RemoteTrackStats {
audioLevel: AudioLevel | null;
jitter: number | null;
}
export class RemoteDataTrack extends Track {
isEnabled: boolean;
isSubscribed: boolean;
kind: 'data';
maxPacketLifeTime: number | null;
maxRetransmits: number | null;
ordered: boolean;
reliable: boolean;
sid: Track.SID;
}
export class RemoteDataTrackPublication extends RemoteTrackPublication {
kind: 'data';
track: RemoteDataTrack | null;
}
export class RemoteParticipant extends Participant {
audioTracks: Map<Track.SID, RemoteAudioTrackPublication>;
dataTracks: Map<Track.SID, RemoteDataTrackPublication>;
tracks: Map<Track.SID, RemoteTrackPublication>;
videoTracks: Map<Track.SID, RemoteVideoTrackPublication>;
}
export class RemoteTrackPublication extends TrackPublication {
isSubscribed: boolean;
isTrackEnabled: boolean;
kind: Track.Kind;
track: RemoteTrack | null;
}
export class RemoteTrackStats {
bytesReceived: number | null;
packetsReceived: number | null;
}
export class RemoteVideoTrack extends VideoTrack {
sid: Track.SID;
}
export class RemoteVideoTrackPublication extends RemoteTrackPublication {
kind: 'video';
track: RemoteVideoTrack | null;
}
export class RemoteVideoTrackStats extends RemoteTrackStats {
dimensions: VideoTrack.Dimensions | null;
frameRate: number | null;
}
export namespace Room {
type SID = string;
}
export class Room extends EventEmitter {
dominantSpeaker: RemoteParticipant | null;
isRecording: boolean;
localParticipant: LocalParticipant;
name: string;
participants: Map<Participant.SID, RemoteParticipant>;
sid: Room.SID;
state: string;
disconnect(): Room;
getStats(): Promise<StatsReport[]>;
}
export class RoomCompletedError extends TwilioError {
code: 53118;
message: 'Room completed';
}
export class RoomConnectFailedError extends TwilioError {
code: 53104;
message: 'Unable to connect to Room';
}
export class RoomCreateFailedError extends TwilioError {
code: 53103;
message: 'Unable to create Room';
}
export class RoomInvalidParametersError extends TwilioError {
code: 53114;
message: 'Room creation parameter(s) incompatible with the Room type';
}
export class RoomMaxParticipantsExceededError extends TwilioError {
code: 53105;
message: 'Room contains too many Participants';
}
export class RoomMaxParticipantsOutOfRangeError extends TwilioError {
code: 53107;
message: 'MaxParticipants is out of range';
}
export class RoomMediaRegionInvalidError extends TwilioError {
code: 53115;
message: 'MediaRegion is invalid';
}
export class RoomMediaRegionUnavailableError extends TwilioError {
code: 53116;
message: 'There are no media servers available in the MediaRegion';
}
export class RoomNameCharsInvalidError extends TwilioError {
code: 53102;
message: 'Room name contains invalid characters';
}
export class RoomNameInvalidError extends TwilioError {
code: 53100;
message: 'Room name is invalid';
}
export class RoomNameTooLongError extends TwilioError {
code: 53101;
message: 'Room name is too long';
}
export class RoomNotFoundError extends TwilioError {
code: 53106;
message: 'Room not found';
}
export class RoomRoomExistsError extends TwilioError {
code: 53113;
message: 'Room exists';
}
export class RoomStatusCallbackInvalidError extends TwilioError {
code: 53111;
message: 'StatusCallback is invalid';
}
export class RoomStatusCallbackMethodInvalidError extends TwilioError {
code: 53110;
message: 'StatusCallbackMethod is invalid';
}
export class RoomStatusInvalidError extends TwilioError {
code: 53112;
message: 'Status is invalid';
}
export class RoomSubscriptionOperationNotSupportedError extends TwilioError {
code: 53117;
message: 'The subscription operation requested is not supported for the Room type';
}
export class RoomTimeoutOutOfRangeError extends TwilioError {
code: 53109;
message: 'Timeout is out of range';
}
export class RoomTypeInvalidError extends TwilioError {
code: 53108;
message: 'RoomType is not valid';
}
export class SignalingConnectionDisconnectedError extends TwilioError {
code: 53001;
message: 'Signaling connection disconnected';
}
export class SignalingConnectionError extends TwilioError {
code: 53000;
message: 'Signaling connection error';
}
export class SignalingConnectionTimeoutError extends TwilioError {
code: 53002;
message: 'Signaling connection timed out';
}
export class SignalingIncomingMessageInvalidError extends TwilioError {
code: 53003;
message: 'Client received an invalid signaling message';
}
export class SignalingOutgoingMessageInvalidError extends TwilioError {
code: 53004;
message: 'Client sent an invalid signaling message';
}
export class StatsReport {
peerConnectionId: string;
localAudioTrackStats: LocalAudioTrackStats[];
localVideoTrackStats: LocalVideoTrackStats[];
remoteAudioTrackStats: RemoteAudioTrackStats[];
remoteVideoTrackStats: RemoteVideoTrackStats[];
}
export namespace Track {
type Kind = 'audio' | 'video' | 'data';
type ID = string;
type SID = string;
}
export class Track extends EventEmitter {
kind: Track.Kind;
name: string;
}
export class TrackInvalidError extends TwilioError {
code: 53300;
message: 'Track is invalid';
}
export class TrackNameCharsInvalidError extends TwilioError {
code: 53303;
message: 'Track name contains invalid characters';
}
export class TrackNameInvalidError extends TwilioError {
code: 53301;
message: 'Track name is invalid';
}
export class TrackNameIsDuplicatedError extends TwilioError {
code: 53304;
message: 'Track name is duplicated';
}
export class TrackNameTooLongError extends TwilioError {
code: 53302;
message: 'Track name is too long';
}
export class TrackPublication extends EventEmitter {
trackName: string;
trackSid: Track.SID;
}
export class TrackServerTrackCapacityReachedError extends TwilioError {
code: 53305;
message: 'The server has reached capacity and cannot fulfill this request.';
}
export class TrackStats {
trackId: Track.ID;
trackSid: Track.SID;
timestamp: number;
ssrc: string;
packetsLost: number | null;
codec: string | null;
}
export class TwilioError extends Error {
code: number;
toString(): string;
}
export namespace VideoTrack {
interface Dimensions {
width: number | null;
height: number | null;
}
}
export class VideoTrack extends Track {
isStarted: boolean;
isEnabled: boolean;
dimensions: VideoTrack.Dimensions;
kind: 'video';
mediaStreamTrack: MediaStreamTrack;
// Required for Safari if you want to detach without errors
// See: https://github.com/twilio/twilio-video.js/issues/294#issuecomment-389708981
_attachments?: HTMLMediaElement[];
attach(element?: HTMLMediaElement | string): HTMLVideoElement;
detach(element?: HTMLMediaElement | string): HTMLMediaElement[];
}
/**
* Global (https://media.twiliocdn.com/sdk/js/video/releases/2.0.0-beta1/docs/global.html)
*/
export const version: string;
/** Members */
export type AudioCodec = 'isac' | 'opus' | 'PCMA' | 'PCMU';
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'off';
export type VideoCodec = 'H264' | 'VP8' | 'VP9';
/** Methods */
export function connect(token: string, options?: ConnectOptions): Promise<Room>;
export function createLocalAudioTrack(options?: CreateLocalTrackOptions): Promise<LocalAudioTrack>;
export function createLocalTracks(options?: CreateLocalTracksOptions): Promise<LocalTrack[]>;
export function createLocalVideoTrack(options?: CreateLocalTrackOptions): Promise<LocalVideoTrack>;
export function isSupported(): boolean;
export function rewriteLocalTrackIds(room: Room, trackStats: LocalTrackStats[]): LocalTrackStats[];
/** Type Definitions */
export type AudioLevel = number;
export type AudioTrackPublication = LocalAudioTrackPublication | RemoteAudioTrackPublication;
export interface ConnectOptions {
abortOnIceServersTimeout?: boolean;
audio?: boolean | CreateLocalTrackOptions;
dominantSpeaker?: boolean;
iceServers?: RTCIceServer[];
iceServersTimeout?: number;
iceTransportPolicy?: RTCIceTransportPolicy;
insights?: boolean;
maxAudioBitRate?: number | null;
maxVideoBitRate?: number | null;
name?: string | null;
networkQuality?: boolean | NetworkQualityConfiguration;
preferredAudioCodecs?: AudioCodec[];
preferredVideoCodecs?: VideoCodec[] | VideoCodecSettings[];
logLevel?: LogLevel | LogLevels;
tracks?: LocalTrack[] | MediaStreamTrack[];
video?: boolean | CreateLocalTrackOptions;
}
export interface CreateLocalTrackOptions extends MediaTrackConstraints {
// In API reference logLevel is not optional, but in the Twilio examples it is
logLevel?: LogLevel | LogLevels;
name?: string;
workaroundWebKitBug180748?: boolean;
}
export interface CreateLocalTracksOptions {
audio?: boolean | CreateLocalTrackOptions;
logLevel?: LogLevel | LogLevels;
video?: boolean | CreateLocalTrackOptions;
}
export type DataTrack = LocalDataTrack | RemoteDataTrack;
export type DataTrackPublication = LocalDataTrackPublication | RemoteDataTrackPublication;
export interface EncodingParameters {
maxAudioBitrate?: number | null;
maxVideoBitrate?: number | null;
}
export interface LocalDataTrackOptions {
maxPacketLifeTime?: number | null;
maxRetransmits?: number | null;
ordered?: boolean;
}
export type LocalTrack = LocalAudioTrack | LocalVideoTrack | LocalDataTrack;
export interface LocalTrackOptions {
logLevel: LogLevel | LogLevels;
name?: string;
}
export interface LogLevels {
default: LogLevel;
media: LogLevel;
signaling: LogLevel;
webrtc: LogLevel;
}
export type NetworkQualityLevel = number;
export type NetworkQualityVerbosity = 0 | 1 | 2 | 3;
export interface NetworkQualityConfiguration {
local?: NetworkQualityVerbosity;
remote?: NetworkQualityVerbosity;
}
export type RemoteTrack = RemoteAudioTrack | RemoteVideoTrack | RemoteDataTrack;
export interface RemoteTrackPublicationOptions {
logLevel: LogLevel | LogLevels;
}
export interface TrackPublicationOptions {
logLevel: LogLevel | LogLevels;
}
export interface VideoCodecSettings {
codec: VideoCodec;
}
export type VideoTrackPublication = LocalVideoTrackPublication | RemoteVideoTrackPublication;
export interface VP8CodecSettings {
name: VideoCodec;
simulcast?: boolean;
}