@tencentcloud/sdk-mcp 1.1.3 → 1.1.5

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.
Files changed (72) hide show
  1. package/index.js +2 -0
  2. package/index.js.map +1 -1
  3. package/libs/TLSSigAPIv2.d.ts +134 -0
  4. package/libs/TLSSigAPIv2.js +243 -0
  5. package/package.json +1 -1
  6. package/resource/doc/chatuikit/react/chat_window_integration.md +78 -0
  7. package/resource/doc/chatuikit/react/integration.md +9 -2
  8. package/resource/doc/chatuikit/vue/chat_window_integration.md +130 -0
  9. package/resource/doc/chatuikit/vue/integration.md +5 -44
  10. package/resource/doc/livekit/vue/components/barrage.md +3 -3
  11. package/resource/doc/livekit/vue/components/broadcast.md +603 -0
  12. package/resource/doc/livekit/vue/components/co-guest-panel.md +127 -0
  13. package/resource/doc/livekit/vue/components/live-audience-list.md +282 -0
  14. package/resource/doc/livekit/vue/components/live-list.md +5 -6
  15. package/resource/doc/livekit/vue/components/live-player.md +5 -6
  16. package/resource/doc/livekit/vue/components/live-scene-panel.md +193 -0
  17. package/resource/doc/livekit/vue/components/live-view.md +6 -6
  18. package/resource/doc/livekit/vue/components/stream-mixer.md +442 -0
  19. package/resource/doc/roomkit/{states → vue/states}/device-state.md +3 -3
  20. package/resource/doc/roomkit/{states → vue/states}/login-state.md +3 -3
  21. package/resource/doc/roomkit/{states → vue/states}/room-list-state.md +3 -3
  22. package/resource/doc/roomkit/{states → vue/states}/room-participant-state.md +3 -3
  23. package/resource/doc/rtcengine/web/how_to_integrated_web_rtc_engine.md +1 -0
  24. package/resource/doc/tuicallkit/vue/api_TUICallKit.md +3 -0
  25. package/resource/doc/tuicallkit/vue/how_to_integrated_vue_callkit.md +3 -0
  26. package/resource/doc/tuicallkit/vue/how_to_run_vue_callkit_demo.md +3 -0
  27. package/server-config.js +34 -0
  28. package/server-config.js.map +1 -0
  29. package/tools/chat/get-chat-faq.js +2 -3
  30. package/tools/chat/get-chat-faq.js.map +1 -1
  31. package/tools/chat/get-native-chat-integration.js +4 -4
  32. package/tools/chat/get-web-chat-component-detail.js +3 -3
  33. package/tools/chat/get-web-chat-integration.js +10 -10
  34. package/tools/chat/get-web-chat-integration.js.map +1 -1
  35. package/tools/chat/get-web-chat-uikit-init.js +2 -2
  36. package/tools/chat/get-web-chat-uikit-init.js.map +1 -1
  37. package/tools/chat/get-web-chat-window-integration.js +36 -0
  38. package/tools/chat/get-web-chat-window-integration.js.map +1 -0
  39. package/tools/common/get-usersig.js +30 -26
  40. package/tools/common/get-usersig.js.map +1 -1
  41. package/tools/common/record-prompt.js +5 -5
  42. package/tools/common/record-result.js +7 -6
  43. package/tools/common/record-result.js.map +1 -1
  44. package/tools/index.js +10 -5
  45. package/tools/index.js.map +1 -1
  46. package/tools/live/get-web-live-component-detail.js +4 -6
  47. package/tools/live/get-web-live-component-detail.js.map +1 -1
  48. package/tools/live/get-web-live-state-detail.js +6 -6
  49. package/tools/live/get-web-live-state-detail.js.map +1 -1
  50. package/tools/room/get-web-room-state-detail.js +6 -6
  51. package/tools/room/get-web-room-state-detail.js.map +1 -1
  52. package/tools/rtcengine/get-rtcengine-web-sdk-integration-guide.js +34 -0
  53. package/tools/rtcengine/get-rtcengine-web-sdk-integration-guide.js.map +1 -0
  54. package/tools/rtcengine/{get-rtcenigne-faq.js → get-trtc-web-sdk-faq.js} +5 -5
  55. package/tools/rtcengine/get-trtc-web-sdk-faq.js.map +1 -0
  56. package/tools/rtcengine/get-trtc-web-sdk-integration-guide.js +35 -0
  57. package/tools/rtcengine/get-trtc-web-sdk-integration-guide.js.map +1 -0
  58. package/utils/generate-usersig.js +7 -9
  59. package/utils/generate-usersig.js.map +1 -1
  60. package/utils/get-doc-content.js +0 -1
  61. package/utils/get-doc-content.js.map +1 -1
  62. package/utils/handle-component-name.js +53 -17
  63. package/utils/handle-component-name.js.map +1 -1
  64. package/utils/handle-state-name.js +29 -0
  65. package/utils/handle-state-name.js.map +1 -0
  66. package/libs/lib-generate-test-usersig-es.min.d.ts +0 -6
  67. package/libs/lib-generate-test-usersig-es.min.js +0 -2
  68. package/resource/doc/livekit/vue/components/states/live-state.md +0 -2656
  69. package/tools/rtcengine/get-rtcengine-integration-guide.js +0 -32
  70. package/tools/rtcengine/get-rtcengine-integration-guide.js.map +0 -1
  71. package/tools/rtcengine/get-rtcenigne-faq.js.map +0 -1
  72. /package/resource/doc/chatuikit/react/{login.md → init.md} +0 -0
package/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
3
  import { createServer } from './server.js';
4
+ import { ServerConfig } from './server-config.js';
4
5
  // 启动服务器
5
6
  async function main() {
7
+ ServerConfig.getInstance();
6
8
  const server = createServer();
7
9
  const transport = new StdioServerTransport();
8
10
  await server.connect(transport);
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,QAAQ;AACR,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAc,YAAY,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,QAAQ;AACR,KAAK,UAAU,IAAI;IACjB,YAAY,CAAC,WAAW,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAc,YAAY,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * TLSSigAPIv2 TypeScript 声明文件
3
+ * 用于腾讯云实时音视频(TRTC)和即时通信(IM)服务的签名生成
4
+ */
5
+
6
+ /**
7
+ * TLS签名API类
8
+ */
9
+ export declare class Api {
10
+ /**
11
+ * 构造函数
12
+ * @param sdkappid - 应用的SDKAppID
13
+ * @param key - 应用的密钥
14
+ */
15
+ constructor(sdkappid: number, key: string);
16
+
17
+ /**
18
+ * SDKAppID
19
+ */
20
+ readonly sdkappid: number;
21
+
22
+ /**
23
+ * 应用密钥
24
+ */
25
+ readonly key: string;
26
+
27
+ /**
28
+ * 生成UserSig签名
29
+ * 用于签发 TRTC 和 IM 服务中必须要使用的 UserSig 鉴权票据
30
+ *
31
+ * @param userid - 用户id,限制长度为32字节,只允许包含大小写英文字母(a-zA-Z)、数字(0-9)及下划线和连词符
32
+ * @param expire - UserSig 票据的过期时间,单位是秒,比如 86400 代表生成的 UserSig 票据在一天后就无法再使用了
33
+ * @returns 返回生成的UserSig字符串
34
+ */
35
+ genUserSig(userid: string, expire: number): string;
36
+
37
+ /**
38
+ * 生成PrivateMapKey权限票据(数字房间号)
39
+ * 用于签发 TRTC 进房参数中可选的 PrivateMapKey 权限票据
40
+ *
41
+ * @param userid - 用户id,限制长度为32字节,只允许包含大小写英文字母(a-zA-Z)、数字(0-9)及下划线和连词符
42
+ * @param expire - PrivateMapKey 票据的过期时间,单位是秒
43
+ * @param roomid - 房间号,用于指定该 userid 可以进入的房间号
44
+ * @param privilegeMap - 权限位,使用了一个字节中的 8 个比特位,分别代表八个具体的功能权限开关
45
+ * @returns 返回生成的PrivateMapKey字符串
46
+ */
47
+ genPrivateMapKey(userid: string, expire: number, roomid: number, privilegeMap: number): string;
48
+
49
+ /**
50
+ * 生成PrivateMapKey权限票据(字符串房间号)
51
+ * 用于签发 TRTC 进房参数中可选的 PrivateMapKey 权限票据
52
+ *
53
+ * @param userid - 用户id,限制长度为32字节,只允许包含大小写英文字母(a-zA-Z)、数字(0-9)及下划线和连词符
54
+ * @param expire - PrivateMapKey 票据的过期时间,单位是秒
55
+ * @param roomstr - 字符串房间号,用于指定该 userid 可以进入的房间号
56
+ * @param privilegeMap - 权限位,使用了一个字节中的 8 个比特位,分别代表八个具体的功能权限开关
57
+ * @returns 返回生成的PrivateMapKey字符串
58
+ */
59
+ genPrivateMapKeyWithStringRoomID(userid: string, expire: number, roomstr: string, privilegeMap: number): string;
60
+
61
+ /**
62
+ * 通用签名生成方法
63
+ * @param userid - 用户ID
64
+ * @param expire - 过期时间(秒)
65
+ * @param userBuf - 用户缓冲区数据,可选
66
+ * @returns 返回生成的签名字符串
67
+ */
68
+ genSig(userid: string, expire: number, userBuf?: Buffer | null): string;
69
+
70
+ /**
71
+ * 生成HMAC-SHA256签名(私有方法)
72
+ * @private
73
+ */
74
+ private _hmacsha256(identifier: string, currTime: number, expire: number, base64UserBuf?: string | null): string;
75
+
76
+ /**
77
+ * 生成用户缓冲区数据(私有方法)
78
+ * @private
79
+ */
80
+ private _genUserbuf(
81
+ account: string,
82
+ dwAuthID: number,
83
+ dwExpTime: number,
84
+ dwPrivilegeMap: number,
85
+ dwAccountType: number,
86
+ roomstr?: string | null
87
+ ): Buffer;
88
+ }
89
+
90
+ /**
91
+ * 权限位常量定义
92
+ * 使用了一个字节中的 8 个比特位,分别代表八个具体的功能权限开关
93
+ */
94
+ export declare namespace PrivilegeMap {
95
+ /** 创建房间的权限 */
96
+ const CREATE_ROOM = 1;
97
+ /** 加入房间的权限 */
98
+ const JOIN_ROOM = 2;
99
+ /** 发送语音的权限 */
100
+ const SEND_AUDIO = 4;
101
+ /** 接收语音的权限 */
102
+ const RECEIVE_AUDIO = 8;
103
+ /** 发送视频的权限 */
104
+ const SEND_VIDEO = 16;
105
+ /** 接收视频的权限 */
106
+ const RECEIVE_VIDEO = 32;
107
+ /** 发送辅路(屏幕分享)视频的权限 */
108
+ const SEND_SUB_VIDEO = 64;
109
+ /** 接收辅路(屏幕分享)视频的权限 */
110
+ const RECEIVE_SUB_VIDEO = 128;
111
+ /** 所有权限 */
112
+ const ALL_PRIVILEGES = 255;
113
+ }
114
+
115
+ /**
116
+ * 使用示例:
117
+ *
118
+ * ```typescript
119
+ * import { Api } from './TLSSigAPIv2';
120
+ * // 或者使用 CommonJS 方式:
121
+ * // const { Api } = require('./TLSSigAPIv2');
122
+ *
123
+ * const api = new Api(1400000000, 'your-secret-key');
124
+ *
125
+ * // 生成UserSig
126
+ * const userSig = api.genUserSig('user123', 86400);
127
+ *
128
+ * // 生成PrivateMapKey(数字房间号)
129
+ * const privateMapKey = api.genPrivateMapKey('user123', 86400, 12345, 255);
130
+ *
131
+ * // 生成PrivateMapKey(字符串房间号)
132
+ * const privateMapKeyStr = api.genPrivateMapKeyWithStringRoomID('user123', 86400, 'room_abc', 255);
133
+ * ```
134
+ */
@@ -0,0 +1,243 @@
1
+ import crypto from 'crypto';
2
+ import zlib from 'zlib';
3
+
4
+ var base64url = {};
5
+
6
+ var newBuffer = function (fill, encoding) {
7
+ return Buffer.from ? Buffer.from(fill, encoding) : new Buffer(fill, encoding)
8
+ };
9
+
10
+ base64url.unescape = function unescape(str) {
11
+ return (str + Array(5 - str.length % 4))
12
+ .replace(/_/g, '=')
13
+ .replace(/\-/g, '/')
14
+ .replace(/\*/g, '+');
15
+ };
16
+
17
+ base64url.escape = function escape(str) {
18
+ return str.replace(/\+/g, '*')
19
+ .replace(/\//g, '-')
20
+ .replace(/=/g, '_');
21
+ };
22
+
23
+ base64url.encode = function encode(str) {
24
+ return this.escape(newBuffer(str).toString('base64'));
25
+ };
26
+
27
+ base64url.decode = function decode(str) {
28
+ return newBuffer(this.unescape(str), 'base64').toString();
29
+ };
30
+
31
+ function base64encode(str) {
32
+ return newBuffer(str).toString('base64')
33
+ }
34
+
35
+ function base64decode(str) {
36
+ return newBuffer(str, 'base64').toString()
37
+ }
38
+
39
+ var Api = function (sdkappid, key) {
40
+ this.sdkappid = sdkappid;
41
+ this.key = key;
42
+ };
43
+ /**
44
+ * 通过传入参数生成 base64 的 hmac 值
45
+ * @param identifier
46
+ * @param currTime
47
+ * @param expire
48
+ * @returns {string}
49
+ * @private
50
+ */
51
+ Api.prototype._hmacsha256 = function (identifier, currTime, expire, base64UserBuf) {
52
+ var contentToBeSigned = "TLS.identifier:" + identifier + "\n";
53
+ contentToBeSigned += "TLS.sdkappid:" + this.sdkappid + "\n";
54
+ contentToBeSigned += "TLS.time:" + currTime + "\n";
55
+ contentToBeSigned += "TLS.expire:" + expire + "\n";
56
+ if (null != base64UserBuf) {
57
+ contentToBeSigned += "TLS.userbuf:" + base64UserBuf + "\n";
58
+ }
59
+ const hmac = crypto.createHmac("sha256", this.key);
60
+ return hmac.update(contentToBeSigned).digest('base64');
61
+ };
62
+ /**
63
+ * TRTC业务进房权限加密串需使用用户定义的userbuf
64
+ * @brief 生成 userbuf
65
+ * @param account 用户名
66
+ * @param dwSdkappid sdkappid
67
+ * @param dwAuthID 数字房间号
68
+ * @param dwExpTime 过期时间:该权限加密串的过期时间,建议300秒,实际过期时间:now+dwExpTime
69
+ * @param dwPrivilegeMap 用户权限,255表示所有权限
70
+ * @param dwAccountType 用户类型,默认为0
71
+ * @param roomstr 字符串房间号
72
+ * @return userbuf {string} 返回的userbuf
73
+ */
74
+ Api.prototype._genUserbuf = function (account, dwAuthID, dwExpTime,
75
+ dwPrivilegeMap, dwAccountType, roomstr) {
76
+
77
+ let accountLength = account.length;
78
+ let roomstrlength = 0;
79
+ let length = 1 + 2 + accountLength + 20 ;
80
+ if (null != roomstr)
81
+ {
82
+ roomstrlength = roomstr.length;
83
+ length = length + 2 + roomstrlength;
84
+ }
85
+ let offset = 0;
86
+ let userBuf = new Buffer.alloc(length);
87
+
88
+ //cVer
89
+ if (null != roomstr)
90
+ userBuf[offset++] = 1;
91
+ else
92
+ userBuf[offset++] = 0;
93
+
94
+ //wAccountLen
95
+ userBuf[offset++] = (accountLength & 0xFF00) >> 8;
96
+ userBuf[offset++] = accountLength & 0x00FF;
97
+
98
+ //buffAccount
99
+ for (; offset < 3 + accountLength; ++offset) {
100
+ userBuf[offset] = account.charCodeAt(offset - 3);
101
+ }
102
+
103
+ //dwSdkAppid
104
+ userBuf[offset++] = (this.sdkappid & 0xFF000000) >> 24;
105
+ userBuf[offset++] = (this.sdkappid & 0x00FF0000) >> 16;
106
+ userBuf[offset++] = (this.sdkappid & 0x0000FF00) >> 8;
107
+ userBuf[offset++] = this.sdkappid & 0x000000FF;
108
+
109
+ //dwAuthId
110
+ userBuf[offset++] = (dwAuthID & 0xFF000000) >> 24;
111
+ userBuf[offset++] = (dwAuthID & 0x00FF0000) >> 16;
112
+ userBuf[offset++] = (dwAuthID & 0x0000FF00) >> 8;
113
+ userBuf[offset++] = dwAuthID & 0x000000FF;
114
+
115
+ //过期时间:dwExpTime+now
116
+ let expire = Date.now() / 1000 + dwExpTime;
117
+ userBuf[offset++] = (expire & 0xFF000000) >> 24;
118
+ userBuf[offset++] = (expire & 0x00FF0000) >> 16;
119
+ userBuf[offset++] = (expire & 0x0000FF00) >> 8;
120
+ userBuf[offset++] = expire & 0x000000FF;
121
+
122
+ //dwPrivilegeMap
123
+ userBuf[offset++] = (dwPrivilegeMap & 0xFF000000) >> 24;
124
+ userBuf[offset++] = (dwPrivilegeMap & 0x00FF0000) >> 16;
125
+ userBuf[offset++] = (dwPrivilegeMap & 0x0000FF00) >> 8;
126
+ userBuf[offset++] = dwPrivilegeMap & 0x000000FF;
127
+
128
+ //dwAccountType
129
+ userBuf[offset++] = (dwAccountType & 0xFF000000) >> 24;
130
+ userBuf[offset++] = (dwAccountType & 0x00FF0000) >> 16;
131
+ userBuf[offset++] = (dwAccountType & 0x0000FF00) >> 8;
132
+ userBuf[offset++] = dwAccountType & 0x000000FF;
133
+
134
+ if (null != roomstr) {
135
+ //roomstrlength
136
+ userBuf[offset++] = (roomstr.length & 0xFF00) >> 8;
137
+ userBuf[offset++] = roomstr.length & 0x00FF;
138
+
139
+ //roomstr
140
+ for (; offset < length; ++offset) {
141
+ userBuf[offset] = roomstr.charCodeAt(offset - (length - roomstr.length));
142
+ }
143
+ }
144
+
145
+ return userBuf;
146
+ }
147
+ Api.prototype.genSig = function (userid, expire, userBuf) {
148
+ var currTime = Math.floor(Date.now() / 1000);
149
+
150
+ var sigDoc = {
151
+ 'TLS.ver': "2.0",
152
+ 'TLS.identifier': "" + userid,
153
+ 'TLS.sdkappid': Number(this.sdkappid),
154
+ 'TLS.time': Number(currTime),
155
+ 'TLS.expire': Number(expire)
156
+ };
157
+
158
+ var sig = '';
159
+ if (null != userBuf) {
160
+ var base64UserBuf = base64encode(userBuf);
161
+ sigDoc['TLS.userbuf'] = base64UserBuf;
162
+ sig = this._hmacsha256(userid, currTime, expire, base64UserBuf);
163
+ } else {
164
+ sig = this._hmacsha256(userid, currTime, expire, null);
165
+ }
166
+ sigDoc['TLS.sig'] = sig;
167
+
168
+ var compressed = zlib.deflateSync(newBuffer(JSON.stringify(sigDoc))).toString('base64');
169
+ return base64url.escape(compressed);
170
+ }
171
+ /**
172
+ *【功能说明】用于签发 TRTC 和 IM 服务中必须要使用的 UserSig 鉴权票据
173
+ *
174
+ *【参数说明】
175
+ * @param userid - 用户id,限制长度为32字节,只允许包含大小写英文字母(a-zA-Z)、数字(0-9)及下划线和连词符。
176
+ * @param expire - UserSig 票据的过期时间,单位是秒,比如 86400 代表生成的 UserSig 票据在一天后就无法再使用了。
177
+ */
178
+ Api.prototype.genUserSig = function (userid, expire) {
179
+ return this.genSig(userid, expire, null);
180
+ };
181
+
182
+ /**
183
+ *【功能说明】
184
+ * 用于签发 TRTC 进房参数中可选的 PrivateMapKey 权限票据。
185
+ * PrivateMapKey 需要跟 UserSig 一起使用,但 PrivateMapKey 比 UserSig 有更强的权限控制能力:
186
+ * - UserSig 只能控制某个 UserID 有无使用 TRTC 服务的权限,只要 UserSig 正确,其对应的 UserID 可以进出任意房间。
187
+ * - PrivateMapKey 则是将 UserID 的权限控制的更加严格,包括能不能进入某个房间,能不能在该房间里上行音视频等等。
188
+ * 如果要开启 PrivateMapKey 严格权限位校验,需要在【实时音视频控制台】=>【应用管理】=>【应用信息】中打开“启动权限密钥”开关。
189
+ *
190
+ *【参数说明】
191
+ * @param userid - 用户id,限制长度为32字节,只允许包含大小写英文字母(a-zA-Z)、数字(0-9)及下划线和连词符。
192
+ * @param expire - PrivateMapKey 票据的过期时间,单位是秒,比如 86400 生成的 PrivateMapKey 票据在一天后就无法再使用了。
193
+ * @param roomid - 房间号,用于指定该 userid 可以进入的房间号
194
+ * @param privilegeMap - 权限位,使用了一个字节中的 8 个比特位,分别代表八个具体的功能权限开关:
195
+ * - 第 1 位:0000 0001 = 1,创建房间的权限
196
+ * - 第 2 位:0000 0010 = 2,加入房间的权限
197
+ * - 第 3 位:0000 0100 = 4,发送语音的权限
198
+ * - 第 4 位:0000 1000 = 8,接收语音的权限
199
+ * - 第 5 位:0001 0000 = 16,发送视频的权限
200
+ * - 第 6 位:0010 0000 = 32,接收视频的权限
201
+ * - 第 7 位:0100 0000 = 64,发送辅路(也就是屏幕分享)视频的权限
202
+ * - 第 8 位:1000 0000 = 200,接收辅路(也就是屏幕分享)视频的权限
203
+ * - privilegeMap == 1111 1111 == 255 代表该 userid 在该 roomid 房间内的所有功能权限。
204
+ * - privilegeMap == 0010 1010 == 42 代表该 userid 拥有加入房间和接收音视频数据的权限,但不具备其他权限。
205
+ */
206
+ Api.prototype.genPrivateMapKey = function (userid, expire, roomid, privilegeMap) {
207
+ var userBuf = this._genUserbuf(userid, roomid, expire, privilegeMap, 0, null);
208
+ return this.genSig(userid, expire, userBuf);
209
+
210
+ };
211
+ /**
212
+ *【功能说明】
213
+ * 用于签发 TRTC 进房参数中可选的 PrivateMapKey 权限票据。
214
+ * PrivateMapKey 需要跟 UserSig 一起使用,但 PrivateMapKey 比 UserSig 有更强的权限控制能力:
215
+ * - UserSig 只能控制某个 UserID 有无使用 TRTC 服务的权限,只要 UserSig 正确,其对应的 UserID 可以进出任意房间。
216
+ * - PrivateMapKey 则是将 UserID 的权限控制的更加严格,包括能不能进入某个房间,能不能在该房间里上行音视频等等。
217
+ * 如果要开启 PrivateMapKey 严格权限位校验,需要在【实时音视频控制台】=>【应用管理】=>【应用信息】中打开“启动权限密钥”开关。
218
+ *
219
+ *【参数说明】
220
+ * @param userid - 用户id,限制长度为32字节,只允许包含大小写英文字母(a-zA-Z)、数字(0-9)及下划线和连词符。
221
+ * @param expire - PrivateMapKey 票据的过期时间,单位是秒,比如 86400 生成的 PrivateMapKey 票据在一天后就无法再使用了。
222
+ * @param roomstr - 房间号,用于指定该 userid 可以进入的房间号
223
+ * @param privilegeMap - 权限位,使用了一个字节中的 8 个比特位,分别代表八个具体的功能权限开关:
224
+ * - 第 1 位:0000 0001 = 1,创建房间的权限
225
+ * - 第 2 位:0000 0010 = 2,加入房间的权限
226
+ * - 第 3 位:0000 0100 = 4,发送语音的权限
227
+ * - 第 4 位:0000 1000 = 8,接收语音的权限
228
+ * - 第 5 位:0001 0000 = 16,发送视频的权限
229
+ * - 第 6 位:0010 0000 = 32,接收视频的权限
230
+ * - 第 7 位:0100 0000 = 64,发送辅路(也就是屏幕分享)视频的权限
231
+ * - 第 8 位:1000 0000 = 200,接收辅路(也就是屏幕分享)视频的权限
232
+ * - privilegeMap == 1111 1111 == 255 代表该 userid 在该房间内的所有功能权限。
233
+ * - privilegeMap == 0010 1010 == 42 代表该 userid 拥有加入房间和接收音视频数据的权限,但不具备其他权限。
234
+ */
235
+ Api.prototype.genPrivateMapKeyWithStringRoomID = function (userid, expire, roomstr, privilegeMap) {
236
+ var userBuf = this._genUserbuf(userid, 0, expire, privilegeMap, 0, roomstr);
237
+ return this.genSig(userid, expire, userBuf);
238
+
239
+ };
240
+
241
+ export {
242
+ Api
243
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tencentcloud/sdk-mcp",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "Tencent Cloud MCP Server for SDK",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -0,0 +1,78 @@
1
+ AI 模型必须遵守以下**硬性限制**。
2
+
3
+ * **React 版本限制:** 创建项目时 react 和 react-dom 的版本必须选用 `18.2.0`,禁止选用 react 19。
4
+ * **必须严格按照文档步骤和说明集成:** 在集成组件时必须按照文档步骤和说明进行。
5
+ * **必须严格使用文档中的示例代码:** 创建文件时必须严格使用文档中的示例代码填充文件,Chat 组件的 PlaceholderEmpty 属性不需要填写。
6
+ * **必须打开默认会话:** 必须使用 `setActiveConversation` 打开 `C2Cadministrator` 会话。
7
+ * **必须调用工具获取 userSig:** TUIKit 集成完成后,必须引导用户调用工具 `get_usersig` 获取 userSig。
8
+ * **禁止创建用户信息配置文件:** 不得自动创建填写 SDKAppID、userID、userSig 的 config 目录或文件。
9
+
10
+ # chat-uikit-react Integration
11
+
12
+ ## step1:create react project
13
+
14
+ requirement: react: 18.2.0, react-dom: 18.2.0.
15
+
16
+ you can use vite or rsbuild to create a react project.
17
+
18
+ ## step2: install chat-uikit-react
19
+
20
+ use npm or pnpm to install @tencentcloud/chat-uikit-react
21
+
22
+ ## step3: add chat-uikit-react to your project
23
+
24
+ example code
25
+
26
+ ```tsx
27
+ import {
28
+ UIKitProvider,
29
+ useLoginState,
30
+ LoginStatus,
31
+ Chat,
32
+ ChatHeader,
33
+ MessageList,
34
+ MessageInput,
35
+ useConversationListState,
36
+ } from "@tencentcloud/chat-uikit-react";
37
+
38
+ function App() {
39
+ const userID = ''; // TODO: Replace with your userID
40
+ const SDKAppID = 0; // TODO: Replace with your SDKAppID (Notice: SDKAppID is of type number)
41
+ const userSig = ''; // TODO: Replace with your userSig
42
+
43
+ const { status } = useLoginState({
44
+ SDKAppID,
45
+ userID,
46
+ userSig,
47
+ })
48
+
49
+ if (status !== LoginStatus.SUCCESS) {
50
+ return <div>Loading...</div>
51
+ }
52
+
53
+ // 打开默认会话
54
+ const { setActiveConversation } = useConversationListState();
55
+ setActiveConversation('C2Cadministrator');
56
+
57
+ // Language support zh-CN(default) / en-US / ja-JP / ko-KR / zh-TW
58
+ // Theme support light(default) / dark
59
+ return (
60
+ <UIKitProvider language='zh-CN' theme='light'>
61
+ <div style={{
62
+ height: '100vh',
63
+ width: '100vw',
64
+ display: 'flex',
65
+ flexDirection: 'row',
66
+ }}>
67
+ <Chat PlaceholderEmpty=''>
68
+ <ChatHeader />
69
+ <MessageList />
70
+ <MessageInput />
71
+ </Chat>
72
+ </div>
73
+ </UIKitProvider>
74
+ );
75
+ }
76
+
77
+ export default App;
78
+ ```
@@ -1,15 +1,17 @@
1
1
  AI 模型必须遵守以下**硬性限制**。
2
2
 
3
+ * **React 版本限制:** 创建项目时 react 和 react-dom 的版本必须选用 `18.2.0`,禁止选用 react 19。
3
4
  * **必须严格按照文档步骤和说明集成:** 在集成组件时必须按照文档步骤和说明进行。
4
5
  * **必须严格使用文档中的示例代码:** 创建文件时必须严格使用文档中的示例代码填充文件,Chat 组件的 PlaceholderEmpty 属性不需要填写。
6
+ * **必须打开默认会话:** 必须使用 `setActiveConversation` 打开 `C2Cadministrator` 会话。
7
+ * **必须调用工具获取 userSig:** TUIKit 集成完成后,必须引导用户调用工具 `get_usersig` 获取 userSig。
5
8
  * **禁止创建用户信息配置文件:** 不得自动创建填写 SDKAppID、userID、userSig 的 config 目录或文件。
6
- * **禁止创建获取 userSig 逻辑:** 不得自动创建获取 userSig 相关代码,必须明确引导用户输入 SDKAppID、 userID、 userSig 信息并帮忙回填到相应的文件。
7
9
 
8
10
  # chat-uikit-react Integration
9
11
 
10
12
  ## step1:create react project
11
13
 
12
- requirement: react: ^18.2.0, react-dom: ^18.2.0.
14
+ requirement: react: 18.2.0, react-dom: 18.2.0.
13
15
 
14
16
  you can use vite or rsbuild to create a react project.
15
17
 
@@ -31,6 +33,7 @@ import {
31
33
  ChatHeader,
32
34
  MessageList,
33
35
  MessageInput,
36
+ useConversationListState,
34
37
  } from "@tencentcloud/chat-uikit-react";
35
38
 
36
39
  function App() {
@@ -47,6 +50,10 @@ function App() {
47
50
  if (status !== LoginStatus.SUCCESS) {
48
51
  return <div>Loading...</div>
49
52
  }
53
+
54
+ // 打开默认会话
55
+ const { setActiveConversation } = useConversationListState();
56
+ setActiveConversation('C2Cadministrator');
50
57
 
51
58
  // Language support zh-CN(default) / en-US / ja-JP / ko-KR / zh-TW
52
59
  // Theme support light(default) / dark
@@ -0,0 +1,130 @@
1
+ AI 模型必须遵守以下**硬性限制**。
2
+ * **必须严格文档步骤集成:** 在集成组件时必须按照文档步骤和说明进行,且在 1.1 中不需要执行 `npm run dev` or `pnpm run dev`, 集成完成后按照 1.4 启动项目。
3
+ * **必须严格使用文档中的示例代码:** 创建文件时必须严格使用文档中的示例代码填充文件, style 标签优先推荐不使用 scoped 属性。
4
+ * **必须打开默认会话:** 必须使用 `setActiveConversation` 打开 `C2Cadministrator` 会话。
5
+ * **必须调用工具获取 userSig:** TUIKit 集成完成后,必须引导用户调用工具 `get_usersig` 获取 userSig。
6
+ * **禁止创建用户信息配置文件:** 不得自动创建填写 SDKAppID、userID、userSig 的 config 目录或文件。
7
+
8
+ # chat-uikit-vue3 Integration
9
+
10
+ 用户的集成需求一般有两种,你必须理性分析需求到底属于哪一种:
11
+ 1. 集成聊天窗口:指仅集成 Chat、ChatHeader、MessageList、MessageInput 组件。
12
+ 2. 集成通话功能:仅集成聊天基础上,集成通话功能,具体信息必须阅读第 2.1 节 “最佳实践-集成通话功能”。
13
+
14
+
15
+ ## 1 集成聊天窗口
16
+
17
+ ### 1.1 step1:create vue3 project
18
+
19
+ if you don't have a vue3 project, you can use vite create a vue3 project. otherwise, you can skip this step.
20
+
21
+ requirement: vue3: ^3.0.0, nodejs: ^22.0.0.
22
+
23
+ if it is a new project, guide the user to use vite to create a vue3 project manually, and then continue with step 1.2. if it is an existing project, skip this step and continue with step 1.2.
24
+
25
+ ```bash
26
+ pnpm create vite@latest
27
+ # skip some settings
28
+ cd ${your-vue-project-name}
29
+ pnpm install
30
+ ```
31
+
32
+ ### 1.2 step2: install chat-uikit-vue3
33
+
34
+ use npm or pnpm to install @tencentcloud/chat-uikit-vue3@latest @tencentcloud/call-uikit-vue@latest
35
+
36
+ ### 1.3 step3: add main content to your project
37
+ ```vue
38
+ <template>
39
+ <UIKitProvider>
40
+ <Chat style="flex: 1;">
41
+ <ChatHeader />
42
+ <MessageList />
43
+ <MessageInput />
44
+ </Chat>
45
+ </UIKitProvider>
46
+ </template>
47
+ <script setup lang="ts">
48
+ import { useLoginState, useConversationListState } from '@tencentcloud/chat-uikit-vue3';
49
+
50
+ const userID = ''; // TODO: Replace with your userID
51
+ const SDKAppID = 0; // TODO: Replace with your SDKAppID (Notice: SDKAppID is of type number)
52
+ const userSig = ''; // TODO: Replace with your userSig
53
+ const conversationID = ref('C2Cadministrator'); // define by yourself
54
+
55
+ const { login } = useLoginState();
56
+ const { setActiveConversation } = useConversationListState();
57
+
58
+ login({
59
+ sdkAppId : SDKAppID,
60
+ userId: userID,
61
+ userSig: userSig,
62
+ })
63
+ .then(() => {
64
+ setActiveConversation(conversationID.value);
65
+ })
66
+ .catch(() => {});
67
+ </script>
68
+ ```
69
+
70
+ ### 1.4 step4: start your project
71
+ ```bash
72
+ pnpm run dev
73
+ ```
74
+
75
+ ## 2. 最佳实践
76
+
77
+ 以下提到的组件通过 MCP Tools get_component_detail ${componenetname.tolowercase()} 获取。
78
+ 以下提到的 state 通过 MCP Tools get_state_detail ${statename.tolowercase()} 获取。
79
+
80
+ 重点:
81
+ 1. 如果需要集成 ChatSetting 组件,请阅读 ChatHeader 的 ChatHeaderRight 插槽说明。
82
+ 2. 由于仅集成聊天不使用 ConversationList,你需要使用 ConversationListState 的 useConversationListState 获取 activeConversation,然后调用 setActiveConversation 设置 activeConversation。
83
+
84
+ ### 2.1 最佳实践-集成通话功能
85
+
86
+ 集成通话功能需要仅集成聊天基础上,添加通话功能的代码。
87
+
88
+ 引入 TUICallKit 组件:
89
+ ```vue
90
+ <script setup lang="ts">
91
+ import { TUICallKit } from '@tencentcloud/call-uikit-vue';
92
+ </script>
93
+ ```
94
+
95
+ 在合适的位置添加 TUICallKit 组件:
96
+ ```vue
97
+ <Teleport to="body">
98
+ <TUICallKit style="position: fixed; z-index: 1000;"/>
99
+ </Teleport>
100
+ ```
101
+
102
+ 重点:
103
+ 1. 需要在 ChatHeader 组件的 ChatHeaderRight 插槽中添加通话按钮。
104
+ 2. 点击通话按钮调用以下方法:
105
+ 2.1 阅读 ConversationListState 文档,通过 activeConversation 判断当前是单聊还是群聊。
106
+ 2.2 如果是单聊,通过 `import { TUICallKitServer, TUICallType } from '@tencentcloud/call-uikit-vue';` 引入 TUICallKitService 服务。通过 TUICallKitService 的 `calls` 方法发起通话。
107
+ ```ts
108
+ try {
109
+ await TUICallKitServer.calls({
110
+ userIDList: [activeConversation.value.userProfile.userID],
111
+ type: TUICallType.VIDEO_CALL, // or TUICallType.AUDIO_CALL
112
+ });
113
+ } catch (error: any) {
114
+ console.error(`[TUICallKit] Failed to call the groupCall API. Reason:${error}`);
115
+ }
116
+ ```
117
+ 2.3 如果是群聊,需要阅读 UserPicker 组件文档,建议结合 Dialog 组件,弹出 UserPicker 组件。
118
+ 阅读 GroupSettingState 文档,结合 GroupSettingState 的 `getGroupMemberList`、`allMembers` 等属性,获取群成员列表。
119
+ ```ts
120
+ try {
121
+ await TUICallKitServer.calls({
122
+ userIDList: selectedItems.map((item: any) => item.key),
123
+ type: TUICallType.VIDEO_CALL, // or TUICallType.AUDIO_CALL
124
+ });
125
+ } catch (error: any) {
126
+ console.error(`[TUICallKit] Failed to call the groupCall API. Reason:${error}`);
127
+ }
128
+ ```
129
+
130
+ 建议:结合 UserPicker 的 reachEnd 事件分页拉取群成员,并使用节流函数控制 `getGroupMemberList` 的调用频率。