@signalwire/js 3.8.0 → 3.9.0
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 -8
- package/dist/core/src/BaseComponent.d.ts.map +1 -1
- package/dist/core/src/BaseSession.d.ts +3 -0
- package/dist/core/src/BaseSession.d.ts.map +1 -1
- package/dist/core/src/chat/BaseChat.d.ts +0 -3
- package/dist/core/src/chat/BaseChat.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +2 -2
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/rooms/methods.d.ts +14 -1
- package/dist/core/src/rooms/methods.d.ts.map +1 -1
- package/dist/core/src/types/index.d.ts +1 -0
- package/dist/core/src/types/index.d.ts.map +1 -1
- package/dist/core/src/types/video.d.ts +2 -0
- package/dist/core/src/types/video.d.ts.map +1 -1
- package/dist/core/src/types/videoLayout.d.ts +2 -0
- package/dist/core/src/types/videoLayout.d.ts.map +1 -1
- package/dist/core/src/types/videoRoomSession.d.ts +1 -3
- package/dist/core/src/types/videoRoomSession.d.ts.map +1 -1
- package/dist/core/src/utils/index.d.ts +1 -0
- package/dist/core/src/utils/index.d.ts.map +1 -1
- package/dist/core/src/utils/interfaces.d.ts +1 -1
- package/dist/core/src/utils/interfaces.d.ts.map +1 -1
- package/dist/core/src/utils/proxyUtils.d.ts +5 -0
- package/dist/core/src/utils/proxyUtils.d.ts.map +1 -1
- package/dist/index.esm.js +20 -14
- package/dist/index.esm.js.map +3 -3
- package/dist/index.js +20 -15
- 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.map +1 -1
- package/dist/js/src/RoomSession.d.ts.map +1 -1
- package/dist/js/src/RoomSession.docs.d.ts +12 -7
- package/dist/js/src/RoomSession.docs.d.ts.map +1 -1
- package/dist/js/src/chat/Client.d.ts +1 -1
- package/dist/js/src/chat/Client.d.ts.map +1 -1
- package/dist/js/src/chat/Client.docs.d.ts +2 -2
- package/dist/js/src/index.d.ts +8 -7
- package/dist/js/src/index.d.ts.map +1 -1
- package/dist/js/src/utils/interfaces.d.ts +3 -1
- package/dist/js/src/utils/interfaces.d.ts.map +1 -1
- package/dist/js/src/video.d.ts +3 -3
- package/dist/js/src/video.d.ts.map +1 -1
- package/dist/js/src/webrtc.d.ts +1 -1
- package/dist/js/src/webrtc.d.ts.map +1 -1
- package/dist/js/tsconfig.build.tsbuildinfo +1 -1
- package/dist/webrtc/src/BaseConnection.d.ts.map +1 -1
- package/dist/webrtc/src/index.d.ts +1 -1
- package/dist/webrtc/src/index.d.ts.map +1 -1
- package/dist/webrtc/src/utils/deviceHelpers.d.ts +45 -0
- package/dist/webrtc/src/utils/deviceHelpers.d.ts.map +1 -1
- package/dist/webrtc/src/utils/interfaces.d.ts +3 -0
- package/dist/webrtc/src/utils/interfaces.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/BaseRoomSession.ts +11 -1
- package/src/RoomSession.docs.ts +52 -13
- package/src/RoomSession.ts +2 -0
- package/src/chat/Client.docs.ts +2 -2
- package/src/chat/Client.ts +4 -13
- package/src/index.ts +8 -7
- package/src/utils/interfaces.ts +3 -0
- package/src/video.ts +3 -2
- package/src/webrtc.ts +1 -0
package/dist/index.esm.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/chat/index.ts", "../src/
|
|
4
|
-
"sourcesContent": ["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 type {\n AssertSameType,\n ChatContract,\n ConsumerContract,\n UserOptions,\n Chat as ChatNamespace,\n} from '@signalwire/core'\nimport { getLogger } from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport {\n ClientApiEventsDocs,\n ClientDocs,\n} from './Client.docs'\n\ninterface ClientApiEventsMain extends ChatNamespace.BaseChatApiEvents {}\nexport interface ClientApiEvents 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 * message: '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\nexport const Client = function (chatOptions: ClientOptions) {\n if ('production' === process.env.NODE_ENV) {\n getLogger().warn(\n '`Chat` is still under development and may change in the future without prior notice.'\n )\n }\n\n const client = createClient<Client>(chatOptions)\n const subscribe: Client['subscribe'] = async (channels) => {\n await client.connect()\n\n return client.chat.subscribe(channels)\n }\n const publish: Client['publish'] = async (params) => {\n await client.connect()\n\n return client.chat.publish(params)\n }\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop === 'subscribe') {\n return subscribe\n } else if (prop === 'publish') {\n return publish\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 {\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} 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 { Cantina, createCantinaObject } from './cantina'\nimport type { Client as ChatClient } from './chat/Client'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI<RoomSessionType>['rooms']\n chat: ClientAPI<RoomSessionType>['chat']\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 _cantina: Cantina\n private _chat: ChatClient\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 cantina() {\n if (!this._cantina) {\n // @ts-expect-error\n this._cantina = createCantinaObject(this.options)\n }\n return this._cantina\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 makeDisplayChangeFn,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\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()\n const videoEl = buildVideo()\n const layoutChangedHandler = makeLayoutChangedHandler({\n rootElement,\n element: videoEl,\n layerMap,\n })\n const hideOverlay = makeDisplayChangeFn('none')\n const showOverlay = makeDisplayChangeFn('block')\n\n room.on('layout.changed', (params) => {\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 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 ? hideOverlay(member.id) : showOverlay(member.id)\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 = (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 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\n handleVideoTrack(track)\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 return video\n}\n\nconst _videoReady = ({ 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 = async ({\n location,\n element,\n}: {\n location: InternalVideoLayoutLayer\n element: HTMLVideoElement\n}) => {\n if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {\n await _videoReady({ element })\n }\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\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n myMemberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler =\n ({\n layerMap,\n element,\n rootElement,\n }: {\n layerMap: Map<string, HTMLElement>\n element: HTMLVideoElement\n rootElement: HTMLElement\n }) =>\n async ({ layout, myMemberId, localStream }: LayoutChangedHandlerParams) => {\n try {\n const { layers = [] } = layout\n const location = layers.find(({ member_id }) => member_id === myMemberId)\n\n const myLayerKey = _addSDKPrefix(myMemberId)\n let myLayer = layerMap.get(myLayerKey)\n if (!location) {\n if (myLayer) {\n getLogger().debug('Current layer not visible')\n myLayer.style.display = 'none'\n }\n\n return\n }\n\n if (!myLayer) {\n myLayer = await _buildLayer({ element, location })\n myLayer.id = myLayerKey\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 = document.getElementById(myLayerKey)\n if (mcuLayers && !exists) {\n mcuLayers.appendChild(myLayer)\n layerMap.set(myLayerKey, myLayer)\n }\n\n return\n }\n\n const { top, left, width, height } = _getLocationStyles(location)\n myLayer.style.display = 'block'\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 makeDisplayChangeFn = (display: 'block' | 'none') => {\n return (domId: string) => {\n const el = document.getElementById(_addSDKPrefix(domId))\n if (el) {\n el.style.display = display\n }\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 makeDisplayChangeFn,\n setVideoMediaTrack,\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} 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 [\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 /**\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.setWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n\n this.attachWorkers()\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 { autoJoin = true, audio = false, video = true } = 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 }\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 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})\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: false,\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 BaseComponentOptions,\n BaseConsumer,\n CantinaRoomEventNames,\n InternalCantinaRoomEventNames,\n connect,\n ConsumerContract,\n EventTransform,\n toExternalJSON,\n CantinaRoomEntity,\n CantinaRoomsSubscribedEventParams,\n} from '@signalwire/core'\n\n/** @internal */\nexport type CantinaManagerEvents = Record<\n CantinaRoomEventNames,\n (room: CantinaRoomEntity) => void\n>\n\n/** @internal */\nexport interface Cantina extends ConsumerContract<CantinaManagerEvents> {}\n\n/** @internal */\nexport class CantinaAPI extends BaseConsumer<CantinaManagerEvents> {\n protected _eventsPrefix = 'cantina-manager' as const\n\n /** @internal */\n getEmitterTransforms() {\n return new Map<\n InternalCantinaRoomEventNames | InternalCantinaRoomEventNames[],\n EventTransform\n >([\n [\n ['cantina-manager.rooms.subscribed'],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: ({ rooms }: CantinaRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n payloadTransform: ({ rooms }: CantinaRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n },\n ],\n [\n [\n 'cantina-manager.room.started',\n 'cantina-manager.room.added',\n 'cantina-manager.room.updated',\n 'cantina-manager.room.ended',\n 'cantina-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 createCantinaObject = (\n params: BaseComponentOptions<CantinaManagerEvents>\n) => {\n const cantina = connect<CantinaManagerEvents, CantinaAPI, Cantina>({\n store: params.store,\n Component: CantinaAPI,\n componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\n })(params)\n\n const proxy = new Proxy<Cantina>(cantina, {\n get(\n target: Cantina,\n property: string | symbol,\n receiver: ProxyHandler<Cantina>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'cantina-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n", "import { BaseJWTSession } from '@signalwire/core'\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public agent = process.env.SDK_PKG_AGENT!\n}\n", "import { createRoomObject, Room } from './createRoomObject'\nimport { createClient } from './createClient'\nimport { joinRoom } from './joinRoom'\nimport { MakeRoomOptions } from './Client'\nimport { RoomSession } 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 }\n\n/** @ignore */\nexport type {\n MemberCommandParams,\n MemberCommandWithVolumeParams,\n MemberCommandWithValueParams,\n DeprecatedMemberUpdatableProps,\n DeprecatedVideoMemberHandlerParams,\n VideoMemberHandlerParams,\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 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 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} 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 'setOutputVolume',\n 'showVideoMuted',\n 'startRecording',\n 'stopOutboundAudio',\n 'stopOutboundVideo',\n 'undeaf',\n 'videoMute',\n 'videoUnmute',\n 'setMicrophoneVolume',\n 'setSpeakerVolume',\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', () => {\n resolve(room)\n })\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\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} from '@signalwire/webrtc'\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../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/cantina/Cantina.ts", "../src/JWTSession.ts", "../src/chat/Client.ts", "../src/video.ts", "../src/createRoomObject.ts", "../src/joinRoom.ts", "../src/RoomSession.ts", "../src/webrtc.ts"],
|
|
4
|
+
"sourcesContent": ["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} 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 { Cantina, createCantinaObject } from './cantina'\nimport type { Client as ChatClient } from './chat/Client'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI<RoomSessionType>['rooms']\n chat: ClientAPI<RoomSessionType>['chat']\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 _cantina: Cantina\n private _chat: ChatClient\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 cantina() {\n if (!this._cantina) {\n // @ts-expect-error\n this._cantina = createCantinaObject(this.options)\n }\n return this._cantina\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 makeDisplayChangeFn,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\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()\n const videoEl = buildVideo()\n const layoutChangedHandler = makeLayoutChangedHandler({\n rootElement,\n element: videoEl,\n layerMap,\n })\n const hideOverlay = makeDisplayChangeFn('none')\n const showOverlay = makeDisplayChangeFn('block')\n\n room.on('layout.changed', (params) => {\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 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 ? hideOverlay(member.id) : showOverlay(member.id)\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 = (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 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\n handleVideoTrack(track)\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 return video\n}\n\nconst _videoReady = ({ 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 = async ({\n location,\n element,\n}: {\n location: InternalVideoLayoutLayer\n element: HTMLVideoElement\n}) => {\n if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {\n await _videoReady({ element })\n }\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\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n myMemberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler =\n ({\n layerMap,\n element,\n rootElement,\n }: {\n layerMap: Map<string, HTMLElement>\n element: HTMLVideoElement\n rootElement: HTMLElement\n }) =>\n async ({ layout, myMemberId, localStream }: LayoutChangedHandlerParams) => {\n try {\n const { layers = [] } = layout\n const location = layers.find(({ member_id }) => member_id === myMemberId)\n\n const myLayerKey = _addSDKPrefix(myMemberId)\n let myLayer = layerMap.get(myLayerKey)\n if (!location) {\n if (myLayer) {\n getLogger().debug('Current layer not visible')\n myLayer.style.display = 'none'\n }\n\n return\n }\n\n if (!myLayer) {\n myLayer = await _buildLayer({ element, location })\n myLayer.id = myLayerKey\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 = document.getElementById(myLayerKey)\n if (mcuLayers && !exists) {\n mcuLayers.appendChild(myLayer)\n layerMap.set(myLayerKey, myLayer)\n }\n\n return\n }\n\n const { top, left, width, height } = _getLocationStyles(location)\n myLayer.style.display = 'block'\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 makeDisplayChangeFn = (display: 'block' | 'none') => {\n return (domId: string) => {\n const el = document.getElementById(_addSDKPrefix(domId))\n if (el) {\n el.style.display = display\n }\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 makeDisplayChangeFn,\n setVideoMediaTrack,\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} 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 [\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 /**\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.setWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n\n this.attachWorkers()\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})\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: false,\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 BaseComponentOptions,\n BaseConsumer,\n CantinaRoomEventNames,\n InternalCantinaRoomEventNames,\n connect,\n ConsumerContract,\n EventTransform,\n toExternalJSON,\n CantinaRoomEntity,\n CantinaRoomsSubscribedEventParams,\n} from '@signalwire/core'\n\n/** @internal */\nexport type CantinaManagerEvents = Record<\n CantinaRoomEventNames,\n (room: CantinaRoomEntity) => void\n>\n\n/** @internal */\nexport interface Cantina extends ConsumerContract<CantinaManagerEvents> {}\n\n/** @internal */\nexport class CantinaAPI extends BaseConsumer<CantinaManagerEvents> {\n protected _eventsPrefix = 'cantina-manager' as const\n\n /** @internal */\n getEmitterTransforms() {\n return new Map<\n InternalCantinaRoomEventNames | InternalCantinaRoomEventNames[],\n EventTransform\n >([\n [\n ['cantina-manager.rooms.subscribed'],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: ({ rooms }: CantinaRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n payloadTransform: ({ rooms }: CantinaRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n },\n ],\n [\n [\n 'cantina-manager.room.started',\n 'cantina-manager.room.added',\n 'cantina-manager.room.updated',\n 'cantina-manager.room.ended',\n 'cantina-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 createCantinaObject = (\n params: BaseComponentOptions<CantinaManagerEvents>\n) => {\n const cantina = connect<CantinaManagerEvents, CantinaAPI, Cantina>({\n store: params.store,\n Component: CantinaAPI,\n componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\n })(params)\n\n const proxy = new Proxy<Cantina>(cantina, {\n get(\n target: Cantina,\n property: string | symbol,\n receiver: ProxyHandler<Cantina>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'cantina-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n", "import { BaseJWTSession } from '@signalwire/core'\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public agent = process.env.SDK_PKG_AGENT!\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\nexport const Client = function (chatOptions: ClientOptions) {\n const client = createClient<Client>(chatOptions)\n const subscribe: Client['subscribe'] = async (channels) => {\n await client.connect()\n\n return client.chat.subscribe(channels)\n }\n const publish: Client['publish'] = async (params) => {\n await client.connect()\n\n return client.chat.publish(params)\n }\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop === 'subscribe') {\n return subscribe\n } else if (prop === 'publish') {\n return publish\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 { 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 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 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} 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]\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', () => {\n resolve(room)\n })\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\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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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/index.js
CHANGED
|
@@ -89,9 +89,6 @@ __export(chat_exports, {
|
|
|
89
89
|
ChatMessage: () => ChatMessage,
|
|
90
90
|
Client: () => Client2
|
|
91
91
|
});
|
|
92
|
-
var import_core13 = require("@signalwire/core");
|
|
93
|
-
|
|
94
|
-
// src/chat/Client.ts
|
|
95
92
|
var import_core12 = require("@signalwire/core");
|
|
96
93
|
|
|
97
94
|
// src/createClient.ts
|
|
@@ -666,7 +663,13 @@ var RoomSessionConnection = class extends import_webrtc4.BaseConnection {
|
|
|
666
663
|
startScreenShare() {
|
|
667
664
|
return __async(this, arguments, function* (opts = {}) {
|
|
668
665
|
var _a;
|
|
669
|
-
const {
|
|
666
|
+
const {
|
|
667
|
+
autoJoin = true,
|
|
668
|
+
audio = false,
|
|
669
|
+
video = true,
|
|
670
|
+
layout,
|
|
671
|
+
positions
|
|
672
|
+
} = opts;
|
|
670
673
|
const displayStream = yield (0, import_webrtc4.getDisplayMedia)({
|
|
671
674
|
audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,
|
|
672
675
|
video
|
|
@@ -679,7 +682,9 @@ var RoomSessionConnection = class extends import_webrtc4.BaseConnection {
|
|
|
679
682
|
userVariables: __spreadProps(__spreadValues({}, ((_a = this.options) == null ? void 0 : _a.userVariables) || {}), {
|
|
680
683
|
memberCallId: this.__uuid,
|
|
681
684
|
memberId: this.memberId
|
|
682
|
-
})
|
|
685
|
+
}),
|
|
686
|
+
layout,
|
|
687
|
+
positions
|
|
683
688
|
});
|
|
684
689
|
const screenShare = (0, import_core7.connect)({
|
|
685
690
|
store: this.store,
|
|
@@ -976,7 +981,7 @@ var JWTSession = class extends import_core10.BaseJWTSession {
|
|
|
976
981
|
constructor() {
|
|
977
982
|
super(...arguments);
|
|
978
983
|
__publicField(this, "WebSocketConstructor", WebSocket);
|
|
979
|
-
__publicField(this, "agent", "@signalwire/js/3.
|
|
984
|
+
__publicField(this, "agent", "@signalwire/js/3.9.0");
|
|
980
985
|
}
|
|
981
986
|
};
|
|
982
987
|
|
|
@@ -1002,9 +1007,6 @@ var createClient = (userOptions) => {
|
|
|
1002
1007
|
|
|
1003
1008
|
// src/chat/Client.ts
|
|
1004
1009
|
var Client2 = function(chatOptions) {
|
|
1005
|
-
if (process.env.NODE_ENV === "production") {
|
|
1006
|
-
(0, import_core12.getLogger)().warn("`Chat` is still under development and may change in the future without prior notice.");
|
|
1007
|
-
}
|
|
1008
1010
|
const client = createClient(chatOptions);
|
|
1009
1011
|
const subscribe = (channels) => __async(this, null, function* () {
|
|
1010
1012
|
yield client.connect();
|
|
@@ -1027,8 +1029,8 @@ var Client2 = function(chatOptions) {
|
|
|
1027
1029
|
};
|
|
1028
1030
|
|
|
1029
1031
|
// src/chat/index.ts
|
|
1030
|
-
var ChatMember =
|
|
1031
|
-
var ChatMessage =
|
|
1032
|
+
var ChatMember = import_core12.Chat.ChatMember;
|
|
1033
|
+
var ChatMessage = import_core12.Chat.ChatMessage;
|
|
1032
1034
|
|
|
1033
1035
|
// src/video.ts
|
|
1034
1036
|
var video_exports = {};
|
|
@@ -1040,7 +1042,7 @@ __export(video_exports, {
|
|
|
1040
1042
|
});
|
|
1041
1043
|
|
|
1042
1044
|
// src/createRoomObject.ts
|
|
1043
|
-
var
|
|
1045
|
+
var import_core13 = require("@signalwire/core");
|
|
1044
1046
|
var VIDEO_CONSTRAINTS = {
|
|
1045
1047
|
aspectRatio: { ideal: 16 / 9 }
|
|
1046
1048
|
};
|
|
@@ -1079,7 +1081,7 @@ var createRoomObject = (roomOptions) => {
|
|
|
1079
1081
|
rootElement = el;
|
|
1080
1082
|
} else {
|
|
1081
1083
|
rootElement = document.body;
|
|
1082
|
-
(0,
|
|
1084
|
+
(0, import_core13.getLogger)().warn(`We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`);
|
|
1083
1085
|
}
|
|
1084
1086
|
}
|
|
1085
1087
|
const room = client.rooms.makeRoomObject({
|
|
@@ -1118,7 +1120,7 @@ var joinRoom = (roomOptions) => {
|
|
|
1118
1120
|
};
|
|
1119
1121
|
|
|
1120
1122
|
// src/RoomSession.ts
|
|
1121
|
-
var
|
|
1123
|
+
var import_core14 = require("@signalwire/core");
|
|
1122
1124
|
var VIDEO_CONSTRAINTS2 = {
|
|
1123
1125
|
aspectRatio: { ideal: 16 / 9 }
|
|
1124
1126
|
};
|
|
@@ -1137,6 +1139,8 @@ var UNSAFE_PROP_ACCESS = [
|
|
|
1137
1139
|
"setInputSensitivity",
|
|
1138
1140
|
"setInputVolume",
|
|
1139
1141
|
"setLayout",
|
|
1142
|
+
"setPositions",
|
|
1143
|
+
"setMemberPosition",
|
|
1140
1144
|
"setOutputVolume",
|
|
1141
1145
|
"showVideoMuted",
|
|
1142
1146
|
"startRecording",
|
|
@@ -1194,7 +1198,7 @@ var RoomSession = function(roomOptions) {
|
|
|
1194
1198
|
});
|
|
1195
1199
|
yield room.join();
|
|
1196
1200
|
} catch (error) {
|
|
1197
|
-
(0,
|
|
1201
|
+
(0, import_core14.getLogger)().error("RoomSession Join", error);
|
|
1198
1202
|
reject(error);
|
|
1199
1203
|
}
|
|
1200
1204
|
}));
|
|
@@ -1224,6 +1228,7 @@ __export(webrtc_exports, {
|
|
|
1224
1228
|
checkSpeakerPermissions: () => import_webrtc5.checkSpeakerPermissions,
|
|
1225
1229
|
createCameraDeviceWatcher: () => import_webrtc5.createCameraDeviceWatcher,
|
|
1226
1230
|
createDeviceWatcher: () => import_webrtc5.createDeviceWatcher,
|
|
1231
|
+
createMicrophoneAnalyzer: () => import_webrtc5.createMicrophoneAnalyzer,
|
|
1227
1232
|
createMicrophoneDeviceWatcher: () => import_webrtc5.createMicrophoneDeviceWatcher,
|
|
1228
1233
|
createSpeakerDeviceWatcher: () => import_webrtc5.createSpeakerDeviceWatcher,
|
|
1229
1234
|
enumerateDevices: () => import_webrtc5.enumerateDevices,
|