@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
62 lines (54 loc) • 2.3 kB
text/typescript
import { Subscribe } from 'zustand/vanilla';
import { HMSReactiveStore } from './internal';
import { subscribeToSdkWebrtcStats } from './webrtc-stats-store';
import { storeNameWithTabTitle } from '../common/storeName';
import { GetState, IHMSStatsStore, IHMSStatsStoreReadOnly, IHMSStore } from '../IHMSStore';
import { createDefaultStatsStore, HMSStatsStore } from '../schema';
import { HMSSdk } from '../sdk';
import { selectRoomState } from '../selectors';
/**
* @internal
*/
export class HMSStats implements IHMSStatsStoreReadOnly {
readonly getState: GetState<HMSStatsStore>;
readonly subscribe: Subscribe<HMSStatsStore>;
readonly getPublishPeerConnection: () => Promise<RTCPeerConnection | undefined>;
readonly getSubscribePeerConnection: () => Promise<RTCPeerConnection | undefined>;
private readonly store: IHMSStatsStore;
constructor(private hmsStore: IHMSStore, private sdk?: HMSSdk) {
this.store = HMSReactiveStore.createNewHMSStore<HMSStatsStore>(
storeNameWithTabTitle('HMSStatsStore'),
createDefaultStatsStore,
);
this.getState = this.store.getState;
this.subscribe = this.store.subscribe;
this.getPublishPeerConnection = () =>
new Promise<RTCPeerConnection | undefined>(resolve => {
if (this.hmsStore.getState(selectRoomState) === 'Connected') {
resolve(this.sdk?.getWebrtcInternals()?.getPublishPeerConnection());
} else {
this.hmsStore.subscribe(roomState => {
if (roomState === 'Connected') {
resolve(this.sdk?.getWebrtcInternals()?.getPublishPeerConnection());
}
}, selectRoomState);
}
});
this.getSubscribePeerConnection = () =>
new Promise<RTCPeerConnection | undefined>(resolve => {
if (this.hmsStore.getState(selectRoomState) === 'Connected') {
resolve(this.sdk?.getWebrtcInternals()?.getSubscribePeerConnection());
} else {
this.hmsStore.subscribe(roomState => {
if (roomState === 'Connected') {
resolve(this.sdk?.getWebrtcInternals()?.getSubscribePeerConnection());
}
}, selectRoomState);
}
});
if (!this.sdk) {
return;
}
subscribeToSdkWebrtcStats(this.sdk, this.store, this.hmsStore);
}
}