@100mslive/hms-video-store 0.10.21 → 0.10.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../package.json", "../src/index.ts", "../src/core/schema/room.ts", "../src/core/schema/schema.ts", "../src/core/schema/message.ts", "../src/core/schema/notification.ts", "../src/core/schema/playlist.ts", "../src/core/selectors/selectors.ts", "../src/core/selectors/selectorUtils.ts", "../src/core/selectors/playlistselectors.ts", "../src/core/selectors/selectorsByID.ts", "../src/core/selectors/common.ts", "../src/core/hmsSDKStore/sdkTypes.ts", "../src/common/ui-logger.ts", "../src/core/selectors/derivedSelectors.ts", "../src/core/selectors/selectorsByReference.ts", "../src/core/hmsSDKStore/sdkUtils/storeMergeUtils.ts", "../src/core/webrtc-stats/webrtc-stats-store.ts", "../src/common/storeName.ts", "../src/core/hmsSDKStore/HMSReactiveStore.ts", "../src/core/hmsSDKStore/HMSNotifications.ts", "../src/core/hmsSDKStore/common/mapping.ts", "../src/core/hmsSDKStore/HMSSDKActions.ts", "../src/core/hmsSDKStore/sdkUtils/sdkUtils.ts", "../src/core/hmsSDKStore/adapter.ts", "../src/core/hmsSDKStore/HMSInteractivityCenter.ts", "../src/core/hmsSDKStore/HMSPlaylist.ts", "../src/core/hmsSDKStore/HMSSessionStore.ts", "../src/controller/beam/BeamSpeakerLabelsLogger.ts", "../src/core/webrtc-stats/HMSStats.ts", "../src/core/webrtc-stats/selectors.ts"],
4
- "sourcesContent": ["{\n \"version\": \"0.10.21\",\n \"license\": \"MIT\",\n \"main\": \"dist/index.cjs.js\",\n \"module\": \"dist/index.js\",\n \"typings\": \"dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"src\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs.js\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"scripts\": {\n \"prestart\": \"rm -rf dist && yarn types:build\",\n \"start\": \"concurrently \\\"yarn dev\\\" \\\"yarn types\\\"\",\n \"dev\": \"node ../../scripts/dev\",\n \"build:only\": \"node ../../scripts/build\",\n \"build\": \"yarn build:only && yarn types:build\",\n \"types\": \"tsc -w\",\n \"types:build\": \"tsc -p tsconfig.json\",\n \"format\": \"prettier --write src/**/*.ts\",\n \"test\": \"jest --maxWorkers=1\",\n \"test:watch\": \"jest --watch\",\n \"test:coverage\": \"jest --coverage\",\n \"lint\": \"eslint -c ../../.eslintrc .\",\n \"lint:fix\": \"yarn lint --fix\",\n \"prepare\": \"yarn build\",\n \"size\": \"size-limit\",\n \"analyze\": \"size-limit --why\",\n \"docs\": \"rm -rf ./docs && typedoc && rm -f ./docs/README.md && mkdir ./docs/home &&mv ./docs/modules.md ./docs/home/content.md && node ../../scripts/docs-store && npx prettier --write './docs/**/*'\"\n },\n \"name\": \"@100mslive/hms-video-store\",\n \"author\": \"100ms\",\n \"sideEffects\": false,\n \"dependencies\": {\n \"@100mslive/hms-video\": \"0.9.21\",\n \"eventemitter2\": \"^6.4.7\",\n \"immer\": \"^9.0.6\",\n \"reselect\": \"4.0.0\",\n \"zustand\": \"3.5.7\"\n },\n \"devDependencies\": {\n \"jsdom-worker\": \"^0.3.0\",\n \"ts-node\": \"^10.4.0\",\n \"tslib\": \"^2.2.0\"\n },\n \"description\": \"@100mslive Core SDK which abstracts the complexities of webRTC while providing a reactive store for data management with a unidirectional data flow\",\n \"keywords\": [\n \"video\",\n \"webrtc\",\n \"conferencing\",\n \"100ms\"\n ],\n \"gitHead\": \"b2409381228fa1a60f446f7873086440578f704f\"\n}\n", "export * from './core';\nexport { HMSReactiveStore } from './core/hmsSDKStore/HMSReactiveStore';\n", "import { HLSVariant, HMSHLS, HMSRecording, HMSRTMP } from '@100mslive/hms-video';\nimport { HMSPeerID } from './peer';\n\nexport type { HMSRecording, HMSRTMP, HMSHLS, HLSVariant };\nexport type HMSRoomID = string;\n\n/**\n * Check out internal-docs/RoomStateFlow.tldr for flow of room state\n * View it by\n * - Installing tldraw for VSCode(https://marketplace.visualstudio.com/items?itemName=tldraw-org.tldraw-vscode), or\n * - Open the file in https://www.tldraw.com/\n */\nexport enum HMSRoomState {\n Disconnected = 'Disconnected',\n Preview = 'Preview',\n Connecting = 'Connecting',\n Connected = 'Connected',\n Reconnecting = 'Reconnecting',\n Disconnecting = 'Disconnecting',\n Failed = 'Failed',\n}\n\nexport interface HMSRoom {\n id: HMSRoomID;\n name: string;\n isConnected?: boolean;\n peers: HMSPeerID[];\n localPeer: HMSPeerID;\n roomState: HMSRoomState;\n recording: HMSRecording;\n rtmp: HMSRTMP;\n hls: HMSHLS;\n sessionId: string;\n startedAt?: Date;\n joinedAt?: Date;\n /**\n * if this number is available room.peers is not guaranteed to have all the peers.\n */\n peerCount?: number;\n isLargeRoom?: boolean;\n}\n", "import { HMSException } from './error';\nimport { HMSMessage, HMSMessageID } from './message';\nimport { HMSPeer, HMSPeerID, HMSSpeaker, HMSTrack, HMSTrackID } from './peer';\nimport { HMSPlaylist } from './playlist';\nimport { HMSRoleChangeStoreRequest } from './requests';\nimport { HMSRole } from './role';\nimport { HMSRoom, HMSRoomState } from './room';\nimport { HMSMediaSettings } from './settings';\nimport { DeviceMap, HMSConnectionQuality, HMSPeerStats, HMSPoll, HMSTrackStats } from '../hmsSDKStore/sdkTypes';\n\nexport interface HMSGenericTypes {\n sessionStore: Record<string, any>;\n}\n\n/*\n * Defines the schema of the central store. UI Components are aware of the presence\n * of this central store. This is the global state - the single source of immutable truth.\n */\nexport interface HMSStore<T extends HMSGenericTypes = { sessionStore: Record<string, any> }> {\n room: HMSRoom;\n peers: Record<HMSPeerID, HMSPeer>;\n speakers: Record<HMSTrackID, HMSSpeaker>;\n connectionQualities: Record<HMSPeerID, HMSConnectionQuality>;\n tracks: Record<HMSTrackID, HMSTrack>;\n playlist: HMSPlaylist<any>;\n messages: {\n byID: Record<HMSMessageID, HMSMessage>;\n allIDs: HMSMessageID[];\n };\n settings: HMSMediaSettings;\n devices: DeviceMap;\n roles: Record<string, HMSRole>;\n templateAppData: Record<string, string>;\n appData?: Record<string, any>;\n roleChangeRequests: HMSRoleChangeStoreRequest[];\n /** @deprecated use `sessionStore` instead */\n sessionMetadata?: any;\n preview?: {\n localPeer?: HMSPeerID;\n asRole?: string;\n videoTrack?: HMSTrackID;\n audioTrack?: HMSTrackID;\n };\n errors: HMSException[]; // for the convenience of debugging and seeing any error in devtools\n sessionStore: T['sessionStore'];\n polls: Record<string, HMSPoll>;\n /** @internal */\n hideLocalPeer: boolean;\n}\n\nexport interface HMSStatsStore {\n remoteTrackStats: Record<HMSTrackID, HMSTrackStats | undefined>;\n localTrackStats: Record<HMSTrackID, HMSTrackStats[] | undefined>;\n peerStats: Record<HMSPeerID, HMSPeerStats | undefined>;\n localPeer: {\n id: HMSPeerID;\n videoTrack?: HMSTrackID;\n audioTrack?: HMSTrackID;\n };\n}\n\n/**\n * @internal\n */\nexport const createDefaultStoreState = <T extends HMSGenericTypes>(): HMSStore<T> => {\n return {\n room: {\n id: '',\n isConnected: false,\n name: '',\n peers: [],\n localPeer: '',\n roomState: HMSRoomState.Disconnected,\n recording: {\n browser: {\n running: false,\n },\n server: {\n running: false,\n },\n hls: { running: false },\n },\n rtmp: {\n running: false,\n },\n hls: {\n running: false,\n variants: [],\n },\n sessionId: '',\n },\n peers: {},\n tracks: {},\n playlist: {\n audio: {\n list: {},\n selection: { id: '', hasPrevious: false, hasNext: false },\n progress: 0,\n volume: 0,\n currentTime: 0,\n playbackRate: 1.0,\n },\n video: {\n list: {},\n selection: { id: '', hasPrevious: false, hasNext: false },\n progress: 0,\n volume: 0,\n currentTime: 0,\n playbackRate: 1.0,\n },\n },\n messages: { byID: {}, allIDs: [] },\n speakers: {},\n connectionQualities: {},\n settings: {\n audioInputDeviceId: '',\n audioOutputDeviceId: '',\n videoInputDeviceId: '',\n },\n devices: {\n audioInput: [],\n audioOutput: [],\n videoInput: [],\n },\n roles: {},\n roleChangeRequests: [],\n errors: [],\n sessionStore: {},\n templateAppData: {},\n polls: {},\n hideLocalPeer: false,\n };\n};\n\nexport const createDefaultStatsStore = (): HMSStatsStore => {\n return {\n peerStats: {},\n remoteTrackStats: {},\n localTrackStats: {},\n localPeer: { id: '' },\n };\n};\n", "import { HMSPeerID } from './peer';\nimport { HMSRoleName } from './role';\n\nexport type HMSMessageID = string;\n\n/**\n * @internal\n */\nexport enum HMSMessageType {\n CHAT = 'chat',\n}\n\nexport interface HMSMessage {\n id: HMSMessageID;\n sender?: HMSPeerID;\n senderName?: string;\n senderUserId?: string;\n senderRole?: string;\n recipientPeer?: HMSPeerID;\n recipientRoles?: HMSRoleName[];\n time: Date;\n read: boolean;\n type: string;\n message: any;\n /**\n * true if message will not be put it in store because it has been ignored\n */\n ignored: boolean;\n}\n\n/**\n * @internal\n */\nexport interface HMSMessageInput {\n recipientPeer?: HMSPeerID;\n recipientRoles?: HMSRoleName[];\n type?: string;\n message: any;\n}\n", "import { HMSPoll } from '@100mslive/hms-video';\nimport { HMSDeviceChangeEvent } from './device-change';\nimport { HMSException } from './error';\nimport { HMSMessage } from './message';\nimport { HMSPeer, HMSTrack } from './peer';\nimport { HMSPlaylistItem } from './playlist';\nimport { HMSChangeMultiTrackStateRequest, HMSChangeTrackStateRequest, HMSLeaveRoomRequest } from './requests';\n\ninterface BaseNotification {\n id: number;\n type: string;\n message: string;\n severity?: HMSNotificationSeverity;\n}\nexport interface HMSPeerNotification extends BaseNotification {\n type:\n | HMSNotificationTypes.PEER_JOINED\n | HMSNotificationTypes.PEER_LEFT\n | HMSNotificationTypes.NAME_UPDATED\n | HMSNotificationTypes.METADATA_UPDATED\n | HMSNotificationTypes.ROLE_UPDATED\n | HMSNotificationTypes.HAND_RAISE_CHANGED;\n data: HMSPeer;\n}\n\nexport interface HMSPeerListNotification extends BaseNotification {\n type: HMSNotificationTypes.PEER_LIST;\n data: HMSPeer[];\n}\nexport interface HMSTrackNotification extends BaseNotification {\n type:\n | HMSNotificationTypes.TRACK_ADDED\n | HMSNotificationTypes.TRACK_DEGRADED\n | HMSNotificationTypes.TRACK_UNMUTED\n | HMSNotificationTypes.TRACK_DESCRIPTION_CHANGED\n | HMSNotificationTypes.TRACK_MUTED\n | HMSNotificationTypes.TRACK_REMOVED\n | HMSNotificationTypes.TRACK_RESTORED;\n data: HMSTrack;\n}\nexport interface HMSMessageNotification extends BaseNotification {\n type: HMSNotificationTypes.NEW_MESSAGE;\n data: HMSMessage;\n}\nexport interface HMSExceptionNotification extends BaseNotification {\n type: HMSNotificationTypes.ERROR;\n data: HMSException;\n}\nexport interface HMSChangeTrackStateRequestNotification extends BaseNotification {\n type: HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST;\n data: HMSChangeTrackStateRequest;\n}\nexport interface HMSChangeMultiTrackStateRequestNotification extends BaseNotification {\n type: HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST;\n data: HMSChangeMultiTrackStateRequest;\n}\n\nexport interface HMSLeaveRoomRequestNotification extends BaseNotification {\n type: HMSNotificationTypes.ROOM_ENDED | HMSNotificationTypes.REMOVED_FROM_ROOM;\n data: HMSLeaveRoomRequest;\n}\nexport interface HMSDeviceChangeEventNotification extends BaseNotification {\n type: HMSNotificationTypes.DEVICE_CHANGE_UPDATE;\n data?: HMSDeviceChangeEvent;\n}\nexport interface HMSPlaylistItemNotification<T> extends BaseNotification {\n type: HMSNotificationTypes.PLAYLIST_TRACK_ENDED;\n data: HMSPlaylistItem<T>;\n}\n\nexport interface HMSReconnectionNotification extends BaseNotification {\n type: HMSNotificationTypes.RECONNECTED | HMSNotificationTypes.RECONNECTING;\n data: HMSException | null;\n}\n\nexport interface HMSPollNotification extends BaseNotification {\n type: HMSNotificationTypes.POLL_STARTED | HMSNotificationTypes.POLL_STOPPED | HMSNotificationTypes.POLL_VOTES_UPDATED;\n data: HMSPoll;\n}\n\nexport type HMSNotification =\n | HMSPeerNotification\n | HMSPeerListNotification\n | HMSTrackNotification\n | HMSMessageNotification\n | HMSExceptionNotification\n | HMSChangeTrackStateRequestNotification\n | HMSChangeMultiTrackStateRequestNotification\n | HMSLeaveRoomRequestNotification\n | HMSDeviceChangeEventNotification\n | HMSReconnectionNotification\n | HMSPlaylistItemNotification<any>;\n\nexport enum HMSNotificationSeverity {\n INFO = 'info',\n ERROR = 'error',\n}\n\nexport enum HMSNotificationTypes {\n PEER_JOINED = 'PEER_JOINED',\n PEER_LEFT = 'PEER_LEFT',\n PEER_LIST = 'PEER_LIST',\n NEW_MESSAGE = 'NEW_MESSAGE',\n ERROR = 'ERROR',\n RECONNECTING = 'RECONNECTING',\n RECONNECTED = 'RECONNECTED',\n TRACK_ADDED = 'TRACK_ADDED',\n TRACK_REMOVED = 'TRACK_REMOVED',\n TRACK_MUTED = 'TRACK_MUTED',\n TRACK_UNMUTED = 'TRACK_UNMUTED',\n TRACK_DEGRADED = 'TRACK_DEGRADED',\n TRACK_RESTORED = 'TRACK_RESTORED',\n TRACK_DESCRIPTION_CHANGED = 'TRACK_DESCRIPTION_CHANGED',\n ROLE_UPDATED = 'ROLE_UPDATED',\n CHANGE_TRACK_STATE_REQUEST = 'CHANGE_TRACK_STATE_REQUEST',\n CHANGE_MULTI_TRACK_STATE_REQUEST = 'CHANGE_MULTI_TRACK_STATE_REQUEST',\n ROOM_ENDED = 'ROOM_ENDED',\n REMOVED_FROM_ROOM = 'REMOVED_FROM_ROOM',\n DEVICE_CHANGE_UPDATE = 'DEVICE_CHANGE_UPDATE',\n PLAYLIST_TRACK_ENDED = 'PLAYLIST_TRACK_ENDED',\n NAME_UPDATED = 'NAME_UPDATED',\n METADATA_UPDATED = 'METADATA_UPDATED',\n POLL_CREATED = 'POLL_CREATED',\n POLL_STARTED = 'POLL_STARTED',\n POLL_STOPPED = 'POLL_STOPPED',\n POLL_VOTES_UPDATED = 'POLL_VOTES_UPDATED',\n HAND_RAISE_CHANGED = 'HAND_RAISE_CHANGED',\n}\n\nexport type HMSNotificationMapping<T extends HMSNotificationTypes, C = any> = {\n [HMSNotificationTypes.PEER_JOINED]: HMSPeerNotification;\n [HMSNotificationTypes.PEER_LEFT]: HMSPeerNotification;\n [HMSNotificationTypes.PEER_LIST]: HMSPeerListNotification;\n [HMSNotificationTypes.NAME_UPDATED]: HMSPeerNotification;\n [HMSNotificationTypes.METADATA_UPDATED]: HMSPeerNotification;\n [HMSNotificationTypes.ROLE_UPDATED]: HMSPeerNotification;\n [HMSNotificationTypes.TRACK_ADDED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_REMOVED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_MUTED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_UNMUTED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_DEGRADED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_RESTORED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_DESCRIPTION_CHANGED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_UNMUTED]: HMSTrackNotification;\n [HMSNotificationTypes.NEW_MESSAGE]: HMSMessageNotification;\n [HMSNotificationTypes.ROOM_ENDED]: HMSLeaveRoomRequestNotification;\n [HMSNotificationTypes.REMOVED_FROM_ROOM]: HMSLeaveRoomRequestNotification;\n [HMSNotificationTypes.DEVICE_CHANGE_UPDATE]: HMSDeviceChangeEventNotification;\n [HMSNotificationTypes.PLAYLIST_TRACK_ENDED]: HMSPlaylistItemNotification<C>;\n [HMSNotificationTypes.ERROR]: HMSExceptionNotification;\n [HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST]: HMSChangeTrackStateRequestNotification;\n [HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST]: HMSChangeMultiTrackStateRequestNotification;\n [HMSNotificationTypes.RECONNECTED]: HMSReconnectionNotification;\n [HMSNotificationTypes.RECONNECTING]: HMSReconnectionNotification;\n [HMSNotificationTypes.POLL_STARTED]: HMSPollNotification;\n [HMSNotificationTypes.POLL_STOPPED]: HMSPollNotification;\n [HMSNotificationTypes.POLL_VOTES_UPDATED]: HMSPollNotification;\n [HMSNotificationTypes.POLL_CREATED]: HMSPollNotification;\n [HMSNotificationTypes.HAND_RAISE_CHANGED]: HMSPeerNotification;\n}[T];\n\nexport type MappedNotifications<Type extends HMSNotificationTypes[]> = {\n [index in keyof Type]: HMSNotificationMapping<Type[index]>;\n};\n\nexport type HMSNotificationTypeParam = HMSNotificationTypes | HMSNotificationTypes[] | undefined;\n\nexport type HMSNotificationInCallback<T extends HMSNotificationTypeParam> = T extends HMSNotificationTypes[]\n ? MappedNotifications<T>[number]\n : T extends HMSNotificationTypes\n ? HMSNotificationMapping<T>\n : HMSNotification;\n\nexport type HMSNotificationCallback<T extends HMSNotificationTypeParam> = (\n notification: HMSNotificationInCallback<T>,\n) => void;\n\n/**\n * @category Core\n */\nexport interface IHMSNotifications {\n /**\n * you can subscribe to notifications for new message, peer add etc. using this function.\n * note that this is not meant to maintain any state on your side, as the reactive store already\n * does that. The intent of this function is mainly to display toast notifications or send analytics.\n * We'll provide a display message which can be displayed as it is for common cases.\n */\n onNotification<T extends HMSNotificationTypeParam>(cb: HMSNotificationCallback<T>, types?: T): () => void;\n}\n", "export enum HMSPlaylistType {\n audio = 'audio',\n video = 'video',\n}\nexport interface HMSPlaylistItem<T> {\n name: string;\n id: string;\n metadata?: T;\n url: string;\n type: HMSPlaylistType;\n duration?: number;\n playing: boolean;\n selected: boolean;\n}\n\nexport interface HMSPlaylistSelection {\n id: string;\n hasPrevious: boolean;\n hasNext: boolean;\n}\n\nexport interface HMSPlaylist<T> {\n audio: {\n list: Record<string, HMSPlaylistItem<T>>;\n selection: HMSPlaylistSelection;\n progress: number;\n volume: number;\n currentTime: number;\n playbackRate: number;\n };\n video: {\n list: Record<string, HMSPlaylistItem<T>>;\n selection: HMSPlaylistSelection;\n progress: number;\n volume: number;\n currentTime: number;\n playbackRate: number;\n };\n}\n\nexport interface IHMSPlaylistActions {\n /**\n * Pass the id of the item to be played\n * @param {string} id - id of playlist item\n */\n play(id: string): Promise<void>;\n /**\n * Pauses current playing item\n */\n pause(): Promise<void>;\n /**\n * PlayNext\n */\n playNext(): Promise<void>;\n /**\n * PlayPrevious\n */\n playPrevious(): Promise<void>;\n /**\n * seek passing seekValue - this is relative to current position\n * @param {number} seekValue - number in seconds to move forwards(pass negative values to move backwards)\n */\n seek(seekValue: number): void;\n /**\n * seek passing seekValue - seekValue will be absolute\n * @param {number} seekValue - value in seconds of absolute position in the playlist item duration\n */\n seekTo(seekValue: number): void;\n /**\n * set volume passing volume\n * @param {number} volume - number between 0-100\n */\n setVolume(volume: number): void;\n /**\n * pass list to set playlist\n * @param {HMSPlaylistItem[]} list of playlist items\n */\n setList<T>(list: HMSPlaylistItem<T>[]): void;\n /**\n * Stop the current playback and remove the tracks\n */\n stop(): Promise<void>;\n /**\n * set whether to autoplay next item in playlist after the current one ends\n * @param {boolean} autoplay\n */\n setIsAutoplayOn(autoplay: boolean): void;\n /**\n * Control the playback speed - 1.0 being normal, less than 1.0 will play it slowly\n * and more than 1.0 will play it faster.\n * @param playbackRate - value from 0.25 and 2.0\n */\n setPlaybackRate(playbackRate: number): void;\n removeItem(id: string): Promise<boolean>;\n clearList(): Promise<void>;\n}\n", "import { createSelector } from 'reselect';\nimport {\n getScreenSharesByPeer,\n isAudioPlaylist,\n isDegraded,\n isTrackDisplayEnabled,\n isTrackEnabled,\n isVideo,\n isVideoPlaylist,\n} from './selectorUtils';\n// noinspection ES6PreferShortImport\nimport { HMSRole } from '../hmsSDKStore/sdkTypes';\nimport {\n HMSException,\n HMSMessage,\n HMSPeer,\n HMSPeerID,\n HMSRoom,\n HMSRoomState,\n HMSStore,\n HMSVideoTrack,\n} from '../schema';\n\n/**\n * Select the current {@link HMSRoom} object to which you are connected.\n * @param store\n */\nexport const selectRoom = (store: HMSStore): HMSRoom => store.room;\n/**\n * Select the current {@link HMSException[]} object to monitor the error logs\n * @param store\n */\nexport const selectErrors = (store: HMSStore): HMSException[] => store.errors;\n\n/**\n * It will help to get the all the error\n */\nexport const selectRecentError = createSelector(selectErrors, errors => (errors.length === 0 ? null : errors.at(-1)));\n/**\n * Select the ID of the current room to which you are connected.\n */\nexport const selectRoomID = createSelector(selectRoom, room => room.id);\n\n/**\n * @internal\n */\nexport const selectPeersMap = (store: HMSStore): Record<HMSPeerID, HMSPeer> => store.peers;\n\n/**\n * @internal\n */\nexport const selectMessagesMap = (store: HMSStore) => store.messages.byID;\n\n/**\n * Select IDs of messages you've sent or received sorted chronologically.\n */\nexport const selectMessageIDsInOrder = (store: HMSStore) => store.messages.allIDs;\n\n/**\n * @internal\n */\nexport const selectTracksMap = (store: HMSStore) => store.tracks;\n\n/**\n * Select your media settings\n * i.e., choosen audio input device, audio output device and video input device.\n * @param store\n */\nexport const selectLocalMediaSettings = (store: HMSStore) => store.settings;\n\n/**\n * select appData.\n * @internal\n */\nexport const selectFullAppData = (store: HMSStore) => store.appData;\n\n/**\n * Select the available audio input, audio output and video input devices on your machine.\n * @param store\n * @returns An object of array of available audio input, audio output and video input devices.\n * ```\n * type DeviceMap = {\n * audioInput: InputDeviceInfo[];\n * audioOutput: MediaDeviceInfo[];\n * videoInput: InputDeviceInfo[];\n * }\n * ```\n */\nexport const selectDevices = (store: HMSStore) => {\n return store.devices;\n};\n\nexport const selectSpeakers = (store: HMSStore) => {\n return store.speakers;\n};\n\nexport const selectConnectionQualities = (store: HMSStore) => {\n return store.connectionQualities;\n};\n\n/**\n * Select a boolean flag denoting whether you've joined a room.\n * NOTE: Returns true only after join, returns false during preview.\n */\nexport const selectIsConnectedToRoom = createSelector([selectRoom], room => room && room.isConnected);\n\n/**\n * selectPeerCount gives the number of peers Inside the room. This doesn't count the local peer if\n * they're still in preview and haven't yet joined the room. Note that this will not necessarily equal the\n * number of peers received through selectPeers, it's possible to know total number of people in the room\n * without having details of everyone depending on dashboard settings.\n */\nexport const selectPeerCount = createSelector([selectIsConnectedToRoom, selectRoom], (isConnected, room) => {\n if (isConnected) {\n // if we have peer count from server return that else return number of peers in the store.\n // In case the strongly consistent peer list is disabled and only eventual consistent count and peer\n // details is sent, room.peerCount may be 0 for a few second even though local peer is connected, send 1 in that case.\n // TODO: Fix this at populating room.peerCount level than in selector.\n return room.peerCount !== undefined ? room.peerCount || 1 : room.peers.length;\n } else {\n // if we have peer count from server return that, else return number of peers except the local one because local is\n // not joined yet.\n // Math.max to ensure we're not returning -1, if the selector is called before local peer is put in the store\n return Math.max(room.peerCount !== undefined ? room.peerCount : room.peers.length - 1, 0);\n }\n});\n\n/**\n * @internal\n * Select a boolean flag denoting whether to hide local peer.\n * When this is true, `selectPeers` skips local peer.\n */\nconst selectHideLocalPeer = (store: HMSStore): boolean => store.hideLocalPeer;\n\n/**\n * Select an array of peers(remote peers and your local peer) present in the room.\n */\nexport const selectPeers = createSelector(\n [selectRoom, selectPeersMap, selectHideLocalPeer],\n (room, storePeers, hideLocalPeer) => {\n if (hideLocalPeer) {\n return room.peers.filter(peerID => room.localPeer !== peerID).map(peerID => storePeers[peerID]);\n }\n return room.peers.map(peerID => storePeers[peerID]);\n },\n);\n\n/**\n * Select an array of tracks(remote peer tracks and your local tracks) present in the room.\n */\nconst selectTracks = createSelector(selectTracksMap, storeTracks => {\n return Object.values(storeTracks);\n});\n\n/**\n * Select the local peer object object assigned to you.\n */\nexport const selectLocalPeer = createSelector(selectRoom, selectPeersMap, (room, peers): HMSPeer | undefined => {\n return peers[room.localPeer];\n});\n\n/**\n * Select the peer ID of your local peer.\n */\nexport const selectLocalPeerID = createSelector(selectRoom, room => {\n return room.localPeer;\n});\n\n/**\n * Select the peer name of your local peer.\n */\nexport const selectLocalPeerName = createSelector(selectLocalPeer, peer => peer?.name);\n\n/**\n * Select the role name of your local peer.\n */\nexport const selectLocalPeerRoleName = createSelector(selectLocalPeer, peer => peer?.roleName);\n\n/**\n * Select the track ID of your local peer's primary audio track\n */\nexport const selectLocalAudioTrackID = createSelector(selectLocalPeer, peer => peer?.audioTrack);\n\n/**\n * Select the track ID of your local peer's primary video track\n */\nexport const selectLocalVideoTrackID = createSelector(selectLocalPeer, peer => peer?.videoTrack);\n\n/**\n * Select an array of track IDs of your local peer's auxiliary tracks\n */\nconst selectLocalAuxiliaryTrackIDs = createSelector(selectLocalPeer, peer => peer?.auxiliaryTracks);\n\n/**\n * Select an array of track IDs of all your local peer's tracks\n */\nexport const selectLocalTrackIDs = createSelector(\n [selectLocalAudioTrackID, selectLocalVideoTrackID, selectLocalAuxiliaryTrackIDs],\n (audioTrackID, videoTrackID, auxiliaryTrackIDs) => {\n const trackIDs: string[] = auxiliaryTrackIDs ? [...auxiliaryTrackIDs] : [];\n audioTrackID && trackIDs.unshift(audioTrackID);\n videoTrackID && trackIDs.unshift(videoTrackID);\n return trackIDs;\n },\n);\n\n/**\n * Select remote peers(other users you're connected with via the internet) present in the room.\n */\nexport const selectRemotePeers = createSelector(selectPeers, peers => {\n return peers.filter(p => !p.isLocal);\n});\n\n/**\n * Select the peer who's speaking the loudest at the moment\n */\nexport const selectDominantSpeaker = createSelector(selectPeersMap, selectSpeakers, (peersMap, speakers) => {\n // sort in descending order by audio level\n const speakersInOrder = Object.entries(speakers).sort((s1, s2) => {\n const s1Level = s1[1]?.audioLevel || 0;\n const s2Level = s2[1]?.audioLevel || 0;\n return s2Level > s1Level ? 1 : -1;\n });\n if (speakersInOrder.length > 0 && speakersInOrder[0][1].audioLevel && speakersInOrder[0][1].audioLevel > 0) {\n const peerID = speakersInOrder[0][1].peerID;\n if (peerID in peersMap) {\n return peersMap[peerID];\n }\n }\n return null;\n});\n\n/**\n * Select a boolean denoting whether your local audio is unmuted\n * and the audio from your microphone is shared to remote peers\n */\nexport const selectIsLocalAudioEnabled = (store: HMSStore) => {\n const localPeer = selectLocalPeer(store);\n return isTrackEnabled(store, localPeer?.audioTrack);\n};\n\n/**\n * Select a boolean denoting whether your local video is unmuted\n * and the video from your camera is shared to remote peers\n */\nexport const selectIsLocalVideoEnabled = (store: HMSStore) => {\n const localPeer = selectLocalPeer(store);\n return isTrackEnabled(store, localPeer?.videoTrack);\n};\n\n/**\n * Select a boolean denoting whether you've chosen to unmute and share your local video.\n *\n * NOTE: Once you call `hmsActions.setLocalVideoEnabled(true)`to unmute your local video,\n * it takes some time to fetch your video from your video source.\n * This displayEnabled property gives immediate feedback for a more interactive UI,\n * without waiting for the video source\n */\nexport const selectIsLocalVideoDisplayEnabled = (store: HMSStore) => {\n const localPeer = selectLocalPeer(store);\n return isTrackDisplayEnabled(store, localPeer?.videoTrack);\n};\n\n/**\n * Select a boolean denoting whether your screen is shared to remote peers in the room.\n */\nexport const selectIsLocalScreenShared = createSelector(selectLocalPeer, selectTracksMap, (localPeer, tracksMap) => {\n const { video, audio } = getScreenSharesByPeer(tracksMap, localPeer);\n return !!(video || audio);\n});\n\n/**\n * Select the first peer who is currently sharing their screen.\n */\nexport const selectPeerScreenSharing = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n let screensharePeer = undefined;\n for (const peerID in peersMap) {\n const peer = peersMap[peerID];\n const { video, audio } = getScreenSharesByPeer(tracksMap, peer);\n if (video) {\n return peer;\n } else if (audio && !screensharePeer) {\n screensharePeer = peer;\n }\n }\n return screensharePeer;\n});\n\n/**\n * Select a boolean denoting whether someone is sharing screen in the room.\n */\nexport const selectIsSomeoneScreenSharing = createSelector(selectPeerScreenSharing, peer => {\n return !!peer;\n});\n\n/**\n * Select the first peer who is currently sharing their audio only screen\n */\nexport const selectPeerSharingAudio = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n for (const peerID in peersMap) {\n const peer = peersMap[peerID];\n const { audio, video } = getScreenSharesByPeer(tracksMap, peer);\n if (!video && !!audio) {\n return peer;\n }\n }\n return undefined;\n});\n\n/**\n * Select an array of peers who are currently sharing their screen.\n */\nexport const selectPeersScreenSharing = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n const videoPeers = [];\n const audioPeers = [];\n for (const peerID in peersMap) {\n const peer = peersMap[peerID];\n const { video, audio } = getScreenSharesByPeer(tracksMap, peer);\n if (video) {\n videoPeers.push(peer);\n } else if (audio) {\n audioPeers.push(peer);\n }\n }\n return videoPeers.concat(audioPeers);\n});\n\nexport const selectPeerSharingVideoPlaylist = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n for (const trackId in tracksMap) {\n const track = tracksMap[trackId];\n if (isVideoPlaylist(track) && isVideo(track) && track.peerId) {\n return peersMap[track.peerId];\n }\n }\n return undefined;\n});\n\nexport const selectPeerSharingAudioPlaylist = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n for (const trackId in tracksMap) {\n const track = tracksMap[trackId];\n if (isAudioPlaylist(track) && track.peerId) {\n return peersMap[track.peerId];\n }\n }\n return undefined;\n});\n\n/**\n * Select an array of tracks that have been degraded(receiving lower video quality/no video) due to bad network locally.\n */\nexport const selectDegradedTracks = createSelector(selectTracks, tracks =>\n (tracks as HMSVideoTrack[]).filter(isDegraded),\n);\n\n/**\n * Select the number of messages(sent and received).\n */\nexport const selectHMSMessagesCount = createSelector(selectMessageIDsInOrder, messageIDs => messageIDs.length);\n\n/**\n * Select the number of unread messages.\n */\nexport const selectUnreadHMSMessagesCount = createSelector(selectMessagesMap, messages => {\n return Object.values(messages).filter(m => !m.read).length;\n});\n\n/**\n * Select an array of messages in the room(sent and received).\n */\nexport const selectHMSMessages = createSelector(selectMessageIDsInOrder, selectMessagesMap, (msgIDs, msgMap) => {\n const messages: HMSMessage[] = [];\n msgIDs.forEach(msgId => {\n messages.push(msgMap[msgId]);\n });\n return messages;\n});\n\n/**\n * Select the current state of the room.\n */\nexport const selectRoomState = createSelector([selectRoom], room => room && room.roomState);\n\n/**\n * Select a boolean denoting whether the room is in Preview state.\n */\nexport const selectIsInPreview = createSelector(selectRoomState, roomState => roomState === HMSRoomState.Preview);\n\nexport const selectRoomStarted = createSelector(selectRoom, room => room.roomState !== HMSRoomState.Disconnected);\n\n/**\n * Select available roles in the room as a map between the role name and {@link HMSRole} object.\n */\nexport const selectRolesMap = (store: HMSStore): Record<string, HMSRole> => {\n return store.roles;\n};\n\n/**\n * Select an array of names of available roles in the room.\n */\nexport const selectAvailableRoleNames = createSelector([selectRolesMap], rolesMap => Object.keys(rolesMap));\n\n/**\n * Select the {@link HMSRole} object of your local peer.\n */\nexport const selectLocalPeerRole = createSelector([selectLocalPeer, selectRolesMap], (localPeer, rolesMap) =>\n localPeer?.roleName ? rolesMap[localPeer.roleName] : null,\n);\n\nexport const selectPreviewRoleName = (store: HMSStore) => store.preview?.asRole;\n\n/**\n * Select the {@link HMSRole} used for preview.\n *\n */\nexport const selectPreviewRole = createSelector([selectPreviewRoleName, selectRolesMap], (roleName, rolesMap) =>\n roleName ? rolesMap[roleName] : null,\n);\n\n/**\n * Select a boolean denoting whether if your local peer is allowed to subscribe to any other role.\n */\nexport const selectIsAllowedToSubscribe = createSelector([selectLocalPeerRole], (role): boolean => {\n if (!role?.subscribeParams?.subscribeToRoles) {\n return false;\n }\n return role.subscribeParams.subscribeToRoles.length > 0;\n});\n\n/**\n * Select the permissions which determine what actions the local peer can do.\n */\nexport const selectPermissions = createSelector(selectLocalPeerRole, role => role?.permissions);\nexport const selectRecordingState = createSelector(selectRoom, room => room.recording);\nexport const selectRTMPState = createSelector(selectRoom, room => room.rtmp);\nexport const selectHLSState = createSelector(selectRoom, room => room.hls);\nexport const selectSessionId = createSelector(selectRoom, room => room.sessionId);\nexport const selectRoomStartTime = createSelector(selectRoom, room => room.startedAt);\nexport const selectIsLargeRoom = createSelector(selectRoom, room => !!room.isLargeRoom);\nexport const selectTemplateAppData = (store: HMSStore) => store.templateAppData;\n/** @deprecated - use `selectSessionStore` instead */\nexport const selectSessionMetadata = (store: HMSStore) => store.sessionMetadata;\nexport const selectPollsMap = (store: HMSStore) => store.polls;\nexport const selectPolls = (store: HMSStore) => {\n return Object.values(store.polls);\n};\n\nexport const selectHandRaisedPeers = createSelector(selectPeers, peers => {\n return peers.filter(peer => peer.isHandRaised);\n});\n", "import {\n HMSPeer,\n HMSPublishAllowed,\n HMSRole,\n HMSScreenAudioTrack,\n HMSScreenVideoTrack,\n HMSStore,\n HMSTrack,\n HMSTrackID,\n HMSVideoTrack,\n} from '../schema';\n\nexport function getScreenSharesByPeer(tracks: Record<HMSTrackID, HMSTrack>, peer?: HMSPeer | null) {\n let videoTrack = undefined;\n let audioTrack = undefined;\n if (peer) {\n for (const trackID of peer.auxiliaryTracks) {\n const track = tracks[trackID];\n if (isScreenShare(track)) {\n audioTrack = isAudio(track) ? track : audioTrack;\n videoTrack = isVideo(track) ? track : videoTrack;\n }\n }\n }\n // to use the proper type, right now it is only used for screenshare.\n return { video: videoTrack as HMSScreenVideoTrack, audio: audioTrack as HMSScreenAudioTrack };\n}\n\nexport function isAudio(track: HMSTrack | undefined) {\n return track && track.type === 'audio';\n}\n\nexport function isVideo(track: HMSTrack | undefined) {\n return track && track.type === 'video';\n}\n\nexport function isScreenShare(track: HMSTrack | undefined) {\n return track && track.source === 'screen';\n}\n\nexport function isAudioPlaylist(track: HMSTrack | undefined) {\n return track && track.source === 'audioplaylist';\n}\n\nexport function isVideoPlaylist(track: HMSTrack | undefined) {\n return track && track.source === 'videoplaylist';\n}\n\nexport function isDegraded(track: HMSVideoTrack) {\n if (track) {\n return Boolean(track?.degraded);\n }\n return false;\n}\n\nexport function isTrackEnabled(store: HMSStore, trackID?: string) {\n if (trackID && store.tracks[trackID]) {\n return store.tracks[trackID].enabled;\n }\n return false;\n}\n\n/**\n * Should UI show the video track as enabled\n */\nexport function isTrackDisplayEnabled(store: HMSStore, trackID?: string) {\n if (trackID && store.tracks[trackID]) {\n return store.tracks[trackID].displayEnabled;\n }\n return false;\n}\n\nexport function isRoleAllowedToPublish(role?: HMSRole | null): HMSPublishAllowed {\n let video = false,\n audio = false,\n screen = false;\n if (role?.publishParams?.allowed) {\n video = role.publishParams.allowed.includes('video');\n audio = role.publishParams.allowed.includes('audio');\n screen = role.publishParams.allowed.includes('screen');\n }\n return {\n video,\n audio,\n screen,\n };\n}\n", "import { createSelector } from 'reselect';\nimport { HMSPlaylistSelector, HMSPlaylistType, HMSStore } from '../schema';\n\n/**\n * @internal\n */\nconst selectPlaylistMap =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].list;\n\nconst selectPlaylistSelection =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].selection;\n\nconst selectPlaylistProgress =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].progress;\n\nconst selectPlaylistCurrentTime =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].currentTime;\n\nconst selectPlaylistPlaybackRate =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].playbackRate;\n\nconst selectPlaylistVolume =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].volume;\n\n/**\n * Select an array of playlist items.\n */\nconst selectPlaylist = (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n createSelector(selectPlaylistMap(type), storePlaylist => {\n return Object.values(storePlaylist);\n });\n\nconst selectPlaylistSelectedItem = (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n createSelector(selectPlaylistMap(type), selectPlaylistSelection(type), (storePlaylist, currentSelection) => {\n if (!currentSelection.id) {\n return;\n }\n return storePlaylist[currentSelection.id];\n });\n\nexport const selectAudioPlaylist: HMSPlaylistSelector = {\n selection: selectPlaylistSelection(HMSPlaylistType.audio),\n progress: selectPlaylistProgress(HMSPlaylistType.audio),\n currentTime: selectPlaylistCurrentTime(HMSPlaylistType.audio),\n playbackRate: selectPlaylistPlaybackRate(HMSPlaylistType.audio),\n volume: selectPlaylistVolume(HMSPlaylistType.audio),\n list: selectPlaylist(HMSPlaylistType.audio),\n selectedItem: selectPlaylistSelectedItem(HMSPlaylistType.audio) as any,\n};\n\nexport const selectVideoPlaylist: HMSPlaylistSelector = {\n selection: selectPlaylistSelection(HMSPlaylistType.video),\n progress: selectPlaylistProgress(HMSPlaylistType.video),\n currentTime: selectPlaylistCurrentTime(HMSPlaylistType.video),\n playbackRate: selectPlaylistPlaybackRate(HMSPlaylistType.video),\n volume: selectPlaylistVolume(HMSPlaylistType.video),\n list: selectPlaylist(HMSPlaylistType.video),\n selectedItem: selectPlaylistSelectedItem(HMSPlaylistType.video) as any,\n};\n", "import { createSelector } from 'reselect';\nimport { byIDCurry } from './common';\nimport {\n selectFullAppData,\n selectHMSMessages,\n selectLocalPeerID,\n selectPeers,\n selectPeersMap,\n selectPollsMap,\n selectTracksMap,\n} from './selectors';\nimport {\n getScreenSharesByPeer,\n isAudio,\n isAudioPlaylist,\n isTrackEnabled,\n isVideo,\n isVideoPlaylist,\n} from './selectorUtils';\nimport { HMSLogger } from '../../common/ui-logger';\nimport {\n HMSAudioTrack,\n HMSGenericTypes,\n HMSPeer,\n HMSPeerID,\n HMSRoleName,\n HMSScreenVideoTrack,\n HMSStore,\n HMSTrack,\n HMSTrackID,\n HMSVideoTrack,\n} from '../schema';\n\nconst selectPeerID = (_store: HMSStore, peerID: HMSPeerID | undefined) => peerID;\nconst selectTrackID = (_store: HMSStore, trackID: HMSTrackID | undefined) => trackID;\nconst selectRoleName = (_store: HMSStore, roleName: HMSRoleName | undefined) => roleName;\nconst selectAppDataKey = (_store: HMSStore, key: string | undefined) => key;\nconst selectPollID = (_store: HMSStore, pollID: string | undefined) => pollID;\n\nconst selectPeerByIDBare = createSelector([selectPeersMap, selectPeerID], (storePeers, peerID) =>\n peerID ? storePeers[peerID] : null,\n);\n\nconst selectTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) =>\n trackID ? storeTracks[trackID] : null,\n);\n\nconst selectVideoTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) => {\n if (!trackID) {\n return null;\n }\n const track = storeTracks[trackID] as HMSVideoTrack | undefined;\n if (track?.type === 'video') {\n return track;\n }\n return null;\n});\n\nconst selectAudioTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) => {\n if (!trackID) {\n return null;\n }\n const track = storeTracks[trackID] as HMSAudioTrack | undefined;\n if (track?.type === 'audio') {\n return track;\n }\n return null;\n});\n\nconst selectScreenAudioTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) => {\n if (!trackID) {\n return null;\n }\n const track = storeTracks[trackID] as HMSAudioTrack | undefined;\n if (track?.type === 'audio' && track?.source === 'screen') {\n return track;\n }\n return null;\n});\nconst selectScreenVideoTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) => {\n if (!trackID) {\n return null;\n }\n const track = storeTracks[trackID] as HMSScreenVideoTrack | undefined;\n if (track?.type === 'video' && track?.source === 'screen') {\n return track;\n }\n return null;\n});\n\nconst selectPollByIDBare = createSelector([selectPollsMap, selectPollID], (storePolls, pollID) =>\n pollID ? storePolls[pollID] : null,\n);\n\n/**\n * Select the {@link HMSPeer} object given a peer ID.\n */\nexport const selectPeerByID = byIDCurry(selectPeerByIDBare);\n\n/**\n * Select a particular key from ui app data by passed in key.\n * if key is not passed, full data is returned.\n */\nexport const selectAppData = byIDCurry(\n createSelector([selectFullAppData, selectAppDataKey], (appData, key) => {\n if (!appData) {\n return undefined;\n }\n if (key) {\n return appData[key];\n }\n return appData;\n }),\n);\n\n/**\n * Select a particular key from session store by passed in key.\n * if key is not passed, full data is returned.\n */\nexport function selectSessionStore<T extends HMSGenericTypes = { sessionStore: Record<string, any> }>(): (\n store: HMSStore<T>,\n) => T['sessionStore'] | undefined;\nexport function selectSessionStore<\n T extends HMSGenericTypes = { sessionStore: Record<string, any> },\n K extends keyof T['sessionStore'] = keyof T['sessionStore'],\n>(key: K): (store: HMSStore<T>) => T['sessionStore'][K] | undefined;\nexport function selectSessionStore<\n T extends HMSGenericTypes = { sessionStore: Record<string, any> },\n K extends keyof T['sessionStore'] = keyof T['sessionStore'],\n>(key?: K) {\n return (store: HMSStore<T>) => {\n if (!store.sessionStore) {\n return undefined;\n }\n if (key) {\n return store.sessionStore[key];\n }\n return store.sessionStore;\n };\n}\n\nexport const selectAppDataByPath = (...keys: string[]) =>\n createSelector([selectFullAppData], appData => {\n if (!appData) {\n return undefined;\n }\n if (keys && keys.length > 0) {\n let value = appData;\n for (const key of keys) {\n if (!key) {\n return value;\n }\n value = value?.[key];\n }\n return value;\n }\n return appData;\n });\n\n/**\n * Select the name of a {@link HMSPeer} given a peer ID.\n */\nexport const selectPeerNameByID = byIDCurry(createSelector(selectPeerByIDBare, peer => peer?.name));\n\n/**\n * Select the {@link HMSTrack} object given a track ID.\n */\nexport const selectTrackByID = byIDCurry(selectTrackByIDBare);\n\n/**\n * Select the {@link HMSVideoTrack} object given a track ID.\n */\nexport const selectVideoTrackByID = byIDCurry(selectVideoTrackByIDBare);\n\n/**\n * Select the {@link HMSAudioTrack} object given a track ID.\n */\nexport const selectAudioTrackByID = byIDCurry(selectAudioTrackByIDBare);\n\n/**\n * Select the {@link HMSScreenAudioTrack} object given a track ID.\n */\nexport const selectScreenAudioTrackByID = byIDCurry(selectScreenAudioTrackByIDBare);\n\n/**\n * Select the {@link HMSScreenVideoTrack} object given a track ID.\n */\nexport const selectScreenVideoTrackByID = byIDCurry(selectScreenVideoTrackByIDBare);\n\n/**\n * Select the primary video track of a peer given a peer ID.\n */\nexport const selectVideoTrackByPeerID = byIDCurry((store: HMSStore, peerID?: HMSPeerID): HMSVideoTrack | undefined => {\n const peer = selectPeerByIDBare(store, peerID);\n if (peer && peer.videoTrack && peer.videoTrack !== '') {\n return store.tracks[peer.videoTrack] as HMSVideoTrack;\n }\n return undefined;\n});\n\n/**\n * Select the primary audio track of a peer given a peer ID.\n */\nexport const selectAudioTrackByPeerID = byIDCurry((store: HMSStore, peerID?: HMSPeerID): HMSAudioTrack | undefined => {\n const peer = selectPeerByIDBare(store, peerID);\n if (peer && peer.audioTrack && peer.audioTrack !== '') {\n return store.tracks[peer.audioTrack] as HMSAudioTrack;\n }\n return undefined;\n});\n\n/**\n * Select the camera stream of a peer given a peer ID.\n * This is the primary video track of a peer.\n */\nexport const selectCameraStreamByPeerID = selectVideoTrackByPeerID;\n\n/**\n * Select an array of auxiliary tracks of a peer given a peer ID.\n */\nexport const selectAuxiliaryTracksByPeerID = byIDCurry((store: HMSStore, peerID?: HMSPeerID): HMSTrack[] => {\n const peer = selectPeerByIDBare(store, peerID);\n return peer?.auxiliaryTracks.map(trackID => store.tracks[trackID]) || [];\n});\n\nconst selectSpeakerByTrackID = (store: HMSStore, trackID: HMSTrackID | undefined) => {\n return trackID ? store.speakers[trackID] : null;\n};\n\n/**\n * Select the audio level of a track given a track ID.\n */\nexport const selectTrackAudioByID = byIDCurry(\n createSelector(selectSpeakerByTrackID, speaker => speaker?.audioLevel || 0),\n);\n\n/**\n * Select speaker object of audioTrack of a peer given a peer ID.\n */\nconst selectSpeakerByPeerID = (store: HMSStore, peerID: HMSPeerID | undefined) => {\n const peerAudioTrack = selectAudioTrackByPeerID(peerID)(store);\n return selectSpeakerByTrackID(store, peerAudioTrack?.id);\n};\n\n/**\n * Select audio level of audioTrack of a peer given a peer ID\u00DF.\n */\nexport const selectPeerAudioByID = byIDCurry(\n createSelector(selectSpeakerByPeerID, speaker => speaker?.audioLevel || 0),\n);\n\nexport const selectConnectionQualityByPeerID = byIDCurry((store: HMSStore, peerID: HMSPeerID | undefined) => {\n if (peerID) {\n return store.connectionQualities[peerID];\n }\n return undefined;\n});\n\n/**\n * Select the first auxiliary audio track of a peer given a peer ID.\n */\nexport const selectAuxiliaryAudioByPeerID = byIDCurry((store: HMSStore, peerID?: HMSPeerID) => {\n const peer = selectPeerByIDBare(store, peerID);\n if (peer) {\n const trackID = peer?.auxiliaryTracks.find(trackID => isAudio(store.tracks[trackID]));\n return trackID ? (store.tracks[trackID] as HMSAudioTrack) : undefined;\n }\n return undefined;\n});\n\nexport const selectVideoPlaylistVideoTrackByPeerID = byIDCurry(\n createSelector(selectTracksMap, selectPeerByIDBare, (tracks, peer) => {\n const trackID = peer?.auxiliaryTracks.find(trackID => {\n const track = tracks[trackID];\n return isVideoPlaylist(track) && isVideo(track);\n });\n return trackID ? (tracks[trackID] as HMSVideoTrack) : undefined;\n }),\n);\n\nexport const selectVideoPlaylistAudioTrackByPeerID = byIDCurry(\n createSelector(selectTracksMap, selectPeerByIDBare, (tracks, peer) => {\n const trackID = peer?.auxiliaryTracks.find(trackID => {\n const track = tracks[trackID];\n return isVideoPlaylist(track) && isAudio(track);\n });\n return trackID ? (tracks[trackID] as HMSAudioTrack) : undefined;\n }),\n);\n\nexport const selectAudioPlaylistTrackByPeerID = byIDCurry(\n createSelector(selectTracksMap, selectPeerByIDBare, (tracks, peer) => {\n const trackID = peer?.auxiliaryTracks.find(trackID => {\n const track = tracks[trackID];\n return isAudioPlaylist(track) && isAudio(track);\n });\n return trackID ? (tracks[trackID] as HMSAudioTrack) : undefined;\n }),\n);\n\nexport const selectScreenSharesByPeerId = byIDCurry(\n createSelector(selectTracksMap, selectPeerByIDBare, (tracks, peer) => {\n return getScreenSharesByPeer(tracks, peer);\n }),\n);\n\n/**\n * Select the screen share video track of a peer given a peer ID.\n */\nexport const selectScreenShareByPeerID = (id?: string) =>\n createSelector(selectScreenSharesByPeerId(id), screenshare => {\n return screenshare.video;\n });\n\n/**\n * Select the screen share audio track of a peer given a peer ID.\n */\nexport const selectScreenShareAudioByPeerID = (id?: string) =>\n createSelector(selectScreenSharesByPeerId(id), screenshare => {\n return screenshare.audio;\n });\n\n/**\n * Select a boolean denoting whether a peer has unmuted audio and sharing it to other peers.\n */\nexport const selectIsPeerAudioEnabled = byIDCurry((store: HMSStore, peerID?: string) => {\n const peer = selectPeerByIDBare(store, peerID);\n return isTrackEnabled(store, peer?.audioTrack);\n});\n\n/**\n * Select a boolean denoting whether a peer has unmuted video and sharing it to other peers.\n */\nexport const selectIsPeerVideoEnabled = byIDCurry((store: HMSStore, peerID?: string) => {\n const peer = selectPeerByIDBare(store, peerID);\n return isTrackEnabled(store, peer?.videoTrack);\n});\n\n/**\n * Select a boolean denoting whether you've muted an audio track locally(only for you) given a track ID.\n */\nexport const selectIsAudioLocallyMuted = byIDCurry((store: HMSStore, trackID?: string) => {\n if (trackID && store.tracks[trackID]) {\n return (store.tracks[trackID] as HMSAudioTrack).volume === 0;\n }\n return undefined;\n});\n\n/**\n * Select a boolean denoting whether you've muted the primary audio track of a peer locally(only for you) given a peer ID.\n */\nexport const selectIsLocallyMutedByPeerID = byIDCurry((store: HMSStore, peerID?: string) => {\n const peer = selectPeerByIDBare(store, peerID);\n return selectIsAudioLocallyMuted(peer?.audioTrack)(store);\n});\n\n/**\n * Select a boolean denoting whether you've muted the screen share audio track of a peer locally(only for you) given a peer ID.\n */\nexport const selectIsScreenShareLocallyMutedByPeerID = byIDCurry((store: HMSStore, peerID?: string) => {\n const track = selectScreenShareAudioByPeerID(peerID)(store);\n return selectIsAudioLocallyMuted(track?.id)(store);\n});\n\n/**\n * Select the local audio volume of an audio track given a track ID.\n *\n * NOTE: **Volume** of a track is different from **Audio Level** of a track,\n * - Audio Level measures the audio of a track and it comes from 100ms's servers.\n * - Volume is how loud you hear the audio of a track, this is controlled by you at the client side.\n */\nexport const selectAudioTrackVolume = byIDCurry((store: HMSStore, trackID?: string) => {\n const track = selectTrackByIDBare(store, trackID);\n if (track) {\n if (track.type !== 'audio') {\n HMSLogger.w('Please pass audio track here');\n return undefined;\n }\n return track.volume;\n }\n return undefined;\n});\n\n/**\n * Select the local audio volume of the primary audio track of a peer given a peer ID.\n */\nexport const selectAudioVolumeByPeerID = byIDCurry((store: HMSStore, peerID?: string) => {\n const peer = selectPeerByIDBare(store, peerID);\n return selectAudioTrackVolume(peer?.audioTrack)(store);\n});\n\n/**\n * Select the local audio volume of the screen share of a peer given a peer ID.\n */\nexport const selectScreenshareAudioVolumeByPeerID = byIDCurry((store: HMSStore, peerID?: string) => {\n const track = selectScreenShareAudioByPeerID(peerID)(store);\n return selectAudioTrackVolume(track?.id)(store);\n});\n\n/**\n * Select the current simulcast layer of a track given a track ID.\n */\nexport const selectSimulcastLayerByTrack = byIDCurry((store: HMSStore, trackID?: string) => {\n const track = selectTrackByIDBare(store, trackID);\n if (track) {\n if (track.type !== 'video') {\n HMSLogger.w('Please pass video track here');\n return undefined;\n }\n return track.layer;\n }\n return undefined;\n});\n\nconst selectMessagesByPeerIDInternal = createSelector(\n [selectHMSMessages, selectLocalPeerID, selectPeerID],\n (messages, localPeerID, peerID) => {\n if (!peerID) {\n return undefined;\n }\n return messages.filter(message => {\n // Broadcast message\n if (!message.recipientPeer && !message.recipientRoles?.length) {\n return false;\n }\n // if localPeer or peerID is not a sender remove this\n if (message.sender && ![localPeerID, peerID].includes(message.sender)) {\n return false;\n }\n // at this point we know the sender is one of local or passed in peer, check the recipient side\n return [localPeerID, peerID].includes(message.recipientPeer!);\n });\n },\n);\n\nconst selectMessagesByRoleInternal = createSelector([selectHMSMessages, selectRoleName], (messages, roleName) => {\n if (!roleName) {\n return undefined;\n }\n return messages.filter(message => {\n // Not Role message - Broadcast message or Private Peer message\n if (!message.recipientRoles?.length) {\n return false;\n }\n return message.recipientRoles?.includes(roleName);\n });\n});\n\nexport const selectBroadcastMessages = createSelector(selectHMSMessages, messages => {\n return messages.filter(message => {\n return !message.recipientPeer && !message.recipientRoles?.length;\n });\n});\n\nconst selectUnreadMessageCountByRole = createSelector([selectMessagesByRoleInternal, selectRoleName], messages => {\n if (!messages) {\n return 0;\n }\n return messages.filter(m => !m.read).length;\n});\n\nconst selectUnreadMessageCountByPeerID = createSelector([selectMessagesByPeerIDInternal, selectPeerID], messages => {\n if (!messages) {\n return 0;\n }\n return messages.filter(m => !m.read).length;\n});\n\nexport const selectBroadcastMessagesUnreadCount = createSelector(selectBroadcastMessages, messages => {\n return messages.filter(m => !m.read).length;\n});\n\nexport const selectMessagesByPeerID = byIDCurry(selectMessagesByPeerIDInternal);\n\nexport const selectMessagesByRole = byIDCurry(selectMessagesByRoleInternal);\n\nexport const selectMessagesUnreadCountByRole = byIDCurry(selectUnreadMessageCountByRole);\nexport const selectMessagesUnreadCountByPeerID = byIDCurry(selectUnreadMessageCountByPeerID);\n\n/**\n * Select an array of peers of a particular role\n * @param role HMSRoleName\n * @returns HMSPeer[]\n */\nexport const selectPeersByRole = (role: HMSRoleName) =>\n createSelector([selectPeers], peers => {\n return peers.filter(p => p.roleName === role);\n });\n\n/**\n * Select an array of peers of a particular role\n * @param roles HMSRoleName[]\n * @returns HMSPeer[]\n */\nexport const selectPeersByRoles = (roles: HMSRoleName[]) =>\n createSelector([selectPeers], (peers: HMSPeer[]) => {\n return peers.filter((peer: HMSPeer) => {\n return peer.roleName ? roles.includes(peer.roleName) : false;\n });\n });\n/**\n * Selects the peer metadata for the passed in peer and returns it as JSON. If metadata is not present\n * or conversion to JSON gives an error, an empty object is returned.\n * Please directly use peer.metadata in case the metadata is not JSON by design.\n */\nexport const selectPeerMetadata = (peerId: HMSPeerID) =>\n createSelector(selectPeerByID(peerId), peer => {\n try {\n return peer?.metadata && peer.metadata !== '' ? JSON.parse(peer.metadata) : {};\n } catch (error) {\n console.error('cannot parse peer metadata', error);\n return {};\n }\n });\n\nexport const selectHasPeerHandRaised = (peerId: HMSPeerID) =>\n createSelector(selectPeerByID(peerId), peer => {\n return !!peer?.isHandRaised;\n });\n\nexport const selectPeerName = (peerId: HMSPeerID) => createSelector(selectPeerByID(peerId), peer => peer?.name);\n\nexport const selectPollByID = byIDCurry(selectPollByIDBare);\n", "import { HMSStatsStore, HMSStore } from '../schema';\n\nexport type StoreTypes = HMSStore | HMSStatsStore;\n\ntype byIDSelector<S extends StoreTypes, T> = (store: S, id?: string) => T;\n\n/**\n * StoreSelector is a function that takes in {@link HMSStore} as argument\n * and returns a part of the store that is queried using the selector.\n * @typeParam T Part of the store that you wish to query.\n */\nexport type StoreSelector<S extends StoreTypes, T> = (store: S) => T;\n\n/**\n * takes in a normal selector which has store and id as input and curries it to make it easier to use.\n * Before: store.getState((store) => normalSelector(store, peerID))\n * After: store.getState(curriedSelector(peerID))\n */\nexport function byIDCurry<S extends StoreTypes, T>(selector: byIDSelector<S, T>): (id?: string) => StoreSelector<S, T> {\n return (id?: string) => {\n return (store: S) => selector(store, id);\n };\n}\n", "import {\n DeviceMap,\n DeviceType,\n HLSConfig,\n HLSMeetingURLVariant,\n HLSTimedMetadata,\n HMSAudioPlugin,\n HMSAudioPluginType,\n HMSAudioTrackSettings,\n HMSConfig,\n HMSConfigInitialSettings,\n HMSConnectionQuality,\n HMSDeviceChangeEvent,\n HMSException,\n HMSFrameworkInfo,\n HMSHLS,\n HMSLocalPeer,\n HMSLocalTrackStats,\n HMSLogLevel,\n HMSMessage,\n HMSPeer,\n HMSPeerListIterator,\n HMSPeerStats,\n HMSPeerUpdate,\n HMSPlaylistItem,\n HMSPlaylistManager,\n HMSPlaylistProgressEvent,\n HMSPoll,\n HMSPollCreateParams,\n HMSPollQuestionAnswer,\n HMSPollQuestionCreateParams,\n HMSPollQuestionType,\n HMSPollsUpdate,\n HMSPreferredSimulcastLayer,\n HMSPreviewConfig,\n HMSRecording,\n HMSRemotePeer,\n HMSRemoteTrackStats,\n HMSRole,\n HMSRoom,\n HMSRoomUpdate,\n HMSRTMP,\n HMSScreenShareConfig,\n HMSSimulcastLayer,\n HMSSimulcastLayerDefinition,\n HMSSpeaker,\n HMSTrackStats,\n HMSTrackUpdate,\n HMSVideoPlugin,\n HMSVideoPluginCanvasContextType,\n HMSVideoPluginType,\n HMSVideoTrackSettings,\n HMSWebrtcInternals,\n HMSWebrtcStats,\n parsedUserAgent,\n RID,\n RTMPRecordingConfig,\n ScreenCaptureHandle,\n simulcastMapping,\n TokenRequest,\n TokenRequestOptions,\n} from '@100mslive/hms-video';\n\nexport {\n HMSException,\n HMSSimulcastLayer,\n HMSRoomUpdate,\n HMSPeerUpdate,\n HMSTrackUpdate,\n HMSPollsUpdate,\n HMSLogLevel,\n HMSAudioPluginType,\n HMSVideoPluginType,\n HMSVideoPluginCanvasContextType,\n parsedUserAgent,\n simulcastMapping,\n DeviceType,\n HMSPollQuestionType,\n HMSPeerListIterator,\n};\n\nexport type {\n DeviceMap,\n HMSPeer,\n HMSRoom,\n HMSMessage,\n HMSSpeaker,\n HMSConfig,\n HMSConfigInitialSettings,\n HMSPreviewConfig,\n HMSAudioTrackSettings,\n HMSVideoTrackSettings,\n HMSRole,\n HMSLocalPeer,\n HMSRemotePeer,\n HMSSimulcastLayerDefinition,\n HMSDeviceChangeEvent,\n HMSPlaylistItem,\n HMSPlaylistManager,\n HMSPlaylistProgressEvent,\n RTMPRecordingConfig,\n HMSRecording,\n HMSRTMP,\n HMSWebrtcInternals,\n HMSWebrtcStats,\n HMSVideoPlugin,\n HMSAudioPlugin,\n HLSConfig,\n HLSTimedMetadata,\n HLSMeetingURLVariant,\n HMSHLS,\n HMSPeerStats,\n HMSTrackStats,\n HMSLocalTrackStats,\n HMSRemoteTrackStats,\n HMSConnectionQuality,\n HMSScreenShareConfig,\n HMSFrameworkInfo,\n RID,\n ScreenCaptureHandle,\n HMSPreferredSimulcastLayer,\n TokenRequest,\n TokenRequestOptions,\n HMSPoll,\n HMSPollCreateParams,\n HMSPollQuestionAnswer,\n HMSPollQuestionCreateParams,\n};\n", "import { HMSLogLevel } from '../core/hmsSDKStore/sdkTypes';\n\nconst HMS_STORE_TAG = 'HMS-Store:';\n\nexport class HMSLogger {\n static level: HMSLogLevel = HMSLogLevel.VERBOSE;\n\n static v(tag: string, ...data: any[]) {\n this.log(HMSLogLevel.VERBOSE, tag, ...data);\n }\n\n static d(...data: any[]) {\n this.log(HMSLogLevel.DEBUG, ...data);\n }\n\n static i(...data: any[]) {\n this.log(HMSLogLevel.INFO, ...data);\n }\n\n static w(...data: any[]) {\n this.log(HMSLogLevel.WARN, ...data);\n }\n\n static e(...data: any[]) {\n this.log(HMSLogLevel.ERROR, ...data);\n }\n\n static time(mark: string) {\n this.log(HMSLogLevel.TIME, '[HMSPerformanceTiming]', mark);\n }\n\n static timeEnd(mark: string) {\n this.log(HMSLogLevel.TIMEEND, '[HMSPerformanceTiming]', mark, mark);\n }\n\n static cleanup() {\n performance.clearMarks();\n performance.clearMeasures();\n }\n\n /* eslint-disable */\n private static log(level: HMSLogLevel, ...data: any[]) {\n if (this.level.valueOf() > level.valueOf()) {\n return;\n }\n\n switch (level) {\n case HMSLogLevel.VERBOSE: {\n console.log(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.DEBUG: {\n console.debug(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.INFO: {\n console.info(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.WARN: {\n console.warn(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.ERROR: {\n console.error(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.TIME: {\n performance.mark(data[1]);\n break;\n }\n case HMSLogLevel.TIMEEND: {\n const tag = data[0];\n const mark = data[1];\n try {\n const entry = performance.measure(mark, mark);\n //@ts-ignore\n this.log(HMSLogLevel.DEBUG, tag, mark, entry?.duration);\n performance.clearMarks(mark);\n performance.clearMeasures(mark);\n } catch (error) {\n this.log(HMSLogLevel.DEBUG, tag, mark, error);\n }\n break;\n }\n }\n }\n}\n", "import { createSelector } from 'reselect';\nimport { HMSRole } from '@100mslive/hms-video';\nimport { selectLocalPeerRole, selectPeersMap, selectPreviewRole, selectRolesMap, selectTracksMap } from './selectors';\nimport { isRoleAllowedToPublish } from './selectorUtils';\nimport { HMSPeer, HMSStore } from '../schema';\n\nexport interface HMSPeerWithMuteStatus {\n peer: HMSPeer;\n isAudioEnabled?: boolean;\n}\n\n/**\n * @privateRemarks\n * this is more friendly to UI format, the object in store has only peer id and role name instead of the full objects\n */\nexport interface HMSRoleChangeRequest {\n requestedBy?: HMSPeer;\n role: HMSRole;\n token: string;\n}\n\nexport const selectPeersWithAudioStatus = createSelector([selectPeersMap, selectTracksMap], (peersMap, tracksMap) => {\n const participants: HMSPeerWithMuteStatus[] = Object.values(peersMap).map(peer => {\n return {\n peer: peer,\n isAudioEnabled: peer.audioTrack ? tracksMap[peer.audioTrack]?.enabled : false,\n };\n });\n return participants;\n});\n\nconst selectRoleChangeStoreRequest = (store: HMSStore) => {\n return store.roleChangeRequests[0] || null;\n};\n\n/**\n * Select the role change request received for your local peer.\n */\nexport const selectRoleChangeRequest = createSelector(\n [selectRoleChangeStoreRequest, selectPeersMap, selectRolesMap],\n (request, peersMap, rolesMap): HMSRoleChangeRequest | null => {\n if (!request) {\n return null;\n }\n return {\n requestedBy: request.requestedBy ? peersMap[request.requestedBy] : undefined,\n role: rolesMap[request.roleName],\n token: request.token,\n };\n },\n);\n\n/**\n * Select what streams is the local peer allowed to publish from video, audio and screenshare.\n */\nexport const selectIsAllowedToPublish = createSelector([selectLocalPeerRole], role => isRoleAllowedToPublish(role));\n\n/**\n * Select what streams is the local peer allowed to preview from video, audio\n */\nexport const selectIsAllowedToPreviewMedia = createSelector([selectPreviewRole], role => isRoleAllowedToPublish(role));\n", "import { createSelector } from 'reselect';\nimport {\n selectLocalAudioTrackID,\n selectLocalVideoTrackID,\n selectPeers,\n selectRolesMap,\n selectRoom,\n selectTracksMap,\n} from './selectors';\nimport { isRoleAllowedToPublish } from './selectorUtils';\nimport { HMSPeer, HMSTrack } from '../schema';\n\nexport const selectRoleByRoleName = (roleName: string) =>\n createSelector([selectRolesMap], rolesMap => rolesMap[roleName]);\n\nexport const selectIsRoleAllowedToPublish = (roleName: string) => {\n return createSelector(selectRoleByRoleName(roleName), role => isRoleAllowedToPublish(role));\n};\n\nconst selectLocalVideoPlugins = createSelector([selectLocalVideoTrackID, selectTracksMap], (trackID, tracksMap) => {\n let track: HMSTrack | null = null;\n if (trackID) {\n track = tracksMap[trackID];\n }\n return track?.plugins || [];\n});\n\nconst selectLocalAudioPlugins = createSelector([selectLocalAudioTrackID, selectTracksMap], (trackID, tracksMap) => {\n let track: HMSTrack | null = null;\n if (trackID) {\n track = tracksMap[trackID];\n }\n return track?.plugins || [];\n});\n\nexport const selectIsLocalVideoPluginPresent = (pluginName: string) => {\n return createSelector([selectLocalVideoPlugins], plugins => {\n return plugins.includes(pluginName);\n });\n};\n\nexport const selectIsLocalAudioPluginPresent = (pluginName: string) => {\n return createSelector([selectLocalAudioPlugins], plugins => {\n return plugins.includes(pluginName);\n });\n};\n\n/**\n * Selects the first peer passing the condition given by the argument predicate function\n *\n * Ex: to select a peer whose metadata has spotlight set to true(assuming peer.metadata is a valid json string), use\n * ```js\n * const spotlightPeer = useHMSStore(selectPeerByCondition(peer => JSON.parse(peer.metadata).spotlight))\n * ```\n */\nexport const selectPeerByCondition = (predicate: (peer: HMSPeer) => boolean) =>\n createSelector(selectPeers, peers => {\n return peers.find(predicate);\n });\n\n/**\n * Selects all peers passing the condition given by the argument predicate function\n *\n * Ex: to select peers with isHandRaised set to true in their metadata(assuming peer.metadata is a valid json string), use\n * ```js\n * const handRaisedPeers = useHMSStore(selectPeersByCondition(peer => JSON.parse(peer.metadata).isHandRaised))\n * ```\n */\nexport const selectPeersByCondition = (predicate: (peer: HMSPeer) => boolean) =>\n createSelector(selectPeers, peers => {\n return peers.filter(predicate);\n });\n\n/**\n * Returns a boolean to indicate if the local peer joined within the past `timeMs` milliseconds.\n *\n * Ex: to know if the local peer joined within the last one second\n * ```js\n * const joinedWithinASecond = useHMSStore(selectDidIJoinWithin(1000));\n * ```\n */\nexport const selectDidIJoinWithin = (timeMs: number) =>\n createSelector(selectRoom, room => room.joinedAt && Date.now() - room.joinedAt.getTime() <= timeMs);\n", "import { HMSLocalTrack as SDKHMSLocalTrack, HMSPoll } from '@100mslive/hms-video';\nimport { HMSPeer, HMSPeerID, HMSScreenVideoTrack, HMSTrack, HMSTrackID, HMSVideoTrack } from '../../schema';\nimport { HMSPeerStats, HMSTrackStats } from '../sdkTypes';\n\n/**\n * updates draftPeers with newPeers ensuring minimal reference changes\n * @remarks\n * This is mutable and impure function, it modifies the passed in data to ensure\n * minimal reference changes\n * @param draftPeers the current peers object in store, an immer draft object\n * @param newPeers the latest update which needs to be stored\n * @param newHmsTracks this will be update if required\n * @param newHmsSDkTracks this is future value of local hms tacks map\n */\n// eslint-disable-next-line complexity\nexport const mergeNewPeersInDraft = (\n draftPeers: Record<HMSPeerID, HMSPeer>,\n newPeers: Record<HMSPeerID, Partial<HMSPeer>>,\n) => {\n const peerIDs = union(Object.keys(draftPeers), Object.keys(newPeers));\n for (const peerID of peerIDs) {\n const oldPeer = draftPeers[peerID];\n const newPeer = newPeers[peerID];\n if (isEntityUpdated(oldPeer, newPeer)) {\n if (areArraysEqual(oldPeer.auxiliaryTracks, newPeer.auxiliaryTracks)) {\n newPeer.auxiliaryTracks = oldPeer.auxiliaryTracks;\n }\n if (oldPeer.groups && areArraysEqual(oldPeer.groups, newPeer.groups)) {\n newPeer.groups = oldPeer.groups;\n }\n Object.assign(oldPeer, newPeer);\n } else if (isEntityRemoved(oldPeer, newPeer)) {\n delete draftPeers[peerID];\n } else if (isEntityAdded(oldPeer, newPeer)) {\n draftPeers[peerID] = newPeer as HMSPeer;\n }\n }\n};\n\nexport const mergeNewTracksInDraft = (\n draftTracks: Record<HMSTrackID, HMSTrack>,\n newTracks: Record<HMSTrackID, Partial<HMSTrack>>,\n) => {\n const trackIDs = union(Object.keys(draftTracks), Object.keys(newTracks));\n for (const trackID of trackIDs) {\n const oldTrack = draftTracks[trackID];\n const newTrack = newTracks[trackID];\n if (isEntityUpdated(oldTrack, newTrack)) {\n mergeTrackArrayFields(oldTrack, newTrack);\n Object.assign(oldTrack, newTrack);\n } else if (isEntityRemoved(oldTrack, newTrack)) {\n delete draftTracks[trackID];\n } else if (isEntityAdded(oldTrack, newTrack)) {\n draftTracks[trackID] = newTrack as HMSTrack;\n }\n }\n};\n\nexport const mergeNewPollsInDraft = (\n draftPolls: Record<string, HMSPoll>,\n newPolls: Record<string, Partial<HMSPoll>>,\n) => {\n const pollIDs = union(Object.keys(draftPolls), Object.keys(newPolls));\n for (const pollID of pollIDs) {\n const oldPoll = draftPolls[pollID];\n const newPoll = newPolls[pollID];\n if (isEntityUpdated(oldPoll, newPoll)) {\n if (oldPoll.questions && areArraysEqual(oldPoll.questions, newPoll.questions)) {\n newPoll.questions = oldPoll.questions;\n }\n Object.assign(oldPoll, newPoll);\n } else if (isEntityAdded(oldPoll, newPoll)) {\n draftPolls[pollID] = newPoll as HMSPoll;\n }\n }\n};\n\nexport const mergeNewIndividualStatsInDraft = <TID extends string, T extends HMSPeerStats | HMSTrackStats>(\n draftStats: Record<TID, T | undefined>,\n newStats: Record<TID, Partial<T | undefined>>,\n) => {\n const IDs = union(Object.keys(draftStats), Object.keys(newStats)) as TID[];\n for (const trackID of IDs) {\n const oldStat = draftStats[trackID];\n const newStat = newStats[trackID];\n if (isEntityUpdated(oldStat, newStat)) {\n Object.assign(oldStat!, newStat);\n } else if (isEntityRemoved(oldStat, newStat)) {\n delete draftStats[trackID];\n } else if (isEntityAdded(oldStat, newStat)) {\n draftStats[trackID] = newStat as T;\n }\n }\n};\n\nexport const mergeLocalTrackStats = (\n draftStats: Record<HMSTrackID, HMSTrackStats[] | undefined>,\n newStats: Record<HMSTrackID, Record<string, HMSTrackStats>>,\n tracks: SDKHMSLocalTrack[],\n) => {\n const trackMap: Record<string, HMSTrackStats[]> = tracks.reduce((acc, track) => {\n // @ts-ignore\n acc[track.firstTrackId] = Object.values(newStats[track.getTrackIDBeingSent()] || {}).sort((a, b) => {\n if (!a.rid || !b.rid) {\n return 0;\n }\n return a.rid < b.rid ? -1 : 1;\n });\n return acc;\n }, {});\n const IDs = union(Object.keys(draftStats), Object.keys(trackMap));\n for (const trackID of IDs) {\n if (!trackMap[trackID]) {\n delete draftStats[trackID];\n continue;\n }\n draftStats[trackID] = trackMap[trackID];\n }\n};\n\n/**\n * array's are usually created with new reference, avoid that update if both arrays are same\n */\nexport const mergeTrackArrayFields = (oldTrack: HMSTrack, newTrack: Partial<HMSTrack>) => {\n if (oldTrack.plugins && areArraysEqual(oldTrack.plugins, newTrack.plugins)) {\n newTrack.plugins = oldTrack.plugins;\n }\n if (\n oldTrack.type === 'video' &&\n oldTrack.layerDefinitions &&\n areArraysEqual(oldTrack.layerDefinitions, (newTrack as HMSVideoTrack | HMSScreenVideoTrack).layerDefinitions)\n ) {\n (newTrack as HMSVideoTrack | HMSScreenVideoTrack).layerDefinitions = oldTrack.layerDefinitions;\n }\n};\n\nexport const isEntityUpdated = <T>(oldItem: T, newItem: T) => oldItem && newItem;\nconst isEntityRemoved = <T>(oldItem: T, newItem: T) => oldItem && !newItem;\nconst isEntityAdded = <T>(oldItem: T, newItem: T) => !oldItem && newItem;\n\n// eslint-disable-next-line complexity\nexport const areArraysEqual = <T>(arr1: T[], arr2?: T[]): boolean => {\n if (arr1 === arr2 || (arr1.length === 0 && arr2?.length === 0)) {\n // reference check\n return true;\n }\n if (!arr1 || !arr2 || !(arr1.length === arr2.length)) {\n return false;\n }\n for (let i = 0; i < arr1.length; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n};\n\nconst union = <T>(arr1: T[], arr2: T[]): T[] => {\n const set: Set<T> = new Set();\n for (const elem of arr1) {\n set.add(elem);\n }\n for (const elem of arr2) {\n set.add(elem);\n }\n return Array.from(set);\n};\n", "import { HMSPeerStats, HMSSdk, HMSTrackStats, HMSWebrtcStats } from '@100mslive/hms-video';\nimport { mergeLocalTrackStats, mergeNewIndividualStatsInDraft } from '../hmsSDKStore/sdkUtils/storeMergeUtils';\nimport { IHMSStatsStore, IHMSStore } from '../IHMSStore';\nimport { createDefaultStatsStore, HMSPeerID, HMSRoomState, HMSTrack, HMSTrackID } from '../schema';\nimport {\n selectLocalAudioTrackID,\n selectLocalPeerID,\n selectLocalVideoTrackID,\n selectRoomState,\n selectTracksMap,\n} from '../selectors';\n\ntype Unsubscribe = (() => void) | undefined;\nexport const subscribeToSdkWebrtcStats = (sdk: HMSSdk, webrtcStore: IHMSStatsStore, store: IHMSStore) => {\n // also used as flag to check if webrtc internals has been initialised\n let unsubscribe: Unsubscribe;\n /**\n * Connected to room, webrtc internals can be initialized\n */\n if (store.getState(selectRoomState) === HMSRoomState.Connected) {\n unsubscribe = initAndSubscribeWebrtcStore(sdk, webrtcStore, store);\n }\n\n /**\n * Subscribe to room state for 2 purposes:\n * - unsubscribe on leave\n * - if internals is called before join is completed, init internals when roomState changes to connected\n */\n store.subscribe(roomState => {\n if ([HMSRoomState.Connected, HMSRoomState.Reconnecting].includes(roomState)) {\n if (!unsubscribe) {\n unsubscribe = initAndSubscribeWebrtcStore(sdk, webrtcStore, store);\n }\n // room state can go to disconnecting and back to connected if leave fails, we don't want to resubscribe in that case\n } else if ([HMSRoomState.Disconnected, HMSRoomState.Failed].includes(roomState)) {\n if (unsubscribe) {\n resetHMSStatsStore(webrtcStore, roomState);\n unsubscribe();\n // set flag to defined after unsubscribing to enable subscribing again\n unsubscribe = undefined;\n }\n }\n }, selectRoomState);\n};\n\nconst initAndSubscribeWebrtcStore = (sdk: HMSSdk, webrtcStore: IHMSStatsStore, store: IHMSStore) => {\n const unsubLocalPeer = updateLocalPeerInWebrtcStore(store, webrtcStore);\n\n sdk.getWebrtcInternals()?.start();\n const unsubSdkStats = sdk\n .getWebrtcInternals()\n ?.onStatsChange(stats => updateWebrtcStoreStats(webrtcStore, stats, store, sdk));\n\n return () => {\n unsubLocalPeer();\n unsubSdkStats && unsubSdkStats();\n };\n};\n\nconst updateLocalPeerInWebrtcStore = (store: IHMSStore, webrtcStore: IHMSStatsStore) => {\n let unsubID: Unsubscribe, unsubVideoTrackID: Unsubscribe, unsubAudioTrackID: Unsubscribe;\n if (store.getState(selectLocalPeerID)) {\n webrtcStore.namedSetState(draft => {\n draft.localPeer.id = store.getState(selectLocalPeerID);\n }, 'localpeer-id');\n } else {\n unsubID = store.subscribe(localPeerID => {\n localPeerID &&\n webrtcStore.namedSetState(draft => {\n draft.localPeer.id = localPeerID;\n }, 'localpeer-id');\n }, selectLocalPeerID);\n }\n\n if (store.getState(selectLocalVideoTrackID)) {\n webrtcStore.namedSetState(draft => {\n draft.localPeer.videoTrack = store.getState(selectLocalVideoTrackID);\n }, 'localpeer-videotrack-id');\n } else {\n unsubVideoTrackID = store.subscribe(videoTrackID => {\n videoTrackID &&\n webrtcStore.namedSetState(draft => {\n draft.localPeer.videoTrack = videoTrackID;\n }, 'localpeer-videotrack-id');\n }, selectLocalVideoTrackID);\n }\n\n if (store.getState(selectLocalAudioTrackID)) {\n webrtcStore.namedSetState(draft => {\n draft.localPeer.audioTrack = store.getState(selectLocalAudioTrackID);\n }, 'localpeer-audiotrack-id');\n } else {\n unsubAudioTrackID = store.subscribe(audioTrackID => {\n audioTrackID &&\n webrtcStore.namedSetState(draft => {\n draft.localPeer.audioTrack = audioTrackID;\n }, 'localpeer-audiotrack-id');\n }, selectLocalAudioTrackID);\n }\n\n return () => {\n unsubID?.();\n unsubVideoTrackID?.();\n unsubAudioTrackID?.();\n };\n};\n\nconst updateWebrtcStoreStats = (\n webrtcStore: IHMSStatsStore,\n stats: HMSWebrtcStats,\n hmsStore: IHMSStore,\n sdk: HMSSdk,\n) => {\n const tracks: Record<HMSTrackID, HMSTrack> = hmsStore.getState(selectTracksMap);\n webrtcStore.namedSetState(store => {\n const localPeerID = hmsStore.getState(selectLocalPeerID);\n const newTrackStats: Record<HMSTrackID, HMSTrackStats> = {};\n const trackIDs = Object.keys(tracks).filter(trackID => tracks[trackID].peerId !== localPeerID);\n\n for (const trackID of trackIDs) {\n const sdkTrackStats = stats.getRemoteTrackStats(trackID);\n if (sdkTrackStats) {\n newTrackStats[trackID] = sdkTrackStats;\n }\n }\n\n mergeNewIndividualStatsInDraft<HMSTrackID, HMSTrackStats>(store.remoteTrackStats, newTrackStats);\n\n // @TODO: Include all peer stats, own ticket, transmit local peer stats to other peer's using biz\n const newPeerStats = { [localPeerID]: stats.getLocalPeerStats() };\n mergeNewIndividualStatsInDraft<HMSPeerID, HMSPeerStats>(store.peerStats, newPeerStats);\n // @ts-ignore\n mergeLocalTrackStats(store.localTrackStats, stats.getLocalTrackStats(), sdk.store.getLocalPeerTracks());\n }, 'webrtc-stats');\n};\n\nconst resetHMSStatsStore = (store: IHMSStatsStore, reason = 'resetState') => {\n store.namedSetState(draft => {\n Object.assign(draft, createDefaultStatsStore());\n }, reason);\n};\n", "import { isBrowser } from '@100mslive/hms-video';\n\nexport const storeNameWithTabTitle = (storeName: string) => {\n return isBrowser ? `${storeName} ${document.title}` : storeName;\n};\n", "import { produce } from 'immer';\nimport shallow from 'zustand/shallow';\nimport create, {\n EqualityChecker,\n PartialState,\n SetState,\n State,\n StateSelector,\n StateSliceListener,\n StoreApi,\n} from 'zustand/vanilla';\nimport { HMSSdk, isBrowser } from '@100mslive/hms-video';\nimport { HMSNotifications } from './HMSNotifications';\nimport { HMSSDKActions } from './HMSSDKActions';\nimport { NamedSetState } from './internalTypes';\nimport { storeNameWithTabTitle } from '../../common/storeName';\nimport { IHMSActions } from '../IHMSActions';\nimport { IHMSStatsStoreReadOnly, IHMSStore, IHMSStoreReadOnly, IStore } from '../IHMSStore';\nimport { createDefaultStoreState, HMSGenericTypes, HMSStore } from '../schema';\nimport { IHMSNotifications } from '../schema/notification';\nimport { HMSStats } from '../';\n\ndeclare global {\n interface Window {\n __hms: HMSReactiveStore;\n __triggerBeamEvent__: (args: any) => void;\n }\n}\n\nexport class HMSReactiveStore<T extends HMSGenericTypes = { sessionStore: Record<string, any> }> {\n private readonly sdk?: HMSSdk;\n private readonly actions: IHMSActions<T>;\n private readonly store: IHMSStore<T>;\n private readonly notifications: HMSNotifications<T>;\n private stats?: HMSStats;\n /** @TODO store flag for both HMSStore and HMSInternalsStore */\n private initialTriggerOnSubscribe: boolean;\n\n constructor(hmsStore?: IHMSStore<T>, hmsActions?: IHMSActions<T>, hmsNotifications?: HMSNotifications<T>) {\n if (hmsStore) {\n this.store = hmsStore;\n } else {\n this.store = HMSReactiveStore.createNewHMSStore<HMSStore<T>>(\n storeNameWithTabTitle('HMSStore'),\n createDefaultStoreState,\n );\n }\n if (hmsNotifications) {\n this.notifications = hmsNotifications;\n } else {\n this.notifications = new HMSNotifications(this.store);\n }\n if (hmsActions) {\n this.actions = hmsActions;\n } else {\n this.sdk = new HMSSdk();\n this.actions = new HMSSDKActions(this.store, this.sdk, this.notifications);\n }\n\n // @ts-ignore\n this.actions.setFrameworkInfo({ type: 'js', sdkVersion: require('../../../package.json').version });\n\n this.initialTriggerOnSubscribe = false;\n\n if (isBrowser) {\n // @ts-ignore\n window.__hms = this;\n }\n }\n\n /**\n * By default store.subscribe does not call the handler with the current state at time of subscription,\n * this behaviour can be modified by calling this function. What it means is that instead of calling the\n * handler only for changes which happen post subscription we'll also call it exactly once at the time\n * of subscription with the current state. This behaviour is similar to that of BehaviourSubject in rxjs.\n * This will be an irreversible change\n *\n * Note: you don't need this if you're using our react hooks, it takes care of this requirement.\n */\n triggerOnSubscribe(): void {\n if (this.initialTriggerOnSubscribe) {\n // already done\n return;\n }\n HMSReactiveStore.makeStoreTriggerOnSubscribe(this.store);\n this.initialTriggerOnSubscribe = true;\n }\n\n /**\n * A reactive store which has a subscribe method you can use in combination with selectors\n * to subscribe to a subset of the store. The store serves as a single source of truth for\n * all data related to the corresponding HMS Room.\n */\n getStore(): IHMSStoreReadOnly {\n return this.store;\n }\n\n /**\n * Any action which may modify the store or may need to talk to the SDK will happen\n * through the IHMSActions instance returned by this\n *\n * @deprecated use getActions\n */\n getHMSActions(): IHMSActions<T> {\n return this.actions;\n }\n\n /**\n * Any action which may modify the store or may need to talk to the SDK will happen\n * through the IHMSActions instance returned by this\n */\n getActions(): IHMSActions<T> {\n return this.actions;\n }\n\n /**\n * This return notification handler function to which you can pass your callback to\n * receive notifications like peer joined, peer left, etc. to show in your UI or use\n * for analytics\n */\n getNotifications(): IHMSNotifications {\n return { onNotification: this.notifications.onNotification };\n }\n\n /**\n * @alpha\n */\n getStats = (): IHMSStatsStoreReadOnly => {\n if (!this.stats) {\n this.stats = new HMSStats(this.store as unknown as IHMSStore, this.sdk);\n }\n return this.stats;\n };\n\n /**\n * @internal\n */\n static createNewHMSStore<T extends State>(storeName: string, defaultCreatorFn: () => T): IStore<T> {\n const hmsStore = create<T>(() => defaultCreatorFn());\n // make set state immutable, by passing functions through immer\n const savedSetState = hmsStore.setState;\n hmsStore.setState = (partial: any) => {\n const nextState = typeof partial === 'function' ? produce(partial) : partial;\n savedSetState(nextState);\n };\n // add option to pass selector to getState\n const prevGetState = hmsStore.getState;\n // eslint-disable-next-line complexity\n hmsStore.getState = <StateSlice>(selector?: StateSelector<T, StateSlice>) => {\n return selector ? selector(prevGetState()) : prevGetState();\n };\n HMSReactiveStore.compareWithShallowCheckInSubscribe(hmsStore);\n const namedSetState = HMSReactiveStore.setUpDevtools(hmsStore, storeName);\n return { ...hmsStore, namedSetState };\n }\n\n /**\n * @internal\n */\n static makeStoreTriggerOnSubscribe<T extends State>(store: IStore<T>) {\n const prevSubscribe = store.subscribe;\n store.subscribe = <StateSlice>(\n listener: StateSliceListener<StateSlice>,\n selector?: StateSelector<T, StateSlice>,\n equalityFn?: EqualityChecker<StateSlice>,\n ): (() => void) => {\n // initial call, the prev state will always be null for this\n listener(store.getState(selector), undefined as unknown as StateSlice);\n // then subscribe\n return prevSubscribe(listener, selector!, equalityFn);\n };\n }\n\n /**\n * use shallow equality check by default for subscribe to optimize for array/object selectors.\n * by default zustand does only reference matching so something like, getPeers for eg. would trigger\n * the corresponding component even if peers didn't actually change, as selectPeers creates a new array every time.\n * Although the array reference changes, the order of peers and peer objects don't themselves change in this case,\n * and a shallow check avoids that triggering.\n * @private\n */\n private static compareWithShallowCheckInSubscribe<T extends State>(hmsStore: StoreApi<T>) {\n const prevSubscribe = hmsStore.subscribe;\n hmsStore.subscribe = <StateSlice>(\n listener: StateSliceListener<StateSlice>,\n selector?: StateSelector<T, StateSlice>,\n equalityFn?: EqualityChecker<StateSlice>,\n ): (() => void) => {\n if (!selector) {\n selector = (store): StateSlice => store as unknown as StateSlice;\n }\n equalityFn = equalityFn || shallow;\n return prevSubscribe(listener, selector, equalityFn);\n };\n }\n\n /**\n * @private\n * @privateRemarks\n * sets up redux devtools for the store, so redux extension can be used to visualize the store.\n * zustand's default devtool middleware only enhances the set function, we're here creating another nameSetState in\n * IHMStore which behaves like setState but takes an extra parameter for action name\n * https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/API/Methods.md\n * modified version of zustand's devtools - https://github.com/pmndrs/zustand/blob/v3.5.7/src/middleware.ts#L46\n */\n private static setUpDevtools<T extends State>(api: StoreApi<T>, prefix: string): NamedSetState<T> {\n let extension;\n try {\n extension = (window as any).__REDUX_DEVTOOLS_EXTENSION__ || (window as any).top.__REDUX_DEVTOOLS_EXTENSION__;\n } catch {}\n if (!extension) {\n return (fn: any) => {\n api.setState(fn);\n };\n }\n const devtools = extension.connect(HMSReactiveStore.devtoolsOptions(prefix));\n devtools.prefix = prefix ? `${prefix} > ` : '';\n const savedSetState = api.setState;\n api.setState = (fn: any) => {\n savedSetState(fn);\n devtools.send(`${devtools.prefix}setState`, api.getState());\n };\n\n devtools.subscribe(HMSReactiveStore.devtoolsSubscribe(devtools, api, savedSetState));\n\n devtools.send('setUpStore', api.getState());\n\n return (fn: any, action?: string) => {\n savedSetState(fn);\n const actionName = action ? action : `${devtools.prefix}action`;\n devtools.send(actionName, api.getState());\n };\n }\n\n /**\n * https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/API/Arguments.md\n */\n private static devtoolsOptions(prefix: string) {\n return {\n name: prefix,\n actionsBlacklist: ['audioLevel', 'playlistProgress', 'connectionQuality'], // very high frequency update, pollutes the action history\n };\n }\n\n /**\n * redux devtools allows for time travel debugging where it sends an action to update the store, users can\n * also export and import state in the devtools, listen to the corresponding functions from devtools and take\n * required action.\n * @param devtools - reference to devtools extension object\n * @param api\n * @param savedSetState - setState saved before its modified to update devtools\n * @private\n */\n private static devtoolsSubscribe<T extends State>(devtools: any, api: StoreApi<T>, savedSetState: SetState<T>) {\n // disabling complexity check instead of refactoring so as to keep the code close to zustand's and make\n // any future update based on upstream changes easier.\n // eslint-disable-next-line complexity\n return (message: any) => {\n if (message.type === 'DISPATCH' && message.state) {\n const ignoreState = ['JUMP_TO_ACTION', 'JUMP_TO_STATE'].includes(message.payload.type);\n if (!ignoreState) {\n // manual dispatch from the extension\n api.setState(JSON.parse(message.state));\n } else {\n // for time travel, no need to add new state changes in devtools\n savedSetState(JSON.parse(message.state));\n }\n } else if (message.type === 'DISPATCH' && message.payload?.type === 'COMMIT') {\n devtools.init(api.getState());\n } else if (message.type === 'DISPATCH' && message.payload?.type === 'IMPORT_STATE') {\n const actions = message.payload.nextLiftedState?.actionsById;\n const computedStates = message.payload.nextLiftedState?.computedStates || [];\n\n computedStates.forEach(({ state }: { state: PartialState<T> }, index: number) => {\n const action = actions[index] || `${devtools.prefix}setState`;\n if (index === 0) {\n devtools.init(state);\n } else {\n savedSetState(state);\n devtools.send(action, api.getState());\n }\n });\n }\n };\n }\n}\n", "import { EventEmitter2 as EventEmitter } from 'eventemitter2';\nimport { PEER_NOTIFICATION_TYPES, POLL_NOTIFICATION_TYPES, TRACK_NOTIFICATION_TYPES } from './common/mapping';\nimport * as sdkTypes from './sdkTypes';\nimport { IHMSStore } from '../IHMSStore';\nimport {\n HMSChangeMultiTrackStateRequest,\n HMSChangeTrackStateRequest,\n HMSDeviceChangeEvent,\n HMSException,\n HMSGenericTypes,\n HMSLeaveRoomRequest,\n HMSMessage,\n HMSNotification,\n HMSNotificationSeverity,\n HMSNotificationTypes,\n HMSPeer,\n HMSPlaylistItem,\n HMSTrack,\n HMSTrackID,\n} from '../schema';\nimport {\n HMSNotificationCallback,\n HMSNotificationInCallback,\n HMSNotificationTypeParam,\n IHMSNotifications,\n} from '../schema/notification';\nimport { selectPeerByID, selectPollByID, selectTrackByID } from '../selectors';\n\nconst HMS_NOTIFICATION_EVENT = 'hmsNotification';\n\nexport class HMSNotifications<T extends HMSGenericTypes = { sessionStore: Record<string, any> }>\n implements IHMSNotifications\n{\n private id = 0;\n private eventEmitter: EventEmitter;\n private store: IHMSStore<T>;\n\n constructor(store: IHMSStore<T>) {\n this.store = store;\n this.eventEmitter = new EventEmitter({ maxListeners: Object.keys(HMSNotificationTypes).length });\n }\n onNotification = <T extends HMSNotificationTypeParam>(cb: HMSNotificationCallback<T>, type?: T) => {\n const eventCallback = (notification: HMSNotificationInCallback<T>) => {\n if (type) {\n let matchesType: boolean;\n if (Array.isArray(type)) {\n matchesType = type.includes(notification.type as HMSNotificationTypes);\n } else {\n matchesType = type === notification.type;\n }\n if (!matchesType) {\n return;\n }\n }\n cb(notification);\n };\n this.eventEmitter.addListener(HMS_NOTIFICATION_EVENT, eventCallback);\n return () => {\n this.eventEmitter.removeListener(HMS_NOTIFICATION_EVENT, eventCallback);\n };\n };\n\n sendPlaylistTrackEnded<T>(item: HMSPlaylistItem<T>): void {\n const notification = this.createNotification(\n HMSNotificationTypes.PLAYLIST_TRACK_ENDED,\n item,\n HMSNotificationSeverity.INFO,\n );\n this.emitEvent(notification);\n }\n\n sendDeviceChange(request: HMSDeviceChangeEvent) {\n const notification = this.createNotification(\n HMSNotificationTypes.DEVICE_CHANGE_UPDATE,\n request,\n request.error ? HMSNotificationSeverity.ERROR : HMSNotificationSeverity.INFO,\n `Selected ${request.type} device - ${request.selection?.label}`,\n );\n this.emitEvent(notification);\n }\n\n sendLeaveRoom(request: HMSLeaveRoomRequest) {\n const peerName = request.requestedBy?.name;\n const notification = this.createNotification(\n request.roomEnded || !peerName ? HMSNotificationTypes.ROOM_ENDED : HMSNotificationTypes.REMOVED_FROM_ROOM,\n request,\n HMSNotificationSeverity.INFO,\n `${request.roomEnded ? `Room ended` : 'Removed from room'} ${peerName ? `by ${peerName}` : ''}`,\n );\n this.emitEvent(notification);\n }\n\n sendPeerList(peers: HMSPeer[]) {\n if (peers.length === 0) {\n return;\n }\n const notification = this.createNotification(HMSNotificationTypes.PEER_LIST, peers, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n\n sendPeerUpdate(type: sdkTypes.HMSPeerUpdate, peer: HMSPeer | null) {\n const hmsPeer = this.store.getState(selectPeerByID(peer?.id)) || peer;\n const notificationType = PEER_NOTIFICATION_TYPES[type];\n if (notificationType && hmsPeer) {\n const notification = this.createNotification(notificationType, hmsPeer, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n }\n\n sendTrackUpdate(type: sdkTypes.HMSTrackUpdate, trackID: HMSTrackID) {\n const hmsTrack = this.store.getState(selectTrackByID(trackID));\n const notificationType = TRACK_NOTIFICATION_TYPES[type];\n if (notificationType) {\n const notification = this.createNotification(notificationType, hmsTrack, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n }\n\n sendMessageReceived(message: HMSMessage) {\n const notification = this.createNotification(\n HMSNotificationTypes.NEW_MESSAGE,\n message,\n HMSNotificationSeverity.INFO,\n );\n this.emitEvent(notification);\n }\n\n sendError(error: HMSException) {\n const notification = this.createNotification(HMSNotificationTypes.ERROR, error, HMSNotificationSeverity.ERROR);\n this.emitEvent(notification);\n }\n\n sendReconnecting(error: HMSException) {\n const notification = this.createNotification(\n HMSNotificationTypes.RECONNECTING,\n error,\n HMSNotificationSeverity.ERROR,\n );\n this.emitEvent(notification);\n }\n\n sendReconnected() {\n const notification = this.createNotification(HMSNotificationTypes.RECONNECTED, null, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n\n sendChangeTrackStateRequest(request: HMSChangeTrackStateRequest) {\n const notification = this.createNotification(\n HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST,\n request,\n HMSNotificationSeverity.INFO,\n );\n this.emitEvent(notification);\n }\n\n sendChangeMultiTrackStateRequest(request: HMSChangeMultiTrackStateRequest) {\n const notification = this.createNotification(\n HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST,\n request,\n HMSNotificationSeverity.INFO,\n );\n this.emitEvent(notification);\n }\n\n sendPollUpdate(type: sdkTypes.HMSPollsUpdate, pollID: string) {\n const notificationType = POLL_NOTIFICATION_TYPES[type];\n const poll = this.store.getState(selectPollByID(pollID));\n\n if (notificationType) {\n const notification = this.createNotification(notificationType, poll, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n }\n\n private emitEvent(notification: HMSNotification) {\n this.eventEmitter.emit(HMS_NOTIFICATION_EVENT, notification);\n }\n\n private createNotification<T>(\n type: HMSNotificationTypes,\n data?:\n | HMSPeer\n | HMSPeer[]\n | HMSTrack\n | HMSMessage\n | HMSException\n | HMSChangeTrackStateRequest\n | HMSChangeMultiTrackStateRequest\n | HMSLeaveRoomRequest\n | HMSDeviceChangeEvent\n | HMSPlaylistItem<T>\n | sdkTypes.HMSPoll\n | null,\n severity?: HMSNotificationSeverity,\n message = '',\n ): HMSNotification {\n this.id++;\n return {\n id: this.id,\n type,\n message,\n data,\n severity,\n } as HMSNotification;\n }\n}\n", "import { HMSNotificationTypes } from '../../schema/notification';\nimport * as sdkTypes from '../sdkTypes';\n\ntype PeerNotificationMap = { [key in sdkTypes.HMSPeerUpdate]?: HMSNotificationTypes };\n\nexport const PEER_NOTIFICATION_TYPES: PeerNotificationMap = {\n [sdkTypes.HMSPeerUpdate.PEER_JOINED]: HMSNotificationTypes.PEER_JOINED,\n [sdkTypes.HMSPeerUpdate.PEER_LEFT]: HMSNotificationTypes.PEER_LEFT,\n [sdkTypes.HMSPeerUpdate.ROLE_UPDATED]: HMSNotificationTypes.ROLE_UPDATED,\n [sdkTypes.HMSPeerUpdate.NAME_UPDATED]: HMSNotificationTypes.NAME_UPDATED,\n [sdkTypes.HMSPeerUpdate.METADATA_UPDATED]: HMSNotificationTypes.METADATA_UPDATED,\n [sdkTypes.HMSPeerUpdate.HAND_RAISE_CHANGED]: HMSNotificationTypes.HAND_RAISE_CHANGED,\n};\n\ntype TrackNotificationMap = { [key in sdkTypes.HMSTrackUpdate]: HMSNotificationTypes };\nexport const TRACK_NOTIFICATION_TYPES: TrackNotificationMap = {\n [sdkTypes.HMSTrackUpdate.TRACK_ADDED]: HMSNotificationTypes.TRACK_ADDED,\n [sdkTypes.HMSTrackUpdate.TRACK_REMOVED]: HMSNotificationTypes.TRACK_REMOVED,\n [sdkTypes.HMSTrackUpdate.TRACK_MUTED]: HMSNotificationTypes.TRACK_MUTED,\n [sdkTypes.HMSTrackUpdate.TRACK_UNMUTED]: HMSNotificationTypes.TRACK_UNMUTED,\n [sdkTypes.HMSTrackUpdate.TRACK_DEGRADED]: HMSNotificationTypes.TRACK_DEGRADED,\n [sdkTypes.HMSTrackUpdate.TRACK_RESTORED]: HMSNotificationTypes.TRACK_RESTORED,\n [sdkTypes.HMSTrackUpdate.TRACK_DESCRIPTION_CHANGED]: HMSNotificationTypes.TRACK_DESCRIPTION_CHANGED,\n};\n\ntype PollNotificationMap = { [key in sdkTypes.HMSPollsUpdate]: HMSNotificationTypes };\n\nexport const POLL_NOTIFICATION_TYPES: PollNotificationMap = {\n [sdkTypes.HMSPollsUpdate.POLL_CREATED]: HMSNotificationTypes.POLL_CREATED,\n [sdkTypes.HMSPollsUpdate.POLL_STARTED]: HMSNotificationTypes.POLL_STARTED,\n [sdkTypes.HMSPollsUpdate.POLL_STOPPED]: HMSNotificationTypes.POLL_STOPPED,\n [sdkTypes.HMSPollsUpdate.POLL_STATS_UPDATED]: HMSNotificationTypes.POLL_VOTES_UPDATED,\n};\n", "import {\n HMSAudioPlugin,\n HMSAudioTrack as SDKHMSAudioTrack,\n HMSChangeMultiTrackStateParams as SDKHMSChangeMultiTrackStateParams,\n HMSChangeMultiTrackStateRequest as SDKHMSChangeMultiTrackStateRequest,\n HMSChangeTrackStateRequest as SDKHMSChangeTrackStateRequest,\n HMSException as SDKHMSException,\n HMSLeaveRoomRequest as SDKHMSLeaveRoomRequest,\n HMSLocalAudioTrack as SDKHMSLocalAudioTrack,\n HMSLocalTrack as SDKHMSLocalTrack,\n HMSLocalVideoTrack as SDKHMSLocalVideoTrack,\n HMSLogLevel,\n HMSPluginSupportResult,\n HMSRemoteTrack as SDKHMSRemoteTrack,\n HMSRemoteVideoTrack as SDKHMSRemoteVideoTrack,\n HMSRoleChangeRequest as SDKHMSRoleChangeRequest,\n HMSScreenShareConfig,\n HMSSdk,\n HMSSimulcastLayer,\n HMSTrack as SDKHMSTrack,\n HMSVideoPlugin,\n HMSVideoTrack as SDKHMSVideoTrack,\n SessionStoreUpdate,\n} from '@100mslive/hms-video';\nimport { PEER_NOTIFICATION_TYPES, POLL_NOTIFICATION_TYPES, TRACK_NOTIFICATION_TYPES } from './common/mapping';\nimport { isRemoteTrack } from './sdkUtils/sdkUtils';\nimport {\n areArraysEqual,\n isEntityUpdated,\n mergeNewPeersInDraft,\n mergeNewPollsInDraft,\n mergeNewTracksInDraft,\n mergeTrackArrayFields,\n} from './sdkUtils/storeMergeUtils';\nimport { SDKToHMS } from './adapter';\nimport { HMSInteractivityCenter } from './HMSInteractivityCenter';\nimport { HMSNotifications } from './HMSNotifications';\nimport { HMSPlaylist } from './HMSPlaylist';\nimport { HMSSessionStore } from './HMSSessionStore';\nimport { NamedSetState } from './internalTypes';\nimport * as sdkTypes from './sdkTypes';\nimport { HMSLogger } from '../../common/ui-logger';\nimport { BeamSpeakerLabelsLogger } from '../../controller/beam/BeamSpeakerLabelsLogger';\nimport { IHMSActions } from '../IHMSActions';\nimport { IHMSStore } from '../IHMSStore';\nimport {\n createDefaultStoreState,\n HMSChangeMultiTrackStateParams,\n HMSGenericTypes,\n HMSMediaSettings,\n HMSMessage,\n HMSMessageInput,\n HMSPeer,\n HMSPeerID,\n HMSPeerListIteratorOptions,\n HMSPlaylistType,\n HMSRoleName,\n HMSRoomState,\n HMSStore,\n HMSTrack,\n HMSTrackID,\n HMSTrackSource,\n HMSVideoTrack,\n IHMSInteractivityCenter,\n IHMSPlaylistActions,\n IHMSSessionStoreActions,\n} from '../schema';\nimport {\n HMSRoleChangeRequest,\n selectIsConnectedToRoom,\n selectIsInPreview,\n selectIsLocalScreenShared,\n selectIsLocalVideoDisplayEnabled,\n selectIsLocalVideoEnabled,\n selectLocalAudioTrackID,\n selectLocalMediaSettings,\n selectLocalPeer,\n selectLocalTrackIDs,\n selectLocalVideoTrackID,\n selectPeerByID,\n selectPeersMap,\n selectPermissions,\n selectRolesMap,\n selectRoomState,\n selectTrackByID,\n selectTracksMap,\n selectVideoTrackByID,\n} from '../selectors';\n\n// import { ActionBatcher } from './sdkUtils/ActionBatcher';\n\n/**\n * This class implements the IHMSActions interface for 100ms SDK. It connects with SDK\n * and takes control of data management by letting every action pass through it. The\n * passed in store is ensured to be the single source of truth reflecting current\n * room related data at any point in time.\n *\n * @privateRemarks\n * Things to keep in mind while updating store -\n * 1. Treat setState as an atomic operation, if an action results in multiple changes,\n * the changes should all happen within single setState function.\n * 2. While updating the state it's very important to not update the reference if\n * something is unchanged. Copy data in same reference object don't assign new\n * object.\n * 3. Mental Model(1) - Actions from backend -> Listeners of this class -> update store -> views update themselves\n * eg. for this - peer added, remote muted etc.\n * 4. Mental Model(2) - Actions from local -> View calls actions -> update store -> views update themselves\n * eg. local track enabled, join, leave etc.\n * 5. State is immutable, a new copy with new references is created when there is a change,\n * if you try to modify state outside of setState, there'll be an error.\n */\nexport class HMSSDKActions<T extends HMSGenericTypes = { sessionStore: Record<string, any> }>\n implements IHMSActions<T>\n{\n private hmsSDKTracks: Record<string, SDKHMSTrack> = {};\n private readonly sdk: HMSSdk;\n private readonly store: IHMSStore<T>;\n private isRoomJoinCalled = false;\n private hmsNotifications: HMSNotifications<T>;\n private ignoredMessageTypes: string[] = [];\n // private actionBatcher: ActionBatcher;\n audioPlaylist!: IHMSPlaylistActions;\n videoPlaylist!: IHMSPlaylistActions;\n sessionStore: IHMSSessionStoreActions<T['sessionStore']>;\n interactivityCenter: IHMSInteractivityCenter;\n private beamSpeakerLabelsLogger?: BeamSpeakerLabelsLogger<T>;\n\n constructor(store: IHMSStore<T>, sdk: HMSSdk, notificationManager: HMSNotifications<T>) {\n this.store = store;\n this.sdk = sdk;\n this.hmsNotifications = notificationManager;\n\n this.sessionStore = new HMSSessionStore<T['sessionStore']>(this.sdk, this.setSessionStoreValueLocally.bind(this));\n this.interactivityCenter = new HMSInteractivityCenter(this.sdk);\n // this.actionBatcher = new ActionBatcher(store);\n }\n\n async refreshDevices() {\n await this.sdk.refreshDevices();\n }\n\n async unblockAudio() {\n await this.sdk.getAudioOutput().unblockAutoplay();\n }\n\n async setVolume(value: number, trackId?: HMSTrackID) {\n if (trackId) {\n await this.setTrackVolume(value, trackId);\n } else {\n await this.sdk.getAudioOutput().setVolume(value);\n this.syncRoomState('setOutputVolume');\n }\n }\n\n async setAudioOutputDevice(deviceId: string): Promise<void> {\n const deviceInfo = await this.sdk.getAudioOutput().setDevice(deviceId);\n if (deviceInfo) {\n this.setState(draftStore => {\n draftStore.settings.audioOutputDeviceId = deviceId;\n }, 'setAudioOutputDevice');\n }\n }\n\n async setPreferredLayer(trackId: string, layer: sdkTypes.HMSPreferredSimulcastLayer) {\n const track = this.hmsSDKTracks[trackId];\n if (track) {\n if (track instanceof SDKHMSRemoteVideoTrack) {\n //@ts-ignore\n if (layer === HMSSimulcastLayer.NONE) {\n HMSLogger.d(`layer ${HMSSimulcastLayer.NONE} will be ignored`);\n return;\n }\n const alreadyInSameState = this.store.getState(selectVideoTrackByID(trackId))?.preferredLayer === layer;\n if (alreadyInSameState) {\n HMSLogger.d(`preferred layer is already ${layer}`);\n return;\n }\n this.setState(draftStore => {\n const track = draftStore.tracks[trackId] as HMSVideoTrack;\n if (track) {\n track.preferredLayer = layer;\n }\n }, 'setPreferredLayer');\n await track.setPreferredLayer(layer);\n } else {\n HMSLogger.d(`track ${trackId} is not a remote video track`);\n }\n } else {\n this.logPossibleInconsistency(`track ${trackId} not present, unable to set preffer layer`);\n }\n }\n\n getAuthTokenByRoomCode(\n tokenRequest: sdkTypes.TokenRequest,\n tokenRequestOptions?: sdkTypes.TokenRequestOptions,\n ): Promise<string> {\n return this.sdk.getAuthTokenByRoomCode(tokenRequest, tokenRequestOptions);\n }\n\n async preview(config: sdkTypes.HMSPreviewConfig) {\n const roomState = this.store.getState(selectRoomState);\n if (roomState === HMSRoomState.Preview || roomState === HMSRoomState.Connecting) {\n this.logPossibleInconsistency('attempting to call preview while room is in preview/connecting');\n return;\n }\n\n try {\n if (roomState !== HMSRoomState.Connected) {\n this.setState(store => {\n store.room.roomState = HMSRoomState.Connecting;\n }, 'connecting');\n }\n await this.sdkPreviewWithListeners(config);\n } catch (err) {\n HMSLogger.e('Cannot show preview. Failed to connect to room - ', err);\n throw err;\n }\n }\n\n async cancelMidCallPreview() {\n return this.sdk.cancelMidCallPreview();\n }\n\n async join(config: sdkTypes.HMSConfig) {\n if (this.isRoomJoinCalled) {\n this.logPossibleInconsistency('room join is called again');\n return; // ignore\n }\n try {\n this.isRoomJoinCalled = true;\n this.setState(store => {\n store.room.roomState = HMSRoomState.Connecting;\n }, 'join');\n await this.sdkJoinWithListeners(config);\n } catch (err) {\n this.isRoomJoinCalled = false; // so it can be called again if needed\n HMSLogger.e('Failed to connect to room - ', err);\n throw err;\n }\n }\n\n async leave() {\n const isConnectedToRoom = this.store.getState(selectIsConnectedToRoom);\n let notifyServer = true;\n if (!isConnectedToRoom) {\n notifyServer = false;\n this.logPossibleInconsistency('room leave is called when no room is connected');\n }\n const currentRoomState = this.store.getState(selectRoomState);\n this.setState(store => {\n store.room.roomState = HMSRoomState.Disconnecting;\n }, 'leaving');\n return this.sdk\n .leave(notifyServer)\n .then(() => {\n this.resetState('leave');\n if (this.beamSpeakerLabelsLogger) {\n this.beamSpeakerLabelsLogger.stop().catch(HMSLogger.e);\n }\n HMSLogger.i('left room');\n })\n .catch(err => {\n HMSLogger.e('error in leaving room - ', err);\n this.setState(store => {\n store.room.roomState = currentRoomState;\n }, 'revertLeave');\n });\n }\n\n async setScreenShareEnabled(enabled: boolean, config?: HMSScreenShareConfig) {\n // TODO: remove this, purely for backward compatibility\n if (typeof config === 'boolean') {\n config = { audioOnly: config };\n }\n try {\n if (enabled) {\n await this.startScreenShare(config);\n } else {\n await this.stopScreenShare();\n }\n } catch (error) {\n this.hmsNotifications.sendError(SDKToHMS.convertException(error as SDKHMSException));\n throw error;\n }\n }\n\n async addTrack(track: MediaStreamTrack, type: HMSTrackSource = 'regular') {\n await this.sdk.addTrack(track, type);\n this.syncRoomState('addTrack');\n }\n\n async removeTrack(trackId: string) {\n await this.sdk.removeTrack(trackId);\n this.syncRoomState('removeTrack');\n }\n\n async setLocalAudioEnabled(enabled: boolean) {\n const trackID = this.store.getState(selectLocalAudioTrackID);\n if (trackID) {\n await this.setEnabledTrack(trackID, enabled);\n }\n }\n\n async setLocalVideoEnabled(enabled: boolean) {\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (trackID) {\n await this.setEnabledTrack(trackID, enabled);\n }\n }\n\n async setEnabledTrack(trackID: string, enabled: boolean) {\n // if mute/unmute is clicked multiple times for same operation, ignore repeated ones\n const alreadyInSameState = this.store.getState().tracks[trackID]?.enabled === enabled;\n if (alreadyInSameState) {\n // it could also be a case of possible inconsistency where UI state is out of sync with truth\n this.logPossibleInconsistency(`local track[${trackID}] enabled state - ${enabled}`);\n return;\n }\n this.setState(store => {\n // show on UI immediately\n if (!store.tracks[trackID]) {\n this.logPossibleInconsistency('track id not found for setEnabled');\n } else {\n store.tracks[trackID].displayEnabled = enabled;\n }\n }, 'displayEnabled');\n try {\n await this.setEnabledSDKTrack(trackID, enabled); // do the operation\n this.syncRoomState('setEnabled');\n } catch (err) {\n // rollback on failure\n this.setState(store => {\n store.tracks[trackID].displayEnabled = !enabled;\n }, 'rollbackDisplayEnabled');\n this.hmsNotifications.sendError(SDKToHMS.convertException(err as SDKHMSException));\n throw err;\n }\n const type = enabled ? sdkTypes.HMSTrackUpdate.TRACK_UNMUTED : sdkTypes.HMSTrackUpdate.TRACK_MUTED;\n this.hmsNotifications.sendTrackUpdate(type, trackID);\n }\n\n async setAudioSettings(settings: Partial<sdkTypes.HMSAudioTrackSettings>) {\n const trackID = this.store.getState(selectLocalAudioTrackID);\n if (trackID) {\n await this.setSDKLocalAudioTrackSettings(trackID, settings);\n this.syncRoomState('setAudioSettings');\n }\n }\n\n async setVideoSettings(settings: Partial<sdkTypes.HMSVideoTrackSettings>) {\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (trackID) {\n await this.setSDKLocalVideoTrackSettings(trackID, settings);\n this.syncRoomState('setVideoSettings');\n }\n }\n\n async switchCamera(): Promise<void> {\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (trackID) {\n const sdkTrack = this.hmsSDKTracks[trackID] as SDKHMSLocalVideoTrack;\n if (sdkTrack) {\n await sdkTrack.switchCamera();\n this.syncRoomState('switchCamera');\n }\n }\n }\n\n sendMessage(message: string) {\n this.sendBroadcastMessage(message);\n }\n\n async sendBroadcastMessage(message: string, type?: string) {\n const sdkMessage = await this.sdk.sendBroadcastMessage(message, type);\n this.updateMessageInStore(sdkMessage, { message, type });\n }\n\n async sendGroupMessage(message: string, roles: string[], type?: string) {\n const storeRoles = this.store.getState(selectRolesMap);\n const hmsRoles = roles.map(roleName => {\n return storeRoles[roleName];\n });\n const sdkMessage = await this.sdk.sendGroupMessage(message, hmsRoles, type);\n this.updateMessageInStore(sdkMessage, { message, recipientRoles: roles, type });\n }\n\n async sendDirectMessage(message: string, peerID: string, type?: string) {\n const hmsPeer = this.getSDKHMSPeer(peerID);\n if (!hmsPeer) {\n HMSLogger.w('sendMessage', 'Failed to send message');\n throw Error(`sendMessage Failed - peer ${peerID} not found`);\n }\n const sdkMessage = await this.sdk.sendDirectMessage(message, hmsPeer, type);\n this.updateMessageInStore(sdkMessage, { message, recipientPeer: hmsPeer.peerId, type });\n }\n\n private updateMessageInStore(sdkMessage: sdkTypes.HMSMessage | void, messageInput: string | HMSMessageInput) {\n if (!sdkMessage) {\n HMSLogger.w('sendMessage', 'Failed to send message', messageInput);\n throw Error(`sendMessage Failed - ${JSON.stringify(messageInput)}`);\n }\n const hmsMessage = SDKToHMS.convertMessage(sdkMessage) as HMSMessage;\n hmsMessage.read = true;\n hmsMessage.senderName = 'You';\n hmsMessage.ignored = this.ignoredMessageTypes.includes(hmsMessage.type);\n this.putMessageInStore(hmsMessage);\n return hmsMessage;\n }\n\n setMessageRead(readStatus: boolean, messageId?: string) {\n this.setState(store => {\n if (messageId) {\n if (!store.messages.byID[messageId]) {\n this.logPossibleInconsistency('no message with id is found');\n } else {\n store.messages.byID[messageId].read = readStatus;\n }\n } else {\n store.messages.allIDs.forEach((id: string) => {\n store.messages.byID[id].read = readStatus;\n });\n }\n }, 'setMessageRead');\n }\n\n async attachVideo(trackID: string, videoElement: HTMLVideoElement) {\n if (this.localAndVideoUnmuting(trackID)) {\n // wait till video unmute has finished\n return new Promise<void>(resolve => {\n const unsub = this.store.subscribe(async enabled => {\n if (enabled) {\n await this.attachVideoInternal(trackID, videoElement);\n unsub();\n resolve();\n }\n }, selectIsLocalVideoEnabled);\n });\n } else {\n await this.attachVideoInternal(trackID, videoElement);\n }\n }\n\n async detachVideo(trackID: string, videoElement: HTMLVideoElement) {\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack?.type === 'video') {\n await this.sdk.detachVideo(sdkTrack as SDKHMSVideoTrack, videoElement);\n } else {\n if (videoElement) {\n videoElement.srcObject = null; // so chrome can clean up\n }\n HMSLogger.d('possible inconsistency detected - no video track found to remove sink');\n }\n }\n\n async addPluginToVideoTrack(plugin: HMSVideoPlugin, pluginFrameRate?: number): Promise<void> {\n return this.addRemoveVideoPlugin(plugin, 'add', pluginFrameRate);\n }\n async addPluginToAudioTrack(plugin: HMSAudioPlugin): Promise<void> {\n return this.addRemoveAudioPlugin(plugin, 'add');\n }\n\n validateVideoPluginSupport(plugin: HMSVideoPlugin): HMSPluginSupportResult {\n let result = {} as HMSPluginSupportResult;\n result.isSupported = false; //Setting default to false\n if (!plugin) {\n HMSLogger.w('no plugin passed in for checking support');\n result.errMsg = 'no plugin passed in for checking support';\n return result;\n }\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (!trackID) {\n HMSLogger.w('video Track not added to local peer yet');\n result.errMsg = 'call this function only after local peer has video track';\n return result;\n }\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack) {\n result = (sdkTrack as SDKHMSLocalVideoTrack).validatePlugin(plugin);\n } else {\n HMSLogger.w(`track ${trackID} not present, unable to validate plugin`);\n result.errMsg = `track ${trackID} not present, unable to validate plugin`;\n }\n\n return result;\n }\n\n validateAudioPluginSupport(plugin: HMSAudioPlugin): HMSPluginSupportResult {\n let result = {} as HMSPluginSupportResult;\n result.isSupported = false; //Setting default to false\n if (!plugin) {\n HMSLogger.w('no plugin passed in for checking support\"');\n result.errMsg = 'no plugin passed in for checking support\"';\n return result;\n }\n const trackID = this.store.getState(selectLocalAudioTrackID);\n if (!trackID) {\n HMSLogger.w('audio track not added to local peer yet');\n result.errMsg = 'call this function only after local peer has audio track';\n return result;\n }\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack) {\n result = (sdkTrack as SDKHMSLocalAudioTrack).validatePlugin(plugin);\n } else {\n HMSLogger.w(`track ${trackID} not present, unable to validate plugin`);\n result.errMsg = `track ${trackID} not present, unable to validate plugin`;\n }\n\n return result;\n }\n\n async removePluginFromVideoTrack(plugin: HMSVideoPlugin): Promise<void> {\n return this.addRemoveVideoPlugin(plugin, 'remove');\n }\n async removePluginFromAudioTrack(plugin: HMSAudioPlugin): Promise<void> {\n return this.addRemoveAudioPlugin(plugin, 'remove');\n }\n\n async changeRole(forPeerId: string, toRole: string, force = false) {\n await this.sdk.changeRoleOfPeer(forPeerId, toRole, force);\n }\n\n async changeRoleOfPeer(forPeerId: string, toRole: string, force = false) {\n await this.sdk.changeRoleOfPeer(forPeerId, toRole, force);\n }\n\n async changeRoleOfPeersWithRoles(roles: HMSRoleName[], toRole: HMSRoleName) {\n const rolesToBeChanged = this.sdk.getRoles().filter(role => roles.includes(role.name));\n await this.sdk.changeRoleOfPeersWithRoles(rolesToBeChanged, toRole);\n }\n\n // TODO: separate out role related things in another file\n async acceptChangeRole(request: HMSRoleChangeRequest) {\n const sdkPeer: sdkTypes.HMSPeer | undefined = request.requestedBy\n ? this.getSDKHMSPeer(request.requestedBy.id)\n : undefined;\n if (!sdkPeer) {\n HMSLogger.w(`peer for which role change is requested no longer available - ${request.requestedBy}`);\n }\n const sdkRequest = {\n requestedBy: sdkPeer,\n role: request.role,\n token: request.token,\n };\n // TODO: hotfix for HMS-3639. Needs a better solution\n await this.sdk.acceptChangeRole(sdkRequest);\n this.removeRoleChangeRequest(request);\n }\n\n async raiseLocalPeerHand() {\n await this.sdk.raiseLocalPeerHand();\n }\n async lowerLocalPeerHand() {\n await this.sdk.lowerLocalPeerHand();\n }\n async raiseRemotePeerHand(peerId: string) {\n await this.sdk.raiseRemotePeerHand(peerId);\n }\n async lowerRemotePeerHand(peerId: string) {\n await this.sdk.lowerRemotePeerHand(peerId);\n }\n\n getPeerListIterator(options?: HMSPeerListIteratorOptions) {\n const iterator = this.sdk.getPeerListIterator(options);\n return {\n hasNext: () => iterator.hasNext(),\n next: async () => {\n const sdkPeers = await iterator.next();\n return sdkPeers.map(peer => SDKToHMS.convertPeer(peer) as HMSPeer);\n },\n findPeers: async () => {\n const sdkPeers = await iterator.findPeers();\n return sdkPeers.map(peer => SDKToHMS.convertPeer(peer) as HMSPeer);\n },\n getTotal: () => iterator.getTotal(),\n };\n }\n\n initAppData(appData: Record<string, any>) {\n this.setState(store => {\n store.appData = appData;\n }, 'initAppData');\n }\n\n setAppData(key: string, value: any, merge?: boolean) {\n const isValueObject = value?.constructor.name === 'Object';\n this.setState(store => {\n if (store.appData) {\n if (merge && isValueObject) {\n Object.assign(store.appData[key], value);\n } else {\n store.appData[key] = value;\n }\n } else {\n const newAppData = {\n [key]: value,\n };\n store.appData = newAppData;\n }\n }, `setAppData-${key}`);\n }\n\n /**\n * @privateRemarks\n * there is no corresponding sdk method for rejecting change role but as the store also maintains the full\n * state of current pending requests, this method allows it to clean up when the request is rejected\n */\n rejectChangeRole(request: HMSRoleChangeRequest) {\n this.removeRoleChangeRequest(request);\n }\n\n async endRoom(lock: boolean, reason: string) {\n const permissions = this.store.getState(selectPermissions);\n if (!permissions?.endRoom) {\n HMSLogger.w('You are not allowed to perform this action - endRoom');\n return;\n }\n const currentRoomState = this.store.getState(selectRoomState);\n this.setState(store => {\n store.room.roomState = HMSRoomState.Disconnecting;\n }, 'endingRoom');\n try {\n await this.sdk.endRoom(lock, reason);\n this.resetState('endRoom');\n } catch (err) {\n HMSLogger.e('error in ending room - ', err);\n this.setState(store => {\n store.room.roomState = currentRoomState;\n }, 'revertEndRoom');\n }\n }\n\n async removePeer(peerID: string, reason: string) {\n const localPeerId = this.sdk.getLocalPeer()?.peerId;\n if (peerID !== localPeerId) {\n await this.sdk.removePeer(peerID, reason);\n }\n }\n\n async startRTMPOrRecording(params: sdkTypes.RTMPRecordingConfig) {\n await this.sdk.startRTMPOrRecording(params);\n }\n\n async stopRTMPAndRecording() {\n await this.sdk.stopRTMPAndRecording();\n }\n\n async startHLSStreaming(params?: sdkTypes.HLSConfig) {\n await this.sdk.startHLSStreaming(params);\n }\n\n async stopHLSStreaming(params?: sdkTypes.HLSConfig): Promise<void> {\n await this.sdk.stopHLSStreaming(params);\n }\n\n async sendHLSTimedMetadata(metadataList: sdkTypes.HLSTimedMetadata[]): Promise<void> {\n await this.sdk.sendHLSTimedMetadata(metadataList);\n }\n async changeName(name: string) {\n await this.sdk.changeName(name);\n }\n\n async changeMetadata(metadata: string | any) {\n if (typeof metadata !== 'string') {\n metadata = JSON.stringify(metadata);\n }\n await this.sdk.changeMetadata(metadata);\n }\n\n async setSessionMetadata(metadata: any) {\n await this.sdk.setSessionMetadata(metadata);\n this.setState(draftStore => {\n draftStore.sessionMetadata = metadata;\n }, 'setSessionMetadata');\n this.setSessionStoreValueLocally({ key: 'default', value: metadata }, 'setSessionMetadata');\n }\n\n async populateSessionMetadata(): Promise<void> {\n const metadata = await this.sdk.getSessionMetadata();\n this.setState(draftStore => {\n draftStore.sessionMetadata = metadata;\n }, 'populateSessionMetadata');\n this.setSessionStoreValueLocally({ key: 'default', value: metadata }, 'populateSessionmetadata');\n }\n\n async setRemoteTrackEnabled(trackID: HMSTrackID | HMSTrackID[], enabled: boolean) {\n if (typeof trackID === 'string') {\n const track = this.hmsSDKTracks[trackID];\n if (track && isRemoteTrack(track)) {\n await this.sdk.changeTrackState(track as SDKHMSRemoteTrack, enabled);\n } else {\n this.logPossibleInconsistency(`No remote track with ID ${trackID} found for change track state`);\n }\n } else if (Array.isArray(trackID)) {\n trackID.forEach(id => this.setRemoteTrackEnabled(id, enabled));\n }\n }\n\n async setRemoteTracksEnabled(params: HMSChangeMultiTrackStateParams) {\n const sdkRequest: SDKHMSChangeMultiTrackStateParams = {\n enabled: params.enabled,\n type: params.type,\n source: params.source,\n };\n if (params.roles) {\n const rolesMap = this.store.getState(selectRolesMap);\n sdkRequest.roles = params.roles.map(role => rolesMap[role]);\n }\n await this.sdk.changeMultiTrackState(sdkRequest);\n }\n\n setLogLevel(level: HMSLogLevel) {\n HMSLogger.level = level;\n this.sdk.setLogLevel(level);\n }\n\n setFrameworkInfo(frameworkInfo: sdkTypes.HMSFrameworkInfo) {\n this.sdk.setFrameworkInfo(frameworkInfo);\n }\n\n ignoreMessageTypes(msgTypes: string[], replace = false) {\n if (replace) {\n this.ignoredMessageTypes = msgTypes;\n } else {\n for (const msgType of msgTypes) {\n if (!this.ignoredMessageTypes.includes(msgType)) {\n this.ignoredMessageTypes.push(msgType);\n }\n }\n }\n }\n\n async enableBeamSpeakerLabelsLogging() {\n if (!this.beamSpeakerLabelsLogger) {\n HMSLogger.i('enabling beam speaker labels logging');\n this.beamSpeakerLabelsLogger = new BeamSpeakerLabelsLogger(this.store, this);\n await this.beamSpeakerLabelsLogger.start();\n }\n }\n\n private resetState(reason = 'resetState') {\n this.isRoomJoinCalled = false;\n this.hmsSDKTracks = {};\n HMSLogger.cleanup();\n this.setState(store => {\n Object.assign(store, createDefaultStoreState());\n }, reason);\n }\n\n private async sdkJoinWithListeners(config: sdkTypes.HMSConfig) {\n await this.sdk.join(config, {\n onJoin: this.onJoin.bind(this),\n onPreview: this.onPreview.bind(this),\n onRoomUpdate: this.onRoomUpdate.bind(this),\n onPeerUpdate: this.onPeerUpdate.bind(this),\n onTrackUpdate: this.onTrackUpdate.bind(this),\n onMessageReceived: this.onMessageReceived.bind(this),\n onError: this.onError.bind(this),\n onReconnected: this.onReconnected.bind(this),\n onReconnecting: this.onReconnecting.bind(this),\n onRoleChangeRequest: this.onRoleChangeRequest.bind(this),\n onRoleUpdate: this.onRoleUpdate.bind(this),\n onDeviceChange: this.onDeviceChange.bind(this),\n onChangeTrackStateRequest: this.onChangeTrackStateRequest.bind(this),\n onChangeMultiTrackStateRequest: this.onChangeMultiTrackStateRequest.bind(this),\n onRemovedFromRoom: this.onRemovedFromRoom.bind(this),\n onNetworkQuality: this.onNetworkQuality.bind(this),\n onSessionStoreUpdate: this.onSessionStoreUpdate.bind(this),\n onPollsUpdate: this.onPollsUpdate.bind(this),\n });\n this.sdk.addAudioListener({\n onAudioLevelUpdate: this.onAudioLevelUpdate.bind(this),\n });\n this.sdk.addConnectionQualityListener({\n onConnectionQualityUpdate: this.onConnectionQualityUpdate.bind(this),\n });\n }\n\n private onRemovedFromRoom(request: SDKHMSLeaveRoomRequest) {\n const requestedBy = this.store.getState(selectPeerByID(request.requestedBy?.peerId));\n this.hmsNotifications.sendLeaveRoom({\n ...request,\n requestedBy: requestedBy || undefined,\n });\n const action = request.roomEnded || !requestedBy ? 'roomEnded' : 'removedFromRoom';\n HMSLogger.i(`resetting state after peer removed ${action}`, request);\n this.resetState(action);\n }\n\n private onDeviceChange(event: sdkTypes.HMSDeviceChangeEvent) {\n const devices = event.devices;\n if (!devices) {\n return;\n }\n const localPeer = this.store.getState(selectLocalPeer);\n this.setState(store => {\n if (!areArraysEqual(store.devices.audioInput, devices.audioInput)) {\n store.devices.audioInput = devices.audioInput;\n }\n if (!areArraysEqual(store.devices.videoInput, devices.videoInput)) {\n store.devices.videoInput = devices.videoInput;\n }\n if (!areArraysEqual(store.devices.audioOutput, devices.audioOutput)) {\n store.devices.audioOutput = devices.audioOutput;\n }\n const sdkLocalPeer = this.sdk.getLocalPeer();\n if (localPeer?.id && sdkLocalPeer) {\n Object.assign(store.settings, this.getMediaSettings(sdkLocalPeer));\n }\n }, 'deviceChange');\n // send notification only on device change - selection is present\n if (event.selection) {\n const notification = SDKToHMS.convertDeviceChangeUpdate(event);\n this.hmsNotifications.sendDeviceChange(notification);\n }\n }\n\n private async sdkPreviewWithListeners(config: sdkTypes.HMSPreviewConfig) {\n await this.sdk.preview(config, {\n onPreview: this.onPreview.bind(this),\n onError: this.onError.bind(this),\n onReconnected: this.onReconnected.bind(this),\n onReconnecting: this.onReconnecting.bind(this),\n onDeviceChange: this.onDeviceChange.bind(this),\n onRoomUpdate: this.onRoomUpdate.bind(this),\n onPeerUpdate: this.onPeerUpdate.bind(this),\n onNetworkQuality: this.onNetworkQuality.bind(this),\n });\n this.sdk.addAudioListener({\n onAudioLevelUpdate: this.onAudioLevelUpdate.bind(this),\n });\n }\n\n private onNetworkQuality(quality: number) {\n this.setState(store => {\n /*\n * if store does not have peerId yet, fetch from sdk directly.\n * sdk will have the localpeer already set.\n */\n const peerId = store.room.localPeer || this.sdk.getLocalPeer()?.peerId;\n if (peerId) {\n store.connectionQualities[peerId] = { peerID: peerId, downlinkQuality: quality };\n }\n }, 'ConnectionQuality');\n }\n\n private onSessionStoreUpdate(updates: SessionStoreUpdate[]) {\n this.setSessionStoreValueLocally(updates, 'sessionStoreUpdate');\n }\n\n private onPollsUpdate(actionType: sdkTypes.HMSPollsUpdate, polls: sdkTypes.HMSPoll[]) {\n const actionName = POLL_NOTIFICATION_TYPES[actionType];\n this.setState(draftStore => {\n const pollsObject = polls.reduce((acc, poll) => {\n acc[poll.id] = {\n ...poll,\n questions: poll.questions?.map(question => ({\n ...question,\n answer: question.answer ? { ...question.answer } : undefined,\n options: question.options?.map(option => ({ ...option })),\n responses: question.responses?.map(response => ({ ...response })),\n })),\n };\n return acc;\n }, {} as { [key: string]: sdkTypes.HMSPoll });\n mergeNewPollsInDraft(draftStore.polls, pollsObject);\n }, actionName);\n\n polls.forEach(poll => this.hmsNotifications.sendPollUpdate(actionType, poll.id));\n }\n\n private async startScreenShare(config?: HMSScreenShareConfig) {\n const isScreenShared = this.store.getState(selectIsLocalScreenShared);\n if (!isScreenShared) {\n await this.sdk.startScreenShare(() => this.syncRoomState('screenshareStopped'), config);\n this.syncRoomState('startScreenShare');\n } else {\n this.logPossibleInconsistency(\"start screenshare is called while it's on\");\n }\n }\n\n private async stopScreenShare() {\n const isScreenShared = this.store.getState(selectIsLocalScreenShared);\n if (isScreenShared) {\n await this.sdk.stopScreenShare();\n this.syncRoomState('stopScreenShare');\n } else {\n this.logPossibleInconsistency(\"stop screenshare is called while it's not on\");\n }\n }\n\n private async attachVideoInternal(trackID: string, videoElement: HTMLVideoElement) {\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack && sdkTrack.type === 'video') {\n await this.sdk.attachVideo(sdkTrack as SDKHMSVideoTrack, videoElement);\n } else {\n this.logPossibleInconsistency('no video track found to add sink');\n }\n }\n\n /**\n * This is a very important function as it's responsible for maintaining the source of\n * truth with maximum efficiency. The efficiency comes from the fact that the only\n * those portions of the store are updated which have actually changed.\n * While making a change in this function don't use functions like map, reduce etc.\n * which return a new copy of the data. Use Object.assign etc. to ensure that if the data\n * doesn't change reference is also not changed.\n * The UI and selectors rely on the fact that the store is immutable that is if there is\n * any change and only if there is a change, they'll get a new copy of the data they're\n * interested in with a new reference.\n * @protected\n */\n protected syncRoomState(action: string) {\n action = `${action}_fullSync`;\n HMSLogger.time(`store-sync-${action}`);\n const newHmsPeers: Record<HMSPeerID, Partial<HMSPeer>> = {};\n const newHmsPeerIDs: HMSPeerID[] = []; // to add in room.peers\n const newHmsTracks: Record<HMSTrackID, Partial<HMSTrack>> = {};\n const newHmsSDkTracks: Record<HMSTrackID, SDKHMSTrack> = {};\n const newMediaSettings: Partial<HMSMediaSettings> = {};\n const newNetworkQuality: Record<HMSPeerID, sdkTypes.HMSConnectionQuality> = {};\n let newPreview: HMSStore['preview'];\n\n const sdkPeers: sdkTypes.HMSPeer[] = this.sdk.getPeers();\n\n // first convert everything in the new format\n for (const sdkPeer of sdkPeers) {\n const hmsPeer = SDKToHMS.convertPeer(sdkPeer);\n newHmsPeers[hmsPeer.id] = hmsPeer;\n newHmsPeerIDs.push(hmsPeer.id);\n newNetworkQuality[hmsPeer.id] = {\n peerID: hmsPeer.id,\n downlinkQuality: sdkPeer.networkQuality || -1,\n };\n\n const sdkTracks = [sdkPeer.audioTrack, sdkPeer.videoTrack, ...sdkPeer.auxiliaryTracks];\n for (const sdkTrack of sdkTracks) {\n if (!sdkTrack) {\n continue;\n }\n const hmsTrack = SDKToHMS.convertTrack(sdkTrack);\n newHmsTracks[hmsTrack.id] = hmsTrack;\n newHmsSDkTracks[sdkTrack.trackId] = sdkTrack;\n }\n\n if (sdkPeer.isLocal) {\n const localPeer = sdkPeer as sdkTypes.HMSLocalPeer;\n newPreview = this.getPreviewFields(localPeer);\n Object.assign(newMediaSettings, this.getMediaSettings(localPeer));\n }\n }\n\n const recording = this.sdk.getRecordingState();\n const rtmp = this.sdk.getRTMPState();\n const hls = this.sdk.getHLSState();\n\n // then merge them carefully with our store so if something hasn't changed\n // the reference shouldn't change. Note that the draftStore is an immer draft\n // object.\n this.setState(draftStore => {\n draftStore.room.peers = newHmsPeerIDs;\n const draftPeers = draftStore.peers;\n const draftTracks = draftStore.tracks;\n // the order of below statements are important as merge functions are mutating\n mergeNewPeersInDraft(draftPeers, newHmsPeers);\n mergeNewTracksInDraft(draftTracks, newHmsTracks);\n Object.assign(draftStore.settings, newMediaSettings);\n Object.assign(draftStore.connectionQualities, newNetworkQuality);\n this.hmsSDKTracks = newHmsSDkTracks;\n\n /**\n * if preview is already present merge,\n * else set as is(which will create/delete)\n */\n if (draftStore.preview?.localPeer && newPreview?.localPeer) {\n Object.assign(draftStore.preview, newPreview);\n } else {\n draftStore.preview = newPreview;\n }\n Object.assign(draftStore.roles, SDKToHMS.convertRoles(this.sdk.getRoles()));\n Object.assign(draftStore.playlist, SDKToHMS.convertPlaylist(this.sdk.getPlaylistManager()));\n Object.assign(draftStore.room, SDKToHMS.convertRecordingStreamingState(recording, rtmp, hls));\n Object.assign(draftStore.templateAppData, this.sdk.getTemplateAppData());\n }, action);\n HMSLogger.timeEnd(`store-sync-${action}`);\n }\n\n protected onPreview(sdkRoom: sdkTypes.HMSRoom) {\n this.setState(store => {\n Object.assign(store.room, SDKToHMS.convertRoom(sdkRoom, this.sdk.getLocalPeer()?.peerId));\n store.room.roomState = HMSRoomState.Preview;\n }, 'previewStart');\n this.syncRoomState('previewSync');\n }\n\n protected onJoin(sdkRoom: sdkTypes.HMSRoom) {\n const playlistManager = this.sdk.getPlaylistManager();\n this.audioPlaylist = new HMSPlaylist(\n playlistManager,\n HMSPlaylistType.audio,\n this.syncPlaylistState.bind(this),\n this.store,\n );\n this.videoPlaylist = new HMSPlaylist(\n playlistManager,\n HMSPlaylistType.video,\n this.syncRoomState.bind(this),\n this.store,\n );\n this.syncRoomState('joinSync');\n this.setState(store => {\n Object.assign(store.room, SDKToHMS.convertRoom(sdkRoom, this.sdk.getLocalPeer()?.peerId));\n store.room.isConnected = true;\n store.room.roomState = HMSRoomState.Connected;\n }, 'joined');\n playlistManager.onProgress(this.setProgress);\n playlistManager.onNewTrackStart((item: sdkTypes.HMSPlaylistItem<any>) => {\n this.syncPlaylistState(`${item.type}PlaylistUpdate`);\n });\n playlistManager.onPlaylistEnded((type: HMSPlaylistType) => {\n this.syncPlaylistState(`${type}PlaylistEnded`);\n });\n playlistManager.onCurrentTrackEnded((item: sdkTypes.HMSPlaylistItem<any>) => {\n this.hmsNotifications.sendPlaylistTrackEnded(SDKToHMS.convertPlaylistItem(playlistManager, item));\n this.syncPlaylistState(`${item.type}PlaylistItemEnded`);\n });\n }\n\n protected onRoomUpdate(type: sdkTypes.HMSRoomUpdate, room: sdkTypes.HMSRoom) {\n this.setState(store => {\n Object.assign(store.room, SDKToHMS.convertRoom(room, this.sdk.getLocalPeer()?.peerId));\n }, type);\n }\n\n protected onPeerUpdate(type: sdkTypes.HMSPeerUpdate, sdkPeer: sdkTypes.HMSPeer | sdkTypes.HMSPeer[]) {\n if (\n [sdkTypes.HMSPeerUpdate.BECAME_DOMINANT_SPEAKER, sdkTypes.HMSPeerUpdate.RESIGNED_DOMINANT_SPEAKER].includes(type)\n ) {\n return; // ignore, high frequency update so no point of syncing peers\n }\n if (Array.isArray(sdkPeer)) {\n const storePeers = this.store.getState(selectPeersMap);\n const newPeerIds = sdkPeer.filter(peer => !storePeers[peer.peerId]);\n this.syncRoomState('peersJoined');\n const connected = this.store.getState(selectIsConnectedToRoom);\n // This is not send unnecessary notifications while in preview\n // now room state also call peer list to handle large peers\n if (connected) {\n const hmsPeers = [];\n for (const peer of sdkPeer) {\n const hmsPeer = this.store.getState(selectPeerByID(peer.peerId));\n if (hmsPeer) {\n hmsPeers.push(hmsPeer);\n }\n }\n this.hmsNotifications.sendPeerList(hmsPeers);\n } else {\n newPeerIds.forEach(peer => {\n const hmsPeer = this.store.getState(selectPeerByID(peer.peerId));\n if (hmsPeer) {\n this.hmsNotifications.sendPeerUpdate(sdkTypes.HMSPeerUpdate.PEER_JOINED, hmsPeer);\n }\n });\n }\n return;\n }\n this.sendPeerUpdateNotification(type, sdkPeer);\n }\n\n protected onTrackUpdate(type: sdkTypes.HMSTrackUpdate, track: SDKHMSTrack, peer: sdkTypes.HMSPeer) {\n // this check is needed because for track removed case, the notification needs to\n // be send before the track is removed from store\n if (type === sdkTypes.HMSTrackUpdate.TRACK_REMOVED) {\n this.hmsNotifications.sendTrackUpdate(type, track.trackId);\n this.handleTrackRemove(track, peer);\n } else if ([sdkTypes.HMSTrackUpdate.TRACK_ADDED, sdkTypes.HMSTrackUpdate.TRACK_REMOVED].includes(type)) {\n const actionName = TRACK_NOTIFICATION_TYPES[type];\n this.syncRoomState(actionName);\n this.hmsNotifications.sendTrackUpdate(type, track.trackId);\n } else {\n const actionName = TRACK_NOTIFICATION_TYPES[type] || 'trackUpdate';\n const hmsTrack = SDKToHMS.convertTrack(track);\n this.setState(draftStore => {\n const storeTrack = draftStore.tracks[hmsTrack.id];\n if (isEntityUpdated(storeTrack, hmsTrack)) {\n mergeTrackArrayFields(storeTrack, hmsTrack);\n Object.assign(storeTrack, hmsTrack);\n }\n }, actionName);\n this.hmsNotifications.sendTrackUpdate(type, track.trackId);\n }\n }\n\n protected onMessageReceived(sdkMessage: sdkTypes.HMSMessage) {\n const hmsMessage = SDKToHMS.convertMessage(sdkMessage) as HMSMessage;\n hmsMessage.read = false;\n hmsMessage.ignored = this.ignoredMessageTypes.includes(hmsMessage.type);\n this.putMessageInStore(hmsMessage);\n this.hmsNotifications.sendMessageReceived(hmsMessage);\n }\n\n protected putMessageInStore(hmsMessage: HMSMessage) {\n if (hmsMessage.ignored) {\n return;\n }\n this.setState(store => {\n store.messages.byID[hmsMessage.id] = hmsMessage;\n store.messages.allIDs.push(hmsMessage.id);\n }, 'newMessage');\n }\n\n /*\n * Note: speakers array contain the value only for peers who have audioLevel != 0\n */\n protected onAudioLevelUpdate(sdkSpeakers: sdkTypes.HMSSpeaker[]) {\n this.setState(store => {\n const trackIDAudioLevelMap: Record<HMSPeerID, number> = {};\n sdkSpeakers.forEach(sdkSpeaker => {\n if (!sdkSpeaker.track || !sdkSpeaker.peer) {\n return;\n }\n const trackID = sdkSpeaker.track.trackId;\n trackIDAudioLevelMap[trackID] = sdkSpeaker.audioLevel;\n if (!store.speakers[trackID]) {\n // Set store instances(peers, tracks) references in speaker, not the new ones received.\n store.speakers[trackID] = {\n audioLevel: sdkSpeaker.audioLevel,\n peerID: sdkSpeaker.peer.peerId,\n trackID: trackID,\n };\n }\n });\n const speakerEntries = Object.entries(store.speakers);\n for (const [trackID, speaker] of speakerEntries) {\n speaker.audioLevel = trackIDAudioLevelMap[trackID] || 0;\n if (speaker.audioLevel === 0) {\n delete store.speakers[trackID];\n }\n }\n }, 'audioLevel');\n }\n\n /**\n * The connection quality update is sent for all peers(one needs to know of) every time.\n */\n protected onConnectionQualityUpdate(newQualities: sdkTypes.HMSConnectionQuality[]) {\n this.setState(store => {\n newQualities.forEach(sdkUpdate => {\n const peerID = sdkUpdate.peerID;\n if (!peerID) {\n return;\n }\n if (!store.connectionQualities[peerID]) {\n store.connectionQualities[peerID] = sdkUpdate;\n } else {\n Object.assign(store.connectionQualities[peerID], sdkUpdate);\n }\n });\n }, 'connectionQuality');\n }\n\n protected onChangeTrackStateRequest(request: SDKHMSChangeTrackStateRequest) {\n const requestedBy = this.store.getState(selectPeerByID(request.requestedBy?.peerId));\n const storeTrackID = this.getStoreLocalTrackIDfromSDKTrack(request.track);\n const track = this.store.getState(selectTrackByID(storeTrackID));\n\n if (!track) {\n return this.logPossibleInconsistency(\n `Not found track for which track state change was requested, ${request.track}`,\n );\n }\n\n if (!request.enabled) {\n this.syncRoomState('changeTrackStateRequest');\n }\n\n this.hmsNotifications.sendChangeTrackStateRequest({\n requestedBy: requestedBy || undefined,\n track,\n enabled: request.enabled,\n });\n }\n\n protected onChangeMultiTrackStateRequest(request: SDKHMSChangeMultiTrackStateRequest) {\n const requestedBy = this.store.getState(selectPeerByID(request.requestedBy?.peerId));\n\n if (!request.enabled) {\n this.syncRoomState('changeMultiTrackStateRequest');\n }\n\n const tracks: HMSTrack[] = [];\n const tracksMap = this.store.getState(selectTracksMap);\n for (const track of request.tracks) {\n const storeTrackID = this.getStoreLocalTrackIDfromSDKTrack(track);\n if (storeTrackID && tracksMap[storeTrackID]) {\n tracks.push(tracksMap[storeTrackID]);\n }\n }\n\n this.hmsNotifications.sendChangeMultiTrackStateRequest({\n requestedBy: requestedBy || undefined,\n tracks,\n enabled: request.enabled,\n type: request.type,\n source: request.source,\n });\n }\n\n protected onReconnected() {\n this.syncRoomState('reconnectedSync');\n this.hmsNotifications.sendReconnected();\n this.setState(store => {\n store.room.roomState = store.room.isConnected ? HMSRoomState.Connected : HMSRoomState.Preview;\n }, 'reconnected');\n }\n\n protected onReconnecting(sdkError: SDKHMSException) {\n const error = SDKToHMS.convertException(sdkError);\n HMSLogger.e('Reconnection: received error from sdk', error);\n this.hmsNotifications.sendReconnecting(error);\n this.setState(store => {\n store.room.roomState = HMSRoomState.Reconnecting;\n store.errors.push(error);\n }, 'reconnecting');\n }\n\n protected onError(sdkException: SDKHMSException) {\n const error = SDKToHMS.convertException(sdkException);\n if (error.isTerminal) {\n // terminal error leave room as it is not recoverable\n this.leave().then(() => HMSLogger.e('error from SDK, left room.'));\n this.setState(store => {\n store.room.roomState = HMSRoomState.Failed;\n store.errors.push(error);\n }, 'errorTerminal');\n } else {\n const numExistingErrors = this.store.getState().errors.length;\n // just in case there is some infinite loop sending errors\n if (numExistingErrors < 50) {\n this.setState(store => {\n store.errors.push(error);\n }, 'error');\n }\n }\n this.syncRoomState('errorSync'); //TODO: check if need to be done in a different way\n // send notification\n this.hmsNotifications.sendError(error);\n HMSLogger.e('received error from sdk', error instanceof SDKHMSException ? `${error}` : error);\n }\n\n private handleTrackRemove(sdkTrack: SDKHMSTrack, sdkPeer: sdkTypes.HMSPeer) {\n this.setState(draftStore => {\n const hmsPeer = draftStore.peers[sdkPeer.peerId];\n const draftTracks = draftStore.tracks;\n const trackId = sdkTrack.trackId;\n // find and remove the exact track from hmsPeer\n if (this.isSameStoreSDKTrack(trackId, hmsPeer?.audioTrack)) {\n delete hmsPeer?.audioTrack;\n } else if (this.isSameStoreSDKTrack(trackId, hmsPeer?.videoTrack)) {\n delete hmsPeer?.videoTrack;\n } else {\n const auxiliaryIndex = hmsPeer?.auxiliaryTracks.indexOf(trackId);\n if (auxiliaryIndex > -1 && this.isSameStoreSDKTrack(trackId, hmsPeer?.auxiliaryTracks[auxiliaryIndex])) {\n hmsPeer?.auxiliaryTracks.splice(auxiliaryIndex, 1);\n }\n }\n delete draftTracks[trackId];\n delete this.hmsSDKTracks[trackId];\n }, 'trackRemoved');\n }\n\n private async setEnabledSDKTrack(trackID: string, enabled: boolean) {\n const track = this.hmsSDKTracks[trackID];\n if (track) {\n await track.setEnabled(enabled);\n } else {\n this.logPossibleInconsistency(`track ${trackID} not present, unable to enabled/disable`);\n }\n }\n\n private async setSDKLocalVideoTrackSettings(trackID: string, settings: Partial<sdkTypes.HMSVideoTrackSettings>) {\n const track = this.hmsSDKTracks[trackID] as SDKHMSLocalVideoTrack;\n if (track) {\n await track.setSettings(settings);\n } else {\n this.logPossibleInconsistency(`local track ${trackID} not present, unable to set settings`);\n }\n }\n\n private async setSDKLocalAudioTrackSettings(trackID: string, settings: Partial<sdkTypes.HMSAudioTrackSettings>) {\n const track = this.hmsSDKTracks[trackID] as SDKHMSLocalAudioTrack;\n if (track) {\n await track.setSettings(settings);\n } else {\n this.logPossibleInconsistency(`local track ${trackID} not present, unable to set settings`);\n }\n }\n\n private getMediaSettings(sdkPeer: sdkTypes.HMSPeer): Partial<HMSMediaSettings> {\n const settings = this.store.getState(selectLocalMediaSettings);\n const audioTrack = sdkPeer.audioTrack as SDKHMSLocalAudioTrack;\n const videoTrack = sdkPeer.videoTrack as SDKHMSLocalVideoTrack;\n return {\n audioInputDeviceId: audioTrack?.settings.deviceId || settings.audioInputDeviceId,\n videoInputDeviceId: videoTrack?.settings.deviceId || settings.videoInputDeviceId,\n audioOutputDeviceId: this.sdk.getAudioOutput().getDevice()?.deviceId,\n };\n }\n\n private getPreviewFields(sdkLocalPeer: sdkTypes.HMSLocalPeer): HMSStore['preview'] {\n // if room is not in preview, clear preview fields\n if (!sdkLocalPeer.isInPreview()) {\n return;\n }\n\n const hmsLocalPeer = SDKToHMS.convertPeer(sdkLocalPeer);\n\n return {\n localPeer: hmsLocalPeer.id,\n audioTrack: hmsLocalPeer.audioTrack,\n videoTrack: hmsLocalPeer.videoTrack,\n asRole: sdkLocalPeer.asRole?.name || sdkLocalPeer.role?.name,\n };\n }\n\n private async setTrackVolume(value: number, trackId: HMSTrackID) {\n const track = this.hmsSDKTracks[trackId];\n if (track) {\n if (track instanceof SDKHMSAudioTrack) {\n await track.setVolume(value);\n this.setState(draftStore => {\n const track = draftStore.tracks[trackId];\n if (track && track.type === 'audio') {\n track.volume = value;\n }\n }, 'trackVolume');\n } else {\n HMSLogger.w(`track ${trackId} is not an audio track`);\n }\n } else {\n this.logPossibleInconsistency(`track ${trackId} not present, unable to set volume`);\n }\n }\n\n /**\n * Tells if the trackID is for local peer and video unmute is in process\n * @private\n */\n private localAndVideoUnmuting(trackID: string) {\n const localPeer = this.store.getState(selectLocalPeer);\n if (localPeer?.videoTrack !== trackID) {\n return false;\n }\n const displayEnabled = this.store.getState(selectIsLocalVideoDisplayEnabled);\n const actuallyEnabled = this.store.getState(selectIsLocalVideoEnabled);\n return displayEnabled && !actuallyEnabled;\n }\n\n private logPossibleInconsistency(inconsistency: string) {\n HMSLogger.w('possible inconsistency detected - ', inconsistency);\n }\n\n private async addRemoveVideoPlugin(plugin: HMSVideoPlugin, action: 'add' | 'remove', pluginFrameRate?: number) {\n if (!plugin) {\n HMSLogger.w('Invalid plugin received in store');\n return;\n }\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (trackID) {\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack) {\n if (action === 'add') {\n await (sdkTrack as SDKHMSLocalVideoTrack).addPlugin(plugin, pluginFrameRate);\n } else if (action === 'remove') {\n await (sdkTrack as SDKHMSLocalVideoTrack).removePlugin(plugin);\n }\n this.syncRoomState(`${action}VideoPlugin`);\n } else {\n this.logPossibleInconsistency(`track ${trackID} not present, unable to remove plugin`);\n }\n }\n }\n private async addRemoveAudioPlugin(plugin: HMSAudioPlugin, action: 'add' | 'remove') {\n if (!plugin) {\n HMSLogger.w('Invalid plugin received in store');\n return;\n }\n const trackID = this.store.getState(selectLocalAudioTrackID);\n if (trackID) {\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack) {\n if (action === 'add') {\n await (sdkTrack as SDKHMSLocalAudioTrack).addPlugin(plugin);\n } else if (action === 'remove') {\n await (sdkTrack as SDKHMSLocalAudioTrack).removePlugin(plugin);\n }\n this.syncRoomState(`${action}AudioPlugin`);\n } else {\n this.logPossibleInconsistency(`track ${trackID} not present, unable to remove plugin`);\n }\n }\n }\n\n /**\n * In case of replace track id is changed but not in store. Given the store id, check the real id\n * sdk is using to refer to the track and match them.\n */\n private isSameStoreSDKTrack(sdkTrackID: string, storeTrackID?: string): boolean {\n if (!storeTrackID) {\n return false;\n }\n return this.hmsSDKTracks[storeTrackID]?.trackId === sdkTrackID;\n }\n\n /**\n * convert new role change requests to store format and save.\n * keep only one request at a time in store till we figure out how to handle multiple requests at the same time\n */\n private onRoleChangeRequest(request: SDKHMSRoleChangeRequest) {\n this.setState(store => {\n if (store.roleChangeRequests.length === 0) {\n store.roleChangeRequests.push(SDKToHMS.convertRoleChangeRequest(request));\n }\n }, 'roleChangeRequest');\n }\n\n private removeRoleChangeRequest(toRemove: HMSRoleChangeRequest) {\n this.setState(store => {\n const index = store.roleChangeRequests.findIndex(req => {\n return req.token === toRemove.token;\n });\n if (index !== -1) {\n store.roleChangeRequests.splice(index, 1);\n }\n }, 'removeRoleChangeRequest');\n }\n\n private onRoleUpdate() {\n this.syncRoomState('roleUpdate');\n }\n\n private getStoreLocalTrackIDfromSDKTrack(sdkTrack: SDKHMSLocalTrack) {\n const trackIDs = this.store.getState(selectLocalTrackIDs);\n return trackIDs.find(trackID => this.hmsSDKTracks[trackID].trackId === sdkTrack.trackId);\n }\n\n private setProgress = ({ type, progress }: sdkTypes.HMSPlaylistProgressEvent) => {\n this.setState(draftStore => {\n draftStore.playlist[type].progress = progress;\n draftStore.playlist[type].currentTime = this.sdk.getPlaylistManager().getCurrentTime(type);\n }, 'playlistProgress');\n };\n\n private syncPlaylistState = (action: string) => {\n this.setState(draftStore => {\n Object.assign(draftStore.playlist, SDKToHMS.convertPlaylist(this.sdk.getPlaylistManager()));\n }, action);\n };\n\n // eslint-disable-next-line complexity\n private sendPeerUpdateNotification = (type: sdkTypes.HMSPeerUpdate, sdkPeer: sdkTypes.HMSPeer) => {\n let peer = this.store.getState(selectPeerByID(sdkPeer.peerId));\n const actionName = PEER_NOTIFICATION_TYPES[type] || 'peerUpdate';\n if (type === sdkTypes.HMSPeerUpdate.ROLE_UPDATED) {\n this.syncRoomState(actionName);\n this.updateMidCallPreviewRoomState(type, sdkPeer);\n } else if ([sdkTypes.HMSPeerUpdate.PEER_JOINED, sdkTypes.HMSPeerUpdate.PEER_LEFT].includes(type)) {\n this.syncRoomState(actionName);\n // if peer wasn't available before sync(will happen if event is peer join)\n if (!peer) {\n peer = this.store.getState(selectPeerByID(sdkPeer.peerId));\n }\n } else if (\n [\n sdkTypes.HMSPeerUpdate.HAND_RAISE_CHANGED,\n sdkTypes.HMSPeerUpdate.PEER_REMOVED,\n sdkTypes.HMSPeerUpdate.PEER_ADDED,\n ].includes(type)\n ) {\n this.syncRoomState(actionName);\n if (!peer) {\n peer = this.store.getState(selectPeerByID(sdkPeer.peerId));\n }\n } else {\n const hmsPeer = SDKToHMS.convertPeer(sdkPeer) as HMSPeer;\n this.setState(draftStore => {\n const storePeer = draftStore.peers[hmsPeer.id];\n if (isEntityUpdated(storePeer, hmsPeer)) {\n if (areArraysEqual(storePeer.auxiliaryTracks, hmsPeer.auxiliaryTracks)) {\n storePeer.auxiliaryTracks = hmsPeer.auxiliaryTracks;\n }\n Object.assign(storePeer, hmsPeer);\n }\n peer = hmsPeer;\n }, actionName);\n }\n this.hmsNotifications.sendPeerUpdate(type, peer);\n };\n\n private updateMidCallPreviewRoomState(type: sdkTypes.HMSPeerUpdate, sdkPeer: sdkTypes.HMSPeer) {\n if (sdkPeer.isLocal && type === sdkTypes.HMSPeerUpdate.ROLE_UPDATED && this.store.getState(selectIsInPreview)) {\n this.setState(store => {\n store.room.roomState = HMSRoomState.Connected;\n }, 'midCallPreviewCompleted');\n }\n }\n\n private setSessionStoreValueLocally(\n updates: SessionStoreUpdate | SessionStoreUpdate[],\n actionName = 'setSessionStore',\n ) {\n const updatesList: SessionStoreUpdate[] = Array.isArray(updates) ? updates : [updates];\n this.setState(store => {\n updatesList.forEach(update => {\n store.sessionStore[update.key as keyof T['sessionStore']] = update.value;\n });\n }, actionName);\n }\n\n private getSDKHMSPeer = (peerID: HMSPeerID) => {\n return this.sdk.getPeerMap()[peerID];\n };\n\n /**\n * setState is separate so any future changes to how state change can be done from one place.\n * @param fn\n * @param name\n */\n private setState: NamedSetState<HMSStore<T>> = (fn, name) => {\n return this.store.namedSetState(fn, name);\n };\n}\n", "import { HMSRemoteAudioTrack, HMSRemoteVideoTrack, HMSTrack } from '@100mslive/hms-video';\n\nexport function isRemoteTrack(track: HMSTrack) {\n return track instanceof HMSRemoteAudioTrack || track instanceof HMSRemoteVideoTrack;\n}\n", "import {\n HMSLocalAudioTrack as SDKHMSLocalAudioTrack,\n HMSLocalVideoTrack as SDKHMSLocalVideoTrack,\n HMSRemoteAudioTrack as SDKHMSRemoteAudioTrack,\n HMSRemoteVideoTrack as SDKHMSRemoteVideoTrack,\n HMSRoleChangeRequest as SDKHMSRoleChangeRequest,\n HMSTrack as SDKHMSTrack,\n} from '@100mslive/hms-video';\nimport { areArraysEqual } from './sdkUtils/storeMergeUtils';\nimport * as sdkTypes from './sdkTypes';\nimport {\n HMSAudioTrack,\n HMSDeviceChangeEvent,\n HMSException,\n HMSMessage,\n HMSPeer,\n HMSPeerID,\n HMSPlaylistItem,\n HMSPlaylistType,\n HMSRole,\n HMSRoleChangeStoreRequest,\n HMSRoleName,\n HMSRoom,\n HMSScreenVideoTrack,\n HMSTrack,\n HMSTrackFacingMode,\n HMSVideoTrack,\n} from '../schema';\n\n/**\n * This file has conversion functions from schema defined in sdk to normalised schema defined in store.\n * A lot of conversions below involve deep clone as once the object goes into store it becomes unmodifiable\n * due to immer, so it can't be mutated later.\n *\n * Objects directly from the SDK are not stored as is and cloned because the SDK might modify it later\n */\n\nexport class SDKToHMS {\n static convertPeer(sdkPeer: sdkTypes.HMSPeer): Partial<HMSPeer> & Pick<HMSPeer, 'id'> {\n return {\n id: sdkPeer.peerId,\n name: sdkPeer.name,\n roleName: sdkPeer.role?.name,\n isLocal: sdkPeer.isLocal,\n videoTrack: sdkPeer.videoTrack?.trackId,\n audioTrack: sdkPeer.audioTrack?.trackId,\n auxiliaryTracks: sdkPeer.auxiliaryTracks.map(track => track.trackId),\n customerUserId: sdkPeer.customerUserId,\n metadata: sdkPeer.metadata,\n joinedAt: sdkPeer.joinedAt,\n groups: sdkPeer.groups,\n isHandRaised: sdkPeer.isHandRaised,\n };\n }\n\n static convertTrack(sdkTrack: SDKHMSTrack, peerId?: HMSPeerID): HMSTrack {\n const track: HMSTrack = {\n id: sdkTrack.trackId,\n source: sdkTrack.source,\n type: sdkTrack.type,\n enabled: sdkTrack.enabled,\n displayEnabled: sdkTrack.enabled,\n peerId: sdkTrack.peerId || peerId,\n } as HMSTrack;\n this.enrichTrack(track, sdkTrack);\n return track;\n }\n\n static enrichTrack(track: HMSTrack, sdkTrack: SDKHMSTrack) {\n const mediaSettings = sdkTrack.getMediaTrackSettings();\n\n if (sdkTrack instanceof SDKHMSRemoteAudioTrack) {\n (track as HMSAudioTrack).volume = sdkTrack.getVolume() || 0;\n }\n SDKToHMS.updateDeviceID(track, sdkTrack);\n SDKToHMS.enrichLocalTrack(track, sdkTrack);\n if (track.type === 'video') {\n if (track.source === 'screen') {\n // @ts-ignore\n track.displaySurface = mediaSettings.displaySurface;\n SDKToHMS.enrichScreenTrack(track as HMSScreenVideoTrack, sdkTrack);\n } else if (track.source === 'regular') {\n (track as HMSVideoTrack).facingMode = mediaSettings.facingMode as HMSTrackFacingMode;\n }\n track.height = mediaSettings.height;\n track.width = mediaSettings.width;\n SDKToHMS.enrichVideoTrack(track as HMSVideoTrack, sdkTrack);\n }\n SDKToHMS.enrichPluginsDetails(track, sdkTrack);\n }\n\n static enrichLocalTrack(track: HMSTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSLocalVideoTrack || sdkTrack instanceof SDKHMSLocalAudioTrack) {\n track.isPublished = sdkTrack.isPublished;\n }\n }\n\n static updateDeviceID(track: HMSTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSLocalVideoTrack || sdkTrack instanceof SDKHMSLocalAudioTrack) {\n track.deviceID = sdkTrack.settings.deviceId;\n } else {\n track.deviceID = sdkTrack.getMediaTrackSettings()?.deviceId;\n }\n }\n\n static enrichVideoTrack(track: HMSVideoTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSRemoteVideoTrack) {\n track.layer = sdkTrack.getLayer();\n track.preferredLayer = sdkTrack.getPreferredLayer();\n track.degraded = sdkTrack.degraded;\n }\n if (sdkTrack instanceof SDKHMSRemoteVideoTrack || sdkTrack instanceof SDKHMSLocalVideoTrack) {\n if (!areArraysEqual(sdkTrack.getSimulcastDefinitions(), track.layerDefinitions)) {\n track.layerDefinitions = sdkTrack.getSimulcastDefinitions();\n }\n }\n }\n\n static enrichScreenTrack(track: HMSScreenVideoTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSLocalVideoTrack) {\n const newCaptureHandle = sdkTrack.getCaptureHandle?.();\n if (newCaptureHandle?.handle !== track.captureHandle?.handle) {\n track.captureHandle = newCaptureHandle;\n }\n if (sdkTrack.isCurrentTab) {\n track.displaySurface = 'selfBrowser';\n }\n }\n }\n\n static enrichPluginsDetails(track: HMSTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSLocalVideoTrack || sdkTrack instanceof SDKHMSLocalAudioTrack) {\n if (!areArraysEqual(sdkTrack.getPlugins(), track.plugins)) {\n track.plugins = sdkTrack.getPlugins();\n }\n }\n }\n\n static convertRoom(sdkRoom: sdkTypes.HMSRoom, sdkLocalPeerId?: string): Partial<HMSRoom> {\n const { recording, rtmp, hls } = SDKToHMS.convertRecordingStreamingState(\n sdkRoom?.recording,\n sdkRoom?.rtmp,\n sdkRoom?.hls,\n );\n return {\n id: sdkRoom.id,\n name: sdkRoom.name,\n localPeer: sdkLocalPeerId,\n recording,\n rtmp,\n hls,\n sessionId: sdkRoom.sessionId,\n startedAt: sdkRoom.startedAt,\n joinedAt: sdkRoom.joinedAt,\n peerCount: sdkRoom.peerCount,\n isLargeRoom: sdkRoom.large_room_optimization,\n };\n }\n\n static convertMessage(sdkMessage: sdkTypes.HMSMessage): Partial<HMSMessage> & Pick<HMSMessage, 'sender'> {\n return {\n sender: sdkMessage.sender?.peerId,\n senderName: sdkMessage.sender?.name,\n senderRole: sdkMessage.sender?.role?.name,\n senderUserId: sdkMessage.sender?.customerUserId,\n recipientPeer: sdkMessage.recipientPeer?.peerId,\n recipientRoles: sdkMessage.recipientRoles?.map(role => role.name),\n time: sdkMessage.time,\n type: sdkMessage.type,\n message: sdkMessage.message,\n id: sdkMessage.id,\n };\n }\n\n static convertRoles(sdkRoles: HMSRole[]): Record<HMSRoleName, HMSRole> {\n const roles: Record<HMSRoleName, HMSRole> = {};\n if (sdkRoles) {\n sdkRoles.forEach(role => {\n roles[role.name] = role;\n });\n }\n return roles;\n }\n\n static convertRoleChangeRequest(req: SDKHMSRoleChangeRequest): HMSRoleChangeStoreRequest {\n return {\n requestedBy: req.requestedBy?.peerId,\n roleName: req.role.name,\n token: req.token,\n };\n }\n\n static convertException(sdkException: sdkTypes.HMSException): HMSException {\n return {\n code: sdkException.code,\n action: sdkException.action,\n name: sdkException.name,\n message: sdkException.message,\n description: sdkException.description,\n isTerminal: sdkException.isTerminal,\n nativeError: sdkException.nativeError,\n timestamp: new Date(),\n };\n }\n\n static convertDeviceChangeUpdate(sdkDeviceChangeEvent: sdkTypes.HMSDeviceChangeEvent): HMSDeviceChangeEvent {\n const convertedData: HMSDeviceChangeEvent = {\n devices: sdkDeviceChangeEvent.devices,\n selection: sdkDeviceChangeEvent.selection,\n type: sdkDeviceChangeEvent.type,\n };\n if (sdkDeviceChangeEvent.error) {\n convertedData.error = this.convertException(sdkDeviceChangeEvent.error);\n }\n return convertedData;\n }\n\n static convertPlaylist(playlistManager: sdkTypes.HMSPlaylistManager) {\n const audioPlaylist = this.getConvertedPlaylistType(playlistManager, HMSPlaylistType.audio);\n const videoPlaylist = this.getConvertedPlaylistType(playlistManager, HMSPlaylistType.video);\n return { audio: audioPlaylist, video: videoPlaylist };\n }\n\n static convertPlaylistItem<T>(\n playlistManager: sdkTypes.HMSPlaylistManager,\n playlistItem: sdkTypes.HMSPlaylistItem<T>,\n ): HMSPlaylistItem<T> {\n const type = playlistItem.type;\n const currentSelection = playlistManager.getCurrentSelection(type);\n const isPlaying = playlistManager.isPlaying(type);\n const isSelected = playlistItem.url === currentSelection?.url;\n\n return {\n ...playlistItem,\n type: playlistItem.type as HMSPlaylistType,\n selected: isSelected,\n playing: isSelected && isPlaying,\n };\n }\n\n private static getConvertedPlaylistType(playlistManager: sdkTypes.HMSPlaylistManager, type: HMSPlaylistType) {\n const convertedPlaylist: Record<string, HMSPlaylistItem<any>> = {};\n const currentSelection = playlistManager.getCurrentSelection(type);\n const progress = playlistManager.getCurrentProgress(type);\n const volume = playlistManager.getVolume(type);\n const list = playlistManager.getList(type);\n const currentIndex = playlistManager.getCurrentIndex(type);\n\n playlistManager.getList(type).forEach(playlistItem => {\n convertedPlaylist[playlistItem.id] = SDKToHMS.convertPlaylistItem(playlistManager, playlistItem);\n });\n return {\n list: convertedPlaylist,\n selection: {\n id: currentSelection?.id,\n hasPrevious: currentIndex > 0,\n hasNext: currentIndex < list.length - 1,\n },\n progress,\n volume,\n currentTime: playlistManager.getCurrentTime(type),\n playbackRate: playlistManager.getPlaybackRate(type),\n };\n }\n\n static convertRecordingStreamingState(\n recording?: sdkTypes.HMSRecording,\n rtmp?: sdkTypes.HMSRTMP,\n hls?: sdkTypes.HMSHLS,\n ): { recording: sdkTypes.HMSRecording; rtmp: sdkTypes.HMSRTMP; hls: sdkTypes.HMSHLS } {\n return {\n recording: {\n browser: {\n running: false,\n ...recording?.browser,\n },\n server: {\n running: false,\n ...recording?.server,\n },\n hls: { running: false, ...recording?.hls },\n },\n rtmp: { running: false, ...rtmp },\n hls: {\n variants: hls?.variants?.map(variant => variant) || [],\n running: !!hls?.running,\n error: hls?.error,\n },\n };\n }\n}\n", "import {\n HMSPollCreateParams,\n HMSPollQuestionCreateParams,\n HMSPollQuestionResponseCreateParams,\n HMSSdk,\n} from '@100mslive/hms-video';\nimport { IHMSInteractivityCenter } from '../schema';\n\nexport class HMSInteractivityCenter implements IHMSInteractivityCenter {\n constructor(private sdk: HMSSdk) {}\n\n private get sdkInteractivityCenter() {\n return this.sdk.getInteractivityCenter();\n }\n\n createPoll(poll: HMSPollCreateParams) {\n return this.sdkInteractivityCenter.createPoll(poll);\n }\n\n startPoll(poll: string | HMSPollCreateParams) {\n return this.sdkInteractivityCenter.startPoll(poll);\n }\n\n stopPoll(poll: string) {\n return this.sdkInteractivityCenter.stopPoll(poll);\n }\n\n addQuestionsToPoll(poll: string, questions: HMSPollQuestionCreateParams[]) {\n return this.sdkInteractivityCenter.addQuestionsToPoll(poll, questions);\n }\n\n addResponsesToPoll(pollID: string, responses: HMSPollQuestionResponseCreateParams[]) {\n return this.sdkInteractivityCenter.addResponsesToPoll(pollID, responses);\n }\n}\n", "import { HMSPlaylistManager } from './sdkTypes';\nimport { HMSLogger } from '../../common/ui-logger';\nimport { IHMSStore } from '../IHMSStore';\nimport { HMSGenericTypes, HMSPlaylistItem, HMSPlaylistType, IHMSPlaylistActions } from '../schema';\nimport { selectAudioPlaylist, selectVideoPlaylist } from '../selectors';\n\nexport class HMSPlaylist<T extends HMSGenericTypes> implements IHMSPlaylistActions {\n private type: HMSPlaylistType;\n constructor(\n private playlistManager: HMSPlaylistManager,\n type: HMSPlaylistType,\n private syncPlaylistState: (action: string) => void,\n private store: IHMSStore<T>,\n ) {\n this.type = type;\n }\n\n async play(id: string): Promise<void> {\n if (!id) {\n HMSLogger.w('Please pass id to play');\n return;\n }\n await this.playlistManager.setEnabled(true, { id, type: this.type });\n }\n\n async pause(): Promise<void> {\n const selector = this.type === HMSPlaylistType.audio ? selectAudioPlaylist : selectVideoPlaylist;\n const selection = this.store.getState(selector.selection);\n if (!selection.id) {\n HMSLogger.w('No item is currently playing to pause');\n return;\n }\n await this.playlistManager.setEnabled(false, { id: selection.id, type: this.type });\n }\n\n async playNext(): Promise<void> {\n await this.playlistManager.playNext(this.type);\n }\n\n async playPrevious(): Promise<void> {\n await this.playlistManager.playPrevious(this.type);\n }\n\n seek(seekValue: number): void {\n this.playlistManager.seek(seekValue, this.type);\n this.syncPlaylistState(`seekOn${this.type}Playlist`);\n }\n\n seekTo(seekValue: number): void {\n this.playlistManager.seekTo(seekValue, this.type);\n this.syncPlaylistState(`seekToOn${this.type}Playlist`);\n }\n\n setVolume(volume: number): void {\n this.playlistManager.setVolume(volume, this.type);\n this.syncPlaylistState(`setVolumeOn${this.type}Playlist`);\n }\n\n setList<T>(list: HMSPlaylistItem<T>[]): void {\n this.playlistManager.setList(list);\n this.syncPlaylistState(`setListOn${this.type}Playlist`);\n }\n\n async stop(): Promise<void> {\n await this.playlistManager.stop(this.type);\n this.syncPlaylistState(`stop${this.type}Playlist`);\n }\n\n setIsAutoplayOn(autoplay: boolean) {\n this.playlistManager.setIsAutoplayOn(this.type, autoplay);\n }\n\n setPlaybackRate(playbackRate: number) {\n this.playlistManager.setPlaybackRate(this.type, playbackRate);\n this.syncPlaylistState(`set${this.type}PlaybackRate`);\n }\n\n async removeItem(id: string) {\n const removed = await this.playlistManager.removeItem(id, this.type);\n if (removed) {\n this.syncPlaylistState(`remove${this.type}PlaylistItem`);\n }\n return removed;\n }\n\n async clearList() {\n await this.playlistManager.clearList(this.type);\n this.syncPlaylistState(`clear${this.type}Playlist`);\n }\n}\n", "import { HMSSdk, SessionStoreUpdate } from '@100mslive/hms-video';\nimport { IHMSSessionStoreActions } from '../schema';\n\nexport class HMSSessionStore<T extends Record<string, any>> implements IHMSSessionStoreActions<T> {\n constructor(\n private sdk: HMSSdk,\n private setLocally: (updates: SessionStoreUpdate | SessionStoreUpdate[], actionName?: string) => void,\n ) {}\n\n private get sdkSessionStore() {\n return this.sdk.getSessionStore();\n }\n\n async set<K extends keyof T>(key: K, value?: T[K]) {\n const { value: latestValue } = await this.sdkSessionStore.set(String(key), value);\n this.setLocally({ key: key as string, value: latestValue });\n }\n\n async observe(keys: keyof T | Array<keyof T>) {\n const stringifiedKeys: string[] = Array.isArray(keys) ? keys.map(key => String(key)) : [String(keys)];\n await this.sdkSessionStore.observe(stringifiedKeys);\n }\n\n async unobserve(keys: keyof T | Array<keyof T>) {\n const stringifiedKeys: string[] = Array.isArray(keys) ? keys.map(key => String(key)) : [String(keys)];\n await this.sdkSessionStore.unobserve(stringifiedKeys);\n }\n}\n", "import { HMSLogger } from '../../common/ui-logger';\nimport { HMSGenericTypes, HMSPeer, IHMSStore, selectIsConnectedToRoom, selectPeers } from '../../core';\nimport { IHMSActions } from '../../core/IHMSActions';\n\n/**\n * Log data of audio level and speaker speaking periodically to beam for transcript\n * diarization.\n */\nexport class BeamSpeakerLabelsLogger<T extends HMSGenericTypes> {\n private audioContext?: AudioContext;\n private readonly intervalMs: number;\n private shouldMonitor: boolean;\n private hasStarted: boolean;\n private unsubs: any[];\n private readonly analysers: Record<string, AnalyserNode>;\n private readonly store: IHMSStore<T>;\n private actions: IHMSActions<T>;\n constructor(store: IHMSStore<T>, actions: IHMSActions<T>) {\n this.intervalMs = 100;\n this.shouldMonitor = false;\n this.hasStarted = false;\n this.unsubs = [];\n this.analysers = {};\n this.store = store;\n this.actions = actions;\n }\n\n async start() {\n if (this.hasStarted) {\n return;\n }\n this.hasStarted = true;\n HMSLogger.d('starting audio level monitor for remote peers', this.store);\n const isConnected = this.store.getState(selectIsConnectedToRoom);\n HMSLogger.d('starting audio levels is connected to room', isConnected);\n if (isConnected) {\n await this.monitorAudioLevels();\n }\n const unsub = this.store.subscribe(this.monitorAudioLevels.bind(this), selectIsConnectedToRoom);\n this.unsubs.push(unsub);\n }\n\n async stop() {\n if (!this.hasStarted) {\n return;\n }\n this.hasStarted = false;\n this.shouldMonitor = false;\n this.unsubs.forEach(unsub => unsub());\n HMSLogger.d('stopped audio level monitor for remote peers');\n }\n\n async monitorAudioLevels() {\n const isConnected = this.store.getState(selectIsConnectedToRoom);\n if (!isConnected) {\n if (this.shouldMonitor) {\n HMSLogger.i('room no longer connected, stopping audio level monitoring for remote');\n this.shouldMonitor = false;\n }\n return;\n }\n if (this.shouldMonitor) {\n return;\n }\n HMSLogger.i('monitoring audio levels');\n this.shouldMonitor = true;\n const loop = () => {\n if (this.shouldMonitor) {\n this.logAllPeersAudioLevels();\n setTimeout(loop, this.intervalMs);\n } else {\n HMSLogger.i('stopped monitoring audio levels');\n }\n };\n setTimeout(loop, 1000);\n }\n\n // eslint-disable-next-line complexity\n async logAllPeersAudioLevels() {\n if (!window.__triggerBeamEvent__) {\n return;\n }\n // optimise this to selectTracks instead of selecting peers\n const allPeers = this.store.getState(selectPeers);\n const peers = allPeers.filter(peer => !!peer.audioTrack);\n const peerAudioLevels = [];\n for (const peer of peers) {\n // @ts-ignore\n const sdkTrack = this.actions.hmsSDKTracks[peer.audioTrack];\n const nativeStream: MediaStream = sdkTrack?.stream?.nativeStream;\n if (!peer.joinedAt) {\n continue;\n }\n if (nativeStream) {\n const peerLevel = await this.getAudioLevel(peer, nativeStream);\n if (peerLevel.level > 0) {\n peerAudioLevels.push(peerLevel);\n }\n }\n }\n if (peerAudioLevels.length > 0) {\n const payload = {\n event: 'app-audio-level',\n data: peerAudioLevels,\n };\n // HMSLogger.d('logging audio levels', peerAudioLevels);\n window.__triggerBeamEvent__(JSON.stringify(payload));\n }\n }\n\n async getAudioLevel(peer: HMSPeer, stream: MediaStream) {\n if (!this.analysers[stream.id]) {\n this.analysers[stream.id] = this.createAnalyserNode(stream);\n }\n const analyserNode = this.analysers[stream.id];\n const level = this.calculateAudioLevel(analyserNode);\n return {\n peerId: peer.id,\n peerName: peer.name,\n level,\n };\n }\n\n createAnalyserNode(stream: MediaStream) {\n if (!this.audioContext) {\n this.audioContext = new AudioContext();\n }\n const analyser = this.audioContext.createAnalyser();\n const source = this.audioContext.createMediaStreamSource(stream);\n source.connect(analyser);\n return analyser;\n }\n\n calculateAudioLevel(analyserNode: AnalyserNode) {\n const data = new Uint8Array(analyserNode.fftSize);\n analyserNode.getByteTimeDomainData(data);\n const lowest = 0.009;\n let max = lowest;\n for (const frequency of data) {\n max = Math.max(max, (frequency - 128) / 128);\n }\n const normalized = (Math.log(lowest) - Math.log(max)) / Math.log(lowest);\n const percent = Math.ceil(Math.min(Math.max(normalized * 100, 0), 100));\n return percent;\n }\n}\n", "import { Subscribe } from 'zustand/vanilla';\nimport { HMSSdk } from '@100mslive/hms-video';\nimport { subscribeToSdkWebrtcStats } from './webrtc-stats-store';\nimport { storeNameWithTabTitle } from '../../common/storeName';\nimport { HMSReactiveStore } from '../hmsSDKStore/HMSReactiveStore';\nimport { GetState, IHMSStatsStore, IHMSStatsStoreReadOnly, IHMSStore } from '../IHMSStore';\nimport { createDefaultStatsStore, HMSStatsStore } from '../schema';\nimport { selectRoomState } from '../selectors';\n\n/**\n * @internal\n */\nexport class HMSStats implements IHMSStatsStoreReadOnly {\n readonly getState: GetState<HMSStatsStore>;\n readonly subscribe: Subscribe<HMSStatsStore>;\n readonly getPublishPeerConnection: () => Promise<RTCPeerConnection | undefined>;\n readonly getSubscribePeerConnection: () => Promise<RTCPeerConnection | undefined>;\n private readonly store: IHMSStatsStore;\n\n constructor(private hmsStore: IHMSStore, private sdk?: HMSSdk) {\n this.store = HMSReactiveStore.createNewHMSStore<HMSStatsStore>(\n storeNameWithTabTitle('HMSStatsStore'),\n createDefaultStatsStore,\n );\n\n this.getState = this.store.getState;\n this.subscribe = this.store.subscribe;\n\n this.getPublishPeerConnection = () =>\n new Promise<RTCPeerConnection | undefined>(resolve => {\n if (this.hmsStore.getState(selectRoomState) === 'Connected') {\n resolve(this.sdk?.getWebrtcInternals()?.getPublishPeerConnection());\n } else {\n this.hmsStore.subscribe(roomState => {\n if (roomState === 'Connected') {\n resolve(this.sdk?.getWebrtcInternals()?.getPublishPeerConnection());\n }\n }, selectRoomState);\n }\n });\n\n this.getSubscribePeerConnection = () =>\n new Promise<RTCPeerConnection | undefined>(resolve => {\n if (this.hmsStore.getState(selectRoomState) === 'Connected') {\n resolve(this.sdk?.getWebrtcInternals()?.getSubscribePeerConnection());\n } else {\n this.hmsStore.subscribe(roomState => {\n if (roomState === 'Connected') {\n resolve(this.sdk?.getWebrtcInternals()?.getSubscribePeerConnection());\n }\n }, selectRoomState);\n }\n });\n\n if (!this.sdk) {\n return;\n }\n\n subscribeToSdkWebrtcStats(this.sdk, this.store, this.hmsStore);\n }\n}\n", "import { createSelector } from 'reselect';\nimport { HMSPreferredSimulcastLayer, RID, simulcastMapping } from '../hmsSDKStore/sdkTypes';\nimport { HMSPeerID, HMSStatsStore, HMSTrackID } from '../schema';\nimport { byIDCurry } from '../selectors/common';\n\nconst selectLocalPeerID = (store: HMSStatsStore) => store.localPeer.id;\nconst selectLocalAudioTrackID = (store: HMSStatsStore) => store.localPeer.audioTrack;\nconst selectLocalVideoTrackID = (store: HMSStatsStore) => store.localPeer.videoTrack;\nconst selectPeerID = (_store: HMSStatsStore, peerID: HMSPeerID | undefined) => peerID;\nconst selectTrackID = (_store: HMSStatsStore, trackID: HMSTrackID | undefined) => trackID;\nconst selectRemoteTrackStatsMap = (store: HMSStatsStore) => store.remoteTrackStats;\nconst selectPeerStatsMap = (store: HMSStatsStore) => store.peerStats;\nconst selectLocalTrackStatsMap = (store: HMSStatsStore) => store.localTrackStats;\n\n/**\n * Local peer stats selectors\n */\nconst localPeerStats = createSelector(\n [selectPeerStatsMap, selectLocalPeerID],\n (storePeerStats, localPeerID) => storePeerStats[localPeerID],\n);\n\n/**\n * The total number of packets lost during the call\n */\nconst packetsLost = createSelector(localPeerStats, localPeerStats => localPeerStats?.subscribe?.packetsLost);\n\nconst jitter = createSelector(localPeerStats, localPeerStats => localPeerStats?.subscribe?.jitter);\n\n/**\n * The bitrate at which all the local tracks are being published at\n */\nconst publishBitrate = createSelector(localPeerStats, localPeerStats => localPeerStats?.publish?.bitrate);\n\n/**\n * The bitrate at which all the remote tracks are being received at\n */\nconst subscribeBitrate = createSelector(localPeerStats, localPeerStats => localPeerStats?.subscribe?.bitrate);\n\n/**\n * The total bitrate available for publishing\n */\nconst availablePublishBitrate = createSelector(\n localPeerStats,\n localPeerStats => localPeerStats?.publish?.availableOutgoingBitrate,\n);\n\n/**\n * The total bitrate available for subscribing to remote peers\n */\nconst availableSubscribeBitrate = createSelector(\n localPeerStats,\n localPeerStats => localPeerStats?.subscribe?.availableIncomingBitrate,\n);\n\n/**\n * The total bytes sent by the local peer\n */\nconst totalBytesSent = createSelector(localPeerStats, localPeerStats => localPeerStats?.publish?.bytesSent);\n\n/**\n * The total bytes received by the local peer\n */\nconst totalBytesReceived = createSelector(localPeerStats, localPeerStats => localPeerStats?.subscribe?.bytesReceived);\n\n/**\n * By ID Selectors\n * To be used for remote tracks\n */\n\nconst selectPeerStatsByIDBare = createSelector([selectPeerStatsMap, selectPeerID], (storePeerStats, peerID) =>\n peerID ? storePeerStats[peerID] : undefined,\n);\n\nconst selectTrackStatsByIDBare = createSelector(\n [selectRemoteTrackStatsMap, selectTrackID],\n (storeTrackStats, trackID) => (trackID ? storeTrackStats[trackID] : undefined),\n);\n\nconst selectLocalTrackStatsByIDBare = createSelector(\n [selectLocalTrackStatsMap, selectTrackID],\n (storeLocalTrackStats, trackID) => (trackID ? storeLocalTrackStats[trackID] : undefined),\n);\n\n/**\n * Stats(bitrate, bytes sent/received, etc...) for a single peer given the peer ID\n */\nconst peerStatsByID = byIDCurry(selectPeerStatsByIDBare);\n\n/**\n * Stats(bitrate, bytes sent/received, framerate, FPS, etc...) for a remote track\n */\nconst trackStatsByID = byIDCurry(selectTrackStatsByIDBare);\n\n/**\n * Local track stats selectors\n */\n\nconst localAudioTrackStats = createSelector(\n [selectLocalTrackStatsMap, selectLocalAudioTrackID],\n (trackStats, trackID) => (trackID ? trackStats[trackID]?.[0] : undefined),\n);\n\nconst localAudioTrackStatsByID = byIDCurry(\n createSelector(selectLocalTrackStatsByIDBare, trackStats => trackStats?.[0]),\n);\n\nconst localVideoTrackStats = createSelector(\n [selectLocalTrackStatsMap, selectLocalVideoTrackID],\n (trackStats, trackID) => (trackID ? trackStats[trackID]?.[0] : undefined),\n);\n\nconst localVideoTrackStatsByID = byIDCurry(createSelector(selectLocalTrackStatsByIDBare, trackStats => trackStats));\n\nconst localVideoTrackStatsByLayer = (layer?: HMSPreferredSimulcastLayer) =>\n byIDCurry(\n createSelector(selectLocalTrackStatsByIDBare, stats => {\n const rid = (Object.keys(simulcastMapping) as RID[]).find(key => simulcastMapping[key] === layer);\n return layer ? stats?.find(stat => stat.rid === rid) || stats?.[0] : stats?.[0];\n }),\n );\n\nexport const selectHMSStats = {\n localPeerStats,\n packetsLost,\n jitter,\n publishBitrate,\n subscribeBitrate,\n availablePublishBitrate,\n availableSubscribeBitrate,\n totalBytesSent,\n totalBytesReceived,\n peerStatsByID,\n trackStatsByID,\n localAudioTrackStatsByID,\n localVideoTrackStatsByID,\n localVideoTrackStatsByLayer,\n localAudioTrackStats,\n localVideoTrackStats,\n};\n"],
5
- "mappings": "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",
6
- "names": ["require_package", "__commonJSMin", "exports", "module", "src_exports", "__export", "HMSMessageType", "HMSNotificationSeverity", "HMSNotificationTypes", "HMSPlaylistType", "HMSReactiveStore", "HMSRoomState", "HMSStats", "createDefaultStatsStore", "createDefaultStoreState", "selectAppData", "selectAppDataByPath", "selectAudioPlaylist", "selectAudioPlaylistTrackByPeerID", "selectAudioTrackByID", "selectAudioTrackByPeerID", "selectAudioTrackVolume", "selectAudioVolumeByPeerID", "selectAuxiliaryAudioByPeerID", "selectAuxiliaryTracksByPeerID", "selectAvailableRoleNames", "selectBroadcastMessages", "selectBroadcastMessagesUnreadCount", "selectCameraStreamByPeerID", "selectConnectionQualities", "selectConnectionQualityByPeerID", "selectDegradedTracks", "selectDevices", "selectDidIJoinWithin", "selectDominantSpeaker", "selectErrors", "selectFullAppData", "selectHLSState", "selectHMSMessages", "selectHMSMessagesCount", "selectHMSStats", "selectHandRaisedPeers", "selectHasPeerHandRaised", "selectIsAllowedToPreviewMedia", "selectIsAllowedToPublish", "selectIsAllowedToSubscribe", "selectIsAudioLocallyMuted", "selectIsConnectedToRoom", "selectIsInPreview", "selectIsLargeRoom", "selectIsLocalAudioEnabled", "selectIsLocalAudioPluginPresent", "selectIsLocalScreenShared", "selectIsLocalVideoDisplayEnabled", "selectIsLocalVideoEnabled", "selectIsLocalVideoPluginPresent", "selectIsLocallyMutedByPeerID", "selectIsPeerAudioEnabled", "selectIsPeerVideoEnabled", "selectIsRoleAllowedToPublish", "selectIsScreenShareLocallyMutedByPeerID", "selectIsSomeoneScreenSharing", "selectLocalAudioTrackID", "selectLocalMediaSettings", "selectLocalPeer", "selectLocalPeerID", "selectLocalPeerName", "selectLocalPeerRole", "selectLocalPeerRoleName", "selectLocalTrackIDs", "selectLocalVideoTrackID", "selectMessageIDsInOrder", "selectMessagesByPeerID", "selectMessagesByRole", "selectMessagesMap", "selectMessagesUnreadCountByPeerID", "selectMessagesUnreadCountByRole", "selectPeerAudioByID", "selectPeerByCondition", "selectPeerByID", "selectPeerCount", "selectPeerMetadata", "selectPeerName", "selectPeerNameByID", "selectPeerScreenSharing", "selectPeerSharingAudio", "selectPeerSharingAudioPlaylist", "selectPeerSharingVideoPlaylist", "selectPeers", "selectPeersByCondition", "selectPeersByRole", "selectPeersByRoles", "selectPeersMap", "selectPeersScreenSharing", "selectPeersWithAudioStatus", "selectPermissions", "selectPollByID", "selectPolls", "selectPollsMap", "selectPreviewRole", "selectPreviewRoleName", "selectRTMPState", "selectRecentError", "selectRecordingState", "selectRemotePeers", "selectRoleByRoleName", "selectRoleChangeRequest", "selectRolesMap", "selectRoom", "selectRoomID", "selectRoomStartTime", "selectRoomStarted", "selectRoomState", "selectScreenAudioTrackByID", "selectScreenShareAudioByPeerID", "selectScreenShareByPeerID", "selectScreenSharesByPeerId", "selectScreenVideoTrackByID", "selectScreenshareAudioVolumeByPeerID", "selectSessionId", "selectSessionMetadata", "selectSessionStore", "selectSimulcastLayerByTrack", "selectSpeakers", "selectTemplateAppData", "selectTrackAudioByID", "selectTrackByID", "selectTracksMap", "selectUnreadHMSMessagesCount", "selectVideoPlaylist", "selectVideoPlaylistAudioTrackByPeerID", "selectVideoPlaylistVideoTrackByPeerID", "selectVideoTrackByID", "selectVideoTrackByPeerID", "__toCommonJS", "HMSRoomState", "createDefaultStoreState", "createDefaultStatsStore", "HMSMessageType", "HMSNotificationSeverity", "HMSNotificationTypes", "HMSPlaylistType", "import_reselect", "getScreenSharesByPeer", "tracks", "peer", "videoTrack", "audioTrack", "trackID", "track", "isScreenShare", "isAudio", "isVideo", "isAudioPlaylist", "isVideoPlaylist", "isDegraded", "isTrackEnabled", "store", "isTrackDisplayEnabled", "isRoleAllowedToPublish", "role", "_a", "video", "audio", "screen", "selectRoom", "store", "selectErrors", "selectRecentError", "errors", "selectRoomID", "room", "selectPeersMap", "selectMessagesMap", "selectMessageIDsInOrder", "selectTracksMap", "selectLocalMediaSettings", "selectFullAppData", "selectDevices", "selectSpeakers", "selectConnectionQualities", "selectIsConnectedToRoom", "selectPeerCount", "isConnected", "selectHideLocalPeer", "selectPeers", "storePeers", "hideLocalPeer", "peerID", "selectTracks", "storeTracks", "selectLocalPeer", "peers", "selectLocalPeerID", "selectLocalPeerName", "peer", "selectLocalPeerRoleName", "selectLocalAudioTrackID", "selectLocalVideoTrackID", "selectLocalAuxiliaryTrackIDs", "selectLocalTrackIDs", "audioTrackID", "videoTrackID", "auxiliaryTrackIDs", "trackIDs", "selectRemotePeers", "p", "selectDominantSpeaker", "peersMap", "speakers", "speakersInOrder", "s1", "s2", "_a", "_b", "s1Level", "selectIsLocalAudioEnabled", "localPeer", "isTrackEnabled", "selectIsLocalVideoEnabled", "selectIsLocalVideoDisplayEnabled", "isTrackDisplayEnabled", "selectIsLocalScreenShared", "tracksMap", "video", "audio", "getScreenSharesByPeer", "selectPeerScreenSharing", "screensharePeer", "selectIsSomeoneScreenSharing", "selectPeerSharingAudio", "selectPeersScreenSharing", "videoPeers", "audioPeers", "selectPeerSharingVideoPlaylist", "trackId", "track", "isVideoPlaylist", "isVideo", "selectPeerSharingAudioPlaylist", "isAudioPlaylist", "selectDegradedTracks", "tracks", "isDegraded", "selectHMSMessagesCount", "messageIDs", "selectUnreadHMSMessagesCount", "messages", "m", "selectHMSMessages", "msgIDs", "msgMap", "msgId", "selectRoomState", "selectIsInPreview", "roomState", "selectRoomStarted", "selectRolesMap", "selectAvailableRoleNames", "rolesMap", "selectLocalPeerRole", "selectPreviewRoleName", "selectPreviewRole", "roleName", "selectIsAllowedToSubscribe", "role", "selectPermissions", "selectRecordingState", "selectRTMPState", "selectHLSState", "selectSessionId", "selectRoomStartTime", "selectIsLargeRoom", "selectTemplateAppData", "selectSessionMetadata", "selectPollsMap", "selectPolls", "selectHandRaisedPeers", "import_reselect", "selectPlaylistMap", "type", "store", "selectPlaylistSelection", "selectPlaylistProgress", "selectPlaylistCurrentTime", "selectPlaylistPlaybackRate", "selectPlaylistVolume", "selectPlaylist", "storePlaylist", "selectPlaylistSelectedItem", "currentSelection", "selectAudioPlaylist", "selectVideoPlaylist", "import_reselect", "byIDCurry", "selector", "id", "store", "import_hms_video", "HMS_STORE_TAG", "HMSLogger", "tag", "data", "mark", "level", "entry", "error", "selectPeerID", "_store", "peerID", "selectTrackID", "trackID", "selectRoleName", "roleName", "selectAppDataKey", "key", "selectPollID", "pollID", "selectPeerByIDBare", "selectPeersMap", "storePeers", "selectTrackByIDBare", "selectTracksMap", "storeTracks", "selectVideoTrackByIDBare", "track", "selectAudioTrackByIDBare", "selectScreenAudioTrackByIDBare", "selectScreenVideoTrackByIDBare", "selectPollByIDBare", "selectPollsMap", "storePolls", "selectPeerByID", "byIDCurry", "selectAppData", "selectFullAppData", "appData", "selectSessionStore", "store", "selectAppDataByPath", "keys", "value", "selectPeerNameByID", "peer", "selectTrackByID", "selectVideoTrackByID", "selectAudioTrackByID", "selectScreenAudioTrackByID", "selectScreenVideoTrackByID", "selectVideoTrackByPeerID", "selectAudioTrackByPeerID", "selectCameraStreamByPeerID", "selectAuxiliaryTracksByPeerID", "selectSpeakerByTrackID", "selectTrackAudioByID", "speaker", "selectSpeakerByPeerID", "peerAudioTrack", "selectPeerAudioByID", "selectConnectionQualityByPeerID", "selectAuxiliaryAudioByPeerID", "isAudio", "selectVideoPlaylistVideoTrackByPeerID", "tracks", "isVideoPlaylist", "isVideo", "selectVideoPlaylistAudioTrackByPeerID", "selectAudioPlaylistTrackByPeerID", "isAudioPlaylist", "selectScreenSharesByPeerId", "getScreenSharesByPeer", "selectScreenShareByPeerID", "id", "screenshare", "selectScreenShareAudioByPeerID", "selectIsPeerAudioEnabled", "isTrackEnabled", "selectIsPeerVideoEnabled", "selectIsAudioLocallyMuted", "selectIsLocallyMutedByPeerID", "selectIsScreenShareLocallyMutedByPeerID", "selectAudioTrackVolume", "HMSLogger", "selectAudioVolumeByPeerID", "selectScreenshareAudioVolumeByPeerID", "selectSimulcastLayerByTrack", "selectMessagesByPeerIDInternal", "selectHMSMessages", "selectLocalPeerID", "messages", "localPeerID", "message", "_a", "selectMessagesByRoleInternal", "_b", "selectBroadcastMessages", "selectUnreadMessageCountByRole", "m", "selectUnreadMessageCountByPeerID", "selectBroadcastMessagesUnreadCount", "selectMessagesByPeerID", "selectMessagesByRole", "selectMessagesUnreadCountByRole", "selectMessagesUnreadCountByPeerID", "selectPeersByRole", "role", "selectPeers", "peers", "p", "selectPeersByRoles", "roles", "selectPeerMetadata", "peerId", "error", "selectHasPeerHandRaised", "selectPeerName", "selectPollByID", "import_reselect", "selectPeersWithAudioStatus", "selectPeersMap", "selectTracksMap", "peersMap", "tracksMap", "peer", "_a", "selectRoleChangeStoreRequest", "store", "selectRoleChangeRequest", "selectRolesMap", "request", "rolesMap", "selectIsAllowedToPublish", "selectLocalPeerRole", "role", "isRoleAllowedToPublish", "selectIsAllowedToPreviewMedia", "selectPreviewRole", "import_reselect", "selectRoleByRoleName", "roleName", "selectRolesMap", "rolesMap", "selectIsRoleAllowedToPublish", "role", "isRoleAllowedToPublish", "selectLocalVideoPlugins", "selectLocalVideoTrackID", "selectTracksMap", "trackID", "tracksMap", "track", "selectLocalAudioPlugins", "selectLocalAudioTrackID", "selectIsLocalVideoPluginPresent", "pluginName", "plugins", "selectIsLocalAudioPluginPresent", "selectPeerByCondition", "predicate", "selectPeers", "peers", "selectPeersByCondition", "selectDidIJoinWithin", "timeMs", "selectRoom", "room", "mergeNewPeersInDraft", "draftPeers", "newPeers", "peerIDs", "union", "peerID", "oldPeer", "newPeer", "isEntityUpdated", "areArraysEqual", "isEntityRemoved", "isEntityAdded", "mergeNewTracksInDraft", "draftTracks", "newTracks", "trackIDs", "trackID", "oldTrack", "newTrack", "mergeTrackArrayFields", "mergeNewPollsInDraft", "draftPolls", "newPolls", "pollIDs", "pollID", "oldPoll", "newPoll", "mergeNewIndividualStatsInDraft", "draftStats", "newStats", "IDs", "oldStat", "newStat", "mergeLocalTrackStats", "tracks", "trackMap", "acc", "track", "a", "b", "oldItem", "newItem", "arr1", "arr2", "i", "set", "elem", "subscribeToSdkWebrtcStats", "sdk", "webrtcStore", "store", "unsubscribe", "selectRoomState", "initAndSubscribeWebrtcStore", "roomState", "resetHMSStatsStore", "_a", "_b", "unsubLocalPeer", "updateLocalPeerInWebrtcStore", "unsubSdkStats", "stats", "updateWebrtcStoreStats", "unsubID", "unsubVideoTrackID", "unsubAudioTrackID", "selectLocalPeerID", "draft", "localPeerID", "selectLocalVideoTrackID", "videoTrackID", "selectLocalAudioTrackID", "audioTrackID", "hmsStore", "tracks", "selectTracksMap", "newTrackStats", "trackIDs", "trackID", "sdkTrackStats", "mergeNewIndividualStatsInDraft", "newPeerStats", "mergeLocalTrackStats", "reason", "createDefaultStatsStore", "import_hms_video", "storeNameWithTabTitle", "storeName", "import_immer", "import_shallow", "import_vanilla", "import_hms_video", "import_eventemitter2", "PEER_NOTIFICATION_TYPES", "TRACK_NOTIFICATION_TYPES", "POLL_NOTIFICATION_TYPES", "HMS_NOTIFICATION_EVENT", "HMSNotifications", "store", "cb", "type", "eventCallback", "notification", "matchesType", "EventEmitter", "HMSNotificationTypes", "item", "request", "_a", "peerName", "peers", "peer", "hmsPeer", "selectPeerByID", "notificationType", "PEER_NOTIFICATION_TYPES", "trackID", "hmsTrack", "selectTrackByID", "TRACK_NOTIFICATION_TYPES", "message", "error", "pollID", "POLL_NOTIFICATION_TYPES", "poll", "selectPollByID", "data", "severity", "import_hms_video", "import_hms_video", "isRemoteTrack", "track", "import_hms_video", "SDKToHMS", "_SDKToHMS", "sdkPeer", "_a", "_b", "_c", "track", "sdkTrack", "peerId", "mediaSettings", "SDKHMSRemoteAudioTrack", "SDKHMSLocalVideoTrack", "SDKHMSLocalAudioTrack", "SDKHMSRemoteVideoTrack", "areArraysEqual", "newCaptureHandle", "sdkRoom", "sdkLocalPeerId", "recording", "rtmp", "hls", "sdkMessage", "_d", "_e", "_f", "_g", "role", "sdkRoles", "roles", "req", "sdkException", "sdkDeviceChangeEvent", "convertedData", "playlistManager", "audioPlaylist", "videoPlaylist", "playlistItem", "type", "currentSelection", "isPlaying", "isSelected", "__spreadProps", "__spreadValues", "convertedPlaylist", "progress", "volume", "list", "currentIndex", "variant", "HMSInteractivityCenter", "sdk", "poll", "questions", "pollID", "responses", "HMSPlaylist", "playlistManager", "type", "syncPlaylistState", "store", "id", "__async", "HMSLogger", "selector", "selectAudioPlaylist", "selectVideoPlaylist", "selection", "seekValue", "volume", "list", "autoplay", "playbackRate", "removed", "HMSSessionStore", "sdk", "setLocally", "key", "value", "__async", "latestValue", "keys", "stringifiedKeys", "BeamSpeakerLabelsLogger", "store", "actions", "__async", "HMSLogger", "isConnected", "selectIsConnectedToRoom", "unsub", "loop", "_a", "peers", "selectPeers", "peer", "peerAudioLevels", "sdkTrack", "nativeStream", "peerLevel", "payload", "stream", "analyserNode", "level", "analyser", "data", "lowest", "max", "frequency", "normalized", "HMSSDKActions", "store", "sdk", "notificationManager", "type", "progress", "draftStore", "action", "SDKToHMS", "sdkPeer", "peer", "selectPeerByID", "actionName", "PEER_NOTIFICATION_TYPES", "hmsPeer", "storePeer", "isEntityUpdated", "areArraysEqual", "peerID", "fn", "name", "HMSSessionStore", "HMSInteractivityCenter", "__async", "value", "trackId", "deviceId", "layer", "_a", "track", "SDKHMSRemoteVideoTrack", "HMSLogger", "selectVideoTrackByID", "tokenRequest", "tokenRequestOptions", "config", "roomState", "selectRoomState", "err", "isConnectedToRoom", "selectIsConnectedToRoom", "notifyServer", "currentRoomState", "enabled", "error", "trackID", "selectLocalAudioTrackID", "selectLocalVideoTrackID", "settings", "sdkTrack", "message", "sdkMessage", "roles", "storeRoles", "selectRolesMap", "hmsRoles", "roleName", "messageInput", "hmsMessage", "readStatus", "messageId", "id", "videoElement", "resolve", "unsub", "selectIsLocalVideoEnabled", "plugin", "pluginFrameRate", "result", "forPeerId", "toRole", "force", "rolesToBeChanged", "role", "request", "sdkRequest", "peerId", "options", "iterator", "appData", "key", "merge", "isValueObject", "newAppData", "lock", "reason", "permissions", "selectPermissions", "localPeerId", "params", "metadataList", "metadata", "isRemoteTrack", "rolesMap", "level", "frameworkInfo", "msgTypes", "replace", "msgType", "BeamSpeakerLabelsLogger", "createDefaultStoreState", "requestedBy", "__spreadProps", "__spreadValues", "event", "devices", "localPeer", "selectLocalPeer", "sdkLocalPeer", "notification", "quality", "updates", "actionType", "polls", "POLL_NOTIFICATION_TYPES", "pollsObject", "acc", "poll", "question", "_b", "option", "response", "mergeNewPollsInDraft", "selectIsLocalScreenShared", "newHmsPeers", "newHmsPeerIDs", "newHmsTracks", "newHmsSDkTracks", "newMediaSettings", "newNetworkQuality", "newPreview", "sdkPeers", "sdkTracks", "hmsTrack", "recording", "rtmp", "hls", "draftPeers", "draftTracks", "mergeNewPeersInDraft", "mergeNewTracksInDraft", "sdkRoom", "playlistManager", "HMSPlaylist", "item", "room", "storePeers", "selectPeersMap", "newPeerIds", "hmsPeers", "TRACK_NOTIFICATION_TYPES", "storeTrack", "mergeTrackArrayFields", "sdkSpeakers", "trackIDAudioLevelMap", "sdkSpeaker", "speakerEntries", "speaker", "newQualities", "sdkUpdate", "storeTrackID", "selectTrackByID", "tracks", "tracksMap", "selectTracksMap", "sdkError", "sdkException", "SDKHMSException", "auxiliaryIndex", "selectLocalMediaSettings", "audioTrack", "videoTrack", "hmsLocalPeer", "SDKHMSAudioTrack", "displayEnabled", "selectIsLocalVideoDisplayEnabled", "actuallyEnabled", "inconsistency", "sdkTrackID", "toRemove", "index", "req", "selectLocalTrackIDs", "selectIsInPreview", "updatesList", "update", "HMSReactiveStore", "_HMSReactiveStore", "hmsStore", "hmsActions", "hmsNotifications", "HMSStats", "storeNameWithTabTitle", "createDefaultStoreState", "HMSNotifications", "HMSSDKActions", "storeName", "defaultCreatorFn", "create", "savedSetState", "partial", "nextState", "prevGetState", "selector", "namedSetState", "__spreadProps", "__spreadValues", "store", "prevSubscribe", "listener", "equalityFn", "shallow", "api", "prefix", "extension", "e", "fn", "devtools", "action", "actionName", "message", "_a", "_b", "_c", "_d", "actions", "state", "index", "HMSStats", "hmsStore", "sdk", "HMSReactiveStore", "storeNameWithTabTitle", "createDefaultStatsStore", "resolve", "_a", "_b", "selectRoomState", "roomState", "subscribeToSdkWebrtcStats", "import_reselect", "selectLocalPeerID", "store", "selectLocalAudioTrackID", "selectLocalVideoTrackID", "selectPeerID", "_store", "peerID", "selectTrackID", "trackID", "selectRemoteTrackStatsMap", "selectPeerStatsMap", "selectLocalTrackStatsMap", "localPeerStats", "storePeerStats", "localPeerID", "packetsLost", "_a", "jitter", "publishBitrate", "subscribeBitrate", "availablePublishBitrate", "availableSubscribeBitrate", "totalBytesSent", "totalBytesReceived", "selectPeerStatsByIDBare", "selectTrackStatsByIDBare", "storeTrackStats", "selectLocalTrackStatsByIDBare", "storeLocalTrackStats", "peerStatsByID", "byIDCurry", "trackStatsByID", "localAudioTrackStats", "trackStats", "localAudioTrackStatsByID", "localVideoTrackStats", "localVideoTrackStatsByID", "localVideoTrackStatsByLayer", "layer", "stats", "rid", "key", "stat", "selectHMSStats"]
4
+ "sourcesContent": ["{\n \"version\": \"0.10.22\",\n \"license\": \"MIT\",\n \"main\": \"dist/index.cjs.js\",\n \"module\": \"dist/index.js\",\n \"typings\": \"dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"src\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs.js\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"scripts\": {\n \"prestart\": \"rm -rf dist && yarn types:build\",\n \"start\": \"concurrently \\\"yarn dev\\\" \\\"yarn types\\\"\",\n \"dev\": \"node ../../scripts/dev\",\n \"build:only\": \"node ../../scripts/build\",\n \"build\": \"yarn build:only && yarn types:build\",\n \"types\": \"tsc -w\",\n \"types:build\": \"tsc -p tsconfig.json\",\n \"format\": \"prettier --write src/**/*.ts\",\n \"test\": \"jest --maxWorkers=1\",\n \"test:watch\": \"jest --watch\",\n \"test:coverage\": \"jest --coverage\",\n \"lint\": \"eslint -c ../../.eslintrc .\",\n \"lint:fix\": \"yarn lint --fix\",\n \"prepare\": \"yarn build\",\n \"size\": \"size-limit\",\n \"analyze\": \"size-limit --why\",\n \"docs\": \"rm -rf ./docs && typedoc && rm -f ./docs/README.md && mkdir ./docs/home &&mv ./docs/modules.md ./docs/home/content.md && node ../../scripts/docs-store && npx prettier --write './docs/**/*'\"\n },\n \"name\": \"@100mslive/hms-video-store\",\n \"author\": \"100ms\",\n \"sideEffects\": false,\n \"dependencies\": {\n \"@100mslive/hms-video\": \"0.9.22\",\n \"eventemitter2\": \"^6.4.7\",\n \"immer\": \"^9.0.6\",\n \"reselect\": \"4.0.0\",\n \"zustand\": \"3.5.7\"\n },\n \"devDependencies\": {\n \"jsdom-worker\": \"^0.3.0\",\n \"ts-node\": \"^10.4.0\",\n \"tslib\": \"^2.2.0\"\n },\n \"description\": \"@100mslive Core SDK which abstracts the complexities of webRTC while providing a reactive store for data management with a unidirectional data flow\",\n \"keywords\": [\n \"video\",\n \"webrtc\",\n \"conferencing\",\n \"100ms\"\n ],\n \"gitHead\": \"543b9152024ee7e4554701f1387b1af32906b58a\"\n}\n", "export * from './core';\nexport { HMSReactiveStore } from './core/hmsSDKStore/HMSReactiveStore';\n", "import { HLSVariant, HMSHLS, HMSRecording, HMSRTMP } from '@100mslive/hms-video';\nimport { HMSPeerID } from './peer';\n\nexport type { HMSRecording, HMSRTMP, HMSHLS, HLSVariant };\nexport type HMSRoomID = string;\n\n/**\n * Check out internal-docs/RoomStateFlow.tldr for flow of room state\n * View it by\n * - Installing tldraw for VSCode(https://marketplace.visualstudio.com/items?itemName=tldraw-org.tldraw-vscode), or\n * - Open the file in https://www.tldraw.com/\n */\nexport enum HMSRoomState {\n Disconnected = 'Disconnected',\n Preview = 'Preview',\n Connecting = 'Connecting',\n Connected = 'Connected',\n Reconnecting = 'Reconnecting',\n Disconnecting = 'Disconnecting',\n Failed = 'Failed',\n}\n\nexport interface HMSRoom {\n id: HMSRoomID;\n name: string;\n isConnected?: boolean;\n peers: HMSPeerID[];\n localPeer: HMSPeerID;\n roomState: HMSRoomState;\n recording: HMSRecording;\n rtmp: HMSRTMP;\n hls: HMSHLS;\n sessionId: string;\n startedAt?: Date;\n joinedAt?: Date;\n /**\n * if this number is available room.peers is not guaranteed to have all the peers.\n */\n peerCount?: number;\n isLargeRoom?: boolean;\n}\n", "import { HMSException } from './error';\nimport { HMSMessage, HMSMessageID } from './message';\nimport { HMSPeer, HMSPeerID, HMSSpeaker, HMSTrack, HMSTrackID } from './peer';\nimport { HMSPlaylist } from './playlist';\nimport { HMSRoleChangeStoreRequest } from './requests';\nimport { HMSRole } from './role';\nimport { HMSRoom, HMSRoomState } from './room';\nimport { HMSMediaSettings } from './settings';\nimport { DeviceMap, HMSConnectionQuality, HMSPeerStats, HMSPoll, HMSTrackStats } from '../hmsSDKStore/sdkTypes';\n\nexport interface HMSGenericTypes {\n sessionStore: Record<string, any>;\n}\n\n/*\n * Defines the schema of the central store. UI Components are aware of the presence\n * of this central store. This is the global state - the single source of immutable truth.\n */\nexport interface HMSStore<T extends HMSGenericTypes = { sessionStore: Record<string, any> }> {\n room: HMSRoom;\n peers: Record<HMSPeerID, HMSPeer>;\n speakers: Record<HMSTrackID, HMSSpeaker>;\n connectionQualities: Record<HMSPeerID, HMSConnectionQuality>;\n tracks: Record<HMSTrackID, HMSTrack>;\n playlist: HMSPlaylist<any>;\n messages: {\n byID: Record<HMSMessageID, HMSMessage>;\n allIDs: HMSMessageID[];\n };\n settings: HMSMediaSettings;\n devices: DeviceMap;\n roles: Record<string, HMSRole>;\n templateAppData: Record<string, string>;\n appData?: Record<string, any>;\n roleChangeRequests: HMSRoleChangeStoreRequest[];\n /** @deprecated use `sessionStore` instead */\n sessionMetadata?: any;\n preview?: {\n localPeer?: HMSPeerID;\n asRole?: string;\n videoTrack?: HMSTrackID;\n audioTrack?: HMSTrackID;\n };\n errors: HMSException[]; // for the convenience of debugging and seeing any error in devtools\n sessionStore: T['sessionStore'];\n polls: Record<string, HMSPoll>;\n /** @internal */\n hideLocalPeer: boolean;\n}\n\nexport interface HMSStatsStore {\n remoteTrackStats: Record<HMSTrackID, HMSTrackStats | undefined>;\n localTrackStats: Record<HMSTrackID, HMSTrackStats[] | undefined>;\n peerStats: Record<HMSPeerID, HMSPeerStats | undefined>;\n localPeer: {\n id: HMSPeerID;\n videoTrack?: HMSTrackID;\n audioTrack?: HMSTrackID;\n };\n}\n\n/**\n * @internal\n */\nexport const createDefaultStoreState = <T extends HMSGenericTypes>(): HMSStore<T> => {\n return {\n room: {\n id: '',\n isConnected: false,\n name: '',\n peers: [],\n localPeer: '',\n roomState: HMSRoomState.Disconnected,\n recording: {\n browser: {\n running: false,\n },\n server: {\n running: false,\n },\n hls: { running: false },\n },\n rtmp: {\n running: false,\n },\n hls: {\n running: false,\n variants: [],\n },\n sessionId: '',\n },\n peers: {},\n tracks: {},\n playlist: {\n audio: {\n list: {},\n selection: { id: '', hasPrevious: false, hasNext: false },\n progress: 0,\n volume: 0,\n currentTime: 0,\n playbackRate: 1.0,\n },\n video: {\n list: {},\n selection: { id: '', hasPrevious: false, hasNext: false },\n progress: 0,\n volume: 0,\n currentTime: 0,\n playbackRate: 1.0,\n },\n },\n messages: { byID: {}, allIDs: [] },\n speakers: {},\n connectionQualities: {},\n settings: {\n audioInputDeviceId: '',\n audioOutputDeviceId: '',\n videoInputDeviceId: '',\n },\n devices: {\n audioInput: [],\n audioOutput: [],\n videoInput: [],\n },\n roles: {},\n roleChangeRequests: [],\n errors: [],\n sessionStore: {},\n templateAppData: {},\n polls: {},\n hideLocalPeer: false,\n };\n};\n\nexport const createDefaultStatsStore = (): HMSStatsStore => {\n return {\n peerStats: {},\n remoteTrackStats: {},\n localTrackStats: {},\n localPeer: { id: '' },\n };\n};\n", "import { HMSPeerID } from './peer';\nimport { HMSRoleName } from './role';\n\nexport type HMSMessageID = string;\n\n/**\n * @internal\n */\nexport enum HMSMessageType {\n CHAT = 'chat',\n}\n\nexport interface HMSMessage {\n id: HMSMessageID;\n sender?: HMSPeerID;\n senderName?: string;\n senderUserId?: string;\n senderRole?: string;\n recipientPeer?: HMSPeerID;\n recipientRoles?: HMSRoleName[];\n time: Date;\n read: boolean;\n type: string;\n message: any;\n /**\n * true if message will not be put it in store because it has been ignored\n */\n ignored: boolean;\n}\n\n/**\n * @internal\n */\nexport interface HMSMessageInput {\n recipientPeer?: HMSPeerID;\n recipientRoles?: HMSRoleName[];\n type?: string;\n message: any;\n}\n", "import { HMSPoll } from '@100mslive/hms-video';\nimport { HMSDeviceChangeEvent } from './device-change';\nimport { HMSException } from './error';\nimport { HMSMessage } from './message';\nimport { HMSPeer, HMSTrack } from './peer';\nimport { HMSPlaylistItem } from './playlist';\nimport { HMSChangeMultiTrackStateRequest, HMSChangeTrackStateRequest, HMSLeaveRoomRequest } from './requests';\n\ninterface BaseNotification {\n id: number;\n type: string;\n message: string;\n severity?: HMSNotificationSeverity;\n}\nexport interface HMSPeerNotification extends BaseNotification {\n type:\n | HMSNotificationTypes.PEER_JOINED\n | HMSNotificationTypes.PEER_LEFT\n | HMSNotificationTypes.NAME_UPDATED\n | HMSNotificationTypes.METADATA_UPDATED\n | HMSNotificationTypes.ROLE_UPDATED\n | HMSNotificationTypes.HAND_RAISE_CHANGED;\n data: HMSPeer;\n}\n\nexport interface HMSPeerListNotification extends BaseNotification {\n type: HMSNotificationTypes.PEER_LIST;\n data: HMSPeer[];\n}\nexport interface HMSTrackNotification extends BaseNotification {\n type:\n | HMSNotificationTypes.TRACK_ADDED\n | HMSNotificationTypes.TRACK_DEGRADED\n | HMSNotificationTypes.TRACK_UNMUTED\n | HMSNotificationTypes.TRACK_DESCRIPTION_CHANGED\n | HMSNotificationTypes.TRACK_MUTED\n | HMSNotificationTypes.TRACK_REMOVED\n | HMSNotificationTypes.TRACK_RESTORED;\n data: HMSTrack;\n}\nexport interface HMSMessageNotification extends BaseNotification {\n type: HMSNotificationTypes.NEW_MESSAGE;\n data: HMSMessage;\n}\nexport interface HMSExceptionNotification extends BaseNotification {\n type: HMSNotificationTypes.ERROR;\n data: HMSException;\n}\nexport interface HMSChangeTrackStateRequestNotification extends BaseNotification {\n type: HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST;\n data: HMSChangeTrackStateRequest;\n}\nexport interface HMSChangeMultiTrackStateRequestNotification extends BaseNotification {\n type: HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST;\n data: HMSChangeMultiTrackStateRequest;\n}\n\nexport interface HMSLeaveRoomRequestNotification extends BaseNotification {\n type: HMSNotificationTypes.ROOM_ENDED | HMSNotificationTypes.REMOVED_FROM_ROOM;\n data: HMSLeaveRoomRequest;\n}\nexport interface HMSDeviceChangeEventNotification extends BaseNotification {\n type: HMSNotificationTypes.DEVICE_CHANGE_UPDATE;\n data?: HMSDeviceChangeEvent;\n}\nexport interface HMSPlaylistItemNotification<T> extends BaseNotification {\n type: HMSNotificationTypes.PLAYLIST_TRACK_ENDED;\n data: HMSPlaylistItem<T>;\n}\n\nexport interface HMSReconnectionNotification extends BaseNotification {\n type: HMSNotificationTypes.RECONNECTED | HMSNotificationTypes.RECONNECTING;\n data: HMSException | null;\n}\n\nexport interface HMSPollNotification extends BaseNotification {\n type: HMSNotificationTypes.POLL_STARTED | HMSNotificationTypes.POLL_STOPPED | HMSNotificationTypes.POLL_VOTES_UPDATED;\n data: HMSPoll;\n}\n\nexport type HMSNotification =\n | HMSPeerNotification\n | HMSPeerListNotification\n | HMSTrackNotification\n | HMSMessageNotification\n | HMSExceptionNotification\n | HMSChangeTrackStateRequestNotification\n | HMSChangeMultiTrackStateRequestNotification\n | HMSLeaveRoomRequestNotification\n | HMSDeviceChangeEventNotification\n | HMSReconnectionNotification\n | HMSPlaylistItemNotification<any>;\n\nexport enum HMSNotificationSeverity {\n INFO = 'info',\n ERROR = 'error',\n}\n\nexport enum HMSNotificationTypes {\n PEER_JOINED = 'PEER_JOINED',\n PEER_LEFT = 'PEER_LEFT',\n PEER_LIST = 'PEER_LIST',\n NEW_MESSAGE = 'NEW_MESSAGE',\n ERROR = 'ERROR',\n RECONNECTING = 'RECONNECTING',\n RECONNECTED = 'RECONNECTED',\n TRACK_ADDED = 'TRACK_ADDED',\n TRACK_REMOVED = 'TRACK_REMOVED',\n TRACK_MUTED = 'TRACK_MUTED',\n TRACK_UNMUTED = 'TRACK_UNMUTED',\n TRACK_DEGRADED = 'TRACK_DEGRADED',\n TRACK_RESTORED = 'TRACK_RESTORED',\n TRACK_DESCRIPTION_CHANGED = 'TRACK_DESCRIPTION_CHANGED',\n ROLE_UPDATED = 'ROLE_UPDATED',\n CHANGE_TRACK_STATE_REQUEST = 'CHANGE_TRACK_STATE_REQUEST',\n CHANGE_MULTI_TRACK_STATE_REQUEST = 'CHANGE_MULTI_TRACK_STATE_REQUEST',\n ROOM_ENDED = 'ROOM_ENDED',\n REMOVED_FROM_ROOM = 'REMOVED_FROM_ROOM',\n DEVICE_CHANGE_UPDATE = 'DEVICE_CHANGE_UPDATE',\n PLAYLIST_TRACK_ENDED = 'PLAYLIST_TRACK_ENDED',\n NAME_UPDATED = 'NAME_UPDATED',\n METADATA_UPDATED = 'METADATA_UPDATED',\n POLL_CREATED = 'POLL_CREATED',\n POLL_STARTED = 'POLL_STARTED',\n POLL_STOPPED = 'POLL_STOPPED',\n POLL_VOTES_UPDATED = 'POLL_VOTES_UPDATED',\n HAND_RAISE_CHANGED = 'HAND_RAISE_CHANGED',\n}\n\nexport type HMSNotificationMapping<T extends HMSNotificationTypes, C = any> = {\n [HMSNotificationTypes.PEER_JOINED]: HMSPeerNotification;\n [HMSNotificationTypes.PEER_LEFT]: HMSPeerNotification;\n [HMSNotificationTypes.PEER_LIST]: HMSPeerListNotification;\n [HMSNotificationTypes.NAME_UPDATED]: HMSPeerNotification;\n [HMSNotificationTypes.METADATA_UPDATED]: HMSPeerNotification;\n [HMSNotificationTypes.ROLE_UPDATED]: HMSPeerNotification;\n [HMSNotificationTypes.TRACK_ADDED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_REMOVED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_MUTED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_UNMUTED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_DEGRADED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_RESTORED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_DESCRIPTION_CHANGED]: HMSTrackNotification;\n [HMSNotificationTypes.TRACK_UNMUTED]: HMSTrackNotification;\n [HMSNotificationTypes.NEW_MESSAGE]: HMSMessageNotification;\n [HMSNotificationTypes.ROOM_ENDED]: HMSLeaveRoomRequestNotification;\n [HMSNotificationTypes.REMOVED_FROM_ROOM]: HMSLeaveRoomRequestNotification;\n [HMSNotificationTypes.DEVICE_CHANGE_UPDATE]: HMSDeviceChangeEventNotification;\n [HMSNotificationTypes.PLAYLIST_TRACK_ENDED]: HMSPlaylistItemNotification<C>;\n [HMSNotificationTypes.ERROR]: HMSExceptionNotification;\n [HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST]: HMSChangeTrackStateRequestNotification;\n [HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST]: HMSChangeMultiTrackStateRequestNotification;\n [HMSNotificationTypes.RECONNECTED]: HMSReconnectionNotification;\n [HMSNotificationTypes.RECONNECTING]: HMSReconnectionNotification;\n [HMSNotificationTypes.POLL_STARTED]: HMSPollNotification;\n [HMSNotificationTypes.POLL_STOPPED]: HMSPollNotification;\n [HMSNotificationTypes.POLL_VOTES_UPDATED]: HMSPollNotification;\n [HMSNotificationTypes.POLL_CREATED]: HMSPollNotification;\n [HMSNotificationTypes.HAND_RAISE_CHANGED]: HMSPeerNotification;\n}[T];\n\nexport type MappedNotifications<Type extends HMSNotificationTypes[]> = {\n [index in keyof Type]: HMSNotificationMapping<Type[index]>;\n};\n\nexport type HMSNotificationTypeParam = HMSNotificationTypes | HMSNotificationTypes[] | undefined;\n\nexport type HMSNotificationInCallback<T extends HMSNotificationTypeParam> = T extends HMSNotificationTypes[]\n ? MappedNotifications<T>[number]\n : T extends HMSNotificationTypes\n ? HMSNotificationMapping<T>\n : HMSNotification;\n\nexport type HMSNotificationCallback<T extends HMSNotificationTypeParam> = (\n notification: HMSNotificationInCallback<T>,\n) => void;\n\n/**\n * @category Core\n */\nexport interface IHMSNotifications {\n /**\n * you can subscribe to notifications for new message, peer add etc. using this function.\n * note that this is not meant to maintain any state on your side, as the reactive store already\n * does that. The intent of this function is mainly to display toast notifications or send analytics.\n * We'll provide a display message which can be displayed as it is for common cases.\n */\n onNotification<T extends HMSNotificationTypeParam>(cb: HMSNotificationCallback<T>, types?: T): () => void;\n}\n", "export enum HMSPlaylistType {\n audio = 'audio',\n video = 'video',\n}\nexport interface HMSPlaylistItem<T> {\n name: string;\n id: string;\n metadata?: T;\n url: string;\n type: HMSPlaylistType;\n duration?: number;\n playing: boolean;\n selected: boolean;\n}\n\nexport interface HMSPlaylistSelection {\n id: string;\n hasPrevious: boolean;\n hasNext: boolean;\n}\n\nexport interface HMSPlaylist<T> {\n audio: {\n list: Record<string, HMSPlaylistItem<T>>;\n selection: HMSPlaylistSelection;\n progress: number;\n volume: number;\n currentTime: number;\n playbackRate: number;\n };\n video: {\n list: Record<string, HMSPlaylistItem<T>>;\n selection: HMSPlaylistSelection;\n progress: number;\n volume: number;\n currentTime: number;\n playbackRate: number;\n };\n}\n\nexport interface IHMSPlaylistActions {\n /**\n * Pass the id of the item to be played\n * @param {string} id - id of playlist item\n */\n play(id: string): Promise<void>;\n /**\n * Pauses current playing item\n */\n pause(): Promise<void>;\n /**\n * PlayNext\n */\n playNext(): Promise<void>;\n /**\n * PlayPrevious\n */\n playPrevious(): Promise<void>;\n /**\n * seek passing seekValue - this is relative to current position\n * @param {number} seekValue - number in seconds to move forwards(pass negative values to move backwards)\n */\n seek(seekValue: number): void;\n /**\n * seek passing seekValue - seekValue will be absolute\n * @param {number} seekValue - value in seconds of absolute position in the playlist item duration\n */\n seekTo(seekValue: number): void;\n /**\n * set volume passing volume\n * @param {number} volume - number between 0-100\n */\n setVolume(volume: number): void;\n /**\n * pass list to set playlist\n * @param {HMSPlaylistItem[]} list of playlist items\n */\n setList<T>(list: HMSPlaylistItem<T>[]): void;\n /**\n * Stop the current playback and remove the tracks\n */\n stop(): Promise<void>;\n /**\n * set whether to autoplay next item in playlist after the current one ends\n * @param {boolean} autoplay\n */\n setIsAutoplayOn(autoplay: boolean): void;\n /**\n * Control the playback speed - 1.0 being normal, less than 1.0 will play it slowly\n * and more than 1.0 will play it faster.\n * @param playbackRate - value from 0.25 and 2.0\n */\n setPlaybackRate(playbackRate: number): void;\n removeItem(id: string): Promise<boolean>;\n clearList(): Promise<void>;\n}\n", "import { createSelector } from 'reselect';\nimport {\n getScreenSharesByPeer,\n isAudioPlaylist,\n isDegraded,\n isTrackDisplayEnabled,\n isTrackEnabled,\n isVideo,\n isVideoPlaylist,\n} from './selectorUtils';\n// noinspection ES6PreferShortImport\nimport { HMSRole } from '../hmsSDKStore/sdkTypes';\nimport {\n HMSException,\n HMSMessage,\n HMSPeer,\n HMSPeerID,\n HMSRoom,\n HMSRoomState,\n HMSStore,\n HMSVideoTrack,\n} from '../schema';\n\n/**\n * Select the current {@link HMSRoom} object to which you are connected.\n * @param store\n */\nexport const selectRoom = (store: HMSStore): HMSRoom => store.room;\n/**\n * Select the current {@link HMSException[]} object to monitor the error logs\n * @param store\n */\nexport const selectErrors = (store: HMSStore): HMSException[] => store.errors;\n\n/**\n * It will help to get the all the error\n */\nexport const selectRecentError = createSelector(selectErrors, errors => (errors.length === 0 ? null : errors.at(-1)));\n/**\n * Select the ID of the current room to which you are connected.\n */\nexport const selectRoomID = createSelector(selectRoom, room => room.id);\n\n/**\n * @internal\n */\nexport const selectPeersMap = (store: HMSStore): Record<HMSPeerID, HMSPeer> => store.peers;\n\n/**\n * @internal\n */\nexport const selectMessagesMap = (store: HMSStore) => store.messages.byID;\n\n/**\n * Select IDs of messages you've sent or received sorted chronologically.\n */\nexport const selectMessageIDsInOrder = (store: HMSStore) => store.messages.allIDs;\n\n/**\n * @internal\n */\nexport const selectTracksMap = (store: HMSStore) => store.tracks;\n\n/**\n * Select your media settings\n * i.e., choosen audio input device, audio output device and video input device.\n * @param store\n */\nexport const selectLocalMediaSettings = (store: HMSStore) => store.settings;\n\n/**\n * select appData.\n * @internal\n */\nexport const selectFullAppData = (store: HMSStore) => store.appData;\n\n/**\n * Select the available audio input, audio output and video input devices on your machine.\n * @param store\n * @returns An object of array of available audio input, audio output and video input devices.\n * ```\n * type DeviceMap = {\n * audioInput: InputDeviceInfo[];\n * audioOutput: MediaDeviceInfo[];\n * videoInput: InputDeviceInfo[];\n * }\n * ```\n */\nexport const selectDevices = (store: HMSStore) => {\n return store.devices;\n};\n\nexport const selectSpeakers = (store: HMSStore) => {\n return store.speakers;\n};\n\nexport const selectConnectionQualities = (store: HMSStore) => {\n return store.connectionQualities;\n};\n\n/**\n * Select a boolean flag denoting whether you've joined a room.\n * NOTE: Returns true only after join, returns false during preview.\n */\nexport const selectIsConnectedToRoom = createSelector([selectRoom], room => room && room.isConnected);\n\n/**\n * selectPeerCount gives the number of peers Inside the room. This doesn't count the local peer if\n * they're still in preview and haven't yet joined the room. Note that this will not necessarily equal the\n * number of peers received through selectPeers, it's possible to know total number of people in the room\n * without having details of everyone depending on dashboard settings.\n */\nexport const selectPeerCount = createSelector([selectIsConnectedToRoom, selectRoom], (isConnected, room) => {\n if (isConnected) {\n // if we have peer count from server return that else return number of peers in the store.\n // In case the strongly consistent peer list is disabled and only eventual consistent count and peer\n // details is sent, room.peerCount may be 0 for a few second even though local peer is connected, send 1 in that case.\n // TODO: Fix this at populating room.peerCount level than in selector.\n return room.peerCount !== undefined ? room.peerCount || 1 : room.peers.length;\n } else {\n // if we have peer count from server return that, else return number of peers except the local one because local is\n // not joined yet.\n // Math.max to ensure we're not returning -1, if the selector is called before local peer is put in the store\n return Math.max(room.peerCount !== undefined ? room.peerCount : room.peers.length - 1, 0);\n }\n});\n\n/**\n * @internal\n * Select a boolean flag denoting whether to hide local peer.\n * When this is true, `selectPeers` skips local peer.\n */\nconst selectHideLocalPeer = (store: HMSStore): boolean => store.hideLocalPeer;\n\n/**\n * Select an array of peers(remote peers and your local peer) present in the room.\n */\nexport const selectPeers = createSelector(\n [selectRoom, selectPeersMap, selectHideLocalPeer],\n (room, storePeers, hideLocalPeer) => {\n if (hideLocalPeer) {\n return room.peers.filter(peerID => room.localPeer !== peerID).map(peerID => storePeers[peerID]);\n }\n return room.peers.map(peerID => storePeers[peerID]);\n },\n);\n\n/**\n * Select an array of tracks(remote peer tracks and your local tracks) present in the room.\n */\nconst selectTracks = createSelector(selectTracksMap, storeTracks => {\n return Object.values(storeTracks);\n});\n\n/**\n * Select the local peer object object assigned to you.\n */\nexport const selectLocalPeer = createSelector(selectRoom, selectPeersMap, (room, peers): HMSPeer | undefined => {\n return peers[room.localPeer];\n});\n\n/**\n * Select the peer ID of your local peer.\n */\nexport const selectLocalPeerID = createSelector(selectRoom, room => {\n return room.localPeer;\n});\n\n/**\n * Select the peer name of your local peer.\n */\nexport const selectLocalPeerName = createSelector(selectLocalPeer, peer => peer?.name);\n\n/**\n * Select the role name of your local peer.\n */\nexport const selectLocalPeerRoleName = createSelector(selectLocalPeer, peer => peer?.roleName);\n\n/**\n * Select the track ID of your local peer's primary audio track\n */\nexport const selectLocalAudioTrackID = createSelector(selectLocalPeer, peer => peer?.audioTrack);\n\n/**\n * Select the track ID of your local peer's primary video track\n */\nexport const selectLocalVideoTrackID = createSelector(selectLocalPeer, peer => peer?.videoTrack);\n\n/**\n * Select an array of track IDs of your local peer's auxiliary tracks\n */\nconst selectLocalAuxiliaryTrackIDs = createSelector(selectLocalPeer, peer => peer?.auxiliaryTracks);\n\n/**\n * Select an array of track IDs of all your local peer's tracks\n */\nexport const selectLocalTrackIDs = createSelector(\n [selectLocalAudioTrackID, selectLocalVideoTrackID, selectLocalAuxiliaryTrackIDs],\n (audioTrackID, videoTrackID, auxiliaryTrackIDs) => {\n const trackIDs: string[] = auxiliaryTrackIDs ? [...auxiliaryTrackIDs] : [];\n audioTrackID && trackIDs.unshift(audioTrackID);\n videoTrackID && trackIDs.unshift(videoTrackID);\n return trackIDs;\n },\n);\n\n/**\n * Select remote peers(other users you're connected with via the internet) present in the room.\n */\nexport const selectRemotePeers = createSelector(selectPeers, peers => {\n return peers.filter(p => !p.isLocal);\n});\n\n/**\n * Select the peer who's speaking the loudest at the moment\n */\nexport const selectDominantSpeaker = createSelector(selectPeersMap, selectSpeakers, (peersMap, speakers) => {\n // sort in descending order by audio level\n const speakersInOrder = Object.entries(speakers).sort((s1, s2) => {\n const s1Level = s1[1]?.audioLevel || 0;\n const s2Level = s2[1]?.audioLevel || 0;\n return s2Level > s1Level ? 1 : -1;\n });\n if (speakersInOrder.length > 0 && speakersInOrder[0][1].audioLevel && speakersInOrder[0][1].audioLevel > 0) {\n const peerID = speakersInOrder[0][1].peerID;\n if (peerID in peersMap) {\n return peersMap[peerID];\n }\n }\n return null;\n});\n\n/**\n * Select a boolean denoting whether your local audio is unmuted\n * and the audio from your microphone is shared to remote peers\n */\nexport const selectIsLocalAudioEnabled = (store: HMSStore) => {\n const localPeer = selectLocalPeer(store);\n return isTrackEnabled(store, localPeer?.audioTrack);\n};\n\n/**\n * Select a boolean denoting whether your local video is unmuted\n * and the video from your camera is shared to remote peers\n */\nexport const selectIsLocalVideoEnabled = (store: HMSStore) => {\n const localPeer = selectLocalPeer(store);\n return isTrackEnabled(store, localPeer?.videoTrack);\n};\n\n/**\n * Select a boolean denoting whether you've chosen to unmute and share your local video.\n *\n * NOTE: Once you call `hmsActions.setLocalVideoEnabled(true)`to unmute your local video,\n * it takes some time to fetch your video from your video source.\n * This displayEnabled property gives immediate feedback for a more interactive UI,\n * without waiting for the video source\n */\nexport const selectIsLocalVideoDisplayEnabled = (store: HMSStore) => {\n const localPeer = selectLocalPeer(store);\n return isTrackDisplayEnabled(store, localPeer?.videoTrack);\n};\n\n/**\n * Select a boolean denoting whether your screen is shared to remote peers in the room.\n */\nexport const selectIsLocalScreenShared = createSelector(selectLocalPeer, selectTracksMap, (localPeer, tracksMap) => {\n const { video, audio } = getScreenSharesByPeer(tracksMap, localPeer);\n return !!(video || audio);\n});\n\n/**\n * Select the first peer who is currently sharing their screen.\n */\nexport const selectPeerScreenSharing = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n let screensharePeer = undefined;\n for (const peerID in peersMap) {\n const peer = peersMap[peerID];\n const { video, audio } = getScreenSharesByPeer(tracksMap, peer);\n if (video) {\n return peer;\n } else if (audio && !screensharePeer) {\n screensharePeer = peer;\n }\n }\n return screensharePeer;\n});\n\n/**\n * Select a boolean denoting whether someone is sharing screen in the room.\n */\nexport const selectIsSomeoneScreenSharing = createSelector(selectPeerScreenSharing, peer => {\n return !!peer;\n});\n\n/**\n * Select the first peer who is currently sharing their audio only screen\n */\nexport const selectPeerSharingAudio = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n for (const peerID in peersMap) {\n const peer = peersMap[peerID];\n const { audio, video } = getScreenSharesByPeer(tracksMap, peer);\n if (!video && !!audio) {\n return peer;\n }\n }\n return undefined;\n});\n\n/**\n * Select an array of peers who are currently sharing their screen.\n */\nexport const selectPeersScreenSharing = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n const videoPeers = [];\n const audioPeers = [];\n for (const peerID in peersMap) {\n const peer = peersMap[peerID];\n const { video, audio } = getScreenSharesByPeer(tracksMap, peer);\n if (video) {\n videoPeers.push(peer);\n } else if (audio) {\n audioPeers.push(peer);\n }\n }\n return videoPeers.concat(audioPeers);\n});\n\nexport const selectPeerSharingVideoPlaylist = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n for (const trackId in tracksMap) {\n const track = tracksMap[trackId];\n if (isVideoPlaylist(track) && isVideo(track) && track.peerId) {\n return peersMap[track.peerId];\n }\n }\n return undefined;\n});\n\nexport const selectPeerSharingAudioPlaylist = createSelector(selectPeersMap, selectTracksMap, (peersMap, tracksMap) => {\n for (const trackId in tracksMap) {\n const track = tracksMap[trackId];\n if (isAudioPlaylist(track) && track.peerId) {\n return peersMap[track.peerId];\n }\n }\n return undefined;\n});\n\n/**\n * Select an array of tracks that have been degraded(receiving lower video quality/no video) due to bad network locally.\n */\nexport const selectDegradedTracks = createSelector(selectTracks, tracks =>\n (tracks as HMSVideoTrack[]).filter(isDegraded),\n);\n\n/**\n * Select the number of messages(sent and received).\n */\nexport const selectHMSMessagesCount = createSelector(selectMessageIDsInOrder, messageIDs => messageIDs.length);\n\n/**\n * Select the number of unread messages.\n */\nexport const selectUnreadHMSMessagesCount = createSelector(selectMessagesMap, messages => {\n return Object.values(messages).filter(m => !m.read).length;\n});\n\n/**\n * Select an array of messages in the room(sent and received).\n */\nexport const selectHMSMessages = createSelector(selectMessageIDsInOrder, selectMessagesMap, (msgIDs, msgMap) => {\n const messages: HMSMessage[] = [];\n msgIDs.forEach(msgId => {\n messages.push(msgMap[msgId]);\n });\n return messages;\n});\n\n/**\n * Select the current state of the room.\n */\nexport const selectRoomState = createSelector([selectRoom], room => room && room.roomState);\n\n/**\n * Select a boolean denoting whether the room is in Preview state.\n */\nexport const selectIsInPreview = createSelector(selectRoomState, roomState => roomState === HMSRoomState.Preview);\n\nexport const selectRoomStarted = createSelector(selectRoom, room => room.roomState !== HMSRoomState.Disconnected);\n\n/**\n * Select available roles in the room as a map between the role name and {@link HMSRole} object.\n */\nexport const selectRolesMap = (store: HMSStore): Record<string, HMSRole> => {\n return store.roles;\n};\n\n/**\n * Select an array of names of available roles in the room.\n */\nexport const selectAvailableRoleNames = createSelector([selectRolesMap], rolesMap => Object.keys(rolesMap));\n\n/**\n * Select the {@link HMSRole} object of your local peer.\n */\nexport const selectLocalPeerRole = createSelector([selectLocalPeer, selectRolesMap], (localPeer, rolesMap) =>\n localPeer?.roleName ? rolesMap[localPeer.roleName] : null,\n);\n\nexport const selectPreviewRoleName = (store: HMSStore) => store.preview?.asRole;\n\n/**\n * Select the {@link HMSRole} used for preview.\n *\n */\nexport const selectPreviewRole = createSelector([selectPreviewRoleName, selectRolesMap], (roleName, rolesMap) =>\n roleName ? rolesMap[roleName] : null,\n);\n\n/**\n * Select a boolean denoting whether if your local peer is allowed to subscribe to any other role.\n */\nexport const selectIsAllowedToSubscribe = createSelector([selectLocalPeerRole], (role): boolean => {\n if (!role?.subscribeParams?.subscribeToRoles) {\n return false;\n }\n return role.subscribeParams.subscribeToRoles.length > 0;\n});\n\n/**\n * Select the permissions which determine what actions the local peer can do.\n */\nexport const selectPermissions = createSelector(selectLocalPeerRole, role => role?.permissions);\nexport const selectRecordingState = createSelector(selectRoom, room => room.recording);\nexport const selectRTMPState = createSelector(selectRoom, room => room.rtmp);\nexport const selectHLSState = createSelector(selectRoom, room => room.hls);\nexport const selectSessionId = createSelector(selectRoom, room => room.sessionId);\nexport const selectRoomStartTime = createSelector(selectRoom, room => room.startedAt);\nexport const selectIsLargeRoom = createSelector(selectRoom, room => !!room.isLargeRoom);\nexport const selectTemplateAppData = (store: HMSStore) => store.templateAppData;\n/** @deprecated - use `selectSessionStore` instead */\nexport const selectSessionMetadata = (store: HMSStore) => store.sessionMetadata;\nexport const selectPollsMap = (store: HMSStore) => store.polls;\nexport const selectPolls = (store: HMSStore) => {\n return Object.values(store.polls);\n};\n\nexport const selectHandRaisedPeers = createSelector(selectPeers, peers => {\n return peers.filter(peer => peer.isHandRaised);\n});\n", "import {\n HMSPeer,\n HMSPublishAllowed,\n HMSRole,\n HMSScreenAudioTrack,\n HMSScreenVideoTrack,\n HMSStore,\n HMSTrack,\n HMSTrackID,\n HMSVideoTrack,\n} from '../schema';\n\nexport function getScreenSharesByPeer(tracks: Record<HMSTrackID, HMSTrack>, peer?: HMSPeer | null) {\n let videoTrack = undefined;\n let audioTrack = undefined;\n if (peer) {\n for (const trackID of peer.auxiliaryTracks) {\n const track = tracks[trackID];\n if (isScreenShare(track)) {\n audioTrack = isAudio(track) ? track : audioTrack;\n videoTrack = isVideo(track) ? track : videoTrack;\n }\n }\n }\n // to use the proper type, right now it is only used for screenshare.\n return { video: videoTrack as HMSScreenVideoTrack, audio: audioTrack as HMSScreenAudioTrack };\n}\n\nexport function isAudio(track: HMSTrack | undefined) {\n return track && track.type === 'audio';\n}\n\nexport function isVideo(track: HMSTrack | undefined) {\n return track && track.type === 'video';\n}\n\nexport function isScreenShare(track: HMSTrack | undefined) {\n return track && track.source === 'screen';\n}\n\nexport function isAudioPlaylist(track: HMSTrack | undefined) {\n return track && track.source === 'audioplaylist';\n}\n\nexport function isVideoPlaylist(track: HMSTrack | undefined) {\n return track && track.source === 'videoplaylist';\n}\n\nexport function isDegraded(track: HMSVideoTrack) {\n if (track) {\n return Boolean(track?.degraded);\n }\n return false;\n}\n\nexport function isTrackEnabled(store: HMSStore, trackID?: string) {\n if (trackID && store.tracks[trackID]) {\n return store.tracks[trackID].enabled;\n }\n return false;\n}\n\n/**\n * Should UI show the video track as enabled\n */\nexport function isTrackDisplayEnabled(store: HMSStore, trackID?: string) {\n if (trackID && store.tracks[trackID]) {\n return store.tracks[trackID].displayEnabled;\n }\n return false;\n}\n\nexport function isRoleAllowedToPublish(role?: HMSRole | null): HMSPublishAllowed {\n let video = false,\n audio = false,\n screen = false;\n if (role?.publishParams?.allowed) {\n video = role.publishParams.allowed.includes('video');\n audio = role.publishParams.allowed.includes('audio');\n screen = role.publishParams.allowed.includes('screen');\n }\n return {\n video,\n audio,\n screen,\n };\n}\n", "import { createSelector } from 'reselect';\nimport { HMSPlaylistSelector, HMSPlaylistType, HMSStore } from '../schema';\n\n/**\n * @internal\n */\nconst selectPlaylistMap =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].list;\n\nconst selectPlaylistSelection =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].selection;\n\nconst selectPlaylistProgress =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].progress;\n\nconst selectPlaylistCurrentTime =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].currentTime;\n\nconst selectPlaylistPlaybackRate =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].playbackRate;\n\nconst selectPlaylistVolume =\n (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n (store: HMSStore) =>\n store.playlist[type].volume;\n\n/**\n * Select an array of playlist items.\n */\nconst selectPlaylist = (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n createSelector(selectPlaylistMap(type), storePlaylist => {\n return Object.values(storePlaylist);\n });\n\nconst selectPlaylistSelectedItem = (type: HMSPlaylistType = HMSPlaylistType.audio) =>\n createSelector(selectPlaylistMap(type), selectPlaylistSelection(type), (storePlaylist, currentSelection) => {\n if (!currentSelection.id) {\n return;\n }\n return storePlaylist[currentSelection.id];\n });\n\nexport const selectAudioPlaylist: HMSPlaylistSelector = {\n selection: selectPlaylistSelection(HMSPlaylistType.audio),\n progress: selectPlaylistProgress(HMSPlaylistType.audio),\n currentTime: selectPlaylistCurrentTime(HMSPlaylistType.audio),\n playbackRate: selectPlaylistPlaybackRate(HMSPlaylistType.audio),\n volume: selectPlaylistVolume(HMSPlaylistType.audio),\n list: selectPlaylist(HMSPlaylistType.audio),\n selectedItem: selectPlaylistSelectedItem(HMSPlaylistType.audio) as any,\n};\n\nexport const selectVideoPlaylist: HMSPlaylistSelector = {\n selection: selectPlaylistSelection(HMSPlaylistType.video),\n progress: selectPlaylistProgress(HMSPlaylistType.video),\n currentTime: selectPlaylistCurrentTime(HMSPlaylistType.video),\n playbackRate: selectPlaylistPlaybackRate(HMSPlaylistType.video),\n volume: selectPlaylistVolume(HMSPlaylistType.video),\n list: selectPlaylist(HMSPlaylistType.video),\n selectedItem: selectPlaylistSelectedItem(HMSPlaylistType.video) as any,\n};\n", "import { createSelector } from 'reselect';\nimport { byIDCurry } from './common';\nimport {\n selectFullAppData,\n selectHMSMessages,\n selectLocalPeerID,\n selectMessagesMap,\n selectPeers,\n selectPeersMap,\n selectPollsMap,\n selectTracksMap,\n} from './selectors';\nimport {\n getScreenSharesByPeer,\n isAudio,\n isAudioPlaylist,\n isTrackEnabled,\n isVideo,\n isVideoPlaylist,\n} from './selectorUtils';\nimport { HMSLogger } from '../../common/ui-logger';\nimport {\n HMSAudioTrack,\n HMSGenericTypes,\n HMSPeer,\n HMSPeerID,\n HMSRoleName,\n HMSScreenVideoTrack,\n HMSStore,\n HMSTrack,\n HMSTrackID,\n HMSVideoTrack,\n} from '../schema';\n\nconst selectPeerID = (_store: HMSStore, peerID: HMSPeerID | undefined) => peerID;\nconst selectTrackID = (_store: HMSStore, trackID: HMSTrackID | undefined) => trackID;\nconst selectRoleName = (_store: HMSStore, roleName: HMSRoleName | undefined) => roleName;\nconst selectAppDataKey = (_store: HMSStore, key: string | undefined) => key;\nconst selectPollID = (_store: HMSStore, pollID: string | undefined) => pollID;\n\nconst selectPeerByIDBare = createSelector([selectPeersMap, selectPeerID], (storePeers, peerID) =>\n peerID ? storePeers[peerID] : null,\n);\n\nconst selectTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) =>\n trackID ? storeTracks[trackID] : null,\n);\n\nconst selectVideoTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) => {\n if (!trackID) {\n return null;\n }\n const track = storeTracks[trackID] as HMSVideoTrack | undefined;\n if (track?.type === 'video') {\n return track;\n }\n return null;\n});\n\nconst selectAudioTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) => {\n if (!trackID) {\n return null;\n }\n const track = storeTracks[trackID] as HMSAudioTrack | undefined;\n if (track?.type === 'audio') {\n return track;\n }\n return null;\n});\n\nconst selectScreenAudioTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) => {\n if (!trackID) {\n return null;\n }\n const track = storeTracks[trackID] as HMSAudioTrack | undefined;\n if (track?.type === 'audio' && track?.source === 'screen') {\n return track;\n }\n return null;\n});\nconst selectScreenVideoTrackByIDBare = createSelector([selectTracksMap, selectTrackID], (storeTracks, trackID) => {\n if (!trackID) {\n return null;\n }\n const track = storeTracks[trackID] as HMSScreenVideoTrack | undefined;\n if (track?.type === 'video' && track?.source === 'screen') {\n return track;\n }\n return null;\n});\n\nconst selectPollByIDBare = createSelector([selectPollsMap, selectPollID], (storePolls, pollID) =>\n pollID ? storePolls[pollID] : null,\n);\n\n/**\n * Select the {@link HMSPeer} object given a peer ID.\n */\nexport const selectPeerByID = byIDCurry(selectPeerByIDBare);\n\n/**\n * Select a particular key from ui app data by passed in key.\n * if key is not passed, full data is returned.\n */\nexport const selectAppData = byIDCurry(\n createSelector([selectFullAppData, selectAppDataKey], (appData, key) => {\n if (!appData) {\n return undefined;\n }\n if (key) {\n return appData[key];\n }\n return appData;\n }),\n);\n\n/**\n * Select a particular key from session store by passed in key.\n * if key is not passed, full data is returned.\n */\nexport function selectSessionStore<T extends HMSGenericTypes = { sessionStore: Record<string, any> }>(): (\n store: HMSStore<T>,\n) => T['sessionStore'] | undefined;\nexport function selectSessionStore<\n T extends HMSGenericTypes = { sessionStore: Record<string, any> },\n K extends keyof T['sessionStore'] = keyof T['sessionStore'],\n>(key: K): (store: HMSStore<T>) => T['sessionStore'][K] | undefined;\nexport function selectSessionStore<\n T extends HMSGenericTypes = { sessionStore: Record<string, any> },\n K extends keyof T['sessionStore'] = keyof T['sessionStore'],\n>(key?: K) {\n return (store: HMSStore<T>) => {\n if (!store.sessionStore) {\n return undefined;\n }\n if (key) {\n return store.sessionStore[key];\n }\n return store.sessionStore;\n };\n}\n\nexport const selectAppDataByPath = (...keys: string[]) =>\n createSelector([selectFullAppData], appData => {\n if (!appData) {\n return undefined;\n }\n if (keys && keys.length > 0) {\n let value = appData;\n for (const key of keys) {\n if (!key) {\n return value;\n }\n value = value?.[key];\n }\n return value;\n }\n return appData;\n });\n\n/**\n * Select the name of a {@link HMSPeer} given a peer ID.\n */\nexport const selectPeerNameByID = byIDCurry(createSelector(selectPeerByIDBare, peer => peer?.name));\n\n/**\n * Select the {@link HMSTrack} object given a track ID.\n */\nexport const selectTrackByID = byIDCurry(selectTrackByIDBare);\n\n/**\n * Select the {@link HMSVideoTrack} object given a track ID.\n */\nexport const selectVideoTrackByID = byIDCurry(selectVideoTrackByIDBare);\n\n/**\n * Select the {@link HMSAudioTrack} object given a track ID.\n */\nexport const selectAudioTrackByID = byIDCurry(selectAudioTrackByIDBare);\n\n/**\n * Select the {@link HMSScreenAudioTrack} object given a track ID.\n */\nexport const selectScreenAudioTrackByID = byIDCurry(selectScreenAudioTrackByIDBare);\n\n/**\n * Select the {@link HMSScreenVideoTrack} object given a track ID.\n */\nexport const selectScreenVideoTrackByID = byIDCurry(selectScreenVideoTrackByIDBare);\n\n/**\n * Select the primary video track of a peer given a peer ID.\n */\nexport const selectVideoTrackByPeerID = byIDCurry((store: HMSStore, peerID?: HMSPeerID): HMSVideoTrack | undefined => {\n const peer = selectPeerByIDBare(store, peerID);\n if (peer && peer.videoTrack && peer.videoTrack !== '') {\n return store.tracks[peer.videoTrack] as HMSVideoTrack;\n }\n return undefined;\n});\n\n/**\n * Select the primary audio track of a peer given a peer ID.\n */\nexport const selectAudioTrackByPeerID = byIDCurry((store: HMSStore, peerID?: HMSPeerID): HMSAudioTrack | undefined => {\n const peer = selectPeerByIDBare(store, peerID);\n if (peer && peer.audioTrack && peer.audioTrack !== '') {\n return store.tracks[peer.audioTrack] as HMSAudioTrack;\n }\n return undefined;\n});\n\n/**\n * Select the camera stream of a peer given a peer ID.\n * This is the primary video track of a peer.\n */\nexport const selectCameraStreamByPeerID = selectVideoTrackByPeerID;\n\n/**\n * Select an array of auxiliary tracks of a peer given a peer ID.\n */\nexport const selectAuxiliaryTracksByPeerID = byIDCurry((store: HMSStore, peerID?: HMSPeerID): HMSTrack[] => {\n const peer = selectPeerByIDBare(store, peerID);\n return peer?.auxiliaryTracks.map(trackID => store.tracks[trackID]) || [];\n});\n\nconst selectSpeakerByTrackID = (store: HMSStore, trackID: HMSTrackID | undefined) => {\n return trackID ? store.speakers[trackID] : null;\n};\n\n/**\n * Select the audio level of a track given a track ID.\n */\nexport const selectTrackAudioByID = byIDCurry(\n createSelector(selectSpeakerByTrackID, speaker => speaker?.audioLevel || 0),\n);\n\n/**\n * Select speaker object of audioTrack of a peer given a peer ID.\n */\nconst selectSpeakerByPeerID = (store: HMSStore, peerID: HMSPeerID | undefined) => {\n const peerAudioTrack = selectAudioTrackByPeerID(peerID)(store);\n return selectSpeakerByTrackID(store, peerAudioTrack?.id);\n};\n\n/**\n * Select audio level of audioTrack of a peer given a peer ID\u00DF.\n */\nexport const selectPeerAudioByID = byIDCurry(\n createSelector(selectSpeakerByPeerID, speaker => speaker?.audioLevel || 0),\n);\n\nexport const selectConnectionQualityByPeerID = byIDCurry((store: HMSStore, peerID: HMSPeerID | undefined) => {\n if (peerID) {\n return store.connectionQualities[peerID];\n }\n return undefined;\n});\n\n/**\n * Select the first auxiliary audio track of a peer given a peer ID.\n */\nexport const selectAuxiliaryAudioByPeerID = byIDCurry((store: HMSStore, peerID?: HMSPeerID) => {\n const peer = selectPeerByIDBare(store, peerID);\n if (peer) {\n const trackID = peer?.auxiliaryTracks.find(trackID => isAudio(store.tracks[trackID]));\n return trackID ? (store.tracks[trackID] as HMSAudioTrack) : undefined;\n }\n return undefined;\n});\n\nexport const selectVideoPlaylistVideoTrackByPeerID = byIDCurry(\n createSelector(selectTracksMap, selectPeerByIDBare, (tracks, peer) => {\n const trackID = peer?.auxiliaryTracks.find(trackID => {\n const track = tracks[trackID];\n return isVideoPlaylist(track) && isVideo(track);\n });\n return trackID ? (tracks[trackID] as HMSVideoTrack) : undefined;\n }),\n);\n\nexport const selectVideoPlaylistAudioTrackByPeerID = byIDCurry(\n createSelector(selectTracksMap, selectPeerByIDBare, (tracks, peer) => {\n const trackID = peer?.auxiliaryTracks.find(trackID => {\n const track = tracks[trackID];\n return isVideoPlaylist(track) && isAudio(track);\n });\n return trackID ? (tracks[trackID] as HMSAudioTrack) : undefined;\n }),\n);\n\nexport const selectAudioPlaylistTrackByPeerID = byIDCurry(\n createSelector(selectTracksMap, selectPeerByIDBare, (tracks, peer) => {\n const trackID = peer?.auxiliaryTracks.find(trackID => {\n const track = tracks[trackID];\n return isAudioPlaylist(track) && isAudio(track);\n });\n return trackID ? (tracks[trackID] as HMSAudioTrack) : undefined;\n }),\n);\n\nexport const selectScreenSharesByPeerId = byIDCurry(\n createSelector(selectTracksMap, selectPeerByIDBare, (tracks, peer) => {\n return getScreenSharesByPeer(tracks, peer);\n }),\n);\n\n/**\n * Select the screen share video track of a peer given a peer ID.\n */\nexport const selectScreenShareByPeerID = (id?: string) =>\n createSelector(selectScreenSharesByPeerId(id), screenshare => {\n return screenshare.video;\n });\n\n/**\n * Select the screen share audio track of a peer given a peer ID.\n */\nexport const selectScreenShareAudioByPeerID = (id?: string) =>\n createSelector(selectScreenSharesByPeerId(id), screenshare => {\n return screenshare.audio;\n });\n\n/**\n * Select a boolean denoting whether a peer has unmuted audio and sharing it to other peers.\n */\nexport const selectIsPeerAudioEnabled = byIDCurry((store: HMSStore, peerID?: string) => {\n const peer = selectPeerByIDBare(store, peerID);\n return isTrackEnabled(store, peer?.audioTrack);\n});\n\n/**\n * Select a boolean denoting whether a peer has unmuted video and sharing it to other peers.\n */\nexport const selectIsPeerVideoEnabled = byIDCurry((store: HMSStore, peerID?: string) => {\n const peer = selectPeerByIDBare(store, peerID);\n return isTrackEnabled(store, peer?.videoTrack);\n});\n\n/**\n * Select a boolean denoting whether you've muted an audio track locally(only for you) given a track ID.\n */\nexport const selectIsAudioLocallyMuted = byIDCurry((store: HMSStore, trackID?: string) => {\n if (trackID && store.tracks[trackID]) {\n return (store.tracks[trackID] as HMSAudioTrack).volume === 0;\n }\n return undefined;\n});\n\n/**\n * Select a boolean denoting whether you've muted the primary audio track of a peer locally(only for you) given a peer ID.\n */\nexport const selectIsLocallyMutedByPeerID = byIDCurry((store: HMSStore, peerID?: string) => {\n const peer = selectPeerByIDBare(store, peerID);\n return selectIsAudioLocallyMuted(peer?.audioTrack)(store);\n});\n\n/**\n * Select a boolean denoting whether you've muted the screen share audio track of a peer locally(only for you) given a peer ID.\n */\nexport const selectIsScreenShareLocallyMutedByPeerID = byIDCurry((store: HMSStore, peerID?: string) => {\n const track = selectScreenShareAudioByPeerID(peerID)(store);\n return selectIsAudioLocallyMuted(track?.id)(store);\n});\n\n/**\n * Select the local audio volume of an audio track given a track ID.\n *\n * NOTE: **Volume** of a track is different from **Audio Level** of a track,\n * - Audio Level measures the audio of a track and it comes from 100ms's servers.\n * - Volume is how loud you hear the audio of a track, this is controlled by you at the client side.\n */\nexport const selectAudioTrackVolume = byIDCurry((store: HMSStore, trackID?: string) => {\n const track = selectTrackByIDBare(store, trackID);\n if (track) {\n if (track.type !== 'audio') {\n HMSLogger.w('Please pass audio track here');\n return undefined;\n }\n return track.volume;\n }\n return undefined;\n});\n\n/**\n * Select the local audio volume of the primary audio track of a peer given a peer ID.\n */\nexport const selectAudioVolumeByPeerID = byIDCurry((store: HMSStore, peerID?: string) => {\n const peer = selectPeerByIDBare(store, peerID);\n return selectAudioTrackVolume(peer?.audioTrack)(store);\n});\n\n/**\n * Select the local audio volume of the screen share of a peer given a peer ID.\n */\nexport const selectScreenshareAudioVolumeByPeerID = byIDCurry((store: HMSStore, peerID?: string) => {\n const track = selectScreenShareAudioByPeerID(peerID)(store);\n return selectAudioTrackVolume(track?.id)(store);\n});\n\n/**\n * Select the current simulcast layer of a track given a track ID.\n */\nexport const selectSimulcastLayerByTrack = byIDCurry((store: HMSStore, trackID?: string) => {\n const track = selectTrackByIDBare(store, trackID);\n if (track) {\n if (track.type !== 'video') {\n HMSLogger.w('Please pass video track here');\n return undefined;\n }\n return track.layer;\n }\n return undefined;\n});\n\nconst selectMessagesByPeerIDInternal = createSelector(\n [selectHMSMessages, selectLocalPeerID, selectPeerID],\n (messages, localPeerID, peerID) => {\n if (!peerID) {\n return undefined;\n }\n return messages.filter(message => {\n // Broadcast message\n if (!message.recipientPeer && !message.recipientRoles?.length) {\n return false;\n }\n // if localPeer or peerID is not a sender remove this\n if (message.sender && ![localPeerID, peerID].includes(message.sender)) {\n return false;\n }\n // at this point we know the sender is one of local or passed in peer, check the recipient side\n return [localPeerID, peerID].includes(message.recipientPeer!);\n });\n },\n);\n\nconst selectMessagesByRoleInternal = createSelector([selectHMSMessages, selectRoleName], (messages, roleName) => {\n if (!roleName) {\n return undefined;\n }\n return messages.filter(message => {\n // Not Role message - Broadcast message or Private Peer message\n if (!message.recipientRoles?.length) {\n return false;\n }\n return message.recipientRoles?.includes(roleName);\n });\n});\n\nexport const selectBroadcastMessages = createSelector(selectHMSMessages, messages => {\n return messages.filter(message => {\n return !message.recipientPeer && !message.recipientRoles?.length;\n });\n});\n\nconst selectUnreadMessageCountByRole = createSelector([selectMessagesByRoleInternal, selectRoleName], messages => {\n if (!messages) {\n return 0;\n }\n return messages.filter(m => !m.read).length;\n});\n\nconst selectUnreadMessageCountByPeerID = createSelector([selectMessagesByPeerIDInternal, selectPeerID], messages => {\n if (!messages) {\n return 0;\n }\n return messages.filter(m => !m.read).length;\n});\n\nexport const selectBroadcastMessagesUnreadCount = createSelector(selectBroadcastMessages, messages => {\n return messages.filter(m => !m.read).length;\n});\n\nexport const selectMessagesByPeerID = byIDCurry(selectMessagesByPeerIDInternal);\n\nexport const selectMessagesByRole = byIDCurry(selectMessagesByRoleInternal);\n\nexport const selectMessagesUnreadCountByRole = byIDCurry(selectUnreadMessageCountByRole);\nexport const selectMessagesUnreadCountByPeerID = byIDCurry(selectUnreadMessageCountByPeerID);\n\n/**\n * Select an array of peers of a particular role\n * @param role HMSRoleName\n * @returns HMSPeer[]\n */\nexport const selectPeersByRole = (role: HMSRoleName) =>\n createSelector([selectPeers], peers => {\n return peers.filter(p => p.roleName === role);\n });\n\n/**\n * Select an array of peers of a particular role\n * @param roles HMSRoleName[]\n * @returns HMSPeer[]\n */\nexport const selectPeersByRoles = (roles: HMSRoleName[]) =>\n createSelector([selectPeers], (peers: HMSPeer[]) => {\n return peers.filter((peer: HMSPeer) => {\n return peer.roleName ? roles.includes(peer.roleName) : false;\n });\n });\n/**\n * Selects the peer metadata for the passed in peer and returns it as JSON. If metadata is not present\n * or conversion to JSON gives an error, an empty object is returned.\n * Please directly use peer.metadata in case the metadata is not JSON by design.\n */\nexport const selectPeerMetadata = (peerId: HMSPeerID) =>\n createSelector(selectPeerByID(peerId), peer => {\n try {\n return peer?.metadata && peer.metadata !== '' ? JSON.parse(peer.metadata) : {};\n } catch (error) {\n console.error('cannot parse peer metadata', error);\n return {};\n }\n });\n\nexport const selectHasPeerHandRaised = (peerId: HMSPeerID) =>\n createSelector(selectPeerByID(peerId), peer => {\n return !!peer?.isHandRaised;\n });\n\nexport const selectPeerName = (peerId: HMSPeerID) => createSelector(selectPeerByID(peerId), peer => peer?.name);\n\nexport const selectPollByID = byIDCurry(selectPollByIDBare);\n\nexport const selectMessageByMessageID = (id: string) =>\n createSelector(selectMessagesMap, messages => {\n return messages[id];\n });\n", "import { HMSStatsStore, HMSStore } from '../schema';\n\nexport type StoreTypes = HMSStore | HMSStatsStore;\n\ntype byIDSelector<S extends StoreTypes, T> = (store: S, id?: string) => T;\n\n/**\n * StoreSelector is a function that takes in {@link HMSStore} as argument\n * and returns a part of the store that is queried using the selector.\n * @typeParam T Part of the store that you wish to query.\n */\nexport type StoreSelector<S extends StoreTypes, T> = (store: S) => T;\n\n/**\n * takes in a normal selector which has store and id as input and curries it to make it easier to use.\n * Before: store.getState((store) => normalSelector(store, peerID))\n * After: store.getState(curriedSelector(peerID))\n */\nexport function byIDCurry<S extends StoreTypes, T>(selector: byIDSelector<S, T>): (id?: string) => StoreSelector<S, T> {\n return (id?: string) => {\n return (store: S) => selector(store, id);\n };\n}\n", "import {\n DeviceMap,\n DeviceType,\n HLSConfig,\n HLSMeetingURLVariant,\n HLSTimedMetadata,\n HMSAudioPlugin,\n HMSAudioPluginType,\n HMSAudioTrackSettings,\n HMSConfig,\n HMSConfigInitialSettings,\n HMSConnectionQuality,\n HMSDeviceChangeEvent,\n HMSException,\n HMSFrameworkInfo,\n HMSHLS,\n HMSLocalPeer,\n HMSLocalTrackStats,\n HMSLogLevel,\n HMSMessage,\n HMSPeer,\n HMSPeerListIterator,\n HMSPeerStats,\n HMSPeerUpdate,\n HMSPlaylistItem,\n HMSPlaylistManager,\n HMSPlaylistProgressEvent,\n HMSPoll,\n HMSPollCreateParams,\n HMSPollQuestionAnswer,\n HMSPollQuestionCreateParams,\n HMSPollQuestionType,\n HMSPollsUpdate,\n HMSPreferredSimulcastLayer,\n HMSPreviewConfig,\n HMSRecording,\n HMSRemotePeer,\n HMSRemoteTrackStats,\n HMSRole,\n HMSRoom,\n HMSRoomUpdate,\n HMSRTMP,\n HMSScreenShareConfig,\n HMSSimulcastLayer,\n HMSSimulcastLayerDefinition,\n HMSSpeaker,\n HMSTrackStats,\n HMSTrackUpdate,\n HMSVideoPlugin,\n HMSVideoPluginCanvasContextType,\n HMSVideoPluginType,\n HMSVideoTrackSettings,\n HMSWebrtcInternals,\n HMSWebrtcStats,\n parsedUserAgent,\n RID,\n RTMPRecordingConfig,\n ScreenCaptureHandle,\n simulcastMapping,\n TokenRequest,\n TokenRequestOptions,\n} from '@100mslive/hms-video';\n\nexport {\n HMSException,\n HMSSimulcastLayer,\n HMSRoomUpdate,\n HMSPeerUpdate,\n HMSTrackUpdate,\n HMSPollsUpdate,\n HMSLogLevel,\n HMSAudioPluginType,\n HMSVideoPluginType,\n HMSVideoPluginCanvasContextType,\n parsedUserAgent,\n simulcastMapping,\n DeviceType,\n HMSPollQuestionType,\n HMSPeerListIterator,\n};\n\nexport type {\n DeviceMap,\n HMSPeer,\n HMSRoom,\n HMSMessage,\n HMSSpeaker,\n HMSConfig,\n HMSConfigInitialSettings,\n HMSPreviewConfig,\n HMSAudioTrackSettings,\n HMSVideoTrackSettings,\n HMSRole,\n HMSLocalPeer,\n HMSRemotePeer,\n HMSSimulcastLayerDefinition,\n HMSDeviceChangeEvent,\n HMSPlaylistItem,\n HMSPlaylistManager,\n HMSPlaylistProgressEvent,\n RTMPRecordingConfig,\n HMSRecording,\n HMSRTMP,\n HMSWebrtcInternals,\n HMSWebrtcStats,\n HMSVideoPlugin,\n HMSAudioPlugin,\n HLSConfig,\n HLSTimedMetadata,\n HLSMeetingURLVariant,\n HMSHLS,\n HMSPeerStats,\n HMSTrackStats,\n HMSLocalTrackStats,\n HMSRemoteTrackStats,\n HMSConnectionQuality,\n HMSScreenShareConfig,\n HMSFrameworkInfo,\n RID,\n ScreenCaptureHandle,\n HMSPreferredSimulcastLayer,\n TokenRequest,\n TokenRequestOptions,\n HMSPoll,\n HMSPollCreateParams,\n HMSPollQuestionAnswer,\n HMSPollQuestionCreateParams,\n};\n", "import { HMSLogLevel } from '../core/hmsSDKStore/sdkTypes';\n\nconst HMS_STORE_TAG = 'HMS-Store:';\n\nexport class HMSLogger {\n static level: HMSLogLevel = HMSLogLevel.VERBOSE;\n\n static v(tag: string, ...data: any[]) {\n this.log(HMSLogLevel.VERBOSE, tag, ...data);\n }\n\n static d(...data: any[]) {\n this.log(HMSLogLevel.DEBUG, ...data);\n }\n\n static i(...data: any[]) {\n this.log(HMSLogLevel.INFO, ...data);\n }\n\n static w(...data: any[]) {\n this.log(HMSLogLevel.WARN, ...data);\n }\n\n static e(...data: any[]) {\n this.log(HMSLogLevel.ERROR, ...data);\n }\n\n static time(mark: string) {\n this.log(HMSLogLevel.TIME, '[HMSPerformanceTiming]', mark);\n }\n\n static timeEnd(mark: string) {\n this.log(HMSLogLevel.TIMEEND, '[HMSPerformanceTiming]', mark, mark);\n }\n\n static cleanup() {\n performance.clearMarks();\n performance.clearMeasures();\n }\n\n /* eslint-disable */\n private static log(level: HMSLogLevel, ...data: any[]) {\n if (this.level.valueOf() > level.valueOf()) {\n return;\n }\n\n switch (level) {\n case HMSLogLevel.VERBOSE: {\n console.log(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.DEBUG: {\n console.debug(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.INFO: {\n console.info(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.WARN: {\n console.warn(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.ERROR: {\n console.error(HMS_STORE_TAG, ...data);\n break;\n }\n case HMSLogLevel.TIME: {\n performance.mark(data[1]);\n break;\n }\n case HMSLogLevel.TIMEEND: {\n const tag = data[0];\n const mark = data[1];\n try {\n const entry = performance.measure(mark, mark);\n //@ts-ignore\n this.log(HMSLogLevel.DEBUG, tag, mark, entry?.duration);\n performance.clearMarks(mark);\n performance.clearMeasures(mark);\n } catch (error) {\n this.log(HMSLogLevel.DEBUG, tag, mark, error);\n }\n break;\n }\n }\n }\n}\n", "import { createSelector } from 'reselect';\nimport { HMSRole } from '@100mslive/hms-video';\nimport { selectLocalPeerRole, selectPeersMap, selectPreviewRole, selectRolesMap, selectTracksMap } from './selectors';\nimport { isRoleAllowedToPublish } from './selectorUtils';\nimport { HMSPeer, HMSStore } from '../schema';\n\nexport interface HMSPeerWithMuteStatus {\n peer: HMSPeer;\n isAudioEnabled?: boolean;\n}\n\n/**\n * @privateRemarks\n * this is more friendly to UI format, the object in store has only peer id and role name instead of the full objects\n */\nexport interface HMSRoleChangeRequest {\n requestedBy?: HMSPeer;\n role: HMSRole;\n token: string;\n}\n\nexport const selectPeersWithAudioStatus = createSelector([selectPeersMap, selectTracksMap], (peersMap, tracksMap) => {\n const participants: HMSPeerWithMuteStatus[] = Object.values(peersMap).map(peer => {\n return {\n peer: peer,\n isAudioEnabled: peer.audioTrack ? tracksMap[peer.audioTrack]?.enabled : false,\n };\n });\n return participants;\n});\n\nconst selectRoleChangeStoreRequest = (store: HMSStore) => {\n return store.roleChangeRequests[0] || null;\n};\n\n/**\n * Select the role change request received for your local peer.\n */\nexport const selectRoleChangeRequest = createSelector(\n [selectRoleChangeStoreRequest, selectPeersMap, selectRolesMap],\n (request, peersMap, rolesMap): HMSRoleChangeRequest | null => {\n if (!request) {\n return null;\n }\n return {\n requestedBy: request.requestedBy ? peersMap[request.requestedBy] : undefined,\n role: rolesMap[request.roleName],\n token: request.token,\n };\n },\n);\n\n/**\n * Select what streams is the local peer allowed to publish from video, audio and screenshare.\n */\nexport const selectIsAllowedToPublish = createSelector([selectLocalPeerRole], role => isRoleAllowedToPublish(role));\n\n/**\n * Select what streams is the local peer allowed to preview from video, audio\n */\nexport const selectIsAllowedToPreviewMedia = createSelector([selectPreviewRole], role => isRoleAllowedToPublish(role));\n", "import { createSelector } from 'reselect';\nimport {\n selectLocalAudioTrackID,\n selectLocalVideoTrackID,\n selectPeers,\n selectRolesMap,\n selectRoom,\n selectTracksMap,\n} from './selectors';\nimport { isRoleAllowedToPublish } from './selectorUtils';\nimport { HMSPeer, HMSTrack } from '../schema';\n\nexport const selectRoleByRoleName = (roleName: string) =>\n createSelector([selectRolesMap], rolesMap => rolesMap[roleName]);\n\nexport const selectIsRoleAllowedToPublish = (roleName: string) => {\n return createSelector(selectRoleByRoleName(roleName), role => isRoleAllowedToPublish(role));\n};\n\nconst selectLocalVideoPlugins = createSelector([selectLocalVideoTrackID, selectTracksMap], (trackID, tracksMap) => {\n let track: HMSTrack | null = null;\n if (trackID) {\n track = tracksMap[trackID];\n }\n return track?.plugins || [];\n});\n\nconst selectLocalAudioPlugins = createSelector([selectLocalAudioTrackID, selectTracksMap], (trackID, tracksMap) => {\n let track: HMSTrack | null = null;\n if (trackID) {\n track = tracksMap[trackID];\n }\n return track?.plugins || [];\n});\n\nexport const selectIsLocalVideoPluginPresent = (pluginName: string) => {\n return createSelector([selectLocalVideoPlugins], plugins => {\n return plugins.includes(pluginName);\n });\n};\n\nexport const selectIsLocalAudioPluginPresent = (pluginName: string) => {\n return createSelector([selectLocalAudioPlugins], plugins => {\n return plugins.includes(pluginName);\n });\n};\n\n/**\n * Selects the first peer passing the condition given by the argument predicate function\n *\n * Ex: to select a peer whose metadata has spotlight set to true(assuming peer.metadata is a valid json string), use\n * ```js\n * const spotlightPeer = useHMSStore(selectPeerByCondition(peer => JSON.parse(peer.metadata).spotlight))\n * ```\n */\nexport const selectPeerByCondition = (predicate: (peer: HMSPeer) => boolean) =>\n createSelector(selectPeers, peers => {\n return peers.find(predicate);\n });\n\n/**\n * Selects all peers passing the condition given by the argument predicate function\n *\n * Ex: to select peers with isHandRaised set to true in their metadata(assuming peer.metadata is a valid json string), use\n * ```js\n * const handRaisedPeers = useHMSStore(selectPeersByCondition(peer => JSON.parse(peer.metadata).isHandRaised))\n * ```\n */\nexport const selectPeersByCondition = (predicate: (peer: HMSPeer) => boolean) =>\n createSelector(selectPeers, peers => {\n return peers.filter(predicate);\n });\n\n/**\n * Returns a boolean to indicate if the local peer joined within the past `timeMs` milliseconds.\n *\n * Ex: to know if the local peer joined within the last one second\n * ```js\n * const joinedWithinASecond = useHMSStore(selectDidIJoinWithin(1000));\n * ```\n */\nexport const selectDidIJoinWithin = (timeMs: number) =>\n createSelector(selectRoom, room => room.joinedAt && Date.now() - room.joinedAt.getTime() <= timeMs);\n", "import { HMSLocalTrack as SDKHMSLocalTrack, HMSPoll } from '@100mslive/hms-video';\nimport { HMSPeer, HMSPeerID, HMSScreenVideoTrack, HMSTrack, HMSTrackID, HMSVideoTrack } from '../../schema';\nimport { HMSPeerStats, HMSTrackStats } from '../sdkTypes';\n\n/**\n * updates draftPeers with newPeers ensuring minimal reference changes\n * @remarks\n * This is mutable and impure function, it modifies the passed in data to ensure\n * minimal reference changes\n * @param draftPeers the current peers object in store, an immer draft object\n * @param newPeers the latest update which needs to be stored\n * @param newHmsTracks this will be update if required\n * @param newHmsSDkTracks this is future value of local hms tacks map\n */\n// eslint-disable-next-line complexity\nexport const mergeNewPeersInDraft = (\n draftPeers: Record<HMSPeerID, HMSPeer>,\n newPeers: Record<HMSPeerID, Partial<HMSPeer>>,\n) => {\n const peerIDs = union(Object.keys(draftPeers), Object.keys(newPeers));\n for (const peerID of peerIDs) {\n const oldPeer = draftPeers[peerID];\n const newPeer = newPeers[peerID];\n if (isEntityUpdated(oldPeer, newPeer)) {\n if (areArraysEqual(oldPeer.auxiliaryTracks, newPeer.auxiliaryTracks)) {\n newPeer.auxiliaryTracks = oldPeer.auxiliaryTracks;\n }\n if (oldPeer.groups && areArraysEqual(oldPeer.groups, newPeer.groups)) {\n newPeer.groups = oldPeer.groups;\n }\n Object.assign(oldPeer, newPeer);\n } else if (isEntityRemoved(oldPeer, newPeer)) {\n delete draftPeers[peerID];\n } else if (isEntityAdded(oldPeer, newPeer)) {\n draftPeers[peerID] = newPeer as HMSPeer;\n }\n }\n};\n\nexport const mergeNewTracksInDraft = (\n draftTracks: Record<HMSTrackID, HMSTrack>,\n newTracks: Record<HMSTrackID, Partial<HMSTrack>>,\n) => {\n const trackIDs = union(Object.keys(draftTracks), Object.keys(newTracks));\n for (const trackID of trackIDs) {\n const oldTrack = draftTracks[trackID];\n const newTrack = newTracks[trackID];\n if (isEntityUpdated(oldTrack, newTrack)) {\n mergeTrackArrayFields(oldTrack, newTrack);\n Object.assign(oldTrack, newTrack);\n } else if (isEntityRemoved(oldTrack, newTrack)) {\n delete draftTracks[trackID];\n } else if (isEntityAdded(oldTrack, newTrack)) {\n draftTracks[trackID] = newTrack as HMSTrack;\n }\n }\n};\n\nexport const mergeNewPollsInDraft = (\n draftPolls: Record<string, HMSPoll>,\n newPolls: Record<string, Partial<HMSPoll>>,\n) => {\n const pollIDs = union(Object.keys(draftPolls), Object.keys(newPolls));\n for (const pollID of pollIDs) {\n const oldPoll = draftPolls[pollID];\n const newPoll = newPolls[pollID];\n if (isEntityUpdated(oldPoll, newPoll)) {\n if (oldPoll.questions && areArraysEqual(oldPoll.questions, newPoll.questions)) {\n newPoll.questions = oldPoll.questions;\n }\n Object.assign(oldPoll, newPoll);\n } else if (isEntityAdded(oldPoll, newPoll)) {\n draftPolls[pollID] = newPoll as HMSPoll;\n }\n }\n};\n\nexport const mergeNewIndividualStatsInDraft = <TID extends string, T extends HMSPeerStats | HMSTrackStats>(\n draftStats: Record<TID, T | undefined>,\n newStats: Record<TID, Partial<T | undefined>>,\n) => {\n const IDs = union(Object.keys(draftStats), Object.keys(newStats)) as TID[];\n for (const trackID of IDs) {\n const oldStat = draftStats[trackID];\n const newStat = newStats[trackID];\n if (isEntityUpdated(oldStat, newStat)) {\n Object.assign(oldStat!, newStat);\n } else if (isEntityRemoved(oldStat, newStat)) {\n delete draftStats[trackID];\n } else if (isEntityAdded(oldStat, newStat)) {\n draftStats[trackID] = newStat as T;\n }\n }\n};\n\nexport const mergeLocalTrackStats = (\n draftStats: Record<HMSTrackID, HMSTrackStats[] | undefined>,\n newStats: Record<HMSTrackID, Record<string, HMSTrackStats>>,\n tracks: SDKHMSLocalTrack[],\n) => {\n const trackMap: Record<string, HMSTrackStats[]> = tracks.reduce((acc, track) => {\n // @ts-ignore\n acc[track.firstTrackId] = Object.values(newStats[track.getTrackIDBeingSent()] || {}).sort((a, b) => {\n if (!a.rid || !b.rid) {\n return 0;\n }\n return a.rid < b.rid ? -1 : 1;\n });\n return acc;\n }, {});\n const IDs = union(Object.keys(draftStats), Object.keys(trackMap));\n for (const trackID of IDs) {\n if (!trackMap[trackID]) {\n delete draftStats[trackID];\n continue;\n }\n draftStats[trackID] = trackMap[trackID];\n }\n};\n\n/**\n * array's are usually created with new reference, avoid that update if both arrays are same\n */\nexport const mergeTrackArrayFields = (oldTrack: HMSTrack, newTrack: Partial<HMSTrack>) => {\n if (oldTrack.plugins && areArraysEqual(oldTrack.plugins, newTrack.plugins)) {\n newTrack.plugins = oldTrack.plugins;\n }\n if (\n oldTrack.type === 'video' &&\n oldTrack.layerDefinitions &&\n areArraysEqual(oldTrack.layerDefinitions, (newTrack as HMSVideoTrack | HMSScreenVideoTrack).layerDefinitions)\n ) {\n (newTrack as HMSVideoTrack | HMSScreenVideoTrack).layerDefinitions = oldTrack.layerDefinitions;\n }\n};\n\nexport const isEntityUpdated = <T>(oldItem: T, newItem: T) => oldItem && newItem;\nconst isEntityRemoved = <T>(oldItem: T, newItem: T) => oldItem && !newItem;\nconst isEntityAdded = <T>(oldItem: T, newItem: T) => !oldItem && newItem;\n\n// eslint-disable-next-line complexity\nexport const areArraysEqual = <T>(arr1: T[], arr2?: T[]): boolean => {\n if (arr1 === arr2 || (arr1.length === 0 && arr2?.length === 0)) {\n // reference check\n return true;\n }\n if (!arr1 || !arr2 || !(arr1.length === arr2.length)) {\n return false;\n }\n for (let i = 0; i < arr1.length; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n};\n\nconst union = <T>(arr1: T[], arr2: T[]): T[] => {\n const set: Set<T> = new Set();\n for (const elem of arr1) {\n set.add(elem);\n }\n for (const elem of arr2) {\n set.add(elem);\n }\n return Array.from(set);\n};\n", "import { HMSPeerStats, HMSSdk, HMSTrackStats, HMSWebrtcStats } from '@100mslive/hms-video';\nimport { mergeLocalTrackStats, mergeNewIndividualStatsInDraft } from '../hmsSDKStore/sdkUtils/storeMergeUtils';\nimport { IHMSStatsStore, IHMSStore } from '../IHMSStore';\nimport { createDefaultStatsStore, HMSPeerID, HMSRoomState, HMSTrack, HMSTrackID } from '../schema';\nimport {\n selectLocalAudioTrackID,\n selectLocalPeerID,\n selectLocalVideoTrackID,\n selectRoomState,\n selectTracksMap,\n} from '../selectors';\n\ntype Unsubscribe = (() => void) | undefined;\nexport const subscribeToSdkWebrtcStats = (sdk: HMSSdk, webrtcStore: IHMSStatsStore, store: IHMSStore) => {\n // also used as flag to check if webrtc internals has been initialised\n let unsubscribe: Unsubscribe;\n /**\n * Connected to room, webrtc internals can be initialized\n */\n if (store.getState(selectRoomState) === HMSRoomState.Connected) {\n unsubscribe = initAndSubscribeWebrtcStore(sdk, webrtcStore, store);\n }\n\n /**\n * Subscribe to room state for 2 purposes:\n * - unsubscribe on leave\n * - if internals is called before join is completed, init internals when roomState changes to connected\n */\n store.subscribe(roomState => {\n if ([HMSRoomState.Connected, HMSRoomState.Reconnecting].includes(roomState)) {\n if (!unsubscribe) {\n unsubscribe = initAndSubscribeWebrtcStore(sdk, webrtcStore, store);\n }\n // room state can go to disconnecting and back to connected if leave fails, we don't want to resubscribe in that case\n } else if ([HMSRoomState.Disconnected, HMSRoomState.Failed].includes(roomState)) {\n if (unsubscribe) {\n resetHMSStatsStore(webrtcStore, roomState);\n unsubscribe();\n // set flag to defined after unsubscribing to enable subscribing again\n unsubscribe = undefined;\n }\n }\n }, selectRoomState);\n};\n\nconst initAndSubscribeWebrtcStore = (sdk: HMSSdk, webrtcStore: IHMSStatsStore, store: IHMSStore) => {\n const unsubLocalPeer = updateLocalPeerInWebrtcStore(store, webrtcStore);\n\n sdk.getWebrtcInternals()?.start();\n const unsubSdkStats = sdk\n .getWebrtcInternals()\n ?.onStatsChange(stats => updateWebrtcStoreStats(webrtcStore, stats, store, sdk));\n\n return () => {\n unsubLocalPeer();\n unsubSdkStats && unsubSdkStats();\n };\n};\n\nconst updateLocalPeerInWebrtcStore = (store: IHMSStore, webrtcStore: IHMSStatsStore) => {\n let unsubID: Unsubscribe, unsubVideoTrackID: Unsubscribe, unsubAudioTrackID: Unsubscribe;\n if (store.getState(selectLocalPeerID)) {\n webrtcStore.namedSetState(draft => {\n draft.localPeer.id = store.getState(selectLocalPeerID);\n }, 'localpeer-id');\n } else {\n unsubID = store.subscribe(localPeerID => {\n localPeerID &&\n webrtcStore.namedSetState(draft => {\n draft.localPeer.id = localPeerID;\n }, 'localpeer-id');\n }, selectLocalPeerID);\n }\n\n if (store.getState(selectLocalVideoTrackID)) {\n webrtcStore.namedSetState(draft => {\n draft.localPeer.videoTrack = store.getState(selectLocalVideoTrackID);\n }, 'localpeer-videotrack-id');\n } else {\n unsubVideoTrackID = store.subscribe(videoTrackID => {\n videoTrackID &&\n webrtcStore.namedSetState(draft => {\n draft.localPeer.videoTrack = videoTrackID;\n }, 'localpeer-videotrack-id');\n }, selectLocalVideoTrackID);\n }\n\n if (store.getState(selectLocalAudioTrackID)) {\n webrtcStore.namedSetState(draft => {\n draft.localPeer.audioTrack = store.getState(selectLocalAudioTrackID);\n }, 'localpeer-audiotrack-id');\n } else {\n unsubAudioTrackID = store.subscribe(audioTrackID => {\n audioTrackID &&\n webrtcStore.namedSetState(draft => {\n draft.localPeer.audioTrack = audioTrackID;\n }, 'localpeer-audiotrack-id');\n }, selectLocalAudioTrackID);\n }\n\n return () => {\n unsubID?.();\n unsubVideoTrackID?.();\n unsubAudioTrackID?.();\n };\n};\n\nconst updateWebrtcStoreStats = (\n webrtcStore: IHMSStatsStore,\n stats: HMSWebrtcStats,\n hmsStore: IHMSStore,\n sdk: HMSSdk,\n) => {\n const tracks: Record<HMSTrackID, HMSTrack> = hmsStore.getState(selectTracksMap);\n webrtcStore.namedSetState(store => {\n const localPeerID = hmsStore.getState(selectLocalPeerID);\n const newTrackStats: Record<HMSTrackID, HMSTrackStats> = {};\n const trackIDs = Object.keys(tracks).filter(trackID => tracks[trackID].peerId !== localPeerID);\n\n for (const trackID of trackIDs) {\n const sdkTrackStats = stats.getRemoteTrackStats(trackID);\n if (sdkTrackStats) {\n newTrackStats[trackID] = sdkTrackStats;\n }\n }\n\n mergeNewIndividualStatsInDraft<HMSTrackID, HMSTrackStats>(store.remoteTrackStats, newTrackStats);\n\n // @TODO: Include all peer stats, own ticket, transmit local peer stats to other peer's using biz\n const newPeerStats = { [localPeerID]: stats.getLocalPeerStats() };\n mergeNewIndividualStatsInDraft<HMSPeerID, HMSPeerStats>(store.peerStats, newPeerStats);\n // @ts-ignore\n mergeLocalTrackStats(store.localTrackStats, stats.getLocalTrackStats(), sdk.store.getLocalPeerTracks());\n }, 'webrtc-stats');\n};\n\nconst resetHMSStatsStore = (store: IHMSStatsStore, reason = 'resetState') => {\n store.namedSetState(draft => {\n Object.assign(draft, createDefaultStatsStore());\n }, reason);\n};\n", "import { isBrowser } from '@100mslive/hms-video';\n\nexport const storeNameWithTabTitle = (storeName: string) => {\n return isBrowser ? `${storeName} ${document.title}` : storeName;\n};\n", "import { produce } from 'immer';\nimport shallow from 'zustand/shallow';\nimport create, {\n EqualityChecker,\n PartialState,\n SetState,\n State,\n StateSelector,\n StateSliceListener,\n StoreApi,\n} from 'zustand/vanilla';\nimport { HMSSdk, isBrowser } from '@100mslive/hms-video';\nimport { HMSNotifications } from './HMSNotifications';\nimport { HMSSDKActions } from './HMSSDKActions';\nimport { NamedSetState } from './internalTypes';\nimport { storeNameWithTabTitle } from '../../common/storeName';\nimport { IHMSActions } from '../IHMSActions';\nimport { IHMSStatsStoreReadOnly, IHMSStore, IHMSStoreReadOnly, IStore } from '../IHMSStore';\nimport { createDefaultStoreState, HMSGenericTypes, HMSStore } from '../schema';\nimport { IHMSNotifications } from '../schema/notification';\nimport { HMSStats } from '../';\n\ndeclare global {\n interface Window {\n __hms: HMSReactiveStore;\n __triggerBeamEvent__: (args: any) => void;\n }\n}\n\nexport class HMSReactiveStore<T extends HMSGenericTypes = { sessionStore: Record<string, any> }> {\n private readonly sdk?: HMSSdk;\n private readonly actions: IHMSActions<T>;\n private readonly store: IHMSStore<T>;\n private readonly notifications: HMSNotifications<T>;\n private stats?: HMSStats;\n /** @TODO store flag for both HMSStore and HMSInternalsStore */\n private initialTriggerOnSubscribe: boolean;\n\n constructor(hmsStore?: IHMSStore<T>, hmsActions?: IHMSActions<T>, hmsNotifications?: HMSNotifications<T>) {\n if (hmsStore) {\n this.store = hmsStore;\n } else {\n this.store = HMSReactiveStore.createNewHMSStore<HMSStore<T>>(\n storeNameWithTabTitle('HMSStore'),\n createDefaultStoreState,\n );\n }\n if (hmsNotifications) {\n this.notifications = hmsNotifications;\n } else {\n this.notifications = new HMSNotifications(this.store);\n }\n if (hmsActions) {\n this.actions = hmsActions;\n } else {\n this.sdk = new HMSSdk();\n this.actions = new HMSSDKActions(this.store, this.sdk, this.notifications);\n }\n\n // @ts-ignore\n this.actions.setFrameworkInfo({ type: 'js', sdkVersion: require('../../../package.json').version });\n\n this.initialTriggerOnSubscribe = false;\n\n if (isBrowser) {\n // @ts-ignore\n window.__hms = this;\n }\n }\n\n /**\n * By default store.subscribe does not call the handler with the current state at time of subscription,\n * this behaviour can be modified by calling this function. What it means is that instead of calling the\n * handler only for changes which happen post subscription we'll also call it exactly once at the time\n * of subscription with the current state. This behaviour is similar to that of BehaviourSubject in RxJS.\n * This will be an irreversible change\n *\n * Note: you don't need this if you're using our react hooks, it takes care of this requirement.\n */\n triggerOnSubscribe(): void {\n if (this.initialTriggerOnSubscribe) {\n // already done\n return;\n }\n HMSReactiveStore.makeStoreTriggerOnSubscribe(this.store);\n this.initialTriggerOnSubscribe = true;\n }\n\n /**\n * A reactive store which has a subscribe method you can use in combination with selectors\n * to subscribe to a subset of the store. The store serves as a single source of truth for\n * all data related to the corresponding HMS Room.\n */\n getStore(): IHMSStoreReadOnly {\n return this.store;\n }\n\n /**\n * Any action which may modify the store or may need to talk to the SDK will happen\n * through the IHMSActions instance returned by this\n *\n * @deprecated use getActions\n */\n getHMSActions(): IHMSActions<T> {\n return this.actions;\n }\n\n /**\n * Any action which may modify the store or may need to talk to the SDK will happen\n * through the IHMSActions instance returned by this\n */\n getActions(): IHMSActions<T> {\n return this.actions;\n }\n\n /**\n * This return notification handler function to which you can pass your callback to\n * receive notifications like peer joined, peer left, etc. to show in your UI or use\n * for analytics\n */\n getNotifications(): IHMSNotifications {\n return { onNotification: this.notifications.onNotification };\n }\n\n /**\n * @alpha\n */\n getStats = (): IHMSStatsStoreReadOnly => {\n if (!this.stats) {\n this.stats = new HMSStats(this.store as unknown as IHMSStore, this.sdk);\n }\n return this.stats;\n };\n\n /**\n * @internal\n */\n static createNewHMSStore<T extends State>(storeName: string, defaultCreatorFn: () => T): IStore<T> {\n const hmsStore = create<T>(() => defaultCreatorFn());\n // make set state immutable, by passing functions through immer\n const savedSetState = hmsStore.setState;\n hmsStore.setState = (partial: any) => {\n const nextState = typeof partial === 'function' ? produce(partial) : partial;\n savedSetState(nextState);\n };\n // add option to pass selector to getState\n const prevGetState = hmsStore.getState;\n // eslint-disable-next-line complexity\n hmsStore.getState = <StateSlice>(selector?: StateSelector<T, StateSlice>) => {\n return selector ? selector(prevGetState()) : prevGetState();\n };\n HMSReactiveStore.compareWithShallowCheckInSubscribe(hmsStore);\n const namedSetState = HMSReactiveStore.setUpDevtools(hmsStore, storeName);\n return { ...hmsStore, namedSetState };\n }\n\n /**\n * @internal\n */\n static makeStoreTriggerOnSubscribe<T extends State>(store: IStore<T>) {\n const prevSubscribe = store.subscribe;\n store.subscribe = <StateSlice>(\n listener: StateSliceListener<StateSlice>,\n selector?: StateSelector<T, StateSlice>,\n equalityFn?: EqualityChecker<StateSlice>,\n ): (() => void) => {\n // initial call, the prev state will always be null for this\n listener(store.getState(selector), undefined as unknown as StateSlice);\n // then subscribe\n return prevSubscribe(listener, selector!, equalityFn);\n };\n }\n\n /**\n * use shallow equality check by default for subscribe to optimize for array/object selectors.\n * by default zustand does only reference matching so something like, getPeers for eg. would trigger\n * the corresponding component even if peers didn't actually change, as selectPeers creates a new array every time.\n * Although the array reference changes, the order of peers and peer objects don't themselves change in this case,\n * and a shallow check avoids that triggering.\n * @private\n */\n private static compareWithShallowCheckInSubscribe<T extends State>(hmsStore: StoreApi<T>) {\n const prevSubscribe = hmsStore.subscribe;\n hmsStore.subscribe = <StateSlice>(\n listener: StateSliceListener<StateSlice>,\n selector?: StateSelector<T, StateSlice>,\n equalityFn?: EqualityChecker<StateSlice>,\n ): (() => void) => {\n if (!selector) {\n selector = (store): StateSlice => store as unknown as StateSlice;\n }\n equalityFn = equalityFn || shallow;\n return prevSubscribe(listener, selector, equalityFn);\n };\n }\n\n /**\n * @private\n * @privateRemarks\n * sets up redux devtools for the store, so redux extension can be used to visualize the store.\n * zustand's default devtool middleware only enhances the set function, we're here creating another nameSetState in\n * IHMStore which behaves like setState but takes an extra parameter for action name\n * https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/API/Methods.md\n * modified version of zustand's devtools - https://github.com/pmndrs/zustand/blob/v3.5.7/src/middleware.ts#L46\n */\n private static setUpDevtools<T extends State>(api: StoreApi<T>, prefix: string): NamedSetState<T> {\n let extension;\n try {\n extension = (window as any).__REDUX_DEVTOOLS_EXTENSION__ || (window as any).top.__REDUX_DEVTOOLS_EXTENSION__;\n } catch {}\n if (!extension) {\n return (fn: any) => {\n api.setState(fn);\n };\n }\n const devtools = extension.connect(HMSReactiveStore.devtoolsOptions(prefix));\n devtools.prefix = prefix ? `${prefix} > ` : '';\n const savedSetState = api.setState;\n api.setState = (fn: any) => {\n savedSetState(fn);\n devtools.send(`${devtools.prefix}setState`, api.getState());\n };\n\n devtools.subscribe(HMSReactiveStore.devtoolsSubscribe(devtools, api, savedSetState));\n\n devtools.send('setUpStore', api.getState());\n\n return (fn: any, action?: string) => {\n savedSetState(fn);\n const actionName = action ? action : `${devtools.prefix}action`;\n devtools.send(actionName, api.getState());\n };\n }\n\n /**\n * https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/API/Arguments.md\n */\n private static devtoolsOptions(prefix: string) {\n return {\n name: prefix,\n actionsBlacklist: ['audioLevel', 'playlistProgress', 'connectionQuality'], // very high frequency update, pollutes the action history\n };\n }\n\n /**\n * redux devtools allows for time travel debugging where it sends an action to update the store, users can\n * also export and import state in the devtools, listen to the corresponding functions from devtools and take\n * required action.\n * @param devtools - reference to devtools extension object\n * @param api\n * @param savedSetState - setState saved before its modified to update devtools\n * @private\n */\n private static devtoolsSubscribe<T extends State>(devtools: any, api: StoreApi<T>, savedSetState: SetState<T>) {\n // disabling complexity check instead of refactoring so as to keep the code close to zustand's and make\n // any future update based on upstream changes easier.\n // eslint-disable-next-line complexity\n return (message: any) => {\n if (message.type === 'DISPATCH' && message.state) {\n const ignoreState = ['JUMP_TO_ACTION', 'JUMP_TO_STATE'].includes(message.payload.type);\n if (!ignoreState) {\n // manual dispatch from the extension\n api.setState(JSON.parse(message.state));\n } else {\n // for time travel, no need to add new state changes in devtools\n savedSetState(JSON.parse(message.state));\n }\n } else if (message.type === 'DISPATCH' && message.payload?.type === 'COMMIT') {\n devtools.init(api.getState());\n } else if (message.type === 'DISPATCH' && message.payload?.type === 'IMPORT_STATE') {\n const actions = message.payload.nextLiftedState?.actionsById;\n const computedStates = message.payload.nextLiftedState?.computedStates || [];\n\n computedStates.forEach(({ state }: { state: PartialState<T> }, index: number) => {\n const action = actions[index] || `${devtools.prefix}setState`;\n if (index === 0) {\n devtools.init(state);\n } else {\n savedSetState(state);\n devtools.send(action, api.getState());\n }\n });\n }\n };\n }\n}\n", "import { EventEmitter2 as EventEmitter } from 'eventemitter2';\nimport { PEER_NOTIFICATION_TYPES, POLL_NOTIFICATION_TYPES, TRACK_NOTIFICATION_TYPES } from './common/mapping';\nimport * as sdkTypes from './sdkTypes';\nimport { IHMSStore } from '../IHMSStore';\nimport {\n HMSChangeMultiTrackStateRequest,\n HMSChangeTrackStateRequest,\n HMSDeviceChangeEvent,\n HMSException,\n HMSGenericTypes,\n HMSLeaveRoomRequest,\n HMSMessage,\n HMSNotification,\n HMSNotificationSeverity,\n HMSNotificationTypes,\n HMSPeer,\n HMSPlaylistItem,\n HMSTrack,\n HMSTrackID,\n} from '../schema';\nimport {\n HMSNotificationCallback,\n HMSNotificationInCallback,\n HMSNotificationTypeParam,\n IHMSNotifications,\n} from '../schema/notification';\nimport { selectPeerByID, selectPollByID, selectTrackByID } from '../selectors';\n\nconst HMS_NOTIFICATION_EVENT = 'hmsNotification';\n\nexport class HMSNotifications<T extends HMSGenericTypes = { sessionStore: Record<string, any> }>\n implements IHMSNotifications\n{\n private id = 0;\n private eventEmitter: EventEmitter;\n private store: IHMSStore<T>;\n\n constructor(store: IHMSStore<T>) {\n this.store = store;\n this.eventEmitter = new EventEmitter({ maxListeners: Object.keys(HMSNotificationTypes).length });\n }\n onNotification = <T extends HMSNotificationTypeParam>(cb: HMSNotificationCallback<T>, type?: T) => {\n const eventCallback = (notification: HMSNotificationInCallback<T>) => {\n if (type) {\n let matchesType: boolean;\n if (Array.isArray(type)) {\n matchesType = type.includes(notification.type as HMSNotificationTypes);\n } else {\n matchesType = type === notification.type;\n }\n if (!matchesType) {\n return;\n }\n }\n cb(notification);\n };\n this.eventEmitter.addListener(HMS_NOTIFICATION_EVENT, eventCallback);\n return () => {\n this.eventEmitter.removeListener(HMS_NOTIFICATION_EVENT, eventCallback);\n };\n };\n\n sendPlaylistTrackEnded<T>(item: HMSPlaylistItem<T>): void {\n const notification = this.createNotification(\n HMSNotificationTypes.PLAYLIST_TRACK_ENDED,\n item,\n HMSNotificationSeverity.INFO,\n );\n this.emitEvent(notification);\n }\n\n sendDeviceChange(request: HMSDeviceChangeEvent) {\n const notification = this.createNotification(\n HMSNotificationTypes.DEVICE_CHANGE_UPDATE,\n request,\n request.error ? HMSNotificationSeverity.ERROR : HMSNotificationSeverity.INFO,\n `Selected ${request.type} device - ${request.selection?.label}`,\n );\n this.emitEvent(notification);\n }\n\n sendLeaveRoom(request: HMSLeaveRoomRequest) {\n const peerName = request.requestedBy?.name;\n const notification = this.createNotification(\n request.roomEnded || !peerName ? HMSNotificationTypes.ROOM_ENDED : HMSNotificationTypes.REMOVED_FROM_ROOM,\n request,\n HMSNotificationSeverity.INFO,\n `${request.roomEnded ? `Room ended` : 'Removed from room'} ${peerName ? `by ${peerName}` : ''}`,\n );\n this.emitEvent(notification);\n }\n\n sendPeerList(peers: HMSPeer[]) {\n if (peers.length === 0) {\n return;\n }\n const notification = this.createNotification(HMSNotificationTypes.PEER_LIST, peers, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n\n sendPeerUpdate(type: sdkTypes.HMSPeerUpdate, peer: HMSPeer | null) {\n const hmsPeer = this.store.getState(selectPeerByID(peer?.id)) || peer;\n const notificationType = PEER_NOTIFICATION_TYPES[type];\n if (notificationType && hmsPeer) {\n const notification = this.createNotification(notificationType, hmsPeer, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n }\n\n sendTrackUpdate(type: sdkTypes.HMSTrackUpdate, trackID: HMSTrackID) {\n const hmsTrack = this.store.getState(selectTrackByID(trackID));\n const notificationType = TRACK_NOTIFICATION_TYPES[type];\n if (notificationType) {\n const notification = this.createNotification(notificationType, hmsTrack, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n }\n\n sendMessageReceived(message: HMSMessage) {\n const notification = this.createNotification(\n HMSNotificationTypes.NEW_MESSAGE,\n message,\n HMSNotificationSeverity.INFO,\n );\n this.emitEvent(notification);\n }\n\n sendError(error: HMSException) {\n const notification = this.createNotification(HMSNotificationTypes.ERROR, error, HMSNotificationSeverity.ERROR);\n this.emitEvent(notification);\n }\n\n sendReconnecting(error: HMSException) {\n const notification = this.createNotification(\n HMSNotificationTypes.RECONNECTING,\n error,\n HMSNotificationSeverity.ERROR,\n );\n this.emitEvent(notification);\n }\n\n sendReconnected() {\n const notification = this.createNotification(HMSNotificationTypes.RECONNECTED, null, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n\n sendChangeTrackStateRequest(request: HMSChangeTrackStateRequest) {\n const notification = this.createNotification(\n HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST,\n request,\n HMSNotificationSeverity.INFO,\n );\n this.emitEvent(notification);\n }\n\n sendChangeMultiTrackStateRequest(request: HMSChangeMultiTrackStateRequest) {\n const notification = this.createNotification(\n HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST,\n request,\n HMSNotificationSeverity.INFO,\n );\n this.emitEvent(notification);\n }\n\n sendPollUpdate(type: sdkTypes.HMSPollsUpdate, pollID: string) {\n const notificationType = POLL_NOTIFICATION_TYPES[type];\n const poll = this.store.getState(selectPollByID(pollID));\n\n if (notificationType) {\n const notification = this.createNotification(notificationType, poll, HMSNotificationSeverity.INFO);\n this.emitEvent(notification);\n }\n }\n\n private emitEvent(notification: HMSNotification) {\n this.eventEmitter.emit(HMS_NOTIFICATION_EVENT, notification);\n }\n\n private createNotification<T>(\n type: HMSNotificationTypes,\n data?:\n | HMSPeer\n | HMSPeer[]\n | HMSTrack\n | HMSMessage\n | HMSException\n | HMSChangeTrackStateRequest\n | HMSChangeMultiTrackStateRequest\n | HMSLeaveRoomRequest\n | HMSDeviceChangeEvent\n | HMSPlaylistItem<T>\n | sdkTypes.HMSPoll\n | null,\n severity?: HMSNotificationSeverity,\n message = '',\n ): HMSNotification {\n this.id++;\n return {\n id: this.id,\n type,\n message,\n data,\n severity,\n } as HMSNotification;\n }\n}\n", "import { HMSNotificationTypes } from '../../schema/notification';\nimport * as sdkTypes from '../sdkTypes';\n\ntype PeerNotificationMap = { [key in sdkTypes.HMSPeerUpdate]?: HMSNotificationTypes };\n\nexport const PEER_NOTIFICATION_TYPES: PeerNotificationMap = {\n [sdkTypes.HMSPeerUpdate.PEER_JOINED]: HMSNotificationTypes.PEER_JOINED,\n [sdkTypes.HMSPeerUpdate.PEER_LEFT]: HMSNotificationTypes.PEER_LEFT,\n [sdkTypes.HMSPeerUpdate.ROLE_UPDATED]: HMSNotificationTypes.ROLE_UPDATED,\n [sdkTypes.HMSPeerUpdate.NAME_UPDATED]: HMSNotificationTypes.NAME_UPDATED,\n [sdkTypes.HMSPeerUpdate.METADATA_UPDATED]: HMSNotificationTypes.METADATA_UPDATED,\n [sdkTypes.HMSPeerUpdate.HAND_RAISE_CHANGED]: HMSNotificationTypes.HAND_RAISE_CHANGED,\n};\n\ntype TrackNotificationMap = { [key in sdkTypes.HMSTrackUpdate]: HMSNotificationTypes };\nexport const TRACK_NOTIFICATION_TYPES: TrackNotificationMap = {\n [sdkTypes.HMSTrackUpdate.TRACK_ADDED]: HMSNotificationTypes.TRACK_ADDED,\n [sdkTypes.HMSTrackUpdate.TRACK_REMOVED]: HMSNotificationTypes.TRACK_REMOVED,\n [sdkTypes.HMSTrackUpdate.TRACK_MUTED]: HMSNotificationTypes.TRACK_MUTED,\n [sdkTypes.HMSTrackUpdate.TRACK_UNMUTED]: HMSNotificationTypes.TRACK_UNMUTED,\n [sdkTypes.HMSTrackUpdate.TRACK_DEGRADED]: HMSNotificationTypes.TRACK_DEGRADED,\n [sdkTypes.HMSTrackUpdate.TRACK_RESTORED]: HMSNotificationTypes.TRACK_RESTORED,\n [sdkTypes.HMSTrackUpdate.TRACK_DESCRIPTION_CHANGED]: HMSNotificationTypes.TRACK_DESCRIPTION_CHANGED,\n};\n\ntype PollNotificationMap = { [key in sdkTypes.HMSPollsUpdate]: HMSNotificationTypes };\n\nexport const POLL_NOTIFICATION_TYPES: PollNotificationMap = {\n [sdkTypes.HMSPollsUpdate.POLL_CREATED]: HMSNotificationTypes.POLL_CREATED,\n [sdkTypes.HMSPollsUpdate.POLL_STARTED]: HMSNotificationTypes.POLL_STARTED,\n [sdkTypes.HMSPollsUpdate.POLL_STOPPED]: HMSNotificationTypes.POLL_STOPPED,\n [sdkTypes.HMSPollsUpdate.POLL_STATS_UPDATED]: HMSNotificationTypes.POLL_VOTES_UPDATED,\n};\n", "import {\n HMSAudioPlugin,\n HMSAudioTrack as SDKHMSAudioTrack,\n HMSChangeMultiTrackStateParams as SDKHMSChangeMultiTrackStateParams,\n HMSChangeMultiTrackStateRequest as SDKHMSChangeMultiTrackStateRequest,\n HMSChangeTrackStateRequest as SDKHMSChangeTrackStateRequest,\n HMSException as SDKHMSException,\n HMSLeaveRoomRequest as SDKHMSLeaveRoomRequest,\n HMSLocalAudioTrack as SDKHMSLocalAudioTrack,\n HMSLocalTrack as SDKHMSLocalTrack,\n HMSLocalVideoTrack as SDKHMSLocalVideoTrack,\n HMSLogLevel,\n HMSPluginSupportResult,\n HMSRemoteTrack as SDKHMSRemoteTrack,\n HMSRemoteVideoTrack as SDKHMSRemoteVideoTrack,\n HMSRoleChangeRequest as SDKHMSRoleChangeRequest,\n HMSScreenShareConfig,\n HMSSdk,\n HMSSimulcastLayer,\n HMSTrack as SDKHMSTrack,\n HMSVideoPlugin,\n HMSVideoTrack as SDKHMSVideoTrack,\n SessionStoreUpdate,\n} from '@100mslive/hms-video';\nimport { PEER_NOTIFICATION_TYPES, POLL_NOTIFICATION_TYPES, TRACK_NOTIFICATION_TYPES } from './common/mapping';\nimport { isRemoteTrack } from './sdkUtils/sdkUtils';\nimport {\n areArraysEqual,\n isEntityUpdated,\n mergeNewPeersInDraft,\n mergeNewPollsInDraft,\n mergeNewTracksInDraft,\n mergeTrackArrayFields,\n} from './sdkUtils/storeMergeUtils';\nimport { SDKToHMS } from './adapter';\nimport { HMSInteractivityCenter } from './HMSInteractivityCenter';\nimport { HMSNotifications } from './HMSNotifications';\nimport { HMSPlaylist } from './HMSPlaylist';\nimport { HMSSessionStore } from './HMSSessionStore';\nimport { NamedSetState } from './internalTypes';\nimport * as sdkTypes from './sdkTypes';\nimport { HMSLogger } from '../../common/ui-logger';\nimport { BeamSpeakerLabelsLogger } from '../../controller/beam/BeamSpeakerLabelsLogger';\nimport { IHMSActions } from '../IHMSActions';\nimport { IHMSStore } from '../IHMSStore';\nimport {\n createDefaultStoreState,\n HMSChangeMultiTrackStateParams,\n HMSGenericTypes,\n HMSMediaSettings,\n HMSMessage,\n HMSMessageInput,\n HMSPeer,\n HMSPeerID,\n HMSPeerListIteratorOptions,\n HMSPlaylistType,\n HMSRoleName,\n HMSRoomState,\n HMSStore,\n HMSTrack,\n HMSTrackID,\n HMSTrackSource,\n HMSVideoTrack,\n IHMSInteractivityCenter,\n IHMSPlaylistActions,\n IHMSSessionStoreActions,\n} from '../schema';\nimport {\n HMSRoleChangeRequest,\n selectIsConnectedToRoom,\n selectIsInPreview,\n selectIsLocalScreenShared,\n selectIsLocalVideoDisplayEnabled,\n selectIsLocalVideoEnabled,\n selectLocalAudioTrackID,\n selectLocalMediaSettings,\n selectLocalPeer,\n selectLocalTrackIDs,\n selectLocalVideoTrackID,\n selectPeerByID,\n selectPeersMap,\n selectPermissions,\n selectRolesMap,\n selectRoomState,\n selectTrackByID,\n selectTracksMap,\n selectVideoTrackByID,\n} from '../selectors';\n\n// import { ActionBatcher } from './sdkUtils/ActionBatcher';\n\n/**\n * This class implements the IHMSActions interface for 100ms SDK. It connects with SDK\n * and takes control of data management by letting every action pass through it. The\n * passed in store is ensured to be the single source of truth reflecting current\n * room related data at any point in time.\n *\n * @privateRemarks\n * Things to keep in mind while updating store -\n * 1. Treat setState as an atomic operation, if an action results in multiple changes,\n * the changes should all happen within single setState function.\n * 2. While updating the state it's very important to not update the reference if\n * something is unchanged. Copy data in same reference object don't assign new\n * object.\n * 3. Mental Model(1) - Actions from backend -> Listeners of this class -> update store -> views update themselves\n * eg. for this - peer added, remote muted etc.\n * 4. Mental Model(2) - Actions from local -> View calls actions -> update store -> views update themselves\n * eg. local track enabled, join, leave etc.\n * 5. State is immutable, a new copy with new references is created when there is a change,\n * if you try to modify state outside of setState, there'll be an error.\n */\nexport class HMSSDKActions<T extends HMSGenericTypes = { sessionStore: Record<string, any> }>\n implements IHMSActions<T>\n{\n private hmsSDKTracks: Record<string, SDKHMSTrack> = {};\n private readonly sdk: HMSSdk;\n private readonly store: IHMSStore<T>;\n private isRoomJoinCalled = false;\n private hmsNotifications: HMSNotifications<T>;\n private ignoredMessageTypes: string[] = [];\n // private actionBatcher: ActionBatcher;\n audioPlaylist!: IHMSPlaylistActions;\n videoPlaylist!: IHMSPlaylistActions;\n sessionStore: IHMSSessionStoreActions<T['sessionStore']>;\n interactivityCenter: IHMSInteractivityCenter;\n private beamSpeakerLabelsLogger?: BeamSpeakerLabelsLogger<T>;\n\n constructor(store: IHMSStore<T>, sdk: HMSSdk, notificationManager: HMSNotifications<T>) {\n this.store = store;\n this.sdk = sdk;\n this.hmsNotifications = notificationManager;\n\n this.sessionStore = new HMSSessionStore<T['sessionStore']>(this.sdk, this.setSessionStoreValueLocally.bind(this));\n this.interactivityCenter = new HMSInteractivityCenter(this.sdk);\n // this.actionBatcher = new ActionBatcher(store);\n }\n\n async refreshDevices() {\n await this.sdk.refreshDevices();\n }\n\n async unblockAudio() {\n await this.sdk.getAudioOutput().unblockAutoplay();\n }\n\n async setVolume(value: number, trackId?: HMSTrackID) {\n if (trackId) {\n await this.setTrackVolume(value, trackId);\n } else {\n await this.sdk.getAudioOutput().setVolume(value);\n this.syncRoomState('setOutputVolume');\n }\n }\n\n async setAudioOutputDevice(deviceId: string): Promise<void> {\n const deviceInfo = await this.sdk.getAudioOutput().setDevice(deviceId);\n if (deviceInfo) {\n this.setState(draftStore => {\n draftStore.settings.audioOutputDeviceId = deviceId;\n }, 'setAudioOutputDevice');\n }\n }\n\n async setPreferredLayer(trackId: string, layer: sdkTypes.HMSPreferredSimulcastLayer) {\n const track = this.hmsSDKTracks[trackId];\n if (track) {\n if (track instanceof SDKHMSRemoteVideoTrack) {\n //@ts-ignore\n if (layer === HMSSimulcastLayer.NONE) {\n HMSLogger.d(`layer ${HMSSimulcastLayer.NONE} will be ignored`);\n return;\n }\n const alreadyInSameState = this.store.getState(selectVideoTrackByID(trackId))?.preferredLayer === layer;\n if (alreadyInSameState) {\n HMSLogger.d(`preferred layer is already ${layer}`);\n return;\n }\n this.setState(draftStore => {\n const track = draftStore.tracks[trackId] as HMSVideoTrack;\n if (track) {\n track.preferredLayer = layer;\n }\n }, 'setPreferredLayer');\n await track.setPreferredLayer(layer);\n } else {\n HMSLogger.d(`track ${trackId} is not a remote video track`);\n }\n } else {\n this.logPossibleInconsistency(`track ${trackId} not present, unable to set preffer layer`);\n }\n }\n\n getAuthTokenByRoomCode(\n tokenRequest: sdkTypes.TokenRequest,\n tokenRequestOptions?: sdkTypes.TokenRequestOptions,\n ): Promise<string> {\n return this.sdk.getAuthTokenByRoomCode(tokenRequest, tokenRequestOptions);\n }\n\n async preview(config: sdkTypes.HMSPreviewConfig) {\n const roomState = this.store.getState(selectRoomState);\n if (roomState === HMSRoomState.Preview || roomState === HMSRoomState.Connecting) {\n this.logPossibleInconsistency('attempting to call preview while room is in preview/connecting');\n return;\n }\n\n try {\n if (roomState !== HMSRoomState.Connected) {\n this.setState(store => {\n store.room.roomState = HMSRoomState.Connecting;\n }, 'connecting');\n }\n await this.sdkPreviewWithListeners(config);\n } catch (err) {\n HMSLogger.e('Cannot show preview. Failed to connect to room - ', err);\n throw err;\n }\n }\n\n async cancelMidCallPreview() {\n return this.sdk.cancelMidCallPreview();\n }\n\n async join(config: sdkTypes.HMSConfig) {\n if (this.isRoomJoinCalled) {\n this.logPossibleInconsistency('room join is called again');\n return; // ignore\n }\n try {\n this.isRoomJoinCalled = true;\n this.setState(store => {\n store.room.roomState = HMSRoomState.Connecting;\n }, 'join');\n await this.sdkJoinWithListeners(config);\n } catch (err) {\n this.isRoomJoinCalled = false; // so it can be called again if needed\n HMSLogger.e('Failed to connect to room - ', err);\n throw err;\n }\n }\n\n async leave() {\n const isConnectedToRoom = this.store.getState(selectIsConnectedToRoom);\n let notifyServer = true;\n if (!isConnectedToRoom) {\n notifyServer = false;\n this.logPossibleInconsistency('room leave is called when no room is connected');\n }\n const currentRoomState = this.store.getState(selectRoomState);\n this.setState(store => {\n store.room.roomState = HMSRoomState.Disconnecting;\n }, 'leaving');\n return this.sdk\n .leave(notifyServer)\n .then(() => {\n this.resetState('leave');\n if (this.beamSpeakerLabelsLogger) {\n this.beamSpeakerLabelsLogger.stop().catch(HMSLogger.e);\n }\n HMSLogger.i('left room');\n })\n .catch(err => {\n HMSLogger.e('error in leaving room - ', err);\n this.setState(store => {\n store.room.roomState = currentRoomState;\n }, 'revertLeave');\n });\n }\n\n async setScreenShareEnabled(enabled: boolean, config?: HMSScreenShareConfig) {\n // TODO: remove this, purely for backward compatibility\n if (typeof config === 'boolean') {\n config = { audioOnly: config };\n }\n try {\n if (enabled) {\n await this.startScreenShare(config);\n } else {\n await this.stopScreenShare();\n }\n } catch (error) {\n this.hmsNotifications.sendError(SDKToHMS.convertException(error as SDKHMSException));\n throw error;\n }\n }\n\n async addTrack(track: MediaStreamTrack, type: HMSTrackSource = 'regular') {\n await this.sdk.addTrack(track, type);\n this.syncRoomState('addTrack');\n }\n\n async removeTrack(trackId: string) {\n await this.sdk.removeTrack(trackId);\n this.syncRoomState('removeTrack');\n }\n\n async setLocalAudioEnabled(enabled: boolean) {\n const trackID = this.store.getState(selectLocalAudioTrackID);\n if (trackID) {\n await this.setEnabledTrack(trackID, enabled);\n }\n }\n\n async setLocalVideoEnabled(enabled: boolean) {\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (trackID) {\n await this.setEnabledTrack(trackID, enabled);\n }\n }\n\n async setEnabledTrack(trackID: string, enabled: boolean) {\n // if mute/unmute is clicked multiple times for same operation, ignore repeated ones\n const alreadyInSameState = this.store.getState().tracks[trackID]?.enabled === enabled;\n if (alreadyInSameState) {\n // it could also be a case of possible inconsistency where UI state is out of sync with truth\n this.logPossibleInconsistency(`local track[${trackID}] enabled state - ${enabled}`);\n return;\n }\n this.setState(store => {\n // show on UI immediately\n if (!store.tracks[trackID]) {\n this.logPossibleInconsistency('track id not found for setEnabled');\n } else {\n store.tracks[trackID].displayEnabled = enabled;\n }\n }, 'displayEnabled');\n try {\n await this.setEnabledSDKTrack(trackID, enabled); // do the operation\n this.syncRoomState('setEnabled');\n } catch (err) {\n // rollback on failure\n this.setState(store => {\n store.tracks[trackID].displayEnabled = !enabled;\n }, 'rollbackDisplayEnabled');\n this.hmsNotifications.sendError(SDKToHMS.convertException(err as SDKHMSException));\n throw err;\n }\n const type = enabled ? sdkTypes.HMSTrackUpdate.TRACK_UNMUTED : sdkTypes.HMSTrackUpdate.TRACK_MUTED;\n this.hmsNotifications.sendTrackUpdate(type, trackID);\n }\n\n async setAudioSettings(settings: Partial<sdkTypes.HMSAudioTrackSettings>) {\n const trackID = this.store.getState(selectLocalAudioTrackID);\n if (trackID) {\n await this.setSDKLocalAudioTrackSettings(trackID, settings);\n this.syncRoomState('setAudioSettings');\n }\n }\n\n async setVideoSettings(settings: Partial<sdkTypes.HMSVideoTrackSettings>) {\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (trackID) {\n await this.setSDKLocalVideoTrackSettings(trackID, settings);\n this.syncRoomState('setVideoSettings');\n }\n }\n\n async switchCamera(): Promise<void> {\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (trackID) {\n const sdkTrack = this.hmsSDKTracks[trackID] as SDKHMSLocalVideoTrack;\n if (sdkTrack) {\n await sdkTrack.switchCamera();\n this.syncRoomState('switchCamera');\n }\n }\n }\n\n sendMessage(message: string) {\n this.sendBroadcastMessage(message);\n }\n\n async sendBroadcastMessage(message: string, type?: string) {\n const sdkMessage = await this.sdk.sendBroadcastMessage(message, type);\n this.updateMessageInStore(sdkMessage, { message, type });\n }\n\n async sendGroupMessage(message: string, roles: string[], type?: string) {\n const storeRoles = this.store.getState(selectRolesMap);\n const hmsRoles = roles.map(roleName => {\n return storeRoles[roleName];\n });\n const sdkMessage = await this.sdk.sendGroupMessage(message, hmsRoles, type);\n this.updateMessageInStore(sdkMessage, { message, recipientRoles: roles, type });\n }\n\n async sendDirectMessage(message: string, peerID: string, type?: string) {\n const hmsPeer = this.getSDKHMSPeer(peerID);\n if (!hmsPeer) {\n HMSLogger.w('sendMessage', 'Failed to send message');\n throw Error(`sendMessage Failed - peer ${peerID} not found`);\n }\n const sdkMessage = await this.sdk.sendDirectMessage(message, hmsPeer, type);\n this.updateMessageInStore(sdkMessage, { message, recipientPeer: hmsPeer.peerId, type });\n }\n\n private updateMessageInStore(sdkMessage: sdkTypes.HMSMessage | void, messageInput: string | HMSMessageInput) {\n if (!sdkMessage) {\n HMSLogger.w('sendMessage', 'Failed to send message', messageInput);\n throw Error(`sendMessage Failed - ${JSON.stringify(messageInput)}`);\n }\n const hmsMessage = SDKToHMS.convertMessage(sdkMessage) as HMSMessage;\n hmsMessage.read = true;\n hmsMessage.senderName = `${this.sdk.getLocalPeer()?.name} (You)`;\n hmsMessage.ignored = this.ignoredMessageTypes.includes(hmsMessage.type);\n this.putMessageInStore(hmsMessage);\n return hmsMessage;\n }\n\n setMessageRead(readStatus: boolean, messageId?: string) {\n this.setState(store => {\n if (messageId) {\n if (!store.messages.byID[messageId]) {\n this.logPossibleInconsistency('no message with id is found');\n } else {\n store.messages.byID[messageId].read = readStatus;\n }\n } else {\n store.messages.allIDs.forEach((id: string) => {\n store.messages.byID[id].read = readStatus;\n });\n }\n }, 'setMessageRead');\n }\n\n async attachVideo(trackID: string, videoElement: HTMLVideoElement) {\n if (this.localAndVideoUnmuting(trackID)) {\n // wait till video unmute has finished\n return new Promise<void>(resolve => {\n const unsub = this.store.subscribe(async enabled => {\n if (enabled) {\n await this.attachVideoInternal(trackID, videoElement);\n unsub();\n resolve();\n }\n }, selectIsLocalVideoEnabled);\n });\n } else {\n await this.attachVideoInternal(trackID, videoElement);\n }\n }\n\n async detachVideo(trackID: string, videoElement: HTMLVideoElement) {\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack?.type === 'video') {\n await this.sdk.detachVideo(sdkTrack as SDKHMSVideoTrack, videoElement);\n } else {\n if (videoElement) {\n videoElement.srcObject = null; // so chrome can clean up\n }\n HMSLogger.d('possible inconsistency detected - no video track found to remove sink');\n }\n }\n\n async addPluginToVideoTrack(plugin: HMSVideoPlugin, pluginFrameRate?: number): Promise<void> {\n return this.addRemoveVideoPlugin(plugin, 'add', pluginFrameRate);\n }\n async addPluginToAudioTrack(plugin: HMSAudioPlugin): Promise<void> {\n return this.addRemoveAudioPlugin(plugin, 'add');\n }\n\n validateVideoPluginSupport(plugin: HMSVideoPlugin): HMSPluginSupportResult {\n let result = {} as HMSPluginSupportResult;\n result.isSupported = false; //Setting default to false\n if (!plugin) {\n HMSLogger.w('no plugin passed in for checking support');\n result.errMsg = 'no plugin passed in for checking support';\n return result;\n }\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (!trackID) {\n HMSLogger.w('video Track not added to local peer yet');\n result.errMsg = 'call this function only after local peer has video track';\n return result;\n }\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack) {\n result = (sdkTrack as SDKHMSLocalVideoTrack).validatePlugin(plugin);\n } else {\n HMSLogger.w(`track ${trackID} not present, unable to validate plugin`);\n result.errMsg = `track ${trackID} not present, unable to validate plugin`;\n }\n\n return result;\n }\n\n validateAudioPluginSupport(plugin: HMSAudioPlugin): HMSPluginSupportResult {\n let result = {} as HMSPluginSupportResult;\n result.isSupported = false; //Setting default to false\n if (!plugin) {\n HMSLogger.w('no plugin passed in for checking support\"');\n result.errMsg = 'no plugin passed in for checking support\"';\n return result;\n }\n const trackID = this.store.getState(selectLocalAudioTrackID);\n if (!trackID) {\n HMSLogger.w('audio track not added to local peer yet');\n result.errMsg = 'call this function only after local peer has audio track';\n return result;\n }\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack) {\n result = (sdkTrack as SDKHMSLocalAudioTrack).validatePlugin(plugin);\n } else {\n HMSLogger.w(`track ${trackID} not present, unable to validate plugin`);\n result.errMsg = `track ${trackID} not present, unable to validate plugin`;\n }\n\n return result;\n }\n\n async removePluginFromVideoTrack(plugin: HMSVideoPlugin): Promise<void> {\n return this.addRemoveVideoPlugin(plugin, 'remove');\n }\n async removePluginFromAudioTrack(plugin: HMSAudioPlugin): Promise<void> {\n return this.addRemoveAudioPlugin(plugin, 'remove');\n }\n\n async changeRole(forPeerId: string, toRole: string, force = false) {\n await this.sdk.changeRoleOfPeer(forPeerId, toRole, force);\n }\n\n async changeRoleOfPeer(forPeerId: string, toRole: string, force = false) {\n await this.sdk.changeRoleOfPeer(forPeerId, toRole, force);\n }\n\n async changeRoleOfPeersWithRoles(roles: HMSRoleName[], toRole: HMSRoleName) {\n const rolesToBeChanged = this.sdk.getRoles().filter(role => roles.includes(role.name));\n await this.sdk.changeRoleOfPeersWithRoles(rolesToBeChanged, toRole);\n }\n\n // TODO: separate out role related things in another file\n async acceptChangeRole(request: HMSRoleChangeRequest) {\n const sdkPeer: sdkTypes.HMSPeer | undefined = request.requestedBy\n ? this.getSDKHMSPeer(request.requestedBy.id)\n : undefined;\n if (!sdkPeer) {\n HMSLogger.w(`peer for which role change is requested no longer available - ${request.requestedBy}`);\n }\n const sdkRequest = {\n requestedBy: sdkPeer,\n role: request.role,\n token: request.token,\n };\n // TODO: hotfix for HMS-3639. Needs a better solution\n await this.sdk.acceptChangeRole(sdkRequest);\n this.removeRoleChangeRequest(request);\n }\n\n async raiseLocalPeerHand() {\n await this.sdk.raiseLocalPeerHand();\n }\n async lowerLocalPeerHand() {\n await this.sdk.lowerLocalPeerHand();\n }\n async raiseRemotePeerHand(peerId: string) {\n await this.sdk.raiseRemotePeerHand(peerId);\n }\n async lowerRemotePeerHand(peerId: string) {\n await this.sdk.lowerRemotePeerHand(peerId);\n }\n\n getPeerListIterator(options?: HMSPeerListIteratorOptions) {\n const iterator = this.sdk.getPeerListIterator(options);\n return {\n hasNext: () => iterator.hasNext(),\n next: async () => {\n const sdkPeers = await iterator.next();\n return sdkPeers.map(peer => SDKToHMS.convertPeer(peer) as HMSPeer);\n },\n findPeers: async () => {\n const sdkPeers = await iterator.findPeers();\n return sdkPeers.map(peer => SDKToHMS.convertPeer(peer) as HMSPeer);\n },\n getTotal: () => iterator.getTotal(),\n };\n }\n\n initAppData(appData: Record<string, any>) {\n this.setState(store => {\n store.appData = appData;\n }, 'initAppData');\n }\n\n setAppData(key: string, value: any, merge?: boolean) {\n const isValueObject = value?.constructor.name === 'Object';\n this.setState(store => {\n if (store.appData) {\n if (merge && isValueObject) {\n Object.assign(store.appData[key], value);\n } else {\n store.appData[key] = value;\n }\n } else {\n const newAppData = {\n [key]: value,\n };\n store.appData = newAppData;\n }\n }, `setAppData-${key}`);\n }\n\n /**\n * @privateRemarks\n * there is no corresponding sdk method for rejecting change role but as the store also maintains the full\n * state of current pending requests, this method allows it to clean up when the request is rejected\n */\n rejectChangeRole(request: HMSRoleChangeRequest) {\n this.removeRoleChangeRequest(request);\n }\n\n async endRoom(lock: boolean, reason: string) {\n const permissions = this.store.getState(selectPermissions);\n if (!permissions?.endRoom) {\n HMSLogger.w('You are not allowed to perform this action - endRoom');\n return;\n }\n const currentRoomState = this.store.getState(selectRoomState);\n this.setState(store => {\n store.room.roomState = HMSRoomState.Disconnecting;\n }, 'endingRoom');\n try {\n await this.sdk.endRoom(lock, reason);\n this.resetState('endRoom');\n } catch (err) {\n HMSLogger.e('error in ending room - ', err);\n this.setState(store => {\n store.room.roomState = currentRoomState;\n }, 'revertEndRoom');\n }\n }\n\n async removePeer(peerID: string, reason: string) {\n const localPeerId = this.sdk.getLocalPeer()?.peerId;\n if (peerID !== localPeerId) {\n await this.sdk.removePeer(peerID, reason);\n }\n }\n\n async startRTMPOrRecording(params: sdkTypes.RTMPRecordingConfig) {\n await this.sdk.startRTMPOrRecording(params);\n }\n\n async stopRTMPAndRecording() {\n await this.sdk.stopRTMPAndRecording();\n }\n\n async startHLSStreaming(params?: sdkTypes.HLSConfig) {\n await this.sdk.startHLSStreaming(params);\n }\n\n async stopHLSStreaming(params?: sdkTypes.HLSConfig): Promise<void> {\n await this.sdk.stopHLSStreaming(params);\n }\n\n async sendHLSTimedMetadata(metadataList: sdkTypes.HLSTimedMetadata[]): Promise<void> {\n await this.sdk.sendHLSTimedMetadata(metadataList);\n }\n async changeName(name: string) {\n await this.sdk.changeName(name);\n }\n\n async changeMetadata(metadata: string | any) {\n if (typeof metadata !== 'string') {\n metadata = JSON.stringify(metadata);\n }\n await this.sdk.changeMetadata(metadata);\n }\n\n async setSessionMetadata(metadata: any) {\n await this.sdk.setSessionMetadata(metadata);\n this.setState(draftStore => {\n draftStore.sessionMetadata = metadata;\n }, 'setSessionMetadata');\n this.setSessionStoreValueLocally({ key: 'default', value: metadata }, 'setSessionMetadata');\n }\n\n async populateSessionMetadata(): Promise<void> {\n const metadata = await this.sdk.getSessionMetadata();\n this.setState(draftStore => {\n draftStore.sessionMetadata = metadata;\n }, 'populateSessionMetadata');\n this.setSessionStoreValueLocally({ key: 'default', value: metadata }, 'populateSessionmetadata');\n }\n\n async setRemoteTrackEnabled(trackID: HMSTrackID | HMSTrackID[], enabled: boolean) {\n if (typeof trackID === 'string') {\n const track = this.hmsSDKTracks[trackID];\n if (track && isRemoteTrack(track)) {\n await this.sdk.changeTrackState(track as SDKHMSRemoteTrack, enabled);\n } else {\n this.logPossibleInconsistency(`No remote track with ID ${trackID} found for change track state`);\n }\n } else if (Array.isArray(trackID)) {\n trackID.forEach(id => this.setRemoteTrackEnabled(id, enabled));\n }\n }\n\n async setRemoteTracksEnabled(params: HMSChangeMultiTrackStateParams) {\n const sdkRequest: SDKHMSChangeMultiTrackStateParams = {\n enabled: params.enabled,\n type: params.type,\n source: params.source,\n };\n if (params.roles) {\n const rolesMap = this.store.getState(selectRolesMap);\n sdkRequest.roles = params.roles.map(role => rolesMap[role]);\n }\n await this.sdk.changeMultiTrackState(sdkRequest);\n }\n\n setLogLevel(level: HMSLogLevel) {\n HMSLogger.level = level;\n this.sdk.setLogLevel(level);\n }\n\n setFrameworkInfo(frameworkInfo: sdkTypes.HMSFrameworkInfo) {\n this.sdk.setFrameworkInfo(frameworkInfo);\n }\n\n ignoreMessageTypes(msgTypes: string[], replace = false) {\n if (replace) {\n this.ignoredMessageTypes = msgTypes;\n } else {\n for (const msgType of msgTypes) {\n if (!this.ignoredMessageTypes.includes(msgType)) {\n this.ignoredMessageTypes.push(msgType);\n }\n }\n }\n }\n\n async enableBeamSpeakerLabelsLogging() {\n if (!this.beamSpeakerLabelsLogger) {\n HMSLogger.i('enabling beam speaker labels logging');\n this.beamSpeakerLabelsLogger = new BeamSpeakerLabelsLogger(this.store, this);\n await this.beamSpeakerLabelsLogger.start();\n }\n }\n\n private resetState(reason = 'resetState') {\n this.isRoomJoinCalled = false;\n this.hmsSDKTracks = {};\n HMSLogger.cleanup();\n this.setState(store => {\n Object.assign(store, createDefaultStoreState());\n }, reason);\n }\n\n private async sdkJoinWithListeners(config: sdkTypes.HMSConfig) {\n await this.sdk.join(config, {\n onJoin: this.onJoin.bind(this),\n onPreview: this.onPreview.bind(this),\n onRoomUpdate: this.onRoomUpdate.bind(this),\n onPeerUpdate: this.onPeerUpdate.bind(this),\n onTrackUpdate: this.onTrackUpdate.bind(this),\n onMessageReceived: this.onMessageReceived.bind(this),\n onError: this.onError.bind(this),\n onReconnected: this.onReconnected.bind(this),\n onReconnecting: this.onReconnecting.bind(this),\n onRoleChangeRequest: this.onRoleChangeRequest.bind(this),\n onRoleUpdate: this.onRoleUpdate.bind(this),\n onDeviceChange: this.onDeviceChange.bind(this),\n onChangeTrackStateRequest: this.onChangeTrackStateRequest.bind(this),\n onChangeMultiTrackStateRequest: this.onChangeMultiTrackStateRequest.bind(this),\n onRemovedFromRoom: this.onRemovedFromRoom.bind(this),\n onNetworkQuality: this.onNetworkQuality.bind(this),\n onSessionStoreUpdate: this.onSessionStoreUpdate.bind(this),\n onPollsUpdate: this.onPollsUpdate.bind(this),\n });\n this.sdk.addAudioListener({\n onAudioLevelUpdate: this.onAudioLevelUpdate.bind(this),\n });\n this.sdk.addConnectionQualityListener({\n onConnectionQualityUpdate: this.onConnectionQualityUpdate.bind(this),\n });\n }\n\n private onRemovedFromRoom(request: SDKHMSLeaveRoomRequest) {\n const requestedBy = this.store.getState(selectPeerByID(request.requestedBy?.peerId));\n this.hmsNotifications.sendLeaveRoom({\n ...request,\n requestedBy: requestedBy || undefined,\n });\n const action = request.roomEnded || !requestedBy ? 'roomEnded' : 'removedFromRoom';\n HMSLogger.i(`resetting state after peer removed ${action}`, request);\n this.resetState(action);\n }\n\n private onDeviceChange(event: sdkTypes.HMSDeviceChangeEvent) {\n const devices = event.devices;\n if (!devices) {\n return;\n }\n const localPeer = this.store.getState(selectLocalPeer);\n this.setState(store => {\n if (!areArraysEqual(store.devices.audioInput, devices.audioInput)) {\n store.devices.audioInput = devices.audioInput;\n }\n if (!areArraysEqual(store.devices.videoInput, devices.videoInput)) {\n store.devices.videoInput = devices.videoInput;\n }\n if (!areArraysEqual(store.devices.audioOutput, devices.audioOutput)) {\n store.devices.audioOutput = devices.audioOutput;\n }\n const sdkLocalPeer = this.sdk.getLocalPeer();\n if (localPeer?.id && sdkLocalPeer) {\n Object.assign(store.settings, this.getMediaSettings(sdkLocalPeer));\n }\n }, 'deviceChange');\n // send notification only on device change - selection is present\n if (event.selection) {\n const notification = SDKToHMS.convertDeviceChangeUpdate(event);\n this.hmsNotifications.sendDeviceChange(notification);\n }\n }\n\n private async sdkPreviewWithListeners(config: sdkTypes.HMSPreviewConfig) {\n await this.sdk.preview(config, {\n onPreview: this.onPreview.bind(this),\n onError: this.onError.bind(this),\n onReconnected: this.onReconnected.bind(this),\n onReconnecting: this.onReconnecting.bind(this),\n onDeviceChange: this.onDeviceChange.bind(this),\n onRoomUpdate: this.onRoomUpdate.bind(this),\n onPeerUpdate: this.onPeerUpdate.bind(this),\n onNetworkQuality: this.onNetworkQuality.bind(this),\n });\n this.sdk.addAudioListener({\n onAudioLevelUpdate: this.onAudioLevelUpdate.bind(this),\n });\n }\n\n private onNetworkQuality(quality: number) {\n this.setState(store => {\n /*\n * if store does not have peerId yet, fetch from sdk directly.\n * sdk will have the localpeer already set.\n */\n const peerId = store.room.localPeer || this.sdk.getLocalPeer()?.peerId;\n if (peerId) {\n store.connectionQualities[peerId] = { peerID: peerId, downlinkQuality: quality };\n }\n }, 'ConnectionQuality');\n }\n\n private onSessionStoreUpdate(updates: SessionStoreUpdate[]) {\n this.setSessionStoreValueLocally(updates, 'sessionStoreUpdate');\n }\n\n private onPollsUpdate(actionType: sdkTypes.HMSPollsUpdate, polls: sdkTypes.HMSPoll[]) {\n const actionName = POLL_NOTIFICATION_TYPES[actionType];\n this.setState(draftStore => {\n const pollsObject = polls.reduce((acc, poll) => {\n acc[poll.id] = {\n ...poll,\n questions: poll.questions?.map(question => ({\n ...question,\n answer: question.answer ? { ...question.answer } : undefined,\n options: question.options?.map(option => ({ ...option })),\n responses: question.responses?.map(response => ({ ...response })),\n })),\n };\n return acc;\n }, {} as { [key: string]: sdkTypes.HMSPoll });\n mergeNewPollsInDraft(draftStore.polls, pollsObject);\n }, actionName);\n\n polls.forEach(poll => this.hmsNotifications.sendPollUpdate(actionType, poll.id));\n }\n\n private async startScreenShare(config?: HMSScreenShareConfig) {\n const isScreenShared = this.store.getState(selectIsLocalScreenShared);\n if (!isScreenShared) {\n await this.sdk.startScreenShare(() => this.syncRoomState('screenshareStopped'), config);\n this.syncRoomState('startScreenShare');\n } else {\n this.logPossibleInconsistency(\"start screenshare is called while it's on\");\n }\n }\n\n private async stopScreenShare() {\n const isScreenShared = this.store.getState(selectIsLocalScreenShared);\n if (isScreenShared) {\n await this.sdk.stopScreenShare();\n this.syncRoomState('stopScreenShare');\n } else {\n this.logPossibleInconsistency(\"stop screenshare is called while it's not on\");\n }\n }\n\n private async attachVideoInternal(trackID: string, videoElement: HTMLVideoElement) {\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack && sdkTrack.type === 'video') {\n await this.sdk.attachVideo(sdkTrack as SDKHMSVideoTrack, videoElement);\n } else {\n this.logPossibleInconsistency('no video track found to add sink');\n }\n }\n\n /**\n * This is a very important function as it's responsible for maintaining the source of\n * truth with maximum efficiency. The efficiency comes from the fact that the only\n * those portions of the store are updated which have actually changed.\n * While making a change in this function don't use functions like map, reduce etc.\n * which return a new copy of the data. Use Object.assign etc. to ensure that if the data\n * doesn't change reference is also not changed.\n * The UI and selectors rely on the fact that the store is immutable that is if there is\n * any change and only if there is a change, they'll get a new copy of the data they're\n * interested in with a new reference.\n * @protected\n */\n protected syncRoomState(action: string) {\n action = `${action}_fullSync`;\n HMSLogger.time(`store-sync-${action}`);\n const newHmsPeers: Record<HMSPeerID, Partial<HMSPeer>> = {};\n const newHmsPeerIDs: HMSPeerID[] = []; // to add in room.peers\n const newHmsTracks: Record<HMSTrackID, Partial<HMSTrack>> = {};\n const newHmsSDkTracks: Record<HMSTrackID, SDKHMSTrack> = {};\n const newMediaSettings: Partial<HMSMediaSettings> = {};\n const newNetworkQuality: Record<HMSPeerID, sdkTypes.HMSConnectionQuality> = {};\n let newPreview: HMSStore['preview'];\n\n const sdkPeers: sdkTypes.HMSPeer[] = this.sdk.getPeers();\n\n // first convert everything in the new format\n for (const sdkPeer of sdkPeers) {\n const hmsPeer = SDKToHMS.convertPeer(sdkPeer);\n newHmsPeers[hmsPeer.id] = hmsPeer;\n newHmsPeerIDs.push(hmsPeer.id);\n newNetworkQuality[hmsPeer.id] = {\n peerID: hmsPeer.id,\n downlinkQuality: sdkPeer.networkQuality || -1,\n };\n\n const sdkTracks = [sdkPeer.audioTrack, sdkPeer.videoTrack, ...sdkPeer.auxiliaryTracks];\n for (const sdkTrack of sdkTracks) {\n if (!sdkTrack) {\n continue;\n }\n const hmsTrack = SDKToHMS.convertTrack(sdkTrack);\n newHmsTracks[hmsTrack.id] = hmsTrack;\n newHmsSDkTracks[sdkTrack.trackId] = sdkTrack;\n }\n\n if (sdkPeer.isLocal) {\n const localPeer = sdkPeer as sdkTypes.HMSLocalPeer;\n newPreview = this.getPreviewFields(localPeer);\n Object.assign(newMediaSettings, this.getMediaSettings(localPeer));\n }\n }\n\n const recording = this.sdk.getRecordingState();\n const rtmp = this.sdk.getRTMPState();\n const hls = this.sdk.getHLSState();\n\n // then merge them carefully with our store so if something hasn't changed\n // the reference shouldn't change. Note that the draftStore is an immer draft\n // object.\n this.setState(draftStore => {\n draftStore.room.peers = newHmsPeerIDs;\n const draftPeers = draftStore.peers;\n const draftTracks = draftStore.tracks;\n // the order of below statements are important as merge functions are mutating\n mergeNewPeersInDraft(draftPeers, newHmsPeers);\n mergeNewTracksInDraft(draftTracks, newHmsTracks);\n Object.assign(draftStore.settings, newMediaSettings);\n Object.assign(draftStore.connectionQualities, newNetworkQuality);\n this.hmsSDKTracks = newHmsSDkTracks;\n\n /**\n * if preview is already present merge,\n * else set as is(which will create/delete)\n */\n if (draftStore.preview?.localPeer && newPreview?.localPeer) {\n Object.assign(draftStore.preview, newPreview);\n } else {\n draftStore.preview = newPreview;\n }\n Object.assign(draftStore.roles, SDKToHMS.convertRoles(this.sdk.getRoles()));\n Object.assign(draftStore.playlist, SDKToHMS.convertPlaylist(this.sdk.getPlaylistManager()));\n Object.assign(draftStore.room, SDKToHMS.convertRecordingStreamingState(recording, rtmp, hls));\n Object.assign(draftStore.templateAppData, this.sdk.getTemplateAppData());\n }, action);\n HMSLogger.timeEnd(`store-sync-${action}`);\n }\n\n protected onPreview(sdkRoom: sdkTypes.HMSRoom) {\n this.setState(store => {\n Object.assign(store.room, SDKToHMS.convertRoom(sdkRoom, this.sdk.getLocalPeer()?.peerId));\n store.room.roomState = HMSRoomState.Preview;\n }, 'previewStart');\n this.syncRoomState('previewSync');\n }\n\n protected onJoin(sdkRoom: sdkTypes.HMSRoom) {\n const playlistManager = this.sdk.getPlaylistManager();\n this.audioPlaylist = new HMSPlaylist(\n playlistManager,\n HMSPlaylistType.audio,\n this.syncPlaylistState.bind(this),\n this.store,\n );\n this.videoPlaylist = new HMSPlaylist(\n playlistManager,\n HMSPlaylistType.video,\n this.syncRoomState.bind(this),\n this.store,\n );\n this.syncRoomState('joinSync');\n this.setState(store => {\n Object.assign(store.room, SDKToHMS.convertRoom(sdkRoom, this.sdk.getLocalPeer()?.peerId));\n store.room.isConnected = true;\n store.room.roomState = HMSRoomState.Connected;\n }, 'joined');\n playlistManager.onProgress(this.setProgress);\n playlistManager.onNewTrackStart((item: sdkTypes.HMSPlaylistItem<any>) => {\n this.syncPlaylistState(`${item.type}PlaylistUpdate`);\n });\n playlistManager.onPlaylistEnded((type: HMSPlaylistType) => {\n this.syncPlaylistState(`${type}PlaylistEnded`);\n });\n playlistManager.onCurrentTrackEnded((item: sdkTypes.HMSPlaylistItem<any>) => {\n this.hmsNotifications.sendPlaylistTrackEnded(SDKToHMS.convertPlaylistItem(playlistManager, item));\n this.syncPlaylistState(`${item.type}PlaylistItemEnded`);\n });\n }\n\n protected onRoomUpdate(type: sdkTypes.HMSRoomUpdate, room: sdkTypes.HMSRoom) {\n this.setState(store => {\n Object.assign(store.room, SDKToHMS.convertRoom(room, this.sdk.getLocalPeer()?.peerId));\n }, type);\n }\n\n protected onPeerUpdate(type: sdkTypes.HMSPeerUpdate, sdkPeer: sdkTypes.HMSPeer | sdkTypes.HMSPeer[]) {\n if (\n [sdkTypes.HMSPeerUpdate.BECAME_DOMINANT_SPEAKER, sdkTypes.HMSPeerUpdate.RESIGNED_DOMINANT_SPEAKER].includes(type)\n ) {\n return; // ignore, high frequency update so no point of syncing peers\n }\n if (Array.isArray(sdkPeer)) {\n const storePeers = this.store.getState(selectPeersMap);\n const newPeerIds = sdkPeer.filter(peer => !storePeers[peer.peerId]);\n this.syncRoomState('peersJoined');\n const connected = this.store.getState(selectIsConnectedToRoom);\n // This is not send unnecessary notifications while in preview\n // now room state also call peer list to handle large peers\n if (connected) {\n const hmsPeers = [];\n for (const peer of sdkPeer) {\n const hmsPeer = this.store.getState(selectPeerByID(peer.peerId));\n if (hmsPeer) {\n hmsPeers.push(hmsPeer);\n }\n }\n this.hmsNotifications.sendPeerList(hmsPeers);\n } else {\n newPeerIds.forEach(peer => {\n const hmsPeer = this.store.getState(selectPeerByID(peer.peerId));\n if (hmsPeer) {\n this.hmsNotifications.sendPeerUpdate(sdkTypes.HMSPeerUpdate.PEER_JOINED, hmsPeer);\n }\n });\n }\n return;\n }\n this.sendPeerUpdateNotification(type, sdkPeer);\n }\n\n protected onTrackUpdate(type: sdkTypes.HMSTrackUpdate, track: SDKHMSTrack, peer: sdkTypes.HMSPeer) {\n // this check is needed because for track removed case, the notification needs to\n // be send before the track is removed from store\n if (type === sdkTypes.HMSTrackUpdate.TRACK_REMOVED) {\n this.hmsNotifications.sendTrackUpdate(type, track.trackId);\n this.handleTrackRemove(track, peer);\n } else if ([sdkTypes.HMSTrackUpdate.TRACK_ADDED, sdkTypes.HMSTrackUpdate.TRACK_REMOVED].includes(type)) {\n const actionName = TRACK_NOTIFICATION_TYPES[type];\n this.syncRoomState(actionName);\n this.hmsNotifications.sendTrackUpdate(type, track.trackId);\n } else {\n const actionName = TRACK_NOTIFICATION_TYPES[type] || 'trackUpdate';\n const hmsTrack = SDKToHMS.convertTrack(track);\n this.setState(draftStore => {\n const storeTrack = draftStore.tracks[hmsTrack.id];\n if (isEntityUpdated(storeTrack, hmsTrack)) {\n mergeTrackArrayFields(storeTrack, hmsTrack);\n Object.assign(storeTrack, hmsTrack);\n }\n }, actionName);\n this.hmsNotifications.sendTrackUpdate(type, track.trackId);\n }\n }\n\n protected onMessageReceived(sdkMessage: sdkTypes.HMSMessage) {\n const hmsMessage = SDKToHMS.convertMessage(sdkMessage) as HMSMessage;\n hmsMessage.read = false;\n hmsMessage.ignored = this.ignoredMessageTypes.includes(hmsMessage.type);\n this.putMessageInStore(hmsMessage);\n this.hmsNotifications.sendMessageReceived(hmsMessage);\n }\n\n protected putMessageInStore(hmsMessage: HMSMessage) {\n if (hmsMessage.ignored) {\n return;\n }\n this.setState(store => {\n store.messages.byID[hmsMessage.id] = hmsMessage;\n store.messages.allIDs.push(hmsMessage.id);\n }, 'newMessage');\n }\n\n /*\n * Note: speakers array contain the value only for peers who have audioLevel != 0\n */\n protected onAudioLevelUpdate(sdkSpeakers: sdkTypes.HMSSpeaker[]) {\n this.setState(store => {\n const trackIDAudioLevelMap: Record<HMSPeerID, number> = {};\n sdkSpeakers.forEach(sdkSpeaker => {\n if (!sdkSpeaker.track || !sdkSpeaker.peer) {\n return;\n }\n const trackID = sdkSpeaker.track.trackId;\n trackIDAudioLevelMap[trackID] = sdkSpeaker.audioLevel;\n if (!store.speakers[trackID]) {\n // Set store instances(peers, tracks) references in speaker, not the new ones received.\n store.speakers[trackID] = {\n audioLevel: sdkSpeaker.audioLevel,\n peerID: sdkSpeaker.peer.peerId,\n trackID: trackID,\n };\n }\n });\n const speakerEntries = Object.entries(store.speakers);\n for (const [trackID, speaker] of speakerEntries) {\n speaker.audioLevel = trackIDAudioLevelMap[trackID] || 0;\n if (speaker.audioLevel === 0) {\n delete store.speakers[trackID];\n }\n }\n }, 'audioLevel');\n }\n\n /**\n * The connection quality update is sent for all peers(one needs to know of) every time.\n */\n protected onConnectionQualityUpdate(newQualities: sdkTypes.HMSConnectionQuality[]) {\n this.setState(store => {\n newQualities.forEach(sdkUpdate => {\n const peerID = sdkUpdate.peerID;\n if (!peerID) {\n return;\n }\n if (!store.connectionQualities[peerID]) {\n store.connectionQualities[peerID] = sdkUpdate;\n } else {\n Object.assign(store.connectionQualities[peerID], sdkUpdate);\n }\n });\n }, 'connectionQuality');\n }\n\n protected onChangeTrackStateRequest(request: SDKHMSChangeTrackStateRequest) {\n const requestedBy = this.store.getState(selectPeerByID(request.requestedBy?.peerId));\n const storeTrackID = this.getStoreLocalTrackIDfromSDKTrack(request.track);\n const track = this.store.getState(selectTrackByID(storeTrackID));\n\n if (!track) {\n return this.logPossibleInconsistency(\n `Not found track for which track state change was requested, ${request.track}`,\n );\n }\n\n if (!request.enabled) {\n this.syncRoomState('changeTrackStateRequest');\n }\n\n this.hmsNotifications.sendChangeTrackStateRequest({\n requestedBy: requestedBy || undefined,\n track,\n enabled: request.enabled,\n });\n }\n\n protected onChangeMultiTrackStateRequest(request: SDKHMSChangeMultiTrackStateRequest) {\n const requestedBy = this.store.getState(selectPeerByID(request.requestedBy?.peerId));\n\n if (!request.enabled) {\n this.syncRoomState('changeMultiTrackStateRequest');\n }\n\n const tracks: HMSTrack[] = [];\n const tracksMap = this.store.getState(selectTracksMap);\n for (const track of request.tracks) {\n const storeTrackID = this.getStoreLocalTrackIDfromSDKTrack(track);\n if (storeTrackID && tracksMap[storeTrackID]) {\n tracks.push(tracksMap[storeTrackID]);\n }\n }\n\n this.hmsNotifications.sendChangeMultiTrackStateRequest({\n requestedBy: requestedBy || undefined,\n tracks,\n enabled: request.enabled,\n type: request.type,\n source: request.source,\n });\n }\n\n protected onReconnected() {\n this.syncRoomState('reconnectedSync');\n this.hmsNotifications.sendReconnected();\n this.setState(store => {\n store.room.roomState = store.room.isConnected ? HMSRoomState.Connected : HMSRoomState.Preview;\n }, 'reconnected');\n }\n\n protected onReconnecting(sdkError: SDKHMSException) {\n const error = SDKToHMS.convertException(sdkError);\n HMSLogger.e('Reconnection: received error from sdk', error);\n this.hmsNotifications.sendReconnecting(error);\n this.setState(store => {\n store.room.roomState = HMSRoomState.Reconnecting;\n store.errors.push(error);\n }, 'reconnecting');\n }\n\n protected onError(sdkException: SDKHMSException) {\n const error = SDKToHMS.convertException(sdkException);\n if (error.isTerminal) {\n // terminal error leave room as it is not recoverable\n this.leave().then(() => HMSLogger.e('error from SDK, left room.'));\n this.setState(store => {\n store.room.roomState = HMSRoomState.Failed;\n store.errors.push(error);\n }, 'errorTerminal');\n } else {\n const numExistingErrors = this.store.getState().errors.length;\n // just in case there is some infinite loop sending errors\n if (numExistingErrors < 50) {\n this.setState(store => {\n store.errors.push(error);\n }, 'error');\n }\n }\n this.syncRoomState('errorSync'); //TODO: check if need to be done in a different way\n // send notification\n this.hmsNotifications.sendError(error);\n HMSLogger.e('received error from sdk', error instanceof SDKHMSException ? `${error}` : error);\n }\n\n private handleTrackRemove(sdkTrack: SDKHMSTrack, sdkPeer: sdkTypes.HMSPeer) {\n this.setState(draftStore => {\n const hmsPeer = draftStore.peers[sdkPeer.peerId];\n const draftTracks = draftStore.tracks;\n const trackId = sdkTrack.trackId;\n // find and remove the exact track from hmsPeer\n if (this.isSameStoreSDKTrack(trackId, hmsPeer?.audioTrack)) {\n delete hmsPeer?.audioTrack;\n } else if (this.isSameStoreSDKTrack(trackId, hmsPeer?.videoTrack)) {\n delete hmsPeer?.videoTrack;\n } else {\n const auxiliaryIndex = hmsPeer?.auxiliaryTracks.indexOf(trackId);\n if (auxiliaryIndex > -1 && this.isSameStoreSDKTrack(trackId, hmsPeer?.auxiliaryTracks[auxiliaryIndex])) {\n hmsPeer?.auxiliaryTracks.splice(auxiliaryIndex, 1);\n }\n }\n delete draftTracks[trackId];\n delete this.hmsSDKTracks[trackId];\n }, 'trackRemoved');\n }\n\n private async setEnabledSDKTrack(trackID: string, enabled: boolean) {\n const track = this.hmsSDKTracks[trackID];\n if (track) {\n await track.setEnabled(enabled);\n } else {\n this.logPossibleInconsistency(`track ${trackID} not present, unable to enabled/disable`);\n }\n }\n\n private async setSDKLocalVideoTrackSettings(trackID: string, settings: Partial<sdkTypes.HMSVideoTrackSettings>) {\n const track = this.hmsSDKTracks[trackID] as SDKHMSLocalVideoTrack;\n if (track) {\n await track.setSettings(settings);\n } else {\n this.logPossibleInconsistency(`local track ${trackID} not present, unable to set settings`);\n }\n }\n\n private async setSDKLocalAudioTrackSettings(trackID: string, settings: Partial<sdkTypes.HMSAudioTrackSettings>) {\n const track = this.hmsSDKTracks[trackID] as SDKHMSLocalAudioTrack;\n if (track) {\n await track.setSettings(settings);\n } else {\n this.logPossibleInconsistency(`local track ${trackID} not present, unable to set settings`);\n }\n }\n\n private getMediaSettings(sdkPeer: sdkTypes.HMSPeer): Partial<HMSMediaSettings> {\n const settings = this.store.getState(selectLocalMediaSettings);\n const audioTrack = sdkPeer.audioTrack as SDKHMSLocalAudioTrack;\n const videoTrack = sdkPeer.videoTrack as SDKHMSLocalVideoTrack;\n return {\n audioInputDeviceId: audioTrack?.settings.deviceId || settings.audioInputDeviceId,\n videoInputDeviceId: videoTrack?.settings.deviceId || settings.videoInputDeviceId,\n audioOutputDeviceId: this.sdk.getAudioOutput().getDevice()?.deviceId,\n };\n }\n\n private getPreviewFields(sdkLocalPeer: sdkTypes.HMSLocalPeer): HMSStore['preview'] {\n // if room is not in preview, clear preview fields\n if (!sdkLocalPeer.isInPreview()) {\n return;\n }\n\n const hmsLocalPeer = SDKToHMS.convertPeer(sdkLocalPeer);\n\n return {\n localPeer: hmsLocalPeer.id,\n audioTrack: hmsLocalPeer.audioTrack,\n videoTrack: hmsLocalPeer.videoTrack,\n asRole: sdkLocalPeer.asRole?.name || sdkLocalPeer.role?.name,\n };\n }\n\n private async setTrackVolume(value: number, trackId: HMSTrackID) {\n const track = this.hmsSDKTracks[trackId];\n if (track) {\n if (track instanceof SDKHMSAudioTrack) {\n await track.setVolume(value);\n this.setState(draftStore => {\n const track = draftStore.tracks[trackId];\n if (track && track.type === 'audio') {\n track.volume = value;\n }\n }, 'trackVolume');\n } else {\n HMSLogger.w(`track ${trackId} is not an audio track`);\n }\n } else {\n this.logPossibleInconsistency(`track ${trackId} not present, unable to set volume`);\n }\n }\n\n /**\n * Tells if the trackID is for local peer and video unmute is in process\n * @private\n */\n private localAndVideoUnmuting(trackID: string) {\n const localPeer = this.store.getState(selectLocalPeer);\n if (localPeer?.videoTrack !== trackID) {\n return false;\n }\n const displayEnabled = this.store.getState(selectIsLocalVideoDisplayEnabled);\n const actuallyEnabled = this.store.getState(selectIsLocalVideoEnabled);\n return displayEnabled && !actuallyEnabled;\n }\n\n private logPossibleInconsistency(inconsistency: string) {\n HMSLogger.w('possible inconsistency detected - ', inconsistency);\n }\n\n private async addRemoveVideoPlugin(plugin: HMSVideoPlugin, action: 'add' | 'remove', pluginFrameRate?: number) {\n if (!plugin) {\n HMSLogger.w('Invalid plugin received in store');\n return;\n }\n const trackID = this.store.getState(selectLocalVideoTrackID);\n if (trackID) {\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack) {\n if (action === 'add') {\n await (sdkTrack as SDKHMSLocalVideoTrack).addPlugin(plugin, pluginFrameRate);\n } else if (action === 'remove') {\n await (sdkTrack as SDKHMSLocalVideoTrack).removePlugin(plugin);\n }\n this.syncRoomState(`${action}VideoPlugin`);\n } else {\n this.logPossibleInconsistency(`track ${trackID} not present, unable to remove plugin`);\n }\n }\n }\n private async addRemoveAudioPlugin(plugin: HMSAudioPlugin, action: 'add' | 'remove') {\n if (!plugin) {\n HMSLogger.w('Invalid plugin received in store');\n return;\n }\n const trackID = this.store.getState(selectLocalAudioTrackID);\n if (trackID) {\n const sdkTrack = this.hmsSDKTracks[trackID];\n if (sdkTrack) {\n if (action === 'add') {\n await (sdkTrack as SDKHMSLocalAudioTrack).addPlugin(plugin);\n } else if (action === 'remove') {\n await (sdkTrack as SDKHMSLocalAudioTrack).removePlugin(plugin);\n }\n this.syncRoomState(`${action}AudioPlugin`);\n } else {\n this.logPossibleInconsistency(`track ${trackID} not present, unable to remove plugin`);\n }\n }\n }\n\n /**\n * In case of replace track id is changed but not in store. Given the store id, check the real id\n * sdk is using to refer to the track and match them.\n */\n private isSameStoreSDKTrack(sdkTrackID: string, storeTrackID?: string): boolean {\n if (!storeTrackID) {\n return false;\n }\n return this.hmsSDKTracks[storeTrackID]?.trackId === sdkTrackID;\n }\n\n /**\n * convert new role change requests to store format and save.\n * keep only one request at a time in store till we figure out how to handle multiple requests at the same time\n */\n private onRoleChangeRequest(request: SDKHMSRoleChangeRequest) {\n this.setState(store => {\n if (store.roleChangeRequests.length === 0) {\n store.roleChangeRequests.push(SDKToHMS.convertRoleChangeRequest(request));\n }\n }, 'roleChangeRequest');\n }\n\n private removeRoleChangeRequest(toRemove: HMSRoleChangeRequest) {\n this.setState(store => {\n const index = store.roleChangeRequests.findIndex(req => {\n return req.token === toRemove.token;\n });\n if (index !== -1) {\n store.roleChangeRequests.splice(index, 1);\n }\n }, 'removeRoleChangeRequest');\n }\n\n private onRoleUpdate() {\n this.syncRoomState('roleUpdate');\n }\n\n private getStoreLocalTrackIDfromSDKTrack(sdkTrack: SDKHMSLocalTrack) {\n const trackIDs = this.store.getState(selectLocalTrackIDs);\n return trackIDs.find(trackID => this.hmsSDKTracks[trackID].trackId === sdkTrack.trackId);\n }\n\n private setProgress = ({ type, progress }: sdkTypes.HMSPlaylistProgressEvent) => {\n this.setState(draftStore => {\n draftStore.playlist[type].progress = progress;\n draftStore.playlist[type].currentTime = this.sdk.getPlaylistManager().getCurrentTime(type);\n }, 'playlistProgress');\n };\n\n private syncPlaylistState = (action: string) => {\n this.setState(draftStore => {\n Object.assign(draftStore.playlist, SDKToHMS.convertPlaylist(this.sdk.getPlaylistManager()));\n }, action);\n };\n\n // eslint-disable-next-line complexity\n private sendPeerUpdateNotification = (type: sdkTypes.HMSPeerUpdate, sdkPeer: sdkTypes.HMSPeer) => {\n let peer = this.store.getState(selectPeerByID(sdkPeer.peerId));\n const actionName = PEER_NOTIFICATION_TYPES[type] || 'peerUpdate';\n if (type === sdkTypes.HMSPeerUpdate.ROLE_UPDATED) {\n this.syncRoomState(actionName);\n this.updateMidCallPreviewRoomState(type, sdkPeer);\n } else if ([sdkTypes.HMSPeerUpdate.PEER_JOINED, sdkTypes.HMSPeerUpdate.PEER_LEFT].includes(type)) {\n this.syncRoomState(actionName);\n // if peer wasn't available before sync(will happen if event is peer join)\n if (!peer) {\n peer = this.store.getState(selectPeerByID(sdkPeer.peerId));\n }\n } else if (\n [\n sdkTypes.HMSPeerUpdate.HAND_RAISE_CHANGED,\n sdkTypes.HMSPeerUpdate.PEER_REMOVED,\n sdkTypes.HMSPeerUpdate.PEER_ADDED,\n ].includes(type)\n ) {\n this.syncRoomState(actionName);\n if (!peer) {\n peer = this.store.getState(selectPeerByID(sdkPeer.peerId));\n }\n } else {\n const hmsPeer = SDKToHMS.convertPeer(sdkPeer) as HMSPeer;\n this.setState(draftStore => {\n const storePeer = draftStore.peers[hmsPeer.id];\n if (isEntityUpdated(storePeer, hmsPeer)) {\n if (areArraysEqual(storePeer.auxiliaryTracks, hmsPeer.auxiliaryTracks)) {\n storePeer.auxiliaryTracks = hmsPeer.auxiliaryTracks;\n }\n Object.assign(storePeer, hmsPeer);\n }\n peer = hmsPeer;\n }, actionName);\n }\n this.hmsNotifications.sendPeerUpdate(type, peer);\n };\n\n private updateMidCallPreviewRoomState(type: sdkTypes.HMSPeerUpdate, sdkPeer: sdkTypes.HMSPeer) {\n if (sdkPeer.isLocal && type === sdkTypes.HMSPeerUpdate.ROLE_UPDATED && this.store.getState(selectIsInPreview)) {\n this.setState(store => {\n store.room.roomState = HMSRoomState.Connected;\n }, 'midCallPreviewCompleted');\n }\n }\n\n private setSessionStoreValueLocally(\n updates: SessionStoreUpdate | SessionStoreUpdate[],\n actionName = 'setSessionStore',\n ) {\n const updatesList: SessionStoreUpdate[] = Array.isArray(updates) ? updates : [updates];\n this.setState(store => {\n updatesList.forEach(update => {\n store.sessionStore[update.key as keyof T['sessionStore']] = update.value;\n });\n }, actionName);\n }\n\n private getSDKHMSPeer = (peerID: HMSPeerID) => {\n return this.sdk.getPeerMap()[peerID];\n };\n\n /**\n * setState is separate so any future changes to how state change can be done from one place.\n * @param fn\n * @param name\n */\n private setState: NamedSetState<HMSStore<T>> = (fn, name) => {\n return this.store.namedSetState(fn, name);\n };\n}\n", "import { HMSRemoteAudioTrack, HMSRemoteVideoTrack, HMSTrack } from '@100mslive/hms-video';\n\nexport function isRemoteTrack(track: HMSTrack) {\n return track instanceof HMSRemoteAudioTrack || track instanceof HMSRemoteVideoTrack;\n}\n", "import {\n HMSLocalAudioTrack as SDKHMSLocalAudioTrack,\n HMSLocalVideoTrack as SDKHMSLocalVideoTrack,\n HMSRemoteAudioTrack as SDKHMSRemoteAudioTrack,\n HMSRemoteVideoTrack as SDKHMSRemoteVideoTrack,\n HMSRoleChangeRequest as SDKHMSRoleChangeRequest,\n HMSTrack as SDKHMSTrack,\n} from '@100mslive/hms-video';\nimport { areArraysEqual } from './sdkUtils/storeMergeUtils';\nimport * as sdkTypes from './sdkTypes';\nimport {\n HMSAudioTrack,\n HMSDeviceChangeEvent,\n HMSException,\n HMSMessage,\n HMSPeer,\n HMSPeerID,\n HMSPlaylistItem,\n HMSPlaylistType,\n HMSRole,\n HMSRoleChangeStoreRequest,\n HMSRoleName,\n HMSRoom,\n HMSScreenVideoTrack,\n HMSTrack,\n HMSTrackFacingMode,\n HMSVideoTrack,\n} from '../schema';\n\n/**\n * This file has conversion functions from schema defined in sdk to normalised schema defined in store.\n * A lot of conversions below involve deep clone as once the object goes into store it becomes unmodifiable\n * due to immer, so it can't be mutated later.\n *\n * Objects directly from the SDK are not stored as is and cloned because the SDK might modify it later\n */\n\nexport class SDKToHMS {\n static convertPeer(sdkPeer: sdkTypes.HMSPeer): Partial<HMSPeer> & Pick<HMSPeer, 'id'> {\n return {\n id: sdkPeer.peerId,\n name: sdkPeer.name,\n roleName: sdkPeer.role?.name,\n isLocal: sdkPeer.isLocal,\n videoTrack: sdkPeer.videoTrack?.trackId,\n audioTrack: sdkPeer.audioTrack?.trackId,\n auxiliaryTracks: sdkPeer.auxiliaryTracks.map(track => track.trackId),\n customerUserId: sdkPeer.customerUserId,\n metadata: sdkPeer.metadata,\n joinedAt: sdkPeer.joinedAt,\n groups: sdkPeer.groups,\n isHandRaised: sdkPeer.isHandRaised,\n };\n }\n\n static convertTrack(sdkTrack: SDKHMSTrack, peerId?: HMSPeerID): HMSTrack {\n const track: HMSTrack = {\n id: sdkTrack.trackId,\n source: sdkTrack.source,\n type: sdkTrack.type,\n enabled: sdkTrack.enabled,\n displayEnabled: sdkTrack.enabled,\n peerId: sdkTrack.peerId || peerId,\n } as HMSTrack;\n this.enrichTrack(track, sdkTrack);\n return track;\n }\n\n static enrichTrack(track: HMSTrack, sdkTrack: SDKHMSTrack) {\n const mediaSettings = sdkTrack.getMediaTrackSettings();\n\n if (sdkTrack instanceof SDKHMSRemoteAudioTrack) {\n (track as HMSAudioTrack).volume = sdkTrack.getVolume() || 0;\n }\n SDKToHMS.updateDeviceID(track, sdkTrack);\n SDKToHMS.enrichLocalTrack(track, sdkTrack);\n if (track.type === 'video') {\n if (track.source === 'screen') {\n // @ts-ignore\n track.displaySurface = mediaSettings.displaySurface;\n SDKToHMS.enrichScreenTrack(track as HMSScreenVideoTrack, sdkTrack);\n } else if (track.source === 'regular') {\n (track as HMSVideoTrack).facingMode = mediaSettings.facingMode as HMSTrackFacingMode;\n }\n track.height = mediaSettings.height;\n track.width = mediaSettings.width;\n SDKToHMS.enrichVideoTrack(track as HMSVideoTrack, sdkTrack);\n }\n SDKToHMS.enrichPluginsDetails(track, sdkTrack);\n }\n\n static enrichLocalTrack(track: HMSTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSLocalVideoTrack || sdkTrack instanceof SDKHMSLocalAudioTrack) {\n track.isPublished = sdkTrack.isPublished;\n }\n }\n\n static updateDeviceID(track: HMSTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSLocalVideoTrack || sdkTrack instanceof SDKHMSLocalAudioTrack) {\n track.deviceID = sdkTrack.settings.deviceId;\n } else {\n track.deviceID = sdkTrack.getMediaTrackSettings()?.deviceId;\n }\n }\n\n static enrichVideoTrack(track: HMSVideoTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSRemoteVideoTrack) {\n track.layer = sdkTrack.getLayer();\n track.preferredLayer = sdkTrack.getPreferredLayer();\n track.degraded = sdkTrack.degraded;\n }\n if (sdkTrack instanceof SDKHMSRemoteVideoTrack || sdkTrack instanceof SDKHMSLocalVideoTrack) {\n if (!areArraysEqual(sdkTrack.getSimulcastDefinitions(), track.layerDefinitions)) {\n track.layerDefinitions = sdkTrack.getSimulcastDefinitions();\n }\n }\n }\n\n static enrichScreenTrack(track: HMSScreenVideoTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSLocalVideoTrack) {\n const newCaptureHandle = sdkTrack.getCaptureHandle?.();\n if (newCaptureHandle?.handle !== track.captureHandle?.handle) {\n track.captureHandle = newCaptureHandle;\n }\n if (sdkTrack.isCurrentTab) {\n track.displaySurface = 'selfBrowser';\n }\n }\n }\n\n static enrichPluginsDetails(track: HMSTrack, sdkTrack: SDKHMSTrack) {\n if (sdkTrack instanceof SDKHMSLocalVideoTrack || sdkTrack instanceof SDKHMSLocalAudioTrack) {\n if (!areArraysEqual(sdkTrack.getPlugins(), track.plugins)) {\n track.plugins = sdkTrack.getPlugins();\n }\n }\n }\n\n static convertRoom(sdkRoom: sdkTypes.HMSRoom, sdkLocalPeerId?: string): Partial<HMSRoom> {\n const { recording, rtmp, hls } = SDKToHMS.convertRecordingStreamingState(\n sdkRoom?.recording,\n sdkRoom?.rtmp,\n sdkRoom?.hls,\n );\n return {\n id: sdkRoom.id,\n name: sdkRoom.name,\n localPeer: sdkLocalPeerId,\n recording,\n rtmp,\n hls,\n sessionId: sdkRoom.sessionId,\n startedAt: sdkRoom.startedAt,\n joinedAt: sdkRoom.joinedAt,\n peerCount: sdkRoom.peerCount,\n isLargeRoom: sdkRoom.large_room_optimization,\n };\n }\n\n static convertMessage(sdkMessage: sdkTypes.HMSMessage): Partial<HMSMessage> & Pick<HMSMessage, 'sender'> {\n return {\n sender: sdkMessage.sender?.peerId,\n senderName: sdkMessage.sender?.name,\n senderRole: sdkMessage.sender?.role?.name,\n senderUserId: sdkMessage.sender?.customerUserId,\n recipientPeer: sdkMessage.recipientPeer?.peerId,\n recipientRoles: sdkMessage.recipientRoles?.map(role => role.name),\n time: sdkMessage.time,\n type: sdkMessage.type,\n message: sdkMessage.message,\n id: sdkMessage.id,\n };\n }\n\n static convertRoles(sdkRoles: HMSRole[]): Record<HMSRoleName, HMSRole> {\n const roles: Record<HMSRoleName, HMSRole> = {};\n if (sdkRoles) {\n sdkRoles.forEach(role => {\n roles[role.name] = role;\n });\n }\n return roles;\n }\n\n static convertRoleChangeRequest(req: SDKHMSRoleChangeRequest): HMSRoleChangeStoreRequest {\n return {\n requestedBy: req.requestedBy?.peerId,\n roleName: req.role.name,\n token: req.token,\n };\n }\n\n static convertException(sdkException: sdkTypes.HMSException): HMSException {\n return {\n code: sdkException.code,\n action: sdkException.action,\n name: sdkException.name,\n message: sdkException.message,\n description: sdkException.description,\n isTerminal: sdkException.isTerminal,\n nativeError: sdkException.nativeError,\n timestamp: new Date(),\n };\n }\n\n static convertDeviceChangeUpdate(sdkDeviceChangeEvent: sdkTypes.HMSDeviceChangeEvent): HMSDeviceChangeEvent {\n const convertedData: HMSDeviceChangeEvent = {\n devices: sdkDeviceChangeEvent.devices,\n selection: sdkDeviceChangeEvent.selection,\n type: sdkDeviceChangeEvent.type,\n };\n if (sdkDeviceChangeEvent.error) {\n convertedData.error = this.convertException(sdkDeviceChangeEvent.error);\n }\n return convertedData;\n }\n\n static convertPlaylist(playlistManager: sdkTypes.HMSPlaylistManager) {\n const audioPlaylist = this.getConvertedPlaylistType(playlistManager, HMSPlaylistType.audio);\n const videoPlaylist = this.getConvertedPlaylistType(playlistManager, HMSPlaylistType.video);\n return { audio: audioPlaylist, video: videoPlaylist };\n }\n\n static convertPlaylistItem<T>(\n playlistManager: sdkTypes.HMSPlaylistManager,\n playlistItem: sdkTypes.HMSPlaylistItem<T>,\n ): HMSPlaylistItem<T> {\n const type = playlistItem.type;\n const currentSelection = playlistManager.getCurrentSelection(type);\n const isPlaying = playlistManager.isPlaying(type);\n const isSelected = playlistItem.url === currentSelection?.url;\n\n return {\n ...playlistItem,\n type: playlistItem.type as HMSPlaylistType,\n selected: isSelected,\n playing: isSelected && isPlaying,\n };\n }\n\n private static getConvertedPlaylistType(playlistManager: sdkTypes.HMSPlaylistManager, type: HMSPlaylistType) {\n const convertedPlaylist: Record<string, HMSPlaylistItem<any>> = {};\n const currentSelection = playlistManager.getCurrentSelection(type);\n const progress = playlistManager.getCurrentProgress(type);\n const volume = playlistManager.getVolume(type);\n const list = playlistManager.getList(type);\n const currentIndex = playlistManager.getCurrentIndex(type);\n\n playlistManager.getList(type).forEach(playlistItem => {\n convertedPlaylist[playlistItem.id] = SDKToHMS.convertPlaylistItem(playlistManager, playlistItem);\n });\n return {\n list: convertedPlaylist,\n selection: {\n id: currentSelection?.id,\n hasPrevious: currentIndex > 0,\n hasNext: currentIndex < list.length - 1,\n },\n progress,\n volume,\n currentTime: playlistManager.getCurrentTime(type),\n playbackRate: playlistManager.getPlaybackRate(type),\n };\n }\n\n static convertRecordingStreamingState(\n recording?: sdkTypes.HMSRecording,\n rtmp?: sdkTypes.HMSRTMP,\n hls?: sdkTypes.HMSHLS,\n ): { recording: sdkTypes.HMSRecording; rtmp: sdkTypes.HMSRTMP; hls: sdkTypes.HMSHLS } {\n return {\n recording: {\n browser: {\n running: false,\n ...recording?.browser,\n },\n server: {\n running: false,\n ...recording?.server,\n },\n hls: { running: false, ...recording?.hls },\n },\n rtmp: { running: false, ...rtmp },\n hls: {\n variants: hls?.variants?.map(variant => variant) || [],\n running: !!hls?.running,\n error: hls?.error,\n },\n };\n }\n}\n", "import {\n HMSPollCreateParams,\n HMSPollQuestionCreateParams,\n HMSPollQuestionResponseCreateParams,\n HMSSdk,\n} from '@100mslive/hms-video';\nimport { IHMSInteractivityCenter } from '../schema';\n\nexport class HMSInteractivityCenter implements IHMSInteractivityCenter {\n constructor(private sdk: HMSSdk) {}\n\n private get sdkInteractivityCenter() {\n return this.sdk.getInteractivityCenter();\n }\n\n createPoll(poll: HMSPollCreateParams) {\n return this.sdkInteractivityCenter.createPoll(poll);\n }\n\n startPoll(poll: string | HMSPollCreateParams) {\n return this.sdkInteractivityCenter.startPoll(poll);\n }\n\n stopPoll(poll: string) {\n return this.sdkInteractivityCenter.stopPoll(poll);\n }\n\n addQuestionsToPoll(poll: string, questions: HMSPollQuestionCreateParams[]) {\n return this.sdkInteractivityCenter.addQuestionsToPoll(poll, questions);\n }\n\n addResponsesToPoll(pollID: string, responses: HMSPollQuestionResponseCreateParams[]) {\n return this.sdkInteractivityCenter.addResponsesToPoll(pollID, responses);\n }\n}\n", "import { HMSPlaylistManager } from './sdkTypes';\nimport { HMSLogger } from '../../common/ui-logger';\nimport { IHMSStore } from '../IHMSStore';\nimport { HMSGenericTypes, HMSPlaylistItem, HMSPlaylistType, IHMSPlaylistActions } from '../schema';\nimport { selectAudioPlaylist, selectVideoPlaylist } from '../selectors';\n\nexport class HMSPlaylist<T extends HMSGenericTypes> implements IHMSPlaylistActions {\n private type: HMSPlaylistType;\n constructor(\n private playlistManager: HMSPlaylistManager,\n type: HMSPlaylistType,\n private syncPlaylistState: (action: string) => void,\n private store: IHMSStore<T>,\n ) {\n this.type = type;\n }\n\n async play(id: string): Promise<void> {\n if (!id) {\n HMSLogger.w('Please pass id to play');\n return;\n }\n await this.playlistManager.setEnabled(true, { id, type: this.type });\n }\n\n async pause(): Promise<void> {\n const selector = this.type === HMSPlaylistType.audio ? selectAudioPlaylist : selectVideoPlaylist;\n const selection = this.store.getState(selector.selection);\n if (!selection.id) {\n HMSLogger.w('No item is currently playing to pause');\n return;\n }\n await this.playlistManager.setEnabled(false, { id: selection.id, type: this.type });\n }\n\n async playNext(): Promise<void> {\n await this.playlistManager.playNext(this.type);\n }\n\n async playPrevious(): Promise<void> {\n await this.playlistManager.playPrevious(this.type);\n }\n\n seek(seekValue: number): void {\n this.playlistManager.seek(seekValue, this.type);\n this.syncPlaylistState(`seekOn${this.type}Playlist`);\n }\n\n seekTo(seekValue: number): void {\n this.playlistManager.seekTo(seekValue, this.type);\n this.syncPlaylistState(`seekToOn${this.type}Playlist`);\n }\n\n setVolume(volume: number): void {\n this.playlistManager.setVolume(volume, this.type);\n this.syncPlaylistState(`setVolumeOn${this.type}Playlist`);\n }\n\n setList<T>(list: HMSPlaylistItem<T>[]): void {\n this.playlistManager.setList(list);\n this.syncPlaylistState(`setListOn${this.type}Playlist`);\n }\n\n async stop(): Promise<void> {\n await this.playlistManager.stop(this.type);\n this.syncPlaylistState(`stop${this.type}Playlist`);\n }\n\n setIsAutoplayOn(autoplay: boolean) {\n this.playlistManager.setIsAutoplayOn(this.type, autoplay);\n }\n\n setPlaybackRate(playbackRate: number) {\n this.playlistManager.setPlaybackRate(this.type, playbackRate);\n this.syncPlaylistState(`set${this.type}PlaybackRate`);\n }\n\n async removeItem(id: string) {\n const removed = await this.playlistManager.removeItem(id, this.type);\n if (removed) {\n this.syncPlaylistState(`remove${this.type}PlaylistItem`);\n }\n return removed;\n }\n\n async clearList() {\n await this.playlistManager.clearList(this.type);\n this.syncPlaylistState(`clear${this.type}Playlist`);\n }\n}\n", "import { HMSSdk, SessionStoreUpdate } from '@100mslive/hms-video';\nimport { IHMSSessionStoreActions } from '../schema';\n\nexport class HMSSessionStore<T extends Record<string, any>> implements IHMSSessionStoreActions<T> {\n constructor(\n private sdk: HMSSdk,\n private setLocally: (updates: SessionStoreUpdate | SessionStoreUpdate[], actionName?: string) => void,\n ) {}\n\n private get sdkSessionStore() {\n return this.sdk.getSessionStore();\n }\n\n async set<K extends keyof T>(key: K, value?: T[K]) {\n const { value: latestValue } = await this.sdkSessionStore.set(String(key), value);\n this.setLocally({ key: key as string, value: latestValue });\n }\n\n async observe(keys: keyof T | Array<keyof T>) {\n const stringifiedKeys: string[] = Array.isArray(keys) ? keys.map(key => String(key)) : [String(keys)];\n await this.sdkSessionStore.observe(stringifiedKeys);\n }\n\n async unobserve(keys: keyof T | Array<keyof T>) {\n const stringifiedKeys: string[] = Array.isArray(keys) ? keys.map(key => String(key)) : [String(keys)];\n await this.sdkSessionStore.unobserve(stringifiedKeys);\n }\n}\n", "import { HMSLogger } from '../../common/ui-logger';\nimport { HMSGenericTypes, HMSPeer, IHMSStore, selectIsConnectedToRoom, selectPeers } from '../../core';\nimport { IHMSActions } from '../../core/IHMSActions';\n\n/**\n * Log data of audio level and speaker speaking periodically to beam for transcript\n * diarization.\n */\nexport class BeamSpeakerLabelsLogger<T extends HMSGenericTypes> {\n private audioContext?: AudioContext;\n private readonly intervalMs: number;\n private shouldMonitor: boolean;\n private hasStarted: boolean;\n private unsubs: any[];\n private readonly analysers: Record<string, AnalyserNode>;\n private readonly store: IHMSStore<T>;\n private actions: IHMSActions<T>;\n constructor(store: IHMSStore<T>, actions: IHMSActions<T>) {\n this.intervalMs = 100;\n this.shouldMonitor = false;\n this.hasStarted = false;\n this.unsubs = [];\n this.analysers = {};\n this.store = store;\n this.actions = actions;\n }\n\n async start() {\n if (this.hasStarted) {\n return;\n }\n this.hasStarted = true;\n HMSLogger.d('starting audio level monitor for remote peers', this.store);\n const isConnected = this.store.getState(selectIsConnectedToRoom);\n HMSLogger.d('starting audio levels is connected to room', isConnected);\n if (isConnected) {\n await this.monitorAudioLevels();\n }\n const unsub = this.store.subscribe(this.monitorAudioLevels.bind(this), selectIsConnectedToRoom);\n this.unsubs.push(unsub);\n }\n\n async stop() {\n if (!this.hasStarted) {\n return;\n }\n this.hasStarted = false;\n this.shouldMonitor = false;\n this.unsubs.forEach(unsub => unsub());\n HMSLogger.d('stopped audio level monitor for remote peers');\n }\n\n async monitorAudioLevels() {\n const isConnected = this.store.getState(selectIsConnectedToRoom);\n if (!isConnected) {\n if (this.shouldMonitor) {\n HMSLogger.i('room no longer connected, stopping audio level monitoring for remote');\n this.shouldMonitor = false;\n }\n return;\n }\n if (this.shouldMonitor) {\n return;\n }\n HMSLogger.i('monitoring audio levels');\n this.shouldMonitor = true;\n const loop = () => {\n if (this.shouldMonitor) {\n this.logAllPeersAudioLevels();\n setTimeout(loop, this.intervalMs);\n } else {\n HMSLogger.i('stopped monitoring audio levels');\n }\n };\n setTimeout(loop, 1000);\n }\n\n // eslint-disable-next-line complexity\n async logAllPeersAudioLevels() {\n if (!window.__triggerBeamEvent__) {\n return;\n }\n // optimise this to selectTracks instead of selecting peers\n const allPeers = this.store.getState(selectPeers);\n const peers = allPeers.filter(peer => !!peer.audioTrack);\n const peerAudioLevels = [];\n for (const peer of peers) {\n // @ts-ignore\n const sdkTrack = this.actions.hmsSDKTracks[peer.audioTrack];\n const nativeStream: MediaStream = sdkTrack?.stream?.nativeStream;\n if (!peer.joinedAt) {\n continue;\n }\n if (nativeStream) {\n const peerLevel = await this.getAudioLevel(peer, nativeStream);\n if (peerLevel.level > 0) {\n peerAudioLevels.push(peerLevel);\n }\n }\n }\n if (peerAudioLevels.length > 0) {\n const payload = {\n event: 'app-audio-level',\n data: peerAudioLevels,\n };\n // HMSLogger.d('logging audio levels', peerAudioLevels);\n window.__triggerBeamEvent__(JSON.stringify(payload));\n }\n }\n\n async getAudioLevel(peer: HMSPeer, stream: MediaStream) {\n if (!this.analysers[stream.id]) {\n this.analysers[stream.id] = this.createAnalyserNode(stream);\n }\n const analyserNode = this.analysers[stream.id];\n const level = this.calculateAudioLevel(analyserNode);\n return {\n peerId: peer.id,\n peerName: peer.name,\n level,\n };\n }\n\n createAnalyserNode(stream: MediaStream) {\n if (!this.audioContext) {\n this.audioContext = new AudioContext();\n }\n const analyser = this.audioContext.createAnalyser();\n const source = this.audioContext.createMediaStreamSource(stream);\n source.connect(analyser);\n return analyser;\n }\n\n calculateAudioLevel(analyserNode: AnalyserNode) {\n const data = new Uint8Array(analyserNode.fftSize);\n analyserNode.getByteTimeDomainData(data);\n const lowest = 0.009;\n let max = lowest;\n for (const frequency of data) {\n max = Math.max(max, (frequency - 128) / 128);\n }\n const normalized = (Math.log(lowest) - Math.log(max)) / Math.log(lowest);\n const percent = Math.ceil(Math.min(Math.max(normalized * 100, 0), 100));\n return percent;\n }\n}\n", "import { Subscribe } from 'zustand/vanilla';\nimport { HMSSdk } from '@100mslive/hms-video';\nimport { subscribeToSdkWebrtcStats } from './webrtc-stats-store';\nimport { storeNameWithTabTitle } from '../../common/storeName';\nimport { HMSReactiveStore } from '../hmsSDKStore/HMSReactiveStore';\nimport { GetState, IHMSStatsStore, IHMSStatsStoreReadOnly, IHMSStore } from '../IHMSStore';\nimport { createDefaultStatsStore, HMSStatsStore } from '../schema';\nimport { selectRoomState } from '../selectors';\n\n/**\n * @internal\n */\nexport class HMSStats implements IHMSStatsStoreReadOnly {\n readonly getState: GetState<HMSStatsStore>;\n readonly subscribe: Subscribe<HMSStatsStore>;\n readonly getPublishPeerConnection: () => Promise<RTCPeerConnection | undefined>;\n readonly getSubscribePeerConnection: () => Promise<RTCPeerConnection | undefined>;\n private readonly store: IHMSStatsStore;\n\n constructor(private hmsStore: IHMSStore, private sdk?: HMSSdk) {\n this.store = HMSReactiveStore.createNewHMSStore<HMSStatsStore>(\n storeNameWithTabTitle('HMSStatsStore'),\n createDefaultStatsStore,\n );\n\n this.getState = this.store.getState;\n this.subscribe = this.store.subscribe;\n\n this.getPublishPeerConnection = () =>\n new Promise<RTCPeerConnection | undefined>(resolve => {\n if (this.hmsStore.getState(selectRoomState) === 'Connected') {\n resolve(this.sdk?.getWebrtcInternals()?.getPublishPeerConnection());\n } else {\n this.hmsStore.subscribe(roomState => {\n if (roomState === 'Connected') {\n resolve(this.sdk?.getWebrtcInternals()?.getPublishPeerConnection());\n }\n }, selectRoomState);\n }\n });\n\n this.getSubscribePeerConnection = () =>\n new Promise<RTCPeerConnection | undefined>(resolve => {\n if (this.hmsStore.getState(selectRoomState) === 'Connected') {\n resolve(this.sdk?.getWebrtcInternals()?.getSubscribePeerConnection());\n } else {\n this.hmsStore.subscribe(roomState => {\n if (roomState === 'Connected') {\n resolve(this.sdk?.getWebrtcInternals()?.getSubscribePeerConnection());\n }\n }, selectRoomState);\n }\n });\n\n if (!this.sdk) {\n return;\n }\n\n subscribeToSdkWebrtcStats(this.sdk, this.store, this.hmsStore);\n }\n}\n", "import { createSelector } from 'reselect';\nimport { HMSPreferredSimulcastLayer, RID, simulcastMapping } from '../hmsSDKStore/sdkTypes';\nimport { HMSPeerID, HMSStatsStore, HMSTrackID } from '../schema';\nimport { byIDCurry } from '../selectors/common';\n\nconst selectLocalPeerID = (store: HMSStatsStore) => store.localPeer.id;\nconst selectLocalAudioTrackID = (store: HMSStatsStore) => store.localPeer.audioTrack;\nconst selectLocalVideoTrackID = (store: HMSStatsStore) => store.localPeer.videoTrack;\nconst selectPeerID = (_store: HMSStatsStore, peerID: HMSPeerID | undefined) => peerID;\nconst selectTrackID = (_store: HMSStatsStore, trackID: HMSTrackID | undefined) => trackID;\nconst selectRemoteTrackStatsMap = (store: HMSStatsStore) => store.remoteTrackStats;\nconst selectPeerStatsMap = (store: HMSStatsStore) => store.peerStats;\nconst selectLocalTrackStatsMap = (store: HMSStatsStore) => store.localTrackStats;\n\n/**\n * Local peer stats selectors\n */\nconst localPeerStats = createSelector(\n [selectPeerStatsMap, selectLocalPeerID],\n (storePeerStats, localPeerID) => storePeerStats[localPeerID],\n);\n\n/**\n * The total number of packets lost during the call\n */\nconst packetsLost = createSelector(localPeerStats, localPeerStats => localPeerStats?.subscribe?.packetsLost);\n\nconst jitter = createSelector(localPeerStats, localPeerStats => localPeerStats?.subscribe?.jitter);\n\n/**\n * The bitrate at which all the local tracks are being published at\n */\nconst publishBitrate = createSelector(localPeerStats, localPeerStats => localPeerStats?.publish?.bitrate);\n\n/**\n * The bitrate at which all the remote tracks are being received at\n */\nconst subscribeBitrate = createSelector(localPeerStats, localPeerStats => localPeerStats?.subscribe?.bitrate);\n\n/**\n * The total bitrate available for publishing\n */\nconst availablePublishBitrate = createSelector(\n localPeerStats,\n localPeerStats => localPeerStats?.publish?.availableOutgoingBitrate,\n);\n\n/**\n * The total bitrate available for subscribing to remote peers\n */\nconst availableSubscribeBitrate = createSelector(\n localPeerStats,\n localPeerStats => localPeerStats?.subscribe?.availableIncomingBitrate,\n);\n\n/**\n * The total bytes sent by the local peer\n */\nconst totalBytesSent = createSelector(localPeerStats, localPeerStats => localPeerStats?.publish?.bytesSent);\n\n/**\n * The total bytes received by the local peer\n */\nconst totalBytesReceived = createSelector(localPeerStats, localPeerStats => localPeerStats?.subscribe?.bytesReceived);\n\n/**\n * By ID Selectors\n * To be used for remote tracks\n */\n\nconst selectPeerStatsByIDBare = createSelector([selectPeerStatsMap, selectPeerID], (storePeerStats, peerID) =>\n peerID ? storePeerStats[peerID] : undefined,\n);\n\nconst selectTrackStatsByIDBare = createSelector(\n [selectRemoteTrackStatsMap, selectTrackID],\n (storeTrackStats, trackID) => (trackID ? storeTrackStats[trackID] : undefined),\n);\n\nconst selectLocalTrackStatsByIDBare = createSelector(\n [selectLocalTrackStatsMap, selectTrackID],\n (storeLocalTrackStats, trackID) => (trackID ? storeLocalTrackStats[trackID] : undefined),\n);\n\n/**\n * Stats(bitrate, bytes sent/received, etc...) for a single peer given the peer ID\n */\nconst peerStatsByID = byIDCurry(selectPeerStatsByIDBare);\n\n/**\n * Stats(bitrate, bytes sent/received, framerate, FPS, etc...) for a remote track\n */\nconst trackStatsByID = byIDCurry(selectTrackStatsByIDBare);\n\n/**\n * Local track stats selectors\n */\n\nconst localAudioTrackStats = createSelector(\n [selectLocalTrackStatsMap, selectLocalAudioTrackID],\n (trackStats, trackID) => (trackID ? trackStats[trackID]?.[0] : undefined),\n);\n\nconst localAudioTrackStatsByID = byIDCurry(\n createSelector(selectLocalTrackStatsByIDBare, trackStats => trackStats?.[0]),\n);\n\nconst localVideoTrackStats = createSelector(\n [selectLocalTrackStatsMap, selectLocalVideoTrackID],\n (trackStats, trackID) => (trackID ? trackStats[trackID]?.[0] : undefined),\n);\n\nconst localVideoTrackStatsByID = byIDCurry(createSelector(selectLocalTrackStatsByIDBare, trackStats => trackStats));\n\nconst localVideoTrackStatsByLayer = (layer?: HMSPreferredSimulcastLayer) =>\n byIDCurry(\n createSelector(selectLocalTrackStatsByIDBare, stats => {\n const rid = (Object.keys(simulcastMapping) as RID[]).find(key => simulcastMapping[key] === layer);\n return layer ? stats?.find(stat => stat.rid === rid) || stats?.[0] : stats?.[0];\n }),\n );\n\nexport const selectHMSStats = {\n localPeerStats,\n packetsLost,\n jitter,\n publishBitrate,\n subscribeBitrate,\n availablePublishBitrate,\n availableSubscribeBitrate,\n totalBytesSent,\n totalBytesReceived,\n peerStatsByID,\n trackStatsByID,\n localAudioTrackStatsByID,\n localVideoTrackStatsByID,\n localVideoTrackStatsByLayer,\n localAudioTrackStats,\n localVideoTrackStats,\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["require_package", "__commonJSMin", "exports", "module", "src_exports", "__export", "HMSMessageType", "HMSNotificationSeverity", "HMSNotificationTypes", "HMSPlaylistType", "HMSReactiveStore", "HMSRoomState", "HMSStats", "createDefaultStatsStore", "createDefaultStoreState", "selectAppData", "selectAppDataByPath", "selectAudioPlaylist", "selectAudioPlaylistTrackByPeerID", "selectAudioTrackByID", "selectAudioTrackByPeerID", "selectAudioTrackVolume", "selectAudioVolumeByPeerID", "selectAuxiliaryAudioByPeerID", "selectAuxiliaryTracksByPeerID", "selectAvailableRoleNames", "selectBroadcastMessages", "selectBroadcastMessagesUnreadCount", "selectCameraStreamByPeerID", "selectConnectionQualities", "selectConnectionQualityByPeerID", "selectDegradedTracks", "selectDevices", "selectDidIJoinWithin", "selectDominantSpeaker", "selectErrors", "selectFullAppData", "selectHLSState", "selectHMSMessages", "selectHMSMessagesCount", "selectHMSStats", "selectHandRaisedPeers", "selectHasPeerHandRaised", "selectIsAllowedToPreviewMedia", "selectIsAllowedToPublish", "selectIsAllowedToSubscribe", "selectIsAudioLocallyMuted", "selectIsConnectedToRoom", "selectIsInPreview", "selectIsLargeRoom", "selectIsLocalAudioEnabled", "selectIsLocalAudioPluginPresent", "selectIsLocalScreenShared", "selectIsLocalVideoDisplayEnabled", "selectIsLocalVideoEnabled", "selectIsLocalVideoPluginPresent", "selectIsLocallyMutedByPeerID", "selectIsPeerAudioEnabled", "selectIsPeerVideoEnabled", "selectIsRoleAllowedToPublish", "selectIsScreenShareLocallyMutedByPeerID", "selectIsSomeoneScreenSharing", "selectLocalAudioTrackID", "selectLocalMediaSettings", "selectLocalPeer", "selectLocalPeerID", "selectLocalPeerName", "selectLocalPeerRole", "selectLocalPeerRoleName", "selectLocalTrackIDs", "selectLocalVideoTrackID", "selectMessageByMessageID", "selectMessageIDsInOrder", "selectMessagesByPeerID", "selectMessagesByRole", "selectMessagesMap", "selectMessagesUnreadCountByPeerID", "selectMessagesUnreadCountByRole", "selectPeerAudioByID", "selectPeerByCondition", "selectPeerByID", "selectPeerCount", "selectPeerMetadata", "selectPeerName", "selectPeerNameByID", "selectPeerScreenSharing", "selectPeerSharingAudio", "selectPeerSharingAudioPlaylist", "selectPeerSharingVideoPlaylist", "selectPeers", "selectPeersByCondition", "selectPeersByRole", "selectPeersByRoles", "selectPeersMap", "selectPeersScreenSharing", "selectPeersWithAudioStatus", "selectPermissions", "selectPollByID", "selectPolls", "selectPollsMap", "selectPreviewRole", "selectPreviewRoleName", "selectRTMPState", "selectRecentError", "selectRecordingState", "selectRemotePeers", "selectRoleByRoleName", "selectRoleChangeRequest", "selectRolesMap", "selectRoom", "selectRoomID", "selectRoomStartTime", "selectRoomStarted", "selectRoomState", "selectScreenAudioTrackByID", "selectScreenShareAudioByPeerID", "selectScreenShareByPeerID", "selectScreenSharesByPeerId", "selectScreenVideoTrackByID", "selectScreenshareAudioVolumeByPeerID", "selectSessionId", "selectSessionMetadata", "selectSessionStore", "selectSimulcastLayerByTrack", "selectSpeakers", "selectTemplateAppData", "selectTrackAudioByID", "selectTrackByID", "selectTracksMap", "selectUnreadHMSMessagesCount", "selectVideoPlaylist", "selectVideoPlaylistAudioTrackByPeerID", "selectVideoPlaylistVideoTrackByPeerID", "selectVideoTrackByID", "selectVideoTrackByPeerID", "__toCommonJS", "HMSRoomState", "createDefaultStoreState", "createDefaultStatsStore", "HMSMessageType", "HMSNotificationSeverity", "HMSNotificationTypes", "HMSPlaylistType", "import_reselect", "getScreenSharesByPeer", "tracks", "peer", "videoTrack", "audioTrack", "trackID", "track", "isScreenShare", "isAudio", "isVideo", "isAudioPlaylist", "isVideoPlaylist", "isDegraded", "isTrackEnabled", "store", "isTrackDisplayEnabled", "isRoleAllowedToPublish", "role", "_a", "video", "audio", "screen", "selectRoom", "store", "selectErrors", "selectRecentError", "errors", "selectRoomID", "room", "selectPeersMap", "selectMessagesMap", "selectMessageIDsInOrder", "selectTracksMap", "selectLocalMediaSettings", "selectFullAppData", "selectDevices", "selectSpeakers", "selectConnectionQualities", "selectIsConnectedToRoom", "selectPeerCount", "isConnected", "selectHideLocalPeer", "selectPeers", "storePeers", "hideLocalPeer", "peerID", "selectTracks", "storeTracks", "selectLocalPeer", "peers", "selectLocalPeerID", "selectLocalPeerName", "peer", "selectLocalPeerRoleName", "selectLocalAudioTrackID", "selectLocalVideoTrackID", "selectLocalAuxiliaryTrackIDs", "selectLocalTrackIDs", "audioTrackID", "videoTrackID", "auxiliaryTrackIDs", "trackIDs", "selectRemotePeers", "p", "selectDominantSpeaker", "peersMap", "speakers", "speakersInOrder", "s1", "s2", "_a", "_b", "s1Level", "selectIsLocalAudioEnabled", "localPeer", "isTrackEnabled", "selectIsLocalVideoEnabled", "selectIsLocalVideoDisplayEnabled", "isTrackDisplayEnabled", "selectIsLocalScreenShared", "tracksMap", "video", "audio", "getScreenSharesByPeer", "selectPeerScreenSharing", "screensharePeer", "selectIsSomeoneScreenSharing", "selectPeerSharingAudio", "selectPeersScreenSharing", "videoPeers", "audioPeers", "selectPeerSharingVideoPlaylist", "trackId", "track", "isVideoPlaylist", "isVideo", "selectPeerSharingAudioPlaylist", "isAudioPlaylist", "selectDegradedTracks", "tracks", "isDegraded", "selectHMSMessagesCount", "messageIDs", "selectUnreadHMSMessagesCount", "messages", "m", "selectHMSMessages", "msgIDs", "msgMap", "msgId", "selectRoomState", "selectIsInPreview", "roomState", "selectRoomStarted", "selectRolesMap", "selectAvailableRoleNames", "rolesMap", "selectLocalPeerRole", "selectPreviewRoleName", "selectPreviewRole", "roleName", "selectIsAllowedToSubscribe", "role", "selectPermissions", "selectRecordingState", "selectRTMPState", "selectHLSState", "selectSessionId", "selectRoomStartTime", "selectIsLargeRoom", "selectTemplateAppData", "selectSessionMetadata", "selectPollsMap", "selectPolls", "selectHandRaisedPeers", "import_reselect", "selectPlaylistMap", "type", "store", "selectPlaylistSelection", "selectPlaylistProgress", "selectPlaylistCurrentTime", "selectPlaylistPlaybackRate", "selectPlaylistVolume", "selectPlaylist", "storePlaylist", "selectPlaylistSelectedItem", "currentSelection", "selectAudioPlaylist", "selectVideoPlaylist", "import_reselect", "byIDCurry", "selector", "id", "store", "import_hms_video", "HMS_STORE_TAG", "HMSLogger", "tag", "data", "mark", "level", "entry", "error", "selectPeerID", "_store", "peerID", "selectTrackID", "trackID", "selectRoleName", "roleName", "selectAppDataKey", "key", "selectPollID", "pollID", "selectPeerByIDBare", "selectPeersMap", "storePeers", "selectTrackByIDBare", "selectTracksMap", "storeTracks", "selectVideoTrackByIDBare", "track", "selectAudioTrackByIDBare", "selectScreenAudioTrackByIDBare", "selectScreenVideoTrackByIDBare", "selectPollByIDBare", "selectPollsMap", "storePolls", "selectPeerByID", "byIDCurry", "selectAppData", "selectFullAppData", "appData", "selectSessionStore", "store", "selectAppDataByPath", "keys", "value", "selectPeerNameByID", "peer", "selectTrackByID", "selectVideoTrackByID", "selectAudioTrackByID", "selectScreenAudioTrackByID", "selectScreenVideoTrackByID", "selectVideoTrackByPeerID", "selectAudioTrackByPeerID", "selectCameraStreamByPeerID", "selectAuxiliaryTracksByPeerID", "selectSpeakerByTrackID", "selectTrackAudioByID", "speaker", "selectSpeakerByPeerID", "peerAudioTrack", "selectPeerAudioByID", "selectConnectionQualityByPeerID", "selectAuxiliaryAudioByPeerID", "isAudio", "selectVideoPlaylistVideoTrackByPeerID", "tracks", "isVideoPlaylist", "isVideo", "selectVideoPlaylistAudioTrackByPeerID", "selectAudioPlaylistTrackByPeerID", "isAudioPlaylist", "selectScreenSharesByPeerId", "getScreenSharesByPeer", "selectScreenShareByPeerID", "id", "screenshare", "selectScreenShareAudioByPeerID", "selectIsPeerAudioEnabled", "isTrackEnabled", "selectIsPeerVideoEnabled", "selectIsAudioLocallyMuted", "selectIsLocallyMutedByPeerID", "selectIsScreenShareLocallyMutedByPeerID", "selectAudioTrackVolume", "HMSLogger", "selectAudioVolumeByPeerID", "selectScreenshareAudioVolumeByPeerID", "selectSimulcastLayerByTrack", "selectMessagesByPeerIDInternal", "selectHMSMessages", "selectLocalPeerID", "messages", "localPeerID", "message", "_a", "selectMessagesByRoleInternal", "_b", "selectBroadcastMessages", "selectUnreadMessageCountByRole", "m", "selectUnreadMessageCountByPeerID", "selectBroadcastMessagesUnreadCount", "selectMessagesByPeerID", "selectMessagesByRole", "selectMessagesUnreadCountByRole", "selectMessagesUnreadCountByPeerID", "selectPeersByRole", "role", "selectPeers", "peers", "p", "selectPeersByRoles", "roles", "selectPeerMetadata", "peerId", "error", "selectHasPeerHandRaised", "selectPeerName", "selectPollByID", "selectMessageByMessageID", "selectMessagesMap", "import_reselect", "selectPeersWithAudioStatus", "selectPeersMap", "selectTracksMap", "peersMap", "tracksMap", "peer", "_a", "selectRoleChangeStoreRequest", "store", "selectRoleChangeRequest", "selectRolesMap", "request", "rolesMap", "selectIsAllowedToPublish", "selectLocalPeerRole", "role", "isRoleAllowedToPublish", "selectIsAllowedToPreviewMedia", "selectPreviewRole", "import_reselect", "selectRoleByRoleName", "roleName", "selectRolesMap", "rolesMap", "selectIsRoleAllowedToPublish", "role", "isRoleAllowedToPublish", "selectLocalVideoPlugins", "selectLocalVideoTrackID", "selectTracksMap", "trackID", "tracksMap", "track", "selectLocalAudioPlugins", "selectLocalAudioTrackID", "selectIsLocalVideoPluginPresent", "pluginName", "plugins", "selectIsLocalAudioPluginPresent", "selectPeerByCondition", "predicate", "selectPeers", "peers", "selectPeersByCondition", "selectDidIJoinWithin", "timeMs", "selectRoom", "room", "mergeNewPeersInDraft", "draftPeers", "newPeers", "peerIDs", "union", "peerID", "oldPeer", "newPeer", "isEntityUpdated", "areArraysEqual", "isEntityRemoved", "isEntityAdded", "mergeNewTracksInDraft", "draftTracks", "newTracks", "trackIDs", "trackID", "oldTrack", "newTrack", "mergeTrackArrayFields", "mergeNewPollsInDraft", "draftPolls", "newPolls", "pollIDs", "pollID", "oldPoll", "newPoll", "mergeNewIndividualStatsInDraft", "draftStats", "newStats", "IDs", "oldStat", "newStat", "mergeLocalTrackStats", "tracks", "trackMap", "acc", "track", "a", "b", "oldItem", "newItem", "arr1", "arr2", "i", "set", "elem", "subscribeToSdkWebrtcStats", "sdk", "webrtcStore", "store", "unsubscribe", "selectRoomState", "initAndSubscribeWebrtcStore", "roomState", "resetHMSStatsStore", "_a", "_b", "unsubLocalPeer", "updateLocalPeerInWebrtcStore", "unsubSdkStats", "stats", "updateWebrtcStoreStats", "unsubID", "unsubVideoTrackID", "unsubAudioTrackID", "selectLocalPeerID", "draft", "localPeerID", "selectLocalVideoTrackID", "videoTrackID", "selectLocalAudioTrackID", "audioTrackID", "hmsStore", "tracks", "selectTracksMap", "newTrackStats", "trackIDs", "trackID", "sdkTrackStats", "mergeNewIndividualStatsInDraft", "newPeerStats", "mergeLocalTrackStats", "reason", "createDefaultStatsStore", "import_hms_video", "storeNameWithTabTitle", "storeName", "import_immer", "import_shallow", "import_vanilla", "import_hms_video", "import_eventemitter2", "PEER_NOTIFICATION_TYPES", "TRACK_NOTIFICATION_TYPES", "POLL_NOTIFICATION_TYPES", "HMS_NOTIFICATION_EVENT", "HMSNotifications", "store", "cb", "type", "eventCallback", "notification", "matchesType", "EventEmitter", "HMSNotificationTypes", "item", "request", "_a", "peerName", "peers", "peer", "hmsPeer", "selectPeerByID", "notificationType", "PEER_NOTIFICATION_TYPES", "trackID", "hmsTrack", "selectTrackByID", "TRACK_NOTIFICATION_TYPES", "message", "error", "pollID", "POLL_NOTIFICATION_TYPES", "poll", "selectPollByID", "data", "severity", "import_hms_video", "import_hms_video", "isRemoteTrack", "track", "import_hms_video", "SDKToHMS", "_SDKToHMS", "sdkPeer", "_a", "_b", "_c", "track", "sdkTrack", "peerId", "mediaSettings", "SDKHMSRemoteAudioTrack", "SDKHMSLocalVideoTrack", "SDKHMSLocalAudioTrack", "SDKHMSRemoteVideoTrack", "areArraysEqual", "newCaptureHandle", "sdkRoom", "sdkLocalPeerId", "recording", "rtmp", "hls", "sdkMessage", "_d", "_e", "_f", "_g", "role", "sdkRoles", "roles", "req", "sdkException", "sdkDeviceChangeEvent", "convertedData", "playlistManager", "audioPlaylist", "videoPlaylist", "playlistItem", "type", "currentSelection", "isPlaying", "isSelected", "__spreadProps", "__spreadValues", "convertedPlaylist", "progress", "volume", "list", "currentIndex", "variant", "HMSInteractivityCenter", "sdk", "poll", "questions", "pollID", "responses", "HMSPlaylist", "playlistManager", "type", "syncPlaylistState", "store", "id", "__async", "HMSLogger", "selector", "selectAudioPlaylist", "selectVideoPlaylist", "selection", "seekValue", "volume", "list", "autoplay", "playbackRate", "removed", "HMSSessionStore", "sdk", "setLocally", "key", "value", "__async", "latestValue", "keys", "stringifiedKeys", "BeamSpeakerLabelsLogger", "store", "actions", "__async", "HMSLogger", "isConnected", "selectIsConnectedToRoom", "unsub", "loop", "_a", "peers", "selectPeers", "peer", "peerAudioLevels", "sdkTrack", "nativeStream", "peerLevel", "payload", "stream", "analyserNode", "level", "analyser", "data", "lowest", "max", "frequency", "normalized", "HMSSDKActions", "store", "sdk", "notificationManager", "type", "progress", "draftStore", "action", "SDKToHMS", "sdkPeer", "peer", "selectPeerByID", "actionName", "PEER_NOTIFICATION_TYPES", "hmsPeer", "storePeer", "isEntityUpdated", "areArraysEqual", "peerID", "fn", "name", "HMSSessionStore", "HMSInteractivityCenter", "__async", "value", "trackId", "deviceId", "layer", "_a", "track", "SDKHMSRemoteVideoTrack", "HMSLogger", "selectVideoTrackByID", "tokenRequest", "tokenRequestOptions", "config", "roomState", "selectRoomState", "err", "isConnectedToRoom", "selectIsConnectedToRoom", "notifyServer", "currentRoomState", "enabled", "error", "trackID", "selectLocalAudioTrackID", "selectLocalVideoTrackID", "settings", "sdkTrack", "message", "sdkMessage", "roles", "storeRoles", "selectRolesMap", "hmsRoles", "roleName", "messageInput", "hmsMessage", "readStatus", "messageId", "id", "videoElement", "resolve", "unsub", "selectIsLocalVideoEnabled", "plugin", "pluginFrameRate", "result", "forPeerId", "toRole", "force", "rolesToBeChanged", "role", "request", "sdkRequest", "peerId", "options", "iterator", "appData", "key", "merge", "isValueObject", "newAppData", "lock", "reason", "permissions", "selectPermissions", "localPeerId", "params", "metadataList", "metadata", "isRemoteTrack", "rolesMap", "level", "frameworkInfo", "msgTypes", "replace", "msgType", "BeamSpeakerLabelsLogger", "createDefaultStoreState", "requestedBy", "__spreadProps", "__spreadValues", "event", "devices", "localPeer", "selectLocalPeer", "sdkLocalPeer", "notification", "quality", "updates", "actionType", "polls", "POLL_NOTIFICATION_TYPES", "pollsObject", "acc", "poll", "question", "_b", "option", "response", "mergeNewPollsInDraft", "selectIsLocalScreenShared", "newHmsPeers", "newHmsPeerIDs", "newHmsTracks", "newHmsSDkTracks", "newMediaSettings", "newNetworkQuality", "newPreview", "sdkPeers", "sdkTracks", "hmsTrack", "recording", "rtmp", "hls", "draftPeers", "draftTracks", "mergeNewPeersInDraft", "mergeNewTracksInDraft", "sdkRoom", "playlistManager", "HMSPlaylist", "item", "room", "storePeers", "selectPeersMap", "newPeerIds", "hmsPeers", "TRACK_NOTIFICATION_TYPES", "storeTrack", "mergeTrackArrayFields", "sdkSpeakers", "trackIDAudioLevelMap", "sdkSpeaker", "speakerEntries", "speaker", "newQualities", "sdkUpdate", "storeTrackID", "selectTrackByID", "tracks", "tracksMap", "selectTracksMap", "sdkError", "sdkException", "SDKHMSException", "auxiliaryIndex", "selectLocalMediaSettings", "audioTrack", "videoTrack", "hmsLocalPeer", "SDKHMSAudioTrack", "displayEnabled", "selectIsLocalVideoDisplayEnabled", "actuallyEnabled", "inconsistency", "sdkTrackID", "toRemove", "index", "req", "selectLocalTrackIDs", "selectIsInPreview", "updatesList", "update", "HMSReactiveStore", "_HMSReactiveStore", "hmsStore", "hmsActions", "hmsNotifications", "HMSStats", "storeNameWithTabTitle", "createDefaultStoreState", "HMSNotifications", "HMSSDKActions", "storeName", "defaultCreatorFn", "create", "savedSetState", "partial", "nextState", "prevGetState", "selector", "namedSetState", "__spreadProps", "__spreadValues", "store", "prevSubscribe", "listener", "equalityFn", "shallow", "api", "prefix", "extension", "e", "fn", "devtools", "action", "actionName", "message", "_a", "_b", "_c", "_d", "actions", "state", "index", "HMSStats", "hmsStore", "sdk", "HMSReactiveStore", "storeNameWithTabTitle", "createDefaultStatsStore", "resolve", "_a", "_b", "selectRoomState", "roomState", "subscribeToSdkWebrtcStats", "import_reselect", "selectLocalPeerID", "store", "selectLocalAudioTrackID", "selectLocalVideoTrackID", "selectPeerID", "_store", "peerID", "selectTrackID", "trackID", "selectRemoteTrackStatsMap", "selectPeerStatsMap", "selectLocalTrackStatsMap", "localPeerStats", "storePeerStats", "localPeerID", "packetsLost", "_a", "jitter", "publishBitrate", "subscribeBitrate", "availablePublishBitrate", "availableSubscribeBitrate", "totalBytesSent", "totalBytesReceived", "selectPeerStatsByIDBare", "selectTrackStatsByIDBare", "storeTrackStats", "selectLocalTrackStatsByIDBare", "storeLocalTrackStats", "peerStatsByID", "byIDCurry", "trackStatsByID", "localAudioTrackStats", "trackStats", "localAudioTrackStatsByID", "localVideoTrackStats", "localVideoTrackStatsByID", "localVideoTrackStatsByLayer", "layer", "stats", "rid", "key", "stat", "selectHMSStats"]
7
7
  }