fcr-core 3.8.1 → 3.9.0-alpha

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 (199) hide show
  1. package/lib/chat-connector/type.d.ts +40 -0
  2. package/lib/{chat-connection → chat-connector}/type.js +1 -1
  3. package/lib/engine/index.d.ts +10 -11
  4. package/lib/engine/index.js +63 -72
  5. package/lib/engine/type.d.ts +96 -0
  6. package/lib/engine/type.js +5 -0
  7. package/lib/imports.d.ts +7 -4
  8. package/lib/imports.js +30 -4
  9. package/lib/index.d.ts +3 -2
  10. package/lib/index.js +21 -2
  11. package/lib/media-control/desktop.js +12 -12
  12. package/lib/media-control/mobile.js +4 -0
  13. package/lib/media-control/type.d.ts +32 -33
  14. package/lib/monitor-control/index.js +3 -3
  15. package/lib/peer-session/index.js +14 -14
  16. package/lib/peer-session/type.d.ts +1 -1
  17. package/lib/plugins/chat/chatroom.js +417 -0
  18. package/lib/{chat-connection → plugins/chat}/config.d.ts +1 -0
  19. package/lib/{room-control/chatroom-control → plugins/chat}/config.js +2 -1
  20. package/lib/plugins/chat/connector.d.ts +38 -0
  21. package/lib/{chat-connection/index.js → plugins/chat/connector.js} +181 -61
  22. package/lib/room-control/ability-control/index.js +5 -4
  23. package/lib/room-control/ability-control/type.d.ts +5 -1
  24. package/lib/room-control/ability-control/type.js +4 -0
  25. package/lib/room-control/chatroom-control/type.d.ts +44 -35
  26. package/lib/room-control/group-control/index.js +9 -9
  27. package/lib/room-control/index.js +37 -22
  28. package/lib/room-control/interpreter-control/index.js +7 -4
  29. package/lib/room-control/interpreter-control/room.js +3 -3
  30. package/lib/room-control/interpreter-control/types.d.ts +2 -2
  31. package/lib/room-control/join-before-host-waitingroom-control/index.js +3 -3
  32. package/lib/room-control/mainroom-control/index.js +15 -13
  33. package/lib/room-control/privilege-control/index.js +39 -24
  34. package/lib/room-control/privilege-control/type.d.ts +15 -15
  35. package/lib/room-control/room-connector-control/index.js +7 -5
  36. package/lib/room-control/room-connector-control/type.d.ts +1 -1
  37. package/lib/room-control/room-control-factory.d.ts +3 -3
  38. package/lib/room-control/room-control-factory.js +7 -7
  39. package/lib/room-control/room-session/index.js +17 -15
  40. package/lib/room-control/room-session/type.d.ts +3 -3
  41. package/lib/room-control/sharing-control/index.js +13 -7
  42. package/lib/room-control/stream-control/index.js +18 -16
  43. package/lib/room-control/stream-control/type.d.ts +5 -5
  44. package/lib/room-control/stt-control/index.js +38 -31
  45. package/lib/room-control/type.d.ts +19 -19
  46. package/lib/room-control/user-control/index.js +20 -22
  47. package/lib/room-control/user-control/type.d.ts +1 -1
  48. package/lib/room-control/waitingroom-control/index.js +11 -11
  49. package/lib/room-control/whiteboard-control-v1/board-window.d.ts +21 -20
  50. package/lib/room-control/whiteboard-control-v1/board-window.js +27 -8
  51. package/lib/room-control/whiteboard-control-v1/factory.js +1 -1
  52. package/lib/room-control/whiteboard-control-v1/index.js +26 -18
  53. package/lib/room-control/whiteboard-control-v1/type.d.ts +26 -25
  54. package/lib/room-control/whiteboard-control-v1/type.js +1 -0
  55. package/lib/room-control/whiteboard-control-v2/annotation-control/control.d.ts +15 -6
  56. package/lib/room-control/whiteboard-control-v2/annotation-control/control.js +39 -5
  57. package/lib/room-control/whiteboard-control-v2/annotation-control/factory.d.ts +4 -5
  58. package/lib/room-control/whiteboard-control-v2/annotation-control/factory.js +6 -5
  59. package/lib/room-control/whiteboard-control-v2/annotation-control/type.d.ts +7 -1
  60. package/lib/room-control/whiteboard-control-v2/base/index.d.ts +9 -8
  61. package/lib/room-control/whiteboard-control-v2/base/index.js +84 -42
  62. package/lib/room-control/whiteboard-control-v2/base/main-window.d.ts +16 -15
  63. package/lib/room-control/whiteboard-control-v2/base/main-window.js +23 -4
  64. package/lib/room-control/whiteboard-control-v2/type.d.ts +17 -17
  65. package/lib/room-control/whiteboard-control-v2/whiteboard-control/control.d.ts +12 -6
  66. package/lib/room-control/whiteboard-control-v2/whiteboard-control/control.js +64 -18
  67. package/lib/room-control/whiteboard-control-v2/whiteboard-control/factory.d.ts +2 -2
  68. package/lib/room-control/whiteboard-control-v2/whiteboard-control/factory.js +10 -10
  69. package/lib/room-control/whiteboard-control-v2/whiteboard-control/type.d.ts +1 -1
  70. package/lib/room-router/index.js +10 -7
  71. package/lib/room-router/type.d.ts +1 -1
  72. package/lib/schema.d.ts +24 -46
  73. package/lib/schema.js +1 -2
  74. package/lib/service/api.d.ts +5 -3
  75. package/lib/service/api.js +17 -12
  76. package/lib/type.d.ts +64 -45
  77. package/lib/type.js +76 -11
  78. package/lib/utilities/abortable-retry.d.ts +38 -0
  79. package/lib/utilities/abortable-retry.js +61 -0
  80. package/lib/utilities/dual-video-stream-config.d.ts +6 -0
  81. package/lib/utilities/dual-video-stream-config.js +25 -0
  82. package/lib/utilities/error-helpers.d.ts +10 -9
  83. package/lib/utilities/error-helpers.js +12 -11
  84. package/lib/utilities/error.d.ts +4 -40
  85. package/lib/utilities/error.js +20 -77
  86. package/lib/utilities/join-helper.js +2 -2
  87. package/lib/utilities/logger.d.ts +2 -2
  88. package/lib/utilities/logger.js +6 -25
  89. package/lib/utilities/package-info.d.ts +1 -2
  90. package/lib/utilities/package-info.js +4 -8
  91. package/lib/utilities/parameters.js +88 -15
  92. package/lib/utilities/validate-params.js +1 -1
  93. package/lib/utilities/video-encoder-config.d.ts +9 -0
  94. package/lib/utilities/video-encoder-config.js +109 -0
  95. package/lib-es/base-session.js +1 -0
  96. package/lib-es/chat-connector/type.js +6 -0
  97. package/lib-es/engine/index.js +412 -0
  98. package/lib-es/engine/type.js +1 -0
  99. package/lib-es/imports.js +59 -0
  100. package/lib-es/index.js +8 -0
  101. package/lib-es/media-control/desktop.js +172 -0
  102. package/lib-es/media-control/mobile.js +198 -0
  103. package/lib-es/media-control/type.js +6 -0
  104. package/lib-es/monitor-control/index.js +46 -0
  105. package/lib-es/monitor-control/type.js +1 -0
  106. package/lib-es/peer-session/index.js +279 -0
  107. package/lib-es/peer-session/type.js +1 -0
  108. package/lib-es/plugins/chat/chatroom.js +409 -0
  109. package/{lib/chat-connection → lib-es/plugins/chat}/config.js +5 -9
  110. package/lib-es/plugins/chat/connector.js +269 -0
  111. package/lib-es/plugins/electron-rtc-plugin.js +1 -0
  112. package/lib-es/plugins/rtm-plugin.js +1 -0
  113. package/lib-es/plugins/web-rtc-plugin.js +1 -0
  114. package/lib-es/room-control/ability-control/index.js +58 -0
  115. package/lib-es/room-control/ability-control/type.js +15 -0
  116. package/lib-es/room-control/chatroom-control/type.js +12 -0
  117. package/lib-es/room-control/group-control/index.js +256 -0
  118. package/lib-es/room-control/helpers/constants.js +92 -0
  119. package/lib-es/room-control/helpers/index.js +20 -0
  120. package/lib-es/room-control/helpers/validation-helper.js +46 -0
  121. package/lib-es/room-control/index.js +623 -0
  122. package/lib-es/room-control/interpreter-control/index.js +172 -0
  123. package/lib-es/room-control/interpreter-control/room.js +28 -0
  124. package/lib-es/room-control/interpreter-control/types.js +26 -0
  125. package/lib-es/room-control/join-before-host-waitingroom-control/index.js +29 -0
  126. package/lib-es/room-control/mainroom-control/index.js +248 -0
  127. package/lib-es/room-control/privilege-control/helper.js +97 -0
  128. package/lib-es/room-control/privilege-control/index.js +339 -0
  129. package/lib-es/room-control/privilege-control/type.js +159 -0
  130. package/lib-es/room-control/room-connector-control/index.js +182 -0
  131. package/lib-es/room-control/room-connector-control/type.js +28 -0
  132. package/lib-es/room-control/room-control-factory.js +77 -0
  133. package/lib-es/room-control/room-session/index.js +292 -0
  134. package/lib-es/room-control/room-session/type.js +1 -0
  135. package/lib-es/room-control/shared-cache.js +47 -0
  136. package/lib-es/room-control/sharing-control/index.js +307 -0
  137. package/lib-es/room-control/sharing-control/type.js +16 -0
  138. package/lib-es/room-control/stream-control/index.js +536 -0
  139. package/lib-es/room-control/stream-control/type.js +1 -0
  140. package/lib-es/room-control/stt-control/de-compress-gzip.js +33 -0
  141. package/lib-es/room-control/stt-control/index.js +350 -0
  142. package/lib-es/room-control/stt-control/type.js +10 -0
  143. package/lib-es/room-control/type.js +30 -0
  144. package/lib-es/room-control/user-control/index.js +344 -0
  145. package/lib-es/room-control/user-control/type.js +21 -0
  146. package/lib-es/room-control/waitingroom-control/index.js +68 -0
  147. package/lib-es/room-control/whiteboard-control/enum.js +18 -0
  148. package/lib-es/room-control/whiteboard-control/type.js +10 -0
  149. package/lib-es/room-control/whiteboard-control/utils.js +13 -0
  150. package/lib-es/room-control/whiteboard-control-v1/board-subwindow.js +18 -0
  151. package/lib-es/room-control/whiteboard-control-v1/board-window.js +573 -0
  152. package/lib-es/room-control/whiteboard-control-v1/enum.js +157 -0
  153. package/lib-es/room-control/whiteboard-control-v1/factory.js +12 -0
  154. package/lib-es/room-control/whiteboard-control-v1/index.js +427 -0
  155. package/lib-es/room-control/whiteboard-control-v1/mount-manager.js +6 -0
  156. package/lib-es/room-control/whiteboard-control-v1/type.js +8 -0
  157. package/lib-es/room-control/whiteboard-control-v1/utils.js +273 -0
  158. package/lib-es/room-control/whiteboard-control-v2/annotation-control/control.js +76 -0
  159. package/lib-es/room-control/whiteboard-control-v2/annotation-control/factory.js +37 -0
  160. package/lib-es/room-control/whiteboard-control-v2/annotation-control/type.js +1 -0
  161. package/lib-es/room-control/whiteboard-control-v2/base/index.js +347 -0
  162. package/lib-es/room-control/whiteboard-control-v2/base/main-window.js +269 -0
  163. package/lib-es/room-control/whiteboard-control-v2/constant.js +9 -0
  164. package/lib-es/room-control/whiteboard-control-v2/enum.js +28 -0
  165. package/lib-es/room-control/whiteboard-control-v2/type.js +1 -0
  166. package/lib-es/room-control/whiteboard-control-v2/utils.js +92 -0
  167. package/lib-es/room-control/whiteboard-control-v2/whiteboard-control/control.js +204 -0
  168. package/lib-es/room-control/whiteboard-control-v2/whiteboard-control/factory.js +61 -0
  169. package/lib-es/room-control/whiteboard-control-v2/whiteboard-control/type.js +1 -0
  170. package/lib-es/room-router/index.js +263 -0
  171. package/lib-es/room-router/type.js +5 -0
  172. package/lib-es/schema.js +231 -0
  173. package/lib-es/service/api.js +1211 -0
  174. package/lib-es/service/type.js +1 -0
  175. package/lib-es/type.js +222 -0
  176. package/lib-es/utilities/abortable-retry.js +54 -0
  177. package/lib-es/utilities/cmd.js +1 -0
  178. package/lib-es/utilities/collection.js +64 -0
  179. package/lib-es/utilities/dual-video-stream-config.js +19 -0
  180. package/lib-es/utilities/error-helpers.js +224 -0
  181. package/lib-es/utilities/error.js +43 -0
  182. package/lib-es/utilities/join-helper.js +219 -0
  183. package/lib-es/utilities/logger.js +7 -0
  184. package/lib-es/utilities/package-info.js +5 -0
  185. package/lib-es/utilities/parameters.js +106 -0
  186. package/lib-es/utilities/retry-helpers.js +66 -0
  187. package/lib-es/utilities/shared-storage.js +31 -0
  188. package/lib-es/utilities/stream.js +18 -0
  189. package/lib-es/utilities/user.js +30 -0
  190. package/lib-es/utilities/validate-params.js +8 -0
  191. package/lib-es/utilities/video-encoder-config.js +103 -0
  192. package/package.json +11 -10
  193. package/lib/chat-connection/index.d.ts +0 -24
  194. package/lib/chat-connection/type.d.ts +0 -17
  195. package/lib/plugins/chatroom.js +0 -454
  196. package/lib/room-control/chatroom-control/config.d.ts +0 -51
  197. package/lib/utilities/storage.d.ts +0 -8
  198. package/lib/utilities/storage.js +0 -33
  199. /package/lib/plugins/{chatroom.d.ts → chat/chatroom.d.ts} +0 -0
@@ -0,0 +1,219 @@
1
+ import "core-js/modules/esnext.iterator.constructor.js";
2
+ import "core-js/modules/esnext.iterator.map.js";
3
+ /**
4
+ * 房间加入辅助工具
5
+ *
6
+ * 提供房间控制相关的加入逻辑和参数构建,统一处理 room-control 和 room-router 中的公共逻辑
7
+ */
8
+
9
+ import { convertStreamTypeToPublishState, getPlatform, getVersion, retryAttempt } from '../imports';
10
+ import { FcrUserRoleToStringMap, FcrStreamLatencyLevel } from '../type';
11
+ import { canRetryJoinError } from './retry-helpers';
12
+ import { handleRequestError } from './error';
13
+ import { ErrorModuleCode } from '../imports';
14
+ import { ROOM_CONTROL_CONSTANTS } from '../room-control/helpers/constants';
15
+
16
+ /**
17
+ * 通用的加入房间重试失败处理器
18
+ * @param error 错误对象
19
+ * @param waitBeforeRetry 等待重试函数
20
+ * @param attemptCount 当前重试次数
21
+ * @param canRetryFn 判断是否可以重试的函数
22
+ * @param onAborted 中止回调函数
23
+ * @param logPrefix 日志前缀
24
+ * @returns 是否继续重试
25
+ */
26
+ export async function handleJoinRetryFailure(error, waitBeforeRetry, attemptCount, canRetryFn, onAborted, logPrefix = 'join room') {
27
+ onAborted?.();
28
+ if (!canRetryFn(error)) {
29
+ throw error;
30
+ }
31
+
32
+ // 记录重试信息
33
+ console.warn(`Retry attempt ${attemptCount + 1} to ${logPrefix}: ${error.message}`);
34
+ await waitBeforeRetry();
35
+ return true;
36
+ }
37
+
38
+ /**
39
+ * 房间加入辅助工具类
40
+ *
41
+ * 封装了房间加入的公共逻辑,包括:
42
+ * - 快照方式加入房间
43
+ * - CheckIn 流程处理
44
+ * - 重试机制
45
+ * - 错误处理
46
+ */
47
+ export class FcrJoinHelper {
48
+ constructor(_userId, _scene, _api) {
49
+ this._userId = _userId;
50
+ this._scene = _scene;
51
+ this._api = _api;
52
+ }
53
+
54
+ /**
55
+ * 构建CheckIn请求参数(统一的参数构建方法)
56
+ * @static
57
+ * @param options 加入选项
58
+ * @param userId 用户ID
59
+ * @param roomId 房间ID
60
+ * @param extraParams 额外参数(bypass, avatar等)
61
+ * @returns CheckIn参数对象
62
+ */
63
+ static buildCheckInParams(options, userId, roomId, extraParams) {
64
+ return {
65
+ userName: options.userName,
66
+ userId,
67
+ userRole: FcrUserRoleToStringMap[options.userRole],
68
+ userProperties: options.userProperties,
69
+ roomId,
70
+ platform: options.platform ?? getPlatform(),
71
+ streams: options.createStreamConfigs?.map(s => ({
72
+ videoSourceUuid: s.videoSourceId,
73
+ audioSourceUuid: s.audioSourceId,
74
+ streamName: s.streamName,
75
+ ...convertStreamTypeToPublishState(s.streamType),
76
+ videoSourceType: s.videoSourceType,
77
+ audioSourceType: s.audioSourceType,
78
+ audioSourceState: s.audioSourceState,
79
+ videoSourceState: s.videoSourceState
80
+ })),
81
+ version: getVersion(),
82
+ password: options.password,
83
+ // 只有在提供了额外参数时才添加
84
+ ...(extraParams?.bypass !== undefined && {
85
+ bypass: extraParams.bypass
86
+ }),
87
+ ...(extraParams?.avatar !== undefined && {
88
+ avatar: extraParams.avatar
89
+ })
90
+ };
91
+ }
92
+
93
+ /**
94
+ * 构建CheckIn请求参数的便捷方法(使用当前实例的配置)
95
+ * @private
96
+ * @param options 加入选项
97
+ * @param extraParams 额外参数(bypass, avatar等)
98
+ * @returns CheckIn参数对象
99
+ */
100
+ _buildCheckInParams(options, extraParams) {
101
+ const userId = this._userId;
102
+ const roomId = this._scene.sceneId;
103
+
104
+ // 使用静态方法,但参数来自实例
105
+ return FcrJoinHelper.buildCheckInParams(options, userId, roomId, extraParams);
106
+ }
107
+
108
+ /**
109
+ *
110
+ * @param options 加入选项
111
+ * @param extraParams 额外参数(bypass, avatar等)
112
+ * @param useInternalApi 是否使用 checkInInternal API(默认 true)
113
+ * @returns CheckIn响应数据
114
+ */
115
+ async performCheckIn(options, extraParams, useInternalApi = true) {
116
+ const checkInParams = this._buildCheckInParams(options, extraParams);
117
+ const apiCall = useInternalApi ? () => this._api.checkInInternal(checkInParams) : () => this._api.checkIn(checkInParams);
118
+ const errorMessage = useInternalApi ? 'check in internal failed' : 'check in failed';
119
+ const res = await handleRequestError(apiCall, ErrorModuleCode.FCR_ROOM, errorMessage);
120
+ return res;
121
+ }
122
+
123
+ /**
124
+ * 通过 CheckIn 流程加入房间(包含重试逻辑)
125
+ *
126
+ * 重试逻辑说明:
127
+ * - 重试范围:整个 "CheckIn + Join" 流程
128
+ * - 重试原因:CheckIn 和 Join 是关联操作,如果 Join 失败需要重新 CheckIn
129
+ * - 重试判断:使用 canRetryJoinError 判断错误是否可重试
130
+ * - 最大重试次数:ROOM_CONTROL_CONSTANTS.MAX_JOIN_ATTEMPTS
131
+ *
132
+ * @param options 加入选项
133
+ * @param onJoinAborted 加入中止检查函数
134
+ * @returns Promise<void>
135
+ */
136
+ async joinWithCheckIn(options, onJoinAborted) {
137
+ await retryAttempt(async () => {
138
+ // 1. 执行 CheckIn(单次调用,无内部重试)
139
+ const {
140
+ data,
141
+ ts
142
+ } = await this.performCheckIn(options);
143
+
144
+ // 2. 检查是否中止
145
+ if (onJoinAborted) {
146
+ onJoinAborted();
147
+ }
148
+
149
+ // 3. 使用 CheckIn 结果加入房间
150
+ await this._joinScene(options.streamLatency, options.streamEncryptionConfig, data, ts);
151
+
152
+ // 4. 再次检查是否中止
153
+ if (onJoinAborted) {
154
+ onJoinAborted();
155
+ }
156
+ }, [], {
157
+ retriesMax: ROOM_CONTROL_CONSTANTS.MAX_JOIN_ATTEMPTS
158
+ }).fail(async ({
159
+ error,
160
+ timeFn: waitBeforeRetry,
161
+ currentRetry: attemptCount
162
+ }) => {
163
+ return handleJoinRetryFailure(error, waitBeforeRetry, attemptCount, canRetryJoinError, onJoinAborted, 'join room via CheckIn');
164
+ }).exec();
165
+ }
166
+
167
+ /**
168
+ * 使用快照数据加入房间的核心方法
169
+ * @private
170
+ */
171
+ async _joinScene(streamLatency, streamEncryptionConfig, snapshot, timestamp, onJoinAborted) {
172
+ await this._scene.joinWithSnapshot({
173
+ streamLatency: streamLatency,
174
+ streamEncryptionConfig,
175
+ snapshot,
176
+ timestamp
177
+ });
178
+
179
+ // 执行中止检查(如果提供了回调)
180
+ if (onJoinAborted) {
181
+ onJoinAborted();
182
+ }
183
+ }
184
+
185
+ /**
186
+ * 统一的房间加入处理
187
+ *
188
+ * 根据选项类型自动选择合适的加入方式:
189
+ * - 如果有 snapshot 属性:直接使用快照数据加入
190
+ * - 否则:执行 CheckIn 流程后加入
191
+ *
192
+ * @param options 加入选项(支持普通加入和快照加入)
193
+ * @param onJoinAborted 加入中止检查函数
194
+ * @returns Promise<void>
195
+ */
196
+ async join(options, onJoinAborted) {
197
+ if (this._isSnapshotJoin(options)) {
198
+ await this._joinWithSnapshot(options, onJoinAborted);
199
+ } else {
200
+ await this.joinWithCheckIn(options, onJoinAborted);
201
+ }
202
+ }
203
+
204
+ /**
205
+ * 判断是否为快照加入模式
206
+ * @private
207
+ */
208
+ _isSnapshotJoin(options) {
209
+ return 'snapshot' in options;
210
+ }
211
+
212
+ /**
213
+ * 快照加入模式:直接使用快照数据加入房间
214
+ * @private
215
+ */
216
+ async _joinWithSnapshot(options, onJoinAborted) {
217
+ await this._joinScene(options.streamLatency || FcrStreamLatencyLevel.ULTRA_LOW, options.streamEncryptionConfig, options.snapshot, options.timestamp, onJoinAborted);
218
+ }
219
+ }
@@ -0,0 +1,7 @@
1
+ import { LoggerManager } from '../imports';
2
+ const loggerManager = new LoggerManager({
3
+ label: 'fcr-core'
4
+ });
5
+ export const getLogger = loggerManager.getLogger.bind(loggerManager);
6
+ export const createLogger = loggerManager.createLogger.bind(loggerManager);
7
+ export const generateLogObserver = loggerManager.generateLogObserver.bind(loggerManager);
@@ -0,0 +1,5 @@
1
+ import packageInfo from '../../package.json';
2
+ import { PackageInfo } from 'agora-foundation/lib/utilities/package-info';
3
+ const packageInfoObj = new PackageInfo(packageInfo);
4
+ export const getVersion = packageInfoObj.getVersion.bind(packageInfoObj);
5
+ export const getDependenciesInfo = packageInfoObj.getDependenciesInfo.bind(packageInfoObj);
@@ -0,0 +1,106 @@
1
+ import "core-js/modules/es.json.stringify.js";
2
+ import "core-js/modules/esnext.set.add-all.js";
3
+ import "core-js/modules/esnext.set.delete-all.js";
4
+ import "core-js/modules/esnext.set.difference.v2.js";
5
+ import "core-js/modules/esnext.set.difference.js";
6
+ import "core-js/modules/esnext.set.every.js";
7
+ import "core-js/modules/esnext.set.filter.js";
8
+ import "core-js/modules/esnext.set.find.js";
9
+ import "core-js/modules/esnext.set.intersection.v2.js";
10
+ import "core-js/modules/esnext.set.intersection.js";
11
+ import "core-js/modules/esnext.set.is-disjoint-from.v2.js";
12
+ import "core-js/modules/esnext.set.is-disjoint-from.js";
13
+ import "core-js/modules/esnext.set.is-subset-of.v2.js";
14
+ import "core-js/modules/esnext.set.is-subset-of.js";
15
+ import "core-js/modules/esnext.set.is-superset-of.v2.js";
16
+ import "core-js/modules/esnext.set.is-superset-of.js";
17
+ import "core-js/modules/esnext.set.join.js";
18
+ import "core-js/modules/esnext.set.map.js";
19
+ import "core-js/modules/esnext.set.reduce.js";
20
+ import "core-js/modules/esnext.set.some.js";
21
+ import "core-js/modules/esnext.set.symmetric-difference.v2.js";
22
+ import "core-js/modules/esnext.set.symmetric-difference.js";
23
+ import "core-js/modules/esnext.set.union.v2.js";
24
+ import "core-js/modules/esnext.set.union.js";
25
+ import { FcrApplicationPlatform, getPlatform } from '../imports';
26
+ export const isTrueValue = value => {
27
+ return value === 'true' || !!value;
28
+ };
29
+ export const getCoreIpList = parameters => {
30
+ return parameters?.core?.coreIpList;
31
+ };
32
+ export const getEasemobChatIpList = parameters => {
33
+ return parameters?.core?.easemobChatIpList;
34
+ };
35
+ export const getEasemobRestIpList = parameters => {
36
+ return parameters?.core?.easemobRestIpList;
37
+ };
38
+ export const isEndpointRegionDisabled = parameters => {
39
+ return isTrueValue(parameters?.core?.disableEndpointRegion);
40
+ };
41
+
42
+ /** RTC preset parameters configuration mapping table */
43
+ const RTC_PRESET_PARAMS_MAP = {
44
+ [FcrApplicationPlatform.WINDOWS]: [{
45
+ 'rtc.video.default_hw_decoder_thres': 921600
46
+ }],
47
+ [FcrApplicationPlatform.MACOS]: [{
48
+ 'che.video.screenCaptureMode': 1
49
+ }, {
50
+ 'che.video.screen_disable_frame_transparent_check': true
51
+ }],
52
+ [FcrApplicationPlatform.WEB_DESKTOP]: [{
53
+ RESTRICTION_SET_PLAYBACK_DEVICE: false
54
+ }]
55
+ };
56
+
57
+ /** desktop common parameters */
58
+ const DESKTOP_COMMON_PARAMS = [
59
+ // audio parameters settings
60
+ {
61
+ 'che.audio.bitrate_level': 1
62
+ }, {
63
+ 'che.audio.reset_apm_capture_state_for_microphone_track': false
64
+ },
65
+ // video parameters settings
66
+ {
67
+ 'rtc.video.color_space_enable': true
68
+ }, {
69
+ 'rtc.video.videoFullrange': 1
70
+ }, {
71
+ 'rtc.video.matrixCoefficients': 5
72
+ }, {
73
+ 'rtc.video.new_complexity': true
74
+ }, {
75
+ 'rtc.video.default_complexity': 1027
76
+ }, {
77
+ 'che.video.videoCodecIndex': 1
78
+ }, {
79
+ 'rtc.video.low_stream_enable_hw_encoder': true
80
+ }, {
81
+ 'rtc.video.enable_doc_screen_share_sr': true
82
+ }, {
83
+ 'rtc.video.enable_pvc': false
84
+ }, {
85
+ 'rtc.video.enable_sr': {
86
+ enabled: false,
87
+ mode: 2
88
+ }
89
+ }, {
90
+ 'che.video.brightness_detection_enable': false
91
+ }, {
92
+ 'che.video.lowest_dev_score_4_seg': 0
93
+ }, {
94
+ 'rtc.video.downMaxRetryTimes': 5
95
+ }, {
96
+ 'che.video.lowest_dev_score_4_beauty': 0
97
+ }];
98
+
99
+ /** desktop platforms set */
100
+ const DESKTOP_PLATFORMS = new Set([FcrApplicationPlatform.WINDOWS, FcrApplicationPlatform.MACOS]);
101
+ export const getRtcPresetParameters = () => {
102
+ const platform = getPlatform();
103
+ const platformParams = RTC_PRESET_PARAMS_MAP[platform] ?? [];
104
+ const desktopParams = DESKTOP_PLATFORMS.has(platform) ? DESKTOP_COMMON_PARAMS : [];
105
+ return [...platformParams, ...desktopParams].map(p => JSON.stringify(p));
106
+ };
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 通用重试辅助工具
3
+ *
4
+ * 提供可复用的重试逻辑判断机制
5
+ */
6
+
7
+ import { FcrError } from '../imports';
8
+
9
+ /**
10
+ * 房间相关的不可重试错误码
11
+ */
12
+
13
+ export const ROOM_NON_RETRYABLE_ERRORS = [
14
+ // 网络相关的不可重试错误码
15
+
16
+ 100050051,
17
+ // ap 探测失败
18
+ 300000010,
19
+ // 加入rtc频道超时了(rtc私有化)
20
+ 400000010,
21
+ // 加入web rtc频道超时了(rtc私有化)
22
+
23
+ // 房间相关的不可重试错误码
24
+ 720410100,
25
+ // 房间已销毁
26
+ 720404100,
27
+ // 房间不存在
28
+ 732403100,
29
+ // 无加入权限,如:房间已锁定
30
+ 732403101,
31
+ // 房间不存在或密码错误
32
+ 730403100 // 被永久踢出房间
33
+ ];
34
+
35
+ /**
36
+ * 房间加入时的所有不可重试错误码(包含网络和房间错误)
37
+ */
38
+ export const ROOM_JOIN_NON_RETRYABLE_ERRORS = [...ROOM_NON_RETRYABLE_ERRORS];
39
+
40
+ /**
41
+ * 判断错误是否可以重试
42
+ * @param error 错误对象
43
+ * @param nonRetryableErrorCodes 不可重试的错误代码列表
44
+ * @returns 是否可以重试
45
+ */
46
+ export function canRetryError(error, nonRetryableErrorCodes) {
47
+ // 如果不是已知的错误类型,允许重试
48
+ if (!(error instanceof FcrError)) {
49
+ return true;
50
+ }
51
+
52
+ // 获取错误代码
53
+ const errorCode = typeof error.code === 'string' ? parseInt(error.code, 10) : error.code;
54
+
55
+ // 检查是否在不可重试列表中
56
+ return !nonRetryableErrorCodes.includes(errorCode);
57
+ }
58
+
59
+ /**
60
+ * 判断加入房间错误是否可以重试
61
+ * @param error 错误对象
62
+ * @returns 是否可以重试
63
+ */
64
+ export function canRetryJoinError(error) {
65
+ return canRetryError(error, ROOM_JOIN_NON_RETRYABLE_ERRORS);
66
+ }
@@ -0,0 +1,31 @@
1
+ import "core-js/modules/es.json.stringify.js";
2
+ import "core-js/modules/esnext.json.parse.js";
3
+ import { localStorage } from '../imports';
4
+ const STORAGE_KEY_ANNOTATION_BOARD_OPTIONS = 'annotation_board_options';
5
+ const STORAGE_KEY_WHITEBOARD_OPTIONS = 'whiteboard_options';
6
+ export const setAnnotationBoardOptions = options => {
7
+ localStorage.setItem(STORAGE_KEY_ANNOTATION_BOARD_OPTIONS, JSON.stringify(options));
8
+ };
9
+ export const getAnnotationBoardOptions = () => {
10
+ const boardOptions = localStorage.getItem(STORAGE_KEY_ANNOTATION_BOARD_OPTIONS);
11
+ if (boardOptions) {
12
+ return JSON.parse(boardOptions);
13
+ }
14
+ return null;
15
+ };
16
+ export const clearAnnotationBoardOptions = () => {
17
+ localStorage.removeItem(STORAGE_KEY_ANNOTATION_BOARD_OPTIONS);
18
+ };
19
+ export const setWhiteboardOptions = options => {
20
+ localStorage.setItem(STORAGE_KEY_WHITEBOARD_OPTIONS, JSON.stringify(options));
21
+ };
22
+ export const getWhiteboardOptions = () => {
23
+ const boardOptions = localStorage.getItem(STORAGE_KEY_WHITEBOARD_OPTIONS);
24
+ if (boardOptions) {
25
+ return JSON.parse(boardOptions);
26
+ }
27
+ return null;
28
+ };
29
+ export const clearWhiteboardOptions = () => {
30
+ localStorage.removeItem(STORAGE_KEY_WHITEBOARD_OPTIONS);
31
+ };
@@ -0,0 +1,18 @@
1
+ import "core-js/modules/esnext.iterator.constructor.js";
2
+ import "core-js/modules/esnext.iterator.map.js";
3
+ export const getStreamJoinConfig = stream => {
4
+ return {
5
+ ...stream,
6
+ videoSourceUuid: stream?.videoSourceId,
7
+ audioSourceUuid: stream?.audioSourceId
8
+ };
9
+ };
10
+ export const getStreamsJoinConfig = streams => {
11
+ return streams?.map(stream => {
12
+ return {
13
+ ...stream,
14
+ videoSourceUuid: stream?.videoSourceId,
15
+ audioSourceUuid: stream?.audioSourceId
16
+ };
17
+ });
18
+ };
@@ -0,0 +1,30 @@
1
+ import { FcrPlatform, FcrUserStringToRoleMap } from '../type';
2
+ import { FcrPrivilegeUserRoleToStringMap, FcrPrivilegeUserStringToRoleMap } from '../room-control/privilege-control/type';
3
+ export const convertRteUserToFcrUser = (user, cache) => {
4
+ const userRole = FcrUserStringToRoleMap[user.userRole];
5
+ if (!userRole) {
6
+ return undefined;
7
+ }
8
+ let platform = cache.getUserPlatform(user.userId) ?? FcrPlatform.UNSUPPORTED;
9
+ const avatar = cache.getUserAvatar(user.userId) ?? '';
10
+ const isValidPlatform = platform in FcrPlatform;
11
+ platform = isValidPlatform ? platform : FcrPlatform.UNSUPPORTED;
12
+ return {
13
+ userId: user.userId,
14
+ userName: user.userName,
15
+ connectorType: user.connectorType,
16
+ platform,
17
+ userRole,
18
+ avatar
19
+ };
20
+ };
21
+ export const checkFcrUserRole = user => {
22
+ if (!user?.userRole) return;
23
+ return user;
24
+ };
25
+ export const convertStringPrivilegeRoleToFcrPrivilegeRole = role => {
26
+ return FcrPrivilegeUserStringToRoleMap[role];
27
+ };
28
+ export const convertFcrPrivilegeRoleToStringPrivilegeRole = role => {
29
+ return FcrPrivilegeUserRoleToStringMap[role];
30
+ };
@@ -0,0 +1,8 @@
1
+ import { DetailErrorCode } from '../imports';
2
+ import { validateParams } from '../imports';
3
+ import { generateFcrCoreClientError } from './error';
4
+ export default validateParams(error => {
5
+ const message = `invalid params: ${error.message}`;
6
+ const fcrErrorModuleCode = '00';
7
+ return generateFcrCoreClientError(fcrErrorModuleCode, DetailErrorCode.INVALID_PARAMS, message);
8
+ });
@@ -0,0 +1,103 @@
1
+ import { getPlatform, FcrApplicationPlatform } from '../imports';
2
+ const COMMON_HIGH_CAMERA_CONFIG = {
3
+ dimensions: {
4
+ width: 1280,
5
+ height: 720
6
+ },
7
+ bitrate: 1250,
8
+ frameRate: 24
9
+ };
10
+ const COMMON_LOW_CAMERA_CONFIG = {
11
+ dimensions: {
12
+ width: 480,
13
+ height: 270
14
+ },
15
+ bitrate: 350,
16
+ frameRate: 15
17
+ };
18
+ const COMMON_FULL_HIGH_CAMERA_CONFIG = {
19
+ dimensions: {
20
+ width: 1920,
21
+ height: 1080
22
+ },
23
+ bitrate: 2500,
24
+ frameRate: 20
25
+ };
26
+ const COMMON_CLARITY_SCREEN_CONFIG = {
27
+ dimensions: {
28
+ width: 1920,
29
+ height: 1080
30
+ },
31
+ bitrate: 1500,
32
+ frameRate: 15
33
+ };
34
+ const COMMON_SMOOTH_SCREEN_CONFIG = {
35
+ dimensions: {
36
+ width: 1920,
37
+ height: 1080
38
+ },
39
+ bitrate: 1500,
40
+ frameRate: 30
41
+ };
42
+ const MOBILE_HIGH_CAMERA_CONFIG = {
43
+ dimensions: {
44
+ width: 960,
45
+ height: 540
46
+ },
47
+ bitrate: 1000,
48
+ frameRate: 24
49
+ };
50
+ const HIGH_CAMERA_CONFIG_MAP = {
51
+ [FcrApplicationPlatform.HARMONY]: MOBILE_HIGH_CAMERA_CONFIG,
52
+ [FcrApplicationPlatform.WEB_MOBILE]: MOBILE_HIGH_CAMERA_CONFIG
53
+ };
54
+ const LOW_CAMERA_CONFIG_MAP = {};
55
+ const FULL_HIGH_CAMERA_CONFIG_MAP = {};
56
+ const CLARITY_SCREEN_CONFIG_MAP = {
57
+ [FcrApplicationPlatform.WEB_DESKTOP]: {
58
+ dimensions: {
59
+ width: 1920,
60
+ height: 1080
61
+ },
62
+ bitrate: 1950,
63
+ frameRate: 15
64
+ }
65
+ };
66
+ const SMOOTH_SCREEN_CONFIG_MAP = {
67
+ [FcrApplicationPlatform.WEB_DESKTOP]: {
68
+ dimensions: {
69
+ width: 1920,
70
+ height: 1080
71
+ },
72
+ bitrate: 1950,
73
+ frameRate: 30
74
+ }
75
+ };
76
+ export let FcrVideoEncoderConfig;
77
+ (function (_FcrVideoEncoderConfig) {
78
+ function createDefaultHighCameraConfig() {
79
+ const platform = getPlatform();
80
+ return HIGH_CAMERA_CONFIG_MAP[platform] ?? COMMON_HIGH_CAMERA_CONFIG;
81
+ }
82
+ _FcrVideoEncoderConfig.createDefaultHighCameraConfig = createDefaultHighCameraConfig;
83
+ function createDefaultLowCameraConfig() {
84
+ const platform = getPlatform();
85
+ return LOW_CAMERA_CONFIG_MAP[platform] ?? COMMON_LOW_CAMERA_CONFIG;
86
+ }
87
+ _FcrVideoEncoderConfig.createDefaultLowCameraConfig = createDefaultLowCameraConfig;
88
+ function createDefaultFullHighCameraConfig() {
89
+ const platform = getPlatform();
90
+ return FULL_HIGH_CAMERA_CONFIG_MAP[platform] ?? COMMON_FULL_HIGH_CAMERA_CONFIG;
91
+ }
92
+ _FcrVideoEncoderConfig.createDefaultFullHighCameraConfig = createDefaultFullHighCameraConfig;
93
+ function createDefaultClarityScreenConfig() {
94
+ const platform = getPlatform();
95
+ return CLARITY_SCREEN_CONFIG_MAP[platform] ?? COMMON_CLARITY_SCREEN_CONFIG;
96
+ }
97
+ _FcrVideoEncoderConfig.createDefaultClarityScreenConfig = createDefaultClarityScreenConfig;
98
+ function createDefaultSmoothScreenConfig() {
99
+ const platform = getPlatform();
100
+ return SMOOTH_SCREEN_CONFIG_MAP[platform] ?? COMMON_SMOOTH_SCREEN_CONFIG;
101
+ }
102
+ _FcrVideoEncoderConfig.createDefaultSmoothScreenConfig = createDefaultSmoothScreenConfig;
103
+ })(FcrVideoEncoderConfig || (FcrVideoEncoderConfig = {}));
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "fcr-core",
3
3
  "description": "Core APIs for building online scenes",
4
- "version": "3.8.1",
4
+ "version": "3.9.0-alpha",
5
5
  "module": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
7
7
  "files": [
8
- "lib"
8
+ "lib",
9
+ "lib-es"
9
10
  ],
10
11
  "keywords": [
11
12
  "Agora",
@@ -18,7 +19,7 @@
18
19
  "license": "MIT",
19
20
  "scripts": {
20
21
  "prepare": "husky",
21
- "build": "agora-tc-transpile",
22
+ "build": "agora-tc-transpile --esm",
22
23
  "build:docs": "run-s build:docs:types build:split:i18n build:link-plugin build:en-docs build:cn-docs build:docs:generate",
23
24
  "build:link-plugin": "sh build-doc/theme/install.sh",
24
25
  "build:docs:types": "tsc -p ./build-doc/tsconfig.doc.json",
@@ -40,7 +41,7 @@
40
41
  "@types/lodash": "^4.14.168",
41
42
  "@types/sinon": "^17.0.2",
42
43
  "@types/uuid": "^8.3.0",
43
- "agora-toolchain": "3.8.1",
44
+ "agora-toolchain": "3.9.0-alpha",
44
45
  "core-js": "^3.33.3",
45
46
  "decomment": "^0.9.5",
46
47
  "husky": "^9.0.11",
@@ -54,14 +55,14 @@
54
55
  "dependencies": {
55
56
  "@netless/app-slide": "^0.2.81",
56
57
  "@netless/appliance-plugin": "^1.1.21",
57
- "@netless/forge-room": "1.0.6",
58
- "@netless/forge-rtm": "1.0.6",
59
- "@netless/forge-whiteboard": "1.0.6",
58
+ "@netless/forge-room": "1.1.0",
59
+ "@netless/forge-rtm": "1.1.0",
60
+ "@netless/forge-whiteboard": "1.1.0",
60
61
  "@netless/video-js-plugin": "^0.3.8",
61
62
  "@netless/white-snapshot": "^0.4.2",
62
63
  "@netless/window-manager": "^1.0.7-beta.6",
63
- "agora-foundation": "3.8.1",
64
- "agora-rte-sdk": "3.8.1",
64
+ "agora-foundation": "3.9.0-alpha",
65
+ "agora-rte-sdk": "3.9.0-alpha",
65
66
  "await-to-js": "^3.0.0",
66
67
  "dayjs": "^1.10.4",
67
68
  "easemob-websdk": "4.13.0",
@@ -92,4 +93,4 @@
92
93
  "lint-staged": {
93
94
  "*.{ts,tsx,html,css}": "prettier --write"
94
95
  }
95
- }
96
+ }
@@ -1,24 +0,0 @@
1
- import { EasemobChat } from '../imports';
2
- import { FcrChatConnection, FcrChatConnectionObserver, FcrChatConnectionState } from './type';
3
- import { FcrCoreServiceApi } from '../service/api';
4
- export declare class FcrChatConnectionImpl implements FcrChatConnection {
5
- private _userId;
6
- private _api;
7
- private _chatIpList?;
8
- private _restIpList?;
9
- protected logger: import("agora-foundation/lib/logger/type").Logger;
10
- private _observable;
11
- private _initConfig?;
12
- private _conn?;
13
- private _connectionState;
14
- constructor(_userId: string, _api: FcrCoreServiceApi, _chatIpList?: string[] | undefined, _restIpList?: string[] | undefined);
15
- login(): Promise<void>;
16
- private _addEventListeners;
17
- logout(): void;
18
- private _setConnectionState;
19
- getConnectionState(): FcrChatConnectionState;
20
- getConnectionInstance(): EasemobChat.Connection;
21
- addObserver(observer: FcrChatConnectionObserver): void;
22
- removeObserver(observer: FcrChatConnectionObserver): void;
23
- private _getPrivateConfig;
24
- }