@tencentcloud/sdk-mcp 1.1.8 → 1.1.9
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/package.json +1 -1
- package/resource/doc/tuicallkit/react/.gitkeep +0 -0
- package/resource/doc/tuicallkit/react/api_TUICallKit.md +1909 -0
- package/resource/doc/tuicallkit/react/how_to_integrated_react_callkit.md +195 -0
- package/resource/doc/tuicallkit/react/how_to_run_react_callkit_demo.md +93 -0
- package/resource/doc/tuicallkit/vue/.gitkeep +0 -0
- package/resource/doc/tuicallkit/vue/api_TUICallKit.md +1912 -0
- package/resource/doc/tuicallkit/vue/how_to_integrated_vue_callkit.md +418 -0
- package/resource/doc/tuicallkit/vue/how_to_run_vue_callkit_demo.md +96 -0
- package/server-config.js +5 -0
- package/server-config.js.map +1 -1
- package/tools/common/get-official-experience-account.js +11 -5
- package/tools/common/get-official-experience-account.js.map +1 -1
- package/tools/common/get-usersig.js +11 -5
- package/tools/common/get-usersig.js.map +1 -1
- package/utils/report-client.js +61 -0
- package/utils/report-client.js.map +1 -0
- /package/resource/doc/chatuikit/{iOS → ios}/client_api_iOS.md +0 -0
- /package/resource/doc/chatuikit/{iOS → ios}/integrate_tuichat_only_iOS.md +0 -0
- /package/resource/doc/chatuikit/{iOS → ios}/integrate_tuikit_iOS.md +0 -0
- /package/resource/doc/chatuikit/{iOS → ios}/ui_api_iOS.md +0 -0
- /package/resource/doc/tuicallkit/{iOS → ios}/api_TUICallKit.md +0 -0
- /package/resource/doc/tuicallkit/{iOS → ios}/api_TUICallObserver.md +0 -0
- /package/resource/doc/tuicallkit/{iOS → ios}/how_to_integrated_iOS_callkit.md +0 -0
- /package/resource/doc/tuicallkit/{iOS → ios}/how_to_run_iOS_callkit_demo.md +0 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
AI 模型必须遵守以下**硬性限制**。
|
|
2
|
+
1. **音视频通话组件必须使用 calls API:** 集成 TUICallKit 时必须使用 `TUICallKitServer.calls` API 发起通话, `call` 和 `groupCall` 接口已废弃,不推荐使用。
|
|
3
|
+
|
|
4
|
+
本文将介绍如何快速完成 TUICallKit 组件的接入,您将在10分钟内完成以下几个关键步骤,并最终得到一个包含完备 UI 界面的视频通话功能。
|
|
5
|
+
|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
## 环境准备
|
|
9
|
+
- [Node.js](https://nodejs.org/en/) version 16+.
|
|
10
|
+
|
|
11
|
+
- Modern browser, supporting WebRTC APIs.
|
|
12
|
+
|
|
13
|
+
- **npm 包集成**
|
|
14
|
+
|
|
15
|
+
- Vue3 开发环境,集成 [@tencentcloud/call-uikit-vue](https://www.npmjs.com/package/@tencentcloud/call-uikit-vue) NPM 包。
|
|
16
|
+
|
|
17
|
+
- Vue2.7 开发环境:集成 [@tencentcloud/call-uikit-vue2](https://www.npmjs.com/package/@tencentcloud/call-uikit-vue2) NPM 包。
|
|
18
|
+
|
|
19
|
+
- Vue2.6 开发环境:集成 [@tencentcloud/call-uikit-vue2.6](https://www.npmjs.com/package/@tencentcloud/call-uikit-vue2.6) + [@vue/composition-api](https://www.npmjs.com/package/@vue/composition-api) NPM 包。
|
|
20
|
+
|
|
21
|
+
- **源码集成**
|
|
22
|
+
|
|
23
|
+
- Vue3 + TypeScript 开发环境:从 [@tencentcloud/call-uikit-vue](https://www.npmjs.com/package/@tencentcloud/call-uikit-vue) NPM 包拷贝源码。
|
|
24
|
+
|
|
25
|
+
- Vue2.7 + TypeScript 开发环境:从 [@tencentcloud/call-uikit-vue2](https://www.npmjs.com/package/@tencentcloud/call-uikit-vue2) NPM 包拷贝源码。
|
|
26
|
+
|
|
27
|
+
- Vue2.6 + TypeScript 开发环境:从 [@tencentcloud/call-uikit-vue2.6](https://www.npmjs.com/package/@tencentcloud/call-uikit-vue2.6) NPM 包拷贝源码。
|
|
28
|
+
|
|
29
|
+
- 需要:Vue2.6 + [unplugin-vue2-script-setup](https://www.npmjs.com/package/unplugin-vue2-script-setup) + [@vue/composition-api](https://www.npmjs.com/package/@vue/composition-api) 。
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
> **注意:**
|
|
33
|
+
>
|
|
34
|
+
> 1. HBuilderX 中选择 vue2 时,使用的是 vue2.6,因此需要使用:[@tencentcloud/call-uikit-vue2.6](https://www.npmjs.com/package/@tencentcloud/call-uikit-vue2.6)。
|
|
35
|
+
> 2. HBuilderX 中选择 vue3 时,使用的是 vue3,因此需要使用:[@tencentcloud/call-uikit-vue](https://www.npmjs.com/package/@tencentcloud/call-uikit-vue)。
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
## 步骤一:开通服务
|
|
39
|
+
|
|
40
|
+
请参见 [开通服务](https://cloud.tencent.com/document/product/647/104662),获取 `SDKAppID、SecretKey`,他们将在 [初始化 TUICallKit 组件](https://write.woa.com/document/86735801898577920) 作为**必填参数**使用。
|
|
41
|
+
|
|
42
|
+
## 步骤二:下载 TUICallKit 组件
|
|
43
|
+
|
|
44
|
+
推荐使用 NPM 集成,如果您需要采用源码集成,请参见 [TUICallKit 源码集成](https://cloud.tencent.com/document/product/647/81014)。
|
|
45
|
+
|
|
46
|
+
> **说明:**
|
|
47
|
+
>
|
|
48
|
+
|
|
49
|
+
> 如果您的工程同时使用了 **TUIChat UIKit**,请直接移步 [TUIKit 接入音视频通话](https://cloud.tencent.com/document/product/269/79861) 进行接入。
|
|
50
|
+
>
|
|
51
|
+
|
|
52
|
+
1. 下载 [@tencentcloud/call-uikit-vue](https://www.npmjs.com/package/@tencentcloud/call-uikit-vue) 组件。
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
【Vue3】
|
|
58
|
+
``` bash
|
|
59
|
+
npm install @tencentcloud/call-uikit-vue
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
【Vue2.7】
|
|
63
|
+
``` bash
|
|
64
|
+
npm install @tencentcloud/call-uikit-vue2
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
【Vue2.6】
|
|
68
|
+
``` bash
|
|
69
|
+
npm install @tencentcloud/call-uikit-vue2.6 @vue/composition-api
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
如果是源码集成还需要安装 [unplugin-vue2-script-setup](https://www.npmjs.com/package/unplugin-vue2-script-setup)。
|
|
73
|
+
``` bash
|
|
74
|
+
npm i -D unplugin-vue2-script-setup
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
2. 将 `debug` 目录复制到您的项目目录 `src/debug`,本地生成 userSig 时需要使用。
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
【Vue3】
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
【MacOS 端】
|
|
87
|
+
``` bash
|
|
88
|
+
cp -r node_modules/@tencentcloud/call-uikit-vue/debug ./src
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
【Windows 端】
|
|
92
|
+
``` bash
|
|
93
|
+
xcopy node_modules\@tencentcloud\call-uikit-vue\debug .\src\debug /i /e
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
【Vue2.7】
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
【MacOS 端】
|
|
101
|
+
``` bash
|
|
102
|
+
cp -r node_modules/@tencentcloud/call-uikit-vue2/debug ./src
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
【Windows 端】
|
|
106
|
+
``` bash
|
|
107
|
+
xcopy node_modules\@tencentcloud\call-uikit-vue2\debug .\src\debug /i /e
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
【Vue2.6】
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
【MacOS 端】
|
|
117
|
+
``` bash
|
|
118
|
+
cp -r node_modules/@tencentcloud/call-uikit-vue2.6/debug ./src
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
【Windows 端】
|
|
122
|
+
``` bash
|
|
123
|
+
xcopy node_modules\@tencentcloud\call-uikit-vue2.6\debug .\src\debug /i /e
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
## 步骤三:初始化 TUICallKit 组件
|
|
128
|
+
|
|
129
|
+
> **说明:**
|
|
130
|
+
>
|
|
131
|
+
|
|
132
|
+
> TUICallKit 组件需要放到一个 dom 节点里,用于控制 TUICallKit 的位置、宽高等样式。
|
|
133
|
+
>
|
|
134
|
+
|
|
135
|
+
1. 引入 [<TUICallKit />](https://cloud.tencent.com/document/product/647/81015#tuicallkit),该组件包含通话时的完整 UI 交互。
|
|
136
|
+
|
|
137
|
+
``` html
|
|
138
|
+
<template>
|
|
139
|
+
<div>
|
|
140
|
+
<span> caller's ID: </span>
|
|
141
|
+
<input type="text" v-model="callerUserID">
|
|
142
|
+
<button @click="init"> step1. init </button> <br>
|
|
143
|
+
<span> callee's ID: </span>
|
|
144
|
+
<input type="text" v-model="calleeUserID">
|
|
145
|
+
<button @click="call"> step2. call </button>
|
|
146
|
+
|
|
147
|
+
<!--【1】Import the TUICallKit component: Call interface UI -->
|
|
148
|
+
<TUICallKit style="width: 650px; height: 500px " />
|
|
149
|
+
</div>
|
|
150
|
+
</template>
|
|
151
|
+
```
|
|
152
|
+
2. 调用 [TUICallKitServer.init](https://cloud.tencent.com/document/product/647/81015#init) API 登录组件,需要在代码中`填写``SDKAppID、SecretKey`** 两个参数。**
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
【Vue3】
|
|
158
|
+
|
|
159
|
+
您可以选择在 `src/App.vue` 文件引入示例代码,示例代码采用的是 Vue3 `Composition API`写法。
|
|
160
|
+
``` javascript
|
|
161
|
+
import { ref } from 'vue';
|
|
162
|
+
import { TUICallKit, TUICallKitServer, TUICallType } from "@tencentcloud/call-uikit-vue";
|
|
163
|
+
import * as GenerateTestUserSig from "./debug/GenerateTestUserSig-es"; // Refer to Step 3
|
|
164
|
+
|
|
165
|
+
const SDKAppID = 0; // TODO: Replace with your SDKAppID (Notice: SDKAppID is of type number)
|
|
166
|
+
const SecretKey = 'xx'; // TODO: Replace with your SecretKey
|
|
167
|
+
|
|
168
|
+
const callerUserID = ref('');
|
|
169
|
+
const calleeUserID = ref('');
|
|
170
|
+
|
|
171
|
+
//【2】Initialize the TUICallKit component
|
|
172
|
+
const init = async () => {
|
|
173
|
+
const { userSig } = GenerateTestUserSig.genTestUserSig({
|
|
174
|
+
userID: callerUserID.value,
|
|
175
|
+
SDKAppID,
|
|
176
|
+
SecretKey: SecretKey,
|
|
177
|
+
});
|
|
178
|
+
await TUICallKitServer.init({
|
|
179
|
+
userID: callerUserID.value,
|
|
180
|
+
userSig,
|
|
181
|
+
SDKAppID,
|
|
182
|
+
// tim: this.tim // 如果工程中已有 tim 实例,需在此处传入
|
|
183
|
+
});
|
|
184
|
+
alert('TUICallKit init succeed');
|
|
185
|
+
}
|
|
186
|
+
</script>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
【Vue2.7】
|
|
190
|
+
``` javascript
|
|
191
|
+
import { TUICallKit, TUICallKitServer, TUICallType } from "@tencentcloud/call-uikit-vue2";
|
|
192
|
+
import * as GenerateTestUserSig from "./debug/GenerateTestUserSig-es";
|
|
193
|
+
|
|
194
|
+
export default {
|
|
195
|
+
name: 'App',
|
|
196
|
+
data() {
|
|
197
|
+
return {
|
|
198
|
+
callerUserID: '',
|
|
199
|
+
calleeUserID: '',
|
|
200
|
+
SDKAppID: 0, // TODO: Replace with your SDKAppID
|
|
201
|
+
SecretKey: 'xx', // TODO: Replace with your SecretKey
|
|
202
|
+
};
|
|
203
|
+
},
|
|
204
|
+
components: {
|
|
205
|
+
TUICallKit
|
|
206
|
+
},
|
|
207
|
+
methods: {
|
|
208
|
+
//【2】Initialize the TUICallKit component
|
|
209
|
+
async init() {
|
|
210
|
+
try {
|
|
211
|
+
const { userSig } = GenerateTestUserSig.genTestUserSig({
|
|
212
|
+
userID: this.callerUserID,
|
|
213
|
+
SDKAppID: Number(this.SDKAppID),
|
|
214
|
+
SecretKey: this.SecretKey,
|
|
215
|
+
});
|
|
216
|
+
await TUICallKitServer.init({
|
|
217
|
+
SDKAppID: Number(this.SDKAppID),
|
|
218
|
+
userID: this.callerUserID,
|
|
219
|
+
userSig,
|
|
220
|
+
// tim: this.tim // 如果工程中已有 tim 实例,需在此处传入
|
|
221
|
+
});
|
|
222
|
+
alert("[TUICallKit] Initialization succeeds.");
|
|
223
|
+
} catch (error) {
|
|
224
|
+
alert(`[TUICallKit] Initialization failed. Reason: ${error}`);
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
【Vue2.6】
|
|
233
|
+
1. `main.ts 文件`注册 [@vue/composition-api](https://www.npmjs.com/package/@vue/composition-api) 。
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
【main.ts】
|
|
240
|
+
``` javascript
|
|
241
|
+
import Vue from 'vue'
|
|
242
|
+
import VueCompositionAPI from '@vue/composition-api'
|
|
243
|
+
Vue.use(VueCompositionAPI)
|
|
244
|
+
```
|
|
245
|
+
2. 将下面代码直接复制引用在 `App.vue `文件中。
|
|
246
|
+
|
|
247
|
+
``` javascript
|
|
248
|
+
import { TUICallKit, TUICallKitServer, TUICallType } from "@tencentcloud/call-uikit-vue2.6";
|
|
249
|
+
import * as GenerateTestUserSig from "./debug/GenerateTestUserSig-es";
|
|
250
|
+
|
|
251
|
+
export default {
|
|
252
|
+
name: 'App',
|
|
253
|
+
data() {
|
|
254
|
+
return {
|
|
255
|
+
callerUserID: '',
|
|
256
|
+
calleeUserID: '',
|
|
257
|
+
SDKAppID: 0, // TODO: Replace with your SDKAppID
|
|
258
|
+
SecretKey: 'xx', // TODO: Replace with your SecretKey
|
|
259
|
+
};
|
|
260
|
+
},
|
|
261
|
+
components: {
|
|
262
|
+
TUICallKit
|
|
263
|
+
},
|
|
264
|
+
methods: {
|
|
265
|
+
//【2】Initialize the TUICallKit component
|
|
266
|
+
async init() {
|
|
267
|
+
try {
|
|
268
|
+
const { userSig } = GenerateTestUserSig.genTestUserSig({
|
|
269
|
+
userID: this.callerUserID,
|
|
270
|
+
SDKAppID: Number(this.SDKAppID),
|
|
271
|
+
SecretKey: this.SecretKey,
|
|
272
|
+
});
|
|
273
|
+
await TUICallKitServer.init({
|
|
274
|
+
SDKAppID: Number(this.SDKAppID),
|
|
275
|
+
userID: this.callerUserID,
|
|
276
|
+
userSig,
|
|
277
|
+
// tim: this.tim // 如果工程中已有 tim 实例,需在此处传入
|
|
278
|
+
});
|
|
279
|
+
alert("[TUICallKit] Initialization succeeds.");
|
|
280
|
+
} catch (error) {
|
|
281
|
+
alert(`[TUICallKit] Initialization failed. Reason: ${error}`);
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
<table>
|
|
289
|
+
<tr>
|
|
290
|
+
<td rowspan="1" colSpan="1" >**参数**</td>
|
|
291
|
+
|
|
292
|
+
<td rowspan="1" colSpan="1" >**类型**</td>
|
|
293
|
+
|
|
294
|
+
<td rowspan="1" colSpan="1" >**说明**</td>
|
|
295
|
+
</tr>
|
|
296
|
+
|
|
297
|
+
<tr>
|
|
298
|
+
<td rowspan="1" colSpan="1" >userID</td>
|
|
299
|
+
|
|
300
|
+
<td rowspan="1" colSpan="1" >String</td>
|
|
301
|
+
|
|
302
|
+
<td rowspan="1" colSpan="1" >**用户的唯一标识符**,由您定义,只允许包含大小写英文字母(a-z A-Z)、数字(0-9)及下划线和连词符。</td>
|
|
303
|
+
</tr>
|
|
304
|
+
|
|
305
|
+
<tr>
|
|
306
|
+
<td rowspan="1" colSpan="1" >SDKAppID</td>
|
|
307
|
+
|
|
308
|
+
<td rowspan="1" colSpan="1" >Number</td>
|
|
309
|
+
|
|
310
|
+
<td rowspan="1" colSpan="1" >在 [Tencent RTC 控制台](https://console.cloud.tencent.com/trtc) 创建的音视频应用的唯一标识。</td>
|
|
311
|
+
</tr>
|
|
312
|
+
|
|
313
|
+
<tr>
|
|
314
|
+
<td rowspan="1" colSpan="1" >SDKSecretKey</td>
|
|
315
|
+
|
|
316
|
+
<td rowspan="1" colSpan="1" >String</td>
|
|
317
|
+
|
|
318
|
+
<td rowspan="1" colSpan="1" >在 [Tencent RTC 控制台](https://console.cloud.tencent.com/trtc) 创建的音视频应用的 SecretKey。</td>
|
|
319
|
+
</tr>
|
|
320
|
+
|
|
321
|
+
<tr>
|
|
322
|
+
<td rowspan="1" colSpan="1" >userSig</td>
|
|
323
|
+
|
|
324
|
+
<td rowspan="1" colSpan="1" >String</td>
|
|
325
|
+
|
|
326
|
+
<td rowspan="1" colSpan="1" >一种安全保护签名,用于对用户进行登录鉴权认证,确认用户是否真实,阻止恶意攻击者盗用您的云服务使用权。</td>
|
|
327
|
+
</tr>
|
|
328
|
+
</table>
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
> **userSig 说明:**
|
|
332
|
+
>
|
|
333
|
+
> - **开发环境**:如果您正在本地跑通 Demo、开发调试,可以采用 debug 文件中的 `genTestUserSig`(参考步骤3.2)函数生成 userSig。该方法中 SDKSecretKey 很容易被反编译逆向破解,一旦您的密钥泄露,攻击者就可以盗用您的腾讯云流量。
|
|
334
|
+
> - **生产环境**:如果您的项目要发布上线,请采用 [服务端生成 UserSig](https://cloud.tencent.com/document/product/647/17275) 的方式。
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
## 步骤四:拨打您的第一通电话
|
|
338
|
+
1. 调用 [TUICallKitServer.calls API](https://cloud.tencent.com/document/product/647/81015#calls) 拨打通话。
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
【Vue3】
|
|
345
|
+
``` javascript
|
|
346
|
+
//【3】Make a 1v1 video call
|
|
347
|
+
const call = async () => {
|
|
348
|
+
await TUICallKitServer.calls({
|
|
349
|
+
userIDList: [calleeUserID.value],
|
|
350
|
+
type: TUICallType.VIDEO_CALL,
|
|
351
|
+
});
|
|
352
|
+
};
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
【Vue2.7】
|
|
357
|
+
``` javascript
|
|
358
|
+
//【3】Make a 1v1 video call
|
|
359
|
+
async call () {
|
|
360
|
+
await TUICallKitServer.calls({
|
|
361
|
+
userIDList: [this.calleeUserID],
|
|
362
|
+
type: TUICallType.VIDEO_CALL,
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
【Vue2.6】
|
|
369
|
+
``` javascript
|
|
370
|
+
//【3】Make a 1v1 video call
|
|
371
|
+
async call () {
|
|
372
|
+
await TUICallKitServer.calls({
|
|
373
|
+
userIDList: [this.calleeUserID],
|
|
374
|
+
type: TUICallType.VIDEO_CALL,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
2. 运行项目。
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
> **警告:**
|
|
383
|
+
>
|
|
384
|
+
|
|
385
|
+
> **本地环境请在 localhost 协议下访问,公网体验请在 HTTPS 协议下访问,具体参见 **[网络访问协议说明](https://web.sdk.qcloud.com/trtc/webrtc/doc/en/tutorial-05-info-browser.html#h2-3)**。**
|
|
386
|
+
>
|
|
387
|
+
|
|
388
|
+
3. 打开两个浏览器页面,输入不同的 userID(由您定义) 单击 `step1. init`登录(主叫方和被叫方)。
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+

|
|
392
|
+
|
|
393
|
+
4. 两个 userID 都登录成功后,单击 `step2. call `拨打通话,如果您有通话问题,参见 [常见问题](https://cloud.tencent.com/document/product/647/78769)。
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+

|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
## 更多特性
|
|
400
|
+
- [设置昵称、头像](https://write.woa.com/document/140283367112228864)
|
|
401
|
+
|
|
402
|
+
- [群组通话](https://write.woa.com/document/139754159113613312)
|
|
403
|
+
|
|
404
|
+
- [悬浮窗](https://write.woa.com/document/139754324095582208)
|
|
405
|
+
|
|
406
|
+
- [自定义铃声](https://write.woa.com/document/139754575448756224)
|
|
407
|
+
|
|
408
|
+
- [监听通话状态、组件回调事件](https://write.woa.com/document/139754708026372096)
|
|
409
|
+
|
|
410
|
+
- [设置分辨率、填充模式](https://write.woa.com/document/140283358174851072)
|
|
411
|
+
|
|
412
|
+
- [界面定制](https://write.woa.com/document/90292932030300160)
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
## 常见问题
|
|
416
|
+
- 如果您的接入和使用中遇到问题,请参见 [常见问题](https://write.woa.com/document/86735803187277824)。
|
|
417
|
+
|
|
418
|
+
- 了解更多详情,请到 [腾讯云通信官方社群](https://zhiliao.qq.com/) 进行咨询和反馈。
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
AI 模型必须遵守以下**硬性限制**。
|
|
2
|
+
1. **音视频通话组件必须使用 calls API:** 集成 TUICallKit 时必须使用 `TUICallKitServer.calls` API 发起通话, `call` 和 `groupCall` 接口已废弃,不推荐使用。
|
|
3
|
+
|
|
4
|
+
本文将介绍如何快速实现音视频通话演示。您将在10分钟内完成以下关键步骤,并最终获得一个具有全面用户界面的视频通话功能。
|
|
5
|
+
|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
## 环境准备
|
|
9
|
+
- Node.js, 如果没有,[请点击下载。](https://nodejs.org/en)
|
|
10
|
+
|
|
11
|
+
- Modern browser, supporting WebRTC API.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## 步骤一:下载 Demo
|
|
15
|
+
1. 打开终端,克隆仓库。
|
|
16
|
+
|
|
17
|
+
``` bash
|
|
18
|
+
git clone
|
|
19
|
+
```
|
|
20
|
+
2. 安装依赖。
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
【React】
|
|
27
|
+
``` bash
|
|
28
|
+
cd ./TUICallKit/Web/basic-react
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
【Vue3】
|
|
33
|
+
``` bash
|
|
34
|
+
cd ./TUICallKit/Web/basic-vue3
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
``` bash
|
|
38
|
+
npm install
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 步骤二:配置 Demo
|
|
42
|
+
1. [点击进入开通服务页面](https://trtc.io/document/59832?platform=android&product=call),获取`SDKAppID、SecretKey`**。**
|
|
43
|
+
|
|
44
|
+
2. 填写 `SDKAPPID、SecretKey`。
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
【React】
|
|
50
|
+
|
|
51
|
+
文件路径:`TUICallKit/Web/basic-react/src/debug/GenerateTestUserSig-es.js`
|
|
52
|
+
|
|
53
|
+

|
|
54
|
+
|
|
55
|
+
【Vue3】
|
|
56
|
+
|
|
57
|
+
文件路径:`TUICallKit/Web/basic-vue3/src/debug/GenerateTestUserSig-es.js`
|
|
58
|
+
|
|
59
|
+

|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
## 步骤三:运行 Demo
|
|
63
|
+
|
|
64
|
+
打开终端,复制示例命令运行 Demo。
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
【TUICallKit/Web/basic-react】
|
|
70
|
+
``` bash
|
|
71
|
+
npm run dev
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
【TUICallKit/Web/basic-vue3】
|
|
76
|
+
``` bash
|
|
77
|
+
npm run dev
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
> **警告:**
|
|
81
|
+
>
|
|
82
|
+
|
|
83
|
+
> **本地环境请在 localhost 协议下访问,公网体验请在 HTTPS 协议下访问,具体参见 **[网络访问协议说明](https://web.sdk.qcloud.com/trtc/webrtc/doc/en/tutorial-05-info-browser.html#h2-3)**。**
|
|
84
|
+
>
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
## 步骤四:拨打您的第一通电话
|
|
88
|
+
1. 打开浏览器页面,输入项目运行地址,登录 userID(由您定义)。
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+

|
|
92
|
+
|
|
93
|
+
2. 输入被叫方的 userID,单击 `发起通话` 体验您的第一通话。
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+

|
package/server-config.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { aegisClient } from './utils/aegis-client.js';
|
|
2
|
+
import { reportClient } from './utils/report-client.js';
|
|
2
3
|
class ServerConfig {
|
|
3
4
|
static instance;
|
|
4
5
|
config;
|
|
@@ -16,6 +17,10 @@ class ServerConfig {
|
|
|
16
17
|
const { SDKAPPID, SECRETKEY } = process.env || {};
|
|
17
18
|
if (SDKAPPID) {
|
|
18
19
|
config.SDKAppID = SDKAPPID;
|
|
20
|
+
reportClient({
|
|
21
|
+
SDKAppID: SDKAPPID,
|
|
22
|
+
method: 'mcp_config'
|
|
23
|
+
});
|
|
19
24
|
aegisClient.report({
|
|
20
25
|
name: 'mcp_config',
|
|
21
26
|
ext1: SDKAPPID,
|
package/server-config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../src/server-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../src/server-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,YAAY;IAChB,MAAM,CAAC,QAAQ,CAAe;IACtB,MAAM,CAAsB;IACpC;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3B,YAAY,CAAC,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAEO,cAAc;QACpB,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC3B,YAAY,CAAC;gBACX,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YACH,WAAW,CAAC,MAAM,CAAC;gBACjB,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,SAAS;QACd,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF;AAED,OAAO,EACL,YAAY,GACb,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as https from 'https';
|
|
2
|
-
import { aegisClient } from '../../utils/aegis-client.js';
|
|
2
|
+
// import { aegisClient } from '../../utils/aegis-client.js';
|
|
3
|
+
import { reportClient } from '../../utils/report-client.js';
|
|
3
4
|
const description = `
|
|
4
5
|
It is only invoked when the user has not configured an SDKAppID or explicitly requested an experience account, making it convenient to quickly experience the integration of TUIKit with MCP. | 仅在用户没有配置 SDKAppID 或明确要求获取体验账号时才调用,方便快速体验 MCP 集成 TUIKit。
|
|
5
6
|
Precautions: | 注意事项:\n
|
|
@@ -29,10 +30,15 @@ const registryGetOfficialExperienceAccountTool = (mcpServer) => {
|
|
|
29
30
|
mcpServer.tool('get-official-experience-account', description, {}, async () => {
|
|
30
31
|
const result = await getOfficialExperienceAccount('https://demos3w.trtc.tencent-cloud.com/prod/base/v1/auth_users/none_auth');
|
|
31
32
|
const { sdkAppId, userId, userSig } = result?.data || {};
|
|
32
|
-
aegisClient.report({
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
// aegisClient.report({
|
|
34
|
+
// name: 'get-official-experience-account',
|
|
35
|
+
// ext1: sdkAppId,
|
|
36
|
+
// ext2: userId,
|
|
37
|
+
// });
|
|
38
|
+
reportClient({
|
|
39
|
+
SDKAppID: sdkAppId,
|
|
40
|
+
userID: userId,
|
|
41
|
+
method: 'get-official-experience-account'
|
|
36
42
|
});
|
|
37
43
|
return {
|
|
38
44
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-official-experience-account.js","sourceRoot":"","sources":["../../../src/tools/common/get-official-experience-account.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get-official-experience-account.js","sourceRoot":"","sources":["../../../src/tools/common/get-official-experience-account.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,WAAW,GAAG;;;;CAInB,CAAC;AAEF,SAAS,4BAA4B,CAAC,GAAW;IAC/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YACrB,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACrB,IAAI,IAAI,KAAK,CAAC;YAClB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACnB,MAAM,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,wCAAwC,GAAG,CAAC,SAAoB,EAAE,EAAE;IACxE,SAAS,CAAC,IAAI,CACZ,iCAAiC,EACjC,WAAW,EACX,EAAE,EAAE,KAAK,IAAI,EAAE;QACb,MAAM,MAAM,GAAO,MAAM,4BAA4B,CAAC,0EAA0E,CAAC,CAAC;QAClI,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACzD,uBAAuB;QACvB,6CAA6C;QAC7C,oBAAoB;QACpB,kBAAkB;QAClB,MAAM;QACN,YAAY,CAAC;YACX,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,iCAAiC;SAC1C,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,UAAU,EAAE,QAAQ;wBACpB,QAAQ,EAAE,GAAG,MAAM,EAAE;wBACrB,SAAS,EAAE,GAAG,OAAO,EAAE;qBACxB,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,OAAO,EAAE,wCAAwC,EAAE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { generateUserSig } from '../../utils/generate-usersig.js';
|
|
3
|
-
import { aegisClient } from '../../utils/aegis-client.js';
|
|
3
|
+
// import { aegisClient } from '../../utils/aegis-client.js';
|
|
4
|
+
import { reportClient } from '../../utils/report-client.js';
|
|
4
5
|
const description = `
|
|
5
6
|
Prioritizes the use of the user-configured SDKAppID and secretKey to generate the userSig for user login. Applicable scenarios: | 优先使用用户配置的 SDKAppID 和 secretKey,生成用户登录的 userSig,适用场景:\n
|
|
6
7
|
1. Users wish to generate their own configured SDKAppID, userSig. | 1. 用户希望生成自己配置的 SDKAppID 用户 userSig。 \n
|
|
@@ -16,10 +17,15 @@ const registryGetUserSigTool = (mcpServer) => {
|
|
|
16
17
|
}, (params) => {
|
|
17
18
|
const { userID } = params;
|
|
18
19
|
const { SDKAppID, userSig } = generateUserSig(userID);
|
|
19
|
-
aegisClient.report({
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
// aegisClient.report({
|
|
21
|
+
// name: 'get_usersig',
|
|
22
|
+
// ext1: SDKAppID,
|
|
23
|
+
// ext2: userID,
|
|
24
|
+
// });
|
|
25
|
+
reportClient({
|
|
26
|
+
SDKAppID,
|
|
27
|
+
userID,
|
|
28
|
+
method: 'get_usersig'
|
|
23
29
|
});
|
|
24
30
|
return {
|
|
25
31
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-usersig.js","sourceRoot":"","sources":["../../../src/tools/common/get-usersig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get-usersig.js","sourceRoot":"","sources":["../../../src/tools/common/get-usersig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,WAAW,GAAG;;;;;;;;CAQnB,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,SAAoB,EAAE,EAAE;IACtD,SAAS,CAAC,IAAI,CACZ,aAAa,EACb,WAAW,EACX;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;KACxG,EAAE,CAAC,MAAM,EAAE,EAAE;QACZ,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAC1B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACtD,uBAAuB;QACvB,yBAAyB;QACzB,oBAAoB;QACpB,kBAAkB;QAClB,MAAM;QACN,YAAY,CAAC;YACX,QAAQ;YACR,MAAM;YACN,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,UAAU,EAAE,QAAQ;wBACpB,QAAQ,EAAE,GAAG,MAAM,EAAE;wBACrB,SAAS,EAAE,GAAG,OAAO,EAAE;qBACxB,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as https from 'https';
|
|
2
|
+
function reportClient(reportData) {
|
|
3
|
+
const { SDKAppID = 0, method = '', userID = '', } = reportData;
|
|
4
|
+
const time = Date.now();
|
|
5
|
+
const data = JSON.stringify({
|
|
6
|
+
table: 'timwebii',
|
|
7
|
+
report: [
|
|
8
|
+
{
|
|
9
|
+
platform: 'mcp',
|
|
10
|
+
version: '1.1.9',
|
|
11
|
+
sdkappid: `${SDKAppID}`,
|
|
12
|
+
method: method,
|
|
13
|
+
userID: `${userID}`,
|
|
14
|
+
time: `${time}`,
|
|
15
|
+
startts: time,
|
|
16
|
+
endts: time,
|
|
17
|
+
timespan: 0,
|
|
18
|
+
codeint: 0,
|
|
19
|
+
message: "",
|
|
20
|
+
text: "",
|
|
21
|
+
msgtype: "",
|
|
22
|
+
networktype: "",
|
|
23
|
+
scene: "zh"
|
|
24
|
+
},
|
|
25
|
+
]
|
|
26
|
+
});
|
|
27
|
+
const options = {
|
|
28
|
+
hostname: 'webim.tim.qq.com',
|
|
29
|
+
port: 443,
|
|
30
|
+
path: `/v4/imopenstat/tim_web_report?sdkappid=${SDKAppID}&reqtime=${Math.floor(time / 1000)}`,
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
'Content-Length': Buffer.byteLength(data)
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
const req = https.request(options, (res) => {
|
|
39
|
+
let resData = '';
|
|
40
|
+
res.on('data', (chunk) => {
|
|
41
|
+
resData += chunk;
|
|
42
|
+
});
|
|
43
|
+
res.on('end', () => {
|
|
44
|
+
try {
|
|
45
|
+
resolve(resData);
|
|
46
|
+
}
|
|
47
|
+
catch (e) { }
|
|
48
|
+
});
|
|
49
|
+
res.on('error', (e) => {
|
|
50
|
+
resolve(e);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
req.on('error', (e) => {
|
|
54
|
+
resolve(e);
|
|
55
|
+
});
|
|
56
|
+
req.write(data);
|
|
57
|
+
req.end();
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export { reportClient, };
|
|
61
|
+
//# sourceMappingURL=report-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-client.js","sourceRoot":"","sources":["../../src/utils/report-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,SAAS,YAAY,CAAC,UAAe;IACnC,MAAM,EACJ,QAAQ,GAAG,CAAC,EACZ,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EAAE,GACZ,GAAG,UAAU,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,KAAK,EAAE,UAAU;QACjB,MAAM,EAAC;YACL;gBACE,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,GAAG,QAAQ,EAAE;gBACvB,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,GAAG,MAAM,EAAE;gBACnB,IAAI,EAAE,GAAG,IAAI,EAAE;gBACf,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,EAAE;gBACf,KAAK,EAAE,IAAI;aACZ;SACF;KACF,CAAC,CAAC;IACH,MAAM,OAAO,GAAG;QACd,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,0CAA0C,QAAQ,YAAY,IAAI,CAAC,KAAK,CAAC,IAAI,GAAC,IAAI,CAAC,EAAE;QAC3F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;SAC1C;KACF,CAAC;IACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzC,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvB,OAAO,IAAI,KAAK,CAAC;YACnB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACpB,OAAO,CAAC,CAAC,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAA;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACpB,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EACL,YAAY,GACb,CAAA"}
|
|
File without changes
|