@signalwire/js 3.10.0 → 3.10.2
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.map +1 -1
- package/dist/core/src/BaseSession.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +1 -1
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/memberPosition/workers.d.ts +1 -1
- package/dist/core/src/memberPosition/workers.d.ts.map +1 -1
- package/dist/core/src/redux/features/pubSub/pubSubSaga.d.ts.map +1 -1
- package/dist/core/src/redux/features/shared/namespace.d.ts.map +1 -1
- package/dist/core/src/redux/interfaces.d.ts +4 -3
- package/dist/core/src/redux/interfaces.d.ts.map +1 -1
- package/dist/core/src/redux/rootSaga.d.ts +3 -3
- package/dist/core/src/redux/rootSaga.d.ts.map +1 -1
- package/dist/core/src/types/index.d.ts +6 -1
- package/dist/core/src/types/index.d.ts.map +1 -1
- package/dist/core/src/types/messaging.d.ts +81 -0
- package/dist/core/src/types/messaging.d.ts.map +1 -0
- package/dist/core/src/types/task.d.ts +36 -0
- package/dist/core/src/types/task.d.ts.map +1 -0
- package/dist/core/src/types/voice.d.ts +4 -0
- package/dist/core/src/types/voice.d.ts.map +1 -0
- package/dist/core/src/types/voiceCall.d.ts +108 -0
- package/dist/core/src/types/voiceCall.d.ts.map +1 -0
- package/dist/core/src/utils/constants.d.ts +5 -1
- package/dist/core/src/utils/constants.d.ts.map +1 -1
- package/dist/core/src/utils/interfaces.d.ts +5 -3
- package/dist/core/src/utils/interfaces.d.ts.map +1 -1
- package/dist/core/src/utils/toInternalAction.d.ts +1 -1
- package/dist/core/src/utils/toInternalAction.d.ts.map +1 -1
- package/dist/index.esm.js +19 -14
- package/dist/index.esm.js.map +2 -2
- package/dist/index.js +21 -16
- package/dist/index.js.map +2 -2
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/js/src/features/mediaElements/mediaElementsSagas.d.ts.map +1 -1
- package/dist/js/src/utils/videoElement.d.ts +5 -3
- package/dist/js/src/utils/videoElement.d.ts.map +1 -1
- package/dist/js/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/features/mediaElements/mediaElementsSagas.ts +13 -3
- package/src/utils/videoElement.ts +8 -15
package/dist/index.esm.js
CHANGED
|
@@ -83,7 +83,7 @@ var buildVideo = () => {
|
|
|
83
83
|
video.playsInline = true;
|
|
84
84
|
return video;
|
|
85
85
|
};
|
|
86
|
-
var
|
|
86
|
+
var waitForVideoReady = ({ element }) => {
|
|
87
87
|
return new Promise((resolve) => {
|
|
88
88
|
element.addEventListener("canplay", function listener() {
|
|
89
89
|
element.removeEventListener("canplay", listener);
|
|
@@ -108,13 +108,7 @@ var _getLocationStyles = ({
|
|
|
108
108
|
height: `${height}%`
|
|
109
109
|
};
|
|
110
110
|
};
|
|
111
|
-
var _buildLayer =
|
|
112
|
-
location,
|
|
113
|
-
element
|
|
114
|
-
}) => {
|
|
115
|
-
if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {
|
|
116
|
-
await _videoReady({ element });
|
|
117
|
-
}
|
|
111
|
+
var _buildLayer = ({ location }) => {
|
|
118
112
|
const { top, left, width, height } = _getLocationStyles(location);
|
|
119
113
|
const layer = document.createElement("div");
|
|
120
114
|
layer.style.position = "absolute";
|
|
@@ -127,15 +121,16 @@ var _buildLayer = async ({
|
|
|
127
121
|
};
|
|
128
122
|
var makeLayoutChangedHandler = ({
|
|
129
123
|
layerMap,
|
|
130
|
-
element,
|
|
131
124
|
rootElement
|
|
132
125
|
}) => async ({ layout, myMemberId, localStream }) => {
|
|
126
|
+
getLogger().debug("Process layout.changed");
|
|
133
127
|
try {
|
|
134
128
|
const { layers = [] } = layout;
|
|
135
129
|
const location = layers.find(({ member_id }) => member_id === myMemberId);
|
|
136
130
|
const myLayerKey = _addSDKPrefix(myMemberId);
|
|
137
131
|
let myLayer = layerMap.get(myLayerKey);
|
|
138
132
|
if (!location) {
|
|
133
|
+
getLogger().debug("Location not found");
|
|
139
134
|
if (myLayer) {
|
|
140
135
|
getLogger().debug("Current layer not visible");
|
|
141
136
|
myLayer.style.display = "none";
|
|
@@ -143,7 +138,8 @@ var makeLayoutChangedHandler = ({
|
|
|
143
138
|
return;
|
|
144
139
|
}
|
|
145
140
|
if (!myLayer) {
|
|
146
|
-
|
|
141
|
+
getLogger().debug("Build myLayer");
|
|
142
|
+
myLayer = _buildLayer({ location });
|
|
147
143
|
myLayer.id = myLayerKey;
|
|
148
144
|
const localVideo = buildVideo();
|
|
149
145
|
localVideo.srcObject = localStream;
|
|
@@ -159,6 +155,7 @@ var makeLayoutChangedHandler = ({
|
|
|
159
155
|
return;
|
|
160
156
|
}
|
|
161
157
|
const { top, left, width, height } = _getLocationStyles(location);
|
|
158
|
+
getLogger().debug("Update myLayer:", top, left, width, height);
|
|
162
159
|
if (localStream.getVideoTracks().length > 0) {
|
|
163
160
|
myLayer.style.display = "block";
|
|
164
161
|
}
|
|
@@ -227,12 +224,12 @@ var makeVideoElementSaga = ({
|
|
|
227
224
|
const videoEl = buildVideo();
|
|
228
225
|
const layoutChangedHandler = makeLayoutChangedHandler({
|
|
229
226
|
rootElement,
|
|
230
|
-
element: videoEl,
|
|
231
227
|
layerMap
|
|
232
228
|
});
|
|
233
229
|
const hideOverlay = makeDisplayChangeFn("none");
|
|
234
230
|
const showOverlay = makeDisplayChangeFn("block");
|
|
235
231
|
room.on("layout.changed", (params) => {
|
|
232
|
+
getLogger2().debug("Received layout.changed");
|
|
236
233
|
if (room.peer.hasVideoSender && room.localStream) {
|
|
237
234
|
layoutChangedHandler({
|
|
238
235
|
layout: params.layout,
|
|
@@ -358,7 +355,7 @@ function* videoElementSetupWorker({
|
|
|
358
355
|
track,
|
|
359
356
|
element
|
|
360
357
|
}) {
|
|
361
|
-
const handleVideoTrack = (track2) => {
|
|
358
|
+
const handleVideoTrack = async (track2) => {
|
|
362
359
|
setVideoMediaTrack({ element, track: track2 });
|
|
363
360
|
element.style.width = "100%";
|
|
364
361
|
if (!applyLocalVideoOverlay) {
|
|
@@ -377,6 +374,7 @@ function* videoElementSetupWorker({
|
|
|
377
374
|
paddingWrapper.appendChild(mcuWrapper);
|
|
378
375
|
const layersWrapper = document.createElement("div");
|
|
379
376
|
layersWrapper.classList.add("mcuLayers");
|
|
377
|
+
layersWrapper.style.display = "none";
|
|
380
378
|
paddingWrapper.appendChild(layersWrapper);
|
|
381
379
|
const relativeWrapper = document.createElement("div");
|
|
382
380
|
relativeWrapper.style.position = "relative";
|
|
@@ -387,8 +385,15 @@ function* videoElementSetupWorker({
|
|
|
387
385
|
rootElement.style.alignItems = "center";
|
|
388
386
|
rootElement.style.justifyContent = "center";
|
|
389
387
|
rootElement.appendChild(relativeWrapper);
|
|
388
|
+
if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {
|
|
389
|
+
getLogger2().debug("Wait for the MCU to be ready");
|
|
390
|
+
await waitForVideoReady({ element });
|
|
391
|
+
}
|
|
392
|
+
layersWrapper.style.display = "block";
|
|
390
393
|
};
|
|
391
|
-
handleVideoTrack(track)
|
|
394
|
+
handleVideoTrack(track).catch((error) => {
|
|
395
|
+
getLogger2().error("Handle video track error", error);
|
|
396
|
+
});
|
|
392
397
|
}
|
|
393
398
|
|
|
394
399
|
// src/BaseRoomSession.ts
|
|
@@ -1000,7 +1005,7 @@ var JWTSession = class extends BaseJWTSession {
|
|
|
1000
1005
|
constructor() {
|
|
1001
1006
|
super(...arguments);
|
|
1002
1007
|
__publicField(this, "WebSocketConstructor", WebSocket);
|
|
1003
|
-
__publicField(this, "agent", "@signalwire/js/3.10.
|
|
1008
|
+
__publicField(this, "agent", "@signalwire/js/3.10.2");
|
|
1004
1009
|
}
|
|
1005
1010
|
};
|
|
1006
1011
|
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
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/video/memberPositionWorker.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\n /**\n * Show myLayer only if the localStream has a valid video track\n */\n if (localStream.getVideoTracks().length > 0) {\n myLayer.style.display = 'block'\n }\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 VideoRoomEventParams,\n MemberPosition,\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 /** @internal */\n protected override getCompoundEvents() {\n return new Map<any, any>([...MemberPosition.MEMBER_POSITION_COMPOUND_EVENTS])\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 /**\n * This method will be called right after\n * `room.subscribed` happened\n * @internal\n */\n protected attachOnSubscribedWorkers(payload: VideoRoomEventParams) {\n this.setWorker('memberPositionWorker', {\n worker: workers.memberPositionWorker,\n })\n\n this.attachWorkers({ payload })\n }\n\n /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions<RoomSessionObjectEvents> = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n BaseConnectionStateEventTypes,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n /**\n * Hangup if the user stop the screenShare from the\n * native browser button or if the videoTrack ends.\n */\n displayStream.getVideoTracks().forEach((t) => {\n t.addEventListener('ended', () => {\n if (screenShare && screenShare.active) {\n screenShare.leave()\n }\n })\n })\n\n screenShare.on('destroy', () => {\n this._screenShareList.delete(screenShare)\n })\n\n try {\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n await screenShare.join()\n }\n return screenShare\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n throw error\n }\n }\n\n /**\n * Allow to add a camera to the room.\n */\n addCamera(opts: AddCameraOptions = {}) {\n const { autoJoin = true, ...video } = opts\n return this.addDevice({\n autoJoin,\n video,\n })\n }\n\n /**\n * Allow to add a microphone to the room.\n */\n addMicrophone(opts: AddMicrophoneOptions = {}) {\n const { autoJoin = true, ...audio } = opts\n return this.addDevice({\n autoJoin,\n audio,\n })\n }\n\n /**\n * Allow to add additional devices to the room like cameras or microphones.\n */\n async addDevice(opts: AddDeviceOptions = {}) {\n const { autoJoin = true, audio = false, video = false } = opts\n if (!audio && !video) {\n throw new TypeError(\n 'At least one of `audio` or `video` must be requested.'\n )\n }\n\n const options: BaseConnectionOptions<RoomSessionObjectEvents> = {\n ...this.options,\n localStream: undefined,\n remoteStream: undefined,\n audio,\n video,\n additionalDevice: true,\n recoverCall: false,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n BaseConnectionStateEventTypes,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n roomDevice.on('destroy', () => {\n this._deviceList.delete(roomDevice)\n })\n\n try {\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n await roomDevice.join()\n }\n return roomDevice\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n throw error\n }\n }\n\n join() {\n return super.invite<BaseRoomSession<this>>()\n }\n\n leave() {\n return this.hangup()\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n\n /** @internal */\n async hangup() {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup()\n }\n\n /** @internal */\n protected _finalize() {\n this._screenShareList.clear()\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /**\n * @deprecated Use {@link getLayouts} instead. `getLayoutList` will\n * be removed in v3.0.0\n */\n getLayoutList() {\n // @ts-expect-error\n return this.getLayouts()\n }\n\n /**\n * @deprecated Use {@link getMembers} instead. `getMemberList` will\n * be removed in v3.0.0\n */\n getMemberList() {\n // @ts-expect-error\n return this.getMembers()\n }\n}\n\nexport const RoomSessionAPI = extendComponent<\n RoomSessionConnection,\n RoomMethods\n>(RoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n setMeta: Rooms.setMeta,\n setMemberMeta: Rooms.setMemberMeta,\n})\n\ntype RoomSessionObjectEventsHandlerMapping = RoomSessionObjectEvents &\n BaseConnectionStateEventTypes\n\n/** @internal */\nexport const createBaseRoomSessionObject = <RoomSessionType>(\n params: BaseComponentOptions<RoomSessionObjectEventsHandlerMapping>\n): BaseRoomSession<RoomSessionType> => {\n const room = connect<\n RoomSessionObjectEventsHandlerMapping,\n RoomSessionConnection,\n BaseRoomSession<RoomSessionType>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: RoomSessionAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(params)\n\n return room\n}\n", "export const ROOM_COMPONENT_LISTENERS = {\n state: 'onStateChange',\n remoteSDP: 'onRemoteSDP',\n roomId: 'onRoomSubscribed',\n videoConstraints: 'onVideoConstraints',\n audioConstraints: 'onAudioConstraints',\n errors: 'onError',\n responses: 'onSuccess',\n}\n\nexport const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n AssertSameType,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionScreenShareDocs } from './RoomSessionScreenShare.docs'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\ninterface RoomSessionScreenShareMain\n extends RoomScreenShareMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\n/**\n * Represents a screen sharing.\n */\nexport interface RoomSessionScreenShare\n extends AssertSameType<\n RoomSessionScreenShareMain,\n RoomSessionScreenShareDocs\n > {}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<BaseConnectionStateEventTypes> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\nexport const RoomSessionScreenShareAPI = extendComponent<\n RoomSessionScreenShareConnection,\n RoomScreenShareMethods\n>(RoomSessionScreenShareConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n AssertSameType,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionDeviceDocs } from './RoomSessionDevice.docs'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\ninterface RoomSessionDeviceMain\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\n/**\n * A RoomSessionDevice represents a device (such as a microphone or a camera)\n * that is at some point in its lifetime part of a {@link RoomSession}. You can\n * obtain a RoomSessionDevice from the {@link RoomSession} methods\n * {@link RoomSession.addCamera}, {@link RoomSession.addMicrophone}, and\n * {@link RoomSession.addDevice}.\n */\nexport interface RoomSessionDevice\n extends AssertSameType<RoomSessionDeviceMain, RoomSessionDeviceDocs> {}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<BaseConnectionStateEventTypes> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\nexport const RoomSessionDeviceAPI = extendComponent<\n RoomSessionDeviceConnection,\n RoomSessionDeviceMethods\n>(RoomSessionDeviceConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n", "import {\n sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n PubSubChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { RoomSession } from '../RoomSession'\nimport type { VideoMemberListUpdatedParams } from '../utils/interfaces'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'video.memberList.updated'\n\nconst INTERNAL_MEMBER_LIST_UPDATED_EVENT = toInternalEventName({\n event: EXTERNAL_MEMBER_LIST_UPDATED_EVENT,\n})\n\nconst SYNTHETIC_MEMBER_LIST_UPDATED_EVENT = toSyntheticEvent(\n INTERNAL_MEMBER_LIST_UPDATED_EVENT\n)\n\n/**\n * List of action types this worker cares about.\n */\ntype MemberListUpdatedTargetActions = MapToPubSubShape<\n | InternalVideoRoomJoinedEvent\n | InternalVideoMemberUpdatedEvent\n | VideoMemberJoinedEvent\n | VideoMemberLeftEvent\n | VideoMemberUpdatedEvent\n>\n\nconst MEMBER_LIST_EVENTS: Array<MemberListUpdatedTargetActions['type']> = [\n /** Alias to `video.room.subscribed` */\n 'video.room.joined',\n 'video.member.joined',\n 'video.member.left',\n 'video.member.updated',\n]\n\ntype MemberList = Map<string, InternalVideoMemberEntity>\n\nconst isMemberListEvent = (\n event: string\n): event is MemberListUpdatedTargetActions['type'] => {\n // @ts-expect-error\n return MEMBER_LIST_EVENTS.includes(event)\n}\n\nconst getMemberListEventsToSubscribe = (subscriptions: MemberListUpdatedTargetActions['type'][]) => {\n return validateEventsToSubscribe(MEMBER_LIST_EVENTS).filter((event) => {\n return !subscriptions.includes(event)\n })\n}\n\nconst shouldHandleMemberList = (subscriptions: string[]) => {\n return subscriptions.some((event) =>\n event.includes(INTERNAL_MEMBER_LIST_UPDATED_EVENT)\n )\n}\n\nconst getMembersFromAction = (action: MemberListUpdatedTargetActions) => {\n if (action.type === 'video.room.joined') {\n return action.payload.room_session.members\n }\n\n return [action.payload.member]\n}\n\nexport const getUpdatedMembers = ({\n action,\n memberList,\n}: {\n action: MemberListUpdatedTargetActions\n memberList: MemberList\n}) => {\n const actionMembers = getMembersFromAction(action)\n\n switch (action.type) {\n case 'video.member.left':\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.delete(member.id)\n })\n break\n default:\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.set(member.id, member)\n })\n }\n\n return Array.from(memberList.values())\n}\n\nconst initMemberListSubscriptions = (\n room: RoomSession,\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n const events = getMemberListEventsToSubscribe(subscriptions)\n\n events.forEach((event) => {\n /**\n * Params to `subscribe` come from the event handlers\n * the user has attached so to make sure we subscribe to\n * all the appropiate events needed for\n * `memberList.updated` to work, we must subscribe to\n * the required events. We don't need to act upon the\n * event (that's why we attach a `noop`), just to\n * register it (`subscribe` gets its values from\n * `BaseComponent.getSubscriptions`, which gets\n * populated by each of the event handlers the user\n * attached).\n */\n room.once(event as any, noop)\n })\n\n /**\n * This handler will act as a simple bridge between\n * synthetic events and external events.\n */\n const eventBridgeHandler = ({ members }: VideoMemberListUpdatedParams) => {\n // @ts-expect-error\n room.emit(EXTERNAL_MEMBER_LIST_UPDATED_EVENT, { members })\n }\n\n // @ts-expect-error\n room.on(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n\n /**\n * Any events attached by the saga should be specified\n * here so it can be cleaned up when needed.\n */\n const cleanup = () => {\n // @ts-expect-error\n room.off(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n }\n\n return {\n cleanup,\n }\n}\n\nfunction* membersListUpdatedWatcher({\n pubSubChannel,\n}: {\n pubSubChannel: PubSubChannel\n}): SagaIterator {\n const memberList: MemberList = new Map()\n\n function* worker(pubSubAction: MemberListUpdatedTargetActions) {\n const roomSessionId =\n pubSubAction.type === 'video.room.joined'\n ? pubSubAction.payload.room_session.id\n : pubSubAction.payload.room_session_id\n\n const members = getUpdatedMembers({ action: pubSubAction, memberList })\n const memberListPayload = {\n /**\n * At this point it's needed to send the\n * `room_session_id` so the pubSubSaga can properly\n * infer the namespace for emitting the events to the\n * appropiate room.\n */\n room_session_id: roomSessionId,\n members,\n }\n\n // TODO: add typings\n yield sagaEffects.put(pubSubChannel, {\n type: SYNTHETIC_MEMBER_LIST_UPDATED_EVENT as any,\n payload: memberListPayload as any,\n })\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n pubSubChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<RoomSession> =\n function* membersChangedWorker({\n channels: { pubSubChannel },\n instance,\n }): SagaIterator {\n // @ts-expect-error\n const subscriptions = instance.getSubscriptions()\n\n if (!shouldHandleMemberList(subscriptions)) {\n return\n }\n\n const { cleanup } = initMemberListSubscriptions(instance, subscriptions)\n\n yield sagaEffects.fork(membersListUpdatedWatcher, {\n pubSubChannel,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n", "import {\n SagaIterator,\n SDKWorker,\n MemberPosition,\n sagaEffects,\n} from '@signalwire/core'\n\nexport const memberPositionWorker: SDKWorker<any> =\n function* memberPositionWorker(options): SagaIterator {\n if (!options.payload) {\n throw new Error('[memberPositionWorker] Missing payload')\n }\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n payload: options.payload,\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\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'updateToken',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'setMemberState',\n]\n\nexport const Client = function (chatOptions: ClientOptions) {\n const client = createClient<Client>(chatOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.chat[prop](...params)\n }\n }\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n", "import { 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 { UserOptions, AssertSameType, getLogger } from '@signalwire/core'\nimport { createClient } from './createClient'\nimport type { MakeRoomOptions } from './Client'\nimport { BaseRoomSession } from './BaseRoomSession'\nimport { RoomSessionDocs } from './RoomSession.docs'\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n aspectRatio: { ideal: 16 / 9 },\n}\n\n/**\n * List of properties/methods the user shouldn't be able to\n * use until they sucessfully call `roomSession.join()`.\n */\nexport const UNSAFE_PROP_ACCESS = [\n 'audioMute',\n 'audioUnmute',\n 'deaf',\n 'getLayouts',\n 'getMembers',\n 'getRecordings',\n 'hideVideoMuted',\n 'leave',\n 'removerMember',\n 'restoreOutboundAudio',\n 'restoreOutboundVideo',\n 'setInputSensitivity',\n 'setInputVolume',\n 'setLayout',\n 'setPositions',\n 'setMemberPosition',\n 'setOutputVolume',\n 'showVideoMuted',\n 'startRecording',\n 'stopOutboundAudio',\n 'stopOutboundVideo',\n 'undeaf',\n 'videoMute',\n 'videoUnmute',\n 'setMicrophoneVolume',\n 'setSpeakerVolume',\n 'setMeta',\n 'setMemberMeta',\n]\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\ninterface RoomSessionMain extends BaseRoomSession<RoomSessionMain> {\n new (opts: RoomSessionOptions): this\n}\n\n/**\n * A RoomSession allows you to start and control video sessions.\n *\n * For example, the following code joins a video session and listens for new\n * members joining:\n *\n * ```typescript\n * const roomSession = new SignalWire.Video.RoomSession({\n * token: '<YourRoomToken>',\n * rootElement: document.getElementById('myVideoElement'),\n * audio: true,\n * video: true,\n * })\n *\n * roomSession.on('member.joined', (e) => {\n * console.log(`${e.member.name} joined`)\n * })\n *\n * roomSession.join()\n * ```\n *\n * ## Events\n *\n * Please see {@link RoomSessionEvents} for the list of events emitted by a\n * RoomSession object.\n */\nexport interface RoomSession\n extends AssertSameType<RoomSessionMain, RoomSessionDocs<RoomSessionMain>> {}\n\n/**\n * @ignore\n * @privateRemarks\n *\n * The use of a function expression as a contructor instead\n * of a class was picked because it made a couple things\n * simpler for this use case.\n * 1. Making classes behave as factories can be tricky when\n * working with TypeScript since it's non trivial to\n * switch the type returned by the constructor\n * 2. It also generates more verbose code (once transpiled)\n * if we want to have private fields to store `room` and\n * `client`.\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\n\n const client = createClient<RoomSession>(userOptions)\n const room = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n room.once('room.subscribed', (payload) => {\n // @ts-expect-error\n room.attachOnSubscribedWorkers(payload)\n resolve(room)\n })\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n 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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",
|
|
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 waitForVideoReady,\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 layerMap,\n })\n const hideOverlay = makeDisplayChangeFn('none')\n const showOverlay = makeDisplayChangeFn('block')\n\n room.on('layout.changed', (params) => {\n getLogger().debug('Received layout.changed')\n if (room.peer.hasVideoSender && room.localStream) {\n layoutChangedHandler({\n // @ts-expect-error\n layout: params.layout,\n localStream: room.localStream,\n myMemberId: room.memberId,\n })\n }\n })\n\n 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 = async (track: MediaStreamTrack) => {\n setVideoMediaTrack({ element, track })\n\n element.style.width = '100%'\n\n if (!applyLocalVideoOverlay) {\n rootElement.appendChild(element)\n return\n }\n\n const mcuWrapper = document.createElement('div')\n mcuWrapper.style.position = 'absolute'\n mcuWrapper.style.top = '0'\n mcuWrapper.style.left = '0'\n mcuWrapper.style.right = '0'\n mcuWrapper.style.bottom = '0'\n mcuWrapper.appendChild(element)\n\n const paddingWrapper = document.createElement('div')\n paddingWrapper.style.paddingBottom = '56.25%'\n paddingWrapper.appendChild(mcuWrapper)\n\n const layersWrapper = document.createElement('div')\n layersWrapper.classList.add('mcuLayers')\n layersWrapper.style.display = 'none'\n paddingWrapper.appendChild(layersWrapper)\n\n const relativeWrapper = document.createElement('div')\n relativeWrapper.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.display = 'flex'\n rootElement.style.alignItems = 'center'\n rootElement.style.justifyContent = 'center'\n rootElement.appendChild(relativeWrapper)\n\n if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n await waitForVideoReady({ element })\n }\n layersWrapper.style.display = 'block'\n }\n\n handleVideoTrack(track).catch((error) => {\n getLogger().error('Handle video track error', error)\n })\n\n // TODO: take destroy\n}\n", "import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\n} from '@signalwire/core'\n\nconst _addSDKPrefix = (input: string) => {\n return `sw-sdk-${input}`\n}\n\nconst buildVideo = () => {\n const video = document.createElement('video')\n video.muted = true\n video.autoplay = true\n video.playsInline = true\n\n return video\n}\n\nconst waitForVideoReady = ({ element }: { element: HTMLVideoElement }) => {\n return new Promise<void>((resolve) => {\n element.addEventListener('canplay', function listener() {\n element.removeEventListener('canplay', listener)\n resolve()\n })\n element.addEventListener('resize', function listener() {\n element.removeEventListener('resize', listener)\n resolve()\n })\n })\n}\n\nconst _getLocationStyles = ({\n x,\n y,\n width,\n height,\n}: InternalVideoLayoutLayer) => {\n return {\n top: `${y}%`,\n left: `${x}%`,\n width: `${width}%`,\n height: `${height}%`,\n }\n}\n\nconst _buildLayer = ({ location }: { location: InternalVideoLayoutLayer }) => {\n const { top, left, width, height } = _getLocationStyles(location)\n const layer = document.createElement('div')\n layer.style.position = 'absolute'\n layer.style.overflow = 'hidden'\n layer.style.top = top\n layer.style.left = left\n layer.style.width = width\n layer.style.height = height\n\n return layer\n}\n\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n myMemberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler =\n ({\n layerMap,\n rootElement,\n }: {\n layerMap: Map<string, HTMLElement>\n rootElement: HTMLElement\n }) =>\n async ({ layout, myMemberId, localStream }: LayoutChangedHandlerParams) => {\n getLogger().debug('Process layout.changed')\n try {\n const { layers = [] } = layout\n const location = layers.find(({ member_id }) => member_id === myMemberId)\n\n const myLayerKey = _addSDKPrefix(myMemberId)\n let myLayer = layerMap.get(myLayerKey)\n if (!location) {\n getLogger().debug('Location not found')\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 getLogger().debug('Build myLayer')\n myLayer = _buildLayer({ 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 getLogger().debug('Update myLayer:', top, left, width, height)\n /**\n * Show myLayer only if the localStream has a valid video track\n */\n if (localStream.getVideoTracks().length > 0) {\n myLayer.style.display = 'block'\n }\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 waitForVideoReady,\n}\n", "const setAudioMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n}) => {\n element.autoplay = true\n // @ts-ignore\n element.playsinline = true\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n\n return element\n}\n\nexport { setAudioMediaTrack }\n", "import { actions } from '@signalwire/core'\n\nexport const audioSetSpeakerAction = actions.createAction<string>(\n 'swJs/audioSetSpeakerAction'\n)\n", "import {\n connect,\n Rooms,\n EventTransform,\n extendComponent,\n BaseComponentContract,\n BaseComponentOptions,\n BaseConnectionContract,\n toLocalEvent,\n toExternalJSON,\n VideoRoomEventParams,\n MemberPosition,\n} 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 /** @internal */\n protected override getCompoundEvents() {\n return new Map<any, any>([...MemberPosition.MEMBER_POSITION_COMPOUND_EVENTS])\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 /**\n * This method will be called right after\n * `room.subscribed` happened\n * @internal\n */\n protected attachOnSubscribedWorkers(payload: VideoRoomEventParams) {\n this.setWorker('memberPositionWorker', {\n worker: workers.memberPositionWorker,\n })\n\n this.attachWorkers({ payload })\n }\n\n /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions<RoomSessionObjectEvents> = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n BaseConnectionStateEventTypes,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n /**\n * Hangup if the user stop the screenShare from the\n * native browser button or if the videoTrack ends.\n */\n displayStream.getVideoTracks().forEach((t) => {\n t.addEventListener('ended', () => {\n if (screenShare && screenShare.active) {\n screenShare.leave()\n }\n })\n })\n\n screenShare.on('destroy', () => {\n this._screenShareList.delete(screenShare)\n })\n\n try {\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n await screenShare.join()\n }\n return screenShare\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n throw error\n }\n }\n\n /**\n * Allow to add a camera to the room.\n */\n addCamera(opts: AddCameraOptions = {}) {\n const { autoJoin = true, ...video } = opts\n return this.addDevice({\n autoJoin,\n video,\n })\n }\n\n /**\n * Allow to add a microphone to the room.\n */\n addMicrophone(opts: AddMicrophoneOptions = {}) {\n const { autoJoin = true, ...audio } = opts\n return this.addDevice({\n autoJoin,\n audio,\n })\n }\n\n /**\n * Allow to add additional devices to the room like cameras or microphones.\n */\n async addDevice(opts: AddDeviceOptions = {}) {\n const { autoJoin = true, audio = false, video = false } = opts\n if (!audio && !video) {\n throw new TypeError(\n 'At least one of `audio` or `video` must be requested.'\n )\n }\n\n const options: BaseConnectionOptions<RoomSessionObjectEvents> = {\n ...this.options,\n localStream: undefined,\n remoteStream: undefined,\n audio,\n video,\n additionalDevice: true,\n recoverCall: false,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n BaseConnectionStateEventTypes,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n roomDevice.on('destroy', () => {\n this._deviceList.delete(roomDevice)\n })\n\n try {\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n await roomDevice.join()\n }\n return roomDevice\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n throw error\n }\n }\n\n join() {\n return super.invite<BaseRoomSession<this>>()\n }\n\n leave() {\n return this.hangup()\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n\n /** @internal */\n async hangup() {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup()\n }\n\n /** @internal */\n protected _finalize() {\n this._screenShareList.clear()\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /**\n * @deprecated Use {@link getLayouts} instead. `getLayoutList` will\n * be removed in v3.0.0\n */\n getLayoutList() {\n // @ts-expect-error\n return this.getLayouts()\n }\n\n /**\n * @deprecated Use {@link getMembers} instead. `getMemberList` will\n * be removed in v3.0.0\n */\n getMemberList() {\n // @ts-expect-error\n return this.getMembers()\n }\n}\n\nexport const RoomSessionAPI = extendComponent<\n RoomSessionConnection,\n RoomMethods\n>(RoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n setMeta: Rooms.setMeta,\n setMemberMeta: Rooms.setMemberMeta,\n})\n\ntype RoomSessionObjectEventsHandlerMapping = RoomSessionObjectEvents &\n BaseConnectionStateEventTypes\n\n/** @internal */\nexport const createBaseRoomSessionObject = <RoomSessionType>(\n params: BaseComponentOptions<RoomSessionObjectEventsHandlerMapping>\n): BaseRoomSession<RoomSessionType> => {\n const room = connect<\n RoomSessionObjectEventsHandlerMapping,\n RoomSessionConnection,\n BaseRoomSession<RoomSessionType>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: RoomSessionAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(params)\n\n return room\n}\n", "export const ROOM_COMPONENT_LISTENERS = {\n state: 'onStateChange',\n remoteSDP: 'onRemoteSDP',\n roomId: 'onRoomSubscribed',\n videoConstraints: 'onVideoConstraints',\n audioConstraints: 'onAudioConstraints',\n errors: 'onError',\n responses: 'onSuccess',\n}\n\nexport const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n AssertSameType,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionScreenShareDocs } from './RoomSessionScreenShare.docs'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\ninterface RoomSessionScreenShareMain\n extends RoomScreenShareMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\n/**\n * Represents a screen sharing.\n */\nexport interface RoomSessionScreenShare\n extends AssertSameType<\n RoomSessionScreenShareMain,\n RoomSessionScreenShareDocs\n > {}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<BaseConnectionStateEventTypes> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\nexport const RoomSessionScreenShareAPI = extendComponent<\n RoomSessionScreenShareConnection,\n RoomScreenShareMethods\n>(RoomSessionScreenShareConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n AssertSameType,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionDeviceDocs } from './RoomSessionDevice.docs'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\ninterface RoomSessionDeviceMain\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\n/**\n * A RoomSessionDevice represents a device (such as a microphone or a camera)\n * that is at some point in its lifetime part of a {@link RoomSession}. You can\n * obtain a RoomSessionDevice from the {@link RoomSession} methods\n * {@link RoomSession.addCamera}, {@link RoomSession.addMicrophone}, and\n * {@link RoomSession.addDevice}.\n */\nexport interface RoomSessionDevice\n extends AssertSameType<RoomSessionDeviceMain, RoomSessionDeviceDocs> {}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<BaseConnectionStateEventTypes> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\nexport const RoomSessionDeviceAPI = extendComponent<\n RoomSessionDeviceConnection,\n RoomSessionDeviceMethods\n>(RoomSessionDeviceConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n", "import {\n sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n PubSubChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { RoomSession } from '../RoomSession'\nimport type { VideoMemberListUpdatedParams } from '../utils/interfaces'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'video.memberList.updated'\n\nconst INTERNAL_MEMBER_LIST_UPDATED_EVENT = toInternalEventName({\n event: EXTERNAL_MEMBER_LIST_UPDATED_EVENT,\n})\n\nconst SYNTHETIC_MEMBER_LIST_UPDATED_EVENT = toSyntheticEvent(\n INTERNAL_MEMBER_LIST_UPDATED_EVENT\n)\n\n/**\n * List of action types this worker cares about.\n */\ntype MemberListUpdatedTargetActions = MapToPubSubShape<\n | InternalVideoRoomJoinedEvent\n | InternalVideoMemberUpdatedEvent\n | VideoMemberJoinedEvent\n | VideoMemberLeftEvent\n | VideoMemberUpdatedEvent\n>\n\nconst MEMBER_LIST_EVENTS: Array<MemberListUpdatedTargetActions['type']> = [\n /** Alias to `video.room.subscribed` */\n 'video.room.joined',\n 'video.member.joined',\n 'video.member.left',\n 'video.member.updated',\n]\n\ntype MemberList = Map<string, InternalVideoMemberEntity>\n\nconst isMemberListEvent = (\n event: string\n): event is MemberListUpdatedTargetActions['type'] => {\n // @ts-expect-error\n return MEMBER_LIST_EVENTS.includes(event)\n}\n\nconst getMemberListEventsToSubscribe = (subscriptions: MemberListUpdatedTargetActions['type'][]) => {\n return validateEventsToSubscribe(MEMBER_LIST_EVENTS).filter((event) => {\n return !subscriptions.includes(event)\n })\n}\n\nconst shouldHandleMemberList = (subscriptions: string[]) => {\n return subscriptions.some((event) =>\n event.includes(INTERNAL_MEMBER_LIST_UPDATED_EVENT)\n )\n}\n\nconst getMembersFromAction = (action: MemberListUpdatedTargetActions) => {\n if (action.type === 'video.room.joined') {\n return action.payload.room_session.members\n }\n\n return [action.payload.member]\n}\n\nexport const getUpdatedMembers = ({\n action,\n memberList,\n}: {\n action: MemberListUpdatedTargetActions\n memberList: MemberList\n}) => {\n const actionMembers = getMembersFromAction(action)\n\n switch (action.type) {\n case 'video.member.left':\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.delete(member.id)\n })\n break\n default:\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.set(member.id, member)\n })\n }\n\n return Array.from(memberList.values())\n}\n\nconst initMemberListSubscriptions = (\n room: RoomSession,\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n const events = getMemberListEventsToSubscribe(subscriptions)\n\n events.forEach((event) => {\n /**\n * Params to `subscribe` come from the event handlers\n * the user has attached so to make sure we subscribe to\n * all the appropiate events needed for\n * `memberList.updated` to work, we must subscribe to\n * the required events. We don't need to act upon the\n * event (that's why we attach a `noop`), just to\n * register it (`subscribe` gets its values from\n * `BaseComponent.getSubscriptions`, which gets\n * populated by each of the event handlers the user\n * attached).\n */\n room.once(event as any, noop)\n })\n\n /**\n * This handler will act as a simple bridge between\n * synthetic events and external events.\n */\n const eventBridgeHandler = ({ members }: VideoMemberListUpdatedParams) => {\n // @ts-expect-error\n room.emit(EXTERNAL_MEMBER_LIST_UPDATED_EVENT, { members })\n }\n\n // @ts-expect-error\n room.on(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n\n /**\n * Any events attached by the saga should be specified\n * here so it can be cleaned up when needed.\n */\n const cleanup = () => {\n // @ts-expect-error\n room.off(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n }\n\n return {\n cleanup,\n }\n}\n\nfunction* membersListUpdatedWatcher({\n pubSubChannel,\n}: {\n pubSubChannel: PubSubChannel\n}): SagaIterator {\n const memberList: MemberList = new Map()\n\n function* worker(pubSubAction: MemberListUpdatedTargetActions) {\n const roomSessionId =\n pubSubAction.type === 'video.room.joined'\n ? pubSubAction.payload.room_session.id\n : pubSubAction.payload.room_session_id\n\n const members = getUpdatedMembers({ action: pubSubAction, memberList })\n const memberListPayload = {\n /**\n * At this point it's needed to send the\n * `room_session_id` so the pubSubSaga can properly\n * infer the namespace for emitting the events to the\n * appropiate room.\n */\n room_session_id: roomSessionId,\n members,\n }\n\n // TODO: add typings\n yield sagaEffects.put(pubSubChannel, {\n type: SYNTHETIC_MEMBER_LIST_UPDATED_EVENT as any,\n payload: memberListPayload as any,\n })\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n pubSubChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<RoomSession> =\n function* membersChangedWorker({\n channels: { pubSubChannel },\n instance,\n }): SagaIterator {\n // @ts-expect-error\n const subscriptions = instance.getSubscriptions()\n\n if (!shouldHandleMemberList(subscriptions)) {\n return\n }\n\n const { cleanup } = initMemberListSubscriptions(instance, subscriptions)\n\n yield sagaEffects.fork(membersListUpdatedWatcher, {\n pubSubChannel,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n", "import {\n SagaIterator,\n SDKWorker,\n MemberPosition,\n sagaEffects,\n} from '@signalwire/core'\n\nexport const memberPositionWorker: SDKWorker<any> =\n function* memberPositionWorker(options): SagaIterator {\n if (!options.payload) {\n throw new Error('[memberPositionWorker] Missing payload')\n }\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n payload: options.payload,\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\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'updateToken',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'setMemberState',\n]\n\nexport const Client = function (chatOptions: ClientOptions) {\n const client = createClient<Client>(chatOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.chat[prop](...params)\n }\n }\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n", "import { 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 { UserOptions, AssertSameType, getLogger } from '@signalwire/core'\nimport { createClient } from './createClient'\nimport type { MakeRoomOptions } from './Client'\nimport { BaseRoomSession } from './BaseRoomSession'\nimport { RoomSessionDocs } from './RoomSession.docs'\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n aspectRatio: { ideal: 16 / 9 },\n}\n\n/**\n * List of properties/methods the user shouldn't be able to\n * use until they sucessfully call `roomSession.join()`.\n */\nexport const UNSAFE_PROP_ACCESS = [\n 'audioMute',\n 'audioUnmute',\n 'deaf',\n 'getLayouts',\n 'getMembers',\n 'getRecordings',\n 'hideVideoMuted',\n 'leave',\n 'removerMember',\n 'restoreOutboundAudio',\n 'restoreOutboundVideo',\n 'setInputSensitivity',\n 'setInputVolume',\n 'setLayout',\n 'setPositions',\n 'setMemberPosition',\n 'setOutputVolume',\n 'showVideoMuted',\n 'startRecording',\n 'stopOutboundAudio',\n 'stopOutboundVideo',\n 'undeaf',\n 'videoMute',\n 'videoUnmute',\n 'setMicrophoneVolume',\n 'setSpeakerVolume',\n 'setMeta',\n 'setMemberMeta',\n]\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\ninterface RoomSessionMain extends BaseRoomSession<RoomSessionMain> {\n new (opts: RoomSessionOptions): this\n}\n\n/**\n * A RoomSession allows you to start and control video sessions.\n *\n * For example, the following code joins a video session and listens for new\n * members joining:\n *\n * ```typescript\n * const roomSession = new SignalWire.Video.RoomSession({\n * token: '<YourRoomToken>',\n * rootElement: document.getElementById('myVideoElement'),\n * audio: true,\n * video: true,\n * })\n *\n * roomSession.on('member.joined', (e) => {\n * console.log(`${e.member.name} joined`)\n * })\n *\n * roomSession.join()\n * ```\n *\n * ## Events\n *\n * Please see {@link RoomSessionEvents} for the list of events emitted by a\n * RoomSession object.\n */\nexport interface RoomSession\n extends AssertSameType<RoomSessionMain, RoomSessionDocs<RoomSessionMain>> {}\n\n/**\n * @ignore\n * @privateRemarks\n *\n * The use of a function expression as a contructor instead\n * of a class was picked because it made a couple things\n * simpler for this use case.\n * 1. Making classes behave as factories can be tricky when\n * working with TypeScript since it's non trivial to\n * switch the type returned by the constructor\n * 2. It also generates more verbose code (once transpiled)\n * if we want to have private fields to store `room` and\n * `client`.\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\n\n const client = createClient<RoomSession>(userOptions)\n const room = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n room.once('room.subscribed', (payload) => {\n // @ts-expect-error\n room.attachOnSubscribedWorkers(payload)\n resolve(room)\n })\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n 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
|
@@ -113,7 +113,7 @@ var buildVideo = () => {
|
|
|
113
113
|
video.playsInline = true;
|
|
114
114
|
return video;
|
|
115
115
|
};
|
|
116
|
-
var
|
|
116
|
+
var waitForVideoReady = ({ element }) => {
|
|
117
117
|
return new Promise((resolve) => {
|
|
118
118
|
element.addEventListener("canplay", function listener() {
|
|
119
119
|
element.removeEventListener("canplay", listener);
|
|
@@ -138,13 +138,7 @@ var _getLocationStyles = ({
|
|
|
138
138
|
height: `${height}%`
|
|
139
139
|
};
|
|
140
140
|
};
|
|
141
|
-
var _buildLayer = (
|
|
142
|
-
location,
|
|
143
|
-
element
|
|
144
|
-
}) {
|
|
145
|
-
if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {
|
|
146
|
-
yield _videoReady({ element });
|
|
147
|
-
}
|
|
141
|
+
var _buildLayer = ({ location }) => {
|
|
148
142
|
const { top, left, width, height } = _getLocationStyles(location);
|
|
149
143
|
const layer = document.createElement("div");
|
|
150
144
|
layer.style.position = "absolute";
|
|
@@ -154,18 +148,19 @@ var _buildLayer = (_0) => __async(void 0, [_0], function* ({
|
|
|
154
148
|
layer.style.width = width;
|
|
155
149
|
layer.style.height = height;
|
|
156
150
|
return layer;
|
|
157
|
-
}
|
|
151
|
+
};
|
|
158
152
|
var makeLayoutChangedHandler = ({
|
|
159
153
|
layerMap,
|
|
160
|
-
element,
|
|
161
154
|
rootElement
|
|
162
155
|
}) => (_0) => __async(void 0, [_0], function* ({ layout, myMemberId, localStream }) {
|
|
156
|
+
(0, import_core.getLogger)().debug("Process layout.changed");
|
|
163
157
|
try {
|
|
164
158
|
const { layers = [] } = layout;
|
|
165
159
|
const location = layers.find(({ member_id }) => member_id === myMemberId);
|
|
166
160
|
const myLayerKey = _addSDKPrefix(myMemberId);
|
|
167
161
|
let myLayer = layerMap.get(myLayerKey);
|
|
168
162
|
if (!location) {
|
|
163
|
+
(0, import_core.getLogger)().debug("Location not found");
|
|
169
164
|
if (myLayer) {
|
|
170
165
|
(0, import_core.getLogger)().debug("Current layer not visible");
|
|
171
166
|
myLayer.style.display = "none";
|
|
@@ -173,7 +168,8 @@ var makeLayoutChangedHandler = ({
|
|
|
173
168
|
return;
|
|
174
169
|
}
|
|
175
170
|
if (!myLayer) {
|
|
176
|
-
|
|
171
|
+
(0, import_core.getLogger)().debug("Build myLayer");
|
|
172
|
+
myLayer = _buildLayer({ location });
|
|
177
173
|
myLayer.id = myLayerKey;
|
|
178
174
|
const localVideo = buildVideo();
|
|
179
175
|
localVideo.srcObject = localStream;
|
|
@@ -189,6 +185,7 @@ var makeLayoutChangedHandler = ({
|
|
|
189
185
|
return;
|
|
190
186
|
}
|
|
191
187
|
const { top, left, width, height } = _getLocationStyles(location);
|
|
188
|
+
(0, import_core.getLogger)().debug("Update myLayer:", top, left, width, height);
|
|
192
189
|
if (localStream.getVideoTracks().length > 0) {
|
|
193
190
|
myLayer.style.display = "block";
|
|
194
191
|
}
|
|
@@ -257,12 +254,12 @@ var makeVideoElementSaga = ({
|
|
|
257
254
|
const videoEl = buildVideo();
|
|
258
255
|
const layoutChangedHandler = makeLayoutChangedHandler({
|
|
259
256
|
rootElement,
|
|
260
|
-
element: videoEl,
|
|
261
257
|
layerMap
|
|
262
258
|
});
|
|
263
259
|
const hideOverlay = makeDisplayChangeFn("none");
|
|
264
260
|
const showOverlay = makeDisplayChangeFn("block");
|
|
265
261
|
room.on("layout.changed", (params) => {
|
|
262
|
+
(0, import_core3.getLogger)().debug("Received layout.changed");
|
|
266
263
|
if (room.peer.hasVideoSender && room.localStream) {
|
|
267
264
|
layoutChangedHandler({
|
|
268
265
|
layout: params.layout,
|
|
@@ -388,7 +385,7 @@ function* videoElementSetupWorker({
|
|
|
388
385
|
track,
|
|
389
386
|
element
|
|
390
387
|
}) {
|
|
391
|
-
const handleVideoTrack = (track2) => {
|
|
388
|
+
const handleVideoTrack = (track2) => __async(this, null, function* () {
|
|
392
389
|
setVideoMediaTrack({ element, track: track2 });
|
|
393
390
|
element.style.width = "100%";
|
|
394
391
|
if (!applyLocalVideoOverlay) {
|
|
@@ -407,6 +404,7 @@ function* videoElementSetupWorker({
|
|
|
407
404
|
paddingWrapper.appendChild(mcuWrapper);
|
|
408
405
|
const layersWrapper = document.createElement("div");
|
|
409
406
|
layersWrapper.classList.add("mcuLayers");
|
|
407
|
+
layersWrapper.style.display = "none";
|
|
410
408
|
paddingWrapper.appendChild(layersWrapper);
|
|
411
409
|
const relativeWrapper = document.createElement("div");
|
|
412
410
|
relativeWrapper.style.position = "relative";
|
|
@@ -417,8 +415,15 @@ function* videoElementSetupWorker({
|
|
|
417
415
|
rootElement.style.alignItems = "center";
|
|
418
416
|
rootElement.style.justifyContent = "center";
|
|
419
417
|
rootElement.appendChild(relativeWrapper);
|
|
420
|
-
|
|
421
|
-
|
|
418
|
+
if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {
|
|
419
|
+
(0, import_core3.getLogger)().debug("Wait for the MCU to be ready");
|
|
420
|
+
yield waitForVideoReady({ element });
|
|
421
|
+
}
|
|
422
|
+
layersWrapper.style.display = "block";
|
|
423
|
+
});
|
|
424
|
+
handleVideoTrack(track).catch((error) => {
|
|
425
|
+
(0, import_core3.getLogger)().error("Handle video track error", error);
|
|
426
|
+
});
|
|
422
427
|
}
|
|
423
428
|
|
|
424
429
|
// src/BaseRoomSession.ts
|
|
@@ -1007,7 +1012,7 @@ var JWTSession = class extends import_core11.BaseJWTSession {
|
|
|
1007
1012
|
constructor() {
|
|
1008
1013
|
super(...arguments);
|
|
1009
1014
|
__publicField(this, "WebSocketConstructor", WebSocket);
|
|
1010
|
-
__publicField(this, "agent", "@signalwire/js/3.10.
|
|
1015
|
+
__publicField(this, "agent", "@signalwire/js/3.10.2");
|
|
1011
1016
|
}
|
|
1012
1017
|
};
|
|
1013
1018
|
|