@signalwire/js 3.12.0 → 3.12.1
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.
- package/dist/core/src/BaseComponent.d.ts +3 -1
- package/dist/core/src/BaseComponent.d.ts.map +1 -1
- package/dist/core/src/RPCMessages/VertoMessages.d.ts +8 -0
- package/dist/core/src/RPCMessages/VertoMessages.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +1 -0
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/redux/features/session/sessionSaga.d.ts.map +1 -1
- package/dist/core/src/redux/features/session/sessionSelectors.d.ts +1 -0
- package/dist/core/src/redux/features/session/sessionSelectors.d.ts.map +1 -1
- package/dist/core/src/redux/features/session/sessionSlice.d.ts +65 -0
- package/dist/core/src/redux/features/session/sessionSlice.d.ts.map +1 -1
- package/dist/core/src/redux/interfaces.d.ts +2 -1
- package/dist/core/src/redux/interfaces.d.ts.map +1 -1
- package/dist/core/src/redux/rootReducer.d.ts +16 -0
- package/dist/core/src/redux/rootReducer.d.ts.map +1 -1
- package/dist/core/src/rooms/RoomSessionPlayback.d.ts +3 -0
- package/dist/core/src/rooms/RoomSessionPlayback.d.ts.map +1 -1
- package/dist/core/src/rooms/methods.d.ts +3 -0
- package/dist/core/src/rooms/methods.d.ts.map +1 -1
- package/dist/core/src/testUtils.d.ts.map +1 -1
- package/dist/core/src/types/common.d.ts +11 -0
- package/dist/core/src/types/common.d.ts.map +1 -1
- package/dist/core/src/types/videoPlayback.d.ts +5 -0
- package/dist/core/src/types/videoPlayback.d.ts.map +1 -1
- package/dist/core/src/types/videoRoomSession.d.ts +1 -0
- package/dist/core/src/types/videoRoomSession.d.ts.map +1 -1
- package/dist/core/src/utils/interfaces.d.ts +7 -5
- package/dist/core/src/utils/interfaces.d.ts.map +1 -1
- package/dist/index.esm.js +82 -3
- package/dist/index.esm.js.map +3 -3
- package/dist/index.js +80 -3
- package/dist/index.js.map +3 -3
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/js/src/BaseRoomSession.d.ts +5 -0
- package/dist/js/src/BaseRoomSession.d.ts.map +1 -1
- package/dist/js/src/RoomSession.d.ts +2 -2
- package/dist/js/src/RoomSession.d.ts.map +1 -1
- package/dist/js/src/RoomSession.docs.d.ts +21 -0
- package/dist/js/src/RoomSession.docs.d.ts.map +1 -1
- package/dist/js/src/features/mediaElements/mediaElementsSagas.d.ts.map +1 -1
- package/dist/js/src/utils/interfaces.d.ts +4 -0
- package/dist/js/src/utils/interfaces.d.ts.map +1 -1
- package/dist/js/src/utils/roomSession.d.ts +13 -0
- package/dist/js/src/utils/roomSession.d.ts.map +1 -0
- package/dist/js/src/utils/videoElement.d.ts +1 -0
- package/dist/js/src/utils/videoElement.d.ts.map +1 -1
- package/dist/js/tsconfig.build.tsbuildinfo +1 -1
- package/dist/webrtc/src/BaseConnection.d.ts +8 -0
- package/dist/webrtc/src/BaseConnection.d.ts.map +1 -1
- package/dist/webrtc/src/utils/interfaces.d.ts +2 -0
- package/dist/webrtc/src/utils/interfaces.d.ts.map +1 -1
- package/dist/webrtc/src/utils/webrtcHelpers.native.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/BaseRoomSession.ts +4 -1
- package/src/RoomSession.docs.ts +20 -0
- package/src/RoomSession.ts +60 -3
- package/src/features/mediaElements/mediaElementsSagas.ts +10 -0
- package/src/utils/interfaces.ts +5 -0
- package/src/utils/roomSession.ts +54 -0
- package/src/utils/videoElement.ts +3 -0
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/chat/index.ts", "../src/createClient.ts", "../src/Client.ts", "../src/features/mediaElements/mediaElementsSagas.ts", "../src/utils/videoElement.ts", "../src/utils/audioElement.ts", "../src/features/actions.ts", "../src/BaseRoomSession.ts", "../src/utils/constants.ts", "../src/RoomSessionScreenShare.ts", "../src/RoomSessionDevice.ts", "../src/video/memberListUpdatedWorker.ts", "../src/video/memberPositionWorker.ts", "../src/cantina/VideoManager.ts", "../src/cantina/workers.ts", "../src/JWTSession.ts", "../src/chat/Client.ts", "../src/pubSub/index.ts", "../src/pubSub/Client.ts", "../src/video.ts", "../src/createRoomObject.ts", "../src/joinRoom.ts", "../src/RoomSession.ts", "../src/webrtc.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Welcome to the technical documentation for the JavaScript SDK.\n *\n * At the outer level, when you import the SignalWire JS library you get access\n * to three different namespaces:\n *\n * - {@link Video}\n * - {@link Chat}\n * - {@link WebRTC}\n *\n * Video gives you access to the classes and methods that let you\n * interface with the backend Video APIs. Chat gives you access to the classes and functions that you need to create a real-time chat application. WebRTC\n * contains several functions that are useful for interacting with the hardware of the user's device.\n *\n *\n * Don't know where to start? Create an instance of\n * {@link Video.RoomSession} to join a room, use the {@link Chat.Client} constructor to start a chat application, or take a look at [Getting Started\n * with the SignalWire Video\n * API](https://developer.signalwire.com/apis/docs/getting-started-with-the-signalwire-video-api-1).\n *\n * @module\n */\n\nimport type {\n VideoRoomSessionEventNames,\n RoomStarted,\n RoomSubscribed,\n RoomUpdated,\n RoomEnded,\n VideoMemberEntity,\n} from '@signalwire/core'\n\n/** @ignore @deprecated */\nexport type RoomStartedEventName = RoomStarted\n/** @ignore @deprecated */\nexport type RoomEndedEventName = RoomEnded\n/** @ignore @deprecated */\nexport type RoomSubscribedEventName = RoomSubscribed\n/** @ignore @deprecated */\nexport type RoomUpdatedEventName = RoomUpdated\n/** @ignore @deprecated */\nexport type RoomEvent = VideoRoomSessionEventNames\n/** @ignore @deprecated */\nexport type RoomMember = VideoMemberEntity & { type: 'member' }\n/** @ignore @deprecated */\nexport type RoomScreenShare = VideoMemberEntity & { type: 'screen' }\n/** @ignore @deprecated */\nexport type RoomDevice = VideoMemberEntity & { type: 'device' }\n\n/**\n * The Chat namespace contains the classes and functions that you need to\n * create a real-time chat application.\n */\nexport * as Chat from './chat'\n\nexport * as PubSub from './pubSub'\n\n/**\n * The Video namespace contains the classes and functions that you need to\n * create a video conferencing application.\n */\nexport * as Video from './video'\n\n/**\n * The WebRTC namespace includes functions that give you access to the input and\n * output media devices available on the user's machine. For example, you can\n * use these functions to request permission and get access to the media stream\n * from a webcam, from a microphone, or from a screen sharing.\n */\nexport * as WebRTC from './webrtc'\n\nexport type {\n VideoPosition,\n VideoPositions,\n} from '@signalwire/core'\n\n/** @ignore */\nexport type {\n BaseComponentOptions,\n BaseConnectionState,\n ClientEvents,\n EmitterContract,\n RoomEventNames,\n RTCTrackEventName,\n UserOptions,\n SessionStatus,\n SessionEvents,\n VideoLayout,\n VideoLayoutEventNames,\n VideoRoomSessionEventNames,\n VideoRoomEventParams,\n VideoMemberEntity,\n VideoMemberEventNames,\n MemberTalkingEventNames,\n VideoMemberTalkingEventParams,\n InternalVideoMemberEntity,\n} from '@signalwire/core'\n\n/** @ignore */\nexport type {\n BaseConnectionOptions,\n ConnectionOptions,\n} from '@signalwire/webrtc'\n\n/** @ignore */\nexport type {\n RoomSessionObjectEventsHandlerMap,\n RoomSessionObjectEvents,\n // Just to keep backwards compatibility.\n RoomSessionObjectEventsHandlerMap as RoomObjectEventsHandlerMap,\n RoomSessionObjectEvents as RoomObjectEvents,\n} from './utils/interfaces'\n", "import { Chat } from '@signalwire/core'\nimport ChatMember = Chat.ChatMember\nimport ChatMessage = Chat.ChatMessage\n\nexport * from './Client'\nexport { PagingCursor } from './Client.docs'\n\nexport {\n ChatMember,\n ChatMessage,\n}", "import {\n ClientEvents,\n configureStore,\n connect,\n getEventEmitter,\n UserOptions,\n} from '@signalwire/core'\nimport { ClientAPI, Client } from './Client'\nimport { JWTSession } from './JWTSession'\n\n/**\n * With Video.createClient() you can establish a WebSocket connection\n * with SignalWire and interact with the client.\n *\n * ## Examples\n * Create a client\n *\n * @example\n * ```js\n * try {\n * const client = Video.createClient({\n * token: '<YourJWT>',\n * })\n *\n * await client.connect()\n * // Your client is ready now..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @internal\n */\nexport const createClient = <RoomSessionType>(userOptions: UserOptions) => {\n const baseUserOptions = {\n ...userOptions,\n emitter: getEventEmitter<ClientEvents>(),\n }\n const store = configureStore({\n userOptions: baseUserOptions,\n SessionConstructor: JWTSession,\n })\n const client = connect<\n ClientEvents,\n ClientAPI<RoomSessionType>,\n Client<RoomSessionType>\n >({\n store,\n Component: ClientAPI,\n componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\n })(baseUserOptions)\n\n return client\n}\n", "import {\n BaseClient,\n ClientEvents,\n ClientContract,\n actions,\n Chat as ChatNamespace,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport type { CustomSaga } from '@signalwire/core'\nimport { ConnectionOptions } from '@signalwire/webrtc'\nimport {\n makeVideoElementSaga,\n makeAudioElementSaga,\n} from './features/mediaElements/mediaElementsSagas'\nimport { RoomSession } from './RoomSession'\nimport {\n createBaseRoomSessionObject,\n RoomSessionConnection,\n} from './BaseRoomSession'\nimport { VideoManager, createVideoManagerObject } from './cantina'\nimport type { Client as ChatClient } from './chat/Client'\nimport type { Client as PubSubClient } from './pubSub/Client'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI<RoomSessionType>['rooms']\n chat: ClientAPI<RoomSessionType>['chat']\n pubSub: ClientAPI<RoomSessionType>['pubSub']\n}\n\nexport interface MakeRoomOptions extends ConnectionOptions {\n rootElement?: HTMLElement\n applyLocalVideoOverlay?: boolean\n stopCameraWhileMuted?: boolean\n stopMicrophoneWhileMuted?: boolean\n}\n\nexport class ClientAPI<\n RoomSessionType = RoomSession\n> extends BaseClient<ClientEvents> {\n private _videoManager: VideoManager\n private _chat: ChatClient\n private _pubSub: PubSubClient\n\n get rooms() {\n return {\n makeRoomObject: (makeRoomOptions: MakeRoomOptions) => {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n ...options\n } = makeRoomOptions\n\n const customSagas: Array<CustomSaga<RoomSessionConnection>> = []\n\n /**\n * By default the SDK will attach the audio to\n * an Audio element (regardless of \"rootElement\")\n */\n customSagas.push(\n makeAudioElementSaga({\n speakerId: options.speakerId,\n })\n )\n\n /**\n * If the user provides a `roomElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n customSagas.push(\n makeVideoElementSaga({\n rootElement,\n applyLocalVideoOverlay,\n })\n )\n }\n\n const room = createBaseRoomSessionObject<RoomSessionType>({\n ...options,\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n customSagas,\n })\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audio_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'audio_muted' in member) {\n member.audio_muted\n ? room.stopOutboundAudio()\n : room.restoreOutboundAudio()\n }\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n })\n }\n\n /**\n * Stop and Restore outbound video on video_muted event\n */\n if (stopCameraWhileMuted) {\n room.on('member.updated.video_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted\n ? room.stopOutboundVideo()\n : room.restoreOutboundVideo()\n }\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n })\n }\n\n return room\n },\n }\n }\n\n get chat() {\n if (!this._chat) {\n this._chat = ChatNamespace.createBaseChatObject<ChatClient>({\n store: this.store,\n // Emitter is now typed but we share it across objects\n // so types won't match\n // @ts-expect-error\n emitter: this.options.emitter,\n })\n }\n return this._chat\n }\n\n get pubSub() {\n if (!this._pubSub) {\n this._pubSub = PubSubNamespace.createBasePubSubObject<PubSubClient>({\n store: this.store,\n // Emitter is now typed but we share it across objects\n // so types won't match\n // @ts-expect-error\n emitter: this.options.emitter,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n // @ts-expect-error\n this._videoManager = createVideoManagerObject(this.options)\n }\n return this._videoManager\n }\n\n /**\n * Reauthenticate with the SignalWire network using a new token\n * For now it returns void since with an invalid token the server\n * will close the connection right away so we can hook on the session\n * events in case. Need to improve it.\n *\n * @internal\n */\n reauthenticate(token: string) {\n this.store.dispatch(actions.reauthAction({ token }))\n }\n}\n", "import {\n getLogger,\n CustomSagaParams,\n actions,\n sagaEffects,\n} from '@signalwire/core'\nimport type { SagaIterator, Task } from '@signalwire/core'\nimport { setMediaElementSinkId } from '@signalwire/webrtc'\nimport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n LocalOverlay,\n addSDKPrefix,\n} from '../../utils/videoElement'\nimport { setAudioMediaTrack } from '../../utils/audioElement'\nimport { audioSetSpeakerAction } from '../actions'\nimport type { RoomSessionConnection } from '../../BaseRoomSession'\n\nexport const makeVideoElementSaga = ({\n rootElement,\n applyLocalVideoOverlay,\n}: {\n rootElement: HTMLElement\n applyLocalVideoOverlay?: boolean\n}) => {\n return function* videoElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<RoomSessionConnection>): SagaIterator {\n try {\n const layerMap = new Map<string, HTMLDivElement>()\n const videoEl = buildVideo()\n\n /**\n * We used this `LocalOverlay` interface to interact with the localVideo\n * overlay DOM element in here and in the `layoutChangedHandler`.\n * The idea is to avoid APIs like `document.getElementById` because it\n * won't work if the SDK is used within a Shadow DOM tree.\n * Instead of querying the `document`, let's use our `layerMap`.\n */\n const localOverlay: LocalOverlay = {\n get id() {\n return addSDKPrefix(room.memberId)\n },\n get domElement() {\n return layerMap.get(this.id)\n },\n set domElement(element: HTMLDivElement | undefined) {\n if (element) {\n getLogger().debug('Set localOverlay', element)\n layerMap.set(this.id, element)\n } else {\n getLogger().debug('Remove localOverlay')\n layerMap.delete(this.id)\n }\n },\n hide() {\n if (!this.domElement) {\n return getLogger().warn('Missing localOverlay to hide')\n }\n this.domElement.style.opacity = '0'\n },\n show() {\n if (!this.domElement) {\n return getLogger().warn('Missing localOverlay to show')\n }\n this.domElement.style.opacity = '1'\n },\n }\n\n const layoutChangedHandler = makeLayoutChangedHandler({\n rootElement,\n localOverlay,\n })\n\n room.on('layout.changed', (params) => {\n getLogger().debug('Received layout.changed')\n if (room.peer.hasVideoSender && room.localStream) {\n layoutChangedHandler({\n // @ts-expect-error\n layout: params.layout,\n localStream: room.localStream,\n myMemberId: room.memberId,\n })\n }\n })\n\n /**\n * If the user joins with `join_video_muted: true` or\n * `join_audio_muted: true` we'll stop the streams\n * right away.\n */\n room.once('room.subscribed', (params) => {\n const member = params.room_session.members?.find(\n (m) => m.id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n getLogger().error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n getLogger().error('Error handling video_muted', error)\n }\n }\n })\n\n room.on('member.updated.video_muted', (params) => {\n try {\n const { member } = params\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted ? localOverlay.hide() : localOverlay.show()\n }\n } catch (error) {\n getLogger().error('Error handling video_muted', error)\n }\n })\n\n let videoTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'video': {\n videoTask = runSaga(videoElementSetupWorker, {\n applyLocalVideoOverlay,\n rootElement,\n track: event.track,\n element: videoEl,\n })\n // Remove listener when done with video\n room.off('track', trackHandler)\n break\n }\n }\n }\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n cleanupElement(rootElement)\n layerMap.clear()\n videoTask?.cancel()\n })\n } catch (error) {\n getLogger().error('videoElementSaga', error)\n }\n }\n}\n\nexport const makeAudioElementSaga = ({ speakerId }: { speakerId?: string }) => {\n return function* audioElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<RoomSessionConnection>): SagaIterator {\n try {\n const audioEl = new Audio()\n let audioTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'audio': {\n audioTask = runSaga(audioElementSetupWorker, {\n track: event.track,\n element: audioEl,\n speakerId,\n room,\n })\n // Remove listener when done with audio\n room.off('track', trackHandler)\n break\n }\n }\n }\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n audioTask?.cancel()\n })\n } catch (error) {\n getLogger().error('audioElementSaga', error)\n }\n }\n}\n\nfunction* audioElementActionsWatcher({\n element,\n room,\n}: {\n element: HTMLAudioElement\n room: RoomSessionConnection\n}): SagaIterator {\n // TODO: For now we're handling individual actions but in the future\n // we might want to have a single action per custom saga and use it\n // in a similar fashion to `executeAction`\n const setSpeakerActionType = actions.getCustomSagaActionType(\n room.__uuid,\n audioSetSpeakerAction\n )\n\n while (true) {\n const action = yield sagaEffects.take([setSpeakerActionType])\n\n try {\n switch (action.type) {\n case setSpeakerActionType:\n const response = yield sagaEffects.call(\n setMediaElementSinkId,\n element,\n action.payload\n )\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: response,\n kind: 'resolve',\n })\n break\n }\n } catch (error) {\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: error,\n kind: 'reject',\n })\n getLogger().error(error)\n }\n }\n}\n\nfunction* audioElementSetupWorker({\n track,\n element,\n speakerId,\n room,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n speakerId?: string\n room: RoomSessionConnection\n}): SagaIterator {\n setAudioMediaTrack({ track, element })\n if (speakerId) {\n // Catch no-op since setMediaElementSinkId already provides logs\n setMediaElementSinkId(element, speakerId).catch(() => {})\n }\n\n yield sagaEffects.fork(audioElementActionsWatcher, {\n element,\n room,\n })\n}\n\nfunction* videoElementSetupWorker({\n rootElement,\n applyLocalVideoOverlay = true,\n track,\n element,\n}: {\n // TODO: we'll move this to a separate type once we define how to\n // dispatch action that only target unique sagas\n rootElement: HTMLElement\n applyLocalVideoOverlay?: boolean\n track: MediaStreamTrack\n element: HTMLVideoElement\n}): SagaIterator {\n const handleVideoTrack = async (track: MediaStreamTrack) => {\n setVideoMediaTrack({ element, track })\n\n element.style.width = '100%'\n\n if (!applyLocalVideoOverlay) {\n rootElement.appendChild(element)\n return\n }\n\n const mcuWrapper = document.createElement('div')\n mcuWrapper.style.position = 'absolute'\n mcuWrapper.style.top = '0'\n mcuWrapper.style.left = '0'\n mcuWrapper.style.right = '0'\n mcuWrapper.style.bottom = '0'\n mcuWrapper.appendChild(element)\n\n const paddingWrapper = document.createElement('div')\n paddingWrapper.style.paddingBottom = '56.25%'\n paddingWrapper.appendChild(mcuWrapper)\n\n const layersWrapper = document.createElement('div')\n layersWrapper.classList.add('mcuLayers')\n layersWrapper.style.display = 'none'\n paddingWrapper.appendChild(layersWrapper)\n\n const relativeWrapper = document.createElement('div')\n relativeWrapper.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.display = 'flex'\n rootElement.style.alignItems = 'center'\n rootElement.style.justifyContent = 'center'\n rootElement.appendChild(relativeWrapper)\n\n if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n await waitForVideoReady({ element })\n }\n layersWrapper.style.display = 'block'\n }\n\n handleVideoTrack(track).catch((error) => {\n getLogger().error('Handle video track error', error)\n })\n\n // TODO: take destroy\n}\n", "import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\n} from '@signalwire/core'\n\nconst addSDKPrefix = (input: string) => {\n return `sw-sdk-${input}`\n}\n\nconst buildVideo = () => {\n const video = document.createElement('video')\n video.muted = true\n video.autoplay = true\n video.playsInline = true\n\n /**\n * Local and Remov video elements should never be paused\n * and Safari/Firefox pause the video (ie: enabling PiP, switch cameras etc)\n * We try to force it to keep playing.\n */\n video.addEventListener('pause', () => {\n video.play().catch((error) => {\n getLogger().error('Video Element Paused', video, error)\n })\n })\n\n return video\n}\n\nconst waitForVideoReady = ({ element }: { element: HTMLVideoElement }) => {\n return new Promise<void>((resolve) => {\n element.addEventListener('canplay', function listener() {\n element.removeEventListener('canplay', listener)\n resolve()\n })\n element.addEventListener('resize', function listener() {\n element.removeEventListener('resize', listener)\n resolve()\n })\n })\n}\n\nconst _getLocationStyles = ({\n x,\n y,\n width,\n height,\n}: InternalVideoLayoutLayer) => {\n return {\n top: `${y}%`,\n left: `${x}%`,\n width: `${width}%`,\n height: `${height}%`,\n }\n}\n\nconst _buildLayer = ({ location }: { location: InternalVideoLayoutLayer }) => {\n const { top, left, width, height } = _getLocationStyles(location)\n const layer = document.createElement('div')\n layer.style.position = 'absolute'\n layer.style.overflow = 'hidden'\n layer.style.top = top\n layer.style.left = left\n layer.style.width = width\n layer.style.height = height\n\n return layer\n}\n\nexport interface LocalOverlay {\n readonly id: string\n domElement: HTMLDivElement | undefined\n hide(): void\n show(): void\n}\n\ninterface MakeLayoutChangedHandlerParams {\n localOverlay: LocalOverlay\n rootElement: HTMLElement\n}\n\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n myMemberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler =\n ({ localOverlay, rootElement }: MakeLayoutChangedHandlerParams) =>\n async ({ layout, myMemberId, localStream }: LayoutChangedHandlerParams) => {\n getLogger().debug('Process layout.changed')\n try {\n const { layers = [] } = layout\n const location = layers.find(({ member_id }) => member_id === myMemberId)\n\n let myLayer = localOverlay.domElement\n if (!location) {\n getLogger().debug('Location not found')\n if (myLayer) {\n getLogger().debug('Current layer not visible')\n localOverlay.hide()\n }\n\n return\n }\n\n if (!myLayer) {\n getLogger().debug('Build myLayer')\n myLayer = _buildLayer({ location })\n myLayer.id = localOverlay.id\n\n const localVideo = buildVideo()\n localVideo.srcObject = localStream\n localVideo.style.width = '100%'\n localVideo.style.height = '100%'\n\n myLayer.appendChild(localVideo)\n\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n const exists = mcuLayers?.querySelector(`#${myLayer.id}`)\n if (mcuLayers && !exists) {\n mcuLayers.appendChild(myLayer)\n localOverlay.domElement = myLayer\n }\n\n return\n }\n\n const { top, left, width, height } = _getLocationStyles(location)\n getLogger().debug('Update myLayer:', top, left, width, height)\n /**\n * Show myLayer only if the localStream has a valid video track\n */\n const hasVideo = localStream.getVideoTracks().length > 0\n myLayer.style.opacity = hasVideo ? '1' : '0'\n myLayer.style.top = top\n myLayer.style.left = left\n myLayer.style.width = width\n myLayer.style.height = height\n } catch (error) {\n getLogger().error('Layout Changed Error', error)\n }\n }\n\nconst cleanupElement = (rootElement: HTMLElement) => {\n while (rootElement.firstChild) {\n rootElement.removeChild(rootElement.firstChild)\n }\n}\n\nconst setVideoMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLVideoElement\n}) => {\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n}\n\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n addSDKPrefix,\n}\n", "const setAudioMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n}) => {\n element.autoplay = true\n // @ts-ignore\n element.playsinline = true\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n\n return element\n}\n\nexport { setAudioMediaTrack }\n", "import { actions } from '@signalwire/core'\n\nexport const audioSetSpeakerAction = actions.createAction<string>(\n 'swJs/audioSetSpeakerAction'\n)\n", "import {\n connect,\n Rooms,\n EventTransform,\n extendComponent,\n BaseComponentContract,\n BaseComponentOptions,\n BaseConnectionContract,\n toLocalEvent,\n toExternalJSON,\n VideoRoomEventParams,\n MemberPosition,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport {\n getDisplayMedia,\n BaseConnection,\n BaseConnectionOptions,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport type {\n RoomSessionObjectEvents,\n CreateScreenShareObjectOptions,\n AddDeviceOptions,\n AddCameraOptions,\n AddMicrophoneOptions,\n BaseRoomInterface,\n RoomMethods,\n StartScreenShareOptions,\n RoomSessionConnectionContract,\n} from './utils/interfaces'\nimport {\n ROOM_COMPONENT_LISTENERS,\n SCREENSHARE_AUDIO_CONSTRAINTS,\n} from './utils/constants'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare,\n} from './RoomSessionScreenShare'\nimport {\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDevice,\n} from './RoomSessionDevice'\nimport * as workers from './video/workers'\n\nexport interface BaseRoomSession<T>\n extends RoomMethods,\n RoomSessionConnectionContract,\n BaseComponentContract,\n BaseConnectionContract<RoomSessionObjectEvents> {\n join(): Promise<T>\n leave(): Promise<void>\n}\n\nexport class RoomSessionConnection\n extends BaseConnection<RoomSessionObjectEvents>\n implements BaseRoomInterface, RoomSessionConnectionContract\n{\n private _screenShareList = new Set<RoomSessionScreenShare>()\n private _deviceList = new Set<RoomSessionDevice>()\n\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n /** @internal */\n protected getEmitterTransforms() {\n return new Map<string | string[], EventTransform>([\n [\n ['video.room.joined'],\n {\n type: 'roomSession',\n instanceFactory: () => {\n return {}\n },\n payloadTransform: (payload: VideoRoomSubscribedEventParams) => {\n return payload\n },\n nestedFieldsToProcess: {\n recordings: {\n eventTransformType: 'roomSessionRecording',\n processInstancePayload: (payload) => ({ recording: payload }),\n },\n playbacks: {\n eventTransformType: 'roomSessionPlayback',\n processInstancePayload: (payload) => ({ member: payload }),\n },\n },\n },\n ],\n [\n [\n toLocalEvent('video.recording.start'),\n 'video.recording.started',\n 'video.recording.updated',\n 'video.recording.ended',\n ],\n {\n type: 'roomSessionRecording',\n instanceFactory: (_payload: any) => {\n return Rooms.createRoomSessionRecordingObject({\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n })\n },\n payloadTransform: (payload: any) => {\n return toExternalJSON({\n ...payload.recording,\n room_session_id: this.roomSessionId,\n })\n },\n },\n ],\n [\n [\n toLocalEvent('video.playback.start'),\n 'video.playback.started',\n 'video.playback.updated',\n 'video.playback.ended',\n ],\n {\n type: 'roomSessionPlayback',\n instanceFactory: (_payload: any) => {\n return Rooms.createRoomSessionPlaybackObject({\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n })\n },\n payloadTransform: (payload: any) => {\n return toExternalJSON({\n ...payload.playback,\n room_session_id: this.roomSessionId,\n })\n },\n },\n ],\n ])\n }\n\n /** @internal */\n protected override getCompoundEvents() {\n return new Map<any, any>([\n ...MemberPosition.MEMBER_POSITION_COMPOUND_EVENTS,\n ])\n }\n\n /**\n * This method will be called by `join()` right before the\n * `connect()` happens and it's a way for us to control\n * exactly when the workers are attached.\n * @internal\n */\n protected attachPreConnectWorkers() {\n this.runWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n }\n\n /**\n * This method will be called right after\n * `room.subscribed` happened\n * @internal\n */\n protected attachOnSubscribedWorkers(payload: VideoRoomEventParams) {\n this.runWorker('memberPositionWorker', {\n worker: workers.memberPositionWorker,\n initialState: payload\n })\n }\n\n /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions<RoomSessionObjectEvents> = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n BaseConnectionStateEventTypes,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n /**\n * Hangup if the user stop the screenShare from the\n * native browser button or if the videoTrack ends.\n */\n displayStream.getVideoTracks().forEach((t) => {\n t.addEventListener('ended', () => {\n if (screenShare && screenShare.active) {\n screenShare.leave()\n }\n })\n })\n\n screenShare.on('destroy', () => {\n this._screenShareList.delete(screenShare)\n })\n\n try {\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n await screenShare.join()\n }\n return screenShare\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n throw error\n }\n }\n\n /**\n * Allow to add a camera to the room.\n */\n addCamera(opts: AddCameraOptions = {}) {\n const { autoJoin = true, ...video } = opts\n return this.addDevice({\n autoJoin,\n video,\n })\n }\n\n /**\n * Allow to add a microphone to the room.\n */\n addMicrophone(opts: AddMicrophoneOptions = {}) {\n const { autoJoin = true, ...audio } = opts\n return this.addDevice({\n autoJoin,\n audio,\n })\n }\n\n /**\n * Allow to add additional devices to the room like cameras or microphones.\n */\n async addDevice(opts: AddDeviceOptions = {}) {\n const { autoJoin = true, audio = false, video = false } = opts\n if (!audio && !video) {\n throw new TypeError(\n 'At least one of `audio` or `video` must be requested.'\n )\n }\n\n const options: BaseConnectionOptions<RoomSessionObjectEvents> = {\n ...this.options,\n localStream: undefined,\n remoteStream: undefined,\n audio,\n video,\n additionalDevice: true,\n recoverCall: false,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n BaseConnectionStateEventTypes,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n roomDevice.on('destroy', () => {\n this._deviceList.delete(roomDevice)\n })\n\n try {\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n await roomDevice.join()\n }\n return roomDevice\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n throw error\n }\n }\n\n join() {\n return super.invite<BaseRoomSession<this>>()\n }\n\n leave() {\n return this.hangup()\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n\n /** @internal */\n async hangup() {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup()\n }\n\n /** @internal */\n protected _finalize() {\n this._screenShareList.clear()\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /**\n * @deprecated Use {@link getLayouts} instead. `getLayoutList` will\n * be removed in v3.0.0\n */\n getLayoutList() {\n // @ts-expect-error\n return this.getLayouts()\n }\n\n /**\n * @deprecated Use {@link getMembers} instead. `getMemberList` will\n * be removed in v3.0.0\n */\n getMemberList() {\n // @ts-expect-error\n return this.getMembers()\n }\n}\n\nexport const RoomSessionAPI = extendComponent<\n RoomSessionConnection,\n RoomMethods\n>(RoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n setMeta: Rooms.setMeta,\n setMemberMeta: Rooms.setMemberMeta,\n})\n\ntype RoomSessionObjectEventsHandlerMapping = RoomSessionObjectEvents &\n BaseConnectionStateEventTypes\n\n/** @internal */\nexport const createBaseRoomSessionObject = <RoomSessionType>(\n params: BaseComponentOptions<RoomSessionObjectEventsHandlerMapping>\n): BaseRoomSession<RoomSessionType> => {\n const room = connect<\n RoomSessionObjectEventsHandlerMapping,\n RoomSessionConnection,\n BaseRoomSession<RoomSessionType>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: RoomSessionAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(params)\n\n return room\n}\n", "export const ROOM_COMPONENT_LISTENERS = {\n state: 'onStateChange',\n remoteSDP: 'onRemoteSDP',\n roomId: 'onRoomSubscribed',\n videoConstraints: 'onVideoConstraints',\n audioConstraints: 'onAudioConstraints',\n errors: 'onError',\n responses: 'onSuccess',\n}\n\nexport const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n AssertSameType,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionScreenShareDocs } from './RoomSessionScreenShare.docs'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\ninterface RoomSessionScreenShareMain\n extends RoomScreenShareMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\n/**\n * Represents a screen sharing.\n */\nexport interface RoomSessionScreenShare\n extends AssertSameType<\n RoomSessionScreenShareMain,\n RoomSessionScreenShareDocs\n > {}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<BaseConnectionStateEventTypes> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\nexport const RoomSessionScreenShareAPI = extendComponent<\n RoomSessionScreenShareConnection,\n RoomScreenShareMethods\n>(RoomSessionScreenShareConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n AssertSameType,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionDeviceDocs } from './RoomSessionDevice.docs'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\ninterface RoomSessionDeviceMain\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\n/**\n * A RoomSessionDevice represents a device (such as a microphone or a camera)\n * that is at some point in its lifetime part of a {@link RoomSession}. You can\n * obtain a RoomSessionDevice from the {@link RoomSession} methods\n * {@link RoomSession.addCamera}, {@link RoomSession.addMicrophone}, and\n * {@link RoomSession.addDevice}.\n */\nexport interface RoomSessionDevice\n extends AssertSameType<RoomSessionDeviceMain, RoomSessionDeviceDocs> {}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<BaseConnectionStateEventTypes> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\nexport const RoomSessionDeviceAPI = extendComponent<\n RoomSessionDeviceConnection,\n RoomSessionDeviceMethods\n>(RoomSessionDeviceConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n", "import {\n sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n PubSubChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { RoomSession } from '../RoomSession'\nimport type { VideoMemberListUpdatedParams } from '../utils/interfaces'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'video.memberList.updated'\n\nconst INTERNAL_MEMBER_LIST_UPDATED_EVENT = toInternalEventName({\n event: EXTERNAL_MEMBER_LIST_UPDATED_EVENT,\n})\n\nconst SYNTHETIC_MEMBER_LIST_UPDATED_EVENT = toSyntheticEvent(\n INTERNAL_MEMBER_LIST_UPDATED_EVENT\n)\n\n/**\n * List of action types this worker cares about.\n */\ntype MemberListUpdatedTargetActions = MapToPubSubShape<\n | InternalVideoRoomJoinedEvent\n | InternalVideoMemberUpdatedEvent\n | VideoMemberJoinedEvent\n | VideoMemberLeftEvent\n | VideoMemberUpdatedEvent\n>\n\nconst MEMBER_LIST_EVENTS: Array<MemberListUpdatedTargetActions['type']> = [\n /** Alias to `video.room.subscribed` */\n 'video.room.joined',\n 'video.member.joined',\n 'video.member.left',\n 'video.member.updated',\n]\n\ntype MemberList = Map<string, InternalVideoMemberEntity>\n\nconst isMemberListEvent = (\n event: string\n): event is MemberListUpdatedTargetActions['type'] => {\n // @ts-expect-error\n return MEMBER_LIST_EVENTS.includes(event)\n}\n\nconst getMemberListEventsToSubscribe = (subscriptions: MemberListUpdatedTargetActions['type'][]) => {\n return validateEventsToSubscribe(MEMBER_LIST_EVENTS).filter((event) => {\n return !subscriptions.includes(event)\n })\n}\n\nconst shouldHandleMemberList = (subscriptions: string[]) => {\n return subscriptions.some((event) =>\n event.includes(INTERNAL_MEMBER_LIST_UPDATED_EVENT)\n )\n}\n\nconst getMembersFromAction = (action: MemberListUpdatedTargetActions) => {\n if (action.type === 'video.room.joined') {\n return action.payload.room_session.members\n }\n\n return [action.payload.member]\n}\n\nexport const getUpdatedMembers = ({\n action,\n memberList,\n}: {\n action: MemberListUpdatedTargetActions\n memberList: MemberList\n}) => {\n const actionMembers = getMembersFromAction(action)\n\n switch (action.type) {\n case 'video.member.left':\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.delete(member.id)\n })\n break\n default:\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.set(member.id, member)\n })\n }\n\n return Array.from(memberList.values())\n}\n\nconst initMemberListSubscriptions = (\n room: RoomSession,\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n const events = getMemberListEventsToSubscribe(subscriptions)\n\n events.forEach((event) => {\n /**\n * Params to `subscribe` come from the event handlers\n * the user has attached so to make sure we subscribe to\n * all the appropiate events needed for\n * `memberList.updated` to work, we must subscribe to\n * the required events. We don't need to act upon the\n * event (that's why we attach a `noop`), just to\n * register it (`subscribe` gets its values from\n * `BaseComponent.getSubscriptions`, which gets\n * populated by each of the event handlers the user\n * attached).\n */\n room.once(event as any, noop)\n })\n\n /**\n * This handler will act as a simple bridge between\n * synthetic events and external events.\n */\n const eventBridgeHandler = ({ members }: VideoMemberListUpdatedParams) => {\n // @ts-expect-error\n room.emit(EXTERNAL_MEMBER_LIST_UPDATED_EVENT, { members })\n }\n\n // @ts-expect-error\n room.on(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n\n /**\n * Any events attached by the saga should be specified\n * here so it can be cleaned up when needed.\n */\n const cleanup = () => {\n // @ts-expect-error\n room.off(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n }\n\n return {\n cleanup,\n }\n}\n\nfunction* membersListUpdatedWatcher({\n pubSubChannel,\n}: {\n pubSubChannel: PubSubChannel\n}): SagaIterator {\n const memberList: MemberList = new Map()\n\n function* worker(pubSubAction: MemberListUpdatedTargetActions) {\n const roomSessionId =\n pubSubAction.type === 'video.room.joined'\n ? pubSubAction.payload.room_session.id\n : pubSubAction.payload.room_session_id\n\n const members = getUpdatedMembers({ action: pubSubAction, memberList })\n const memberListPayload = {\n /**\n * At this point it's needed to send the\n * `room_session_id` so the pubSubSaga can properly\n * infer the namespace for emitting the events to the\n * appropiate room.\n */\n room_session_id: roomSessionId,\n members,\n }\n\n // TODO: add typings\n yield sagaEffects.put(pubSubChannel, {\n type: SYNTHETIC_MEMBER_LIST_UPDATED_EVENT as any,\n payload: memberListPayload as any,\n })\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n pubSubChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<RoomSession> =\n function* membersChangedWorker({\n channels: { pubSubChannel },\n instance,\n }): SagaIterator {\n // @ts-expect-error\n const subscriptions = instance.getSubscriptions()\n\n if (!shouldHandleMemberList(subscriptions)) {\n return\n }\n\n const { cleanup } = initMemberListSubscriptions(instance, subscriptions)\n\n yield sagaEffects.fork(membersListUpdatedWatcher, {\n pubSubChannel,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n", "import {\n SagaIterator,\n SDKWorker,\n MemberPosition,\n sagaEffects,\n} from '@signalwire/core'\n\nexport const memberPositionWorker: SDKWorker<any> =\n function* memberPositionWorker(options): SagaIterator {\n if (!options.initialState) {\n throw new Error('[memberPositionWorker] Missing initialState')\n }\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, options)\n }\n", "import {\n BaseComponentOptions,\n BaseConsumer,\n VideoManagerRoomEventNames,\n InternalVideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n EventTransform,\n toExternalJSON,\n VideoManagerRoomEntity,\n VideoManagerRoomsSubscribedEventParams,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\ntype EmitterTransformsEvents = InternalVideoManagerRoomEventNames\n\n/** @internal */\nexport type VideoManagerEvents = Record<\n VideoManagerRoomEventNames,\n (room: VideoManagerRoomEntity) => void\n>\n\n/** @internal */\nexport interface VideoManager extends ConsumerContract<VideoManagerEvents> {}\n\n/** @internal */\nexport class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {\n protected _eventsPrefix = 'video-manager' as const\n\n constructor(options: BaseComponentOptions<VideoManagerEvents>) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n getEmitterTransforms() {\n return new Map<\n EmitterTransformsEvents | EmitterTransformsEvents[],\n EventTransform\n >([\n [\n ['video-manager.rooms.subscribed'],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: ({\n rooms,\n }: VideoManagerRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n payloadTransform: ({\n rooms,\n }: VideoManagerRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n },\n ],\n [\n [\n 'video-manager.room.started',\n 'video-manager.room.added',\n 'video-manager.room.updated',\n 'video-manager.room.ended',\n 'video-manager.room.deleted',\n ],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: (payload) => toExternalJSON(payload),\n payloadTransform: (payload) => toExternalJSON(payload),\n },\n ],\n ])\n }\n}\n\nexport const createVideoManagerObject = (\n params: BaseComponentOptions<VideoManagerEvents>\n) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\n })(params)\n\n const proxy = new Proxy<VideoManager>(manager, {\n get(\n target: VideoManager,\n property: string | symbol,\n receiver: ProxyHandler<VideoManager>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'video-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n", "import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n} from '@signalwire/core'\nimport type { VideoManager } from './VideoManager'\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const { channels } = options\n const { swEventChannel, pubSubChannel } = channels\n\n while (true) {\n const action: MapToPubSubShape<VideoManagerEvent> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n return action.type.startsWith('video-manager.')\n }\n )\n\n yield sagaEffects.put(pubSubChannel, action)\n }\n}\n", "import jwtDecode from 'jwt-decode'\nimport { BaseJWTSession, getLogger, SessionOptions } from '@signalwire/core'\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public agent = process.env.SDK_PKG_AGENT!\n\n constructor(public options: SessionOptions) {\n let decodedJwt\n try {\n decodedJwt = jwtDecode<{ ch?: string }>(options.token, { header: true })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: decodedJwt?.ch || options.host,\n })\n }\n\n get allowHijack() {\n // @ts-expect-error\n return this.options._hijack\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowHijack) {\n return ''\n }\n\n const roomName = this.getRoomNameFromJWT()\n if (roomName) {\n this.logger.info('Hijacking: search protocol for', roomName)\n return window.sessionStorage.getItem(roomName) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowHijack) {\n return\n }\n\n const roomName = this.getRoomNameFromJWT()\n if (roomName) {\n this.logger.info(\n 'Hijacking: persist protocol',\n roomName,\n this.relayProtocol\n )\n window.sessionStorage.setItem(roomName, this.relayProtocol)\n }\n }\n\n private getRoomNameFromJWT() {\n try {\n const jwtPayload = jwtDecode<{ r: string }>(this.options.token)\n return jwtPayload?.r\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[getRoomNameFromJWT] error decoding the JWT')\n }\n return ''\n }\n }\n}\n", "import type {\n AssertSameType,\n ChatContract,\n ConsumerContract,\n UserOptions,\n Chat as ChatNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { ClientApiEventsDocs, ClientDocs } from './Client.docs'\n\ninterface ClientApiEventsMain extends ChatNamespace.BaseChatApiEvents {}\nexport interface ClientApiEvents\n extends AssertSameType<ClientApiEventsMain, ClientApiEventsDocs> {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\ninterface ClientMain\n extends ChatContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { Chat } from '@signalwire/js'\n *\n * const chatClient = new Chat.Client({\n * token: '<your_chat_token>', // get this from the REST APIs\n * })\n *\n * await chatClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * chatClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await chatClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a chat\n * Client object.\n */\nexport interface Client extends AssertSameType<ClientMain, ClientDocs> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'updateToken',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'setMemberState',\n]\n\nexport const Client = function (chatOptions: ClientOptions) {\n const client = createClient<Client>(chatOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.chat[prop](...params)\n }\n }\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n", "import { PubSub } from '@signalwire/core'\nimport PubSubMessage = PubSub.PubSubMessage\n\nexport * from './Client'\nexport { PagingCursor } from './Client.docs'\n\nexport {\n PubSubMessage,\n}\n", "import type {\n AssertSameType,\n PubSubContract,\n ConsumerContract,\n UserOptions,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { ClientApiEventsDocs, ClientDocs } from './Client.docs'\n\ninterface ClientApiEventsMain extends PubSubNamespace.BasePubSubApiEvents {}\nexport interface ClientApiEvents\n extends AssertSameType<ClientApiEventsMain, ClientApiEventsDocs> {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\ninterface ClientMain\n extends PubSubContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { PubSub } from '@signalwire/js'\n *\n * const pubSubClient = new PubSub.Client({\n * token: '<your pubSub token>', // get this from the REST APIs\n * })\n *\n * await pubSubClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * pubSubClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await pubSubClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a pubSub\n * Client object.\n */\nexport interface Client extends AssertSameType<ClientMain, ClientDocs> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'updateToken',\n]\n\nexport const Client = function (pubSubOptions: ClientOptions) {\n const client = createClient<Client>(pubSubOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.pubSub[prop](...params)\n }\n }\n\n return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (pubSubOptions: ClientOptions): Client }\n", "import { createRoomObject, Room } from './createRoomObject'\nimport { createClient } from './createClient'\nimport { joinRoom } from './joinRoom'\nimport { MakeRoomOptions } from './Client'\nimport { RoomSession, RoomSessionOptions } from './RoomSession'\nimport { RoomSessionDevice, RoomDevice } from './RoomSessionDevice'\nimport {\n RoomSessionScreenShare,\n RoomScreenShare,\n} from './RoomSessionScreenShare'\n\nexport {\n RoomSession,\n RoomSessionDevice,\n RoomSessionScreenShare,\n // Just to keep backwards compatibility.\n createRoomObject,\n joinRoom,\n Room,\n RoomDevice,\n RoomScreenShare,\n createClient,\n}\n\n/** @ignore */\nexport type { MakeRoomOptions, RoomSessionOptions }\n\n/** @ignore */\nexport type {\n MemberCommandParams,\n MemberCommandWithVolumeParams,\n MemberCommandWithValueParams,\n DeprecatedMemberUpdatableProps,\n DeprecatedVideoMemberHandlerParams,\n VideoMemberHandlerParams,\n VideoMemberListUpdatedParams,\n} from './utils/interfaces'\n\nexport type { CreateRoomObjectOptions } from './createRoomObject'\n\nexport type {\n RoomSessionRecording,\n RoomSessionPlayback,\n} from '@signalwire/core'\n\nexport type { RoomSessionEvents } from './RoomSession.docs'\n", "import { UserOptions, getLogger, AssertSameType } from '@signalwire/core'\nimport { createClient } from './createClient'\nimport { MakeRoomOptions } from './Client'\nimport { BaseRoomSession } from './BaseRoomSession'\n\n/**\n * @internal\n * @deprecated Use {@link RoomSession} instead.\n **/\nexport interface Room extends BaseRoomSession<Room> {}\n\ninterface CreateRoomObjectOptionsMain\n extends UserOptions,\n Omit<MakeRoomOptions, 'rootElement'> {\n /** Id of the HTML element in which to display the video stream */\n rootElementId?: string\n /** Whether to automatically join the room session. */\n autoJoin?: boolean\n}\n\n/**\n * @deprecated Usage of this object is deprecated. See {@link RoomSession}\n * instead.\n */\nexport interface CreateRoomObjectOptions\n extends AssertSameType<\n CreateRoomObjectOptionsMain,\n {\n /** SignalWire project id, e.g. `a10d8a9f-2166-4e82-56ff-118bc3a4840f` */\n project?: string\n /** SignalWire project token, e.g. `PT9e5660c101cd140a1c93a0197640a369cf5f16975a0079c9` */\n token: string\n /** logging level */\n logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent'\n /** Id of the HTML element in which to display the video stream */\n rootElementId?: string\n /** Whether to apply the local-overlay on top of your video. Default: `true`. */\n applyLocalVideoOverlay?: boolean\n /** Whether to stop the camera when the member is muted. Default: `true`. */\n stopCameraWhileMuted?: boolean\n /** Whether to stop the microphone when the member is muted. Default: `true`. */\n stopMicrophoneWhileMuted?: boolean\n /** List of ICE servers. */\n iceServers?: RTCIceServer[]\n /** Audio constraints to use when joining the room. Default: `true`. */\n audio?: MediaStreamConstraints['audio']\n /** Video constraints to use when joining the room. Default: `true`. */\n video?: MediaStreamConstraints['video']\n /** Id of the speaker device to use for audio output. If undefined, picks a default speaker. */\n speakerId?: string\n /** Whether to automatically join the room session. */\n autoJoin?: boolean\n }\n > {}\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n aspectRatio: { ideal: 16 / 9 },\n}\n\n/**\n * Using Video.createRoomObject() you can create a `RoomObject` to join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.createRoomObject({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * roomObj.join()\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const createRoomObject = (\n roomOptions: CreateRoomObjectOptions\n): Promise<Room> => {\n return new Promise(async (resolve, reject) => {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElementId,\n applyLocalVideoOverlay = true,\n autoJoin = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\n\n const client = createClient<Room>({\n ...userOptions,\n })\n await client.connect()\n\n if (!client) {\n return\n }\n\n /**\n * Since `makeRoomObject` now only accepts a\n * `rootElement` the following is to preserve backwards\n * compatibility with the previous syntax\n */\n let rootElement: HTMLElement | undefined\n if (rootElementId) {\n const el = document.getElementById(rootElementId)\n\n if (el) {\n rootElement = el\n } else {\n rootElement = document.body\n\n getLogger().warn(\n `We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`\n )\n }\n }\n\n const roomObject = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n roomObject.once('destroy', () => {\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n roomObject.once('room.subscribed', (_payload) => {\n resolve(roomObject)\n })\n\n await roomObject.join()\n } catch (error) {\n getLogger().error('Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const room = new Proxy(roomObject, {\n get(target: any, prop: any, receiver: any) {\n if (prop === 'join') {\n return join\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n\n if (autoJoin) {\n try {\n await room.join()\n resolve(room)\n } catch (error) {\n reject(error)\n }\n } else {\n resolve(room)\n }\n })\n}\n", "import { CreateRoomObjectOptions, createRoomObject } from './createRoomObject'\n\n/**\n * Using Video.joinRoom() you can automatically join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.joinRoom({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * // You have joined the room..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const joinRoom = (roomOptions: CreateRoomObjectOptions) => {\n return createRoomObject({\n ...roomOptions,\n autoJoin: true,\n })\n}\n", "import { UserOptions, AssertSameType, getLogger } from '@signalwire/core'\nimport { createClient } from './createClient'\nimport type { MakeRoomOptions } from './Client'\nimport { BaseRoomSession } from './BaseRoomSession'\nimport { RoomSessionDocs } from './RoomSession.docs'\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n aspectRatio: { ideal: 16 / 9 },\n}\n\n/**\n * List of properties/methods the user shouldn't be able to\n * use until they sucessfully call `roomSession.join()`.\n */\nexport const UNSAFE_PROP_ACCESS = [\n 'audioMute',\n 'audioUnmute',\n 'deaf',\n 'getLayouts',\n 'getMembers',\n 'getRecordings',\n 'hideVideoMuted',\n 'leave',\n 'removerMember',\n 'restoreOutboundAudio',\n 'restoreOutboundVideo',\n 'setInputSensitivity',\n 'setInputVolume',\n 'setLayout',\n 'setPositions',\n 'setMemberPosition',\n 'setOutputVolume',\n 'showVideoMuted',\n 'startRecording',\n 'stopOutboundAudio',\n 'stopOutboundVideo',\n 'undeaf',\n 'videoMute',\n 'videoUnmute',\n 'setMicrophoneVolume',\n 'setSpeakerVolume',\n 'setMeta',\n 'setMemberMeta',\n]\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\ninterface RoomSessionMain extends BaseRoomSession<RoomSessionMain> {\n new (opts: RoomSessionOptions): this\n}\n\n/**\n * A RoomSession allows you to start and control video sessions.\n *\n * For example, the following code joins a video session and listens for new\n * members joining:\n *\n * ```typescript\n * const roomSession = new SignalWire.Video.RoomSession({\n * token: '<YourRoomToken>',\n * rootElement: document.getElementById('myVideoElement'),\n * audio: true,\n * video: true,\n * })\n *\n * roomSession.on('member.joined', (e) => {\n * console.log(`${e.member.name} joined`)\n * })\n *\n * roomSession.join()\n * ```\n *\n * ## Events\n *\n * Please see {@link RoomSessionEvents} for the list of events emitted by a\n * RoomSession object.\n */\nexport interface RoomSession\n extends AssertSameType<RoomSessionMain, RoomSessionDocs<RoomSessionMain>> {}\n\n/**\n * @ignore\n * @privateRemarks\n *\n * The use of a function expression as a contructor instead\n * of a class was picked because it made a couple things\n * simpler for this use case.\n * 1. Making classes behave as factories can be tricky when\n * working with TypeScript since it's non trivial to\n * switch the type returned by the constructor\n * 2. It also generates more verbose code (once transpiled)\n * if we want to have private fields to store `room` and\n * `client`.\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\n\n const client = createClient<RoomSession>(userOptions)\n const room = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n room.once('room.subscribed', (payload) => {\n // @ts-expect-error\n room.attachOnSubscribedWorkers(payload)\n resolve(room)\n })\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const interceptors = {\n join,\n } as const\n\n return new Proxy<Omit<RoomSession, 'new'>>(room, {\n get(target: RoomSession, prop: keyof RoomSession, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (!target.active && UNSAFE_PROP_ACCESS.includes(prop)) {\n throw new Error(\n `Tried to access the property/method \"${prop}\" before the room was connected. Please call roomSession.join() first.`\n )\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (roomOptions: RoomSessionOptions): RoomSession }\n", "export {\n getDevices,\n getCameraDevices,\n getMicrophoneDevices,\n getSpeakerDevices,\n getDevicesWithPermissions,\n getCameraDevicesWithPermissions,\n getMicrophoneDevicesWithPermissions,\n getSpeakerDevicesWithPermissions,\n checkPermissions,\n checkCameraPermissions,\n checkMicrophonePermissions,\n checkSpeakerPermissions,\n requestPermissions,\n createDeviceWatcher,\n createCameraDeviceWatcher,\n createMicrophoneDeviceWatcher,\n createSpeakerDeviceWatcher,\n supportsMediaDevices,\n supportsGetUserMedia,\n supportsGetDisplayMedia,\n getUserMedia,\n getDisplayMedia,\n enumerateDevices,\n getSupportedConstraints,\n supportsMediaOutput,\n setMediaElementSinkId,\n stopStream,\n stopTrack,\n createMicrophoneAnalyzer,\n} from '@signalwire/webrtc'\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../src/index.ts", "../src/chat/index.ts", "../src/createClient.ts", "../src/Client.ts", "../src/features/mediaElements/mediaElementsSagas.ts", "../src/utils/videoElement.ts", "../src/utils/audioElement.ts", "../src/features/actions.ts", "../src/BaseRoomSession.ts", "../src/utils/constants.ts", "../src/RoomSessionScreenShare.ts", "../src/RoomSessionDevice.ts", "../src/video/memberListUpdatedWorker.ts", "../src/video/memberPositionWorker.ts", "../src/cantina/VideoManager.ts", "../src/cantina/workers.ts", "../src/JWTSession.ts", "../src/chat/Client.ts", "../src/pubSub/index.ts", "../src/pubSub/Client.ts", "../src/video.ts", "../src/createRoomObject.ts", "../src/joinRoom.ts", "../src/RoomSession.ts", "../src/utils/roomSession.ts", "../src/webrtc.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Welcome to the technical documentation for the JavaScript SDK.\n *\n * At the outer level, when you import the SignalWire JS library you get access\n * to three different namespaces:\n *\n * - {@link Video}\n * - {@link Chat}\n * - {@link WebRTC}\n *\n * Video gives you access to the classes and methods that let you\n * interface with the backend Video APIs. Chat gives you access to the classes and functions that you need to create a real-time chat application. WebRTC\n * contains several functions that are useful for interacting with the hardware of the user's device.\n *\n *\n * Don't know where to start? Create an instance of\n * {@link Video.RoomSession} to join a room, use the {@link Chat.Client} constructor to start a chat application, or take a look at [Getting Started\n * with the SignalWire Video\n * API](https://developer.signalwire.com/apis/docs/getting-started-with-the-signalwire-video-api-1).\n *\n * @module\n */\n\nimport type {\n VideoRoomSessionEventNames,\n RoomStarted,\n RoomSubscribed,\n RoomUpdated,\n RoomEnded,\n VideoMemberEntity,\n} from '@signalwire/core'\n\n/** @ignore @deprecated */\nexport type RoomStartedEventName = RoomStarted\n/** @ignore @deprecated */\nexport type RoomEndedEventName = RoomEnded\n/** @ignore @deprecated */\nexport type RoomSubscribedEventName = RoomSubscribed\n/** @ignore @deprecated */\nexport type RoomUpdatedEventName = RoomUpdated\n/** @ignore @deprecated */\nexport type RoomEvent = VideoRoomSessionEventNames\n/** @ignore @deprecated */\nexport type RoomMember = VideoMemberEntity & { type: 'member' }\n/** @ignore @deprecated */\nexport type RoomScreenShare = VideoMemberEntity & { type: 'screen' }\n/** @ignore @deprecated */\nexport type RoomDevice = VideoMemberEntity & { type: 'device' }\n\n/**\n * The Chat namespace contains the classes and functions that you need to\n * create a real-time chat application.\n */\nexport * as Chat from './chat'\n\nexport * as PubSub from './pubSub'\n\n/**\n * The Video namespace contains the classes and functions that you need to\n * create a video conferencing application.\n */\nexport * as Video from './video'\n\n/**\n * The WebRTC namespace includes functions that give you access to the input and\n * output media devices available on the user's machine. For example, you can\n * use these functions to request permission and get access to the media stream\n * from a webcam, from a microphone, or from a screen sharing.\n */\nexport * as WebRTC from './webrtc'\n\nexport type {\n VideoPosition,\n VideoPositions,\n} from '@signalwire/core'\n\n/** @ignore */\nexport type {\n BaseComponentOptions,\n BaseConnectionState,\n ClientEvents,\n EmitterContract,\n RoomEventNames,\n RTCTrackEventName,\n UserOptions,\n SessionStatus,\n SessionEvents,\n VideoLayout,\n VideoLayoutEventNames,\n VideoRoomSessionEventNames,\n VideoRoomEventParams,\n VideoMemberEntity,\n VideoMemberEventNames,\n MemberTalkingEventNames,\n VideoMemberTalkingEventParams,\n InternalVideoMemberEntity,\n} from '@signalwire/core'\n\n/** @ignore */\nexport type {\n BaseConnectionOptions,\n ConnectionOptions,\n} from '@signalwire/webrtc'\n\n/** @ignore */\nexport type {\n RoomSessionObjectEventsHandlerMap,\n RoomSessionObjectEvents,\n // Just to keep backwards compatibility.\n RoomSessionObjectEventsHandlerMap as RoomObjectEventsHandlerMap,\n RoomSessionObjectEvents as RoomObjectEvents,\n} from './utils/interfaces'\n", "import { Chat } from '@signalwire/core'\nimport ChatMember = Chat.ChatMember\nimport ChatMessage = Chat.ChatMessage\n\nexport * from './Client'\nexport { PagingCursor } from './Client.docs'\n\nexport {\n ChatMember,\n ChatMessage,\n}", "import {\n ClientEvents,\n configureStore,\n connect,\n getEventEmitter,\n UserOptions,\n} from '@signalwire/core'\nimport { ClientAPI, Client } from './Client'\nimport { JWTSession } from './JWTSession'\n\n/**\n * With Video.createClient() you can establish a WebSocket connection\n * with SignalWire and interact with the client.\n *\n * ## Examples\n * Create a client\n *\n * @example\n * ```js\n * try {\n * const client = Video.createClient({\n * token: '<YourJWT>',\n * })\n *\n * await client.connect()\n * // Your client is ready now..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @internal\n */\nexport const createClient = <RoomSessionType>(userOptions: UserOptions) => {\n const baseUserOptions = {\n ...userOptions,\n emitter: getEventEmitter<ClientEvents>(),\n }\n const store = configureStore({\n userOptions: baseUserOptions,\n SessionConstructor: JWTSession,\n })\n const client = connect<\n ClientEvents,\n ClientAPI<RoomSessionType>,\n Client<RoomSessionType>\n >({\n store,\n Component: ClientAPI,\n componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\n })(baseUserOptions)\n\n return client\n}\n", "import {\n BaseClient,\n ClientEvents,\n ClientContract,\n actions,\n Chat as ChatNamespace,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport type { CustomSaga } from '@signalwire/core'\nimport { ConnectionOptions } from '@signalwire/webrtc'\nimport {\n makeVideoElementSaga,\n makeAudioElementSaga,\n} from './features/mediaElements/mediaElementsSagas'\nimport { RoomSession } from './RoomSession'\nimport {\n createBaseRoomSessionObject,\n RoomSessionConnection,\n} from './BaseRoomSession'\nimport { VideoManager, createVideoManagerObject } from './cantina'\nimport type { Client as ChatClient } from './chat/Client'\nimport type { Client as PubSubClient } from './pubSub/Client'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI<RoomSessionType>['rooms']\n chat: ClientAPI<RoomSessionType>['chat']\n pubSub: ClientAPI<RoomSessionType>['pubSub']\n}\n\nexport interface MakeRoomOptions extends ConnectionOptions {\n rootElement?: HTMLElement\n applyLocalVideoOverlay?: boolean\n stopCameraWhileMuted?: boolean\n stopMicrophoneWhileMuted?: boolean\n}\n\nexport class ClientAPI<\n RoomSessionType = RoomSession\n> extends BaseClient<ClientEvents> {\n private _videoManager: VideoManager\n private _chat: ChatClient\n private _pubSub: PubSubClient\n\n get rooms() {\n return {\n makeRoomObject: (makeRoomOptions: MakeRoomOptions) => {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n ...options\n } = makeRoomOptions\n\n const customSagas: Array<CustomSaga<RoomSessionConnection>> = []\n\n /**\n * By default the SDK will attach the audio to\n * an Audio element (regardless of \"rootElement\")\n */\n customSagas.push(\n makeAudioElementSaga({\n speakerId: options.speakerId,\n })\n )\n\n /**\n * If the user provides a `roomElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n customSagas.push(\n makeVideoElementSaga({\n rootElement,\n applyLocalVideoOverlay,\n })\n )\n }\n\n const room = createBaseRoomSessionObject<RoomSessionType>({\n ...options,\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n customSagas,\n })\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audio_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'audio_muted' in member) {\n member.audio_muted\n ? room.stopOutboundAudio()\n : room.restoreOutboundAudio()\n }\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n })\n }\n\n /**\n * Stop and Restore outbound video on video_muted event\n */\n if (stopCameraWhileMuted) {\n room.on('member.updated.video_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted\n ? room.stopOutboundVideo()\n : room.restoreOutboundVideo()\n }\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n })\n }\n\n return room\n },\n }\n }\n\n get chat() {\n if (!this._chat) {\n this._chat = ChatNamespace.createBaseChatObject<ChatClient>({\n store: this.store,\n // Emitter is now typed but we share it across objects\n // so types won't match\n // @ts-expect-error\n emitter: this.options.emitter,\n })\n }\n return this._chat\n }\n\n get pubSub() {\n if (!this._pubSub) {\n this._pubSub = PubSubNamespace.createBasePubSubObject<PubSubClient>({\n store: this.store,\n // Emitter is now typed but we share it across objects\n // so types won't match\n // @ts-expect-error\n emitter: this.options.emitter,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n // @ts-expect-error\n this._videoManager = createVideoManagerObject(this.options)\n }\n return this._videoManager\n }\n\n /**\n * Reauthenticate with the SignalWire network using a new token\n * For now it returns void since with an invalid token the server\n * will close the connection right away so we can hook on the session\n * events in case. Need to improve it.\n *\n * @internal\n */\n reauthenticate(token: string) {\n this.store.dispatch(actions.reauthAction({ token }))\n }\n}\n", "import {\n getLogger,\n CustomSagaParams,\n actions,\n sagaEffects,\n} from '@signalwire/core'\nimport type { SagaIterator, Task } from '@signalwire/core'\nimport { setMediaElementSinkId } from '@signalwire/webrtc'\nimport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n LocalOverlay,\n addSDKPrefix,\n} from '../../utils/videoElement'\nimport { setAudioMediaTrack } from '../../utils/audioElement'\nimport { audioSetSpeakerAction } from '../actions'\nimport type { RoomSessionConnection } from '../../BaseRoomSession'\n\nexport const makeVideoElementSaga = ({\n rootElement,\n applyLocalVideoOverlay,\n}: {\n rootElement: HTMLElement\n applyLocalVideoOverlay?: boolean\n}) => {\n return function* videoElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<RoomSessionConnection>): SagaIterator {\n try {\n const layerMap = new Map<string, HTMLDivElement>()\n const videoEl = buildVideo()\n\n /**\n * We used this `LocalOverlay` interface to interact with the localVideo\n * overlay DOM element in here and in the `layoutChangedHandler`.\n * The idea is to avoid APIs like `document.getElementById` because it\n * won't work if the SDK is used within a Shadow DOM tree.\n * Instead of querying the `document`, let's use our `layerMap`.\n */\n const localOverlay: LocalOverlay = {\n // Each `layout.changed` event will update `status`\n status: 'hidden',\n get id() {\n return addSDKPrefix(room.memberId)\n },\n get domElement() {\n return layerMap.get(this.id)\n },\n set domElement(element: HTMLDivElement | undefined) {\n if (element) {\n getLogger().debug('Set localOverlay', element)\n layerMap.set(this.id, element)\n } else {\n getLogger().debug('Remove localOverlay')\n layerMap.delete(this.id)\n }\n },\n hide() {\n if (!this.domElement) {\n return getLogger().warn('Missing localOverlay to hide')\n }\n this.domElement.style.opacity = '0'\n },\n show() {\n if (!this.domElement) {\n return getLogger().warn('Missing localOverlay to show')\n }\n if (this.status === 'hidden') {\n return getLogger().info('localOverlay not visible')\n }\n this.domElement.style.opacity = '1'\n },\n }\n\n const layoutChangedHandler = makeLayoutChangedHandler({\n rootElement,\n localOverlay,\n })\n\n room.on('layout.changed', (params) => {\n getLogger().debug('Received layout.changed')\n if (room.peer.hasVideoSender && room.localStream) {\n layoutChangedHandler({\n // @ts-expect-error\n layout: params.layout,\n localStream: room.localStream,\n myMemberId: room.memberId,\n })\n }\n })\n\n /**\n * If the user joins with `join_video_muted: true` or\n * `join_audio_muted: true` we'll stop the streams\n * right away.\n */\n room.once('room.subscribed', (params) => {\n const member = params.room_session.members?.find(\n (m) => m.id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n getLogger().error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n getLogger().error('Error handling video_muted', error)\n }\n }\n })\n\n room.on('member.updated.video_muted', (params) => {\n try {\n const { member } = params\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted ? localOverlay.hide() : localOverlay.show()\n }\n } catch (error) {\n getLogger().error('Error handling video_muted', error)\n }\n })\n\n let videoTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'video': {\n videoTask = runSaga(videoElementSetupWorker, {\n applyLocalVideoOverlay,\n rootElement,\n track: event.track,\n element: videoEl,\n })\n // Remove listener when done with video\n room.off('track', trackHandler)\n break\n }\n }\n }\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n cleanupElement(rootElement)\n layerMap.clear()\n videoTask?.cancel()\n })\n } catch (error) {\n getLogger().error('videoElementSaga', error)\n }\n }\n}\n\nexport const makeAudioElementSaga = ({ speakerId }: { speakerId?: string }) => {\n return function* audioElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<RoomSessionConnection>): SagaIterator {\n if (typeof Audio === 'undefined') {\n getLogger().warn('`Audio` is not supported on this environment.')\n return\n }\n\n try {\n const audioEl = new Audio()\n let audioTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'audio': {\n audioTask = runSaga(audioElementSetupWorker, {\n track: event.track,\n element: audioEl,\n speakerId,\n room,\n })\n // Remove listener when done with audio\n room.off('track', trackHandler)\n break\n }\n }\n }\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n audioTask?.cancel()\n })\n } catch (error) {\n getLogger().error('audioElementSaga', error)\n }\n }\n}\n\nfunction* audioElementActionsWatcher({\n element,\n room,\n}: {\n element: HTMLAudioElement\n room: RoomSessionConnection\n}): SagaIterator {\n // TODO: For now we're handling individual actions but in the future\n // we might want to have a single action per custom saga and use it\n // in a similar fashion to `executeAction`\n const setSpeakerActionType = actions.getCustomSagaActionType(\n room.__uuid,\n audioSetSpeakerAction\n )\n\n while (true) {\n const action = yield sagaEffects.take([setSpeakerActionType])\n\n try {\n switch (action.type) {\n case setSpeakerActionType:\n const response = yield sagaEffects.call(\n setMediaElementSinkId,\n element,\n action.payload\n )\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: response,\n kind: 'resolve',\n })\n break\n }\n } catch (error) {\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: error,\n kind: 'reject',\n })\n getLogger().error(error)\n }\n }\n}\n\nfunction* audioElementSetupWorker({\n track,\n element,\n speakerId,\n room,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n speakerId?: string\n room: RoomSessionConnection\n}): SagaIterator {\n setAudioMediaTrack({ track, element })\n if (speakerId) {\n // Catch no-op since setMediaElementSinkId already provides logs\n setMediaElementSinkId(element, speakerId).catch(() => {})\n }\n\n yield sagaEffects.fork(audioElementActionsWatcher, {\n element,\n room,\n })\n}\n\nfunction* videoElementSetupWorker({\n rootElement,\n applyLocalVideoOverlay = true,\n track,\n element,\n}: {\n // TODO: we'll move this to a separate type once we define how to\n // dispatch action that only target unique sagas\n rootElement: HTMLElement\n applyLocalVideoOverlay?: boolean\n track: MediaStreamTrack\n element: HTMLVideoElement\n}): SagaIterator {\n const handleVideoTrack = async (track: MediaStreamTrack) => {\n setVideoMediaTrack({ element, track })\n\n element.style.width = '100%'\n\n if (!applyLocalVideoOverlay) {\n rootElement.appendChild(element)\n return\n }\n\n const mcuWrapper = document.createElement('div')\n mcuWrapper.style.position = 'absolute'\n mcuWrapper.style.top = '0'\n mcuWrapper.style.left = '0'\n mcuWrapper.style.right = '0'\n mcuWrapper.style.bottom = '0'\n mcuWrapper.appendChild(element)\n\n const paddingWrapper = document.createElement('div')\n paddingWrapper.style.paddingBottom = '56.25%'\n paddingWrapper.appendChild(mcuWrapper)\n\n const layersWrapper = document.createElement('div')\n layersWrapper.classList.add('mcuLayers')\n layersWrapper.style.display = 'none'\n paddingWrapper.appendChild(layersWrapper)\n\n const relativeWrapper = document.createElement('div')\n relativeWrapper.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.display = 'flex'\n rootElement.style.alignItems = 'center'\n rootElement.style.justifyContent = 'center'\n rootElement.appendChild(relativeWrapper)\n\n if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n await waitForVideoReady({ element })\n }\n layersWrapper.style.display = 'block'\n }\n\n handleVideoTrack(track).catch((error) => {\n getLogger().error('Handle video track error', error)\n })\n\n // TODO: take destroy\n}\n", "import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\n} from '@signalwire/core'\n\nconst addSDKPrefix = (input: string) => {\n return `sw-sdk-${input}`\n}\n\nconst buildVideo = () => {\n const video = document.createElement('video')\n video.muted = true\n video.autoplay = true\n video.playsInline = true\n\n /**\n * Local and Remov video elements should never be paused\n * and Safari/Firefox pause the video (ie: enabling PiP, switch cameras etc)\n * We try to force it to keep playing.\n */\n video.addEventListener('pause', () => {\n video.play().catch((error) => {\n getLogger().error('Video Element Paused', video, error)\n })\n })\n\n return video\n}\n\nconst waitForVideoReady = ({ element }: { element: HTMLVideoElement }) => {\n return new Promise<void>((resolve) => {\n element.addEventListener('canplay', function listener() {\n element.removeEventListener('canplay', listener)\n resolve()\n })\n element.addEventListener('resize', function listener() {\n element.removeEventListener('resize', listener)\n resolve()\n })\n })\n}\n\nconst _getLocationStyles = ({\n x,\n y,\n width,\n height,\n}: InternalVideoLayoutLayer) => {\n return {\n top: `${y}%`,\n left: `${x}%`,\n width: `${width}%`,\n height: `${height}%`,\n }\n}\n\nconst _buildLayer = ({ location }: { location: InternalVideoLayoutLayer }) => {\n const { top, left, width, height } = _getLocationStyles(location)\n const layer = document.createElement('div')\n layer.style.position = 'absolute'\n layer.style.overflow = 'hidden'\n layer.style.top = top\n layer.style.left = left\n layer.style.width = width\n layer.style.height = height\n\n return layer\n}\n\nexport interface LocalOverlay {\n readonly id: string\n status: 'hidden' | 'visible'\n domElement: HTMLDivElement | undefined\n hide(): void\n show(): void\n}\n\ninterface MakeLayoutChangedHandlerParams {\n localOverlay: LocalOverlay\n rootElement: HTMLElement\n}\n\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n myMemberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler =\n ({ localOverlay, rootElement }: MakeLayoutChangedHandlerParams) =>\n async ({ layout, myMemberId, localStream }: LayoutChangedHandlerParams) => {\n getLogger().debug('Process layout.changed')\n try {\n const { layers = [] } = layout\n const location = layers.find(({ member_id }) => member_id === myMemberId)\n\n let myLayer = localOverlay.domElement\n // Update localOverlay.status if a location has been found\n localOverlay.status = location ? 'visible' : 'hidden'\n if (!location) {\n getLogger().debug('Location not found')\n if (myLayer) {\n getLogger().debug('Current layer not visible')\n localOverlay.hide()\n }\n\n return\n }\n\n if (!myLayer) {\n getLogger().debug('Build myLayer')\n myLayer = _buildLayer({ location })\n myLayer.id = localOverlay.id\n\n const localVideo = buildVideo()\n localVideo.srcObject = localStream\n localVideo.style.width = '100%'\n localVideo.style.height = '100%'\n\n myLayer.appendChild(localVideo)\n\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n const exists = mcuLayers?.querySelector(`#${myLayer.id}`)\n if (mcuLayers && !exists) {\n mcuLayers.appendChild(myLayer)\n localOverlay.domElement = myLayer\n }\n\n return\n }\n\n const { top, left, width, height } = _getLocationStyles(location)\n getLogger().debug('Update myLayer:', top, left, width, height)\n /**\n * Show myLayer only if the localStream has a valid video track\n */\n const hasVideo = localStream.getVideoTracks().length > 0\n myLayer.style.opacity = hasVideo ? '1' : '0'\n myLayer.style.top = top\n myLayer.style.left = left\n myLayer.style.width = width\n myLayer.style.height = height\n } catch (error) {\n getLogger().error('Layout Changed Error', error)\n }\n }\n\nconst cleanupElement = (rootElement: HTMLElement) => {\n while (rootElement.firstChild) {\n rootElement.removeChild(rootElement.firstChild)\n }\n}\n\nconst setVideoMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLVideoElement\n}) => {\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n}\n\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n addSDKPrefix,\n}\n", "const setAudioMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n}) => {\n element.autoplay = true\n // @ts-ignore\n element.playsinline = true\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n\n return element\n}\n\nexport { setAudioMediaTrack }\n", "import { actions } from '@signalwire/core'\n\nexport const audioSetSpeakerAction = actions.createAction<string>(\n 'swJs/audioSetSpeakerAction'\n)\n", "import {\n connect,\n Rooms,\n EventTransform,\n extendComponent,\n BaseComponentContract,\n BaseComponentOptions,\n BaseConnectionContract,\n toLocalEvent,\n toExternalJSON,\n VideoRoomEventParams,\n MemberPosition,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport {\n getDisplayMedia,\n BaseConnection,\n BaseConnectionOptions,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport type {\n RoomSessionObjectEvents,\n CreateScreenShareObjectOptions,\n AddDeviceOptions,\n AddCameraOptions,\n AddMicrophoneOptions,\n BaseRoomInterface,\n RoomMethods,\n StartScreenShareOptions,\n RoomSessionConnectionContract,\n} from './utils/interfaces'\nimport {\n ROOM_COMPONENT_LISTENERS,\n SCREENSHARE_AUDIO_CONSTRAINTS,\n} from './utils/constants'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare,\n} from './RoomSessionScreenShare'\nimport {\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDevice,\n} from './RoomSessionDevice'\nimport * as workers from './video/workers'\n\nexport interface BaseRoomSession<T>\n extends RoomMethods,\n RoomSessionConnectionContract,\n BaseComponentContract,\n BaseConnectionContract<RoomSessionObjectEvents> {\n join(): Promise<T>\n /** @internal */\n joinAudience(options?: { audio?: boolean; video?: boolean }): Promise<T>\n leave(): Promise<void>\n}\n\nexport class RoomSessionConnection\n extends BaseConnection<RoomSessionObjectEvents>\n implements BaseRoomInterface, RoomSessionConnectionContract\n{\n private _screenShareList = new Set<RoomSessionScreenShare>()\n private _deviceList = new Set<RoomSessionDevice>()\n\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n /** @internal */\n protected getEmitterTransforms() {\n return new Map<string | string[], EventTransform>([\n [\n ['video.room.joined'],\n {\n type: 'roomSession',\n instanceFactory: () => {\n return {}\n },\n payloadTransform: (payload: VideoRoomSubscribedEventParams) => {\n return payload\n },\n nestedFieldsToProcess: {\n recordings: {\n eventTransformType: 'roomSessionRecording',\n processInstancePayload: (payload) => ({ recording: payload }),\n },\n playbacks: {\n eventTransformType: 'roomSessionPlayback',\n processInstancePayload: (payload) => ({ member: payload }),\n },\n },\n },\n ],\n [\n [\n toLocalEvent('video.recording.start'),\n 'video.recording.started',\n 'video.recording.updated',\n 'video.recording.ended',\n ],\n {\n type: 'roomSessionRecording',\n instanceFactory: (_payload: any) => {\n return Rooms.createRoomSessionRecordingObject({\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n })\n },\n payloadTransform: (payload: any) => {\n return toExternalJSON({\n ...payload.recording,\n room_session_id: this.roomSessionId,\n })\n },\n },\n ],\n [\n [\n toLocalEvent('video.playback.start'),\n 'video.playback.started',\n 'video.playback.updated',\n 'video.playback.ended',\n ],\n {\n type: 'roomSessionPlayback',\n instanceFactory: (_payload: any) => {\n return Rooms.createRoomSessionPlaybackObject({\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n })\n },\n payloadTransform: (payload: any) => {\n return toExternalJSON({\n ...payload.playback,\n room_session_id: this.roomSessionId,\n })\n },\n },\n ],\n ])\n }\n\n /** @internal */\n protected override getCompoundEvents() {\n return new Map<any, any>([\n ...MemberPosition.MEMBER_POSITION_COMPOUND_EVENTS,\n ])\n }\n\n /**\n * This method will be called by `join()` right before the\n * `connect()` happens and it's a way for us to control\n * exactly when the workers are attached.\n * @internal\n */\n protected attachPreConnectWorkers() {\n this.runWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n }\n\n /**\n * This method will be called right after\n * `room.subscribed` happened\n * @internal\n */\n protected attachOnSubscribedWorkers(payload: VideoRoomEventParams) {\n this.runWorker('memberPositionWorker', {\n worker: workers.memberPositionWorker,\n initialState: payload,\n })\n }\n\n /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions<RoomSessionObjectEvents> = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n BaseConnectionStateEventTypes,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n /**\n * Hangup if the user stop the screenShare from the\n * native browser button or if the videoTrack ends.\n */\n displayStream.getVideoTracks().forEach((t) => {\n t.addEventListener('ended', () => {\n if (screenShare && screenShare.active) {\n screenShare.leave()\n }\n })\n })\n\n screenShare.on('destroy', () => {\n this._screenShareList.delete(screenShare)\n })\n\n try {\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n await screenShare.join()\n }\n return screenShare\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n throw error\n }\n }\n\n /**\n * Allow to add a camera to the room.\n */\n addCamera(opts: AddCameraOptions = {}) {\n const { autoJoin = true, ...video } = opts\n return this.addDevice({\n autoJoin,\n video,\n })\n }\n\n /**\n * Allow to add a microphone to the room.\n */\n addMicrophone(opts: AddMicrophoneOptions = {}) {\n const { autoJoin = true, ...audio } = opts\n return this.addDevice({\n autoJoin,\n audio,\n })\n }\n\n /**\n * Allow to add additional devices to the room like cameras or microphones.\n */\n async addDevice(opts: AddDeviceOptions = {}) {\n const { autoJoin = true, audio = false, video = false } = opts\n if (!audio && !video) {\n throw new TypeError(\n 'At least one of `audio` or `video` must be requested.'\n )\n }\n\n const options: BaseConnectionOptions<RoomSessionObjectEvents> = {\n ...this.options,\n localStream: undefined,\n remoteStream: undefined,\n audio,\n video,\n additionalDevice: true,\n recoverCall: false,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n BaseConnectionStateEventTypes,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n roomDevice.on('destroy', () => {\n this._deviceList.delete(roomDevice)\n })\n\n try {\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n await roomDevice.join()\n }\n return roomDevice\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n throw error\n }\n }\n\n join() {\n return super.invite<BaseRoomSession<this>>()\n }\n\n leave() {\n return this.hangup()\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n\n /** @internal */\n async hangup() {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup()\n }\n\n /** @internal */\n protected _finalize() {\n this._screenShareList.clear()\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /**\n * @deprecated Use {@link getLayouts} instead. `getLayoutList` will\n * be removed in v3.0.0\n */\n getLayoutList() {\n // @ts-expect-error\n return this.getLayouts()\n }\n\n /**\n * @deprecated Use {@link getMembers} instead. `getMemberList` will\n * be removed in v3.0.0\n */\n getMemberList() {\n // @ts-expect-error\n return this.getMembers()\n }\n}\n\nexport const RoomSessionAPI = extendComponent<\n RoomSessionConnection,\n RoomMethods\n>(RoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n removeAllMembers: Rooms.removeAllMembers,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n setMeta: Rooms.setMeta,\n setMemberMeta: Rooms.setMemberMeta,\n})\n\ntype RoomSessionObjectEventsHandlerMapping = RoomSessionObjectEvents &\n BaseConnectionStateEventTypes\n\n/** @internal */\nexport const createBaseRoomSessionObject = <RoomSessionType>(\n params: BaseComponentOptions<RoomSessionObjectEventsHandlerMapping>\n): BaseRoomSession<RoomSessionType> => {\n const room = connect<\n RoomSessionObjectEventsHandlerMapping,\n RoomSessionConnection,\n BaseRoomSession<RoomSessionType>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: RoomSessionAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(params)\n\n return room\n}\n", "export const ROOM_COMPONENT_LISTENERS = {\n state: 'onStateChange',\n remoteSDP: 'onRemoteSDP',\n roomId: 'onRoomSubscribed',\n videoConstraints: 'onVideoConstraints',\n audioConstraints: 'onAudioConstraints',\n errors: 'onError',\n responses: 'onSuccess',\n}\n\nexport const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n AssertSameType,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionScreenShareDocs } from './RoomSessionScreenShare.docs'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\ninterface RoomSessionScreenShareMain\n extends RoomScreenShareMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\n/**\n * Represents a screen sharing.\n */\nexport interface RoomSessionScreenShare\n extends AssertSameType<\n RoomSessionScreenShareMain,\n RoomSessionScreenShareDocs\n > {}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<BaseConnectionStateEventTypes> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\nexport const RoomSessionScreenShareAPI = extendComponent<\n RoomSessionScreenShareConnection,\n RoomScreenShareMethods\n>(RoomSessionScreenShareConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n AssertSameType,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionDeviceDocs } from './RoomSessionDevice.docs'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\ninterface RoomSessionDeviceMain\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\n/**\n * A RoomSessionDevice represents a device (such as a microphone or a camera)\n * that is at some point in its lifetime part of a {@link RoomSession}. You can\n * obtain a RoomSessionDevice from the {@link RoomSession} methods\n * {@link RoomSession.addCamera}, {@link RoomSession.addMicrophone}, and\n * {@link RoomSession.addDevice}.\n */\nexport interface RoomSessionDevice\n extends AssertSameType<RoomSessionDeviceMain, RoomSessionDeviceDocs> {}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<BaseConnectionStateEventTypes> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\nexport const RoomSessionDeviceAPI = extendComponent<\n RoomSessionDeviceConnection,\n RoomSessionDeviceMethods\n>(RoomSessionDeviceConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n", "import {\n sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n PubSubChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { RoomSession } from '../RoomSession'\nimport type { VideoMemberListUpdatedParams } from '../utils/interfaces'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'video.memberList.updated'\n\nconst INTERNAL_MEMBER_LIST_UPDATED_EVENT = toInternalEventName({\n event: EXTERNAL_MEMBER_LIST_UPDATED_EVENT,\n})\n\nconst SYNTHETIC_MEMBER_LIST_UPDATED_EVENT = toSyntheticEvent(\n INTERNAL_MEMBER_LIST_UPDATED_EVENT\n)\n\n/**\n * List of action types this worker cares about.\n */\ntype MemberListUpdatedTargetActions = MapToPubSubShape<\n | InternalVideoRoomJoinedEvent\n | InternalVideoMemberUpdatedEvent\n | VideoMemberJoinedEvent\n | VideoMemberLeftEvent\n | VideoMemberUpdatedEvent\n>\n\nconst MEMBER_LIST_EVENTS: Array<MemberListUpdatedTargetActions['type']> = [\n /** Alias to `video.room.subscribed` */\n 'video.room.joined',\n 'video.member.joined',\n 'video.member.left',\n 'video.member.updated',\n]\n\ntype MemberList = Map<string, InternalVideoMemberEntity>\n\nconst isMemberListEvent = (\n event: string\n): event is MemberListUpdatedTargetActions['type'] => {\n // @ts-expect-error\n return MEMBER_LIST_EVENTS.includes(event)\n}\n\nconst getMemberListEventsToSubscribe = (subscriptions: MemberListUpdatedTargetActions['type'][]) => {\n return validateEventsToSubscribe(MEMBER_LIST_EVENTS).filter((event) => {\n return !subscriptions.includes(event)\n })\n}\n\nconst shouldHandleMemberList = (subscriptions: string[]) => {\n return subscriptions.some((event) =>\n event.includes(INTERNAL_MEMBER_LIST_UPDATED_EVENT)\n )\n}\n\nconst getMembersFromAction = (action: MemberListUpdatedTargetActions) => {\n if (action.type === 'video.room.joined') {\n return action.payload.room_session.members\n }\n\n return [action.payload.member]\n}\n\nexport const getUpdatedMembers = ({\n action,\n memberList,\n}: {\n action: MemberListUpdatedTargetActions\n memberList: MemberList\n}) => {\n const actionMembers = getMembersFromAction(action)\n\n switch (action.type) {\n case 'video.member.left':\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.delete(member.id)\n })\n break\n default:\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.set(member.id, member)\n })\n }\n\n return Array.from(memberList.values())\n}\n\nconst initMemberListSubscriptions = (\n room: RoomSession,\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n const events = getMemberListEventsToSubscribe(subscriptions)\n\n events.forEach((event) => {\n /**\n * Params to `subscribe` come from the event handlers\n * the user has attached so to make sure we subscribe to\n * all the appropiate events needed for\n * `memberList.updated` to work, we must subscribe to\n * the required events. We don't need to act upon the\n * event (that's why we attach a `noop`), just to\n * register it (`subscribe` gets its values from\n * `BaseComponent.getSubscriptions`, which gets\n * populated by each of the event handlers the user\n * attached).\n */\n room.once(event as any, noop)\n })\n\n /**\n * This handler will act as a simple bridge between\n * synthetic events and external events.\n */\n const eventBridgeHandler = ({ members }: VideoMemberListUpdatedParams) => {\n // @ts-expect-error\n room.emit(EXTERNAL_MEMBER_LIST_UPDATED_EVENT, { members })\n }\n\n // @ts-expect-error\n room.on(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n\n /**\n * Any events attached by the saga should be specified\n * here so it can be cleaned up when needed.\n */\n const cleanup = () => {\n // @ts-expect-error\n room.off(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n }\n\n return {\n cleanup,\n }\n}\n\nfunction* membersListUpdatedWatcher({\n pubSubChannel,\n}: {\n pubSubChannel: PubSubChannel\n}): SagaIterator {\n const memberList: MemberList = new Map()\n\n function* worker(pubSubAction: MemberListUpdatedTargetActions) {\n const roomSessionId =\n pubSubAction.type === 'video.room.joined'\n ? pubSubAction.payload.room_session.id\n : pubSubAction.payload.room_session_id\n\n const members = getUpdatedMembers({ action: pubSubAction, memberList })\n const memberListPayload = {\n /**\n * At this point it's needed to send the\n * `room_session_id` so the pubSubSaga can properly\n * infer the namespace for emitting the events to the\n * appropiate room.\n */\n room_session_id: roomSessionId,\n members,\n }\n\n // TODO: add typings\n yield sagaEffects.put(pubSubChannel, {\n type: SYNTHETIC_MEMBER_LIST_UPDATED_EVENT as any,\n payload: memberListPayload as any,\n })\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n pubSubChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<RoomSession> =\n function* membersChangedWorker({\n channels: { pubSubChannel },\n instance,\n }): SagaIterator {\n // @ts-expect-error\n const subscriptions = instance.getSubscriptions()\n\n if (!shouldHandleMemberList(subscriptions)) {\n return\n }\n\n const { cleanup } = initMemberListSubscriptions(instance, subscriptions)\n\n yield sagaEffects.fork(membersListUpdatedWatcher, {\n pubSubChannel,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n", "import {\n SagaIterator,\n SDKWorker,\n MemberPosition,\n sagaEffects,\n} from '@signalwire/core'\n\nexport const memberPositionWorker: SDKWorker<any> =\n function* memberPositionWorker(options): SagaIterator {\n if (!options.initialState) {\n throw new Error('[memberPositionWorker] Missing initialState')\n }\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, options)\n }\n", "import {\n BaseComponentOptions,\n BaseConsumer,\n VideoManagerRoomEventNames,\n InternalVideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n EventTransform,\n toExternalJSON,\n VideoManagerRoomEntity,\n VideoManagerRoomsSubscribedEventParams,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\ntype EmitterTransformsEvents = InternalVideoManagerRoomEventNames\n\n/** @internal */\nexport type VideoManagerEvents = Record<\n VideoManagerRoomEventNames,\n (room: VideoManagerRoomEntity) => void\n>\n\n/** @internal */\nexport interface VideoManager extends ConsumerContract<VideoManagerEvents> {}\n\n/** @internal */\nexport class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {\n protected _eventsPrefix = 'video-manager' as const\n\n constructor(options: BaseComponentOptions<VideoManagerEvents>) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n getEmitterTransforms() {\n return new Map<\n EmitterTransformsEvents | EmitterTransformsEvents[],\n EventTransform\n >([\n [\n ['video-manager.rooms.subscribed'],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: ({\n rooms,\n }: VideoManagerRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n payloadTransform: ({\n rooms,\n }: VideoManagerRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n },\n ],\n [\n [\n 'video-manager.room.started',\n 'video-manager.room.added',\n 'video-manager.room.updated',\n 'video-manager.room.ended',\n 'video-manager.room.deleted',\n ],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: (payload) => toExternalJSON(payload),\n payloadTransform: (payload) => toExternalJSON(payload),\n },\n ],\n ])\n }\n}\n\nexport const createVideoManagerObject = (\n params: BaseComponentOptions<VideoManagerEvents>\n) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\n })(params)\n\n const proxy = new Proxy<VideoManager>(manager, {\n get(\n target: VideoManager,\n property: string | symbol,\n receiver: ProxyHandler<VideoManager>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'video-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n", "import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n} from '@signalwire/core'\nimport type { VideoManager } from './VideoManager'\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const { channels } = options\n const { swEventChannel, pubSubChannel } = channels\n\n while (true) {\n const action: MapToPubSubShape<VideoManagerEvent> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n return action.type.startsWith('video-manager.')\n }\n )\n\n yield sagaEffects.put(pubSubChannel, action)\n }\n}\n", "import jwtDecode from 'jwt-decode'\nimport { BaseJWTSession, getLogger, SessionOptions } from '@signalwire/core'\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public agent = process.env.SDK_PKG_AGENT!\n\n constructor(public options: SessionOptions) {\n let decodedJwt\n try {\n decodedJwt = jwtDecode<{ ch?: string }>(options.token, { header: true })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: decodedJwt?.ch || options.host,\n })\n }\n\n get allowHijack() {\n // @ts-expect-error\n return this.options._hijack\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowHijack) {\n return ''\n }\n\n const roomName = this.getRoomNameFromJWT()\n if (roomName) {\n this.logger.info('Hijacking: search protocol for', roomName)\n return window.sessionStorage.getItem(roomName) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowHijack) {\n return\n }\n\n const roomName = this.getRoomNameFromJWT()\n if (roomName) {\n this.logger.info(\n 'Hijacking: persist protocol',\n roomName,\n this.relayProtocol\n )\n window.sessionStorage.setItem(roomName, this.relayProtocol)\n }\n }\n\n private getRoomNameFromJWT() {\n try {\n const jwtPayload = jwtDecode<{ r: string }>(this.options.token)\n return jwtPayload?.r\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[getRoomNameFromJWT] error decoding the JWT')\n }\n return ''\n }\n }\n}\n", "import type {\n AssertSameType,\n ChatContract,\n ConsumerContract,\n UserOptions,\n Chat as ChatNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { ClientApiEventsDocs, ClientDocs } from './Client.docs'\n\ninterface ClientApiEventsMain extends ChatNamespace.BaseChatApiEvents {}\nexport interface ClientApiEvents\n extends AssertSameType<ClientApiEventsMain, ClientApiEventsDocs> {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\ninterface ClientMain\n extends ChatContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { Chat } from '@signalwire/js'\n *\n * const chatClient = new Chat.Client({\n * token: '<your_chat_token>', // get this from the REST APIs\n * })\n *\n * await chatClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * chatClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await chatClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a chat\n * Client object.\n */\nexport interface Client extends AssertSameType<ClientMain, ClientDocs> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'updateToken',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'setMemberState',\n]\n\nexport const Client = function (chatOptions: ClientOptions) {\n const client = createClient<Client>(chatOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.chat[prop](...params)\n }\n }\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n", "import { PubSub } from '@signalwire/core'\nimport PubSubMessage = PubSub.PubSubMessage\n\nexport * from './Client'\nexport { PagingCursor } from './Client.docs'\n\nexport {\n PubSubMessage,\n}\n", "import type {\n AssertSameType,\n PubSubContract,\n ConsumerContract,\n UserOptions,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { ClientApiEventsDocs, ClientDocs } from './Client.docs'\n\ninterface ClientApiEventsMain extends PubSubNamespace.BasePubSubApiEvents {}\nexport interface ClientApiEvents\n extends AssertSameType<ClientApiEventsMain, ClientApiEventsDocs> {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\ninterface ClientMain\n extends PubSubContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { PubSub } from '@signalwire/js'\n *\n * const pubSubClient = new PubSub.Client({\n * token: '<your pubSub token>', // get this from the REST APIs\n * })\n *\n * await pubSubClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * pubSubClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await pubSubClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a pubSub\n * Client object.\n */\nexport interface Client extends AssertSameType<ClientMain, ClientDocs> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'updateToken',\n]\n\nexport const Client = function (pubSubOptions: ClientOptions) {\n const client = createClient<Client>(pubSubOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.pubSub[prop](...params)\n }\n }\n\n return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (pubSubOptions: ClientOptions): Client }\n", "import { createRoomObject, Room } from './createRoomObject'\nimport { createClient } from './createClient'\nimport { joinRoom } from './joinRoom'\nimport { MakeRoomOptions } from './Client'\nimport { RoomSession, RoomSessionOptions } from './RoomSession'\nimport { RoomSessionDevice, RoomDevice } from './RoomSessionDevice'\nimport {\n RoomSessionScreenShare,\n RoomScreenShare,\n} from './RoomSessionScreenShare'\n\nexport {\n RoomSession,\n RoomSessionDevice,\n RoomSessionScreenShare,\n // Just to keep backwards compatibility.\n createRoomObject,\n joinRoom,\n Room,\n RoomDevice,\n RoomScreenShare,\n createClient,\n}\n\n/** @ignore */\nexport type { MakeRoomOptions, RoomSessionOptions }\n\n/** @ignore */\nexport type {\n MemberCommandParams,\n MemberCommandWithVolumeParams,\n MemberCommandWithValueParams,\n DeprecatedMemberUpdatableProps,\n DeprecatedVideoMemberHandlerParams,\n VideoMemberHandlerParams,\n VideoMemberListUpdatedParams,\n} from './utils/interfaces'\n\nexport type { CreateRoomObjectOptions } from './createRoomObject'\n\nexport type {\n RoomSessionRecording,\n RoomSessionPlayback,\n} from '@signalwire/core'\n\nexport type { RoomSessionEvents } from './RoomSession.docs'\n", "import { UserOptions, getLogger, AssertSameType } from '@signalwire/core'\nimport { createClient } from './createClient'\nimport { MakeRoomOptions } from './Client'\nimport { BaseRoomSession } from './BaseRoomSession'\n\n/**\n * @internal\n * @deprecated Use {@link RoomSession} instead.\n **/\nexport interface Room extends BaseRoomSession<Room> {}\n\ninterface CreateRoomObjectOptionsMain\n extends UserOptions,\n Omit<MakeRoomOptions, 'rootElement'> {\n /** Id of the HTML element in which to display the video stream */\n rootElementId?: string\n /** Whether to automatically join the room session. */\n autoJoin?: boolean\n}\n\n/**\n * @deprecated Usage of this object is deprecated. See {@link RoomSession}\n * instead.\n */\nexport interface CreateRoomObjectOptions\n extends AssertSameType<\n CreateRoomObjectOptionsMain,\n {\n /** SignalWire project id, e.g. `a10d8a9f-2166-4e82-56ff-118bc3a4840f` */\n project?: string\n /** SignalWire project token, e.g. `PT9e5660c101cd140a1c93a0197640a369cf5f16975a0079c9` */\n token: string\n /** logging level */\n logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent'\n /** Id of the HTML element in which to display the video stream */\n rootElementId?: string\n /** Whether to apply the local-overlay on top of your video. Default: `true`. */\n applyLocalVideoOverlay?: boolean\n /** Whether to stop the camera when the member is muted. Default: `true`. */\n stopCameraWhileMuted?: boolean\n /** Whether to stop the microphone when the member is muted. Default: `true`. */\n stopMicrophoneWhileMuted?: boolean\n /** List of ICE servers. */\n iceServers?: RTCIceServer[]\n /** Audio constraints to use when joining the room. Default: `true`. */\n audio?: MediaStreamConstraints['audio']\n /** Video constraints to use when joining the room. Default: `true`. */\n video?: MediaStreamConstraints['video']\n /** Id of the speaker device to use for audio output. If undefined, picks a default speaker. */\n speakerId?: string\n /** Whether to automatically join the room session. */\n autoJoin?: boolean\n }\n > {}\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n aspectRatio: { ideal: 16 / 9 },\n}\n\n/**\n * Using Video.createRoomObject() you can create a `RoomObject` to join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.createRoomObject({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * roomObj.join()\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const createRoomObject = (\n roomOptions: CreateRoomObjectOptions\n): Promise<Room> => {\n return new Promise(async (resolve, reject) => {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElementId,\n applyLocalVideoOverlay = true,\n autoJoin = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\n\n const client = createClient<Room>({\n ...userOptions,\n })\n await client.connect()\n\n if (!client) {\n return\n }\n\n /**\n * Since `makeRoomObject` now only accepts a\n * `rootElement` the following is to preserve backwards\n * compatibility with the previous syntax\n */\n let rootElement: HTMLElement | undefined\n if (rootElementId) {\n const el = document.getElementById(rootElementId)\n\n if (el) {\n rootElement = el\n } else {\n rootElement = document.body\n\n getLogger().warn(\n `We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`\n )\n }\n }\n\n const roomObject = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n roomObject.once('destroy', () => {\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n roomObject.once('room.subscribed', (_payload) => {\n resolve(roomObject)\n })\n\n await roomObject.join()\n } catch (error) {\n getLogger().error('Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const room = new Proxy(roomObject, {\n get(target: any, prop: any, receiver: any) {\n if (prop === 'join') {\n return join\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n\n if (autoJoin) {\n try {\n await room.join()\n resolve(room)\n } catch (error) {\n reject(error)\n }\n } else {\n resolve(room)\n }\n })\n}\n", "import { CreateRoomObjectOptions, createRoomObject } from './createRoomObject'\n\n/**\n * Using Video.joinRoom() you can automatically join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.joinRoom({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * // You have joined the room..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const joinRoom = (roomOptions: CreateRoomObjectOptions) => {\n return createRoomObject({\n ...roomOptions,\n autoJoin: true,\n })\n}\n", "import {\n UserOptions,\n AssertSameType,\n getLogger,\n Authorization,\n} from '@signalwire/core'\nimport { createClient } from './createClient'\nimport { BaseRoomSession } from './BaseRoomSession'\nimport {\n getJoinAudienceMediaParams,\n isValidJoinAudienceMediaParams,\n} from './utils/roomSession'\nimport type { MakeRoomOptions } from './Client'\nimport type { RoomSessionDocs } from './RoomSession.docs'\nimport type { RoomSessionJoinAudienceParams } from './utils/interfaces'\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n width: { ideal: 1280, min: 320 },\n height: { ideal: 720, min: 180 },\n aspectRatio: { ideal: 16 / 9 },\n}\n\n/**\n * List of properties/methods the user shouldn't be able to\n * use until they sucessfully call `roomSession.join()`.\n */\nexport const UNSAFE_PROP_ACCESS = [\n 'audioMute',\n 'audioUnmute',\n 'deaf',\n 'getLayouts',\n 'getMembers',\n 'getRecordings',\n 'hideVideoMuted',\n 'leave',\n 'removerMember',\n 'restoreOutboundAudio',\n 'restoreOutboundVideo',\n 'setInputSensitivity',\n 'setInputVolume',\n 'setLayout',\n 'setPositions',\n 'setMemberPosition',\n 'setOutputVolume',\n 'showVideoMuted',\n 'startRecording',\n 'stopOutboundAudio',\n 'stopOutboundVideo',\n 'undeaf',\n 'videoMute',\n 'videoUnmute',\n 'setMicrophoneVolume',\n 'setSpeakerVolume',\n 'setMeta',\n 'setMemberMeta',\n]\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\ninterface RoomSessionMain extends BaseRoomSession<RoomSessionMain> {\n new (opts: RoomSessionOptions): this\n}\n\n/**\n * A RoomSession allows you to start and control video sessions.\n *\n * For example, the following code joins a video session and listens for new\n * members joining:\n *\n * ```typescript\n * const roomSession = new SignalWire.Video.RoomSession({\n * token: '<YourRoomToken>',\n * rootElement: document.getElementById('myVideoElement'),\n * audio: true,\n * video: true,\n * })\n *\n * roomSession.on('member.joined', (e) => {\n * console.log(`${e.member.name} joined`)\n * })\n *\n * roomSession.join()\n * ```\n *\n * ## Events\n *\n * Please see {@link RoomSessionEvents} for the list of events emitted by a\n * RoomSession object.\n */\nexport interface RoomSession\n extends AssertSameType<RoomSessionMain, RoomSessionDocs<RoomSessionMain>> {}\n\n/**\n * @ignore\n * @privateRemarks\n *\n * The use of a function expression as a contructor instead\n * of a class was picked because it made a couple things\n * simpler for this use case.\n * 1. Making classes behave as factories can be tricky when\n * working with TypeScript since it's non trivial to\n * switch the type returned by the constructor\n * 2. It also generates more verbose code (once transpiled)\n * if we want to have private fields to store `room` and\n * `client`.\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\n\n const client = createClient<RoomSession>(userOptions)\n const room = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n room.once('room.subscribed', (payload) => {\n // @ts-expect-error\n room.attachOnSubscribedWorkers(payload)\n resolve(room)\n })\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const joinAudience = (params?: RoomSessionJoinAudienceParams) => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n const session = await client.connect()\n\n // @ts-expect-error\n const authState: Authorization = session._sessionAuthState\n const mediaOptions = getJoinAudienceMediaParams({\n authState,\n ...params,\n })\n\n if (!isValidJoinAudienceMediaParams(mediaOptions)) {\n await session.disconnect()\n return reject(\n new Error(\n '[joinAudience] Either (or both) `audio` and `video` must be `true` when calling this method.'\n )\n )\n }\n\n // @ts-expect-error\n room.updateMediaOptions(mediaOptions)\n\n room.once('room.subscribed', (payload) => {\n // @ts-expect-error\n room.attachOnSubscribedWorkers(payload)\n resolve(room)\n })\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession JoinAudience', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const interceptors = {\n join,\n joinAudience,\n } as const\n\n return new Proxy<Omit<RoomSession, 'new'>>(room, {\n get(target: RoomSession, prop: keyof RoomSession, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (!target.active && UNSAFE_PROP_ACCESS.includes(prop)) {\n throw new Error(\n `Tried to access the property/method \"${prop}\" before the room was connected. Please call roomSession.join() first.`\n )\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (roomOptions: RoomSessionOptions): RoomSession }\n", "import { getLogger } from '@signalwire/core'\nimport type { Authorization } from '@signalwire/core'\nimport type { RoomSessionJoinAudienceParams } from './interfaces'\n\n// `joinAudience` utils\nconst getJoinAudienceMediaParams = ({\n authState,\n audio = true,\n video = true,\n}: RoomSessionJoinAudienceParams & {\n authState: Authorization\n}) => {\n const getMediaValue = ({\n remote,\n local,\n kind,\n }: {\n remote?: boolean\n local?: boolean\n kind: 'audio' | 'video'\n }) => {\n if (!remote && local) {\n getLogger().warn(\n `[joinAudience] ${kind} is currently not allowed on this room.`\n )\n }\n\n return !!(remote && local)\n }\n\n return {\n audio: false,\n video: false,\n negotiateAudio: getMediaValue({\n remote: authState.audio_allowed,\n local: audio,\n kind: 'audio',\n }),\n negotiateVideo: getMediaValue({\n remote: authState.video_allowed,\n local: video,\n kind: 'video',\n }),\n }\n}\n\nconst isValidJoinAudienceMediaParams = (\n options: Record<string, boolean | undefined>\n) => {\n // At least one value must be true\n return Object.values(options).some(Boolean)\n}\n\nexport { getJoinAudienceMediaParams, isValidJoinAudienceMediaParams }\n", "export {\n getDevices,\n getCameraDevices,\n getMicrophoneDevices,\n getSpeakerDevices,\n getDevicesWithPermissions,\n getCameraDevicesWithPermissions,\n getMicrophoneDevicesWithPermissions,\n getSpeakerDevicesWithPermissions,\n checkPermissions,\n checkCameraPermissions,\n checkMicrophonePermissions,\n checkSpeakerPermissions,\n requestPermissions,\n createDeviceWatcher,\n createCameraDeviceWatcher,\n createMicrophoneDeviceWatcher,\n createSpeakerDeviceWatcher,\n supportsMediaDevices,\n supportsGetUserMedia,\n supportsGetDisplayMedia,\n getUserMedia,\n getDisplayMedia,\n enumerateDevices,\n getSupportedConstraints,\n supportsMediaOutput,\n setMediaElementSinkId,\n stopStream,\n stopTrack,\n createMicrophoneAnalyzer,\n} from '@signalwire/webrtc'\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|