@signalwire/js 3.28.0 → 3.28.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/src/BaseSession.d.ts +1 -1
- package/dist/core/src/RPCMessages/VertoMessages.d.ts +7 -0
- package/dist/core/src/RPCMessages/VertoMessages.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +2 -2
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/redux/features/component/componentSlice.d.ts +96 -0
- package/dist/core/src/redux/features/component/componentSlice.d.ts.map +1 -1
- package/dist/core/src/redux/rootReducer.d.ts +16 -0
- package/dist/core/src/redux/rootReducer.d.ts.map +1 -1
- package/dist/core/src/types/common.d.ts +16 -10
- package/dist/core/src/types/common.d.ts.map +1 -1
- package/dist/core/src/types/fabric.d.ts +0 -27
- package/dist/core/src/types/fabric.d.ts.map +1 -1
- package/dist/core/src/types/index.d.ts +67 -1
- package/dist/core/src/types/index.d.ts.map +1 -1
- package/dist/core/src/types/videoPlayback.d.ts +1 -7
- package/dist/core/src/types/videoPlayback.d.ts.map +1 -1
- package/dist/core/src/types/videoRecording.d.ts +1 -7
- package/dist/core/src/types/videoRecording.d.ts.map +1 -1
- package/dist/core/src/types/voice.d.ts +13 -2
- package/dist/core/src/types/voice.d.ts.map +1 -1
- package/dist/core/src/types/voiceCall.d.ts +96 -964
- package/dist/core/src/types/voiceCall.d.ts.map +1 -1
- package/dist/core/src/types/voiceCollect.d.ts +166 -0
- package/dist/core/src/types/voiceCollect.d.ts.map +1 -0
- package/dist/core/src/types/voiceConnect.d.ts +77 -0
- package/dist/core/src/types/voiceConnect.d.ts.map +1 -0
- package/dist/core/src/types/voiceDetect.d.ts +127 -0
- package/dist/core/src/types/voiceDetect.d.ts.map +1 -0
- package/dist/core/src/types/voicePlayback.d.ts +141 -0
- package/dist/core/src/types/voicePlayback.d.ts.map +1 -0
- package/dist/core/src/types/voicePrompt.d.ts +105 -0
- package/dist/core/src/types/voicePrompt.d.ts.map +1 -0
- package/dist/core/src/types/voiceRecording.d.ts +107 -0
- package/dist/core/src/types/voiceRecording.d.ts.map +1 -0
- package/dist/core/src/types/voiceSendDigits.d.ts +21 -0
- package/dist/core/src/types/voiceSendDigits.d.ts.map +1 -0
- package/dist/core/src/types/voiceTap.d.ts +116 -0
- package/dist/core/src/types/voiceTap.d.ts.map +1 -0
- package/dist/core/src/utils/constants.d.ts.map +1 -1
- package/dist/core/src/utils/eventUtils.d.ts +0 -2
- package/dist/core/src/utils/eventUtils.d.ts.map +1 -1
- package/dist/core/src/utils/interfaces.d.ts +19 -2
- package/dist/core/src/utils/interfaces.d.ts.map +1 -1
- package/dist/index.esm.js +636 -223
- package/dist/index.esm.js.map +4 -4
- package/dist/index.js +655 -233
- package/dist/index.js.map +4 -4
- package/dist/index.umd.js +26 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/js/src/fabric/Conversation.d.ts +2 -2
- package/dist/js/src/fabric/Conversation.d.ts.map +1 -1
- package/dist/js/src/fabric/FabricRoomSession.d.ts +5 -4
- package/dist/js/src/fabric/FabricRoomSession.d.ts.map +1 -1
- package/dist/js/src/fabric/SignalWire.d.ts.map +1 -1
- package/dist/js/src/fabric/WSClient.d.ts +2 -2
- package/dist/js/src/fabric/WSClient.d.ts.map +1 -1
- package/dist/js/src/fabric/createWSClient.d.ts +1 -1
- package/dist/js/src/fabric/createWSClient.d.ts.map +1 -1
- package/dist/js/src/fabric/interfaces/capabilities.d.ts +28 -0
- package/dist/js/src/fabric/interfaces/capabilities.d.ts.map +1 -0
- package/dist/js/src/fabric/interfaces/conversation.d.ts +4 -4
- package/dist/js/src/fabric/interfaces/conversation.d.ts.map +1 -1
- package/dist/js/src/fabric/interfaces/index.d.ts +1 -0
- package/dist/js/src/fabric/interfaces/index.d.ts.map +1 -1
- package/dist/js/src/fabric/interfaces/wsClient.d.ts +2 -2
- package/dist/js/src/fabric/interfaces/wsClient.d.ts.map +1 -1
- package/dist/js/src/fabric/utils/capabilitiesHelpers.d.ts +28 -0
- package/dist/js/src/fabric/utils/capabilitiesHelpers.d.ts.map +1 -0
- package/dist/js/src/fabric/workers/callJoinWorker.d.ts.map +1 -1
- package/dist/js/src/fabric/workers/wsClientWorker.d.ts.map +1 -1
- package/dist/js/src/index.d.ts +2 -2
- package/dist/js/src/index.d.ts.map +1 -1
- package/dist/js/src/utils/interfaces/fabric.d.ts +6 -3
- package/dist/js/src/utils/interfaces/fabric.d.ts.map +1 -1
- package/dist/js/src/utils/paginatedResult.d.ts +4 -4
- package/dist/js/tsconfig.build.tsbuildinfo +1 -1
- package/dist/webrtc/src/BaseConnection.d.ts +78 -19
- package/dist/webrtc/src/BaseConnection.d.ts.map +1 -1
- package/dist/webrtc/src/RTCPeer.d.ts +11 -0
- package/dist/webrtc/src/RTCPeer.d.ts.map +1 -1
- package/dist/webrtc/src/utils/helpers.d.ts.map +1 -1
- package/dist/webrtc/src/utils/interfaces.d.ts +6 -0
- package/dist/webrtc/src/utils/interfaces.d.ts.map +1 -1
- package/dist/webrtc/src/utils/sdpHelpers.d.ts +27 -2
- package/dist/webrtc/src/utils/sdpHelpers.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/fabric/Conversation.ts +9 -7
- package/src/fabric/FabricRoomSession.ts +32 -32
- package/src/fabric/SignalWire.test.ts +2 -0
- package/src/fabric/SignalWire.ts +2 -0
- package/src/fabric/WSClient.ts +6 -10
- package/src/fabric/interfaces/capabilities.ts +30 -0
- package/src/fabric/interfaces/conversation.ts +5 -4
- package/src/fabric/interfaces/index.ts +2 -1
- package/src/fabric/interfaces/wsClient.ts +2 -2
- package/src/fabric/utils/capabilitiesHelpers.test.ts +201 -0
- package/src/fabric/utils/capabilitiesHelpers.ts +190 -0
- package/src/fabric/workers/callJoinWorker.ts +7 -6
- package/src/fabric/workers/wsClientWorker.ts +35 -12
- package/src/index.ts +1 -1
- package/src/utils/interfaces/fabric.ts +10 -3
- package/dist/core/src/utils/eventUtils.test.d.ts +0 -2
- package/dist/core/src/utils/eventUtils.test.d.ts.map +0 -1
package/dist/index.esm.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/chat/index.ts", "../src/createClient.ts", "../src/Client.ts", "../src/features/mediaElements/mediaElementsSagas.ts", "../src/utils/audioElement.ts", "../src/features/actions.ts", "../src/cantina/VideoManager.ts", "../src/cantina/workers/videoManagerWorker.ts", "../src/cantina/workers/videoManagerRoomsWorker.ts", "../src/cantina/workers/videoManagerRoomWorker.ts", "../src/buildVideoElement.ts", "../src/utils/videoElement.ts", "../src/VideoOverlays.ts", "../src/video/VideoRoomSession.ts", "../src/BaseRoomSession.ts", "../src/utils/constants.ts", "../src/utils/roomSession.ts", "../src/RoomSessionScreenShare.ts", "../src/video/workers/memberListUpdatedWorker.ts", "../src/video/workers/childMemberJoinedWorker.ts", "../src/video/workers/videoWorker.ts", "../src/video/workers/videoStreamWorker.ts", "../src/video/workers/videoRecordWorker.ts", "../src/video/workers/videoPlaybackWorker.ts", "../src/RoomSessionDevice.ts", "../src/fabric/FabricRoomSession.ts", "../src/utils/storage.ts", "../src/fabric/utils/constants.ts", "../src/fabric/workers/wsClientWorker.ts", "../src/fabric/workers/conversationWorker.ts", "../src/fabric/workers/fabricWorker.ts", "../src/fabric/FabricRoomSessionMember.ts", "../src/fabric/workers/callSegmentWorker.ts", "../src/fabric/workers/callLeftWorker.ts", "../src/fabric/workers/callJoinWorker.ts", "../src/fabric/workers/fabricMemberWorker.ts", "../src/fabric/utils/helpers.ts", "../src/JWTSession.ts", "../src/utils/CloseEvent.ts", "../src/chat/Client.ts", "../src/pubSub/index.ts", "../src/utils/interfaces/video.ts", "../src/pubSub/Client.ts", "../src/fabric/index.ts", "../src/fabric/HTTPClient.ts", "../src/fabric/createHttpClient.ts", "../src/utils/paginatedResult.ts", "../src/utils/makeQueryParamsUrl.ts", "../src/fabric/utils/typeGuard.ts", "../src/fabric/ConversationAPI.ts", "../src/fabric/Conversation.ts", "../src/fabric/WSClient.ts", "../src/fabric/IncomingCallManager.ts", "../src/fabric/createWSClient.ts", "../src/fabric/SATSession.ts", "../src/fabric/SignalWire.ts", "../src/video/index.ts", "../src/createRoomObject.ts", "../src/joinRoom.ts", "../src/video/RoomSession.ts", "../src/webrtc.ts"],
|
|
4
|
-
"sourcesContent": ["export { Client, ClientOptions, ClientApiEvents } from './Client'\n\nexport { ChatMember, ChatMessage } from '@signalwire/core'\n\nexport type { PagingCursor } from '../utils/interfaces'\n\nexport type {\n ChatAction,\n ChatChannel,\n ChatChannelMessageEvent,\n ChatChannelMessageEventParams,\n ChatChannelState,\n ChatEvent,\n ChatGetMembersParams,\n ChatGetMemberStateParams,\n ChatGetMessagesParams,\n ChatMemberContract,\n ChatMemberEntity,\n ChatMemberJoinedEvent,\n ChatMemberJoinedEventParams,\n ChatMemberLeftEvent,\n ChatMemberLeftEventParams,\n ChatMemberUpdatedEvent,\n ChatMemberUpdatedEventParams,\n ChatMessageContract,\n ChatMessageEntity,\n ChatSetMemberStateParams,\n InternalChatMemberEntity,\n InternalChatMessageEntity,\n PaginationCursor,\n} from '@signalwire/core'\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<ClientEvents, ClientAPI, Client<RoomSessionType>>({\n store,\n Component: ClientAPI,\n })(baseUserOptions)\n\n return client\n}\n", "import {\n BaseClient,\n ClientEvents,\n ClientContract,\n actions,\n Chat as ChatNamespace,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport type { CustomSaga } from '@signalwire/core'\nimport { ConnectionOptions } from '@signalwire/webrtc'\nimport { makeAudioElementSaga } from './features/mediaElements/mediaElementsSagas'\nimport { VideoManager, createVideoManagerObject } from './cantina'\nimport type { Client as ChatClient } from './chat/Client'\nimport type { Client as PubSubClient } from './pubSub/Client'\nimport type { RoomSession } from './video/RoomSession'\nimport { buildVideoElement } from './buildVideoElement'\nimport {\n createVideoRoomSessionObject,\n VideoRoomSessionConnection,\n} from './video/VideoRoomSession'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI['rooms']\n chat: ClientAPI['chat']\n pubSub: ClientAPI['pubSub']\n}\n\nexport interface MakeRoomOptions extends ConnectionOptions {\n /** HTML element in which to display the video stream */\n rootElement?: HTMLElement\n /** Whether to apply the local-overlay on top of your video. Default: `true`. */\n applyLocalVideoOverlay?: boolean\n /** Whether to apply an overlay on top of each member. Default: `true`. */\n applyMemberOverlay?: boolean\n /** Whether to mirror the local video overlay. Default: `false`. */\n mirrorLocalVideoOverlay?: 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 /** Local media stream to override the local video and audio stream tracks */\n localStream?: MediaStream\n}\n\nexport class ClientAPI extends BaseClient<ClientEvents> {\n private _videoManager: VideoManager\n private _chat: ChatClient\n private _pubSub: PubSubClient\n\n get rooms() {\n return {\n makeRoomObject: (makeRoomOptions: MakeRoomOptions) => {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n mirrorLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n ...options\n } = makeRoomOptions\n\n // TODO: This might not be needed here. We can initiate these sagas in the BaseRoomSession constructor.\n const customSagas: Array<CustomSaga<VideoRoomSessionConnection>> = []\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 const room = createVideoRoomSessionObject({\n ...options,\n store: this.store,\n customSagas,\n })\n\n /**\n * If the user provides a `rootElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n try {\n buildVideoElement({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n mirrorLocalVideoOverlay,\n room,\n rootElement,\n })\n } catch (error) {\n this.logger.error('Unable to build the video element automatically')\n }\n }\n\n /**\n * If the user joins with `join_video_muted: true` or\n * `join_audio_muted: true` we'll stop the streams\n * right away.\n */\n room.on('room.subscribed', (params) => {\n const member = params.room_session.members?.find(\n (m) => m.id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n }\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 })\n }\n return this._chat\n }\n\n get pubSub() {\n if (!this._pubSub) {\n this._pubSub = PubSubNamespace.createBasePubSubObject<PubSubClient>({\n store: this.store,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n this._videoManager = createVideoManagerObject(this.options)\n }\n return this._videoManager\n }\n\n /**\n * Reauthenticate with the SignalWire network using a new token\n * For now it returns void since with an invalid token the server\n * will close the connection right away so we can hook on the session\n * events in case. Need to improve it.\n *\n * @internal\n */\n reauthenticate(token: string) {\n this.store.dispatch(actions.reauthAction({ token }))\n }\n}\n", "import {\n getLogger,\n CustomSagaParams,\n actions,\n sagaEffects,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport type { SagaIterator, Task } from '@signalwire/core'\nimport { setMediaElementSinkId } from '@signalwire/webrtc'\nimport { setAudioMediaTrack } from '../../utils/audioElement'\nimport { audioSetSpeakerAction } from '../actions'\nimport { VideoRoomSessionConnection } from '../../video/VideoRoomSession'\n\nexport const makeAudioElementSaga = ({ speakerId }: { speakerId?: string }) => {\n return function* audioElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<VideoRoomSessionConnection>): SagaIterator {\n if (typeof Audio === 'undefined') {\n getLogger().warn('`Audio` is not supported on this environment.')\n return\n }\n\n try {\n const audioEl = room.getAudioEl()\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 break\n }\n }\n }\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the audioEl with the new track.\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: VideoRoomSessionConnection\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\n room.emit(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n action.payload\n )\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: VideoRoomSessionConnection\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", "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 BaseComponentOptions,\n VideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n validateEventsToSubscribe,\n EventEmitter,\n BaseConsumer,\n ToExternalJSONResult,\n VideoManagerRoomEventParams,\n InternalVideoManagerRoomEntity,\n RoomsSubscribed,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\n/** @internal */\nexport type VideoManagerEvents = Record<\n VideoManagerRoomEventNames,\n (room: ToExternalJSONResult<VideoManagerRoomEventParams>) => void\n> &\n Record<\n RoomsSubscribed,\n (room: {\n rooms: ToExternalJSONResult<InternalVideoManagerRoomEntity>[]\n }) => void\n >\n\n/** @internal */\nexport interface VideoManager extends ConsumerContract<VideoManagerEvents> {}\n\n/** @internal */\nexport class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {\n constructor(options: BaseComponentOptions) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map(\n (event) => `video-manager.${event}`\n ) as EventEmitter.EventNames<VideoManagerEvents>[]\n return validateEventsToSubscribe(eventNamesWithPrefix)\n }\n}\n\nexport const createVideoManagerObject = (params: BaseComponentOptions) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n })(params)\n\n const proxy = new Proxy<VideoManager>(manager, {\n get(\n target: VideoManager,\n property: string | symbol,\n receiver: ProxyHandler<VideoManager>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'video-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n", "import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n SDKWorkerParams,\n} from '@signalwire/core'\nimport type { VideoManager } from '../VideoManager'\nimport { videoManagerRoomsWorker } from './videoManagerRoomsWorker'\nimport { videoManagerRoomWorker } from './videoManagerRoomWorker'\n\nexport type VideoManagerWorkerParams<T> = SDKWorkerParams<VideoManager> & {\n action: T\n}\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const {\n channels: { swEventChannel },\n } = options\n\n function* worker(action: MapToPubSubShape<VideoManagerEvent>) {\n const { type } = action\n\n switch (type) {\n case 'video-manager.rooms.subscribed':\n yield sagaEffects.fork(videoManagerRoomsWorker, {\n action,\n ...options,\n })\n break\n case 'video-manager.room.added':\n case 'video-manager.room.deleted':\n case 'video-manager.room.ended':\n case 'video-manager.room.started':\n case 'video-manager.room.updated':\n yield sagaEffects.fork(videoManagerRoomWorker, {\n action,\n ...options,\n })\n break\n default:\n getLogger().warn(`Unknown video-manager event: \"${type}\"`)\n break\n }\n }\n\n while (true) {\n const action: MapToPubSubShape<VideoManagerEvent> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n return action.type.startsWith('video-manager.')\n }\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoManagerWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomsSubscribedEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomsWorker = function* (\n options: VideoManagerWorkerParams<\n MapToPubSubShape<VideoManagerRoomsSubscribedEvent>\n >\n): SagaIterator {\n getLogger().trace('videoManagerRoomsWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n const modPayload = {\n rooms: payload.rooms.map((row) => toExternalJSON(row)),\n }\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n // @ts-expect-error\n modPayload\n )\n\n getLogger().trace('videoManagerRoomsWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomWorker = function* (\n options: VideoManagerWorkerParams<MapToPubSubShape<VideoManagerRoomEvent>>\n): SagaIterator {\n getLogger().trace('videoManagerRoomWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n toExternalJSON(payload)\n )\n\n getLogger().trace('videoManagerRoomWorker ended')\n}\n", "import {\n FabricLayoutChangedEventParams,\n VideoLayoutChangedEventParams,\n getLogger,\n uuid,\n} from '@signalwire/core'\nimport {\n buildVideo,\n cleanupElement,\n createRootElementResizeObserver,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n} from './utils/videoElement'\nimport { addSDKPrefix } from './utils/roomSession'\nimport { OverlayMap, LocalVideoOverlay } from './VideoOverlays'\nimport {\n FabricRoomSession,\n isFabricRoomSession,\n} from './fabric/FabricRoomSession'\nimport { VideoRoomSession, isVideoRoomSession } from './video/VideoRoomSession'\n\nexport interface BuildVideoElementParams {\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n mirrorLocalVideoOverlay?: boolean\n room: FabricRoomSession | VideoRoomSession\n rootElement?: HTMLElement\n}\n\nexport interface BuildVideoElementReturnType {\n element: HTMLElement\n overlayMap: OverlayMap\n localVideoOverlay: LocalVideoOverlay\n unsubscribe(): void\n}\n\nexport const buildVideoElement = async (\n params: BuildVideoElementParams\n): Promise<BuildVideoElementReturnType> => {\n try {\n const {\n room,\n rootElement: element,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n mirrorLocalVideoOverlay = true,\n } = params\n\n let hasVideoTrack = false\n const overlayMap: OverlayMap = new Map()\n const id = uuid()\n\n let rootElement: HTMLElement\n if (element) {\n rootElement = element\n } else {\n rootElement = document.createElement('div')\n rootElement.id = `rootElement-${id}`\n }\n\n /**\n * We used this `LocalVideoOverlay` class to interact with the localVideo\n * overlay DOM element in here and in the `makeLayoutChangedHandler`.\n */\n const overlayId = addSDKPrefix(id)\n const localVideoOverlay = new LocalVideoOverlay({\n id: overlayId,\n mirrorLocalVideoOverlay,\n room,\n })\n if (applyLocalVideoOverlay) {\n overlayMap.set(overlayId, localVideoOverlay)\n }\n\n const makeLayout = makeLayoutChangedHandler({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n overlayMap,\n localVideoOverlay,\n mirrorLocalVideoOverlay,\n rootElement,\n })\n\n const processLayoutChanged = (params: any) => {\n // @ts-expect-error\n if (room.peer?.hasVideoSender && room.localStream) {\n makeLayout({\n layout: params.layout,\n localStream: room.localStream,\n memberId: room.memberId,\n })\n } else {\n localVideoOverlay.hide()\n }\n }\n\n const layoutChangedHandler = (\n params: FabricLayoutChangedEventParams | VideoLayoutChangedEventParams\n ) => {\n getLogger().debug('Received layout.changed - videoTrack', hasVideoTrack)\n if (hasVideoTrack) {\n processLayoutChanged(params)\n return\n }\n }\n\n const processVideoTrack = async (track: MediaStreamTrack) => {\n hasVideoTrack = true\n\n await videoElementSetup({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n rootElement,\n track,\n })\n\n const roomCurrentLayoutEvent = room.currentLayoutEvent\n // If the `layout.changed` has already been received, process the layout\n if (roomCurrentLayoutEvent) {\n processLayoutChanged(roomCurrentLayoutEvent)\n }\n }\n\n // If the remote video already exist, inject the remote stream to the video element\n // @ts-expect-error\n const videoTrack = room.peer?.remoteVideoTrack as MediaStreamTrack | null\n if (videoTrack) {\n await processVideoTrack(videoTrack)\n }\n\n // Handle the RTCPeer `track` event\n const trackHandler = async function (event: RTCTrackEvent) {\n if (event.track.kind === 'video') {\n await processVideoTrack(event.track)\n }\n }\n\n const unsubscribe = () => {\n cleanupElement(rootElement)\n overlayMap.clear() // Use \"delete\" rather than \"clear\" if we want to update the reference\n room.overlayMap = overlayMap\n if (isFabricRoomSession(room)) {\n room.off('track', trackHandler)\n room.off('layout.changed', layoutChangedHandler)\n room.off('destroy', unsubscribe)\n } else if (isVideoRoomSession(room)) {\n room.off('track', trackHandler)\n room.off('layout.changed', layoutChangedHandler)\n room.off('destroy', unsubscribe)\n }\n localVideoOverlay.detachListeners()\n }\n\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the videoEl with the new track.\n */\n if (isFabricRoomSession(room)) {\n room.on('track', trackHandler)\n room.on('layout.changed', layoutChangedHandler)\n room.once('destroy', unsubscribe)\n } else if (isVideoRoomSession(room)) {\n room.on('track', trackHandler)\n room.on('layout.changed', layoutChangedHandler)\n room.once('destroy', unsubscribe)\n }\n\n /**\n * The room object is only being used to listen for events.\n * The \"buildVideoElement\" function does not directly manipulate the room object in order to maintain immutability.\n * Currently, we are overriding the following room properties in case the user calls \"buildVideoElement\" more than once.\n * However, this can be moved out of here easily if we prefer not to override.\n */\n room.overlayMap = overlayMap\n room.localVideoOverlay = localVideoOverlay\n\n return { element: rootElement, overlayMap, localVideoOverlay, unsubscribe }\n } catch (error) {\n getLogger().error('Unable to build the video element')\n throw error\n }\n}\n\ninterface VideoElementSetupWorkerParams {\n rootElement: HTMLElement\n track: MediaStreamTrack\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n}\n\nconst videoElementSetup = async (options: VideoElementSetupWorkerParams) => {\n try {\n const { applyLocalVideoOverlay, applyMemberOverlay, track, rootElement } =\n options\n\n // Create a video element\n const videoElement = buildVideo()\n\n setVideoMediaTrack({ element: videoElement, track })\n\n videoElement.style.width = '100%'\n videoElement.style.maxHeight = '100%'\n\n if (rootElement.querySelector('.mcuContent')) {\n getLogger().debug('MCU Content already there')\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(videoElement)\n\n const paddingWrapper = document.createElement('div')\n paddingWrapper.classList.add('paddingWrapper')\n paddingWrapper.style.paddingBottom = '56.25%' // (9 / 16) * 100\n paddingWrapper.style.position = 'relative'\n paddingWrapper.style.width = '100%'\n paddingWrapper.appendChild(mcuWrapper)\n\n let layersWrapper: HTMLDivElement | null = null\n\n // If the both flags are false, no need to create the MCU\n if (applyLocalVideoOverlay || applyMemberOverlay) {\n layersWrapper = document.createElement('div')\n layersWrapper.classList.add('mcuLayers')\n layersWrapper.style.display = 'none'\n paddingWrapper.appendChild(layersWrapper)\n }\n\n const relativeWrapper = document.createElement('div')\n relativeWrapper.classList.add('mcuContent')\n relativeWrapper.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.height = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.style.display = 'flex'\n relativeWrapper.style.alignItems = 'center'\n relativeWrapper.style.justifyContent = 'center'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.width = '100%'\n rootElement.style.height = '100%'\n rootElement.appendChild(relativeWrapper)\n\n getLogger().debug('MCU readyState 1 >>', videoElement.readyState)\n if (videoElement.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n await waitForVideoReady({ element: videoElement })\n }\n getLogger().debug('MCU is ready..')\n\n /**\n * Listen for the rootElement and the videoElement size changes and update the paddingWrapper.\n * The ResizeObserver and the video \"resize\" event make sure:\n * - The video should always maintain the aspect ratio.\n * - The video should not overflow the user passed rootElement.\n * - The video should not be cropped.\n */\n const rootElementResizeObserver = createRootElementResizeObserver({\n rootElement,\n video: videoElement,\n paddingWrapper,\n })\n rootElementResizeObserver.start()\n\n track.addEventListener('ended', () => {\n if (rootElementResizeObserver) {\n rootElementResizeObserver.stop()\n }\n })\n\n if (layersWrapper) {\n layersWrapper.style.display = 'block'\n }\n } catch (error) {\n getLogger().error('Handle video track error', error)\n }\n}\n", "import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\n debounce,\n uuid,\n} from '@signalwire/core'\nimport { OverlayMap, LocalVideoOverlay, UserOverlay } from '../VideoOverlays'\nimport { addOverlayPrefix } from './roomSession'\n\nconst buildVideo = () => {\n const video = document.createElement('video')\n video.muted = true\n video.autoplay = true\n video.playsInline = true\n\n /**\n * Local and Remote video elements should never be paused\n * and Safari/Firefox pause the video (ie: enabling PiP, switch cameras etc)\n * We try to force it to keep playing.\n */\n video.addEventListener('pause', () => {\n video.play().catch((error) => {\n getLogger().error('Video Element Paused', video, error)\n })\n })\n\n return video\n}\n\nconst waitForVideoReady = ({ element }: { element: HTMLVideoElement }) => {\n return new Promise<void>((resolve) => {\n element.addEventListener('canplay', function listener() {\n element.removeEventListener('canplay', listener)\n resolve()\n })\n element.addEventListener('resize', function listener() {\n element.removeEventListener('resize', listener)\n resolve()\n })\n })\n}\n\nconst _getLocationStyles = ({\n x,\n y,\n width,\n height,\n}: InternalVideoLayoutLayer) => {\n return {\n top: `${y}%`,\n left: `${x}%`,\n width: `${width}%`,\n height: `${height}%`,\n }\n}\n\nconst _buildLayer = ({ location }: { location: InternalVideoLayoutLayer }) => {\n const { top, left, width, height } = _getLocationStyles(location)\n const layer = document.createElement('div')\n layer.style.position = 'absolute'\n layer.style.overflow = 'hidden'\n layer.style.top = top\n layer.style.left = left\n layer.style.width = width\n layer.style.height = height\n\n return layer\n}\n\nconst _updateLayer = ({\n location,\n element,\n}: {\n location: InternalVideoLayoutLayer\n element: HTMLElement\n}) => {\n const { top, left, width, height } = _getLocationStyles(location)\n element.style.top = top\n element.style.left = left\n element.style.width = width\n element.style.height = height\n\n return element\n}\n\ninterface MakeLayoutChangedHandlerParams {\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n overlayMap: OverlayMap\n localVideoOverlay: LocalVideoOverlay\n mirrorLocalVideoOverlay?: boolean\n rootElement: HTMLElement\n}\n\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n memberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler = (params: MakeLayoutChangedHandlerParams) => {\n const {\n applyLocalVideoOverlay,\n applyMemberOverlay,\n overlayMap,\n localVideoOverlay,\n mirrorLocalVideoOverlay,\n rootElement,\n } = params\n\n return async (params: LayoutChangedHandlerParams) => {\n getLogger().debug('Process layout.changed')\n try {\n const { layout, memberId, localStream } = params\n const { layers = [] } = layout\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n\n // To handle the DOM updates in batch\n const fragment = document.createDocumentFragment()\n const currentOverlayIds = new Set()\n\n // Make local video overlay for the self member\n if (applyLocalVideoOverlay) {\n const location = layers.find(({ member_id }) => member_id === memberId)\n const overlayId = localVideoOverlay.id // LocalVideoOverlay ID is already unique\n let myLayerEl = localVideoOverlay.domElement\n currentOverlayIds.add(overlayId)\n\n if (!location) {\n getLogger().warn('Local video overlay location not found')\n localVideoOverlay.status = 'hidden'\n if (myLayerEl) {\n // Should we remove it from the DOM and the OverlayMap?\n localVideoOverlay.hide()\n }\n } else {\n if (myLayerEl) {\n getLogger().debug('Update local video overlay')\n _updateLayer({ location, element: myLayerEl })\n } else {\n getLogger().debug('Build local video overlay')\n myLayerEl = _buildLayer({ location })\n myLayerEl.id = overlayId\n\n const localVideo = buildVideo()\n localVideo.srcObject = localStream\n localVideo.disablePictureInPicture = true\n localVideo.style.width = '100%'\n localVideo.style.height = '100%'\n localVideo.style.pointerEvents = 'none'\n localVideo.style.objectFit = 'cover'\n\n myLayerEl.appendChild(localVideo)\n localVideoOverlay.domElement = myLayerEl\n\n // Mirror the local video if user has requested it\n if (mirrorLocalVideoOverlay) {\n localVideoOverlay.setMirror()\n }\n }\n\n // Show local overlay element only if the localStream has a valid video track\n const hasVideo =\n localStream\n .getVideoTracks()\n .filter((t) => t.enabled && t.readyState === 'live').length > 0\n if (hasVideo && location.visible) {\n localVideoOverlay.setMediaStream(localStream)\n localVideoOverlay.show()\n } else {\n localVideoOverlay.hide()\n }\n\n // Append the local video overlay to the fragment\n fragment.appendChild(myLayerEl)\n }\n }\n\n // Make overlay for all members (including a self member)\n if (applyMemberOverlay) {\n layers.forEach((location) => {\n const memberIdInLocation = location.member_id\n if (!memberIdInLocation) return\n\n const overlayId = addOverlayPrefix(memberIdInLocation)\n currentOverlayIds.add(overlayId)\n\n let overlay = overlayMap.get(overlayId)\n\n if (overlay && overlay.domElement) {\n // If the overlay already exists, modify its styles\n getLogger().debug('Update an overlay for ', memberIdInLocation)\n _updateLayer({ location, element: overlay.domElement })\n } else {\n // If the overlay doesn't exist, create a new overlay\n getLogger().debug('Build an overlay for ', memberIdInLocation)\n overlay = new UserOverlay({ id: overlayId })\n overlayMap.set(overlayId, overlay)\n\n const newLayer = _buildLayer({ location })\n newLayer.id = `${overlayId}-${uuid()}` // Unique DOM ID since user is allowed to build multiple video elements\n\n overlay.domElement = newLayer\n }\n\n if (!location.visible) {\n overlay.hide()\n } else {\n overlay.show()\n }\n\n // Append the overlay element to the fragment\n fragment.appendChild(overlay.domElement)\n })\n }\n\n // Remove overlays that are no longer present\n overlayMap.forEach((overlay, overlayId) => {\n if (!currentOverlayIds.has(overlayId)) {\n if (overlay.domElement && overlay.domElement.parentNode) {\n overlay.domElement.parentNode.removeChild(overlay.domElement)\n }\n overlayMap.delete(overlayId)\n }\n })\n\n // Replace mcuLayers content in batch with the fragment\n if (mcuLayers) {\n mcuLayers.innerHTML = ''\n mcuLayers.appendChild(fragment)\n }\n } catch (error) {\n getLogger().error('Layout Changed Error', error)\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\nconst createRootElementResizeObserver = ({\n video,\n rootElement,\n paddingWrapper,\n}: {\n video: HTMLVideoElement\n rootElement: HTMLElement\n paddingWrapper: HTMLDivElement\n}) => {\n const computePaddingWrapperWidth = (width: number, height: number) => {\n const nativeVideoRatio = video.videoWidth / video.videoHeight\n const rootElementRatio = width / height\n if (nativeVideoRatio > rootElementRatio) {\n return '100%'\n } else {\n return `${height * nativeVideoRatio}px`\n }\n }\n\n // Debounce to avoid multiple calls\n const update = debounce(\n ({ width, height }: { width: number; height: number }) => {\n const maxPaddingBottom = (video.videoHeight / video.videoWidth) * 100\n if (paddingWrapper) {\n const pb = (height / width) * 100\n paddingWrapper.style.paddingBottom = `${\n pb > maxPaddingBottom ? maxPaddingBottom : pb\n }%`\n paddingWrapper.style.width = computePaddingWrapperWidth(width, height)\n }\n },\n 100\n )\n\n const observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.contentBoxSize) {\n // Firefox implements `contentBoxSize` as a single content rect, rather than an array\n const { inlineSize, blockSize } = Array.isArray(entry.contentBoxSize)\n ? entry.contentBoxSize[0]\n : entry.contentBoxSize\n update({ width: inlineSize, height: blockSize })\n } else if (entry.contentRect) {\n update({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n })\n }\n })\n })\n\n /**\n * When the intrinsic dimensions of the video changes, the root element resize may or may not trigger.\n * For example; remote stream from the server changes dimensions from 16/9 (Landscape) to 9/16 (Portrait) mode.\n * For this reason we need to listen for the 'resize' event on the video element.\n */\n const onVideoResize = () => {\n const width = rootElement.clientWidth\n const height = rootElement.clientHeight\n update({ width, height })\n }\n\n return {\n start: () => {\n observer.observe(rootElement)\n video.addEventListener('resize', onVideoResize)\n },\n stop: () => {\n observer.disconnect()\n video.removeEventListener('resize', onVideoResize)\n },\n }\n}\n\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n createRootElementResizeObserver,\n LocalVideoOverlay,\n}\n", "import { FabricMemberUpdatedEventParams, getLogger } from '@signalwire/core'\nimport { VideoRoomSession, isVideoRoomSession } from './video/VideoRoomSession'\nimport {\n FabricRoomSession,\n isFabricRoomSession,\n} from './fabric/FabricRoomSession'\nimport { VideoMemberUpdatedHandlerParams } from './utils/interfaces'\nimport { OVERLAY_PREFIX, SDK_PREFIX } from './utils/roomSession'\n\nexport type OverlayMap = Map<string, UserOverlay>\n\ninterface UserOverlayOptions {\n id: string\n}\n\nexport type OverlayStatus = 'hidden' | 'visible'\n\nexport class UserOverlay {\n public id: string\n private _domElement: HTMLDivElement | undefined\n private _status: OverlayStatus\n\n constructor(options: UserOverlayOptions) {\n this.id = options.id\n this._status = 'hidden'\n }\n\n get userId() {\n return this.id.split(OVERLAY_PREFIX)[1]\n }\n\n get domElement() {\n return this._domElement\n }\n\n set domElement(element: HTMLDivElement | undefined) {\n getLogger().debug('Setting domElement for ', this.id)\n this._domElement = element\n }\n\n get status() {\n return this._status\n }\n\n set status(status: OverlayStatus) {\n this._status = status\n }\n\n public hide() {\n if (!this.domElement) {\n return getLogger().warn('Missing overlay to hide')\n }\n this.domElement.style.opacity = '0'\n this.status = 'hidden'\n }\n\n public show() {\n if (!this.domElement) {\n return getLogger().warn('Missing overlay to show')\n }\n this.domElement.style.opacity = '1'\n this.status = 'visible'\n }\n}\n\ninterface LocalVideoOverlayOptions {\n id: string\n mirrorLocalVideoOverlay: boolean\n room: FabricRoomSession | VideoRoomSession\n}\n\nexport class LocalVideoOverlay extends UserOverlay {\n private _mirrored: boolean\n private _room: FabricRoomSession | VideoRoomSession\n\n constructor(options: LocalVideoOverlayOptions) {\n super(options)\n this._mirrored = options.mirrorLocalVideoOverlay\n this._room = options.room\n\n // Bind the handler to preserve context\n this.fabricMemberVideoMutedHandler =\n this.fabricMemberVideoMutedHandler.bind(this)\n this.videoMemberVideoMutedHandler =\n this.videoMemberVideoMutedHandler.bind(this)\n\n this.attachListeners()\n }\n\n get userId() {\n return this.id.split(SDK_PREFIX)[1]\n }\n\n get mirrored() {\n return this._mirrored\n }\n\n private attachListeners() {\n if (isFabricRoomSession(this._room)) {\n this._room.on(\n 'member.updated.videoMuted',\n this.fabricMemberVideoMutedHandler\n )\n } else if (isVideoRoomSession(this._room)) {\n this._room.on(\n 'member.updated.videoMuted',\n this.videoMemberVideoMutedHandler\n )\n }\n }\n\n /** @internal */\n public detachListeners() {\n if (isFabricRoomSession(this._room)) {\n this._room.off(\n 'member.updated.videoMuted',\n this.fabricMemberVideoMutedHandler\n )\n } else if (isVideoRoomSession(this._room)) {\n this._room.off(\n 'member.updated.videoMuted',\n this.videoMemberVideoMutedHandler\n )\n }\n }\n\n private memberVideoMutedHandler(memberId: string, videoMuted: boolean) {\n try {\n if (memberId === this._room.memberId) {\n videoMuted ? this.hide() : this.show()\n }\n } catch (error) {\n getLogger().error('Error handling videoMuted in LocalVideoOverlay', error)\n }\n }\n\n private fabricMemberVideoMutedHandler(\n params: FabricMemberUpdatedEventParams\n ) {\n this.memberVideoMutedHandler(\n params.member.member_id,\n params.member.video_muted\n )\n }\n\n private videoMemberVideoMutedHandler(\n params: VideoMemberUpdatedHandlerParams\n ) {\n this.memberVideoMutedHandler(params.member.id, params.member.video_muted)\n }\n\n public setMediaStream(stream: MediaStream) {\n if (!this.domElement) {\n return getLogger().warn('Missing local overlay to set the stream')\n }\n const localVideo = this.domElement.querySelector('video')\n if (localVideo) {\n localVideo.srcObject = stream\n }\n }\n\n public setMirror(mirror: boolean = this._mirrored) {\n if (!this.domElement || !this.domElement.firstChild) {\n return getLogger().warn('Missing local overlay to set the mirror')\n }\n const videoEl = this.domElement.firstChild as HTMLVideoElement\n videoEl.style.transform = mirror ? 'scale(-1, 1)' : 'scale(1, 1)'\n videoEl.style.webkitTransform = mirror ? 'scale(-1, 1)' : 'scale(1, 1)'\n this._mirrored = mirror\n }\n}\n", "import {\n BaseComponentContract,\n BaseConnectionContract,\n connect,\n EventEmitter,\n extendComponent,\n Rooms,\n validateEventsToSubscribe,\n VideoAuthorization,\n VideoLayoutChangedEventParams,\n} from '@signalwire/core'\nimport { BaseConnectionOptions } from '@signalwire/webrtc'\nimport {\n BaseRoomSessionConnection,\n BaseRoomSessionOptions,\n} from '../BaseRoomSession'\nimport {\n RoomSessionDevice,\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDeviceEvents,\n} from '../RoomSessionDevice'\nimport * as workers from './workers'\nimport {\n AddCameraOptions,\n AddDeviceOptions,\n AddMicrophoneOptions,\n CreateScreenShareObjectOptions,\n VideoRoomSessionMethods,\n VideoRoomSessionEvents,\n VideoRoomSessionContract,\n BaseRoomSessionContract,\n} from '../utils/interfaces'\n\nexport interface VideoRoomSession\n extends VideoRoomSessionContract,\n VideoRoomSessionMethods,\n BaseRoomSessionContract,\n BaseConnectionContract<VideoRoomSessionEvents>,\n BaseComponentContract {}\n\nexport interface VideoRoomSessionOptions extends BaseRoomSessionOptions {}\n\nexport class VideoRoomSessionConnection\n extends BaseRoomSessionConnection<VideoRoomSessionEvents>\n implements VideoRoomSessionContract\n{\n private _deviceList = new Set<RoomSessionDevice>()\n private _currentLayoutEvent: VideoLayoutChangedEventParams\n\n constructor(options: VideoRoomSessionOptions) {\n super(options)\n\n this.initWorker()\n }\n\n set currentLayoutEvent(event: VideoLayoutChangedEventParams) {\n this._currentLayoutEvent = event\n }\n\n get currentLayoutEvent() {\n return this._currentLayoutEvent\n }\n\n get currentLayout() {\n return this._currentLayoutEvent?.layout\n }\n\n get currentPosition() {\n return this._currentLayoutEvent?.layout.layers.find(\n (layer) => layer.member_id === this.memberId\n )?.position\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n get interactivityMode() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.join_as ?? ''\n })\n }\n\n get permissions() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.room?.scopes ?? []\n })\n }\n\n private initWorker() {\n this.runWorker('videoWorker', {\n worker: workers.videoWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map((event) => {\n return `video.${String(event)}`\n })\n return validateEventsToSubscribe(\n eventNamesWithPrefix\n ) as EventEmitter.EventNames<{}>[]\n }\n\n /** @internal */\n protected _finalize() {\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup(id)\n }\n\n join() {\n return super.invite<VideoRoomSession>()\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 /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\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 return new Promise<RoomSessionDevice>(async (resolve, reject) => {\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 = {\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.callId,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n RoomSessionDeviceEvents,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n })(options)\n\n roomDevice.once('destroy', () => {\n roomDevice.emit('room.left')\n this._deviceList.delete(roomDevice)\n })\n\n try {\n roomDevice.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(roomDevice),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n return await roomDevice.join()\n }\n return resolve(roomDevice)\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n reject(error)\n }\n })\n }\n}\n\nexport const VideoRoomSessionAPI = extendComponent<\n VideoRoomSessionConnection,\n VideoRoomSessionMethods\n>(VideoRoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n removeAllMembers: Rooms.removeAllMembers,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n getMeta: Rooms.getMeta,\n setMeta: Rooms.setMeta,\n updateMeta: Rooms.updateMeta,\n deleteMeta: Rooms.deleteMeta,\n getMemberMeta: Rooms.getMemberMeta,\n setMemberMeta: Rooms.setMemberMeta,\n updateMemberMeta: Rooms.updateMemberMeta,\n deleteMemberMeta: Rooms.deleteMemberMeta,\n promote: Rooms.promote,\n demote: Rooms.demote,\n getStreams: Rooms.getStreams,\n startStream: Rooms.startStream,\n lock: Rooms.lock,\n unlock: Rooms.unlock,\n setRaisedHand: Rooms.setRaisedHand,\n setPrioritizeHandraise: Rooms.setPrioritizeHandraise,\n})\n\nexport const isVideoRoomSession = (room: unknown): room is VideoRoomSession => {\n return room instanceof VideoRoomSessionConnection\n}\n\n/** @internal */\nexport const createVideoRoomSessionObject = (\n params: VideoRoomSessionOptions\n): VideoRoomSession => {\n const room = connect<\n VideoRoomSessionEvents,\n VideoRoomSessionConnection,\n VideoRoomSession\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: VideoRoomSessionAPI,\n })(params)\n\n return room\n}\n", "import {\n BaseComponentContract,\n BaseConnectionState,\n connect,\n EventEmitter,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionOptions,\n createSpeakerDeviceWatcher,\n getDisplayMedia,\n getSpeakerById,\n supportsMediaOutput,\n MediaEventNames,\n} from '@signalwire/webrtc'\nimport { LocalVideoOverlay, OverlayMap } from './VideoOverlays'\nimport {\n AudioElement,\n BaseRoomSessionContract,\n StartScreenShareOptions,\n} from './utils/interfaces'\nimport { SCREENSHARE_AUDIO_CONSTRAINTS } from './utils/constants'\nimport { addOverlayPrefix } from './utils/roomSession'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShare,\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShareEvents,\n} from './RoomSessionScreenShare'\nimport * as workers from './video/workers'\n\nexport interface BaseRoomSession<\n EventTypes extends EventEmitter.ValidEventTypes = BaseRoomSessionEvents\n> extends BaseRoomSessionContract,\n BaseConnection<EventTypes>,\n BaseComponentContract {}\n\nexport interface BaseRoomSessionOptions extends BaseConnectionOptions {}\n\nexport class BaseRoomSessionConnection<\n EventTypes extends EventEmitter.ValidEventTypes = BaseRoomSessionEvents\n >\n extends BaseConnection<EventTypes>\n implements BaseRoomSessionContract\n{\n private _screenShareList = new Set<RoomSessionScreenShare>()\n private _audioEl: AudioElement\n private _overlayMap: OverlayMap\n private _localVideoOverlay: LocalVideoOverlay\n\n get audioEl() {\n return this._audioEl\n }\n\n set overlayMap(map: OverlayMap) {\n this._overlayMap = map\n }\n\n get overlayMap() {\n return this._overlayMap\n }\n\n set localVideoOverlay(overlay: LocalVideoOverlay) {\n this._localVideoOverlay = overlay\n }\n\n get localVideoOverlay() {\n return this._localVideoOverlay\n }\n\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n private _attachSpeakerTrackListener() {\n if (!supportsMediaOutput()) return\n\n // @TODO: Stop the watcher when user leave/disconnects\n createSpeakerDeviceWatcher().then((deviceWatcher) => {\n deviceWatcher.on('removed', async (data) => {\n const sinkId = this._audioEl.sinkId\n const disconnectedSpeaker = data.changes.find((device) => {\n const payloadDeviceId = device.payload.deviceId\n\n return (\n payloadDeviceId === sinkId ||\n (payloadDeviceId === '' && sinkId === 'default') ||\n (payloadDeviceId === 'default' && sinkId === '')\n )\n })\n if (disconnectedSpeaker) {\n this.emit('speaker.disconnected', {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n })\n\n /**\n * In case the currently in-use speaker disconnects, OS by default fallbacks to the default speaker\n * Set the sink id here to make the SDK consistent with the OS\n */\n await this._audioEl.setSinkId?.('')\n\n const defaultSpeakers = await getSpeakerById('default')\n\n if (!defaultSpeakers?.deviceId) return\n\n // Emit the speaker.updated event since the OS will fallback to the default speaker\n this.emit('speaker.updated', {\n previous: {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n },\n current: {\n deviceId: defaultSpeakers.deviceId,\n label: defaultSpeakers.label,\n },\n })\n }\n })\n })\n }\n\n /** @internal */\n protected override _finalize() {\n this._screenShareList.clear()\n\n super._finalize()\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n\n return super.hangup(id)\n }\n\n leave() {\n return this.hangup()\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 attachPreConnectWorkers() {\n this.runWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n }\n\n /** @internal */\n getAudioEl() {\n if (this._audioEl) return this._audioEl\n this._audioEl = new Audio()\n this._attachSpeakerTrackListener()\n return this._audioEl\n }\n\n getMemberOverlay(memberId: string) {\n return this.overlayMap.get(addOverlayPrefix(memberId))\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n return new Promise<RoomSessionScreenShare>(async (resolve, reject) => {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n try {\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n RoomSessionScreenShareEvents,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\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.once('destroy', () => {\n screenShare.emit('room.left')\n this._screenShareList.delete(screenShare)\n })\n\n screenShare.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(screenShare),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n return await screenShare.join()\n }\n return resolve(screenShare)\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n reject(error)\n }\n })\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n const prevId = this.audioEl.sinkId as string\n this.once(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n async (newId: string) => {\n const prevSpeaker = await getSpeakerById(prevId)\n const newSpeaker = await getSpeakerById(newId)\n\n const isSame = newSpeaker?.deviceId === prevSpeaker?.deviceId\n if (!newSpeaker?.deviceId || isSame) return\n\n this.emit('speaker.updated', {\n previous: {\n deviceId: prevSpeaker?.deviceId,\n label: prevSpeaker?.label,\n },\n current: {\n deviceId: newSpeaker.deviceId,\n label: newSpeaker.label,\n },\n })\n }\n )\n\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n}\n\ntype BaseRoomSessionEventsHandlerMap = Record<\n BaseConnectionState,\n (params: BaseRoomSession<BaseRoomSessionEvents>) => void\n> &\n Record<MediaEventNames, () => void>\n\nexport type BaseRoomSessionEvents = {\n [k in keyof BaseRoomSessionEventsHandlerMap]: BaseRoomSessionEventsHandlerMap[k]\n}\n\n/** @internal */\nexport const createBaseRoomSessionObject = (\n params: BaseRoomSessionOptions\n): BaseRoomSession<BaseRoomSessionEvents> => {\n const room = connect<\n BaseRoomSessionEvents,\n BaseRoomSessionConnection<BaseRoomSessionEvents>,\n BaseRoomSession<BaseRoomSessionEvents>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: BaseRoomSessionConnection,\n })(params)\n\n return room\n}\n", "export const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n", "import { getLogger } from '@signalwire/core'\nimport type { VideoAuthorization } from '@signalwire/core'\nimport type { BaseRoomSessionJoinParams } from './interfaces'\n\ntype GetJoinMediaParamsOptions = BaseRoomSessionJoinParams & {\n authState: VideoAuthorization\n}\n/**\n * getJoinMediaParams returns whether the Join method must send/recv\n * audio and video.\n * Based on values on the Auth block (media allowed and join_as type)\n * it matches the user's preferences and return an object that tells\n * if the negotiation has to include sendrecv/sendonly or recvonly\n * for audio and video.\n */\nexport const getJoinMediaParams = (options: GetJoinMediaParamsOptions) => {\n const {\n authState,\n audio = true,\n video = true,\n sendAudio,\n sendVideo,\n receiveAudio,\n receiveVideo,\n } = options\n getLogger().debug('getJoinMediaParams options', { ...options })\n const { audio_allowed, video_allowed, join_as } = authState\n // Fallback to 'member' in case of null/undefined\n const joinAs = join_as ?? 'member'\n const canSend = joinAs === 'member'\n\n const canSendAudio = canSend && audio_allowed === 'both'\n const canSendVideo = canSend && video_allowed === 'both'\n const canReceiveAudio = audio_allowed !== 'none'\n const canReceiveVideo = video_allowed !== 'none'\n\n const reqToSendAudio = Boolean(sendAudio ?? audio)\n const reqToSendVideo = Boolean(sendVideo ?? video)\n const reqToReceiveAudio = Boolean(receiveAudio ?? audio)\n const reqToReceiveVideo = Boolean(receiveVideo ?? video)\n\n if (!canSendAudio && reqToSendAudio) {\n getLogger().info(\n 'Not allowed to send audio on this room. Default values will be used.'\n )\n }\n if (!canSendVideo && reqToSendVideo) {\n getLogger().info(\n 'Not allowed to send video on this room. Default values will be used.'\n )\n }\n if (!canReceiveAudio && reqToReceiveAudio) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n if (!canReceiveVideo && reqToReceiveVideo) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n return {\n mustSendAudio: canSendAudio && reqToSendAudio,\n mustSendVideo: canSendVideo && reqToSendVideo,\n mustRecvAudio: canReceiveAudio && reqToReceiveAudio,\n mustRecvVideo: canReceiveVideo && reqToReceiveVideo,\n }\n}\n\nexport const checkMediaParams = (\n options: Record<string, boolean | undefined>\n) => {\n // At least one value must be true\n return Object.values(options).some(Boolean)\n}\n\nexport const SDK_PREFIX = 'sw-sdk-'\nexport const addSDKPrefix = (id: string) => {\n return `${SDK_PREFIX}${id}`\n}\n\nexport const OVERLAY_PREFIX = 'sw-overlay-'\nexport const addOverlayPrefix = (id: string) => {\n return `${OVERLAY_PREFIX}${id}`\n}\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n RoomLeft,\n RoomLeftEventParams,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEventNames } from '@signalwire/webrtc'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\ntype RoomSessionScreenShareEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionScreenShare) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void>\n\nexport type RoomSessionScreenShareEvents = {\n [k in keyof RoomSessionScreenShareEventsHandlerMap]: RoomSessionScreenShareEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\nexport interface RoomSessionScreenShare\n extends RoomScreenShareMethods,\n BaseConnectionContract<RoomSessionScreenShareEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionScreenShareEvents>['runWorker']\n}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<RoomSessionScreenShareEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * Represents a screen sharing.\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 sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n SwEventChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { VideoMemberListUpdatedParams } from '../../utils/interfaces'\nimport { VideoRoomSession } from '../VideoRoomSession'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = '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 = (\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\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(EXTERNAL_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: VideoRoomSession,\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 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 swEventChannel,\n instance,\n}: {\n swEventChannel: SwEventChannel\n instance: any\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 instance.emit(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, memberListPayload)\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n swEventChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<VideoRoomSession> =\n function* membersChangedWorker({\n channels: { swEventChannel },\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 swEventChannel,\n instance,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n", "import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n VideoMemberJoinedEvent,\n componentSelectors,\n componentActions,\n type ReduxComponent,\n} from '@signalwire/core'\n\nimport type { BaseConnection } from '@signalwire/webrtc'\n\ntype ChildMemberJoinedWorkerOnDone = () => void\ntype ChildMemberJoinedWorkerOnFail = (args: { error: Error }) => void\n\nexport type ChildMemberJoinedWorkerHooks = SDKWorkerHooks<\n ChildMemberJoinedWorkerOnDone,\n ChildMemberJoinedWorkerOnFail\n>\n\nexport const childMemberJoinedWorker: SDKWorker<\n BaseConnection<any>,\n ChildMemberJoinedWorkerHooks\n> = function* (options): SagaIterator {\n getLogger().trace('childMemberJoinedWorker started')\n const { channels, instance, initialState, onDone, onFail } = options\n const { swEventChannel } = channels\n const { parentId } = initialState\n if (!parentId) {\n throw new Error('Missing parentId for childMemberJoinedWorker')\n }\n\n const action: MapToPubSubShape<VideoMemberJoinedEvent> =\n yield sagaEffects.take(swEventChannel, (action: SDKActions) => {\n if (action.type === 'video.member.joined') {\n return action.payload.member.parent_id === parentId\n }\n return false\n })\n\n /**\n * On video.member.joined with a parent_id, check if we are the\n * owner of the object comparing parent_id in the state.\n * If so update the state with the room values to update the\n * object.\n */\n const { member } = action.payload\n if (member?.parent_id) {\n const byId: Record<string, ReduxComponent> = yield sagaEffects.select(\n componentSelectors.getComponentsById\n )\n const parent = Object.values(byId).find((row) => {\n return 'memberId' in row && row.memberId === member.parent_id\n })\n if (parent) {\n yield sagaEffects.put(\n componentActions.upsert({\n id: instance.callId,\n roomId: action.payload.room_id,\n roomSessionId: action.payload.room_session_id,\n memberId: member.id,\n })\n )\n\n onDone?.()\n } else {\n onFail?.({ error: new Error('Unknown parent_id') })\n }\n }\n getLogger().trace('childMemberJoinedWorker ended')\n}\n", "import {\n SDKActions,\n SDKWorker,\n SagaIterator,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n MemberPosition,\n stripNamespacePrefix,\n VideoAction,\n VideoRoomDeviceEventNames,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { videoStreamWorker } from './videoStreamWorker'\nimport { videoRecordWorker } from './videoRecordWorker'\nimport { videoPlaybackWorker } from './videoPlaybackWorker'\nimport { VideoRoomSessionConnection } from '../VideoRoomSession'\nimport { MediaEventNames } from '@signalwire/webrtc'\n\nexport type VideoWorkerParams<T> =\n SDKWorkerParams<VideoRoomSessionConnection> & {\n action: T\n }\n\nexport const videoWorker: SDKWorker<VideoRoomSessionConnection> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoWorker started')\n\n const { channels, instance: roomSession } = options\n const { swEventChannel } = channels\n\n function* worker(action: VideoAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'video.room.subscribed':\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n instance: roomSession,\n initialState: payload,\n })\n return\n case 'video.playback.started':\n case 'video.playback.updated':\n case 'video.playback.ended':\n yield sagaEffects.fork(videoPlaybackWorker, {\n action,\n ...options,\n })\n return // Return since we don't need to handle the raw event for this\n case 'video.recording.started':\n case 'video.recording.updated':\n case 'video.recording.ended':\n yield sagaEffects.fork(videoRecordWorker, {\n action,\n ...options,\n })\n return\n case 'video.stream.ended':\n case 'video.stream.started':\n yield sagaEffects.fork(videoStreamWorker, {\n action,\n ...options,\n })\n return\n case 'video.room.audience_count': {\n roomSession.emit('room.audienceCount', payload)\n return\n }\n case 'video.member.talking': {\n const { member } = payload\n if ('talking' in member) {\n const suffix = member.talking ? 'started' : 'ended'\n roomSession.emit(`member.talking.${suffix}`, payload)\n\n // Keep for backwards compat.\n const deprecatedSuffix = member.talking ? 'start' : 'stop'\n roomSession.emit(`member.talking.${deprecatedSuffix}`, payload)\n }\n break // Break here since we do need the raw event sent to the client\n }\n case 'video.layout.changed': {\n // Upsert the layout event which is needed for buildVideoElement\n roomSession.currentLayoutEvent = action.payload\n break\n }\n default:\n break\n }\n\n const event = stripNamespacePrefix(type, 'video') as\n | VideoRoomDeviceEventNames\n | MediaEventNames\n | BaseConnectionState\n roomSession.emit(event, payload)\n }\n\n const isVideoEvent = (action: SDKActions) => {\n return action.type.startsWith('video.')\n }\n\n while (true) {\n const action: VideoAction = yield sagaEffects.take(\n swEventChannel,\n isVideoEvent\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoStreamEvent,\n RoomSessionStream,\n Rooms,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoStreamWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoStreamEvent>>\n): SagaIterator {\n getLogger().trace('videoStreamWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let streamInstance = get<RoomSessionStream>(payload.stream.id)\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: roomSession.store,\n payload,\n })\n } else {\n streamInstance.setPayload(payload)\n }\n set<RoomSessionStream>(payload.stream.id, streamInstance)\n\n switch (type) {\n case 'video.stream.started':\n roomSession.emit('stream.started', streamInstance)\n break\n case 'video.stream.ended':\n roomSession.emit('stream.ended', streamInstance)\n remove<RoomSessionStream>(payload.stream.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoStreamWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionRecording,\n Rooms,\n VideoRecordingEvent,\n VideoRecordingEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoRecordWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoRecordingEvent>>\n): SagaIterator {\n getLogger().trace('videoRecordWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let recordingInstance = get<RoomSessionRecording>(payload.recording.id)\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: roomSession.store,\n payload,\n })\n } else {\n recordingInstance.setPayload(payload)\n }\n set<RoomSessionRecording>(payload.recording.id, recordingInstance)\n\n const event = stripNamespacePrefix(type) as VideoRecordingEventNames\n\n switch (type) {\n case 'video.recording.started':\n case 'video.recording.updated': {\n roomSession.emit(event, recordingInstance)\n break\n }\n case 'video.recording.ended':\n roomSession.emit(event, recordingInstance)\n remove<RoomSessionRecording>(payload.recording.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoRecordWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionPlayback,\n Rooms,\n VideoPlaybackEvent,\n VideoPlaybackEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoPlaybackWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoPlaybackEvent>>\n): SagaIterator {\n getLogger().trace('videoPlaybackWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let playbackInstance = get<RoomSessionPlayback>(payload.playback.id)\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: roomSession.store,\n payload,\n })\n } else {\n playbackInstance.setPayload(payload)\n }\n set<RoomSessionPlayback>(payload.playback.id, playbackInstance)\n\n const event = stripNamespacePrefix(type) as VideoPlaybackEventNames\n\n switch (type) {\n case 'video.playback.started':\n case 'video.playback.updated': {\n roomSession.emit(event, playbackInstance)\n break\n }\n case 'video.playback.ended':\n roomSession.emit(event, playbackInstance)\n remove<RoomSessionPlayback>(payload.playback.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoPlaybackWorker ended')\n}\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n RoomLeft,\n RoomLeftEventParams,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEventNames } from '@signalwire/webrtc'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\ntype RoomSessionDeviceEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionDevice) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void>\n\nexport type RoomSessionDeviceEvents = {\n [k in keyof RoomSessionDeviceEventsHandlerMap]: RoomSessionDeviceEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\nexport interface RoomSessionDevice\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<RoomSessionDeviceEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionDeviceEvents>['runWorker']\n}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<RoomSessionDeviceEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\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 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 connect,\n BaseComponentContract,\n BaseRPCResult,\n CallCapabilities,\n FabricLayoutChangedEventParams,\n ExecuteExtendedOptions,\n Rooms,\n VideoMemberEntity,\n VideoPosition,\n BaseConnectionContract,\n FabricRoomSessionMethods,\n MemberCommandParams,\n} from '@signalwire/core'\nimport {\n BaseRoomSessionConnection,\n BaseRoomSessionOptions,\n} from '../BaseRoomSession'\nimport {\n BaseRoomSessionContract,\n ExecuteMemberActionParams,\n FabricRoomSessionContract,\n FabricRoomSessionEvents,\n MemberCommandWithValueParams,\n MemberCommandWithVolumeParams,\n RequestMemberParams,\n} from '../utils/interfaces'\nimport { getStorage } from '../utils/storage'\nimport { PREVIOUS_CALLID_STORAGE_KEY } from './utils/constants'\nimport { fabricWorker } from './workers'\nimport { FabricRoomSessionMember } from './FabricRoomSessionMember'\nimport { makeAudioElementSaga } from '../features/mediaElements/mediaElementsSagas'\n\nexport interface FabricRoomSession\n extends FabricRoomSessionContract,\n FabricRoomSessionMethods,\n BaseRoomSessionContract,\n BaseConnectionContract<FabricRoomSessionEvents>,\n BaseComponentContract {}\n\nexport interface FabricRoomSessionOptions\n extends Omit<BaseRoomSessionOptions, 'customSagas'> {}\n\nexport class FabricRoomSessionConnection\n extends BaseRoomSessionConnection<FabricRoomSessionEvents>\n implements FabricRoomSessionContract\n{\n // this is \"self\" parameter required by the RPC, and is always \"the member\" on the 1st call segment\n private _self?: FabricRoomSessionMember\n // this is \"the member\" on the last/active call segment\n private _member?: FabricRoomSessionMember\n private _currentLayoutEvent: FabricLayoutChangedEventParams\n //describes what are methods are allow for the user in a call segment\n private _capabilities: CallCapabilities = {}\n\n constructor(options: FabricRoomSessionOptions) {\n super(options)\n\n this.initWorker()\n }\n\n override get memberId() {\n return this._member?.memberId\n }\n\n set currentLayoutEvent(event: FabricLayoutChangedEventParams) {\n this._currentLayoutEvent = event\n }\n\n get currentLayoutEvent() {\n return this._currentLayoutEvent\n }\n\n get currentLayout() {\n return this._currentLayoutEvent?.layout\n }\n\n get currentPosition() {\n return this._currentLayoutEvent?.layout.layers.find(\n (layer) => layer.member_id === this.memberId\n )?.position\n }\n\n get capabilities(): CallCapabilities {\n return this._capabilities\n }\n\n set capabilities(capabilities: CallCapabilities) {\n this._capabilities = capabilities\n }\n\n get selfMember(): FabricRoomSessionMember | undefined {\n return this._self\n }\n\n set selfMember(member: FabricRoomSessionMember | undefined) {\n this._self = member\n }\n\n set member(member: FabricRoomSessionMember) {\n this._member = member\n }\n\n get member(): FabricRoomSessionMember {\n return this._member!\n }\n\n private initWorker() {\n this.runWorker('fabricWorker', {\n worker: fabricWorker,\n })\n\n /**\n * By default the SDK attaches the audio to\n * an Audio element (regardless of \"rootElement\")\n */\n this.runWorker('makeAudioElement', {\n worker: makeAudioElementSaga({\n speakerId: this.options.speakerId,\n }),\n })\n }\n\n private async join() {\n if (this.options.attach) {\n this.options.prevCallId =\n getStorage()?.getItem(PREVIOUS_CALLID_STORAGE_KEY) ?? undefined\n }\n this.logger.debug(\n `Tying to reattach to previuos call? ${!!this.options\n .prevCallId} - prevCallId: ${this.options.prevCallId}`\n )\n\n return super.invite<FabricRoomSession>()\n }\n\n private executeAction<\n InputType,\n OutputType = InputType,\n ParamsType extends MemberCommandParams = MemberCommandParams\n >(\n params: ExecuteMemberActionParams,\n options: ExecuteExtendedOptions<InputType, OutputType, ParamsType> = {}\n ) {\n const { method, channel, memberId, extraParams = {} } = params\n\n const targetMember = memberId\n ? this.instanceMap.get<FabricRoomSessionMember>(memberId)\n : this.member\n if (!targetMember) throw new Error('No target param found to execute')\n\n return this.execute<InputType, OutputType, ParamsType>(\n {\n method,\n params: {\n ...(channel && { channels: [channel] }),\n self: {\n member_id: this.selfMember?.id,\n call_id: this.selfMember?.callId,\n node_id: this.selfMember?.nodeId,\n },\n target: {\n member_id: targetMember.id,\n call_id: targetMember.callId,\n node_id: targetMember.nodeId,\n },\n ...extraParams,\n },\n },\n options\n )\n }\n\n /** @internal */\n public override async resume() {\n this.logger.warn(`[resume] Call ${this.id}`)\n if (this.peer?.instance) {\n const { connectionState } = this.peer.instance\n this.logger.debug(\n `[resume] connectionState for ${this.id} is '${connectionState}'`\n )\n if (['closed', 'failed', 'disconnected'].includes(connectionState)) {\n this.resuming = true\n this.peer.restartIce()\n }\n }\n }\n\n public async start() {\n return new Promise<void>(async (resolve, reject) => {\n try {\n this.once('room.subscribed', (params) => {\n getStorage()?.setItem(PREVIOUS_CALLID_STORAGE_KEY, params.call_id)\n resolve()\n })\n\n this.once('destroy', () => {\n getStorage()?.removeItem(PREVIOUS_CALLID_STORAGE_KEY)\n })\n\n await this.join()\n } catch (error) {\n this.logger.error('WSClient call start', error)\n reject(error)\n }\n })\n }\n\n public async audioMute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.muteAudio?.off\n : !this.capabilities.member?.muteAudio?.off\n ) {\n throw Error('Missing audio mute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.mute',\n channel: 'audio',\n memberId: params?.memberId,\n })\n }\n\n public async audioUnmute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.muteAudio?.on\n : !this.capabilities.member?.muteAudio?.on\n ) {\n throw Error('Missing audio unmute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unmute',\n channel: 'audio',\n memberId: params?.memberId,\n })\n }\n\n public async videoMute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.muteVideo?.off\n : !this.capabilities.member?.muteVideo?.on\n ) {\n throw Error('Missing video mute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.mute',\n channel: 'video',\n memberId: params?.memberId,\n })\n }\n\n public async videoUnmute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.muteVideo?.on\n : !this.capabilities.member?.muteVideo?.on\n ) {\n throw Error('Missing video unmute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unmute',\n channel: 'video',\n memberId: params?.memberId,\n })\n }\n\n public async deaf(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.deaf?.on\n : !this.capabilities.member?.deaf?.on\n ) {\n throw Error('Missing deaf capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.deaf',\n memberId: params?.memberId,\n })\n }\n\n public async undeaf(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.deaf?.off\n : !this.capabilities.member?.deaf?.off\n ) {\n throw Error('Missing undeaf capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.undeaf',\n memberId: params?.memberId,\n })\n }\n\n public async getLayouts() {\n return this.executeAction<{ layouts: string[] }>(\n {\n method: 'call.layout.list',\n },\n {\n transformResolve: (payload) => ({\n layouts: payload.layouts,\n }),\n }\n )\n }\n\n public async getMembers() {\n return this.executeAction<{ members: VideoMemberEntity[] }>(\n {\n method: 'call.member.list',\n },\n {\n transformResolve: (payload) => ({\n members: payload.members,\n }),\n }\n )\n }\n\n public async removeMember(params: Required<MemberCommandParams>) {\n if (!this.capabilities.member?.remove) {\n throw Error('Missing setLayout capability')\n }\n if (!params?.memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.member.remove',\n memberId: params.memberId,\n })\n }\n\n public async setRaisedHand(params?: Rooms.SetRaisedHandRoomParams) {\n const { raised = true, memberId } = params || {}\n if (\n memberId == this.member.id && raised\n ? !this.capabilities.self?.raisehand?.on\n : !this.capabilities.member?.raisehand?.on\n ) {\n throw Error('Missing raisehand capability')\n }\n if (\n memberId == this.member.id && !raised\n ? !this.capabilities.self?.raisehand?.off\n : !this.capabilities.member?.raisehand?.off\n ) {\n throw Error('Missing lowerhand capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: raised ? 'call.raisehand' : 'call.lowerhand',\n memberId,\n })\n }\n\n public async setLayout(params: Rooms.SetLayoutParams) {\n if (!this.capabilities.setLayout) {\n throw Error('Missing setLayout capability')\n }\n const extraParams = {\n layout: params.name,\n positions: params.positions,\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.layout.set',\n extraParams,\n })\n }\n\n public async setInputVolume(params: MemberCommandWithVolumeParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.microphoneVolume\n : !this.capabilities.member?.microphoneVolume\n ) {\n throw Error('Missing setInputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.microphone.volume.set',\n memberId: params?.memberId,\n extraParams: {\n volume: params?.volume,\n },\n })\n }\n\n public async setOutputVolume(params: MemberCommandWithVolumeParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.speakerVolume\n : !this.capabilities.member?.speakerVolume\n ) {\n throw Error('Missing setOutputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'video.member.set_output_volume',\n memberId: params?.memberId,\n extraParams: {\n volume: params?.volume,\n },\n })\n }\n\n public async setInputSensitivity(params: MemberCommandWithValueParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.microphoneSensitivity\n : !this.capabilities.member?.microphoneSensitivity\n ) {\n throw Error('Missing setOutputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.microphone.sensitivity.set',\n memberId: params?.memberId,\n extraParams: {\n value: params?.value,\n },\n })\n }\n\n public async setPositions(params: Rooms.SetPositionsParams) {\n const positions = params.positions\n\n if (positions && !Object.keys(positions).length) {\n throw new Error('Invalid positions')\n }\n\n if (\n Object.keys(positions).some((p) =>\n ['self', `${this.memberId}`].includes(p)\n )\n ? !this.capabilities.self?.position\n : !this.capabilities.member?.position\n ) {\n throw Error('Missing setPositions capability')\n }\n\n const targets: {\n target: RequestMemberParams\n position: VideoPosition\n }[] = []\n\n Object.entries(positions).forEach(([key, value]) => {\n const targetMember =\n key === 'self'\n ? this.member\n : this.instanceMap.get<FabricRoomSessionMember>(key)\n\n if (targetMember) {\n targets.push({\n target: {\n member_id: targetMember.id,\n call_id: targetMember.callId!,\n node_id: targetMember.nodeId!,\n },\n position: value,\n })\n }\n })\n\n if (!targets.length) {\n throw new Error('Invalid targets')\n }\n\n return this.execute({\n method: 'call.member.position.set',\n params: {\n self: {\n member_id: this.selfMember?.id,\n call_id: this.selfMember?.callId,\n node_id: this.selfMember?.nodeId,\n },\n targets,\n },\n })\n }\n\n public async lock() {\n if (!this.capabilities.lock?.on) {\n throw Error('Missing lock capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.lock',\n })\n }\n\n public async unlock() {\n if (!this.capabilities.lock?.off) {\n throw Error('Missing unlock capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unlock',\n })\n }\n}\n\nexport const isFabricRoomSession = (\n room: unknown\n): room is FabricRoomSession => {\n return room instanceof FabricRoomSessionConnection\n}\n\n/** @internal */\nexport const createFabricRoomSessionObject = (\n params: FabricRoomSessionOptions\n): FabricRoomSession => {\n const room = connect<\n FabricRoomSessionEvents,\n FabricRoomSessionConnection,\n FabricRoomSession\n >({\n store: params.store,\n Component: FabricRoomSessionConnection,\n })(params)\n\n return room\n}\n", "import jwtDecode from 'jwt-decode'\nimport { getLogger } from '@signalwire/core'\n\n/**\n * Note: ready to support RN with a \"storage.native.ts\" file.\n */\nexport const getStorage = () => {\n if (window && window.sessionStorage) {\n return window.sessionStorage\n }\n return undefined\n}\n\nexport const sessionStorageManager = (token: string) => {\n let roomName: string = ''\n try {\n const jwtPayload = jwtDecode<{ r: string; ja: string }>(token)\n roomName = jwtPayload?.r ?? ''\n } catch (e) {\n try {\n const jwtPayload = jwtDecode<{ typ: string}>(token, {header: true})\n roomName = jwtPayload.typ || ''\n } catch {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[sessionStorageManager] error decoding JWT', token)\n }\n roomName = ''\n }\n }\n\n const valid = Boolean(roomName)\n return {\n authStateKey: valid && `as-${roomName}`,\n protocolKey: valid && `pt-${roomName}`,\n callIdKey: valid && `ci-${roomName}`,\n }\n}\n", "export const PREVIOUS_CALLID_STORAGE_KEY = 'ci-SAT';", "import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n WebRTCMessageParams,\n} from '@signalwire/core'\nimport { WSClient } from '../WSClient'\n\ntype WSClientWorkerOnDone = () => void\ntype WSClientWorkerOnFail = (args: { error: Error }) => void\n\nexport type WSClientWorkerHooks = SDKWorkerHooks<\n WSClientWorkerOnDone,\n WSClientWorkerOnFail\n>\n\nexport const wsClientWorker: SDKWorker<WSClient, WSClientWorkerHooks> =\n function* (options): SagaIterator {\n getLogger().debug('wsClientWorker started')\n const { channels, initialState } = options\n const { swEventChannel } = channels\n const { handleIncomingInvite } = initialState\n\n try {\n while (true) {\n const action: MapToPubSubShape<WebRTCMessageParams> =\n yield sagaEffects.take(swEventChannel, (action: SDKActions) => {\n if (action.type === 'webrtc.message') {\n return action.payload.method === 'verto.invite'\n }\n return false\n })\n getLogger().debug('Receiving a new call over WebSocket', action)\n\n // Invoke WSClient function to build and answer the invite\n handleIncomingInvite(action.payload.params)\n }\n } finally {\n getLogger().trace('wsClientWorker ended')\n }\n }\n", "import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n ConversationEvent,\n} from '@signalwire/core'\nimport { Conversation } from '../Conversation'\nimport { WSClient } from '../WSClient'\n\ninterface ConversationWorkerInitialState {\n conversation: Conversation\n}\n\nexport const conversationWorker: SDKWorker<WSClient> = function* (\n options\n): SagaIterator {\n getLogger().debug('conversationWorker started')\n const {\n channels: { swEventChannel },\n initialState,\n } = options\n\n const { conversation } = initialState as ConversationWorkerInitialState\n\n const isConversationEvent = (action: SDKActions) => {\n return action.type.startsWith('conversation.')\n }\n\n while (true) {\n const action: MapToPubSubShape<ConversationEvent> = yield sagaEffects.take(\n swEventChannel,\n isConversationEvent\n )\n conversation.handleEvent(action.payload)\n }\n\n getLogger().trace('conversationWorker ended')\n}\n", "import {\n SDKWorker,\n SagaIterator,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n SDKActions,\n FabricAction,\n} from '@signalwire/core'\nimport { FabricRoomSessionConnection } from '../FabricRoomSession'\nimport { createFabricRoomSessionMemberObject } from '../FabricRoomSessionMember'\nimport { callSegmentWorker } from './callSegmentWorker'\nimport { MapToPubSubShape } from 'packages/core/dist/core/src'\n\nexport type FabricWorkerParams<T> =\n SDKWorkerParams<FabricRoomSessionConnection> & {\n action: MapToPubSubShape<T>\n }\n\nexport const fabricWorker: SDKWorker<FabricRoomSessionConnection> = function* (\n options\n): SagaIterator {\n getLogger().trace('fabricWorker started')\n const {\n channels: { swEventChannel },\n instance: cfRoomSession,\n } = options\n\n function* worker(action: FabricAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'call.joined': {\n // since we depend on `cfRoomSession.selfMember` on the take logic\n // we need to make sure we update the `cfRoomSession.selfMember`\n // in this worker or have a race condition.\n if (!cfRoomSession.selfMember) {\n const memberInstance = createFabricRoomSessionMemberObject({\n store: cfRoomSession.store,\n payload: {\n member: action.payload.room_session.members.find(\n (m) => m.member_id === action.payload.member_id\n )!,\n room_id: action.payload.room_id,\n room_session_id: action.payload.room_session_id,\n },\n })\n cfRoomSession.selfMember = memberInstance\n }\n\n // Segment worker for each call_id\n yield sagaEffects.fork(callSegmentWorker, {\n ...options,\n instance: cfRoomSession,\n action,\n })\n break\n }\n case 'call.state':\n cfRoomSession.emit(type, payload)\n break\n }\n }\n\n let firstCallJoinedReceived = false\n const isFirstCallJoinedorCallStateEvent = (action: SDKActions) => {\n if (action.type === 'call.state') {\n return true\n }\n\n if (action.type !== 'call.joined') {\n return false\n }\n\n // If this is the first call.joined event, verify the call origin ID\n if (!firstCallJoinedReceived) {\n const callId = action.payload.call_id\n const originCallId = action.payload.origin_call_id\n if (callId === originCallId) {\n firstCallJoinedReceived = true\n return true\n }\n return false // Discard all the call.joined event until the first call.joined is received\n }\n\n // If first call.joined event already received, only check the action type\n return true\n }\n\n while (true) {\n const action: FabricAction = yield sagaEffects.take(\n swEventChannel,\n isFirstCallJoinedorCallStateEvent\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('fabricWorker ended')\n}\n", "import {\n FabricMemberEventNames,\n FabricMemberEventParams,\n FabricMemberEventParamsExcludeTalking,\n FabricMemberJoinedEventParams,\n FabricMemberLeftEventParams,\n FabricMemberTalkingEventParams,\n FabricMemberUpdatedEventParams,\n FabricMemberContract,\n connect,\n MemberJoined,\n MemberLeft,\n MemberTalking,\n MemberUpdated,\n BaseComponentOptionsWithPayload,\n BaseComponent,\n} from '@signalwire/core'\n\nexport interface FabricRoomSessionMember extends FabricMemberContract {\n /** Unique id of this member. */\n id: string\n setPayload(payload: FabricMemberEventParams): void\n}\n\n// TODO: Fabric Room Session Member instance does not emit any events yet\nexport type FabricRoomSessionMemberEventsHandlerMap = Record<\n MemberJoined,\n (params: FabricMemberJoinedEventParams) => void\n> &\n Record<MemberUpdated, (params: FabricMemberUpdatedEventParams) => void> &\n Record<MemberLeft, (params: FabricMemberLeftEventParams) => void> &\n Record<MemberTalking, (params: FabricMemberTalkingEventParams) => void> &\n Record<\n Exclude<FabricMemberEventNames, MemberJoined | MemberLeft | MemberTalking>,\n (params: FabricMemberUpdatedEventParams) => void\n >\n\nexport type FabricRoomSessionMemberEvents = {\n [k in keyof FabricRoomSessionMemberEventsHandlerMap]: FabricRoomSessionMemberEventsHandlerMap[k]\n}\n\nexport interface FabricRoomSessionMemberOptions\n extends BaseComponentOptionsWithPayload<FabricMemberEventParamsExcludeTalking> {}\n\nexport class FabricRoomSessionMemberAPI\n extends BaseComponent<FabricRoomSessionMemberEvents>\n implements FabricMemberContract\n{\n private _payload: FabricMemberEventParamsExcludeTalking\n\n constructor(options: FabricRoomSessionMemberOptions) {\n super(options)\n this._payload = options.payload\n }\n\n get id() {\n return this._payload.member.member_id\n }\n\n get callId() {\n return this._payload.member.call_id\n }\n\n get nodeId() {\n return this._payload.member.node_id\n }\n\n get memberId() {\n return this.id\n }\n\n get roomSessionId() {\n return this._payload.room_session_id\n }\n\n get roomId() {\n return this._payload.room_id\n }\n\n get parentId() {\n return this._payload.member.parent_id\n }\n\n get name() {\n return this._payload.member.name\n }\n\n get type() {\n return this._payload.member.type\n }\n\n get requestedPosition() {\n return this._payload.member.requested_position\n }\n\n get currentPosition() {\n return this._payload.member.current_position\n }\n\n get meta() {\n return this._payload.member.meta\n }\n\n get handraised() {\n return this._payload.member.handraised\n }\n\n get talking() {\n return this._payload.member.talking\n }\n\n get audioMuted() {\n return this._payload.member.audio_muted\n }\n\n get videoMuted() {\n return this._payload.member.video_muted\n }\n\n get deaf() {\n return this._payload.member.deaf\n }\n\n get visible() {\n return this._payload.member.visible\n }\n\n get inputVolume() {\n return this._payload.member.input_volume\n }\n\n get outputVolume() {\n return this._payload.member.output_volume\n }\n\n get inputSensitivity() {\n return this._payload.member.input_sensitivity\n }\n\n get subscriberData() {\n return this._payload.member.subscriber_data\n }\n\n /** @internal */\n setPayload(payload: FabricMemberEventParams) {\n // Reshape the payload since the `member.talking` event does not return all the parameters of a member\n const newPayload = {\n ...this._payload,\n ...payload,\n member: {\n ...this._payload.member,\n ...payload.member,\n },\n }\n this._payload = newPayload\n }\n}\n\nexport const createFabricRoomSessionMemberObject = (\n params: FabricRoomSessionMemberOptions\n): FabricRoomSessionMember => {\n const member = connect<\n FabricRoomSessionMemberEventsHandlerMap,\n FabricRoomSessionMemberAPI,\n FabricRoomSessionMember\n >({\n store: params.store,\n Component: FabricRoomSessionMemberAPI,\n })(params)\n\n return member\n}\n", "import {\n FabricAction,\n CallJoinedEvent,\n SDKActions,\n SagaIterator,\n getLogger,\n sagaEffects,\n} from '@signalwire/core'\nimport { callLeftWorker } from './callLeftWorker'\nimport { callJoinWorker } from './callJoinWorker'\nimport { FabricWorkerParams } from './fabricWorker'\nimport {\n mapFabricLayoutActionToVideoLayoutAction,\n mapFabricMemberActionToVideoMemberJoinAndLeftAction,\n mapFabricMemberActionToVideoMemberUpdatedAction,\n} from '../utils/helpers'\nimport { fabricMemberWorker } from './fabricMemberWorker'\n\nexport const callSegmentWorker = function* (\n options: FabricWorkerParams<CallJoinedEvent>\n): SagaIterator {\n const {\n action,\n channels: { swEventChannel },\n instance: cfRoomSession,\n } = options\n const segmentCallId = action.payload.call_id\n const segmentRooSessionId = action.payload.room_session_id\n\n getLogger().debug(\n `callSegmentWorker started for: callId ${segmentCallId}, roomSessionId ${segmentRooSessionId}`\n )\n\n // Handles the `call.joined` event before the worker loop\n yield sagaEffects.fork(callJoinWorker, {\n ...options,\n action,\n })\n\n function* worker(action: FabricAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'call.joined':\n /** NOOP since this event is handled by the {@link fabricWorker} */\n break\n case 'call.left':\n // Wait for the `callLeftWorker` to finish and then stop this particular segment worker\n yield sagaEffects.call(callLeftWorker, {\n ...options,\n action,\n })\n return true\n case 'call.updated':\n cfRoomSession.emit(type, payload)\n cfRoomSession.emit('room.updated', payload)\n break\n case 'call.play':\n cfRoomSession.emit(type, payload)\n break\n case 'call.connect':\n cfRoomSession.emit(type, payload)\n break\n case 'call.room':\n cfRoomSession.emit(type, payload)\n break\n\n /**\n * The Core module includes a generic worker, {@link memberPositionWorker},\n * which listens for member & layout events to add a \"current_position\" parameter\n * and handle member \"updated\" parameter.\n * This worker in CF SDK is initialized by the {@link callJoinWorker} worker.\n *\n * To ensure compatibility, we map these events to Video SDK events and\n * re-publish them on the channel so that they can be processed by the\n * generic worker. Note that the generic worker only dispatches \"member.updated\"\n * and \"member.updated.*\" events.\n *\n * Additionally, the \"member.joined\" event is monitored by another worker,\n * {@link childMemberJoinedWorker}, specifically for the screen share API.\n */\n case 'member.joined':\n case 'member.left': {\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action,\n })\n const videoAction =\n mapFabricMemberActionToVideoMemberJoinAndLeftAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'member.updated': {\n const videoAction =\n mapFabricMemberActionToVideoMemberUpdatedAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'layout.changed': {\n // We need to update the layout event which is needed for rootElement.\n cfRoomSession.currentLayoutEvent = action.payload\n cfRoomSession.emit(type, payload)\n const videoAction = mapFabricLayoutActionToVideoLayoutAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'member.talking': {\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action,\n })\n break\n }\n default: {\n getLogger().warn('Got an unknown fabric event', action)\n }\n }\n\n return false\n }\n\n const isSegmentEvent = (action: SDKActions) => {\n const { type, payload } = action as FabricAction\n const shouldWatch =\n type.startsWith('call.') ||\n type.startsWith('member.') ||\n type.startsWith('layout.')\n const hasSegmentCallId =\n 'call_id' in payload && segmentCallId === payload.call_id\n const hasSegmentRoomSessionId =\n segmentRooSessionId === payload.room_session_id\n\n if (shouldWatch && (hasSegmentCallId || hasSegmentRoomSessionId)) {\n return true\n }\n\n return false\n }\n\n while (true) {\n const action: FabricAction = yield sagaEffects.take(\n swEventChannel,\n isSegmentEvent\n )\n const task = yield sagaEffects.fork(worker, action)\n\n /**\n * Wait for `worker` to finish and get its return value\n * Stop the `callSegmentWorker' if the returned value is true\n */\n const shouldStop = yield sagaEffects.join(task)\n if (shouldStop) return\n }\n}\n", "import { getLogger, SagaIterator, CallLeftEvent } from '@signalwire/core'\nimport { FabricWorkerParams } from './fabricWorker'\nimport { FabricRoomSessionMemberAPI } from '../FabricRoomSessionMember'\n\nexport const callLeftWorker = function* (\n options: FabricWorkerParams<CallLeftEvent>\n): SagaIterator {\n getLogger().trace('callLeftWorker started')\n\n const {\n action: { payload },\n instance: cfRoomSession,\n instanceMap,\n } = options\n\n const { room_session_id } = payload\n\n // Remove all the member instance where roomSessionId matches\n instanceMap.getAll().forEach(([key, obj]) => {\n if (\n obj instanceof FabricRoomSessionMemberAPI &&\n obj.roomSessionId === room_session_id\n ) {\n instanceMap.remove(key)\n }\n })\n\n cfRoomSession.emit('call.left', payload)\n cfRoomSession.emit('room.left', payload)\n\n getLogger().trace('callLeftWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n CallJoinedEvent,\n sagaEffects,\n MemberPosition,\n mapCapabilityPayload,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport {\n createFabricRoomSessionMemberObject,\n FabricRoomSessionMember,\n} from '../FabricRoomSessionMember'\nimport { FabricWorkerParams } from './fabricWorker'\nimport { fabricMemberWorker } from './fabricMemberWorker'\nimport { mapCallJoinedToRoomSubscribedEventParams } from '../utils/helpers'\n\nexport const callJoinWorker = function* (\n options: FabricWorkerParams<CallJoinedEvent>\n): SagaIterator {\n getLogger().trace('callJoinWorker started')\n const { action, instanceMap, instance: cfRoomSession } = options\n const { payload } = action\n const { get, set } = instanceMap\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n /**\n * The {@link memberPositionWorker} worker understands only the Video SDK events.\n * So, we need to map CF SDK event to Video SDK event.\n * Similar to what we do in the {@link callSegmentWorker}, for member events.\n */\n initialState: mapCallJoinedToRoomSubscribedEventParams(payload),\n dispatcher: function* (subType, subPayload) {\n /**\n * The {@link memberPositionWorker} dispatches the Video SDK events.\n * We need to convert it back to CF SDK event before emitting to the user.\n */\n const fabricType = stripNamespacePrefix(subType, 'video') as any\n const fabricPaylod = {\n ...subPayload,\n member: {\n ...subPayload.member,\n member_id: subPayload.member.id,\n },\n }\n\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action: { type: fabricType, payload: fabricPaylod },\n })\n },\n })\n\n payload.room_session.members?.forEach((member: any) => {\n let memberInstance = get<FabricRoomSessionMember>(member.member_id!)\n if (!memberInstance) {\n memberInstance = createFabricRoomSessionMemberObject({\n store: cfRoomSession.store,\n payload: {\n member: member,\n room_id: payload.room_id,\n room_session_id: payload.room_session_id,\n },\n })\n } else {\n memberInstance.setPayload({\n member: member,\n room_id: payload.room_id,\n room_session_id: payload.room_session_id,\n })\n }\n set<FabricRoomSessionMember>(member.member_id, memberInstance)\n })\n\n cfRoomSession.member = get<FabricRoomSessionMember>(payload.member_id)\n cfRoomSession.capabilities = mapCapabilityPayload(payload.capabilities || [])\n\n // FIXME: Capabilities type is incompatible.\n // @ts-expect-error\n cfRoomSession.emit('call.joined', {\n ...payload,\n capabilities: cfRoomSession.capabilities,\n })\n\n getLogger().trace('callJoinWorker ended')\n}\n", "import {\n FabricMemberEvent,\n FabricMemberUpdatedEventParams,\n MemberUpdatedEventNames,\n SagaIterator,\n fromSnakeToCamelCase,\n getLogger,\n} from '@signalwire/core'\nimport { FabricWorkerParams } from './fabricWorker'\nimport {\n createFabricRoomSessionMemberObject,\n FabricRoomSessionMember,\n} from '../FabricRoomSessionMember'\n\nexport const fabricMemberWorker = function* (\n options: FabricWorkerParams<FabricMemberEvent>\n): SagaIterator {\n getLogger().trace('fabricMemberWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n const memberId = payload.member.member_id\n let memberInstance = get<FabricRoomSessionMember>(memberId)\n if (!memberInstance && type !== 'member.talking') {\n memberInstance = createFabricRoomSessionMemberObject({\n store: roomSession.store,\n payload: payload,\n })\n }\n if (memberInstance) {\n memberInstance.setPayload(payload)\n }\n set<FabricRoomSessionMember>(memberId, memberInstance)\n\n if (type.startsWith('member.updated.')) {\n const clientType = fromSnakeToCamelCase(type) as MemberUpdatedEventNames\n roomSession.emit(clientType, payload as FabricMemberUpdatedEventParams)\n }\n\n switch (type) {\n case 'member.joined':\n roomSession.emit(type, payload)\n break\n case 'member.updated':\n roomSession.emit(type, payload)\n break\n case 'member.left':\n roomSession.emit(type, payload)\n remove<FabricRoomSessionMember>(memberId)\n break\n case 'member.talking':\n roomSession.emit(type, payload)\n break\n default:\n break\n }\n\n getLogger().trace('fabricMemberWorker ended')\n}\n", "import {\n CallJoinedEvent,\n CallJoinedEventParams,\n CallUpdatedEvent,\n CallUpdatedEventParams,\n FabricLayoutChangedEvent,\n FabricMemberJoinedEvent,\n FabricMemberJoinedEventParams,\n FabricMemberLeftEvent,\n FabricMemberLeftEventParams,\n FabricMemberTalkingEvent,\n FabricMemberTalkingEventParams,\n FabricMemberUpdatedEvent,\n FabricMemberUpdatedEventParams,\n InternalFabricMemberEntity,\n InternalFabricMemberEntityUpdated,\n InternalFabricRoomSessionEntity,\n InternalVideoMemberEntity,\n InternalVideoMemberEntityUpdated,\n InternalVideoRoomEntity,\n InternalVideoRoomSessionEntity,\n MapToPubSubShape,\n VideoLayoutChangedEvent,\n VideoMemberJoinedEvent,\n VideoMemberJoinedEventParams,\n VideoMemberLeftEvent,\n VideoMemberLeftEventParams,\n VideoMemberTalkingEvent,\n VideoMemberTalkingEventParams,\n VideoMemberUpdatedEvent,\n VideoMemberUpdatedEventParams,\n VideoRoomSubscribedEvent,\n VideoRoomSubscribedEventParams,\n VideoRoomUpdatedEvent,\n VideoRoomUpdatedEventParams,\n} from '@signalwire/core'\n\n/**\n * Map the InternalFabricMemberEntity to InternalVideoMemberEntity\n */\nexport const mapInternalFabricMemberToInternalVideoMemberEntity = (\n params: InternalFabricMemberEntity\n): InternalVideoMemberEntity => {\n return {\n id: params.member_id,\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n name: params.name,\n type: params.type,\n handraised: params.handraised,\n visible: params.visible,\n audio_muted: params.audio_muted,\n video_muted: params.video_muted,\n deaf: params.deaf,\n input_volume: params.input_volume,\n output_volume: params.output_volume,\n input_sensitivity: params.input_sensitivity,\n meta: params.meta,\n talking: params.talking,\n current_position: params.current_position,\n requested_position: params.requested_position,\n parent_id: params.parent_id,\n }\n}\n\n/**\n * Map the InternalFabricMemberEntityUpdated to InternalVideoMemberEntityUpdated\n */\nexport const mapInternalFabricMemberToInternalVideoMemberUpdatedEntity = (\n params: InternalFabricMemberEntityUpdated\n): InternalVideoMemberEntityUpdated => {\n return {\n ...mapInternalFabricMemberToInternalVideoMemberEntity(params),\n updated: params.updated.map((key) =>\n key === 'member_id' ? 'id' : (key as keyof InternalVideoMemberEntity)\n ),\n }\n}\n\n/**\n * Map InternalFabricRoomSessionEntity to InternalVideoRoomEntity\n */\nexport const mapInternalFabricRoomToInternalVideoRoomEntity = (\n params: InternalFabricRoomSessionEntity\n): InternalVideoRoomEntity => {\n return {\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n event_channel: params.event_channel,\n name: params.name,\n recording: params.recording,\n hide_video_muted: params.hide_video_muted,\n preview_url: params.preview_url,\n recordings: params.recordings,\n playbacks: params.playbacks,\n streams: params.streams,\n prioritize_handraise: params.prioritize_handraise,\n }\n}\n\n/**\n * Map InternalFabricRoomSessionEntity to InternalVideoRoomSessionEntity\n */\nexport const mapInternalFabricRoomToInternalVideoRoomSessionEntity = (\n params: InternalFabricRoomSessionEntity\n): InternalVideoRoomSessionEntity => {\n return {\n id: params.id,\n display_name: params.display_name,\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n event_channel: params.event_channel,\n name: params.name,\n recording: params.recording,\n recordings: params.recordings,\n playbacks: params.playbacks,\n hide_video_muted: params.hide_video_muted,\n preview_url: params.preview_url,\n layout_name: params.layout_name,\n locked: params.locked,\n meta: params.meta,\n members: params.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n streaming: params.streaming,\n streams: params.streams,\n prioritize_handraise: params.prioritize_handraise,\n updated: params.updated,\n }\n}\n\n/**\n * Map the \"call.joined\" event params to \"video.room.subscribed\" event params\n */\nexport const mapCallJoinedToRoomSubscribedEventParams = (\n params: CallJoinedEventParams\n): VideoRoomSubscribedEventParams => {\n return {\n call_id: params.call_id,\n member_id: params.member_id,\n room: {\n ...mapInternalFabricRoomToInternalVideoRoomEntity(params.room_session),\n members: params.room_session.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n },\n room_session: {\n ...mapInternalFabricRoomToInternalVideoRoomSessionEntity(\n params.room_session\n ),\n members: params.room_session.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n },\n }\n}\n\n/**\n * Map the \"call.joined\" action to \"video.room.subscribed\" action\n */\nexport const mapCallJoinedToRoomSubscribedAction = (\n action: MapToPubSubShape<CallJoinedEvent>\n): MapToPubSubShape<VideoRoomSubscribedEvent> => {\n return {\n type: `video.room.subscribed`,\n payload: mapCallJoinedToRoomSubscribedEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"call.updated\" event params to \"video.room.updated\" event params\n */\nexport const mapCallUpdatedToRoomUpdatedEventParams = (\n params: CallUpdatedEventParams\n): VideoRoomUpdatedEventParams => {\n return {\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n room: mapInternalFabricRoomToInternalVideoRoomEntity(params.room_session),\n room_session: mapInternalFabricRoomToInternalVideoRoomSessionEntity(\n params.room_session\n ),\n }\n}\n\n/**\n * Map the \"call.updated\" action to \"video.room.updated\" action\n */\nexport const mapCallUpdatedToRoomUpdatedEventAction = (\n action: MapToPubSubShape<CallUpdatedEvent>\n): MapToPubSubShape<VideoRoomUpdatedEvent> => {\n return {\n type: `video.room.updated`,\n payload: mapCallUpdatedToRoomUpdatedEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"member.joined\" and \"member.left\" event params\n * to \"video.member.joined\" and \"video.member.left\" event params\n */\nexport const mapFabricMemberToVideoMemberJoinAndLeftEventParams = (\n params: FabricMemberJoinedEventParams | FabricMemberLeftEventParams\n): VideoMemberJoinedEventParams | VideoMemberLeftEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: mapInternalFabricMemberToInternalVideoMemberEntity(params.member),\n }\n}\n\n/**\n * Map the \"member.joined\" and \"member.left\" actions\n * to \"video.member.joined\" and \"video.member.left\" actions\n */\nexport const mapFabricMemberActionToVideoMemberJoinAndLeftAction = (\n action: MapToPubSubShape<FabricMemberJoinedEvent | FabricMemberLeftEvent>\n): MapToPubSubShape<VideoMemberJoinedEvent | VideoMemberLeftEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberToVideoMemberJoinAndLeftEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"member.updated\" event params to \"video.member.updated\" event params\n */\nexport const mapFabricMemberEventToVideoMemberUpdatedEventParams = (\n params: FabricMemberUpdatedEventParams\n): VideoMemberUpdatedEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: mapInternalFabricMemberToInternalVideoMemberUpdatedEntity(\n params.member\n ),\n }\n}\n\n/**\n * Map the \"member.updated\" action to \"video.member.updated\" action\n */\nexport const mapFabricMemberActionToVideoMemberUpdatedAction = (\n action: MapToPubSubShape<FabricMemberUpdatedEvent>\n): MapToPubSubShape<VideoMemberUpdatedEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberEventToVideoMemberUpdatedEventParams(\n action.payload\n ),\n }\n}\n\n/**\n * Map the \"member.talking\" event params to \"video.member.talking\" event params\n */\nexport const mapFabricMemberToVideoMemberTalkingEventParams = (\n params: FabricMemberTalkingEventParams\n): VideoMemberTalkingEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: {\n id: params.member.member_id,\n talking: params.member.talking,\n },\n }\n}\n\n/**\n * Map the \"member.talking\" action to \"video.member.talking\" action\n */\nexport const mapFabricMemberActionToVideoMemberTalkingAction = (\n action: MapToPubSubShape<FabricMemberTalkingEvent>\n): MapToPubSubShape<VideoMemberTalkingEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberToVideoMemberTalkingEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"layout.changed\" action to \"video.layout.changed\" action\n */\nexport const mapFabricLayoutActionToVideoLayoutAction = (\n action: MapToPubSubShape<FabricLayoutChangedEvent>\n): MapToPubSubShape<VideoLayoutChangedEvent> => {\n return {\n type: `video.${action.type}`,\n payload: action.payload,\n }\n}\n", "import jwtDecode from 'jwt-decode'\nimport {\n BaseJWTSession,\n getLogger,\n SessionOptions,\n SwAuthorizationState,\n type SWCloseEvent,\n} from '@signalwire/core'\nimport { getStorage, sessionStorageManager } from './utils/storage'\nimport { SwCloseEvent } from './utils/CloseEvent'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public CloseEventConstructor = SwCloseEvent\n public agent = process.env.SDK_PKG_AGENT!\n\n private tokenTyp: string\n\n constructor(public options: SessionOptions) {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<{ ch?: string; typ: string }>(options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: decodedJwt?.ch || options.host,\n })\n this.tokenTyp = decodedJwt.typ ?? 'VRT'\n }\n\n get allowReattach() {\n // @ts-expect-error\n return this.options?.reattach !== false && (this.isVRT() || this.isSAT())\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowReattach) {\n return ''\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Search protocol for', protocolKey)\n return getStorage()?.getItem(protocolKey) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowReattach) {\n return\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Persist protocol', protocolKey, this.relayProtocol)\n getStorage()?.setItem(protocolKey, this.relayProtocol)\n }\n }\n\n protected override async retrieveSwAuthorizationState() {\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n return getStorage()?.getItem(authStateKey) ?? ''\n }\n return ''\n }\n\n protected override async persistSwAuthorizationState(\n state: SwAuthorizationState\n ) {\n if (!this.allowReattach) {\n return\n }\n\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n this.logger.trace('Persist auth state', authStateKey, state)\n getStorage()?.setItem(authStateKey, state)\n }\n }\n\n protected override _onSocketClose(event: SWCloseEvent) {\n if (this.status === 'unknown' || this.status === 'disconnected') {\n const { protocolKey, authStateKey, callIdKey } = sessionStorageManager(\n this.options.token\n )\n this.logger.debug('Cleaning up storage')\n if (protocolKey) {\n this.logger.debug('Remove protocolKey', protocolKey)\n getStorage()?.removeItem(protocolKey)\n }\n if (authStateKey) {\n this.logger.debug('Remove authStateKey', authStateKey)\n getStorage()?.removeItem(authStateKey)\n }\n if (callIdKey) {\n this.logger.debug('Remove callIdKey', callIdKey)\n getStorage()?.removeItem(callIdKey)\n }\n }\n\n super._onSocketClose(event)\n }\n\n private isVRT() {\n return this.tokenTyp === 'VRT'\n }\n\n private isSAT() {\n return this.tokenTyp === 'SAT'\n }\n}\n", "import { SWCloseEvent as CoreCloseEvent } from '@signalwire/core'\n\nconst SwCloseEvent =\n typeof CloseEvent === 'function' ? CloseEvent : CoreCloseEvent\n\nexport { SwCloseEvent }\n", "import type {\n ChatContract,\n ConsumerContract,\n UserOptions,\n Chat as ChatNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends ChatNamespace.BaseChatApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends ChatContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'getAllowedChannels',\n 'setMemberState',\n]\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 const Client = function (chatOptions: ClientOptions) {\n const client = createClient(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 const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n", "import { PubSub } from '@signalwire/core'\nimport { PagingCursor } from '../utils/interfaces'\nimport PubSubMessage = PubSub.PubSubMessage\n\nexport * from './Client'\n\nexport {\n PubSubMessage,\n PagingCursor\n}\n", "import type {\n Rooms,\n VideoLayoutEventNames,\n VideoRoomSessionEventNames,\n VideoRoomEventParams,\n InternalVideoMemberEntity,\n InternalVideoMemberEntityUpdated,\n VideoMemberEventNames,\n MemberUpdated,\n MemberUpdatedEventNames,\n MemberTalkingEventNames,\n VideoMemberTalkingEventParams,\n RTCTrackEventName,\n InternalVideoMemberUpdatableProps,\n VideoRecordingEventNames,\n VideoPlaybackEventNames,\n RoomSessionRecording,\n RoomSessionPlayback,\n VideoRoomSessionContract as CoreVideoRoomSessionContract,\n OnlyFunctionProperties,\n MemberListUpdated,\n VideoPositions,\n RoomAudienceCount,\n VideoRoomAudienceCountEventParams,\n RoomLeft,\n RoomLeftEventParams,\n VideoStreamEventNames,\n RoomSessionStream,\n RoomJoined,\n RoomSubscribed,\n VideoRoomSubscribedEventParams,\n VideoAuthorization,\n VideoRoomDeviceUpdatedEventNames,\n DeviceUpdatedEventParams,\n VideoRoomDeviceDisconnectedEventNames,\n DeviceDisconnectedEventParams,\n VideoRoomDeviceEventNames,\n VideoLayoutChangedEventParams,\n VideoPosition,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { INTERNAL_MEMBER_UPDATABLE_PROPS } from '@signalwire/core'\nimport type { MediaEventNames } from '@signalwire/webrtc'\nimport type { RoomSessionDevice } from '../../RoomSessionDevice'\nimport type { RoomSessionScreenShare } from '../../RoomSessionScreenShare'\nimport { RoomSession } from '../../video/RoomSession'\n\n/**\n * @privateRemarks\n * Every other package exposing a `VideoMemberEntity` is\n * transforming the server payload into something else, with\n * the most significant change being converting properties\n * from snake to camel case. The `js` package, on the other\n * hand, exposes the server payload pretty much as is (as of\n * v3) so what we consider internal (sdk and server) in\n * other packages is external (user facing) for `js`. Same\n * applies to `VideoMemberEntityUpdated` since it's just a\n * derived type.\n */\ntype VideoMemberEntity = InternalVideoMemberEntity\ntype VideoMemberEntityUpdated = InternalVideoMemberEntityUpdated\n\nconst INTERNAL_MEMBER_UPDATED_EVENTS = Object.keys(\n INTERNAL_MEMBER_UPDATABLE_PROPS\n).map((key) => {\n return `member.updated.${\n key as keyof InternalVideoMemberUpdatableProps\n }` as const\n})\n/** @deprecated */\nexport type DeprecatedMemberUpdatableProps =\n (typeof INTERNAL_MEMBER_UPDATED_EVENTS)[number]\n/** @deprecated */\nexport type DeprecatedVideoMemberHandlerParams = {\n member: InternalVideoMemberEntity\n}\nexport type VideoMemberHandlerParams = { member: VideoMemberEntity }\nexport type VideoMemberUpdatedHandlerParams = {\n member: VideoMemberEntityUpdated\n room_id?: string\n room_session_id?: string\n}\nexport type VideoMemberListUpdatedParams = { members: VideoMemberEntity[] }\n\n/**\n * List of all the events a RoomObject can listen to\n */\nexport type RoomEventNames =\n | VideoRoomSessionEventNames\n | VideoMemberEventNames\n | VideoLayoutEventNames\n | VideoRecordingEventNames\n | VideoPlaybackEventNames\n | VideoStreamEventNames\n | RTCTrackEventName\n\nexport type RoomSessionObjectEventsHandlerMap = Record<\n VideoRoomDeviceEventNames,\n (params: DeviceUpdatedEventParams) => void\n> &\n Record<\n VideoLayoutEventNames,\n (params: VideoLayoutChangedEventParams) => void\n > &\n Record<\n Exclude<\n VideoMemberEventNames,\n MemberUpdated | MemberUpdatedEventNames | MemberListUpdated\n >,\n (params: VideoMemberHandlerParams) => void\n > &\n Record<\n Extract<VideoMemberEventNames, MemberUpdated | MemberUpdatedEventNames>,\n (params: VideoMemberUpdatedHandlerParams) => void\n > &\n Record<\n Extract<VideoMemberEventNames, MemberListUpdated>,\n (params: VideoMemberListUpdatedParams) => void\n > &\n Record<\n DeprecatedMemberUpdatableProps,\n (params: DeprecatedVideoMemberHandlerParams) => void\n > &\n Record<\n MemberTalkingEventNames,\n (params: VideoMemberTalkingEventParams) => void\n > &\n Record<\n Exclude<VideoRoomSessionEventNames, RoomLeft | RoomJoined | RoomSubscribed>,\n (params: VideoRoomEventParams) => void\n > &\n Record<\n RoomJoined | RoomSubscribed,\n (params: VideoRoomSubscribedEventParams) => void\n > &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void> &\n Record<\n VideoRoomDeviceUpdatedEventNames,\n (params: DeviceUpdatedEventParams) => void\n > &\n Record<\n VideoRoomDeviceDisconnectedEventNames,\n (params: DeviceDisconnectedEventParams) => void\n > &\n Record<\n RoomAudienceCount,\n (params: VideoRoomAudienceCountEventParams) => void\n > &\n Record<RTCTrackEventName, (event: RTCTrackEvent) => void> &\n Record<VideoRecordingEventNames, (recording: RoomSessionRecording) => void> &\n Record<VideoPlaybackEventNames, (recording: RoomSessionPlayback) => void> &\n Record<BaseConnectionState, (params: RoomSession) => void> &\n Record<VideoStreamEventNames, (stream: RoomSessionStream) => void>\n\n// @deprecated Please use {@link VideoRoomSessionEvents}\nexport type RoomSessionObjectEvents = {\n [k in keyof RoomSessionObjectEventsHandlerMap]: RoomSessionObjectEventsHandlerMap[k]\n}\n\nexport type VideoRoomSessionEvents = {\n [k in keyof RoomSessionObjectEventsHandlerMap]: RoomSessionObjectEventsHandlerMap[k]\n}\n\nexport type StartScreenShareOptions = {\n /** Whether the screen share object should automatically join the room */\n autoJoin?: boolean\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 layout?: string\n positions?: VideoPositions\n}\n\n/**\n * @deprecated Use {@link StartScreenShareOptions} instead.\n */\nexport interface CreateScreenShareObjectOptions\n extends StartScreenShareOptions {}\n\nexport type AddDeviceOptions = {\n autoJoin?: boolean\n audio?: MediaStreamConstraints['audio']\n video?: MediaStreamConstraints['video']\n}\n\nexport type AddCameraOptions = MediaTrackConstraints & {\n autoJoin?: boolean\n}\nexport type AddMicrophoneOptions = MediaTrackConstraints & {\n autoJoin?: boolean\n}\n\nexport interface MemberCommandParams {\n memberId?: string\n}\nexport interface MemberCommandWithVolumeParams extends MemberCommandParams {\n volume: number\n}\nexport interface MemberCommandWithValueParams extends MemberCommandParams {\n value: number\n}\n\nexport interface BaseRoomInterface {\n join(): Promise<unknown>\n leave(): Promise<unknown>\n}\n\ninterface RoomMemberSelfMethodsInterface {\n /**\n * Puts the microphone on mute. The other participants will not hear audio\n * from the muted device anymore.\n *\n * @permissions\n * - `room.self.audio_mute`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example Muting the microphone:\n * ```typescript\n * await roomdevice.audioMute()\n * ```\n */\n audioMute(): Rooms.AudioMuteMember\n\n /**\n * Unmutes the microphone if it had been previously muted.\n *\n * @permissions\n * - `room.self.audio_unmute`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example Unmuting the microphone:\n * ```typescript\n * await roomdevice.audioUnmute()\n * ```\n */\n audioUnmute(): Rooms.AudioUnmuteMember\n\n /**\n * Puts the video on mute. Participants will see a mute image instead of the\n * video stream.\n *\n * @permissions\n * - `room.self.video_mute`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example Muting the camera:\n * ```typescript\n * await roomdevice.videoMute()\n * ```\n */\n videoMute(): Rooms.VideoMuteMember\n\n /**\n * Unmutes the video if it had been previously muted. Participants will start\n * seeing the video stream again.\n *\n * @permissions\n * - `room.self.video_unmute`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example Unmuting the camera:\n * ```typescript\n * await roomdevice.videoUnmute()\n * ```\n */\n videoUnmute(): Rooms.VideoUnmuteMember\n\n /**\n * @deprecated Use {@link setInputVolume} instead.\n */\n setMicrophoneVolume(params: { volume: number }): Rooms.SetInputVolumeMember\n\n /**\n * Sets the input volume level (e.g. for the microphone).\n * @param params\n * @param params.volume desired volume. Values range from -50 to 50, with a\n * default of 0.\n *\n * @permissions\n * - `room.self.set_input_volume`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example\n * ```typescript\n * await roomdevice.setMicrophoneVolume({volume: -10})\n * ```\n */\n setInputVolume(params: { volume: number }): Rooms.SetInputVolumeMember\n\n /**\n * Sets the input level at which the participant is identified as currently\n * speaking.\n * @param params\n * @param params.value desired sensitivity. The default value is 30 and the\n * scale goes from 0 (lowest sensitivity, essentially muted) to 100 (highest\n * sensitivity).\n *\n * @permissions\n * - `room.self.set_input_sensitivity`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example\n * ```typescript\n * await roomdevice.setInputSensitivity({value: 80})\n * ```\n */\n setInputSensitivity(params: {\n value: number\n }): Rooms.SetInputSensitivityMember\n}\n\n/**\n * We are using these interfaces in combination of\n * Object.defineProperties() to avoid code duplication and\n * expose a nice documentation via TypeDoc. The interface\n * forces TS checking while Object.defineProperties allow us\n * flexibility across different objects.\n */\nexport interface VideoRoomSessionMethods\n extends OnlyFunctionProperties<CoreVideoRoomSessionContract> {\n /** @deprecated Use {@link setVideoMuted} instead */\n hideVideoMuted(): Rooms.HideVideoMuted\n /** @deprecated Use {@link setVideoMuted} instead */\n showVideoMuted(): Rooms.ShowVideoMuted\n}\n\nexport interface VideoRoomSessionContract {\n deviceList: RoomSessionDevice[]\n interactivityMode: VideoAuthorization['join_as']\n permissions: VideoAuthorization['scopes']\n /** The `layout.changed` event based on the current room layout */\n currentLayoutEvent: VideoLayoutChangedEventParams\n /** The layout returned from the `layout.changed` event based on the current room layout */\n currentLayout: VideoLayoutChangedEventParams['layout']\n /** The current position of the member returned from the `layout.changed` event */\n currentPosition: VideoPosition | undefined\n /**\n * Joins the room session.\n */\n join(options?: BaseRoomSessionJoinParams): Promise<VideoRoomSessionContract>\n /**\n * Adds a screen sharing instance to the room. You can create multiple screen\n * sharing instances and add all of them to the room.\n * @param opts - {@link CreateScreenShareObjectOptions}\n * @returns - {@link RoomSessionScreenShare}\n *\n * @deprecated Use {@link startScreenShare} instead.\n */\n createScreenShareObject(\n opts?: CreateScreenShareObjectOptions\n ): Promise<RoomSessionScreenShare>\n /**\n * Adds a camera device to the room. Using this method, a user can stream\n * multiple video sources at the same time.\n *\n * @param opts - Specify the constraints for the device. In addition, you can\n * add the `autoJoin` key to specify whether the device should immediately\n * join the room or joining will be performed manually later. {@link AddCameraOptions}\n * @returns - {@link RoomSessionDevice}\n *\n * @example Adding a specific camera:\n * ```typescript\n * await roomSession.addCamera({deviceId: \"gOtMHwZdoA6wMlAnhbfTmeRgPAsqa7iw1OwgKYtbTLA=\"})\n * ```\n */\n addCamera(opts: AddCameraOptions): Promise<RoomSessionDevice>\n /**\n * Adds a microphone device to the room. Using this method, a user can stream\n * multiple video sources at the same time.\n *\n * @param opts Specify the constraints for the device. In addition, you can\n * add the `autoJoin` key to specify whether the device should immediately\n * join the room or joining will be performed manually later. {@link AddMicrophoneOptions}\n * @returns - {@link RoomSessionDevice}\n *\n * @example Adding a specific microphone:\n * ```typescript\n * await roomSession.addMicrophone({deviceId: \"PIn/IIDDgBUHzJkhRncv1m85hX1gC67xYIgJvvThB3Q=\"})\n * ```\n */\n addMicrophone(opts: AddMicrophoneOptions): Promise<RoomSessionDevice>\n /**\n * Adds a device to the room. Using this method, a user can stream multiple\n * sources at the same time. If you need to add a camera device or a\n * microphone device, you can alternatively use the more specific methods\n * {@link addCamera} and {@link addMicrophone}.\n *\n * @param opts Specify the constraints for the device. In addition, you can\n * add the `autoJoin` key to specify whether the device should immediately\n * join the room or joining will be performed manually later. {@link AddDeviceOptions}\n * @returns - {@link RoomSessionDevice}\n *\n * @example Adding any of the microphone devices to the room (duplicate\n * streams are possible):\n * ```typescript\n * await roomSession.addDevice({audio: true})\n * ```\n */\n addDevice(opts: AddDeviceOptions): Promise<RoomSessionDevice>\n}\n\nexport interface RoomSessionDeviceMethods\n extends RoomMemberSelfMethodsInterface {}\n\nexport interface RoomScreenShareMethods\n extends RoomMemberSelfMethodsInterface {}\n\nexport interface BaseRoomSessionJoinParams {\n audio?: MediaStreamConstraints['audio']\n video?: MediaStreamConstraints['video']\n receiveAudio?: boolean\n receiveVideo?: boolean\n sendAudio?: boolean\n sendVideo?: boolean\n}\n\nexport type PagingCursor =\n | {\n before: string\n after?: never\n }\n | {\n before?: never\n after: string\n }\n\nexport type AudioElement = HTMLAudioElement & {\n sinkId?: string\n setSinkId?: (id: string) => Promise<void>\n}\n", "import type {\n PubSubContract,\n ConsumerContract,\n UserOptions,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends PubSubNamespace.BasePubSubApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends PubSubContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'getAllowedChannels',\n 'subscribe',\n 'publish',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { PubSub } from '@signalwire/js'\n *\n * const pubSubClient = new PubSub.Client({\n * token: '<your pubSub token>', // get this from the REST APIs\n * })\n *\n * await pubSubClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * pubSubClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await pubSubClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a pubSub\n * Client object.\n */\nexport const Client = function (pubSubOptions: ClientOptions) {\n const client = createClient(pubSubOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.pubSub[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (pubSubOptions: ClientOptions): Client }\n", "export * from './SignalWire'\nexport * from './interfaces'\nexport { isFabricRoomSession } from './FabricRoomSession'\n", "import jwtDecode from 'jwt-decode'\nimport { getLogger, HttpError, type UserOptions } from '@signalwire/core'\nimport type {\n GetAddressResponse,\n GetAddressesParams,\n RegisterDeviceParams,\n UnregisterDeviceParams,\n RegisterDeviceResponse,\n GetAddressParams,\n GetAddressResult,\n GetAddressesResponse,\n GetAddressesResult,\n RegisterDeviceResult,\n GetSubscriberInfoResponse,\n GetSubscriberInfoResult,\n} from './interfaces'\nimport { CreateHttpClient, createHttpClient } from './createHttpClient'\nimport { buildPaginatedResult } from '../utils/paginatedResult'\nimport { makeQueryParamsUrls } from '../utils/makeQueryParamsUrl'\nimport {\n isGetAddressByIdParams,\n isGetAddressByNameParams,\n isGetAddressesResponse,\n} from './utils/typeGuard'\nimport { HTTPClientContract } from './interfaces/httpClient'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\n// TODO: extends from a Base class to share from core\nexport class HTTPClient implements HTTPClientContract {\n private httpClient: CreateHttpClient\n\n constructor(public options: UserOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.httpHost}`,\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n })\n }\n\n get fetch(): CreateHttpClient {\n return this.httpClient\n }\n\n get httpHost() {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<JWTHeader>(this.options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n // Shouldn't this be other way around?\n const host = this.options.host || decodedJwt?.ch\n if (!host) {\n return 'fabric.signalwire.com'\n }\n return `fabric.${host.split('.').splice(1).join('.')}`\n }\n\n public async getAddress(params: GetAddressParams): Promise<GetAddressResult> {\n let path = '/api/fabric/addresses'\n if (isGetAddressByNameParams(params)) {\n path = `${path}?name=${params.name}`\n } else if (isGetAddressByIdParams(params)) {\n path = `${path}/${params.id}`\n }\n\n const { body } = await this.httpClient<\n GetAddressResponse | GetAddressesResponse\n >(path)\n if (isGetAddressesResponse(body)) {\n // FIXME until the server handles a index lookup by name we need to handle it as a search result\n if (!body.data[0]) throw new HttpError(404, 'Not Found')\n return body.data[0]\n }\n return body\n }\n\n public async getAddresses(\n params?: GetAddressesParams\n ): Promise<GetAddressesResult> {\n const { type, displayName, pageSize, sortBy, sortOrder } = params || {}\n\n let path = '/api/fabric/addresses'\n\n const queryParams = new URLSearchParams()\n if (type) {\n queryParams.append('type', type)\n }\n if (displayName) {\n queryParams.append('display_name', displayName)\n }\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n if (sortBy) {\n queryParams.append('sort_by', sortBy)\n }\n\n if (sortOrder) {\n queryParams.append('sort_order', sortOrder)\n }\n\n const queryUrl = makeQueryParamsUrls(path, queryParams)\n getLogger().debug(`[getAddresses] query URL ${queryUrl}`)\n const { body } = await this.httpClient<GetAddressesResponse>(queryUrl)\n\n return buildPaginatedResult(body, this.httpClient)\n }\n\n public async registerDevice(\n params: RegisterDeviceParams\n ): Promise<RegisterDeviceResult> {\n const { deviceType, deviceToken } = params\n\n const path = '/subscriber/devices' as const\n const { body } = await this.httpClient<RegisterDeviceResponse>(path, {\n method: 'POST',\n body: {\n device_type: deviceType,\n device_token: deviceToken,\n },\n })\n\n return body\n }\n\n public async unregisterDevice(params: UnregisterDeviceParams) {\n const { id } = params\n\n const path = `/subscriber/devices/${id}` as const\n await this.httpClient<void>(path, {\n method: 'DELETE',\n })\n }\n\n public async getSubscriberInfo(): Promise<GetSubscriberInfoResult> {\n let path = '/api/fabric/subscriber/info'\n\n const { body } = await this.httpClient<GetSubscriberInfoResponse>(path)\n\n return body\n }\n}\n", "import { AuthError, HttpError } from '@signalwire/core'\n\ninterface InternalHttpResponse<T> extends Response {\n parsedBody?: T\n}\n\nasync function http<T>(\n input: string,\n init: RequestInit | undefined\n): Promise<InternalHttpResponse<T>> {\n const response: InternalHttpResponse<T> = await fetch(input, init)\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthError(response.status, 'Unauthorized')\n }\n\n let errorResponse\n try {\n errorResponse = await response.json()\n } catch (e) {}\n\n const errorMessage = errorResponse?.errors\n ? JSON.stringify(errorResponse.errors)\n : 'Not Found'\n\n throw new HttpError(response.status, errorMessage, errorResponse)\n }\n\n try {\n // might throw if body is empty\n response.parsedBody = await response.json()\n } catch (e) {}\n\n return response\n}\n\ninterface CreateHttpClientOptions extends RequestInit {\n baseUrl: string\n /**\n * Timeout in milliseconds\n */\n timeout?: number\n}\n\ninterface HttpClientRequestInit extends Omit<RequestInit, 'body'> {\n body?: Record<string, unknown>\n searchParams?: Record<string, any>\n}\n\nexport type CreateHttpClient = ReturnType<typeof createHttpClient>\n\nexport const createHttpClient = (\n { baseUrl, timeout = 30000, ...globalOptions }: CreateHttpClientOptions,\n fetcher = http\n) => {\n const apiClient = async <T>(\n path: string,\n options?: HttpClientRequestInit\n ): Promise<{ body: T }> => {\n const headers = {\n ...(options?.body ? { 'Content-Type': 'application/json' } : {}),\n ...globalOptions.headers,\n ...options?.headers,\n }\n\n const reqInit = getRequestInit({\n ...globalOptions,\n ...options,\n headers,\n })\n // reqInit.mode = 'no-cors'\n // reqInit.credentials = 'include'\n\n let timerId\n if (timeout) {\n const controller = new AbortController()\n const signal = controller.signal\n\n reqInit.signal = signal\n\n timerId = setTimeout(() => {\n controller.abort()\n }, timeout)\n }\n\n try {\n const response = await fetcher<T>(\n getUrl({\n path,\n baseUrl,\n searchParams: options?.searchParams,\n }),\n reqInit\n )\n\n return { body: response.parsedBody as T }\n } catch (e) {\n throw e\n } finally {\n timerId && clearTimeout(timerId)\n }\n }\n\n return apiClient\n}\n\nconst getBody = (body: unknown) => {\n return typeof body === 'string' ? body : JSON.stringify(body)\n}\n\nconst getRequestInit = (options: any): RequestInit => {\n return Object.entries(options).reduce((reducer, [key, value]) => {\n if (key === 'body') {\n return {\n ...reducer,\n body: getBody(value),\n }\n } else if (value != undefined) {\n return {\n ...reducer,\n [key]: value,\n }\n }\n\n return reducer\n }, {} as RequestInit)\n}\n\nconst getUrl = ({\n path,\n baseUrl,\n searchParams,\n}: {\n baseUrl: string\n path: string\n searchParams?: Record<string, any>\n}) => {\n const url = new URL(path, baseUrl)\n\n if (searchParams) {\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value != undefined) {\n url.searchParams.append(key, value)\n }\n })\n }\n return url.toString()\n}\n", "import { PaginatedResponse } from '../fabric/interfaces'\nimport { CreateHttpClient } from '../fabric/createHttpClient'\n\nexport function buildPaginatedResult<T>(\n body: PaginatedResponse<T>,\n client: CreateHttpClient\n) {\n const anotherPage = async (url?: string) => {\n if (!url) return Promise.resolve(undefined)\n const { body } = await client<PaginatedResponse<T>>(url)\n return buildPaginatedResult<T>(body, client)\n }\n\n return {\n data: body.data,\n self: async () => {\n const { self } = body.links\n return anotherPage(self)\n },\n nextPage: async () => {\n const { next } = body.links\n return anotherPage(next)\n },\n prevPage: async () => {\n const { prev } = body.links\n return anotherPage(prev)\n },\n firstPage: async () => {\n const { first } = body.links\n return anotherPage(first)\n },\n hasNext: Boolean(body.links.next),\n hasPrev: Boolean(body.links.prev),\n }\n}\n", "/**\n * Constructs a URL with query parameters.\n *\n * @param path The base path of the URL.\n * @param queryParams An instance of URLSearchParams containing all query parameters.\n * @returns The constructed URL with query parameters.\n */\nexport function makeQueryParamsUrls(\n path: string,\n queryParams: URLSearchParams\n): string {\n const queryString = queryParams.toString()\n return queryString ? `${path}?${queryString}` : path\n}\n", "import {\n GetAddressParams,\n GetAddressByNameParams,\n GetAddressByIdParams,\n GetAddressResponse,\n GetAddressesResponse,\n} from '../interfaces'\n\nexport const isGetAddressByNameParams = (\n obj: GetAddressParams\n): obj is GetAddressByNameParams => {\n return obj && 'name' in obj\n}\n\nexport const isGetAddressByIdParams = (\n obj: GetAddressParams\n): obj is GetAddressByIdParams => {\n return obj && 'id' in obj\n}\n\nexport const isGetAddressResponse = (\n obj: GetAddressResponse | GetAddressesResponse\n): obj is GetAddressResponse => {\n return obj && 'id' in obj && 'name' in obj\n}\n\nexport const isGetAddressesResponse = (\n obj: GetAddressResponse | GetAddressesResponse\n): obj is GetAddressesResponse => {\n return obj && 'data' in obj\n}\n", "import { Conversation } from './Conversation'\nimport {\n ConversationAPIGetMessagesParams,\n ConversationAPISendMessageParams,\n ConversationContract,\n ConversationResponse,\n} from './interfaces'\n\nexport class ConversationAPI implements ConversationContract {\n constructor(\n private conversation: Conversation,\n private payload: ConversationResponse\n ) {}\n\n get id() {\n return this.payload.id\n }\n\n get addressId() {\n return this.payload.address_id\n }\n\n get createdAt() {\n return this.payload.created_at\n }\n\n get lastMessageAt() {\n return this.payload.last_message_at\n }\n\n get metadata() {\n return this.payload.metadata\n }\n\n get name() {\n return this.payload.name\n }\n\n sendMessage(params: ConversationAPISendMessageParams) {\n return this.conversation.sendMessage({\n addressId: this.id,\n text: params.text,\n })\n }\n\n getMessages(params?: ConversationAPIGetMessagesParams) {\n return this.conversation.getConversationMessages({\n addressId: this.id,\n ...params,\n })\n }\n}\n", "import { type ConversationEventParams } from '@signalwire/core'\nimport { HTTPClient } from './HTTPClient'\nimport { WSClient } from './WSClient'\nimport type {\n GetConversationsResponse,\n GetMessagesParams,\n GetConversationsParams,\n GetConversationMessagesParams,\n GetConversationMessagesResponse,\n ConversationMessage,\n SendConversationMessageParams,\n SendConversationMessageResponse,\n ConversationChatMessage,\n GetMessagesResult,\n GetConversationMessagesResult,\n SendConversationMessageResult,\n GetConversationChatMessageParams,\n GetConversationsResult,\n CoversationSubscribeCallback,\n ConversationChatMessagesSubscribeParams,\n ConversationChatMessagesSubscribeResult,\n GetConversationChatMessageResult,\n JoinConversationParams,\n JoinConversationResponse,\n JoinConversationResult,\n CoversationSubscribeResult,\n} from './interfaces'\nimport { conversationWorker } from './workers'\nimport { buildPaginatedResult } from '../utils/paginatedResult'\nimport { makeQueryParamsUrls } from '../utils/makeQueryParamsUrl'\nimport { ConversationAPI } from './ConversationAPI'\n\nconst DEFAULT_CHAT_MESSAGES_PAGE_SIZE = 10\n\ninterface ConversationOptions {\n httpClient: HTTPClient\n wsClient: WSClient\n}\n\nexport class Conversation {\n private httpClient: HTTPClient\n private wsClient: WSClient\n private callbacks = new Set<CoversationSubscribeCallback>()\n private chatSubscriptions: Record<string, Set<CoversationSubscribeCallback>> =\n {}\n\n constructor(options: ConversationOptions) {\n this.httpClient = options.httpClient\n this.wsClient = options.wsClient\n\n this.wsClient.runWorker('conversationWorker', {\n worker: conversationWorker,\n initialState: {\n conversation: this,\n },\n })\n }\n\n /** @internal */\n handleEvent(event: ConversationEventParams) {\n if (event.subtype === 'chat') {\n const chatCallbacks = this.chatSubscriptions[event.conversation_id]\n if (chatCallbacks?.size) {\n chatCallbacks.forEach((cb) => cb(event))\n }\n }\n\n if (this.callbacks.size) {\n this.callbacks.forEach((callback) => {\n callback(event)\n })\n }\n }\n\n public async sendMessage(\n params: SendConversationMessageParams\n ): Promise<SendConversationMessageResult> {\n try {\n const { addressId, text } = params\n const path = '/api/fabric/messages'\n const { body } =\n await this.httpClient.fetch<SendConversationMessageResponse>(path, {\n method: 'POST',\n body: {\n conversation_id: addressId,\n text,\n },\n })\n return body\n } catch (error) {\n throw new Error('Error sending message to conversation!', error)\n }\n }\n\n public async getConversations(\n params?: GetConversationsParams\n ): Promise<GetConversationsResult> {\n try {\n const { pageSize } = params || {}\n\n const path = '/api/fabric/conversations'\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } = await this.httpClient.fetch<GetConversationsResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n const self = this\n const data = body.data.map(\n (conversation) => new ConversationAPI(self, conversation)\n )\n return buildPaginatedResult({ ...body, data }, this.httpClient.fetch)\n } catch (error) {\n throw new Error('Error fetching the conversation history!', error)\n }\n }\n\n public async getMessages(\n params?: GetMessagesParams\n ): Promise<GetMessagesResult> {\n try {\n const { pageSize } = params || {}\n\n const path = '/api/fabric/messages'\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } =\n await this.httpClient.fetch<GetConversationMessagesResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n\n return buildPaginatedResult<ConversationMessage>(\n body,\n this.httpClient.fetch\n )\n } catch (error) {\n throw new Error('Error fetching the conversation messages!', error)\n }\n }\n\n public async getConversationMessages(\n params: GetConversationMessagesParams\n ): Promise<GetConversationMessagesResult> {\n try {\n const { addressId, pageSize } = params || {}\n\n const path = `/api/fabric/conversations/${addressId}/messages`\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } =\n await this.httpClient.fetch<GetConversationMessagesResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n\n return buildPaginatedResult<ConversationMessage>(\n body,\n this.httpClient.fetch\n )\n } catch (error) {\n throw new Error('Error fetching the conversation messages!', error)\n }\n }\n\n public async getChatMessages(\n params: GetConversationChatMessageParams\n ): Promise<GetConversationChatMessageResult> {\n const { addressId, pageSize = DEFAULT_CHAT_MESSAGES_PAGE_SIZE } = params\n\n const fetchChatMessagesPage = async (\n fetcherFn?: () => Promise<GetConversationChatMessageResult | undefined>,\n cached: ConversationMessage[] = [],\n isDirectionNext = true\n ): Promise<GetConversationChatMessageResult> => {\n const chatMessages = [...cached]\n const isValid = (item: ConversationMessage) =>\n item.conversation_id === addressId && item.subtype === 'chat'\n\n let conversationMessages: GetConversationChatMessageResult | undefined\n conversationMessages = await fetcherFn?.()\n let chatOnlyMessages = conversationMessages?.data.filter(isValid) ?? []\n let remaining = pageSize - chatMessages.length\n for (\n let idx = 0;\n idx < chatOnlyMessages.length && idx < remaining;\n idx++\n ) {\n chatMessages.push(chatOnlyMessages[idx])\n }\n\n while (chatMessages.length < pageSize && conversationMessages?.hasNext) {\n conversationMessages = await (isDirectionNext\n ? conversationMessages?.nextPage()\n : conversationMessages?.prevPage())\n if (!conversationMessages || !conversationMessages.data.length) {\n //over caution in case of a server error, to prevent an infinite loop.\n break\n }\n\n remaining = pageSize - chatMessages.length\n chatOnlyMessages = conversationMessages.data.filter(isValid)\n for (\n let idx = 0;\n idx < chatOnlyMessages.length && idx < remaining;\n idx++\n ) {\n chatMessages.push(chatOnlyMessages[idx])\n }\n }\n\n let missingReturns: ConversationMessage[] = []\n if (remaining < chatOnlyMessages.length) {\n missingReturns = chatOnlyMessages.slice(remaining)\n }\n\n return {\n data: chatMessages as ConversationChatMessage[],\n hasNext: !!conversationMessages?.hasNext || !!cached.length,\n hasPrev: !!conversationMessages?.hasPrev,\n\n nextPage: () =>\n fetchChatMessagesPage(conversationMessages?.nextPage, missingReturns),\n prevPage: () =>\n fetchChatMessagesPage(\n conversationMessages?.prevPage,\n missingReturns,\n false\n ),\n self: () =>\n fetchChatMessagesPage(conversationMessages?.self, missingReturns),\n firstPage: () =>\n fetchChatMessagesPage(\n conversationMessages?.firstPage,\n missingReturns\n ),\n }\n }\n\n return fetchChatMessagesPage(\n () =>\n this.getConversationMessages({\n addressId,\n pageSize,\n }) as Promise<GetConversationChatMessageResult>\n )\n }\n\n public async subscribe(\n callback: CoversationSubscribeCallback\n ): Promise<CoversationSubscribeResult> {\n this.callbacks.add(callback)\n\n return {\n unsubscribe: () => this.callbacks.delete(callback),\n }\n }\n\n public async subscribeChatMessages(\n params: ConversationChatMessagesSubscribeParams\n ): Promise<ConversationChatMessagesSubscribeResult> {\n const { addressId, onMessage } = params\n\n if (!(addressId in this.chatSubscriptions)) {\n this.chatSubscriptions[addressId] = new Set()\n }\n\n this.chatSubscriptions[addressId].add(onMessage)\n return {\n unsubscribe: () => this.chatSubscriptions[addressId].delete(onMessage),\n }\n }\n\n public async joinConversation(\n params: JoinConversationParams\n ): Promise<JoinConversationResult> {\n try {\n const { addressId } = params\n const path = '/api/fabric/conversations/join'\n const { body } = await this.httpClient.fetch<JoinConversationResponse>(\n path,\n {\n method: 'POST',\n body: {\n conversation_id: addressId,\n },\n }\n )\n return body\n } catch (error) {\n throw new Error('Error joining a conversation!', error)\n }\n }\n}\n", "import {\n actions,\n BaseClient,\n CallJoinedEventParams,\n ClientEvents,\n VertoBye,\n VertoSubscribe,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { MakeRoomOptions } from '../video'\nimport { createFabricRoomSessionObject } from './FabricRoomSession'\nimport { buildVideoElement } from '../buildVideoElement'\nimport {\n CallParams,\n DialParams,\n FabricRoomSession,\n IncomingInvite,\n OnlineParams,\n HandlePushNotificationParams,\n WSClientOptions,\n HandlePushNotificationResult,\n} from './interfaces'\nimport { IncomingCallManager } from './IncomingCallManager'\nimport { wsClientWorker } from './workers'\nimport { createWSClient } from './createWSClient'\nimport { WSClientContract } from './interfaces/wsClient'\n\nexport class WSClient\n extends BaseClient<ClientEvents>\n implements WSClientContract\n{\n private _incomingCallManager: IncomingCallManager\n private _disconnected: boolean = false\n\n constructor(private wsClientOptions: WSClientOptions) {\n const client = createWSClient(wsClientOptions)\n super(client)\n\n this._incomingCallManager = new IncomingCallManager({\n client: this,\n buildInboundCall: this.buildInboundCall.bind(this),\n executeVertoBye: this.executeVertoBye.bind(this),\n })\n\n this.runWorker('wsClientWorker', {\n worker: wsClientWorker,\n initialState: {\n handleIncomingInvite: (invite: IncomingInvite) => {\n this._incomingCallManager.handleIncomingInvite({\n source: 'websocket',\n ...invite,\n })\n },\n },\n })\n }\n\n private makeFabricObject(makeRoomOptions: MakeRoomOptions) {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n mirrorLocalVideoOverlay = true,\n ...options\n } = makeRoomOptions\n\n const room = createFabricRoomSessionObject({\n ...options,\n store: this.store,\n })\n\n /**\n * If the user provides a `rootElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n try {\n buildVideoElement({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n mirrorLocalVideoOverlay,\n room,\n rootElement,\n })\n } catch (error) {\n this.logger.error('Unable to build the video element automatically')\n }\n }\n\n /**\n * If the user joins with `join_video_muted: true` or\n * `join_audio_muted: true` we'll stop the streams\n * right away.\n */\n const joinMutedHandler = (\n params: CallJoinedEventParams | VideoRoomSubscribedEventParams\n ) => {\n const member = params.room_session.members?.find(\n // @ts-expect-error FIXME:\n (m) => m.id === room.memberId || m.member_id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n }\n }\n\n room.on('room.subscribed', joinMutedHandler)\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audioMuted', ({ member }) => {\n try {\n if (member.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.videoMuted', ({ member }) => {\n try {\n if (member.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 private buildOutboundCall(params: DialParams & { attach?: boolean }) {\n const [pathname, query] = params.to.split('?')\n if (!pathname) {\n throw new Error('Invalid destination address')\n }\n\n let video = false\n let negotiateVideo = false\n\n const queryParams = new URLSearchParams(query)\n const channel = queryParams.get('channel')\n if (channel === 'video') {\n video = true\n negotiateVideo = true\n }\n\n const call = this.makeFabricObject({\n audio: params.audio ?? true,\n video: params.video ?? video,\n negotiateAudio: params.negotiateAudio ?? true,\n negotiateVideo: params.negotiateVideo ?? negotiateVideo,\n rootElement: params.rootElement || this.wsClientOptions.rootElement,\n applyLocalVideoOverlay: true,\n applyMemberOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n watchMediaPackets: false,\n destinationNumber: pathname,\n nodeId: params.nodeId,\n attach: params.attach ?? false,\n disableUdpIceServers: params.disableUdpIceServers || false,\n userVariables: params.userVariables || this.wsClientOptions.userVariables,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n call.destroy()\n })\n\n this.session.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n call.destroy()\n this.destroy()\n })\n\n // TODO: This is for memberList.updated event and it is not yet supported in CF SDK\n // @ts-expect-error\n call.attachPreConnectWorkers()\n return call\n }\n\n private buildInboundCall(payload: IncomingInvite, params: CallParams) {\n const call = this.makeFabricObject({\n audio: params.audio ?? true,\n video: params.video ?? true,\n negotiateAudio: params.negotiateAudio ?? true,\n negotiateVideo: params.negotiateVideo ?? true,\n rootElement: params.rootElement || this.wsClientOptions.rootElement,\n applyLocalVideoOverlay: true,\n applyMemberOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n watchMediaPackets: false,\n nodeId: payload.nodeId,\n remoteSdp: payload.sdp,\n prevCallId: payload.callID,\n disableUdpIceServers: params.disableUdpIceServers || false,\n userVariables: params.userVariables || this.wsClientOptions.userVariables,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n call.destroy()\n })\n\n this.session.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n call.destroy()\n this.destroy()\n })\n\n // TODO: This is for memberList.updated event and it is not yet supported in CF SDK\n // @ts-expect-error\n call.attachPreConnectWorkers()\n return call\n }\n\n private async executeVertoBye(callId: string, nodeId: string) {\n try {\n return await this.execute<unknown, void>({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n message: VertoBye({\n cause: 'USER_BUSY',\n causeCode: '17',\n dialogParams: { callID: callId },\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n private async executeVertoSubscribe(callId: string, nodeId: string) {\n try {\n return await this.execute<unknown, void>({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n subscribe: [],\n message: VertoSubscribe({\n sessid: callId,\n eventChannel: [],\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n public override disconnect() {\n return new Promise<void>((resolve, _reject) => {\n if (this._disconnected) {\n resolve()\n }\n\n this.session.once('session.disconnected', () => {\n this.destroy()\n resolve()\n this._disconnected = true\n })\n\n super.disconnect()\n })\n }\n\n public async dial(params: DialParams) {\n return new Promise<FabricRoomSession>(async (resolve, reject) => {\n try {\n const call = this.buildOutboundCall(params)\n resolve(call)\n } catch (error) {\n this.logger.error('Unable to connect and dial a call', error)\n reject(error)\n }\n })\n }\n\n public async reattach(params: DialParams) {\n return new Promise<FabricRoomSession>(async (resolve, reject) => {\n try {\n const call = this.buildOutboundCall({ ...params, attach: true })\n resolve(call)\n } catch (error) {\n this.logger.error('Unable to connect and reattach a call', error)\n reject(error)\n }\n })\n }\n\n public handlePushNotification(params: HandlePushNotificationParams) {\n return new Promise<HandlePushNotificationResult>(\n async (resolve, reject) => {\n const { decrypted, type } = params\n if (type !== 'call_invite') {\n this.logger.warn('Unknown notification type', params)\n reject('Unknown notification type')\n }\n this.logger.debug('handlePushNotification', params)\n const {\n params: { params: payload },\n node_id: nodeId,\n } = decrypted\n try {\n // Catch the error temporarly\n try {\n // Send verto.subscribe\n await this.executeVertoSubscribe(payload.callID, nodeId)\n } catch (error) {\n this.logger.warn('Verto Subscribe', error)\n }\n\n this._incomingCallManager.handleIncomingInvite({\n source: 'pushNotification',\n nodeId,\n ...payload,\n })\n\n resolve({ resultType: 'inboundCall' })\n } catch (error) {\n reject(error)\n }\n }\n )\n }\n\n public updateToken(token: string) {\n return new Promise<void>((resolve, reject) => {\n this.once('session.auth_error', (error) => {\n reject(error)\n })\n this.once('session.connected', () => {\n resolve()\n })\n this.store.dispatch(actions.reauthAction({ token }))\n })\n }\n\n /**\n * Mark the client as 'online' to receive calls over WebSocket\n */\n public async online({ incomingCallHandlers }: OnlineParams) {\n this._incomingCallManager.setNotificationHandlers(incomingCallHandlers)\n return this.execute<unknown, void>({\n method: 'subscriber.online',\n params: {},\n })\n }\n\n /**\n * Mark the client as 'offline' to receive calls over WebSocket\n */\n public offline() {\n this._incomingCallManager.setNotificationHandlers({})\n return this.execute<unknown, void>({\n method: 'subscriber.offline',\n params: {},\n })\n }\n}\n", "import { FabricRoomSession } from './FabricRoomSession'\nimport {\n CallParams,\n IncomingCallHandlers,\n IncomingCallNotification,\n IncomingInvite,\n IncomingInviteWithSource,\n} from './interfaces'\nimport { WSClient } from './WSClient'\n\ninterface IncomingCallManagerOptions {\n client: WSClient\n buildInboundCall: WSClient['buildInboundCall']\n executeVertoBye: WSClient['executeVertoBye']\n}\n\nexport class IncomingCallManager {\n private _client: WSClient\n private _pendingInvites: Record<string, IncomingInvite> = {}\n private _handlers: IncomingCallHandlers = {}\n\n constructor(private options: IncomingCallManagerOptions) {\n this._client = options.client\n }\n\n private _buildNotification(invite: IncomingInvite): IncomingCallNotification {\n const accept = async (params: CallParams) => {\n return new Promise<FabricRoomSession>((resolve, reject) => {\n delete this._pendingInvites[invite.callID]\n try {\n const call = this.options.buildInboundCall(invite, params)\n call.answer()\n\n resolve(call)\n } catch (e) {\n reject(e)\n }\n })\n }\n\n const reject = () => {\n delete this._pendingInvites[invite.callID]\n return this.options.executeVertoBye(invite.callID, invite.nodeId)\n }\n\n return {\n invite: {\n details: invite,\n accept: (params) => accept(params),\n reject: () => reject(),\n },\n }\n }\n\n setNotificationHandlers(handlers: IncomingCallHandlers) {\n this._handlers.all = handlers.all\n if (\n (handlers.pushNotification &&\n this._handlers.all != handlers.pushNotification) ||\n !handlers.pushNotification\n ) {\n this._handlers.pushNotification = handlers.pushNotification\n }\n if (\n (handlers.websocket && this._handlers.all != handlers.websocket) ||\n !handlers.websocket\n ) {\n this._handlers.websocket = handlers.websocket\n }\n }\n\n handleIncomingInvite(incomingInvite: IncomingInviteWithSource) {\n if (incomingInvite.callID in this._pendingInvites) {\n this._client.logger.debug(\n `skiping nottification for pending invite to callID: ${incomingInvite.callID}`\n )\n return\n }\n this._pendingInvites[incomingInvite.callID] = incomingInvite\n\n if (!(this._handlers.all || this._handlers[incomingInvite.source])) {\n this._client.logger.warn('Skiping nottification due to no listeners')\n return\n }\n\n const notification = this._buildNotification(incomingInvite)\n\n this._handlers.all?.(notification)\n const handler = this._handlers[incomingInvite.source]\n handler?.(notification)\n }\n}\n", "import { configureStore } from '@signalwire/core'\nimport { SATSession } from './SATSession'\nimport { WSClientOptions } from './interfaces'\n\nexport const createWSClient = (options: WSClientOptions) => {\n const store = configureStore({\n userOptions: options,\n SessionConstructor: SATSession,\n })\n\n return { ...options, store }\n}\n", "import {\n RPCReauthenticate,\n RPCReauthenticateParams,\n SATAuthorization,\n SessionOptions,\n UNIFIED_CONNECT_VERSION,\n} from '@signalwire/core'\nimport { JWTSession } from '../JWTSession'\n\n/**\n * SAT Session is for the Call Fabric SDK\n */\nexport class SATSession extends JWTSession {\n public connectVersion = UNIFIED_CONNECT_VERSION\n\n constructor(public options: SessionOptions) {\n super(options)\n }\n\n override get signature() {\n if (this._rpcConnectResult) {\n const { authorization } = this._rpcConnectResult\n return (authorization as SATAuthorization).jti\n }\n return undefined\n }\n\n override async _checkTokenExpiration() {\n /**\n * noop\n *\n * The Call Fabric SDK does not attach any timer and\n * does not emit any events to inform the user about the token expiry.\n */\n }\n\n /**\n * Reauthenticate with the SignalWire Network using a newer SAT.\n * If the session has expired, this will reconnect it.\n * @return Promise<void>\n */\n override async reauthenticate() {\n this.logger.debug('Session Reauthenticate', {\n ready: this.ready,\n expired: this.expired,\n })\n if (!this.ready || this.expired) {\n return this.connect()\n }\n\n const params: RPCReauthenticateParams = {\n project: this._rpcConnectResult.authorization.project_id,\n jwt_token: this.options.token,\n }\n\n try {\n const reauthResponse = await this.execute(RPCReauthenticate(params))\n\n this._rpcConnectResult = {\n ...this._rpcConnectResult,\n ...reauthResponse,\n }\n } catch (error) {\n throw error\n }\n }\n}\n", "import { HTTPClient } from './HTTPClient'\nimport { Conversation } from './Conversation'\nimport { SignalWireClient, SignalWireClientParams } from './interfaces'\nimport { WSClient } from './WSClient'\n\nexport const SignalWire = (() => {\n let instance: Promise<SignalWireClient> | null = null\n\n return (params: SignalWireClientParams): Promise<SignalWireClient> => {\n if (!instance) {\n instance = new Promise<SignalWireClient>(async (resolve, reject) => {\n try {\n const wsClient = new WSClient(params)\n const httpClient = new HTTPClient(params)\n const conversation = new Conversation({ httpClient, wsClient })\n\n // Connect the WebSocket and authenticate the user\n await wsClient.connect()\n\n resolve({\n registerDevice: httpClient.registerDevice.bind(httpClient),\n unregisterDevice: httpClient.unregisterDevice.bind(httpClient),\n getSubscriberInfo: httpClient.getSubscriberInfo.bind(httpClient),\n disconnect: async () => {\n await wsClient.disconnect()\n instance = null // Reset the singleton instance on disconnect\n },\n online: wsClient.online.bind(wsClient),\n offline: wsClient.offline.bind(wsClient),\n dial: wsClient.dial.bind(wsClient),\n reattach: wsClient.reattach.bind(wsClient),\n handlePushNotification:\n wsClient.handlePushNotification.bind(wsClient),\n updateToken: wsClient.updateToken.bind(wsClient),\n address: {\n getAddresses: httpClient.getAddresses.bind(httpClient),\n getAddress: httpClient.getAddress.bind(httpClient),\n },\n conversation: {\n getConversations:\n conversation.getConversations.bind(conversation),\n getMessages: conversation.getMessages.bind(conversation),\n getConversationMessages:\n conversation.getConversationMessages.bind(conversation),\n subscribe: conversation.subscribe.bind(conversation),\n sendMessage: conversation.sendMessage.bind(conversation),\n join: conversation.joinConversation.bind(conversation),\n },\n chat: {\n getMessages: conversation.getChatMessages.bind(conversation),\n subscribe: conversation.subscribeChatMessages.bind(conversation),\n sendMessage: conversation.sendMessage.bind(conversation),\n join: conversation.joinConversation.bind(conversation),\n },\n // @ts-expect-error For debugging purposes\n __httpClient: httpClient,\n __wsClient: wsClient,\n })\n } catch (error) {\n reject(error)\n }\n }).catch((error) => {\n /**\n * Reset the instance to null explicitly since\n * Promises are immutable: once rejected, a Promise remains rejected forever.\n */\n instance = null\n throw error\n })\n }\n return instance\n }\n})()\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 { VideoRoomSession, isVideoRoomSession } from './VideoRoomSession'\n", "import { UserOptions, getLogger } 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\nexport interface CreateRoomObjectOptions\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\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({\n ...userOptions,\n })\n await client.connect()\n\n if (!client) {\n return\n }\n\n /**\n * Since `makeRoomObject` now only accepts a\n * `rootElement` the following is to preserve backwards\n * compatibility with the previous syntax\n */\n let rootElement: HTMLElement | undefined\n if (rootElementId) {\n const el = document.getElementById(rootElementId)\n\n if (el) {\n rootElement = el\n } else {\n rootElement = document.body\n\n getLogger().warn(\n `We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`\n )\n }\n }\n\n const roomObject = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n roomObject.once('destroy', () => {\n roomObject.emit('room.left')\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n roomObject.once('room.subscribed', (_payload) => {\n resolve(roomObject)\n })\n\n await roomObject.join()\n } catch (error) {\n getLogger().error('Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const room = new Proxy(roomObject, {\n get(target: any, prop: any, receiver: any) {\n if (prop === 'join') {\n return join\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n\n if (autoJoin) {\n try {\n await room.join()\n resolve(room)\n } catch (error) {\n reject(error)\n }\n } else {\n resolve(room)\n }\n })\n}\n", "import { CreateRoomObjectOptions, createRoomObject } from './createRoomObject'\n\n/**\n * Using Video.joinRoom() you can automatically join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.joinRoom({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * // You have joined the room..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const joinRoom = (roomOptions: CreateRoomObjectOptions) => {\n return createRoomObject({\n ...roomOptions,\n autoJoin: true,\n })\n}\n", "import {\n UserOptions,\n getLogger,\n VideoAuthorization,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { checkMediaParams, getJoinMediaParams } from '../utils/roomSession'\nimport type { MakeRoomOptions } from '../Client'\nimport type {\n BaseRoomSessionJoinParams,\n RoomSessionObjectEvents,\n} from '../utils/interfaces'\nimport { getStorage, sessionStorageManager } from '../utils/storage'\nimport { VideoRoomSession } from './VideoRoomSession'\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 'getMeta',\n 'setMeta',\n 'updateMeta',\n 'deleteMeta',\n 'getMemberMeta',\n 'setMemberMeta',\n 'updateMemberMeta',\n 'deleteMemberMeta',\n 'promote',\n 'demote',\n 'lock',\n 'unlock',\n]\n\n/**\n * List of events that the SDK must subscribe at the invite time.\n * ie. ScreenShare/AdditionaDevice are based on the member.joined logic.\n */\nconst REQUIRED_EVENTS: (keyof RoomSessionObjectEvents)[] = [\n 'member.joined',\n 'layout.changed',\n]\nconst noop = () => {}\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\nexport interface RoomSession extends VideoRoomSession {\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({ receiveAudio: true, sendVideo: false })\n * ```\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio: audioFromConstructor = true,\n video: videoFromConstructor = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n mirrorLocalVideoOverlay = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n disableUdpIceServers = false,\n ...userOptions\n } = roomOptions\n\n const deprecatedParams = ['audio', 'video']\n deprecatedParams.forEach((param) => {\n if (param in roomOptions) {\n getLogger().warn(\n `The '${param}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`\n )\n }\n })\n\n // @ts-expect-error - true by default\n const allowReattach = roomOptions?.reattach !== false\n\n const { callIdKey } = sessionStorageManager(userOptions.token)\n const reattachManager = {\n joined: ({ call_id }: VideoRoomSubscribedEventParams) => {\n if (allowReattach && callIdKey) {\n getStorage()?.setItem(callIdKey, call_id)\n }\n },\n init: () => {\n if (allowReattach) {\n room.on('room.subscribed', reattachManager.joined)\n }\n room.options.prevCallId = reattachManager.getPrevCallId()\n },\n destroy: () => {\n if (!allowReattach) {\n return\n }\n\n room.off('room.subscribed', reattachManager.joined)\n if (callIdKey) {\n getStorage()?.removeItem(callIdKey)\n }\n },\n getPrevCallId: () => {\n if (!allowReattach || !callIdKey) {\n return\n }\n\n return getStorage()?.getItem(callIdKey) ?? undefined\n },\n }\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 mirrorLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n prevCallId: reattachManager.getPrevCallId(),\n disableUdpIceServers,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n room.emit('room.left', { reason: room.leaveReason })\n\n // Remove callId to reattach\n reattachManager.destroy()\n client.disconnect()\n })\n\n // @ts-expect-error\n client.session.once('session.disconnected', () => {\n room.destroy()\n })\n\n const join = (params?: BaseRoomSessionJoinParams) => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n // Fallback to the constructor values for backwards compat.\n const audio = params?.audio ?? audioFromConstructor\n const video = params?.video ?? videoFromConstructor\n\n // @ts-expect-error\n const authState: VideoAuthorization = client._sessionAuthState\n getLogger().debug('getJoinMediaParams authState?', authState)\n if (authState && authState.type === 'video') {\n const mediaOptions = getJoinMediaParams({\n authState,\n // constructor values override the send\n sendAudio: Boolean(audio),\n sendVideo: Boolean(video),\n ...params,\n })\n\n if (!checkMediaParams(mediaOptions)) {\n client.disconnect()\n return reject(\n new Error(\n `Invalid arguments to join the room. The token used has join_as: '${\n authState.join_as\n }'. \\n${JSON.stringify(params, null, 2)}\\n`\n )\n )\n }\n getLogger().debug('Set mediaOptions', mediaOptions)\n\n /**\n * audio and video might be objects with MediaStreamConstraints\n * so if we must send media, we make sure to use the user's\n * preferences.\n * Note: params.sendAudio: `true` will override audio: `false` so\n * we're using `||` instead of `??` for that reason.\n */\n // @ts-expect-error\n room.updateMediaOptions({\n audio: mediaOptions.mustSendAudio ? audio || true : false,\n video: mediaOptions.mustSendVideo ? video || true : false,\n negotiateAudio: mediaOptions.mustRecvAudio,\n negotiateVideo: mediaOptions.mustRecvVideo,\n })\n }\n\n room.once('room.subscribed', () => {\n resolve(room)\n })\n\n // Hijack previous callId if present\n reattachManager.init()\n\n REQUIRED_EVENTS.forEach((event) => room.once(event, noop))\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const interceptors = {\n join,\n } as const\n\n return new Proxy<Omit<RoomSession, 'new'>>(room, {\n get(target: RoomSession, prop: keyof RoomSession, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (!target.active && UNSAFE_PROP_ACCESS.includes(prop)) {\n throw new Error(\n `Tried to access the property/method \"${prop}\" before the room was connected. Please call roomSession.join() first.`\n )\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (roomOptions: RoomSessionOptions): RoomSession }\n", "export {\n getDevices,\n getCameraDevices,\n getMicrophoneDevices,\n getSpeakerDevices,\n getDevicesWithPermissions,\n getCameraDevicesWithPermissions,\n getMicrophoneDevicesWithPermissions,\n getSpeakerDevicesWithPermissions,\n checkPermissions,\n checkCameraPermissions,\n checkMicrophonePermissions,\n checkSpeakerPermissions,\n requestPermissions,\n createDeviceWatcher,\n createCameraDeviceWatcher,\n createMicrophoneDeviceWatcher,\n createSpeakerDeviceWatcher,\n supportsMediaDevices,\n supportsGetUserMedia,\n supportsGetDisplayMedia,\n getUserMedia,\n getDisplayMedia,\n enumerateDevices,\n enumerateDevicesByKind,\n getSupportedConstraints,\n supportsMediaOutput,\n setMediaElementSinkId,\n stopStream,\n stopTrack,\n createMicrophoneAnalyzer,\n} from '@signalwire/webrtc'\nexport type { MicrophoneAnalyzer } from '@signalwire/webrtc'\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../src/chat/index.ts", "../src/createClient.ts", "../src/Client.ts", "../src/features/mediaElements/mediaElementsSagas.ts", "../src/utils/audioElement.ts", "../src/features/actions.ts", "../src/cantina/VideoManager.ts", "../src/cantina/workers/videoManagerWorker.ts", "../src/cantina/workers/videoManagerRoomsWorker.ts", "../src/cantina/workers/videoManagerRoomWorker.ts", "../src/buildVideoElement.ts", "../src/utils/videoElement.ts", "../src/VideoOverlays.ts", "../src/video/VideoRoomSession.ts", "../src/BaseRoomSession.ts", "../src/utils/constants.ts", "../src/utils/roomSession.ts", "../src/RoomSessionScreenShare.ts", "../src/video/workers/memberListUpdatedWorker.ts", "../src/video/workers/childMemberJoinedWorker.ts", "../src/video/workers/videoWorker.ts", "../src/video/workers/videoStreamWorker.ts", "../src/video/workers/videoRecordWorker.ts", "../src/video/workers/videoPlaybackWorker.ts", "../src/RoomSessionDevice.ts", "../src/fabric/FabricRoomSession.ts", "../src/utils/storage.ts", "../src/fabric/utils/constants.ts", "../src/fabric/workers/wsClientWorker.ts", "../src/fabric/workers/conversationWorker.ts", "../src/fabric/workers/fabricWorker.ts", "../src/fabric/FabricRoomSessionMember.ts", "../src/fabric/workers/callSegmentWorker.ts", "../src/fabric/workers/callLeftWorker.ts", "../src/fabric/workers/callJoinWorker.ts", "../src/fabric/workers/fabricMemberWorker.ts", "../src/fabric/utils/helpers.ts", "../src/fabric/utils/capabilitiesHelpers.ts", "../src/JWTSession.ts", "../src/utils/CloseEvent.ts", "../src/chat/Client.ts", "../src/pubSub/index.ts", "../src/utils/interfaces/video.ts", "../src/pubSub/Client.ts", "../src/fabric/index.ts", "../src/fabric/HTTPClient.ts", "../src/fabric/createHttpClient.ts", "../src/utils/paginatedResult.ts", "../src/utils/makeQueryParamsUrl.ts", "../src/fabric/utils/typeGuard.ts", "../src/fabric/ConversationAPI.ts", "../src/fabric/Conversation.ts", "../src/fabric/WSClient.ts", "../src/fabric/IncomingCallManager.ts", "../src/fabric/createWSClient.ts", "../src/fabric/SATSession.ts", "../src/fabric/SignalWire.ts", "../src/video/index.ts", "../src/createRoomObject.ts", "../src/joinRoom.ts", "../src/video/RoomSession.ts", "../src/webrtc.ts"],
|
|
4
|
+
"sourcesContent": ["export { Client, ClientOptions, ClientApiEvents } from './Client'\n\nexport { ChatMember, ChatMessage } from '@signalwire/core'\n\nexport type { PagingCursor } from '../utils/interfaces'\n\nexport type {\n ChatAction,\n ChatChannel,\n ChatChannelMessageEvent,\n ChatChannelMessageEventParams,\n ChatChannelState,\n ChatEvent,\n ChatGetMembersParams,\n ChatGetMemberStateParams,\n ChatGetMessagesParams,\n ChatMemberContract,\n ChatMemberEntity,\n ChatMemberJoinedEvent,\n ChatMemberJoinedEventParams,\n ChatMemberLeftEvent,\n ChatMemberLeftEventParams,\n ChatMemberUpdatedEvent,\n ChatMemberUpdatedEventParams,\n ChatMessageContract,\n ChatMessageEntity,\n ChatSetMemberStateParams,\n InternalChatMemberEntity,\n InternalChatMessageEntity,\n PaginationCursor,\n} from '@signalwire/core'\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<ClientEvents, ClientAPI, Client<RoomSessionType>>({\n store,\n Component: ClientAPI,\n })(baseUserOptions)\n\n return client\n}\n", "import {\n BaseClient,\n ClientEvents,\n ClientContract,\n actions,\n Chat as ChatNamespace,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport type { CustomSaga } from '@signalwire/core'\nimport { ConnectionOptions } from '@signalwire/webrtc'\nimport { makeAudioElementSaga } from './features/mediaElements/mediaElementsSagas'\nimport { VideoManager, createVideoManagerObject } from './cantina'\nimport type { Client as ChatClient } from './chat/Client'\nimport type { Client as PubSubClient } from './pubSub/Client'\nimport type { RoomSession } from './video/RoomSession'\nimport { buildVideoElement } from './buildVideoElement'\nimport {\n createVideoRoomSessionObject,\n VideoRoomSessionConnection,\n} from './video/VideoRoomSession'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI['rooms']\n chat: ClientAPI['chat']\n pubSub: ClientAPI['pubSub']\n}\n\nexport interface MakeRoomOptions extends ConnectionOptions {\n /** HTML element in which to display the video stream */\n rootElement?: HTMLElement\n /** Whether to apply the local-overlay on top of your video. Default: `true`. */\n applyLocalVideoOverlay?: boolean\n /** Whether to apply an overlay on top of each member. Default: `true`. */\n applyMemberOverlay?: boolean\n /** Whether to mirror the local video overlay. Default: `false`. */\n mirrorLocalVideoOverlay?: 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 /** Local media stream to override the local video and audio stream tracks */\n localStream?: MediaStream\n}\n\nexport class ClientAPI extends BaseClient<ClientEvents> {\n private _videoManager: VideoManager\n private _chat: ChatClient\n private _pubSub: PubSubClient\n\n get rooms() {\n return {\n makeRoomObject: (makeRoomOptions: MakeRoomOptions) => {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n mirrorLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n ...options\n } = makeRoomOptions\n\n // TODO: This might not be needed here. We can initiate these sagas in the BaseRoomSession constructor.\n const customSagas: Array<CustomSaga<VideoRoomSessionConnection>> = []\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 const room = createVideoRoomSessionObject({\n ...options,\n store: this.store,\n customSagas,\n })\n\n /**\n * If the user provides a `rootElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n try {\n buildVideoElement({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n mirrorLocalVideoOverlay,\n room,\n rootElement,\n })\n } catch (error) {\n this.logger.error('Unable to build the video element automatically')\n }\n }\n\n /**\n * If the user joins with `join_video_muted: true` or\n * `join_audio_muted: true` we'll stop the streams\n * right away.\n */\n room.on('room.subscribed', (params) => {\n const member = params.room_session.members?.find(\n (m) => m.id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n }\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 })\n }\n return this._chat\n }\n\n get pubSub() {\n if (!this._pubSub) {\n this._pubSub = PubSubNamespace.createBasePubSubObject<PubSubClient>({\n store: this.store,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n this._videoManager = createVideoManagerObject(this.options)\n }\n return this._videoManager\n }\n\n /**\n * Reauthenticate with the SignalWire network using a new token\n * For now it returns void since with an invalid token the server\n * will close the connection right away so we can hook on the session\n * events in case. Need to improve it.\n *\n * @internal\n */\n reauthenticate(token: string) {\n this.store.dispatch(actions.reauthAction({ token }))\n }\n}\n", "import {\n getLogger,\n CustomSagaParams,\n actions,\n sagaEffects,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport type { SagaIterator, Task } from '@signalwire/core'\nimport { setMediaElementSinkId } from '@signalwire/webrtc'\nimport { setAudioMediaTrack } from '../../utils/audioElement'\nimport { audioSetSpeakerAction } from '../actions'\nimport { VideoRoomSessionConnection } from '../../video/VideoRoomSession'\n\nexport const makeAudioElementSaga = ({ speakerId }: { speakerId?: string }) => {\n return function* audioElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<VideoRoomSessionConnection>): SagaIterator {\n if (typeof Audio === 'undefined') {\n getLogger().warn('`Audio` is not supported on this environment.')\n return\n }\n\n try {\n const audioEl = room.getAudioEl()\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 break\n }\n }\n }\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the audioEl with the new track.\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: VideoRoomSessionConnection\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\n room.emit(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n action.payload\n )\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: VideoRoomSessionConnection\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", "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 BaseComponentOptions,\n VideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n validateEventsToSubscribe,\n EventEmitter,\n BaseConsumer,\n ToExternalJSONResult,\n VideoManagerRoomEventParams,\n InternalVideoManagerRoomEntity,\n RoomsSubscribed,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\n/** @internal */\nexport type VideoManagerEvents = Record<\n VideoManagerRoomEventNames,\n (room: ToExternalJSONResult<VideoManagerRoomEventParams>) => void\n> &\n Record<\n RoomsSubscribed,\n (room: {\n rooms: ToExternalJSONResult<InternalVideoManagerRoomEntity>[]\n }) => void\n >\n\n/** @internal */\nexport interface VideoManager extends ConsumerContract<VideoManagerEvents> {}\n\n/** @internal */\nexport class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {\n constructor(options: BaseComponentOptions) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map(\n (event) => `video-manager.${event}`\n ) as EventEmitter.EventNames<VideoManagerEvents>[]\n return validateEventsToSubscribe(eventNamesWithPrefix)\n }\n}\n\nexport const createVideoManagerObject = (params: BaseComponentOptions) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n })(params)\n\n const proxy = new Proxy<VideoManager>(manager, {\n get(\n target: VideoManager,\n property: string | symbol,\n receiver: ProxyHandler<VideoManager>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'video-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n", "import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n SDKWorkerParams,\n} from '@signalwire/core'\nimport type { VideoManager } from '../VideoManager'\nimport { videoManagerRoomsWorker } from './videoManagerRoomsWorker'\nimport { videoManagerRoomWorker } from './videoManagerRoomWorker'\n\nexport type VideoManagerWorkerParams<T> = SDKWorkerParams<VideoManager> & {\n action: T\n}\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const {\n channels: { swEventChannel },\n } = options\n\n function* worker(action: MapToPubSubShape<VideoManagerEvent>) {\n const { type } = action\n\n switch (type) {\n case 'video-manager.rooms.subscribed':\n yield sagaEffects.fork(videoManagerRoomsWorker, {\n action,\n ...options,\n })\n break\n case 'video-manager.room.added':\n case 'video-manager.room.deleted':\n case 'video-manager.room.ended':\n case 'video-manager.room.started':\n case 'video-manager.room.updated':\n yield sagaEffects.fork(videoManagerRoomWorker, {\n action,\n ...options,\n })\n break\n default:\n getLogger().warn(`Unknown video-manager event: \"${type}\"`)\n break\n }\n }\n\n while (true) {\n const action: MapToPubSubShape<VideoManagerEvent> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n return action.type.startsWith('video-manager.')\n }\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoManagerWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomsSubscribedEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomsWorker = function* (\n options: VideoManagerWorkerParams<\n MapToPubSubShape<VideoManagerRoomsSubscribedEvent>\n >\n): SagaIterator {\n getLogger().trace('videoManagerRoomsWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n const modPayload = {\n rooms: payload.rooms.map((row) => toExternalJSON(row)),\n }\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n // @ts-expect-error\n modPayload\n )\n\n getLogger().trace('videoManagerRoomsWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomWorker = function* (\n options: VideoManagerWorkerParams<MapToPubSubShape<VideoManagerRoomEvent>>\n): SagaIterator {\n getLogger().trace('videoManagerRoomWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n toExternalJSON(payload)\n )\n\n getLogger().trace('videoManagerRoomWorker ended')\n}\n", "import {\n FabricLayoutChangedEventParams,\n VideoLayoutChangedEventParams,\n getLogger,\n uuid,\n} from '@signalwire/core'\nimport {\n buildVideo,\n cleanupElement,\n createRootElementResizeObserver,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n} from './utils/videoElement'\nimport { addSDKPrefix } from './utils/roomSession'\nimport { OverlayMap, LocalVideoOverlay } from './VideoOverlays'\nimport {\n FabricRoomSession,\n isFabricRoomSession,\n} from './fabric/FabricRoomSession'\nimport { VideoRoomSession, isVideoRoomSession } from './video/VideoRoomSession'\n\nexport interface BuildVideoElementParams {\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n mirrorLocalVideoOverlay?: boolean\n room: FabricRoomSession | VideoRoomSession\n rootElement?: HTMLElement\n}\n\nexport interface BuildVideoElementReturnType {\n element: HTMLElement\n overlayMap: OverlayMap\n localVideoOverlay: LocalVideoOverlay\n unsubscribe(): void\n}\n\nexport const buildVideoElement = async (\n params: BuildVideoElementParams\n): Promise<BuildVideoElementReturnType> => {\n try {\n const {\n room,\n rootElement: element,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n mirrorLocalVideoOverlay = true,\n } = params\n\n let hasVideoTrack = false\n const overlayMap: OverlayMap = new Map()\n const id = uuid()\n\n let rootElement: HTMLElement\n if (element) {\n rootElement = element\n } else {\n rootElement = document.createElement('div')\n rootElement.id = `rootElement-${id}`\n }\n\n /**\n * We used this `LocalVideoOverlay` class to interact with the localVideo\n * overlay DOM element in here and in the `makeLayoutChangedHandler`.\n */\n const overlayId = addSDKPrefix(id)\n const localVideoOverlay = new LocalVideoOverlay({\n id: overlayId,\n mirrorLocalVideoOverlay,\n room,\n })\n if (applyLocalVideoOverlay) {\n overlayMap.set(overlayId, localVideoOverlay)\n }\n\n const makeLayout = makeLayoutChangedHandler({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n overlayMap,\n localVideoOverlay,\n mirrorLocalVideoOverlay,\n rootElement,\n })\n\n const processLayoutChanged = (params: any) => {\n // @ts-expect-error\n if (room.peer?.hasVideoSender && room.localStream) {\n makeLayout({\n layout: params.layout,\n localStream: room.localStream,\n memberId: room.memberId,\n })\n } else {\n localVideoOverlay.hide()\n }\n }\n\n const layoutChangedHandler = (\n params: FabricLayoutChangedEventParams | VideoLayoutChangedEventParams\n ) => {\n getLogger().debug('Received layout.changed - videoTrack', hasVideoTrack)\n if (hasVideoTrack) {\n processLayoutChanged(params)\n return\n }\n }\n\n const processVideoTrack = async (track: MediaStreamTrack) => {\n hasVideoTrack = true\n\n await videoElementSetup({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n rootElement,\n track,\n })\n\n const roomCurrentLayoutEvent = room.currentLayoutEvent\n // If the `layout.changed` has already been received, process the layout\n if (roomCurrentLayoutEvent) {\n processLayoutChanged(roomCurrentLayoutEvent)\n }\n }\n\n // If the remote video already exist, inject the remote stream to the video element\n // @ts-expect-error\n const videoTrack = room.peer?.remoteVideoTrack as MediaStreamTrack | null\n if (videoTrack) {\n await processVideoTrack(videoTrack)\n }\n\n // Handle the RTCPeer `track` event\n const trackHandler = async function (event: RTCTrackEvent) {\n if (event.track.kind === 'video') {\n await processVideoTrack(event.track)\n }\n }\n\n const unsubscribe = () => {\n cleanupElement(rootElement)\n overlayMap.clear() // Use \"delete\" rather than \"clear\" if we want to update the reference\n room.overlayMap = overlayMap\n if (isFabricRoomSession(room)) {\n room.off('track', trackHandler)\n room.off('layout.changed', layoutChangedHandler)\n room.off('destroy', unsubscribe)\n } else if (isVideoRoomSession(room)) {\n room.off('track', trackHandler)\n room.off('layout.changed', layoutChangedHandler)\n room.off('destroy', unsubscribe)\n }\n localVideoOverlay.detachListeners()\n }\n\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the videoEl with the new track.\n */\n if (isFabricRoomSession(room)) {\n room.on('track', trackHandler)\n room.on('layout.changed', layoutChangedHandler)\n room.once('destroy', unsubscribe)\n } else if (isVideoRoomSession(room)) {\n room.on('track', trackHandler)\n room.on('layout.changed', layoutChangedHandler)\n room.once('destroy', unsubscribe)\n }\n\n /**\n * The room object is only being used to listen for events.\n * The \"buildVideoElement\" function does not directly manipulate the room object in order to maintain immutability.\n * Currently, we are overriding the following room properties in case the user calls \"buildVideoElement\" more than once.\n * However, this can be moved out of here easily if we prefer not to override.\n */\n room.overlayMap = overlayMap\n room.localVideoOverlay = localVideoOverlay\n\n return { element: rootElement, overlayMap, localVideoOverlay, unsubscribe }\n } catch (error) {\n getLogger().error('Unable to build the video element')\n throw error\n }\n}\n\ninterface VideoElementSetupWorkerParams {\n rootElement: HTMLElement\n track: MediaStreamTrack\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n}\n\nconst videoElementSetup = async (options: VideoElementSetupWorkerParams) => {\n try {\n const { applyLocalVideoOverlay, applyMemberOverlay, track, rootElement } =\n options\n\n // Create a video element\n const videoElement = buildVideo()\n\n setVideoMediaTrack({ element: videoElement, track })\n\n videoElement.style.width = '100%'\n videoElement.style.maxHeight = '100%'\n\n if (rootElement.querySelector('.mcuContent')) {\n getLogger().debug('MCU Content already there')\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(videoElement)\n\n const paddingWrapper = document.createElement('div')\n paddingWrapper.classList.add('paddingWrapper')\n paddingWrapper.style.paddingBottom = '56.25%' // (9 / 16) * 100\n paddingWrapper.style.position = 'relative'\n paddingWrapper.style.width = '100%'\n paddingWrapper.appendChild(mcuWrapper)\n\n let layersWrapper: HTMLDivElement | null = null\n\n // If the both flags are false, no need to create the MCU\n if (applyLocalVideoOverlay || applyMemberOverlay) {\n layersWrapper = document.createElement('div')\n layersWrapper.classList.add('mcuLayers')\n layersWrapper.style.display = 'none'\n paddingWrapper.appendChild(layersWrapper)\n }\n\n const relativeWrapper = document.createElement('div')\n relativeWrapper.classList.add('mcuContent')\n relativeWrapper.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.height = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.style.display = 'flex'\n relativeWrapper.style.alignItems = 'center'\n relativeWrapper.style.justifyContent = 'center'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.width = '100%'\n rootElement.style.height = '100%'\n rootElement.appendChild(relativeWrapper)\n\n getLogger().debug('MCU readyState 1 >>', videoElement.readyState)\n if (videoElement.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n await waitForVideoReady({ element: videoElement })\n }\n getLogger().debug('MCU is ready..')\n\n /**\n * Listen for the rootElement and the videoElement size changes and update the paddingWrapper.\n * The ResizeObserver and the video \"resize\" event make sure:\n * - The video should always maintain the aspect ratio.\n * - The video should not overflow the user passed rootElement.\n * - The video should not be cropped.\n */\n const rootElementResizeObserver = createRootElementResizeObserver({\n rootElement,\n video: videoElement,\n paddingWrapper,\n })\n rootElementResizeObserver.start()\n\n track.addEventListener('ended', () => {\n if (rootElementResizeObserver) {\n rootElementResizeObserver.stop()\n }\n })\n\n if (layersWrapper) {\n layersWrapper.style.display = 'block'\n }\n } catch (error) {\n getLogger().error('Handle video track error', error)\n }\n}\n", "import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\n debounce,\n uuid,\n} from '@signalwire/core'\nimport { OverlayMap, LocalVideoOverlay, UserOverlay } from '../VideoOverlays'\nimport { addOverlayPrefix } from './roomSession'\n\nconst buildVideo = () => {\n const video = document.createElement('video')\n video.muted = true\n video.autoplay = true\n video.playsInline = true\n\n /**\n * Local and Remote video elements should never be paused\n * and Safari/Firefox pause the video (ie: enabling PiP, switch cameras etc)\n * We try to force it to keep playing.\n */\n video.addEventListener('pause', () => {\n video.play().catch((error) => {\n getLogger().error('Video Element Paused', video, error)\n })\n })\n\n return video\n}\n\nconst waitForVideoReady = ({ element }: { element: HTMLVideoElement }) => {\n return new Promise<void>((resolve) => {\n element.addEventListener('canplay', function listener() {\n element.removeEventListener('canplay', listener)\n resolve()\n })\n element.addEventListener('resize', function listener() {\n element.removeEventListener('resize', listener)\n resolve()\n })\n })\n}\n\nconst _getLocationStyles = ({\n x,\n y,\n width,\n height,\n}: InternalVideoLayoutLayer) => {\n return {\n top: `${y}%`,\n left: `${x}%`,\n width: `${width}%`,\n height: `${height}%`,\n }\n}\n\nconst _buildLayer = ({ location }: { location: InternalVideoLayoutLayer }) => {\n const { top, left, width, height } = _getLocationStyles(location)\n const layer = document.createElement('div')\n layer.style.position = 'absolute'\n layer.style.overflow = 'hidden'\n layer.style.top = top\n layer.style.left = left\n layer.style.width = width\n layer.style.height = height\n\n return layer\n}\n\nconst _updateLayer = ({\n location,\n element,\n}: {\n location: InternalVideoLayoutLayer\n element: HTMLElement\n}) => {\n const { top, left, width, height } = _getLocationStyles(location)\n element.style.top = top\n element.style.left = left\n element.style.width = width\n element.style.height = height\n\n return element\n}\n\ninterface MakeLayoutChangedHandlerParams {\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n overlayMap: OverlayMap\n localVideoOverlay: LocalVideoOverlay\n mirrorLocalVideoOverlay?: boolean\n rootElement: HTMLElement\n}\n\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n memberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler = (params: MakeLayoutChangedHandlerParams) => {\n const {\n applyLocalVideoOverlay,\n applyMemberOverlay,\n overlayMap,\n localVideoOverlay,\n mirrorLocalVideoOverlay,\n rootElement,\n } = params\n\n return async (params: LayoutChangedHandlerParams) => {\n getLogger().debug('Process layout.changed')\n try {\n const { layout, memberId, localStream } = params\n const { layers = [] } = layout\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n\n // To handle the DOM updates in batch\n const fragment = document.createDocumentFragment()\n const currentOverlayIds = new Set()\n\n // Make local video overlay for the self member\n if (applyLocalVideoOverlay) {\n const location = layers.find(({ member_id }) => member_id === memberId)\n const overlayId = localVideoOverlay.id // LocalVideoOverlay ID is already unique\n let myLayerEl = localVideoOverlay.domElement\n currentOverlayIds.add(overlayId)\n\n if (!location) {\n getLogger().warn('Local video overlay location not found')\n localVideoOverlay.status = 'hidden'\n if (myLayerEl) {\n // Should we remove it from the DOM and the OverlayMap?\n localVideoOverlay.hide()\n }\n } else {\n if (myLayerEl) {\n getLogger().debug('Update local video overlay')\n _updateLayer({ location, element: myLayerEl })\n } else {\n getLogger().debug('Build local video overlay')\n myLayerEl = _buildLayer({ location })\n myLayerEl.id = overlayId\n\n const localVideo = buildVideo()\n localVideo.srcObject = localStream\n localVideo.disablePictureInPicture = true\n localVideo.style.width = '100%'\n localVideo.style.height = '100%'\n localVideo.style.pointerEvents = 'none'\n localVideo.style.objectFit = 'cover'\n\n myLayerEl.appendChild(localVideo)\n localVideoOverlay.domElement = myLayerEl\n\n // Mirror the local video if user has requested it\n if (mirrorLocalVideoOverlay) {\n localVideoOverlay.setMirror()\n }\n }\n\n // Show local overlay element only if the localStream has a valid video track\n const hasVideo =\n localStream\n .getVideoTracks()\n .filter((t) => t.enabled && t.readyState === 'live').length > 0\n if (hasVideo && location.visible) {\n localVideoOverlay.setMediaStream(localStream)\n localVideoOverlay.show()\n } else {\n localVideoOverlay.hide()\n }\n\n // Append the local video overlay to the fragment\n fragment.appendChild(myLayerEl)\n }\n }\n\n // Make overlay for all members (including a self member)\n if (applyMemberOverlay) {\n layers.forEach((location) => {\n const memberIdInLocation = location.member_id\n if (!memberIdInLocation) return\n\n const overlayId = addOverlayPrefix(memberIdInLocation)\n currentOverlayIds.add(overlayId)\n\n let overlay = overlayMap.get(overlayId)\n\n if (overlay && overlay.domElement) {\n // If the overlay already exists, modify its styles\n getLogger().debug('Update an overlay for ', memberIdInLocation)\n _updateLayer({ location, element: overlay.domElement })\n } else {\n // If the overlay doesn't exist, create a new overlay\n getLogger().debug('Build an overlay for ', memberIdInLocation)\n overlay = new UserOverlay({ id: overlayId })\n overlayMap.set(overlayId, overlay)\n\n const newLayer = _buildLayer({ location })\n newLayer.id = `${overlayId}-${uuid()}` // Unique DOM ID since user is allowed to build multiple video elements\n\n overlay.domElement = newLayer\n }\n\n if (!location.visible) {\n overlay.hide()\n } else {\n overlay.show()\n }\n\n // Append the overlay element to the fragment\n fragment.appendChild(overlay.domElement)\n })\n }\n\n // Remove overlays that are no longer present\n overlayMap.forEach((overlay, overlayId) => {\n if (!currentOverlayIds.has(overlayId)) {\n if (overlay.domElement && overlay.domElement.parentNode) {\n overlay.domElement.parentNode.removeChild(overlay.domElement)\n }\n overlayMap.delete(overlayId)\n }\n })\n\n // Replace mcuLayers content in batch with the fragment\n if (mcuLayers) {\n mcuLayers.innerHTML = ''\n mcuLayers.appendChild(fragment)\n }\n } catch (error) {\n getLogger().error('Layout Changed Error', error)\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\nconst createRootElementResizeObserver = ({\n video,\n rootElement,\n paddingWrapper,\n}: {\n video: HTMLVideoElement\n rootElement: HTMLElement\n paddingWrapper: HTMLDivElement\n}) => {\n const computePaddingWrapperWidth = (width: number, height: number) => {\n const nativeVideoRatio = video.videoWidth / video.videoHeight\n const rootElementRatio = width / height\n if (nativeVideoRatio > rootElementRatio) {\n return '100%'\n } else {\n return `${height * nativeVideoRatio}px`\n }\n }\n\n // Debounce to avoid multiple calls\n const update = debounce(\n ({ width, height }: { width: number; height: number }) => {\n const maxPaddingBottom = (video.videoHeight / video.videoWidth) * 100\n if (paddingWrapper) {\n const pb = (height / width) * 100\n paddingWrapper.style.paddingBottom = `${\n pb > maxPaddingBottom ? maxPaddingBottom : pb\n }%`\n paddingWrapper.style.width = computePaddingWrapperWidth(width, height)\n }\n },\n 100\n )\n\n const observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.contentBoxSize) {\n // Firefox implements `contentBoxSize` as a single content rect, rather than an array\n const { inlineSize, blockSize } = Array.isArray(entry.contentBoxSize)\n ? entry.contentBoxSize[0]\n : entry.contentBoxSize\n update({ width: inlineSize, height: blockSize })\n } else if (entry.contentRect) {\n update({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n })\n }\n })\n })\n\n /**\n * When the intrinsic dimensions of the video changes, the root element resize may or may not trigger.\n * For example; remote stream from the server changes dimensions from 16/9 (Landscape) to 9/16 (Portrait) mode.\n * For this reason we need to listen for the 'resize' event on the video element.\n */\n const onVideoResize = () => {\n const width = rootElement.clientWidth\n const height = rootElement.clientHeight\n update({ width, height })\n }\n\n return {\n start: () => {\n observer.observe(rootElement)\n video.addEventListener('resize', onVideoResize)\n },\n stop: () => {\n observer.disconnect()\n video.removeEventListener('resize', onVideoResize)\n },\n }\n}\n\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n createRootElementResizeObserver,\n LocalVideoOverlay,\n}\n", "import { FabricMemberUpdatedEventParams, getLogger } from '@signalwire/core'\nimport { VideoRoomSession, isVideoRoomSession } from './video/VideoRoomSession'\nimport {\n FabricRoomSession,\n isFabricRoomSession,\n} from './fabric/FabricRoomSession'\nimport { VideoMemberUpdatedHandlerParams } from './utils/interfaces'\nimport { OVERLAY_PREFIX, SDK_PREFIX } from './utils/roomSession'\n\nexport type OverlayMap = Map<string, UserOverlay>\n\ninterface UserOverlayOptions {\n id: string\n}\n\nexport type OverlayStatus = 'hidden' | 'visible'\n\nexport class UserOverlay {\n public id: string\n private _domElement: HTMLDivElement | undefined\n private _status: OverlayStatus\n\n constructor(options: UserOverlayOptions) {\n this.id = options.id\n this._status = 'hidden'\n }\n\n get userId() {\n return this.id.split(OVERLAY_PREFIX)[1]\n }\n\n get domElement() {\n return this._domElement\n }\n\n set domElement(element: HTMLDivElement | undefined) {\n getLogger().debug('Setting domElement for ', this.id)\n this._domElement = element\n }\n\n get status() {\n return this._status\n }\n\n set status(status: OverlayStatus) {\n this._status = status\n }\n\n public hide() {\n if (!this.domElement) {\n return getLogger().warn('Missing overlay to hide')\n }\n this.domElement.style.opacity = '0'\n this.status = 'hidden'\n }\n\n public show() {\n if (!this.domElement) {\n return getLogger().warn('Missing overlay to show')\n }\n this.domElement.style.opacity = '1'\n this.status = 'visible'\n }\n}\n\ninterface LocalVideoOverlayOptions {\n id: string\n mirrorLocalVideoOverlay: boolean\n room: FabricRoomSession | VideoRoomSession\n}\n\nexport class LocalVideoOverlay extends UserOverlay {\n private _mirrored: boolean\n private _room: FabricRoomSession | VideoRoomSession\n\n constructor(options: LocalVideoOverlayOptions) {\n super(options)\n this._mirrored = options.mirrorLocalVideoOverlay\n this._room = options.room\n\n // Bind the handler to preserve context\n this.fabricMemberVideoMutedHandler =\n this.fabricMemberVideoMutedHandler.bind(this)\n this.videoMemberVideoMutedHandler =\n this.videoMemberVideoMutedHandler.bind(this)\n\n this.attachListeners()\n }\n\n get userId() {\n return this.id.split(SDK_PREFIX)[1]\n }\n\n get mirrored() {\n return this._mirrored\n }\n\n private attachListeners() {\n if (isFabricRoomSession(this._room)) {\n this._room.on(\n 'member.updated.videoMuted',\n this.fabricMemberVideoMutedHandler\n )\n } else if (isVideoRoomSession(this._room)) {\n this._room.on(\n 'member.updated.videoMuted',\n this.videoMemberVideoMutedHandler\n )\n }\n }\n\n /** @internal */\n public detachListeners() {\n if (isFabricRoomSession(this._room)) {\n this._room.off(\n 'member.updated.videoMuted',\n this.fabricMemberVideoMutedHandler\n )\n } else if (isVideoRoomSession(this._room)) {\n this._room.off(\n 'member.updated.videoMuted',\n this.videoMemberVideoMutedHandler\n )\n }\n }\n\n private memberVideoMutedHandler(memberId: string, videoMuted: boolean) {\n try {\n if (memberId === this._room.memberId) {\n videoMuted ? this.hide() : this.show()\n }\n } catch (error) {\n getLogger().error('Error handling videoMuted in LocalVideoOverlay', error)\n }\n }\n\n private fabricMemberVideoMutedHandler(\n params: FabricMemberUpdatedEventParams\n ) {\n this.memberVideoMutedHandler(\n params.member.member_id,\n params.member.video_muted\n )\n }\n\n private videoMemberVideoMutedHandler(\n params: VideoMemberUpdatedHandlerParams\n ) {\n this.memberVideoMutedHandler(params.member.id, params.member.video_muted)\n }\n\n public setMediaStream(stream: MediaStream) {\n if (!this.domElement) {\n return getLogger().warn('Missing local overlay to set the stream')\n }\n const localVideo = this.domElement.querySelector('video')\n if (localVideo) {\n localVideo.srcObject = stream\n }\n }\n\n public setMirror(mirror: boolean = this._mirrored) {\n if (!this.domElement || !this.domElement.firstChild) {\n return getLogger().warn('Missing local overlay to set the mirror')\n }\n const videoEl = this.domElement.firstChild as HTMLVideoElement\n videoEl.style.transform = mirror ? 'scale(-1, 1)' : 'scale(1, 1)'\n videoEl.style.webkitTransform = mirror ? 'scale(-1, 1)' : 'scale(1, 1)'\n this._mirrored = mirror\n }\n}\n", "import {\n BaseComponentContract,\n BaseConnectionContract,\n connect,\n EventEmitter,\n extendComponent,\n Rooms,\n validateEventsToSubscribe,\n VideoAuthorization,\n VideoLayoutChangedEventParams,\n} from '@signalwire/core'\nimport { BaseConnectionOptions } from '@signalwire/webrtc'\nimport {\n BaseRoomSessionConnection,\n BaseRoomSessionOptions,\n} from '../BaseRoomSession'\nimport {\n RoomSessionDevice,\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDeviceEvents,\n} from '../RoomSessionDevice'\nimport * as workers from './workers'\nimport {\n AddCameraOptions,\n AddDeviceOptions,\n AddMicrophoneOptions,\n CreateScreenShareObjectOptions,\n VideoRoomSessionMethods,\n VideoRoomSessionEvents,\n VideoRoomSessionContract,\n BaseRoomSessionContract,\n} from '../utils/interfaces'\n\nexport interface VideoRoomSession\n extends VideoRoomSessionContract,\n VideoRoomSessionMethods,\n BaseRoomSessionContract,\n BaseConnectionContract<VideoRoomSessionEvents>,\n BaseComponentContract {}\n\nexport interface VideoRoomSessionOptions extends BaseRoomSessionOptions {}\n\nexport class VideoRoomSessionConnection\n extends BaseRoomSessionConnection<VideoRoomSessionEvents>\n implements VideoRoomSessionContract\n{\n private _deviceList = new Set<RoomSessionDevice>()\n private _currentLayoutEvent: VideoLayoutChangedEventParams\n\n constructor(options: VideoRoomSessionOptions) {\n super(options)\n\n this.initWorker()\n }\n\n set currentLayoutEvent(event: VideoLayoutChangedEventParams) {\n this._currentLayoutEvent = event\n }\n\n get currentLayoutEvent() {\n return this._currentLayoutEvent\n }\n\n get currentLayout() {\n return this._currentLayoutEvent?.layout\n }\n\n get currentPosition() {\n return this._currentLayoutEvent?.layout.layers.find(\n (layer) => layer.member_id === this.memberId\n )?.position\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n get interactivityMode() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.join_as ?? ''\n })\n }\n\n get permissions() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.room?.scopes ?? []\n })\n }\n\n private initWorker() {\n this.runWorker('videoWorker', {\n worker: workers.videoWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map((event) => {\n return `video.${String(event)}`\n })\n return validateEventsToSubscribe(\n eventNamesWithPrefix\n ) as EventEmitter.EventNames<{}>[]\n }\n\n /** @internal */\n protected _finalize() {\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup(id)\n }\n\n join() {\n return super.invite<VideoRoomSession>()\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 /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\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 return new Promise<RoomSessionDevice>(async (resolve, reject) => {\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 = {\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.callId,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n RoomSessionDeviceEvents,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n })(options)\n\n roomDevice.once('destroy', () => {\n roomDevice.emit('room.left')\n this._deviceList.delete(roomDevice)\n })\n\n try {\n roomDevice.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(roomDevice),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n return await roomDevice.join()\n }\n return resolve(roomDevice)\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n reject(error)\n }\n })\n }\n}\n\nexport const VideoRoomSessionAPI = extendComponent<\n VideoRoomSessionConnection,\n VideoRoomSessionMethods\n>(VideoRoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n removeAllMembers: Rooms.removeAllMembers,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n getMeta: Rooms.getMeta,\n setMeta: Rooms.setMeta,\n updateMeta: Rooms.updateMeta,\n deleteMeta: Rooms.deleteMeta,\n getMemberMeta: Rooms.getMemberMeta,\n setMemberMeta: Rooms.setMemberMeta,\n updateMemberMeta: Rooms.updateMemberMeta,\n deleteMemberMeta: Rooms.deleteMemberMeta,\n promote: Rooms.promote,\n demote: Rooms.demote,\n getStreams: Rooms.getStreams,\n startStream: Rooms.startStream,\n lock: Rooms.lock,\n unlock: Rooms.unlock,\n setRaisedHand: Rooms.setRaisedHand,\n setPrioritizeHandraise: Rooms.setPrioritizeHandraise,\n})\n\nexport const isVideoRoomSession = (room: unknown): room is VideoRoomSession => {\n return room instanceof VideoRoomSessionConnection\n}\n\n/** @internal */\nexport const createVideoRoomSessionObject = (\n params: VideoRoomSessionOptions\n): VideoRoomSession => {\n const room = connect<\n VideoRoomSessionEvents,\n VideoRoomSessionConnection,\n VideoRoomSession\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: VideoRoomSessionAPI,\n })(params)\n\n return room\n}\n", "import {\n BaseComponentContract,\n BaseConnectionState,\n connect,\n EventEmitter,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionOptions,\n createSpeakerDeviceWatcher,\n getDisplayMedia,\n getSpeakerById,\n supportsMediaOutput,\n MediaEventNames,\n} from '@signalwire/webrtc'\nimport { LocalVideoOverlay, OverlayMap } from './VideoOverlays'\nimport {\n AudioElement,\n BaseRoomSessionContract,\n StartScreenShareOptions,\n} from './utils/interfaces'\nimport { SCREENSHARE_AUDIO_CONSTRAINTS } from './utils/constants'\nimport { addOverlayPrefix } from './utils/roomSession'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShare,\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShareEvents,\n} from './RoomSessionScreenShare'\nimport * as workers from './video/workers'\n\nexport interface BaseRoomSession<\n EventTypes extends EventEmitter.ValidEventTypes = BaseRoomSessionEvents\n> extends BaseRoomSessionContract,\n BaseConnection<EventTypes>,\n BaseComponentContract {}\n\nexport interface BaseRoomSessionOptions extends BaseConnectionOptions {}\n\nexport class BaseRoomSessionConnection<\n EventTypes extends EventEmitter.ValidEventTypes = BaseRoomSessionEvents\n >\n extends BaseConnection<EventTypes>\n implements BaseRoomSessionContract\n{\n private _screenShareList = new Set<RoomSessionScreenShare>()\n private _audioEl: AudioElement\n private _overlayMap: OverlayMap\n private _localVideoOverlay: LocalVideoOverlay\n\n get audioEl() {\n return this._audioEl\n }\n\n set overlayMap(map: OverlayMap) {\n this._overlayMap = map\n }\n\n get overlayMap() {\n return this._overlayMap\n }\n\n set localVideoOverlay(overlay: LocalVideoOverlay) {\n this._localVideoOverlay = overlay\n }\n\n get localVideoOverlay() {\n return this._localVideoOverlay\n }\n\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n private _attachSpeakerTrackListener() {\n if (!supportsMediaOutput()) return\n\n // @TODO: Stop the watcher when user leave/disconnects\n createSpeakerDeviceWatcher().then((deviceWatcher) => {\n deviceWatcher.on('removed', async (data) => {\n const sinkId = this._audioEl.sinkId\n const disconnectedSpeaker = data.changes.find((device) => {\n const payloadDeviceId = device.payload.deviceId\n\n return (\n payloadDeviceId === sinkId ||\n (payloadDeviceId === '' && sinkId === 'default') ||\n (payloadDeviceId === 'default' && sinkId === '')\n )\n })\n if (disconnectedSpeaker) {\n this.emit('speaker.disconnected', {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n })\n\n /**\n * In case the currently in-use speaker disconnects, OS by default fallbacks to the default speaker\n * Set the sink id here to make the SDK consistent with the OS\n */\n await this._audioEl.setSinkId?.('')\n\n const defaultSpeakers = await getSpeakerById('default')\n\n if (!defaultSpeakers?.deviceId) return\n\n // Emit the speaker.updated event since the OS will fallback to the default speaker\n this.emit('speaker.updated', {\n previous: {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n },\n current: {\n deviceId: defaultSpeakers.deviceId,\n label: defaultSpeakers.label,\n },\n })\n }\n })\n })\n }\n\n /** @internal */\n protected override _finalize() {\n this._screenShareList.clear()\n\n super._finalize()\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n\n return super.hangup(id)\n }\n\n leave() {\n return this.hangup()\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 attachPreConnectWorkers() {\n this.runWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n }\n\n /** @internal */\n getAudioEl() {\n if (this._audioEl) return this._audioEl\n this._audioEl = new Audio()\n this._attachSpeakerTrackListener()\n return this._audioEl\n }\n\n getMemberOverlay(memberId: string) {\n return this.overlayMap.get(addOverlayPrefix(memberId))\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n return new Promise<RoomSessionScreenShare>(async (resolve, reject) => {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n try {\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n RoomSessionScreenShareEvents,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\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.once('destroy', () => {\n screenShare.emit('room.left')\n this._screenShareList.delete(screenShare)\n })\n\n screenShare.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(screenShare),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n return await screenShare.join()\n }\n return resolve(screenShare)\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n reject(error)\n }\n })\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n const prevId = this.audioEl.sinkId as string\n this.once(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n async (newId: string) => {\n const prevSpeaker = await getSpeakerById(prevId)\n const newSpeaker = await getSpeakerById(newId)\n\n const isSame = newSpeaker?.deviceId === prevSpeaker?.deviceId\n if (!newSpeaker?.deviceId || isSame) return\n\n this.emit('speaker.updated', {\n previous: {\n deviceId: prevSpeaker?.deviceId,\n label: prevSpeaker?.label,\n },\n current: {\n deviceId: newSpeaker.deviceId,\n label: newSpeaker.label,\n },\n })\n }\n )\n\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n}\n\ntype BaseRoomSessionEventsHandlerMap = Record<\n BaseConnectionState,\n (params: BaseRoomSession<BaseRoomSessionEvents>) => void\n> &\n Record<MediaEventNames, () => void>\n\nexport type BaseRoomSessionEvents = {\n [k in keyof BaseRoomSessionEventsHandlerMap]: BaseRoomSessionEventsHandlerMap[k]\n}\n\n/** @internal */\nexport const createBaseRoomSessionObject = (\n params: BaseRoomSessionOptions\n): BaseRoomSession<BaseRoomSessionEvents> => {\n const room = connect<\n BaseRoomSessionEvents,\n BaseRoomSessionConnection<BaseRoomSessionEvents>,\n BaseRoomSession<BaseRoomSessionEvents>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: BaseRoomSessionConnection,\n })(params)\n\n return room\n}\n", "export const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n", "import { getLogger } from '@signalwire/core'\nimport type { VideoAuthorization } from '@signalwire/core'\nimport type { BaseRoomSessionJoinParams } from './interfaces'\n\ntype GetJoinMediaParamsOptions = BaseRoomSessionJoinParams & {\n authState: VideoAuthorization\n}\n/**\n * getJoinMediaParams returns whether the Join method must send/recv\n * audio and video.\n * Based on values on the Auth block (media allowed and join_as type)\n * it matches the user's preferences and return an object that tells\n * if the negotiation has to include sendrecv/sendonly or recvonly\n * for audio and video.\n */\nexport const getJoinMediaParams = (options: GetJoinMediaParamsOptions) => {\n const {\n authState,\n audio = true,\n video = true,\n sendAudio,\n sendVideo,\n receiveAudio,\n receiveVideo,\n } = options\n getLogger().debug('getJoinMediaParams options', { ...options })\n const { audio_allowed, video_allowed, join_as } = authState\n // Fallback to 'member' in case of null/undefined\n const joinAs = join_as ?? 'member'\n const canSend = joinAs === 'member'\n\n const canSendAudio = canSend && audio_allowed === 'both'\n const canSendVideo = canSend && video_allowed === 'both'\n const canReceiveAudio = audio_allowed !== 'none'\n const canReceiveVideo = video_allowed !== 'none'\n\n const reqToSendAudio = Boolean(sendAudio ?? audio)\n const reqToSendVideo = Boolean(sendVideo ?? video)\n const reqToReceiveAudio = Boolean(receiveAudio ?? audio)\n const reqToReceiveVideo = Boolean(receiveVideo ?? video)\n\n if (!canSendAudio && reqToSendAudio) {\n getLogger().info(\n 'Not allowed to send audio on this room. Default values will be used.'\n )\n }\n if (!canSendVideo && reqToSendVideo) {\n getLogger().info(\n 'Not allowed to send video on this room. Default values will be used.'\n )\n }\n if (!canReceiveAudio && reqToReceiveAudio) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n if (!canReceiveVideo && reqToReceiveVideo) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n return {\n mustSendAudio: canSendAudio && reqToSendAudio,\n mustSendVideo: canSendVideo && reqToSendVideo,\n mustRecvAudio: canReceiveAudio && reqToReceiveAudio,\n mustRecvVideo: canReceiveVideo && reqToReceiveVideo,\n }\n}\n\nexport const checkMediaParams = (\n options: Record<string, boolean | undefined>\n) => {\n // At least one value must be true\n return Object.values(options).some(Boolean)\n}\n\nexport const SDK_PREFIX = 'sw-sdk-'\nexport const addSDKPrefix = (id: string) => {\n return `${SDK_PREFIX}${id}`\n}\n\nexport const OVERLAY_PREFIX = 'sw-overlay-'\nexport const addOverlayPrefix = (id: string) => {\n return `${OVERLAY_PREFIX}${id}`\n}\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n RoomLeft,\n RoomLeftEventParams,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEventNames } from '@signalwire/webrtc'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\ntype RoomSessionScreenShareEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionScreenShare) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void>\n\nexport type RoomSessionScreenShareEvents = {\n [k in keyof RoomSessionScreenShareEventsHandlerMap]: RoomSessionScreenShareEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\nexport interface RoomSessionScreenShare\n extends RoomScreenShareMethods,\n BaseConnectionContract<RoomSessionScreenShareEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionScreenShareEvents>['runWorker']\n}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<RoomSessionScreenShareEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * Represents a screen sharing.\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 sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n SwEventChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { VideoMemberListUpdatedParams } from '../../utils/interfaces'\nimport { VideoRoomSession } from '../VideoRoomSession'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = '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 = (\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\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(EXTERNAL_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: VideoRoomSession,\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 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 swEventChannel,\n instance,\n}: {\n swEventChannel: SwEventChannel\n instance: any\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 instance.emit(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, memberListPayload)\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n swEventChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<VideoRoomSession> =\n function* membersChangedWorker({\n channels: { swEventChannel },\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 swEventChannel,\n instance,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n", "import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n VideoMemberJoinedEvent,\n componentSelectors,\n componentActions,\n type ReduxComponent,\n} from '@signalwire/core'\n\nimport type { BaseConnection } from '@signalwire/webrtc'\n\ntype ChildMemberJoinedWorkerOnDone = () => void\ntype ChildMemberJoinedWorkerOnFail = (args: { error: Error }) => void\n\nexport type ChildMemberJoinedWorkerHooks = SDKWorkerHooks<\n ChildMemberJoinedWorkerOnDone,\n ChildMemberJoinedWorkerOnFail\n>\n\nexport const childMemberJoinedWorker: SDKWorker<\n BaseConnection<any>,\n ChildMemberJoinedWorkerHooks\n> = function* (options): SagaIterator {\n getLogger().trace('childMemberJoinedWorker started')\n const { channels, instance, initialState, onDone, onFail } = options\n const { swEventChannel } = channels\n const { parentId } = initialState\n if (!parentId) {\n throw new Error('Missing parentId for childMemberJoinedWorker')\n }\n\n const action: MapToPubSubShape<VideoMemberJoinedEvent> =\n yield sagaEffects.take(swEventChannel, (action: SDKActions) => {\n if (action.type === 'video.member.joined') {\n return action.payload.member.parent_id === parentId\n }\n return false\n })\n\n /**\n * On video.member.joined with a parent_id, check if we are the\n * owner of the object comparing parent_id in the state.\n * If so update the state with the room values to update the\n * object.\n */\n const { member } = action.payload\n if (member?.parent_id) {\n const byId: Record<string, ReduxComponent> = yield sagaEffects.select(\n componentSelectors.getComponentsById\n )\n const parent = Object.values(byId).find((row) => {\n return 'memberId' in row && row.memberId === member.parent_id\n })\n if (parent) {\n yield sagaEffects.put(\n componentActions.upsert({\n id: instance.callId,\n roomId: action.payload.room_id,\n roomSessionId: action.payload.room_session_id,\n memberId: member.id,\n })\n )\n\n onDone?.()\n } else {\n onFail?.({ error: new Error('Unknown parent_id') })\n }\n }\n getLogger().trace('childMemberJoinedWorker ended')\n}\n", "import {\n SDKActions,\n SDKWorker,\n SagaIterator,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n MemberPosition,\n stripNamespacePrefix,\n VideoAction,\n VideoRoomDeviceEventNames,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { videoStreamWorker } from './videoStreamWorker'\nimport { videoRecordWorker } from './videoRecordWorker'\nimport { videoPlaybackWorker } from './videoPlaybackWorker'\nimport { VideoRoomSessionConnection } from '../VideoRoomSession'\nimport { MediaEventNames } from '@signalwire/webrtc'\n\nexport type VideoWorkerParams<T> =\n SDKWorkerParams<VideoRoomSessionConnection> & {\n action: T\n }\n\nexport const videoWorker: SDKWorker<VideoRoomSessionConnection> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoWorker started')\n\n const { channels, instance: roomSession } = options\n const { swEventChannel } = channels\n\n function* worker(action: VideoAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'video.room.subscribed':\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n instance: roomSession,\n initialState: payload,\n })\n return\n case 'video.playback.started':\n case 'video.playback.updated':\n case 'video.playback.ended':\n yield sagaEffects.fork(videoPlaybackWorker, {\n action,\n ...options,\n })\n return // Return since we don't need to handle the raw event for this\n case 'video.recording.started':\n case 'video.recording.updated':\n case 'video.recording.ended':\n yield sagaEffects.fork(videoRecordWorker, {\n action,\n ...options,\n })\n return\n case 'video.stream.ended':\n case 'video.stream.started':\n yield sagaEffects.fork(videoStreamWorker, {\n action,\n ...options,\n })\n return\n case 'video.room.audience_count': {\n roomSession.emit('room.audienceCount', payload)\n return\n }\n case 'video.member.talking': {\n const { member } = payload\n if ('talking' in member) {\n const suffix = member.talking ? 'started' : 'ended'\n roomSession.emit(`member.talking.${suffix}`, payload)\n\n // Keep for backwards compat.\n const deprecatedSuffix = member.talking ? 'start' : 'stop'\n roomSession.emit(`member.talking.${deprecatedSuffix}`, payload)\n }\n break // Break here since we do need the raw event sent to the client\n }\n case 'video.layout.changed': {\n // Upsert the layout event which is needed for buildVideoElement\n roomSession.currentLayoutEvent = action.payload\n break\n }\n default:\n break\n }\n\n const event = stripNamespacePrefix(type, 'video') as\n | VideoRoomDeviceEventNames\n | MediaEventNames\n | BaseConnectionState\n roomSession.emit(event, payload)\n }\n\n const isVideoEvent = (action: SDKActions) => {\n return action.type.startsWith('video.')\n }\n\n while (true) {\n const action: VideoAction = yield sagaEffects.take(\n swEventChannel,\n isVideoEvent\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoStreamEvent,\n RoomSessionStream,\n Rooms,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoStreamWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoStreamEvent>>\n): SagaIterator {\n getLogger().trace('videoStreamWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let streamInstance = get<RoomSessionStream>(payload.stream.id)\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: roomSession.store,\n payload,\n })\n } else {\n streamInstance.setPayload(payload)\n }\n set<RoomSessionStream>(payload.stream.id, streamInstance)\n\n switch (type) {\n case 'video.stream.started':\n roomSession.emit('stream.started', streamInstance)\n break\n case 'video.stream.ended':\n roomSession.emit('stream.ended', streamInstance)\n remove<RoomSessionStream>(payload.stream.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoStreamWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionRecording,\n Rooms,\n VideoRecordingEvent,\n VideoRecordingEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoRecordWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoRecordingEvent>>\n): SagaIterator {\n getLogger().trace('videoRecordWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let recordingInstance = get<RoomSessionRecording>(payload.recording.id)\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: roomSession.store,\n payload,\n })\n } else {\n recordingInstance.setPayload(payload)\n }\n set<RoomSessionRecording>(payload.recording.id, recordingInstance)\n\n const event = stripNamespacePrefix(type) as VideoRecordingEventNames\n\n switch (type) {\n case 'video.recording.started':\n case 'video.recording.updated': {\n roomSession.emit(event, recordingInstance)\n break\n }\n case 'video.recording.ended':\n roomSession.emit(event, recordingInstance)\n remove<RoomSessionRecording>(payload.recording.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoRecordWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionPlayback,\n Rooms,\n VideoPlaybackEvent,\n VideoPlaybackEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoPlaybackWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoPlaybackEvent>>\n): SagaIterator {\n getLogger().trace('videoPlaybackWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let playbackInstance = get<RoomSessionPlayback>(payload.playback.id)\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: roomSession.store,\n payload,\n })\n } else {\n playbackInstance.setPayload(payload)\n }\n set<RoomSessionPlayback>(payload.playback.id, playbackInstance)\n\n const event = stripNamespacePrefix(type) as VideoPlaybackEventNames\n\n switch (type) {\n case 'video.playback.started':\n case 'video.playback.updated': {\n roomSession.emit(event, playbackInstance)\n break\n }\n case 'video.playback.ended':\n roomSession.emit(event, playbackInstance)\n remove<RoomSessionPlayback>(payload.playback.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoPlaybackWorker ended')\n}\n", "import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n RoomLeft,\n RoomLeftEventParams,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEventNames } from '@signalwire/webrtc'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\ntype RoomSessionDeviceEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionDevice) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void>\n\nexport type RoomSessionDeviceEvents = {\n [k in keyof RoomSessionDeviceEventsHandlerMap]: RoomSessionDeviceEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\nexport interface RoomSessionDevice\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<RoomSessionDeviceEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionDeviceEvents>['runWorker']\n}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<RoomSessionDeviceEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\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 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 connect,\n BaseComponentContract,\n BaseRPCResult,\n FabricLayoutChangedEventParams,\n ExecuteExtendedOptions,\n Rooms,\n VideoMemberEntity,\n VideoPosition,\n BaseConnectionContract,\n FabricRoomSessionMethods,\n MemberCommandParams,\n} from '@signalwire/core'\nimport {\n BaseRoomSessionConnection,\n BaseRoomSessionOptions,\n} from '../BaseRoomSession'\nimport {\n BaseRoomSessionContract,\n ExecuteMemberActionParams,\n FabricRoomSessionContract,\n FabricRoomSessionEvents,\n MemberCommandWithValueParams,\n MemberCommandWithVolumeParams,\n RequestMemberParams,\n} from '../utils/interfaces'\nimport { getStorage } from '../utils/storage'\nimport { PREVIOUS_CALLID_STORAGE_KEY } from './utils/constants'\nimport { fabricWorker } from './workers'\nimport { FabricRoomSessionMember } from './FabricRoomSessionMember'\nimport { makeAudioElementSaga } from '../features/mediaElements/mediaElementsSagas'\nimport { CallCapabilitiesContract } from './interfaces/capabilities'\n\nexport interface FabricRoomSession\n extends FabricRoomSessionContract,\n FabricRoomSessionMethods,\n BaseRoomSessionContract,\n BaseConnectionContract<FabricRoomSessionEvents>,\n BaseComponentContract {}\n\nexport interface FabricRoomSessionOptions\n extends Omit<BaseRoomSessionOptions, 'customSagas'> {}\n\nexport class FabricRoomSessionConnection\n extends BaseRoomSessionConnection<FabricRoomSessionEvents>\n implements FabricRoomSessionContract\n{\n // this is \"self\" parameter required by the RPC, and is always \"the member\" on the 1st call segment\n private _self?: FabricRoomSessionMember\n // this is \"the member\" on the last/active call segment\n private _member?: FabricRoomSessionMember\n private _currentLayoutEvent: FabricLayoutChangedEventParams\n //describes what are methods are allow for the user in a call segment\n private _capabilities?: CallCapabilitiesContract\n\n constructor(options: FabricRoomSessionOptions) {\n super(options)\n\n this.initWorker()\n }\n\n override get memberId() {\n return this._member?.memberId\n }\n\n set currentLayoutEvent(event: FabricLayoutChangedEventParams) {\n this._currentLayoutEvent = event\n }\n\n get currentLayoutEvent() {\n return this._currentLayoutEvent\n }\n\n get currentLayout() {\n return this._currentLayoutEvent?.layout\n }\n\n get currentPosition() {\n return this._currentLayoutEvent?.layout.layers.find(\n (layer) => layer.member_id === this.memberId\n )?.position\n }\n\n get capabilities(): CallCapabilitiesContract | undefined {\n return this._capabilities\n }\n\n set capabilities(capabilities: CallCapabilitiesContract | undefined) {\n this._capabilities = capabilities\n }\n\n get selfMember(): FabricRoomSessionMember | undefined {\n return this._self\n }\n\n set selfMember(member: FabricRoomSessionMember | undefined) {\n this._self = member\n }\n\n set member(member: FabricRoomSessionMember) {\n this._member = member\n }\n\n get member(): FabricRoomSessionMember {\n return this._member!\n }\n\n private initWorker() {\n this.runWorker('fabricWorker', {\n worker: fabricWorker,\n })\n\n /**\n * By default the SDK attaches the audio to\n * an Audio element (regardless of \"rootElement\")\n */\n this.runWorker('makeAudioElement', {\n worker: makeAudioElementSaga({\n speakerId: this.options.speakerId,\n }),\n })\n }\n\n private async join() {\n if (this.options.attach) {\n this.options.prevCallId =\n getStorage()?.getItem(PREVIOUS_CALLID_STORAGE_KEY) ?? undefined\n }\n this.logger.debug(\n `Tying to reattach to previuos call? ${!!this.options\n .prevCallId} - prevCallId: ${this.options.prevCallId}`\n )\n\n return super.invite<FabricRoomSession>()\n }\n\n private executeAction<\n InputType,\n OutputType = InputType,\n ParamsType extends MemberCommandParams = MemberCommandParams\n >(\n params: ExecuteMemberActionParams,\n options: ExecuteExtendedOptions<InputType, OutputType, ParamsType> = {}\n ) {\n const { method, channel, memberId, extraParams = {} } = params\n\n const targetMember = memberId\n ? this.instanceMap.get<FabricRoomSessionMember>(memberId)\n : this.member\n if (!targetMember) throw new Error('No target param found to execute')\n\n return this.execute<InputType, OutputType, ParamsType>(\n {\n method,\n params: {\n ...(channel && { channels: [channel] }),\n self: {\n member_id: this.selfMember?.id,\n call_id: this.selfMember?.callId,\n node_id: this.selfMember?.nodeId,\n },\n target: {\n member_id: targetMember.id,\n call_id: targetMember.callId,\n node_id: targetMember.nodeId,\n },\n ...extraParams,\n },\n },\n options\n )\n }\n\n /** @internal */\n public override async resume() {\n this.logger.warn(`[resume] Call ${this.id}`)\n if (this.peer?.instance) {\n const { connectionState } = this.peer.instance\n this.logger.debug(\n `[resume] connectionState for ${this.id} is '${connectionState}'`\n )\n if (['closed', 'failed', 'disconnected'].includes(connectionState)) {\n this.resuming = true\n this.peer.restartIce()\n }\n }\n }\n\n public async start() {\n return new Promise<void>(async (resolve, reject) => {\n try {\n this.once('room.subscribed', (params) => {\n getStorage()?.setItem(PREVIOUS_CALLID_STORAGE_KEY, params.call_id)\n resolve()\n })\n\n this.once('destroy', () => {\n getStorage()?.removeItem(PREVIOUS_CALLID_STORAGE_KEY)\n })\n\n await this.join()\n } catch (error) {\n this.logger.error('WSClient call start', error)\n reject(error)\n }\n })\n }\n\n public async audioMute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.muteAudio.off\n : !this.capabilities?.member.muteAudio.off\n ) {\n throw Error('Missing audio mute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.mute',\n channel: 'audio',\n memberId: params?.memberId,\n })\n }\n\n public async audioUnmute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.muteAudio.on\n : !this.capabilities?.member.muteAudio.on\n ) {\n throw Error('Missing audio unmute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unmute',\n channel: 'audio',\n memberId: params?.memberId,\n })\n }\n\n public async videoMute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.muteVideo.off\n : !this.capabilities?.member.muteVideo.on\n ) {\n throw Error('Missing video mute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.mute',\n channel: 'video',\n memberId: params?.memberId,\n })\n }\n\n public async videoUnmute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.muteVideo.on\n : !this.capabilities?.member.muteVideo.on\n ) {\n throw Error('Missing video unmute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unmute',\n channel: 'video',\n memberId: params?.memberId,\n })\n }\n\n public async deaf(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.deaf.on\n : !this.capabilities?.member.deaf.on\n ) {\n throw Error('Missing deaf capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.deaf',\n memberId: params?.memberId,\n })\n }\n\n public async undeaf(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.deaf.off\n : !this.capabilities?.member.deaf.off\n ) {\n throw Error('Missing undeaf capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.undeaf',\n memberId: params?.memberId,\n })\n }\n\n public async getLayouts() {\n return this.executeAction<{ layouts: string[] }>(\n {\n method: 'call.layout.list',\n },\n {\n transformResolve: (payload) => ({\n layouts: payload.layouts,\n }),\n }\n )\n }\n\n public async getMembers() {\n return this.executeAction<{ members: VideoMemberEntity[] }>(\n {\n method: 'call.member.list',\n },\n {\n transformResolve: (payload) => ({\n members: payload.members,\n }),\n }\n )\n }\n\n public async removeMember(params: Required<MemberCommandParams>) {\n if (!this.capabilities?.member.remove) {\n throw Error('Missing setLayout capability')\n }\n if (!params?.memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.member.remove',\n memberId: params.memberId,\n })\n }\n\n public async setRaisedHand(params?: Rooms.SetRaisedHandRoomParams) {\n const { raised = true, memberId } = params || {}\n if (\n memberId == this.member.id && raised\n ? !this.capabilities?.self.raisehand.on\n : !this.capabilities?.member.raisehand.on\n ) {\n throw Error('Missing raisehand capability')\n }\n if (\n memberId == this.member.id && !raised\n ? !this.capabilities?.self.raisehand.off\n : !this.capabilities?.member.raisehand.off\n ) {\n throw Error('Missing lowerhand capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: raised ? 'call.raisehand' : 'call.lowerhand',\n memberId,\n })\n }\n\n public async setLayout(params: Rooms.SetLayoutParams) {\n if (!this.capabilities?.setLayout) {\n throw Error('Missing setLayout capability')\n }\n const extraParams = {\n layout: params.name,\n positions: params.positions,\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.layout.set',\n extraParams,\n })\n }\n\n public async setInputVolume(params: MemberCommandWithVolumeParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.microphoneVolume\n : !this.capabilities?.member.microphoneVolume\n ) {\n throw Error('Missing setInputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.microphone.volume.set',\n memberId: params?.memberId,\n extraParams: {\n volume: params?.volume,\n },\n })\n }\n\n public async setOutputVolume(params: MemberCommandWithVolumeParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.speakerVolume\n : !this.capabilities?.member.speakerVolume\n ) {\n throw Error('Missing setOutputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'video.member.set_output_volume',\n memberId: params?.memberId,\n extraParams: {\n volume: params?.volume,\n },\n })\n }\n\n public async setInputSensitivity(params: MemberCommandWithValueParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.microphoneSensitivity\n : !this.capabilities?.member.microphoneSensitivity\n ) {\n throw Error('Missing setOutputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.microphone.sensitivity.set',\n memberId: params?.memberId,\n extraParams: {\n value: params?.value,\n },\n })\n }\n\n public async setPositions(params: Rooms.SetPositionsParams) {\n const positions = params.positions\n\n if (positions && !Object.keys(positions).length) {\n throw new Error('Invalid positions')\n }\n\n if (\n Object.keys(positions).some((p) =>\n ['self', `${this.memberId}`].includes(p)\n )\n ? !this.capabilities?.self.position\n : !this.capabilities?.member.position\n ) {\n throw Error('Missing setPositions capability')\n }\n\n const targets: {\n target: RequestMemberParams\n position: VideoPosition\n }[] = []\n\n Object.entries(positions).forEach(([key, value]) => {\n const targetMember =\n key === 'self'\n ? this.member\n : this.instanceMap.get<FabricRoomSessionMember>(key)\n\n if (targetMember) {\n targets.push({\n target: {\n member_id: targetMember.id,\n call_id: targetMember.callId!,\n node_id: targetMember.nodeId!,\n },\n position: value,\n })\n }\n })\n\n if (!targets.length) {\n throw new Error('Invalid targets')\n }\n\n return this.execute({\n method: 'call.member.position.set',\n params: {\n self: {\n member_id: this.selfMember?.id,\n call_id: this.selfMember?.callId,\n node_id: this.selfMember?.nodeId,\n },\n targets,\n },\n })\n }\n\n public async lock() {\n if (!this.capabilities?.lock.on) {\n throw Error('Missing lock capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.lock',\n })\n }\n\n public async unlock() {\n if (!this.capabilities?.lock.off) {\n throw Error('Missing unlock capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unlock',\n })\n }\n}\n\nexport const isFabricRoomSession = (\n room: unknown\n): room is FabricRoomSession => {\n return room instanceof FabricRoomSessionConnection\n}\n\n/** @internal */\nexport const createFabricRoomSessionObject = (\n params: FabricRoomSessionOptions\n): FabricRoomSession => {\n const room = connect<\n FabricRoomSessionEvents,\n FabricRoomSessionConnection,\n FabricRoomSession\n >({\n store: params.store,\n Component: FabricRoomSessionConnection,\n })(params)\n\n return room\n}\n", "import jwtDecode from 'jwt-decode'\nimport { getLogger } from '@signalwire/core'\n\n/**\n * Note: ready to support RN with a \"storage.native.ts\" file.\n */\nexport const getStorage = () => {\n if (window && window.sessionStorage) {\n return window.sessionStorage\n }\n return undefined\n}\n\nexport const sessionStorageManager = (token: string) => {\n let roomName: string = ''\n try {\n const jwtPayload = jwtDecode<{ r: string; ja: string }>(token)\n roomName = jwtPayload?.r ?? ''\n } catch (e) {\n try {\n const jwtPayload = jwtDecode<{ typ: string}>(token, {header: true})\n roomName = jwtPayload.typ || ''\n } catch {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[sessionStorageManager] error decoding JWT', token)\n }\n roomName = ''\n }\n }\n\n const valid = Boolean(roomName)\n return {\n authStateKey: valid && `as-${roomName}`,\n protocolKey: valid && `pt-${roomName}`,\n callIdKey: valid && `ci-${roomName}`,\n }\n}\n", "export const PREVIOUS_CALLID_STORAGE_KEY = 'ci-SAT';", "import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n WebRTCMessageParams,\n} from '@signalwire/core'\nimport { WSClient } from '../WSClient'\n\ntype WSClientWorkerOnDone = () => void\ntype WSClientWorkerOnFail = (args: { error: Error }) => void\n\nexport type WSClientWorkerHooks = SDKWorkerHooks<\n WSClientWorkerOnDone,\n WSClientWorkerOnFail\n>\n\nexport const wsClientWorker: SDKWorker<WSClient, WSClientWorkerHooks> =\n function* (options): SagaIterator {\n getLogger().debug('wsClientWorker started')\n const { channels, initialState, instance: client } = options\n const { swEventChannel } = channels\n const { handleIncomingInvite } = initialState\n\n function* fireHoseWorker(action: SDKActions) {\n // @ts-expect-error Emit all events - This is for internal usage\n client.emit(action.type, action.payload)\n }\n\n function* vertoInviteWorker(action: MapToPubSubShape<WebRTCMessageParams>) {\n // Invoke WSClient function to build and answer the invite\n handleIncomingInvite(action.payload.params)\n }\n\n const isVertoInvite = (action: SDKActions) => {\n if (action.type === 'webrtc.message') {\n return action.payload.method === 'verto.invite'\n }\n return false\n }\n\n try {\n while (true) {\n // Take all actions from the channel\n const action: SDKActions = yield sagaEffects.take(\n swEventChannel,\n () => true\n )\n\n // Fire all the events with fireHoseWorker\n yield sagaEffects.fork(fireHoseWorker, action)\n\n // If the event is verto.invite, handle that with vertoInviteWorker\n if (isVertoInvite(action)) {\n getLogger().debug('Receiving a call over WebSocket', action)\n yield sagaEffects.fork(\n vertoInviteWorker,\n action as MapToPubSubShape<WebRTCMessageParams>\n )\n }\n }\n } finally {\n getLogger().trace('wsClientWorker ended')\n }\n }\n", "import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n ConversationEvent,\n} from '@signalwire/core'\nimport { Conversation } from '../Conversation'\nimport { WSClient } from '../WSClient'\n\ninterface ConversationWorkerInitialState {\n conversation: Conversation\n}\n\nexport const conversationWorker: SDKWorker<WSClient> = function* (\n options\n): SagaIterator {\n getLogger().debug('conversationWorker started')\n const {\n channels: { swEventChannel },\n initialState,\n } = options\n\n const { conversation } = initialState as ConversationWorkerInitialState\n\n const isConversationEvent = (action: SDKActions) => {\n return action.type.startsWith('conversation.')\n }\n\n while (true) {\n const action: MapToPubSubShape<ConversationEvent> = yield sagaEffects.take(\n swEventChannel,\n isConversationEvent\n )\n conversation.handleEvent(action.payload)\n }\n\n getLogger().trace('conversationWorker ended')\n}\n", "import {\n SDKWorker,\n SagaIterator,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n SDKActions,\n FabricAction,\n} from '@signalwire/core'\nimport { FabricRoomSessionConnection } from '../FabricRoomSession'\nimport { createFabricRoomSessionMemberObject } from '../FabricRoomSessionMember'\nimport { callSegmentWorker } from './callSegmentWorker'\nimport { MapToPubSubShape } from 'packages/core/dist/core/src'\n\nexport type FabricWorkerParams<T> =\n SDKWorkerParams<FabricRoomSessionConnection> & {\n action: MapToPubSubShape<T>\n }\n\nexport const fabricWorker: SDKWorker<FabricRoomSessionConnection> = function* (\n options\n): SagaIterator {\n getLogger().trace('fabricWorker started')\n const {\n channels: { swEventChannel },\n instance: cfRoomSession,\n } = options\n\n function* worker(action: FabricAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'call.joined': {\n // since we depend on `cfRoomSession.selfMember` on the take logic\n // we need to make sure we update the `cfRoomSession.selfMember`\n // in this worker or have a race condition.\n if (!cfRoomSession.selfMember) {\n const memberInstance = createFabricRoomSessionMemberObject({\n store: cfRoomSession.store,\n payload: {\n member: action.payload.room_session.members.find(\n (m) => m.member_id === action.payload.member_id\n )!,\n room_id: action.payload.room_id,\n room_session_id: action.payload.room_session_id,\n },\n })\n cfRoomSession.selfMember = memberInstance\n }\n\n // Segment worker for each call_id\n yield sagaEffects.fork(callSegmentWorker, {\n ...options,\n instance: cfRoomSession,\n action,\n })\n break\n }\n case 'call.state':\n cfRoomSession.emit(type, payload)\n break\n }\n }\n\n let firstCallJoinedReceived = false\n const isFirstCallJoinedorCallStateEvent = (action: SDKActions) => {\n if (action.type === 'call.state') {\n return true\n }\n\n if (action.type !== 'call.joined') {\n return false\n }\n\n // If this is the first call.joined event, verify the call origin ID\n if (!firstCallJoinedReceived) {\n const callId = action.payload.call_id\n const originCallId = action.payload.origin_call_id\n if (callId === originCallId) {\n firstCallJoinedReceived = true\n return true\n }\n return false // Discard all the call.joined event until the first call.joined is received\n }\n\n // If first call.joined event already received, only check the action type\n return true\n }\n\n while (true) {\n const action: FabricAction = yield sagaEffects.take(\n swEventChannel,\n isFirstCallJoinedorCallStateEvent\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('fabricWorker ended')\n}\n", "import {\n FabricMemberEventNames,\n FabricMemberEventParams,\n FabricMemberEventParamsExcludeTalking,\n FabricMemberJoinedEventParams,\n FabricMemberLeftEventParams,\n FabricMemberTalkingEventParams,\n FabricMemberUpdatedEventParams,\n FabricMemberContract,\n connect,\n MemberJoined,\n MemberLeft,\n MemberTalking,\n MemberUpdated,\n BaseComponentOptionsWithPayload,\n BaseComponent,\n} from '@signalwire/core'\n\nexport interface FabricRoomSessionMember extends FabricMemberContract {\n /** Unique id of this member. */\n id: string\n setPayload(payload: FabricMemberEventParams): void\n}\n\n// TODO: Fabric Room Session Member instance does not emit any events yet\nexport type FabricRoomSessionMemberEventsHandlerMap = Record<\n MemberJoined,\n (params: FabricMemberJoinedEventParams) => void\n> &\n Record<MemberUpdated, (params: FabricMemberUpdatedEventParams) => void> &\n Record<MemberLeft, (params: FabricMemberLeftEventParams) => void> &\n Record<MemberTalking, (params: FabricMemberTalkingEventParams) => void> &\n Record<\n Exclude<FabricMemberEventNames, MemberJoined | MemberLeft | MemberTalking>,\n (params: FabricMemberUpdatedEventParams) => void\n >\n\nexport type FabricRoomSessionMemberEvents = {\n [k in keyof FabricRoomSessionMemberEventsHandlerMap]: FabricRoomSessionMemberEventsHandlerMap[k]\n}\n\nexport interface FabricRoomSessionMemberOptions\n extends BaseComponentOptionsWithPayload<FabricMemberEventParamsExcludeTalking> {}\n\nexport class FabricRoomSessionMemberAPI\n extends BaseComponent<FabricRoomSessionMemberEvents>\n implements FabricMemberContract\n{\n private _payload: FabricMemberEventParamsExcludeTalking\n\n constructor(options: FabricRoomSessionMemberOptions) {\n super(options)\n this._payload = options.payload\n }\n\n get id() {\n return this._payload.member.member_id\n }\n\n get callId() {\n return this._payload.member.call_id\n }\n\n get nodeId() {\n return this._payload.member.node_id\n }\n\n get memberId() {\n return this.id\n }\n\n get roomSessionId() {\n return this._payload.room_session_id\n }\n\n get roomId() {\n return this._payload.room_id\n }\n\n get parentId() {\n return this._payload.member.parent_id\n }\n\n get name() {\n return this._payload.member.name\n }\n\n get type() {\n return this._payload.member.type\n }\n\n get requestedPosition() {\n return this._payload.member.requested_position\n }\n\n get currentPosition() {\n return this._payload.member.current_position\n }\n\n get meta() {\n return this._payload.member.meta\n }\n\n get handraised() {\n return this._payload.member.handraised\n }\n\n get talking() {\n return this._payload.member.talking\n }\n\n get audioMuted() {\n return this._payload.member.audio_muted\n }\n\n get videoMuted() {\n return this._payload.member.video_muted\n }\n\n get deaf() {\n return this._payload.member.deaf\n }\n\n get visible() {\n return this._payload.member.visible\n }\n\n get inputVolume() {\n return this._payload.member.input_volume\n }\n\n get outputVolume() {\n return this._payload.member.output_volume\n }\n\n get inputSensitivity() {\n return this._payload.member.input_sensitivity\n }\n\n get subscriberData() {\n return this._payload.member.subscriber_data\n }\n\n /** @internal */\n setPayload(payload: FabricMemberEventParams) {\n // Reshape the payload since the `member.talking` event does not return all the parameters of a member\n const newPayload = {\n ...this._payload,\n ...payload,\n member: {\n ...this._payload.member,\n ...payload.member,\n },\n }\n this._payload = newPayload\n }\n}\n\nexport const createFabricRoomSessionMemberObject = (\n params: FabricRoomSessionMemberOptions\n): FabricRoomSessionMember => {\n const member = connect<\n FabricRoomSessionMemberEventsHandlerMap,\n FabricRoomSessionMemberAPI,\n FabricRoomSessionMember\n >({\n store: params.store,\n Component: FabricRoomSessionMemberAPI,\n })(params)\n\n return member\n}\n", "import {\n FabricAction,\n CallJoinedEvent,\n SDKActions,\n SagaIterator,\n getLogger,\n sagaEffects,\n} from '@signalwire/core'\nimport { callLeftWorker } from './callLeftWorker'\nimport { callJoinWorker } from './callJoinWorker'\nimport { FabricWorkerParams } from './fabricWorker'\nimport {\n mapFabricLayoutActionToVideoLayoutAction,\n mapFabricMemberActionToVideoMemberJoinAndLeftAction,\n mapFabricMemberActionToVideoMemberUpdatedAction,\n} from '../utils/helpers'\nimport { fabricMemberWorker } from './fabricMemberWorker'\n\nexport const callSegmentWorker = function* (\n options: FabricWorkerParams<CallJoinedEvent>\n): SagaIterator {\n const {\n action,\n channels: { swEventChannel },\n instance: cfRoomSession,\n } = options\n const segmentCallId = action.payload.call_id\n const segmentRooSessionId = action.payload.room_session_id\n\n getLogger().debug(\n `callSegmentWorker started for: callId ${segmentCallId}, roomSessionId ${segmentRooSessionId}`\n )\n\n // Handles the `call.joined` event before the worker loop\n yield sagaEffects.fork(callJoinWorker, {\n ...options,\n action,\n })\n\n function* worker(action: FabricAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'call.joined':\n /** NOOP since this event is handled by the {@link fabricWorker} */\n break\n case 'call.left':\n // Wait for the `callLeftWorker` to finish and then stop this particular segment worker\n yield sagaEffects.call(callLeftWorker, {\n ...options,\n action,\n })\n return true\n case 'call.updated':\n cfRoomSession.emit(type, payload)\n cfRoomSession.emit('room.updated', payload)\n break\n case 'call.play':\n cfRoomSession.emit(type, payload)\n break\n case 'call.connect':\n cfRoomSession.emit(type, payload)\n break\n case 'call.room':\n cfRoomSession.emit(type, payload)\n break\n\n /**\n * The Core module includes a generic worker, {@link memberPositionWorker},\n * which listens for member & layout events to add a \"current_position\" parameter\n * and handle member \"updated\" parameter.\n * This worker in CF SDK is initialized by the {@link callJoinWorker} worker.\n *\n * To ensure compatibility, we map these events to Video SDK events and\n * re-publish them on the channel so that they can be processed by the\n * generic worker. Note that the generic worker only dispatches \"member.updated\"\n * and \"member.updated.*\" events.\n *\n * Additionally, the \"member.joined\" event is monitored by another worker,\n * {@link childMemberJoinedWorker}, specifically for the screen share API.\n */\n case 'member.joined':\n case 'member.left': {\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action,\n })\n const videoAction =\n mapFabricMemberActionToVideoMemberJoinAndLeftAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'member.updated': {\n const videoAction =\n mapFabricMemberActionToVideoMemberUpdatedAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'layout.changed': {\n // We need to update the layout event which is needed for rootElement.\n cfRoomSession.currentLayoutEvent = action.payload\n cfRoomSession.emit(type, payload)\n const videoAction = mapFabricLayoutActionToVideoLayoutAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'member.talking': {\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action,\n })\n break\n }\n default: {\n getLogger().warn('Got an unknown fabric event', action)\n }\n }\n\n return false\n }\n\n const isSegmentEvent = (action: SDKActions) => {\n const { type, payload } = action as FabricAction\n const shouldWatch =\n type.startsWith('call.') ||\n type.startsWith('member.') ||\n type.startsWith('layout.')\n const hasSegmentCallId =\n 'call_id' in payload && segmentCallId === payload.call_id\n const hasSegmentRoomSessionId =\n segmentRooSessionId === payload.room_session_id\n\n if (shouldWatch && (hasSegmentCallId || hasSegmentRoomSessionId)) {\n return true\n }\n\n return false\n }\n\n while (true) {\n const action: FabricAction = yield sagaEffects.take(\n swEventChannel,\n isSegmentEvent\n )\n const task = yield sagaEffects.fork(worker, action)\n\n /**\n * Wait for `worker` to finish and get its return value\n * Stop the `callSegmentWorker' if the returned value is true\n */\n const shouldStop = yield sagaEffects.join(task)\n if (shouldStop) return\n }\n}\n", "import { getLogger, SagaIterator, CallLeftEvent } from '@signalwire/core'\nimport { FabricWorkerParams } from './fabricWorker'\nimport { FabricRoomSessionMemberAPI } from '../FabricRoomSessionMember'\n\nexport const callLeftWorker = function* (\n options: FabricWorkerParams<CallLeftEvent>\n): SagaIterator {\n getLogger().trace('callLeftWorker started')\n\n const {\n action: { payload },\n instance: cfRoomSession,\n instanceMap,\n } = options\n\n const { room_session_id } = payload\n\n // Remove all the member instance where roomSessionId matches\n instanceMap.getAll().forEach(([key, obj]) => {\n if (\n obj instanceof FabricRoomSessionMemberAPI &&\n obj.roomSessionId === room_session_id\n ) {\n instanceMap.remove(key)\n }\n })\n\n cfRoomSession.emit('call.left', payload)\n cfRoomSession.emit('room.left', payload)\n\n getLogger().trace('callLeftWorker ended')\n}\n", "import {\n getLogger,\n SagaIterator,\n CallJoinedEvent,\n sagaEffects,\n MemberPosition,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport {\n createFabricRoomSessionMemberObject,\n FabricRoomSessionMember,\n} from '../FabricRoomSessionMember'\nimport { FabricWorkerParams } from './fabricWorker'\nimport { fabricMemberWorker } from './fabricMemberWorker'\nimport { mapCallJoinedToRoomSubscribedEventParams } from '../utils/helpers'\nimport { mapCapabilityPayload } from '../utils/capabilitiesHelpers'\n\nexport const callJoinWorker = function* (\n options: FabricWorkerParams<CallJoinedEvent>\n): SagaIterator {\n getLogger().trace('callJoinWorker started')\n const { action, instanceMap, instance: cfRoomSession } = options\n const { payload } = action\n const { get, set } = instanceMap\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n /**\n * The {@link memberPositionWorker} worker understands only the Video SDK events.\n * So, we need to map CF SDK event to Video SDK event.\n * Similar to what we do in the {@link callSegmentWorker}, for member events.\n */\n initialState: mapCallJoinedToRoomSubscribedEventParams(payload),\n dispatcher: function* (subType, subPayload) {\n /**\n * The {@link memberPositionWorker} dispatches the Video SDK events.\n * We need to convert it back to CF SDK event before emitting to the user.\n */\n const fabricType = stripNamespacePrefix(subType, 'video') as any\n const fabricPaylod = {\n ...subPayload,\n member: {\n ...subPayload.member,\n member_id: subPayload.member.id,\n },\n }\n\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action: { type: fabricType, payload: fabricPaylod },\n })\n },\n })\n\n payload.room_session.members?.forEach((member: any) => {\n let memberInstance = get<FabricRoomSessionMember>(member.member_id!)\n if (!memberInstance) {\n memberInstance = createFabricRoomSessionMemberObject({\n store: cfRoomSession.store,\n payload: {\n member: member,\n room_id: payload.room_id,\n room_session_id: payload.room_session_id,\n },\n })\n } else {\n memberInstance.setPayload({\n member: member,\n room_id: payload.room_id,\n room_session_id: payload.room_session_id,\n })\n }\n set<FabricRoomSessionMember>(member.member_id, memberInstance)\n })\n\n cfRoomSession.member = get<FabricRoomSessionMember>(payload.member_id)\n // the server send the capabilities payload as an array of string\n cfRoomSession.capabilities = mapCapabilityPayload(payload.capabilities)\n\n const fabricEvent = {\n ...payload,\n capabilities: cfRoomSession.capabilities,\n }\n\n cfRoomSession.emit('call.joined', fabricEvent)\n\n getLogger().trace('callJoinWorker ended')\n}\n", "import {\n FabricMemberEvent,\n FabricMemberUpdatedEventParams,\n MemberUpdatedEventNames,\n SagaIterator,\n fromSnakeToCamelCase,\n getLogger,\n} from '@signalwire/core'\nimport { FabricWorkerParams } from './fabricWorker'\nimport {\n createFabricRoomSessionMemberObject,\n FabricRoomSessionMember,\n} from '../FabricRoomSessionMember'\n\nexport const fabricMemberWorker = function* (\n options: FabricWorkerParams<FabricMemberEvent>\n): SagaIterator {\n getLogger().trace('fabricMemberWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n const memberId = payload.member.member_id\n let memberInstance = get<FabricRoomSessionMember>(memberId)\n if (!memberInstance && type !== 'member.talking') {\n memberInstance = createFabricRoomSessionMemberObject({\n store: roomSession.store,\n payload: payload,\n })\n }\n if (memberInstance) {\n memberInstance.setPayload(payload)\n }\n set<FabricRoomSessionMember>(memberId, memberInstance)\n\n if (type.startsWith('member.updated.')) {\n const clientType = fromSnakeToCamelCase(type) as MemberUpdatedEventNames\n roomSession.emit(clientType, payload as FabricMemberUpdatedEventParams)\n }\n\n switch (type) {\n case 'member.joined':\n roomSession.emit(type, payload)\n break\n case 'member.updated':\n roomSession.emit(type, payload)\n break\n case 'member.left':\n roomSession.emit(type, payload)\n remove<FabricRoomSessionMember>(memberId)\n break\n case 'member.talking':\n roomSession.emit(type, payload)\n break\n default:\n break\n }\n\n getLogger().trace('fabricMemberWorker ended')\n}\n", "import {\n CallJoinedEvent,\n CallJoinedEventParams,\n CallUpdatedEvent,\n CallUpdatedEventParams,\n FabricLayoutChangedEvent,\n FabricMemberJoinedEvent,\n FabricMemberJoinedEventParams,\n FabricMemberLeftEvent,\n FabricMemberLeftEventParams,\n FabricMemberTalkingEvent,\n FabricMemberTalkingEventParams,\n FabricMemberUpdatedEvent,\n FabricMemberUpdatedEventParams,\n InternalFabricMemberEntity,\n InternalFabricMemberEntityUpdated,\n InternalFabricRoomSessionEntity,\n InternalVideoMemberEntity,\n InternalVideoMemberEntityUpdated,\n InternalVideoRoomEntity,\n InternalVideoRoomSessionEntity,\n MapToPubSubShape,\n VideoLayoutChangedEvent,\n VideoMemberJoinedEvent,\n VideoMemberJoinedEventParams,\n VideoMemberLeftEvent,\n VideoMemberLeftEventParams,\n VideoMemberTalkingEvent,\n VideoMemberTalkingEventParams,\n VideoMemberUpdatedEvent,\n VideoMemberUpdatedEventParams,\n VideoRoomSubscribedEvent,\n VideoRoomSubscribedEventParams,\n VideoRoomUpdatedEvent,\n VideoRoomUpdatedEventParams,\n} from '@signalwire/core'\n\n/**\n * Map the InternalFabricMemberEntity to InternalVideoMemberEntity\n */\nexport const mapInternalFabricMemberToInternalVideoMemberEntity = (\n params: InternalFabricMemberEntity\n): InternalVideoMemberEntity => {\n return {\n id: params.member_id,\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n name: params.name,\n type: params.type,\n handraised: params.handraised,\n visible: params.visible,\n audio_muted: params.audio_muted,\n video_muted: params.video_muted,\n deaf: params.deaf,\n input_volume: params.input_volume,\n output_volume: params.output_volume,\n input_sensitivity: params.input_sensitivity,\n meta: params.meta,\n talking: params.talking,\n current_position: params.current_position,\n requested_position: params.requested_position,\n parent_id: params.parent_id,\n }\n}\n\n/**\n * Map the InternalFabricMemberEntityUpdated to InternalVideoMemberEntityUpdated\n */\nexport const mapInternalFabricMemberToInternalVideoMemberUpdatedEntity = (\n params: InternalFabricMemberEntityUpdated\n): InternalVideoMemberEntityUpdated => {\n return {\n ...mapInternalFabricMemberToInternalVideoMemberEntity(params),\n updated: params.updated.map((key) =>\n key === 'member_id' ? 'id' : (key as keyof InternalVideoMemberEntity)\n ),\n }\n}\n\n/**\n * Map InternalFabricRoomSessionEntity to InternalVideoRoomEntity\n */\nexport const mapInternalFabricRoomToInternalVideoRoomEntity = (\n params: InternalFabricRoomSessionEntity\n): InternalVideoRoomEntity => {\n return {\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n event_channel: params.event_channel,\n name: params.name,\n recording: params.recording,\n hide_video_muted: params.hide_video_muted,\n preview_url: params.preview_url,\n recordings: params.recordings,\n playbacks: params.playbacks,\n streams: params.streams,\n prioritize_handraise: params.prioritize_handraise,\n }\n}\n\n/**\n * Map InternalFabricRoomSessionEntity to InternalVideoRoomSessionEntity\n */\nexport const mapInternalFabricRoomToInternalVideoRoomSessionEntity = (\n params: InternalFabricRoomSessionEntity\n): InternalVideoRoomSessionEntity => {\n return {\n id: params.id,\n display_name: params.display_name,\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n event_channel: params.event_channel,\n name: params.name,\n recording: params.recording,\n recordings: params.recordings,\n playbacks: params.playbacks,\n hide_video_muted: params.hide_video_muted,\n preview_url: params.preview_url,\n layout_name: params.layout_name,\n locked: params.locked,\n meta: params.meta,\n members: params.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n streaming: params.streaming,\n streams: params.streams,\n prioritize_handraise: params.prioritize_handraise,\n updated: params.updated,\n }\n}\n\n/**\n * Map the \"call.joined\" event params to \"video.room.subscribed\" event params\n */\nexport const mapCallJoinedToRoomSubscribedEventParams = (\n params: CallJoinedEventParams\n): VideoRoomSubscribedEventParams => {\n return {\n call_id: params.call_id,\n member_id: params.member_id,\n room: {\n ...mapInternalFabricRoomToInternalVideoRoomEntity(params.room_session),\n members: params.room_session.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n },\n room_session: {\n ...mapInternalFabricRoomToInternalVideoRoomSessionEntity(\n params.room_session\n ),\n members: params.room_session.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n },\n }\n}\n\n/**\n * Map the \"call.joined\" action to \"video.room.subscribed\" action\n */\nexport const mapCallJoinedToRoomSubscribedAction = (\n action: MapToPubSubShape<CallJoinedEvent>\n): MapToPubSubShape<VideoRoomSubscribedEvent> => {\n return {\n type: `video.room.subscribed`,\n payload: mapCallJoinedToRoomSubscribedEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"call.updated\" event params to \"video.room.updated\" event params\n */\nexport const mapCallUpdatedToRoomUpdatedEventParams = (\n params: CallUpdatedEventParams\n): VideoRoomUpdatedEventParams => {\n return {\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n room: mapInternalFabricRoomToInternalVideoRoomEntity(params.room_session),\n room_session: mapInternalFabricRoomToInternalVideoRoomSessionEntity(\n params.room_session\n ),\n }\n}\n\n/**\n * Map the \"call.updated\" action to \"video.room.updated\" action\n */\nexport const mapCallUpdatedToRoomUpdatedEventAction = (\n action: MapToPubSubShape<CallUpdatedEvent>\n): MapToPubSubShape<VideoRoomUpdatedEvent> => {\n return {\n type: `video.room.updated`,\n payload: mapCallUpdatedToRoomUpdatedEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"member.joined\" and \"member.left\" event params\n * to \"video.member.joined\" and \"video.member.left\" event params\n */\nexport const mapFabricMemberToVideoMemberJoinAndLeftEventParams = (\n params: FabricMemberJoinedEventParams | FabricMemberLeftEventParams\n): VideoMemberJoinedEventParams | VideoMemberLeftEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: mapInternalFabricMemberToInternalVideoMemberEntity(params.member),\n }\n}\n\n/**\n * Map the \"member.joined\" and \"member.left\" actions\n * to \"video.member.joined\" and \"video.member.left\" actions\n */\nexport const mapFabricMemberActionToVideoMemberJoinAndLeftAction = (\n action: MapToPubSubShape<FabricMemberJoinedEvent | FabricMemberLeftEvent>\n): MapToPubSubShape<VideoMemberJoinedEvent | VideoMemberLeftEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberToVideoMemberJoinAndLeftEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"member.updated\" event params to \"video.member.updated\" event params\n */\nexport const mapFabricMemberEventToVideoMemberUpdatedEventParams = (\n params: FabricMemberUpdatedEventParams\n): VideoMemberUpdatedEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: mapInternalFabricMemberToInternalVideoMemberUpdatedEntity(\n params.member\n ),\n }\n}\n\n/**\n * Map the \"member.updated\" action to \"video.member.updated\" action\n */\nexport const mapFabricMemberActionToVideoMemberUpdatedAction = (\n action: MapToPubSubShape<FabricMemberUpdatedEvent>\n): MapToPubSubShape<VideoMemberUpdatedEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberEventToVideoMemberUpdatedEventParams(\n action.payload\n ),\n }\n}\n\n/**\n * Map the \"member.talking\" event params to \"video.member.talking\" event params\n */\nexport const mapFabricMemberToVideoMemberTalkingEventParams = (\n params: FabricMemberTalkingEventParams\n): VideoMemberTalkingEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: {\n id: params.member.member_id,\n talking: params.member.talking,\n },\n }\n}\n\n/**\n * Map the \"member.talking\" action to \"video.member.talking\" action\n */\nexport const mapFabricMemberActionToVideoMemberTalkingAction = (\n action: MapToPubSubShape<FabricMemberTalkingEvent>\n): MapToPubSubShape<VideoMemberTalkingEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberToVideoMemberTalkingEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"layout.changed\" action to \"video.layout.changed\" action\n */\nexport const mapFabricLayoutActionToVideoLayoutAction = (\n action: MapToPubSubShape<FabricLayoutChangedEvent>\n): MapToPubSubShape<VideoLayoutChangedEvent> => {\n return {\n type: `video.${action.type}`,\n payload: action.payload,\n }\n}\n", "import { CallCapabilitiesContract, CapabilityOnOffStateContract, MemberCapabilityContract } from \"../interfaces/capabilities\"\n\nclass CapabilityOnOffState implements CapabilityOnOffStateContract {\n constructor(private _flags: string[]) { }\n\n get on() {\n return this._flags.some((flag) => !flag.endsWith('.off'))\n }\n\n get off() {\n return this._flags.some((flag) => !flag.endsWith('.on'))\n }\n}\n\nclass MemberCapability implements MemberCapabilityContract {\n private _muteAudio?: CapabilityOnOffState\n private _muteVideo?: CapabilityOnOffState\n private _deaf?: CapabilityOnOffState\n \n constructor(\n private _flags: string[],\n private _memberType: 'self' | 'member'\n ) { }\n\n get muteAudio() {\n this._muteAudio =\n this._muteAudio ??\n new CapabilityOnOffState(\n this._flags.filter(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.mute` ||\n flag.startsWith(`${this._memberType}.mute.audio`)\n )\n )\n return this._muteAudio\n }\n\n get muteVideo() {\n this._muteVideo =\n this._muteVideo ??\n new CapabilityOnOffState(\n this._flags.filter(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.mute` ||\n flag.startsWith(`${this._memberType}.mute.video`)\n )\n )\n return this._muteVideo\n }\n\n get microphoneVolume() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.microphone` ||\n flag.startsWith(`${this._memberType}.microphone.volume`)\n )\n }\n\n get microphoneSensitivity() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.microphone` ||\n flag.startsWith(`${this._memberType}.microphone.sensitivity`)\n )\n }\n\n get speakerVolume() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.speaker` ||\n flag.startsWith(`${this._memberType}.speaker.volume`)\n )\n }\n\n get deaf() {\n this._deaf =\n this._deaf ??\n new CapabilityOnOffState(\n this._flags.filter(\n (flag) => flag === this._memberType ||\n flag.startsWith(`${this._memberType}.deaf`)\n )\n )\n return this._deaf\n }\n\n get raisehand() {\n return {\n on: true,\n off: true\n }\n // TODO: uncomment once the server add this capability \n // this._raisehand =\n // this._raisehand ??\n // new CapabilityOnOffState(\n // this._flags.filter(\n // (flag) => flag === this._memberType ||\n // flag.startsWith(`${this._memberType}.raisehand`)\n // )\n // )\n // return this._raisehand\n }\n\n get position() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag.startsWith(`${this._memberType}.position`)\n )\n }\n\n get meta() {\n return this._flags.some(\n (flag) => flag === this._memberType || flag.startsWith(`${this._memberType}.meta`)\n )\n }\n\n get remove() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag.startsWith(`${this._memberType}.remove`)\n )\n }\n}\n\nexport class CallCapabilities implements CallCapabilitiesContract {\n private _self?: MemberCapabilityContract\n private _member?: MemberCapabilityContract\n private _vmutedHide?: CapabilityOnOffState\n private _lock?: CapabilityOnOffState\n\n constructor(private _flags: string[]) { }\n\n private _buildMemberCapability(memberType: 'self' | 'member') {\n return new MemberCapability(\n this._flags.filter((flag) => flag.startsWith(memberType)),\n memberType\n )\n }\n\n get self() {\n this._self = this._self ?? this._buildMemberCapability('self')\n return this._self\n }\n\n get member() {\n this._member = this._member ?? this._buildMemberCapability('member')\n return this._member\n }\n\n get end() {\n return this._flags.some((capability) => capability === 'end')\n }\n\n get setLayout() {\n return this._flags.some((capability) => capability.startsWith('layout'))\n }\n\n get sendDigit() {\n return this._flags.some((capability) => capability.startsWith('digit'))\n }\n\n get vmutedHide() {\n this._vmutedHide =\n this._vmutedHide ??\n new CapabilityOnOffState(\n this._flags.filter((flag) => flag.startsWith('vmuted'))\n )\n return this._vmutedHide\n }\n\n get lock() {\n this._lock =\n this._lock ??\n new CapabilityOnOffState(\n this._flags.filter((flag) => flag.startsWith('lock'))\n )\n return this._lock\n }\n\n get device() {\n return this._flags.some((capability) => capability === 'device')\n }\n\n get screenshare() {\n return this._flags.some((capability) => capability === 'screenshare')\n }\n}\n\nexport const mapCapabilityPayload = (capabilities: string[]) =>\n new CallCapabilities(capabilities)", "import jwtDecode from 'jwt-decode'\nimport {\n BaseJWTSession,\n getLogger,\n SessionOptions,\n SwAuthorizationState,\n type SWCloseEvent,\n} from '@signalwire/core'\nimport { getStorage, sessionStorageManager } from './utils/storage'\nimport { SwCloseEvent } from './utils/CloseEvent'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public CloseEventConstructor = SwCloseEvent\n public agent = process.env.SDK_PKG_AGENT!\n\n private tokenTyp: string\n\n constructor(public options: SessionOptions) {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<{ ch?: string; typ: string }>(options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: decodedJwt?.ch || options.host,\n })\n this.tokenTyp = decodedJwt.typ ?? 'VRT'\n }\n\n get allowReattach() {\n // @ts-expect-error\n return this.options?.reattach !== false && (this.isVRT() || this.isSAT())\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowReattach) {\n return ''\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Search protocol for', protocolKey)\n return getStorage()?.getItem(protocolKey) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowReattach) {\n return\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Persist protocol', protocolKey, this.relayProtocol)\n getStorage()?.setItem(protocolKey, this.relayProtocol)\n }\n }\n\n protected override async retrieveSwAuthorizationState() {\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n return getStorage()?.getItem(authStateKey) ?? ''\n }\n return ''\n }\n\n protected override async persistSwAuthorizationState(\n state: SwAuthorizationState\n ) {\n if (!this.allowReattach) {\n return\n }\n\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n this.logger.trace('Persist auth state', authStateKey, state)\n getStorage()?.setItem(authStateKey, state)\n }\n }\n\n protected override _onSocketClose(event: SWCloseEvent) {\n if (this.status === 'unknown' || this.status === 'disconnected') {\n const { protocolKey, authStateKey, callIdKey } = sessionStorageManager(\n this.options.token\n )\n this.logger.debug('Cleaning up storage')\n if (protocolKey) {\n this.logger.debug('Remove protocolKey', protocolKey)\n getStorage()?.removeItem(protocolKey)\n }\n if (authStateKey) {\n this.logger.debug('Remove authStateKey', authStateKey)\n getStorage()?.removeItem(authStateKey)\n }\n if (callIdKey) {\n this.logger.debug('Remove callIdKey', callIdKey)\n getStorage()?.removeItem(callIdKey)\n }\n }\n\n super._onSocketClose(event)\n }\n\n private isVRT() {\n return this.tokenTyp === 'VRT'\n }\n\n private isSAT() {\n return this.tokenTyp === 'SAT'\n }\n}\n", "import { SWCloseEvent as CoreCloseEvent } from '@signalwire/core'\n\nconst SwCloseEvent =\n typeof CloseEvent === 'function' ? CloseEvent : CoreCloseEvent\n\nexport { SwCloseEvent }\n", "import type {\n ChatContract,\n ConsumerContract,\n UserOptions,\n Chat as ChatNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends ChatNamespace.BaseChatApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends ChatContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'getAllowedChannels',\n 'setMemberState',\n]\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 const Client = function (chatOptions: ClientOptions) {\n const client = createClient(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 const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n", "import { PubSub } from '@signalwire/core'\nimport { PagingCursor } from '../utils/interfaces'\nimport PubSubMessage = PubSub.PubSubMessage\n\nexport * from './Client'\n\nexport {\n PubSubMessage,\n PagingCursor\n}\n", "import type {\n Rooms,\n VideoLayoutEventNames,\n VideoRoomSessionEventNames,\n VideoRoomEventParams,\n InternalVideoMemberEntity,\n InternalVideoMemberEntityUpdated,\n VideoMemberEventNames,\n MemberUpdated,\n MemberUpdatedEventNames,\n MemberTalkingEventNames,\n VideoMemberTalkingEventParams,\n RTCTrackEventName,\n InternalVideoMemberUpdatableProps,\n VideoRecordingEventNames,\n VideoPlaybackEventNames,\n RoomSessionRecording,\n RoomSessionPlayback,\n VideoRoomSessionContract as CoreVideoRoomSessionContract,\n OnlyFunctionProperties,\n MemberListUpdated,\n VideoPositions,\n RoomAudienceCount,\n VideoRoomAudienceCountEventParams,\n RoomLeft,\n RoomLeftEventParams,\n VideoStreamEventNames,\n RoomSessionStream,\n RoomJoined,\n RoomSubscribed,\n VideoRoomSubscribedEventParams,\n VideoAuthorization,\n VideoRoomDeviceUpdatedEventNames,\n DeviceUpdatedEventParams,\n VideoRoomDeviceDisconnectedEventNames,\n DeviceDisconnectedEventParams,\n VideoRoomDeviceEventNames,\n VideoLayoutChangedEventParams,\n VideoPosition,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { INTERNAL_MEMBER_UPDATABLE_PROPS } from '@signalwire/core'\nimport type { MediaEventNames } from '@signalwire/webrtc'\nimport type { RoomSessionDevice } from '../../RoomSessionDevice'\nimport type { RoomSessionScreenShare } from '../../RoomSessionScreenShare'\nimport { RoomSession } from '../../video/RoomSession'\n\n/**\n * @privateRemarks\n * Every other package exposing a `VideoMemberEntity` is\n * transforming the server payload into something else, with\n * the most significant change being converting properties\n * from snake to camel case. The `js` package, on the other\n * hand, exposes the server payload pretty much as is (as of\n * v3) so what we consider internal (sdk and server) in\n * other packages is external (user facing) for `js`. Same\n * applies to `VideoMemberEntityUpdated` since it's just a\n * derived type.\n */\ntype VideoMemberEntity = InternalVideoMemberEntity\ntype VideoMemberEntityUpdated = InternalVideoMemberEntityUpdated\n\nconst INTERNAL_MEMBER_UPDATED_EVENTS = Object.keys(\n INTERNAL_MEMBER_UPDATABLE_PROPS\n).map((key) => {\n return `member.updated.${\n key as keyof InternalVideoMemberUpdatableProps\n }` as const\n})\n/** @deprecated */\nexport type DeprecatedMemberUpdatableProps =\n (typeof INTERNAL_MEMBER_UPDATED_EVENTS)[number]\n/** @deprecated */\nexport type DeprecatedVideoMemberHandlerParams = {\n member: InternalVideoMemberEntity\n}\nexport type VideoMemberHandlerParams = { member: VideoMemberEntity }\nexport type VideoMemberUpdatedHandlerParams = {\n member: VideoMemberEntityUpdated\n room_id?: string\n room_session_id?: string\n}\nexport type VideoMemberListUpdatedParams = { members: VideoMemberEntity[] }\n\n/**\n * List of all the events a RoomObject can listen to\n */\nexport type RoomEventNames =\n | VideoRoomSessionEventNames\n | VideoMemberEventNames\n | VideoLayoutEventNames\n | VideoRecordingEventNames\n | VideoPlaybackEventNames\n | VideoStreamEventNames\n | RTCTrackEventName\n\nexport type RoomSessionObjectEventsHandlerMap = Record<\n VideoRoomDeviceEventNames,\n (params: DeviceUpdatedEventParams) => void\n> &\n Record<\n VideoLayoutEventNames,\n (params: VideoLayoutChangedEventParams) => void\n > &\n Record<\n Exclude<\n VideoMemberEventNames,\n MemberUpdated | MemberUpdatedEventNames | MemberListUpdated\n >,\n (params: VideoMemberHandlerParams) => void\n > &\n Record<\n Extract<VideoMemberEventNames, MemberUpdated | MemberUpdatedEventNames>,\n (params: VideoMemberUpdatedHandlerParams) => void\n > &\n Record<\n Extract<VideoMemberEventNames, MemberListUpdated>,\n (params: VideoMemberListUpdatedParams) => void\n > &\n Record<\n DeprecatedMemberUpdatableProps,\n (params: DeprecatedVideoMemberHandlerParams) => void\n > &\n Record<\n MemberTalkingEventNames,\n (params: VideoMemberTalkingEventParams) => void\n > &\n Record<\n Exclude<VideoRoomSessionEventNames, RoomLeft | RoomJoined | RoomSubscribed>,\n (params: VideoRoomEventParams) => void\n > &\n Record<\n RoomJoined | RoomSubscribed,\n (params: VideoRoomSubscribedEventParams) => void\n > &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void> &\n Record<\n VideoRoomDeviceUpdatedEventNames,\n (params: DeviceUpdatedEventParams) => void\n > &\n Record<\n VideoRoomDeviceDisconnectedEventNames,\n (params: DeviceDisconnectedEventParams) => void\n > &\n Record<\n RoomAudienceCount,\n (params: VideoRoomAudienceCountEventParams) => void\n > &\n Record<RTCTrackEventName, (event: RTCTrackEvent) => void> &\n Record<VideoRecordingEventNames, (recording: RoomSessionRecording) => void> &\n Record<VideoPlaybackEventNames, (recording: RoomSessionPlayback) => void> &\n Record<BaseConnectionState, (params: RoomSession) => void> &\n Record<VideoStreamEventNames, (stream: RoomSessionStream) => void>\n\n// @deprecated Please use {@link VideoRoomSessionEvents}\nexport type RoomSessionObjectEvents = {\n [k in keyof RoomSessionObjectEventsHandlerMap]: RoomSessionObjectEventsHandlerMap[k]\n}\n\nexport type VideoRoomSessionEvents = {\n [k in keyof RoomSessionObjectEventsHandlerMap]: RoomSessionObjectEventsHandlerMap[k]\n}\n\nexport type StartScreenShareOptions = {\n /** Whether the screen share object should automatically join the room */\n autoJoin?: boolean\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 layout?: string\n positions?: VideoPositions\n}\n\n/**\n * @deprecated Use {@link StartScreenShareOptions} instead.\n */\nexport interface CreateScreenShareObjectOptions\n extends StartScreenShareOptions {}\n\nexport type AddDeviceOptions = {\n autoJoin?: boolean\n audio?: MediaStreamConstraints['audio']\n video?: MediaStreamConstraints['video']\n}\n\nexport type AddCameraOptions = MediaTrackConstraints & {\n autoJoin?: boolean\n}\nexport type AddMicrophoneOptions = MediaTrackConstraints & {\n autoJoin?: boolean\n}\n\nexport interface MemberCommandParams {\n memberId?: string\n}\nexport interface MemberCommandWithVolumeParams extends MemberCommandParams {\n volume: number\n}\nexport interface MemberCommandWithValueParams extends MemberCommandParams {\n value: number\n}\n\nexport interface BaseRoomInterface {\n join(): Promise<unknown>\n leave(): Promise<unknown>\n}\n\ninterface RoomMemberSelfMethodsInterface {\n /**\n * Puts the microphone on mute. The other participants will not hear audio\n * from the muted device anymore.\n *\n * @permissions\n * - `room.self.audio_mute`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example Muting the microphone:\n * ```typescript\n * await roomdevice.audioMute()\n * ```\n */\n audioMute(): Rooms.AudioMuteMember\n\n /**\n * Unmutes the microphone if it had been previously muted.\n *\n * @permissions\n * - `room.self.audio_unmute`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example Unmuting the microphone:\n * ```typescript\n * await roomdevice.audioUnmute()\n * ```\n */\n audioUnmute(): Rooms.AudioUnmuteMember\n\n /**\n * Puts the video on mute. Participants will see a mute image instead of the\n * video stream.\n *\n * @permissions\n * - `room.self.video_mute`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example Muting the camera:\n * ```typescript\n * await roomdevice.videoMute()\n * ```\n */\n videoMute(): Rooms.VideoMuteMember\n\n /**\n * Unmutes the video if it had been previously muted. Participants will start\n * seeing the video stream again.\n *\n * @permissions\n * - `room.self.video_unmute`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example Unmuting the camera:\n * ```typescript\n * await roomdevice.videoUnmute()\n * ```\n */\n videoUnmute(): Rooms.VideoUnmuteMember\n\n /**\n * @deprecated Use {@link setInputVolume} instead.\n */\n setMicrophoneVolume(params: { volume: number }): Rooms.SetInputVolumeMember\n\n /**\n * Sets the input volume level (e.g. for the microphone).\n * @param params\n * @param params.volume desired volume. Values range from -50 to 50, with a\n * default of 0.\n *\n * @permissions\n * - `room.self.set_input_volume`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example\n * ```typescript\n * await roomdevice.setMicrophoneVolume({volume: -10})\n * ```\n */\n setInputVolume(params: { volume: number }): Rooms.SetInputVolumeMember\n\n /**\n * Sets the input level at which the participant is identified as currently\n * speaking.\n * @param params\n * @param params.value desired sensitivity. The default value is 30 and the\n * scale goes from 0 (lowest sensitivity, essentially muted) to 100 (highest\n * sensitivity).\n *\n * @permissions\n * - `room.self.set_input_sensitivity`\n *\n * You need to specify the permissions when [creating the Video Room\n * Token](https://developer.signalwire.com/apis/reference/create_room_token)\n * on the server side.\n *\n * @example\n * ```typescript\n * await roomdevice.setInputSensitivity({value: 80})\n * ```\n */\n setInputSensitivity(params: {\n value: number\n }): Rooms.SetInputSensitivityMember\n}\n\n/**\n * We are using these interfaces in combination of\n * Object.defineProperties() to avoid code duplication and\n * expose a nice documentation via TypeDoc. The interface\n * forces TS checking while Object.defineProperties allow us\n * flexibility across different objects.\n */\nexport interface VideoRoomSessionMethods\n extends OnlyFunctionProperties<CoreVideoRoomSessionContract> {\n /** @deprecated Use {@link setVideoMuted} instead */\n hideVideoMuted(): Rooms.HideVideoMuted\n /** @deprecated Use {@link setVideoMuted} instead */\n showVideoMuted(): Rooms.ShowVideoMuted\n}\n\nexport interface VideoRoomSessionContract {\n deviceList: RoomSessionDevice[]\n interactivityMode: VideoAuthorization['join_as']\n permissions: VideoAuthorization['scopes']\n /** The `layout.changed` event based on the current room layout */\n currentLayoutEvent: VideoLayoutChangedEventParams\n /** The layout returned from the `layout.changed` event based on the current room layout */\n currentLayout: VideoLayoutChangedEventParams['layout']\n /** The current position of the member returned from the `layout.changed` event */\n currentPosition: VideoPosition | undefined\n /**\n * Joins the room session.\n */\n join(options?: BaseRoomSessionJoinParams): Promise<VideoRoomSessionContract>\n /**\n * Adds a screen sharing instance to the room. You can create multiple screen\n * sharing instances and add all of them to the room.\n * @param opts - {@link CreateScreenShareObjectOptions}\n * @returns - {@link RoomSessionScreenShare}\n *\n * @deprecated Use {@link startScreenShare} instead.\n */\n createScreenShareObject(\n opts?: CreateScreenShareObjectOptions\n ): Promise<RoomSessionScreenShare>\n /**\n * Adds a camera device to the room. Using this method, a user can stream\n * multiple video sources at the same time.\n *\n * @param opts - Specify the constraints for the device. In addition, you can\n * add the `autoJoin` key to specify whether the device should immediately\n * join the room or joining will be performed manually later. {@link AddCameraOptions}\n * @returns - {@link RoomSessionDevice}\n *\n * @example Adding a specific camera:\n * ```typescript\n * await roomSession.addCamera({deviceId: \"gOtMHwZdoA6wMlAnhbfTmeRgPAsqa7iw1OwgKYtbTLA=\"})\n * ```\n */\n addCamera(opts: AddCameraOptions): Promise<RoomSessionDevice>\n /**\n * Adds a microphone device to the room. Using this method, a user can stream\n * multiple video sources at the same time.\n *\n * @param opts Specify the constraints for the device. In addition, you can\n * add the `autoJoin` key to specify whether the device should immediately\n * join the room or joining will be performed manually later. {@link AddMicrophoneOptions}\n * @returns - {@link RoomSessionDevice}\n *\n * @example Adding a specific microphone:\n * ```typescript\n * await roomSession.addMicrophone({deviceId: \"PIn/IIDDgBUHzJkhRncv1m85hX1gC67xYIgJvvThB3Q=\"})\n * ```\n */\n addMicrophone(opts: AddMicrophoneOptions): Promise<RoomSessionDevice>\n /**\n * Adds a device to the room. Using this method, a user can stream multiple\n * sources at the same time. If you need to add a camera device or a\n * microphone device, you can alternatively use the more specific methods\n * {@link addCamera} and {@link addMicrophone}.\n *\n * @param opts Specify the constraints for the device. In addition, you can\n * add the `autoJoin` key to specify whether the device should immediately\n * join the room or joining will be performed manually later. {@link AddDeviceOptions}\n * @returns - {@link RoomSessionDevice}\n *\n * @example Adding any of the microphone devices to the room (duplicate\n * streams are possible):\n * ```typescript\n * await roomSession.addDevice({audio: true})\n * ```\n */\n addDevice(opts: AddDeviceOptions): Promise<RoomSessionDevice>\n}\n\nexport interface RoomSessionDeviceMethods\n extends RoomMemberSelfMethodsInterface {}\n\nexport interface RoomScreenShareMethods\n extends RoomMemberSelfMethodsInterface {}\n\nexport interface BaseRoomSessionJoinParams {\n audio?: MediaStreamConstraints['audio']\n video?: MediaStreamConstraints['video']\n receiveAudio?: boolean\n receiveVideo?: boolean\n sendAudio?: boolean\n sendVideo?: boolean\n}\n\nexport type PagingCursor =\n | {\n before: string\n after?: never\n }\n | {\n before?: never\n after: string\n }\n\nexport type AudioElement = HTMLAudioElement & {\n sinkId?: string\n setSinkId?: (id: string) => Promise<void>\n}\n", "import type {\n PubSubContract,\n ConsumerContract,\n UserOptions,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends PubSubNamespace.BasePubSubApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends PubSubContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'getAllowedChannels',\n 'subscribe',\n 'publish',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { PubSub } from '@signalwire/js'\n *\n * const pubSubClient = new PubSub.Client({\n * token: '<your pubSub token>', // get this from the REST APIs\n * })\n *\n * await pubSubClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * pubSubClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await pubSubClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a pubSub\n * Client object.\n */\nexport const Client = function (pubSubOptions: ClientOptions) {\n const client = createClient(pubSubOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.pubSub[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (pubSubOptions: ClientOptions): Client }\n", "export * from './SignalWire'\nexport * from './interfaces'\nexport { isFabricRoomSession } from './FabricRoomSession'\n", "import jwtDecode from 'jwt-decode'\nimport { getLogger, HttpError, type UserOptions } from '@signalwire/core'\nimport type {\n GetAddressResponse,\n GetAddressesParams,\n RegisterDeviceParams,\n UnregisterDeviceParams,\n RegisterDeviceResponse,\n GetAddressParams,\n GetAddressResult,\n GetAddressesResponse,\n GetAddressesResult,\n RegisterDeviceResult,\n GetSubscriberInfoResponse,\n GetSubscriberInfoResult,\n} from './interfaces'\nimport { CreateHttpClient, createHttpClient } from './createHttpClient'\nimport { buildPaginatedResult } from '../utils/paginatedResult'\nimport { makeQueryParamsUrls } from '../utils/makeQueryParamsUrl'\nimport {\n isGetAddressByIdParams,\n isGetAddressByNameParams,\n isGetAddressesResponse,\n} from './utils/typeGuard'\nimport { HTTPClientContract } from './interfaces/httpClient'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\n// TODO: extends from a Base class to share from core\nexport class HTTPClient implements HTTPClientContract {\n private httpClient: CreateHttpClient\n\n constructor(public options: UserOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.httpHost}`,\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n })\n }\n\n get fetch(): CreateHttpClient {\n return this.httpClient\n }\n\n get httpHost() {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<JWTHeader>(this.options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n // Shouldn't this be other way around?\n const host = this.options.host || decodedJwt?.ch\n if (!host) {\n return 'fabric.signalwire.com'\n }\n return `fabric.${host.split('.').splice(1).join('.')}`\n }\n\n public async getAddress(params: GetAddressParams): Promise<GetAddressResult> {\n let path = '/api/fabric/addresses'\n if (isGetAddressByNameParams(params)) {\n path = `${path}?name=${params.name}`\n } else if (isGetAddressByIdParams(params)) {\n path = `${path}/${params.id}`\n }\n\n const { body } = await this.httpClient<\n GetAddressResponse | GetAddressesResponse\n >(path)\n if (isGetAddressesResponse(body)) {\n // FIXME until the server handles a index lookup by name we need to handle it as a search result\n if (!body.data[0]) throw new HttpError(404, 'Not Found')\n return body.data[0]\n }\n return body\n }\n\n public async getAddresses(\n params?: GetAddressesParams\n ): Promise<GetAddressesResult> {\n const { type, displayName, pageSize, sortBy, sortOrder } = params || {}\n\n let path = '/api/fabric/addresses'\n\n const queryParams = new URLSearchParams()\n if (type) {\n queryParams.append('type', type)\n }\n if (displayName) {\n queryParams.append('display_name', displayName)\n }\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n if (sortBy) {\n queryParams.append('sort_by', sortBy)\n }\n\n if (sortOrder) {\n queryParams.append('sort_order', sortOrder)\n }\n\n const queryUrl = makeQueryParamsUrls(path, queryParams)\n getLogger().debug(`[getAddresses] query URL ${queryUrl}`)\n const { body } = await this.httpClient<GetAddressesResponse>(queryUrl)\n\n return buildPaginatedResult(body, this.httpClient)\n }\n\n public async registerDevice(\n params: RegisterDeviceParams\n ): Promise<RegisterDeviceResult> {\n const { deviceType, deviceToken } = params\n\n const path = '/subscriber/devices' as const\n const { body } = await this.httpClient<RegisterDeviceResponse>(path, {\n method: 'POST',\n body: {\n device_type: deviceType,\n device_token: deviceToken,\n },\n })\n\n return body\n }\n\n public async unregisterDevice(params: UnregisterDeviceParams) {\n const { id } = params\n\n const path = `/subscriber/devices/${id}` as const\n await this.httpClient<void>(path, {\n method: 'DELETE',\n })\n }\n\n public async getSubscriberInfo(): Promise<GetSubscriberInfoResult> {\n let path = '/api/fabric/subscriber/info'\n\n const { body } = await this.httpClient<GetSubscriberInfoResponse>(path)\n\n return body\n }\n}\n", "import { AuthError, HttpError } from '@signalwire/core'\n\ninterface InternalHttpResponse<T> extends Response {\n parsedBody?: T\n}\n\nasync function http<T>(\n input: string,\n init: RequestInit | undefined\n): Promise<InternalHttpResponse<T>> {\n const response: InternalHttpResponse<T> = await fetch(input, init)\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthError(response.status, 'Unauthorized')\n }\n\n let errorResponse\n try {\n errorResponse = await response.json()\n } catch (e) {}\n\n const errorMessage = errorResponse?.errors\n ? JSON.stringify(errorResponse.errors)\n : 'Not Found'\n\n throw new HttpError(response.status, errorMessage, errorResponse)\n }\n\n try {\n // might throw if body is empty\n response.parsedBody = await response.json()\n } catch (e) {}\n\n return response\n}\n\ninterface CreateHttpClientOptions extends RequestInit {\n baseUrl: string\n /**\n * Timeout in milliseconds\n */\n timeout?: number\n}\n\ninterface HttpClientRequestInit extends Omit<RequestInit, 'body'> {\n body?: Record<string, unknown>\n searchParams?: Record<string, any>\n}\n\nexport type CreateHttpClient = ReturnType<typeof createHttpClient>\n\nexport const createHttpClient = (\n { baseUrl, timeout = 30000, ...globalOptions }: CreateHttpClientOptions,\n fetcher = http\n) => {\n const apiClient = async <T>(\n path: string,\n options?: HttpClientRequestInit\n ): Promise<{ body: T }> => {\n const headers = {\n ...(options?.body ? { 'Content-Type': 'application/json' } : {}),\n ...globalOptions.headers,\n ...options?.headers,\n }\n\n const reqInit = getRequestInit({\n ...globalOptions,\n ...options,\n headers,\n })\n // reqInit.mode = 'no-cors'\n // reqInit.credentials = 'include'\n\n let timerId\n if (timeout) {\n const controller = new AbortController()\n const signal = controller.signal\n\n reqInit.signal = signal\n\n timerId = setTimeout(() => {\n controller.abort()\n }, timeout)\n }\n\n try {\n const response = await fetcher<T>(\n getUrl({\n path,\n baseUrl,\n searchParams: options?.searchParams,\n }),\n reqInit\n )\n\n return { body: response.parsedBody as T }\n } catch (e) {\n throw e\n } finally {\n timerId && clearTimeout(timerId)\n }\n }\n\n return apiClient\n}\n\nconst getBody = (body: unknown) => {\n return typeof body === 'string' ? body : JSON.stringify(body)\n}\n\nconst getRequestInit = (options: any): RequestInit => {\n return Object.entries(options).reduce((reducer, [key, value]) => {\n if (key === 'body') {\n return {\n ...reducer,\n body: getBody(value),\n }\n } else if (value != undefined) {\n return {\n ...reducer,\n [key]: value,\n }\n }\n\n return reducer\n }, {} as RequestInit)\n}\n\nconst getUrl = ({\n path,\n baseUrl,\n searchParams,\n}: {\n baseUrl: string\n path: string\n searchParams?: Record<string, any>\n}) => {\n const url = new URL(path, baseUrl)\n\n if (searchParams) {\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value != undefined) {\n url.searchParams.append(key, value)\n }\n })\n }\n return url.toString()\n}\n", "import { PaginatedResponse } from '../fabric/interfaces'\nimport { CreateHttpClient } from '../fabric/createHttpClient'\n\nexport function buildPaginatedResult<T>(\n body: PaginatedResponse<T>,\n client: CreateHttpClient\n) {\n const anotherPage = async (url?: string) => {\n if (!url) return Promise.resolve(undefined)\n const { body } = await client<PaginatedResponse<T>>(url)\n return buildPaginatedResult<T>(body, client)\n }\n\n return {\n data: body.data,\n self: async () => {\n const { self } = body.links\n return anotherPage(self)\n },\n nextPage: async () => {\n const { next } = body.links\n return anotherPage(next)\n },\n prevPage: async () => {\n const { prev } = body.links\n return anotherPage(prev)\n },\n firstPage: async () => {\n const { first } = body.links\n return anotherPage(first)\n },\n hasNext: Boolean(body.links.next),\n hasPrev: Boolean(body.links.prev),\n }\n}\n", "/**\n * Constructs a URL with query parameters.\n *\n * @param path The base path of the URL.\n * @param queryParams An instance of URLSearchParams containing all query parameters.\n * @returns The constructed URL with query parameters.\n */\nexport function makeQueryParamsUrls(\n path: string,\n queryParams: URLSearchParams\n): string {\n const queryString = queryParams.toString()\n return queryString ? `${path}?${queryString}` : path\n}\n", "import {\n GetAddressParams,\n GetAddressByNameParams,\n GetAddressByIdParams,\n GetAddressResponse,\n GetAddressesResponse,\n} from '../interfaces'\n\nexport const isGetAddressByNameParams = (\n obj: GetAddressParams\n): obj is GetAddressByNameParams => {\n return obj && 'name' in obj\n}\n\nexport const isGetAddressByIdParams = (\n obj: GetAddressParams\n): obj is GetAddressByIdParams => {\n return obj && 'id' in obj\n}\n\nexport const isGetAddressResponse = (\n obj: GetAddressResponse | GetAddressesResponse\n): obj is GetAddressResponse => {\n return obj && 'id' in obj && 'name' in obj\n}\n\nexport const isGetAddressesResponse = (\n obj: GetAddressResponse | GetAddressesResponse\n): obj is GetAddressesResponse => {\n return obj && 'data' in obj\n}\n", "import { Conversation } from './Conversation'\nimport {\n ConversationAPIGetMessagesParams,\n ConversationAPISendMessageParams,\n ConversationContract,\n ConversationResponse,\n} from './interfaces'\n\nexport class ConversationAPI implements ConversationContract {\n constructor(\n private conversation: Conversation,\n private payload: ConversationResponse\n ) {}\n\n get id() {\n return this.payload.id\n }\n\n get addressId() {\n return this.payload.address_id\n }\n\n get createdAt() {\n return this.payload.created_at\n }\n\n get lastMessageAt() {\n return this.payload.last_message_at\n }\n\n get metadata() {\n return this.payload.metadata\n }\n\n get name() {\n return this.payload.name\n }\n\n sendMessage(params: ConversationAPISendMessageParams) {\n return this.conversation.sendMessage({\n addressId: this.id,\n text: params.text,\n })\n }\n\n getMessages(params?: ConversationAPIGetMessagesParams) {\n return this.conversation.getConversationMessages({\n addressId: this.id,\n ...params,\n })\n }\n}\n", "import { type ConversationEventParams } from '@signalwire/core'\nimport { HTTPClient } from './HTTPClient'\nimport { WSClient } from './WSClient'\nimport type {\n GetConversationsResponse,\n GetMessagesParams,\n GetConversationsParams,\n GetConversationMessagesParams,\n GetConversationMessagesResponse,\n ConversationMessage,\n SendConversationMessageParams,\n SendConversationMessageResponse,\n ConversationChatMessage,\n GetMessagesResult,\n GetConversationMessagesResult,\n SendConversationMessageResult,\n GetConversationChatMessageParams,\n GetConversationsResult,\n ConversationSubscribeCallback,\n ConversationChatMessagesSubscribeParams,\n ConversationChatMessagesSubscribeResult,\n GetConversationChatMessageResult,\n JoinConversationParams,\n JoinConversationResponse,\n JoinConversationResult,\n ConversationSubscribeResult,\n} from './interfaces'\nimport { conversationWorker } from './workers'\nimport { buildPaginatedResult } from '../utils/paginatedResult'\nimport { makeQueryParamsUrls } from '../utils/makeQueryParamsUrl'\nimport { ConversationAPI } from './ConversationAPI'\n\nconst DEFAULT_CHAT_MESSAGES_PAGE_SIZE = 10\n\ninterface ConversationOptions {\n httpClient: HTTPClient\n wsClient: WSClient\n}\n\nexport class Conversation {\n private httpClient: HTTPClient\n private wsClient: WSClient\n private callbacks = new Set<ConversationSubscribeCallback>()\n private chatSubscriptions: Record<\n string,\n Set<ConversationSubscribeCallback>\n > = {}\n\n constructor(options: ConversationOptions) {\n this.httpClient = options.httpClient\n this.wsClient = options.wsClient\n\n this.wsClient.runWorker('conversationWorker', {\n worker: conversationWorker,\n initialState: {\n conversation: this,\n },\n })\n }\n\n /** @internal */\n handleEvent(event: ConversationEventParams) {\n if (event.subtype === 'chat') {\n const chatCallbacks = this.chatSubscriptions[event.conversation_id]\n if (chatCallbacks?.size) {\n chatCallbacks.forEach((cb) => cb(event))\n }\n }\n\n if (this.callbacks.size) {\n this.callbacks.forEach((callback) => {\n callback(event)\n })\n }\n }\n\n public async sendMessage(\n params: SendConversationMessageParams\n ): Promise<SendConversationMessageResult> {\n try {\n const { addressId, text } = params\n const path = '/api/fabric/messages'\n const { body } =\n await this.httpClient.fetch<SendConversationMessageResponse>(path, {\n method: 'POST',\n body: {\n conversation_id: addressId,\n text,\n },\n })\n return body\n } catch (error) {\n throw new Error('Error sending message to conversation!', error)\n }\n }\n\n public async getConversations(\n params?: GetConversationsParams\n ): Promise<GetConversationsResult> {\n try {\n const { pageSize } = params || {}\n\n const path = '/api/fabric/conversations'\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } = await this.httpClient.fetch<GetConversationsResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n const self = this\n const data = body.data.map(\n (conversation) => new ConversationAPI(self, conversation)\n )\n return buildPaginatedResult({ ...body, data }, this.httpClient.fetch)\n } catch (error) {\n throw new Error('Error fetching the conversation history!', error)\n }\n }\n\n public async getMessages(\n params?: GetMessagesParams\n ): Promise<GetMessagesResult> {\n try {\n const { pageSize } = params || {}\n\n const path = '/api/fabric/messages'\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } =\n await this.httpClient.fetch<GetConversationMessagesResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n\n return buildPaginatedResult<ConversationMessage>(\n body,\n this.httpClient.fetch\n )\n } catch (error) {\n throw new Error('Error fetching the conversation messages!', error)\n }\n }\n\n public async getConversationMessages(\n params: GetConversationMessagesParams\n ): Promise<GetConversationMessagesResult> {\n try {\n const { addressId, pageSize } = params || {}\n\n const path = `/api/fabric/conversations/${addressId}/messages`\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } =\n await this.httpClient.fetch<GetConversationMessagesResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n\n return buildPaginatedResult<ConversationMessage>(\n body,\n this.httpClient.fetch\n )\n } catch (error) {\n throw new Error('Error fetching the conversation messages!', error)\n }\n }\n\n public async getChatMessages(\n params: GetConversationChatMessageParams\n ): Promise<GetConversationChatMessageResult> {\n const { addressId, pageSize = DEFAULT_CHAT_MESSAGES_PAGE_SIZE } = params\n\n const fetchChatMessagesPage = async (\n fetcherFn?: () => Promise<GetConversationChatMessageResult | undefined>,\n cached: ConversationMessage[] = [],\n isDirectionNext = true\n ): Promise<GetConversationChatMessageResult> => {\n const chatMessages = [...cached]\n const isValid = (item: ConversationMessage) =>\n item.conversation_id === addressId && item.subtype === 'chat'\n\n let conversationMessages: GetConversationChatMessageResult | undefined\n conversationMessages = await fetcherFn?.()\n let chatOnlyMessages = conversationMessages?.data.filter(isValid) ?? []\n let remaining = pageSize - chatMessages.length\n for (\n let idx = 0;\n idx < chatOnlyMessages.length && idx < remaining;\n idx++\n ) {\n chatMessages.push(chatOnlyMessages[idx])\n }\n\n while (chatMessages.length < pageSize && conversationMessages?.hasNext) {\n conversationMessages = await (isDirectionNext\n ? conversationMessages?.nextPage()\n : conversationMessages?.prevPage())\n if (!conversationMessages || !conversationMessages.data.length) {\n //over caution in case of a server error, to prevent an infinite loop.\n break\n }\n\n remaining = pageSize - chatMessages.length\n chatOnlyMessages = conversationMessages.data.filter(isValid)\n for (\n let idx = 0;\n idx < chatOnlyMessages.length && idx < remaining;\n idx++\n ) {\n chatMessages.push(chatOnlyMessages[idx])\n }\n }\n\n let missingReturns: ConversationMessage[] = []\n if (remaining < chatOnlyMessages.length) {\n missingReturns = chatOnlyMessages.slice(remaining)\n }\n\n return {\n data: chatMessages as ConversationChatMessage[],\n hasNext: !!conversationMessages?.hasNext || !!cached.length,\n hasPrev: !!conversationMessages?.hasPrev,\n\n nextPage: () =>\n fetchChatMessagesPage(conversationMessages?.nextPage, missingReturns),\n prevPage: () =>\n fetchChatMessagesPage(\n conversationMessages?.prevPage,\n missingReturns,\n false\n ),\n self: () =>\n fetchChatMessagesPage(conversationMessages?.self, missingReturns),\n firstPage: () =>\n fetchChatMessagesPage(\n conversationMessages?.firstPage,\n missingReturns\n ),\n }\n }\n\n return fetchChatMessagesPage(\n () =>\n this.getConversationMessages({\n addressId,\n pageSize,\n }) as Promise<GetConversationChatMessageResult>\n )\n }\n\n public async subscribe(\n callback: ConversationSubscribeCallback\n ): Promise<ConversationSubscribeResult> {\n this.callbacks.add(callback)\n\n return {\n unsubscribe: () => this.callbacks.delete(callback),\n }\n }\n\n public async subscribeChatMessages(\n params: ConversationChatMessagesSubscribeParams\n ): Promise<ConversationChatMessagesSubscribeResult> {\n const { addressId, onMessage } = params\n\n if (!(addressId in this.chatSubscriptions)) {\n this.chatSubscriptions[addressId] = new Set()\n }\n\n this.chatSubscriptions[addressId].add(onMessage)\n return {\n unsubscribe: () => this.chatSubscriptions[addressId].delete(onMessage),\n }\n }\n\n public async joinConversation(\n params: JoinConversationParams\n ): Promise<JoinConversationResult> {\n try {\n const { addressId } = params\n const path = '/api/fabric/conversations/join'\n const { body } = await this.httpClient.fetch<JoinConversationResponse>(\n path,\n {\n method: 'POST',\n body: {\n conversation_id: addressId,\n },\n }\n )\n return body\n } catch (error) {\n throw new Error('Error joining a conversation!', error)\n }\n }\n}\n", "import {\n actions,\n BaseClient,\n CallJoinedEventParams as InternalCallJoinedEventParams,\n VertoBye,\n VertoSubscribe,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { MakeRoomOptions } from '../video'\nimport { createFabricRoomSessionObject } from './FabricRoomSession'\nimport { buildVideoElement } from '../buildVideoElement'\nimport {\n CallParams,\n DialParams,\n FabricRoomSession,\n IncomingInvite,\n OnlineParams,\n HandlePushNotificationParams,\n WSClientOptions,\n HandlePushNotificationResult,\n} from './interfaces'\nimport { IncomingCallManager } from './IncomingCallManager'\nimport { wsClientWorker } from './workers'\nimport { createWSClient } from './createWSClient'\nimport { WSClientContract } from './interfaces/wsClient'\n\nexport class WSClient extends BaseClient<{}> implements WSClientContract {\n private _incomingCallManager: IncomingCallManager\n private _disconnected: boolean = false\n\n constructor(private wsClientOptions: WSClientOptions) {\n const client = createWSClient(wsClientOptions)\n super(client)\n\n this._incomingCallManager = new IncomingCallManager({\n client: this,\n buildInboundCall: this.buildInboundCall.bind(this),\n executeVertoBye: this.executeVertoBye.bind(this),\n })\n\n this.runWorker('wsClientWorker', {\n worker: wsClientWorker,\n initialState: {\n handleIncomingInvite: (invite: IncomingInvite) => {\n this._incomingCallManager.handleIncomingInvite({\n source: 'websocket',\n ...invite,\n })\n },\n },\n })\n }\n\n private makeFabricObject(makeRoomOptions: MakeRoomOptions) {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n mirrorLocalVideoOverlay = true,\n ...options\n } = makeRoomOptions\n\n const room = createFabricRoomSessionObject({\n ...options,\n store: this.store,\n })\n\n /**\n * If the user provides a `rootElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n try {\n buildVideoElement({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n mirrorLocalVideoOverlay,\n room,\n rootElement,\n })\n } catch (error) {\n this.logger.error('Unable to build the video element automatically')\n }\n }\n\n /**\n * If the user joins with `join_video_muted: true` or\n * `join_audio_muted: true` we'll stop the streams\n * right away.\n */\n const joinMutedHandler = (\n params: InternalCallJoinedEventParams | VideoRoomSubscribedEventParams\n ) => {\n const member = params.room_session.members?.find(\n // @ts-expect-error FIXME:\n (m) => m.id === room.memberId || m.member_id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n }\n }\n\n room.on('room.subscribed', joinMutedHandler)\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audioMuted', ({ member }) => {\n try {\n if (member.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.videoMuted', ({ member }) => {\n try {\n if (member.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 private buildOutboundCall(params: DialParams & { attach?: boolean }) {\n const [pathname, query] = params.to.split('?')\n if (!pathname) {\n throw new Error('Invalid destination address')\n }\n\n let video = false\n let negotiateVideo = false\n\n const queryParams = new URLSearchParams(query)\n const channel = queryParams.get('channel')\n if (channel === 'video') {\n video = true\n negotiateVideo = true\n }\n\n const call = this.makeFabricObject({\n audio: params.audio ?? true,\n video: params.video ?? video,\n negotiateAudio: params.negotiateAudio ?? true,\n negotiateVideo: params.negotiateVideo ?? negotiateVideo,\n rootElement: params.rootElement || this.wsClientOptions.rootElement,\n applyLocalVideoOverlay: true,\n applyMemberOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n watchMediaPackets: false,\n destinationNumber: params.to,\n nodeId: params.nodeId,\n attach: params.attach ?? false,\n disableUdpIceServers: params.disableUdpIceServers || false,\n userVariables: params.userVariables || this.wsClientOptions.userVariables,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n call.destroy()\n })\n\n this.session.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n call.destroy()\n this.destroy()\n })\n\n // TODO: This is for memberList.updated event and it is not yet supported in CF SDK\n // @ts-expect-error\n call.attachPreConnectWorkers()\n return call\n }\n\n private buildInboundCall(payload: IncomingInvite, params: CallParams) {\n const call = this.makeFabricObject({\n audio: params.audio ?? true,\n video: params.video ?? true,\n negotiateAudio: params.negotiateAudio ?? true,\n negotiateVideo: params.negotiateVideo ?? true,\n rootElement: params.rootElement || this.wsClientOptions.rootElement,\n applyLocalVideoOverlay: true,\n applyMemberOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n watchMediaPackets: false,\n nodeId: payload.nodeId,\n remoteSdp: payload.sdp,\n prevCallId: payload.callID,\n disableUdpIceServers: params.disableUdpIceServers || false,\n userVariables: params.userVariables || this.wsClientOptions.userVariables,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n call.destroy()\n })\n\n this.session.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n call.destroy()\n this.destroy()\n })\n\n // TODO: This is for memberList.updated event and it is not yet supported in CF SDK\n // @ts-expect-error\n call.attachPreConnectWorkers()\n return call\n }\n\n private async executeVertoBye(callId: string, nodeId: string) {\n try {\n return await this.execute<unknown, void>({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n message: VertoBye({\n cause: 'USER_BUSY',\n causeCode: '17',\n dialogParams: { callID: callId },\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n private async executeVertoSubscribe(callId: string, nodeId: string) {\n try {\n return await this.execute<unknown, void>({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n subscribe: [],\n message: VertoSubscribe({\n sessid: callId,\n eventChannel: [],\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n public override disconnect() {\n return new Promise<void>((resolve, _reject) => {\n if (this._disconnected) {\n resolve()\n }\n\n this.session.once('session.disconnected', () => {\n this.destroy()\n resolve()\n this._disconnected = true\n })\n\n super.disconnect()\n })\n }\n\n public async dial(params: DialParams) {\n return new Promise<FabricRoomSession>(async (resolve, reject) => {\n try {\n const call = this.buildOutboundCall(params)\n resolve(call)\n } catch (error) {\n this.logger.error('Unable to connect and dial a call', error)\n reject(error)\n }\n })\n }\n\n public async reattach(params: DialParams) {\n return new Promise<FabricRoomSession>(async (resolve, reject) => {\n try {\n const call = this.buildOutboundCall({ ...params, attach: true })\n resolve(call)\n } catch (error) {\n this.logger.error('Unable to connect and reattach a call', error)\n reject(error)\n }\n })\n }\n\n public handlePushNotification(params: HandlePushNotificationParams) {\n return new Promise<HandlePushNotificationResult>(\n async (resolve, reject) => {\n const { decrypted, type } = params\n if (type !== 'call_invite') {\n this.logger.warn('Unknown notification type', params)\n reject('Unknown notification type')\n }\n this.logger.debug('handlePushNotification', params)\n const {\n params: { params: payload },\n node_id: nodeId,\n } = decrypted\n try {\n // Catch the error temporarly\n try {\n // Send verto.subscribe\n await this.executeVertoSubscribe(payload.callID, nodeId)\n } catch (error) {\n this.logger.warn('Verto Subscribe', error)\n }\n\n this._incomingCallManager.handleIncomingInvite({\n source: 'pushNotification',\n nodeId,\n ...payload,\n })\n\n resolve({ resultType: 'inboundCall' })\n } catch (error) {\n reject(error)\n }\n }\n )\n }\n\n public updateToken(token: string) {\n return new Promise<void>((resolve, reject) => {\n this.session.once('session.auth_error', (error) => {\n reject(error)\n })\n this.session.once('session.connected', () => {\n resolve()\n })\n this.store.dispatch(actions.reauthAction({ token }))\n })\n }\n\n /**\n * Mark the client as 'online' to receive calls over WebSocket\n */\n public async online({ incomingCallHandlers }: OnlineParams) {\n this._incomingCallManager.setNotificationHandlers(incomingCallHandlers)\n return this.execute<unknown, void>({\n method: 'subscriber.online',\n params: {},\n })\n }\n\n /**\n * Mark the client as 'offline' to receive calls over WebSocket\n */\n public offline() {\n this._incomingCallManager.setNotificationHandlers({})\n return this.execute<unknown, void>({\n method: 'subscriber.offline',\n params: {},\n })\n }\n}\n", "import { FabricRoomSession } from './FabricRoomSession'\nimport {\n CallParams,\n IncomingCallHandlers,\n IncomingCallNotification,\n IncomingInvite,\n IncomingInviteWithSource,\n} from './interfaces'\nimport { WSClient } from './WSClient'\n\ninterface IncomingCallManagerOptions {\n client: WSClient\n buildInboundCall: WSClient['buildInboundCall']\n executeVertoBye: WSClient['executeVertoBye']\n}\n\nexport class IncomingCallManager {\n private _client: WSClient\n private _pendingInvites: Record<string, IncomingInvite> = {}\n private _handlers: IncomingCallHandlers = {}\n\n constructor(private options: IncomingCallManagerOptions) {\n this._client = options.client\n }\n\n private _buildNotification(invite: IncomingInvite): IncomingCallNotification {\n const accept = async (params: CallParams) => {\n return new Promise<FabricRoomSession>((resolve, reject) => {\n delete this._pendingInvites[invite.callID]\n try {\n const call = this.options.buildInboundCall(invite, params)\n call.answer()\n\n resolve(call)\n } catch (e) {\n reject(e)\n }\n })\n }\n\n const reject = () => {\n delete this._pendingInvites[invite.callID]\n return this.options.executeVertoBye(invite.callID, invite.nodeId)\n }\n\n return {\n invite: {\n details: invite,\n accept: (params) => accept(params),\n reject: () => reject(),\n },\n }\n }\n\n setNotificationHandlers(handlers: IncomingCallHandlers) {\n this._handlers.all = handlers.all\n if (\n (handlers.pushNotification &&\n this._handlers.all != handlers.pushNotification) ||\n !handlers.pushNotification\n ) {\n this._handlers.pushNotification = handlers.pushNotification\n }\n if (\n (handlers.websocket && this._handlers.all != handlers.websocket) ||\n !handlers.websocket\n ) {\n this._handlers.websocket = handlers.websocket\n }\n }\n\n handleIncomingInvite(incomingInvite: IncomingInviteWithSource) {\n if (incomingInvite.callID in this._pendingInvites) {\n this._client.logger.debug(\n `skiping nottification for pending invite to callID: ${incomingInvite.callID}`\n )\n return\n }\n this._pendingInvites[incomingInvite.callID] = incomingInvite\n\n if (!(this._handlers.all || this._handlers[incomingInvite.source])) {\n this._client.logger.warn('Skiping nottification due to no listeners')\n return\n }\n\n const notification = this._buildNotification(incomingInvite)\n\n this._handlers.all?.(notification)\n const handler = this._handlers[incomingInvite.source]\n handler?.(notification)\n }\n}\n", "import { configureStore } from '@signalwire/core'\nimport { SATSession } from './SATSession'\nimport { WSClientOptions } from './interfaces'\n\nexport const createWSClient = (options: WSClientOptions) => {\n const store = configureStore({\n userOptions: options,\n SessionConstructor: SATSession,\n })\n\n return { ...options, store }\n}\n", "import {\n RPCReauthenticate,\n RPCReauthenticateParams,\n SATAuthorization,\n SessionOptions,\n UNIFIED_CONNECT_VERSION,\n} from '@signalwire/core'\nimport { JWTSession } from '../JWTSession'\n\n/**\n * SAT Session is for the Call Fabric SDK\n */\nexport class SATSession extends JWTSession {\n public connectVersion = UNIFIED_CONNECT_VERSION\n\n constructor(public options: SessionOptions) {\n super(options)\n }\n\n override get signature() {\n if (this._rpcConnectResult) {\n const { authorization } = this._rpcConnectResult\n return (authorization as SATAuthorization).jti\n }\n return undefined\n }\n\n override async _checkTokenExpiration() {\n /**\n * noop\n *\n * The Call Fabric SDK does not attach any timer and\n * does not emit any events to inform the user about the token expiry.\n */\n }\n\n /**\n * Reauthenticate with the SignalWire Network using a newer SAT.\n * If the session has expired, this will reconnect it.\n * @return Promise<void>\n */\n override async reauthenticate() {\n this.logger.debug('Session Reauthenticate', {\n ready: this.ready,\n expired: this.expired,\n })\n if (!this.ready || this.expired) {\n return this.connect()\n }\n\n const params: RPCReauthenticateParams = {\n project: this._rpcConnectResult.authorization.project_id,\n jwt_token: this.options.token,\n }\n\n try {\n const reauthResponse = await this.execute(RPCReauthenticate(params))\n\n this._rpcConnectResult = {\n ...this._rpcConnectResult,\n ...reauthResponse,\n }\n } catch (error) {\n throw error\n }\n }\n}\n", "import { HTTPClient } from './HTTPClient'\nimport { Conversation } from './Conversation'\nimport { SignalWireClient, SignalWireClientParams } from './interfaces'\nimport { WSClient } from './WSClient'\n\nexport const SignalWire = (() => {\n let instance: Promise<SignalWireClient> | null = null\n\n return (params: SignalWireClientParams): Promise<SignalWireClient> => {\n if (!instance) {\n instance = new Promise<SignalWireClient>(async (resolve, reject) => {\n try {\n const wsClient = new WSClient(params)\n const httpClient = new HTTPClient(params)\n const conversation = new Conversation({ httpClient, wsClient })\n\n // Connect the WebSocket and authenticate the user\n await wsClient.connect()\n\n resolve({\n registerDevice: httpClient.registerDevice.bind(httpClient),\n unregisterDevice: httpClient.unregisterDevice.bind(httpClient),\n getSubscriberInfo: httpClient.getSubscriberInfo.bind(httpClient),\n disconnect: async () => {\n await wsClient.disconnect()\n instance = null // Reset the singleton instance on disconnect\n },\n online: wsClient.online.bind(wsClient),\n offline: wsClient.offline.bind(wsClient),\n dial: wsClient.dial.bind(wsClient),\n reattach: wsClient.reattach.bind(wsClient),\n handlePushNotification:\n wsClient.handlePushNotification.bind(wsClient),\n updateToken: wsClient.updateToken.bind(wsClient),\n address: {\n getAddresses: httpClient.getAddresses.bind(httpClient),\n getAddress: httpClient.getAddress.bind(httpClient),\n },\n conversation: {\n getConversations:\n conversation.getConversations.bind(conversation),\n getMessages: conversation.getMessages.bind(conversation),\n getConversationMessages:\n conversation.getConversationMessages.bind(conversation),\n subscribe: conversation.subscribe.bind(conversation),\n sendMessage: conversation.sendMessage.bind(conversation),\n join: conversation.joinConversation.bind(conversation),\n },\n chat: {\n getMessages: conversation.getChatMessages.bind(conversation),\n subscribe: conversation.subscribeChatMessages.bind(conversation),\n sendMessage: conversation.sendMessage.bind(conversation),\n join: conversation.joinConversation.bind(conversation),\n },\n // @ts-expect-error For debugging purposes\n on: wsClient.on.bind(wsClient),\n off: wsClient.off.bind(wsClient),\n __httpClient: httpClient,\n __wsClient: wsClient,\n })\n } catch (error) {\n reject(error)\n }\n }).catch((error) => {\n /**\n * Reset the instance to null explicitly since\n * Promises are immutable: once rejected, a Promise remains rejected forever.\n */\n instance = null\n throw error\n })\n }\n return instance\n }\n})()\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 { VideoRoomSession, isVideoRoomSession } from './VideoRoomSession'\n", "import { UserOptions, getLogger } 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\nexport interface CreateRoomObjectOptions\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\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({\n ...userOptions,\n })\n await client.connect()\n\n if (!client) {\n return\n }\n\n /**\n * Since `makeRoomObject` now only accepts a\n * `rootElement` the following is to preserve backwards\n * compatibility with the previous syntax\n */\n let rootElement: HTMLElement | undefined\n if (rootElementId) {\n const el = document.getElementById(rootElementId)\n\n if (el) {\n rootElement = el\n } else {\n rootElement = document.body\n\n getLogger().warn(\n `We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`\n )\n }\n }\n\n const roomObject = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n roomObject.once('destroy', () => {\n roomObject.emit('room.left')\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n roomObject.once('room.subscribed', (_payload) => {\n resolve(roomObject)\n })\n\n await roomObject.join()\n } catch (error) {\n getLogger().error('Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const room = new Proxy(roomObject, {\n get(target: any, prop: any, receiver: any) {\n if (prop === 'join') {\n return join\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n\n if (autoJoin) {\n try {\n await room.join()\n resolve(room)\n } catch (error) {\n reject(error)\n }\n } else {\n resolve(room)\n }\n })\n}\n", "import { CreateRoomObjectOptions, createRoomObject } from './createRoomObject'\n\n/**\n * Using Video.joinRoom() you can automatically join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.joinRoom({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * // You have joined the room..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const joinRoom = (roomOptions: CreateRoomObjectOptions) => {\n return createRoomObject({\n ...roomOptions,\n autoJoin: true,\n })\n}\n", "import {\n UserOptions,\n getLogger,\n VideoAuthorization,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { checkMediaParams, getJoinMediaParams } from '../utils/roomSession'\nimport type { MakeRoomOptions } from '../Client'\nimport type {\n BaseRoomSessionJoinParams,\n RoomSessionObjectEvents,\n} from '../utils/interfaces'\nimport { getStorage, sessionStorageManager } from '../utils/storage'\nimport { VideoRoomSession } from './VideoRoomSession'\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 'getMeta',\n 'setMeta',\n 'updateMeta',\n 'deleteMeta',\n 'getMemberMeta',\n 'setMemberMeta',\n 'updateMemberMeta',\n 'deleteMemberMeta',\n 'promote',\n 'demote',\n 'lock',\n 'unlock',\n]\n\n/**\n * List of events that the SDK must subscribe at the invite time.\n * ie. ScreenShare/AdditionaDevice are based on the member.joined logic.\n */\nconst REQUIRED_EVENTS: (keyof RoomSessionObjectEvents)[] = [\n 'member.joined',\n 'layout.changed',\n]\nconst noop = () => {}\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\nexport interface RoomSession extends VideoRoomSession {\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({ receiveAudio: true, sendVideo: false })\n * ```\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio: audioFromConstructor = true,\n video: videoFromConstructor = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n mirrorLocalVideoOverlay = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n disableUdpIceServers = false,\n ...userOptions\n } = roomOptions\n\n const deprecatedParams = ['audio', 'video']\n deprecatedParams.forEach((param) => {\n if (param in roomOptions) {\n getLogger().warn(\n `The '${param}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`\n )\n }\n })\n\n // @ts-expect-error - true by default\n const allowReattach = roomOptions?.reattach !== false\n\n const { callIdKey } = sessionStorageManager(userOptions.token)\n const reattachManager = {\n joined: ({ call_id }: VideoRoomSubscribedEventParams) => {\n if (allowReattach && callIdKey) {\n getStorage()?.setItem(callIdKey, call_id)\n }\n },\n init: () => {\n if (allowReattach) {\n room.on('room.subscribed', reattachManager.joined)\n }\n room.options.prevCallId = reattachManager.getPrevCallId()\n },\n destroy: () => {\n if (!allowReattach) {\n return\n }\n\n room.off('room.subscribed', reattachManager.joined)\n if (callIdKey) {\n getStorage()?.removeItem(callIdKey)\n }\n },\n getPrevCallId: () => {\n if (!allowReattach || !callIdKey) {\n return\n }\n\n return getStorage()?.getItem(callIdKey) ?? undefined\n },\n }\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 mirrorLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n prevCallId: reattachManager.getPrevCallId(),\n disableUdpIceServers,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n room.emit('room.left', { reason: room.leaveReason })\n\n // Remove callId to reattach\n reattachManager.destroy()\n client.disconnect()\n })\n\n // @ts-expect-error\n client.session.once('session.disconnected', () => {\n room.destroy()\n })\n\n const join = (params?: BaseRoomSessionJoinParams) => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n // Fallback to the constructor values for backwards compat.\n const audio = params?.audio ?? audioFromConstructor\n const video = params?.video ?? videoFromConstructor\n\n // @ts-expect-error\n const authState: VideoAuthorization = client._sessionAuthState\n getLogger().debug('getJoinMediaParams authState?', authState)\n if (authState && authState.type === 'video') {\n const mediaOptions = getJoinMediaParams({\n authState,\n // constructor values override the send\n sendAudio: Boolean(audio),\n sendVideo: Boolean(video),\n ...params,\n })\n\n if (!checkMediaParams(mediaOptions)) {\n client.disconnect()\n return reject(\n new Error(\n `Invalid arguments to join the room. The token used has join_as: '${\n authState.join_as\n }'. \\n${JSON.stringify(params, null, 2)}\\n`\n )\n )\n }\n getLogger().debug('Set mediaOptions', mediaOptions)\n\n /**\n * audio and video might be objects with MediaStreamConstraints\n * so if we must send media, we make sure to use the user's\n * preferences.\n * Note: params.sendAudio: `true` will override audio: `false` so\n * we're using `||` instead of `??` for that reason.\n */\n // @ts-expect-error\n room.updateMediaOptions({\n audio: mediaOptions.mustSendAudio ? audio || true : false,\n video: mediaOptions.mustSendVideo ? video || true : false,\n negotiateAudio: mediaOptions.mustRecvAudio,\n negotiateVideo: mediaOptions.mustRecvVideo,\n })\n }\n\n room.once('room.subscribed', () => {\n resolve(room)\n })\n\n // Hijack previous callId if present\n reattachManager.init()\n\n REQUIRED_EVENTS.forEach((event) => room.once(event, noop))\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const interceptors = {\n join,\n } as const\n\n return new Proxy<Omit<RoomSession, 'new'>>(room, {\n get(target: RoomSession, prop: keyof RoomSession, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (!target.active && UNSAFE_PROP_ACCESS.includes(prop)) {\n throw new Error(\n `Tried to access the property/method \"${prop}\" before the room was connected. Please call roomSession.join() first.`\n )\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (roomOptions: RoomSessionOptions): RoomSession }\n", "export {\n getDevices,\n getCameraDevices,\n getMicrophoneDevices,\n getSpeakerDevices,\n getDevicesWithPermissions,\n getCameraDevicesWithPermissions,\n getMicrophoneDevicesWithPermissions,\n getSpeakerDevicesWithPermissions,\n checkPermissions,\n checkCameraPermissions,\n checkMicrophonePermissions,\n checkSpeakerPermissions,\n requestPermissions,\n createDeviceWatcher,\n createCameraDeviceWatcher,\n createMicrophoneDeviceWatcher,\n createSpeakerDeviceWatcher,\n supportsMediaDevices,\n supportsGetUserMedia,\n supportsGetDisplayMedia,\n getUserMedia,\n getDisplayMedia,\n enumerateDevices,\n enumerateDevicesByKind,\n getSupportedConstraints,\n supportsMediaOutput,\n setMediaElementSinkId,\n stopStream,\n stopTrack,\n createMicrophoneAnalyzer,\n} from '@signalwire/webrtc'\nexport type { MicrophoneAnalyzer } from '@signalwire/webrtc'\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAAA;AAAA;;;ACAA;AAAA,EAEE;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,OAEK;;;ACNP;AAAA,EACE;AAAA,EAGA,WAAAC;AAAA,EACA,QAAQ;AAAA,EACR,UAAU;AAAA,OACL;;;ACPP;AAAA,EACE;AAAA,EAEA,WAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,6BAA6B;;;ACRtC,IAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA;AACF,MAGM;AACJ,UAAQ,WAAW;AAEnB,UAAQ,cAAc;AACtB,UAAQ,YAAY,IAAI,YAAY,CAAC,KAAK,CAAC;AAE3C,QAAM,iBAAiB,SAAS,MAAM;AACpC,YAAQ,YAAY;AACpB,YAAQ,OAAO;AAAA,EACjB,CAAC;AAED,SAAO;AACT;;;AClBA,SAAS,eAAe;AAEjB,IAAM,wBAAwB,QAAQ;AAAA,EAC3C;AACF;;;AFSO,IAAM,uBAAuB,CAAC,EAAE,UAAU,MAA8B;AAC7E,SAAO,UAAU,iBAAiB;AAAA,IAChC,UAAU;AAAA,IACV;AAAA,EACF,GAA+D;AAC7D,QAAI,OAAO,UAAU,aAAa;AAChC,gBAAU,EAAE,KAAK,+CAA+C;AAChE;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,WAAW;AAChC,UAAI;AAEJ,YAAM,eAAe,SAAU,OAAsB;AACnD,gBAAQ,MAAM,MAAM,MAAM;AAAA,UACxB,KAAK,SAAS;AACZ,wBAAY,QAAQ,yBAAyB;AAAA,cAC3C,OAAO,MAAM;AAAA,cACb,SAAS;AAAA,cACT;AAAA,cACA;AAAA,YACF,CAAC;AACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAMA,WAAK,GAAG,SAAS,YAAY;AAE7B,WAAK,KAAK,WAAW,MAAM;AACzB,+CAAW;AAAA,MACb,CAAC;AAAA,IACH,SAAS,OAAO;AACd,gBAAU,EAAE,MAAM,oBAAoB,KAAK;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,UAAU,2BAA2B;AAAA,EACnC;AAAA,EACA;AACF,GAGiB;AAIf,QAAM,uBAAuBC,SAAQ;AAAA,IACnC,KAAK;AAAA,IACL;AAAA,EACF;AAEA,SAAO,MAAM;AACX,UAAM,SAAS,MAAM,YAAY,KAAK,CAAC,oBAAoB,CAAC;AAE5D,QAAI;AACF,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,gBAAM,WAAW,MAAM,YAAY;AAAA,YACjC;AAAA,YACA;AAAA,YACA,OAAO;AAAA,UACT;AAEA,eAAK;AAAA;AAAA,YAEH,GAAG,kBAAkB;AAAA,YACrB,OAAO;AAAA,UACT;AAEA,eAAK,wBAAwB;AAAA,YAC3B,YAAY,OAAO;AAAA,YACnB,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AACD;AAAA,MACJ;AAAA,IACF,SAAS,OAAO;AACd,WAAK,wBAAwB;AAAA,QAC3B,YAAY,OAAO;AAAA,QACnB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AACD,gBAAU,EAAE,MAAM,KAAK;AAAA,IACzB;AAAA,EACF;AACF;AAEA,UAAU,wBAAwB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKiB;AACf,qBAAmB,EAAE,OAAO,QAAQ,CAAC;AACrC,MAAI,WAAW;AAEb,0BAAsB,SAAS,SAAS,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1D;AAEA,QAAM,YAAY,KAAK,4BAA4B;AAAA,IACjD;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;AGhIA;AAAA,EAGE;AAAA,EAEA;AAAA,EAEA;AAAA,OAKK;;;ACZP,SAAS,aAAAC,YAAW,eAAAC,oBAAmB;;;ACAvC;AAAA,EACE,aAAAC;AAAA,EAIA;AAAA,EAEA;AAAA,OACK;AAGA,IAAM,0BAA0B,WACrC,SAGc;AACd,EAAAA,WAAU,EAAE,MAAM,iCAAiC;AACnD,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,QAAQ;AAAA,EAC1B,IAAI;AAGJ,QAAM,aAAa;AAAA,IACjB,OAAO,QAAQ,MAAM,IAAI,CAAC,QAAQ,eAAe,GAAG,CAAC;AAAA,EACvD;AACA,SAAO;AAAA,IACL,qBAAqB,IAAI;AAAA;AAAA,IAEzB;AAAA,EACF;AAEA,EAAAA,WAAU,EAAE,MAAM,+BAA+B;AACnD;;;ACjCA;AAAA,EACE,aAAAC;AAAA,EAIA,kBAAAC;AAAA,EAEA,wBAAAC;AAAA,OACK;AAGA,IAAM,yBAAyB,WACpC,SACc;AACd,EAAAF,WAAU,EAAE,MAAM,gCAAgC;AAClD,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,QAAQ;AAAA,EAC1B,IAAI;AAGJ,SAAO;AAAA,IACLE,sBAAqB,IAAI;AAAA,IACzBD,gBAAe,OAAO;AAAA,EACxB;AAEA,EAAAD,WAAU,EAAE,MAAM,8BAA8B;AAClD;;;AFVO,IAAM,qBAA8C,WACzD,SACc;AACd,EAAAG,WAAU,EAAE,MAAM,4BAA4B;AAC9C,QAAM;AAAA,IACJ,UAAU,EAAE,eAAe;AAAA,EAC7B,IAAI;AAEJ,YAAU,OAAO,QAA6C;AAC5D,UAAM,EAAE,KAAK,IAAI;AAEjB,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,cAAMC,aAAY,KAAK,yBAAyB;AAAA,UAC9C;AAAA,WACG,QACJ;AACD;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAMA,aAAY,KAAK,wBAAwB;AAAA,UAC7C;AAAA,WACG,QACJ;AACD;AAAA,MACF;AACE,QAAAD,WAAU,EAAE,KAAK,iCAAiC,IAAI,GAAG;AACzD;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,MAAM;AACX,UAAM,SAA8C,MAAMC,aAAY;AAAA,MACpE;AAAA,MACA,CAACC,YAAuB;AACtB,eAAOA,QAAO,KAAK,WAAW,gBAAgB;AAAA,MAChD;AAAA,IACF;AAEA,UAAMD,aAAY,KAAK,QAAQ,MAAM;AAAA,EACvC;AAEA,EAAAD,WAAU,EAAE,MAAM,0BAA0B;AAC9C;;;ADhCO,IAAM,kBAAN,cAA8B,aAAiC;AAAA,EACpE,YAAY,SAA+B;AACzC,UAAM,OAAO;AAEb,SAAK,UAAU,sBAAsB;AAAA,MACnC,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA;AAAA,EAGmB,mBAAmB;AACpC,UAAM,uBAAuB,KAAK,WAAW,EAAE;AAAA,MAC7C,CAAC,UAAU,iBAAiB,KAAK;AAAA,IACnC;AACA,WAAO,0BAA0B,oBAAoB;AAAA,EACvD;AACF;AAEO,IAAM,2BAA2B,CAAC,WAAiC;AACxE,QAAM,UAAU,QAA2D;AAAA,IACzE,OAAO,OAAO;AAAA,IACd,WAAW;AAAA,EACb,CAAC,EAAE,MAAM;AAET,QAAM,QAAQ,IAAI,MAAoB,SAAS;AAAA,IAC7C,IACE,QACA,UACA,UACA;AACA,UAAI,aAAa,oBAAoB;AACnC,eAAO;AAAA,MACT,WAAW,aAAa,gBAAgB;AACtC,eAAO;AAAA,MACT;AAEA,aAAO,QAAQ,IAAI,QAAQ,UAAU,QAAQ;AAAA,IAC/C;AAAA,EACF,CAAC;AACD,SAAO;AACT;;;AIvEA;AAAA,EAGE,aAAAG;AAAA,EACA,QAAAC;AAAA,OACK;;;ACLP;AAAA,EACE,aAAAC;AAAA,EAGA;AAAA,EACA;AAAA,OACK;;;ACNP,SAAyC,aAAAC,mBAAiB;;;ACA1D;AAAA,EAGE,WAAAC;AAAA,EAEA,mBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,6BAAAC;AAAA,OAGK;;;ACVP;AAAA,EAGE,WAAAC;AAAA,EAEA,sBAAAC;AAAA,OACK;AACP;AAAA,EACE,kBAAAC;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACfA,IAAM,gCAAuD;AAAA,EAClE,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA;AAAA,EAEjB,qBAAqB;AACvB;;;ACNA,SAAS,aAAAC,kBAAiB;AAenB,IAAM,qBAAqB,CAAC,YAAuC;AACxE,QAAM;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,EAAAC,WAAU,EAAE,MAAM,8BAA8B,mBAAK,QAAS;AAC9D,QAAM,EAAE,eAAe,eAAe,QAAQ,IAAI;AAElD,QAAM,SAAS,4BAAW;AAC1B,QAAM,UAAU,WAAW;AAE3B,QAAM,eAAe,WAAW,kBAAkB;AAClD,QAAM,eAAe,WAAW,kBAAkB;AAClD,QAAM,kBAAkB,kBAAkB;AAC1C,QAAM,kBAAkB,kBAAkB;AAE1C,QAAM,iBAAiB,QAAQ,gCAAa,KAAK;AACjD,QAAM,iBAAiB,QAAQ,gCAAa,KAAK;AACjD,QAAM,oBAAoB,QAAQ,sCAAgB,KAAK;AACvD,QAAM,oBAAoB,QAAQ,sCAAgB,KAAK;AAEvD,MAAI,CAAC,gBAAgB,gBAAgB;AACnC,IAAAA,WAAU,EAAE;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,gBAAgB,gBAAgB;AACnC,IAAAA,WAAU,EAAE;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,mBAAmB,mBAAmB;AACzC,IAAAA,WAAU,EAAE;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,mBAAmB,mBAAmB;AACzC,IAAAA,WAAU,EAAE;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,eAAe,gBAAgB;AAAA,IAC/B,eAAe,gBAAgB;AAAA,IAC/B,eAAe,mBAAmB;AAAA,IAClC,eAAe,mBAAmB;AAAA,EACpC;AACF;AAEO,IAAM,mBAAmB,CAC9B,YACG;AAEH,SAAO,OAAO,OAAO,OAAO,EAAE,KAAK,OAAO;AAC5C;AAEO,IAAM,aAAa;AACnB,IAAM,eAAe,CAAC,OAAe;AAC1C,SAAO,GAAG,UAAU,GAAG,EAAE;AAC3B;AAEO,IAAM,iBAAiB;AACvB,IAAM,mBAAmB,CAAC,OAAe;AAC9C,SAAO,GAAG,cAAc,GAAG,EAAE;AAC/B;;;ACpFA;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AACP,SAAS,sBAAuC;AAyBzC,IAAM,mCAAN,cAA+C,eAA6C;AAAA,EACjG,OAAO;AACL,WAAO,MAAM,OAAO;AAAA,EACtB;AAAA,EAEA,QAAQ;AACN,WAAO,MAAM,OAAO;AAAA,EACtB;AACF;AAKO,IAAM,4BAA4B,gBAGvC,kCAAkC;AAAA,EAClC,WAAW,MAAM;AAAA,EACjB,aAAa,MAAM;AAAA,EACnB,WAAW,MAAM;AAAA,EACjB,aAAa,MAAM;AAAA,EACnB,qBAAqB,MAAM;AAAA,EAC3B,gBAAgB,MAAM;AAAA,EACtB,qBAAqB,MAAM;AAC7B,CAAC;;;ACzDD;AAAA,EACE,eAAAC;AAAA,EAGA;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,OASK;AAIP,IAAM,OAAO,MAAM;AAAC;AAEpB,IAAM,qCAAqC;AAE3C,IAAM,qCAAqC,oBAAoB;AAAA,EAC7D,OAAO;AACT,CAAC;AAED,IAAM,sCAAsC;AAAA,EAC1C;AACF;AAaA,IAAM,qBAAoE;AAAA;AAAA,EAExE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIA,IAAM,oBAAoB,CACxB,UACoD;AAEpD,SAAO,mBAAmB,SAAS,KAAK;AAC1C;AAEA,IAAM,iCAAiC,CACrC,kBACG;AACH,SAAOA,2BAA0B,kBAAkB,EAAE,OAAO,CAAC,UAAU;AACrE,WAAO,CAAC,cAAc,SAAS,KAAK;AAAA,EACtC,CAAC;AACH;AAEA,IAAM,yBAAyB,CAAC,kBAA4B;AAC1D,SAAO,cAAc;AAAA,IAAK,CAAC,UACzB,MAAM,SAAS,kCAAkC;AAAA,EACnD;AACF;AAEA,IAAM,uBAAuB,CAAC,WAA2C;AACvE,MAAI,OAAO,SAAS,qBAAqB;AACvC,WAAO,OAAO,QAAQ,aAAa;AAAA,EACrC;AAEA,SAAO,CAAC,OAAO,QAAQ,MAAM;AAC/B;AAEO,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AACF,MAGM;AACJ,QAAM,gBAAgB,qBAAqB,MAAM;AAEjD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,oBAAc,QAAQ,CAAC,WAAsC;AAC3D,mBAAW,OAAO,OAAO,EAAE;AAAA,MAC7B,CAAC;AACD;AAAA,IACF;AACE,oBAAc,QAAQ,CAAC,WAAsC;AAC3D,mBAAW,IAAI,OAAO,IAAI,MAAM;AAAA,MAClC,CAAC;AAAA,EACL;AAEA,SAAO,MAAM,KAAK,WAAW,OAAO,CAAC;AACvC;AAEA,IAAM,8BAA8B,CAClC,MACA,kBACG;AACH,QAAM,SAAS,+BAA+B,aAAa;AAE3D,SAAO,QAAQ,CAAC,UAAU;AAaxB,SAAK,KAAK,OAAc,IAAI;AAAA,EAC9B,CAAC;AAMD,QAAM,qBAAqB,CAAC,EAAE,QAAQ,MAAoC;AACxE,SAAK,KAAK,oCAAoC,EAAE,QAAQ,CAAC;AAAA,EAC3D;AAGA,OAAK,GAAG,qCAAqC,kBAAkB;AAM/D,QAAM,UAAU,MAAM;AAEpB,SAAK,IAAI,qCAAqC,kBAAkB;AAAA,EAClE;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;AAEA,UAAU,0BAA0B;AAAA,EAClC;AAAA,EACA;AACF,GAGiB;AACf,QAAM,aAAyB,oBAAI,IAAI;AAEvC,YAAU,OAAO,cAA8C;AAC7D,UAAM,gBACJ,aAAa,SAAS,sBAClB,aAAa,QAAQ,aAAa,KAClC,aAAa,QAAQ;AAE3B,UAAM,UAAU,kBAAkB,EAAE,QAAQ,cAAc,WAAW,CAAC;AACtE,UAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOxB,iBAAiB;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,KAAK,qCAAqC,iBAAiB;AAAA,EACtE;AAEA,SAAO,MAAM;AACX,UAAM,eAA+C,MAAMD,aAAY;AAAA,MACrE;AAAA,MACA,CAAC,EAAE,KAAK,MAAW;AACjB,eAAO,kBAAkB,IAAI;AAAA,MAC/B;AAAA,IACF;AAEA,UAAMA,aAAY,KAAK,QAAQ,YAAY;AAAA,EAC7C;AACF;AAEO,IAAM,0BACX,UAAU,qBAAqB;AAAA,EAC7B,UAAU,EAAE,eAAe;AAAA,EAC3B;AACF,GAAiB;AAEf,QAAM,gBAAgB,SAAS,iBAAiB;AAEhD,MAAI,CAAC,uBAAuB,aAAa,GAAG;AAC1C;AAAA,EACF;AAEA,QAAM,EAAE,QAAQ,IAAI,4BAA4B,UAAU,aAAa;AAEvE,QAAMA,aAAY,KAAK,2BAA2B;AAAA,IAChD;AAAA,IACA;AAAA,EACF,CAAC;AAED,WAAS,KAAK,WAAW,MAAM;AAC7B,YAAQ;AAAA,EACV,CAAC;AACH;;;ACxNF;AAAA,EACE,aAAAE;AAAA,EACA,eAAAC;AAAA,EAOA;AAAA,EACA;AAAA,OAEK;AAYA,IAAM,0BAGT,WAAW,SAAuB;AACpC,EAAAD,WAAU,EAAE,MAAM,iCAAiC;AACnD,QAAM,EAAE,UAAU,UAAU,cAAc,QAAQ,OAAO,IAAI;AAC7D,QAAM,EAAE,eAAe,IAAI;AAC3B,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAM,SACJ,MAAMC,aAAY,KAAK,gBAAgB,CAACC,YAAuB;AAC7D,QAAIA,QAAO,SAAS,uBAAuB;AACzC,aAAOA,QAAO,QAAQ,OAAO,cAAc;AAAA,IAC7C;AACA,WAAO;AAAA,EACT,CAAC;AAQH,QAAM,EAAE,OAAO,IAAI,OAAO;AAC1B,MAAI,iCAAQ,WAAW;AACrB,UAAM,OAAuC,MAAMD,aAAY;AAAA,MAC7D,mBAAmB;AAAA,IACrB;AACA,UAAM,SAAS,OAAO,OAAO,IAAI,EAAE,KAAK,CAAC,QAAQ;AAC/C,aAAO,cAAc,OAAO,IAAI,aAAa,OAAO;AAAA,IACtD,CAAC;AACD,QAAI,QAAQ;AACV,YAAMA,aAAY;AAAA,QAChB,iBAAiB,OAAO;AAAA,UACtB,IAAI,SAAS;AAAA,UACb,QAAQ,OAAO,QAAQ;AAAA,UACvB,eAAe,OAAO,QAAQ;AAAA,UAC9B,UAAU,OAAO;AAAA,QACnB,CAAC;AAAA,MACH;AAEA;AAAA,IACF,OAAO;AACL,uCAAS,EAAE,OAAO,IAAI,MAAM,mBAAmB,EAAE;AAAA,IACnD;AAAA,EACF;AACA,EAAAD,WAAU,EAAE,MAAM,+BAA+B;AACnD;;;AC1EA;AAAA,EAIE,aAAAG;AAAA,EACA,eAAAC;AAAA,EAEA;AAAA,EACA,wBAAAC;AAAA,OAIK;;;ACZP;AAAA,EACE,aAAAC;AAAA,EAKA,SAAAC;AAAA,OACK;AAGA,IAAM,oBAAoB,WAC/B,SACc;AACd,EAAAD,WAAU,EAAE,MAAM,2BAA2B;AAC7C,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,QAAQ;AAAA,IACxB,aAAa,EAAE,KAAK,KAAK,OAAO;AAAA,EAClC,IAAI;AAIJ,MAAI,iBAAiB,IAAuB,QAAQ,OAAO,EAAE;AAC7D,MAAI,CAAC,gBAAgB;AACnB,qBAAiBC,OAAM,8BAA8B;AAAA,MACnD,OAAO,YAAY;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,mBAAe,WAAW,OAAO;AAAA,EACnC;AACA,MAAuB,QAAQ,OAAO,IAAI,cAAc;AAExD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,kBAAY,KAAK,kBAAkB,cAAc;AACjD;AAAA,IACF,KAAK;AACH,kBAAY,KAAK,gBAAgB,cAAc;AAC/C,aAA0B,QAAQ,OAAO,EAAE;AAC3C;AAAA,IACF;AACE,MAAAD,WAAU,EAAE,KAAK,gCAAgC,IAAI,GAAG;AACxD;AAAA,EACJ;AAEA,EAAAA,WAAU,EAAE,MAAM,yBAAyB;AAC7C;;;AC/CA;AAAA,EACE,aAAAE;AAAA,EAIA,SAAAC;AAAA,EAGA,wBAAAC;AAAA,OACK;AAGA,IAAM,oBAAoB,WAC/B,SACc;AACd,EAAAF,WAAU,EAAE,MAAM,2BAA2B;AAC7C,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,QAAQ;AAAA,IACxB,aAAa,EAAE,KAAK,KAAK,OAAO;AAAA,EAClC,IAAI;AAIJ,MAAI,oBAAoB,IAA0B,QAAQ,UAAU,EAAE;AACtE,MAAI,CAAC,mBAAmB;AACtB,wBAAoBC,OAAM,iCAAiC;AAAA,MACzD,OAAO,YAAY;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,sBAAkB,WAAW,OAAO;AAAA,EACtC;AACA,MAA0B,QAAQ,UAAU,IAAI,iBAAiB;AAEjE,QAAM,QAAQC,sBAAqB,IAAI;AAEvC,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK,2BAA2B;AAC9B,kBAAY,KAAK,OAAO,iBAAiB;AACzC;AAAA,IACF;AAAA,IACA,KAAK;AACH,kBAAY,KAAK,OAAO,iBAAiB;AACzC,aAA6B,QAAQ,UAAU,EAAE;AACjD;AAAA,IACF;AACE,MAAAF,WAAU,EAAE,KAAK,gCAAgC,IAAI,GAAG;AACxD;AAAA,EACJ;AAEA,EAAAA,WAAU,EAAE,MAAM,yBAAyB;AAC7C;;;ACrDA;AAAA,EACE,aAAAG;AAAA,EAIA,SAAAC;AAAA,EAGA,wBAAAC;AAAA,OACK;AAGA,IAAM,sBAAsB,WACjC,SACc;AACd,EAAAF,WAAU,EAAE,MAAM,6BAA6B;AAC/C,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,QAAQ;AAAA,IACxB,aAAa,EAAE,KAAK,KAAK,OAAO;AAAA,EAClC,IAAI;AAIJ,MAAI,mBAAmB,IAAyB,QAAQ,SAAS,EAAE;AACnE,MAAI,CAAC,kBAAkB;AACrB,uBAAmBC,OAAM,gCAAgC;AAAA,MACvD,OAAO,YAAY;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,qBAAiB,WAAW,OAAO;AAAA,EACrC;AACA,MAAyB,QAAQ,SAAS,IAAI,gBAAgB;AAE9D,QAAM,QAAQC,sBAAqB,IAAI;AAEvC,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK,0BAA0B;AAC7B,kBAAY,KAAK,OAAO,gBAAgB;AACxC;AAAA,IACF;AAAA,IACA,KAAK;AACH,kBAAY,KAAK,OAAO,gBAAgB;AACxC,aAA4B,QAAQ,SAAS,EAAE;AAC/C;AAAA,IACF;AACE,MAAAF,WAAU,EAAE,KAAK,gCAAgC,IAAI,GAAG;AACxD;AAAA,EACJ;AAEA,EAAAA,WAAU,EAAE,MAAM,2BAA2B;AAC/C;;;AH7BO,IAAM,cAAqD,WAChE,SACc;AACd,EAAAG,YAAU,EAAE,MAAM,qBAAqB;AAEvC,QAAM,EAAE,UAAU,UAAU,YAAY,IAAI;AAC5C,QAAM,EAAE,eAAe,IAAI;AAE3B,YAAU,OAAO,QAAqB;AACpC,UAAM,EAAE,MAAM,QAAQ,IAAI;AAE1B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,cAAMC,aAAY,KAAK,eAAe,sBAAsB,iCACvD,UADuD;AAAA,UAE1D,UAAU;AAAA,UACV,cAAc;AAAA,QAChB,EAAC;AACD;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAMA,aAAY,KAAK,qBAAqB;AAAA,UAC1C;AAAA,WACG,QACJ;AACD;AAAA;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAMA,aAAY,KAAK,mBAAmB;AAAA,UACxC;AAAA,WACG,QACJ;AACD;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAMA,aAAY,KAAK,mBAAmB;AAAA,UACxC;AAAA,WACG,QACJ;AACD;AAAA,MACF,KAAK,6BAA6B;AAChC,oBAAY,KAAK,sBAAsB,OAAO;AAC9C;AAAA,MACF;AAAA,MACA,KAAK,wBAAwB;AAC3B,cAAM,EAAE,OAAO,IAAI;AACnB,YAAI,aAAa,QAAQ;AACvB,gBAAM,SAAS,OAAO,UAAU,YAAY;AAC5C,sBAAY,KAAK,kBAAkB,MAAM,IAAI,OAAO;AAGpD,gBAAM,mBAAmB,OAAO,UAAU,UAAU;AACpD,sBAAY,KAAK,kBAAkB,gBAAgB,IAAI,OAAO;AAAA,QAChE;AACA;AAAA,MACF;AAAA,MACA,KAAK,wBAAwB;AAE3B,oBAAY,qBAAqB,OAAO;AACxC;AAAA,MACF;AAAA,MACA;AACE;AAAA,IACJ;AAEA,UAAM,QAAQC,sBAAqB,MAAM,OAAO;AAIhD,gBAAY,KAAK,OAAO,OAAO;AAAA,EACjC;AAEA,QAAM,eAAe,CAAC,WAAuB;AAC3C,WAAO,OAAO,KAAK,WAAW,QAAQ;AAAA,EACxC;AAEA,SAAO,MAAM;AACX,UAAM,SAAsB,MAAMD,aAAY;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AAEA,UAAMA,aAAY,KAAK,QAAQ,MAAM;AAAA,EACvC;AAEA,EAAAD,YAAU,EAAE,MAAM,mBAAmB;AACvC;;;ANvEO,IAAM,4BAAN,cAGGG,gBAEV;AAAA,EALO;AAAA;AAML,wBAAQ,oBAAmB,oBAAI,IAA4B;AAC3D,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAAA;AAAA,EAER,IAAI,UAAU;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW,KAAiB;AAC9B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,kBAAkB,SAA4B;AAChD,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,IAAI,oBAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,MAAM,KAAK,KAAK,gBAAgB;AAAA,EACzC;AAAA,EAEQ,8BAA8B;AACpC,QAAI,CAAC,oBAAoB,EAAG;AAG5B,+BAA2B,EAAE,KAAK,CAAC,kBAAkB;AACnD,oBAAc,GAAG,WAAW,OAAO,SAAS;AAjFlD;AAkFQ,cAAM,SAAS,KAAK,SAAS;AAC7B,cAAM,sBAAsB,KAAK,QAAQ,KAAK,CAAC,WAAW;AACxD,gBAAM,kBAAkB,OAAO,QAAQ;AAEvC,iBACE,oBAAoB,UACnB,oBAAoB,MAAM,WAAW,aACrC,oBAAoB,aAAa,WAAW;AAAA,QAEjD,CAAC;AACD,YAAI,qBAAqB;AACvB,eAAK,KAAK,wBAAwB;AAAA,YAChC,UAAU,oBAAoB,QAAQ;AAAA,YACtC,OAAO,oBAAoB,QAAQ;AAAA,UACrC,CAAC;AAMD,kBAAM,gBAAK,UAAS,cAAd,4BAA0B;AAEhC,gBAAM,kBAAkB,MAAM,eAAe,SAAS;AAEtD,cAAI,EAAC,mDAAiB,UAAU;AAGhC,eAAK,KAAK,mBAAmB;AAAA,YAC3B,UAAU;AAAA,cACR,UAAU,oBAAoB,QAAQ;AAAA,cACtC,OAAO,oBAAoB,QAAQ;AAAA,YACrC;AAAA,YACA,SAAS;AAAA,cACP,UAAU,gBAAgB;AAAA,cAC1B,OAAO,gBAAgB;AAAA,YACzB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA,EAGmB,YAAY;AAC7B,SAAK,iBAAiB,MAAM;AAE5B,UAAM,UAAU;AAAA,EAClB;AAAA;AAAA,EAGA,MAAe,OAAO,IAAa;AACjC,SAAK,iBAAiB,QAAQ,CAAC,gBAAgB;AAC7C,kBAAY,MAAM;AAAA,IACpB,CAAC;AAED,WAAO,MAAM,OAAO,EAAE;AAAA,EACxB;AAAA,EAEA,QAAQ;AACN,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,0BAA0B;AACxB,SAAK,UAAU,qBAAqB;AAAA,MAClC,QAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa;AACX,QAAI,KAAK,SAAU,QAAO,KAAK;AAC/B,SAAK,WAAW,IAAI,MAAM;AAC1B,SAAK,4BAA4B;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAAiB,UAAkB;AACjC,WAAO,KAAK,WAAW,IAAI,iBAAiB,QAAQ,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAAgC,CAAC,GAAG;AACzD,WAAO,IAAI,QAAgC,OAAO,SAAS,WAAW;AA5K1E;AA6KM,YAAM;AAAA,QACJ,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF,IAAI;AACJ,UAAI;AACF,cAAM,gBAA6B,MAAM,gBAAgB;AAAA,UACvD,OAAO,UAAU,OAAO,gCAAgC;AAAA,UACxD;AAAA,QACF,CAAC;AACD,cAAM,UAAiC,iCAClC,KAAK,UAD6B;AAAA,UAErC,aAAa;AAAA,UACb,aAAa;AAAA,UACb,aAAa;AAAA,UACb,cAAc;AAAA,UACd,eAAe,mCACT,UAAK,YAAL,mBAAc,kBAAiB,CAAC,IADvB;AAAA,YAEb,cAAc,KAAK;AAAA,YACnB,UAAU,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,cAAM,cAAcC,SAIlB;AAAA,UACA,OAAO,KAAK;AAAA,UACZ,WAAW;AAAA,QACb,CAAC,EAAE,OAAO;AAMV,sBAAc,eAAe,EAAE,QAAQ,CAAC,MAAM;AAC5C,YAAE,iBAAiB,SAAS,MAAM;AAChC,gBAAI,eAAe,YAAY,QAAQ;AACrC,0BAAY,MAAM;AAAA,YACpB;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAED,oBAAY,KAAK,WAAW,MAAM;AAChC,sBAAY,KAAK,WAAW;AAC5B,eAAK,iBAAiB,OAAO,WAAW;AAAA,QAC1C,CAAC;AAED,oBAAY,UAAU,2BAA2B;AAAA,UAC/C,QAAgB;AAAA,UAChB,QAAQ,MAAM,QAAQ,WAAW;AAAA,UACjC,QAAQ;AAAA,UACR,cAAc;AAAA,YACZ,UAAU,KAAK;AAAA,UACjB;AAAA,QACF,CAAC;AAED,aAAK,iBAAiB,IAAI,WAAW;AACrC,YAAI,UAAU;AACZ,iBAAO,MAAM,YAAY,KAAK;AAAA,QAChC;AACA,eAAO,QAAQ,WAAW;AAAA,MAC5B,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,qBAAqB,KAAK;AAC5C,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,EAAE,SAAS,GAAyB;AAChD,UAAM,SAAS,KAAK,QAAQ;AAC5B,SAAK;AAAA;AAAA,MAEH,GAAGC,mBAAkB;AAAA,MACrB,OAAO,UAAkB;AACvB,cAAM,cAAc,MAAM,eAAe,MAAM;AAC/C,cAAM,aAAa,MAAM,eAAe,KAAK;AAE7C,cAAM,UAAS,yCAAY,eAAa,2CAAa;AACrD,YAAI,EAAC,yCAAY,aAAY,OAAQ;AAErC,aAAK,KAAK,mBAAmB;AAAA,UAC3B,UAAU;AAAA,YACR,UAAU,2CAAa;AAAA,YACvB,OAAO,2CAAa;AAAA,UACtB;AAAA,UACA,SAAS;AAAA,YACP,UAAU,WAAW;AAAA,YACrB,OAAO,WAAW;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,KAAK,kBAA6B,sBAAsB,QAAQ,CAAC;AAAA,EAC1E;AACF;;;AUlRA;AAAA,EACE,SAAAC;AAAA,EACA,mBAAAC;AAAA,OAKK;AACP,SAAS,kBAAAC,uBAAuC;AAyBzC,IAAM,8BAAN,cAA0CA,gBAAwC;AAAA,EACvF,OAAO;AACL,WAAO,MAAM,OAAO;AAAA,EACtB;AAAA,EAEA,QAAQ;AACN,WAAO,MAAM,OAAO;AAAA,EACtB;AACF;AASO,IAAM,uBAAuBD,iBAGlC,6BAA6B;AAAA,EAC7B,WAAWD,OAAM;AAAA,EACjB,aAAaA,OAAM;AAAA,EACnB,WAAWA,OAAM;AAAA,EACjB,aAAaA,OAAM;AAAA,EACnB,gBAAgBA,OAAM;AAAA,EACtB,qBAAqBA,OAAM;AAAA,EAC3B,qBAAqBA,OAAM;AAC7B,CAAC;;;AXlBM,IAAM,6BAAN,cACG,0BAEV;AAAA,EAIE,YAAY,SAAkC;AAC5C,UAAM,OAAO;AAJf,wBAAQ,eAAc,oBAAI,IAAuB;AACjD,wBAAQ;AAKN,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAI,mBAAmB,OAAsC;AAC3D,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,IAAI,qBAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,gBAAgB;AAhEtB;AAiEI,YAAO,UAAK,wBAAL,mBAA0B;AAAA,EACnC;AAAA,EAEA,IAAI,kBAAkB;AApExB;AAqEI,YAAO,gBAAK,wBAAL,mBAA0B,OAAO,OAAO;AAAA,MAC7C,CAAC,UAAU,MAAM,cAAc,KAAK;AAAA,UAD/B,mBAEJ;AAAA,EACL;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,MAAM,KAAK,KAAK,WAAW;AAAA,EACpC;AAAA,EAEA,IAAI,oBAAoB;AACtB,WAAO,KAAK,OAAO,CAAC,EAAE,QAAQ,MAAM;AA/ExC;AAgFM,YAAM,EAAE,UAAU,IAAI;AACtB,cAAQ,4CAAkC,YAAlC,YAA6C;AAAA,IACvD,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,OAAO,CAAC,EAAE,QAAQ,MAAM;AAtFxC;AAuFM,YAAM,EAAE,UAAU,IAAI;AACtB,cAAQ,kDAAkC,SAAlC,mBAAwC,WAAxC,YAAkD,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa;AACnB,SAAK,UAAU,eAAe;AAAA,MAC5B,QAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGmB,mBAAmB;AACpC,UAAM,uBAAuB,KAAK,WAAW,EAAE,IAAI,CAAC,UAAU;AAC5D,aAAO,SAAS,OAAO,KAAK,CAAC;AAAA,IAC/B,CAAC;AACD,WAAOG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGU,YAAY;AACpB,SAAK,YAAY,MAAM;AAEvB,UAAM,UAAU;AAAA,EAClB;AAAA;AAAA,EAGA,MAAe,OAAO,IAAa;AACjC,SAAK,YAAY,QAAQ,CAAC,WAAW;AACnC,aAAO,MAAM;AAAA,IACf,CAAC;AAED,WAAO,MAAM,OAAO,EAAE;AAAA,EACxB;AAAA,EAEA,OAAO;AACL,WAAO,MAAM,OAAyB;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB;AAEd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB;AAEd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA,EAGA,MAAM,wBAAwB,OAAuC,CAAC,GAAG;AACvE,WAAO,KAAK,iBAAiB,IAAI;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAyB,CAAC,GAAG;AACrC,UAAsC,WAA9B,aAAW,KA3JvB,IA2J0C,IAAV,kBAAU,IAAV,CAApB;AACR,WAAO,KAAK,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAA6B,CAAC,GAAG;AAC7C,UAAsC,WAA9B,aAAW,KAtKvB,IAsK0C,IAAV,kBAAU,IAAV,CAApB;AACR,WAAO,KAAK,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAAyB,CAAC,GAAG;AAC3C,WAAO,IAAI,QAA2B,OAAO,SAAS,WAAW;AAjLrE;AAkLM,YAAM,EAAE,WAAW,MAAM,QAAQ,OAAO,QAAQ,MAAM,IAAI;AAC1D,UAAI,CAAC,SAAS,CAAC,OAAO;AACpB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAiC,iCAClC,KAAK,UAD6B;AAAA,QAErC,aAAa;AAAA,QACb,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,aAAa;AAAA,QACb,eAAe,mCACT,UAAK,YAAL,mBAAc,kBAAiB,CAAC,IADvB;AAAA,UAEb,cAAc,KAAK;AAAA,UACnB,UAAU,KAAK;AAAA,QACjB;AAAA,MACF;AAEA,YAAM,aAAaC,SAIjB;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,WAAW;AAAA,MACb,CAAC,EAAE,OAAO;AAEV,iBAAW,KAAK,WAAW,MAAM;AAC/B,mBAAW,KAAK,WAAW;AAC3B,aAAK,YAAY,OAAO,UAAU;AAAA,MACpC,CAAC;AAED,UAAI;AACF,mBAAW,UAAU,2BAA2B;AAAA,UAC9C,QAAgB;AAAA,UAChB,QAAQ,MAAM,QAAQ,UAAU;AAAA,UAChC,QAAQ;AAAA,UACR,cAAc;AAAA,YACZ,UAAU,KAAK;AAAA,UACjB;AAAA,QACF,CAAC;AAED,aAAK,YAAY,IAAI,UAAU;AAC/B,YAAI,UAAU;AACZ,iBAAO,MAAM,WAAW,KAAK;AAAA,QAC/B;AACA,eAAO,QAAQ,UAAU;AAAA,MAC3B,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,oBAAoB,KAAK;AAC3C,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,IAAM,sBAAsBC,iBAGjC,4BAA4B;AAAA,EAC5B,WAAWC,OAAM;AAAA,EACjB,aAAaA,OAAM;AAAA,EACnB,WAAWA,OAAM;AAAA,EACjB,aAAaA,OAAM;AAAA,EACnB,MAAMA,OAAM;AAAA,EACZ,QAAQA,OAAM;AAAA,EACd,gBAAgBA,OAAM;AAAA,EACtB,iBAAiBA,OAAM;AAAA,EACvB,qBAAqBA,OAAM;AAAA,EAC3B,kBAAkBA,OAAM;AAAA,EACxB,qBAAqBA,OAAM;AAAA,EAC3B,cAAcA,OAAM;AAAA,EACpB,kBAAkBA,OAAM;AAAA,EACxB,YAAYA,OAAM;AAAA,EAClB,YAAYA,OAAM;AAAA,EAClB,WAAWA,OAAM;AAAA,EACjB,cAAcA,OAAM;AAAA,EACpB,mBAAmBA,OAAM;AAAA,EACzB,gBAAgBA,OAAM;AAAA,EACtB,gBAAgBA,OAAM;AAAA,EACtB,eAAeA,OAAM;AAAA,EACrB,gBAAgBA,OAAM;AAAA,EACtB,cAAcA,OAAM;AAAA,EACpB,MAAMA,OAAM;AAAA,EACZ,mBAAmBA,OAAM;AAAA,EACzB,SAASA,OAAM;AAAA,EACf,SAASA,OAAM;AAAA,EACf,YAAYA,OAAM;AAAA,EAClB,YAAYA,OAAM;AAAA,EAClB,eAAeA,OAAM;AAAA,EACrB,eAAeA,OAAM;AAAA,EACrB,kBAAkBA,OAAM;AAAA,EACxB,kBAAkBA,OAAM;AAAA,EACxB,SAASA,OAAM;AAAA,EACf,QAAQA,OAAM;AAAA,EACd,YAAYA,OAAM;AAAA,EAClB,aAAaA,OAAM;AAAA,EACnB,MAAMA,OAAM;AAAA,EACZ,QAAQA,OAAM;AAAA,EACd,eAAeA,OAAM;AAAA,EACrB,wBAAwBA,OAAM;AAChC,CAAC;AAEM,IAAM,qBAAqB,CAAC,SAA4C;AAC7E,SAAO,gBAAgB;AACzB;AAGO,IAAM,+BAA+B,CAC1C,WACqB;AACrB,QAAM,OAAOF,SAIX;AAAA,IACA,OAAO,OAAO;AAAA,IACd,aAAa,OAAO;AAAA,IACpB,WAAW;AAAA,EACb,CAAC,EAAE,MAAM;AAET,SAAO;AACT;;;AY/SA;AAAA,EACE,WAAAG;AAAA,OAWK;;;ACZP,OAAO,eAAe;AACtB,SAAS,aAAAC,mBAAiB;AAKnB,IAAM,aAAa,MAAM;AAC9B,MAAI,UAAU,OAAO,gBAAgB;AACnC,WAAO,OAAO;AAAA,EAChB;AACA,SAAO;AACT;AAEO,IAAM,wBAAwB,CAAC,UAAkB;AAbxD;AAcE,MAAI,WAAmB;AACvB,MAAI;AACF,UAAM,aAAa,UAAqC,KAAK;AAC7D,gBAAW,8CAAY,MAAZ,YAAiB;AAAA,EAC9B,SAAS,GAAG;AACV,QAAI;AACF,YAAM,aAAa,UAA0B,OAAO,EAAC,QAAQ,KAAI,CAAC;AAClE,iBAAW,WAAW,OAAO;AAAA,IAC/B,SAAQC,IAAA;AACN,UAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,QAAAD,YAAU,EAAE,MAAM,8CAA8C,KAAK;AAAA,MACvE;AACA,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,QAAQ,QAAQ,QAAQ;AAC9B,SAAO;AAAA,IACL,cAAc,SAAS,MAAM,QAAQ;AAAA,IACrC,aAAa,SAAS,MAAM,QAAQ;AAAA,IACpC,WAAW,SAAS,MAAM,QAAQ;AAAA,EACpC;AACF;;;ACpCO,IAAM,8BAA8B;;;ACA3C;AAAA,EACE,aAAAE;AAAA,EACA,eAAAC;AAAA,OAOK;AAWA,IAAM,iBACX,WAAW,SAAuB;AAChC,EAAAD,YAAU,EAAE,MAAM,wBAAwB;AAC1C,QAAM,EAAE,UAAU,cAAc,UAAU,OAAO,IAAI;AACrD,QAAM,EAAE,eAAe,IAAI;AAC3B,QAAM,EAAE,qBAAqB,IAAI;AAEjC,YAAU,eAAe,QAAoB;AAE3C,WAAO,KAAK,OAAO,MAAM,OAAO,OAAO;AAAA,EACzC;AAEA,YAAU,kBAAkB,QAA+C;AAEzE,yBAAqB,OAAO,QAAQ,MAAM;AAAA,EAC5C;AAEA,QAAM,gBAAgB,CAAC,WAAuB;AAC5C,QAAI,OAAO,SAAS,kBAAkB;AACpC,aAAO,OAAO,QAAQ,WAAW;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,MAAM;AAEX,YAAM,SAAqB,MAAMC,aAAY;AAAA,QAC3C;AAAA,QACA,MAAM;AAAA,MACR;AAGA,YAAMA,aAAY,KAAK,gBAAgB,MAAM;AAG7C,UAAI,cAAc,MAAM,GAAG;AACzB,QAAAD,YAAU,EAAE,MAAM,mCAAmC,MAAM;AAC3D,cAAMC,aAAY;AAAA,UAChB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,IAAAD,YAAU,EAAE,MAAM,sBAAsB;AAAA,EAC1C;AACF;;;ACnEF;AAAA,EACE,aAAAE;AAAA,EACA,eAAAC;AAAA,OAMK;AAQA,IAAM,qBAA0C,WACrD,SACc;AACd,EAAAD,YAAU,EAAE,MAAM,4BAA4B;AAC9C,QAAM;AAAA,IACJ,UAAU,EAAE,eAAe;AAAA,IAC3B;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,aAAa,IAAI;AAEzB,QAAM,sBAAsB,CAAC,WAAuB;AAClD,WAAO,OAAO,KAAK,WAAW,eAAe;AAAA,EAC/C;AAEA,SAAO,MAAM;AACX,UAAM,SAA8C,MAAMC,aAAY;AAAA,MACpE;AAAA,MACA;AAAA,IACF;AACA,iBAAa,YAAY,OAAO,OAAO;AAAA,EACzC;AAEA,EAAAD,YAAU,EAAE,MAAM,0BAA0B;AAC9C;;;ACxCA;AAAA,EAGE,aAAAE;AAAA,EACA,eAAAC;AAAA,OAIK;;;ACRP;AAAA,EASE,WAAAC;AAAA,EAMA;AAAA,OACK;AA4BA,IAAM,6BAAN,cACG,cAEV;AAAA,EAGE,YAAY,SAAyC;AACnD,UAAM,OAAO;AAHf,wBAAQ;AAIN,SAAK,WAAW,QAAQ;AAAA,EAC1B;AAAA,EAEA,IAAI,KAAK;AACP,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,oBAAoB;AACtB,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,mBAAmB;AACrB,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,IAAI,iBAAiB;AACnB,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA;AAAA,EAGA,WAAW,SAAkC;AAE3C,UAAM,aAAa,gDACd,KAAK,WACL,UAFc;AAAA,MAGjB,QAAQ,kCACH,KAAK,SAAS,SACd,QAAQ;AAAA,IAEf;AACA,SAAK,WAAW;AAAA,EAClB;AACF;AAEO,IAAM,sCAAsC,CACjD,WAC4B;AAC5B,QAAM,SAASC,SAIb;AAAA,IACA,OAAO,OAAO;AAAA,IACd,WAAW;AAAA,EACb,CAAC,EAAE,MAAM;AAET,SAAO;AACT;;;AC3KA;AAAA,EAKE,aAAAC;AAAA,EACA,eAAAC;AAAA,OACK;;;ACPP,SAAS,aAAAC,mBAA8C;AAIhD,IAAM,iBAAiB,WAC5B,SACc;AACd,EAAAC,YAAU,EAAE,MAAM,wBAAwB;AAE1C,QAAM;AAAA,IACJ,QAAQ,EAAE,QAAQ;AAAA,IAClB,UAAU;AAAA,IACV;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,gBAAgB,IAAI;AAG5B,cAAY,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AAC3C,QACE,eAAe,8BACf,IAAI,kBAAkB,iBACtB;AACA,kBAAY,OAAO,GAAG;AAAA,IACxB;AAAA,EACF,CAAC;AAED,gBAAc,KAAK,aAAa,OAAO;AACvC,gBAAc,KAAK,aAAa,OAAO;AAEvC,EAAAA,YAAU,EAAE,MAAM,sBAAsB;AAC1C;;;AC/BA;AAAA,EACE,aAAAC;AAAA,EAGA,eAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,wBAAAC;AAAA,OACK;;;ACPP;AAAA,EAKE;AAAA,EACA,aAAAC;AAAA,OACK;AAOA,IAAM,qBAAqB,WAChC,SACc;AACd,EAAAC,YAAU,EAAE,MAAM,4BAA4B;AAC9C,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,QAAQ;AAAA,IACxB,aAAa,EAAE,KAAK,KAAK,OAAO;AAAA,EAClC,IAAI;AAEJ,QAAM,WAAW,QAAQ,OAAO;AAChC,MAAI,iBAAiB,IAA6B,QAAQ;AAC1D,MAAI,CAAC,kBAAkB,SAAS,kBAAkB;AAChD,qBAAiB,oCAAoC;AAAA,MACnD,OAAO,YAAY;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AACA,MAAI,gBAAgB;AAClB,mBAAe,WAAW,OAAO;AAAA,EACnC;AACA,MAA6B,UAAU,cAAc;AAErD,MAAI,KAAK,WAAW,iBAAiB,GAAG;AACtC,UAAM,aAAa,qBAAqB,IAAI;AAC5C,gBAAY,KAAK,YAAY,OAAyC;AAAA,EACxE;AAEA,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,kBAAY,KAAK,MAAM,OAAO;AAC9B;AAAA,IACF,KAAK;AACH,kBAAY,KAAK,MAAM,OAAO;AAC9B;AAAA,IACF,KAAK;AACH,kBAAY,KAAK,MAAM,OAAO;AAC9B,aAAgC,QAAQ;AACxC;AAAA,IACF,KAAK;AACH,kBAAY,KAAK,MAAM,OAAO;AAC9B;AAAA,IACF;AACE;AAAA,EACJ;AAEA,EAAAA,YAAU,EAAE,MAAM,0BAA0B;AAC9C;;;ACrBO,IAAM,qDAAqD,CAChE,WAC8B;AAC9B,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,SAAS,OAAO;AAAA,IAChB,iBAAiB,OAAO;AAAA,IACxB,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,MAAM,OAAO;AAAA,IACb,cAAc,OAAO;AAAA,IACrB,eAAe,OAAO;AAAA,IACtB,mBAAmB,OAAO;AAAA,IAC1B,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,kBAAkB,OAAO;AAAA,IACzB,oBAAoB,OAAO;AAAA,IAC3B,WAAW,OAAO;AAAA,EACpB;AACF;AAKO,IAAM,4DAA4D,CACvE,WACqC;AACrC,SAAO,iCACF,mDAAmD,MAAM,IADvD;AAAA,IAEL,SAAS,OAAO,QAAQ;AAAA,MAAI,CAAC,QAC3B,QAAQ,cAAc,OAAQ;AAAA,IAChC;AAAA,EACF;AACF;AAKO,IAAM,iDAAiD,CAC5D,WAC4B;AAC5B,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,iBAAiB,OAAO;AAAA,IACxB,eAAe,OAAO;AAAA,IACtB,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,kBAAkB,OAAO;AAAA,IACzB,aAAa,OAAO;AAAA,IACpB,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,sBAAsB,OAAO;AAAA,EAC/B;AACF;AAKO,IAAM,wDAAwD,CACnE,WACmC;AACnC,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,cAAc,OAAO;AAAA,IACrB,SAAS,OAAO;AAAA,IAChB,iBAAiB,OAAO;AAAA,IACxB,eAAe,OAAO;AAAA,IACtB,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,kBAAkB,OAAO;AAAA,IACzB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,QAAQ,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,IACb,SAAS,OAAO,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,sBAAsB,OAAO;AAAA,IAC7B,SAAS,OAAO;AAAA,EAClB;AACF;AAKO,IAAM,2CAA2C,CACtD,WACmC;AACnC,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,MAAM,iCACD,+CAA+C,OAAO,YAAY,IADjE;AAAA,MAEJ,SAAS,OAAO,aAAa,QAAQ;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAc,iCACT;AAAA,MACD,OAAO;AAAA,IACT,IAHY;AAAA,MAIZ,SAAS,OAAO,aAAa,QAAQ;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AA8CO,IAAM,qDAAqD,CAChE,WAC8D;AAC9D,SAAO;AAAA,IACL,iBAAiB,OAAO;AAAA,IACxB,SAAS,OAAO;AAAA,IAChB,QAAQ,mDAAmD,OAAO,MAAM;AAAA,EAC1E;AACF;AAMO,IAAM,sDAAsD,CACjE,WACoE;AACpE,SAAO;AAAA,IACL,MAAM,SAAS,OAAO,IAAI;AAAA,IAC1B,SAAS,mDAAmD,OAAO,OAAO;AAAA,EAC5E;AACF;AAKO,IAAM,sDAAsD,CACjE,WACkC;AAClC,SAAO;AAAA,IACL,iBAAiB,OAAO;AAAA,IACxB,SAAS,OAAO;AAAA,IAChB,QAAQ;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAKO,IAAM,kDAAkD,CAC7D,WAC8C;AAC9C,SAAO;AAAA,IACL,MAAM,SAAS,OAAO,IAAI;AAAA,IAC1B,SAAS;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAiCO,IAAM,2CAA2C,CACtD,WAC8C;AAC9C,SAAO;AAAA,IACL,MAAM,SAAS,OAAO,IAAI;AAAA,IAC1B,SAAS,OAAO;AAAA,EAClB;AACF;;;ACjSA,IAAM,uBAAN,MAAmE;AAAA,EACjE,YAAoB,QAAkB;AAAlB;AAAA,EAAoB;AAAA,EAExC,IAAI,KAAK;AACP,WAAO,KAAK,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,MAAM,CAAC;AAAA,EAC1D;AAAA,EAEA,IAAI,MAAM;AACR,WAAO,KAAK,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,KAAK,CAAC;AAAA,EACzD;AACF;AAEA,IAAM,mBAAN,MAA2D;AAAA,EAKzD,YACU,QACA,aACR;AAFQ;AACA;AANV,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAAA,EAKJ;AAAA,EAEJ,IAAI,YAAY;AAxBlB;AAyBI,SAAK,cACH,UAAK,eAAL,YACA,IAAI;AAAA,MACF,KAAK,OAAO;AAAA,QACV,CAAC,SAAS,SAAS,KAAK,eACtB,SAAS,GAAG,KAAK,WAAW,WAC5B,KAAK,WAAW,GAAG,KAAK,WAAW,aAAa;AAAA,MACpD;AAAA,IACF;AACF,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAY;AArClB;AAsCI,SAAK,cACH,UAAK,eAAL,YACA,IAAI;AAAA,MACF,KAAK,OAAO;AAAA,QACV,CAAC,SAAS,SAAS,KAAK,eACtB,SAAS,GAAG,KAAK,WAAW,WAC5B,KAAK,WAAW,GAAG,KAAK,WAAW,aAAa;AAAA,MACpD;AAAA,IACF;AACF,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,mBAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,MACjB,CAAC,SAAS,SAAS,KAAK,eACtB,SAAS,GAAG,KAAK,WAAW,iBAC5B,KAAK,WAAW,GAAG,KAAK,WAAW,oBAAoB;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,IAAI,wBAAwB;AAC1B,WAAO,KAAK,OAAO;AAAA,MACjB,CAAC,SAAS,SAAS,KAAK,eACtB,SAAS,GAAG,KAAK,WAAW,iBAC5B,KAAK,WAAW,GAAG,KAAK,WAAW,yBAAyB;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,OAAO;AAAA,MACjB,CAAC,SAAS,SAAS,KAAK,eACtB,SAAS,GAAG,KAAK,WAAW,cAC5B,KAAK,WAAW,GAAG,KAAK,WAAW,iBAAiB;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,IAAI,OAAO;AA1Eb;AA2EI,SAAK,SACH,UAAK,UAAL,YACA,IAAI;AAAA,MACF,KAAK,OAAO;AAAA,QACV,CAAC,SAAS,SAAS,KAAK,eACtB,KAAK,WAAW,GAAG,KAAK,WAAW,OAAO;AAAA,MAC9C;AAAA,IACF;AACF,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAY;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,KAAK;AAAA,IACP;AAAA,EAWF;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,OAAO;AAAA,MACjB,CAAC,SAAS,SAAS,KAAK,eACtB,KAAK,WAAW,GAAG,KAAK,WAAW,WAAW;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,OAAO;AAAA,MACjB,CAAC,SAAS,SAAS,KAAK,eAAe,KAAK,WAAW,GAAG,KAAK,WAAW,OAAO;AAAA,IACnF;AAAA,EACF;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,OAAO;AAAA,MACjB,CAAC,SAAS,SAAS,KAAK,eACtB,KAAK,WAAW,GAAG,KAAK,WAAW,SAAS;AAAA,IAChD;AAAA,EACF;AACF;AAEO,IAAM,mBAAN,MAA2D;AAAA,EAMhE,YAAoB,QAAkB;AAAlB;AALpB,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAAA,EAEgC;AAAA,EAEhC,uBAAuB,YAA+B;AAC5D,WAAO,IAAI;AAAA,MACT,KAAK,OAAO,OAAO,CAAC,SAAS,KAAK,WAAW,UAAU,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,OAAO;AA3Ib;AA4II,SAAK,SAAQ,UAAK,UAAL,YAAc,KAAK,uBAAuB,MAAM;AAC7D,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAS;AAhJf;AAiJI,SAAK,WAAU,UAAK,YAAL,YAAgB,KAAK,uBAAuB,QAAQ;AACnE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,MAAM;AACR,WAAO,KAAK,OAAO,KAAK,CAAC,eAAe,eAAe,KAAK;AAAA,EAC9D;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,OAAO,KAAK,CAAC,eAAe,WAAW,WAAW,QAAQ,CAAC;AAAA,EACzE;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,OAAO,KAAK,CAAC,eAAe,WAAW,WAAW,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,IAAI,aAAa;AAjKnB;AAkKI,SAAK,eACH,UAAK,gBAAL,YACA,IAAI;AAAA,MACF,KAAK,OAAO,OAAO,CAAC,SAAS,KAAK,WAAW,QAAQ,CAAC;AAAA,IACxD;AACF,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAO;AA1Kb;AA2KI,SAAK,SACH,UAAK,UAAL,YACA,IAAI;AAAA,MACF,KAAK,OAAO,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM,CAAC;AAAA,IACtD;AACF,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,OAAO,KAAK,CAAC,eAAe,eAAe,QAAQ;AAAA,EACjE;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,OAAO,KAAK,CAAC,eAAe,eAAe,aAAa;AAAA,EACtE;AACF;AAEO,IAAM,uBAAuB,CAAC,iBACjC,IAAI,iBAAiB,YAAY;;;AH5K9B,IAAM,iBAAiB,WAC5B,SACc;AAnBhB;AAoBE,EAAAC,YAAU,EAAE,MAAM,wBAAwB;AAC1C,QAAM,EAAE,QAAQ,aAAa,UAAU,cAAc,IAAI;AACzD,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,EAAE,KAAK,IAAI,IAAI;AAErB,QAAMC,aAAY,KAAKC,gBAAe,sBAAsB,iCACvD,UADuD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO1D,cAAc,yCAAyC,OAAO;AAAA,IAC9D,YAAY,WAAW,SAAS,YAAY;AAK1C,YAAM,aAAaC,sBAAqB,SAAS,OAAO;AACxD,YAAM,eAAe,iCAChB,aADgB;AAAA,QAEnB,QAAQ,iCACH,WAAW,SADR;AAAA,UAEN,WAAW,WAAW,OAAO;AAAA,QAC/B;AAAA,MACF;AAEA,YAAMF,aAAY,KAAK,oBAAoB,iCACtC,UADsC;AAAA,QAEzC,QAAQ,EAAE,MAAM,YAAY,SAAS,aAAa;AAAA,MACpD,EAAC;AAAA,IACH;AAAA,EACF,EAAC;AAED,gBAAQ,aAAa,YAArB,mBAA8B,QAAQ,CAAC,WAAgB;AACrD,QAAI,iBAAiB,IAA6B,OAAO,SAAU;AACnE,QAAI,CAAC,gBAAgB;AACnB,uBAAiB,oCAAoC;AAAA,QACnD,OAAO,cAAc;AAAA,QACrB,SAAS;AAAA,UACP;AAAA,UACA,SAAS,QAAQ;AAAA,UACjB,iBAAiB,QAAQ;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,qBAAe,WAAW;AAAA,QACxB;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,MAC3B,CAAC;AAAA,IACH;AACA,QAA6B,OAAO,WAAW,cAAc;AAAA,EAC/D;AAEA,gBAAc,SAAS,IAA6B,QAAQ,SAAS;AAErE,gBAAc,eAAe,qBAAqB,QAAQ,YAAY;AAEtE,QAAM,cAAc,iCACf,UADe;AAAA,IAElB,cAAc,cAAc;AAAA,EAC9B;AAEA,gBAAc,KAAK,eAAe,WAAW;AAE7C,EAAAD,YAAU,EAAE,MAAM,sBAAsB;AAC1C;;;AFrEO,IAAM,oBAAoB,WAC/B,SACc;AACd,QAAM;AAAA,IACJ;AAAA,IACA,UAAU,EAAE,eAAe;AAAA,IAC3B,UAAU;AAAA,EACZ,IAAI;AACJ,QAAM,gBAAgB,OAAO,QAAQ;AACrC,QAAM,sBAAsB,OAAO,QAAQ;AAE3C,EAAAI,YAAU,EAAE;AAAA,IACV,yCAAyC,aAAa,mBAAmB,mBAAmB;AAAA,EAC9F;AAGA,QAAMC,aAAY,KAAK,gBAAgB,iCAClC,UADkC;AAAA,IAErC;AAAA,EACF,EAAC;AAED,YAAU,OAAOC,SAAsB;AACrC,UAAM,EAAE,MAAM,QAAQ,IAAIA;AAE1B,YAAQ,MAAM;AAAA,MACZ,KAAK;AAEH;AAAA,MACF,KAAK;AAEH,cAAMD,aAAY,KAAK,gBAAgB,iCAClC,UADkC;AAAA,UAErC,QAAAC;AAAA,QACF,EAAC;AACD,eAAO;AAAA,MACT,KAAK;AACH,sBAAc,KAAK,MAAM,OAAO;AAChC,sBAAc,KAAK,gBAAgB,OAAO;AAC1C;AAAA,MACF,KAAK;AACH,sBAAc,KAAK,MAAM,OAAO;AAChC;AAAA,MACF,KAAK;AACH,sBAAc,KAAK,MAAM,OAAO;AAChC;AAAA,MACF,KAAK;AACH,sBAAc,KAAK,MAAM,OAAO;AAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBF,KAAK;AAAA,MACL,KAAK,eAAe;AAClB,cAAMD,aAAY,KAAK,oBAAoB,iCACtC,UADsC;AAAA,UAEzC,QAAAC;AAAA,QACF,EAAC;AACD,cAAM,cACJ,oDAAoDA,OAAM;AAC5D,cAAMD,aAAY,IAAI,gBAAgB,WAAW;AACjD;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAM,cACJ,gDAAgDC,OAAM;AACxD,cAAMD,aAAY,IAAI,gBAAgB,WAAW;AACjD;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AAErB,sBAAc,qBAAqBC,QAAO;AAC1C,sBAAc,KAAK,MAAM,OAAO;AAChC,cAAM,cAAc,yCAAyCA,OAAM;AACnE,cAAMD,aAAY,IAAI,gBAAgB,WAAW;AACjD;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAMA,aAAY,KAAK,oBAAoB,iCACtC,UADsC;AAAA,UAEzC,QAAAC;AAAA,QACF,EAAC;AACD;AAAA,MACF;AAAA,MACA,SAAS;AACP,QAAAF,YAAU,EAAE,KAAK,+BAA+BE,OAAM;AAAA,MACxD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,CAACA,YAAuB;AAC7C,UAAM,EAAE,MAAM,QAAQ,IAAIA;AAC1B,UAAM,cACJ,KAAK,WAAW,OAAO,KACvB,KAAK,WAAW,SAAS,KACzB,KAAK,WAAW,SAAS;AAC3B,UAAM,mBACJ,aAAa,WAAW,kBAAkB,QAAQ;AACpD,UAAM,0BACJ,wBAAwB,QAAQ;AAElC,QAAI,gBAAgB,oBAAoB,0BAA0B;AAChE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,MAAM;AACX,UAAMA,UAAuB,MAAMD,aAAY;AAAA,MAC7C;AAAA,MACA;AAAA,IACF;AACA,UAAM,OAAO,MAAMA,aAAY,KAAK,QAAQC,OAAM;AAMlD,UAAM,aAAa,MAAMD,aAAY,KAAK,IAAI;AAC9C,QAAI,WAAY;AAAA,EAClB;AACF;;;AFtIO,IAAM,eAAuD,WAClE,SACc;AACd,EAAAE,YAAU,EAAE,MAAM,sBAAsB;AACxC,QAAM;AAAA,IACJ,UAAU,EAAE,eAAe;AAAA,IAC3B,UAAU;AAAA,EACZ,IAAI;AAEJ,YAAU,OAAO,QAAsB;AACrC,UAAM,EAAE,MAAM,QAAQ,IAAI;AAE1B,YAAQ,MAAM;AAAA,MACZ,KAAK,eAAe;AAIlB,YAAI,CAAC,cAAc,YAAY;AAC7B,gBAAM,iBAAiB,oCAAoC;AAAA,YACzD,OAAO,cAAc;AAAA,YACrB,SAAS;AAAA,cACP,QAAQ,OAAO,QAAQ,aAAa,QAAQ;AAAA,gBAC1C,CAAC,MAAM,EAAE,cAAc,OAAO,QAAQ;AAAA,cACxC;AAAA,cACA,SAAS,OAAO,QAAQ;AAAA,cACxB,iBAAiB,OAAO,QAAQ;AAAA,YAClC;AAAA,UACF,CAAC;AACD,wBAAc,aAAa;AAAA,QAC7B;AAGA,cAAMC,cAAY,KAAK,mBAAmB,iCACrC,UADqC;AAAA,UAExC,UAAU;AAAA,UACV;AAAA,QACF,EAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK;AACH,sBAAc,KAAK,MAAM,OAAO;AAChC;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,0BAA0B;AAC9B,QAAM,oCAAoC,CAAC,WAAuB;AAChE,QAAI,OAAO,SAAS,cAAc;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,SAAS,eAAe;AACjC,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,yBAAyB;AAC5B,YAAM,SAAS,OAAO,QAAQ;AAC9B,YAAM,eAAe,OAAO,QAAQ;AACpC,UAAI,WAAW,cAAc;AAC3B,kCAA0B;AAC1B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAEA,SAAO,MAAM;AACX,UAAM,SAAuB,MAAMA,cAAY;AAAA,MAC7C;AAAA,MACA;AAAA,IACF;AAEA,UAAMA,cAAY,KAAK,QAAQ,MAAM;AAAA,EACvC;AAEA,EAAAD,YAAU,EAAE,MAAM,oBAAoB;AACxC;;;ALxDO,IAAM,8BAAN,cACG,0BAEV;AAAA,EASE,YAAY,SAAmC;AAC7C,UAAM,OAAO;AARf;AAAA,wBAAQ;AAER;AAAA,wBAAQ;AACR,wBAAQ;AAER;AAAA,wBAAQ;AAKN,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAa,WAAW;AA7D1B;AA8DI,YAAO,UAAK,YAAL,mBAAc;AAAA,EACvB;AAAA,EAEA,IAAI,mBAAmB,OAAuC;AAC5D,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,IAAI,qBAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,gBAAgB;AAzEtB;AA0EI,YAAO,UAAK,wBAAL,mBAA0B;AAAA,EACnC;AAAA,EAEA,IAAI,kBAAkB;AA7ExB;AA8EI,YAAO,gBAAK,wBAAL,mBAA0B,OAAO,OAAO;AAAA,MAC7C,CAAC,UAAU,MAAM,cAAc,KAAK;AAAA,UAD/B,mBAEJ;AAAA,EACL;AAAA,EAEA,IAAI,eAAqD;AACvD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,aAAa,cAAoD;AACnE,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,IAAI,aAAkD;AACpD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW,QAA6C;AAC1D,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,IAAI,OAAO,QAAiC;AAC1C,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,IAAI,SAAkC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,aAAa;AACnB,SAAK,UAAU,gBAAgB;AAAA,MAC7B,QAAQ;AAAA,IACV,CAAC;AAMD,SAAK,UAAU,oBAAoB;AAAA,MACjC,QAAQ,qBAAqB;AAAA,QAC3B,WAAW,KAAK,QAAQ;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,OAAO;AA3HvB;AA4HI,QAAI,KAAK,QAAQ,QAAQ;AACvB,WAAK,QAAQ,cACX,sBAAW,MAAX,mBAAc,QAAQ,iCAAtB,YAAsD;AAAA,IAC1D;AACA,SAAK,OAAO;AAAA,MACV,uCAAuC,CAAC,CAAC,KAAK,QAC3C,UAAU,kBAAkB,KAAK,QAAQ,UAAU;AAAA,IACxD;AAEA,WAAO,MAAM,OAA0B;AAAA,EACzC;AAAA,EAEQ,cAKN,QACA,UAAqE,CAAC,GACtE;AA/IJ;AAgJI,UAAM,EAAE,QAAQ,SAAS,UAAU,cAAc,CAAC,EAAE,IAAI;AAExD,UAAM,eAAe,WACjB,KAAK,YAAY,IAA6B,QAAQ,IACtD,KAAK;AACT,QAAI,CAAC,aAAc,OAAM,IAAI,MAAM,kCAAkC;AAErE,WAAO,KAAK;AAAA,MACV;AAAA,QACE;AAAA,QACA,QAAQ,gDACF,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,IAD/B;AAAA,UAEN,MAAM;AAAA,YACJ,YAAW,UAAK,eAAL,mBAAiB;AAAA,YAC5B,UAAS,UAAK,eAAL,mBAAiB;AAAA,YAC1B,UAAS,UAAK,eAAL,mBAAiB;AAAA,UAC5B;AAAA,UACA,QAAQ;AAAA,YACN,WAAW,aAAa;AAAA,YACxB,SAAS,aAAa;AAAA,YACtB,SAAS,aAAa;AAAA,UACxB;AAAA,YACG;AAAA,MAEP;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAsB,SAAS;AA9KjC;AA+KI,SAAK,OAAO,KAAK,iBAAiB,KAAK,EAAE,EAAE;AAC3C,SAAI,UAAK,SAAL,mBAAW,UAAU;AACvB,YAAM,EAAE,gBAAgB,IAAI,KAAK,KAAK;AACtC,WAAK,OAAO;AAAA,QACV,gCAAgC,KAAK,EAAE,QAAQ,eAAe;AAAA,MAChE;AACA,UAAI,CAAC,UAAU,UAAU,cAAc,EAAE,SAAS,eAAe,GAAG;AAClE,aAAK,WAAW;AAChB,aAAK,KAAK,WAAW;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,QAAQ;AACnB,WAAO,IAAI,QAAc,OAAO,SAAS,WAAW;AAClD,UAAI;AACF,aAAK,KAAK,mBAAmB,CAAC,WAAW;AA/LjD;AAgMU,2BAAW,MAAX,mBAAc,QAAQ,6BAA6B,OAAO;AAC1D,kBAAQ;AAAA,QACV,CAAC;AAED,aAAK,KAAK,WAAW,MAAM;AApMnC;AAqMU,2BAAW,MAAX,mBAAc,WAAW;AAAA,QAC3B,CAAC;AAED,cAAM,KAAK,KAAK;AAAA,MAClB,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,uBAAuB,KAAK;AAC9C,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,UAAU,QAA6B;AAhNtD;AAiNI,QACE,CAAC,UAAU,OAAO,aAAa,KAAK,OAAO,KACvC,GAAC,UAAK,iBAAL,mBAAmB,KAAK,UAAU,OACnC,GAAC,UAAK,iBAAL,mBAAmB,OAAO,UAAU,MACzC;AACA,YAAM,MAAM,+BAA+B;AAAA,IAC7C;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU,iCAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,YAAY,QAA6B;AA/NxD;AAgOI,QACE,CAAC,UAAU,OAAO,aAAa,KAAK,OAAO,KACvC,GAAC,UAAK,iBAAL,mBAAmB,KAAK,UAAU,MACnC,GAAC,UAAK,iBAAL,mBAAmB,OAAO,UAAU,KACzC;AACA,YAAM,MAAM,iCAAiC;AAAA,IAC/C;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU,iCAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,UAAU,QAA6B;AA9OtD;AA+OI,QACE,CAAC,UAAU,OAAO,aAAa,KAAK,OAAO,KACvC,GAAC,UAAK,iBAAL,mBAAmB,KAAK,UAAU,OACnC,GAAC,UAAK,iBAAL,mBAAmB,OAAO,UAAU,KACzC;AACA,YAAM,MAAM,+BAA+B;AAAA,IAC7C;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU,iCAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,YAAY,QAA6B;AA7PxD;AA8PI,QACE,CAAC,UAAU,OAAO,aAAa,KAAK,OAAO,KACvC,GAAC,UAAK,iBAAL,mBAAmB,KAAK,UAAU,MACnC,GAAC,UAAK,iBAAL,mBAAmB,OAAO,UAAU,KACzC;AACA,YAAM,MAAM,iCAAiC;AAAA,IAC/C;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU,iCAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,KAAK,QAA6B;AA5QjD;AA6QI,QACE,CAAC,UAAU,OAAO,aAAa,KAAK,OAAO,KACvC,GAAC,UAAK,iBAAL,mBAAmB,KAAK,KAAK,MAC9B,GAAC,UAAK,iBAAL,mBAAmB,OAAO,KAAK,KACpC;AACA,YAAM,MAAM,yBAAyB;AAAA,IACvC;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,UAAU,iCAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,OAAO,QAA6B;AA1RnD;AA2RI,QACE,CAAC,UAAU,OAAO,aAAa,KAAK,OAAO,KACvC,GAAC,UAAK,iBAAL,mBAAmB,KAAK,KAAK,OAC9B,GAAC,UAAK,iBAAL,mBAAmB,OAAO,KAAK,MACpC;AACA,YAAM,MAAM,2BAA2B;AAAA,IACzC;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,UAAU,iCAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,aAAa;AACxB,WAAO,KAAK;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,kBAAkB,CAAC,aAAa;AAAA,UAC9B,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,aAAa;AACxB,WAAO,KAAK;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,kBAAkB,CAAC,aAAa;AAAA,UAC9B,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,aAAa,QAAuC;AAlUnE;AAmUI,QAAI,GAAC,UAAK,iBAAL,mBAAmB,OAAO,SAAQ;AACrC,YAAM,MAAM,8BAA8B;AAAA,IAC5C;AACA,QAAI,EAAC,iCAAQ,WAAU;AACrB,YAAM,IAAI,UAAU,wCAAwC;AAAA,IAC9D;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,UAAU,OAAO;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,cAAc,QAAwC;AA/UrE;AAgVI,UAAM,EAAE,SAAS,MAAM,SAAS,IAAI,UAAU,CAAC;AAC/C,QACE,YAAY,KAAK,OAAO,MAAM,SAC1B,GAAC,UAAK,iBAAL,mBAAmB,KAAK,UAAU,MACnC,GAAC,UAAK,iBAAL,mBAAmB,OAAO,UAAU,KACzC;AACA,YAAM,MAAM,8BAA8B;AAAA,IAC5C;AACA,QACE,YAAY,KAAK,OAAO,MAAM,CAAC,SAC3B,GAAC,UAAK,iBAAL,mBAAmB,KAAK,UAAU,OACnC,GAAC,UAAK,iBAAL,mBAAmB,OAAO,UAAU,MACzC;AACA,YAAM,MAAM,8BAA8B;AAAA,IAC5C;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ,SAAS,mBAAmB;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,UAAU,QAA+B;AArWxD;AAsWI,QAAI,GAAC,UAAK,iBAAL,mBAAmB,YAAW;AACjC,YAAM,MAAM,8BAA8B;AAAA,IAC5C;AACA,UAAM,cAAc;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,IACpB;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,eAAe,QAAuC;AAnXrE;AAoXI,QACE,CAAC,UAAU,OAAO,aAAa,KAAK,OAAO,KACvC,GAAC,UAAK,iBAAL,mBAAmB,KAAK,oBACzB,GAAC,UAAK,iBAAL,mBAAmB,OAAO,mBAC/B;AACA,YAAM,MAAM,mCAAmC;AAAA,IACjD;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,UAAU,iCAAQ;AAAA,MAClB,aAAa;AAAA,QACX,QAAQ,iCAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,gBAAgB,QAAuC;AApYtE;AAqYI,QACE,CAAC,UAAU,OAAO,aAAa,KAAK,OAAO,KACvC,GAAC,UAAK,iBAAL,mBAAmB,KAAK,iBACzB,GAAC,UAAK,iBAAL,mBAAmB,OAAO,gBAC/B;AACA,YAAM,MAAM,oCAAoC;AAAA,IAClD;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,UAAU,iCAAQ;AAAA,MAClB,aAAa;AAAA,QACX,QAAQ,iCAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,oBAAoB,QAAsC;AArZzE;AAsZI,QACE,CAAC,UAAU,OAAO,aAAa,KAAK,OAAO,KACvC,GAAC,UAAK,iBAAL,mBAAmB,KAAK,yBACzB,GAAC,UAAK,iBAAL,mBAAmB,OAAO,wBAC/B;AACA,YAAM,MAAM,oCAAoC;AAAA,IAClD;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,UAAU,iCAAQ;AAAA,MAClB,aAAa;AAAA,QACX,OAAO,iCAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,aAAa,QAAkC;AAta9D;AAuaI,UAAM,YAAY,OAAO;AAEzB,QAAI,aAAa,CAAC,OAAO,KAAK,SAAS,EAAE,QAAQ;AAC/C,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,QACE,OAAO,KAAK,SAAS,EAAE;AAAA,MAAK,CAAC,MAC3B,CAAC,QAAQ,GAAG,KAAK,QAAQ,EAAE,EAAE,SAAS,CAAC;AAAA,IACzC,IACI,GAAC,UAAK,iBAAL,mBAAmB,KAAK,YACzB,GAAC,UAAK,iBAAL,mBAAmB,OAAO,WAC/B;AACA,YAAM,MAAM,iCAAiC;AAAA,IAC/C;AAEA,UAAM,UAGA,CAAC;AAEP,WAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAClD,YAAM,eACJ,QAAQ,SACJ,KAAK,SACL,KAAK,YAAY,IAA6B,GAAG;AAEvD,UAAI,cAAc;AAChB,gBAAQ,KAAK;AAAA,UACX,QAAQ;AAAA,YACN,WAAW,aAAa;AAAA,YACxB,SAAS,aAAa;AAAA,YACtB,SAAS,aAAa;AAAA,UACxB;AAAA,UACA,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAEA,WAAO,KAAK,QAAQ;AAAA,MAClB,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,YAAW,UAAK,eAAL,mBAAiB;AAAA,UAC5B,UAAS,UAAK,eAAL,mBAAiB;AAAA,UAC1B,UAAS,UAAK,eAAL,mBAAiB;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,OAAO;AA/dtB;AAgeI,QAAI,GAAC,UAAK,iBAAL,mBAAmB,KAAK,KAAI;AAC/B,YAAM,MAAM,yBAAyB;AAAA,IACvC;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,SAAS;AAxexB;AAyeI,QAAI,GAAC,UAAK,iBAAL,mBAAmB,KAAK,MAAK;AAChC,YAAM,MAAM,2BAA2B;AAAA,IACzC;AACA,WAAO,KAAK,cAA6B;AAAA,MACvC,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEO,IAAM,sBAAsB,CACjC,SAC8B;AAC9B,SAAO,gBAAgB;AACzB;AAGO,IAAM,gCAAgC,CAC3C,WACsB;AACtB,QAAM,OAAOE,SAIX;AAAA,IACA,OAAO,OAAO;AAAA,IACd,WAAW;AAAA,EACb,CAAC,EAAE,MAAM;AAET,SAAO;AACT;;;AbrfO,IAAM,cAAN,MAAkB;AAAA,EAKvB,YAAY,SAA6B;AAJzC,wBAAO;AACP,wBAAQ;AACR,wBAAQ;AAGN,SAAK,KAAK,QAAQ;AAClB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW,SAAqC;AAClD,IAAAC,YAAU,EAAE,MAAM,2BAA2B,KAAK,EAAE;AACpD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAO,QAAuB;AAChC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEO,OAAO;AACZ,QAAI,CAAC,KAAK,YAAY;AACpB,aAAOA,YAAU,EAAE,KAAK,yBAAyB;AAAA,IACnD;AACA,SAAK,WAAW,MAAM,UAAU;AAChC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEO,OAAO;AACZ,QAAI,CAAC,KAAK,YAAY;AACpB,aAAOA,YAAU,EAAE,KAAK,yBAAyB;AAAA,IACnD;AACA,SAAK,WAAW,MAAM,UAAU;AAChC,SAAK,SAAS;AAAA,EAChB;AACF;AAQO,IAAM,oBAAN,cAAgC,YAAY;AAAA,EAIjD,YAAY,SAAmC;AAC7C,UAAM,OAAO;AAJf,wBAAQ;AACR,wBAAQ;AAIN,SAAK,YAAY,QAAQ;AACzB,SAAK,QAAQ,QAAQ;AAGrB,SAAK,gCACH,KAAK,8BAA8B,KAAK,IAAI;AAC9C,SAAK,+BACH,KAAK,6BAA6B,KAAK,IAAI;AAE7C,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;AAAA,EACpC;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,kBAAkB;AACxB,QAAI,oBAAoB,KAAK,KAAK,GAAG;AACnC,WAAK,MAAM;AAAA,QACT;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF,WAAW,mBAAmB,KAAK,KAAK,GAAG;AACzC,WAAK,MAAM;AAAA,QACT;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGO,kBAAkB;AACvB,QAAI,oBAAoB,KAAK,KAAK,GAAG;AACnC,WAAK,MAAM;AAAA,QACT;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF,WAAW,mBAAmB,KAAK,KAAK,GAAG;AACzC,WAAK,MAAM;AAAA,QACT;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBAAwB,UAAkB,YAAqB;AACrE,QAAI;AACF,UAAI,aAAa,KAAK,MAAM,UAAU;AACpC,qBAAa,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,MACvC;AAAA,IACF,SAAS,OAAO;AACd,MAAAA,YAAU,EAAE,MAAM,kDAAkD,KAAK;AAAA,IAC3E;AAAA,EACF;AAAA,EAEQ,8BACN,QACA;AACA,SAAK;AAAA,MACH,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,6BACN,QACA;AACA,SAAK,wBAAwB,OAAO,OAAO,IAAI,OAAO,OAAO,WAAW;AAAA,EAC1E;AAAA,EAEO,eAAe,QAAqB;AACzC,QAAI,CAAC,KAAK,YAAY;AACpB,aAAOA,YAAU,EAAE,KAAK,yCAAyC;AAAA,IACnE;AACA,UAAM,aAAa,KAAK,WAAW,cAAc,OAAO;AACxD,QAAI,YAAY;AACd,iBAAW,YAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEO,UAAU,SAAkB,KAAK,WAAW;AACjD,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,WAAW,YAAY;AACnD,aAAOA,YAAU,EAAE,KAAK,yCAAyC;AAAA,IACnE;AACA,UAAM,UAAU,KAAK,WAAW;AAChC,YAAQ,MAAM,YAAY,SAAS,iBAAiB;AACpD,YAAQ,MAAM,kBAAkB,SAAS,iBAAiB;AAC1D,SAAK,YAAY;AAAA,EACnB;AACF;;;ADhKA,IAAM,aAAa,MAAM;AACvB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ;AACd,QAAM,WAAW;AACjB,QAAM,cAAc;AAOpB,QAAM,iBAAiB,SAAS,MAAM;AACpC,UAAM,KAAK,EAAE,MAAM,CAAC,UAAU;AAC5B,MAAAC,YAAU,EAAE,MAAM,wBAAwB,OAAO,KAAK;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC,EAAE,QAAQ,MAAqC;AACxE,SAAO,IAAI,QAAc,CAAC,YAAY;AACpC,YAAQ,iBAAiB,WAAW,SAAS,WAAW;AACtD,cAAQ,oBAAoB,WAAW,QAAQ;AAC/C,cAAQ;AAAA,IACV,CAAC;AACD,YAAQ,iBAAiB,UAAU,SAAS,WAAW;AACrD,cAAQ,oBAAoB,UAAU,QAAQ;AAC9C,cAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAgC;AAC9B,SAAO;AAAA,IACL,KAAK,GAAG,CAAC;AAAA,IACT,MAAM,GAAG,CAAC;AAAA,IACV,OAAO,GAAG,KAAK;AAAA,IACf,QAAQ,GAAG,MAAM;AAAA,EACnB;AACF;AAEA,IAAM,cAAc,CAAC,EAAE,SAAS,MAA8C;AAC5E,QAAM,EAAE,KAAK,MAAM,OAAO,OAAO,IAAI,mBAAmB,QAAQ;AAChE,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,MAAM,WAAW;AACvB,QAAM,MAAM,WAAW;AACvB,QAAM,MAAM,MAAM;AAClB,QAAM,MAAM,OAAO;AACnB,QAAM,MAAM,QAAQ;AACpB,QAAM,MAAM,SAAS;AAErB,SAAO;AACT;AAEA,IAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA;AACF,MAGM;AACJ,QAAM,EAAE,KAAK,MAAM,OAAO,OAAO,IAAI,mBAAmB,QAAQ;AAChE,UAAQ,MAAM,MAAM;AACpB,UAAQ,MAAM,OAAO;AACrB,UAAQ,MAAM,QAAQ;AACtB,UAAQ,MAAM,SAAS;AAEvB,SAAO;AACT;AAiBA,IAAM,2BAA2B,CAAC,WAA2C;AAC3E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SAAO,OAAOC,YAAuC;AACnD,IAAAD,YAAU,EAAE,MAAM,wBAAwB;AAC1C,QAAI;AACF,YAAM,EAAE,QAAQ,UAAU,YAAY,IAAIC;AAC1C,YAAM,EAAE,SAAS,CAAC,EAAE,IAAI;AACxB,YAAM,YAAY,YAAY,cAAc,YAAY;AAGxD,YAAM,WAAW,SAAS,uBAAuB;AACjD,YAAM,oBAAoB,oBAAI,IAAI;AAGlC,UAAI,wBAAwB;AAC1B,cAAM,WAAW,OAAO,KAAK,CAAC,EAAE,UAAU,MAAM,cAAc,QAAQ;AACtE,cAAM,YAAY,kBAAkB;AACpC,YAAI,YAAY,kBAAkB;AAClC,0BAAkB,IAAI,SAAS;AAE/B,YAAI,CAAC,UAAU;AACb,UAAAD,YAAU,EAAE,KAAK,wCAAwC;AACzD,4BAAkB,SAAS;AAC3B,cAAI,WAAW;AAEb,8BAAkB,KAAK;AAAA,UACzB;AAAA,QACF,OAAO;AACL,cAAI,WAAW;AACb,YAAAA,YAAU,EAAE,MAAM,4BAA4B;AAC9C,yBAAa,EAAE,UAAU,SAAS,UAAU,CAAC;AAAA,UAC/C,OAAO;AACL,YAAAA,YAAU,EAAE,MAAM,2BAA2B;AAC7C,wBAAY,YAAY,EAAE,SAAS,CAAC;AACpC,sBAAU,KAAK;AAEf,kBAAM,aAAa,WAAW;AAC9B,uBAAW,YAAY;AACvB,uBAAW,0BAA0B;AACrC,uBAAW,MAAM,QAAQ;AACzB,uBAAW,MAAM,SAAS;AAC1B,uBAAW,MAAM,gBAAgB;AACjC,uBAAW,MAAM,YAAY;AAE7B,sBAAU,YAAY,UAAU;AAChC,8BAAkB,aAAa;AAG/B,gBAAI,yBAAyB;AAC3B,gCAAkB,UAAU;AAAA,YAC9B;AAAA,UACF;AAGA,gBAAM,WACJ,YACG,eAAe,EACf,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,MAAM,EAAE,SAAS;AAClE,cAAI,YAAY,SAAS,SAAS;AAChC,8BAAkB,eAAe,WAAW;AAC5C,8BAAkB,KAAK;AAAA,UACzB,OAAO;AACL,8BAAkB,KAAK;AAAA,UACzB;AAGA,mBAAS,YAAY,SAAS;AAAA,QAChC;AAAA,MACF;AAGA,UAAI,oBAAoB;AACtB,eAAO,QAAQ,CAAC,aAAa;AAC3B,gBAAM,qBAAqB,SAAS;AACpC,cAAI,CAAC,mBAAoB;AAEzB,gBAAM,YAAY,iBAAiB,kBAAkB;AACrD,4BAAkB,IAAI,SAAS;AAE/B,cAAI,UAAU,WAAW,IAAI,SAAS;AAEtC,cAAI,WAAW,QAAQ,YAAY;AAEjC,YAAAA,YAAU,EAAE,MAAM,0BAA0B,kBAAkB;AAC9D,yBAAa,EAAE,UAAU,SAAS,QAAQ,WAAW,CAAC;AAAA,UACxD,OAAO;AAEL,YAAAA,YAAU,EAAE,MAAM,yBAAyB,kBAAkB;AAC7D,sBAAU,IAAI,YAAY,EAAE,IAAI,UAAU,CAAC;AAC3C,uBAAW,IAAI,WAAW,OAAO;AAEjC,kBAAM,WAAW,YAAY,EAAE,SAAS,CAAC;AACzC,qBAAS,KAAK,GAAG,SAAS,IAAI,KAAK,CAAC;AAEpC,oBAAQ,aAAa;AAAA,UACvB;AAEA,cAAI,CAAC,SAAS,SAAS;AACrB,oBAAQ,KAAK;AAAA,UACf,OAAO;AACL,oBAAQ,KAAK;AAAA,UACf;AAGA,mBAAS,YAAY,QAAQ,UAAU;AAAA,QACzC,CAAC;AAAA,MACH;AAGA,iBAAW,QAAQ,CAAC,SAAS,cAAc;AACzC,YAAI,CAAC,kBAAkB,IAAI,SAAS,GAAG;AACrC,cAAI,QAAQ,cAAc,QAAQ,WAAW,YAAY;AACvD,oBAAQ,WAAW,WAAW,YAAY,QAAQ,UAAU;AAAA,UAC9D;AACA,qBAAW,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAGD,UAAI,WAAW;AACb,kBAAU,YAAY;AACtB,kBAAU,YAAY,QAAQ;AAAA,MAChC;AAAA,IACF,SAAS,OAAO;AACd,MAAAA,YAAU,EAAE,MAAM,wBAAwB,KAAK;AAAA,IACjD;AAAA,EACF;AACF;AAEA,IAAM,iBAAiB,CAAC,gBAA6B;AACnD,SAAO,YAAY,YAAY;AAC7B,gBAAY,YAAY,YAAY,UAAU;AAAA,EAChD;AACF;AAEA,IAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA;AACF,MAGM;AACJ,UAAQ,YAAY,IAAI,YAAY,CAAC,KAAK,CAAC;AAE3C,QAAM,iBAAiB,SAAS,MAAM;AACpC,YAAQ,YAAY;AACpB,YAAQ,OAAO;AAAA,EACjB,CAAC;AACH;AAEA,IAAM,kCAAkC,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,QAAM,6BAA6B,CAAC,OAAe,WAAmB;AACpE,UAAM,mBAAmB,MAAM,aAAa,MAAM;AAClD,UAAM,mBAAmB,QAAQ;AACjC,QAAI,mBAAmB,kBAAkB;AACvC,aAAO;AAAA,IACT,OAAO;AACL,aAAO,GAAG,SAAS,gBAAgB;AAAA,IACrC;AAAA,EACF;AAGA,QAAM,SAAS;AAAA,IACb,CAAC,EAAE,OAAO,OAAO,MAAyC;AACxD,YAAM,mBAAoB,MAAM,cAAc,MAAM,aAAc;AAClE,UAAI,gBAAgB;AAClB,cAAM,KAAM,SAAS,QAAS;AAC9B,uBAAe,MAAM,gBAAgB,GACnC,KAAK,mBAAmB,mBAAmB,EAC7C;AACA,uBAAe,MAAM,QAAQ,2BAA2B,OAAO,MAAM;AAAA,MACvE;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,eAAe,CAAC,YAAY;AAC/C,YAAQ,QAAQ,CAAC,UAAU;AACzB,UAAI,MAAM,gBAAgB;AAExB,cAAM,EAAE,YAAY,UAAU,IAAI,MAAM,QAAQ,MAAM,cAAc,IAChE,MAAM,eAAe,CAAC,IACtB,MAAM;AACV,eAAO,EAAE,OAAO,YAAY,QAAQ,UAAU,CAAC;AAAA,MACjD,WAAW,MAAM,aAAa;AAC5B,eAAO;AAAA,UACL,OAAO,MAAM,YAAY;AAAA,UACzB,QAAQ,MAAM,YAAY;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAOD,QAAM,gBAAgB,MAAM;AAC1B,UAAM,QAAQ,YAAY;AAC1B,UAAM,SAAS,YAAY;AAC3B,WAAO,EAAE,OAAO,OAAO,CAAC;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL,OAAO,MAAM;AACX,eAAS,QAAQ,WAAW;AAC5B,YAAM,iBAAiB,UAAU,aAAa;AAAA,IAChD;AAAA,IACA,MAAM,MAAM;AACV,eAAS,WAAW;AACpB,YAAM,oBAAoB,UAAU,aAAa;AAAA,IACnD;AAAA,EACF;AACF;;;ADtSO,IAAM,oBAAoB,OAC/B,WACyC;AAvC3C;AAwCE,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb,yBAAyB;AAAA,MACzB,qBAAqB;AAAA,MACrB,0BAA0B;AAAA,IAC5B,IAAI;AAEJ,QAAI,gBAAgB;AACpB,UAAM,aAAyB,oBAAI,IAAI;AACvC,UAAM,KAAKE,MAAK;AAEhB,QAAI;AACJ,QAAI,SAAS;AACX,oBAAc;AAAA,IAChB,OAAO;AACL,oBAAc,SAAS,cAAc,KAAK;AAC1C,kBAAY,KAAK,eAAe,EAAE;AAAA,IACpC;AAMA,UAAM,YAAY,aAAa,EAAE;AACjC,UAAM,oBAAoB,IAAI,kBAAkB;AAAA,MAC9C,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,wBAAwB;AAC1B,iBAAW,IAAI,WAAW,iBAAiB;AAAA,IAC7C;AAEA,UAAM,aAAa,yBAAyB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,uBAAuB,CAACC,YAAgB;AApFlD,UAAAC;AAsFM,YAAIA,MAAA,KAAK,SAAL,gBAAAA,IAAW,mBAAkB,KAAK,aAAa;AACjD,mBAAW;AAAA,UACT,QAAQD,QAAO;AAAA,UACf,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,QACjB,CAAC;AAAA,MACH,OAAO;AACL,0BAAkB,KAAK;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,uBAAuB,CAC3BA,YACG;AACH,MAAAE,YAAU,EAAE,MAAM,wCAAwC,aAAa;AACvE,UAAI,eAAe;AACjB,6BAAqBF,OAAM;AAC3B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,oBAAoB,OAAO,UAA4B;AAC3D,sBAAgB;AAEhB,YAAM,kBAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,yBAAyB,KAAK;AAEpC,UAAI,wBAAwB;AAC1B,6BAAqB,sBAAsB;AAAA,MAC7C;AAAA,IACF;AAIA,UAAM,cAAa,UAAK,SAAL,mBAAW;AAC9B,QAAI,YAAY;AACd,YAAM,kBAAkB,UAAU;AAAA,IACpC;AAGA,UAAM,eAAe,eAAgB,OAAsB;AACzD,UAAI,MAAM,MAAM,SAAS,SAAS;AAChC,cAAM,kBAAkB,MAAM,KAAK;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AACxB,qBAAe,WAAW;AAC1B,iBAAW,MAAM;AACjB,WAAK,aAAa;AAClB,UAAI,oBAAoB,IAAI,GAAG;AAC7B,aAAK,IAAI,SAAS,YAAY;AAC9B,aAAK,IAAI,kBAAkB,oBAAoB;AAC/C,aAAK,IAAI,WAAW,WAAW;AAAA,MACjC,WAAW,mBAAmB,IAAI,GAAG;AACnC,aAAK,IAAI,SAAS,YAAY;AAC9B,aAAK,IAAI,kBAAkB,oBAAoB;AAC/C,aAAK,IAAI,WAAW,WAAW;AAAA,MACjC;AACA,wBAAkB,gBAAgB;AAAA,IACpC;AAOA,QAAI,oBAAoB,IAAI,GAAG;AAC7B,WAAK,GAAG,SAAS,YAAY;AAC7B,WAAK,GAAG,kBAAkB,oBAAoB;AAC9C,WAAK,KAAK,WAAW,WAAW;AAAA,IAClC,WAAW,mBAAmB,IAAI,GAAG;AACnC,WAAK,GAAG,SAAS,YAAY;AAC7B,WAAK,GAAG,kBAAkB,oBAAoB;AAC9C,WAAK,KAAK,WAAW,WAAW;AAAA,IAClC;AAQA,SAAK,aAAa;AAClB,SAAK,oBAAoB;AAEzB,WAAO,EAAE,SAAS,aAAa,YAAY,mBAAmB,YAAY;AAAA,EAC5E,SAAS,OAAO;AACd,IAAAE,YAAU,EAAE,MAAM,mCAAmC;AACrD,UAAM;AAAA,EACR;AACF;AASA,IAAM,oBAAoB,OAAO,YAA2C;AAC1E,MAAI;AACF,UAAM,EAAE,wBAAwB,oBAAoB,OAAO,YAAY,IACrE;AAGF,UAAM,eAAe,WAAW;AAEhC,uBAAmB,EAAE,SAAS,cAAc,MAAM,CAAC;AAEnD,iBAAa,MAAM,QAAQ;AAC3B,iBAAa,MAAM,YAAY;AAE/B,QAAI,YAAY,cAAc,aAAa,GAAG;AAC5C,MAAAA,YAAU,EAAE,MAAM,2BAA2B;AAC7C;AAAA,IACF;AAEA,UAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,eAAW,MAAM,WAAW;AAC5B,eAAW,MAAM,MAAM;AACvB,eAAW,MAAM,OAAO;AACxB,eAAW,MAAM,QAAQ;AACzB,eAAW,MAAM,SAAS;AAC1B,eAAW,YAAY,YAAY;AAEnC,UAAM,iBAAiB,SAAS,cAAc,KAAK;AACnD,mBAAe,UAAU,IAAI,gBAAgB;AAC7C,mBAAe,MAAM,gBAAgB;AACrC,mBAAe,MAAM,WAAW;AAChC,mBAAe,MAAM,QAAQ;AAC7B,mBAAe,YAAY,UAAU;AAErC,QAAI,gBAAuC;AAG3C,QAAI,0BAA0B,oBAAoB;AAChD,sBAAgB,SAAS,cAAc,KAAK;AAC5C,oBAAc,UAAU,IAAI,WAAW;AACvC,oBAAc,MAAM,UAAU;AAC9B,qBAAe,YAAY,aAAa;AAAA,IAC1C;AAEA,UAAM,kBAAkB,SAAS,cAAc,KAAK;AACpD,oBAAgB,UAAU,IAAI,YAAY;AAC1C,oBAAgB,MAAM,WAAW;AACjC,oBAAgB,MAAM,QAAQ;AAC9B,oBAAgB,MAAM,SAAS;AAC/B,oBAAgB,MAAM,SAAS;AAC/B,oBAAgB,MAAM,UAAU;AAChC,oBAAgB,MAAM,aAAa;AACnC,oBAAgB,MAAM,iBAAiB;AACvC,oBAAgB,YAAY,cAAc;AAE1C,gBAAY,MAAM,QAAQ;AAC1B,gBAAY,MAAM,SAAS;AAC3B,gBAAY,YAAY,eAAe;AAEvC,IAAAA,YAAU,EAAE,MAAM,uBAAuB,aAAa,UAAU;AAChE,QAAI,aAAa,eAAe,iBAAiB,cAAc;AAC7D,MAAAA,YAAU,EAAE,MAAM,8BAA8B;AAChD,YAAM,kBAAkB,EAAE,SAAS,aAAa,CAAC;AAAA,IACnD;AACA,IAAAA,YAAU,EAAE,MAAM,gBAAgB;AASlC,UAAM,4BAA4B,gCAAgC;AAAA,MAChE;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AACD,8BAA0B,MAAM;AAEhC,UAAM,iBAAiB,SAAS,MAAM;AACpC,UAAI,2BAA2B;AAC7B,kCAA0B,KAAK;AAAA,MACjC;AAAA,IACF,CAAC;AAED,QAAI,eAAe;AACjB,oBAAc,MAAM,UAAU;AAAA,IAChC;AAAA,EACF,SAAS,OAAO;AACd,IAAAA,YAAU,EAAE,MAAM,4BAA4B,KAAK;AAAA,EACrD;AACF;;;AR9OO,IAAM,YAAN,cAAwB,WAAyB;AAAA,EAAjD;AAAA;AACL,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAAA;AAAA,EAER,IAAI,QAAQ;AACV,WAAO;AAAA,MACL,gBAAgB,CAAC,oBAAqC;AACpD,cAQI,sBAPF;AAAA;AAAA,UACA,yBAAyB;AAAA,UACzB,qBAAqB;AAAA,UACrB,0BAA0B;AAAA,UAC1B,uBAAuB;AAAA,UACvB,2BAA2B;AAAA,QA3DrC,IA6DY,IADC,oBACD,IADC;AAAA,UANH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAKF,cAAM,cAA6D,CAAC;AAMpE,oBAAY;AAAA,UACV,qBAAqB;AAAA,YACnB,WAAW,QAAQ;AAAA,UACrB,CAAC;AAAA,QACH;AAEA,cAAM,OAAO,6BAA6B,iCACrC,UADqC;AAAA,UAExC,OAAO,KAAK;AAAA,UACZ;AAAA,QACF,EAAC;AAMD,YAAI,aAAa;AACf,cAAI;AACF,8BAAkB;AAAA,cAChB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH,SAAS,OAAO;AACd,iBAAK,OAAO,MAAM,iDAAiD;AAAA,UACrE;AAAA,QACF;AAOA,aAAK,GAAG,mBAAmB,CAAC,WAAW;AAzG/C,cAAAC;AA0GU,gBAAM,UAASA,MAAA,OAAO,aAAa,YAApB,gBAAAA,IAA6B;AAAA,YAC1C,CAAC,MAAM,EAAE,OAAO,KAAK;AAAA;AAGvB,cAAI,iCAAQ,aAAa;AACvB,gBAAI;AACF,mBAAK,kBAAkB;AAAA,YACzB,SAAS,OAAO;AACd,mBAAK,OAAO,MAAM,8BAA8B,KAAK;AAAA,YACvD;AAAA,UACF;AAEA,cAAI,iCAAQ,aAAa;AACvB,gBAAI;AACF,mBAAK,kBAAkB;AAAA,YACzB,SAAS,OAAO;AACd,mBAAK,OAAO,MAAM,8BAA8B,KAAK;AAAA,YACvD;AAAA,UACF;AAAA,QACF,CAAC;AAKD,YAAI,0BAA0B;AAC5B,eAAK,GAAG,8BAA8B,CAAC,EAAE,OAAO,MAAM;AACpD,gBAAI;AACF,kBAAI,OAAO,OAAO,KAAK,YAAY,iBAAiB,QAAQ;AAC1D,uBAAO,cACH,KAAK,kBAAkB,IACvB,KAAK,qBAAqB;AAAA,cAChC;AAAA,YACF,SAAS,OAAO;AACd,mBAAK,OAAO,MAAM,8BAA8B,KAAK;AAAA,YACvD;AAAA,UACF,CAAC;AAAA,QACH;AAKA,YAAI,sBAAsB;AACxB,eAAK,GAAG,8BAA8B,CAAC,EAAE,OAAO,MAAM;AACpD,gBAAI;AACF,kBAAI,OAAO,OAAO,KAAK,YAAY,iBAAiB,QAAQ;AAC1D,uBAAO,cACH,KAAK,kBAAkB,IACvB,KAAK,qBAAqB;AAAA,cAChC;AAAA,YACF,SAAS,OAAO;AACd,mBAAK,OAAO,MAAM,8BAA8B,KAAK;AAAA,YACvD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,OAAO;AACT,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,cAAc,qBAAiC;AAAA,QAC1D,OAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAS;AACX,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,gBAAgB,uBAAqC;AAAA,QAClE,OAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,eAAe;AACjB,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,gBAAgB,yBAAyB,KAAK,OAAO;AAAA,IAC5D;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,eAAe,OAAe;AAC5B,SAAK,MAAM,SAASC,SAAQ,aAAa,EAAE,MAAM,CAAC,CAAC;AAAA,EACrD;AACF;;;AoC3MA,OAAOC,gBAAe;AACtB;AAAA,EACE;AAAA,EACA,aAAAC;AAAA,OAIK;;;ACPP,SAAS,gBAAgB,sBAAsB;AAE/C,IAAM,eACJ,OAAO,eAAe,aAAa,aAAa;;;ADU3C,IAAM,aAAN,cAAyB,eAAe;AAAA,EAO7C,YAAmB,SAAyB;AApB9C;AAqBI,QAAI,aAAwB,CAAC;AAC7B,QAAI;AACF,mBAAaC,WAAwC,QAAQ,OAAO;AAAA,QAClE,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,SAAS,GAAG;AACV,UAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,QAAAC,YAAU,EAAE,MAAM,qCAAqC;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,iCACD,UADC;AAAA,MAEJ,OAAM,yCAAY,OAAM,QAAQ;AAAA,IAClC,EAAC;AAfgB;AANnB,wBAAO,wBAAuB;AAC9B,wBAAO,yBAAwB;AAC/B,wBAAO,SAAQ;AAEf,wBAAQ;AAkBN,SAAK,YAAW,gBAAW,QAAX,YAAkB;AAAA,EACpC;AAAA,EAEA,IAAI,gBAAgB;AAvCtB;AAyCI,aAAO,UAAK,YAAL,mBAAc,cAAa,UAAU,KAAK,MAAM,KAAK,KAAK,MAAM;AAAA,EACzE;AAAA,EAEA,MAAe,wBAAwB;AA5CzC;AA6CI,QAAI,CAAC,KAAK,eAAe;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,YAAY,IAAI,sBAAsB,KAAK,QAAQ,KAAK;AAChE,QAAI,aAAa;AACf,WAAK,OAAO,MAAM,uBAAuB,WAAW;AACpD,cAAO,sBAAW,MAAX,mBAAc,QAAQ,iBAAtB,YAAsC;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAe,uBAAuB;AAzDxC;AA0DI,QAAI,CAAC,KAAK,eAAe;AACvB;AAAA,IACF;AAEA,UAAM,EAAE,YAAY,IAAI,sBAAsB,KAAK,QAAQ,KAAK;AAChE,QAAI,aAAa;AACf,WAAK,OAAO,MAAM,oBAAoB,aAAa,KAAK,aAAa;AACrE,uBAAW,MAAX,mBAAc,QAAQ,aAAa,KAAK;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,MAAyB,+BAA+B;AArE1D;AAsEI,UAAM,EAAE,aAAa,IAAI,sBAAsB,KAAK,QAAQ,KAAK;AACjE,QAAI,cAAc;AAChB,cAAO,sBAAW,MAAX,mBAAc,QAAQ,kBAAtB,YAAuC;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAyB,4BACvB,OACA;AA/EJ;AAgFI,QAAI,CAAC,KAAK,eAAe;AACvB;AAAA,IACF;AAEA,UAAM,EAAE,aAAa,IAAI,sBAAsB,KAAK,QAAQ,KAAK;AACjE,QAAI,cAAc;AAChB,WAAK,OAAO,MAAM,sBAAsB,cAAc,KAAK;AAC3D,uBAAW,MAAX,mBAAc,QAAQ,cAAc;AAAA,IACtC;AAAA,EACF;AAAA,EAEmB,eAAe,OAAqB;AA3FzD;AA4FI,QAAI,KAAK,WAAW,aAAa,KAAK,WAAW,gBAAgB;AAC/D,YAAM,EAAE,aAAa,cAAc,UAAU,IAAI;AAAA,QAC/C,KAAK,QAAQ;AAAA,MACf;AACA,WAAK,OAAO,MAAM,qBAAqB;AACvC,UAAI,aAAa;AACf,aAAK,OAAO,MAAM,sBAAsB,WAAW;AACnD,yBAAW,MAAX,mBAAc,WAAW;AAAA,MAC3B;AACA,UAAI,cAAc;AAChB,aAAK,OAAO,MAAM,uBAAuB,YAAY;AACrD,yBAAW,MAAX,mBAAc,WAAW;AAAA,MAC3B;AACA,UAAI,WAAW;AACb,aAAK,OAAO,MAAM,oBAAoB,SAAS;AAC/C,yBAAW,MAAX,mBAAc,WAAW;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,eAAe,KAAK;AAAA,EAC5B;AAAA,EAEQ,QAAQ;AACd,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EAEQ,QAAQ;AACd,WAAO,KAAK,aAAa;AAAA,EAC3B;AACF;;;ArCzFO,IAAM,eAAe,CAAkB,gBAA6B;AACzE,QAAM,kBAAkB,iCACnB,cADmB;AAAA,IAEtB,SAAS,gBAA8B;AAAA,EACzC;AACA,QAAM,QAAQ,eAAe;AAAA,IAC3B,aAAa;AAAA,IACb,oBAAoB;AAAA,EACtB,CAAC;AACD,QAAM,SAASC,SAA0D;AAAA,IACvE;AAAA,IACA,WAAW;AAAA,EACb,CAAC,EAAE,eAAe;AAElB,SAAO;AACT;;;AuC3BA,IAAM,sBAAuC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAiCO,IAAMC,UAAS,SAAU,aAA4B;AAC1D,QAAM,SAAS,aAAa,WAAW;AAEvC,QAAM,oBAAoB,CAAyB,SAAY;AAC7D,WAAO,UAAU,WAAkC;AACjD,YAAM,OAAO,QAAQ;AAGrB,aAAO,OAAO,KAAK,IAAI,EAAE,GAAG,MAAM;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,UAAU;AAAA,IACV,YAAY,MAAM,OAAO,WAAW;AAAA,EACtC;AAEA,SAAO,IAAI,MAAc,OAAO,MAAM;AAAA,IACpC,IAAI,QAAgB,MAAoB,UAAe;AACrD,UAAI,QAAQ,cAAc;AAExB,eAAO,aAAa,IAAI;AAAA,MAC1B;AAEA,UAAI,oBAAoB,SAAS,IAAI,GAAG;AACtC,eAAO,kBAAkB,IAAI;AAAA,MAC/B;AAEA,aAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,IAC3C;AAAA,EACF,CAAC;AAEH;;;AxC3FA,SAAS,YAAY,mBAAmB;;;AyCFxC;AAAA;AAAA,gBAAAC;AAAA,EAAA;AAAA;AAAA,SAAS,cAAc;;;ACyCvB,SAAS,uCAAuC;AAqBhD,IAAM,iCAAiC,OAAO;AAAA,EAC5C;AACF,EAAE,IAAI,CAAC,QAAQ;AACb,SAAO,kBACL,GACF;AACF,CAAC;;;AChDD,IAAMC,uBAAuC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF;AAiCO,IAAMC,UAAS,SAAU,eAA8B;AAC5D,QAAM,SAAS,aAAa,aAAa;AAEzC,QAAM,oBAAoB,CAAyB,SAAY;AAC7D,WAAO,UAAU,WAAkC;AACjD,YAAM,OAAO,QAAQ;AAGrB,aAAO,OAAO,OAAO,IAAI,EAAE,GAAG,MAAM;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,UAAU;AAAA,IACV,YAAY,MAAM,OAAO,WAAW;AAAA,EACtC;AAEA,SAAO,IAAI,MAAc,OAAO,QAAQ;AAAA,IACtC,IAAI,QAAgB,MAAoB,UAAe;AACrD,UAAI,QAAQ,cAAc;AAExB,eAAO,aAAa,IAAI;AAAA,MAC1B;AAEA,UAAID,qBAAoB,SAAS,IAAI,GAAG;AACtC,eAAO,kBAAkB,IAAI;AAAA,MAC/B;AAEA,aAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,IAC3C;AAAA,EACF,CAAC;AAEH;;;AFvFA,IAAO,gBAAgB,OAAO;;;AGF9B;AAAA;AAAA;AAAA;AAAA;;;ACAA,OAAOE,gBAAe;AACtB,SAAS,aAAAC,aAAW,aAAAC,kBAAmC;;;ACDvD,SAAS,WAAW,iBAAiB;AAMrC,eAAe,KACb,OACA,MACkC;AAClC,QAAM,WAAoC,MAAM,MAAM,OAAO,IAAI;AAEjE,MAAI,CAAC,SAAS,IAAI;AAChB,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI,UAAU,SAAS,QAAQ,cAAc;AAAA,IACrD;AAEA,QAAI;AACJ,QAAI;AACF,sBAAgB,MAAM,SAAS,KAAK;AAAA,IACtC,SAAS,GAAG;AAAA,IAAC;AAEb,UAAM,gBAAe,+CAAe,UAChC,KAAK,UAAU,cAAc,MAAM,IACnC;AAEJ,UAAM,IAAI,UAAU,SAAS,QAAQ,cAAc,aAAa;AAAA,EAClE;AAEA,MAAI;AAEF,aAAS,aAAa,MAAM,SAAS,KAAK;AAAA,EAC5C,SAAS,GAAG;AAAA,EAAC;AAEb,SAAO;AACT;AAiBO,IAAM,mBAAmB,CAC9B,IACA,UAAU,SACP;AAFH,eAAE,WAAS,UAAU,IArDvB,IAqDE,IAA+B,0BAA/B,IAA+B,CAA7B,WAAS;AAGX,QAAM,YAAY,OAChB,MACA,YACyB;AACzB,UAAM,UAAU,kDACV,mCAAS,QAAO,EAAE,gBAAgB,mBAAmB,IAAI,CAAC,IAC3D,cAAc,UACd,mCAAS;AAGd,UAAM,UAAU,eAAe,gDAC1B,gBACA,UAF0B;AAAA,MAG7B;AAAA,IACF,EAAC;AAID,QAAI;AACJ,QAAI,SAAS;AACX,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW;AAE1B,cAAQ,SAAS;AAEjB,gBAAU,WAAW,MAAM;AACzB,mBAAW,MAAM;AAAA,MACnB,GAAG,OAAO;AAAA,IACZ;AAEA,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,cAAc,mCAAS;AAAA,QACzB,CAAC;AAAA,QACD;AAAA,MACF;AAEA,aAAO,EAAE,MAAM,SAAS,WAAgB;AAAA,IAC1C,SAAS,GAAG;AACV,YAAM;AAAA,IACR,UAAE;AACA,iBAAW,aAAa,OAAO;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,UAAU,CAAC,SAAkB;AACjC,SAAO,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,IAAI;AAC9D;AAEA,IAAM,iBAAiB,CAAC,YAA8B;AACpD,SAAO,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,MAAM;AAC/D,QAAI,QAAQ,QAAQ;AAClB,aAAO,iCACF,UADE;AAAA,QAEL,MAAM,QAAQ,KAAK;AAAA,MACrB;AAAA,IACF,WAAW,SAAS,QAAW;AAC7B,aAAO,iCACF,UADE;AAAA,QAEL,CAAC,GAAG,GAAG;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAgB;AACtB;AAEA,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,QAAM,MAAM,IAAI,IAAI,MAAM,OAAO;AAEjC,MAAI,cAAc;AAChB,WAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACrD,UAAI,SAAS,QAAW;AACtB,YAAI,aAAa,OAAO,KAAK,KAAK;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,IAAI,SAAS;AACtB;;;ACjJO,SAAS,qBACd,MACA,QACA;AACA,QAAM,cAAc,OAAO,QAAiB;AAC1C,QAAI,CAAC,IAAK,QAAO,QAAQ,QAAQ,MAAS;AAC1C,UAAM,EAAE,MAAAC,MAAK,IAAI,MAAM,OAA6B,GAAG;AACvD,WAAO,qBAAwBA,OAAM,MAAM;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,MAAM,YAAY;AAChB,YAAM,EAAE,KAAK,IAAI,KAAK;AACtB,aAAO,YAAY,IAAI;AAAA,IACzB;AAAA,IACA,UAAU,YAAY;AACpB,YAAM,EAAE,KAAK,IAAI,KAAK;AACtB,aAAO,YAAY,IAAI;AAAA,IACzB;AAAA,IACA,UAAU,YAAY;AACpB,YAAM,EAAE,KAAK,IAAI,KAAK;AACtB,aAAO,YAAY,IAAI;AAAA,IACzB;AAAA,IACA,WAAW,YAAY;AACrB,YAAM,EAAE,MAAM,IAAI,KAAK;AACvB,aAAO,YAAY,KAAK;AAAA,IAC1B;AAAA,IACA,SAAS,QAAQ,KAAK,MAAM,IAAI;AAAA,IAChC,SAAS,QAAQ,KAAK,MAAM,IAAI;AAAA,EAClC;AACF;;;AC3BO,SAAS,oBACd,MACA,aACQ;AACR,QAAM,cAAc,YAAY,SAAS;AACzC,SAAO,cAAc,GAAG,IAAI,IAAI,WAAW,KAAK;AAClD;;;ACLO,IAAM,2BAA2B,CACtC,QACkC;AAClC,SAAO,OAAO,UAAU;AAC1B;AAEO,IAAM,yBAAyB,CACpC,QACgC;AAChC,SAAO,OAAO,QAAQ;AACxB;AAQO,IAAM,yBAAyB,CACpC,QACgC;AAChC,SAAO,OAAO,UAAU;AAC1B;;;AJDO,IAAM,aAAN,MAA+C;AAAA,EAGpD,YAAmB,SAAsB;AAAtB;AAFnB,wBAAQ;AAGN,SAAK,aAAa,iBAAiB;AAAA,MACjC,SAAS,WAAW,KAAK,QAAQ;AAAA,MACjC,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,QAAQ,KAAK;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,QAA0B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW;AACb,QAAI,aAAwB,CAAC;AAC7B,QAAI;AACF,mBAAaC,WAAqB,KAAK,QAAQ,OAAO;AAAA,QACpD,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,SAAS,GAAG;AACV,UAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,QAAAC,YAAU,EAAE,MAAM,qCAAqC;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,QAAQ,SAAQ,yCAAY;AAC9C,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AACA,WAAO,UAAU,KAAK,MAAM,GAAG,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EACtD;AAAA,EAEA,MAAa,WAAW,QAAqD;AAC3E,QAAI,OAAO;AACX,QAAI,yBAAyB,MAAM,GAAG;AACpC,aAAO,GAAG,IAAI,SAAS,OAAO,IAAI;AAAA,IACpC,WAAW,uBAAuB,MAAM,GAAG;AACzC,aAAO,GAAG,IAAI,IAAI,OAAO,EAAE;AAAA,IAC7B;AAEA,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,WAE1B,IAAI;AACN,QAAI,uBAAuB,IAAI,GAAG;AAEhC,UAAI,CAAC,KAAK,KAAK,CAAC,EAAG,OAAM,IAAIC,WAAU,KAAK,WAAW;AACvD,aAAO,KAAK,KAAK,CAAC;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,aACX,QAC6B;AAC7B,UAAM,EAAE,MAAM,aAAa,UAAU,QAAQ,UAAU,IAAI,UAAU,CAAC;AAEtE,QAAI,OAAO;AAEX,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,MAAM;AACR,kBAAY,OAAO,QAAQ,IAAI;AAAA,IACjC;AACA,QAAI,aAAa;AACf,kBAAY,OAAO,gBAAgB,WAAW;AAAA,IAChD;AACA,QAAI,UAAU;AACZ,kBAAY,OAAO,aAAa,SAAS,SAAS,CAAC;AAAA,IACrD;AAEA,QAAI,QAAQ;AACV,kBAAY,OAAO,WAAW,MAAM;AAAA,IACtC;AAEA,QAAI,WAAW;AACb,kBAAY,OAAO,cAAc,SAAS;AAAA,IAC5C;AAEA,UAAM,WAAW,oBAAoB,MAAM,WAAW;AACtD,IAAAD,YAAU,EAAE,MAAM,4BAA4B,QAAQ,EAAE;AACxD,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,WAAiC,QAAQ;AAErE,WAAO,qBAAqB,MAAM,KAAK,UAAU;AAAA,EACnD;AAAA,EAEA,MAAa,eACX,QAC+B;AAC/B,UAAM,EAAE,YAAY,YAAY,IAAI;AAEpC,UAAM,OAAO;AACb,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,WAAmC,MAAM;AAAA,MACnE,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,aAAa;AAAA,QACb,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,iBAAiB,QAAgC;AAC5D,UAAM,EAAE,GAAG,IAAI;AAEf,UAAM,OAAO,uBAAuB,EAAE;AACtC,UAAM,KAAK,WAAiB,MAAM;AAAA,MAChC,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,oBAAsD;AACjE,QAAI,OAAO;AAEX,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,WAAsC,IAAI;AAEtE,WAAO;AAAA,EACT;AACF;;;AK7IO,IAAM,kBAAN,MAAsD;AAAA,EAC3D,YACU,cACA,SACR;AAFQ;AACA;AAAA,EACP;AAAA,EAEH,IAAI,KAAK;AACP,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,YAAY,QAA0C;AACpD,WAAO,KAAK,aAAa,YAAY;AAAA,MACnC,WAAW,KAAK;AAAA,MAChB,MAAM,OAAO;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,QAA2C;AACrD,WAAO,KAAK,aAAa,wBAAwB;AAAA,MAC/C,WAAW,KAAK;AAAA,OACb,OACJ;AAAA,EACH;AACF;;;ACnBA,IAAM,kCAAkC;AAOjC,IAAM,eAAN,MAAmB;AAAA,EASxB,YAAY,SAA8B;AAR1C,wBAAQ;AACR,wBAAQ;AACR,wBAAQ,aAAY,oBAAI,IAAmC;AAC3D,wBAAQ,qBAGJ,CAAC;AAGH,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,QAAQ;AAExB,SAAK,SAAS,UAAU,sBAAsB;AAAA,MAC5C,QAAQ;AAAA,MACR,cAAc;AAAA,QACZ,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YAAY,OAAgC;AAC1C,QAAI,MAAM,YAAY,QAAQ;AAC5B,YAAM,gBAAgB,KAAK,kBAAkB,MAAM,eAAe;AAClE,UAAI,+CAAe,MAAM;AACvB,sBAAc,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,QAAI,KAAK,UAAU,MAAM;AACvB,WAAK,UAAU,QAAQ,CAAC,aAAa;AACnC,iBAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAa,YACX,QACwC;AACxC,QAAI;AACF,YAAM,EAAE,WAAW,KAAK,IAAI;AAC5B,YAAM,OAAO;AACb,YAAM,EAAE,KAAK,IACX,MAAM,KAAK,WAAW,MAAuC,MAAM;AAAA,QACjE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,iBAAiB;AAAA,UACjB;AAAA,QACF;AAAA,MACF,CAAC;AACH,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,0CAA0C,KAAK;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAa,iBACX,QACiC;AACjC,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,UAAU,CAAC;AAEhC,YAAM,OAAO;AACb,YAAM,cAAc,IAAI,gBAAgB;AACxC,UAAI,UAAU;AACZ,oBAAY,OAAO,aAAa,SAAS,SAAS,CAAC;AAAA,MACrD;AAEA,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,WAAW;AAAA,QACrC,oBAAoB,MAAM,WAAW;AAAA,MACvC;AACA,YAAM,OAAO;AACb,YAAM,OAAO,KAAK,KAAK;AAAA,QACrB,CAAC,iBAAiB,IAAI,gBAAgB,MAAM,YAAY;AAAA,MAC1D;AACA,aAAO,qBAAqB,iCAAK,OAAL,EAAW,KAAK,IAAG,KAAK,WAAW,KAAK;AAAA,IACtE,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,4CAA4C,KAAK;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,MAAa,YACX,QAC4B;AAC5B,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,UAAU,CAAC;AAEhC,YAAM,OAAO;AACb,YAAM,cAAc,IAAI,gBAAgB;AACxC,UAAI,UAAU;AACZ,oBAAY,OAAO,aAAa,SAAS,SAAS,CAAC;AAAA,MACrD;AAEA,YAAM,EAAE,KAAK,IACX,MAAM,KAAK,WAAW;AAAA,QACpB,oBAAoB,MAAM,WAAW;AAAA,MACvC;AAEF,aAAO;AAAA,QACL;AAAA,QACA,KAAK,WAAW;AAAA,MAClB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,6CAA6C,KAAK;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAa,wBACX,QACwC;AACxC,QAAI;AACF,YAAM,EAAE,WAAW,SAAS,IAAI,UAAU,CAAC;AAE3C,YAAM,OAAO,6BAA6B,SAAS;AACnD,YAAM,cAAc,IAAI,gBAAgB;AACxC,UAAI,UAAU;AACZ,oBAAY,OAAO,aAAa,SAAS,SAAS,CAAC;AAAA,MACrD;AAEA,YAAM,EAAE,KAAK,IACX,MAAM,KAAK,WAAW;AAAA,QACpB,oBAAoB,MAAM,WAAW;AAAA,MACvC;AAEF,aAAO;AAAA,QACL;AAAA,QACA,KAAK,WAAW;AAAA,MAClB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,6CAA6C,KAAK;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAa,gBACX,QAC2C;AAC3C,UAAM,EAAE,WAAW,WAAW,gCAAgC,IAAI;AAElE,UAAM,wBAAwB,OAC5B,WACA,SAAgC,CAAC,GACjC,kBAAkB,SAC4B;AAtLpD;AAuLM,YAAM,eAAe,CAAC,GAAG,MAAM;AAC/B,YAAM,UAAU,CAAC,SACf,KAAK,oBAAoB,aAAa,KAAK,YAAY;AAEzD,UAAI;AACJ,6BAAuB,OAAM;AAC7B,UAAI,oBAAmB,kEAAsB,KAAK,OAAO,aAAlC,YAA8C,CAAC;AACtE,UAAI,YAAY,WAAW,aAAa;AACxC,eACM,MAAM,GACV,MAAM,iBAAiB,UAAU,MAAM,WACvC,OACA;AACA,qBAAa,KAAK,iBAAiB,GAAG,CAAC;AAAA,MACzC;AAEA,aAAO,aAAa,SAAS,aAAY,6DAAsB,UAAS;AACtE,+BAAuB,OAAO,kBAC1B,6DAAsB,aACtB,6DAAsB;AAC1B,YAAI,CAAC,wBAAwB,CAAC,qBAAqB,KAAK,QAAQ;AAE9D;AAAA,QACF;AAEA,oBAAY,WAAW,aAAa;AACpC,2BAAmB,qBAAqB,KAAK,OAAO,OAAO;AAC3D,iBACM,MAAM,GACV,MAAM,iBAAiB,UAAU,MAAM,WACvC,OACA;AACA,uBAAa,KAAK,iBAAiB,GAAG,CAAC;AAAA,QACzC;AAAA,MACF;AAEA,UAAI,iBAAwC,CAAC;AAC7C,UAAI,YAAY,iBAAiB,QAAQ;AACvC,yBAAiB,iBAAiB,MAAM,SAAS;AAAA,MACnD;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,CAAC,EAAC,6DAAsB,YAAW,CAAC,CAAC,OAAO;AAAA,QACrD,SAAS,CAAC,EAAC,6DAAsB;AAAA,QAEjC,UAAU,MACR,sBAAsB,6DAAsB,UAAU,cAAc;AAAA,QACtE,UAAU,MACR;AAAA,UACE,6DAAsB;AAAA,UACtB;AAAA,UACA;AAAA,QACF;AAAA,QACF,MAAM,MACJ,sBAAsB,6DAAsB,MAAM,cAAc;AAAA,QAClE,WAAW,MACT;AAAA,UACE,6DAAsB;AAAA,UACtB;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MACE,KAAK,wBAAwB;AAAA,QAC3B;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAAa,UACX,UACsC;AACtC,SAAK,UAAU,IAAI,QAAQ;AAE3B,WAAO;AAAA,MACL,aAAa,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAa,sBACX,QACkD;AAClD,UAAM,EAAE,WAAW,UAAU,IAAI;AAEjC,QAAI,EAAE,aAAa,KAAK,oBAAoB;AAC1C,WAAK,kBAAkB,SAAS,IAAI,oBAAI,IAAI;AAAA,IAC9C;AAEA,SAAK,kBAAkB,SAAS,EAAE,IAAI,SAAS;AAC/C,WAAO;AAAA,MACL,aAAa,MAAM,KAAK,kBAAkB,SAAS,EAAE,OAAO,SAAS;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAa,iBACX,QACiC;AACjC,QAAI;AACF,YAAM,EAAE,UAAU,IAAI;AACtB,YAAM,OAAO;AACb,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,WAAW;AAAA,QACrC;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ,iBAAiB;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,iCAAiC,KAAK;AAAA,IACxD;AAAA,EACF;AACF;;;AC7SA;AAAA,EACE,WAAAE;AAAA,EACA,cAAAC;AAAA,EAEA;AAAA,EACA;AAAA,OAEK;;;ACSA,IAAM,sBAAN,MAA0B;AAAA,EAK/B,YAAoB,SAAqC;AAArC;AAJpB,wBAAQ;AACR,wBAAQ,mBAAkD,CAAC;AAC3D,wBAAQ,aAAkC,CAAC;AAGzC,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEQ,mBAAmB,QAAkD;AAC3E,UAAM,SAAS,OAAO,WAAuB;AAC3C,aAAO,IAAI,QAA2B,CAAC,SAASC,YAAW;AACzD,eAAO,KAAK,gBAAgB,OAAO,MAAM;AACzC,YAAI;AACF,gBAAM,OAAO,KAAK,QAAQ,iBAAiB,QAAQ,MAAM;AACzD,eAAK,OAAO;AAEZ,kBAAQ,IAAI;AAAA,QACd,SAAS,GAAG;AACV,UAAAA,QAAO,CAAC;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,MAAM;AACnB,aAAO,KAAK,gBAAgB,OAAO,MAAM;AACzC,aAAO,KAAK,QAAQ,gBAAgB,OAAO,QAAQ,OAAO,MAAM;AAAA,IAClE;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ,CAAC,WAAW,OAAO,MAAM;AAAA,QACjC,QAAQ,MAAM,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,wBAAwB,UAAgC;AACtD,SAAK,UAAU,MAAM,SAAS;AAC9B,QACG,SAAS,oBACR,KAAK,UAAU,OAAO,SAAS,oBACjC,CAAC,SAAS,kBACV;AACA,WAAK,UAAU,mBAAmB,SAAS;AAAA,IAC7C;AACA,QACG,SAAS,aAAa,KAAK,UAAU,OAAO,SAAS,aACtD,CAAC,SAAS,WACV;AACA,WAAK,UAAU,YAAY,SAAS;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,qBAAqB,gBAA0C;AAvEjE;AAwEI,QAAI,eAAe,UAAU,KAAK,iBAAiB;AACjD,WAAK,QAAQ,OAAO;AAAA,QAClB,uDAAuD,eAAe,MAAM;AAAA,MAC9E;AACA;AAAA,IACF;AACA,SAAK,gBAAgB,eAAe,MAAM,IAAI;AAE9C,QAAI,EAAE,KAAK,UAAU,OAAO,KAAK,UAAU,eAAe,MAAM,IAAI;AAClE,WAAK,QAAQ,OAAO,KAAK,2CAA2C;AACpE;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,mBAAmB,cAAc;AAE3D,qBAAK,WAAU,QAAf,4BAAqB;AACrB,UAAM,UAAU,KAAK,UAAU,eAAe,MAAM;AACpD,uCAAU;AAAA,EACZ;AACF;;;AC3FA,SAAS,kBAAAC,uBAAsB;;;ACA/B;AAAA,EACE;AAAA,EAIA;AAAA,OACK;AAMA,IAAM,aAAN,cAAyB,WAAW;AAAA,EAGzC,YAAmB,SAAyB;AAC1C,UAAM,OAAO;AADI;AAFnB,wBAAO,kBAAiB;AAAA,EAIxB;AAAA,EAEA,IAAa,YAAY;AACvB,QAAI,KAAK,mBAAmB;AAC1B,YAAM,EAAE,cAAc,IAAI,KAAK;AAC/B,aAAQ,cAAmC;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAe,wBAAwB;AAAA,EAOvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAe,iBAAiB;AAC9B,SAAK,OAAO,MAAM,0BAA0B;AAAA,MAC1C,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,QAAI,CAAC,KAAK,SAAS,KAAK,SAAS;AAC/B,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,UAAM,SAAkC;AAAA,MACtC,SAAS,KAAK,kBAAkB,cAAc;AAAA,MAC9C,WAAW,KAAK,QAAQ;AAAA,IAC1B;AAEA,QAAI;AACF,YAAM,iBAAiB,MAAM,KAAK,QAAQ,kBAAkB,MAAM,CAAC;AAEnE,WAAK,oBAAoB,kCACpB,KAAK,oBACL;AAAA,IAEP,SAAS,OAAO;AACd,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AD9DO,IAAM,iBAAiB,CAAC,YAA6B;AAC1D,QAAM,QAAQC,gBAAe;AAAA,IAC3B,aAAa;AAAA,IACb,oBAAoB;AAAA,EACtB,CAAC;AAED,SAAO,iCAAK,UAAL,EAAc,MAAM;AAC7B;;;AFeO,IAAM,WAAN,cAAuBC,YAA2C;AAAA,EAIvE,YAAoB,iBAAkC;AACpD,UAAM,SAAS,eAAe,eAAe;AAC7C,UAAM,MAAM;AAFM;AAHpB,wBAAQ;AACR,wBAAQ,iBAAyB;AAM/B,SAAK,uBAAuB,IAAI,oBAAoB;AAAA,MAClD,QAAQ;AAAA,MACR,kBAAkB,KAAK,iBAAiB,KAAK,IAAI;AAAA,MACjD,iBAAiB,KAAK,gBAAgB,KAAK,IAAI;AAAA,IACjD,CAAC;AAED,SAAK,UAAU,kBAAkB;AAAA,MAC/B,QAAQ;AAAA,MACR,cAAc;AAAA,QACZ,sBAAsB,CAAC,WAA2B;AAChD,eAAK,qBAAqB,qBAAqB;AAAA,YAC7C,QAAQ;AAAA,aACL,OACJ;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,iBAAkC;AACzD,UAQI,sBAPF;AAAA;AAAA,MACA,yBAAyB;AAAA,MACzB,qBAAqB;AAAA,MACrB,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,MAC3B,0BAA0B;AAAA,IA5DhC,IA8DQ,IADC,oBACD,IADC;AAAA,MANH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAIF,UAAM,OAAO,8BAA8B,iCACtC,UADsC;AAAA,MAEzC,OAAO,KAAK;AAAA,IACd,EAAC;AAMD,QAAI,aAAa;AACf,UAAI;AACF,0BAAkB;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,iDAAiD;AAAA,MACrE;AAAA,IACF;AAOA,UAAM,mBAAmB,CACvB,WACG;AA9FT,UAAAC;AA+FM,YAAM,UAASA,MAAA,OAAO,aAAa,YAApB,gBAAAA,IAA6B;AAAA;AAAA,QAE1C,CAAC,MAAM,EAAE,OAAO,KAAK,YAAY,EAAE,cAAc,KAAK;AAAA;AAGxD,UAAI,iCAAQ,aAAa;AACvB,YAAI;AACF,eAAK,kBAAkB;AAAA,QACzB,SAAS,OAAO;AACd,eAAK,OAAO,MAAM,8BAA8B,KAAK;AAAA,QACvD;AAAA,MACF;AAEA,UAAI,iCAAQ,aAAa;AACvB,YAAI;AACF,eAAK,kBAAkB;AAAA,QACzB,SAAS,OAAO;AACd,eAAK,OAAO,MAAM,8BAA8B,KAAK;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAEA,SAAK,GAAG,mBAAmB,gBAAgB;AAK3C,QAAI,0BAA0B;AAC5B,WAAK,GAAG,6BAA6B,CAAC,EAAE,OAAO,MAAM;AACnD,YAAI;AACF,cAAI,OAAO,cAAc,KAAK,YAAY,iBAAiB,QAAQ;AACjE,mBAAO,cACH,KAAK,kBAAkB,IACvB,KAAK,qBAAqB;AAAA,UAChC;AAAA,QACF,SAAS,OAAO;AACd,eAAK,OAAO,MAAM,8BAA8B,KAAK;AAAA,QACvD;AAAA,MACF,CAAC;AAAA,IACH;AAKA,QAAI,sBAAsB;AACxB,WAAK,GAAG,6BAA6B,CAAC,EAAE,OAAO,MAAM;AACnD,YAAI;AACF,cAAI,OAAO,cAAc,KAAK,YAAY,iBAAiB,QAAQ;AACjE,mBAAO,cACH,KAAK,kBAAkB,IACvB,KAAK,qBAAqB;AAAA,UAChC;AAAA,QACF,SAAS,OAAO;AACd,eAAK,OAAO,MAAM,8BAA8B,KAAK;AAAA,QACvD;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,QAA2C;AA5JvE;AA6JI,UAAM,CAAC,UAAU,KAAK,IAAI,OAAO,GAAG,MAAM,GAAG;AAC7C,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,QAAI,QAAQ;AACZ,QAAI,iBAAiB;AAErB,UAAM,cAAc,IAAI,gBAAgB,KAAK;AAC7C,UAAM,UAAU,YAAY,IAAI,SAAS;AACzC,QAAI,YAAY,SAAS;AACvB,cAAQ;AACR,uBAAiB;AAAA,IACnB;AAEA,UAAM,OAAO,KAAK,iBAAiB;AAAA,MACjC,QAAO,YAAO,UAAP,YAAgB;AAAA,MACvB,QAAO,YAAO,UAAP,YAAgB;AAAA,MACvB,iBAAgB,YAAO,mBAAP,YAAyB;AAAA,MACzC,iBAAgB,YAAO,mBAAP,YAAyB;AAAA,MACzC,aAAa,OAAO,eAAe,KAAK,gBAAgB;AAAA,MACxD,wBAAwB;AAAA,MACxB,oBAAoB;AAAA,MACpB,sBAAsB;AAAA,MACtB,0BAA0B;AAAA,MAC1B,mBAAmB;AAAA,MACnB,mBAAmB,OAAO;AAAA,MAC1B,QAAQ,OAAO;AAAA,MACf,SAAQ,YAAO,WAAP,YAAiB;AAAA,MACzB,sBAAsB,OAAO,wBAAwB;AAAA,MACrD,eAAe,OAAO,iBAAiB,KAAK,gBAAgB;AAAA,IAC9D,CAAC;AAGD,SAAK,KAAK,WAAW,MAAM;AACzB,WAAK,OAAO,MAAM,0BAA0B;AAC5C,WAAK,QAAQ;AAAA,IACf,CAAC;AAED,SAAK,QAAQ,KAAK,wBAAwB,MAAM;AAC9C,WAAK,OAAO,MAAM,sBAAsB;AACxC,WAAK,QAAQ;AACb,WAAK,QAAQ;AAAA,IACf,CAAC;AAID,SAAK,wBAAwB;AAC7B,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,SAAyB,QAAoB;AAhNxE;AAiNI,UAAM,OAAO,KAAK,iBAAiB;AAAA,MACjC,QAAO,YAAO,UAAP,YAAgB;AAAA,MACvB,QAAO,YAAO,UAAP,YAAgB;AAAA,MACvB,iBAAgB,YAAO,mBAAP,YAAyB;AAAA,MACzC,iBAAgB,YAAO,mBAAP,YAAyB;AAAA,MACzC,aAAa,OAAO,eAAe,KAAK,gBAAgB;AAAA,MACxD,wBAAwB;AAAA,MACxB,oBAAoB;AAAA,MACpB,sBAAsB;AAAA,MACtB,0BAA0B;AAAA,MAC1B,mBAAmB;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ;AAAA,MACnB,YAAY,QAAQ;AAAA,MACpB,sBAAsB,OAAO,wBAAwB;AAAA,MACrD,eAAe,OAAO,iBAAiB,KAAK,gBAAgB;AAAA,IAC9D,CAAC;AAGD,SAAK,KAAK,WAAW,MAAM;AACzB,WAAK,OAAO,MAAM,0BAA0B;AAC5C,WAAK,QAAQ;AAAA,IACf,CAAC;AAED,SAAK,QAAQ,KAAK,wBAAwB,MAAM;AAC9C,WAAK,OAAO,MAAM,sBAAsB;AACxC,WAAK,QAAQ;AACb,WAAK,QAAQ;AAAA,IACf,CAAC;AAID,SAAK,wBAAwB;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB,QAAgB,QAAgB;AAC5D,QAAI;AACF,aAAO,MAAM,KAAK,QAAuB;AAAA,QACvC,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,SAAS,SAAS;AAAA,YAChB,OAAO;AAAA,YACP,WAAW;AAAA,YACX,cAAc,EAAE,QAAQ,OAAO;AAAA,UACjC,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,OAAO,KAAK,qCAAqC,MAAM;AAC5D,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,QAAgB,QAAgB;AAClE,QAAI;AACF,aAAO,MAAM,KAAK,QAAuB;AAAA,QACvC,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,WAAW,CAAC;AAAA,UACZ,SAAS,eAAe;AAAA,YACtB,QAAQ;AAAA,YACR,cAAc,CAAC;AAAA,UACjB,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,OAAO,KAAK,qCAAqC,MAAM;AAC5D,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEgB,aAAa;AAC3B,WAAO,IAAI,QAAc,CAAC,SAAS,YAAY;AAC7C,UAAI,KAAK,eAAe;AACtB,gBAAQ;AAAA,MACV;AAEA,WAAK,QAAQ,KAAK,wBAAwB,MAAM;AAC9C,aAAK,QAAQ;AACb,gBAAQ;AACR,aAAK,gBAAgB;AAAA,MACvB,CAAC;AAED,YAAM,WAAW;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,KAAK,QAAoB;AACpC,WAAO,IAAI,QAA2B,OAAO,SAAS,WAAW;AAC/D,UAAI;AACF,cAAM,OAAO,KAAK,kBAAkB,MAAM;AAC1C,gBAAQ,IAAI;AAAA,MACd,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,qCAAqC,KAAK;AAC5D,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,SAAS,QAAoB;AACxC,WAAO,IAAI,QAA2B,OAAO,SAAS,WAAW;AAC/D,UAAI;AACF,cAAM,OAAO,KAAK,kBAAkB,iCAAK,SAAL,EAAa,QAAQ,KAAK,EAAC;AAC/D,gBAAQ,IAAI;AAAA,MACd,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,yCAAyC,KAAK;AAChE,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,uBAAuB,QAAsC;AAClE,WAAO,IAAI;AAAA,MACT,OAAO,SAAS,WAAW;AACzB,cAAM,EAAE,WAAW,KAAK,IAAI;AAC5B,YAAI,SAAS,eAAe;AAC1B,eAAK,OAAO,KAAK,6BAA6B,MAAM;AACpD,iBAAO,2BAA2B;AAAA,QACpC;AACA,aAAK,OAAO,MAAM,0BAA0B,MAAM;AAClD,cAAM;AAAA,UACJ,QAAQ,EAAE,QAAQ,QAAQ;AAAA,UAC1B,SAAS;AAAA,QACX,IAAI;AACJ,YAAI;AAEF,cAAI;AAEF,kBAAM,KAAK,sBAAsB,QAAQ,QAAQ,MAAM;AAAA,UACzD,SAAS,OAAO;AACd,iBAAK,OAAO,KAAK,mBAAmB,KAAK;AAAA,UAC3C;AAEA,eAAK,qBAAqB,qBAAqB;AAAA,YAC7C,QAAQ;AAAA,YACR;AAAA,aACG,QACJ;AAED,kBAAQ,EAAE,YAAY,cAAc,CAAC;AAAA,QACvC,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,YAAY,OAAe;AAChC,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,WAAK,QAAQ,KAAK,sBAAsB,CAAC,UAAU;AACjD,eAAO,KAAK;AAAA,MACd,CAAC;AACD,WAAK,QAAQ,KAAK,qBAAqB,MAAM;AAC3C,gBAAQ;AAAA,MACV,CAAC;AACD,WAAK,MAAM,SAASC,SAAQ,aAAa,EAAE,MAAM,CAAC,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO,EAAE,qBAAqB,GAAiB;AAC1D,SAAK,qBAAqB,wBAAwB,oBAAoB;AACtE,WAAO,KAAK,QAAuB;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ,CAAC;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,UAAU;AACf,SAAK,qBAAqB,wBAAwB,CAAC,CAAC;AACpD,WAAO,KAAK,QAAuB;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ,CAAC;AAAA,IACX,CAAC;AAAA,EACH;AACF;;;AIrYO,IAAM,aAAc,uBAAM;AAC/B,MAAI,WAA6C;AAEjD,SAAO,CAAC,WAA8D;AACpE,QAAI,CAAC,UAAU;AACb,iBAAW,IAAI,QAA0B,OAAO,SAAS,WAAW;AAClE,YAAI;AACF,gBAAM,WAAW,IAAI,SAAS,MAAM;AACpC,gBAAM,aAAa,IAAI,WAAW,MAAM;AACxC,gBAAM,eAAe,IAAI,aAAa,EAAE,YAAY,SAAS,CAAC;AAG9D,gBAAM,SAAS,QAAQ;AAEvB,kBAAQ;AAAA,YACN,gBAAgB,WAAW,eAAe,KAAK,UAAU;AAAA,YACzD,kBAAkB,WAAW,iBAAiB,KAAK,UAAU;AAAA,YAC7D,mBAAmB,WAAW,kBAAkB,KAAK,UAAU;AAAA,YAC/D,YAAY,YAAY;AACtB,oBAAM,SAAS,WAAW;AAC1B,yBAAW;AAAA,YACb;AAAA,YACA,QAAQ,SAAS,OAAO,KAAK,QAAQ;AAAA,YACrC,SAAS,SAAS,QAAQ,KAAK,QAAQ;AAAA,YACvC,MAAM,SAAS,KAAK,KAAK,QAAQ;AAAA,YACjC,UAAU,SAAS,SAAS,KAAK,QAAQ;AAAA,YACzC,wBACE,SAAS,uBAAuB,KAAK,QAAQ;AAAA,YAC/C,aAAa,SAAS,YAAY,KAAK,QAAQ;AAAA,YAC/C,SAAS;AAAA,cACP,cAAc,WAAW,aAAa,KAAK,UAAU;AAAA,cACrD,YAAY,WAAW,WAAW,KAAK,UAAU;AAAA,YACnD;AAAA,YACA,cAAc;AAAA,cACZ,kBACE,aAAa,iBAAiB,KAAK,YAAY;AAAA,cACjD,aAAa,aAAa,YAAY,KAAK,YAAY;AAAA,cACvD,yBACE,aAAa,wBAAwB,KAAK,YAAY;AAAA,cACxD,WAAW,aAAa,UAAU,KAAK,YAAY;AAAA,cACnD,aAAa,aAAa,YAAY,KAAK,YAAY;AAAA,cACvD,MAAM,aAAa,iBAAiB,KAAK,YAAY;AAAA,YACvD;AAAA,YACA,MAAM;AAAA,cACJ,aAAa,aAAa,gBAAgB,KAAK,YAAY;AAAA,cAC3D,WAAW,aAAa,sBAAsB,KAAK,YAAY;AAAA,cAC/D,aAAa,aAAa,YAAY,KAAK,YAAY;AAAA,cACvD,MAAM,aAAa,iBAAiB,KAAK,YAAY;AAAA,YACvD;AAAA;AAAA,YAEA,IAAI,SAAS,GAAG,KAAK,QAAQ;AAAA,YAC7B,KAAK,SAAS,IAAI,KAAK,QAAQ;AAAA,YAC/B,cAAc;AAAA,YACd,YAAY;AAAA,UACd,CAAC;AAAA,QACH,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,CAAC,EAAE,MAAM,CAAC,UAAU;AAKlB,mBAAW;AACX,cAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF,GAAG;;;AC1EH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAsB,aAAAC,mBAAiB;AAoBvC,IAAM,oBAA2C;AAAA,EAC/C,aAAa,EAAE,OAAO,KAAK,EAAE;AAC/B;AAuBO,IAAM,mBAAmB,CAC9B,gBACkB;AAClB,SAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,UAWI,kBAVF;AAAA,cAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,yBAAyB;AAAA,MACzB,WAAW;AAAA,MACX,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,MAC3B;AAAA,IA1DN,IA4DQ,IADC,wBACD,IADC;AAAA,MATH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAIF,UAAM,SAAS,aAAa,mBACvB,YACJ;AACD,UAAM,OAAO,QAAQ;AAErB,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAOA,QAAI;AACJ,QAAI,eAAe;AACjB,YAAM,KAAK,SAAS,eAAe,aAAa;AAEhD,UAAI,IAAI;AACN,sBAAc;AAAA,MAChB,OAAO;AACL,sBAAc,SAAS;AAEvB,QAAAC,YAAU,EAAE;AAAA,UACV,wCAAwC,aAAa;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,OAAO,MAAM,eAAe;AAAA,MAC7C;AAAA,MACA,OAAO,UAAU,OAAO,oBAAoB;AAAA,MAC5C,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,eAAW,KAAK,WAAW,MAAM;AAC/B,iBAAW,KAAK,WAAW;AAC3B,aAAO,WAAW;AAAA,IACpB,CAAC;AAED,UAAM,OAAO,MAAM;AACjB,aAAO,IAAI,QAAQ,OAAOC,UAASC,YAAW;AAC5C,YAAI;AACF,qBAAW,KAAK,mBAAmB,CAAC,aAAa;AAC/C,YAAAD,SAAQ,UAAU;AAAA,UACpB,CAAC;AAED,gBAAM,WAAW,KAAK;AAAA,QACxB,SAAS,OAAO;AACd,UAAAD,YAAU,EAAE,MAAM,QAAQ,KAAK;AAE/B,iBAAO,WAAW;AAElB,UAAAE,QAAO,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,OAAO,IAAI,MAAM,YAAY;AAAA,MACjC,IAAI,QAAa,MAAW,UAAe;AACzC,YAAI,SAAS,QAAQ;AACnB,iBAAO;AAAA,QACT;AACA,eAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,MAC3C;AAAA,IACF,CAAC;AAED,QAAI,UAAU;AACZ,UAAI;AACF,cAAM,KAAK,KAAK;AAChB,gBAAQ,IAAI;AAAA,MACd,SAAS,OAAO;AACd,eAAO,KAAK;AAAA,MACd;AAAA,IACF,OAAO;AACL,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,CAAC;AACH;;;AC7HO,IAAM,WAAW,CAAC,gBAAyC;AAChE,SAAO,iBAAiB,iCACnB,cADmB;AAAA,IAEtB,UAAU;AAAA,EACZ,EAAC;AACH;;;AC5BA;AAAA,EAEE,aAAAC;AAAA,OAGK;AAeA,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,IAAM,kBAAqD;AAAA,EACzD;AAAA,EACA;AACF;AACA,IAAMC,QAAO,MAAM;AAAC;AA6Bb,IAAM,cAAc,SAAU,aAAiC;AACpE,QAgBI,kBAfF;AAAA,WAAO,uBAAuB;AAAA,IAC9B,OAAO,uBAAuB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,EAjH3B,IAmHM,IADC,wBACD,IADC;AAAA,IAdH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAIF,QAAM,mBAAmB,CAAC,SAAS,OAAO;AAC1C,mBAAiB,QAAQ,CAAC,UAAU;AAClC,QAAI,SAAS,aAAa;AACxB,MAAAC,YAAU,EAAE;AAAA,QACV,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,iBAAgB,2CAAa,cAAa;AAEhD,QAAM,EAAE,UAAU,IAAI,sBAAsB,YAAY,KAAK;AAC7D,QAAM,kBAAkB;AAAA,IACtB,QAAQ,CAAC,EAAE,QAAQ,MAAsC;AAnI7D,UAAAC;AAoIM,UAAI,iBAAiB,WAAW;AAC9B,SAAAA,MAAA,WAAW,MAAX,gBAAAA,IAAc,QAAQ,WAAW;AAAA,MACnC;AAAA,IACF;AAAA,IACA,MAAM,MAAM;AACV,UAAI,eAAe;AACjB,aAAK,GAAG,mBAAmB,gBAAgB,MAAM;AAAA,MACnD;AACA,WAAK,QAAQ,aAAa,gBAAgB,cAAc;AAAA,IAC1D;AAAA,IACA,SAAS,MAAM;AA9InB,UAAAA;AA+IM,UAAI,CAAC,eAAe;AAClB;AAAA,MACF;AAEA,WAAK,IAAI,mBAAmB,gBAAgB,MAAM;AAClD,UAAI,WAAW;AACb,SAAAA,MAAA,WAAW,MAAX,gBAAAA,IAAc,WAAW;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,eAAe,MAAM;AAxJzB,UAAAA,KAAA;AAyJM,UAAI,CAAC,iBAAiB,CAAC,WAAW;AAChC;AAAA,MACF;AAEA,cAAO,MAAAA,MAAA,WAAW,MAAX,gBAAAA,IAAc,QAAQ,eAAtB,YAAoC;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,SAAS,aAA0B,WAAW;AACpD,QAAM,OAAO,OAAO,MAAM,eAAe;AAAA;AAAA;AAAA,IAGvC,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,gBAAgB,cAAc;AAAA,IAC1C;AAAA,EACF,CAAC;AAGD,OAAK,KAAK,WAAW,MAAM;AACzB,SAAK,KAAK,aAAa,EAAE,QAAQ,KAAK,YAAY,CAAC;AAGnD,oBAAgB,QAAQ;AACxB,WAAO,WAAW;AAAA,EACpB,CAAC;AAGD,SAAO,QAAQ,KAAK,wBAAwB,MAAM;AAChD,SAAK,QAAQ;AAAA,EACf,CAAC;AAED,QAAM,OAAO,CAAC,WAAuC;AACnD,WAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AArMlD,UAAAA,KAAA;AAsMM,UAAI;AAEF,aAAK,wBAAwB;AAE7B,cAAM,OAAO,QAAQ;AAGrB,cAAM,SAAQA,MAAA,iCAAQ,UAAR,OAAAA,MAAiB;AAC/B,cAAM,SAAQ,sCAAQ,UAAR,YAAiB;AAG/B,cAAM,YAAgC,OAAO;AAC7C,QAAAD,YAAU,EAAE,MAAM,iCAAiC,SAAS;AAC5D,YAAI,aAAa,UAAU,SAAS,SAAS;AAC3C,gBAAM,eAAe,mBAAmB;AAAA,YACtC;AAAA;AAAA,YAEA,WAAW,QAAQ,KAAK;AAAA,YACxB,WAAW,QAAQ,KAAK;AAAA,aACrB,OACJ;AAED,cAAI,CAAC,iBAAiB,YAAY,GAAG;AACnC,mBAAO,WAAW;AAClB,mBAAO;AAAA,cACL,IAAI;AAAA,gBACF,oEACE,UAAU,OACZ;AAAA,EAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA,cACzC;AAAA,YACF;AAAA,UACF;AACA,UAAAA,YAAU,EAAE,MAAM,oBAAoB,YAAY;AAUlD,eAAK,mBAAmB;AAAA,YACtB,OAAO,aAAa,gBAAgB,SAAS,OAAO;AAAA,YACpD,OAAO,aAAa,gBAAgB,SAAS,OAAO;AAAA,YACpD,gBAAgB,aAAa;AAAA,YAC7B,gBAAgB,aAAa;AAAA,UAC/B,CAAC;AAAA,QACH;AAEA,aAAK,KAAK,mBAAmB,MAAM;AACjC,kBAAQ,IAAI;AAAA,QACd,CAAC;AAGD,wBAAgB,KAAK;AAErB,wBAAgB,QAAQ,CAAC,UAAU,KAAK,KAAK,OAAOD,KAAI,CAAC;AAEzD,cAAM,KAAK,KAAK;AAAA,MAClB,SAAS,OAAO;AACd,QAAAC,YAAU,EAAE,MAAM,oBAAoB,KAAK;AAE3C,eAAO,WAAW;AAElB,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,IAAI,MAAgC,MAAM;AAAA,IAC/C,IAAI,QAAqB,MAAyB,UAAe;AAC/D,UAAI,QAAQ,cAAc;AAExB,eAAO,aAAa,IAAI;AAAA,MAC1B;AAEA,UAAI,CAAC,OAAO,UAAU,mBAAmB,SAAS,IAAI,GAAG;AACvD,cAAM,IAAI;AAAA,UACR,wCAAwC,IAAI;AAAA,QAC9C;AAAA,MACF;AAEA,aAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,IAC3C;AAAA,EACF,CAAC;AAEH;;;ACjSA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAAE;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAAC;AAAA;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,8BAAAH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAAE;AAAA,EACA,yBAAAD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
|
|
6
|
+
"names": ["Client", "connect", "actions", "actions", "actions", "getLogger", "sagaEffects", "getLogger", "getLogger", "toExternalJSON", "stripNamespacePrefix", "getLogger", "sagaEffects", "action", "getLogger", "uuid", "getLogger", "getLogger", "connect", "extendComponent", "Rooms", "validateEventsToSubscribe", "connect", "LOCAL_EVENT_PREFIX", "BaseConnection", "getLogger", "getLogger", "sagaEffects", "validateEventsToSubscribe", "getLogger", "sagaEffects", "action", "getLogger", "sagaEffects", "stripNamespacePrefix", "getLogger", "Rooms", "getLogger", "Rooms", "stripNamespacePrefix", "getLogger", "Rooms", "stripNamespacePrefix", "getLogger", "sagaEffects", "stripNamespacePrefix", "BaseConnection", "connect", "LOCAL_EVENT_PREFIX", "Rooms", "extendComponent", "BaseConnection", "validateEventsToSubscribe", "connect", "extendComponent", "Rooms", "connect", "getLogger", "e", "getLogger", "sagaEffects", "getLogger", "sagaEffects", "getLogger", "sagaEffects", "connect", "connect", "getLogger", "sagaEffects", "getLogger", "getLogger", "getLogger", "sagaEffects", "MemberPosition", "stripNamespacePrefix", "getLogger", "getLogger", "getLogger", "sagaEffects", "MemberPosition", "stripNamespacePrefix", "getLogger", "sagaEffects", "action", "getLogger", "sagaEffects", "connect", "getLogger", "getLogger", "params", "uuid", "params", "_a", "getLogger", "_a", "actions", "jwtDecode", "getLogger", "jwtDecode", "getLogger", "connect", "Client", "Client", "INTERCEPTED_METHODS", "Client", "jwtDecode", "getLogger", "HttpError", "body", "jwtDecode", "getLogger", "HttpError", "actions", "BaseClient", "reject", "configureStore", "configureStore", "BaseClient", "_a", "actions", "getLogger", "getLogger", "resolve", "reject", "getLogger", "noop", "getLogger", "_a", "createSpeakerDeviceWatcher", "getDisplayMedia", "setMediaElementSinkId", "supportsMediaOutput"]
|
|
7
7
|
}
|