usc-rtc-client 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Readme.md ADDED
@@ -0,0 +1,283 @@
1
+ ## 音视频通话 webrtc sdk开发手册
2
+
3
+ ### 1.安装
4
+ ```
5
+ //使用yarn安装
6
+ yarn add usc-rtc-client
7
+ //使用npm安装
8
+ npm install usc-rtc-client
9
+ ```
10
+ ### 2.简单使用demo
11
+ ```javascript
12
+ //用户A,演示主叫端的逻辑
13
+ import { RtcClient, createRtcClient, RtcSessionEvent, RtcClientEvent } from "usc-rtc-client"
14
+ const startClientA = async () => {
15
+ //初始化一个webrtc的sdk客户端,这里的本地号码是7001,server对应的是信令服务器地址由线下对接进行提供
16
+ let client = await createRtcClient({ server: "xxxxxxx", localNumber: "7001" })
17
+ //创建一个针对于7002的视频会话
18
+ let session = client.createSession("7002")
19
+ //这里演示给会话注册一个接受到远端视频流的事件监听
20
+ session.on(RtcSessionEvent.stream, (data) => {
21
+ //data 的stream 属性就是视频流信息,你可以像下面这样把他放到一个视频容器下进行播放
22
+ let playerContainer = document.getElementById("player")
23
+ playerContainer.srcObject = data.stream
24
+ playerContainer.play()
25
+ })
26
+ //给会话注册断开事件,
27
+ session.on(RtcSessionEvent.bye, () => alert("BYE!!!!!!"))
28
+ //给会话选择本端所提供的流,这里使用的是摄像头的流信息
29
+ await session.useDefaultDevice(document.getElementById("localPalyer") as HTMLVideoElement)
30
+ //开始呼叫
31
+ session.start()
32
+ }
33
+ startClientA()
34
+
35
+
36
+ //====================================
37
+ //用户B,演示被叫端的逻辑
38
+ const startClientB = async (client: RtcClient) => {
39
+ //初始化一个webrtc的sdk客户端,这里的本地号码是7021,server对应的是信令服务器地址由线下对接进行提供
40
+ let client = await createRtcClient({ server: "xxxxxxx", localNumber: "7002" })
41
+ //给客户端注册一个接收到视频通话邀请的事件监听
42
+ client.on(RtcClientEvent.invite, async (session) => {
43
+ //注册接受到远端流信息的事件监听
44
+ session.on(RtcSessionEvent.stream, (data: any) => {
45
+ //播放流信息的代码,如上面的主叫端一样
46
+ })
47
+ ////给会话注册断开事件,
48
+ session.on(RtcSessionEvent.bye, () => alert("BYE!!!!!!"))
49
+ //给会话选择本端所提供的流,这里使用的是摄像头的流信息
50
+ await session.useDefaultDevice(document.getElementById("localPalyer") as HTMLVideoElement);
51
+ //接受会话
52
+ await session.acceptCall();
53
+ })
54
+ }
55
+ startClientB()
56
+
57
+ ```
58
+
59
+ ### 3.sdk说明
60
+ 此项目为typescript项目,按照npm的约定生成了type描述文件,具体api说明请在type描述文件中进行查看,以下是一些重要的Api说明:
61
+ #### 1.createRtcClient
62
+ 此方法用来创建一个webrtc的终端,内部已经封装了心跳,信令交互,以及视频处理的逻辑,api描述如下:
63
+ ```javascript
64
+ declare const createRtcClient: (config: {
65
+ server: string; //信令服务器的地址
66
+ localNumber: string; //自己的号码
67
+ heartTime?: number; //向信令服务器的发送心跳的间隔时间,默认是30s
68
+ expireTime?: number; //注册信令的过期时间,默认是60s
69
+ }) => Promise<RtcClient>; //注意,这里返回的是Promise的对象,resolve前置是在创建websocket链接之后发送一次心跳信息,等待服务器返回确认信息
70
+ ```
71
+ 使用事例:
72
+ ```javascript
73
+ import { createRtcClient } from "usc-rtc-client"
74
+ let client = await createRtcClient({server:"wss://xxxxxx.com/",localNumber:"7001"})
75
+ ```
76
+
77
+ #### 2.RtcClient
78
+ RtcClient是用来实例化webrtc终端的对象,内部主要方法如下
79
+ - createSession(remoteNumber?: string): RtcSession 用来来创建一个会话
80
+ - destory() 销毁客户端,会销毁所有创建的会话以及断开与信令服务器的链接,与信令服务器断开链接之后也会自动触发此方法
81
+ - reConnect() 重新连接信令服务器,如果之前处于连接状态会自动调用destory的方法
82
+ - on(event:RtcClientEvent,cb:Function) 注册相关监听事件
83
+ - sendPttMessage() 此方法是后续添加,是用来发送ptt消息,消息具体格式请参考ptt对讲以及ims开发文档
84
+
85
+ 事例代码:
86
+ ```javascript
87
+ import { createRtcClient,RtcClientEvent,RtcSession,RtcCalledSession } from "usc-rtc-client"
88
+ let client = await createRtcClient({server:"wss://xxxxxx.com/",localNumber:"7001"})
89
+ let session:RtcSession = client.createSession("7002")
90
+ client.on(RtcClientEvent.invite,(calledSession:RtcCalledSession)=>{})
91
+ ```
92
+
93
+ #### 3.RtcClientEvent
94
+ RtcClientEvent 表示底层封装向上抛出的一些业务与非业务的生命周期事件,具体如下
95
+ - connected 信令服务器连接成功事件
96
+ - disconnected 信令服务器断开事件,连接失败这里也可以触发
97
+ - invite 收到音视频通话邀请的事件
98
+ - FPREInfo 收到ptt消息通知事件(目前主要为ptt组在线用户查询消息,具体格式参考ptt对讲以及ims开发文档)
99
+
100
+ 事例代码
101
+ ```javascript
102
+ import { createRtcClient , RtcClientEvent,RtcCalledSession } from "usc-rtc-client"
103
+ let client = await createRtcClient({server:"wss://xxxxxx.com/",localNumber:"7001"})
104
+
105
+ client.on(RtcClientEvent.disconnected,()=>{
106
+ console.log("socket is closed")
107
+ })
108
+
109
+ client.on(RtcClientEvent.invite,(session:RtcCalledSession)=>{
110
+ console.log("revice invite,do something plz...")
111
+ })
112
+ ```
113
+
114
+ #### 4.RtcSession
115
+ RtcSession是用来实例化RtcClient所创建的音视频会话的对象,内部主要方法如下
116
+ - addRemote(remoteNumber: string) 修改需要呼叫的用户
117
+ - rejectCall() 拒绝邀请,使用于创建会话过程中的会议类型变更
118
+ - acceptCall() 接受邀请,使用于创建会话过程中的会议类型变更
119
+ - start() 开始呼叫
120
+ - destory() 销毁会话,如果呼叫已经开始,会先向被叫端发送bye请求
121
+ - getAllInputResource() 获取所有的音视频输入源
122
+ - useDefaultDevice(container: HTMLVideoElement) 使用默认的本地音视频输入设备(麦克风与摄像头),并将本地的流媒体渲染到对应的video上(可以不传),实际上是下面几个方法的组合使用
123
+ - useAudio(deviceId) 使用对应deviceId的麦克风设备作为音频流,如果deviceId为undefined,那么使用默认的设备作为音频源
124
+ - useDeviceVideo(deviceId) 使用对应deviceid摄像头设备的视频流,如果deviceId为undefined,那么使用默认的设备作为视频源
125
+ - useDeskTopVideo() 使用桌面流作为视频流输入
126
+ - disableAudio() 禁用本地流的音频输入,本地音频静音
127
+ - disableVideo() 禁用本地流的视频输入,关闭本地视频画面
128
+ - enableAudio() 启用本地音频输入
129
+ - enableVideo() 启用本地视频输入
130
+ - renderLocalStreamToContainer(container:HTMLVideoElement|HTMLAudioElement) 将本地的流媒体使用对应的video或者audio元素进行播放
131
+ - on(event:RtcSessionEvent,cb:Function) 注册相关监听事件
132
+ - addDeviceChangeListener(listener) 注册物理输入设备变化监听事件,如摄像头拔线之类的操作
133
+ - removeDeviceChangeListener(listener) 删除物理输入设备变化监听事件(组件化的框架如react之类的,在组件销毁的时候使用这个方法进行回收)
134
+
135
+ 事例代码
136
+ ```javascript
137
+ ...
138
+ session.addRemote("7003")
139
+ await session.useDefaultDevice(document.getElementById("localplayer"))
140
+ session.start()
141
+ ```
142
+
143
+ #### 5.RtcCalledSession
144
+ RtcCalledSession是用来实例化被叫会话的对象,主要方法如下
145
+ - getRemoteNumber() 获取呼叫自己的远端号码
146
+ - rejectCall() 拒绝邀请,使用于创建会话与会话过程中的会议类型变更
147
+ - acceptCall() 接受邀请,使用于创建会话与会话过程中的会议类型变更
148
+ - destory() 销毁会话,如果呼叫已经开始,会先向被叫端发送bye请求
149
+ - getAllInputResource() 获取所有的音视频输入源
150
+ - useDefaultDevice(container: HTMLVideoElement) 使用默认的本地音视频输入设备(麦克风与摄像头),并将本地的流媒体渲染到对应的video上(可以不传),实际上是下面几个方法的组合使用
151
+ - useAudio(deviceId) 使用对应deviceId的麦克风设备作为音频流,如果deviceId为undefined,那么使用默认的设备作为音频源
152
+ - useDeviceVideo(deviceId) 使用对应deviceid摄像头设备的视频流,如果deviceId为undefined,那么使用默认的设备作为视频源
153
+ - useDeskTopVideo() 使用桌面流作为视频流输入
154
+ - disableAudio() 禁用本地流的音频输入,本地音频静音
155
+ - disableVideo() 禁用本地流的视频输入,关闭本地视频画面
156
+ - enableAudio() 启用本地音频输入
157
+ - enableVideo() 启用本地视频输入
158
+ - renderLocalStreamToContainer(container:HTMLVideoElement|HTMLAudioElement) 将本地的流媒体使用对应的video或者audio元素进行播放
159
+ - on(event:RtcSessionEvent,cb:Function) 注册相关监听事件
160
+ - addDeviceChangeListener(listener) 注册物理输入设备变化监听事件,如摄像头拔线之类的操作
161
+ - removeDeviceChangeListener(listener) 删除物理输入设备变化监听事件(组件化的框架如react之类的,在组件销毁的时候使用这个方法进行回收
162
+
163
+ 事例代码
164
+ ```javascript
165
+ ...
166
+ client.on(RtcClientEvent.invite,async (session:RtcCalledSession)=>{
167
+ await session.useDefaultDevice(document.getElementById("localplayer"))
168
+ session.acceptCall()
169
+ })
170
+ ```
171
+
172
+ #### 6.RtcSessionEvent
173
+ 会话流程事件
174
+ - bye 会话结束事件
175
+ - stream 会话收到流的事件
176
+ - localAudioChange 本地音频流设备发生了变化
177
+ - localVideoChange 本地视频流设备发生了变化
178
+ - reInvite 会话过程中修改会话类型会重新发invite 比如原先只是语音通话,然后变成视频会话
179
+ - localStreamChange 本地流发生了变化
180
+
181
+ 事例代码
182
+ ```javascript
183
+ ...
184
+ session.on(RtcSessionEvent.stream,({audioOnly,stream})=>{
185
+ if(audioOnly){
186
+ //use audio to play
187
+ }else{
188
+ let playerContainer = document.getElementById("player")
189
+ playerContainer.srcObject = data.stream
190
+ playerContainer.remoteVideoContainer.play()
191
+ }
192
+ })
193
+ ...
194
+ session.on(RtcSessionEvent.bye,()=>{
195
+ //close something
196
+ alert("bye")
197
+ })
198
+ ```
199
+
200
+ ### 4.ptt消息接口
201
+ #### 1.启用ptt客户端功能
202
+ 本客户端(webrtc)集成了ptt对讲客户端的全部接口,功能等同于usc-ptt-sdk提供的功能,若想单独使用ptt功能,可直接安装usc-ptt-sdk即可;以下是集成的功能及用法说明:
203
+ ```javascript
204
+ await createRtcClient({
205
+ server,
206
+ localNumber,
207
+ enablePtt: true, // 初始化客户端时,可传入enablePtt,true表示启用ptt客户端,不传或flase表示不使用ptt客户端,
208
+ pttServer: 'ws://localhost:40000' //pttClient服务器地址,当enablePtt为true时,需要传入该字段,否则初始化失败
209
+ })
210
+ ```
211
+
212
+ #### 2.RtcClient集成的ptt接口
213
+ 当启用ptt客户端时,ptt客户端提供的接口将可以在RtcClient上使用,接口说明如下:
214
+ joinGroup('100114','10000008003','10.168.1.17',20023) //加入对讲组
215
+ quitGroup() //退出组
216
+ talk() //说话
217
+ stop() //停止说话
218
+
219
+ 事例代码
220
+ ```javascript
221
+ const client = await createRtcClient({ server, localNumber, enablePtt: true, pttServer: 'ws://localhost:40000' })
222
+ // 加入组
223
+ client.joinGroup('100114','10000008003','10.168.1.17',20023)
224
+ //退出组
225
+ client.quitGroup()
226
+ //本客户端用户需要说话时调用(须先加入一个对讲组)
227
+ client.talk()
228
+ //停止说话
229
+ client.stop()
230
+
231
+ 以上接口只作为向服务器发送请求消息,结果将以客户端事件的形式响应给用户,开发人员只需要在初始化完客户端后监听相应的事件即可
232
+ ```
233
+ #### 3.PTTEvent
234
+ ```javascript
235
+ PTTEvent 表示底层封装向上抛出的一些业务与非业务的生命周期事件,具体如下
236
+ const clientEvent = {
237
+ ERROR:'error', //错误事件
238
+ SPEAKER:'speaker', //有用户说话或停止说话时触发该事件
239
+ TALKING:'talking', //自己说话或停止说话时触发该事件
240
+ ACTIVE_GROUP:'activeGroup', //加入组或退出组时触发该事件
241
+ JOIN_INFO:'joinInfo', //有用户加入或退出组时触发该事件
242
+ }
243
+ ```
244
+
245
+ 事例代码
246
+ ```javascript
247
+ const client = await createRtcClient({ server, localNumber, enablePtt: true, pttServer: 'ws://localhost:40000' })
248
+ client.on(PTTEvent.ACTIVE_GROUP,(e)=>{
249
+ // e为空字符串时表示当前没有加入任何组,否则e为加入的组的组id
250
+ if(e)
251
+ console.log(`进入组:${e}`)
252
+ else
253
+ console.log('退出组')
254
+ })
255
+ client.on(PTTEvent.SPEAKER,(e)=>{
256
+ // e为空字符串时表示当前没有人在说话或当前说话人停止说话,否则e为说话人的ptt号
257
+ if(e)
258
+ console.log(`${e}正在说话`)
259
+ else
260
+ console.log(`停止说话`)
261
+ })
262
+ client.on(PTTEvent.TALKING,(e)=>{
263
+ // e为true时表示当前自己在说话,否则表示自己停止说话
264
+ if(e)
265
+ console.log(`您正在说话`)
266
+ else
267
+ console.log(`您已停止说话`)
268
+ })
269
+ client.on(PTTEvent.JOIN_INFO,(e)=>{
270
+ // 有用户加入组时通知,
271
+ // e的结构如下
272
+ // {
273
+ // user:8003, 加入的用户号
274
+ // group:100114, 组id
275
+ // code:1, 0表示退出组,1表示加入组
276
+ // }
277
+ console.log(`用户加入通知:${JSON.stringify(e)}`)
278
+ })
279
+ ```
280
+
281
+ ### 5.限制
282
+ - 1.目前仅做了chrome浏览器的兼容支持,要求chrome内核版本在90以上
283
+ - 2.webrtc接口调用的页面需要依赖https环境(本地地址如localhost,127.0.0.1除外),页面运行环境如果无法提供支持,请在chrome的unsafely-treat-insecure中添加白名单来让页面支持webrtc(chrome 浏览器打开chrome://flags/#unsafely-treat-insecure-origin-as-secure,在Insecure origins treated as secure下面的输入框中添加您的网页地址,选择右边的enable,重启浏览器生效)
File without changes
File without changes
@@ -0,0 +1,2 @@
1
+ function e(e,t,i,n){return new(i||(i=Promise))((function(s,r){function o(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,a)}c((n=n.apply(e,t||[])).next())}))}var t,i,n,s,r;!function(e){e.bye="bye",e.stream="stream",e.reInvite="reInvite",e.localAudioChange="localAudioChange",e.localVideoChange="localVideoChange",e.localStreamChange="localStreamChange"}(t||(t={})),function(e){e.connected="connected",e.disconnected="disconnected",e.invite="invite"}(i||(i={})),function(e){e.PTTInfo="PTTInfo",e.FPREInfo="FPREInfo",e.IMSInfo="IMSInfo",e.ERROR="error",e.SPEAKER="speaker",e.TALKING="talking",e.ACTIVE_GROUP="activeGroup",e.JOIN_INFO="joinInfo"}(n||(n={})),function(e){e.MESSAGE_TYPE_REGISTER="REGISTER",e.MESSAGE_TYPE_INVITE="INVITE",e.MESSAGE_TYPE_REINVITE="reINVITE",e.MESSAGE_TYPE_ICE="ICE",e.MESSAGE_TYPE_INFO="INFO",e.MESSAGE_TYPE_BYE="BYE"}(s||(s={})),function(e){e.FPRE="fpre",e.IMS="ims",e.PTT_QUERY_ONLINE_USER="15",e.PTT_ANSWER_ONLINE_USER="115",e.PTT_QUERY_INFO="16",e.PTT_QUERY_INFO_CONFIRM="116"}(r||(r={}));const o=e=>{void 0!==e&&(e.pause(),e.removeAttribute("src"),e.removeAttribute("srcObject"))},a=(e,t)=>{void 0!==e&&void 0!==t&&(t.srcObject=e,t.play())},c=e=>{e.onaddtrack=null,e.onremovetrack=null,e.getTracks().forEach((t=>{null==e||e.removeTrack(t),t.onended=null,t.onmute=null,t.onunmute=null,t.stop()}))};let d=!1;const h=(e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)},l=()=>{d=!1},u=()=>{d=!0};var v,f,p;function m(){}function g(){g.init.call(this)}function k(e){return void 0===e._maxListeners?g.defaultMaxListeners:e._maxListeners}function y(e,t,i){if(t)e.call(i);else for(var n=e.length,s=L(e,n),r=0;r<n;++r)s[r].call(i)}function C(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,r=L(e,s),o=0;o<s;++o)r[o].call(i,n)}function T(e,t,i,n,s){if(t)e.call(i,n,s);else for(var r=e.length,o=L(e,r),a=0;a<r;++a)o[a].call(i,n,s)}function w(e,t,i,n,s,r){if(t)e.call(i,n,s,r);else for(var o=e.length,a=L(e,o),c=0;c<o;++c)a[c].call(i,n,s,r)}function b(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,r=L(e,s),o=0;o<s;++o)r[o].apply(i,n)}function E(e,t,i,n){var s,r,o,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((r=e._events)?(r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),o=r[t]):(r=e._events=new m,e._eventsCount=0),o){if("function"==typeof o?o=r[t]=n?[i,o]:[o,i]:n?o.unshift(i):o.push(i),!o.warned&&(s=k(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=r[t]=i,++e._eventsCount;return e}function S(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function _(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function L(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}m.prototype=Object.create(null),g.EventEmitter=g,g.usingDomains=!1,g.prototype.domain=void 0,g.prototype._events=void 0,g.prototype._maxListeners=void 0,g.defaultMaxListeners=10,g.init=function(){this.domain=null,g.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new m,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},g.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},g.prototype.getMaxListeners=function(){return k(this)},g.prototype.emit=function(e){var t,i,n,s,r,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=o[e]))return!1;var h="function"==typeof i;switch(n=arguments.length){case 1:y(i,h,this);break;case 2:C(i,h,this,arguments[1]);break;case 3:T(i,h,this,arguments[1],arguments[2]);break;case 4:w(i,h,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),r=1;r<n;r++)s[r-1]=arguments[r];b(i,h,this,s)}return!0},g.prototype.addListener=function(e,t){return E(this,e,t,!1)},g.prototype.on=g.prototype.addListener,g.prototype.prependListener=function(e,t){return E(this,e,t,!0)},g.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,S(this,e,t)),this},g.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,S(this,e,t)),this},g.prototype.removeListener=function(e,t){var i,n,s,r,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new m:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,r=i.length;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){o=i[r].listener,s=r;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new m,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,o||t)}return this},g.prototype.off=function(e,t){return this.removeListener(e,t)},g.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new m,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new m:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),r=0;r<s.length;++r)"removeListener"!==(n=s[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new m,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},g.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},g.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):_.call(e,t)},g.prototype.listenerCount=_,g.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};class I extends g{constructor(){super(),this.localMediaStream=new MediaStream,this.videoConstrains={width:{max:1920},height:{max:1080},frameRate:{ideal:20,max:30}},this.audioConstrants={noiseSuppression:!0,echoCancellation:!0,autoGainControl:!0},super.setMaxListeners(0)}releaseTrack(e){var t;void 0!==e&&(null===(t=this.localMediaStream)||void 0===t||t.removeTrack(e),e.stop())}addDeviceChangeListener(e){navigator.mediaDevices.addEventListener("devicechange",e)}removeDeviceChangeListener(e){navigator.mediaDevices.removeEventListener("devicechange",e)}setVideoTrack(e){var i;this.emit(t.localVideoChange,{from:this.videoTrack,to:e}),this.videoTrack!==e&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(e),this.localTractChange(this.videoTrack,e)),this.videoTrack=e}setAudioTrack(e){var i;this.emit(t.localAudioChange,{from:this.audioTrack,to:e}),this.audioTrack!==e&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(e),this.localTractChange(this.audioTrack,e)),this.audioTrack=e}renderLocalStreamToContainer(e){a(this.localMediaStream,e)}getAllInputResource(){return e(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.enumerateDevices();return{audio:e.filter((e=>"audioinput"===e.kind)),video:e.filter((e=>"videoinput"===e.kind))}}))}useDefaultDevice(t){return e(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0});this.setAudioTrack(e.getAudioTracks()[0]),this.setVideoTrack(e.getVideoTracks()[0]),this.renderLocalStreamToContainer(t)}))}useAudio(t){return e(this,void 0,void 0,(function*(){let e=void 0===t?{audio:Object.assign({},this.audioConstrants),video:!1}:{video:!1,audio:Object.assign({deviceId:t},this.audioConstrants)},i=yield navigator.mediaDevices.getUserMedia(e);return this.setAudioTrack(i.getAudioTracks()[0]),i.getAudioTracks()[0]}))}useDeviceVideo(t){return e(this,void 0,void 0,(function*(){let e=void 0===t?{audio:!1,video:Object.assign({},this.videoConstrains)}:{audio:!1,video:Object.assign({deviceId:t},this.videoConstrains)},i=yield navigator.mediaDevices.getUserMedia(e);return this.setVideoTrack(i.getVideoTracks()[0]),i.getVideoTracks()[0]}))}useDeskTopVideo(){return e(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.getDisplayMedia({video:Object.assign({},this.videoConstrains),audio:!1});return this.setVideoTrack(e.getVideoTracks()[0]),e.getVideoTracks()[0]}))}disableAudio(){void 0!==this.audioTrack&&this.audioTrack.enabled&&(h("local audio status change",this.audioTrack),this.audioTrack.enabled=!1,this.setAudioTrack(this.audioTrack))}enableAudio(){void 0===this.audioTrack||this.audioTrack.enabled||(h("local audio status change",this.audioTrack),this.audioTrack.enabled=!0,this.setAudioTrack(this.audioTrack))}disableVideo(){void 0!==this.videoTrack&&this.videoTrack.enabled&&(h("local video status change",this.videoTrack),this.videoTrack.enabled=!1,this.setVideoTrack(this.videoTrack))}enableVideo(){void 0===this.videoTrack||this.videoTrack.enabled||(h("local video status change",this.videoTrack),this.videoTrack.enabled=!0,this.setVideoTrack(this.videoTrack))}close(){this.releaseTrack(this.audioTrack),this.releaseTrack(this.videoTrack),this.audioTrack=void 0,this.videoTrack=void 0,this.localMediaStream=void 0}}class R extends I{constructor(){super(),this.videoCodecs=[],this.audioCodecs=[],this.audioReciveCodecs=[],this.preferCodec(),this.peerConnection=this.buildConnection()}buildConnection(){let e=new RTCPeerConnection;return e.addEventListener("connectionstatechange",(e=>h("connectionstatechange",e))),e.addEventListener("icecandidate",(e=>{h("icecandidate",e),this.onIceCandidate(e)})),e.addEventListener("datachannel",(e=>h("datachannel",e))),e.addEventListener("icecandidateerror",(e=>h("icecandidateerror",e))),e.addEventListener("iceconnectionstatechange",(e=>h("iceconnectionstatechange",e))),e.addEventListener("icegatheringstatechange",(e=>h("icegatheringstatechange",e))),e.addEventListener("negotiationneeded",(e=>h("negotiationneeded",e))),e.addEventListener("signalingstatechange",(e=>h("signalingstatechange",e))),e.addEventListener("track",(e=>this.reciveTrack(e))),e}localTractChange(t,i){return e(this,void 0,void 0,(function*(){if(void 0!==this.remoteStream&&void 0!==this.peerConnection)if(void 0!==i){let e=this.peerConnection.getSenders().find((e=>{var t;return(null===(t=e.track)||void 0===t?void 0:t.kind)===i.kind}));void 0!==e&&e.replaceTrack(i)}else{let e=this.peerConnection.getSenders().find((e=>{var i;return(null===(i=e.track)||void 0===i?void 0:i.kind)===(null==t?void 0:t.kind)}));void 0!==e&&this.peerConnection.removeTrack(e)}void 0!==i&&(i.onended=e=>h("local track end",e),i.onmute=e=>{h("local mute",e),this.emitLocalStreamChange()},i.onunmute=e=>{h("local unmute",e),this.emitLocalStreamChange()}),this.releaseTrack(t),this.emitLocalStreamChange()}))}isInMeeting(){return void 0!==this.remoteStream}hasRemoteVideo(e){var t;return null!==(t=null==e?void 0:e.getVideoTracks().some((e=>!1===e.muted&&"live"===e.readyState)))&&void 0!==t&&t}emitLocalStreamChange(){this.emit(t.localStreamChange,{audioOnly:!this.hasRemoteVideo(this.localMediaStream),stream:this.localMediaStream})}emitRemoteStreamChange(){this.emit(t.stream,{audioOnly:!this.hasRemoteVideo(this.remoteStream),stream:this.remoteStream})}trigerStreamChange(e=100){void 0!==this.emitStreamTimeout&&clearTimeout(this.emitStreamTimeout),this.emitStreamTimeout=setTimeout((()=>{this.emitRemoteStreamChange(),this.emitStreamTimeout=void 0}),e)}reciveTrack(e){h("recive track",e),void 0===this.remoteStream&&(this.remoteStream=new MediaStream),e.track.addEventListener("ended",(()=>this.trigerStreamChange())),e.track.addEventListener("mute",(()=>this.trigerStreamChange(3e3))),e.track.addEventListener("unmute",(()=>this.trigerStreamChange(10))),this.remoteStream.addTrack(e.track),this.trigerStreamChange()}preferCodec(e="H264",t="PCMA"){this.videoCodecs=[];let i=RTCRtpSender.getCapabilities("video");null!==i&&this.videoCodecs.push(...i.codecs.filter((t=>t.mimeType===`video/${e}`)));let n=RTCRtpReceiver.getCapabilities("video");null!==n&&this.videoCodecs.push(...n.codecs.filter((t=>t.mimeType===`video/${e}`))),this.audioCodecs=[];let s=RTCRtpSender.getCapabilities("audio");null!==s&&this.audioCodecs.push(...s.codecs.filter((e=>e.mimeType===`audio/${t}`)));let r=RTCRtpReceiver.getCapabilities("audio");null!==r&&this.audioCodecs.push(...r.codecs.filter((e=>e.mimeType===`audio/${t}`)))}trackIsInPeerConnection(e){var t,i;return null!==(i=null===(t=this.peerConnection)||void 0===t?void 0:t.getSenders().some((t=>{var i;return(null===(i=t.track)||void 0===i?void 0:i.id)===e.id})))&&void 0!==i&&i}updateTracks(){if(void 0===this.peerConnection||"closed"===this.peerConnection.signalingState)throw new Error("session is closed !");if(void 0===this.audioTrack&&void 0===this.videoCodecs)throw new Error("no input found");if(void 0!==this.audioTrack&&!this.trackIsInPeerConnection(this.audioTrack))try{this.peerConnection.addTrack(this.audioTrack)}catch(e){}if(void 0!==this.videoTrack&&!this.trackIsInPeerConnection(this.videoTrack))try{this.peerConnection.addTrack(this.videoTrack)}catch(e){}try{this.peerConnection.getTransceivers().forEach((e=>{null!==e.sender.track&&("video"===e.sender.track.kind?e.setCodecPreferences([...this.videoCodecs]):"audio"===e.sender.track.kind&&e.setCodecPreferences([...this.audioCodecs]))}))}catch(e){((e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)})("preferCodec error",e,this.audioCodecs,this.videoCodecs)}}createOffer(){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createOffer();return e=class{static formatOffer(e){let{sdp:t}=e;if(void 0===t)throw new Error("offer sdp is empty");return t=t.split("\r\n").filter((e=>-1===e.indexOf("a=group:BUNDLE"))).join("\r\n"),e.sdp=t,e}}.formatOffer(e),yield this.peerConnection.setLocalDescription(e),e}))}setOffer(t){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"offer",sdp:t})}))}createAnswer(){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createAnswer();return this.peerConnection.setLocalDescription(e),e}))}setAnswer(t){return e(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"answer",sdp:t})}))}setRemoteIce(e){if(void 0===this.peerConnection)throw new Error("session is closed !");let t=new RTCIceCandidate(e);this.peerConnection.addIceCandidate(t)}closeConnection(e){e.close(),e.ontrack=null,e.onicecandidate=null,e.oniceconnectionstatechange=null,e.onsignalingstatechange=null,e.onicegatheringstatechange=null,e.onnegotiationneeded=null,e.onicecandidateerror=null,e.ondatachannel=null,e.onconnectionstatechange=null}close(){super.close(),void 0!==this.peerConnection&&(this.closeConnection(this.peerConnection),this.peerConnection=void 0),void 0!==this.remoteStream&&c(this.remoteStream)}}!function(e){e[e.timeout=408]="timeout",e[e.reject=488]="reject",e[e.busy=486]="busy",e[e.notfound=404]="notfound",e[e.notAllowedMedia=415]="notAllowedMedia",e[e.ok=200]="ok"}(v||(v={}));class M extends R{constructor(e,t,i){super(),this.sessionId=t,this.rtcClient=e,this.remoteNumber=i}reciveIceRequest({ice:e}){this.setRemoteIce(JSON.parse(e))}getRemoteNumber(){return this.remoteNumber}onIceCandidate(e){}destory(e=!0){this.removeAllListeners(),void 0!==this.rtcClient&&(void 0!==this.remoteNumber&&(e&&this.rtcClient.sendBye(this.remoteNumber,this.sessionId),this.remoteNumber=void 0),this.rtcClient.removeSession(this)),this.rtcClient=void 0,super.close()}rejectCall(){let[e,t,i]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq);e.answer(v.reject,i,t,this.sessionId),this.destory()}acceptCall(){return e(this,void 0,void 0,(function*(){if(void 0!==this.inviteOffer){yield this.setOffer(this.inviteOffer);let[e,t,i]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq),{sdp:n}=yield this.createAnswer();e.answer(v.ok,i,t,this.sessionId,n)}}))}pickNewConnection(){return e(this,void 0,void 0,(function*(){void 0!==this.peerConnection&&this.closeConnection(this.peerConnection),this.peerConnection=this.buildConnection(),void 0!==this.remoteStream&&(c(this.remoteStream),this.remoteStream=void 0,this.acceptCall())}))}checkIsNotUndefined(...e){for(const t of e)if(void 0===t)throw new Error("someone is undefined");return e}sendDtmf(t){var i;return e(this,void 0,void 0,(function*(){null===(i=this.rtcClient)||void 0===i||i.sendDtmf(this.remoteNumber,this.sessionId,t)}))}}!function(e){e.audio="audio",e.video="video",e.audioVideo="audioVideo",e.unknown="unknown"}(f||(f={}));class x extends M{constructor(){super(...arguments),this.responseCallType=f.unknown}start(){return e(this,void 0,void 0,(function*(){let[e,t]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber),i=yield this.createOffer(),{status:n,sdp:s}=yield e.invite(t,this.sessionId,i.sdp);n===v.ok&&(yield this.setAnswer(s));const r=s.split("\r\n"),o=r.find((e=>e.startsWith("m=audio"))),a=r.find((e=>e.startsWith("m=video")));return this.responseCallType=o&&a?f.audioVideo:o?f.audio:a?f.video:f.unknown,n}))}addRemote(e){this.remoteNumber=e}}class N{constructor(e,t,i,n){this.req=e,this.seq=N.seqNum++,this.from=t,this.to=i,this.registerid=`${N.random}@${t}`,void 0!==n&&Object.assign(this,n)}}N.random=String(Date.now()),N.seqNum=1,function(e){e.connected="connected",e.disconnected="disconnected",e.message="message"}(p||(p={}));var G=null;try{var P="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");G=P.Worker}catch(e){}function A(e,t,i){var n=void 0===t?null:t,s=function(e,t){return Buffer.from(e,"base64").toString(t?"utf16":"utf8")}(e,void 0!==i&&i),r=s.indexOf("\n",10)+1,o=s.substring(r)+(n?"//# sourceMappingURL="+n:"");return function(e){return new G(o,Object.assign({},e,{eval:!0}))}}function O(e,t,i){var n=void 0===t?null:t,s=function(e,t){var i=atob(e);if(t){for(var n=new Uint8Array(i.length),s=0,r=i.length;s<r;++s)n[s]=i.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return i}(e,void 0!==i&&i),r=s.indexOf("\n",10)+1,o=s.substring(r)+(n?"//# sourceMappingURL="+n:""),a=new Blob([o],{type:"application/javascript"});return URL.createObjectURL(a)}var V="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);var Y,j,U,Z=(Y="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7bGV0IGUsdD0hMTtjb25zdCBzPXNlbGY7c2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZnVuY3Rpb24ocyl7Y29uc3QgYT1zLmRhdGE7c3dpdGNoKGEuY21kKXtjYXNlInN0YXJ0IjpzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJ3ZWJXb3JrZXIiLGRhdGE6IuWQr+WKqHdlYldvcmtlciJ9KSxvKGEudXJsKTticmVhaztjYXNlInN0b3AiOnQ9ITAsZS5jbG9zZSgpLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYldvcmtlciIsZGF0YToi5YGc5q2id2ViV29ya2VyIn0pLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6ImNsb3NlIixkYXRhOiJjbG9zZSIrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKX0pLHNlbGYuY2xvc2UoKTticmVhaztjYXNlIm1zZyI6MT09PWUucmVhZHlTdGF0ZSYmZS5zZW5kKEpTT04uc3RyaW5naWZ5KGEuZGF0YSkpfX0pLCExKTtjb25zdCBvPWZ1bmN0aW9uKHQpe2V8fChlPW5ldyBXZWJTb2NrZXQodCksZS5vbmVycm9yPWZ1bmN0aW9uKGUpe2EodCl9LGUub25jbG9zZT1mdW5jdGlvbihlKXthKHQpfSxlLm9ub3Blbj1lPT57cy5wb3N0TWVzc2FnZSh7dHlwZToib3BlbiIsZGF0YToic3RhcnQiKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCl9KX0sZS5vbm1lc3NhZ2U9ZT0+e2NvbnN0IHQ9SlNPTi5wYXJzZShlLmRhdGEpO3MucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYlNvY2tldCIsZGF0YTp0fSl9KX07ZnVuY3Rpb24gYShzKXt0fHwodD0hMCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbCxvKHMpLHQ9ITF9KSwyZTMpKX19KCk7Cgo=",j=null,U=!1,V?A(Y,j,U):function(e,t,i){var n;return function(s){return n=n||O(e,t,i),new Worker(n,s)}}(Y,j,U));class W extends g{constructor(e){super(),this.server=e,this.ws=new Z}connect(){this.initWebsocket(),this.ws.onmessage=e=>{const{type:t,data:i}=e.data;switch(t){case"webSocket":return h("websocket recive message ",i),void this.emit(p.message,i);case"open":return h("websocket connected ",this.server),void this.emit(p.connected)}}}initWebsocket(){this.ws.postMessage({cmd:"config",heartBeat:{timeout:!1},register:{}}),this.ws.postMessage({cmd:"start",url:this.server})}send(e){this.ws.postMessage({cmd:"msg",data:e})}close(){this.ws.postMessage({cmd:"close"})}sendMessage(e){h("websocket send message ",e),void 0!==e&&void 0!==this.ws&&this.ws.postMessage({cmd:"msg",data:e})}}class D extends g{constructor(e){super(),this.activeServer="",this.server=e,super.setMaxListeners(0)}testWs(t){return e(this,void 0,void 0,(function*(){return t.reduce(((e,t)=>e.then((e=>Promise.resolve(e)),(e=>new Promise(((i,n)=>{const s=new WebSocket(t);s.onopen=()=>{e.push(t),s.close(),i(e)},s.onclose=()=>{n(e)}}))))),Promise.reject([])).then((e=>Promise.resolve(e)),(e=>Promise.resolve(e)))}))}reConnect(){return e(this,void 0,void 0,(function*(){this.destory();let e=[];void 0!==this.server&&(e="string"==typeof this.server?[this.server]:this.server);const t=yield this.testWs(e);return new Promise(((e,i)=>{if(t.length>0){this.activeServer=t[0];let n=new W(this.activeServer);n.on(p.connected,(()=>{this.socket=n,this.onConnected(),e()})),n.on(p.disconnected,(e=>{this.socket=void 0,this.onDisConnected(e),i("socket connecion failed")})),n.on(p.message,(e=>this.onReviceMessage(e))),n.connect()}else i("server is empty")}))}))}sendMessage(e){if(void 0===this.socket)throw new Error("socket is closed");this.socket.sendMessage(e)}destory(){void 0!==this.socket&&(this.unRegister(),this.socket.close(),this.socket=void 0)}}class K extends D{constructor(e,t,i){super(e),this.asyncProducer=new Map,this.localNumber=t,this.expireTime=i}sendRespondableMessage(t){return e(this,void 0,void 0,(function*(){return this.sendMessage(t),new Promise((e=>this.asyncProducer.set(t.seq,e)))}))}getAsyncResolve(e){let t=this.asyncProducer.get(e);return void 0!==t&&this.asyncProducer.delete(e),t}onDisConnected(e){this.asyncProducer.clear(),this.emit(i.disconnected,e)}onReviceMessage(e){var t;let{status:i,seq:n}=e;void 0!==i?null===(t=this.getAsyncResolve(n))||void 0===t||t.call(void 0,e):this.processMessage(e)}}class q extends K{register(){return e(this,void 0,void 0,(function*(){let e=new N(s.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime});return this.sendRespondableMessage(e)}))}unRegister(){let e=new N(s.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:0});this.sendMessage(e)}invite(t,i,n){return e(this,void 0,void 0,(function*(){return this.sendRespondableMessage(new N(s.MESSAGE_TYPE_INVITE,this.localNumber,t,{cid:i,sdp:n}))}))}sendIce(e,t,i){}sendBye(e,t){return this.sendMessage(new N(s.MESSAGE_TYPE_BYE,this.localNumber,e,{cid:t}))}answer(e,t,i,n,s){this.sendMessage({status:e,seq:t,from:i,to:this.localNumber,cid:n,sdp:s})}sendPttMessage(e){this.sendMessage(e)}sendDtmf(t,i,n){return e(this,void 0,void 0,(function*(){return this.sendMessage(new N(s.MESSAGE_TYPE_INFO,this.localNumber,t,{cid:i,info:{msg:"dtmf",dtmf:n}}))}))}}function X(){}function B(){B.init.call(this)}function z(e){return void 0===e._maxListeners?B.defaultMaxListeners:e._maxListeners}function F(e,t,i){if(t)e.call(i);else for(var n=e.length,s=ne(e,n),r=0;r<n;++r)s[r].call(i)}function H(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,r=ne(e,s),o=0;o<s;++o)r[o].call(i,n)}function $(e,t,i,n,s){if(t)e.call(i,n,s);else for(var r=e.length,o=ne(e,r),a=0;a<r;++a)o[a].call(i,n,s)}function J(e,t,i,n,s,r){if(t)e.call(i,n,s,r);else for(var o=e.length,a=ne(e,o),c=0;c<o;++c)a[c].call(i,n,s,r)}function Q(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,r=ne(e,s),o=0;o<s;++o)r[o].apply(i,n)}function ee(e,t,i,n){var s,r,o,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((r=e._events)?(r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),o=r[t]):(r=e._events=new X,e._eventsCount=0),o){if("function"==typeof o?o=r[t]=n?[i,o]:[o,i]:n?o.unshift(i):o.push(i),!o.warned&&(s=z(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=r[t]=i,++e._eventsCount;return e}function te(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function ie(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function ne(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}X.prototype=Object.create(null),B.EventEmitter=B,B.usingDomains=!1,B.prototype.domain=void 0,B.prototype._events=void 0,B.prototype._maxListeners=void 0,B.defaultMaxListeners=10,B.init=function(){this.domain=null,B.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new X,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},B.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},B.prototype.getMaxListeners=function(){return z(this)},B.prototype.emit=function(e){var t,i,n,s,r,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=o[e]))return!1;var h="function"==typeof i;switch(n=arguments.length){case 1:F(i,h,this);break;case 2:H(i,h,this,arguments[1]);break;case 3:$(i,h,this,arguments[1],arguments[2]);break;case 4:J(i,h,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),r=1;r<n;r++)s[r-1]=arguments[r];Q(i,h,this,s)}return!0},B.prototype.addListener=function(e,t){return ee(this,e,t,!1)},B.prototype.on=B.prototype.addListener,B.prototype.prependListener=function(e,t){return ee(this,e,t,!0)},B.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,te(this,e,t)),this},B.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,te(this,e,t)),this},B.prototype.removeListener=function(e,t){var i,n,s,r,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new X:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,r=i.length;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){o=i[r].listener,s=r;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new X,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,o||t)}return this},B.prototype.off=function(e,t){return this.removeListener(e,t)},B.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new X,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new X:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),r=0;r<s.length;++r)"removeListener"!==(n=s[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new X,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},B.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},B.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):ie.call(e,t)},B.prototype.listenerCount=ie,B.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};const se="error",re="speaker",oe="talking",ae="activeGroup",ce="joinInfo",de="disConnected",he={400:"消息不符规范",401:"验证不通过",403:"无权利操作",404:"不存在该用户",415:"错误参数",405:"无法操作",424:"不存在XD群",425:"管理员没有",426:"已存在管理员",427:"以前被拒绝过,或者删除过",428:"超出所配置的下属管理员的数量",429:"群内无用户",430:"管理员的索引号冲突",431:"还有子管理员存在"},le="connected",ue="disconnected",ve="message",fe=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)},pe=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)};class me extends B{server="";ws=null;constructor(e){super(),this.server=e}connect(){this.ws=new WebSocket(this.server),this.ws.onopen=()=>{fe("websocket connected ",this.server),this.emit(le)},this.ws.onclose=()=>{fe("websocket disconnected ",this.server),this.ws=void 0,this.emit(ue)},this.ws.onmessage=({data:e})=>{let t=JSON.parse(e);fe("websocket recive message ",t),this.emit(ve,t)}}close(){void 0!==this.ws&&(this.ws.close(),this.ws=void 0)}sendMessage(e){fe("websocket send message ",e),void 0!==e&&void 0!==this.ws&&1===this.ws.readyState&&this.ws.send(JSON.stringify(e))}}class ge extends B{socket=void 0;timer=void 0;waitinggroup=void 0;speaker="";activeGroup="";talking=!1;constructor(e,t=20,i=!0){if(super(),!e)return pe("服务器地址为空!");this.server=e,this.heartTime=t,this.autoReconnect=i}async initClient(){return this.destorySocket(),new Promise(((e,t)=>{if(void 0!==this.server){let i=new me(this.server);i.on(le,(()=>{this.socket=i,this.timer=setInterval((()=>{this.sendMessage({req:0})}),1e3*this.heartTime),e()})),i.on(ue,(()=>{this.socket=void 0,this.autoReconnect?setTimeout((()=>{this.initClient()}),3e3):this.emit(de),t("socket connecion failed")})),i.on(ve,(e=>this.onReviceMessage(e))),i.connect()}else t("server is empty")}))}onReviceMessage(e){fe(e);const{info:t,msg:i,res:n}=e;if(10===t&&(this.speaker=`${i.speaker}`,fe(`${this.speaker}正在说话`),this.emit(re,this.speaker)),11===t&&(200===n.code?(this.activeGroup=this.waitinggroup,fe(`加入组${this.activeGroup}`)):(this.activeGroup="",pe(he[n.code]),this.emit(se,he[n.code])),this.emit(ae,this.activeGroup)),13===t&&(200===n.code?this.talking=!0:this.talking=!1,fe(`talking:${this.talking}`),this.emit(oe,this.talking)),14===t&&(this.speaker="",fe(`${this.speaker}停止说话`),this.emit(re,this.speaker)),15===t){const e={user:i.number,group:i.g_num,code:i.status};fe(`${e}进入组`),this.emit(ce,e)}}joinGroup(e,t,i,n){this.socket&&(this.waitinggroup=e,this.sendMessage({req:1,group:e,user:t,ptts:i,port:n}))}quitGroup(){this.socket&&(this.activeGroup="",this.emit(ae,this.activeGroup),this.sendMessage({req:2}))}talk(){this.socket&&this.sendMessage({req:3})}stop(){this.talking=!1,fe(`talking:${this.talking}`),this.emit(oe,this.talking),this.socket&&this.sendMessage({req:4})}sendMessage(e){if(void 0===this.socket)throw new Error("socket is closed");this.socket.sendMessage(e)}destorySocket(){void 0!==this.socket&&(this.socket.close(),this.socket=void 0)}destory(){this.destorySocket()}}class ke extends q{constructor(e){let t=e.expireTime||ke.defaultExpireTime;super(e.server,e.localNumber,t),this.heartTime=e.heartTime||this.expireTime/4,this.enablePtt=e.enablePtt,this.pttServer=e.pttServer}initPttClient(){return e(this,void 0,void 0,(function*(){if(this.enablePtt){if(!this.pttServer)return Promise.reject("pttServer不存在");{const e=yield(async(e,t=20,i=!0)=>{let n=new ge(e,t,i);return await n.initClient(),n})(this.pttServer);if(!e)return Promise.reject("ptt客户端初始化失败!");e.on(ae,(e=>{this.emit(ae,e)})),e.on(re,(e=>{this.emit(re,e)})),e.on(oe,(e=>{this.emit(oe,e)})),e.on(ce,(e=>{this.emit(ce,e)})),e.on(de,(e=>{this.emit(de,e)})),this.pttClient=e}}}))}joinGroup(e,t,i,n){var s;null===(s=this.pttClient)||void 0===s||s.joinGroup(e,t,i,n)}quitGroup(){var e;null===(e=this.pttClient)||void 0===e||e.quitGroup()}talk(){var e;null===(e=this.pttClient)||void 0===e||e.talk()}stop(){var e;null===(e=this.pttClient)||void 0===e||e.stop()}onConnected(){this.heartBeatInterval=setInterval((()=>this.register()),1e3*this.heartTime)}onDisConnected(){super.onDisConnected(),void 0!==this.heartBeatInterval&&clearInterval(this.heartBeatInterval)}}ke.defaultExpireTime=60;class ye extends M{constructor(e,t,i,n,s){super(e,t,i),this.callType=f.unknown,this.inviteSeq=s,this.inviteOffer=n;const r=n.split("\r\n"),o=r.find((e=>e.startsWith("m=audio"))),a=r.find((e=>e.startsWith("m=video")));this.callType=o&&a?f.audioVideo:o?f.audio:a?f.video:f.unknown}}class Ce extends ke{constructor(){super(...arguments),this.allSession=[]}createSession(e){let t=new x(this,((e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce(((e,t)=>e+((t&=63)<36?t.toString(36):t<62?(t-26).toString(36).toUpperCase():t>62?"-":"_")),""))(),e);return this.allSession.push(t),t}processMessage(e){var o;let{req:a}=e;if(a===s.MESSAGE_TYPE_INVITE){let t=new ye(this,e.cid,e.from,e.sdp,e.seq);this.allSession.push(t),this.emit(i.invite,t)}else if(a===s.MESSAGE_TYPE_REINVITE){let i=this.allSession.find((t=>t.sessionId==e.cid));void 0!==i&&(i.inviteSeq=e.seq,i.inviteOffer=e.sdp,i.acceptCall(),i.emit(t.reInvite,i))}else if(a===s.MESSAGE_TYPE_ICE)null===(o=this.allSession.find((t=>t.sessionId===e.cid)))||void 0===o||o.reciveIceRequest(e);else if(a===s.MESSAGE_TYPE_BYE){let i=this.allSession.find((t=>t.sessionId===e.cid));void 0!==i&&(i.emit(t.bye),i.destory(!1))}a==r.FPRE&&this.emit(n.FPREInfo,e),a==r.IMS&&this.emit(n.IMSInfo,e)}destory(){void 0!==this.allSession&&this.allSession.forEach((e=>{e.destory()})),super.destory()}removeSession(e){void 0!==this.allSession&&(this.allSession=this.allSession.filter((t=>t.sessionId!==e.sessionId)))}onDisConnected(){super.onDisConnected(),this.destory()}}const Te=t=>e(void 0,void 0,void 0,(function*(){let e=new Ce(t);yield e.reConnect(),yield e.initPttClient().catch((e=>{console.error(e)})),N.random=String(Date.now());let i=yield e.register();return i.status===v.ok?e:(e.destory(),Promise.reject(i))})),we=()=>e(void 0,void 0,void 0,(function*(){yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0})}));export{n as PTTEvent,f as RtcCalledType,Ce as RtcClient,i as RtcClientEvent,v as RtcInviteStatus,t as RtcSessionEvent,we as authDevice,Te as createRtcClient,l as disableLog,u as enableLog,o as releaseStreamFromContainer,a as renderStreamToContainer};
2
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/session/RtcSessionEvent.ts","../src/client/RtcClientEvent.ts","../src/message/SingalMessageType.ts","../src/peer/StreamUtil.ts","../src/log/Logger.ts","../src/session/RtcInviteStatus.ts","../src/session/RtcCalledTyped.ts","../src/websocket/RtcWebSocketEvent.ts","../src/peer/LocalStreamHandler.ts","../src/peer/RTCPeerConnectionHandler.ts","../src/session/UscRtcProtocol.ts","../src/session/RtcAbstractSession.ts","../src/session/RtcSession.ts","../src/message/SignalMessage.ts","../src/websocket/RtcWebSocket.ts","../src/websocket/RtcSocketServerHandler.ts","../src/client/RtcSignalServer.ts","../src/client/RtcSignalApi.ts","../node_modules/usc-ptt-sdk/dist/index.js","../src/client/RtcClientBase.ts","../src/session/RtcCalledSession.ts","../src/client/RtcClient.ts","../node_modules/nanoid/index.browser.js","../src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","/**\n * rtc 会话过程中向上抛出的所有事件\n */\nexport enum RtcSessionEvent {\n //接收到bye请求\n bye = \"bye\",\n //接收到远程的流信息\n stream = \"stream\",\n //会话过程中修改视频流会触发重建invite\n reInvite = \"reInvite\",\n //本地音频流发生变化,流的变化以及是否启用的变化都会触发\n localAudioChange = \"localAudioChange\",\n //本地视频流发生变化,流的变化以及是否启用的变化都会触发\n localVideoChange = \"localVideoChange\",\n //本地流发生变化\n localStreamChange = \"localStreamChange\"\n}","export enum RtcClientEvent {\n connected = \"connected\", //the socket is connected to the server\n\n disconnected = \"disconnected\", //the socket is dis connected to the server\n\n invite = \"invite\",//somebody call you\n}\nexport enum PTTEvent {\n PTTInfo = \"PTTInfo\",\n FPREInfo = 'FPREInfo',\n IMSInfo = \"IMSInfo\",\n ERROR = 'error',\n SPEAKER = 'speaker',\n TALKING = 'talking',\n ACTIVE_GROUP = 'activeGroup',\n JOIN_INFO = 'joinInfo',\n // SERVER_CLOSE = 'serverClose',\n // SERVER_ERROR = 'serverError',\n // DISCONNECTED = 'disConnected'\n\n}","/**\n * 信令服务器的消息头\n * @author xiechanglei\n */\nexport enum SignalMessageType {\n MESSAGE_TYPE_REGISTER = \"REGISTER\",//注册\n MESSAGE_TYPE_INVITE = \"INVITE\",//邀请会话\n MESSAGE_TYPE_REINVITE = \"reINVITE\",//邀请会话\n MESSAGE_TYPE_ICE = \"ICE\",//ice探测消息发送\n MESSAGE_TYPE_INFO = \"INFO\",\n MESSAGE_TYPE_BYE = \"BYE\",//挂断\n}\n\nexport enum PttMessageType {\n FPRE = 'fpre',\n IMS = 'ims',\n PTT_QUERY_ONLINE_USER = \"15\",//在线用户查询\n PTT_ANSWER_ONLINE_USER = \"115\",//服务响应在线用户列表\n PTT_QUERY_INFO = \"16\",//群组在线用户查询通知\n PTT_QUERY_INFO_CONFIRM = \"116\",//确认消息\n}","/**\n * 销毁dom上渲染的流\n */\nexport const releaseStreamFromContainer = (container?: HTMLVideoElement | HTMLAudioElement) => {\n if (container !== undefined) {\n container.pause()\n container.removeAttribute(\"src\")\n container.removeAttribute(\"srcObject\")\n }\n}\n/**\n * 将流渲染到dom上\n */\nexport const renderStreamToContainer = (stream?: MediaStream, container?: HTMLVideoElement | HTMLAudioElement) => {\n if (stream !== undefined && container !== undefined) {\n container.srcObject = stream\n container.play()\n }\n}\n\n/**\n * 关闭流\n */\nexport const closeStreamAndTrack = (stream: MediaStream) => {\n stream.onaddtrack = null;\n stream.onremovetrack = null;\n stream.getTracks().forEach(track => {\n stream?.removeTrack(track)\n track.onended = null\n track.onmute = null\n track.onunmute = null\n track.stop()\n })\n}","//是否打印日志\nlet logAble = false\n//是否在网页上显示日志\n\nexport const log = (title: string, ...args: any) => {\n if (logAble) {\n console.log(\n `%c usc-rtc-devtools %c ${title} %c `,\n 'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\n 'background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\n 'background:transparent',\n ...args\n )\n }\n}\n\nexport const error = (title: string, ...args: any) => {\n if (logAble) {\n console.log(\n `%c usc-rtc-devtools %c ${title} %c `,\n 'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\n 'background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\n 'background:transparent',\n ...args\n )\n }\n}\n\nexport const disableLog = () => {\n logAble = false\n}\n\nexport const enableLog = () => {\n logAble = true\n}","export enum RtcInviteStatus {\n timeout = 408,\n reject = 488,\n busy = 486,\n notfound = 404,\n notAllowedMedia = 415,//不允许的媒体类型,目前至少包好一个音频媒体流\n ok = 200\n}","/**\n * rtc 会话过程中向上抛出的所有事件\n */\nexport enum RtcCalledType {\n //接收到bye请求\n audio = \"audio\",//音频呼叫\n video = \"video\",//视频呼叫\n audioVideo = \"audioVideo\",//音视频呼叫\n unknown = \"unknown\"//未知\n}","export enum RtcWebSocketEvent {\n connected = \"connected\",// the socket is connected\n disconnected = \"disconnected\", // the socket is dis connected\n message = \"message\" //收到消息\n}","import { renderStreamToContainer } from './StreamUtil';\nimport { RtcSessionEvent } from '../session/RtcSessionEvent';\nimport EventEmitter from 'events'\nimport { log } from '../log/Logger'\n\n\n\n/**\n * devicechange 设备输入变化\n */\nexport default abstract class LocalStreamHandler extends EventEmitter {\n constructor() {\n super()\n // ...........................................................................\n super.setMaxListeners(0)\n }\n //本地流媒体\n audioTrack: MediaStreamTrack | undefined\n videoTrack: MediaStreamTrack | undefined\n localMediaStream: MediaStream | undefined = new MediaStream()\n //https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings\n videoConstrains = { width: { max: 1920 }, height: { max: 1080 }, frameRate: { ideal: 20, max: 30 } }\n audioConstrants = { noiseSuppression: true, echoCancellation: true, autoGainControl: true }\n\n /**\n * 释放track\n */\n releaseTrack(track: MediaStreamTrack | undefined) {\n if (track !== undefined) {\n this.localMediaStream?.removeTrack(track)\n track.stop()\n }\n }\n\n /**\n * 注册设备变化事件,记得组件销毁的时候remove\n */\n addDeviceChangeListener(listener: any) {\n navigator.mediaDevices.addEventListener(\"devicechange\", listener)\n }\n removeDeviceChangeListener(listener: any) {\n navigator.mediaDevices.removeEventListener(\"devicechange\", listener)\n }\n\n /**\n * 设置本地视频输入流\n */\n setVideoTrack(videoTrack: MediaStreamTrack) {\n this.emit(RtcSessionEvent.localVideoChange, { from: this.videoTrack, to: videoTrack })\n if (this.videoTrack !== videoTrack) {\n this.localMediaStream?.addTrack(videoTrack)\n this.localTractChange(this.videoTrack, videoTrack)\n }\n this.videoTrack = videoTrack\n }\n\n\n /**\n * 设置本地音頻输入流\n */\n setAudioTrack(audioTrack: MediaStreamTrack) {\n this.emit(RtcSessionEvent.localAudioChange, { from: this.audioTrack, to: audioTrack })\n if (this.audioTrack !== audioTrack) {\n this.localMediaStream?.addTrack(audioTrack)\n this.localTractChange(this.audioTrack, audioTrack)\n }\n this.audioTrack = audioTrack\n }\n\n abstract localTractChange(prev: MediaStreamTrack | undefined, next: MediaStreamTrack | undefined): void\n\n /**\n * 将流渲染到dom上\n */\n renderLocalStreamToContainer(container: HTMLVideoElement | HTMLAudioElement | undefined) {\n renderStreamToContainer(this.localMediaStream, container)\n }\n\n /**\n * 获取所有的输入设备源\n */\n async getAllInputResource() {\n let all = await navigator.mediaDevices.enumerateDevices();\n return { audio: all.filter(res => res.kind === \"audioinput\"), video: all.filter(res => res.kind === \"videoinput\") }\n }\n\n /**\n * 使用默认的音视频输入源\n */\n async useDefaultDevice(container: HTMLVideoElement | HTMLAudioElement | undefined) {\n let constraints = { audio: true, video: true }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setAudioTrack(stream.getAudioTracks()[0])\n this.setVideoTrack(stream.getVideoTracks()[0])\n this.renderLocalStreamToContainer(container)\n }\n /**\n * 设置本地音频输入流\n * https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia\n * @param deviceId 设备id,如果为空,表示使用默认输入设备\n */\n async useAudio(deviceId?: string) {\n let constraints = deviceId === undefined ? { audio: { ...this.audioConstrants }, video: false } : { video: false, audio: { deviceId, ...this.audioConstrants } }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setAudioTrack(stream.getAudioTracks()[0])\n return stream.getAudioTracks()[0] //modify by jzg 此处需要返回该媒体流对象, 防止在获取流媒体过程中收到挂断请求, 导致流媒体没释放\n }\n\n /**\n * 使用设备视频流\n */\n async useDeviceVideo(deviceId?: string) {\n let constraints = deviceId === undefined ? { audio: false, video: { ...this.videoConstrains } } : { audio: false, video: { deviceId, ...this.videoConstrains } }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setVideoTrack(stream.getVideoTracks()[0])\n return stream.getVideoTracks()[0] //modify by jzg\n }\n\n /**\n * 使用桌面视频流\n */\n async useDeskTopVideo() {\n let stream = await navigator.mediaDevices.getDisplayMedia({ video: { ...this.videoConstrains }, audio: false })\n this.setVideoTrack(stream.getVideoTracks()[0])\n return stream.getVideoTracks()[0] //modify by jzg\n }\n /**\n * 禁用本地音频输入\n */\n disableAudio() {\n if (this.audioTrack !== undefined && this.audioTrack.enabled) {\n log(\"local audio status change\", this.audioTrack)\n this.audioTrack.enabled = false\n this.setAudioTrack(this.audioTrack)\n }\n }\n /**\n * 启用本地音频输入\n */\n enableAudio() {\n if (this.audioTrack !== undefined && !this.audioTrack.enabled) {\n log(\"local audio status change\", this.audioTrack)\n this.audioTrack.enabled = true\n this.setAudioTrack(this.audioTrack)\n }\n }\n\n /**\n * 禁用本地视频输入\n */\n disableVideo() {\n if (this.videoTrack !== undefined && this.videoTrack.enabled) {\n log(\"local video status change\", this.videoTrack)\n this.videoTrack.enabled = false\n this.setVideoTrack(this.videoTrack)\n }\n\n }\n\n /**\n * 启用本地视频输入\n */\n enableVideo() {\n if (this.videoTrack !== undefined && !this.videoTrack.enabled) {\n log(\"local video status change\", this.videoTrack)\n this.videoTrack.enabled = true\n this.setVideoTrack(this.videoTrack)\n }\n }\n\n close() {\n this.releaseTrack(this.audioTrack)\n this.releaseTrack(this.videoTrack)\n this.audioTrack = undefined\n this.videoTrack = undefined\n this.localMediaStream = undefined\n }\n}","import { RtcSessionEvent } from './../session/RtcSessionEvent';\nimport { log, error } from '../log/Logger'\nimport { UscRtcProtocol } from '../session/UscRtcProtocol'\nimport LocalStreamHandler from './LocalStreamHandler'\nimport { closeStreamAndTrack } from './StreamUtil';\n\n/**\n * 链接流程\n * https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling\n * TODO 1.音频呼叫\n * TODO 2.会话的过程中切换流\n */\nexport default abstract class RTCPeerConnectionHandler extends LocalStreamHandler {\n //peers\n peerConnection?: RTCPeerConnection\n\n //custorm codec\n videoCodecs: RTCRtpCodecCapability[] = []\n audioCodecs: RTCRtpCodecCapability[] = []\n audioReciveCodecs: RTCRtpCodecCapability[] = []\n remoteStream?: MediaStream\n emitStreamTimeout?: NodeJS.Timeout;\n constructor() {\n super()\n this.preferCodec()\n this.peerConnection = this.buildConnection()\n }\n\n /**生成一个peerconnection */\n buildConnection() {\n //指定dtls 证书\n // let cert = await RTCPeerConnection.generateCertificate({\n // name: 'RSASSA-PKCS1-v1_5',\n // hash: 'SHA-256',\n // modulusLength: 2048,\n // publicExponent: new Uint8Array([1, 0, 1])\n // })\n // this.peerConnection = new RTCPeerConnection({ certificates: [cert] });\n let peerConnection = new RTCPeerConnection()\n peerConnection.addEventListener(\"connectionstatechange\", (e) => log(\"connectionstatechange\", e))\n peerConnection.addEventListener(\"icecandidate\", (e) => { log(\"icecandidate\", e); this.onIceCandidate(e) })\n peerConnection.addEventListener(\"datachannel\", (e) => log(\"datachannel\", e))\n peerConnection.addEventListener(\"icecandidateerror\", (e) => log(\"icecandidateerror\", e))\n peerConnection.addEventListener(\"iceconnectionstatechange\", (e) => log(\"iceconnectionstatechange\", e))\n peerConnection.addEventListener(\"icegatheringstatechange\", (e) => log(\"icegatheringstatechange\", e))\n peerConnection.addEventListener(\"negotiationneeded\", (e) => log(\"negotiationneeded\", e))\n peerConnection.addEventListener(\"signalingstatechange\", (e) => log(\"signalingstatechange\", e))\n peerConnection.addEventListener(\"track\", (e) => this.reciveTrack(e))\n return peerConnection\n }\n\n\n\n //当流本地的流发生变化的时候,判断当前是否处于会话状态,从而进行处理\n async localTractChange(prev: MediaStreamTrack | undefined, next: MediaStreamTrack | undefined) {\n if (this.remoteStream !== undefined && this.peerConnection !== undefined) {//如果处于会话过程中,那么判断之前的sender是否含有该类型的流,如果存在那么就替换,如果不存在,重新发offer\n if (next !== undefined) { //修改流\n let prevSender = this.peerConnection.getSenders().find(sender => sender.track?.kind === next.kind)\n if (prevSender !== undefined) {\n prevSender.replaceTrack(next)\n } else {\n //TODO\n //reoffer 重发offer的时候是三个sender? 然后再peerConnection.removetrack\n }\n } else { //删除流,如果原先存在对应类型的流,直接stop?还是reoffer\n let prevSender = this.peerConnection.getSenders().find(sender => sender.track?.kind === prev?.kind)\n if (prevSender !== undefined) {\n this.peerConnection.removeTrack(prevSender)\n }\n }\n }\n\n //TODO \n if (next !== undefined) {\n next.onended = (e) => log(\"local track end\", e)\n next.onmute = (e) => {\n log(\"local mute\", e)\n this.emitLocalStreamChange()\n }\n next.onunmute = (e) => {\n log(\"local unmute\", e)\n this.emitLocalStreamChange()\n }\n }\n\n this.releaseTrack(prev)\n this.emitLocalStreamChange()\n }\n\n /**\n * 是否处于会议当中\n */\n isInMeeting() {\n return this.remoteStream !== undefined\n }\n\n hasRemoteVideo(strem?: MediaStream) {\n return strem?.getVideoTracks().some(track => track.muted === false && track.readyState === \"live\") ?? false\n }\n\n\n emitLocalStreamChange() {\n this.emit(RtcSessionEvent.localStreamChange, { audioOnly: !this.hasRemoteVideo(this.localMediaStream), stream: this.localMediaStream })\n }\n\n /**\n * 通知用户远程的流发生了变化\n */\n emitRemoteStreamChange() {\n this.emit(RtcSessionEvent.stream, { audioOnly: !this.hasRemoteVideo(this.remoteStream), stream: this.remoteStream })\n }\n\n /**\n * 做个100ms的延时来缓冲流的变化\n */\n trigerStreamChange(timeout: number = 100) {\n if (this.emitStreamTimeout !== undefined) {\n clearTimeout(this.emitStreamTimeout)\n }\n this.emitStreamTimeout = setTimeout(() => {\n this.emitRemoteStreamChange()\n this.emitStreamTimeout = undefined\n }, timeout)\n }\n\n /**\n * 接受track时候的处理事件\n */\n reciveTrack(e: RTCTrackEvent) {\n log(\"recive track\", e)\n if (this.remoteStream === undefined) {\n this.remoteStream = new MediaStream()\n }\n e.track.addEventListener(\"ended\", () => this.trigerStreamChange())\n e.track.addEventListener(\"mute\", () => this.trigerStreamChange(3000))\n e.track.addEventListener(\"unmute\", () => this.trigerStreamChange(10))\n this.remoteStream.addTrack(e.track)\n this.trigerStreamChange()\n }\n\n\n abstract onIceCandidate(e: RTCPeerConnectionIceEvent): any;\n /**\n * use custorm codec , \n * default is H264/PCMA,\n * TODO 火狐浏览器没有RTCRtpSender.getCapabilities相关方法,是否在createoffer之后进行sdp协议处理来适配编码工作\n * @param videoCodec \n * @param audioCodec \n */\n preferCodec(videoCodec = \"H264\", audioCodec = \"PCMA\") {\n this.videoCodecs = []\n let senderVideoCapabilities = RTCRtpSender.getCapabilities(\"video\")\n if (senderVideoCapabilities !== null) {\n this.videoCodecs.push(...senderVideoCapabilities.codecs.filter(codec => codec.mimeType === `video/${videoCodec}`))\n }\n let reciverVideoCapabilities = RTCRtpReceiver.getCapabilities(\"video\")\n if (reciverVideoCapabilities !== null) {\n this.videoCodecs.push(...reciverVideoCapabilities.codecs.filter(codec => codec.mimeType === `video/${videoCodec}`))\n }\n this.audioCodecs = []\n let senderAudioCapabilities = RTCRtpSender.getCapabilities(\"audio\")\n if (senderAudioCapabilities !== null) {\n this.audioCodecs.push(...senderAudioCapabilities.codecs.filter(codec => codec.mimeType === `audio/${audioCodec}`))\n }\n let reciverAudioCapabilities = RTCRtpReceiver.getCapabilities(\"audio\")\n if (reciverAudioCapabilities !== null) {\n this.audioCodecs.push(...reciverAudioCapabilities.codecs.filter(codec => codec.mimeType === `audio/${audioCodec}`))\n }\n }\n\n trackIsInPeerConnection(track: MediaStreamTrack) {\n return this.peerConnection?.getSenders().some(sender => sender.track?.id === track.id) ?? false\n }\n /**\n * 将本地的track更新到peereonnection 中\n * 只接受流:没有本地stream rtcPeerConnection.addTransceiver(\"video\", {direction: \"recvonly\"});rtcPeerConnection.addTransceiver(\"audio\", {direction: \"recvonly\"});\n * recvonly/sendonly/sendrecv/inactive\n * \n */\n updateTracks() {\n if (this.peerConnection === undefined || this.peerConnection.signalingState === 'closed') {\n throw new Error(\"session is closed !\")\n }\n if (this.audioTrack === undefined && this.videoCodecs === undefined) {\n throw new Error(\"no input found\")\n }\n\n //这里addtrack不指定stream,接收的地方就得ontrack,指定stream,表示由RTCPeerConnection 接管流的管理\n if (this.audioTrack !== undefined && !this.trackIsInPeerConnection(this.audioTrack)) {\n try {\n this.peerConnection.addTrack(this.audioTrack)\n } catch (error) {\n }\n }\n if (this.videoTrack !== undefined && !this.trackIsInPeerConnection(this.videoTrack)) {\n try {\n this.peerConnection.addTrack(this.videoTrack)\n } catch (error) {\n }\n }\n //修改视频编码\n try {\n this.peerConnection.getTransceivers().forEach(transceiver => {\n if (transceiver.sender.track !== null) {\n if (transceiver.sender.track.kind === \"video\") {\n transceiver.setCodecPreferences([...this.videoCodecs])\n } else if (transceiver.sender.track.kind === \"audio\") {\n transceiver.setCodecPreferences([...this.audioCodecs])\n }\n }\n })\n } catch (errorMessage) {\n error(\"preferCodec error\", errorMessage, this.audioCodecs, this.videoCodecs)\n }\n }\n\n\n /**\n * create and format offer\n */\n async createOffer() {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n this.updateTracks()\n let offer = await this.peerConnection.createOffer()\n offer = UscRtcProtocol.formatOffer(offer)\n await this.peerConnection.setLocalDescription(offer)\n return offer\n }\n\n /**\n * set offer \n */\n async setOffer(sdp: string) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n await this.peerConnection.setRemoteDescription({ type: \"offer\", sdp })\n }\n\n /**\n * create answer\n */\n async createAnswer() {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n this.updateTracks()\n let answer = await this.peerConnection.createAnswer()\n this.peerConnection.setLocalDescription(answer)\n return answer\n }\n\n /**\n * set answer\n */\n async setAnswer(sdp: string) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n await this.peerConnection.setRemoteDescription({ type: \"answer\", sdp })\n }\n\n\n /**\n * set ice candidate\n * @param ice \n */\n setRemoteIce(ice: RTCIceCandidateInit) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n let candidate = new RTCIceCandidate(ice)\n this.peerConnection.addIceCandidate(candidate)\n }\n\n /**\n * 关闭链接\n */\n closeConnection(peerConnection: RTCPeerConnection) {\n peerConnection.close()\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onsignalingstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n peerConnection.onnegotiationneeded = null;\n peerConnection.onicecandidateerror = null;\n peerConnection.ondatachannel = null;\n peerConnection.onconnectionstatechange = null\n\n }\n\n /**\n * 销毁会话\n */\n close() {\n super.close()\n if (this.peerConnection !== undefined) {\n this.closeConnection(this.peerConnection)\n this.peerConnection = undefined\n }\n if (this.remoteStream !== undefined) {\n closeStreamAndTrack(this.remoteStream)\n }\n }\n}","/**\n * usc webrtc 协议格式\n */\n\nexport class UscRtcProtocol {\n static formatOffer(offer: RTCSessionDescriptionInit): RTCSessionDescriptionInit {\n let { sdp } = offer\n if (sdp === undefined) {\n throw new Error(\"offer sdp is empty\")\n }\n sdp = sdp.split(\"\\r\\n\").filter(lines => lines.indexOf(\"a=group:BUNDLE\") === -1).join(\"\\r\\n\")\n offer.sdp = sdp\n return offer\n }\n}","import { closeStreamAndTrack } from \"src/peer/StreamUtil\"\nimport { RtcClient } from \"../client/RtcClient\"\nimport RTCPeerConnectionHandler from \"../peer/RTCPeerConnectionHandler\"\nimport { RtcInviteStatus } from \"./RtcInviteStatus\"\n\nexport abstract class RtcAbstractSession extends RTCPeerConnectionHandler {\n sessionId: string\n //隶属的rtcclient\n rtcClient: RtcClient | undefined\n //远端号码\n remoteNumber: string | undefined\n //invite的seq\n inviteSeq?: number\n //offer\n inviteOffer?: string\n\n constructor(rtcClient: RtcClient, sessionId: string, remoteNumber: string | undefined) {\n super()\n this.sessionId = sessionId\n this.rtcClient = rtcClient\n this.remoteNumber = remoteNumber\n }\n\n reciveIceRequest({ ice }: any) {\n this.setRemoteIce(JSON.parse(ice))\n }\n\n\n //获取远端主叫号码\n getRemoteNumber(): string | undefined {\n return this.remoteNumber\n }\n\n\n /**\n * ice candidate is trigger after createoffer or createanswer\n */\n onIceCandidate(e: RTCPeerConnectionIceEvent) {\n // if (e && e.candidate) {\n // this.rtcClient.ice(this.remoteNumber, this.sessionId, e.candidate)\n // }\n }\n\n /**\n * 销毁会话\n */\n destory(isSendBye: boolean = true) {\n this.removeAllListeners()\n if (this.rtcClient !== undefined) {\n if (this.remoteNumber !== undefined) {\n if (isSendBye)\n this.rtcClient.sendBye(this.remoteNumber, this.sessionId)\n this.remoteNumber = undefined\n }\n this.rtcClient.removeSession(this)\n }\n this.rtcClient = undefined\n super.close()\n }\n\n\n //拒绝会话\n rejectCall() {\n let [rtcClient, remoteNumber, inviteSeq] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber, this.inviteSeq)\n rtcClient.answer(RtcInviteStatus.reject, inviteSeq, remoteNumber, this.sessionId)\n this.destory()\n }\n\n //接受会话,不过在这之前应该使用对应接口准备好本地的流(switchToUserMedia/switchToDeviceMedia)\n async acceptCall() {\n if (this.inviteOffer !== undefined) {\n await this.setOffer(this.inviteOffer)\n let [rtcClient, remoteNumber, inviteSeq] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber, this.inviteSeq)\n let { sdp } = await this.createAnswer()\n rtcClient.answer(RtcInviteStatus.ok, inviteSeq, remoteNumber, this.sessionId, sdp)\n }\n }\n\n /**\n * 当同一个会议又收到offer的时候,尝试重新做一个链接,\n * 直接setoffer服务端有一些问题,使用此方案来处理一下,看看是否可行\n */\n async pickNewConnection() {\n if (this.peerConnection !== undefined) {\n this.closeConnection(this.peerConnection)//关闭connection\n }\n this.peerConnection = this.buildConnection()\n if (this.remoteStream !== undefined) {//当前处于会话过程中\n closeStreamAndTrack(this.remoteStream)//关闭远程的流\n this.remoteStream = undefined\n this.acceptCall()\n }\n }\n\n checkIsNotUndefined(...x: any[]) {\n for (const item of x) {\n if (item === undefined) {\n throw new Error(`someone is undefined`)\n }\n }\n return x\n }\n\n //发送dtmf消息\n async sendDtmf(dtmf: string): Promise<any> {\n this.rtcClient?.sendDtmf(this.remoteNumber!, this.sessionId, dtmf)\n }\n}","import { RtcAbstractSession } from './RtcAbstractSession'\nimport { RtcInviteStatus } from \"./RtcInviteStatus\"\nimport { RtcCalledType } from './RtcCalledTyped';\n\n/**\n * Rtc 会话对象封装\n * 流程:\n * 1.创建会话\n * 1.(选择本地流/添加被叫用户)\n * 2.发送请求\n * 3.接受响应\n * 4.开始会话,被拒绝(结束会话)\n * 5.被挂断,主动挂断(结束会话)\n * 6.用户掉线\n */\nexport class RtcSession extends RtcAbstractSession {\n\n responseCallType: RtcCalledType = RtcCalledType.unknown\n /**\n * 开始会话\n */\n async start() {\n let [rtcClient, remoteNumber] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber)\n let offer = await this.createOffer()\n let { status, sdp } = await rtcClient.invite(remoteNumber, this.sessionId, offer.sdp)\n if (status === RtcInviteStatus.ok) {\n await this.setAnswer(sdp);\n }\n\n const lines = sdp.split(\"\\r\\n\") as string[]\n const hasAudio = lines.find(line => line.startsWith(\"m=audio\"))\n const hasVideo = lines.find(line => line.startsWith(\"m=video\"))\n this.responseCallType = hasAudio && hasVideo ? RtcCalledType.audioVideo : hasAudio ? RtcCalledType.audio : hasVideo ? RtcCalledType.video : RtcCalledType.unknown\n return status\n }\n\n /**\n * 添加会话用户\n */\n addRemote(remoteNumber: string) {\n this.remoteNumber = remoteNumber\n }\n}","import { SignalMessageType } from \"./SingalMessageType\"\n\n//消息体\nexport class SignalMessage {\n static random: string = String(Date.now())\n static seqNum: number = 1\n /**\n * 请求类型\n */\n req: SignalMessageType\n /**\n * 每次请求序列号增加1,后端设计如此\n * 导致前端websocket通道无法复用,对于每个账号都使用单独的websocket\n */\n seq: number\n\n /**\n * 信令发送方\n */\n from: string\n\n /**\n * 信令接收方 \n */\n to: string\n\n /**\n * 注册id,后端设计如此,注册成功之后,心跳注册registerid的不变,如果是新的注册,比如断网之后重新连接上,registerid要改变\n */\n registerid: string\n\n constructor(req: SignalMessageType, from: string, to: string, data?: Object) {\n this.req = req\n this.seq = SignalMessage.seqNum++\n this.from = from\n this.to = to\n this.registerid = `${SignalMessage.random}@${from}`\n if (data !== undefined) {\n Object.assign(this, data)\n }\n }\n}","import { log } from '../log/Logger'\nimport { EventEmitter } from \"events\"\nimport { RtcWebSocketEvent } from \"./RtcWebSocketEvent\"\nimport SocketWorker from 'web-worker:./worker.js'\n/**\n * 对websocket进行封装\n */\nexport class RtcWebSocket extends EventEmitter {\n /**\n * signal server address\n */\n server: string\n /**\n * websocket client\n */\n ws: Worker\n\n constructor(server: string) {\n super()\n this.server = server\n this.ws = new SocketWorker()\n }\n\n /**\n * connect to the websocket server\n */\n connect() {\n this.initWebsocket()\n this.ws.onmessage = (e: any) => {\n const { type, data } = e.data\n switch (type) {\n case 'webSocket':\n log(\"websocket recive message \", data)\n this.emit(RtcWebSocketEvent.message, data)\n return;\n case 'open':\n log(\"websocket connected \", this.server)\n this.emit(RtcWebSocketEvent.connected)\n return\n }\n }\n }\n\n initWebsocket() {\n // 配置心跳\n this.ws.postMessage({ cmd: 'config', heartBeat: { timeout: false }, register: { } })\n // 连接socket\n this.ws.postMessage({ cmd: 'start', url: this.server })\n }\n\n send(data: Object) {\n this.ws.postMessage({ cmd: 'msg', data })\n }\n\n\n /**\n * 主动断开websocket,不会触发重连机制\n */\n close(): void {\n this.ws.postMessage({ cmd: 'close' })\n }\n\n /**\n * 发送消息\n */\n sendMessage(message: any): void {\n log(\"websocket send message \", message)\n if (message !== undefined && this.ws !== undefined) {\n this.ws.postMessage({ cmd: 'msg', data: message })\n }\n }\n}","import { EventEmitter } from 'events'\nimport { RtcWebSocketEvent } from './RtcWebSocketEvent'\nimport { RtcWebSocket } from \"./RtcWebSocket\"\n\n/**\n * 内部持有一个websocket,并且对websocket进行管理,对外提供发送消息的接口以及相关事件\n */\nexport abstract class RtcSocketServerHandler extends EventEmitter {\n\n socket?: RtcWebSocket\n server: string | string[]\n activeServer: string = ''\n\n constructor(server: string) {\n super()\n this.server = server\n super.setMaxListeners(0)\n }\n\n\n abstract onReviceMessage(data: any): any\n\n abstract onConnected(): any\n\n abstract onDisConnected(e: CloseEvent): any\n abstract unRegister(): void\n\n /**\n * 测试可用的websocket地址\n */\n async testWs(addrs: string[]) {\n return addrs.reduce((pre, cur) => {\n return pre.then((av) => Promise.resolve(av), (av) => new Promise((resolve, reject) => {\n const socket = new WebSocket(cur)\n socket.onopen = () => {\n av.push(cur)\n socket.close()\n resolve(av)\n }\n socket.onclose = () => {\n reject(av)\n }\n }))\n\n }, Promise.reject([])).then((av) => Promise.resolve(av), (av) => Promise.resolve(av))\n }\n\n /**\n * 修改/设置 websocket地址\n */\n async reConnect(): Promise<void> {\n this.destory()\n let server: string[] = []\n if (this.server !== undefined) {\n if (typeof this.server === 'string') {\n server = [this.server]\n } else {\n server = this.server\n }\n }\n const useWs = await this.testWs(server)\n return new Promise((resolve, reject) => {\n if (useWs.length > 0) {\n this.activeServer = useWs[0]\n let socket = new RtcWebSocket(this.activeServer)\n socket.on(RtcWebSocketEvent.connected, () => {\n this.socket = socket\n this.onConnected()\n resolve()\n })\n socket.on(RtcWebSocketEvent.disconnected, (e: CloseEvent) => {\n this.socket = undefined\n this.onDisConnected(e)\n reject(\"socket connecion failed\")\n })\n socket.on(RtcWebSocketEvent.message, (data) => this.onReviceMessage(data))\n socket.connect()\n } else {\n reject(\"server is empty\")\n }\n })\n }\n\n\n /**\n * 发送消息\n */\n sendMessage(message: any): void {\n if (this.socket !== undefined) {\n this.socket.sendMessage(message)\n } else {\n throw new Error(\"socket is closed\")\n }\n }\n\n\n //销毁socket\n destory() {\n if (this.socket !== undefined) {\n this.unRegister()\n this.socket.close()\n this.socket = undefined\n }\n // this.removeAllListeners()\n }\n}","import { SignalMessage } from './../message/SignalMessage';\nimport { RtcSocketServerHandler } from \"../websocket/RtcSocketServerHandler\"\nimport { RtcClientEvent } from './RtcClientEvent';\n\n/**\n * rtc 信令服务器,用来处理信令消息,以及按照协议获取信令的返回结果\n */\nexport abstract class RtcSignalServer extends RtcSocketServerHandler {\n // local sip number\n localNumber: string\n\n //register signal message expire time (seconds)\n expireTime: number\n\n // promise request \n asyncProducer: Map<number, Function> = new Map<number, Function>()\n\n constructor(server: string, localNumber: string, expireTime: number) {\n super(server)\n this.localNumber = localNumber\n this.expireTime = expireTime\n }\n\n /**\n * 发送需要回应消息的信令消息\n */\n async sendRespondableMessage(message: SignalMessage): Promise<any> {\n this.sendMessage(message)\n return new Promise((resolve) => this.asyncProducer.set(message.seq, resolve))\n }\n\n /**\n * 获取异步回调\n */\n getAsyncResolve(seq: number): Function | undefined {\n let analyzer = this.asyncProducer.get(seq)\n if (analyzer !== undefined) {\n this.asyncProducer.delete(seq)\n }\n return analyzer\n }\n\n //连接断开\n onDisConnected(e?: CloseEvent) {\n //清空异步等待\n this.asyncProducer.clear()\n //事件上报\n this.emit(RtcClientEvent.disconnected, e)\n }\n\n //invoke on message reviced\n onReviceMessage(data: any) {\n let { status, seq } = data\n if (status !== undefined) {\n this.getAsyncResolve(seq)?.call(undefined, data)\n } else {\n this.processMessage(data)\n }\n }\n\n\n abstract processMessage(data: any): any\n}","import { RtcInviteStatus } from './../session/RtcInviteStatus'\nimport { SignalMessageType } from \"../message/SingalMessageType\"\nimport { SignalMessage } from \"../message/SignalMessage\"\nimport { RtcSignalServer } from \"./RtcSignalServer\"\n\n/**\n * 信令请求Api\n */\nexport abstract class RtcSignalApi extends RtcSignalServer {\n\n /**\n * send register message to the server\n */\n async register(): Promise<any> {\n let message = new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": this.expireTime })\n return this.sendRespondableMessage(message)\n }\n\n unRegister(): void {\n let message = new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": 0 })\n this.sendMessage(message)\n }\n\n /**\n * send a invite request to user\n * @param user the remote user who you want invite \n * @param cid the session id\n * @param sdp sdp content\n * @returns \n */\n async invite(user: string, cid: string, sdp?: string): Promise<any> {\n return this.sendRespondableMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_INVITE, this.localNumber, user, { cid, sdp }))\n }\n\n /**\n * send a ice request to user\n * @param user the remote user\n * @param cid session id\n * @param ice ice message\n * @returns \n */\n sendIce(user: string, cid: string, ice: RTCIceCandidate) {\n // return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_ICE, this.localNumber, user, { cid, ice: JSON.stringify(ice) }))\n }\n\n /**\n * send bye message\n * @param user the remote user\n * @param cid session id\n */\n sendBye(user: string, cid: string) {\n return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_BYE, this.localNumber, user, { cid }))\n }\n\n /**\n * answer message\n * @param status answer status\n * @param seq the seq number from offer\n * @param to the remote offer user\n * @param cid session id\n * @param sdp sdp content\n */\n answer(status: RtcInviteStatus, seq: number, to: string, cid: string, sdp?: string) {\n this.sendMessage({ status, seq, from: to, to: this.localNumber, cid, sdp })\n }\n\n //PTT相关接口\n /**\n * answer message\n * @param xd_oper ptt infoType\n * @param xd_name the groupId\n * @param user the ptt user number\n */\n sendPttMessage(data: any) {\n this.sendMessage(data)\n }\n\n //发送dtmf\n async sendDtmf(user: string, cid: string, dtmf: string): Promise<any> {\n return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_INFO, this.localNumber, user, { cid, info: { msg: \"dtmf\", dtmf: dtmf } }))\n }\n\n}","var domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\n\n// nodejs oddity\n// require('events') === require('events').EventEmitter\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active ) ;\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n \n// Alias for removeListener added in NodeJS 10.0\n// https://nodejs.org/api/events.html#events_emitter_off_eventname_listener\nEventEmitter.prototype.off = function(type, listener){\n return this.removeListener(type, listener);\n};\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nconst clientEvent = {\r\n ERROR:'error',\r\n SPEAKER:'speaker',\r\n TALKING:'talking',\r\n ACTIVE_GROUP:'activeGroup',\r\n JOIN_INFO:'joinInfo',\r\n SERVER_CLOSE:'serverClose',\r\n SERVER_ERROR:'serverError',\r\n DISCONNECTED:'disConnected'\r\n};\n\nconst pttErrorCode = {\r\n 400: '消息不符规范',\r\n 401: '验证不通过',\r\n 403: '无权利操作',\r\n 404: '不存在该用户',\r\n 415: '错误参数',\r\n 405: '无法操作',\r\n 424: '不存在XD群',\r\n 425: '管理员没有',\r\n 426: '已存在管理员',\r\n 427: '以前被拒绝过,或者删除过',\r\n 428: '超出所配置的下属管理员的数量',\r\n 429: '群内无用户',\r\n 430: '管理员的索引号冲突',\r\n 431: '还有子管理员存在',\r\n};\n\nconst PttWebSocketEvent = {\r\n connected : \"connected\",// the socket is connected\r\n disconnected : \"disconnected\", // the socket is dis connected\r\n message : \"message\" //收到消息\r\n};\n\n//是否打印日志\r\nlet logAble = true;\r\n//是否在网页上显示日志\r\n\r\nconst log = (title, ...args) => {\r\n if (logAble) {\r\n console.log(\r\n `%c usc-ptt-devtools %c ${title} %c `,\r\n 'background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\r\n 'background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\r\n 'background:transparent',\r\n ...args\r\n );\r\n }\r\n};\r\n\r\nconst error = (title, ...args) => {\r\n if (logAble) {\r\n console.log(\r\n `%c usc-ptt-devtools %c ${title} %c `,\r\n 'background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\r\n 'background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\r\n 'background:transparent',\r\n ...args\r\n );\r\n }\r\n};\r\n\r\nconst disableLog = () => {\r\n logAble = false;\r\n};\r\n\r\nconst enableLog = () => {\r\n logAble = true;\r\n};\n\n/**\r\n * 对websocket进行封装\r\n */\r\nclass PttWebSocket extends EventEmitter {\r\n server = ''\r\n ws = null\r\n\r\n constructor(server) {\r\n super();\r\n this.server = server;\r\n }\r\n\r\n /**\r\n * connect to the websocket server\r\n */\r\n connect() {\r\n this.ws = new WebSocket(this.server);\r\n this.ws.onopen = () => {\r\n log(\"websocket connected \", this.server);\r\n this.emit(PttWebSocketEvent.connected);\r\n };\r\n this.ws.onclose = () => {\r\n log(\"websocket disconnected \", this.server);\r\n this.ws = undefined;\r\n this.emit(PttWebSocketEvent.disconnected);\r\n };\r\n this.ws.onmessage = ({ data }) => {\r\n let message = JSON.parse(data);\r\n log(\"websocket recive message \", message);\r\n this.emit(PttWebSocketEvent.message, message);\r\n };\r\n }\r\n\r\n\r\n /**\r\n * 主动断开websocket,不会触发重连机制\r\n */\r\n close() {\r\n if (this.ws !== undefined) {\r\n this.ws.close();\r\n this.ws = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 发送消息\r\n */\r\n sendMessage(message) {\r\n log(\"websocket send message \", message);\r\n if (message !== undefined && this.ws !== undefined && this.ws.readyState === 1) {\r\n this.ws.send(JSON.stringify(message));\r\n }\r\n }\r\n}\n\n// import PttSocketServerHandler from '../websocket/PttSocketServerHandler.js'\r\nclass PttClient extends EventEmitter{\r\n socket = undefined\r\n timer = undefined\r\n waitinggroup = undefined\r\n speaker = ''\r\n activeGroup = ''\r\n talking = false\r\n constructor(server, heartTime = 20, autoReconnect = true){\r\n super();\r\n if(!server) return error('服务器地址为空!')\r\n this.server = server;\r\n this.heartTime = heartTime;\r\n this.autoReconnect = autoReconnect;\r\n }\r\n\r\n async initClient(){\r\n this.destorySocket();\r\n return new Promise((resolve, reject) => {\r\n if (this.server !== undefined) {\r\n let socket = new PttWebSocket(this.server);\r\n socket.on(PttWebSocketEvent.connected, () => {\r\n this.socket = socket;\r\n this.timer = setInterval(()=>{\r\n this.sendMessage({\"req\": 0});\r\n },this.heartTime*1000);\r\n resolve();\r\n });\r\n socket.on(PttWebSocketEvent.disconnected, () => {\r\n this.socket = undefined;\r\n if(this.autoReconnect){\r\n setTimeout(()=>{\r\n this.initClient();\r\n },3000);\r\n }else {\r\n this.emit(clientEvent.DISCONNECTED);\r\n }\r\n reject(\"socket connecion failed\");\r\n });\r\n socket.on(PttWebSocketEvent.message, (data) => this.onReviceMessage(data));\r\n socket.connect();\r\n } else {\r\n reject(\"server is empty\");\r\n }\r\n })\r\n }\r\n \r\n // 收到消息\r\n onReviceMessage(data){\r\n log(data);\r\n const { info, msg, res } = data;\r\n if (info === 10){\r\n this.speaker = `${msg.speaker}`;\r\n log(`${this.speaker}正在说话`);\r\n this.emit(clientEvent.SPEAKER,this.speaker);\r\n }\r\n if (info === 11) {\r\n if (res.code === 200) {\r\n this.activeGroup = this.waitinggroup;\r\n log(`加入组${this.activeGroup}`);\r\n }\r\n else {\r\n this.activeGroup = '';\r\n error(pttErrorCode[res.code]);\r\n this.emit(clientEvent.ERROR,pttErrorCode[res.code]);\r\n }\r\n this.emit(clientEvent.ACTIVE_GROUP,this.activeGroup);\r\n }\r\n if (info === 13) {\r\n if (res.code === 200)\r\n this.talking = true;\r\n else\r\n this.talking = false;\r\n log(`talking:${this.talking}`);\r\n this.emit(clientEvent.TALKING,this.talking);\r\n }\r\n \r\n if (info === 14){\r\n this.speaker = '';\r\n log(`${this.speaker}停止说话`);\r\n this.emit(clientEvent.SPEAKER,this.speaker);\r\n }\r\n \r\n if (info === 15) {\r\n const user = {\r\n user:msg.number,\r\n group:msg.g_num,\r\n code:msg.status,\r\n };\r\n log(`${user}进入组`);\r\n this.emit(clientEvent.JOIN_INFO,user);\r\n }\r\n }\r\n\r\n joinGroup(group, user, ptts, port) {\r\n if (!this.socket)\r\n return\r\n this.waitinggroup = group;\r\n this.sendMessage({\"req\": 1, \"group\": group, \"user\": user, \"ptts\": ptts, \"port\": port });\r\n }\r\n quitGroup() {\r\n if (!this.socket)\r\n return\r\n this.activeGroup = '';\r\n this.emit(clientEvent.ACTIVE_GROUP,this.activeGroup);\r\n this.sendMessage({\"req\": 2});\r\n }\r\n talk() {\r\n if (!this.socket)\r\n return\r\n this.sendMessage({\"req\": 3});\r\n }\r\n stop() {\r\n this.talking = false;\r\n log(`talking:${this.talking}`);\r\n this.emit(clientEvent.TALKING,this.talking);\r\n if (!this.socket)\r\n return\r\n this.sendMessage({\"req\": 4});\r\n }\r\n\r\n // 发送消息\r\n sendMessage(message) {\r\n if (this.socket !== undefined) {\r\n this.socket.sendMessage(message);\r\n } else {\r\n throw new Error(\"socket is closed\")\r\n }\r\n }\r\n\r\n //销毁socket\r\n destorySocket() {\r\n if (this.socket !== undefined) {\r\n this.socket.close();\r\n this.socket = undefined;\r\n }\r\n }\r\n destory(){\r\n this.destorySocket();\r\n }\r\n}\n\nconst createPttClient = async (server, heartTime = 20, autoReconnect = true)=>{\r\n let client = new PttClient(server, heartTime , autoReconnect);\r\n await client.initClient();\r\n return client\r\n};\n\nexport { PttClient, clientEvent, createPttClient, disableLog, enableLog, pttErrorCode };\n","import { error } from 'src/log/Logger'\nimport { RtcSignalApi } from './RtcSignalApi'\nimport { createPttClient, PttClient, clientEvent } from 'usc-ptt-sdk'\n\n/**\n * RTC终端基础类,用来处理心跳等信息\n */\nexport abstract class RtcClientBase extends RtcSignalApi {\n\n //the default register expire time of seconds\n static defaultExpireTime = 60\n\n //the resgister signal heart beat time (seconds)\n heartTime: number\n heartBeatInterval?: NodeJS.Timeout\n pttClient?: any\n pttServer?: string\n enablePtt?: boolean\n constructor(config: { server: string, localNumber: string, heartTime?: number, expireTime?: number, enablePtt?: boolean, pttServer?: string }) {\n let expireTime = config.expireTime || RtcClientBase.defaultExpireTime\n super(config.server, config.localNumber, expireTime)\n this.heartTime = config.heartTime || this.expireTime / 4\n this.enablePtt = config.enablePtt\n this.pttServer = config.pttServer\n }\n async initPttClient() {\n if (this.enablePtt) {\n if (!this.pttServer) {\n return Promise.reject('pttServer不存在')\n } else {\n const pttClient = await createPttClient(this.pttServer)\n if (!pttClient)\n return Promise.reject('ptt客户端初始化失败!')\n pttClient.on(clientEvent.ACTIVE_GROUP, (e: any) => {\n this.emit(clientEvent.ACTIVE_GROUP, e)\n })\n pttClient.on(clientEvent.SPEAKER, (e: any) => {\n this.emit(clientEvent.SPEAKER, e)\n })\n pttClient.on(clientEvent.TALKING, (e: any) => {\n this.emit(clientEvent.TALKING, e)\n })\n pttClient.on(clientEvent.JOIN_INFO, (e: any) => {\n this.emit(clientEvent.JOIN_INFO, e)\n })\n pttClient.on(clientEvent.DISCONNECTED, (e: any) => {\n this.emit(clientEvent.DISCONNECTED, e)\n })\n this.pttClient = pttClient\n }\n }\n }\n /**\n * \n * @param group 对讲组Id\n * @param user 用户ptt账号\n * @param ptts ptt对讲组使用的webscoket服务器,从ptt组中获取\n * @param port ptt对讲组使用的webscoket服务器端口,从ptt组中获取\n */\n joinGroup(group: string, user: string, ptts: string, port: number) {\n this.pttClient?.joinGroup(group, user, ptts, port)\n }\n quitGroup() {\n this.pttClient?.quitGroup()\n }\n talk() {\n this.pttClient?.talk()\n }\n stop() {\n this.pttClient?.stop()\n }\n\n /**\n * 连接建立成功之后设置定时任务开始发送心跳\n * 如果需要登录之后立即发送心跳,请自行调用register方法,\n * 全局导出的index.ts上createRtcClient上面已经处理此逻辑了\n */\n onConnected() {\n // this.register()\n this.heartBeatInterval = setInterval(() => this.register(), this.heartTime * 1000)\n }\n\n /**\n * 连接断开之后停止发送心跳\n */\n onDisConnected() {\n super.onDisConnected()\n //停止心跳\n if (this.heartBeatInterval !== undefined) {\n clearInterval(this.heartBeatInterval)\n }\n }\n\n}","import { RtcCalledType } from './RtcCalledTyped';\nimport { RtcClient } from \"../client/RtcClient\"\nimport { RtcAbstractSession } from \"./RtcAbstractSession\"\n/**\n * 被叫session\n */\nexport class RtcCalledSession extends RtcAbstractSession {\n callType: RtcCalledType = RtcCalledType.unknown\n //invite seq\n\n constructor(rtcClient: RtcClient, sessionId: string, remoteNumber: string, offerSdp: string, seq: number) {\n super(rtcClient, sessionId, remoteNumber)\n this.inviteSeq = seq\n //不直接setofer,改成存一下,用户接受的时候再set下去,因为对接sip电话的时候,用户还没有同意,流就过来了\n // this.setOffer(offerSdp)\n this.inviteOffer = offerSdp\n const lines = offerSdp.split(\"\\r\\n\")\n const hasAudio = lines.find(line => line.startsWith(\"m=audio\"))\n const hasVideo = lines.find(line => line.startsWith(\"m=video\"))\n this.callType = hasAudio && hasVideo ? RtcCalledType.audioVideo : hasAudio ? RtcCalledType.audio : hasVideo ? RtcCalledType.video : RtcCalledType.unknown\n }\n}","import { RtcSessionEvent } from './../session/RtcSessionEvent';\nimport { RtcClientEvent, PTTEvent } from './RtcClientEvent';\nimport { SignalMessageType, PttMessageType } from './../message/SingalMessageType'\nimport { nanoid } from 'nanoid'\nimport { RtcSession } from './../session/RtcSession'\nimport { RtcClientBase } from './RtcClientBase'\nimport { RtcCalledSession } from '../session/RtcCalledSession'\nimport { RtcAbstractSession } from '../session/RtcAbstractSession'\nexport class RtcClient extends RtcClientBase {\n\n allSession: RtcAbstractSession[] = []\n\n //开启一个视频呼叫会话\n createSession(remoteNumber?: string): RtcSession {\n let session = new RtcSession(this, nanoid(), remoteNumber)\n this.allSession.push(session)\n return session\n }\n\n //处理一些服务端主动发送来的消息\n processMessage(data: any) {\n let { req } = data\n if (req === SignalMessageType.MESSAGE_TYPE_INVITE) {//there is a calling\n // let session = this.allSession.find(se => se.sessionId == data.cid)\n // if (session !== undefined) {//resetoffer\n // session.inviteSeq = data.seq\n // session.inviteOffer = data.sdp\n // //先直接同意吧,服务端不会在没有answer的时候发这个reinvite,后面改成自己这边做状态控制\n // session.acceptCall()\n // session.emit(RtcSessionEvent.reInvite)\n // session.pickNewConnection()\n // } else {//new session\n let session = new RtcCalledSession(this, data.cid, data.from, data.sdp, data.seq)\n this.allSession.push(session)\n this.emit(RtcClientEvent.invite, session)\n // }\n } else if (req === SignalMessageType.MESSAGE_TYPE_REINVITE) {\n let session = this.allSession.find(se => se.sessionId == data.cid)\n if (session !== undefined) {//resetoffer\n session.inviteSeq = data.seq\n session.inviteOffer = data.sdp\n //先直接同意吧,服务端不会在没有answer的时候发这个reinvite,后面改成自己这边做状态控制\n session.acceptCall()\n session.emit(RtcSessionEvent.reInvite, session)\n // session.pickNewConnection()\n }\n }\n else if (req === SignalMessageType.MESSAGE_TYPE_ICE) {//recive ice request\n this.allSession.find(sess => sess.sessionId === data.cid)?.reciveIceRequest(data)\n } else if (req === SignalMessageType.MESSAGE_TYPE_BYE) {//recive bye request\n let session = this.allSession.find(sess => sess.sessionId === data.cid)\n if (session !== undefined) {\n session.emit(RtcSessionEvent.bye)\n session.destory(false)\n }\n }\n if (req == PttMessageType.FPRE) {\n // this.sendPttMessage(JSON.stringify({ xd_oper: PttMessageType.PTT_QUERY_INFO_CONFIRM, xd_name: data.xd_name, \"seq\": data.seq }))\n this.emit(PTTEvent.FPREInfo, data)\n }\n if (req == PttMessageType.IMS) {\n this.emit(PTTEvent.IMSInfo, data)\n }\n }\n\n destory() {\n if (this.allSession !== undefined) {\n this.allSession.forEach(session => {\n session.destory()\n });\n }\n super.destory()\n }\n\n removeSession(session: RtcAbstractSession) {\n if (this.allSession !== undefined) {\n this.allSession = this.allSession.filter(sess => sess.sessionId !== session.sessionId)\n }\n }\n\n onDisConnected() {\n super.onDisConnected()\n this.destory()\n }\n\n}","import { urlAlphabet } from './url-alphabet/index.js'\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import { RtcClient } from './client/RtcClient'\nimport { RtcInviteStatus } from \"./session/RtcInviteStatus\"\nimport { SignalMessage } from \"./message/SignalMessage\"\n\n/**\n * create a rtc client \n * the heartTime and expireTime units are secounds\n */\nexport const createRtcClient = async (config: { server: string, localNumber: string, heartTime?: number, expireTime?: number, enablePtt?: boolean, pttServer?: string }): Promise<RtcClient> => {\n let client = new RtcClient(config)\n await client.reConnect()\n await client.initPttClient().catch((e) => {\n console.error(e);\n })\n SignalMessage.random = String(Date.now()) //modify by jzg\n let message = await client.register()\n\n if (message.status === RtcInviteStatus.ok) {\n return client\n } else {\n client.destory()\n return Promise.reject(message)\n }\n}\n\n/**\n * 获取webrtc授权, 只需要调用一次,在合适的场景下使用就可以了\n */\nexport const authDevice = async () => {\n await navigator.mediaDevices.getUserMedia({ audio: true, video: true })\n}\n\nexport { RtcClient, RtcInviteStatus }\nexport { disableLog, enableLog } from \"./log/Logger\"\nexport { RtcClientEvent, PTTEvent } from \"./client/RtcClientEvent\"\nexport { RtcSessionEvent } from './session/RtcSessionEvent'\nexport { RtcCalledType } from \"./session/RtcCalledTyped\"\nexport { releaseStreamFromContainer, renderStreamToContainer } from \"./peer/StreamUtil\""],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","RtcSessionEvent","RtcClientEvent","PTTEvent","SignalMessageType","PttMessageType","releaseStreamFromContainer","container","undefined","pause","removeAttribute","renderStreamToContainer","stream","srcObject","play","closeStreamAndTrack","onaddtrack","onremovetrack","getTracks","forEach","track","removeTrack","onended","onmute","onunmute","stop","logAble","log","title","args","console","disableLog","enableLog","RtcInviteStatus","RtcCalledType","RtcWebSocketEvent","LocalStreamHandler","EventEmitter","constructor","super","this","localMediaStream","MediaStream","videoConstrains","width","max","height","frameRate","ideal","audioConstrants","noiseSuppression","echoCancellation","autoGainControl","setMaxListeners","releaseTrack","_a","addDeviceChangeListener","listener","navigator","mediaDevices","addEventListener","removeDeviceChangeListener","removeEventListener","setVideoTrack","videoTrack","emit","localVideoChange","from","to","addTrack","localTractChange","setAudioTrack","audioTrack","localAudioChange","renderLocalStreamToContainer","getAllInputResource","all","enumerateDevices","audio","filter","res","kind","video","useDefaultDevice","getUserMedia","getAudioTracks","getVideoTracks","useAudio","deviceId","constraints","Object","assign","useDeviceVideo","useDeskTopVideo","getDisplayMedia","disableAudio","enabled","enableAudio","disableVideo","enableVideo","close","RTCPeerConnectionHandler","videoCodecs","audioCodecs","audioReciveCodecs","preferCodec","peerConnection","buildConnection","RTCPeerConnection","onIceCandidate","reciveTrack","prev","remoteStream","prevSender","getSenders","find","sender","replaceTrack","emitLocalStreamChange","isInMeeting","hasRemoteVideo","strem","some","muted","readyState","localStreamChange","audioOnly","emitRemoteStreamChange","trigerStreamChange","timeout","emitStreamTimeout","clearTimeout","setTimeout","videoCodec","audioCodec","senderVideoCapabilities","RTCRtpSender","getCapabilities","push","codecs","codec","mimeType","reciverVideoCapabilities","RTCRtpReceiver","senderAudioCapabilities","reciverAudioCapabilities","trackIsInPeerConnection","_b","id","updateTracks","signalingState","Error","error","getTransceivers","transceiver","setCodecPreferences","errorMessage","createOffer","offer","static","sdp","split","lines","indexOf","join","formatOffer","setLocalDescription","setOffer","setRemoteDescription","type","createAnswer","answer","setAnswer","setRemoteIce","ice","candidate","RTCIceCandidate","addIceCandidate","closeConnection","ontrack","onicecandidate","oniceconnectionstatechange","onsignalingstatechange","onicegatheringstatechange","onnegotiationneeded","onicecandidateerror","ondatachannel","onconnectionstatechange","RtcAbstractSession","rtcClient","sessionId","remoteNumber","reciveIceRequest","JSON","parse","getRemoteNumber","destory","isSendBye","removeAllListeners","sendBye","removeSession","rejectCall","inviteSeq","checkIsNotUndefined","acceptCall","inviteOffer","ok","pickNewConnection","x","item","sendDtmf","dtmf","RtcSession","responseCallType","unknown","start","status","invite","hasAudio","line","startsWith","hasVideo","audioVideo","addRemote","SignalMessage","req","data","seq","seqNum","registerid","random","String","Date","now","RtcWebSocket","server","ws","SocketWorker","connect","initWebsocket","onmessage","message","connected","postMessage","cmd","heartBeat","register","url","send","sendMessage","RtcSocketServerHandler","activeServer","testWs","addrs","reduce","pre","cur","av","socket","WebSocket","onopen","onclose","reConnect","useWs","length","on","onConnected","disconnected","onDisConnected","onReviceMessage","unRegister","RtcSignalServer","localNumber","expireTime","asyncProducer","Map","sendRespondableMessage","set","getAsyncResolve","analyzer","get","delete","clear","call","processMessage","RtcSignalApi","MESSAGE_TYPE_REGISTER","expire","user","cid","MESSAGE_TYPE_INVITE","sendIce","MESSAGE_TYPE_BYE","sendPttMessage","MESSAGE_TYPE_INFO","info","msg","EventHandlers","init","$getMaxListeners","that","_maxListeners","defaultMaxListeners","emitNone","handler","isFn","self","len","listeners","arrayClone","i","emitOne","arg1","emitTwo","arg2","emitThree","arg3","emitMany","_addListener","target","prepend","m","events","existing","TypeError","_events","newListener","_eventsCount","unshift","warned","w","name","emitter","count","warn","_onceWrap","fired","g","removeListener","arguments","listenerCount","evlistener","arr","copy","Array","prototype","create","usingDomains","domain","active","getPrototypeOf","n","isNaN","getMaxListeners","er","doError","err","context","domainEmitter","domainThrown","addListener","prependListener","once","prependOnceListener","list","position","originalListener","index","k","pop","spliceOne","off","key","keys","ret","unwrapListeners","eventNames","Reflect","ownKeys","clientEvent","pttErrorCode","PttWebSocketEvent","PttWebSocket","stringify","PttClient","timer","waitinggroup","speaker","activeGroup","talking","heartTime","autoReconnect","async","destorySocket","setInterval","initClient","code","number","group","g_num","joinGroup","ptts","port","quitGroup","talk","RtcClientBase","config","defaultExpireTime","enablePtt","pttServer","initPttClient","pttClient","client","createPttClient","heartBeatInterval","clearInterval","RtcCalledSession","offerSdp","callType","RtcClient","allSession","createSession","session","size","crypto","getRandomValues","Uint8Array","byte","toString","toUpperCase","nanoid","MESSAGE_TYPE_REINVITE","se","reInvite","MESSAGE_TYPE_ICE","sess","bye","FPRE","FPREInfo","IMS","IMSInfo","createRtcClient","catch","authDevice"],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).UscRtc={})}(this,(function(e){"use strict";function t(e,t,i,n){return new(i||(i=Promise))((function(s,r){function o(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,a)}c((n=n.apply(e,t||[])).next())}))}var i,n,s,r,o;e.RtcSessionEvent=void 0,(i=e.RtcSessionEvent||(e.RtcSessionEvent={})).bye="bye",i.stream="stream",i.reInvite="reInvite",i.localAudioChange="localAudioChange",i.localVideoChange="localVideoChange",i.localStreamChange="localStreamChange",e.RtcClientEvent=void 0,(n=e.RtcClientEvent||(e.RtcClientEvent={})).connected="connected",n.disconnected="disconnected",n.invite="invite",e.PTTEvent=void 0,(s=e.PTTEvent||(e.PTTEvent={})).PTTInfo="PTTInfo",s.FPREInfo="FPREInfo",s.IMSInfo="IMSInfo",s.ERROR="error",s.SPEAKER="speaker",s.TALKING="talking",s.ACTIVE_GROUP="activeGroup",s.JOIN_INFO="joinInfo",function(e){e.MESSAGE_TYPE_REGISTER="REGISTER",e.MESSAGE_TYPE_INVITE="INVITE",e.MESSAGE_TYPE_REINVITE="reINVITE",e.MESSAGE_TYPE_ICE="ICE",e.MESSAGE_TYPE_INFO="INFO",e.MESSAGE_TYPE_BYE="BYE"}(r||(r={})),function(e){e.FPRE="fpre",e.IMS="ims",e.PTT_QUERY_ONLINE_USER="15",e.PTT_ANSWER_ONLINE_USER="115",e.PTT_QUERY_INFO="16",e.PTT_QUERY_INFO_CONFIRM="116"}(o||(o={}));const a=(e,t)=>{void 0!==e&&void 0!==t&&(t.srcObject=e,t.play())},c=e=>{e.onaddtrack=null,e.onremovetrack=null,e.getTracks().forEach((t=>{null==e||e.removeTrack(t),t.onended=null,t.onmute=null,t.onunmute=null,t.stop()}))};let d=!1;const l=(e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)};var h,u,v;function f(){}function p(){p.init.call(this)}function m(e){return void 0===e._maxListeners?p.defaultMaxListeners:e._maxListeners}function g(e,t,i){if(t)e.call(i);else for(var n=e.length,s=S(e,n),r=0;r<n;++r)s[r].call(i)}function k(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,r=S(e,s),o=0;o<s;++o)r[o].call(i,n)}function y(e,t,i,n,s){if(t)e.call(i,n,s);else for(var r=e.length,o=S(e,r),a=0;a<r;++a)o[a].call(i,n,s)}function C(e,t,i,n,s,r){if(t)e.call(i,n,s,r);else for(var o=e.length,a=S(e,o),c=0;c<o;++c)a[c].call(i,n,s,r)}function T(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,r=S(e,s),o=0;o<s;++o)r[o].apply(i,n)}function w(e,t,i,n){var s,r,o,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((r=e._events)?(r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),o=r[t]):(r=e._events=new f,e._eventsCount=0),o){if("function"==typeof o?o=r[t]=n?[i,o]:[o,i]:n?o.unshift(i):o.push(i),!o.warned&&(s=m(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=r[t]=i,++e._eventsCount;return e}function b(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function E(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function S(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}f.prototype=Object.create(null),p.EventEmitter=p,p.usingDomains=!1,p.prototype.domain=void 0,p.prototype._events=void 0,p.prototype._maxListeners=void 0,p.defaultMaxListeners=10,p.init=function(){this.domain=null,p.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new f,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},p.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},p.prototype.getMaxListeners=function(){return m(this)},p.prototype.emit=function(e){var t,i,n,s,r,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=o[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:g(i,l,this);break;case 2:k(i,l,this,arguments[1]);break;case 3:y(i,l,this,arguments[1],arguments[2]);break;case 4:C(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),r=1;r<n;r++)s[r-1]=arguments[r];T(i,l,this,s)}return!0},p.prototype.addListener=function(e,t){return w(this,e,t,!1)},p.prototype.on=p.prototype.addListener,p.prototype.prependListener=function(e,t){return w(this,e,t,!0)},p.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,b(this,e,t)),this},p.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,b(this,e,t)),this},p.prototype.removeListener=function(e,t){var i,n,s,r,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new f:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,r=i.length;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){o=i[r].listener,s=r;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new f,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,o||t)}return this},p.prototype.off=function(e,t){return this.removeListener(e,t)},p.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new f,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new f:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),r=0;r<s.length;++r)"removeListener"!==(n=s[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new f,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},p.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},p.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):E.call(e,t)},p.prototype.listenerCount=E,p.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};class R extends p{constructor(){super(),this.localMediaStream=new MediaStream,this.videoConstrains={width:{max:1920},height:{max:1080},frameRate:{ideal:20,max:30}},this.audioConstrants={noiseSuppression:!0,echoCancellation:!0,autoGainControl:!0},super.setMaxListeners(0)}releaseTrack(e){var t;void 0!==e&&(null===(t=this.localMediaStream)||void 0===t||t.removeTrack(e),e.stop())}addDeviceChangeListener(e){navigator.mediaDevices.addEventListener("devicechange",e)}removeDeviceChangeListener(e){navigator.mediaDevices.removeEventListener("devicechange",e)}setVideoTrack(t){var i;this.emit(e.RtcSessionEvent.localVideoChange,{from:this.videoTrack,to:t}),this.videoTrack!==t&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(t),this.localTractChange(this.videoTrack,t)),this.videoTrack=t}setAudioTrack(t){var i;this.emit(e.RtcSessionEvent.localAudioChange,{from:this.audioTrack,to:t}),this.audioTrack!==t&&(null===(i=this.localMediaStream)||void 0===i||i.addTrack(t),this.localTractChange(this.audioTrack,t)),this.audioTrack=t}renderLocalStreamToContainer(e){a(this.localMediaStream,e)}getAllInputResource(){return t(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.enumerateDevices();return{audio:e.filter((e=>"audioinput"===e.kind)),video:e.filter((e=>"videoinput"===e.kind))}}))}useDefaultDevice(e){return t(this,void 0,void 0,(function*(){let t=yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0});this.setAudioTrack(t.getAudioTracks()[0]),this.setVideoTrack(t.getVideoTracks()[0]),this.renderLocalStreamToContainer(e)}))}useAudio(e){return t(this,void 0,void 0,(function*(){let t=void 0===e?{audio:Object.assign({},this.audioConstrants),video:!1}:{video:!1,audio:Object.assign({deviceId:e},this.audioConstrants)},i=yield navigator.mediaDevices.getUserMedia(t);return this.setAudioTrack(i.getAudioTracks()[0]),i.getAudioTracks()[0]}))}useDeviceVideo(e){return t(this,void 0,void 0,(function*(){let t=void 0===e?{audio:!1,video:Object.assign({},this.videoConstrains)}:{audio:!1,video:Object.assign({deviceId:e},this.videoConstrains)},i=yield navigator.mediaDevices.getUserMedia(t);return this.setVideoTrack(i.getVideoTracks()[0]),i.getVideoTracks()[0]}))}useDeskTopVideo(){return t(this,void 0,void 0,(function*(){let e=yield navigator.mediaDevices.getDisplayMedia({video:Object.assign({},this.videoConstrains),audio:!1});return this.setVideoTrack(e.getVideoTracks()[0]),e.getVideoTracks()[0]}))}disableAudio(){void 0!==this.audioTrack&&this.audioTrack.enabled&&(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!1,this.setAudioTrack(this.audioTrack))}enableAudio(){void 0===this.audioTrack||this.audioTrack.enabled||(l("local audio status change",this.audioTrack),this.audioTrack.enabled=!0,this.setAudioTrack(this.audioTrack))}disableVideo(){void 0!==this.videoTrack&&this.videoTrack.enabled&&(l("local video status change",this.videoTrack),this.videoTrack.enabled=!1,this.setVideoTrack(this.videoTrack))}enableVideo(){void 0===this.videoTrack||this.videoTrack.enabled||(l("local video status change",this.videoTrack),this.videoTrack.enabled=!0,this.setVideoTrack(this.videoTrack))}close(){this.releaseTrack(this.audioTrack),this.releaseTrack(this.videoTrack),this.audioTrack=void 0,this.videoTrack=void 0,this.localMediaStream=void 0}}class _ extends R{constructor(){super(),this.videoCodecs=[],this.audioCodecs=[],this.audioReciveCodecs=[],this.preferCodec(),this.peerConnection=this.buildConnection()}buildConnection(){let e=new RTCPeerConnection;return e.addEventListener("connectionstatechange",(e=>l("connectionstatechange",e))),e.addEventListener("icecandidate",(e=>{l("icecandidate",e),this.onIceCandidate(e)})),e.addEventListener("datachannel",(e=>l("datachannel",e))),e.addEventListener("icecandidateerror",(e=>l("icecandidateerror",e))),e.addEventListener("iceconnectionstatechange",(e=>l("iceconnectionstatechange",e))),e.addEventListener("icegatheringstatechange",(e=>l("icegatheringstatechange",e))),e.addEventListener("negotiationneeded",(e=>l("negotiationneeded",e))),e.addEventListener("signalingstatechange",(e=>l("signalingstatechange",e))),e.addEventListener("track",(e=>this.reciveTrack(e))),e}localTractChange(e,i){return t(this,void 0,void 0,(function*(){if(void 0!==this.remoteStream&&void 0!==this.peerConnection)if(void 0!==i){let e=this.peerConnection.getSenders().find((e=>{var t;return(null===(t=e.track)||void 0===t?void 0:t.kind)===i.kind}));void 0!==e&&e.replaceTrack(i)}else{let t=this.peerConnection.getSenders().find((t=>{var i;return(null===(i=t.track)||void 0===i?void 0:i.kind)===(null==e?void 0:e.kind)}));void 0!==t&&this.peerConnection.removeTrack(t)}void 0!==i&&(i.onended=e=>l("local track end",e),i.onmute=e=>{l("local mute",e),this.emitLocalStreamChange()},i.onunmute=e=>{l("local unmute",e),this.emitLocalStreamChange()}),this.releaseTrack(e),this.emitLocalStreamChange()}))}isInMeeting(){return void 0!==this.remoteStream}hasRemoteVideo(e){var t;return null!==(t=null==e?void 0:e.getVideoTracks().some((e=>!1===e.muted&&"live"===e.readyState)))&&void 0!==t&&t}emitLocalStreamChange(){this.emit(e.RtcSessionEvent.localStreamChange,{audioOnly:!this.hasRemoteVideo(this.localMediaStream),stream:this.localMediaStream})}emitRemoteStreamChange(){this.emit(e.RtcSessionEvent.stream,{audioOnly:!this.hasRemoteVideo(this.remoteStream),stream:this.remoteStream})}trigerStreamChange(e=100){void 0!==this.emitStreamTimeout&&clearTimeout(this.emitStreamTimeout),this.emitStreamTimeout=setTimeout((()=>{this.emitRemoteStreamChange(),this.emitStreamTimeout=void 0}),e)}reciveTrack(e){l("recive track",e),void 0===this.remoteStream&&(this.remoteStream=new MediaStream),e.track.addEventListener("ended",(()=>this.trigerStreamChange())),e.track.addEventListener("mute",(()=>this.trigerStreamChange(3e3))),e.track.addEventListener("unmute",(()=>this.trigerStreamChange(10))),this.remoteStream.addTrack(e.track),this.trigerStreamChange()}preferCodec(e="H264",t="PCMA"){this.videoCodecs=[];let i=RTCRtpSender.getCapabilities("video");null!==i&&this.videoCodecs.push(...i.codecs.filter((t=>t.mimeType===`video/${e}`)));let n=RTCRtpReceiver.getCapabilities("video");null!==n&&this.videoCodecs.push(...n.codecs.filter((t=>t.mimeType===`video/${e}`))),this.audioCodecs=[];let s=RTCRtpSender.getCapabilities("audio");null!==s&&this.audioCodecs.push(...s.codecs.filter((e=>e.mimeType===`audio/${t}`)));let r=RTCRtpReceiver.getCapabilities("audio");null!==r&&this.audioCodecs.push(...r.codecs.filter((e=>e.mimeType===`audio/${t}`)))}trackIsInPeerConnection(e){var t,i;return null!==(i=null===(t=this.peerConnection)||void 0===t?void 0:t.getSenders().some((t=>{var i;return(null===(i=t.track)||void 0===i?void 0:i.id)===e.id})))&&void 0!==i&&i}updateTracks(){if(void 0===this.peerConnection||"closed"===this.peerConnection.signalingState)throw new Error("session is closed !");if(void 0===this.audioTrack&&void 0===this.videoCodecs)throw new Error("no input found");if(void 0!==this.audioTrack&&!this.trackIsInPeerConnection(this.audioTrack))try{this.peerConnection.addTrack(this.audioTrack)}catch(e){}if(void 0!==this.videoTrack&&!this.trackIsInPeerConnection(this.videoTrack))try{this.peerConnection.addTrack(this.videoTrack)}catch(e){}try{this.peerConnection.getTransceivers().forEach((e=>{null!==e.sender.track&&("video"===e.sender.track.kind?e.setCodecPreferences([...this.videoCodecs]):"audio"===e.sender.track.kind&&e.setCodecPreferences([...this.audioCodecs]))}))}catch(e){((e,...t)=>{d&&console.log(`%c usc-rtc-devtools %c ${e} %c `,"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)})("preferCodec error",e,this.audioCodecs,this.videoCodecs)}}createOffer(){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createOffer();return e=class{static formatOffer(e){let{sdp:t}=e;if(void 0===t)throw new Error("offer sdp is empty");return t=t.split("\r\n").filter((e=>-1===e.indexOf("a=group:BUNDLE"))).join("\r\n"),e.sdp=t,e}}.formatOffer(e),yield this.peerConnection.setLocalDescription(e),e}))}setOffer(e){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"offer",sdp:e})}))}createAnswer(){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");this.updateTracks();let e=yield this.peerConnection.createAnswer();return this.peerConnection.setLocalDescription(e),e}))}setAnswer(e){return t(this,void 0,void 0,(function*(){if(void 0===this.peerConnection)throw new Error("session is closed !");yield this.peerConnection.setRemoteDescription({type:"answer",sdp:e})}))}setRemoteIce(e){if(void 0===this.peerConnection)throw new Error("session is closed !");let t=new RTCIceCandidate(e);this.peerConnection.addIceCandidate(t)}closeConnection(e){e.close(),e.ontrack=null,e.onicecandidate=null,e.oniceconnectionstatechange=null,e.onsignalingstatechange=null,e.onicegatheringstatechange=null,e.onnegotiationneeded=null,e.onicecandidateerror=null,e.ondatachannel=null,e.onconnectionstatechange=null}close(){super.close(),void 0!==this.peerConnection&&(this.closeConnection(this.peerConnection),this.peerConnection=void 0),void 0!==this.remoteStream&&c(this.remoteStream)}}e.RtcInviteStatus=void 0,(h=e.RtcInviteStatus||(e.RtcInviteStatus={}))[h.timeout=408]="timeout",h[h.reject=488]="reject",h[h.busy=486]="busy",h[h.notfound=404]="notfound",h[h.notAllowedMedia=415]="notAllowedMedia",h[h.ok=200]="ok";class I extends _{constructor(e,t,i){super(),this.sessionId=t,this.rtcClient=e,this.remoteNumber=i}reciveIceRequest({ice:e}){this.setRemoteIce(JSON.parse(e))}getRemoteNumber(){return this.remoteNumber}onIceCandidate(e){}destory(e=!0){this.removeAllListeners(),void 0!==this.rtcClient&&(void 0!==this.remoteNumber&&(e&&this.rtcClient.sendBye(this.remoteNumber,this.sessionId),this.remoteNumber=void 0),this.rtcClient.removeSession(this)),this.rtcClient=void 0,super.close()}rejectCall(){let[t,i,n]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq);t.answer(e.RtcInviteStatus.reject,n,i,this.sessionId),this.destory()}acceptCall(){return t(this,void 0,void 0,(function*(){if(void 0!==this.inviteOffer){yield this.setOffer(this.inviteOffer);let[t,i,n]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber,this.inviteSeq),{sdp:s}=yield this.createAnswer();t.answer(e.RtcInviteStatus.ok,n,i,this.sessionId,s)}}))}pickNewConnection(){return t(this,void 0,void 0,(function*(){void 0!==this.peerConnection&&this.closeConnection(this.peerConnection),this.peerConnection=this.buildConnection(),void 0!==this.remoteStream&&(c(this.remoteStream),this.remoteStream=void 0,this.acceptCall())}))}checkIsNotUndefined(...e){for(const t of e)if(void 0===t)throw new Error("someone is undefined");return e}sendDtmf(e){var i;return t(this,void 0,void 0,(function*(){null===(i=this.rtcClient)||void 0===i||i.sendDtmf(this.remoteNumber,this.sessionId,e)}))}}e.RtcCalledType=void 0,(u=e.RtcCalledType||(e.RtcCalledType={})).audio="audio",u.video="video",u.audioVideo="audioVideo",u.unknown="unknown";class L extends I{constructor(){super(...arguments),this.responseCallType=e.RtcCalledType.unknown}start(){return t(this,void 0,void 0,(function*(){let[t,i]=this.checkIsNotUndefined(this.rtcClient,this.remoteNumber),n=yield this.createOffer(),{status:s,sdp:r}=yield t.invite(i,this.sessionId,n.sdp);s===e.RtcInviteStatus.ok&&(yield this.setAnswer(r));const o=r.split("\r\n"),a=o.find((e=>e.startsWith("m=audio"))),c=o.find((e=>e.startsWith("m=video")));return this.responseCallType=a&&c?e.RtcCalledType.audioVideo:a?e.RtcCalledType.audio:c?e.RtcCalledType.video:e.RtcCalledType.unknown,s}))}addRemote(e){this.remoteNumber=e}}class x{constructor(e,t,i,n){this.req=e,this.seq=x.seqNum++,this.from=t,this.to=i,this.registerid=`${x.random}@${t}`,void 0!==n&&Object.assign(this,n)}}x.random=String(Date.now()),x.seqNum=1,function(e){e.connected="connected",e.disconnected="disconnected",e.message="message"}(v||(v={}));var M=null;try{var N="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");M=N.Worker}catch(e){}function P(e,t,i){var n=void 0===t?null:t,s=function(e,t){return Buffer.from(e,"base64").toString(t?"utf16":"utf8")}(e,void 0!==i&&i),r=s.indexOf("\n",10)+1,o=s.substring(r)+(n?"//# sourceMappingURL="+n:"");return function(e){return new M(o,Object.assign({},e,{eval:!0}))}}function G(e,t,i){var n=void 0===t?null:t,s=function(e,t){var i=atob(e);if(t){for(var n=new Uint8Array(i.length),s=0,r=i.length;s<r;++s)n[s]=i.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return i}(e,void 0!==i&&i),r=s.indexOf("\n",10)+1,o=s.substring(r)+(n?"//# sourceMappingURL="+n:""),a=new Blob([o],{type:"application/javascript"});return URL.createObjectURL(a)}var A="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);var O,V,Y,j=(O="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7bGV0IGUsdD0hMTtjb25zdCBzPXNlbGY7c2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZnVuY3Rpb24ocyl7Y29uc3QgYT1zLmRhdGE7c3dpdGNoKGEuY21kKXtjYXNlInN0YXJ0IjpzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJ3ZWJXb3JrZXIiLGRhdGE6IuWQr+WKqHdlYldvcmtlciJ9KSxvKGEudXJsKTticmVhaztjYXNlInN0b3AiOnQ9ITAsZS5jbG9zZSgpLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYldvcmtlciIsZGF0YToi5YGc5q2id2ViV29ya2VyIn0pLHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6ImNsb3NlIixkYXRhOiJjbG9zZSIrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKX0pLHNlbGYuY2xvc2UoKTticmVhaztjYXNlIm1zZyI6MT09PWUucmVhZHlTdGF0ZSYmZS5zZW5kKEpTT04uc3RyaW5naWZ5KGEuZGF0YSkpfX0pLCExKTtjb25zdCBvPWZ1bmN0aW9uKHQpe2V8fChlPW5ldyBXZWJTb2NrZXQodCksZS5vbmVycm9yPWZ1bmN0aW9uKGUpe2EodCl9LGUub25jbG9zZT1mdW5jdGlvbihlKXthKHQpfSxlLm9ub3Blbj1lPT57cy5wb3N0TWVzc2FnZSh7dHlwZToib3BlbiIsZGF0YToic3RhcnQiKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCl9KX0sZS5vbm1lc3NhZ2U9ZT0+e2NvbnN0IHQ9SlNPTi5wYXJzZShlLmRhdGEpO3MucG9zdE1lc3NhZ2Uoe3R5cGU6IndlYlNvY2tldCIsZGF0YTp0fSl9KX07ZnVuY3Rpb24gYShzKXt0fHwodD0hMCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbCxvKHMpLHQ9ITF9KSwyZTMpKX19KCk7Cgo=",V=null,Y=!1,A?P(O,V,Y):function(e,t,i){var n;return function(s){return n=n||G(e,t,i),new Worker(n,s)}}(O,V,Y));class U extends p{constructor(e){super(),this.server=e,this.ws=new j}connect(){this.initWebsocket(),this.ws.onmessage=e=>{const{type:t,data:i}=e.data;switch(t){case"webSocket":return l("websocket recive message ",i),void this.emit(v.message,i);case"open":return l("websocket connected ",this.server),void this.emit(v.connected)}}}initWebsocket(){this.ws.postMessage({cmd:"config",heartBeat:{timeout:!1},register:{}}),this.ws.postMessage({cmd:"start",url:this.server})}send(e){this.ws.postMessage({cmd:"msg",data:e})}close(){this.ws.postMessage({cmd:"close"})}sendMessage(e){l("websocket send message ",e),void 0!==e&&void 0!==this.ws&&this.ws.postMessage({cmd:"msg",data:e})}}class Z extends p{constructor(e){super(),this.activeServer="",this.server=e,super.setMaxListeners(0)}testWs(e){return t(this,void 0,void 0,(function*(){return e.reduce(((e,t)=>e.then((e=>Promise.resolve(e)),(e=>new Promise(((i,n)=>{const s=new WebSocket(t);s.onopen=()=>{e.push(t),s.close(),i(e)},s.onclose=()=>{n(e)}}))))),Promise.reject([])).then((e=>Promise.resolve(e)),(e=>Promise.resolve(e)))}))}reConnect(){return t(this,void 0,void 0,(function*(){this.destory();let e=[];void 0!==this.server&&(e="string"==typeof this.server?[this.server]:this.server);const t=yield this.testWs(e);return new Promise(((e,i)=>{if(t.length>0){this.activeServer=t[0];let n=new U(this.activeServer);n.on(v.connected,(()=>{this.socket=n,this.onConnected(),e()})),n.on(v.disconnected,(e=>{this.socket=void 0,this.onDisConnected(e),i("socket connecion failed")})),n.on(v.message,(e=>this.onReviceMessage(e))),n.connect()}else i("server is empty")}))}))}sendMessage(e){if(void 0===this.socket)throw new Error("socket is closed");this.socket.sendMessage(e)}destory(){void 0!==this.socket&&(this.unRegister(),this.socket.close(),this.socket=void 0)}}class W extends Z{constructor(e,t,i){super(e),this.asyncProducer=new Map,this.localNumber=t,this.expireTime=i}sendRespondableMessage(e){return t(this,void 0,void 0,(function*(){return this.sendMessage(e),new Promise((t=>this.asyncProducer.set(e.seq,t)))}))}getAsyncResolve(e){let t=this.asyncProducer.get(e);return void 0!==t&&this.asyncProducer.delete(e),t}onDisConnected(t){this.asyncProducer.clear(),this.emit(e.RtcClientEvent.disconnected,t)}onReviceMessage(e){var t;let{status:i,seq:n}=e;void 0!==i?null===(t=this.getAsyncResolve(n))||void 0===t||t.call(void 0,e):this.processMessage(e)}}class D extends W{register(){return t(this,void 0,void 0,(function*(){let e=new x(r.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:this.expireTime});return this.sendRespondableMessage(e)}))}unRegister(){let e=new x(r.MESSAGE_TYPE_REGISTER,this.localNumber,this.localNumber,{expire:0});this.sendMessage(e)}invite(e,i,n){return t(this,void 0,void 0,(function*(){return this.sendRespondableMessage(new x(r.MESSAGE_TYPE_INVITE,this.localNumber,e,{cid:i,sdp:n}))}))}sendIce(e,t,i){}sendBye(e,t){return this.sendMessage(new x(r.MESSAGE_TYPE_BYE,this.localNumber,e,{cid:t}))}answer(e,t,i,n,s){this.sendMessage({status:e,seq:t,from:i,to:this.localNumber,cid:n,sdp:s})}sendPttMessage(e){this.sendMessage(e)}sendDtmf(e,i,n){return t(this,void 0,void 0,(function*(){return this.sendMessage(new x(r.MESSAGE_TYPE_INFO,this.localNumber,e,{cid:i,info:{msg:"dtmf",dtmf:n}}))}))}}function K(){}function q(){q.init.call(this)}function X(e){return void 0===e._maxListeners?q.defaultMaxListeners:e._maxListeners}function B(e,t,i){if(t)e.call(i);else for(var n=e.length,s=te(e,n),r=0;r<n;++r)s[r].call(i)}function F(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,r=te(e,s),o=0;o<s;++o)r[o].call(i,n)}function z(e,t,i,n,s){if(t)e.call(i,n,s);else for(var r=e.length,o=te(e,r),a=0;a<r;++a)o[a].call(i,n,s)}function H(e,t,i,n,s,r){if(t)e.call(i,n,s,r);else for(var o=e.length,a=te(e,o),c=0;c<o;++c)a[c].call(i,n,s,r)}function $(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,r=te(e,s),o=0;o<s;++o)r[o].apply(i,n)}function J(e,t,i,n){var s,r,o,a;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((r=e._events)?(r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),o=r[t]):(r=e._events=new K,e._eventsCount=0),o){if("function"==typeof o?o=r[t]=n?[i,o]:[o,i]:n?o.unshift(i):o.push(i),!o.warned&&(s=X(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=r[t]=i,++e._eventsCount;return e}function Q(e,t,i){var n=!1;function s(){e.removeListener(t,s),n||(n=!0,i.apply(e,arguments))}return s.listener=i,s}function ee(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function te(e,t){for(var i=new Array(t);t--;)i[t]=e[t];return i}K.prototype=Object.create(null),q.EventEmitter=q,q.usingDomains=!1,q.prototype.domain=void 0,q.prototype._events=void 0,q.prototype._maxListeners=void 0,q.defaultMaxListeners=10,q.init=function(){this.domain=null,q.usingDomains&&undefined.active,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new K,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},q.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},q.prototype.getMaxListeners=function(){return X(this)},q.prototype.emit=function(e){var t,i,n,s,r,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var d=new Error('Uncaught, unspecified "error" event. ('+t+")");throw d.context=t,d}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=o[e]))return!1;var l="function"==typeof i;switch(n=arguments.length){case 1:B(i,l,this);break;case 2:F(i,l,this,arguments[1]);break;case 3:z(i,l,this,arguments[1],arguments[2]);break;case 4:H(i,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(n-1),r=1;r<n;r++)s[r-1]=arguments[r];$(i,l,this,s)}return!0},q.prototype.addListener=function(e,t){return J(this,e,t,!1)},q.prototype.on=q.prototype.addListener,q.prototype.prependListener=function(e,t){return J(this,e,t,!0)},q.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,Q(this,e,t)),this},q.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,Q(this,e,t)),this},q.prototype.removeListener=function(e,t){var i,n,s,r,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(n=this._events))return this;if(!(i=n[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new K:(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,r=i.length;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){o=i[r].listener,s=r;break}if(s<0)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new K,this;delete n[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,s);n.removeListener&&this.emit("removeListener",e,o||t)}return this},q.prototype.off=function(e,t){return this.removeListener(e,t)},q.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new K,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new K:delete i[e]),this;if(0===arguments.length){for(var n,s=Object.keys(i),r=0;r<s.length;++r)"removeListener"!==(n=s[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=new K,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},q.prototype.listeners=function(e){var t,i=this._events;return i&&(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]},q.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):ee.call(e,t)},q.prototype.listenerCount=ee,q.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};const ie="error",ne="speaker",se="talking",re="activeGroup",oe="joinInfo",ae="disConnected",ce={400:"消息不符规范",401:"验证不通过",403:"无权利操作",404:"不存在该用户",415:"错误参数",405:"无法操作",424:"不存在XD群",425:"管理员没有",426:"已存在管理员",427:"以前被拒绝过,或者删除过",428:"超出所配置的下属管理员的数量",429:"群内无用户",430:"管理员的索引号冲突",431:"还有子管理员存在"},de="connected",le="disconnected",he="message",ue=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)},ve=(e,...t)=>{console.log(`%c usc-ptt-devtools %c ${e} %c `,"background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:transparent",...t)};class fe extends q{server="";ws=null;constructor(e){super(),this.server=e}connect(){this.ws=new WebSocket(this.server),this.ws.onopen=()=>{ue("websocket connected ",this.server),this.emit(de)},this.ws.onclose=()=>{ue("websocket disconnected ",this.server),this.ws=void 0,this.emit(le)},this.ws.onmessage=({data:e})=>{let t=JSON.parse(e);ue("websocket recive message ",t),this.emit(he,t)}}close(){void 0!==this.ws&&(this.ws.close(),this.ws=void 0)}sendMessage(e){ue("websocket send message ",e),void 0!==e&&void 0!==this.ws&&1===this.ws.readyState&&this.ws.send(JSON.stringify(e))}}class pe extends q{socket=void 0;timer=void 0;waitinggroup=void 0;speaker="";activeGroup="";talking=!1;constructor(e,t=20,i=!0){if(super(),!e)return ve("服务器地址为空!");this.server=e,this.heartTime=t,this.autoReconnect=i}async initClient(){return this.destorySocket(),new Promise(((e,t)=>{if(void 0!==this.server){let i=new fe(this.server);i.on(de,(()=>{this.socket=i,this.timer=setInterval((()=>{this.sendMessage({req:0})}),1e3*this.heartTime),e()})),i.on(le,(()=>{this.socket=void 0,this.autoReconnect?setTimeout((()=>{this.initClient()}),3e3):this.emit(ae),t("socket connecion failed")})),i.on(he,(e=>this.onReviceMessage(e))),i.connect()}else t("server is empty")}))}onReviceMessage(e){ue(e);const{info:t,msg:i,res:n}=e;if(10===t&&(this.speaker=`${i.speaker}`,ue(`${this.speaker}正在说话`),this.emit(ne,this.speaker)),11===t&&(200===n.code?(this.activeGroup=this.waitinggroup,ue(`加入组${this.activeGroup}`)):(this.activeGroup="",ve(ce[n.code]),this.emit(ie,ce[n.code])),this.emit(re,this.activeGroup)),13===t&&(200===n.code?this.talking=!0:this.talking=!1,ue(`talking:${this.talking}`),this.emit(se,this.talking)),14===t&&(this.speaker="",ue(`${this.speaker}停止说话`),this.emit(ne,this.speaker)),15===t){const e={user:i.number,group:i.g_num,code:i.status};ue(`${e}进入组`),this.emit(oe,e)}}joinGroup(e,t,i,n){this.socket&&(this.waitinggroup=e,this.sendMessage({req:1,group:e,user:t,ptts:i,port:n}))}quitGroup(){this.socket&&(this.activeGroup="",this.emit(re,this.activeGroup),this.sendMessage({req:2}))}talk(){this.socket&&this.sendMessage({req:3})}stop(){this.talking=!1,ue(`talking:${this.talking}`),this.emit(se,this.talking),this.socket&&this.sendMessage({req:4})}sendMessage(e){if(void 0===this.socket)throw new Error("socket is closed");this.socket.sendMessage(e)}destorySocket(){void 0!==this.socket&&(this.socket.close(),this.socket=void 0)}destory(){this.destorySocket()}}class me extends D{constructor(e){let t=e.expireTime||me.defaultExpireTime;super(e.server,e.localNumber,t),this.heartTime=e.heartTime||this.expireTime/4,this.enablePtt=e.enablePtt,this.pttServer=e.pttServer}initPttClient(){return t(this,void 0,void 0,(function*(){if(this.enablePtt){if(!this.pttServer)return Promise.reject("pttServer不存在");{const e=yield(async(e,t=20,i=!0)=>{let n=new pe(e,t,i);return await n.initClient(),n})(this.pttServer);if(!e)return Promise.reject("ptt客户端初始化失败!");e.on(re,(e=>{this.emit(re,e)})),e.on(ne,(e=>{this.emit(ne,e)})),e.on(se,(e=>{this.emit(se,e)})),e.on(oe,(e=>{this.emit(oe,e)})),e.on(ae,(e=>{this.emit(ae,e)})),this.pttClient=e}}}))}joinGroup(e,t,i,n){var s;null===(s=this.pttClient)||void 0===s||s.joinGroup(e,t,i,n)}quitGroup(){var e;null===(e=this.pttClient)||void 0===e||e.quitGroup()}talk(){var e;null===(e=this.pttClient)||void 0===e||e.talk()}stop(){var e;null===(e=this.pttClient)||void 0===e||e.stop()}onConnected(){this.heartBeatInterval=setInterval((()=>this.register()),1e3*this.heartTime)}onDisConnected(){super.onDisConnected(),void 0!==this.heartBeatInterval&&clearInterval(this.heartBeatInterval)}}me.defaultExpireTime=60;class ge extends I{constructor(t,i,n,s,r){super(t,i,n),this.callType=e.RtcCalledType.unknown,this.inviteSeq=r,this.inviteOffer=s;const o=s.split("\r\n"),a=o.find((e=>e.startsWith("m=audio"))),c=o.find((e=>e.startsWith("m=video")));this.callType=a&&c?e.RtcCalledType.audioVideo:a?e.RtcCalledType.audio:c?e.RtcCalledType.video:e.RtcCalledType.unknown}}class ke extends me{constructor(){super(...arguments),this.allSession=[]}createSession(e){let t=new L(this,((e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce(((e,t)=>e+((t&=63)<36?t.toString(36):t<62?(t-26).toString(36).toUpperCase():t>62?"-":"_")),""))(),e);return this.allSession.push(t),t}processMessage(t){var i;let{req:n}=t;if(n===r.MESSAGE_TYPE_INVITE){let i=new ge(this,t.cid,t.from,t.sdp,t.seq);this.allSession.push(i),this.emit(e.RtcClientEvent.invite,i)}else if(n===r.MESSAGE_TYPE_REINVITE){let i=this.allSession.find((e=>e.sessionId==t.cid));void 0!==i&&(i.inviteSeq=t.seq,i.inviteOffer=t.sdp,i.acceptCall(),i.emit(e.RtcSessionEvent.reInvite,i))}else if(n===r.MESSAGE_TYPE_ICE)null===(i=this.allSession.find((e=>e.sessionId===t.cid)))||void 0===i||i.reciveIceRequest(t);else if(n===r.MESSAGE_TYPE_BYE){let i=this.allSession.find((e=>e.sessionId===t.cid));void 0!==i&&(i.emit(e.RtcSessionEvent.bye),i.destory(!1))}n==o.FPRE&&this.emit(e.PTTEvent.FPREInfo,t),n==o.IMS&&this.emit(e.PTTEvent.IMSInfo,t)}destory(){void 0!==this.allSession&&this.allSession.forEach((e=>{e.destory()})),super.destory()}removeSession(e){void 0!==this.allSession&&(this.allSession=this.allSession.filter((t=>t.sessionId!==e.sessionId)))}onDisConnected(){super.onDisConnected(),this.destory()}}e.RtcClient=ke,e.authDevice=()=>t(void 0,void 0,void 0,(function*(){yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0})})),e.createRtcClient=i=>t(void 0,void 0,void 0,(function*(){let t=new ke(i);yield t.reConnect(),yield t.initPttClient().catch((e=>{console.error(e)})),x.random=String(Date.now());let n=yield t.register();return n.status===e.RtcInviteStatus.ok?t:(t.destory(),Promise.reject(n))})),e.disableLog=()=>{d=!1},e.enableLog=()=>{d=!0},e.releaseStreamFromContainer=e=>{void 0!==e&&(e.pause(),e.removeAttribute("src"),e.removeAttribute("srcObject"))},e.renderStreamToContainer=a,Object.defineProperty(e,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/session/RtcSessionEvent.ts","../src/client/RtcClientEvent.ts","../src/message/SingalMessageType.ts","../src/peer/StreamUtil.ts","../src/log/Logger.ts","../src/session/RtcInviteStatus.ts","../src/session/RtcCalledTyped.ts","../src/websocket/RtcWebSocketEvent.ts","../src/peer/LocalStreamHandler.ts","../src/peer/RTCPeerConnectionHandler.ts","../src/session/UscRtcProtocol.ts","../src/session/RtcAbstractSession.ts","../src/session/RtcSession.ts","../src/message/SignalMessage.ts","../src/websocket/RtcWebSocket.ts","../src/websocket/RtcSocketServerHandler.ts","../src/client/RtcSignalServer.ts","../src/client/RtcSignalApi.ts","../node_modules/usc-ptt-sdk/dist/index.js","../src/client/RtcClientBase.ts","../src/session/RtcCalledSession.ts","../src/client/RtcClient.ts","../node_modules/nanoid/index.browser.js","../src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","/**\n * rtc 会话过程中向上抛出的所有事件\n */\nexport enum RtcSessionEvent {\n //接收到bye请求\n bye = \"bye\",\n //接收到远程的流信息\n stream = \"stream\",\n //会话过程中修改视频流会触发重建invite\n reInvite = \"reInvite\",\n //本地音频流发生变化,流的变化以及是否启用的变化都会触发\n localAudioChange = \"localAudioChange\",\n //本地视频流发生变化,流的变化以及是否启用的变化都会触发\n localVideoChange = \"localVideoChange\",\n //本地流发生变化\n localStreamChange = \"localStreamChange\"\n}","export enum RtcClientEvent {\n connected = \"connected\", //the socket is connected to the server\n\n disconnected = \"disconnected\", //the socket is dis connected to the server\n\n invite = \"invite\",//somebody call you\n}\nexport enum PTTEvent {\n PTTInfo = \"PTTInfo\",\n FPREInfo = 'FPREInfo',\n IMSInfo = \"IMSInfo\",\n ERROR = 'error',\n SPEAKER = 'speaker',\n TALKING = 'talking',\n ACTIVE_GROUP = 'activeGroup',\n JOIN_INFO = 'joinInfo',\n // SERVER_CLOSE = 'serverClose',\n // SERVER_ERROR = 'serverError',\n // DISCONNECTED = 'disConnected'\n\n}","/**\n * 信令服务器的消息头\n * @author xiechanglei\n */\nexport enum SignalMessageType {\n MESSAGE_TYPE_REGISTER = \"REGISTER\",//注册\n MESSAGE_TYPE_INVITE = \"INVITE\",//邀请会话\n MESSAGE_TYPE_REINVITE = \"reINVITE\",//邀请会话\n MESSAGE_TYPE_ICE = \"ICE\",//ice探测消息发送\n MESSAGE_TYPE_INFO = \"INFO\",\n MESSAGE_TYPE_BYE = \"BYE\",//挂断\n}\n\nexport enum PttMessageType {\n FPRE = 'fpre',\n IMS = 'ims',\n PTT_QUERY_ONLINE_USER = \"15\",//在线用户查询\n PTT_ANSWER_ONLINE_USER = \"115\",//服务响应在线用户列表\n PTT_QUERY_INFO = \"16\",//群组在线用户查询通知\n PTT_QUERY_INFO_CONFIRM = \"116\",//确认消息\n}","/**\n * 销毁dom上渲染的流\n */\nexport const releaseStreamFromContainer = (container?: HTMLVideoElement | HTMLAudioElement) => {\n if (container !== undefined) {\n container.pause()\n container.removeAttribute(\"src\")\n container.removeAttribute(\"srcObject\")\n }\n}\n/**\n * 将流渲染到dom上\n */\nexport const renderStreamToContainer = (stream?: MediaStream, container?: HTMLVideoElement | HTMLAudioElement) => {\n if (stream !== undefined && container !== undefined) {\n container.srcObject = stream\n container.play()\n }\n}\n\n/**\n * 关闭流\n */\nexport const closeStreamAndTrack = (stream: MediaStream) => {\n stream.onaddtrack = null;\n stream.onremovetrack = null;\n stream.getTracks().forEach(track => {\n stream?.removeTrack(track)\n track.onended = null\n track.onmute = null\n track.onunmute = null\n track.stop()\n })\n}","//是否打印日志\nlet logAble = false\n//是否在网页上显示日志\n\nexport const log = (title: string, ...args: any) => {\n if (logAble) {\n console.log(\n `%c usc-rtc-devtools %c ${title} %c `,\n 'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\n 'background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\n 'background:transparent',\n ...args\n )\n }\n}\n\nexport const error = (title: string, ...args: any) => {\n if (logAble) {\n console.log(\n `%c usc-rtc-devtools %c ${title} %c `,\n 'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\n 'background:#ff0000 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\n 'background:transparent',\n ...args\n )\n }\n}\n\nexport const disableLog = () => {\n logAble = false\n}\n\nexport const enableLog = () => {\n logAble = true\n}","export enum RtcInviteStatus {\n timeout = 408,\n reject = 488,\n busy = 486,\n notfound = 404,\n notAllowedMedia = 415,//不允许的媒体类型,目前至少包好一个音频媒体流\n ok = 200\n}","/**\n * rtc 会话过程中向上抛出的所有事件\n */\nexport enum RtcCalledType {\n //接收到bye请求\n audio = \"audio\",//音频呼叫\n video = \"video\",//视频呼叫\n audioVideo = \"audioVideo\",//音视频呼叫\n unknown = \"unknown\"//未知\n}","export enum RtcWebSocketEvent {\n connected = \"connected\",// the socket is connected\n disconnected = \"disconnected\", // the socket is dis connected\n message = \"message\" //收到消息\n}","import { renderStreamToContainer } from './StreamUtil';\nimport { RtcSessionEvent } from '../session/RtcSessionEvent';\nimport EventEmitter from 'events'\nimport { log } from '../log/Logger'\n\n\n\n/**\n * devicechange 设备输入变化\n */\nexport default abstract class LocalStreamHandler extends EventEmitter {\n constructor() {\n super()\n // ...........................................................................\n super.setMaxListeners(0)\n }\n //本地流媒体\n audioTrack: MediaStreamTrack | undefined\n videoTrack: MediaStreamTrack | undefined\n localMediaStream: MediaStream | undefined = new MediaStream()\n //https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings\n videoConstrains = { width: { max: 1920 }, height: { max: 1080 }, frameRate: { ideal: 20, max: 30 } }\n audioConstrants = { noiseSuppression: true, echoCancellation: true, autoGainControl: true }\n\n /**\n * 释放track\n */\n releaseTrack(track: MediaStreamTrack | undefined) {\n if (track !== undefined) {\n this.localMediaStream?.removeTrack(track)\n track.stop()\n }\n }\n\n /**\n * 注册设备变化事件,记得组件销毁的时候remove\n */\n addDeviceChangeListener(listener: any) {\n navigator.mediaDevices.addEventListener(\"devicechange\", listener)\n }\n removeDeviceChangeListener(listener: any) {\n navigator.mediaDevices.removeEventListener(\"devicechange\", listener)\n }\n\n /**\n * 设置本地视频输入流\n */\n setVideoTrack(videoTrack: MediaStreamTrack) {\n this.emit(RtcSessionEvent.localVideoChange, { from: this.videoTrack, to: videoTrack })\n if (this.videoTrack !== videoTrack) {\n this.localMediaStream?.addTrack(videoTrack)\n this.localTractChange(this.videoTrack, videoTrack)\n }\n this.videoTrack = videoTrack\n }\n\n\n /**\n * 设置本地音頻输入流\n */\n setAudioTrack(audioTrack: MediaStreamTrack) {\n this.emit(RtcSessionEvent.localAudioChange, { from: this.audioTrack, to: audioTrack })\n if (this.audioTrack !== audioTrack) {\n this.localMediaStream?.addTrack(audioTrack)\n this.localTractChange(this.audioTrack, audioTrack)\n }\n this.audioTrack = audioTrack\n }\n\n abstract localTractChange(prev: MediaStreamTrack | undefined, next: MediaStreamTrack | undefined): void\n\n /**\n * 将流渲染到dom上\n */\n renderLocalStreamToContainer(container: HTMLVideoElement | HTMLAudioElement | undefined) {\n renderStreamToContainer(this.localMediaStream, container)\n }\n\n /**\n * 获取所有的输入设备源\n */\n async getAllInputResource() {\n let all = await navigator.mediaDevices.enumerateDevices();\n return { audio: all.filter(res => res.kind === \"audioinput\"), video: all.filter(res => res.kind === \"videoinput\") }\n }\n\n /**\n * 使用默认的音视频输入源\n */\n async useDefaultDevice(container: HTMLVideoElement | HTMLAudioElement | undefined) {\n let constraints = { audio: true, video: true }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setAudioTrack(stream.getAudioTracks()[0])\n this.setVideoTrack(stream.getVideoTracks()[0])\n this.renderLocalStreamToContainer(container)\n }\n /**\n * 设置本地音频输入流\n * https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia\n * @param deviceId 设备id,如果为空,表示使用默认输入设备\n */\n async useAudio(deviceId?: string) {\n let constraints = deviceId === undefined ? { audio: { ...this.audioConstrants }, video: false } : { video: false, audio: { deviceId, ...this.audioConstrants } }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setAudioTrack(stream.getAudioTracks()[0])\n return stream.getAudioTracks()[0] //modify by jzg 此处需要返回该媒体流对象, 防止在获取流媒体过程中收到挂断请求, 导致流媒体没释放\n }\n\n /**\n * 使用设备视频流\n */\n async useDeviceVideo(deviceId?: string) {\n let constraints = deviceId === undefined ? { audio: false, video: { ...this.videoConstrains } } : { audio: false, video: { deviceId, ...this.videoConstrains } }\n let stream = await navigator.mediaDevices.getUserMedia(constraints)\n this.setVideoTrack(stream.getVideoTracks()[0])\n return stream.getVideoTracks()[0] //modify by jzg\n }\n\n /**\n * 使用桌面视频流\n */\n async useDeskTopVideo() {\n let stream = await navigator.mediaDevices.getDisplayMedia({ video: { ...this.videoConstrains }, audio: false })\n this.setVideoTrack(stream.getVideoTracks()[0])\n return stream.getVideoTracks()[0] //modify by jzg\n }\n /**\n * 禁用本地音频输入\n */\n disableAudio() {\n if (this.audioTrack !== undefined && this.audioTrack.enabled) {\n log(\"local audio status change\", this.audioTrack)\n this.audioTrack.enabled = false\n this.setAudioTrack(this.audioTrack)\n }\n }\n /**\n * 启用本地音频输入\n */\n enableAudio() {\n if (this.audioTrack !== undefined && !this.audioTrack.enabled) {\n log(\"local audio status change\", this.audioTrack)\n this.audioTrack.enabled = true\n this.setAudioTrack(this.audioTrack)\n }\n }\n\n /**\n * 禁用本地视频输入\n */\n disableVideo() {\n if (this.videoTrack !== undefined && this.videoTrack.enabled) {\n log(\"local video status change\", this.videoTrack)\n this.videoTrack.enabled = false\n this.setVideoTrack(this.videoTrack)\n }\n\n }\n\n /**\n * 启用本地视频输入\n */\n enableVideo() {\n if (this.videoTrack !== undefined && !this.videoTrack.enabled) {\n log(\"local video status change\", this.videoTrack)\n this.videoTrack.enabled = true\n this.setVideoTrack(this.videoTrack)\n }\n }\n\n close() {\n this.releaseTrack(this.audioTrack)\n this.releaseTrack(this.videoTrack)\n this.audioTrack = undefined\n this.videoTrack = undefined\n this.localMediaStream = undefined\n }\n}","import { RtcSessionEvent } from './../session/RtcSessionEvent';\nimport { log, error } from '../log/Logger'\nimport { UscRtcProtocol } from '../session/UscRtcProtocol'\nimport LocalStreamHandler from './LocalStreamHandler'\nimport { closeStreamAndTrack } from './StreamUtil';\n\n/**\n * 链接流程\n * https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling\n * TODO 1.音频呼叫\n * TODO 2.会话的过程中切换流\n */\nexport default abstract class RTCPeerConnectionHandler extends LocalStreamHandler {\n //peers\n peerConnection?: RTCPeerConnection\n\n //custorm codec\n videoCodecs: RTCRtpCodecCapability[] = []\n audioCodecs: RTCRtpCodecCapability[] = []\n audioReciveCodecs: RTCRtpCodecCapability[] = []\n remoteStream?: MediaStream\n emitStreamTimeout?: NodeJS.Timeout;\n constructor() {\n super()\n this.preferCodec()\n this.peerConnection = this.buildConnection()\n }\n\n /**生成一个peerconnection */\n buildConnection() {\n //指定dtls 证书\n // let cert = await RTCPeerConnection.generateCertificate({\n // name: 'RSASSA-PKCS1-v1_5',\n // hash: 'SHA-256',\n // modulusLength: 2048,\n // publicExponent: new Uint8Array([1, 0, 1])\n // })\n // this.peerConnection = new RTCPeerConnection({ certificates: [cert] });\n let peerConnection = new RTCPeerConnection()\n peerConnection.addEventListener(\"connectionstatechange\", (e) => log(\"connectionstatechange\", e))\n peerConnection.addEventListener(\"icecandidate\", (e) => { log(\"icecandidate\", e); this.onIceCandidate(e) })\n peerConnection.addEventListener(\"datachannel\", (e) => log(\"datachannel\", e))\n peerConnection.addEventListener(\"icecandidateerror\", (e) => log(\"icecandidateerror\", e))\n peerConnection.addEventListener(\"iceconnectionstatechange\", (e) => log(\"iceconnectionstatechange\", e))\n peerConnection.addEventListener(\"icegatheringstatechange\", (e) => log(\"icegatheringstatechange\", e))\n peerConnection.addEventListener(\"negotiationneeded\", (e) => log(\"negotiationneeded\", e))\n peerConnection.addEventListener(\"signalingstatechange\", (e) => log(\"signalingstatechange\", e))\n peerConnection.addEventListener(\"track\", (e) => this.reciveTrack(e))\n return peerConnection\n }\n\n\n\n //当流本地的流发生变化的时候,判断当前是否处于会话状态,从而进行处理\n async localTractChange(prev: MediaStreamTrack | undefined, next: MediaStreamTrack | undefined) {\n if (this.remoteStream !== undefined && this.peerConnection !== undefined) {//如果处于会话过程中,那么判断之前的sender是否含有该类型的流,如果存在那么就替换,如果不存在,重新发offer\n if (next !== undefined) { //修改流\n let prevSender = this.peerConnection.getSenders().find(sender => sender.track?.kind === next.kind)\n if (prevSender !== undefined) {\n prevSender.replaceTrack(next)\n } else {\n //TODO\n //reoffer 重发offer的时候是三个sender? 然后再peerConnection.removetrack\n }\n } else { //删除流,如果原先存在对应类型的流,直接stop?还是reoffer\n let prevSender = this.peerConnection.getSenders().find(sender => sender.track?.kind === prev?.kind)\n if (prevSender !== undefined) {\n this.peerConnection.removeTrack(prevSender)\n }\n }\n }\n\n //TODO \n if (next !== undefined) {\n next.onended = (e) => log(\"local track end\", e)\n next.onmute = (e) => {\n log(\"local mute\", e)\n this.emitLocalStreamChange()\n }\n next.onunmute = (e) => {\n log(\"local unmute\", e)\n this.emitLocalStreamChange()\n }\n }\n\n this.releaseTrack(prev)\n this.emitLocalStreamChange()\n }\n\n /**\n * 是否处于会议当中\n */\n isInMeeting() {\n return this.remoteStream !== undefined\n }\n\n hasRemoteVideo(strem?: MediaStream) {\n return strem?.getVideoTracks().some(track => track.muted === false && track.readyState === \"live\") ?? false\n }\n\n\n emitLocalStreamChange() {\n this.emit(RtcSessionEvent.localStreamChange, { audioOnly: !this.hasRemoteVideo(this.localMediaStream), stream: this.localMediaStream })\n }\n\n /**\n * 通知用户远程的流发生了变化\n */\n emitRemoteStreamChange() {\n this.emit(RtcSessionEvent.stream, { audioOnly: !this.hasRemoteVideo(this.remoteStream), stream: this.remoteStream })\n }\n\n /**\n * 做个100ms的延时来缓冲流的变化\n */\n trigerStreamChange(timeout: number = 100) {\n if (this.emitStreamTimeout !== undefined) {\n clearTimeout(this.emitStreamTimeout)\n }\n this.emitStreamTimeout = setTimeout(() => {\n this.emitRemoteStreamChange()\n this.emitStreamTimeout = undefined\n }, timeout)\n }\n\n /**\n * 接受track时候的处理事件\n */\n reciveTrack(e: RTCTrackEvent) {\n log(\"recive track\", e)\n if (this.remoteStream === undefined) {\n this.remoteStream = new MediaStream()\n }\n e.track.addEventListener(\"ended\", () => this.trigerStreamChange())\n e.track.addEventListener(\"mute\", () => this.trigerStreamChange(3000))\n e.track.addEventListener(\"unmute\", () => this.trigerStreamChange(10))\n this.remoteStream.addTrack(e.track)\n this.trigerStreamChange()\n }\n\n\n abstract onIceCandidate(e: RTCPeerConnectionIceEvent): any;\n /**\n * use custorm codec , \n * default is H264/PCMA,\n * TODO 火狐浏览器没有RTCRtpSender.getCapabilities相关方法,是否在createoffer之后进行sdp协议处理来适配编码工作\n * @param videoCodec \n * @param audioCodec \n */\n preferCodec(videoCodec = \"H264\", audioCodec = \"PCMA\") {\n this.videoCodecs = []\n let senderVideoCapabilities = RTCRtpSender.getCapabilities(\"video\")\n if (senderVideoCapabilities !== null) {\n this.videoCodecs.push(...senderVideoCapabilities.codecs.filter(codec => codec.mimeType === `video/${videoCodec}`))\n }\n let reciverVideoCapabilities = RTCRtpReceiver.getCapabilities(\"video\")\n if (reciverVideoCapabilities !== null) {\n this.videoCodecs.push(...reciverVideoCapabilities.codecs.filter(codec => codec.mimeType === `video/${videoCodec}`))\n }\n this.audioCodecs = []\n let senderAudioCapabilities = RTCRtpSender.getCapabilities(\"audio\")\n if (senderAudioCapabilities !== null) {\n this.audioCodecs.push(...senderAudioCapabilities.codecs.filter(codec => codec.mimeType === `audio/${audioCodec}`))\n }\n let reciverAudioCapabilities = RTCRtpReceiver.getCapabilities(\"audio\")\n if (reciverAudioCapabilities !== null) {\n this.audioCodecs.push(...reciverAudioCapabilities.codecs.filter(codec => codec.mimeType === `audio/${audioCodec}`))\n }\n }\n\n trackIsInPeerConnection(track: MediaStreamTrack) {\n return this.peerConnection?.getSenders().some(sender => sender.track?.id === track.id) ?? false\n }\n /**\n * 将本地的track更新到peereonnection 中\n * 只接受流:没有本地stream rtcPeerConnection.addTransceiver(\"video\", {direction: \"recvonly\"});rtcPeerConnection.addTransceiver(\"audio\", {direction: \"recvonly\"});\n * recvonly/sendonly/sendrecv/inactive\n * \n */\n updateTracks() {\n if (this.peerConnection === undefined || this.peerConnection.signalingState === 'closed') {\n throw new Error(\"session is closed !\")\n }\n if (this.audioTrack === undefined && this.videoCodecs === undefined) {\n throw new Error(\"no input found\")\n }\n\n //这里addtrack不指定stream,接收的地方就得ontrack,指定stream,表示由RTCPeerConnection 接管流的管理\n if (this.audioTrack !== undefined && !this.trackIsInPeerConnection(this.audioTrack)) {\n try {\n this.peerConnection.addTrack(this.audioTrack)\n } catch (error) {\n }\n }\n if (this.videoTrack !== undefined && !this.trackIsInPeerConnection(this.videoTrack)) {\n try {\n this.peerConnection.addTrack(this.videoTrack)\n } catch (error) {\n }\n }\n //修改视频编码\n try {\n this.peerConnection.getTransceivers().forEach(transceiver => {\n if (transceiver.sender.track !== null) {\n if (transceiver.sender.track.kind === \"video\") {\n transceiver.setCodecPreferences([...this.videoCodecs])\n } else if (transceiver.sender.track.kind === \"audio\") {\n transceiver.setCodecPreferences([...this.audioCodecs])\n }\n }\n })\n } catch (errorMessage) {\n error(\"preferCodec error\", errorMessage, this.audioCodecs, this.videoCodecs)\n }\n }\n\n\n /**\n * create and format offer\n */\n async createOffer() {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n this.updateTracks()\n let offer = await this.peerConnection.createOffer()\n offer = UscRtcProtocol.formatOffer(offer)\n await this.peerConnection.setLocalDescription(offer)\n return offer\n }\n\n /**\n * set offer \n */\n async setOffer(sdp: string) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n await this.peerConnection.setRemoteDescription({ type: \"offer\", sdp })\n }\n\n /**\n * create answer\n */\n async createAnswer() {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n this.updateTracks()\n let answer = await this.peerConnection.createAnswer()\n this.peerConnection.setLocalDescription(answer)\n return answer\n }\n\n /**\n * set answer\n */\n async setAnswer(sdp: string) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n await this.peerConnection.setRemoteDescription({ type: \"answer\", sdp })\n }\n\n\n /**\n * set ice candidate\n * @param ice \n */\n setRemoteIce(ice: RTCIceCandidateInit) {\n if (this.peerConnection === undefined) {\n throw new Error(\"session is closed !\")\n }\n let candidate = new RTCIceCandidate(ice)\n this.peerConnection.addIceCandidate(candidate)\n }\n\n /**\n * 关闭链接\n */\n closeConnection(peerConnection: RTCPeerConnection) {\n peerConnection.close()\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onsignalingstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n peerConnection.onnegotiationneeded = null;\n peerConnection.onicecandidateerror = null;\n peerConnection.ondatachannel = null;\n peerConnection.onconnectionstatechange = null\n\n }\n\n /**\n * 销毁会话\n */\n close() {\n super.close()\n if (this.peerConnection !== undefined) {\n this.closeConnection(this.peerConnection)\n this.peerConnection = undefined\n }\n if (this.remoteStream !== undefined) {\n closeStreamAndTrack(this.remoteStream)\n }\n }\n}","/**\n * usc webrtc 协议格式\n */\n\nexport class UscRtcProtocol {\n static formatOffer(offer: RTCSessionDescriptionInit): RTCSessionDescriptionInit {\n let { sdp } = offer\n if (sdp === undefined) {\n throw new Error(\"offer sdp is empty\")\n }\n sdp = sdp.split(\"\\r\\n\").filter(lines => lines.indexOf(\"a=group:BUNDLE\") === -1).join(\"\\r\\n\")\n offer.sdp = sdp\n return offer\n }\n}","import { closeStreamAndTrack } from \"src/peer/StreamUtil\"\nimport { RtcClient } from \"../client/RtcClient\"\nimport RTCPeerConnectionHandler from \"../peer/RTCPeerConnectionHandler\"\nimport { RtcInviteStatus } from \"./RtcInviteStatus\"\n\nexport abstract class RtcAbstractSession extends RTCPeerConnectionHandler {\n sessionId: string\n //隶属的rtcclient\n rtcClient: RtcClient | undefined\n //远端号码\n remoteNumber: string | undefined\n //invite的seq\n inviteSeq?: number\n //offer\n inviteOffer?: string\n\n constructor(rtcClient: RtcClient, sessionId: string, remoteNumber: string | undefined) {\n super()\n this.sessionId = sessionId\n this.rtcClient = rtcClient\n this.remoteNumber = remoteNumber\n }\n\n reciveIceRequest({ ice }: any) {\n this.setRemoteIce(JSON.parse(ice))\n }\n\n\n //获取远端主叫号码\n getRemoteNumber(): string | undefined {\n return this.remoteNumber\n }\n\n\n /**\n * ice candidate is trigger after createoffer or createanswer\n */\n onIceCandidate(e: RTCPeerConnectionIceEvent) {\n // if (e && e.candidate) {\n // this.rtcClient.ice(this.remoteNumber, this.sessionId, e.candidate)\n // }\n }\n\n /**\n * 销毁会话\n */\n destory(isSendBye: boolean = true) {\n this.removeAllListeners()\n if (this.rtcClient !== undefined) {\n if (this.remoteNumber !== undefined) {\n if (isSendBye)\n this.rtcClient.sendBye(this.remoteNumber, this.sessionId)\n this.remoteNumber = undefined\n }\n this.rtcClient.removeSession(this)\n }\n this.rtcClient = undefined\n super.close()\n }\n\n\n //拒绝会话\n rejectCall() {\n let [rtcClient, remoteNumber, inviteSeq] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber, this.inviteSeq)\n rtcClient.answer(RtcInviteStatus.reject, inviteSeq, remoteNumber, this.sessionId)\n this.destory()\n }\n\n //接受会话,不过在这之前应该使用对应接口准备好本地的流(switchToUserMedia/switchToDeviceMedia)\n async acceptCall() {\n if (this.inviteOffer !== undefined) {\n await this.setOffer(this.inviteOffer)\n let [rtcClient, remoteNumber, inviteSeq] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber, this.inviteSeq)\n let { sdp } = await this.createAnswer()\n rtcClient.answer(RtcInviteStatus.ok, inviteSeq, remoteNumber, this.sessionId, sdp)\n }\n }\n\n /**\n * 当同一个会议又收到offer的时候,尝试重新做一个链接,\n * 直接setoffer服务端有一些问题,使用此方案来处理一下,看看是否可行\n */\n async pickNewConnection() {\n if (this.peerConnection !== undefined) {\n this.closeConnection(this.peerConnection)//关闭connection\n }\n this.peerConnection = this.buildConnection()\n if (this.remoteStream !== undefined) {//当前处于会话过程中\n closeStreamAndTrack(this.remoteStream)//关闭远程的流\n this.remoteStream = undefined\n this.acceptCall()\n }\n }\n\n checkIsNotUndefined(...x: any[]) {\n for (const item of x) {\n if (item === undefined) {\n throw new Error(`someone is undefined`)\n }\n }\n return x\n }\n\n //发送dtmf消息\n async sendDtmf(dtmf: string): Promise<any> {\n this.rtcClient?.sendDtmf(this.remoteNumber!, this.sessionId, dtmf)\n }\n}","import { RtcAbstractSession } from './RtcAbstractSession'\nimport { RtcInviteStatus } from \"./RtcInviteStatus\"\nimport { RtcCalledType } from './RtcCalledTyped';\n\n/**\n * Rtc 会话对象封装\n * 流程:\n * 1.创建会话\n * 1.(选择本地流/添加被叫用户)\n * 2.发送请求\n * 3.接受响应\n * 4.开始会话,被拒绝(结束会话)\n * 5.被挂断,主动挂断(结束会话)\n * 6.用户掉线\n */\nexport class RtcSession extends RtcAbstractSession {\n\n responseCallType: RtcCalledType = RtcCalledType.unknown\n /**\n * 开始会话\n */\n async start() {\n let [rtcClient, remoteNumber] = this.checkIsNotUndefined(this.rtcClient, this.remoteNumber)\n let offer = await this.createOffer()\n let { status, sdp } = await rtcClient.invite(remoteNumber, this.sessionId, offer.sdp)\n if (status === RtcInviteStatus.ok) {\n await this.setAnswer(sdp);\n }\n\n const lines = sdp.split(\"\\r\\n\") as string[]\n const hasAudio = lines.find(line => line.startsWith(\"m=audio\"))\n const hasVideo = lines.find(line => line.startsWith(\"m=video\"))\n this.responseCallType = hasAudio && hasVideo ? RtcCalledType.audioVideo : hasAudio ? RtcCalledType.audio : hasVideo ? RtcCalledType.video : RtcCalledType.unknown\n return status\n }\n\n /**\n * 添加会话用户\n */\n addRemote(remoteNumber: string) {\n this.remoteNumber = remoteNumber\n }\n}","import { SignalMessageType } from \"./SingalMessageType\"\n\n//消息体\nexport class SignalMessage {\n static random: string = String(Date.now())\n static seqNum: number = 1\n /**\n * 请求类型\n */\n req: SignalMessageType\n /**\n * 每次请求序列号增加1,后端设计如此\n * 导致前端websocket通道无法复用,对于每个账号都使用单独的websocket\n */\n seq: number\n\n /**\n * 信令发送方\n */\n from: string\n\n /**\n * 信令接收方 \n */\n to: string\n\n /**\n * 注册id,后端设计如此,注册成功之后,心跳注册registerid的不变,如果是新的注册,比如断网之后重新连接上,registerid要改变\n */\n registerid: string\n\n constructor(req: SignalMessageType, from: string, to: string, data?: Object) {\n this.req = req\n this.seq = SignalMessage.seqNum++\n this.from = from\n this.to = to\n this.registerid = `${SignalMessage.random}@${from}`\n if (data !== undefined) {\n Object.assign(this, data)\n }\n }\n}","import { log } from '../log/Logger'\nimport { EventEmitter } from \"events\"\nimport { RtcWebSocketEvent } from \"./RtcWebSocketEvent\"\nimport SocketWorker from 'web-worker:./worker.js'\n/**\n * 对websocket进行封装\n */\nexport class RtcWebSocket extends EventEmitter {\n /**\n * signal server address\n */\n server: string\n /**\n * websocket client\n */\n ws: Worker\n\n constructor(server: string) {\n super()\n this.server = server\n this.ws = new SocketWorker()\n }\n\n /**\n * connect to the websocket server\n */\n connect() {\n this.initWebsocket()\n this.ws.onmessage = (e: any) => {\n const { type, data } = e.data\n switch (type) {\n case 'webSocket':\n log(\"websocket recive message \", data)\n this.emit(RtcWebSocketEvent.message, data)\n return;\n case 'open':\n log(\"websocket connected \", this.server)\n this.emit(RtcWebSocketEvent.connected)\n return\n }\n }\n }\n\n initWebsocket() {\n // 配置心跳\n this.ws.postMessage({ cmd: 'config', heartBeat: { timeout: false }, register: { } })\n // 连接socket\n this.ws.postMessage({ cmd: 'start', url: this.server })\n }\n\n send(data: Object) {\n this.ws.postMessage({ cmd: 'msg', data })\n }\n\n\n /**\n * 主动断开websocket,不会触发重连机制\n */\n close(): void {\n this.ws.postMessage({ cmd: 'close' })\n }\n\n /**\n * 发送消息\n */\n sendMessage(message: any): void {\n log(\"websocket send message \", message)\n if (message !== undefined && this.ws !== undefined) {\n this.ws.postMessage({ cmd: 'msg', data: message })\n }\n }\n}","import { EventEmitter } from 'events'\nimport { RtcWebSocketEvent } from './RtcWebSocketEvent'\nimport { RtcWebSocket } from \"./RtcWebSocket\"\n\n/**\n * 内部持有一个websocket,并且对websocket进行管理,对外提供发送消息的接口以及相关事件\n */\nexport abstract class RtcSocketServerHandler extends EventEmitter {\n\n socket?: RtcWebSocket\n server: string | string[]\n activeServer: string = ''\n\n constructor(server: string) {\n super()\n this.server = server\n super.setMaxListeners(0)\n }\n\n\n abstract onReviceMessage(data: any): any\n\n abstract onConnected(): any\n\n abstract onDisConnected(e: CloseEvent): any\n abstract unRegister(): void\n\n /**\n * 测试可用的websocket地址\n */\n async testWs(addrs: string[]) {\n return addrs.reduce((pre, cur) => {\n return pre.then((av) => Promise.resolve(av), (av) => new Promise((resolve, reject) => {\n const socket = new WebSocket(cur)\n socket.onopen = () => {\n av.push(cur)\n socket.close()\n resolve(av)\n }\n socket.onclose = () => {\n reject(av)\n }\n }))\n\n }, Promise.reject([])).then((av) => Promise.resolve(av), (av) => Promise.resolve(av))\n }\n\n /**\n * 修改/设置 websocket地址\n */\n async reConnect(): Promise<void> {\n this.destory()\n let server: string[] = []\n if (this.server !== undefined) {\n if (typeof this.server === 'string') {\n server = [this.server]\n } else {\n server = this.server\n }\n }\n const useWs = await this.testWs(server)\n return new Promise((resolve, reject) => {\n if (useWs.length > 0) {\n this.activeServer = useWs[0]\n let socket = new RtcWebSocket(this.activeServer)\n socket.on(RtcWebSocketEvent.connected, () => {\n this.socket = socket\n this.onConnected()\n resolve()\n })\n socket.on(RtcWebSocketEvent.disconnected, (e: CloseEvent) => {\n this.socket = undefined\n this.onDisConnected(e)\n reject(\"socket connecion failed\")\n })\n socket.on(RtcWebSocketEvent.message, (data) => this.onReviceMessage(data))\n socket.connect()\n } else {\n reject(\"server is empty\")\n }\n })\n }\n\n\n /**\n * 发送消息\n */\n sendMessage(message: any): void {\n if (this.socket !== undefined) {\n this.socket.sendMessage(message)\n } else {\n throw new Error(\"socket is closed\")\n }\n }\n\n\n //销毁socket\n destory() {\n if (this.socket !== undefined) {\n this.unRegister()\n this.socket.close()\n this.socket = undefined\n }\n // this.removeAllListeners()\n }\n}","import { SignalMessage } from './../message/SignalMessage';\nimport { RtcSocketServerHandler } from \"../websocket/RtcSocketServerHandler\"\nimport { RtcClientEvent } from './RtcClientEvent';\n\n/**\n * rtc 信令服务器,用来处理信令消息,以及按照协议获取信令的返回结果\n */\nexport abstract class RtcSignalServer extends RtcSocketServerHandler {\n // local sip number\n localNumber: string\n\n //register signal message expire time (seconds)\n expireTime: number\n\n // promise request \n asyncProducer: Map<number, Function> = new Map<number, Function>()\n\n constructor(server: string, localNumber: string, expireTime: number) {\n super(server)\n this.localNumber = localNumber\n this.expireTime = expireTime\n }\n\n /**\n * 发送需要回应消息的信令消息\n */\n async sendRespondableMessage(message: SignalMessage): Promise<any> {\n this.sendMessage(message)\n return new Promise((resolve) => this.asyncProducer.set(message.seq, resolve))\n }\n\n /**\n * 获取异步回调\n */\n getAsyncResolve(seq: number): Function | undefined {\n let analyzer = this.asyncProducer.get(seq)\n if (analyzer !== undefined) {\n this.asyncProducer.delete(seq)\n }\n return analyzer\n }\n\n //连接断开\n onDisConnected(e?: CloseEvent) {\n //清空异步等待\n this.asyncProducer.clear()\n //事件上报\n this.emit(RtcClientEvent.disconnected, e)\n }\n\n //invoke on message reviced\n onReviceMessage(data: any) {\n let { status, seq } = data\n if (status !== undefined) {\n this.getAsyncResolve(seq)?.call(undefined, data)\n } else {\n this.processMessage(data)\n }\n }\n\n\n abstract processMessage(data: any): any\n}","import { RtcInviteStatus } from './../session/RtcInviteStatus'\nimport { SignalMessageType } from \"../message/SingalMessageType\"\nimport { SignalMessage } from \"../message/SignalMessage\"\nimport { RtcSignalServer } from \"./RtcSignalServer\"\n\n/**\n * 信令请求Api\n */\nexport abstract class RtcSignalApi extends RtcSignalServer {\n\n /**\n * send register message to the server\n */\n async register(): Promise<any> {\n let message = new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": this.expireTime })\n return this.sendRespondableMessage(message)\n }\n\n unRegister(): void {\n let message = new SignalMessage(SignalMessageType.MESSAGE_TYPE_REGISTER, this.localNumber, this.localNumber, { \"expire\": 0 })\n this.sendMessage(message)\n }\n\n /**\n * send a invite request to user\n * @param user the remote user who you want invite \n * @param cid the session id\n * @param sdp sdp content\n * @returns \n */\n async invite(user: string, cid: string, sdp?: string): Promise<any> {\n return this.sendRespondableMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_INVITE, this.localNumber, user, { cid, sdp }))\n }\n\n /**\n * send a ice request to user\n * @param user the remote user\n * @param cid session id\n * @param ice ice message\n * @returns \n */\n sendIce(user: string, cid: string, ice: RTCIceCandidate) {\n // return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_ICE, this.localNumber, user, { cid, ice: JSON.stringify(ice) }))\n }\n\n /**\n * send bye message\n * @param user the remote user\n * @param cid session id\n */\n sendBye(user: string, cid: string) {\n return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_BYE, this.localNumber, user, { cid }))\n }\n\n /**\n * answer message\n * @param status answer status\n * @param seq the seq number from offer\n * @param to the remote offer user\n * @param cid session id\n * @param sdp sdp content\n */\n answer(status: RtcInviteStatus, seq: number, to: string, cid: string, sdp?: string) {\n this.sendMessage({ status, seq, from: to, to: this.localNumber, cid, sdp })\n }\n\n //PTT相关接口\n /**\n * answer message\n * @param xd_oper ptt infoType\n * @param xd_name the groupId\n * @param user the ptt user number\n */\n sendPttMessage(data: any) {\n this.sendMessage(data)\n }\n\n //发送dtmf\n async sendDtmf(user: string, cid: string, dtmf: string): Promise<any> {\n return this.sendMessage(new SignalMessage(SignalMessageType.MESSAGE_TYPE_INFO, this.localNumber, user, { cid, info: { msg: \"dtmf\", dtmf: dtmf } }))\n }\n\n}","var domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\n\n// nodejs oddity\n// require('events') === require('events').EventEmitter\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active ) ;\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n \n// Alias for removeListener added in NodeJS 10.0\n// https://nodejs.org/api/events.html#events_emitter_off_eventname_listener\nEventEmitter.prototype.off = function(type, listener){\n return this.removeListener(type, listener);\n};\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nconst clientEvent = {\r\n ERROR:'error',\r\n SPEAKER:'speaker',\r\n TALKING:'talking',\r\n ACTIVE_GROUP:'activeGroup',\r\n JOIN_INFO:'joinInfo',\r\n SERVER_CLOSE:'serverClose',\r\n SERVER_ERROR:'serverError',\r\n DISCONNECTED:'disConnected'\r\n};\n\nconst pttErrorCode = {\r\n 400: '消息不符规范',\r\n 401: '验证不通过',\r\n 403: '无权利操作',\r\n 404: '不存在该用户',\r\n 415: '错误参数',\r\n 405: '无法操作',\r\n 424: '不存在XD群',\r\n 425: '管理员没有',\r\n 426: '已存在管理员',\r\n 427: '以前被拒绝过,或者删除过',\r\n 428: '超出所配置的下属管理员的数量',\r\n 429: '群内无用户',\r\n 430: '管理员的索引号冲突',\r\n 431: '还有子管理员存在',\r\n};\n\nconst PttWebSocketEvent = {\r\n connected : \"connected\",// the socket is connected\r\n disconnected : \"disconnected\", // the socket is dis connected\r\n message : \"message\" //收到消息\r\n};\n\n//是否打印日志\r\nlet logAble = true;\r\n//是否在网页上显示日志\r\n\r\nconst log = (title, ...args) => {\r\n if (logAble) {\r\n console.log(\r\n `%c usc-ptt-devtools %c ${title} %c `,\r\n 'background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\r\n 'background:#14e04e ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\r\n 'background:transparent',\r\n ...args\r\n );\r\n }\r\n};\r\n\r\nconst error = (title, ...args) => {\r\n if (logAble) {\r\n console.log(\r\n `%c usc-ptt-devtools %c ${title} %c `,\r\n 'background:#16aae0 ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',\r\n 'background:#e02514 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',\r\n 'background:transparent',\r\n ...args\r\n );\r\n }\r\n};\r\n\r\nconst disableLog = () => {\r\n logAble = false;\r\n};\r\n\r\nconst enableLog = () => {\r\n logAble = true;\r\n};\n\n/**\r\n * 对websocket进行封装\r\n */\r\nclass PttWebSocket extends EventEmitter {\r\n server = ''\r\n ws = null\r\n\r\n constructor(server) {\r\n super();\r\n this.server = server;\r\n }\r\n\r\n /**\r\n * connect to the websocket server\r\n */\r\n connect() {\r\n this.ws = new WebSocket(this.server);\r\n this.ws.onopen = () => {\r\n log(\"websocket connected \", this.server);\r\n this.emit(PttWebSocketEvent.connected);\r\n };\r\n this.ws.onclose = () => {\r\n log(\"websocket disconnected \", this.server);\r\n this.ws = undefined;\r\n this.emit(PttWebSocketEvent.disconnected);\r\n };\r\n this.ws.onmessage = ({ data }) => {\r\n let message = JSON.parse(data);\r\n log(\"websocket recive message \", message);\r\n this.emit(PttWebSocketEvent.message, message);\r\n };\r\n }\r\n\r\n\r\n /**\r\n * 主动断开websocket,不会触发重连机制\r\n */\r\n close() {\r\n if (this.ws !== undefined) {\r\n this.ws.close();\r\n this.ws = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 发送消息\r\n */\r\n sendMessage(message) {\r\n log(\"websocket send message \", message);\r\n if (message !== undefined && this.ws !== undefined && this.ws.readyState === 1) {\r\n this.ws.send(JSON.stringify(message));\r\n }\r\n }\r\n}\n\n// import PttSocketServerHandler from '../websocket/PttSocketServerHandler.js'\r\nclass PttClient extends EventEmitter{\r\n socket = undefined\r\n timer = undefined\r\n waitinggroup = undefined\r\n speaker = ''\r\n activeGroup = ''\r\n talking = false\r\n constructor(server, heartTime = 20, autoReconnect = true){\r\n super();\r\n if(!server) return error('服务器地址为空!')\r\n this.server = server;\r\n this.heartTime = heartTime;\r\n this.autoReconnect = autoReconnect;\r\n }\r\n\r\n async initClient(){\r\n this.destorySocket();\r\n return new Promise((resolve, reject) => {\r\n if (this.server !== undefined) {\r\n let socket = new PttWebSocket(this.server);\r\n socket.on(PttWebSocketEvent.connected, () => {\r\n this.socket = socket;\r\n this.timer = setInterval(()=>{\r\n this.sendMessage({\"req\": 0});\r\n },this.heartTime*1000);\r\n resolve();\r\n });\r\n socket.on(PttWebSocketEvent.disconnected, () => {\r\n this.socket = undefined;\r\n if(this.autoReconnect){\r\n setTimeout(()=>{\r\n this.initClient();\r\n },3000);\r\n }else {\r\n this.emit(clientEvent.DISCONNECTED);\r\n }\r\n reject(\"socket connecion failed\");\r\n });\r\n socket.on(PttWebSocketEvent.message, (data) => this.onReviceMessage(data));\r\n socket.connect();\r\n } else {\r\n reject(\"server is empty\");\r\n }\r\n })\r\n }\r\n \r\n // 收到消息\r\n onReviceMessage(data){\r\n log(data);\r\n const { info, msg, res } = data;\r\n if (info === 10){\r\n this.speaker = `${msg.speaker}`;\r\n log(`${this.speaker}正在说话`);\r\n this.emit(clientEvent.SPEAKER,this.speaker);\r\n }\r\n if (info === 11) {\r\n if (res.code === 200) {\r\n this.activeGroup = this.waitinggroup;\r\n log(`加入组${this.activeGroup}`);\r\n }\r\n else {\r\n this.activeGroup = '';\r\n error(pttErrorCode[res.code]);\r\n this.emit(clientEvent.ERROR,pttErrorCode[res.code]);\r\n }\r\n this.emit(clientEvent.ACTIVE_GROUP,this.activeGroup);\r\n }\r\n if (info === 13) {\r\n if (res.code === 200)\r\n this.talking = true;\r\n else\r\n this.talking = false;\r\n log(`talking:${this.talking}`);\r\n this.emit(clientEvent.TALKING,this.talking);\r\n }\r\n \r\n if (info === 14){\r\n this.speaker = '';\r\n log(`${this.speaker}停止说话`);\r\n this.emit(clientEvent.SPEAKER,this.speaker);\r\n }\r\n \r\n if (info === 15) {\r\n const user = {\r\n user:msg.number,\r\n group:msg.g_num,\r\n code:msg.status,\r\n };\r\n log(`${user}进入组`);\r\n this.emit(clientEvent.JOIN_INFO,user);\r\n }\r\n }\r\n\r\n joinGroup(group, user, ptts, port) {\r\n if (!this.socket)\r\n return\r\n this.waitinggroup = group;\r\n this.sendMessage({\"req\": 1, \"group\": group, \"user\": user, \"ptts\": ptts, \"port\": port });\r\n }\r\n quitGroup() {\r\n if (!this.socket)\r\n return\r\n this.activeGroup = '';\r\n this.emit(clientEvent.ACTIVE_GROUP,this.activeGroup);\r\n this.sendMessage({\"req\": 2});\r\n }\r\n talk() {\r\n if (!this.socket)\r\n return\r\n this.sendMessage({\"req\": 3});\r\n }\r\n stop() {\r\n this.talking = false;\r\n log(`talking:${this.talking}`);\r\n this.emit(clientEvent.TALKING,this.talking);\r\n if (!this.socket)\r\n return\r\n this.sendMessage({\"req\": 4});\r\n }\r\n\r\n // 发送消息\r\n sendMessage(message) {\r\n if (this.socket !== undefined) {\r\n this.socket.sendMessage(message);\r\n } else {\r\n throw new Error(\"socket is closed\")\r\n }\r\n }\r\n\r\n //销毁socket\r\n destorySocket() {\r\n if (this.socket !== undefined) {\r\n this.socket.close();\r\n this.socket = undefined;\r\n }\r\n }\r\n destory(){\r\n this.destorySocket();\r\n }\r\n}\n\nconst createPttClient = async (server, heartTime = 20, autoReconnect = true)=>{\r\n let client = new PttClient(server, heartTime , autoReconnect);\r\n await client.initClient();\r\n return client\r\n};\n\nexport { PttClient, clientEvent, createPttClient, disableLog, enableLog, pttErrorCode };\n","import { error } from 'src/log/Logger'\nimport { RtcSignalApi } from './RtcSignalApi'\nimport { createPttClient, PttClient, clientEvent } from 'usc-ptt-sdk'\n\n/**\n * RTC终端基础类,用来处理心跳等信息\n */\nexport abstract class RtcClientBase extends RtcSignalApi {\n\n //the default register expire time of seconds\n static defaultExpireTime = 60\n\n //the resgister signal heart beat time (seconds)\n heartTime: number\n heartBeatInterval?: NodeJS.Timeout\n pttClient?: any\n pttServer?: string\n enablePtt?: boolean\n constructor(config: { server: string, localNumber: string, heartTime?: number, expireTime?: number, enablePtt?: boolean, pttServer?: string }) {\n let expireTime = config.expireTime || RtcClientBase.defaultExpireTime\n super(config.server, config.localNumber, expireTime)\n this.heartTime = config.heartTime || this.expireTime / 4\n this.enablePtt = config.enablePtt\n this.pttServer = config.pttServer\n }\n async initPttClient() {\n if (this.enablePtt) {\n if (!this.pttServer) {\n return Promise.reject('pttServer不存在')\n } else {\n const pttClient = await createPttClient(this.pttServer)\n if (!pttClient)\n return Promise.reject('ptt客户端初始化失败!')\n pttClient.on(clientEvent.ACTIVE_GROUP, (e: any) => {\n this.emit(clientEvent.ACTIVE_GROUP, e)\n })\n pttClient.on(clientEvent.SPEAKER, (e: any) => {\n this.emit(clientEvent.SPEAKER, e)\n })\n pttClient.on(clientEvent.TALKING, (e: any) => {\n this.emit(clientEvent.TALKING, e)\n })\n pttClient.on(clientEvent.JOIN_INFO, (e: any) => {\n this.emit(clientEvent.JOIN_INFO, e)\n })\n pttClient.on(clientEvent.DISCONNECTED, (e: any) => {\n this.emit(clientEvent.DISCONNECTED, e)\n })\n this.pttClient = pttClient\n }\n }\n }\n /**\n * \n * @param group 对讲组Id\n * @param user 用户ptt账号\n * @param ptts ptt对讲组使用的webscoket服务器,从ptt组中获取\n * @param port ptt对讲组使用的webscoket服务器端口,从ptt组中获取\n */\n joinGroup(group: string, user: string, ptts: string, port: number) {\n this.pttClient?.joinGroup(group, user, ptts, port)\n }\n quitGroup() {\n this.pttClient?.quitGroup()\n }\n talk() {\n this.pttClient?.talk()\n }\n stop() {\n this.pttClient?.stop()\n }\n\n /**\n * 连接建立成功之后设置定时任务开始发送心跳\n * 如果需要登录之后立即发送心跳,请自行调用register方法,\n * 全局导出的index.ts上createRtcClient上面已经处理此逻辑了\n */\n onConnected() {\n // this.register()\n this.heartBeatInterval = setInterval(() => this.register(), this.heartTime * 1000)\n }\n\n /**\n * 连接断开之后停止发送心跳\n */\n onDisConnected() {\n super.onDisConnected()\n //停止心跳\n if (this.heartBeatInterval !== undefined) {\n clearInterval(this.heartBeatInterval)\n }\n }\n\n}","import { RtcCalledType } from './RtcCalledTyped';\nimport { RtcClient } from \"../client/RtcClient\"\nimport { RtcAbstractSession } from \"./RtcAbstractSession\"\n/**\n * 被叫session\n */\nexport class RtcCalledSession extends RtcAbstractSession {\n callType: RtcCalledType = RtcCalledType.unknown\n //invite seq\n\n constructor(rtcClient: RtcClient, sessionId: string, remoteNumber: string, offerSdp: string, seq: number) {\n super(rtcClient, sessionId, remoteNumber)\n this.inviteSeq = seq\n //不直接setofer,改成存一下,用户接受的时候再set下去,因为对接sip电话的时候,用户还没有同意,流就过来了\n // this.setOffer(offerSdp)\n this.inviteOffer = offerSdp\n const lines = offerSdp.split(\"\\r\\n\")\n const hasAudio = lines.find(line => line.startsWith(\"m=audio\"))\n const hasVideo = lines.find(line => line.startsWith(\"m=video\"))\n this.callType = hasAudio && hasVideo ? RtcCalledType.audioVideo : hasAudio ? RtcCalledType.audio : hasVideo ? RtcCalledType.video : RtcCalledType.unknown\n }\n}","import { RtcSessionEvent } from './../session/RtcSessionEvent';\nimport { RtcClientEvent, PTTEvent } from './RtcClientEvent';\nimport { SignalMessageType, PttMessageType } from './../message/SingalMessageType'\nimport { nanoid } from 'nanoid'\nimport { RtcSession } from './../session/RtcSession'\nimport { RtcClientBase } from './RtcClientBase'\nimport { RtcCalledSession } from '../session/RtcCalledSession'\nimport { RtcAbstractSession } from '../session/RtcAbstractSession'\nexport class RtcClient extends RtcClientBase {\n\n allSession: RtcAbstractSession[] = []\n\n //开启一个视频呼叫会话\n createSession(remoteNumber?: string): RtcSession {\n let session = new RtcSession(this, nanoid(), remoteNumber)\n this.allSession.push(session)\n return session\n }\n\n //处理一些服务端主动发送来的消息\n processMessage(data: any) {\n let { req } = data\n if (req === SignalMessageType.MESSAGE_TYPE_INVITE) {//there is a calling\n // let session = this.allSession.find(se => se.sessionId == data.cid)\n // if (session !== undefined) {//resetoffer\n // session.inviteSeq = data.seq\n // session.inviteOffer = data.sdp\n // //先直接同意吧,服务端不会在没有answer的时候发这个reinvite,后面改成自己这边做状态控制\n // session.acceptCall()\n // session.emit(RtcSessionEvent.reInvite)\n // session.pickNewConnection()\n // } else {//new session\n let session = new RtcCalledSession(this, data.cid, data.from, data.sdp, data.seq)\n this.allSession.push(session)\n this.emit(RtcClientEvent.invite, session)\n // }\n } else if (req === SignalMessageType.MESSAGE_TYPE_REINVITE) {\n let session = this.allSession.find(se => se.sessionId == data.cid)\n if (session !== undefined) {//resetoffer\n session.inviteSeq = data.seq\n session.inviteOffer = data.sdp\n //先直接同意吧,服务端不会在没有answer的时候发这个reinvite,后面改成自己这边做状态控制\n session.acceptCall()\n session.emit(RtcSessionEvent.reInvite, session)\n // session.pickNewConnection()\n }\n }\n else if (req === SignalMessageType.MESSAGE_TYPE_ICE) {//recive ice request\n this.allSession.find(sess => sess.sessionId === data.cid)?.reciveIceRequest(data)\n } else if (req === SignalMessageType.MESSAGE_TYPE_BYE) {//recive bye request\n let session = this.allSession.find(sess => sess.sessionId === data.cid)\n if (session !== undefined) {\n session.emit(RtcSessionEvent.bye)\n session.destory(false)\n }\n }\n if (req == PttMessageType.FPRE) {\n // this.sendPttMessage(JSON.stringify({ xd_oper: PttMessageType.PTT_QUERY_INFO_CONFIRM, xd_name: data.xd_name, \"seq\": data.seq }))\n this.emit(PTTEvent.FPREInfo, data)\n }\n if (req == PttMessageType.IMS) {\n this.emit(PTTEvent.IMSInfo, data)\n }\n }\n\n destory() {\n if (this.allSession !== undefined) {\n this.allSession.forEach(session => {\n session.destory()\n });\n }\n super.destory()\n }\n\n removeSession(session: RtcAbstractSession) {\n if (this.allSession !== undefined) {\n this.allSession = this.allSession.filter(sess => sess.sessionId !== session.sessionId)\n }\n }\n\n onDisConnected() {\n super.onDisConnected()\n this.destory()\n }\n\n}","import { urlAlphabet } from './url-alphabet/index.js'\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import { RtcClient } from './client/RtcClient'\nimport { RtcInviteStatus } from \"./session/RtcInviteStatus\"\nimport { SignalMessage } from \"./message/SignalMessage\"\n\n/**\n * create a rtc client \n * the heartTime and expireTime units are secounds\n */\nexport const createRtcClient = async (config: { server: string, localNumber: string, heartTime?: number, expireTime?: number, enablePtt?: boolean, pttServer?: string }): Promise<RtcClient> => {\n let client = new RtcClient(config)\n await client.reConnect()\n await client.initPttClient().catch((e) => {\n console.error(e);\n })\n SignalMessage.random = String(Date.now()) //modify by jzg\n let message = await client.register()\n\n if (message.status === RtcInviteStatus.ok) {\n return client\n } else {\n client.destory()\n return Promise.reject(message)\n }\n}\n\n/**\n * 获取webrtc授权, 只需要调用一次,在合适的场景下使用就可以了\n */\nexport const authDevice = async () => {\n await navigator.mediaDevices.getUserMedia({ audio: true, video: true })\n}\n\nexport { RtcClient, RtcInviteStatus }\nexport { disableLog, enableLog } from \"./log/Logger\"\nexport { RtcClientEvent, PTTEvent } from \"./client/RtcClientEvent\"\nexport { RtcSessionEvent } from './session/RtcSessionEvent'\nexport { RtcCalledType } from \"./session/RtcCalledTyped\"\nexport { releaseStreamFromContainer, renderStreamToContainer } from \"./peer/StreamUtil\""],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","RtcSessionEvent","RtcClientEvent","PTTEvent","SignalMessageType","PttMessageType","exports","renderStreamToContainer","stream","container","undefined","srcObject","play","closeStreamAndTrack","onaddtrack","onremovetrack","getTracks","forEach","track","removeTrack","onended","onmute","onunmute","stop","logAble","log","title","args","console","RtcInviteStatus","RtcCalledType","RtcWebSocketEvent","LocalStreamHandler","EventEmitter","constructor","super","this","localMediaStream","MediaStream","videoConstrains","width","max","height","frameRate","ideal","audioConstrants","noiseSuppression","echoCancellation","autoGainControl","setMaxListeners","releaseTrack","_a","addDeviceChangeListener","listener","navigator","mediaDevices","addEventListener","removeDeviceChangeListener","removeEventListener","setVideoTrack","videoTrack","emit","localVideoChange","from","to","addTrack","localTractChange","setAudioTrack","audioTrack","localAudioChange","renderLocalStreamToContainer","getAllInputResource","all","enumerateDevices","audio","filter","res","kind","video","useDefaultDevice","getUserMedia","getAudioTracks","getVideoTracks","useAudio","deviceId","constraints","Object","assign","useDeviceVideo","useDeskTopVideo","getDisplayMedia","disableAudio","enabled","enableAudio","disableVideo","enableVideo","close","RTCPeerConnectionHandler","videoCodecs","audioCodecs","audioReciveCodecs","preferCodec","peerConnection","buildConnection","RTCPeerConnection","onIceCandidate","reciveTrack","prev","remoteStream","prevSender","getSenders","find","sender","replaceTrack","emitLocalStreamChange","isInMeeting","hasRemoteVideo","strem","some","muted","readyState","localStreamChange","audioOnly","emitRemoteStreamChange","trigerStreamChange","timeout","emitStreamTimeout","clearTimeout","setTimeout","videoCodec","audioCodec","senderVideoCapabilities","RTCRtpSender","getCapabilities","push","codecs","codec","mimeType","reciverVideoCapabilities","RTCRtpReceiver","senderAudioCapabilities","reciverAudioCapabilities","trackIsInPeerConnection","_b","id","updateTracks","signalingState","Error","error","getTransceivers","transceiver","setCodecPreferences","errorMessage","createOffer","offer","static","sdp","split","lines","indexOf","join","formatOffer","setLocalDescription","setOffer","setRemoteDescription","type","createAnswer","answer","setAnswer","setRemoteIce","ice","candidate","RTCIceCandidate","addIceCandidate","closeConnection","ontrack","onicecandidate","oniceconnectionstatechange","onsignalingstatechange","onicegatheringstatechange","onnegotiationneeded","onicecandidateerror","ondatachannel","onconnectionstatechange","RtcAbstractSession","rtcClient","sessionId","remoteNumber","reciveIceRequest","JSON","parse","getRemoteNumber","destory","isSendBye","removeAllListeners","sendBye","removeSession","rejectCall","inviteSeq","checkIsNotUndefined","acceptCall","inviteOffer","ok","pickNewConnection","x","item","sendDtmf","dtmf","RtcSession","responseCallType","unknown","start","status","invite","hasAudio","line","startsWith","hasVideo","audioVideo","addRemote","SignalMessage","req","data","seq","seqNum","registerid","random","String","Date","now","RtcWebSocket","server","ws","SocketWorker","connect","initWebsocket","onmessage","message","connected","postMessage","cmd","heartBeat","register","url","send","sendMessage","RtcSocketServerHandler","activeServer","testWs","addrs","reduce","pre","cur","av","socket","WebSocket","onopen","onclose","reConnect","useWs","length","on","onConnected","disconnected","onDisConnected","onReviceMessage","unRegister","RtcSignalServer","localNumber","expireTime","asyncProducer","Map","sendRespondableMessage","set","getAsyncResolve","analyzer","get","delete","clear","call","processMessage","RtcSignalApi","MESSAGE_TYPE_REGISTER","expire","user","cid","MESSAGE_TYPE_INVITE","sendIce","MESSAGE_TYPE_BYE","sendPttMessage","MESSAGE_TYPE_INFO","info","msg","EventHandlers","init","$getMaxListeners","that","_maxListeners","defaultMaxListeners","emitNone","handler","isFn","self","len","listeners","arrayClone","i","emitOne","arg1","emitTwo","arg2","emitThree","arg3","emitMany","_addListener","target","prepend","m","events","existing","TypeError","_events","newListener","_eventsCount","unshift","warned","w","name","emitter","count","warn","_onceWrap","fired","g","removeListener","arguments","listenerCount","evlistener","arr","copy","Array","prototype","create","usingDomains","domain","active","getPrototypeOf","n","isNaN","getMaxListeners","er","doError","err","context","domainEmitter","domainThrown","addListener","prependListener","once","prependOnceListener","list","position","originalListener","index","k","pop","spliceOne","off","key","keys","ret","unwrapListeners","eventNames","Reflect","ownKeys","clientEvent","pttErrorCode","PttWebSocketEvent","PttWebSocket","stringify","PttClient","timer","waitinggroup","speaker","activeGroup","talking","heartTime","autoReconnect","async","destorySocket","setInterval","initClient","code","number","group","g_num","joinGroup","ptts","port","quitGroup","talk","RtcClientBase","config","defaultExpireTime","enablePtt","pttServer","initPttClient","pttClient","client","createPttClient","heartBeatInterval","clearInterval","RtcCalledSession","offerSdp","callType","RtcClient","allSession","createSession","session","size","crypto","getRandomValues","Uint8Array","byte","toString","toUpperCase","nanoid","MESSAGE_TYPE_REINVITE","se","reInvite","MESSAGE_TYPE_ICE","sess","bye","FPRE","FPREInfo","IMS","IMSInfo","catch","pause","removeAttribute"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "usc-rtc-client",
3
+ "version": "1.0.1",
4
+ "description": "usc rtc client",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "rollup -c"
9
+ },
10
+ "exports": {
11
+ "import": "./dist/index.esm.js",
12
+ "require": "./dist/index.js"
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "keywords": [],
18
+ "author": "",
19
+ "license": "ISC",
20
+ "devDependencies": {
21
+ "@rollup/plugin-commonjs": "^22.0.0",
22
+ "@rollup/plugin-node-resolve": "^13.3.0",
23
+ "@types/events": "^3.0.0",
24
+ "@types/pako": "^1.0.3",
25
+ "nodejs-websocket": "^1.7.2",
26
+ "rollup": "^2.73.0",
27
+ "rollup-plugin-polyfill-node": "^0.9.0",
28
+ "rollup-plugin-terser": "^7.0.2",
29
+ "rollup-plugin-ts": "^2.0.7",
30
+ "rollup-plugin-web-worker-loader": "^1.6.1",
31
+ "typescript": "^4.6.4"
32
+ },
33
+ "dependencies": {
34
+ "nanoid": "^3.3.2",
35
+ "pako": "^2.0.4",
36
+ "usc-ptt-sdk": "^1.0.5"
37
+ }
38
+ }