UNPKG

@100mslive/hms-video-store

Version:

@100mslive Core SDK which abstracts the complexities of webRTC while providing a reactive store for data management with a unidirectional data flow

221 lines (201 loc) 6.92 kB
import { EventEmitter2 as EventEmitter } from 'eventemitter2'; import { PEER_NOTIFICATION_TYPES, POLL_NOTIFICATION_TYPES, TRACK_NOTIFICATION_TYPES, TRANSCRIPTION_NOTIFICATION_TYPES, } from './common/mapping'; import { IHMSStore } from '../IHMSStore'; import * as sdkTypes from '../internal'; import { HMSChangeMultiTrackStateRequest, HMSChangeTrackStateRequest, HMSDeviceChangeEvent, HMSException, HMSGenericTypes, HMSLeaveRoomRequest, HMSMessage, HMSNotification, HMSNotificationSeverity, HMSNotificationTypes, HMSPeer, HMSPlaylistItem, HMSTrack, HMSTrackID, } from '../schema'; import { HMSNotificationCallback, HMSNotificationInCallback, HMSNotificationTypeParam, IHMSNotifications, } from '../schema/notification'; import { selectPeerByID, selectPollByID, selectTrackByID } from '../selectors'; const HMS_NOTIFICATION_EVENT = 'hmsNotification'; export class HMSNotifications<T extends HMSGenericTypes = { sessionStore: Record<string, any> }> implements IHMSNotifications { private id = 0; private eventEmitter: EventEmitter; private store: IHMSStore<T>; constructor(store: IHMSStore<T>) { this.store = store; this.eventEmitter = new EventEmitter({ maxListeners: Object.keys(HMSNotificationTypes).length }); } onNotification = <T extends HMSNotificationTypeParam>(cb: HMSNotificationCallback<T>, type?: T) => { const eventCallback = (notification: HMSNotificationInCallback<T>) => { if (type) { let matchesType: boolean; if (Array.isArray(type)) { matchesType = type.includes(notification.type as HMSNotificationTypes); } else { matchesType = type === notification.type; } if (!matchesType) { return; } } cb(notification); }; this.eventEmitter.addListener(HMS_NOTIFICATION_EVENT, eventCallback); return () => { this.eventEmitter.removeListener(HMS_NOTIFICATION_EVENT, eventCallback); }; }; sendPlaylistTrackEnded<T>(item: HMSPlaylistItem<T>): void { const notification = this.createNotification( HMSNotificationTypes.PLAYLIST_TRACK_ENDED, item, HMSNotificationSeverity.INFO, ); this.emitEvent(notification); } sendDeviceChange(request: HMSDeviceChangeEvent) { const notification = this.createNotification( HMSNotificationTypes.DEVICE_CHANGE_UPDATE, request, request.error ? HMSNotificationSeverity.ERROR : HMSNotificationSeverity.INFO, `Selected ${request.type} device - ${request.selection?.label}`, ); this.emitEvent(notification); } sendLeaveRoom(request: HMSLeaveRoomRequest) { const peerName = request.requestedBy?.name; const notification = this.createNotification( request.roomEnded || !peerName ? HMSNotificationTypes.ROOM_ENDED : HMSNotificationTypes.REMOVED_FROM_ROOM, request, HMSNotificationSeverity.INFO, `${request.roomEnded ? `Room ended` : 'Removed from room'} ${peerName ? `by ${peerName}` : ''}`, ); this.emitEvent(notification); } sendPeerList(peers: HMSPeer[]) { if (peers.length === 0) { return; } const notification = this.createNotification(HMSNotificationTypes.PEER_LIST, peers, HMSNotificationSeverity.INFO); this.emitEvent(notification); } sendPeerUpdate(type: sdkTypes.HMSPeerUpdate, peer: HMSPeer | null) { const hmsPeer = this.store.getState(selectPeerByID(peer?.id)) || peer; const notificationType = PEER_NOTIFICATION_TYPES[type]; if (notificationType && hmsPeer) { const notification = this.createNotification(notificationType, hmsPeer, HMSNotificationSeverity.INFO); this.emitEvent(notification); } } sendTrackUpdate(type: sdkTypes.HMSTrackUpdate, trackID: HMSTrackID) { const hmsTrack = this.store.getState(selectTrackByID(trackID)); const notificationType = TRACK_NOTIFICATION_TYPES[type]; if (notificationType) { const notification = this.createNotification(notificationType, hmsTrack, HMSNotificationSeverity.INFO); this.emitEvent(notification); } } sendMessageReceived(message: HMSMessage) { const notification = this.createNotification( HMSNotificationTypes.NEW_MESSAGE, message, HMSNotificationSeverity.INFO, ); this.emitEvent(notification); } sendError(error: HMSException) { const notification = this.createNotification(HMSNotificationTypes.ERROR, error, HMSNotificationSeverity.ERROR); this.emitEvent(notification); } sendReconnecting(error: HMSException) { const notification = this.createNotification( HMSNotificationTypes.RECONNECTING, error, HMSNotificationSeverity.ERROR, ); this.emitEvent(notification); } sendReconnected() { const notification = this.createNotification(HMSNotificationTypes.RECONNECTED, null, HMSNotificationSeverity.INFO); this.emitEvent(notification); } sendChangeTrackStateRequest(request: HMSChangeTrackStateRequest) { const notification = this.createNotification( HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST, request, HMSNotificationSeverity.INFO, ); this.emitEvent(notification); } sendChangeMultiTrackStateRequest(request: HMSChangeMultiTrackStateRequest) { const notification = this.createNotification( HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST, request, HMSNotificationSeverity.INFO, ); this.emitEvent(notification); } sendPollUpdate(type: sdkTypes.HMSPollsUpdate, pollID: string) { const notificationType = POLL_NOTIFICATION_TYPES[type]; const poll = this.store.getState(selectPollByID(pollID)); if (notificationType) { const notification = this.createNotification(notificationType, poll, HMSNotificationSeverity.INFO); this.emitEvent(notification); } } sendTranscriptionUpdate(transcriptions?: sdkTypes.HMSTranscriptionInfo[]) { const notification = this.createNotification( TRANSCRIPTION_NOTIFICATION_TYPES[sdkTypes.HMSRoomUpdate.TRANSCRIPTION_STATE_UPDATED], transcriptions, HMSNotificationSeverity.INFO, ); this.emitEvent(notification); } private emitEvent(notification: HMSNotification) { this.eventEmitter.emit(HMS_NOTIFICATION_EVENT, notification); } private createNotification<T>( type: HMSNotificationTypes, data?: | HMSPeer | HMSPeer[] | HMSTrack | HMSMessage | HMSException | HMSChangeTrackStateRequest | HMSChangeMultiTrackStateRequest | HMSLeaveRoomRequest | HMSDeviceChangeEvent | HMSPlaylistItem<T> | sdkTypes.HMSPoll | sdkTypes.HMSTranscriptionInfo[] | null, severity?: HMSNotificationSeverity, message = '', ): HMSNotification { this.id++; return { id: this.id, type, message, data, severity, } as HMSNotification; } }