@100mslive/hms-video-store
Version:
@100mslive Core SDK which abstracts the complexities of webRTC while providing a reactive store for data management with a unidirectional data flow
91 lines (81 loc) • 2.64 kB
text/typescript
import { HMSMediaStream } from './HMSMediaStream';
import HMSSubscribeConnection from '../../connection/subscribe/subscribeConnection';
import { HMSSimulcastLayer } from '../../interfaces';
import HMSLogger from '../../utils/logger';
/** @internal */
export class HMSRemoteStream extends HMSMediaStream {
private readonly connection: HMSSubscribeConnection;
private audio = true;
private video = HMSSimulcastLayer.NONE;
constructor(nativeStream: MediaStream, connection: HMSSubscribeConnection) {
super(nativeStream);
this.connection = connection;
}
async setAudio(enabled: boolean, trackId: string, identifier?: string) {
if (this.audio === enabled) {
return;
}
this.audio = enabled;
HMSLogger.d(
`[Remote stream] ${identifier || ''}
streamId=${this.id}
trackId=${trackId}
subscribing audio - ${this.audio}`,
);
await this.connection.sendOverApiDataChannelWithResponse({
params: {
subscribed: this.audio,
track_id: trackId,
},
method: 'prefer-audio-track-state',
});
}
/**
* Sets the video layer after receiving new state from SFU. This is used when server side subscribe
* degradation is ON.
* @param layer is simulcast layer to be set
* @param identifier is stream identifier to be printed in logs
*/
setVideoLayerLocally(layer: HMSSimulcastLayer, identifier: string, source: string) {
this.video = layer;
HMSLogger.d(`[Remote stream] ${identifier}
streamId=${this.id}
source: ${source}
Setting layer field to=${layer}`);
}
/**
* Sets the video layer and updates the track state to SFU via api datachannel. This is used when client
* side subscribe degradation is ON or client unsubscribes the current track.
* @param layer is simulcast layer to be set
* @param identifier is stream identifier to be printed in logs
*/
setVideoLayer(layer: HMSSimulcastLayer, trackId: string, identifier: string, source: string) {
HMSLogger.d(
`[Remote stream] ${identifier}
streamId=${this.id}
trackId=${trackId}
source: ${source} request ${layer} layer`,
);
this.setVideoLayerLocally(layer, identifier, source);
return this.connection.sendOverApiDataChannelWithResponse({
params: {
max_spatial_layer: this.video,
track_id: trackId,
},
method: 'prefer-video-track-state',
});
}
/**
* @deprecated
* @returns {HMSSimulcastLayer}
*/
getSimulcastLayer() {
return this.video;
}
getVideoLayer() {
return this.video;
}
isAudioSubscribed() {
return this.audio;
}
}