@realsee/live 0.6.10 → 0.6.12

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/utils/subscribe.ts","../src/rtc/CoreRTC.ts","../src/typings/rtc/type.ts","../src/utils/logger.ts","../src/utils/uuid.ts","../src/rtc/BrowserRTC.ts","../src/rtc/BrowserRTC4Chime.ts","../src/typings/rtc/joinedInfo.ts","../src/rtc/VRWebViewRTC.ts","../src/typings/live/LiveMsg.ts","../src/typings/live/LiveState.ts","../src/typings/live/UserInfo.ts","../src/typings/live/WebSocket.ts","../node_modules/amazon-chime-sdk-js/build/logger/LogLevel.js","../src/utils/appendUri.ts","../src/utils/clientDetector.ts","../src/utils/equal.ts","../src/utils/RobustWebSocket.ts","../src/live/controller.ts","../src/live/live.ts","../src/live/createLive.ts","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/live/createLiveReact.tsx"],"sourcesContent":["const EVENT_SYMBOL: unique symbol = Symbol('$$REALSEE_LIVE_EVENT$$');\n\nexport type EventMap = {\n [name: string]: (...args: any[]) => void | boolean;\n};\n\nfunction __generateEventIfNotExisted<T extends EventMap>(\n instance: any,\n): {\n [Key in keyof T]: [\n callback: (...args: Parameters<T[Key]>) => ReturnType<T[Key]>,\n once: boolean,\n ][];\n} {\n if (!instance[EVENT_SYMBOL]) {\n instance[EVENT_SYMBOL] = {};\n }\n return instance[EVENT_SYMBOL];\n}\n\nfunction __removeEventIfNotExisted(instance: any) {\n if (!instance[EVENT_SYMBOL]) {\n delete instance[EVENT_SYMBOL];\n }\n}\n\n/**\n * 监听者模式\n * @template T 预设的监听回调类型\n * @example\n * ```\n * new Subscribe<{\n * \"foo\": [arg1: number, arg2: string],\n * \"bar\": [arg: boolean],\n * }>()\n * ```\n */\nexport class Subscribe<T extends EventMap> {\n /**\n * 判断是否注册了事件\n * @param name 事件类型\n */\n hasListener(name: keyof T): boolean {\n const events = __generateEventIfNotExisted<T>(this);\n return events && events[name] && events[name].length > 0;\n }\n\n /**\n * 注册事件\n * @param name 事件类型\n * @param callback 事件回调函数\n * @param once 是否只执行一次\n * @returns 解除事件\n * @template K 预设的监听事件名称\n * @template C 回调函数函数上下文\n */\n on<K extends keyof T>(\n name: K,\n callback: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n once?: boolean,\n ): () => void {\n const events = __generateEventIfNotExisted<T>(this);\n if (!events[name]) events[name] = [];\n events[name].push([callback as any, once || false]);\n return () => this.off(name, callback);\n }\n\n /**\n * 注册事件(是否只执行一次)\n * @param name 事件类型\n * @param callback 事件回调函数\n * @returns 解除事件\n * @template K 预设的监听事件名称\n * @template C 回调函数函数上下文\n */\n once<K extends keyof T>(\n name: K,\n callback: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n ): () => void {\n return this.on(name, callback, true);\n }\n\n /**\n * 解除事件\n *\n * 如果 name 不传的话解除对应所有事件\n * 如果 name, callback 不传的话解除所有name的所有事件\n * @param name 事件类型\n * @param callback 事件回调函数\n * @template K 预设的监听事件名称\n */\n off<K extends keyof T>(\n name?: K,\n callback?: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n ): void {\n if (name === undefined) {\n __removeEventIfNotExisted(this);\n return;\n }\n const events = __generateEventIfNotExisted<T>(this);\n if (!events[name]) events[name] = [];\n if (callback === undefined) {\n events[name].length = 0;\n return;\n }\n let index = 0;\n for (; index < events[name].length; index++) {\n if (events[name][index][0] === callback) break;\n }\n if (index < events[name].length) {\n events[name].splice(index, 1);\n }\n }\n\n /**\n * 触发事件\n * @param name 事件类型\n * @param data 触发事件的数据\n * @returns canceled 是否被触发取消\n * @template K 预设的监听事件名称\n */\n emit<K extends keyof T>(name: K, ...data: Parameters<T[K]>): boolean {\n let canceled = false;\n const events = __generateEventIfNotExisted<T>(this);\n const event = events[name] || [];\n for (let one of event.slice()) {\n const [callback, once = false] = one;\n const result = callback(...data);\n if (once) this.off(name, callback);\n if (result === false) canceled = true;\n }\n return canceled;\n }\n}\n\nexport namespace SubscribeMixinType {\n export interface hasListener<T extends EventMap> {\n (name: keyof T): boolean;\n }\n export interface on<T extends EventMap> {\n <K extends keyof T>(\n name: K,\n callback: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n once?: boolean,\n ): () => void;\n }\n export interface once<T extends EventMap> {\n <K extends keyof T>(\n name: K,\n callback: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n ): () => void;\n }\n export interface off<T extends EventMap> {\n <K extends keyof T>(\n names?: K | K[],\n callback?: (...args: any[]) => any,\n ): void;\n }\n export interface emit<T extends EventMap> {\n <K extends keyof T>(name: K, ...data: Parameters<T[K]>): boolean;\n }\n}\n","import { RTCEventType } from '../typings/rtc/eventType';\nimport { RTCProtocol } from '../typings/rtc/protocol';\nimport { RTCType } from '../typings/rtc/type';\nimport { Subscribe } from '../utils/subscribe';\n\n/**\n * rtc 基础抽象类\n */\nexport abstract class CoreRTC\n extends Subscribe<RTCEventType>\n implements RTCProtocol\n{\n abstract joined: boolean;\n\n abstract micro: boolean;\n\n abstract voiceId: string;\n\n abstract type: RTCType;\n\n abstract join(options: {\n voiceId: string;\n userId: string;\n roomId: string | number | undefined;\n type: RTCType;\n }): Promise<boolean>;\n\n abstract quit(): Promise<boolean>;\n\n abstract detectMicro(): Promise<boolean>;\n\n abstract toggleMicro(flag?: boolean): Promise<boolean>;\n\n abstract shock(): void;\n}\n","/**\n * rtc 类型\n */\nexport enum RTCType {\n RealseeBrowserRTC = 'RealseeBrowserRTC',\n RealseeVRWebViewRTC = 'RealseeVRWebViewRTC',\n RealseeBrowserChimeRTC = 'RealseeBrowserChimeRTC',\n}\n\nexport enum BuiltInRTCType {\n RealseeXTRTC = 'trtc',\n RealseeXChimeRTC = 'chime',\n}\n","/**\n * 输出格式化日志\n */\n\n// 获取当前时间\nconst getTime = (): string => {\n const date = new Date();\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0'); //月份是从0开始的\n const day = date.getDate().toString().padStart(2, '0');\n const hour = date.getHours().toString().padStart(2, '0');\n const min = date.getMinutes().toString().padStart(2, '0');\n const sec = date.getSeconds().toString().padStart(2, '0');\n const ms = date.getMilliseconds();\n\n return `[${year}-${month}-${day} ${hour}:${min}:${sec}.${ms}]`;\n};\n\nexport enum LOG_LEVEL {\n info = 'INFO',\n log = 'LOG',\n error = 'ERROR',\n warn = 'WARN',\n}\n\n// 输出日志\nconst echo = (logLevel: Partial<LOG_LEVEL>, args: any[] = []) => {\n args.unshift(`Realsee Live ${getTime()} <${logLevel}> `);\n switch (logLevel) {\n case LOG_LEVEL.info:\n return console.info(...args);\n case LOG_LEVEL.error:\n return console.error(...args);\n case LOG_LEVEL.warn:\n return console.warn(...args);\n default:\n return console.log(...args);\n }\n};\n\nconst log = (...args: any[]) => echo(LOG_LEVEL.log, args);\n\nconst info = (...args: any[]) => echo(LOG_LEVEL.info, args);\n\nconst error = (...args: any[]) => echo(LOG_LEVEL.error, args);\n\nconst warn = (...args: any[]) => echo(LOG_LEVEL.warn, args);\n\nconst logger = {\n log,\n info,\n error,\n warn,\n};\n\nexport default logger;\n","// uuid\nfunction S4() {\n return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\n}\n\n/**\n * 基于伪随机数生成 **uuid**。\n */\nexport function uuid() {\n // then to call it, plus stitch in '4' in the third group\n return (\n S4() +\n S4() +\n '-' +\n S4() +\n '-4' +\n S4().substr(0, 3) +\n '-' +\n S4() +\n '-' +\n S4() +\n S4() +\n S4()\n ).toLowerCase();\n}\n","import TRTC, { Client, LocalStream } from 'trtc-js-sdk';\nimport { GetVoiceSign } from '../typings/live/GetVoiceSign';\nimport { RTCType } from '../typings/rtc/type';\nimport logger from '../utils/logger';\n\nimport { uuid } from '../utils/uuid';\nimport { CoreRTC } from './CoreRTC';\n\nexport interface ITrtcInstance {\n client: Client | null;\n stream: LocalStream | null;\n}\n\nexport class BrowserRTC extends CoreRTC {\n type = RTCType.RealseeBrowserRTC;\n joined = false;\n micro = false;\n voiceId = '';\n\n private _getVoiceSign: GetVoiceSign = () => {\n throw new Error('方法 getVoiceSign 未实现');\n };\n\n private _autoPlayConfirm: (opts: {\n onConfirm: () => void;\n }) => void | undefined;\n\n public checkRequirement = () => TRTC.checkSystemRequirements();\n\n private $dom: HTMLDivElement = document.createElement('div');\n\n private _trtc: ITrtcInstance = {\n client: null,\n stream: null,\n };\n\n constructor(options: {\n getVoiceSign: GetVoiceSign;\n autoPlayConfirm?: (opts: { onConfirm: () => void }) => void;\n }) {\n super();\n this._getVoiceSign = options.getVoiceSign;\n // @ts-ignore\n this._autoPlayConfirm = options.autoPlayConfirm;\n this._initParentDom();\n }\n\n private _initParentDom() {\n this.$dom.id = `rs-rtc-${uuid()}`;\n this.$dom.style.display = 'none';\n document.body.appendChild(this.$dom);\n }\n\n join = async (options: {\n voiceId: string;\n userId: string;\n roomId: string;\n type: RTCType;\n }): Promise<boolean> => {\n this.emit('joinWillStart');\n const createClientOptions = await this._getVoiceSign({\n voiceId: options.voiceId,\n roomId: options.roomId,\n userId: options.userId,\n });\n // 1. 创建client\n this._trtc.client = TRTC.createClient({\n mode: 'rtc',\n ...createClientOptions,\n enableAutoPlayDialog:\n typeof this._autoPlayConfirm === 'function' ? false : true,\n });\n\n this._trtc.client?.enableAudioVolumeEvaluation();\n\n // 2. 订阅事件\n this._registerRtcEvent();\n\n // 3. 加入语音房间\n let result = await new Promise<boolean>((resolve) => {\n this._trtc.client\n ?.join({ roomId: Number(options.voiceId) })\n .then(() => resolve(true))\n .catch(() => resolve(false));\n });\n\n this.joined = result;\n\n if (!result) return false; // 进房失败\n\n // 4. 创建本地流\n this._trtc.stream = TRTC.createStream({\n userId: createClientOptions.userId,\n audio: true,\n video: false,\n });\n\n // 5. 初始化本地流\n result = await new Promise<boolean>((resolve) => {\n this._trtc.stream\n ?.initialize()\n .then(() => resolve(true))\n .catch(() => resolve(false));\n });\n\n // 6. 发布本地流\n result = await new Promise<boolean>((resolve) => {\n this._trtc.client\n ?.publish(this._trtc.stream!)\n .then(() => resolve(true))\n .catch(() => resolve(false));\n });\n\n this.joined = result;\n\n if (this.joined) this.emit('joined');\n\n return result;\n };\n\n quit(): Promise<boolean> {\n return new Promise(async (resolve) => {\n this.joined = false;\n if (this._trtc.stream) {\n await this._trtc.client?.unpublish(this._trtc.stream);\n this._trtc.stream.stop();\n this._trtc.stream.close();\n this._trtc.stream = null;\n }\n this._trtc.client\n ?.leave()\n .then(() => (this._trtc.client = null))\n .then(() => resolve(true))\n .catch(() => resolve(false));\n resolve(true);\n });\n }\n\n detectMicro(): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n const rule = { audio: true, video: false };\n try {\n navigator.mediaDevices\n .getUserMedia(rule)\n .then(() => resolve(true))\n .catch((e) => {\n logger.error(e.message);\n resolve(false);\n });\n } catch (e) {\n console.error(e);\n resolve(false);\n }\n });\n }\n\n toggleMicro(flag?: boolean): Promise<boolean> {\n return Promise.resolve(\n (flag\n ? this._trtc?.stream?.unmuteAudio()\n : this._trtc?.stream?.muteAudio()) || false,\n );\n }\n\n shock(): void {\n throw new Error('Method not implemented.');\n }\n\n private _registerRtcEvent() {\n this._trtc.client?.on('stream-added', this._handleStreamAdded);\n this._trtc.client?.on('stream-subscribed', this._handleStreamSubscribed);\n this._trtc.client?.on('audio-volume', (event) =>\n this.emit(\n 'userVolumes',\n event.result.map(({ userId, audioVolume }) => ({\n userId,\n audioVolume,\n })),\n ),\n );\n this._trtc.client?.on('error', (event: any) => this.emit('error', event));\n }\n\n private _handleStreamAdded = (event: any) => {\n const remoteStream = event.stream;\n console.log('远端流增加: ' + remoteStream.getId());\n //订阅远端流\n this._trtc.client?.subscribe(remoteStream);\n };\n\n private _handleStreamSubscribed = (event: any) => {\n const remoteStream = event.stream;\n console.log('远端流订阅成功:' + remoteStream.getId());\n const playId = remoteStream.getId();\n const domId = `rs-rtc-remote_stream-${playId}`;\n const dom = document.createElement('div');\n dom.id = domId;\n this.$dom.appendChild(dom);\n // 播放远端流\n if (typeof this._autoPlayConfirm === 'function') {\n remoteStream.play(domId).catch((error: any) => {});\n remoteStream.on('error', (error: any) => {\n const errorCode = error.getCode();\n if (errorCode === 0x4043) {\n // PLAY_NOT_ALLOWED,引导用户手势操作并调用 stream.resume 恢复音视频播放\n const onConfirm = () => remoteStream.resume();\n this._autoPlayConfirm({ onConfirm });\n }\n });\n } else {\n remoteStream.play(domId);\n }\n };\n}\n","import {\n AudioMixObserver,\n AudioVideoObserver,\n BrowserBehavior,\n ConsoleLogger,\n DefaultDeviceController,\n DefaultMeetingSession,\n DefaultModality,\n DeviceChangeObserver,\n LogLevel,\n MeetingSessionConfiguration,\n MeetingSessionStatusCode,\n} from 'amazon-chime-sdk-js'\nimport { MeetingSessionConfigurationOptions } from '../typings/chime/MeetingSessionConfigurationOptions'\nimport { GetVoiceSign } from '../typings/live/GetVoiceSign'\nimport { RTCType } from '../typings/rtc/type'\nimport logger from '../utils/logger'\n\nimport { uuid } from '../utils/uuid'\nimport { CoreRTC } from './CoreRTC'\n\n/**\n * amazon-chime-sdk-js 适配的rtc实现\n */\nexport class BrowserRTC4Chime extends CoreRTC {\n type = RTCType.RealseeBrowserChimeRTC\n joined = false\n micro = false\n voiceId = ''\n userId = ''\n logger: ConsoleLogger\n deviceController: DefaultDeviceController\n meetingSession: DefaultMeetingSession | undefined\n\n audioInput: MediaDeviceInfo | undefined\n audioOutput: MediaDeviceInfo | undefined\n\n deviceChangeObserver: DeviceChangeObserver = {}\n audioVideoObserver: AudioVideoObserver = {}\n audioMixObserver?: AudioMixObserver\n\n private _getVoiceSign: GetVoiceSign = () => {\n throw new Error('方法 getVoiceSign 未实现')\n }\n\n private _autoPlayConfirm: (opts: { onConfirm: () => void }) => void | undefined\n\n private $dom: HTMLDivElement = document.createElement('div')\n private $audio: HTMLAudioElement = document.createElement('audio')\n\n constructor(options: {\n getVoiceSign: GetVoiceSign\n autoPlayConfirm?: (opts: { onConfirm: () => void }) => void\n logLevel?: LogLevel\n }) {\n super()\n // 挂载签名钩子\n this._getVoiceSign = options.getVoiceSign\n // @ts-ignore\n this._autoPlayConfirm = options.autoPlayConfirm\n this._initDom()\n this.logger = new ConsoleLogger('WebRTCLogger', options.logLevel || LogLevel.INFO)\n this.deviceController = new DefaultDeviceController(this.logger)\n this.initObservers()\n }\n\n /**\n * 对audio标签初始化\n */\n _initDom = () => {\n this.$audio.id = `rs-rtc-${uuid()}`\n this.$dom.id = `rs-rtc-${uuid()}`\n this.$dom.appendChild(this.$audio)\n document.body.appendChild(this.$dom)\n }\n\n /**\n * 初始化事件监听器\n */\n initObservers = () => {\n // 输入输出设备变化的监听器\n this.deviceChangeObserver = {\n audioInputsChanged: (freshAudioInputDeviceList?: MediaDeviceInfo[]) => {\n this.logger.info(`audioInputsChanged ${typeof freshAudioInputDeviceList}`)\n // An array of MediaDeviceInfo objects\n freshAudioInputDeviceList?.forEach((mediaDeviceInfo) => {\n this.logger.info(`Device ID: ${mediaDeviceInfo.deviceId} Microphone: ${mediaDeviceInfo.label}`)\n })\n },\n\n audioOutputsChanged: (freshAudioOutputDeviceList?: MediaDeviceInfo[]) => {\n this.logger.info(`audioOutputsChanged ${typeof freshAudioOutputDeviceList}`)\n freshAudioOutputDeviceList?.forEach((mediaDeviceInfo) => {\n this.logger.info(`Device ID: ${mediaDeviceInfo.deviceId} Speaker: ${mediaDeviceInfo.label}`)\n })\n },\n\n // videoInputsChanged: (freshVideoInputDeviceList: any) => {\n // this.logger.info(`Video inputs updated: ${freshVideoInputDeviceList}`);\n // },\n\n audioInputMuteStateChanged: (device: string | MediaStream, muteState: boolean) => {\n this.logger.info(`Device ${device.toString()} ${muteState ? 'is muted in hardware' : 'is not muted'}`)\n },\n }\n\n // 流变化监听器\n this.audioVideoObserver = {\n audioVideoDidStart: () => {\n this.logger.info('Started')\n },\n audioVideoDidStop: (sessionStatus: any) => {\n // See the \"Stopping a session\" section for details.\n this.logger.info(`Stopped with a session status code: ${sessionStatus.statusCode()}`)\n },\n audioVideoDidStartConnecting: (reconnecting: any) => {\n if (reconnecting) {\n // e.g. the WiFi connection is dropped.\n this.logger.info('Attempting to reconnect')\n }\n },\n }\n\n // 混流检测\n this.audioMixObserver = {\n meetingAudioStreamBecameActive: (activeStream: MediaStream) => {\n // this.logger.info('meetingAudioStreamBecameActive ==>')\n // console.log(activeStream)\n if (this.$audio.paused) {\n // 播放远端流\n const _play = () =>\n this.$audio\n .play()\n .then(() => {})\n .catch((error) => {\n logger.error('播放远端流失败!', error)\n if (typeof this._autoPlayConfirm === 'function') {\n const onConfirm = () => _play()\n this._autoPlayConfirm({ onConfirm })\n }\n })\n _play()\n }\n },\n meetingAudioStreamBecameInactive: (inactiveStream: MediaStream) => {\n // this.logger.info('meetingAudioStreamBecameInactive ==>')\n // console.log(inactiveStream)\n },\n }\n }\n\n /**\n * 加入语音会议\n * @param options\n * @returns\n */\n async join(options: {\n voiceId: string\n userId: string\n roomId: string | number | undefined\n type: RTCType\n }): Promise<boolean> {\n return new Promise(async (success, fail) => {\n this.emit('joinWillStart')\n try {\n // 取签名\n const { sdkAppId, userId, roomId, userSig } = await this._getVoiceSign({\n ...options,\n roomId: options.roomId || 0,\n })\n this.userId = userId\n const { attendence, vendor_wrapper }: MeetingSessionConfigurationOptions = JSON.parse(\n decodeURIComponent(userSig),\n )\n\n // 初始化配置\n const configuration = new MeetingSessionConfiguration(\n {\n Meeting: vendor_wrapper,\n },\n {\n Attendee: {\n ExternalUserId: attendence.external_user_id,\n AttendeeId: attendence.attendee_id,\n JoinToken: attendence.join_token,\n },\n },\n )\n\n // 初始化会议会话\n this.meetingSession = new DefaultMeetingSession(configuration, this.logger, this.deviceController)\n\n // 注册事件\n this._registerRtcEvent()\n\n // 绑定监听器\n this.meetingSession.audioVideo.addDeviceChangeObserver(this.deviceChangeObserver)\n this.meetingSession.audioVideo.addObserver(this.audioVideoObserver)\n\n // 绑定播放器\n this.meetingSession.audioVideo.bindAudioElement(this.$audio)\n\n const observer: AudioVideoObserver = {\n audioVideoDidStart: () => {\n this.meetingSession?.audioVideo.realtimeMuteLocalAudio()\n this.joined = true\n this.emit('joined')\n success(true)\n },\n audioVideoDidStop: () => {\n this.joined = false\n success(false)\n },\n }\n\n this.meetingSession.audioVideo.addObserver(observer)\n\n if (this.audioMixObserver) {\n this.meetingSession.audioVideo.addAudioMixObserver(this.audioMixObserver)\n }\n\n this.meetingSession.audioVideo.setDeviceLabelTrigger(\n async () => await navigator.mediaDevices.getUserMedia({ audio: true, video: false }),\n )\n\n // 设置输入设备\n try {\n const audioInputDevices = await this.meetingSession.audioVideo.listAudioInputDevices()\n logger.info('audioInputDevices ===>', audioInputDevices)\n\n const audioInputDeviceId = audioInputDevices[0]?.deviceId || 'default'\n await this.meetingSession.audioVideo.startAudioInput(audioInputDeviceId)\n } catch (e) {\n logger.error(`设置语音输入设备失败:${(e as Error).message}`)\n }\n\n try {\n const audioOutputDevices = await this.meetingSession.audioVideo.listAudioOutputDevices()\n logger.info('audioOutputDevices ===>', audioOutputDevices)\n const audioOutputDeviceId = audioOutputDevices[0]?.deviceId || 'default'\n\n await this.meetingSession.audioVideo.chooseAudioOutput(audioOutputDeviceId)\n } catch (e) {\n logger.error(`设置语音输出设备失败:${(e as Error).message}`)\n }\n\n this.meetingSession.audioVideo.start()\n } catch (e: unknown) {\n this.emit('error', e as Error)\n this.logger.error((e as Error).message)\n success(false)\n }\n })\n }\n\n /**\n * 注册rtc事件\n */\n _registerRtcEvent = () => {\n const presentAttendeeId = this.meetingSession?.configuration?.credentials?.attendeeId || ''\n if (presentAttendeeId) {\n // 处理音量变化\n const roster = new Map<\n string,\n {\n userId: string\n volume: number | null\n muted: boolean | null\n signalStrength: number | null\n }\n >()\n\n const getUserVolumes = () => {\n const result: any = []\n roster.forEach((v, k) => {\n result.push({\n userId: v.userId,\n volume: v.muted || v.signalStrength === 0 || !Boolean(v.volume) ? 0 : v.volume,\n })\n })\n return result\n }\n\n this.meetingSession?.audioVideo.realtimeSubscribeToAttendeeIdPresence(\n (presentAttendeeId: any, present: any, externalUserId: any) => {\n if (!present) {\n roster.delete(presentAttendeeId)\n this.emit('userVolumes', getUserVolumes())\n return\n }\n\n this.meetingSession?.audioVideo.realtimeSubscribeToVolumeIndicator(\n presentAttendeeId,\n (attendeeId: any, volume: any, muted: any, signalStrength: any) => {\n const baseAttendeeId = new DefaultModality(attendeeId).base()\n if (baseAttendeeId !== attendeeId) {\n // Optional: Do not include the content attendee (attendee-id#content) in the roster.\n // See the \"Screen and content share\" section for details.\n return\n }\n\n roster.set(attendeeId, {\n userId: externalUserId || attendeeId,\n volume,\n muted,\n signalStrength,\n })\n this.emit('userVolumes', getUserVolumes())\n },\n )\n },\n )\n\n // 弱网\n this.meetingSession?.audioVideo.realtimeSubscribeToVolumeIndicator(\n presentAttendeeId,\n (attendeeId: any, volume: any, muted: any, signalStrength: any) => {\n const baseAttendeeId = new DefaultModality(attendeeId).base()\n if (baseAttendeeId === attendeeId) {\n if (signalStrength !== null && signalStrength !== 1) {\n this.emit('weakNetwork')\n }\n }\n },\n )\n\n // 报错\n\n this.meetingSession?.audioVideo.realtimeSubscribeToFatalError((error: any) => this.emit('error', error))\n }\n }\n\n quit(): Promise<boolean> {\n if (!this.joined) return Promise.resolve(true)\n return new Promise((success, fail) => {\n this.joined = false\n const observer: AudioVideoObserver = {\n audioVideoDidStop: async (sessionStatus: any) => {\n const sessionStatusCode = sessionStatus.statusCode()\n this.meetingSession?.deviceController.destroy()\n if (sessionStatusCode === MeetingSessionStatusCode.Left) {\n /*\n - You called meetingSession.audioVideo.stop().\n - When closing a browser window or page, Chime SDK attempts to leave the session.\n */\n this.logger.info('You left the session')\n success(true)\n } else {\n this.logger.info(`Stopped with a session status code: ${sessionStatusCode}`)\n success(true)\n }\n },\n }\n this.meetingSession?.audioVideo.addObserver(observer)\n this.meetingSession?.audioVideo.stop()\n })\n }\n\n async detectMicro(): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n const rule = { audio: true, video: false }\n try {\n navigator.mediaDevices\n .getUserMedia(rule)\n .then(() => resolve(true))\n .catch(() => resolve(false))\n } catch (e: unknown) {\n this.logger.error((e as Error).message)\n resolve(false)\n }\n })\n }\n\n async toggleMicro(flag?: boolean): Promise<boolean> {\n if (flag) {\n this.meetingSession?.audioVideo.realtimeUnmuteLocalAudio()\n } else {\n this.meetingSession?.audioVideo.realtimeMuteLocalAudio()\n }\n const muted = this.meetingSession?.audioVideo.realtimeIsLocalAudioMuted()\n if (muted !== undefined) {\n return flag !== muted\n } else {\n return false\n }\n }\n\n shock(): void {\n throw new Error('Method not implemented.')\n }\n}\n","/**\n * rtc加入返回值code枚举\n */\nexport enum RTCJoinedInfoCodeEnum {\n /**\n * 成功\n */\n Success = 0,\n /**\n * 失败\n */\n Failure = 1,\n /**\n * 重复加入\n */\n ReJoin = 2,\n /**\n * 无麦克风权限\n */\n NoMicroPermission = 3,\n}\n\n/**\n * 进入rtc房间的回调信息\n */\nexport interface RTCJoinedInfo {\n code: RTCJoinedInfoCodeEnum;\n message: string;\n userId?: string;\n roomId?: number;\n errInfo?: {\n errCode: number;\n errMsg: string;\n };\n}\n","import { UserVolume } from '../typings/live/UserVolume'\nimport { RTCJoinedInfo, RTCJoinedInfoCodeEnum } from '../typings/rtc/joinedInfo'\nimport { RTCType } from '../typings/rtc/type'\nimport { VRWebViewRTCOptions } from '../typings/rtc/VRWebViewRTCOptions'\nimport { CoreRTC } from './CoreRTC'\n\nexport class VRWebViewRTC extends CoreRTC {\n type: RTCType = RTCType.RealseeVRWebViewRTC\n joined = false\n micro = false\n voiceId: string = ''\n\n private options: VRWebViewRTCOptions\n\n get jsBridge() {\n return this.options.jsBridge\n }\n\n constructor({ jsBridge, getVoiceSign }: VRWebViewRTCOptions) {\n super()\n this.options = { jsBridge, getVoiceSign }\n\n // TO-DO: 在微信小程序下有个音量上报的BUG会导致消息体过大从而jsbridge异常断开\n if (this.jsBridge.webViewType !== 'WxMiniProgramWebView') {\n this.jsBridge.callAndListen('live/userVolumes', (userVolumes: UserVolume[]) => {\n this.emit('userVolumes', userVolumes)\n })\n }\n\n this.jsBridge.callAndListen('live/weakNetwork', (weakNetwork: boolean) => {\n if (weakNetwork) this.emit('weakNetwork')\n })\n }\n\n async join(options: { voiceId: string; userId: string; roomId: string; type: RTCType }) {\n try {\n this.emit('joinWillStart')\n const { sdkAppId, userId, userSig } = await this.options.getVoiceSign(options)\n\n if (!(Boolean(sdkAppId) && Boolean(userId) && Boolean(userSig))) {\n this.emit('error', new Error('加入房间失败:rtc 签名请求异常'))\n this.joined = false\n return this.joined\n }\n\n this.type = options.type\n const [res, error] = await this.jsBridge.callAndBackfeed<RTCJoinedInfo | true>(\n `live/join?sdkAppID=${sdkAppId}&userID=${userId}&roomID=${Number(options.voiceId)}&userSig=${userSig}`,\n )\n\n if (res === true) {\n this.emit('joined')\n this.joined = true\n } else {\n if (!res) {\n this.emit('error', error ? error : new Error('加入房间失败:未知异常。'))\n this.joined = false\n } else {\n if (res.code === RTCJoinedInfoCodeEnum.Success) {\n this.emit('joined')\n this.joined = true\n } else {\n this.emit('error', res)\n this.joined = false\n }\n }\n }\n return this.joined\n } catch (e) {\n this.emit('error', new Error('加入房间失败:' + (e as Error).message))\n this.joined = false\n return this.joined\n }\n }\n\n async quit() {\n const [res, error] = await this.jsBridge.callAndBackfeed<boolean>('live/quit')\n if (res === null) {\n this.emit('error', error ? error : new Error('退出房间失败:未知异常。'))\n }\n this.joined = false\n return !!res\n }\n\n async detectMicro() {\n const [res, error] = await this.jsBridge.detectMicro()\n if (res === null) {\n this.emit('error', error ? error : new Error('麦克风监测异常!'))\n return false\n }\n return res\n }\n\n async toggleMicro(flag?: boolean) {\n const [res, error] = await this.jsBridge.callAndBackfeed<boolean>(`live/toggleMicro?flag=${!!flag ? 1 : 0}`)\n if (res === null) {\n this.emit('error', error ? error : new Error('麦克风监测异常!'))\n return false\n }\n this.micro = res\n return res\n }\n\n shock() {\n this.jsBridge.shock(1)\n }\n}\n","/**\n * WebSocket 通信指令\n * - 下行:服务端推送数据\n * - 上行:客户端上报数据\n */\nexport enum Command {\n /* 当前用户信息:下行 */\n SelfUserInfo = \"SELF_USER_INFO\",\n /* 房间信息:下行 */\n RoomInfo = \"ROOM_INFO\",\n /* RTC信息:下行 */\n RTCInfo = \"RTC_INFO\",\n /* 用户列表:下行 */\n UserList = \"USER_LIST\",\n /* 内置消息:下行、上行 */\n BuiltinMsg = \"BUILTIN_MSG\",\n /* 自定义广播事件消息:下行、上行 */\n CustomEvent = \"CUSTOM_EVENT\",\n /* 帧数据同步:下行、上行 */\n KeyframeSync = \"KEYFRAME_SYNC\",\n /* 被踢出房间:下行 */\n UserKickOut = \"USER_KICK_OUT\",\n}\n\n/**\n * 向服务端请求数据时的数据格式。\n */\nexport type ReqLiveMsg = {\n /**\n * 请求指令。\n */\n command: Command;\n /**\n * 前端请求时生成的uuid()。\n */\n front_request_id: string;\n /**\n * 数据内容\n */\n data: {\n /**\n * 如果此数据仅发送给某些用户,请提供这些用户的ucid。\n */\n to_user_ids?: string[];\n [key: string]: any;\n };\n};\n\n/**\n * 内置事件类型。\n */\nexport enum BuiltinEventType {\n /**\n * 变更用户状态。\n */\n UserChange = \"user_change\",\n /**\n * 变更房间状态。\n */\n RoomChange = \"room_change\",\n}\n\n/**\n * 内置事件行为类型。\n */\nexport enum BuiltinActionType {\n /**\n * 修改麦克风状态。\n */\n UserMicroStatus = \"change_micro_status\",\n /**\n * 同步当前用户状态:客户端麦克风状态已经修改成功,通知服务端\n */\n UserMicroStatusSync = \"sync_micro_status\",\n /**\n * 调整某些用户的权限。\n */\n UserPermission = \"change_permission\",\n /**\n * 用户状态发生改变。\n */\n UserStatus = \"change_status\",\n /**\n * 更新用户信息。\n */\n UserInfo = \"change_info\",\n /**\n * 关闭房间。\n */\n RoomClose = \"close\",\n}\n\n/**\n * 内置事件数据结构体。\n */\nexport type BuiltinMsg = {\n event_type: BuiltinEventType;\n action: BuiltinActionType;\n to_user_ids: string[];\n data: {\n extension?: Record<string, any>;\n [key: string]: any;\n };\n};\n\n/**\n * 麦克风状态。\n */\nexport enum MicroStatus {\n OPEN = \"OPEN\",\n CLOSE = \"CLOSE\",\n}\n/**\n * 响应的信息结构体。\n */\nexport type LiveMsg = {\n code: string;\n message: string;\n command: Command;\n roomCode: string;\n appId: string;\n requestId: string;\n frontRequestId: string;\n triggerUserId: string;\n data: Record<string, any> | Record<string, any>[];\n};\n\n/**\n * 解析下后端数据格式。\n * @param jsonTxt - JSON序列化后的文本。\n * @returns false 标识解析失败;解析成功返回 {@link LiveMsg} 实例。\n */\nexport function parseLiveMsg(jsonTxt: string): LiveMsg | boolean {\n try {\n const msg = JSON.parse(jsonTxt);\n const resMsg: Record<string, any> = {\n code: msg.code,\n message: msg.message,\n command: msg.command,\n roomCode: msg.room_code,\n appID: msg.app_id,\n requestId: msg.request_id,\n frontRequestId: msg.front_request_id,\n triggerUserID: msg.trigger_user_id,\n data: msg.data || {},\n };\n\n const undefinedKeys = Object.keys(resMsg).filter(\n (key) => resMsg[key] === undefined\n );\n if (undefinedKeys.length > 0) {\n console.warn(`推送数据格式异常:${undefinedKeys.join(\" \")} 值不存在!`);\n }\n return resMsg as LiveMsg;\n } catch (error) {\n // notcare? 过滤掉所有不符合规范的数据\n return false;\n }\n}\n","export enum LiveState\n/**\n * 尚未初始化\n */ {\n NOTINITIALIZED = -1,\n\n /**\n * 正在链接中\n */\n CONNECTING = 0,\n\n /**\n * 已经链接并且可以通讯\n */\n OPEN = 1,\n\n /**\n * 连接已关闭或者链接失败\n */\n CLOSED = 3,\n}\n","/**\n * 用户当前状态枚举。\n */\nexport enum UserStatus {\n /**\n * 正常\n */\n Normal = 0,\n /**\n * 被移除\n */\n Removed = 1,\n /**\n * 被替换\n */\n Replaced = 2,\n}\n\nexport enum MemUserStatus {\n WAIT_ENTER = 'WAIT_ENTER',\n ONLINE = 'ONLINE',\n LEAVE = 'LEAVE',\n KICK_OUT = 'KICK_OUT',\n BE_REPLACE = 'BE_REPLACE',\n EXCEPTION = 'EXCEPTION',\n}\n\n/**\n * 用户信息扩展字段:比如提供用户画像相关的数据。\n */\nexport type UserInfoExt = {\n /**\n * 用户昵称。\n */\n nickname?: string;\n /**\n * 用户头像。\n */\n avatar?: string;\n /**\n * 其他用户相关的字段,比如用户职称、住址、联系方式等信息。\n */\n [key: string]: any;\n};\n\n/**\n * 带看会话房间用户的信息格式。\n */\nexport type UserInfo = {\n /**\n * 用户唯一标识ID。\n */\n id: string;\n /**\n * 用户当前的状态。\n */\n status?: UserStatus;\n /**\n * 内存中的用户状态。\n */\n mem_user_status?: MemUserStatus;\n /**\n * 用户当前是否开启麦克风。\n */\n micro_status: boolean;\n /**\n * 用户角色定义。(前端不关注此字段)。\n */\n user_role?: number | string;\n /**\n * 用户当前是否在线。\n */\n current_ws_online?: boolean;\n /**\n * 用户曾经是否在线过,即进入房间后又由于某种原因离开后重新进入。\n */\n once_ws_online?: boolean;\n /**\n * RTC 环境是否就绪,即当前语音是否联通。\n */\n rtc: boolean;\n /**\n * 当前用户的权限配置。(UI层面理解)。\n */\n permission?: Partial<Permission>;\n /**\n * 用户信息扩展字段。\n */\n extension?: UserInfoExt;\n};\n\nexport interface Permission {\n // 切换更多VR的权限\n more_vr_scene: boolean;\n // 邀请别人的权限\n invite_other: boolean;\n // 控制自己麦克风\n control_own_micro: boolean;\n // 控制别人的麦克风\n control_other_micro: boolean;\n // 查看自己麦克风状态\n view_own_micro_status: boolean;\n // 查看别人麦克风状态\n view_other_micro_status: boolean;\n // 关闭带看房间\n close_live_room: boolean;\n // 申请要电话\n apply_other_phone: boolean;\n // 动态进入\n dynamic_enter: boolean;\n // 同步帧数据\n sync_frame: boolean;\n // 改变角色\n transfer_role: boolean;\n // 改变别人的状态\n change_other_status: boolean;\n // 控制别人全量同步帧数据的权限\n control_other_sync: boolean;\n // 其它权限点\n extension: Record<string, boolean>;\n}\n","/**\n * WebSocket 连接状态枚举\n */\nexport enum WebSocketState {\n /**\n * 尚未初始化\n */\n NOTINITIALIZED = -1,\n\n /**\n * 正在链接中\n */\n CONNECTING = 0,\n\n /**\n * 已经链接并且可以通讯\n */\n OPEN = 1,\n\n /**\n * 连接正在关闭\n */\n CLOSING = 2,\n\n /**\n * 连接已关闭或者没有链接成功\n */\n CLOSED = 3,\n}\n\nexport type WebSocketError = {\n type: WebSocketErrorType;\n closeError?: WebSocketCloseError;\n target?: Event | CloseEvent;\n error?: any;\n};\n\nexport enum WebSocketErrorType {\n Error = 'Error',\n Close = 'Close',\n MicroAuth = 'MicroAuth',\n DuplicateConnect = 'DuplicateConnect',\n IllegalURL = 'IllegalURL',\n Unknown = 'Unknown',\n IllegalArgs = 'IllegalArgs',\n}\n\n/**\n * WebSocket 异常关闭枚举:https://developer.mozilla.org/zh-CN/docs/Web/API/CloseEvent。\n */\nexport enum WebSocketCloseError {\n /**\n * 正常关闭; 无论为何目的而创建,该链接都已成功完成任务。\n */\n Err_1000 = 'CLOSE_NORMAL',\n /**\n * 终端离开, 可能因为服务端错误, 也可能因为浏览器正从打开连接的页面跳转离开。\n */\n Err_1001 = 'CLOSE_GOING_AWAY',\n\n /**\n * 由于协议错误而中断连接。\n */\n Err_1002 = 'CLOSE_PROTOCOL_ERROR',\n\n /**\n * 由于接收到不允许的数据类型而断开连接 (如仅接收文本数据的终端接收到了二进制数据)。\n */\n Err_1003 = 'CLOSE_UNSUPPORTED',\n\n /**\n * 安全因素或WebSocket连接次数达到上限。\n */\n Err_1006 = 'CLOSE_ABNORMAL',\n\n /**\n * 由于收到了格式不符的数据而断开连接 (如文本消息中包含了非 UTF-8 数据)。\n */\n Err_1007 = 'Unsupported Data',\n /**\n * 由于收到不符合约定的数据而断开连接。\n */\n Err_1008 = 'Policy Violation',\n /**\n * 由于收到过大的数据帧而断开连接。\n */\n Err_1009 = 'CLOSE_TOO_LARGE',\n /**\n * 未知错误。\n */\n Err_unknown = 'unknown',\n}\n\nexport function parseWSClsErr(code: number) {\n switch (code) {\n case 1000: {\n return WebSocketCloseError.Err_1000;\n }\n case 1001: {\n return WebSocketCloseError.Err_1001;\n }\n case 1002: {\n return WebSocketCloseError.Err_1002;\n }\n case 1003: {\n return WebSocketCloseError.Err_1003;\n }\n case 1006: {\n return WebSocketCloseError.Err_1006;\n }\n case 1007: {\n return WebSocketCloseError.Err_1007;\n }\n case 1008: {\n return WebSocketCloseError.Err_1008;\n }\n case 1009: {\n return WebSocketCloseError.Err_1009;\n }\n default:\n break;\n }\n\n return WebSocketCloseError.Err_unknown;\n}\n","\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogLevel = void 0;\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\n LogLevel[LogLevel[\"INFO\"] = 1] = \"INFO\";\n LogLevel[LogLevel[\"WARN\"] = 2] = \"WARN\";\n LogLevel[LogLevel[\"ERROR\"] = 3] = \"ERROR\";\n LogLevel[LogLevel[\"OFF\"] = 4] = \"OFF\";\n})(LogLevel = exports.LogLevel || (exports.LogLevel = {}));\nexports.default = LogLevel;\n//# sourceMappingURL=LogLevel.js.map","export function appendUri(uri: string, query: Record<string, string | number> = {}) {\n const hasQuery = uri.indexOf('?') !== -1\n const newQuery = Object.keys(query).reduce(\n (accu, curr, idx) =>\n `${accu}${(idx === 0 && !hasQuery) ? '?' : '&'}${curr}=${query[curr]}`,\n '')\n\n return uri + newQuery\n}\n","const userAgent = globalThis.navigator.userAgent\n\nexport const isAndroid = /android/gi.test(userAgent)\n\nexport const isIOS = /iPhone|iPad\\s+OS/gi.test(userAgent)\n\nexport const isWxMiniProgram = /MicroMessenger/gi.test(userAgent) && /miniProgram/gi.test(userAgent)\n\nexport const isRealseeVRWebview = /realsee/gi.test(userAgent)\n","/**\n * 判断是否是真实的对象类型\n * @param value\n * @returns\n */\nfunction isTrulyObject(value: any): boolean {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * 判断基础类型是否相等\n * @param value\n * @param other\n * @returns\n */\nfunction baseIsEqual(value: any, other: any): boolean {\n if (value === other) return true;\n if (typeof value !== typeof other) return false;\n if (Number.isNaN(value) && Number.isNaN(other)) return true;\n return false;\n}\n\n/**\n * 对象浅比较\n * @param value\n * @param other\n * @returns\n */\nfunction objEqualShallow(value: any, other: any): boolean {\n const valueProps = Object.getOwnPropertyNames(value);\n const otherProps = Object.getOwnPropertyNames(other);\n if (valueProps.length !== otherProps.length) return false;\n\n for (let i = 0, len = valueProps.length; i < len; i++) {\n const propName = valueProps[i];\n if (!baseIsEqual(value[propName], other[propName])) return false;\n }\n\n return true;\n}\n\n/**\n * 数组浅比较\n * @param value\n * @param other\n * @returns\n */\nfunction arrayEqualShallow(value: any, other: any): boolean {\n if (value.length !== other.length) return false;\n for (let i = 0, len = value.length; i < len; i++) {\n if (!baseIsEqual(value[i], other[i])) return false;\n }\n return true;\n}\n\n/**\n * 变量浅比较\n * @param value\n * @param other\n * @returns\n */\nfunction isShallowEqual(value: any, other: any): boolean {\n if (baseIsEqual(value, other)) return true;\n if (isTrulyObject(value) && isTrulyObject(other))\n return objEqualShallow(value, other);\n if (Array.isArray(value) && Array.isArray(other))\n return arrayEqualShallow(value, other);\n return false;\n}\n\n/**\n * 对象深比较\n * @param value\n * @param other\n * @returns\n */\nfunction isDeepEqual(value: any, other: any): boolean {\n if (baseIsEqual(value, other)) return true;\n if (isTrulyObject(value) && isTrulyObject(other))\n return objEqualDeep(value, other);\n if (Array.isArray(value) && Array.isArray(other))\n return arrayEqualDeep(value, other);\n return false;\n}\n\n/**\n * 数组深比较\n * @param value\n * @param other\n * @returns\n */\nfunction arrayEqualDeep(value: any, other: any): boolean {\n if (value.length !== other.length) return false;\n for (let i = 0, len = value.length; i < len; i++) {\n if (!isDeepEqual(value[i], other[i])) return false;\n }\n return true;\n}\n\n/**\n * 对象深比较\n * @param value\n * @param other\n * @returns\n */\nfunction objEqualDeep(value: any, other: any): boolean {\n const valueProps = Object.getOwnPropertyNames(value);\n const otherProps = Object.getOwnPropertyNames(other);\n if (valueProps.length !== otherProps.length) return false;\n\n for (let i = 0, len = valueProps.length; i < len; i++) {\n const propName = valueProps[i];\n if (!isDeepEqual(value[propName], other[propName])) return false;\n }\n\n return true;\n}\n\n/**\n * 对象比较。\n * @param value 第一个比较的值。\n * @param other 第二个比较的值。\n * @param options 可选参数,可选项:`deep` 是否深比较。\n * @returns {boolean} 是否相等。\n */\nexport function equal(value: any, other: any, opt = { deep: false }): boolean {\n if (!opt.deep) return isShallowEqual(value, other);\n return isDeepEqual(value, other);\n}\n","import { WebSocketState } from '../typings'\nimport { Subscribe } from './subscribe'\n\n/**\n * 鲁棒ws的配置参数\n */\nexport type RobustWebSocketConstructorOptions = {\n url: string | ((ws: RobustWebSocket) => string)\n protocols?: string[]\n robustOptions?: RobustOptions\n}\n\n/**\n * ws 鲁棒性的配置\n */\nexport type RobustOptions = {\n // 等待超时时间\n timeout?: number\n // 是否进行重连的判断\n shouldReconnect?: (event: CloseEvent, ws: RobustWebSocket) => undefined | number\n // 是否1000的正常关闭code 也需要重连\n should1000Reconnect?: boolean\n // 是否监听 navigator 上的online/offline 事件\n ignoreConnectivityEvents?: boolean\n // 是否自动连接\n automaticOpen?: boolean\n}\n\nexport type RobustWebSocketEventDetail = {\n reconnects: number\n attempts: number\n}\n\nexport type RobustWebSocketEvent<T> = Event & {\n detail: T\n}\n\n// RobustWebSocket事件映射\nexport type RobustWebSocketEventMap = {\n connecting: (event: RobustWebSocketEvent<RobustWebSocketEventDetail>) => void\n timeout: (event: RobustWebSocketEvent<RobustWebSocketEventDetail>) => void\n open: (event: RobustWebSocketEvent<RobustWebSocketEventDetail>) => void\n closing: () => void\n close: (event: CloseEvent) => void\n error: (event: Event) => void\n message: (event: MessageEvent<string | ArrayBuffer | Blob | ArrayBufferView>) => void\n}\n\n/**\n * 具有鲁棒性的WebSocket封装\n * 1、自动重连\n * 2、可根据网络情况进行重连\n */\nexport class RobustWebSocket extends Subscribe<RobustWebSocketEventMap> {\n private _realWebSocket: WebSocket | undefined\n private _url?: string | ((ws: RobustWebSocket) => string)\n private _protocols: string[] | undefined\n private _readyState: WebSocketState = WebSocketState.NOTINITIALIZED\n private _options: RobustOptions = {\n timeout: 10000,\n shouldReconnect: (event, ws) => {\n if (event.code === 1008 || event.code === 1011) return\n return [1000, 3000, 6000][ws.attempts % 3]\n },\n should1000Reconnect: false,\n ignoreConnectivityEvents: false,\n automaticOpen: false,\n }\n private _connectTimeout: any | undefined\n private _attempts = 0\n private _reconnects = -1\n private _reconnectWhenOnlineAgain = false\n private _explicitlyClosed = false\n private _pendingReconnect: number | undefined\n private _connectivityEventsAttached = false\n private _heathCheckTimer: number | undefined\n\n public get attempts(): number {\n return this._attempts\n }\n\n constructor(options?: RobustWebSocketConstructorOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n super()\n if (options) {\n this.setOptions(options)\n }\n this._startHealthCheck()\n }\n\n public setOptions(options: RobustWebSocketConstructorOptions): void {\n if (!options) return\n this._url = options.url\n this._protocols = options.protocols\n const opts = Object.assign(this._options, options.robustOptions || {})\n if (typeof opts?.timeout !== 'number') {\n throw new Error('timeout must be the number of milliseconds to timeout a connection attempt')\n }\n\n if (typeof opts?.shouldReconnect !== 'function') {\n throw new Error(\n 'shouldReconnect must be a function that returns the number of milliseconds to wait for a reconnect attempt, or null or undefined to not reconnect.',\n )\n }\n this._options = opts\n if (this._options.automaticOpen) {\n this._createWebSocket()\n }\n }\n\n /**\n * 做一个健康检查\n */\n private _healthCheck = async () => {\n if (this._realWebSocket && this._realWebSocket.readyState !== this._readyState) {\n this._readyState = this._realWebSocket.readyState as WebSocketState\n // 太惨了,断网的时候,ws不会直接closed,而是处于closing的状态\n if (this._readyState === WebSocketState.CLOSING) {\n this.emit('closing')\n }\n }\n await new Promise((resolve) => setTimeout(resolve, 2000))\n this._heathCheckTimer = requestAnimationFrame(this._healthCheck)\n }\n\n /**\n * 清理超时计时器\n */\n private _clearConnectTimeoutIfNeed = () => {\n if (this._connectTimeout) {\n clearTimeout(this._connectTimeout)\n this._connectTimeout = undefined\n }\n }\n\n /**\n * 清理健康检查\n */\n private _clearHeathCheckIfNeed = () => {\n if (this._heathCheckTimer) {\n cancelAnimationFrame(this._heathCheckTimer)\n this._heathCheckTimer = undefined\n }\n }\n\n /**\n * 开启健康检查\n */\n private _startHealthCheck = () => {\n this._clearHeathCheckIfNeed()\n this._heathCheckTimer = requestAnimationFrame(this._healthCheck)\n }\n\n /**\n * 停止健康检查\n */\n private _stopHealthCheck = () => {\n this._clearHeathCheckIfNeed()\n }\n\n /**\n * 清理连接中的请求\n */\n private _clearPendingReconnectIfNeeded = () => {\n if (this._pendingReconnect) {\n clearTimeout(this._pendingReconnect)\n this._pendingReconnect = undefined\n }\n }\n\n /**\n * 当网页连接上网络进行重连\n * @param event\n */\n private _online = (event: Event) => {\n if (this._reconnectWhenOnlineAgain) {\n this._clearPendingReconnectIfNeeded()\n this._reconnect(event as CloseEvent)\n }\n }\n\n /**\n * 当网页断开网络进行关闭\n */\n private _offline = () => {\n this._reconnectWhenOnlineAgain = true\n this._realWebSocket?.close(1000, 'offline')\n }\n\n /**\n * 解除网络监听事件\n */\n private _detachConnectivityEvents = () => {\n if (this._connectivityEventsAttached) {\n globalThis?.removeEventListener('online', this._online)\n globalThis?.removeEventListener('offline', this._offline)\n this._connectivityEventsAttached = false\n }\n }\n\n /**\n * 注册网络监听事件\n */\n private _attachConnectivityEvents = () => {\n if (!this._connectivityEventsAttached) {\n globalThis?.addEventListener('online', this._online)\n globalThis?.addEventListener('offline', this._offline)\n this._connectivityEventsAttached = true\n }\n }\n\n /**\n * 发送消息\n * @param data\n * @returns\n */\n send = (data: string | ArrayBuffer | Blob | ArrayBufferView): void | undefined => {\n if (this._realWebSocket?.readyState === this._realWebSocket?.OPEN) {\n this._realWebSocket?.send(data)\n }\n }\n\n /**\n * 关闭连接\n * @param code 代码\n * @param reason 原因\n * @returns\n */\n close = (code?: number | string, reason?: string): void | undefined => {\n if (typeof code !== 'number') {\n reason = code\n code = 1000\n }\n this._clearPendingReconnectIfNeeded()\n this._reconnectWhenOnlineAgain = false\n this._explicitlyClosed = true\n this._detachConnectivityEvents()\n\n return this._realWebSocket?.close(code, reason)\n }\n\n /**\n * 进行ws连接\n */\n open = (url?: string): void => {\n if (url) {\n this._url = url\n }\n if (\n this._realWebSocket?.readyState !== WebSocket.OPEN &&\n this._realWebSocket?.readyState !== WebSocket.CONNECTING\n ) {\n this._clearPendingReconnectIfNeeded()\n this._reconnectWhenOnlineAgain = false\n this._explicitlyClosed = false\n\n this._createWebSocket()\n }\n }\n\n /**\n * 创建ws连接\n */\n private _createWebSocket = () => {\n const newUrl = typeof this._url === 'string' ? this._url : this._url?.(this)\n if (!newUrl) return\n this._clearConnectTimeoutIfNeed()\n this._clearPendingReconnectIfNeeded()\n this._removeWebSocketEvent()\n this._realWebSocket = new WebSocket(newUrl, this._protocols || undefined)\n\n this._attempts = this._attempts + 1\n this.emit(\n 'connecting',\n new CustomEvent('connecting', {\n detail: { attempts: this._attempts, reconnects: this._reconnects },\n }),\n )\n\n const timeoutCallback = () => {\n this._connectTimeout = undefined\n this._detachConnectivityEvents()\n this.emit(\n 'timeout',\n new CustomEvent('timeout', {\n detail: {\n attempts: this._attempts,\n reconnects: this._reconnects,\n },\n }),\n )\n }\n\n this._connectTimeout = setTimeout(timeoutCallback, this._options?.timeout)\n\n this._dispatchWebSocketEvent()\n\n if (!this._options?.ignoreConnectivityEvents) {\n this._attachConnectivityEvents()\n }\n }\n\n /**\n * 断开ws事件\n */\n private _removeWebSocketEvent = () => {\n this._realWebSocket?.removeEventListener('open', this._webSocketOpenHandler)\n this._realWebSocket?.removeEventListener('close', this._webSocketCloseHandler)\n this._realWebSocket?.removeEventListener('error', this._webSocketErrorHandler)\n this._realWebSocket?.removeEventListener('message', this._webSocketMessageHandler)\n }\n\n /**\n * 分发ws事件\n */\n private _dispatchWebSocketEvent = () => {\n this._realWebSocket?.addEventListener('open', this._webSocketOpenHandler)\n this._realWebSocket?.addEventListener('close', this._webSocketCloseHandler)\n this._realWebSocket?.addEventListener('error', this._webSocketErrorHandler)\n this._realWebSocket?.addEventListener('message', this._webSocketMessageHandler)\n }\n\n /**\n * ws连接事件\n * @returns\n */\n private _webSocketOpenHandler = (event: Event) => {\n if (this._connectTimeout) {\n clearTimeout(this._connectTimeout)\n this._connectTimeout = undefined\n }\n const reconnects = ++this._reconnects\n const attempts = this._attempts\n this._attempts = 0\n this._reconnectWhenOnlineAgain = false\n this._startHealthCheck()\n return this.emit('open', Object.assign(event, { detail: { reconnects, attempts } }))\n }\n\n /**\n * ws 关闭事件\n * @param event\n * @returns\n */\n private _webSocketCloseHandler = (event: CloseEvent) => {\n this._reconnect(event)\n this._stopHealthCheck()\n return this.emit('close', event)\n }\n\n /**\n * ws 异常\n * @param event\n * @returns\n */\n private _webSocketErrorHandler = (event: Event) => {\n return this.emit('error', new CustomEvent('error', { detail: { error: event } }))\n }\n\n /**\n * ws消息\n * @param event\n * @returns\n */\n private _webSocketMessageHandler = (event: MessageEvent) => {\n return this.emit('message', event)\n }\n\n /**\n * 进行重连\n * @param event\n * @returns\n */\n private _reconnect(event: CloseEvent) {\n if ((!this._options?.should1000Reconnect && event.code === 1000) || this._explicitlyClosed) {\n this._attempts = 0\n return\n }\n\n if (this._connectivityEventsAttached) {\n if (globalThis?.navigator?.onLine === false) {\n this._reconnectWhenOnlineAgain = true\n return\n }\n }\n\n const delay = this._options?.shouldReconnect?.(event, this)\n if (typeof delay === 'number') {\n // @ts-ignore\n this._pendingReconnect = setTimeout(this._createWebSocket, delay)\n }\n }\n}\n","import { LiveMsg, parseWSClsErr } from '../typings';\nimport { LiveState } from '../typings/live/LiveState';\nimport logger from '../utils/logger';\nimport {\n RobustWebSocket,\n RobustWebSocketEventDetail,\n RobustWebSocketEvent,\n} from '../utils/RobustWebSocket';\nimport { Subscribe } from '../utils/subscribe';\n\nexport type LiveControllerEventMap = {\n stateChange: (state: LiveState, prevState: LiveState) => void;\n message: (message: LiveMsg) => void;\n reconnected: (detail: RobustWebSocketEventDetail) => void;\n};\n\nexport class LiveController extends Subscribe<LiveControllerEventMap> {\n /**\n * ws代理器\n */\n private _ws: RobustWebSocket = new RobustWebSocket({\n url: '',\n robustOptions: { should1000Reconnect: true, ignoreConnectivityEvents: true },\n });\n\n /**\n * 带看连接状态\n */\n private _state = LiveState.NOTINITIALIZED;\n\n set state(state: LiveState) {\n const prevState = JSON.parse(JSON.stringify(this._state));\n this._state = state;\n this.emit('stateChange', this.state, prevState);\n }\n\n get state() {\n return this._state;\n }\n\n constructor() {\n super();\n this._addWebSocketEventListeners();\n }\n\n /**\n * 添加事件监听\n */\n private _addWebSocketEventListeners = () => {\n this._ws.on('close', this._handleCloseEvent);\n this._ws.on('closing', this._handleClosingEvent);\n this._ws.on('connecting', this._handleConnectingEvent);\n this._ws.on('error', this._handleErrorEvent);\n this._ws.on('message', this._handleMessageEvent);\n this._ws.on('open', this._handleOpenEvent);\n this._ws.on('timeout', this._handleTimeoutEvent);\n };\n\n /**\n * 移除事件监听\n */\n private _removeWebSocketEventListeners = () => {\n this._ws.off('close', this._handleCloseEvent);\n this._ws.off('closing', this._handleClosingEvent);\n this._ws.off('connecting', this._handleConnectingEvent);\n this._ws.off('error', this._handleErrorEvent);\n this._ws.off('message', this._handleMessageEvent);\n this._ws.off('open', this._handleOpenEvent);\n this._ws.off('timeout', this._handleTimeoutEvent);\n };\n\n /**\n * 处理房间关闭事件\n * @param event\n */\n private _handleCloseEvent = (event: CloseEvent) => {\n logger.info(\n `live room closed bacause of ${event.code}-${\n event.reason || parseWSClsErr(event.code)\n }`,\n );\n this.state = LiveState.CLOSED;\n };\n\n /**\n * 处理房间正在关闭事件(这个时候可能是断网了)\n */\n private _handleClosingEvent = () => {\n logger.info(`live room is closing, onLine:`, globalThis?.navigator?.onLine);\n this.state = LiveState.CLOSED;\n };\n\n /**\n * 连接中\n * @param event\n */\n private _handleConnectingEvent = () => {\n logger.info(`live room is connecting`);\n this.state = LiveState.CONNECTING;\n };\n\n /**\n * 连接发送异常\n * @param event\n */\n private _handleErrorEvent = (event: Event) => {\n logger.error(`live room error`, event);\n this.state = LiveState.CLOSED;\n };\n\n /**\n * 接收到消息\n * @param event\n */\n private _handleMessageEvent = (event: MessageEvent) => {\n // logger.info('live room received message ', event.data);\n let message = (() => {\n try {\n return JSON.parse(event.data);\n } catch (e) {\n return event.data;\n }\n })() as LiveMsg;\n this.emit('message', message);\n };\n\n /**\n * 连接建立成功\n * @param event\n */\n private _handleOpenEvent = (\n event: RobustWebSocketEvent<RobustWebSocketEventDetail>,\n ) => {\n logger.info('live room open', event.detail);\n this.state = LiveState.OPEN;\n if (event.detail.reconnects > 0) {\n this.emit('reconnected', event.detail);\n }\n };\n\n /**\n * 处理超时\n * @param event\n */\n private _handleTimeoutEvent = (\n event: RobustWebSocketEvent<RobustWebSocketEventDetail>,\n ) => {\n logger.error('live room connect timeout!', event.detail);\n this.state = LiveState.CLOSED;\n };\n\n /**\n * 释放资源,释放之后需要重新实例化\n * @returns\n */\n dispose = async () => {\n this._removeWebSocketEventListeners();\n return await this.close('live room close by controller disposed!');\n };\n\n /**\n * 开启房间链接\n * @param url 房间链接\n * @returns\n */\n open = (url: string) => this._ws.open(url);\n\n /**\n * 关闭房间\n * @param code\n * @param reason\n */\n close = (code?: string | number | undefined, reason?: string | undefined) =>\n new Promise<boolean>((resolve) => {\n this._ws.once('close', () => resolve(true));\n this._ws.close(code, reason);\n });\n\n /**\n * 发送数据\n * @param data\n */\n sendMessage(data: any = '') {\n if (data === undefined || data === null || data === '') {\n throw new Error('live message is empty!');\n }\n if (this.state === LiveState.OPEN) {\n return this._ws.send(JSON.stringify(data));\n } else {\n throw new Error('live has not yet been initialized!');\n }\n }\n}\n","import JSBridge, { JSBridgeProtocol } from '@realsee/jsbridge-x';\nimport LogLevel from 'amazon-chime-sdk-js/build/logger/LogLevel';\nimport {\n BrowserRTC,\n BrowserRTC4Chime,\n RTCProtocol,\n VRWebViewRTC,\n} from '../rtc';\nimport {\n BuiltInRTCType,\n Command,\n EventType,\n GetVoiceSign,\n KeyframeTypes,\n LiveOptions,\n RoomInfo,\n RTCType,\n UserInfo,\n ReqLiveMsg,\n BuiltinEventType,\n BuiltinActionType,\n MicroStatus,\n LiveMsg,\n BuiltinMsg,\n LiveConnectOptions,\n} from '../typings';\nimport { LiveState } from '../typings/live/LiveState';\nimport { appendUri } from '../utils/appendUri';\nimport {\n isRealseeVRWebview,\n isAndroid,\n isIOS,\n isWxMiniProgram,\n} from '../utils/clientDetector';\nimport { equal } from '../utils/equal';\nimport logger from '../utils/logger';\nimport { Subscribe } from '../utils/subscribe';\nimport { uuid } from '../utils/uuid';\nimport { LiveController } from './controller';\n\nconst unimplementedGetVoiceSign: GetVoiceSign = (params) =>\n Promise.reject('unimplemented method GetVoiceSign');\n\nexport type LiveBuiltInData<KeyframesSnapshot> = {\n selfInfo?: UserInfo;\n userList?: UserInfo[];\n roomInfo?: RoomInfo;\n rtcInfo?: { voiceId: string; type: RTCType };\n keyframes: Partial<KeyframesSnapshot>;\n};\n\nconst createLiveMsg = (\n command: Command,\n data: Record<string, any> = {},\n toUserIds: string | string[] = [],\n): ReqLiveMsg => ({\n command,\n front_request_id: uuid(),\n data: {\n ...data,\n to_user_ids: Array.isArray(toUserIds) ? toUserIds : [toUserIds],\n },\n});\n\nexport const _clearLiveInstanceIfNeed = () => {\n if ((window as any)?.__Realsee_Live__) {\n (window as any)?.__Realsee_Live__?.dispose?.();\n (window as any).__Realsee_Live__ = null;\n }\n};\n\nexport class Live<\n KeyframesSnapshot extends Record<string, any>,\n> extends Subscribe<EventType<KeyframesSnapshot>> {\n /**\n * 带看的配置\n */\n private _options: LiveOptions = {};\n\n get options(): LiveOptions {\n return Object.freeze(this._options || {});\n }\n\n /**\n * 带看状态\n */\n get state() {\n return this._controller.state;\n }\n\n /**\n * 兼容老逻辑\n * @deprecated 请直接读取 state 属性字段,未来将移除该属性\n */\n get readyState() {\n return this._controller.state;\n }\n\n /**\n * 获取当前WebSocket连接的URL。(注意:这个是WebSocket连接的完整连接,附带一些query参数)。\n * @deprecated 带看不需要关注底层ws的相关信息,未来将移除\n */\n get url(): string | undefined {\n return this.options.url;\n }\n\n /**\n * 获取当前live使用的RTC实例\n */\n get $RTC(): RTCProtocol {\n return this._options.rtc!;\n }\n\n /**\n * 获取当前live使用的jsBridge实例\n */\n get jsBridge(): JSBridgeProtocol {\n return this._options.jsBridge!;\n }\n\n /**\n * 帧数据监听\n */\n keyframes: Subscribe<KeyframeTypes<KeyframesSnapshot>> = new Subscribe();\n\n /**\n * 内置的一些数据\n */\n private _buildInData: LiveBuiltInData<KeyframesSnapshot> = {\n keyframes: {},\n };\n\n /**\n * 当前帧数据快照\n */\n get snapshot(): Partial<KeyframesSnapshot> {\n return this._buildInData.keyframes;\n }\n\n /**\n * 根据键值取帧数据\n * @param key 帧数据的键值\n * @returns\n */\n getFramesByKey = <Key extends keyof KeyframesSnapshot>(\n key: Key,\n ): Partial<KeyframesSnapshot>[Key] | undefined => this.snapshot[key];\n\n /**\n * 发送帧数据(需要能够被序列化)\n * @param key 帧数据键值\n * @param frame 帧数据本体\n * @returns\n */\n sendKeyframe = <Key extends keyof KeyframesSnapshot>(\n key: Key,\n frame: KeyframesSnapshot[Key],\n ): boolean | Error => {\n if (this.state !== LiveState.OPEN) return false;\n this._buildInData.keyframes = {\n ...this._buildInData.keyframes,\n [key]: frame,\n };\n const liveMsg = createLiveMsg(Command.KeyframeSync, this.snapshot);\n try {\n this._controller.sendMessage(liveMsg);\n return true;\n } catch (e) {\n logger.error(e);\n return false;\n }\n };\n\n /**\n * 当前用户信息\n */\n get selfInfo() {\n return this._buildInData.selfInfo;\n }\n\n /**\n * 当前用户列表\n */\n get userList() {\n return this._buildInData.userList || [];\n }\n\n /**\n * 当前带看房间信息\n */\n get roomInfo() {\n return this._buildInData.roomInfo;\n }\n\n /**\n * 带看控制器\n */\n private _controller: LiveController = new LiveController();\n\n constructor(opts: LiveOptions) {\n super();\n this._addLiveControllerEventListeners();\n this._options = Object.assign(\n { initialMicroStatus: MicroStatus.OPEN },\n opts,\n );\n // 第一步检查jsbridge\n this._options.jsBridge = (() => {\n if (opts.jsBridge) return opts.jsBridge;\n if (opts.useBuiltInJsBridge) return new JSBridge();\n return undefined;\n })();\n\n // 第二步检查getVoiceSign\n this._options.getVoiceSign = opts.getVoiceSign ?? unimplementedGetVoiceSign;\n this._options.autoPlayConfirm = opts.autoPlayConfirm;\n\n // 第二步检查rtc\n this._options.rtc = (() => {\n // 优先取rtc实例\n if (opts.rtc) return opts.rtc;\n // 取指定的内部rtc类型\n if (opts.rtcType) {\n if (!opts.getVoiceSign) {\n logger.error(\n 'GetVoiceSign method must be passed when using built-in RTC instances',\n );\n }\n switch (opts.rtcType) {\n case RTCType.RealseeVRWebViewRTC: {\n // 内置的 VRWebViewRTC\n if (this._options.jsBridge) {\n return new VRWebViewRTC({\n jsBridge: this._options.jsBridge,\n getVoiceSign: this._options.getVoiceSign,\n });\n } else {\n logger.error(\n 'JsBridge instance must be passed when using built-in VRWebViewRTC instances',\n );\n return undefined;\n }\n }\n case RTCType.RealseeBrowserChimeRTC: {\n // 内置的 RealseeBrowserChimeRTC\n return new BrowserRTC4Chime({\n getVoiceSign: this._options.getVoiceSign,\n logLevel: opts.__debug__ ? LogLevel.DEBUG : LogLevel.INFO,\n });\n }\n case RTCType.RealseeBrowserRTC: {\n // 内置的 RealseeBrowserRTC\n if (!this._options.autoPlayConfirm) {\n logger.error(\n 'autoPlayConfirm method must be passed when using built-in RealseeBrowserRTC instances',\n );\n }\n return new BrowserRTC({\n getVoiceSign: this._options.getVoiceSign,\n autoPlayConfirm: this._options.autoPlayConfirm,\n });\n }\n default: {\n logger.error('unknown built-in RTC type');\n return undefined;\n }\n }\n }\n // 都不满足时取内置\n if (opts.useBuiltInRTC) {\n if (!opts.getVoiceSign) {\n logger.error(\n 'GetVoiceSign method must be passed when using built-in RTC instances',\n );\n }\n if (this._options.jsBridge) {\n if ((isRealseeVRWebview && (isAndroid || isIOS)) || isWxMiniProgram) {\n return new VRWebViewRTC({\n jsBridge: this._options.jsBridge,\n getVoiceSign: this._options.getVoiceSign,\n });\n } else {\n // 其它终端使用\n return opts.builtInRTCType === BuiltInRTCType.RealseeXChimeRTC\n ? new BrowserRTC4Chime({\n getVoiceSign: this._options.getVoiceSign,\n })\n : new BrowserRTC({\n getVoiceSign: this._options.getVoiceSign,\n autoPlayConfirm: this._options.autoPlayConfirm,\n });\n }\n } else {\n logger.error(\n 'jsBridge instance must be passed when using built-in RTC instances',\n );\n return undefined;\n }\n }\n return undefined;\n })();\n\n if (!this._options.rtc) {\n logger.warn('unused rtc');\n }\n\n // 第三步进行自动连接\n if (this._options.url && this._options.getTicket) {\n this.connect();\n }\n\n if (this._options.__debug__) {\n Object.assign(window, { $liveController: this._controller, $live: this });\n }\n }\n\n /**\n * 添加带看控制的事件监听\n */\n private _addLiveControllerEventListeners = () => {\n this._controller.on('stateChange', this._handleStateChange);\n this._controller.on('message', this._handleMessage);\n };\n\n /**\n * 移除带看控制的事件监听\n */\n private _removeLiveControllerEventListeners = () => {\n this._controller.off('stateChange', this._handleStateChange);\n this._controller.off('message', this._handleMessage);\n };\n\n /**\n * 带看状态变化\n * @param state\n * @returns\n */\n private _handleStateChange = (state: LiveState, prevState: LiveState) =>\n this.emit('stateChange', state, prevState);\n\n /**\n * 消息接收\n * @param liveMsg\n */\n private _handleMessage = async (liveMsg: LiveMsg) => {\n if (typeof liveMsg === 'object') {\n const { command, data = {}, frontRequestId, code, message } = liveMsg;\n if (code === 'SUCCESS') {\n switch (command) {\n /**\n * 自己的状态变化\n */\n case Command.SelfUserInfo: {\n const selfInfo = data as UserInfo;\n if (!equal(this.selfInfo, selfInfo, { deep: true })) {\n this._buildInData.selfInfo = selfInfo;\n this.emit(\n 'selfInfoUpdate',\n this._buildInData.selfInfo,\n frontRequestId,\n );\n }\n break;\n }\n\n /**\n * 房间信息变化\n */\n case Command.RoomInfo: {\n const roomInfo = data as RoomInfo;\n this._buildInData.roomInfo = Object.assign({}, roomInfo);\n this.emit(\n 'readyKeyframeSync',\n (roomInfo.last_frame || {}) as Partial<KeyframesSnapshot>,\n );\n break;\n }\n\n /**\n * 语音信息变化\n */\n case Command.RTCInfo: {\n const { voice_id: voiceId, type } = data as {\n voice_id: string;\n type: RTCType;\n };\n this._buildInData.rtcInfo = { voiceId, type };\n if (!this.$RTC?.joined) {\n const result = await this.$RTC?.join({\n voiceId,\n userId: this.selfInfo?.id || '',\n roomId: this.roomInfo?.info.room_code,\n type,\n });\n if (result) {\n const status =\n this._options.initialMicroStatus ?? MicroStatus.OPEN;\n await this.toggleMicro(status === MicroStatus.OPEN);\n } else {\n logger.error('加入语音房间失败');\n }\n } else {\n logger.warn('已加入语音房间,无需重复加入!');\n }\n break;\n }\n\n /**\n * 房间用户列表变化\n */\n case Command.UserList: {\n const userList = data as UserInfo[];\n this._buildInData.userList = userList;\n this.emit('userListUpdate', this.userList, frontRequestId);\n break;\n }\n\n /**\n * 自定义事件广播\n */\n case Command.CustomEvent: {\n const evtMsg = data as Record<string, any>;\n this.emit('broadcast', evtMsg, frontRequestId);\n break;\n }\n\n /**\n * 帧数据同步\n */\n case Command.KeyframeSync: {\n const remoteKeyframes = data as Partial<KeyframesSnapshot>;\n // 此处做一层 diff,仅跟本地数据不一致的情况下才广播数据。\n const keyframes: Partial<KeyframesSnapshot> = Object.keys(\n remoteKeyframes,\n ).reduce(\n (\n accu: Partial<KeyframesSnapshot>,\n curr: keyof KeyframesSnapshot,\n ) => {\n if (\n equal(\n remoteKeyframes[curr],\n this._buildInData.keyframes[curr],\n {\n deep: true,\n },\n )\n ) {\n return accu;\n }\n const params = [\n remoteKeyframes[curr],\n this._buildInData.keyframes[curr],\n frontRequestId,\n ];\n const evtName =\n curr as unknown as keyof KeyframeTypes<KeyframesSnapshot>;\n this.keyframes.emit(\n evtName,\n ...(params as Parameters<\n KeyframeTypes<KeyframesSnapshot>[keyof KeyframeTypes<KeyframesSnapshot>]\n >),\n );\n this._buildInData.keyframes[curr] = remoteKeyframes[curr];\n accu[curr] = remoteKeyframes[curr];\n return accu;\n },\n {} as Partial<KeyframesSnapshot>,\n );\n\n this.emit('keyframes', keyframes, frontRequestId);\n break;\n }\n\n /**\n * 内置消息\n */\n case Command.BuiltinMsg: {\n const builtinMsg = data as BuiltinMsg;\n this.emit('builtinEvent', builtinMsg);\n\n if (builtinMsg.event_type === BuiltinEventType.UserChange) {\n this.emit('userChange', builtinMsg);\n }\n\n if (builtinMsg.event_type === BuiltinEventType.RoomChange) {\n this.emit('roomChange', builtinMsg);\n }\n /**\n * 下发指令自己操作麦克风\n */\n if (\n builtinMsg.event_type === BuiltinEventType.UserChange &&\n builtinMsg.action === BuiltinActionType.UserMicroStatus\n ) {\n await this.toggleMicro(\n builtinMsg.data.status === MicroStatus.OPEN,\n );\n }\n\n /**\n * 如果下发指令退出房间,则 关闭麦克风 及 销毁 WebSocket\n */\n if (\n builtinMsg.event_type === BuiltinEventType.RoomChange &&\n builtinMsg.action === BuiltinActionType.RoomClose\n ) {\n await this.exit();\n }\n break;\n }\n /**\n * 被踢出房间\n */\n case Command.UserKickOut: {\n this.emit('kickOut');\n break;\n }\n /**\n * 其它未知广播\n */\n default: {\n console.warn('unknown command: ', command);\n }\n }\n } else {\n this.emit('error', liveMsg);\n }\n }\n };\n\n /**\n * 清理带看缓存的数据\n */\n private _clearLiveData = () => {\n this._buildInData = { keyframes: {} };\n };\n\n /**\n * 连接带看\n * @param options\n * @returns\n */\n connect = async (options: LiveConnectOptions = {}) => {\n // 检查 url 和 票据获取接口实现\n this._options.url = options.url ?? this._options.url ?? '';\n this._options.getTicket = options.getTicket ?? this._options.getTicket;\n this._options.initialMicroStatus =\n options.rtcMicStatus ?? this._options.initialMicroStatus;\n\n if (\n !/^ws(s):\\/\\//.test(this._options.url!) ||\n typeof this._options.getTicket !== 'function'\n ) {\n if (!/^ws(s):\\/\\//.test(this._options.url!)) {\n return new Error('Illegal realsee live room link');\n }\n if (typeof this._options.getTicket !== 'function') {\n return new Error('getTicket muse be function');\n }\n return false;\n }\n\n const { force = false } = options;\n\n // 检测一下麦克风权限,hack\n if (this._options.rtc) {\n const res = await this._options.rtc.detectMicro();\n if (!res) {\n return new Error('Failed to obtain microphone authorization');\n }\n }\n\n // 检查是否已有实例在使用\n const currentState = this.state;\n if (\n currentState === LiveState.CONNECTING ||\n currentState === LiveState.OPEN\n ) {\n if (force) {\n try {\n await this._controller.close('force close by connect');\n } catch (e) {\n console.warn(e);\n }\n } else {\n return new Error('已有Live实例正在连接中,请勿重复连接!');\n }\n }\n\n // 建立连接\n this._clearLiveData();\n const url = appendUri(this._options.url!, {\n ticket: await this._options.getTicket(),\n force: Number(!!force),\n });\n this._controller.open(url);\n return true;\n };\n\n /**\n * 退出带看\n * @returns\n */\n exit = async () => {\n this._clearLiveData();\n if (this.state !== LiveState.OPEN) return true;\n try {\n /** 退出强制关闭语音 */\n await this.$RTC?.quit();\n } catch (e) {\n logger.warn(e);\n }\n return await this._controller.close();\n };\n\n /**\n * 关闭带看房间\n * @param code\n * @param reason\n * @returns\n */\n close = async () => {\n return await this.updateStatus(\n BuiltinEventType.RoomChange,\n BuiltinActionType.RoomClose,\n {},\n );\n };\n\n /**\n * 销毁带看\n * @returns\n */\n dispose = async () => {\n this._removeLiveControllerEventListeners();\n this._clearLiveData();\n return await this._controller.dispose();\n };\n\n /**\n * 修改状态\n * @param evtType\n * @param atnType\n * @param status\n * @param toUserIds\n * @returns\n */\n async updateStatus(\n evtType: BuiltinEventType,\n atnType: BuiltinActionType,\n status: Record<string, any>,\n toUserIds?: string | string[],\n ) {\n if (this.state !== LiveState.OPEN) return false;\n const data = Object.assign(\n { event_type: evtType, action: atnType },\n { data: status },\n );\n const liveMsg = createLiveMsg(Command.BuiltinMsg, data, toUserIds);\n try {\n this._controller.sendMessage(liveMsg);\n return true;\n } catch (e) {\n logger.error(e);\n return false;\n }\n }\n\n /**\n * 设置自己的用户信息\n * @param userInfo\n * @returns\n */\n setSelfInfo = async (userInfo: Partial<UserInfo>) =>\n await this.updateStatus(\n BuiltinEventType.UserChange,\n BuiltinActionType.UserInfo,\n userInfo,\n );\n\n /**\n * 自定义广播\n * @param request 广播请求的数据\n * @param toUserIds\n * @param timeout\n * @returns\n */\n broadcast<Request extends Record<string, any>, Response>(\n request: Request,\n toUserIds: string | string[],\n timeout: number,\n ): Promise<Response> | Error | false {\n if (this.state !== LiveState.OPEN) return false;\n return new Promise((resolve, reject) => {\n const customEvent = createLiveMsg(\n Command.CustomEvent,\n request,\n toUserIds,\n );\n const front_request_id = customEvent.front_request_id;\n\n const timeoutId = timeout\n ? setTimeout(() => {\n reject(new Error('RESPONSE TIMEOUT'));\n this.off('broadcast', broadcastRes);\n }, timeout)\n : undefined;\n\n const broadcastRes = (\n data: Record<string, any>,\n frontRequestId: string,\n ) => {\n if (frontRequestId !== front_request_id) return;\n if (timeoutId) clearTimeout(timeoutId);\n this.off('broadcast', broadcastRes);\n resolve(data as Response);\n };\n\n this.on('broadcast', broadcastRes);\n\n try {\n this._controller.sendMessage(customEvent);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n // 仅用于用户自己的麦克风控制\n toggleMicro = async (microStatus: boolean) => {\n if (!this.selfInfo?.permission?.control_own_micro) return false;\n\n const result = await this.$RTC?.toggleMicro(microStatus);\n if (result) {\n await this.updateStatus(\n BuiltinEventType.UserChange,\n BuiltinActionType.UserMicroStatus,\n {\n status: microStatus ? MicroStatus.OPEN : MicroStatus.CLOSE,\n },\n [],\n );\n }\n\n return result;\n };\n\n /**\n * 控制别人的麦\n * @param microStatus\n * @param toUserIds\n * @returns\n */\n forbidMicro = async (\n microStatus: MicroStatus,\n toUserIds: string | string[],\n ) => {\n if (\n typeof this._options.canForbidUserMicro === 'function' &&\n !this._options.canForbidUserMicro(toUserIds)\n ) {\n return false;\n }\n\n if (!this.selfInfo?.permission?.control_other_micro) {\n return false;\n }\n\n return await this.updateStatus(\n BuiltinEventType.UserChange,\n BuiltinActionType.UserMicroStatus,\n {\n status: microStatus,\n },\n toUserIds,\n );\n };\n\n /**\n * 控制别人的同步全量帧数据权限\n * @param sync\n * @param toUserIds\n * @returns\n */\n forbidSync = async (sync: boolean, toUserIds: string | string[]) => {\n if (\n typeof this._options.canForbidUserSync === 'function' &&\n !this._options.canForbidUserSync(toUserIds)\n ) {\n return false;\n }\n\n if (!this.selfInfo?.permission?.control_other_sync) {\n return false;\n }\n\n return await this.updateStatus(\n BuiltinEventType.UserChange,\n BuiltinActionType.UserPermission,\n { sync_frame: sync },\n toUserIds,\n );\n };\n\n /**\n * 把用户踢出带看\n * @param toUserIds\n * @returns\n */\n kick = async (toUserIds: string | string[]) => {\n if (\n typeof this._options.canForbidUserKick === 'function' &&\n !this._options.canForbidUserKick(toUserIds)\n ) {\n return false;\n }\n\n if (!this.selfInfo?.permission?.change_other_status) {\n return false;\n }\n\n return await this.updateStatus(\n BuiltinEventType.UserChange,\n BuiltinActionType.UserStatus,\n {\n status: 'KICK_OUT',\n },\n toUserIds,\n );\n };\n}\n","// import { Live } from '../typings/live/Live';\nimport { LiveOptions } from '../typings/live/LiveOptions';\nimport { Live, _clearLiveInstanceIfNeed } from './live';\n\n/**\n * 创建`Live`实例\n * @param opts\n * @returns\n */\nexport const createLive = <KeyframesSnapshot extends Record<string, any>>(\n opts: LiveOptions,\n): Live<KeyframesSnapshot> => {\n _clearLiveInstanceIfNeed();\n return new Live<KeyframesSnapshot>(opts);\n};\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React, { useCallback } from 'react';\nimport { createContext } from 'react';\nimport {\n BuiltinActionType,\n BuiltinEventType,\n KeyframeTypes,\n LiveConnectOptions,\n LiveEventType,\n LiveOptions,\n MicroStatus,\n RTCEventType,\n RTCType,\n UserInfo,\n} from '../typings';\nimport { LiveState } from '../typings/live/LiveState';\nimport { createLive } from './createLive';\nimport { Live } from './live';\n\nexport type LiveProviderPropTypes<\n KeyframesSnapshot extends Record<string, any>,\n> = {\n children?: React.ReactNode;\n live?: Live<KeyframesSnapshot>;\n};\n\n/**\n * 创建 {@link LiveReact} 实例,并提供 `React` 技术栈相关工具链。\n */\nexport function createLiveReact<KeyframesSnapshot extends Record<string, any>>(\n options: LiveOptions,\n) {\n const LiveContext = createContext<Live<KeyframesSnapshot> | null>(null);\n const live = createLive<KeyframesSnapshot>(options);\n const jsBridge = live.jsBridge;\n\n const LiveProvider = (props: LiveProviderPropTypes<KeyframesSnapshot>) => (\n <LiveContext.Provider value={live}>{props.children}</LiveContext.Provider>\n );\n\n /**\n * 使用live实例\n * @returns\n */\n const useLiveInstance = () => {\n const context = React.useContext(LiveContext);\n if (!context) throw new Error('LiveProvider never found.');\n return context;\n };\n\n /**\n * 不建议这样使用\n * @deprecated\n * @returns\n */\n const unsafe__useLiveInstance = () => live;\n\n /**\n * 使用rtc实例\n */\n const useRTCInstance = () => live.$RTC;\n\n /**\n * 不建议这样使用\n * @deprecated\n * @returns\n */\n const unsafe__useRTCInstance = () => useRTCInstance();\n\n /**\n * 带看连接操作\n */\n const useConnect = () => async (options: LiveConnectOptions) =>\n await live.connect(options);\n\n /**\n *\n * @param name\n * @param callback\n * @param deps\n * @returns\n */\n function useKeyframeUpdateCallback<\n KeyOfKeyframe extends keyof KeyframeTypes<KeyframesSnapshot>,\n >(\n key: KeyOfKeyframe,\n callback: (\n ...args: Parameters<KeyframeTypes<KeyframesSnapshot>[KeyOfKeyframe]>\n ) => ReturnType<KeyframeTypes<KeyframesSnapshot>[KeyOfKeyframe]>,\n deps: React.DependencyList = [],\n ) {\n const live = useLiveInstance();\n const dependencyList: React.DependencyList = [live, name, ...deps];\n const dispose = () => live.keyframes.off(key, callback);\n React.useEffect(() => {\n live.keyframes.on(key, callback);\n return dispose;\n }, dependencyList);\n\n return dispose;\n }\n\n /**\n * 带看的一些操作\n * @returns\n */\n function useLiveAction() {\n const live = useLiveInstance();\n\n const connect = async (options: LiveConnectOptions) =>\n await live.connect(options);\n\n const toggleMicro = (microStatus: boolean) => live.toggleMicro(microStatus);\n\n const broadcast = async (\n data: Record<string, any>,\n toUserIds: string | string[],\n timeout = 0,\n ) => await live.broadcast(data, toUserIds, timeout);\n\n const exit = async () => await live.exit();\n\n const kick = async (toUserIds: string | string[]) =>\n await live.kick(toUserIds);\n\n const forbidMicro = async (\n micro: MicroStatus,\n toUserIds: string | string[] = [],\n ) => await live.forbidMicro(micro, toUserIds);\n\n const forbidSync = (sync: boolean, toUserIds: string | string[] = []) =>\n live.forbidSync(sync, toUserIds);\n\n const getFramesByKey = (key: keyof KeyframesSnapshot) =>\n live.getFramesByKey(key);\n\n const sendKeyframe = (\n key: keyof KeyframesSnapshot,\n frame: KeyframesSnapshot[keyof KeyframesSnapshot],\n ) => live.sendKeyframe(key, frame);\n\n const setSelfInfo = (userInfo: Partial<UserInfo>) =>\n live.setSelfInfo(userInfo);\n\n const updateStatus = (\n evtType: BuiltinEventType,\n atnType: BuiltinActionType,\n status: Record<string, any>,\n toUserIds?: string | string[],\n ) => live.updateStatus(evtType, atnType, status, toUserIds);\n\n return {\n connect,\n broadcast,\n exit,\n kick,\n toggleMicro,\n forbidMicro,\n forbidSync,\n sendKeyframe,\n getFramesByKey,\n setSelfInfo,\n updateStatus,\n };\n }\n\n function useKeyframe<K extends keyof KeyframesSnapshot>(key: K) {\n const live = useLiveInstance();\n const [state, updateState] = React.useState<\n KeyframesSnapshot[K] | undefined\n >(live.getFramesByKey(key));\n\n React.useEffect(() => {\n const onUpdate = (nextKeyframes: KeyframesSnapshot[K]) =>\n updateState(nextKeyframes);\n\n const evtName = key as unknown as keyof KeyframeTypes<KeyframesSnapshot>;\n const callback = onUpdate as unknown as (\n ...args: Parameters<\n KeyframeTypes<KeyframesSnapshot>[keyof KeyframeTypes<KeyframesSnapshot>]\n >\n ) => ReturnType<\n KeyframeTypes<KeyframesSnapshot>[keyof KeyframeTypes<KeyframesSnapshot>]\n >;\n live.keyframes.on(evtName, callback);\n return () => live.keyframes.off(evtName, callback);\n }, [live]);\n\n const setState = React.useCallback(\n (frame: KeyframesSnapshot[K]) => live.sendKeyframe(key, frame),\n [live],\n );\n type CallbackType = [\n frame: KeyframesSnapshot[K] | undefined,\n setFrame: (frame: KeyframesSnapshot[K]) => boolean | Error,\n ];\n return [state, setState] as CallbackType;\n }\n\n function useLiveEventCallback<\n K extends keyof LiveEventType<KeyframesSnapshot>,\n >(\n name: K,\n callback: (\n ...args: Parameters<LiveEventType<KeyframesSnapshot>[K]>\n ) => ReturnType<LiveEventType<KeyframesSnapshot>[K]>,\n deps: React.DependencyList = [],\n ) {\n const live = useLiveInstance();\n const dispose = () => live.off(name, callback);\n const dependencyList: React.DependencyList = [live, name, ...deps];\n\n React.useEffect(() => {\n live.on(name, callback);\n return dispose;\n }, dependencyList);\n\n return dispose;\n }\n\n /**\n * 带看状态\n * @returns\n */\n function useLiveState() {\n const live = useLiveInstance();\n const [state, updateState] = React.useState<LiveState>(live.state);\n React.useEffect(() => {\n const stateChange = (state: LiveState) => updateState(state);\n live.on('stateChange', stateChange);\n return () => live.off('stateChange', stateChange);\n }, [live]);\n\n return state;\n }\n\n function useRTCAction() {\n const live = useLiveInstance();\n\n const join = (options: {\n voiceId: string;\n userId: string;\n roomId: string;\n type: RTCType;\n }) => live.$RTC.join(options);\n\n const quit = () => live.$RTC.quit();\n const shock = () => live.$RTC.shock?.();\n const toggleMicro = (flag?: boolean | undefined) =>\n live.$RTC.toggleMicro(flag);\n\n const detectMicro = () => live.$RTC.detectMicro();\n\n return {\n join,\n quit,\n shock,\n toggleMicro,\n detectMicro,\n };\n }\n\n function useRTCEventCallback<K extends keyof RTCEventType>(\n name: K,\n callback: (\n ...args: Parameters<RTCEventType[K]>\n ) => ReturnType<RTCEventType[K]>,\n deps: React.DependencyList = [],\n ) {\n const live = useLiveInstance();\n const dispose = () => live.$RTC.off(name, callback);\n const dependencyList: React.DependencyList = [live, name, ...deps];\n React.useEffect(() => {\n live.$RTC.on(name, callback);\n return dispose;\n }, dependencyList);\n\n return dispose;\n }\n\n function useSelfInfo() {\n const live = useLiveInstance();\n const [state, updateState] = React.useState<Partial<UserInfo>>(\n live.selfInfo || {},\n );\n\n const selfInfoUpdate = (userInfo: Partial<UserInfo>) =>\n updateState(userInfo);\n\n React.useEffect(() => {\n live.on('selfInfoUpdate', selfInfoUpdate);\n return () => live.off('selfInfoUpdate', selfInfoUpdate);\n }, [live]);\n\n const setState = React.useCallback(\n async (userInfo: Partial<UserInfo>) => {\n return await live.setSelfInfo(userInfo);\n },\n [live],\n );\n\n type CallbackType = [\n Partial<UserInfo>,\n (userInfo: Partial<UserInfo>) => Promise<boolean | Error>,\n ];\n return [state, setState] as CallbackType;\n }\n\n function useKeyframesSnapshot() {\n const live = useLiveInstance();\n const [state, setState] = React.useState<Partial<KeyframesSnapshot>>(\n live.snapshot,\n );\n\n React.useEffect(() => {\n const onKeyframes = (keyframes: Partial<KeyframesSnapshot>) =>\n setState(keyframes);\n live.on('keyframes', onKeyframes);\n return () => live.off('keyframes', onKeyframes);\n });\n\n return state;\n }\n function useUserList() {\n const live = useLiveInstance();\n const [state, updateState] = React.useState<UserInfo[]>(live.userList);\n\n const userListUpdate = (userList: UserInfo[]) => updateState(userList);\n\n React.useEffect(() => {\n live.on('userListUpdate', userListUpdate);\n return () => live.off('userListUpdate', userListUpdate);\n }, [live]);\n\n return state;\n }\n\n return {\n live,\n jsBridge,\n LiveProvider,\n unsafe__useLiveInstance,\n unsafe__useRTCInstance,\n useConnect,\n useKeyframe,\n useKeyframeUpdateCallback,\n useLiveAction,\n useLiveEventCallback,\n useLiveState,\n useRTCAction,\n useRTCEventCallback,\n useSelfInfo,\n useKeyframesSnapshot,\n useUserList,\n };\n}\n"],"names":["EVENT_SYMBOL","__generateEventIfNotExisted","instance","__removeEventIfNotExisted","Subscribe","name","events","callback","once","index","data","canceled","event","one","result","CoreRTC","RTCType","BuiltInRTCType","getTime","date","year","month","day","hour","min","sec","ms","echo","logLevel","args","log","info","error","warn","logger","logger$1","S4","uuid","BrowserRTC","options","__publicField","TRTC","createClientOptions","_a","resolve","remoteStream","domId","dom","onConfirm","_b","rule","e","flag","_d","_c","userId","audioVolume","BrowserRTC4Chime","freshAudioInputDeviceList","mediaDeviceInfo","freshAudioOutputDeviceList","device","muteState","sessionStatus","reconnecting","activeStream","_play","inactiveStream","presentAttendeeId","roster","getUserVolumes","v","k","present","externalUserId","attendeeId","volume","muted","signalStrength","DefaultModality","_e","_f","ConsoleLogger","LogLevel","DefaultDeviceController","success","fail","sdkAppId","roomId","userSig","attendence","vendor_wrapper","configuration","MeetingSessionConfiguration","DefaultMeetingSession","observer","audioInputDevices","audioInputDeviceId","audioOutputDevices","audioOutputDeviceId","sessionStatusCode","MeetingSessionStatusCode","RTCJoinedInfoCodeEnum","VRWebViewRTC","jsBridge","getVoiceSign","userVolumes","weakNetwork","res","Command","BuiltinEventType","BuiltinActionType","MicroStatus","parseLiveMsg","jsonTxt","msg","resMsg","undefinedKeys","key","LiveState","UserStatus","MemUserStatus","WebSocketState","WebSocketErrorType","WebSocketCloseError","parseWSClsErr","code","exports","appendUri","uri","query","hasQuery","newQuery","accu","curr","idx","userAgent","isAndroid","isIOS","isWxMiniProgram","isRealseeVRWebview","isTrulyObject","value","baseIsEqual","other","objEqualShallow","valueProps","otherProps","i","len","propName","arrayEqualShallow","isShallowEqual","isDeepEqual","objEqualDeep","arrayEqualDeep","equal","opt","RobustWebSocket","ws","reason","url","newUrl","timeoutCallback","reconnects","attempts","opts","delay","LiveController","message","state","prevState","unimplementedGetVoiceSign","params","createLiveMsg","command","toUserIds","_clearLiveInstanceIfNeed","Live","frame","liveMsg","frontRequestId","selfInfo","roomInfo","voiceId","type","status","userList","evtMsg","remoteKeyframes","keyframes","evtName","builtinMsg","force","currentState","userInfo","microStatus","sync","JSBridge","evtType","atnType","request","timeout","reject","customEvent","front_request_id","timeoutId","broadcastRes","createLive","f","require$$0","l","m","p","q","c","a","g","b","d","h","reactJsxRuntime_production_min","React","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","maybeIterator","ReactSharedInternals","format","_len2","_key2","printWarning","level","ReactDebugCurrentFrame","stack","argsWithFormat","item","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","isValidElementType","getWrappedName","outerType","innerType","wrapperName","displayName","functionName","getContextName","getComponentNameFromType","context","provider","outerName","lazyComponent","payload","init","x","assign","disabledDepth","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","disabledLog","disableLogs","props","reenableLogs","ReactCurrentDispatcher","prefix","describeBuiltInComponentFrame","source","ownerFn","match","reentry","componentFrameCache","PossiblyWeakMap","describeNativeComponentFrame","fn","construct","control","previousPrepareStackTrace","previousDispatcher","Fake","sample","sampleLines","controlLines","s","_frame","syntheticFrame","describeFunctionComponentFrame","shouldConstruct","Component","prototype","describeUnknownElementTypeFrameInDEV","hasOwnProperty","loggedTypeFailures","setCurrentlyValidatingElement","element","owner","checkPropTypes","typeSpecs","values","location","componentName","has","typeSpecName","error$1","err","ex","isArrayImpl","isArray","typeName","hasToStringTag","willCoercionThrow","testStringCoercion","checkKeyStringCoercion","ReactCurrentOwner","RESERVED_PROPS","specialPropKeyWarningShown","specialPropRefWarningShown","didWarnAboutStringRefs","hasValidRef","config","getter","hasValidKey","warnIfStringRefCannotBeAutoConverted","self","defineKeyPropWarningGetter","warnAboutAccessingKey","defineRefPropWarningGetter","warnAboutAccessingRef","ReactElement","ref","jsxDEV","maybeKey","defaultProps","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","propTypesMisspellWarningShown","isValidElement","object","getDeclarationErrorAddendum","getSourceInfoErrorAddendum","fileName","lineNumber","ownerHasKeyUseWarning","getCurrentComponentErrorInfo","parentType","parentName","validateExplicitKey","currentComponentErrorInfo","childOwner","validateChildKeys","node","child","iteratorFn","iterator","step","validatePropTypes","propTypes","_name","validateFragmentProps","fragment","keys","jsxWithValidation","isStaticChildren","validType","sourceInfo","typeString","children","jsxWithValidationStatic","jsxWithValidationDynamic","jsx","jsxs","reactJsxRuntime_development","module","require$$1","createLiveReact","LiveContext","createContext","live","LiveProvider","useLiveInstance","unsafe__useLiveInstance","useRTCInstance","unsafe__useRTCInstance","useConnect","useKeyframeUpdateCallback","deps","dependencyList","dispose","useLiveAction","micro","useKeyframe","updateState","onUpdate","nextKeyframes","setState","useLiveEventCallback","useLiveState","stateChange","useRTCAction","useRTCEventCallback","useSelfInfo","selfInfoUpdate","useKeyframesSnapshot","onKeyframes","useUserList","userListUpdate"],"mappings":"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","x_google_ignoreList":[13,21,22,23]}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/utils/subscribe.ts","../src/rtc/CoreRTC.ts","../src/typings/rtc/type.ts","../src/utils/logger.ts","../src/utils/uuid.ts","../src/rtc/BrowserRTC.ts","../src/rtc/BrowserRTC4Chime.ts","../src/typings/rtc/joinedInfo.ts","../src/rtc/VRWebViewRTC.ts","../src/typings/live/LiveMsg.ts","../src/typings/live/LiveState.ts","../src/typings/live/UserInfo.ts","../src/typings/live/WebSocket.ts","../node_modules/amazon-chime-sdk-js/build/logger/LogLevel.js","../src/utils/appendUri.ts","../src/utils/clientDetector.ts","../src/utils/equal.ts","../src/utils/RobustWebSocket.ts","../src/live/controller.ts","../src/live/live.ts","../src/live/createLive.ts","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/live/createLiveReact.tsx"],"sourcesContent":["const EVENT_SYMBOL: unique symbol = Symbol('$$REALSEE_LIVE_EVENT$$');\n\nexport type EventMap = {\n [name: string]: (...args: any[]) => void | boolean;\n};\n\nfunction __generateEventIfNotExisted<T extends EventMap>(\n instance: any,\n): {\n [Key in keyof T]: [\n callback: (...args: Parameters<T[Key]>) => ReturnType<T[Key]>,\n once: boolean,\n ][];\n} {\n if (!instance[EVENT_SYMBOL]) {\n instance[EVENT_SYMBOL] = {};\n }\n return instance[EVENT_SYMBOL];\n}\n\nfunction __removeEventIfNotExisted(instance: any) {\n if (!instance[EVENT_SYMBOL]) {\n delete instance[EVENT_SYMBOL];\n }\n}\n\n/**\n * 监听者模式\n * @template T 预设的监听回调类型\n * @example\n * ```\n * new Subscribe<{\n * \"foo\": [arg1: number, arg2: string],\n * \"bar\": [arg: boolean],\n * }>()\n * ```\n */\nexport class Subscribe<T extends EventMap> {\n /**\n * 判断是否注册了事件\n * @param name 事件类型\n */\n hasListener(name: keyof T): boolean {\n const events = __generateEventIfNotExisted<T>(this);\n return events && events[name] && events[name].length > 0;\n }\n\n /**\n * 注册事件\n * @param name 事件类型\n * @param callback 事件回调函数\n * @param once 是否只执行一次\n * @returns 解除事件\n * @template K 预设的监听事件名称\n * @template C 回调函数函数上下文\n */\n on<K extends keyof T>(\n name: K,\n callback: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n once?: boolean,\n ): () => void {\n const events = __generateEventIfNotExisted<T>(this);\n if (!events[name]) events[name] = [];\n events[name].push([callback as any, once || false]);\n return () => this.off(name, callback);\n }\n\n /**\n * 注册事件(是否只执行一次)\n * @param name 事件类型\n * @param callback 事件回调函数\n * @returns 解除事件\n * @template K 预设的监听事件名称\n * @template C 回调函数函数上下文\n */\n once<K extends keyof T>(\n name: K,\n callback: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n ): () => void {\n return this.on(name, callback, true);\n }\n\n /**\n * 解除事件\n *\n * 如果 name 不传的话解除对应所有事件\n * 如果 name, callback 不传的话解除所有name的所有事件\n * @param name 事件类型\n * @param callback 事件回调函数\n * @template K 预设的监听事件名称\n */\n off<K extends keyof T>(\n name?: K,\n callback?: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n ): void {\n if (name === undefined) {\n __removeEventIfNotExisted(this);\n return;\n }\n const events = __generateEventIfNotExisted<T>(this);\n if (!events[name]) events[name] = [];\n if (callback === undefined) {\n events[name].length = 0;\n return;\n }\n let index = 0;\n for (; index < events[name].length; index++) {\n if (events[name][index][0] === callback) break;\n }\n if (index < events[name].length) {\n events[name].splice(index, 1);\n }\n }\n\n /**\n * 触发事件\n * @param name 事件类型\n * @param data 触发事件的数据\n * @returns canceled 是否被触发取消\n * @template K 预设的监听事件名称\n */\n emit<K extends keyof T>(name: K, ...data: Parameters<T[K]>): boolean {\n let canceled = false;\n const events = __generateEventIfNotExisted<T>(this);\n const event = events[name] || [];\n for (let one of event.slice()) {\n const [callback, once = false] = one;\n const result = callback(...data);\n if (once) this.off(name, callback);\n if (result === false) canceled = true;\n }\n return canceled;\n }\n}\n\nexport namespace SubscribeMixinType {\n export interface hasListener<T extends EventMap> {\n (name: keyof T): boolean;\n }\n export interface on<T extends EventMap> {\n <K extends keyof T>(\n name: K,\n callback: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n once?: boolean,\n ): () => void;\n }\n export interface once<T extends EventMap> {\n <K extends keyof T>(\n name: K,\n callback: (...args: Parameters<T[K]>) => ReturnType<T[K]>,\n ): () => void;\n }\n export interface off<T extends EventMap> {\n <K extends keyof T>(\n names?: K | K[],\n callback?: (...args: any[]) => any,\n ): void;\n }\n export interface emit<T extends EventMap> {\n <K extends keyof T>(name: K, ...data: Parameters<T[K]>): boolean;\n }\n}\n","import { RTCEventType } from '../typings/rtc/eventType';\nimport { RTCProtocol } from '../typings/rtc/protocol';\nimport { RTCType } from '../typings/rtc/type';\nimport { Subscribe } from '../utils/subscribe';\n\n/**\n * rtc 基础抽象类\n */\nexport abstract class CoreRTC\n extends Subscribe<RTCEventType>\n implements RTCProtocol\n{\n abstract joined: boolean;\n\n abstract micro: boolean;\n\n abstract voiceId: string;\n\n abstract type: RTCType;\n\n abstract join(options: {\n voiceId: string;\n userId: string;\n roomId: string | number | undefined;\n type: RTCType;\n }): Promise<boolean>;\n\n abstract quit(): Promise<boolean>;\n\n abstract detectMicro(): Promise<boolean>;\n\n abstract toggleMicro(flag?: boolean): Promise<boolean>;\n\n abstract shock(): void;\n}\n","/**\n * rtc 类型\n */\nexport enum RTCType {\n RealseeBrowserRTC = 'RealseeBrowserRTC',\n RealseeVRWebViewRTC = 'RealseeVRWebViewRTC',\n RealseeBrowserChimeRTC = 'RealseeBrowserChimeRTC',\n}\n\nexport enum BuiltInRTCType {\n RealseeXTRTC = 'trtc',\n RealseeXChimeRTC = 'chime',\n}\n","/**\n * 输出格式化日志\n */\n\n// 获取当前时间\nconst getTime = (): string => {\n const date = new Date();\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0'); //月份是从0开始的\n const day = date.getDate().toString().padStart(2, '0');\n const hour = date.getHours().toString().padStart(2, '0');\n const min = date.getMinutes().toString().padStart(2, '0');\n const sec = date.getSeconds().toString().padStart(2, '0');\n const ms = date.getMilliseconds();\n\n return `[${year}-${month}-${day} ${hour}:${min}:${sec}.${ms}]`;\n};\n\nexport enum LOG_LEVEL {\n info = 'INFO',\n log = 'LOG',\n error = 'ERROR',\n warn = 'WARN',\n}\n\n// 输出日志\nconst echo = (logLevel: Partial<LOG_LEVEL>, args: any[] = []) => {\n args.unshift(`Realsee Live ${getTime()} <${logLevel}> `);\n switch (logLevel) {\n case LOG_LEVEL.info:\n return console.info(...args);\n case LOG_LEVEL.error:\n return console.error(...args);\n case LOG_LEVEL.warn:\n return console.warn(...args);\n default:\n return console.log(...args);\n }\n};\n\nconst log = (...args: any[]) => echo(LOG_LEVEL.log, args);\n\nconst info = (...args: any[]) => echo(LOG_LEVEL.info, args);\n\nconst error = (...args: any[]) => echo(LOG_LEVEL.error, args);\n\nconst warn = (...args: any[]) => echo(LOG_LEVEL.warn, args);\n\nconst logger = {\n log,\n info,\n error,\n warn,\n};\n\nexport default logger;\n","// uuid\nfunction S4() {\n return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\n}\n\n/**\n * 基于伪随机数生成 **uuid**。\n */\nexport function uuid() {\n // then to call it, plus stitch in '4' in the third group\n return (\n S4() +\n S4() +\n '-' +\n S4() +\n '-4' +\n S4().substr(0, 3) +\n '-' +\n S4() +\n '-' +\n S4() +\n S4() +\n S4()\n ).toLowerCase();\n}\n","import TRTC, { Client, LocalStream } from 'trtc-js-sdk';\nimport { GetVoiceSign } from '../typings/live/GetVoiceSign';\nimport { RTCType } from '../typings/rtc/type';\nimport logger from '../utils/logger';\n\nimport { uuid } from '../utils/uuid';\nimport { CoreRTC } from './CoreRTC';\n\nexport interface ITrtcInstance {\n client: Client | null;\n stream: LocalStream | null;\n}\n\nexport class BrowserRTC extends CoreRTC {\n type = RTCType.RealseeBrowserRTC;\n joined = false;\n micro = false;\n voiceId = '';\n\n private _getVoiceSign: GetVoiceSign = () => {\n throw new Error('方法 getVoiceSign 未实现');\n };\n\n private _autoPlayConfirm: (opts: {\n onConfirm: () => void;\n }) => void | undefined;\n\n public checkRequirement = () => TRTC.checkSystemRequirements();\n\n private $dom: HTMLDivElement = document.createElement('div');\n\n private _trtc: ITrtcInstance = {\n client: null,\n stream: null,\n };\n\n constructor(options: {\n getVoiceSign: GetVoiceSign;\n autoPlayConfirm?: (opts: { onConfirm: () => void }) => void;\n }) {\n super();\n this._getVoiceSign = options.getVoiceSign;\n // @ts-ignore\n this._autoPlayConfirm = options.autoPlayConfirm;\n this._initParentDom();\n }\n\n private _initParentDom() {\n this.$dom.id = `rs-rtc-${uuid()}`;\n this.$dom.style.display = 'none';\n document.body.appendChild(this.$dom);\n }\n\n join = async (options: {\n voiceId: string;\n userId: string;\n roomId: string;\n type: RTCType;\n }): Promise<boolean> => {\n this.emit('joinWillStart');\n const createClientOptions = await this._getVoiceSign({\n voiceId: options.voiceId,\n roomId: options.roomId,\n userId: options.userId,\n });\n // 1. 创建client\n this._trtc.client = TRTC.createClient({\n mode: 'rtc',\n ...createClientOptions,\n enableAutoPlayDialog:\n typeof this._autoPlayConfirm === 'function' ? false : true,\n });\n\n this._trtc.client?.enableAudioVolumeEvaluation();\n\n // 2. 订阅事件\n this._registerRtcEvent();\n\n // 3. 加入语音房间\n let result = await new Promise<boolean>((resolve) => {\n this._trtc.client\n ?.join({ roomId: Number(options.voiceId) })\n .then(() => resolve(true))\n .catch(() => resolve(false));\n });\n\n this.joined = result;\n\n if (!result) return false; // 进房失败\n\n // 4. 创建本地流\n this._trtc.stream = TRTC.createStream({\n userId: createClientOptions.userId,\n audio: true,\n video: false,\n });\n\n // 5. 初始化本地流\n result = await new Promise<boolean>((resolve) => {\n this._trtc.stream\n ?.initialize()\n .then(() => resolve(true))\n .catch(() => resolve(false));\n });\n\n // 6. 发布本地流\n result = await new Promise<boolean>((resolve) => {\n this._trtc.client\n ?.publish(this._trtc.stream!)\n .then(() => resolve(true))\n .catch(() => resolve(false));\n });\n\n this.joined = result;\n\n if (this.joined) this.emit('joined');\n\n return result;\n };\n\n quit(): Promise<boolean> {\n return new Promise(async (resolve) => {\n this.joined = false;\n if (this._trtc.stream) {\n await this._trtc.client?.unpublish(this._trtc.stream);\n this._trtc.stream.stop();\n this._trtc.stream.close();\n this._trtc.stream = null;\n }\n this._trtc.client\n ?.leave()\n .then(() => (this._trtc.client = null))\n .then(() => resolve(true))\n .catch(() => resolve(false));\n resolve(true);\n });\n }\n\n detectMicro(): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n const rule = { audio: true, video: false };\n try {\n navigator.mediaDevices\n .getUserMedia(rule)\n .then(() => resolve(true))\n .catch((e) => {\n logger.error(e.message);\n resolve(false);\n });\n } catch (e) {\n console.error(e);\n resolve(false);\n }\n });\n }\n\n toggleMicro(flag?: boolean): Promise<boolean> {\n return Promise.resolve(\n (flag\n ? this._trtc?.stream?.unmuteAudio()\n : this._trtc?.stream?.muteAudio()) || false,\n );\n }\n\n shock(): void {\n throw new Error('Method not implemented.');\n }\n\n private _registerRtcEvent() {\n this._trtc.client?.on('stream-added', this._handleStreamAdded);\n this._trtc.client?.on('stream-subscribed', this._handleStreamSubscribed);\n this._trtc.client?.on('audio-volume', (event) =>\n this.emit(\n 'userVolumes',\n event.result.map(({ userId, audioVolume }) => ({\n userId,\n audioVolume,\n })),\n ),\n );\n this._trtc.client?.on('error', (event: any) => this.emit('error', event));\n }\n\n private _handleStreamAdded = (event: any) => {\n const remoteStream = event.stream;\n console.log('远端流增加: ' + remoteStream.getId());\n //订阅远端流\n this._trtc.client?.subscribe(remoteStream);\n };\n\n private _handleStreamSubscribed = (event: any) => {\n const remoteStream = event.stream;\n console.log('远端流订阅成功:' + remoteStream.getId());\n const playId = remoteStream.getId();\n const domId = `rs-rtc-remote_stream-${playId}`;\n const dom = document.createElement('div');\n dom.id = domId;\n this.$dom.appendChild(dom);\n // 播放远端流\n if (typeof this._autoPlayConfirm === 'function') {\n remoteStream.play(domId).catch((error: any) => {});\n remoteStream.on('error', (error: any) => {\n const errorCode = error.getCode();\n if (errorCode === 0x4043) {\n // PLAY_NOT_ALLOWED,引导用户手势操作并调用 stream.resume 恢复音视频播放\n const onConfirm = () => remoteStream.resume();\n this._autoPlayConfirm({ onConfirm });\n }\n });\n } else {\n remoteStream.play(domId);\n }\n };\n}\n","import {\n AudioMixObserver,\n AudioVideoObserver,\n BrowserBehavior,\n ConsoleLogger,\n DefaultDeviceController,\n DefaultMeetingSession,\n DefaultModality,\n DeviceChangeObserver,\n LogLevel,\n MeetingSessionConfiguration,\n MeetingSessionStatusCode,\n} from 'amazon-chime-sdk-js'\nimport { MeetingSessionConfigurationOptions } from '../typings/chime/MeetingSessionConfigurationOptions'\nimport { GetVoiceSign } from '../typings/live/GetVoiceSign'\nimport { RTCType } from '../typings/rtc/type'\nimport logger from '../utils/logger'\n\nimport { uuid } from '../utils/uuid'\nimport { CoreRTC } from './CoreRTC'\n\n/**\n * amazon-chime-sdk-js 适配的rtc实现\n */\nexport class BrowserRTC4Chime extends CoreRTC {\n type = RTCType.RealseeBrowserChimeRTC\n joined = false\n micro = false\n voiceId = ''\n userId = ''\n logger: ConsoleLogger\n deviceController: DefaultDeviceController\n meetingSession: DefaultMeetingSession | undefined\n\n audioInput: MediaDeviceInfo | undefined\n audioOutput: MediaDeviceInfo | undefined\n\n deviceChangeObserver: DeviceChangeObserver = {}\n audioVideoObserver: AudioVideoObserver = {}\n audioMixObserver?: AudioMixObserver\n\n private _getVoiceSign: GetVoiceSign = () => {\n throw new Error('方法 getVoiceSign 未实现')\n }\n\n private _autoPlayConfirm: (opts: { onConfirm: () => void }) => void | undefined\n\n private $dom: HTMLDivElement = document.createElement('div')\n private $audio: HTMLAudioElement = document.createElement('audio')\n\n constructor(options: {\n getVoiceSign: GetVoiceSign\n autoPlayConfirm?: (opts: { onConfirm: () => void }) => void\n logLevel?: LogLevel\n }) {\n super()\n // 挂载签名钩子\n this._getVoiceSign = options.getVoiceSign\n // @ts-ignore\n this._autoPlayConfirm = options.autoPlayConfirm\n this._initDom()\n this.logger = new ConsoleLogger('WebRTCLogger', options.logLevel || LogLevel.INFO)\n this.deviceController = new DefaultDeviceController(this.logger)\n this.initObservers()\n }\n\n /**\n * 对audio标签初始化\n */\n _initDom = () => {\n this.$audio.id = `rs-rtc-${uuid()}`\n this.$dom.id = `rs-rtc-${uuid()}`\n this.$dom.appendChild(this.$audio)\n document.body.appendChild(this.$dom)\n }\n\n /**\n * 初始化事件监听器\n */\n initObservers = () => {\n // 输入输出设备变化的监听器\n this.deviceChangeObserver = {\n audioInputsChanged: (freshAudioInputDeviceList?: MediaDeviceInfo[]) => {\n this.logger.info(`audioInputsChanged ${typeof freshAudioInputDeviceList}`)\n // An array of MediaDeviceInfo objects\n freshAudioInputDeviceList?.forEach((mediaDeviceInfo) => {\n this.logger.info(`Device ID: ${mediaDeviceInfo.deviceId} Microphone: ${mediaDeviceInfo.label}`)\n })\n },\n\n audioOutputsChanged: (freshAudioOutputDeviceList?: MediaDeviceInfo[]) => {\n this.logger.info(`audioOutputsChanged ${typeof freshAudioOutputDeviceList}`)\n freshAudioOutputDeviceList?.forEach((mediaDeviceInfo) => {\n this.logger.info(`Device ID: ${mediaDeviceInfo.deviceId} Speaker: ${mediaDeviceInfo.label}`)\n })\n },\n\n // videoInputsChanged: (freshVideoInputDeviceList: any) => {\n // this.logger.info(`Video inputs updated: ${freshVideoInputDeviceList}`);\n // },\n\n audioInputMuteStateChanged: (device: string | MediaStream, muteState: boolean) => {\n this.logger.info(`Device ${device.toString()} ${muteState ? 'is muted in hardware' : 'is not muted'}`)\n },\n }\n\n // 流变化监听器\n this.audioVideoObserver = {\n audioVideoDidStart: () => {\n this.logger.info('Started')\n },\n audioVideoDidStop: (sessionStatus: any) => {\n // See the \"Stopping a session\" section for details.\n this.logger.info(`Stopped with a session status code: ${sessionStatus.statusCode()}`)\n },\n audioVideoDidStartConnecting: (reconnecting: any) => {\n if (reconnecting) {\n // e.g. the WiFi connection is dropped.\n this.logger.info('Attempting to reconnect')\n }\n },\n }\n\n // 混流检测\n this.audioMixObserver = {\n meetingAudioStreamBecameActive: (activeStream: MediaStream) => {\n // this.logger.info('meetingAudioStreamBecameActive ==>')\n // console.log(activeStream)\n if (this.$audio.paused) {\n // 播放远端流\n const _play = () =>\n this.$audio\n .play()\n .then(() => {})\n .catch((error) => {\n logger.error('播放远端流失败!', error)\n if (typeof this._autoPlayConfirm === 'function') {\n const onConfirm = () => _play()\n this._autoPlayConfirm({ onConfirm })\n }\n })\n _play()\n }\n },\n meetingAudioStreamBecameInactive: (inactiveStream: MediaStream) => {\n // this.logger.info('meetingAudioStreamBecameInactive ==>')\n // console.log(inactiveStream)\n },\n }\n }\n\n /**\n * 加入语音会议\n * @param options\n * @returns\n */\n async join(options: {\n voiceId: string\n userId: string\n roomId: string | number | undefined\n type: RTCType\n }): Promise<boolean> {\n return new Promise(async (success, fail) => {\n this.emit('joinWillStart')\n try {\n // 取签名\n const { sdkAppId, userId, roomId, userSig } = await this._getVoiceSign({\n ...options,\n roomId: options.roomId || 0,\n })\n this.userId = userId\n const { attendence, vendor_wrapper }: MeetingSessionConfigurationOptions = JSON.parse(\n decodeURIComponent(userSig),\n )\n\n // 初始化配置\n const configuration = new MeetingSessionConfiguration(\n {\n Meeting: vendor_wrapper,\n },\n {\n Attendee: {\n ExternalUserId: attendence.external_user_id,\n AttendeeId: attendence.attendee_id,\n JoinToken: attendence.join_token,\n },\n },\n )\n\n // 初始化会议会话\n this.meetingSession = new DefaultMeetingSession(configuration, this.logger, this.deviceController)\n\n // 注册事件\n this._registerRtcEvent()\n\n // 绑定监听器\n this.meetingSession.audioVideo.addDeviceChangeObserver(this.deviceChangeObserver)\n this.meetingSession.audioVideo.addObserver(this.audioVideoObserver)\n\n // 绑定播放器\n this.meetingSession.audioVideo.bindAudioElement(this.$audio)\n\n const observer: AudioVideoObserver = {\n audioVideoDidStart: () => {\n this.meetingSession?.audioVideo.realtimeMuteLocalAudio()\n this.joined = true\n this.emit('joined')\n success(true)\n },\n audioVideoDidStop: () => {\n this.joined = false\n success(false)\n },\n }\n\n this.meetingSession.audioVideo.addObserver(observer)\n\n if (this.audioMixObserver) {\n this.meetingSession.audioVideo.addAudioMixObserver(this.audioMixObserver)\n }\n\n this.meetingSession.audioVideo.setDeviceLabelTrigger(\n async () => await navigator.mediaDevices.getUserMedia({ audio: true, video: false }),\n )\n\n // 设置输入设备\n try {\n const audioInputDevices = await this.meetingSession.audioVideo.listAudioInputDevices()\n logger.info('audioInputDevices ===>', audioInputDevices)\n\n const audioInputDeviceId = audioInputDevices[0]?.deviceId || 'default'\n await this.meetingSession.audioVideo.startAudioInput(audioInputDeviceId)\n } catch (e) {\n logger.error(`设置语音输入设备失败:${(e as Error).message}`)\n }\n\n try {\n const audioOutputDevices = await this.meetingSession.audioVideo.listAudioOutputDevices()\n logger.info('audioOutputDevices ===>', audioOutputDevices)\n const audioOutputDeviceId = audioOutputDevices[0]?.deviceId || 'default'\n\n await this.meetingSession.audioVideo.chooseAudioOutput(audioOutputDeviceId)\n } catch (e) {\n logger.error(`设置语音输出设备失败:${(e as Error).message}`)\n }\n\n this.meetingSession.audioVideo.start()\n } catch (e: unknown) {\n this.emit('error', e as Error)\n this.logger.error((e as Error).message)\n success(false)\n }\n })\n }\n\n /**\n * 注册rtc事件\n */\n _registerRtcEvent = () => {\n const presentAttendeeId = this.meetingSession?.configuration?.credentials?.attendeeId || ''\n if (presentAttendeeId) {\n // 处理音量变化\n const roster = new Map<\n string,\n {\n userId: string\n volume: number | null\n muted: boolean | null\n signalStrength: number | null\n }\n >()\n\n const getUserVolumes = () => {\n const result: any = []\n roster.forEach((v, k) => {\n result.push({\n userId: v.userId,\n volume: v.muted || v.signalStrength === 0 || !Boolean(v.volume) ? 0 : v.volume,\n })\n })\n return result\n }\n\n this.meetingSession?.audioVideo.realtimeSubscribeToAttendeeIdPresence(\n (presentAttendeeId: any, present: any, externalUserId: any) => {\n if (!present) {\n roster.delete(presentAttendeeId)\n this.emit('userVolumes', getUserVolumes())\n return\n }\n\n this.meetingSession?.audioVideo.realtimeSubscribeToVolumeIndicator(\n presentAttendeeId,\n (attendeeId: any, volume: any, muted: any, signalStrength: any) => {\n const baseAttendeeId = new DefaultModality(attendeeId).base()\n if (baseAttendeeId !== attendeeId) {\n // Optional: Do not include the content attendee (attendee-id#content) in the roster.\n // See the \"Screen and content share\" section for details.\n return\n }\n\n roster.set(attendeeId, {\n userId: externalUserId || attendeeId,\n volume,\n muted,\n signalStrength,\n })\n this.emit('userVolumes', getUserVolumes())\n },\n )\n },\n )\n\n // 弱网\n this.meetingSession?.audioVideo.realtimeSubscribeToVolumeIndicator(\n presentAttendeeId,\n (attendeeId: any, volume: any, muted: any, signalStrength: any) => {\n const baseAttendeeId = new DefaultModality(attendeeId).base()\n if (baseAttendeeId === attendeeId) {\n if (signalStrength !== null && signalStrength !== 1) {\n this.emit('weakNetwork')\n }\n }\n },\n )\n\n // 报错\n\n this.meetingSession?.audioVideo.realtimeSubscribeToFatalError((error: any) => this.emit('error', error))\n }\n }\n\n quit(): Promise<boolean> {\n if (!this.joined) return Promise.resolve(true)\n return new Promise((success, fail) => {\n this.joined = false\n const observer: AudioVideoObserver = {\n audioVideoDidStop: async (sessionStatus: any) => {\n const sessionStatusCode = sessionStatus.statusCode()\n this.meetingSession?.deviceController.destroy()\n if (sessionStatusCode === MeetingSessionStatusCode.Left) {\n /*\n - You called meetingSession.audioVideo.stop().\n - When closing a browser window or page, Chime SDK attempts to leave the session.\n */\n this.logger.info('You left the session')\n success(true)\n } else {\n this.logger.info(`Stopped with a session status code: ${sessionStatusCode}`)\n success(true)\n }\n },\n }\n this.meetingSession?.audioVideo.addObserver(observer)\n this.meetingSession?.audioVideo.stop()\n })\n }\n\n async detectMicro(): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n const rule = { audio: true, video: false }\n try {\n navigator.mediaDevices\n .getUserMedia(rule)\n .then(() => resolve(true))\n .catch(() => resolve(false))\n } catch (e: unknown) {\n this.logger.error((e as Error).message)\n resolve(false)\n }\n })\n }\n\n async toggleMicro(flag?: boolean): Promise<boolean> {\n if (flag) {\n this.meetingSession?.audioVideo.realtimeUnmuteLocalAudio()\n } else {\n this.meetingSession?.audioVideo.realtimeMuteLocalAudio()\n }\n const muted = this.meetingSession?.audioVideo.realtimeIsLocalAudioMuted()\n if (muted !== undefined) {\n return flag !== muted\n } else {\n return false\n }\n }\n\n shock(): void {\n throw new Error('Method not implemented.')\n }\n}\n","/**\n * rtc加入返回值code枚举\n */\nexport enum RTCJoinedInfoCodeEnum {\n /**\n * 成功\n */\n Success = 0,\n /**\n * 失败\n */\n Failure = 1,\n /**\n * 重复加入\n */\n ReJoin = 2,\n /**\n * 无麦克风权限\n */\n NoMicroPermission = 3,\n}\n\n/**\n * 进入rtc房间的回调信息\n */\nexport interface RTCJoinedInfo {\n code: RTCJoinedInfoCodeEnum;\n message: string;\n userId?: string;\n roomId?: number;\n errInfo?: {\n errCode: number;\n errMsg: string;\n };\n}\n","import { UserVolume } from '../typings/live/UserVolume'\nimport { RTCJoinedInfo, RTCJoinedInfoCodeEnum } from '../typings/rtc/joinedInfo'\nimport { RTCType } from '../typings/rtc/type'\nimport { VRWebViewRTCOptions } from '../typings/rtc/VRWebViewRTCOptions'\nimport { CoreRTC } from './CoreRTC'\n\nexport class VRWebViewRTC extends CoreRTC {\n type: RTCType = RTCType.RealseeVRWebViewRTC\n joined = false\n micro = false\n voiceId: string = ''\n\n private options: VRWebViewRTCOptions\n\n get jsBridge() {\n return this.options.jsBridge\n }\n\n constructor({ jsBridge, getVoiceSign }: VRWebViewRTCOptions) {\n super()\n this.options = { jsBridge, getVoiceSign }\n\n // TO-DO: 在微信小程序下有个音量上报的BUG会导致消息体过大从而jsbridge异常断开\n if (this.jsBridge.webViewType !== 'WxMiniProgramWebView') {\n this.jsBridge.callAndListen('live/userVolumes', (userVolumes: UserVolume[]) => {\n this.emit('userVolumes', userVolumes)\n })\n }\n\n this.jsBridge.callAndListen('live/weakNetwork', (weakNetwork: boolean) => {\n if (weakNetwork) this.emit('weakNetwork')\n })\n }\n\n async join(options: { voiceId: string; userId: string; roomId: string; type: RTCType }) {\n try {\n this.emit('joinWillStart')\n const { sdkAppId, userId, userSig } = await this.options.getVoiceSign(options)\n\n if (!(Boolean(sdkAppId) && Boolean(userId) && Boolean(userSig))) {\n this.emit('error', new Error('加入房间失败:rtc 签名请求异常'))\n this.joined = false\n return this.joined\n }\n\n this.type = options.type\n const [res, error] = await this.jsBridge.callAndBackfeed<RTCJoinedInfo | true>(\n `live/join?sdkAppID=${sdkAppId}&userID=${userId}&roomID=${Number(options.voiceId)}&userSig=${userSig}`,\n )\n\n if (res === true) {\n this.emit('joined')\n this.joined = true\n } else {\n if (!res) {\n this.emit('error', error ? error : new Error('加入房间失败:未知异常。'))\n this.joined = false\n } else {\n if (res.code === RTCJoinedInfoCodeEnum.Success) {\n this.emit('joined')\n this.joined = true\n } else {\n this.emit('error', res)\n this.joined = false\n }\n }\n }\n return this.joined\n } catch (e) {\n this.emit('error', new Error('加入房间失败:' + (e as Error).message))\n this.joined = false\n return this.joined\n }\n }\n\n async quit() {\n const [res, error] = await this.jsBridge.callAndBackfeed<boolean>('live/quit')\n if (res === null) {\n this.emit('error', error ? error : new Error('退出房间失败:未知异常。'))\n }\n this.joined = false\n return !!res\n }\n\n async detectMicro() {\n const [res, error] = await this.jsBridge.detectMicro()\n if (res === null) {\n this.emit('error', error ? error : new Error('麦克风监测异常!'))\n return false\n }\n return res\n }\n\n async toggleMicro(flag?: boolean) {\n const [res, error] = await this.jsBridge.callAndBackfeed<boolean>(`live/toggleMicro?flag=${!!flag ? 1 : 0}`)\n if (res === null) {\n this.emit('error', error ? error : new Error('麦克风监测异常!'))\n return false\n }\n this.micro = res\n return res\n }\n\n shock() {\n this.jsBridge.shock(1)\n }\n}\n","/**\n * WebSocket 通信指令\n * - 下行:服务端推送数据\n * - 上行:客户端上报数据\n */\nexport enum Command {\n /* 当前用户信息:下行 */\n SelfUserInfo = \"SELF_USER_INFO\",\n /* 房间信息:下行 */\n RoomInfo = \"ROOM_INFO\",\n /* RTC信息:下行 */\n RTCInfo = \"RTC_INFO\",\n /* 用户列表:下行 */\n UserList = \"USER_LIST\",\n /* 内置消息:下行、上行 */\n BuiltinMsg = \"BUILTIN_MSG\",\n /* 自定义广播事件消息:下行、上行 */\n CustomEvent = \"CUSTOM_EVENT\",\n /* 帧数据同步:下行、上行 */\n KeyframeSync = \"KEYFRAME_SYNC\",\n /* 被踢出房间:下行 */\n UserKickOut = \"USER_KICK_OUT\",\n}\n\n/**\n * 向服务端请求数据时的数据格式。\n */\nexport type ReqLiveMsg = {\n /**\n * 请求指令。\n */\n command: Command;\n /**\n * 前端请求时生成的uuid()。\n */\n front_request_id: string;\n /**\n * 数据内容\n */\n data: {\n /**\n * 如果此数据仅发送给某些用户,请提供这些用户的ucid。\n */\n to_user_ids?: string[];\n [key: string]: any;\n };\n};\n\n/**\n * 内置事件类型。\n */\nexport enum BuiltinEventType {\n /**\n * 变更用户状态。\n */\n UserChange = \"user_change\",\n /**\n * 变更房间状态。\n */\n RoomChange = \"room_change\",\n}\n\n/**\n * 内置事件行为类型。\n */\nexport enum BuiltinActionType {\n /**\n * 修改麦克风状态。\n */\n UserMicroStatus = \"change_micro_status\",\n /**\n * 同步当前用户状态:客户端麦克风状态已经修改成功,通知服务端\n */\n UserMicroStatusSync = \"sync_micro_status\",\n /**\n * 调整某些用户的权限。\n */\n UserPermission = \"change_permission\",\n /**\n * 用户状态发生改变。\n */\n UserStatus = \"change_status\",\n /**\n * 更新用户信息。\n */\n UserInfo = \"change_info\",\n /**\n * 关闭房间。\n */\n RoomClose = \"close\",\n}\n\n/**\n * 内置事件数据结构体。\n */\nexport type BuiltinMsg = {\n event_type: BuiltinEventType;\n action: BuiltinActionType;\n to_user_ids: string[];\n data: {\n extension?: Record<string, any>;\n [key: string]: any;\n };\n};\n\n/**\n * 麦克风状态。\n */\nexport enum MicroStatus {\n OPEN = \"OPEN\",\n CLOSE = \"CLOSE\",\n}\n/**\n * 响应的信息结构体。\n */\nexport type LiveMsg = {\n code: string;\n message: string;\n command: Command;\n roomCode: string;\n appId: string;\n requestId: string;\n frontRequestId: string;\n triggerUserId: string;\n data: Record<string, any> | Record<string, any>[];\n};\n\n/**\n * 解析下后端数据格式。\n * @param jsonTxt - JSON序列化后的文本。\n * @returns false 标识解析失败;解析成功返回 {@link LiveMsg} 实例。\n */\nexport function parseLiveMsg(jsonTxt: string): LiveMsg | boolean {\n try {\n const msg = JSON.parse(jsonTxt);\n const resMsg: Record<string, any> = {\n code: msg.code,\n message: msg.message,\n command: msg.command,\n roomCode: msg.room_code,\n appID: msg.app_id,\n requestId: msg.request_id,\n frontRequestId: msg.front_request_id,\n triggerUserID: msg.trigger_user_id,\n data: msg.data || {},\n };\n\n const undefinedKeys = Object.keys(resMsg).filter(\n (key) => resMsg[key] === undefined\n );\n if (undefinedKeys.length > 0) {\n console.warn(`推送数据格式异常:${undefinedKeys.join(\" \")} 值不存在!`);\n }\n return resMsg as LiveMsg;\n } catch (error) {\n // notcare? 过滤掉所有不符合规范的数据\n return false;\n }\n}\n","export enum LiveState\n/**\n * 尚未初始化\n */ {\n NOTINITIALIZED = -1,\n\n /**\n * 正在链接中\n */\n CONNECTING = 0,\n\n /**\n * 已经链接并且可以通讯\n */\n OPEN = 1,\n\n /**\n * 连接已关闭或者链接失败\n */\n CLOSED = 3,\n}\n","/**\n * 用户当前状态枚举。\n */\nexport enum UserStatus {\n /**\n * 正常\n */\n Normal = 0,\n /**\n * 被移除\n */\n Removed = 1,\n /**\n * 被替换\n */\n Replaced = 2,\n}\n\nexport enum MemUserStatus {\n WAIT_ENTER = 'WAIT_ENTER',\n ONLINE = 'ONLINE',\n LEAVE = 'LEAVE',\n KICK_OUT = 'KICK_OUT',\n BE_REPLACE = 'BE_REPLACE',\n EXCEPTION = 'EXCEPTION',\n}\n\n/**\n * 用户信息扩展字段:比如提供用户画像相关的数据。\n */\nexport type UserInfoExt = {\n /**\n * 用户昵称。\n */\n nickname?: string;\n /**\n * 用户头像。\n */\n avatar?: string;\n /**\n * 其他用户相关的字段,比如用户职称、住址、联系方式等信息。\n */\n [key: string]: any;\n};\n\n/**\n * 带看会话房间用户的信息格式。\n */\nexport type UserInfo = {\n /**\n * 用户唯一标识ID。\n */\n id: string;\n /**\n * 用户当前的状态。\n */\n status?: UserStatus;\n /**\n * 内存中的用户状态。\n */\n mem_user_status?: MemUserStatus;\n /**\n * 用户当前是否开启麦克风。\n */\n micro_status: boolean;\n /**\n * 用户角色定义。(前端不关注此字段)。\n */\n user_role?: number | string;\n /**\n * 用户当前是否在线。\n */\n current_ws_online?: boolean;\n /**\n * 用户曾经是否在线过,即进入房间后又由于某种原因离开后重新进入。\n */\n once_ws_online?: boolean;\n /**\n * RTC 环境是否就绪,即当前语音是否联通。\n */\n rtc: boolean;\n /**\n * 当前用户的权限配置。(UI层面理解)。\n */\n permission?: Partial<Permission>;\n /**\n * 用户信息扩展字段。\n */\n extension?: UserInfoExt;\n};\n\nexport interface Permission {\n // 切换更多VR的权限\n more_vr_scene: boolean;\n // 邀请别人的权限\n invite_other: boolean;\n // 控制自己麦克风\n control_own_micro: boolean;\n // 控制别人的麦克风\n control_other_micro: boolean;\n // 查看自己麦克风状态\n view_own_micro_status: boolean;\n // 查看别人麦克风状态\n view_other_micro_status: boolean;\n // 关闭带看房间\n close_live_room: boolean;\n // 申请要电话\n apply_other_phone: boolean;\n // 动态进入\n dynamic_enter: boolean;\n // 同步帧数据\n sync_frame: boolean;\n // 改变角色\n transfer_role: boolean;\n // 改变别人的状态\n change_other_status: boolean;\n // 控制别人全量同步帧数据的权限\n control_other_sync: boolean;\n // 其它权限点\n extension: Record<string, boolean>;\n}\n","/**\n * WebSocket 连接状态枚举\n */\nexport enum WebSocketState {\n /**\n * 尚未初始化\n */\n NOTINITIALIZED = -1,\n\n /**\n * 正在链接中\n */\n CONNECTING = 0,\n\n /**\n * 已经链接并且可以通讯\n */\n OPEN = 1,\n\n /**\n * 连接正在关闭\n */\n CLOSING = 2,\n\n /**\n * 连接已关闭或者没有链接成功\n */\n CLOSED = 3,\n}\n\nexport type WebSocketError = {\n type: WebSocketErrorType;\n closeError?: WebSocketCloseError;\n target?: Event | CloseEvent;\n error?: any;\n};\n\nexport enum WebSocketErrorType {\n Error = 'Error',\n Close = 'Close',\n MicroAuth = 'MicroAuth',\n DuplicateConnect = 'DuplicateConnect',\n IllegalURL = 'IllegalURL',\n Unknown = 'Unknown',\n IllegalArgs = 'IllegalArgs',\n}\n\n/**\n * WebSocket 异常关闭枚举:https://developer.mozilla.org/zh-CN/docs/Web/API/CloseEvent。\n */\nexport enum WebSocketCloseError {\n /**\n * 正常关闭; 无论为何目的而创建,该链接都已成功完成任务。\n */\n Err_1000 = 'CLOSE_NORMAL',\n /**\n * 终端离开, 可能因为服务端错误, 也可能因为浏览器正从打开连接的页面跳转离开。\n */\n Err_1001 = 'CLOSE_GOING_AWAY',\n\n /**\n * 由于协议错误而中断连接。\n */\n Err_1002 = 'CLOSE_PROTOCOL_ERROR',\n\n /**\n * 由于接收到不允许的数据类型而断开连接 (如仅接收文本数据的终端接收到了二进制数据)。\n */\n Err_1003 = 'CLOSE_UNSUPPORTED',\n\n /**\n * 安全因素或WebSocket连接次数达到上限。\n */\n Err_1006 = 'CLOSE_ABNORMAL',\n\n /**\n * 由于收到了格式不符的数据而断开连接 (如文本消息中包含了非 UTF-8 数据)。\n */\n Err_1007 = 'Unsupported Data',\n /**\n * 由于收到不符合约定的数据而断开连接。\n */\n Err_1008 = 'Policy Violation',\n /**\n * 由于收到过大的数据帧而断开连接。\n */\n Err_1009 = 'CLOSE_TOO_LARGE',\n /**\n * 未知错误。\n */\n Err_unknown = 'unknown',\n}\n\nexport function parseWSClsErr(code: number) {\n switch (code) {\n case 1000: {\n return WebSocketCloseError.Err_1000;\n }\n case 1001: {\n return WebSocketCloseError.Err_1001;\n }\n case 1002: {\n return WebSocketCloseError.Err_1002;\n }\n case 1003: {\n return WebSocketCloseError.Err_1003;\n }\n case 1006: {\n return WebSocketCloseError.Err_1006;\n }\n case 1007: {\n return WebSocketCloseError.Err_1007;\n }\n case 1008: {\n return WebSocketCloseError.Err_1008;\n }\n case 1009: {\n return WebSocketCloseError.Err_1009;\n }\n default:\n break;\n }\n\n return WebSocketCloseError.Err_unknown;\n}\n","\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogLevel = void 0;\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\n LogLevel[LogLevel[\"INFO\"] = 1] = \"INFO\";\n LogLevel[LogLevel[\"WARN\"] = 2] = \"WARN\";\n LogLevel[LogLevel[\"ERROR\"] = 3] = \"ERROR\";\n LogLevel[LogLevel[\"OFF\"] = 4] = \"OFF\";\n})(LogLevel = exports.LogLevel || (exports.LogLevel = {}));\nexports.default = LogLevel;\n//# sourceMappingURL=LogLevel.js.map","export function appendUri(uri: string, query: Record<string, string | number> = {}) {\n const hasQuery = uri.indexOf('?') !== -1\n const newQuery = Object.keys(query).reduce(\n (accu, curr, idx) =>\n `${accu}${(idx === 0 && !hasQuery) ? '?' : '&'}${curr}=${query[curr]}`,\n '')\n\n return uri + newQuery\n}\n","const userAgent = globalThis.navigator.userAgent\n\nexport const isAndroid = /android/gi.test(userAgent)\n\nexport const isIOS = /iPhone|iPad\\s+OS/gi.test(userAgent)\n\nexport const isWxMiniProgram = /MicroMessenger/gi.test(userAgent) && /miniProgram/gi.test(userAgent)\n\nexport const isRealseeVRWebview = /realsee/gi.test(userAgent)\n","/**\n * 判断是否是真实的对象类型\n * @param value\n * @returns\n */\nfunction isTrulyObject(value: any): boolean {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * 判断基础类型是否相等\n * @param value\n * @param other\n * @returns\n */\nfunction baseIsEqual(value: any, other: any): boolean {\n if (value === other) return true;\n if (typeof value !== typeof other) return false;\n if (Number.isNaN(value) && Number.isNaN(other)) return true;\n return false;\n}\n\n/**\n * 对象浅比较\n * @param value\n * @param other\n * @returns\n */\nfunction objEqualShallow(value: any, other: any): boolean {\n const valueProps = Object.getOwnPropertyNames(value);\n const otherProps = Object.getOwnPropertyNames(other);\n if (valueProps.length !== otherProps.length) return false;\n\n for (let i = 0, len = valueProps.length; i < len; i++) {\n const propName = valueProps[i];\n if (!baseIsEqual(value[propName], other[propName])) return false;\n }\n\n return true;\n}\n\n/**\n * 数组浅比较\n * @param value\n * @param other\n * @returns\n */\nfunction arrayEqualShallow(value: any, other: any): boolean {\n if (value.length !== other.length) return false;\n for (let i = 0, len = value.length; i < len; i++) {\n if (!baseIsEqual(value[i], other[i])) return false;\n }\n return true;\n}\n\n/**\n * 变量浅比较\n * @param value\n * @param other\n * @returns\n */\nfunction isShallowEqual(value: any, other: any): boolean {\n if (baseIsEqual(value, other)) return true;\n if (isTrulyObject(value) && isTrulyObject(other))\n return objEqualShallow(value, other);\n if (Array.isArray(value) && Array.isArray(other))\n return arrayEqualShallow(value, other);\n return false;\n}\n\n/**\n * 对象深比较\n * @param value\n * @param other\n * @returns\n */\nfunction isDeepEqual(value: any, other: any): boolean {\n if (baseIsEqual(value, other)) return true;\n if (isTrulyObject(value) && isTrulyObject(other))\n return objEqualDeep(value, other);\n if (Array.isArray(value) && Array.isArray(other))\n return arrayEqualDeep(value, other);\n return false;\n}\n\n/**\n * 数组深比较\n * @param value\n * @param other\n * @returns\n */\nfunction arrayEqualDeep(value: any, other: any): boolean {\n if (value.length !== other.length) return false;\n for (let i = 0, len = value.length; i < len; i++) {\n if (!isDeepEqual(value[i], other[i])) return false;\n }\n return true;\n}\n\n/**\n * 对象深比较\n * @param value\n * @param other\n * @returns\n */\nfunction objEqualDeep(value: any, other: any): boolean {\n const valueProps = Object.getOwnPropertyNames(value);\n const otherProps = Object.getOwnPropertyNames(other);\n if (valueProps.length !== otherProps.length) return false;\n\n for (let i = 0, len = valueProps.length; i < len; i++) {\n const propName = valueProps[i];\n if (!isDeepEqual(value[propName], other[propName])) return false;\n }\n\n return true;\n}\n\n/**\n * 对象比较。\n * @param value 第一个比较的值。\n * @param other 第二个比较的值。\n * @param options 可选参数,可选项:`deep` 是否深比较。\n * @returns {boolean} 是否相等。\n */\nexport function equal(value: any, other: any, opt = { deep: false }): boolean {\n if (!opt.deep) return isShallowEqual(value, other);\n return isDeepEqual(value, other);\n}\n","import { WebSocketState } from '../typings'\nimport { Subscribe } from './subscribe'\n\n/**\n * 鲁棒ws的配置参数\n */\nexport type RobustWebSocketConstructorOptions = {\n url: string | ((ws: RobustWebSocket) => string)\n protocols?: string[]\n robustOptions?: RobustOptions\n}\n\n/**\n * ws 鲁棒性的配置\n */\nexport type RobustOptions = {\n // 等待超时时间\n timeout?: number\n // 是否进行重连的判断\n shouldReconnect?: (event: CloseEvent, ws: RobustWebSocket) => undefined | number\n // 是否1000的正常关闭code 也需要重连\n should1000Reconnect?: boolean\n // 是否监听 navigator 上的online/offline 事件\n ignoreConnectivityEvents?: boolean\n // 是否自动连接\n automaticOpen?: boolean\n}\n\nexport type RobustWebSocketEventDetail = {\n reconnects: number\n attempts: number\n}\n\nexport type RobustWebSocketEvent<T> = Event & {\n detail: T\n}\n\n// RobustWebSocket事件映射\nexport type RobustWebSocketEventMap = {\n connecting: (event: RobustWebSocketEvent<RobustWebSocketEventDetail>) => void\n timeout: (event: RobustWebSocketEvent<RobustWebSocketEventDetail>) => void\n open: (event: RobustWebSocketEvent<RobustWebSocketEventDetail>) => void\n closing: () => void\n close: (event: CloseEvent) => void\n error: (event: Event) => void\n message: (event: MessageEvent<string | ArrayBuffer | Blob | ArrayBufferView>) => void\n}\n\n/**\n * 具有鲁棒性的WebSocket封装\n * 1、自动重连\n * 2、可根据网络情况进行重连\n */\nexport class RobustWebSocket extends Subscribe<RobustWebSocketEventMap> {\n private _realWebSocket: WebSocket | undefined\n private _url?: string | ((ws: RobustWebSocket) => string)\n private _protocols: string[] | undefined\n private _readyState: WebSocketState = WebSocketState.NOTINITIALIZED\n private _options: RobustOptions = {\n timeout: 10000,\n shouldReconnect: (event, ws) => {\n if (event.code === 1008 || event.code === 1011) return\n return [0, 1000, 2000][ws.attempts % 3]\n },\n should1000Reconnect: false,\n ignoreConnectivityEvents: false,\n automaticOpen: false,\n }\n private _connectTimeout: any | undefined\n private _attempts = 0\n private _reconnects = -1\n private _reconnectWhenOnlineAgain = false\n public _explicitlyClosed = false\n private _pendingReconnect: number | undefined\n private _connectivityEventsAttached = false\n private _heathCheckTimer: number | undefined\n\n public get attempts(): number {\n return this._attempts\n }\n\n constructor(options?: RobustWebSocketConstructorOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n super()\n if (options) {\n this.setOptions(options)\n }\n this._startHealthCheck()\n }\n\n public setOptions(options: RobustWebSocketConstructorOptions): void {\n if (!options) return\n this._url = options.url\n this._protocols = options.protocols\n const opts = Object.assign(this._options, options.robustOptions || {})\n if (typeof opts?.timeout !== 'number') {\n throw new Error('timeout must be the number of milliseconds to timeout a connection attempt')\n }\n\n if (typeof opts?.shouldReconnect !== 'function') {\n throw new Error(\n 'shouldReconnect must be a function that returns the number of milliseconds to wait for a reconnect attempt, or null or undefined to not reconnect.',\n )\n }\n this._options = opts\n if (this._options.automaticOpen) {\n this._createWebSocket()\n }\n }\n\n /**\n * 做一个健康检查\n */\n private _healthCheck = async () => {\n if (this._realWebSocket && this._realWebSocket.readyState !== this._readyState) {\n this._readyState = this._realWebSocket.readyState as WebSocketState\n // 太惨了,断网的时候,ws不会直接closed,而是处于closing的状态\n if (this._readyState === WebSocketState.CLOSING) {\n this.emit('closing')\n }\n }\n await new Promise((resolve) => setTimeout(resolve, 2000))\n this._heathCheckTimer = requestAnimationFrame(this._healthCheck)\n }\n\n /**\n * 清理超时计时器\n */\n private _clearConnectTimeoutIfNeed = () => {\n if (this._connectTimeout) {\n clearTimeout(this._connectTimeout)\n this._connectTimeout = undefined\n }\n }\n\n /**\n * 清理健康检查\n */\n private _clearHeathCheckIfNeed = () => {\n if (this._heathCheckTimer) {\n cancelAnimationFrame(this._heathCheckTimer)\n this._heathCheckTimer = undefined\n }\n }\n\n /**\n * 开启健康检查\n */\n private _startHealthCheck = () => {\n this._clearHeathCheckIfNeed()\n this._heathCheckTimer = requestAnimationFrame(this._healthCheck)\n }\n\n /**\n * 停止健康检查\n */\n private _stopHealthCheck = () => {\n this._clearHeathCheckIfNeed()\n }\n\n /**\n * 清理连接中的请求\n */\n private _clearPendingReconnectIfNeeded = () => {\n if (this._pendingReconnect) {\n clearTimeout(this._pendingReconnect)\n this._pendingReconnect = undefined\n }\n }\n\n /**\n * 当网页连接上网络进行重连\n * @param event\n */\n private _online = (event: Event) => {\n if (this._reconnectWhenOnlineAgain) {\n this._clearPendingReconnectIfNeeded()\n this._reconnect(event as CloseEvent)\n }\n }\n\n /**\n * 当网页断开网络进行关闭\n */\n private _offline = () => {\n this._reconnectWhenOnlineAgain = true\n this._realWebSocket?.close(1000, 'offline')\n }\n\n /**\n * 解除网络监听事件\n */\n private _detachConnectivityEvents = () => {\n if (this._connectivityEventsAttached) {\n globalThis?.removeEventListener('online', this._online)\n globalThis?.removeEventListener('offline', this._offline)\n this._connectivityEventsAttached = false\n }\n }\n\n /**\n * 注册网络监听事件\n */\n private _attachConnectivityEvents = () => {\n if (!this._connectivityEventsAttached) {\n globalThis?.addEventListener('online', this._online)\n globalThis?.addEventListener('offline', this._offline)\n this._connectivityEventsAttached = true\n }\n }\n\n /**\n * 发送消息\n * @param data\n * @returns\n */\n send = (data: string | ArrayBuffer | Blob | ArrayBufferView): void | undefined => {\n if (this._realWebSocket?.readyState === this._realWebSocket?.OPEN) {\n this._realWebSocket?.send(data)\n }\n }\n\n /**\n * 关闭连接\n * @param code 代码\n * @param reason 原因\n * @returns\n */\n close = (code?: number | string, reason?: string): void | undefined => {\n if (typeof code !== 'number') {\n reason = code\n code = 1000\n }\n this._clearPendingReconnectIfNeeded()\n this._reconnectWhenOnlineAgain = false\n this._explicitlyClosed = true\n this._detachConnectivityEvents()\n\n return this._realWebSocket?.close(code, reason)\n }\n\n /**\n * 进行ws连接\n */\n open = (url?: string): void => {\n if (url) {\n this._url = url\n }\n if (\n this._realWebSocket?.readyState !== WebSocket.OPEN &&\n this._realWebSocket?.readyState !== WebSocket.CONNECTING\n ) {\n this._clearPendingReconnectIfNeeded()\n this._reconnectWhenOnlineAgain = false\n this._explicitlyClosed = false\n\n this._createWebSocket()\n }\n }\n\n /**\n * 创建ws连接\n */\n private _createWebSocket = () => {\n const newUrl = typeof this._url === 'string' ? this._url : this._url?.(this)\n if (!newUrl) return\n this._clearConnectTimeoutIfNeed()\n this._clearPendingReconnectIfNeeded()\n this._removeWebSocketEvent()\n this._realWebSocket = new WebSocket(newUrl, this._protocols || undefined)\n\n this._attempts = this._attempts + 1\n this.emit(\n 'connecting',\n new CustomEvent('connecting', {\n detail: { attempts: this._attempts, reconnects: this._reconnects },\n }),\n )\n\n const timeoutCallback = () => {\n this._connectTimeout = undefined\n this._detachConnectivityEvents()\n this.emit(\n 'timeout',\n new CustomEvent('timeout', {\n detail: {\n attempts: this._attempts,\n reconnects: this._reconnects,\n },\n }),\n )\n }\n\n this._connectTimeout = setTimeout(timeoutCallback, this._options?.timeout)\n\n this._dispatchWebSocketEvent()\n\n if (!this._options?.ignoreConnectivityEvents) {\n this._attachConnectivityEvents()\n }\n }\n\n /**\n * 断开ws事件\n */\n private _removeWebSocketEvent = () => {\n this._realWebSocket?.removeEventListener('open', this._webSocketOpenHandler)\n this._realWebSocket?.removeEventListener('close', this._webSocketCloseHandler)\n this._realWebSocket?.removeEventListener('error', this._webSocketErrorHandler)\n this._realWebSocket?.removeEventListener('message', this._webSocketMessageHandler)\n }\n\n /**\n * 分发ws事件\n */\n private _dispatchWebSocketEvent = () => {\n this._realWebSocket?.addEventListener('open', this._webSocketOpenHandler)\n this._realWebSocket?.addEventListener('close', this._webSocketCloseHandler)\n this._realWebSocket?.addEventListener('error', this._webSocketErrorHandler)\n this._realWebSocket?.addEventListener('message', this._webSocketMessageHandler)\n }\n\n /**\n * ws连接事件\n * @returns\n */\n private _webSocketOpenHandler = (event: Event) => {\n if (this._connectTimeout) {\n clearTimeout(this._connectTimeout)\n this._connectTimeout = undefined\n }\n const reconnects = ++this._reconnects\n const attempts = this._attempts\n this._attempts = 0\n this._reconnectWhenOnlineAgain = false\n this._startHealthCheck()\n return this.emit('open', Object.assign(event, { detail: { reconnects, attempts } }))\n }\n\n /**\n * ws 关闭事件\n * @param event\n * @returns\n */\n private _webSocketCloseHandler = (event: CloseEvent) => {\n this._reconnect(event)\n this._stopHealthCheck()\n return this.emit('close', event)\n }\n\n /**\n * ws 异常\n * @param event\n * @returns\n */\n private _webSocketErrorHandler = (event: Event) => {\n return this.emit('error', new CustomEvent('error', { detail: { error: event } }))\n }\n\n /**\n * ws消息\n * @param event\n * @returns\n */\n private _webSocketMessageHandler = (event: MessageEvent) => {\n return this.emit('message', event)\n }\n\n /**\n * 进行重连\n * @param event\n * @returns\n */\n private _reconnect(event: CloseEvent) {\n if ((!this._options?.should1000Reconnect && event.code === 1000) || this._explicitlyClosed) {\n this._attempts = 0\n return\n }\n\n if (this._connectivityEventsAttached) {\n if (globalThis?.navigator?.onLine === false) {\n this._reconnectWhenOnlineAgain = true\n return\n }\n }\n\n const delay = this._options?.shouldReconnect?.(event, this)\n if (typeof delay === 'number') {\n // @ts-ignore\n this._pendingReconnect = setTimeout(this._createWebSocket, delay)\n }\n }\n}\n","import { LiveMsg, parseWSClsErr } from '../typings';\nimport { LiveState } from '../typings/live/LiveState';\nimport logger from '../utils/logger';\nimport {\n RobustWebSocket,\n RobustWebSocketEventDetail,\n RobustWebSocketEvent,\n} from '../utils/RobustWebSocket';\nimport { Subscribe } from '../utils/subscribe';\n\nexport type LiveControllerEventMap = {\n stateChange: (state: LiveState, prevState: LiveState) => void;\n message: (message: LiveMsg) => void;\n reconnected: (detail: RobustWebSocketEventDetail) => void;\n};\n\nexport class LiveController extends Subscribe<LiveControllerEventMap> {\n /**\n * ws代理器\n */\n private _ws: RobustWebSocket = new RobustWebSocket({\n url: '',\n robustOptions: { should1000Reconnect: true, ignoreConnectivityEvents: true },\n });\n\n /**\n * 带看连接状态\n */\n private _state = LiveState.NOTINITIALIZED;\n\n set state(state: LiveState) {\n const prevState = JSON.parse(JSON.stringify(this._state));\n this._state = state;\n this.emit('stateChange', this.state, prevState);\n }\n\n get state() {\n return this._state;\n }\n\n constructor() {\n super();\n this._addWebSocketEventListeners();\n }\n\n /**\n * 添加事件监听\n */\n private _addWebSocketEventListeners = () => {\n this._ws.on('close', this._handleCloseEvent);\n this._ws.on('closing', this._handleClosingEvent);\n this._ws.on('connecting', this._handleConnectingEvent);\n this._ws.on('error', this._handleErrorEvent);\n this._ws.on('message', this._handleMessageEvent);\n this._ws.on('open', this._handleOpenEvent);\n this._ws.on('timeout', this._handleTimeoutEvent);\n };\n\n /**\n * 移除事件监听\n */\n private _removeWebSocketEventListeners = () => {\n this._ws.off('close', this._handleCloseEvent);\n this._ws.off('closing', this._handleClosingEvent);\n this._ws.off('connecting', this._handleConnectingEvent);\n this._ws.off('error', this._handleErrorEvent);\n this._ws.off('message', this._handleMessageEvent);\n this._ws.off('open', this._handleOpenEvent);\n this._ws.off('timeout', this._handleTimeoutEvent);\n };\n\n /**\n * 处理房间关闭事件\n * @param event\n */\n private _handleCloseEvent = (event: CloseEvent) => {\n logger.info(\n `live room closed bacause of ${event.code}-${\n event.reason || parseWSClsErr(event.code)\n }`,\n );\n this.state = LiveState.CLOSED;\n };\n\n /**\n * 处理房间正在关闭事件(这个时候可能是断网了)\n */\n private _handleClosingEvent = () => {\n logger.info(`live room is closing, onLine:`, globalThis?.navigator?.onLine);\n this.state = LiveState.CLOSED;\n };\n\n /**\n * 连接中\n * @param event\n */\n private _handleConnectingEvent = () => {\n logger.info(`live room is connecting`);\n this.state = LiveState.CONNECTING;\n };\n\n /**\n * 连接发送异常\n * @param event\n */\n private _handleErrorEvent = (event: Event) => {\n logger.error(`live room error`, event);\n this.state = LiveState.CLOSED;\n };\n\n /**\n * 接收到消息\n * @param event\n */\n private _handleMessageEvent = (event: MessageEvent) => {\n // logger.info('live room received message ', event.data);\n let message = (() => {\n try {\n return JSON.parse(event.data);\n } catch (e) {\n return event.data;\n }\n })() as LiveMsg;\n this.emit('message', message);\n };\n\n /**\n * 连接建立成功\n * @param event\n */\n private _handleOpenEvent = (\n event: RobustWebSocketEvent<RobustWebSocketEventDetail>,\n ) => {\n logger.info('live room open', event.detail);\n this.state = LiveState.OPEN;\n if (event.detail.reconnects > 0) {\n this.emit('reconnected', event.detail);\n }\n };\n\n /**\n * 处理超时\n * @param event\n */\n private _handleTimeoutEvent = (\n event: RobustWebSocketEvent<RobustWebSocketEventDetail>,\n ) => {\n logger.error('live room connect timeout!', event.detail);\n this.state = LiveState.CLOSED;\n };\n\n /**\n * 释放资源,释放之后需要重新实例化\n * @returns\n */\n dispose = async () => {\n this._removeWebSocketEventListeners();\n return await this.close('live room close by controller disposed!');\n };\n\n /**\n * 开启房间链接\n * @param url 房间链接\n * @returns\n */\n open = (url: string) => this._ws.open(url);\n\n /**\n * 关闭房间\n * @param code\n * @param reason\n */\n close = (code?: string | number | undefined, reason?: string | undefined) =>\n new Promise<boolean>((resolve) => {\n this._ws.once('close', () => resolve(true));\n this._ws.close(code, reason);\n });\n\n /**\n * 发送数据\n * @param data\n */\n sendMessage(data: any = '') {\n if (data === undefined || data === null || data === '') {\n throw new Error('live message is empty!');\n }\n if (this.state === LiveState.OPEN) {\n return this._ws.send(JSON.stringify(data));\n } else {\n throw new Error('live has not yet been initialized!');\n }\n }\n\n /**\n * 准备关闭带看\n */\n readyClose() {\n if (this._ws) {\n this._ws._explicitlyClosed = true\n }\n }\n}\n","import JSBridge, { JSBridgeProtocol } from '@realsee/jsbridge-x'\nimport LogLevel from 'amazon-chime-sdk-js/build/logger/LogLevel'\nimport { BrowserRTC, BrowserRTC4Chime, RTCProtocol, VRWebViewRTC } from '../rtc'\nimport {\n BuiltInRTCType,\n Command,\n EventType,\n GetVoiceSign,\n KeyframeTypes,\n LiveOptions,\n RoomInfo,\n RTCType,\n UserInfo,\n ReqLiveMsg,\n BuiltinEventType,\n BuiltinActionType,\n MicroStatus,\n LiveMsg,\n BuiltinMsg,\n LiveConnectOptions,\n} from '../typings'\nimport { LiveState } from '../typings/live/LiveState'\nimport { appendUri } from '../utils/appendUri'\nimport { isRealseeVRWebview, isAndroid, isIOS, isWxMiniProgram } from '../utils/clientDetector'\nimport { equal } from '../utils/equal'\nimport logger from '../utils/logger'\nimport { Subscribe } from '../utils/subscribe'\nimport { uuid } from '../utils/uuid'\nimport { LiveController } from './controller'\n\nconst unimplementedGetVoiceSign: GetVoiceSign = (params) => Promise.reject('unimplemented method GetVoiceSign')\n\nexport type LiveBuiltInData<KeyframesSnapshot> = {\n selfInfo?: UserInfo\n userList?: UserInfo[]\n roomInfo?: RoomInfo\n rtcInfo?: { voiceId: string; type: RTCType }\n keyframes: Partial<KeyframesSnapshot>\n}\n\nconst createLiveMsg = (\n command: Command,\n data: Record<string, any> = {},\n toUserIds: string | string[] = [],\n): ReqLiveMsg => ({\n command,\n front_request_id: uuid(),\n data: {\n ...data,\n to_user_ids: Array.isArray(toUserIds) ? toUserIds : [toUserIds],\n },\n})\n\nexport const _clearLiveInstanceIfNeed = () => {\n if ((window as any)?.__Realsee_Live__) {\n ;(window as any)?.__Realsee_Live__?.dispose?.()\n ;(window as any).__Realsee_Live__ = null\n }\n}\n\nexport class Live<KeyframesSnapshot extends Record<string, any>> extends Subscribe<EventType<KeyframesSnapshot>> {\n /**\n * 带看的配置\n */\n private _options: LiveOptions = {}\n\n get options(): LiveOptions {\n return Object.freeze(this._options || {})\n }\n\n /**\n * 带看状态\n */\n get state() {\n return this._controller.state\n }\n\n /**\n * 兼容老逻辑\n * @deprecated 请直接读取 state 属性字段,未来将移除该属性\n */\n get readyState() {\n return this._controller.state\n }\n\n /**\n * 获取当前WebSocket连接的URL。(注意:这个是WebSocket连接的完整连接,附带一些query参数)。\n * @deprecated 带看不需要关注底层ws的相关信息,未来将移除\n */\n get url(): string | undefined {\n return this.options.url\n }\n\n /**\n * 获取当前live使用的RTC实例\n */\n get $RTC(): RTCProtocol {\n return this._options.rtc!\n }\n\n /**\n * 获取当前live使用的jsBridge实例\n */\n get jsBridge(): JSBridgeProtocol {\n return this._options.jsBridge!\n }\n\n /**\n * 帧数据监听\n */\n keyframes: Subscribe<KeyframeTypes<KeyframesSnapshot>> = new Subscribe()\n\n /**\n * 内置的一些数据\n */\n private _buildInData: LiveBuiltInData<KeyframesSnapshot> = {\n keyframes: {},\n }\n\n /**\n * 当前帧数据快照\n */\n get snapshot(): Partial<KeyframesSnapshot> {\n return this._buildInData.keyframes\n }\n\n /**\n * 根据键值取帧数据\n * @param key 帧数据的键值\n * @returns\n */\n getFramesByKey = <Key extends keyof KeyframesSnapshot>(key: Key): Partial<KeyframesSnapshot>[Key] | undefined =>\n this.snapshot[key]\n\n /**\n * 发送帧数据(需要能够被序列化)\n * @param key 帧数据键值\n * @param frame 帧数据本体\n * @returns\n */\n sendKeyframe = <Key extends keyof KeyframesSnapshot>(key: Key, frame: KeyframesSnapshot[Key]): boolean | Error => {\n if (this.state !== LiveState.OPEN) return false\n this._buildInData.keyframes = {\n ...this._buildInData.keyframes,\n [key]: frame,\n }\n const liveMsg = createLiveMsg(Command.KeyframeSync, this.snapshot)\n try {\n this._controller.sendMessage(liveMsg)\n return true\n } catch (e) {\n logger.error(e)\n return false\n }\n }\n\n /**\n * 当前用户信息\n */\n get selfInfo() {\n return this._buildInData.selfInfo\n }\n\n /**\n * 当前用户列表\n */\n get userList() {\n return this._buildInData.userList || []\n }\n\n /**\n * 当前带看房间信息\n */\n get roomInfo() {\n return this._buildInData.roomInfo\n }\n\n /**\n * 带看控制器\n */\n private _controller: LiveController = new LiveController()\n\n constructor(opts: LiveOptions) {\n super()\n this._addLiveControllerEventListeners()\n this._options = Object.assign({ initialMicroStatus: MicroStatus.OPEN }, opts)\n // 第一步检查jsbridge\n this._options.jsBridge = (() => {\n if (opts.jsBridge) return opts.jsBridge\n if (opts.useBuiltInJsBridge) return new JSBridge()\n return undefined\n })()\n\n // 第二步检查getVoiceSign\n this._options.getVoiceSign = opts.getVoiceSign ?? unimplementedGetVoiceSign\n this._options.autoPlayConfirm = opts.autoPlayConfirm\n\n // 第二步检查rtc\n this._options.rtc = (() => {\n // 优先取rtc实例\n if (opts.rtc) return opts.rtc\n // 取指定的内部rtc类型\n if (opts.rtcType) {\n if (!opts.getVoiceSign) {\n logger.error('GetVoiceSign method must be passed when using built-in RTC instances')\n }\n switch (opts.rtcType) {\n case RTCType.RealseeVRWebViewRTC: {\n // 内置的 VRWebViewRTC\n if (this._options.jsBridge) {\n return new VRWebViewRTC({\n jsBridge: this._options.jsBridge,\n getVoiceSign: this._options.getVoiceSign,\n })\n } else {\n logger.error('JsBridge instance must be passed when using built-in VRWebViewRTC instances')\n return undefined\n }\n }\n case RTCType.RealseeBrowserChimeRTC: {\n // 内置的 RealseeBrowserChimeRTC\n return new BrowserRTC4Chime({\n getVoiceSign: this._options.getVoiceSign,\n logLevel: opts.__debug__ ? LogLevel.DEBUG : LogLevel.INFO,\n })\n }\n case RTCType.RealseeBrowserRTC: {\n // 内置的 RealseeBrowserRTC\n if (!this._options.autoPlayConfirm) {\n logger.error('autoPlayConfirm method must be passed when using built-in RealseeBrowserRTC instances')\n }\n return new BrowserRTC({\n getVoiceSign: this._options.getVoiceSign,\n autoPlayConfirm: this._options.autoPlayConfirm,\n })\n }\n default: {\n logger.error('unknown built-in RTC type')\n return undefined\n }\n }\n }\n // 都不满足时取内置\n if (opts.useBuiltInRTC) {\n if (!opts.getVoiceSign) {\n logger.error('GetVoiceSign method must be passed when using built-in RTC instances')\n }\n if (this._options.jsBridge) {\n if ((isRealseeVRWebview && (isAndroid || isIOS)) || isWxMiniProgram) {\n return new VRWebViewRTC({\n jsBridge: this._options.jsBridge,\n getVoiceSign: this._options.getVoiceSign,\n })\n } else {\n // 其它终端使用\n return opts.builtInRTCType === BuiltInRTCType.RealseeXChimeRTC\n ? new BrowserRTC4Chime({\n getVoiceSign: this._options.getVoiceSign,\n })\n : new BrowserRTC({\n getVoiceSign: this._options.getVoiceSign,\n autoPlayConfirm: this._options.autoPlayConfirm,\n })\n }\n } else {\n logger.error('jsBridge instance must be passed when using built-in RTC instances')\n return undefined\n }\n }\n return undefined\n })()\n\n if (!this._options.rtc) {\n logger.warn('unused rtc')\n }\n\n // 第三步进行自动连接\n if (this._options.url && this._options.getTicket) {\n this.connect()\n }\n\n if (this._options.__debug__) {\n Object.assign(window, { $liveController: this._controller, $live: this })\n }\n }\n\n /**\n * 添加带看控制的事件监听\n */\n private _addLiveControllerEventListeners = () => {\n this._controller.on('stateChange', this._handleStateChange)\n this._controller.on('message', this._handleMessage)\n }\n\n /**\n * 移除带看控制的事件监听\n */\n private _removeLiveControllerEventListeners = () => {\n this._controller.off('stateChange', this._handleStateChange)\n this._controller.off('message', this._handleMessage)\n }\n\n /**\n * 带看状态变化\n * @param state\n * @returns\n */\n private _handleStateChange = (state: LiveState, prevState: LiveState) => this.emit('stateChange', state, prevState)\n\n /**\n * 消息接收\n * @param liveMsg\n */\n private _handleMessage = async (liveMsg: LiveMsg) => {\n if (typeof liveMsg === 'object') {\n const { command, data = {}, frontRequestId, code, message } = liveMsg\n if (code === 'SUCCESS') {\n switch (command) {\n /**\n * 自己的状态变化\n */\n case Command.SelfUserInfo: {\n const selfInfo = data as UserInfo\n if (!equal(this.selfInfo, selfInfo, { deep: true })) {\n this._buildInData.selfInfo = selfInfo\n this.emit('selfInfoUpdate', this._buildInData.selfInfo, frontRequestId)\n }\n break\n }\n\n /**\n * 房间信息变化\n */\n case Command.RoomInfo: {\n const roomInfo = data as RoomInfo\n this._buildInData.roomInfo = Object.assign({}, roomInfo)\n this.emit('readyKeyframeSync', (roomInfo.last_frame || {}) as Partial<KeyframesSnapshot>)\n break\n }\n\n /**\n * 语音信息变化\n */\n case Command.RTCInfo: {\n const { voice_id: voiceId, type } = data as {\n voice_id: string\n type: RTCType\n }\n this._buildInData.rtcInfo = { voiceId, type }\n if (!this.$RTC?.joined) {\n const result = await this.$RTC?.join({\n voiceId,\n userId: this.selfInfo?.id || '',\n roomId: this.roomInfo?.info.room_code,\n type,\n })\n if (result) {\n const status = this._options.initialMicroStatus ?? MicroStatus.OPEN\n await this.toggleMicro(status === MicroStatus.OPEN)\n } else {\n logger.error('加入语音房间失败')\n }\n } else {\n logger.warn('已加入语音房间,无需重复加入!')\n }\n break\n }\n\n /**\n * 房间用户列表变化\n */\n case Command.UserList: {\n const userList = data as UserInfo[]\n this._buildInData.userList = userList\n this.emit('userListUpdate', this.userList, frontRequestId)\n break\n }\n\n /**\n * 自定义事件广播\n */\n case Command.CustomEvent: {\n const evtMsg = data as Record<string, any>\n this.emit('broadcast', evtMsg, frontRequestId)\n break\n }\n\n /**\n * 帧数据同步\n */\n case Command.KeyframeSync: {\n const remoteKeyframes = data as Partial<KeyframesSnapshot>\n // 此处做一层 diff,仅跟本地数据不一致的情况下才广播数据。\n const keyframes: Partial<KeyframesSnapshot> = Object.keys(remoteKeyframes).reduce(\n (accu: Partial<KeyframesSnapshot>, curr: keyof KeyframesSnapshot) => {\n if (\n equal(remoteKeyframes[curr], this._buildInData.keyframes[curr], {\n deep: true,\n })\n ) {\n return accu\n }\n const params = [remoteKeyframes[curr], this._buildInData.keyframes[curr], frontRequestId]\n const evtName = curr as unknown as keyof KeyframeTypes<KeyframesSnapshot>\n this.keyframes.emit(\n evtName,\n ...(params as Parameters<KeyframeTypes<KeyframesSnapshot>[keyof KeyframeTypes<KeyframesSnapshot>]>),\n )\n this._buildInData.keyframes[curr] = remoteKeyframes[curr]\n accu[curr] = remoteKeyframes[curr]\n return accu\n },\n {} as Partial<KeyframesSnapshot>,\n )\n\n this.emit('keyframes', keyframes, frontRequestId)\n break\n }\n\n /**\n * 内置消息\n */\n case Command.BuiltinMsg: {\n const builtinMsg = data as BuiltinMsg\n this.emit('builtinEvent', builtinMsg)\n\n if (builtinMsg.event_type === BuiltinEventType.UserChange) {\n this.emit('userChange', builtinMsg)\n }\n\n if (builtinMsg.event_type === BuiltinEventType.RoomChange) {\n this.emit('roomChange', builtinMsg)\n }\n /**\n * 下发指令自己操作麦克风\n */\n if (\n builtinMsg.event_type === BuiltinEventType.UserChange &&\n builtinMsg.action === BuiltinActionType.UserMicroStatus\n ) {\n await this.toggleMicro(builtinMsg.data.status === MicroStatus.OPEN)\n }\n\n /**\n * 如果下发指令退出房间,则 关闭麦克风 及 销毁 WebSocket\n */\n if (\n builtinMsg.event_type === BuiltinEventType.RoomChange &&\n builtinMsg.action === BuiltinActionType.RoomClose\n ) {\n await this.exit()\n }\n break\n }\n /**\n * 被踢出房间\n */\n case Command.UserKickOut: {\n this.emit('kickOut')\n break\n }\n /**\n * 其它未知广播\n */\n default: {\n console.warn('unknown command: ', command)\n }\n }\n } else {\n this.emit('error', liveMsg)\n }\n }\n }\n\n /**\n * 清理带看缓存的数据\n */\n private _clearLiveData = () => {\n this._buildInData = { keyframes: {} }\n }\n\n /**\n * 连接带看\n * @param options\n * @returns\n */\n connect = async (options: LiveConnectOptions = {}) => {\n // 检查 url 和 票据获取接口实现\n this._options.url = options.url ?? this._options.url ?? ''\n this._options.getTicket = options.getTicket ?? this._options.getTicket\n this._options.initialMicroStatus = options.rtcMicStatus ?? this._options.initialMicroStatus\n\n if (!/^ws(s):\\/\\//.test(this._options.url!) || typeof this._options.getTicket !== 'function') {\n if (!/^ws(s):\\/\\//.test(this._options.url!)) {\n return new Error('Illegal realsee live room link')\n }\n if (typeof this._options.getTicket !== 'function') {\n return new Error('getTicket muse be function')\n }\n return false\n }\n\n const { force = false } = options\n\n // 检测一下麦克风权限,hack\n if (this._options.rtc) {\n const res = await this._options.rtc.detectMicro()\n if (!res) {\n return new Error('Failed to obtain microphone authorization')\n }\n }\n\n // 检查是否已有实例在使用\n const currentState = this.state\n if (currentState === LiveState.CONNECTING || currentState === LiveState.OPEN) {\n if (force) {\n try {\n await this._controller.close('force close by connect')\n } catch (e) {\n console.warn(e)\n }\n } else {\n return new Error('已有Live实例正在连接中,请勿重复连接!')\n }\n }\n\n // 建立连接\n this._clearLiveData()\n const url = appendUri(this._options.url!, {\n ticket: await this._options.getTicket(),\n force: Number(!!force),\n })\n this._controller.open(url)\n return true\n }\n\n /**\n * 退出带看\n * @returns\n */\n exit = async () => {\n this._clearLiveData()\n try {\n /** 退出强制关闭语音 */\n await this.$RTC?.quit()\n } catch (e) {\n logger.warn(e)\n }\n if (this.state !== LiveState.OPEN) return true\n return await this._controller.close()\n }\n\n /**\n * 关闭带看房间\n * @param code\n * @param reason\n * @returns\n */\n close = async () => {\n await this._controller.readyClose()\n await this.updateStatus(BuiltinEventType.RoomChange, BuiltinActionType.RoomClose, {})\n }\n\n /**\n * 销毁带看\n * @returns\n */\n dispose = async () => {\n this._removeLiveControllerEventListeners()\n this._clearLiveData()\n return await this._controller.dispose()\n }\n\n /**\n * 修改状态\n * @param evtType\n * @param atnType\n * @param status\n * @param toUserIds\n * @returns\n */\n async updateStatus(\n evtType: BuiltinEventType,\n atnType: BuiltinActionType,\n status: Record<string, any>,\n toUserIds?: string | string[],\n ) {\n if (this.state !== LiveState.OPEN) return false\n const data = Object.assign({ event_type: evtType, action: atnType }, { data: status })\n const liveMsg = createLiveMsg(Command.BuiltinMsg, data, toUserIds)\n try {\n this._controller.sendMessage(liveMsg)\n return true\n } catch (e) {\n logger.error(e)\n return false\n }\n }\n\n /**\n * 设置自己的用户信息\n * @param userInfo\n * @returns\n */\n setSelfInfo = async (userInfo: Partial<UserInfo>) =>\n await this.updateStatus(BuiltinEventType.UserChange, BuiltinActionType.UserInfo, userInfo)\n\n /**\n * 自定义广播\n * @param request 广播请求的数据\n * @param toUserIds\n * @param timeout\n * @returns\n */\n broadcast<Request extends Record<string, any>, Response>(\n request: Request,\n toUserIds: string | string[],\n timeout: number,\n ): Promise<Response> | Error | false {\n if (this.state !== LiveState.OPEN) return false\n return new Promise((resolve, reject) => {\n const customEvent = createLiveMsg(Command.CustomEvent, request, toUserIds)\n const front_request_id = customEvent.front_request_id\n\n const timeoutId = timeout\n ? setTimeout(() => {\n reject(new Error('RESPONSE TIMEOUT'))\n this.off('broadcast', broadcastRes)\n }, timeout)\n : undefined\n\n const broadcastRes = (data: Record<string, any>, frontRequestId: string) => {\n if (frontRequestId !== front_request_id) return\n if (timeoutId) clearTimeout(timeoutId)\n this.off('broadcast', broadcastRes)\n resolve(data as Response)\n }\n\n this.on('broadcast', broadcastRes)\n\n try {\n this._controller.sendMessage(customEvent)\n } catch (e) {\n reject(e)\n }\n })\n }\n\n // 仅用于用户自己的麦克风控制\n toggleMicro = async (microStatus: boolean) => {\n if (!this.selfInfo?.permission?.control_own_micro) return false\n\n const result = await this.$RTC?.toggleMicro(microStatus)\n if (result) {\n await this.updateStatus(\n BuiltinEventType.UserChange,\n BuiltinActionType.UserMicroStatus,\n {\n status: microStatus ? MicroStatus.OPEN : MicroStatus.CLOSE,\n },\n [],\n )\n }\n\n return result\n }\n\n /**\n * 控制别人的麦\n * @param microStatus\n * @param toUserIds\n * @returns\n */\n forbidMicro = async (microStatus: MicroStatus, toUserIds: string | string[]) => {\n if (typeof this._options.canForbidUserMicro === 'function' && !this._options.canForbidUserMicro(toUserIds)) {\n return false\n }\n\n if (!this.selfInfo?.permission?.control_other_micro) {\n return false\n }\n\n return await this.updateStatus(\n BuiltinEventType.UserChange,\n BuiltinActionType.UserMicroStatus,\n {\n status: microStatus,\n },\n toUserIds,\n )\n }\n\n /**\n * 控制别人的同步全量帧数据权限\n * @param sync\n * @param toUserIds\n * @returns\n */\n forbidSync = async (sync: boolean, toUserIds: string | string[]) => {\n if (typeof this._options.canForbidUserSync === 'function' && !this._options.canForbidUserSync(toUserIds)) {\n return false\n }\n\n if (!this.selfInfo?.permission?.control_other_sync) {\n return false\n }\n\n return await this.updateStatus(\n BuiltinEventType.UserChange,\n BuiltinActionType.UserPermission,\n { sync_frame: sync },\n toUserIds,\n )\n }\n\n /**\n * 把用户踢出带看\n * @param toUserIds\n * @returns\n */\n kick = async (toUserIds: string | string[]) => {\n if (typeof this._options.canForbidUserKick === 'function' && !this._options.canForbidUserKick(toUserIds)) {\n return false\n }\n\n if (!this.selfInfo?.permission?.change_other_status) {\n return false\n }\n\n return await this.updateStatus(\n BuiltinEventType.UserChange,\n BuiltinActionType.UserStatus,\n {\n status: 'KICK_OUT',\n },\n toUserIds,\n )\n }\n}\n","// import { Live } from '../typings/live/Live';\nimport { LiveOptions } from '../typings/live/LiveOptions';\nimport { Live, _clearLiveInstanceIfNeed } from './live';\n\n/**\n * 创建`Live`实例\n * @param opts\n * @returns\n */\nexport const createLive = <KeyframesSnapshot extends Record<string, any>>(\n opts: LiveOptions,\n): Live<KeyframesSnapshot> => {\n _clearLiveInstanceIfNeed();\n return new Live<KeyframesSnapshot>(opts);\n};\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React, { useCallback } from 'react';\nimport { createContext } from 'react';\nimport {\n BuiltinActionType,\n BuiltinEventType,\n KeyframeTypes,\n LiveConnectOptions,\n LiveEventType,\n LiveOptions,\n MicroStatus,\n RTCEventType,\n RTCType,\n UserInfo,\n} from '../typings';\nimport { LiveState } from '../typings/live/LiveState';\nimport { createLive } from './createLive';\nimport { Live } from './live';\n\nexport type LiveProviderPropTypes<\n KeyframesSnapshot extends Record<string, any>,\n> = {\n children?: React.ReactNode;\n live?: Live<KeyframesSnapshot>;\n};\n\n/**\n * 创建 {@link LiveReact} 实例,并提供 `React` 技术栈相关工具链。\n */\nexport function createLiveReact<KeyframesSnapshot extends Record<string, any>>(\n options: LiveOptions,\n) {\n const LiveContext = createContext<Live<KeyframesSnapshot> | null>(null);\n const live = createLive<KeyframesSnapshot>(options);\n const jsBridge = live.jsBridge;\n\n const LiveProvider = (props: LiveProviderPropTypes<KeyframesSnapshot>) => (\n <LiveContext.Provider value={live}>{props.children}</LiveContext.Provider>\n );\n\n /**\n * 使用live实例\n * @returns\n */\n const useLiveInstance = () => {\n const context = React.useContext(LiveContext);\n if (!context) throw new Error('LiveProvider never found.');\n return context;\n };\n\n /**\n * 不建议这样使用\n * @deprecated\n * @returns\n */\n const unsafe__useLiveInstance = () => live;\n\n /**\n * 使用rtc实例\n */\n const useRTCInstance = () => live.$RTC;\n\n /**\n * 不建议这样使用\n * @deprecated\n * @returns\n */\n const unsafe__useRTCInstance = () => useRTCInstance();\n\n /**\n * 带看连接操作\n */\n const useConnect = () => async (options: LiveConnectOptions) =>\n await live.connect(options);\n\n /**\n *\n * @param name\n * @param callback\n * @param deps\n * @returns\n */\n function useKeyframeUpdateCallback<\n KeyOfKeyframe extends keyof KeyframeTypes<KeyframesSnapshot>,\n >(\n key: KeyOfKeyframe,\n callback: (\n ...args: Parameters<KeyframeTypes<KeyframesSnapshot>[KeyOfKeyframe]>\n ) => ReturnType<KeyframeTypes<KeyframesSnapshot>[KeyOfKeyframe]>,\n deps: React.DependencyList = [],\n ) {\n const live = useLiveInstance();\n const dependencyList: React.DependencyList = [live, name, ...deps];\n const dispose = () => live.keyframes.off(key, callback);\n React.useEffect(() => {\n live.keyframes.on(key, callback);\n return dispose;\n }, dependencyList);\n\n return dispose;\n }\n\n /**\n * 带看的一些操作\n * @returns\n */\n function useLiveAction() {\n const live = useLiveInstance();\n\n const connect = async (options: LiveConnectOptions) =>\n await live.connect(options);\n\n const toggleMicro = (microStatus: boolean) => live.toggleMicro(microStatus);\n\n const broadcast = async (\n data: Record<string, any>,\n toUserIds: string | string[],\n timeout = 0,\n ) => await live.broadcast(data, toUserIds, timeout);\n\n const exit = async () => await live.exit();\n\n const kick = async (toUserIds: string | string[]) =>\n await live.kick(toUserIds);\n\n const forbidMicro = async (\n micro: MicroStatus,\n toUserIds: string | string[] = [],\n ) => await live.forbidMicro(micro, toUserIds);\n\n const forbidSync = (sync: boolean, toUserIds: string | string[] = []) =>\n live.forbidSync(sync, toUserIds);\n\n const getFramesByKey = (key: keyof KeyframesSnapshot) =>\n live.getFramesByKey(key);\n\n const sendKeyframe = (\n key: keyof KeyframesSnapshot,\n frame: KeyframesSnapshot[keyof KeyframesSnapshot],\n ) => live.sendKeyframe(key, frame);\n\n const setSelfInfo = (userInfo: Partial<UserInfo>) =>\n live.setSelfInfo(userInfo);\n\n const updateStatus = (\n evtType: BuiltinEventType,\n atnType: BuiltinActionType,\n status: Record<string, any>,\n toUserIds?: string | string[],\n ) => live.updateStatus(evtType, atnType, status, toUserIds);\n\n return {\n connect,\n broadcast,\n exit,\n kick,\n toggleMicro,\n forbidMicro,\n forbidSync,\n sendKeyframe,\n getFramesByKey,\n setSelfInfo,\n updateStatus,\n };\n }\n\n function useKeyframe<K extends keyof KeyframesSnapshot>(key: K) {\n const live = useLiveInstance();\n const [state, updateState] = React.useState<\n KeyframesSnapshot[K] | undefined\n >(live.getFramesByKey(key));\n\n React.useEffect(() => {\n const onUpdate = (nextKeyframes: KeyframesSnapshot[K]) =>\n updateState(nextKeyframes);\n\n const evtName = key as unknown as keyof KeyframeTypes<KeyframesSnapshot>;\n const callback = onUpdate as unknown as (\n ...args: Parameters<\n KeyframeTypes<KeyframesSnapshot>[keyof KeyframeTypes<KeyframesSnapshot>]\n >\n ) => ReturnType<\n KeyframeTypes<KeyframesSnapshot>[keyof KeyframeTypes<KeyframesSnapshot>]\n >;\n live.keyframes.on(evtName, callback);\n return () => live.keyframes.off(evtName, callback);\n }, [live]);\n\n const setState = React.useCallback(\n (frame: KeyframesSnapshot[K]) => live.sendKeyframe(key, frame),\n [live],\n );\n type CallbackType = [\n frame: KeyframesSnapshot[K] | undefined,\n setFrame: (frame: KeyframesSnapshot[K]) => boolean | Error,\n ];\n return [state, setState] as CallbackType;\n }\n\n function useLiveEventCallback<\n K extends keyof LiveEventType<KeyframesSnapshot>,\n >(\n name: K,\n callback: (\n ...args: Parameters<LiveEventType<KeyframesSnapshot>[K]>\n ) => ReturnType<LiveEventType<KeyframesSnapshot>[K]>,\n deps: React.DependencyList = [],\n ) {\n const live = useLiveInstance();\n const dispose = () => live.off(name, callback);\n const dependencyList: React.DependencyList = [live, name, ...deps];\n\n React.useEffect(() => {\n live.on(name, callback);\n return dispose;\n }, dependencyList);\n\n return dispose;\n }\n\n /**\n * 带看状态\n * @returns\n */\n function useLiveState() {\n const live = useLiveInstance();\n const [state, updateState] = React.useState<LiveState>(live.state);\n React.useEffect(() => {\n const stateChange = (state: LiveState) => updateState(state);\n live.on('stateChange', stateChange);\n return () => live.off('stateChange', stateChange);\n }, [live]);\n\n return state;\n }\n\n function useRTCAction() {\n const live = useLiveInstance();\n\n const join = (options: {\n voiceId: string;\n userId: string;\n roomId: string;\n type: RTCType;\n }) => live.$RTC.join(options);\n\n const quit = () => live.$RTC.quit();\n const shock = () => live.$RTC.shock?.();\n const toggleMicro = (flag?: boolean | undefined) =>\n live.$RTC.toggleMicro(flag);\n\n const detectMicro = () => live.$RTC.detectMicro();\n\n return {\n join,\n quit,\n shock,\n toggleMicro,\n detectMicro,\n };\n }\n\n function useRTCEventCallback<K extends keyof RTCEventType>(\n name: K,\n callback: (\n ...args: Parameters<RTCEventType[K]>\n ) => ReturnType<RTCEventType[K]>,\n deps: React.DependencyList = [],\n ) {\n const live = useLiveInstance();\n const dispose = () => live.$RTC.off(name, callback);\n const dependencyList: React.DependencyList = [live, name, ...deps];\n React.useEffect(() => {\n live.$RTC.on(name, callback);\n return dispose;\n }, dependencyList);\n\n return dispose;\n }\n\n function useSelfInfo() {\n const live = useLiveInstance();\n const [state, updateState] = React.useState<Partial<UserInfo>>(\n live.selfInfo || {},\n );\n\n const selfInfoUpdate = (userInfo: Partial<UserInfo>) =>\n updateState(userInfo);\n\n React.useEffect(() => {\n live.on('selfInfoUpdate', selfInfoUpdate);\n return () => live.off('selfInfoUpdate', selfInfoUpdate);\n }, [live]);\n\n const setState = React.useCallback(\n async (userInfo: Partial<UserInfo>) => {\n return await live.setSelfInfo(userInfo);\n },\n [live],\n );\n\n type CallbackType = [\n Partial<UserInfo>,\n (userInfo: Partial<UserInfo>) => Promise<boolean | Error>,\n ];\n return [state, setState] as CallbackType;\n }\n\n function useKeyframesSnapshot() {\n const live = useLiveInstance();\n const [state, setState] = React.useState<Partial<KeyframesSnapshot>>(\n live.snapshot,\n );\n\n React.useEffect(() => {\n const onKeyframes = (keyframes: Partial<KeyframesSnapshot>) =>\n setState(keyframes);\n live.on('keyframes', onKeyframes);\n return () => live.off('keyframes', onKeyframes);\n });\n\n return state;\n }\n function useUserList() {\n const live = useLiveInstance();\n const [state, updateState] = React.useState<UserInfo[]>(live.userList);\n\n const userListUpdate = (userList: UserInfo[]) => updateState(userList);\n\n React.useEffect(() => {\n live.on('userListUpdate', userListUpdate);\n return () => live.off('userListUpdate', userListUpdate);\n }, [live]);\n\n return state;\n }\n\n return {\n live,\n jsBridge,\n LiveProvider,\n unsafe__useLiveInstance,\n unsafe__useRTCInstance,\n useConnect,\n useKeyframe,\n useKeyframeUpdateCallback,\n useLiveAction,\n useLiveEventCallback,\n useLiveState,\n useRTCAction,\n useRTCEventCallback,\n useSelfInfo,\n useKeyframesSnapshot,\n useUserList,\n };\n}\n"],"names":["EVENT_SYMBOL","__generateEventIfNotExisted","instance","__removeEventIfNotExisted","Subscribe","name","events","callback","once","index","data","canceled","event","one","result","CoreRTC","RTCType","BuiltInRTCType","getTime","date","year","month","day","hour","min","sec","ms","echo","logLevel","args","log","info","error","warn","logger","logger$1","S4","uuid","BrowserRTC","options","__publicField","TRTC","createClientOptions","_a","resolve","remoteStream","domId","dom","onConfirm","_b","rule","e","flag","_d","_c","userId","audioVolume","BrowserRTC4Chime","freshAudioInputDeviceList","mediaDeviceInfo","freshAudioOutputDeviceList","device","muteState","sessionStatus","reconnecting","activeStream","_play","inactiveStream","presentAttendeeId","roster","getUserVolumes","v","k","present","externalUserId","attendeeId","volume","muted","signalStrength","DefaultModality","_e","_f","ConsoleLogger","LogLevel","DefaultDeviceController","success","fail","sdkAppId","roomId","userSig","attendence","vendor_wrapper","configuration","MeetingSessionConfiguration","DefaultMeetingSession","observer","audioInputDevices","audioInputDeviceId","audioOutputDevices","audioOutputDeviceId","sessionStatusCode","MeetingSessionStatusCode","RTCJoinedInfoCodeEnum","VRWebViewRTC","jsBridge","getVoiceSign","userVolumes","weakNetwork","res","Command","BuiltinEventType","BuiltinActionType","MicroStatus","parseLiveMsg","jsonTxt","msg","resMsg","undefinedKeys","key","LiveState","UserStatus","MemUserStatus","WebSocketState","WebSocketErrorType","WebSocketCloseError","parseWSClsErr","code","exports","appendUri","uri","query","hasQuery","newQuery","accu","curr","idx","userAgent","isAndroid","isIOS","isWxMiniProgram","isRealseeVRWebview","isTrulyObject","value","baseIsEqual","other","objEqualShallow","valueProps","otherProps","i","len","propName","arrayEqualShallow","isShallowEqual","isDeepEqual","objEqualDeep","arrayEqualDeep","equal","opt","RobustWebSocket","ws","reason","url","newUrl","timeoutCallback","reconnects","attempts","opts","delay","LiveController","message","state","prevState","unimplementedGetVoiceSign","params","createLiveMsg","command","toUserIds","_clearLiveInstanceIfNeed","Live","frame","liveMsg","frontRequestId","selfInfo","roomInfo","voiceId","type","status","userList","evtMsg","remoteKeyframes","keyframes","evtName","builtinMsg","force","currentState","userInfo","microStatus","sync","JSBridge","evtType","atnType","request","timeout","reject","customEvent","front_request_id","timeoutId","broadcastRes","createLive","f","require$$0","l","m","p","q","c","a","g","b","d","h","reactJsxRuntime_production_min","React","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","maybeIterator","ReactSharedInternals","format","_len2","_key2","printWarning","level","ReactDebugCurrentFrame","stack","argsWithFormat","item","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","isValidElementType","getWrappedName","outerType","innerType","wrapperName","displayName","functionName","getContextName","getComponentNameFromType","context","provider","outerName","lazyComponent","payload","init","x","assign","disabledDepth","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","disabledLog","disableLogs","props","reenableLogs","ReactCurrentDispatcher","prefix","describeBuiltInComponentFrame","source","ownerFn","match","reentry","componentFrameCache","PossiblyWeakMap","describeNativeComponentFrame","fn","construct","control","previousPrepareStackTrace","previousDispatcher","Fake","sample","sampleLines","controlLines","s","_frame","syntheticFrame","describeFunctionComponentFrame","shouldConstruct","Component","prototype","describeUnknownElementTypeFrameInDEV","hasOwnProperty","loggedTypeFailures","setCurrentlyValidatingElement","element","owner","checkPropTypes","typeSpecs","values","location","componentName","has","typeSpecName","error$1","err","ex","isArrayImpl","isArray","typeName","hasToStringTag","willCoercionThrow","testStringCoercion","checkKeyStringCoercion","ReactCurrentOwner","RESERVED_PROPS","specialPropKeyWarningShown","specialPropRefWarningShown","didWarnAboutStringRefs","hasValidRef","config","getter","hasValidKey","warnIfStringRefCannotBeAutoConverted","self","defineKeyPropWarningGetter","warnAboutAccessingKey","defineRefPropWarningGetter","warnAboutAccessingRef","ReactElement","ref","jsxDEV","maybeKey","defaultProps","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","propTypesMisspellWarningShown","isValidElement","object","getDeclarationErrorAddendum","getSourceInfoErrorAddendum","fileName","lineNumber","ownerHasKeyUseWarning","getCurrentComponentErrorInfo","parentType","parentName","validateExplicitKey","currentComponentErrorInfo","childOwner","validateChildKeys","node","child","iteratorFn","iterator","step","validatePropTypes","propTypes","_name","validateFragmentProps","fragment","keys","jsxWithValidation","isStaticChildren","validType","sourceInfo","typeString","children","jsxWithValidationStatic","jsxWithValidationDynamic","jsx","jsxs","reactJsxRuntime_development","module","require$$1","createLiveReact","LiveContext","createContext","live","LiveProvider","useLiveInstance","unsafe__useLiveInstance","useRTCInstance","unsafe__useRTCInstance","useConnect","useKeyframeUpdateCallback","deps","dependencyList","dispose","useLiveAction","micro","useKeyframe","updateState","onUpdate","nextKeyframes","setState","useLiveEventCallback","useLiveState","stateChange","useRTCAction","useRTCEventCallback","useSelfInfo","selfInfoUpdate","useKeyframesSnapshot","onKeyframes","useUserList","userListUpdate"],"mappings":"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","x_google_ignoreList":[13,21,22,23]}