import Listenable from '../../modules/util/Listenable'; import { isValidNumber } from '../../modules/util/MathUtil'; import { MediaType } from './MediaType'; import { VideoType } from './VideoType'; export type EndpointId = string; export type SourceName = string; export interface ISourceInfo { muted?: boolean; sourceName: SourceName; videoType?: string; } export interface IPeerMediaInfo { muted?: boolean; videoType?: string; } /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-empty-function */ /** * Generates a source name. * * @param {EndpointId} endpointId - Jitsi Endpoint Id. * @param {MediaType} mediaType - the media type string. * @param {number} trackIdx - Track index (or sender idx? - to be figured out) starting from 0. * @returns {SourceName} eg. endpointA-v0 */ export function getSourceNameForJitsiTrack(endpointId: EndpointId, mediaType: MediaType, trackIdx: number): SourceName { const firstLetterOfMediaType = mediaType.substring(0, 1); return `${endpointId}-${firstLetterOfMediaType}${trackIdx}`; } /** * Extracts MediaType from give source name (must be in the correct format as generated by * {@link getSourceNameForJitsiTrack}). * * @param {SourceName} sourceName - the source name. * @returns {MediaType} */ export function getMediaTypeFromSourceName(sourceName: SourceName): MediaType { const firstLetterOfMediaTypeIdx = sourceName.lastIndexOf('-') + 1; if (firstLetterOfMediaTypeIdx <= 0) { throw new Error(`Invalid source name: ${sourceName}`); } const firstLetterOfMediaType = sourceName.substr(firstLetterOfMediaTypeIdx, 1); if (firstLetterOfMediaType === 'v') { return MediaType.VIDEO; } else if (firstLetterOfMediaType === 'a') { return MediaType.AUDIO; } throw new Error(`Invalid source name: ${sourceName}`); } /** * Extracts source index (zero based) from a given source name (must be in the correct format as generated by * {@link getSourceNameForJitsiTrack}). * * @param {SourceName} sourceName - the source name, eg. endpointA-v0. * @returns {number} */ export function getSourceIndexFromSourceName(sourceName: SourceName): number { const nameParts = sourceName.split('-'); const trackIdx = Number(nameParts[nameParts.length - 1].substring(1)); if (!isValidNumber(trackIdx)) { throw new Error(`Failed to parse track idx for source name: ${sourceName}`); } return trackIdx; } /** * An object that carries the info about specific media type advertised by * participant in the signaling channel. * @typedef {Object} IPeerMediaInfo * @property {boolean} muted indicates if the media is currently muted * @property {VideoType|undefined} videoType the type of the video if applicable */ /** * Interface used to expose the information carried over the signaling channel * which is not available to the RTC module in the media SDP. * * @interface SignalingLayer */ export default class SignalingLayer extends Listenable { /** * Obtains the info about given media advertised in the MUC presence of * the participant identified by the given MUC JID. * @param {string} owner the MUC jid of the participant for whom * {@link PeerMediaInfo} will be obtained. * @param {MediaType} mediaType the type of the media for which presence * @param {SourceName} sourceName - The name of the source for which the info is to be obtained. * info will be obtained. * @return {IPeerMediaInfo|null} presenceInfo an object with media presence * info or null either if there is no presence available for given * JID or if the media type given is invalid. * * @deprecated This method is to be replaced with getPeerSourceInfo. */ getPeerMediaInfo( owner: string, mediaType: MediaType, sourceName: SourceName ): IPeerMediaInfo | null { throw new Error('not implemented'); } /** * Obtains the info about a source for given name and endpoint ID. * @param {EndpointId} owner - The owner's endpoint ID. * @param {SourceName} sourceName - The name of the source for which the info is to be obtained. * @returns {ISourceInfo | undefined} */ getPeerSourceInfo( owner: EndpointId, sourceName: SourceName ): ISourceInfo | undefined { throw new Error('not implemented'); } /** * Obtains the endpoint ID for given SSRC. * @param {number} ssrc the SSRC number. * @return {string|null} the endpoint ID for given media SSRC. */ getSSRCOwner(ssrc: number): string | null { throw new Error('not implemented'); } /** * Obtains the source name for given SSRC. * @param {number} ssrc the track's SSRC identifier. * @returns {SourceName | undefined} the track's source name. */ getTrackSourceName(ssrc: number): SourceName | undefined { throw new Error('not implemented'); } /** * Removes the association between a given SSRC and its current owner so that it can re-used when the SSRC gets * remapped to another source from a different endpoint. * @param {number} ssrc a list of SSRCs. */ removeSSRCOwners(ssrcList: number[]): void { } /** * Set an SSRC owner. * * @param {number} ssrc - An SSRC to be owned. * @param {string} endpointId - Owner's ID (MUC nickname). * @param {string} sourceName - The related source name. * @throws TypeError if ssrc is not a number. */ setSSRCOwner(ssrc: number, endpointId: string, sourceName: string): void { } /** * Adjusts muted status of given track. * * @param {SourceName} sourceName - the name of the track's source. * @param {boolean} muted - the new muted status. * @returns {boolean} */ setTrackMuteStatus(sourceName: SourceName, muted: boolean) { } /** * Sets track's video type. * @param {SourceName} sourceName - the track's source name. * @param {VideoType} videoType - the new video type. * @returns {boolean} */ setTrackVideoType(sourceName: SourceName, videoType: VideoType) { } /** * Removes the SSRCs associated with a given endpoint from the SSRC owners. * * @param {string} id endpoint id of the participant leaving the call. * @returns {void} */ updateSsrcOwnersOnLeave(id: string): void { } }