@ezuikit/control-broadcast 0.1.1-beta.1 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,52 +1,12 @@
1
- /**
2
- * @description 事件发射器
3
- * @author Ezviz-OpenBiz
4
- * @since 2026-01-13
5
- */
6
- type EventCallback = (...args: any[]) => void;
7
- declare class EventEmitter {
8
- private events;
9
- constructor();
10
- /**
11
- * 监听事件
12
- * @param event 事件名称
13
- * @param callback 回调函数
14
- */
15
- on(event: string, callback: EventCallback): void;
16
- /**
17
- * 移除事件监听
18
- * @param event 事件名称
19
- * @param callback 回调函数
20
- */
21
- off(event: string, callback: EventCallback): void;
22
- /**
23
- * 触发事件
24
- * @param event 事件名称
25
- * @param args 参数
26
- */
27
- emit(event: string, ...args: any[]): void;
28
- /**
29
- * 监听一次事件
30
- * @param event 事件名称
31
- * @param callback 回调函数
32
- */
33
- once(event: string, callback: EventCallback): void;
34
- /**
35
- * 移除所有事件监听
36
- */
37
- removeAllListeners(): void;
38
- /**
39
- * 获取事件监听器数量
40
- * @param event 事件名称
41
- */
42
- listenerCount(event: string): number;
43
- }
1
+ import { LoggerCls } from '@ezuikit/utils-logger';
2
+ import Drawer from '@ezuikit/control-drawer';
44
3
 
45
4
  /**
46
5
  * @description 类型定义
47
6
  * @author Ezviz-OpenBiz
48
7
  * @since 2026-01-13
49
8
  */
9
+
50
10
  /**
51
11
  * 语音列表项
52
12
  */
@@ -70,6 +30,128 @@ interface RecorderOptions {
70
30
  sampleRate?: number;
71
31
  /** 声道数,默认1 */
72
32
  channelCount?: number;
33
+ /** 日志实例(由 Broadcast 传入,上下文 Broadcast),缺省时内部创建 */
34
+ logger?: LoggerCls;
35
+ }
36
+ /**
37
+ * 查询语音列表的请求参数(`onRequestQueryVoiceList` 的参数)
38
+ */
39
+ interface QueryVoiceListRequest {
40
+ /** 设备序列号 */
41
+ deviceSerial: string;
42
+ /** 通道号 */
43
+ channelNo?: string | number;
44
+ /** 分页大小,固定为 50 */
45
+ pageSize: number;
46
+ }
47
+ /**
48
+ * 下发默认语音的请求参数(`onRequestSendVoice` 的参数)
49
+ */
50
+ interface SendVoiceRequest {
51
+ /** 语音文件 URL(来自语音列表项的 `fileUrl`) */
52
+ fileUrl: string;
53
+ /** 设备序列号 */
54
+ deviceSerial: string;
55
+ /** 通道号 */
56
+ channelNo?: string | number;
57
+ }
58
+ /**
59
+ * 下发临时语音的请求参数(`onVoiceRecorded` / `onRequestSendVoiceOnce` 的参数)
60
+ */
61
+ interface SendVoiceOnceRequest {
62
+ /** 录制的语音(16kHz 单声道 WAV) */
63
+ voiceFile: Blob;
64
+ /** 设备序列号 */
65
+ deviceSerial: string;
66
+ /** 通道号 */
67
+ channelNo?: string | number;
68
+ }
69
+ /**
70
+ * 错误信息(`onRecordError` / `onError` 的参数)
71
+ */
72
+ interface BroadcastErrorInfo {
73
+ /** 错误描述 */
74
+ msg: string;
75
+ /** 原始错误 */
76
+ error: unknown;
77
+ }
78
+ /**
79
+ * 宿主回调(替代 2.x 之前的事件)。均在构造时与 `updateOptions` 中配置,调用时读取最新值;
80
+ * 回调抛出的异常会被捕获并通过 logger 打印,不会中断控件内部流程(例如录音结束后请求下发)。
81
+ */
82
+ interface BroadcastCallbacks {
83
+ /** 面板打开(`open = true`) */
84
+ onOpen?: () => void;
85
+ /** 面板关闭:关闭按钮、遮罩、Esc、`close()` / `open = false`,以及打开状态下的 `destroy()` */
86
+ onClose?: () => void;
87
+ /** 请求查询语音列表:宿主查询后调用 `updateVoiceList(list)` 回填,失败时调用 `showError(msg)` */
88
+ onRequestQueryVoiceList?: (params: QueryVoiceListRequest) => void;
89
+ /** 请求下发默认语音(点击语音项):宿主下发后调用 `showSuccess(msg)` 或 `showError(msg)` */
90
+ onRequestSendVoice?: (data: SendVoiceRequest) => void;
91
+ /** 请求下发临时语音(录音结束):宿主下发后调用 `showSuccess(msg)` 或 `showError(msg)` */
92
+ onRequestSendVoiceOnce?: (data: SendVoiceOnceRequest) => void;
93
+ /** 录到有效语音,参数与 `onRequestSendVoiceOnce` 相同,紧挨着在它之前调用 */
94
+ onVoiceRecorded?: (data: SendVoiceOnceRequest) => void;
95
+ /** 开始录音 */
96
+ onRecordStart?: () => void;
97
+ /** 停止录音并得到有效录音(随后请求下发);关闭面板取消录音时不触发 */
98
+ onRecordStop?: () => void;
99
+ /** 录音完成:正常停止,或达到最长时长自动停止并暂存时;参数为 WAV 录音 */
100
+ onRecordComplete?: (voiceFile: Blob) => void;
101
+ /** 录音出错:开始失败、时长不足等 */
102
+ onRecordError?: (info: BroadcastErrorInfo) => void;
103
+ /** 其它错误,如麦克风权限请求失败 */
104
+ onError?: (info: BroadcastErrorInfo) => void;
105
+ }
106
+ /**
107
+ * 云广播配置选项
108
+ */
109
+ interface BroadcastOptions extends BroadcastCallbacks {
110
+ /** 设备序列号 */
111
+ deviceSerial: string;
112
+ /** 通道号,默认为1 */
113
+ channelNo?: string | number;
114
+ /** 访问令牌,如果和 token 一起,优先使用小权限token */
115
+ accessToken?: string;
116
+ /**
117
+ * 优先使用小权限token
118
+ * 如果使用小权限token, 最少需要传token.deviceToken.global、token.deviceToken.video
119
+ */
120
+ token?: {
121
+ deviceToken: {
122
+ global: string;
123
+ video: string;
124
+ };
125
+ };
126
+ /** 环境配置 */
127
+ env?: {
128
+ domain: string;
129
+ };
130
+ /** 设备能力集 */
131
+ capacity?: {
132
+ /** 对讲能力:1或3表示支持云广播 */
133
+ support_talk?: string | number | null;
134
+ };
135
+ /** 语言,默认zh */
136
+ language?: 'zh' | 'en';
137
+ /**
138
+ * 容器,支持传入字符串ID或HTMLElement节点;面板挂载在容器内(PC 与移动端一致),非 body 容器需为定位元素。
139
+ * 缺省为 document.body(面板相对视口铺满)
140
+ */
141
+ container?: string | HTMLElement;
142
+ /** 展开方向 */
143
+ direction?: 'top' | 'bottom' | 'left' | 'right';
144
+ /** 初始语音列表 */
145
+ voiceList?: VoiceItem[];
146
+ /** 是否移动端:按住说话、松开结束(PC 端为点击切换),不影响挂载位置 */
147
+ isMobile?: boolean;
148
+ /** EZUIKitPlayer 实例引用(用于获取全屏状态) */
149
+ player?: any;
150
+ /**
151
+ * 日志实例(`@ezuikit/utils-logger`),缺省时内部创建。
152
+ * 日志以控件名 `Broadcast` 为上下文(`logger.context('Broadcast')`),仅在构造时读取。
153
+ */
154
+ logger?: LoggerCls;
73
155
  }
74
156
 
75
157
  /**
@@ -85,6 +167,8 @@ interface RecorderOptions {
85
167
  */
86
168
  declare class VoiceRecorder {
87
169
  private options;
170
+ /** 日志实例(上下文 Broadcast) */
171
+ private readonly logger;
88
172
  private audioContext;
89
173
  private mediaStreamSource;
90
174
  private scriptProcessor;
@@ -150,78 +234,91 @@ declare class VoiceRecorder {
150
234
  */
151
235
 
152
236
  /**
153
- * UI配置选项
154
- */
155
- interface BroadcastUIOptions {
156
- /** 语言 */
157
- language: 'zh' | 'en';
158
- /** 展开方向:top-从上往下, bottom-从下往上, left-从左往右, right-从右往左 */
159
- direction?: 'top' | 'bottom' | 'left' | 'right';
160
- /** 初始语音列表 */
161
- voiceList?: VoiceItem[];
162
- /** 是否移动端 */
163
- isMobile?: boolean;
164
- /** EZUIKitPlayer 实例引用(用于获取全屏状态) */
165
- player?: any;
166
- /** 关闭回调 */
167
- onClose: () => void;
168
- /** 开始录音回调 */
169
- onRecordStart: () => void;
170
- /** 停止录音回调 */
171
- onRecordStop: () => void;
172
- /** 下发语音回调 */
173
- onVoiceSend: (fileUrl: string) => void;
174
- /** 下发临时语音回调 */
175
- onVoiceSendOnce: (blob: Blob) => void;
176
- }
177
- /**
178
- * 云广播UI控制器类
237
+ * 云广播 UI(抽象基类,由 `Broadcast` 继承)。
238
+ *
239
+ * 继承 {@link Drawer}(`@ezuikit/control-drawer`)复用其抽屉骨架(遮罩、面板、标题栏、
240
+ * 开合动画、挂载与滚动锁定),本类只负责抽屉内的广播内容:Tab、语音列表、加载/空/错误状态、
241
+ * 底部录音按钮、轻提示与录音提示(`@ezuikit/control-message`),以及录音交互。
242
+ * 录音、取消与下发的业务逻辑由子类实现 {@link BroadcastUI.startRecord} 等抽象方法接入;
243
+ * 抽屉开合统一经 {@link BroadcastUI.handleOpenChange},子类可覆盖以追加逻辑。
179
244
  */
180
- declare class BroadcastUI {
181
- private options;
182
- private container;
183
- private modalElement;
245
+ declare abstract class BroadcastUI extends Drawer {
246
+ /** 广播配置(区别于继承自 Drawer 的 `options`) */
247
+ broadcastOptions: BroadcastOptions;
248
+ /** 语音列表 */
249
+ voiceList: VoiceItem[];
250
+ /** 日志实例(上下文 Broadcast) */
251
+ protected readonly logger: LoggerCls;
252
+ /** 是否移动端(构造时确定交互方式:移动端按住说话,PC 端点击切换) */
253
+ private readonly isMobile;
184
254
  private voiceListElement;
255
+ private loadingElement;
256
+ private emptyElement;
257
+ private errorElement;
258
+ private tipElement;
185
259
  private talkButton;
186
260
  private isRecording;
187
- private voiceList;
188
- private recordingToast;
189
261
  private isStarting;
190
262
  private lastTouchTime;
191
263
  private pendingStop;
192
- private orientationChangeHandler;
264
+ private pendingCancel;
265
+ private tipTimer;
266
+ /** 录音提示:挂在内容区上的 Message 实例,根节点带 `${PREFIX}-recording` 类名,样式按它限定 */
267
+ private recordingMessage;
268
+ /** 当前录音提示的消息 id,未展示时为 null */
269
+ private recordingMessageId;
270
+ /** 当前录音提示里的波形柱(实例内引用,不使用全局 id) */
271
+ private waveBars;
272
+ /** 当前录音提示里的倒计时文案 */
273
+ private recordingHint;
274
+ /** 波形动画定时器 */
275
+ private waveTimer;
276
+ /** 倒计时定时器 */
277
+ private countdownTimer;
278
+ /** 倒计时剩余秒数 */
279
+ private remainingTime;
193
280
  /**
194
- *
195
- * @param container
196
- * @param options
281
+ * @param container 挂载容器,支持元素 ID 或 HTMLElement;PC 与移动端一致,非 body 容器需为定位元素
282
+ * @param options 广播配置
197
283
  */
198
- constructor(container: HTMLElement | string, options: BroadcastUIOptions);
284
+ constructor(container: HTMLElement | string, options: BroadcastOptions);
285
+ /** 开始录音(子类实现);抛出的错误会以轻提示展示并恢复按钮状态 */
286
+ protected abstract startRecord(): Promise<void>;
287
+ /** 停止录音并下发(子类实现);抛出的错误会以轻提示展示 */
288
+ protected abstract stopRecord(): Promise<void>;
289
+ /** 取消录音(子类实现):停止采集并丢弃录音,不下发;关闭面板时调用 */
290
+ protected abstract cancelRecord(): void;
199
291
  /**
200
- * 设置屏幕方向变化监听器(移动端)
292
+ * 下发默认语音(子类实现),点击语音项时调用
293
+ * @param fileUrl 语音文件 URL
201
294
  */
202
- private setupOrientationListener;
295
+ protected abstract sendVoice(fileUrl: string): void;
203
296
  /**
204
- * 移除屏幕方向变化监听器
297
+ * 由 direction 映射为 Drawer 的 placement(非法值回退 right)
205
298
  */
206
- private removeOrientationListener;
299
+ private static resolvePlacement;
207
300
  /**
208
- * 创建UI
301
+ * 构建注入到抽屉 body 内的广播内容
209
302
  */
210
- private createUI;
303
+ private static buildContent;
211
304
  /**
212
- * 将模态框定位到 container 下方(移动端)
305
+ * 构建录音提示内容:波形(9 根柱子)+ 倒计时文案。
306
+ * 元素引用由调用方在实例内保存,不使用全局 id,同页多个实例互不影响。
213
307
  */
214
- private positionModalBelowContainer;
308
+ private static buildRecordingContent;
215
309
  /**
216
- * 获取模态框HTML
310
+ * 抽屉开 / 合:`open = x`、`close()` 与遮罩 / 关闭按钮 / Esc 都会触发(状态未变化时不触发)。
311
+ * 关闭时取消进行中的录音(不下发)。子类覆盖时需调用 `super.handleOpenChange(open)`。
312
+ * @param open 是否打开
217
313
  */
218
- private getModalHTML;
314
+ protected handleOpenChange(open: boolean): void;
219
315
  /**
220
- * 注入样式
316
+ * 取消录音(关闭面板时):收起录音提示、恢复按钮,并由子类丢弃录音;
317
+ * 仍在等待麦克风启动时,启动完成后再取消(见 handleRecordStart)。
221
318
  */
222
- private injectStyles;
319
+ private cancelRecording;
223
320
  /**
224
- * 绑定事件
321
+ * 绑定内容区事件
225
322
  */
226
323
  private bindEvents;
227
324
  /**
@@ -237,26 +334,55 @@ declare class BroadcastUI {
237
334
  */
238
335
  private handleRecordStop;
239
336
  /**
240
- * 显示UI
337
+ * 切换录音按钮的录音中状态与文案
338
+ * @param recording 是否录音中
339
+ */
340
+ private setTalkButtonRecording;
341
+ /**
342
+ * 展示录音提示(波形 + 倒计时):duration 0 不自动关闭,录音结束时由 hideRecordingMessage 关闭
343
+ */
344
+ private showRecordingMessage;
345
+ /**
346
+ * 关闭录音提示,并停止波形动画与倒计时
347
+ */
348
+ private hideRecordingMessage;
349
+ /**
350
+ * 波形动画:每 100ms 按正弦波更新各柱子的高度(保持垂直居中)
351
+ */
352
+ private startWaveAnimation;
353
+ /**
354
+ * 停止波形动画
355
+ */
356
+ private stopWaveAnimation;
357
+ /**
358
+ * 倒计时:每秒刷新剩余时长,归零后提示结束录音的方式
359
+ */
360
+ private startCountdown;
361
+ /**
362
+ * 停止倒计时
241
363
  */
242
- show(): void;
364
+ private stopCountdown;
243
365
  /**
244
- * 隐藏UI
366
+ * 刷新录音提示文案:剩余时长;归零后按设备类型提示松开 / 再次点击结束
245
367
  */
246
- hide(): void;
368
+ private updateRecordingHint;
247
369
  /**
248
- * 关闭弹窗(供上层调用)
249
- * 效果与内部关闭按钮、遮罩点击一致
370
+ * 关闭面板(等价于 `open = false`),效果与关闭按钮、遮罩点击、Esc 一致
250
371
  */
251
372
  close(): void;
252
373
  /**
253
- * 更新语音列表
374
+ * 更新语音列表(宿主查询到语音列表后调用),非数组按空列表处理
375
+ * @param voiceList 语音列表
254
376
  */
255
377
  updateVoiceList(voiceList: VoiceItem[]): void;
256
378
  /**
257
379
  * 渲染语音列表
258
380
  */
259
381
  private renderVoiceList;
382
+ /**
383
+ * 转义将要插入 HTML 的服务端文本
384
+ */
385
+ private static escape;
260
386
  /**
261
387
  * 选中语音
262
388
  */
@@ -266,13 +392,29 @@ declare class BroadcastUI {
266
392
  */
267
393
  setRecordingState(isRecording: boolean): void;
268
394
  /**
269
- * 显示成功消息
395
+ * 加载态:展示时隐藏列表与空/错误态;关闭时恢复列表显示
396
+ * @param loading 是否加载中
397
+ */
398
+ setLoading(loading: boolean): void;
399
+ /**
400
+ * 错误态:传空串清除
401
+ * @param message 错误文案
402
+ */
403
+ setError(message: string): void;
404
+ /**
405
+ * 显示成功消息(底部轻提示,2 秒自动消失)
270
406
  */
271
407
  showSuccess(message: string): void;
272
408
  /**
273
- * 显示错误消息
409
+ * 显示错误消息(底部轻提示,2 秒自动消失)
274
410
  */
275
411
  showError(message: string): void;
412
+ /**
413
+ * 底部轻提示
414
+ * @param message 文案
415
+ * @param isError 是否错误样式
416
+ */
417
+ private showTip;
276
418
  /**
277
419
  * 销毁UI
278
420
  */
@@ -286,100 +428,19 @@ declare class BroadcastUI {
286
428
  */
287
429
 
288
430
  /**
289
- * 云广播配置选项
290
- */
291
- interface BroadcastOptions {
292
- /** 设备序列号 */
293
- deviceSerial: string;
294
- /** 通道号,默认为1 */
295
- channelNo?: string | number;
296
- /** 访问令牌,如果和 token 一起,优先使用小权限token */
297
- accessToken?: string;
298
- /**
299
- * 优先使用小权限token
300
- * 如果使用小权限token, 最少需要传token.deviceToken.global、token.deviceToken.video
301
- */
302
- token?: {
303
- deviceToken: {
304
- global: string;
305
- video: string;
306
- };
307
- };
308
- /** 环境配置 */
309
- env?: {
310
- domain: string;
311
- };
312
- /** 设备能力集 */
313
- capacity?: {
314
- /** 对讲能力:1或3表示支持云广播 */
315
- support_talk?: string | number | null;
316
- };
317
- /** 语言,默认zh */
318
- language?: 'zh' | 'en';
319
- /** 容器,支持传入字符串ID或HTMLElement节点 */
320
- container?: string | HTMLElement;
321
- /** 展开方向 */
322
- direction?: 'top' | 'bottom' | 'left' | 'right';
323
- /** 初始语音列表 */
324
- voiceList?: VoiceItem[];
325
- /** 是否移动端 */
326
- isMobile?: boolean;
327
- /** EZUIKitPlayer 实例引用(用于获取全屏状态) */
328
- player?: any;
329
- }
330
- /**
331
- * 云广播喊话控制类
431
+ * 云广播喊话控制类。
432
+ *
433
+ * 继承 {@link BroadcastUI}(进而继承 `@ezuikit/control-drawer`),复用其抽屉骨架与广播内容;本类负责录音与下发流程,
434
+ * 并通过配置中的回调({@link BroadcastCallbacks})与宿主通信:控件发出请求回调(`onRequestQueryVoiceList` /
435
+ * `onRequestSendVoice` / `onRequestSendVoiceOnce`),宿主调用实际接口后用 `updateVoiceList(list)` /
436
+ * `showSuccess(msg)` / `showError(msg)` 回填结果。
437
+ * 面板开合使用继承自 Drawer 的 `open` 访问器(`broadcast.open = true`),`close()` 等价于 `open = false`。
332
438
  */
333
- declare class Broadcast {
439
+ declare class Broadcast extends BroadcastUI {
334
440
  /** 版本号 */
335
441
  static VERSION: string;
336
- /** 事件常量 */
337
- static EVENTS: {
338
- /** 打开云广播界面 */
339
- open: string;
340
- /** 关闭云广播界面 */
341
- close: string;
342
- /** 请求查询语音列表 */
343
- requestQueryVoiceList: string;
344
- /** 语音列表加载完成 */
345
- voiceListLoaded: string;
346
- /** 语音列表加载失败 */
347
- voiceListError: string;
348
- /** 请求下发临时语音 */
349
- requestSendVoiceOnce: string;
350
- /** 请求下发默认语音 */
351
- requestSendVoice: string;
352
- /** 选中语音列表项 */
353
- voiceSelected: string;
354
- /** 录制语音完成 */
355
- voiceRecorded: string;
356
- /** 开始录音 */
357
- recordStart: string;
358
- /** 停止录音 */
359
- recordStop: string;
360
- /** 录音完成 */
361
- recordComplete: string;
362
- /** 录音错误 */
363
- recordError: string;
364
- /** 语音下发成功 */
365
- voiceSent: string;
366
- /** 语音下发失败 */
367
- voiceSendError: string;
368
- /** 错误事件 */
369
- error: string;
370
- };
371
- /** 配置选项 */
372
- options: BroadcastOptions;
373
- /** 事件发射器 */
374
- eventEmitter: EventEmitter;
375
442
  /** 语音录制器 */
376
443
  voiceRecorder: VoiceRecorder | null;
377
- /** UI控制器 */
378
- broadcastUI: BroadcastUI;
379
- /** 是否已打开 */
380
- isOpen: boolean;
381
- /** 语音列表 */
382
- voiceList: VoiceItem[];
383
444
  /** 最大时长定时器 */
384
445
  private maxDurationTimer;
385
446
  /** 暂存的录音数据(达到最大时长时) */
@@ -389,6 +450,12 @@ declare class Broadcast {
389
450
  * @param options 配置选项
390
451
  */
391
452
  constructor(options: BroadcastOptions);
453
+ /**
454
+ * 调用宿主回调(每次读取最新配置)。回调抛出的异常只通过 logger 打印,不中断控件内部流程。
455
+ * @param name 回调名
456
+ * @param args 回调参数
457
+ */
458
+ private invoke;
392
459
  /**
393
460
  * 初始化麦克风权限
394
461
  * 提前请求麦克风权限,避免首次录音时延迟
@@ -400,21 +467,14 @@ declare class Broadcast {
400
467
  */
401
468
  requestMicrophonePermission(): Promise<boolean>;
402
469
  /**
403
- * 设置事件监听
404
- * 监听上层返回的结果事件
405
- */
406
- private setupEventListeners;
407
- /**
408
- * 打开云广播界面
409
- */
410
- open(): void;
411
- /**
412
- * 关闭云广播界面
470
+ * 面板开 / 合(覆盖 BroadcastUI):打开时无语音列表则请求加载并触发 `onOpen`;
471
+ * 关闭时(BroadcastUI 已取消进行中的录音)触发 `onClose`。
472
+ * @param open 是否打开
413
473
  */
414
- close(): void;
474
+ protected handleOpenChange(open: boolean): void;
415
475
  /**
416
476
  * 加载语音列表
417
- * 触发请求事件,由上层调用实际接口
477
+ * 通过 `onRequestQueryVoiceList` 请求宿主查询(如 player.queryVoiceList()),宿主用 `updateVoiceList(list)` 回填
418
478
  */
419
479
  loadVoiceList(): void;
420
480
  /**
@@ -426,38 +486,35 @@ declare class Broadcast {
426
486
  */
427
487
  private stopRecordAndCache;
428
488
  /**
429
- * 停止录音
489
+ * 停止录音,得到有效录音后请求下发临时语音
430
490
  */
431
491
  stopRecord(): Promise<void>;
492
+ /**
493
+ * 取消录音(关闭面板时由 BroadcastUI 调用):清除最大时长定时器,停止采集并丢弃录音与暂存数据,不下发
494
+ */
495
+ protected cancelRecord(): void;
496
+ /**
497
+ * 清除最大时长定时器
498
+ */
499
+ private clearMaxDurationTimer;
432
500
  /**
433
501
  * 下发临时语音
434
- * 触发请求事件,由上层调用实际接口
502
+ * 先触发 `onVoiceRecorded`,再通过 `onRequestSendVoiceOnce` 请求宿主下发(如 player.sendVoiceOnce())
435
503
  * @param voiceFile 语音文件
436
504
  */
437
505
  sendVoiceOnce(voiceFile: Blob): void;
438
506
  /**
439
507
  * 下发默认语音
440
- * 触发请求事件,由上层调用实际接口
508
+ * 通过 `onRequestSendVoice` 请求宿主下发(如 player.sendVoice())
441
509
  * @param fileUrl 语音文件URL
442
510
  */
443
511
  sendVoice(fileUrl: string): void;
444
512
  /**
445
- * 更新配置
513
+ * 更新配置:合并到 `broadcastOptions`,回调在下次触发时读取新值;
514
+ * 容器、方向、语言、移动端等界面相关配置只在构造时生效。
446
515
  * @param options 新的配置选项
447
516
  */
448
517
  updateOptions(options: Partial<BroadcastOptions>): void;
449
- /**
450
- * 监听事件
451
- * @param event 事件名称
452
- * @param callback 回调函数
453
- */
454
- on(event: string, callback: (data: any) => void): void;
455
- /**
456
- * 移除事件监听
457
- * @param event 事件名称
458
- * @param callback 回调函数
459
- */
460
- off(event: string, callback: (data: any) => void): void;
461
518
  /**
462
519
  * 销毁实例
463
520
  */
@@ -465,4 +522,4 @@ declare class Broadcast {
465
522
  }
466
523
 
467
524
  export { Broadcast as default };
468
- export type { BroadcastOptions };
525
+ export type { BroadcastCallbacks, BroadcastErrorInfo, BroadcastOptions, QueryVoiceListRequest, SendVoiceOnceRequest, SendVoiceRequest, VoiceItem };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ezuikit/control-broadcast",
3
- "version": "0.1.1-beta.1",
3
+ "version": "1.0.0-beta.1",
4
4
  "description": "broadcast voice control",
5
5
  "title": "broadcast",
6
6
  "main": "dist/index.cjs",
@@ -12,20 +12,26 @@
12
12
  "import": "./dist/index.esm.js",
13
13
  "require": "./dist/index.cjs",
14
14
  "default": "./dist/index.cjs"
15
- }
15
+ },
16
+ "./dist/style/style.css": "./dist/style/style.css",
17
+ "./dist/style/style.js": "./dist/style/style.js",
18
+ "./dist/style/style": "./dist/style/style.js",
19
+ "./dist/style/index.js": "./dist/style/index.js",
20
+ "./dist/style/index": "./dist/style/index.js",
21
+ "./dist/style": "./dist/style/index.js"
16
22
  },
17
23
  "keywords": [
18
24
  "ezuikit",
19
25
  "broadcast",
20
26
  "voice"
21
27
  ],
22
- "files": [
23
- "dist"
24
- ],
25
28
  "author": "Ezviz-OpenBiz",
26
29
  "license": "",
27
30
  "dependencies": {
28
- "@ezuikit/utils-i18n": "^2.0.1"
31
+ "@ezuikit/control-drawer": "0.0.1",
32
+ "@ezuikit/control-message": "0.0.1-beta.5",
33
+ "@ezuikit/utils-i18n": "^2.0.1",
34
+ "@ezuikit/utils-logger": "2.1.0"
29
35
  },
30
36
  "publishConfig": {
31
37
  "registry": "https://registry.npmjs.org/",