@dingrtc/whiteboard 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.
@@ -0,0 +1,2355 @@
1
+ import { ConnectionState, DisconnectedReason, CmdDataType, DSSession, DingRTCChannel, JoinParam } from '@dingrtc/channel';
2
+ export { ConnectionState, DisconnectedReason } from '@dingrtc/channel';
3
+ import { EventEmitter, Reporter } from '@dingrtc/shared';
4
+ import * as pdfjs_dist_types_src_display_api from 'pdfjs-dist/types/src/display/api';
5
+ import * as pdfjs_dist_types_src_display_display_utils from 'pdfjs-dist/types/src/display/display_utils';
6
+ import styleInject from '/Users/leolin/projects/work/onertc/oneRTC/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js';
7
+
8
+ declare enum ResizeType {
9
+ width = 0,
10
+ height = 1,
11
+ widthAndHeight = 2,
12
+ none = 3
13
+ }
14
+ /**
15
+ * 图形被选中时,在外部提示框上可以被按住拖动的点
16
+ *
17
+ * @export
18
+ * @class OutlineResizeHandle
19
+ */
20
+ declare class OutlineResizeHandle {
21
+ getX: () => number;
22
+ getY: () => number;
23
+ cursorStyle: string;
24
+ resizeType: ResizeType;
25
+ renderSelf: boolean;
26
+ static ResizeType: typeof ResizeType;
27
+ constructor(getX: () => number, getY: () => number, cursorStyle: string, resizeType: ResizeType, renderSelf?: boolean);
28
+ /**
29
+ * transparent 为 true 会绘制透明样式, 用于测算点位
30
+ * @param renderContext
31
+ * @param transparent 是否应用透明样式
32
+ */
33
+ render(renderContext: CanvasRenderingContext2D, transparent: boolean, scale: number): void;
34
+ isPointInShape(x: number, y: number): boolean;
35
+ }
36
+
37
+ /**
38
+ * 基础图形点位描述
39
+ */
40
+ declare class Model {
41
+ points: Point[];
42
+ /**
43
+ * 图形点位模型
44
+ * @param points
45
+ */
46
+ constructor(points: Point[]);
47
+ setPoints(points: Point[]): void;
48
+ setPointAtIndex(index: number, point: Point): void;
49
+ get minx(): number;
50
+ get miny(): number;
51
+ get maxx(): number;
52
+ get maxy(): number;
53
+ get width(): number;
54
+ get height(): number;
55
+ /**
56
+ * 中心点位置
57
+ */
58
+ get center(): {
59
+ x: number;
60
+ y: number;
61
+ };
62
+ /**
63
+ * 以当前图形中心点为圆心旋转
64
+ * @param angle
65
+ */
66
+ rotate(angle: number): Point[];
67
+ }
68
+
69
+ declare enum ShapeType {
70
+ Click = "click",
71
+ Select = "select",
72
+ Pen = "pen",
73
+ Line = "line",
74
+ Rect = "rect",
75
+ Square = "square",
76
+ Ellipse = "ellipse",
77
+ Circle = "circle",
78
+ Text = "text",
79
+ Triangle = "triangle",// 三角形
80
+ Rhombic = "rhombic",// 菱形
81
+ Arrow = "arrow",
82
+ Delete = "delete",
83
+ Image = "image",
84
+ Stamp = "stamp",
85
+ Video = "video",
86
+ Audio = "audio",
87
+ Eraser = "eraser",
88
+ Brush = "eraser",
89
+ EraserIndicator = "eraserIndicator",
90
+ LaserPointer = "laserPointer",
91
+ Cursor = "cursor",
92
+ Drag = "drag"
93
+ }
94
+ declare enum ShapeOrderType {
95
+ back = "back",
96
+ front = "front",
97
+ normal = "normal",
98
+ bg = "bg"
99
+ }
100
+ declare enum ShapeFillType {
101
+ none = "none",
102
+ color = "color"
103
+ }
104
+ declare enum ShapeLineType {
105
+ solid = "solid",
106
+ dashed = "dashed"
107
+ }
108
+ declare enum ShapeFontFormatType {
109
+ normal = "normal",
110
+ bold = "bold",
111
+ italic = "italic",
112
+ bold_italic = "bold_italic"
113
+ }
114
+ declare enum ShapeVisibleType {
115
+ invisible = "0",
116
+ visible = "1"
117
+ }
118
+ declare enum InteractionStatusType {
119
+ default = 0,
120
+ focused = 1,
121
+ selected = 2,
122
+ resizing = 3,
123
+ rotating = 4,
124
+ willBeDeleted = 5
125
+ }
126
+
127
+ /**
128
+ * 图形消息
129
+ */
130
+ interface IShapeData {
131
+ name: string;
132
+ pageId: string;
133
+ shape: ShapeType;
134
+ order: ShapeOrderType;
135
+ orderTime: string;
136
+ text?: string;
137
+ data: string;
138
+ visible: ShapeVisibleType;
139
+ style?: string;
140
+ font?: string;
141
+ image?: string;
142
+ video?: string;
143
+ audio?: string;
144
+ }
145
+ /**
146
+ * 图形消息
147
+ */
148
+ interface IShapeRgnData {
149
+ name: string;
150
+ pageId: string;
151
+ shape: ShapeType;
152
+ rgn: string;
153
+ }
154
+
155
+ /**
156
+ * 所有图形的基础类型
157
+ *
158
+ * shape 通过 shapeId + creator 唯一确定
159
+ */
160
+ declare abstract class BaseShape extends EventEmitter<{
161
+ requestRender: (shape: BaseShape) => void;
162
+ }> {
163
+ shapeId: string;
164
+ readonly creator: string;
165
+ readonly pageId: string;
166
+ static GIF_RENDER_RATE: number;
167
+ hash: number;
168
+ get shouldRenderOutline(): boolean;
169
+ protected emitRenderRequest(): void;
170
+ private _order;
171
+ get order(): ShapeOrderType;
172
+ set order(order: ShapeOrderType);
173
+ private _orderTime;
174
+ get orderTime(): number;
175
+ set orderTime(orderTime: number);
176
+ rngReverse: {
177
+ xReversed: boolean;
178
+ yReversed: boolean;
179
+ };
180
+ transformOriginalInfo?: BaseShape;
181
+ resizeStartHandle?: Point & {
182
+ resizeType: ResizeType;
183
+ index: number;
184
+ };
185
+ resizeOriginPosition?: Point;
186
+ protected _visible: boolean;
187
+ get visible(): boolean;
188
+ set visible(visible: boolean);
189
+ abstract get shapeType(): ShapeType;
190
+ abstract clone(userId: string, shapeId: string): BaseShape;
191
+ protected _interactionStatus: InteractionStatusType;
192
+ get interactionStatus(): InteractionStatusType;
193
+ set interactionStatus(interactionStatus: InteractionStatusType);
194
+ get points(): Point[];
195
+ set points(points: Point[]);
196
+ protected model: Model;
197
+ /**
198
+ * 用于消息通信时传输的 shape 序列号
199
+ */
200
+ get shapeSeq(): string;
201
+ /**
202
+ * @param points 图形点位信息
203
+ * @param shapeId 图形序列
204
+ * @param creator 创建者 uid
205
+ * @param pageId 所属页面 id,不设置表示图形不属于任何页面
206
+ */
207
+ constructor(points: Point[], shapeId: string, creator: string, pageId?: string);
208
+ /**
209
+ * 是否可以被选中
210
+ */
211
+ abstract shouldSelectAfterAdd(): boolean;
212
+ render(ctx: CanvasRenderingContext2D, options: {
213
+ viewport: {
214
+ minx: number;
215
+ miny: number;
216
+ maxx: number;
217
+ maxy: number;
218
+ };
219
+ scale: number;
220
+ translate: number[];
221
+ wrapperDom: HTMLElement;
222
+ lineWidth: number;
223
+ insertType: ShapeType;
224
+ forceRenderText: boolean;
225
+ }): void;
226
+ /**
227
+ * 渲染图形(不包括边框和形变抓手按钮)
228
+ * @param renderContext
229
+ * @param options
230
+ */
231
+ protected abstract renderShape(renderContext: CanvasRenderingContext2D, options: {
232
+ viewport: {
233
+ minx: number;
234
+ miny: number;
235
+ maxx: number;
236
+ maxy: number;
237
+ };
238
+ scale: number;
239
+ translate: number[];
240
+ wrapperDom: HTMLElement;
241
+ lineWidth: number;
242
+ insertType: ShapeType;
243
+ forceRenderText: boolean;
244
+ }): void;
245
+ /**
246
+ * 当图形被选中或者被聚焦时,渲染图形外部边框;当图形被单选时显示图形的变形把手
247
+ */
248
+ renderOutline(ctx: CanvasRenderingContext2D, scale: number): void;
249
+ /**
250
+ * 图形是否在选的的rect范围内(任意一点出现在选的范围内即认为可见)
251
+ * @param x
252
+ * @param y
253
+ * @param width
254
+ * @param height
255
+ * @returns
256
+ */
257
+ private isShapeInRect;
258
+ /**
259
+ * 测试点位是否在图形边线上
260
+ * @param x 点位在 canvas 上的 x 坐标
261
+ * @param y 点位在 canvas 上的 y 坐标
262
+ * @param renderContext
263
+ */
264
+ abstract isPointInShape(x: number, y: number): boolean;
265
+ /**
266
+ * 测试点位是否在图形边框矩形内
267
+ * @param x 点位在 canvas 上的 x 坐标
268
+ * @param y 点位在 canvas 上的 y 坐标
269
+ */
270
+ isPointInShapeRect(x: number, y: number): boolean;
271
+ export(): ShapeReservedState;
272
+ /**
273
+ * 获取 rgn 信息,用来在设备之间传输,实现 shape 的移动和缩放
274
+ */
275
+ getRgnData(): string;
276
+ get minx(): number;
277
+ get miny(): number;
278
+ get maxx(): number;
279
+ get maxy(): number;
280
+ get width(): number;
281
+ get height(): number;
282
+ /**
283
+ * 中心点位置
284
+ */
285
+ get center(): {
286
+ x: number;
287
+ y: number;
288
+ };
289
+ /**
290
+ * deepcopy 存储变化开始时候的 points 位置
291
+ */
292
+ storeTransformStartPoints(): void;
293
+ onMoveStart(): void;
294
+ onMove(deltaX: number, deltaY: number): void;
295
+ onMoveEnd(deltaX: number, deltaY: number): void;
296
+ onResizeStart(x: number, y: number): void;
297
+ onResize(deltaX: number, deltaY: number, shiftPressing: boolean): void;
298
+ /**
299
+ * 对所有的点位根据 resizeOriginPosition 进行缩放
300
+ * @param xRatio
301
+ * @param yRatio
302
+ * @param resizeOriginPosition
303
+ */
304
+ resizeByRatio(xRatio: number, yRatio: number, resizeOriginPosition?: Point): void;
305
+ private updateRgnReverse;
306
+ onResizeEnd(deltaX: number, deltaY: number, shiftPressing: boolean): void;
307
+ /**
308
+ * 以中心点为基准旋转
309
+ * @param angle
310
+ */
311
+ onRotate(angle: number): void;
312
+ /**
313
+ * outline 上的 resize 把手
314
+ */
315
+ get outlineResizeHandles(): OutlineResizeHandle[];
316
+ destructor(): void;
317
+ genDrawMsg(name: string): IShapeData;
318
+ genRgnMsg(name: string): IShapeRgnData;
319
+ }
320
+
321
+ /**
322
+ * 橡皮擦范围指示器
323
+ */
324
+ declare class EraserIndicator extends BaseShape {
325
+ clone(): BaseShape;
326
+ get shapeType(): ShapeType;
327
+ shouldSelectAfterAdd(): boolean;
328
+ isPointInShape(): boolean;
329
+ renderShape(ctx: CanvasRenderingContext2D, options: {
330
+ scale: number;
331
+ lineWidth: number;
332
+ }): void;
333
+ constructor();
334
+ }
335
+
336
+ /**
337
+ * 选择范围指示器
338
+ */
339
+ declare class SelectIndicator extends BaseShape {
340
+ clone(): BaseShape;
341
+ get shapeType(): ShapeType;
342
+ private shapeStyle;
343
+ shouldSelectAfterAdd(): boolean;
344
+ isPointInShape(): boolean;
345
+ renderShape(renderContext: CanvasRenderingContext2D, options: {
346
+ insertType: ShapeType;
347
+ }): void;
348
+ constructor();
349
+ }
350
+
351
+ type WBRoleType = 'Admin' | 'Attendee' | 'Viewer';
352
+ type ImageScalingMode = 'auto' | 'fillWidth' | 'fillHeight';
353
+
354
+ /**
355
+ * 图片图形,普通普通会缓存img对象,背景图(order='bg')的图片不缓存img
356
+ */
357
+ declare class Image extends BaseShape {
358
+ imgUrl: string;
359
+ clone(userId: string, shapeId: string): Image;
360
+ private loadedUrl;
361
+ private _img?;
362
+ get img(): HTMLImageElement | undefined;
363
+ set img(value: HTMLImageElement | undefined);
364
+ private gifData?;
365
+ private gifRenderInterval;
366
+ get shapeType(): ShapeType;
367
+ export(): ShapeReservedState;
368
+ constructor(baseConfig: {
369
+ points: Point[];
370
+ shapeId: string;
371
+ creator: string;
372
+ pageId: string;
373
+ }, imgUrl: string);
374
+ shouldSelectAfterAdd(): boolean;
375
+ genDrawMsg(userName: string): IShapeData;
376
+ loadImage(): Promise<HTMLImageElement>;
377
+ isPointInShape(x: number, y: number): boolean;
378
+ isGif(): any;
379
+ renderShape(renderContext: CanvasRenderingContext2D): void;
380
+ genRgnMsg(name: string): {
381
+ pageId: string;
382
+ name: string;
383
+ shape: ShapeType;
384
+ rgn: string;
385
+ };
386
+ destructor(): void;
387
+ }
388
+
389
+ /**
390
+ * 音视频元素抽象类,包含音视频元素基本api
391
+ */
392
+ declare abstract class MediaShape extends BaseShape {
393
+ mediaUrl: string;
394
+ wrapperDom: HTMLDivElement;
395
+ mediaElement: HTMLVideoElement | HTMLAudioElement;
396
+ private _headerDom;
397
+ private _switchButton;
398
+ private _repeatPlay;
399
+ /**
400
+ * 是否重复播放
401
+ */
402
+ get repeatPlay(): boolean;
403
+ set repeatPlay(value: boolean);
404
+ shouldSelectAfterAdd(): boolean;
405
+ export(): ShapeReservedState;
406
+ private callbacks?;
407
+ setCallback(callbacks: {
408
+ onShapeFocused: (shape: MediaShape) => void;
409
+ onShapeSelected: (shape: MediaShape) => void;
410
+ onMediaUpdate: (shape: MediaShape) => void;
411
+ }): void;
412
+ /**
413
+ *
414
+ * @param points 点位
415
+ * @param shapeId 图形序列号
416
+ * @param creator 创建者
417
+ * @param pageId 所属画布 pageid
418
+ * @param mediaUrl 媒体url
419
+ */
420
+ constructor(baseConfig: {
421
+ points: Point[];
422
+ shapeId: string;
423
+ creator: string;
424
+ pageId: string;
425
+ }, mediaUrl: string);
426
+ genDrawMsg(userName: string): IShapeData;
427
+ private _onVideoStop;
428
+ protected abstract _makeMediaElement(): HTMLVideoElement | HTMLAudioElement;
429
+ private _onMouseMove;
430
+ private _onClick;
431
+ private _onVideoTimePlay;
432
+ private _onVideoTimePause;
433
+ private _onVideoTimeUpdate;
434
+ get visible(): boolean;
435
+ set visible(visible: boolean);
436
+ isPointInShape(x: number, y: number): boolean;
437
+ renderShape(ctx: CanvasRenderingContext2D, options: {
438
+ viewport: {
439
+ minx: number;
440
+ miny: number;
441
+ maxx: number;
442
+ maxy: number;
443
+ };
444
+ scale: number;
445
+ translate: number[];
446
+ wrapperDom: HTMLElement;
447
+ }): void;
448
+ /**
449
+ * 从dom中删除媒体元素
450
+ */
451
+ removeMediaDom(): void;
452
+ destructor(): void;
453
+ }
454
+
455
+ /**
456
+ * 激光笔
457
+ */
458
+ declare class LaserPointer extends BaseShape {
459
+ clone(): BaseShape;
460
+ get shapeType(): ShapeType;
461
+ isPointInShape(): boolean;
462
+ shouldSelectAfterAdd(): boolean;
463
+ renderShape(renderContext: CanvasRenderingContext2D, options: {
464
+ scale: number;
465
+ }): void;
466
+ }
467
+
468
+ declare enum MouseType {
469
+ draw = "draw",
470
+ select = "select",
471
+ delete = "delete",
472
+ erase = "erase",
473
+ text = "text",
474
+ polygon = "polygon",
475
+ laserPointer = "laserPointer",
476
+ default = "default"
477
+ }
478
+ /**
479
+ * 用户鼠标光标
480
+ */
481
+ declare class Cursor extends BaseShape {
482
+ userName: string;
483
+ cursorType: MouseType;
484
+ private color;
485
+ clone(): BaseShape;
486
+ constructor(baseConfig: {
487
+ points: Point[];
488
+ shapeId: string;
489
+ creator: string;
490
+ }, userName: string, cursorType: MouseType, color: string);
491
+ shouldSelectAfterAdd(): boolean;
492
+ updateCursor(x: number, y: number, color: string, type: MouseType): void;
493
+ get shapeType(): ShapeType;
494
+ isPointInShape(): boolean;
495
+ renderShape(ctx: CanvasRenderingContext2D, options: {
496
+ scale: number;
497
+ }): void;
498
+ }
499
+
500
+ declare class ShapeHistory {
501
+ actionType: HistoryActionType;
502
+ shapeId: string;
503
+ currentState: ShapeReservedState;
504
+ lastState?: ShapeReservedState;
505
+ shapeCreator: string;
506
+ constructor(actionType: HistoryActionType, shapeId: string, currentState: ShapeReservedState, lastState?: ShapeReservedState);
507
+ }
508
+ declare class BatchHistory {
509
+ actionType: HistoryActionType;
510
+ shapeStates: {
511
+ shapeId: string;
512
+ currentState: ShapeReservedState;
513
+ lastState?: ShapeReservedState;
514
+ }[];
515
+ constructor(actionType: HistoryActionType, shapeStates: {
516
+ shapeId: string;
517
+ currentState: ShapeReservedState;
518
+ lastState?: ShapeReservedState;
519
+ }[]);
520
+ }
521
+ declare enum HistoryActionType {
522
+ reveiveShape = 0,
523
+ newShape = 1,
524
+ hideShape = 2,
525
+ rgnShape = 3,
526
+ updateStyle = 4,
527
+ updateText = 5,
528
+ deleteShape = 6
529
+ }
530
+ declare class History extends EventEmitter<{
531
+ 'history-changed': (state: {
532
+ undo: boolean;
533
+ redo: boolean;
534
+ }) => void;
535
+ }> {
536
+ private undoList;
537
+ private redoList;
538
+ private emitHistoryEvent;
539
+ saveHistory(shapeHistory: ShapeHistory): void;
540
+ batchSave(batchHistory: BatchHistory): void;
541
+ undo(): ShapeHistory | BatchHistory;
542
+ redo(): ShapeHistory | BatchHistory;
543
+ clearAll(): void;
544
+ clearUserHistory(userId: string): void;
545
+ clearShapeHistory(shapeId: string): void;
546
+ canUndo(): boolean;
547
+ canRedo(): boolean;
548
+ }
549
+
550
+ declare class Page extends EventEmitter<{
551
+ 'background-image-updated': () => void;
552
+ 'page-content-updated': (page: Page) => void;
553
+ }> {
554
+ pageId: string;
555
+ private shapes;
556
+ private _backgroundColor;
557
+ private _backgroundImage?;
558
+ private _scale;
559
+ private _translate;
560
+ history: History;
561
+ get scale(): number;
562
+ set scale(value: number);
563
+ get translate(): [number, number];
564
+ set translate(value: [number, number]);
565
+ get miny(): number;
566
+ get minx(): number;
567
+ get visibleShapes(): BaseShape[];
568
+ get backgroundImage(): Image | undefined;
569
+ set backgroundImage(value: Image | undefined);
570
+ get backgroundColor(): string;
571
+ set backgroundColor(value: string);
572
+ addShape(shape: BaseShape): void;
573
+ getShapeBySeq(shapeSeq: string, userId: string): BaseShape;
574
+ /**
575
+ * 根据 page 中shapes 的 order 分类以及时间重新排序
576
+ */
577
+ updateShapesOrder(): void;
578
+ /**
579
+ * 返回当前页面内所有图形,包括背景图
580
+ * @returns
581
+ */
582
+ getShapes(): BaseShape[];
583
+ /**
584
+ * 清除所有图形
585
+ */
586
+ clearShapes(): void;
587
+ /**
588
+ * 清除所有图形和背景图
589
+ */
590
+ clearPage(): void;
591
+ /**
592
+ * 清除背景图
593
+ */
594
+ clearBackgroundImage(): void;
595
+ /**
596
+ * 清除某个用户的背景图
597
+ */
598
+ clearUserBackgroundImage(userId: string): void;
599
+ /**
600
+ * 清除某个用户的图形
601
+ * @param userId
602
+ */
603
+ clearUserShapes(userId: string): void;
604
+ removeShape(shapeId: string): void;
605
+ constructor(pageId: string);
606
+ reset(): void;
607
+ export(): {
608
+ pageId: string;
609
+ scale: number;
610
+ translate: [number, number];
611
+ backgroundColor: string;
612
+ backgroundImage: ShapeReservedState;
613
+ shapes: ShapeReservedState[];
614
+ };
615
+ static restore(data: any): Page;
616
+ private static restoreShapes;
617
+ restoreShapes(shapeStates: ShapeReservedState[]): BaseShape[];
618
+ }
619
+
620
+ interface IDomRect {
621
+ x: number;
622
+ y: number;
623
+ width: number;
624
+ height: number;
625
+ top: number;
626
+ right: number;
627
+ bottom: number;
628
+ left: number;
629
+ }
630
+ declare enum WBClearType {
631
+ All = "all",
632
+ DRAWS = "draws",
633
+ BACKGROUND_IMAGE = "backgroundImage"
634
+ }
635
+
636
+ interface IWhiteboardManagerEvents {
637
+ /**
638
+ * 频道内创建了一个新的白板
639
+ */
640
+ 'whiteboard-start': (whiteboardId: string) => void;
641
+ /**
642
+ * 频道内关闭了一个白板
643
+ */
644
+ 'whiteboard-stop': (whiteboardId: string) => void;
645
+ /**
646
+ * 频道内创建了一个新的标注
647
+ */
648
+ 'annotation-start': (annotationId: string, sourceType: AnnotationSourceType) => void;
649
+ /**
650
+ * 频道内关闭了一个标注
651
+ */
652
+ 'annotation-stop': (annotationId: string, sourceType: AnnotationSourceType) => void;
653
+ /**
654
+ * SDK 与服务器的连接状态发生改变时的回调。
655
+ */
656
+ 'connection-state-change': (currentState: ConnectionState, prevState: ConnectionState, reason?: DisconnectedReason) => void;
657
+ }
658
+ /**
659
+ * video 代表摄像头,share代表共享,external代表自定义源
660
+ */
661
+ type AnnotationSourceType = 'video' | 'share' | 'external';
662
+ interface IWhiteboardEvents {
663
+ /**
664
+ * 用户加入了白板/标注
665
+ */
666
+ 'user-join': (userId: string) => void;
667
+ /**
668
+ * 用户离开了白板/标注
669
+ */
670
+ 'user-leave': (userId: string) => void;
671
+ /**
672
+ * 文档加载失败
673
+ */
674
+ 'doc-load-failed': (docId: string, docName: string) => void;
675
+ /**
676
+ * 文档加载成功
677
+ */
678
+ 'doc-ready': (docId: string) => void;
679
+ /**
680
+ * 用户视角共享开始
681
+ */
682
+ 'user-vision-share-start': (userId: string) => void;
683
+ /**
684
+ * 用户视角共享结束
685
+ */
686
+ 'user-vision-share-stop': (userId: string) => void;
687
+ /**
688
+ * 本地视角共享停止
689
+ */
690
+ 'vision-lock-stop': () => void;
691
+ /**
692
+ * 视图窗口变化
693
+ */
694
+ 'viewport-updated': (scale: number, viewport: {
695
+ minx: number;
696
+ miny: number;
697
+ maxx: number;
698
+ maxy: number;
699
+ }) => void;
700
+ /**
701
+ * 新增文档
702
+ */
703
+ 'doc-created': (docId: string) => void;
704
+ /**
705
+ * 切换文档
706
+ */
707
+ 'doc-switched': (docId: string) => void;
708
+ /**
709
+ * 删除文档
710
+ */
711
+ 'doc-deleted': (docId: string) => void;
712
+ /**
713
+ * 背景图片更新
714
+ */
715
+ 'background-image-updated': (docId: string, pageIndex: number, imgUrl: string) => void;
716
+ /**
717
+ * 文档页码变化
718
+ */
719
+ 'page-index-changed': (activeDocId: string, pageIndex: number, totalPages: number) => void;
720
+ /**
721
+ * 用户自己操作导致视图大小变化
722
+ */
723
+ 'viewport-updated-by-self': () => void;
724
+ /**
725
+ * undo或者redo记录变化时触发
726
+ */
727
+ 'history-changed': (canUndo: boolean, canRedo: boolean) => void;
728
+ }
729
+
730
+ declare enum DocBrowserMode {
731
+ flip = "flip",
732
+ scroll = "scroll"
733
+ }
734
+ declare enum DocType {
735
+ 'normal' = "normal",
736
+ 'externalDoc' = "externalDoc",
737
+ 'h5' = "h5",
738
+ 'pdf' = "pdf"
739
+ }
740
+ declare abstract class BaseDoc extends EventEmitter<{
741
+ requestRender: (docId: string) => void;
742
+ 'viewport-updated': (docId: string) => void;
743
+ 'page-index-changed': (docId: string) => void;
744
+ }> {
745
+ /**
746
+ * 文档类型
747
+ */
748
+ abstract get type(): DocType;
749
+ /**
750
+ * 文档内所有页面是否共享缩放和平移属性
751
+ *
752
+ * @type {boolean}
753
+ */
754
+ abstract get sharePageSize(): boolean;
755
+ /**
756
+ * 是否可以增加、删除页面
757
+ */
758
+ abstract get canModifyPage(): boolean;
759
+ createdEventNotEmited: boolean;
760
+ docId: string;
761
+ name: string;
762
+ creator: string;
763
+ pageVersion: number;
764
+ fileKey?: string;
765
+ private pages;
766
+ private previousPageIndex;
767
+ curPageId: string;
768
+ maxSeq: number;
769
+ protected _browseMode: DocBrowserMode;
770
+ disableScale: boolean;
771
+ get browseMode(): DocBrowserMode;
772
+ set browseMode(mode: DocBrowserMode);
773
+ pageSize: {
774
+ width: number;
775
+ height: number;
776
+ };
777
+ private _scrollPages;
778
+ get scrollPages(): number;
779
+ set scrollPages(pages: number);
780
+ get width(): number;
781
+ get scrollPageHeight(): number;
782
+ get scrollHeight(): number;
783
+ get y(): number;
784
+ get currentPageIndex(): number;
785
+ set currentPageIndex(index: number);
786
+ get currentPage(): Page;
787
+ get totalPages(): number;
788
+ get scale(): number;
789
+ get translate(): number[];
790
+ sizeConfig: {
791
+ width: number;
792
+ height: number;
793
+ limited: boolean;
794
+ };
795
+ setSizeConfig(sizeConfig: {
796
+ width: number;
797
+ height: number;
798
+ limited: boolean;
799
+ }): void;
800
+ get isSizeLimited(): boolean;
801
+ getPageByPageId(pageId: string): any;
802
+ getPageIndexByPageId(pageId: string): any;
803
+ getPages(): Page[];
804
+ getPageAtIndex(index: number): Page;
805
+ generateNewPageId(): string;
806
+ addPage(page: Page, index?: number): void;
807
+ removePage(index: number): void;
808
+ /**
809
+ * 监听 page 更新事件,向外部发送渲染请求
810
+ * @param page
811
+ */
812
+ private setUpPageListeners;
813
+ protected requestRender(): void;
814
+ /**
815
+ * 通知外部文档更新,需要重新渲染
816
+ */
817
+ private onPageUpdated;
818
+ /**
819
+ * 根据pageId列表更新page,本地多的删掉,少的新建page补齐
820
+ * @param pageIds
821
+ */
822
+ regenerate(pageIds: string[]): void;
823
+ constructor(pageInfo: {
824
+ docId: string;
825
+ name: string;
826
+ creator: string;
827
+ curPageId: string;
828
+ pageVersion: number;
829
+ sizeConfig?: {
830
+ width: number;
831
+ height: number;
832
+ limited: boolean;
833
+ };
834
+ fileKey?: string;
835
+ browseMode: DocBrowserMode;
836
+ });
837
+ setScrollY(y: number, wrapperRect: IDomRect): void;
838
+ /**
839
+ * 设置画板偏移
840
+ * @param x 水平方向偏移
841
+ * @param y 竖直方向偏移 (如果是pdf view,只能垂直方向移动)
842
+ * @param smooth 是否平滑移动
843
+ * @param duration 平滑移动时间,默认 400 ms
844
+ */
845
+ setTranslate(x: number, y: number, wrapperRect: IDomRect, smooth?: boolean, duration?: number): void;
846
+ /**
847
+ * 设置当前白板视图的缩放比例,可以选择是否已白板中心作为缩放原点
848
+ * @param nextScale 缩放比例
849
+ * @param scaleByPosition 是否以某个位置为中心缩放,默认开启,且以当前画板中心为中心缩放
850
+ * @param scalePosition 指定缩放中心位置,如果不指定,则以当前画板中心为中心缩放
851
+ */
852
+ setScale(nextScale: number, scaleByPosition: boolean, wrapperRect: IDomRect, scalePosition?: {
853
+ x: number;
854
+ y: number;
855
+ }): void;
856
+ setScaleAndTranslate(nextScale: number, translate: number[], limited: boolean, wrapperRect: IDomRect): void;
857
+ /**
858
+ * 设置本地视角信息
859
+ * @param visionInfo 视角信息
860
+ */
861
+ setDocViewport(visionInfo: {
862
+ width: number;
863
+ height: number;
864
+ minx: number;
865
+ miny: number;
866
+ }, wrapperRect: IDomRect, page?: Page): void;
867
+ /**
868
+ * 获取 sizeConfig 下或 白板在"scroll"模式下的被限定,在当前画布大小下缩放居中之后真实的画布大小
869
+ *
870
+ */
871
+ private getSizeConfigLimitSize;
872
+ /**
873
+ * 以 传入的点位更新当前白板页面 scale 比例,如果白板被限制大小,会自动计算出合适的 scale 和 translate
874
+ * @param nextScale 要更新的 scale
875
+ * @param originalX 缩放点的 x 坐标,点位是在白板 canvas 元素上的位置
876
+ * @param originalY 缩放点的 y 坐标,点位是在白板 canvas 元素上的位置
877
+ */
878
+ updateBoardWithNewScale: (nextScale: number, originalX: number, originalY: number, rect: IDomRect) => void;
879
+ /**
880
+ * 根据传入的translate 和 scale计算出视窗位置
881
+ */
882
+ private getPotentialViewportPosition;
883
+ /**
884
+ * 计算在被限定大小的情况下,在某个缩放值下,translate能取的极限值
885
+ * @param scale
886
+ * @param viewport 限定的视窗位置
887
+ */
888
+ private getLimitedTranslate;
889
+ scaleBoardFitBackgroundImage(page: Page, wrapperRect: IDomRect, bgScaleMode: ImageScalingMode): void;
890
+ /**
891
+ * 返回文档可见区域的坐标
892
+ */
893
+ getDocViewportPosition(wrapperRect: IDomRect): {
894
+ minx: number;
895
+ miny: number;
896
+ maxx: number;
897
+ maxy: number;
898
+ };
899
+ export(): {
900
+ docId: string;
901
+ name: string;
902
+ creator: string;
903
+ pageIndex: number;
904
+ pageVersion: number;
905
+ pages: {
906
+ pageId: string;
907
+ scale: number;
908
+ translate: [number, number];
909
+ backgroundColor: string;
910
+ backgroundImage: ShapeReservedState;
911
+ shapes: ShapeReservedState[];
912
+ }[];
913
+ fileKey: string;
914
+ };
915
+ toJson(): {
916
+ docId: string;
917
+ name: string;
918
+ creator: string;
919
+ pageIndex: number;
920
+ pageLength: number;
921
+ fileKey: string;
922
+ };
923
+ /**
924
+ * 清除所有页面数据
925
+ */
926
+ clear(): void;
927
+ clearPageById(pageId: string): void;
928
+ /**
929
+ * 清除某个用户所有图形
930
+ * @param userId
931
+ */
932
+ clearUserShapes(userId: string): void;
933
+ /**
934
+ * 清除某个用户背景图
935
+ * @param userId
936
+ */
937
+ clearUserBackgroundImage(userId: string): void;
938
+ reset(): void;
939
+ }
940
+
941
+ interface PDFViewer {
942
+ pageIndex: number;
943
+ width: number;
944
+ totalHeight: number;
945
+ domRef: HTMLDivElement;
946
+ state: 'notloaded' | 'loading' | 'loaded';
947
+ url: string;
948
+ y: number;
949
+ pdfPages: Map<number, {
950
+ viewport: pdfjs_dist_types_src_display_display_utils.PageViewport;
951
+ rendered: boolean;
952
+ top: number;
953
+ img: HTMLImageElement;
954
+ domRef: HTMLDivElement;
955
+ skeleton: HTMLDivElement;
956
+ pdfProxy: pdfjs_dist_types_src_display_api.PDFPageProxy;
957
+ rendering: boolean;
958
+ }>;
959
+ /**
960
+ * pdf 页面加载完之后按顺序保存每页的高度(累计高度),用于计算当前页面的高度
961
+ */
962
+ pageHightList: number[];
963
+ }
964
+ /**
965
+ * pdf 文档
966
+ */
967
+ declare class PdfDoc extends BaseDoc {
968
+ pdfViewer: PDFViewer;
969
+ static DOC_TYPE: DocType;
970
+ get browseMode(): DocBrowserMode;
971
+ set browseMode(mode: DocBrowserMode);
972
+ get type(): DocType;
973
+ get sharePageSize(): boolean;
974
+ get canModifyPage(): boolean;
975
+ get width(): number;
976
+ get scrollHeight(): number;
977
+ url: string;
978
+ lastSyncY: number;
979
+ /**
980
+ * 缓存当前页面高度范围,减少计算页码运算
981
+ */
982
+ private currentPageMem;
983
+ /**
984
+ * 判断当前滚动位置是否在当前缓存的页面范围内
985
+ */
986
+ private isInCurrentMemPage;
987
+ get currentPageIndex(): number;
988
+ constructor(docInfo: {
989
+ docId: string;
990
+ name: string;
991
+ creator: string;
992
+ curPageId: string;
993
+ pageVersion: number;
994
+ fileKey?: string;
995
+ browseMode: DocBrowserMode;
996
+ }, pdfViewer: PDFViewer);
997
+ load(): Promise<any>;
998
+ setScrollY(y: number, wrapperRect: IDomRect): void;
999
+ setScaleAndTranslate(nextScale: number, translate: number[], limited: boolean, wrapperRect: IDomRect): void;
1000
+ createPdfLoadingPage(): void;
1001
+ centerPdfDoc(): void;
1002
+ protected getPdfVisiblePage(wrapperRect: IDomRect): {
1003
+ pagesNum: number;
1004
+ start: number;
1005
+ end: number;
1006
+ firstVisibleIndex: number;
1007
+ lastVisibleIndex: number;
1008
+ };
1009
+ /**
1010
+ * 检测当前滚动位置,显示周围几张PDF图片
1011
+ */
1012
+ lazyLoadPdfPage: any;
1013
+ /**
1014
+ * 检测当前展示位置,如果当前位置的pfd未渲染,则开始渲染当前页面
1015
+ */
1016
+ lazyRenderPdfPage: any;
1017
+ }
1018
+
1019
+ declare class PdfPlugin {
1020
+ static getDevicePixelRatio(): number;
1021
+ static loadPdf(url: string, doc: PdfDoc): Promise<void>;
1022
+ private static preparePdfPage;
1023
+ static updatePdfWidth(doc: PdfDoc, newWidth: number): void;
1024
+ }
1025
+
1026
+ var css_248z = ".dingrtc-wb-wrapper{height:100%;overflow:hidden;position:relative;width:100%}.dingrtc-wb-wrapper__laser-on audio,.dingrtc-wb-wrapper__laser-on video{pointer-events:none!important}.dingrtc-wb-wrapper__drag-on{cursor:grab!important}.dingrtc-wb-wrapper__draging{cursor:grabbing!important}.dingrtc-wb-wrapper .dingrtc-pdf-viewer{pointer-events:none;position:absolute;transform-origin:0 0;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:0}.dingrtc-wb-wrapper .dingrtc-pdf-viewer__page{box-shadow:1px 1px 10px 5px rgba(0,0,0,.05);position:absolute}.dingrtc-wb-wrapper .dingrtc-pdf-viewer__page:not(:last-of-type):after{background-color:#777;bottom:0;content:\"\";height:1px;left:0;position:absolute;right:0;z-index:1}.dingrtc-wb-wrapper .dingrtc-pdf-viewer__page:before{bottom:10px;content:attr(data-i);font-size:26px;font-weight:700;position:absolute;right:10px;z-index:1}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons{height:100%}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton{background-color:#fff;border-radius:6px;display:flex;flex-direction:column;height:50%;justify-content:center;margin:0 auto;min-height:532.8px;overflow:hidden;padding:50px 36px;position:relative;width:720px}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton>div{margin-bottom:36px}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton .p-pdf-skeleton__avator{border-radius:144px;height:144px;position:relative;width:144px}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton .p-pdf-skeleton__avator:after,.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton .p-pdf-skeleton__avator:before{border-radius:10px;content:\" \";height:50.4px;left:calc(100% + 40px);position:absolute;top:0;width:288px}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton .p-pdf-skeleton__avator:after{top:93.6px;width:432px}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton .p-pdf-skeleton__content{border-radius:10px;height:43.2px;margin-bottom:200px;position:relative;width:504px}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton .p-pdf-skeleton__content:after,.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton .p-pdf-skeleton__content:before{border-radius:10px;content:\" \";height:43.2px;left:0;position:absolute;top:93.6px;width:612px}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton .p-pdf-skeleton__content:after{top:187.2px;width:612px}.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton div,.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton div:after,.dingrtc-wb-wrapper .dingrtc-pdf-viewer .p-pdf-skeletons .p-pdf-skeleton div:before{animation:loading 2s ease-in-out infinite;background-color:#ededed;background:linear-gradient(100deg,hsla(0,0%,100%,0) 40%,hsla(0,0%,100%,.5) 50%,hsla(0,0%,100%,0) 60%) #ededed;background-position-x:180%;background-size:200% 100%}@keyframes loading{to{background-position-x:-20%}}.dingrtc-wb-wrapper .dingrtc-wb-render-fps{color:#333;font-size:12px;position:absolute;right:30px;top:60px;z-index:1}.dingrtc-wb-wrapper .dingrtc-wb-render-fps img{display:block}.dingrtc-wb-wrapper .dingrtc-wb__bg-img{pointer-events:none;z-index:0}.dingrtc-wb-wrapper .dingrtc-wb__bg-img,.dingrtc-wb-wrapper .dingrtc-wb__media{position:absolute;transform-origin:0 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.dingrtc-wb-wrapper .dingrtc-wb__media{background-color:transparent;overflow:hidden;padding:1px;z-index:1}.dingrtc-wb-wrapper .dingrtc-wb__media__header{align-items:center;background-color:#f5f5f5;border-top-left-radius:3px;border-top-right-radius:3px;box-shadow:0 0 4px 0 rgba(0,0,0,.2);cursor:pointer;display:flex;font-weight:500;height:30px;justify-content:space-between;left:0;padding-left:10px;position:absolute;top:0;transition:all .3s ease-in-out;width:100%;z-index:1}.dingrtc-wb-wrapper .dingrtc-wb__media__body{background-color:#000;height:100%;width:100%}.dingrtc-wb-wrapper .dingrtc-wb__media__body:hover~.dingrtc-wb__media__header{visibility:visible}.dingrtc-wb-wrapper .dingrtc-wb__media__body audio,.dingrtc-wb-wrapper .dingrtc-wb__media__body video{height:100%;outline:none;pointer-events:auto;width:100%}.dingrtc-wb-wrapper .dingrtc-wb__media__body audio{background:#eff1f2}.dingrtc-wb-wrapper .dingrtc-wb__media__body audio::-webkit-media-controls-panel{background:#eff1f2;border:none}.dingrtc-wb-wrapper canvas{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:1}.dingrtc-wb-wrapper .dingrtc-wb__cache-cvs{pointer-events:none!important}.dingrtc-wb-wrapper .wb-shape-textarea{background-color:transparent;border:none;outline:none;overflow-wrap:break-word;padding:0;position:absolute;resize:none;transform-origin:0 0;white-space:pre-wrap;word-break:break-all;z-index:1}.dingrtc-wb-wrapper .wb-shape-textarea::-webkit-scrollbar{display:none}.dingrtc-wb-wrapper .dingrtc-iframe-wrapper{height:960px;left:0;position:absolute;top:0;transform-origin:0 0;width:1280px;z-index:0}.dingrtc-wb-wrapper .dingrtc-iframe-wrapper iframe{border:none;height:100%;left:0;pointer-events:auto;position:absolute;top:0;width:100%}.dingrtc-wb-wrapper .dingrtc-iframe-wrapper__blocked{position:absolute}.dingrtc-wb-wrapper .dingrtc-iframe-wrapper__blocked:after{content:\"\";height:100%;left:0;top:0;width:100%}.dingrtc-wb-tools-wrapper{pointer-events:auto}";
1027
+ styleInject(css_248z);
1028
+
1029
+ declare class RenderStats {
1030
+ private renderInfo;
1031
+ record(startTime: string, timeCost?: number): void;
1032
+ }
1033
+
1034
+ declare enum RENDER_STATUS {
1035
+ Aavilable = 0,
1036
+ Busy = 1
1037
+ }
1038
+ declare class Renderer {
1039
+ private wb;
1040
+ canvasElement: HTMLCanvasElement;
1041
+ cachedCanvas: HTMLCanvasElement;
1042
+ eraserCacheCvs: HTMLCanvasElement;
1043
+ constructor(wb: Whiteboard);
1044
+ renderStatus: RENDER_STATUS;
1045
+ renderStats: RenderStats;
1046
+ frameRenderRate: number;
1047
+ renderContext2d: CanvasRenderingContext2D;
1048
+ eraserCvsCtx: CanvasRenderingContext2D;
1049
+ cachedCvsCtx: CanvasRenderingContext2D;
1050
+ private eraserCvsOutdated;
1051
+ private _sizeLimitStyle;
1052
+ private cachedCtxSnapshot;
1053
+ private get translate();
1054
+ private get scale();
1055
+ get wbWrapperDom(): HTMLDivElement;
1056
+ get selectedShape(): BaseShape;
1057
+ get textArea(): HTMLTextAreaElement;
1058
+ updateCanvasSize: (autoAdjust?: boolean, force?: boolean, recheck?: boolean) => void;
1059
+ checkCanvasSize: () => void;
1060
+ hideCanvas(): void;
1061
+ showCanvas(): void;
1062
+ /**
1063
+ * 静态缓存shape之外的可视图形
1064
+ */
1065
+ private get activeShapes();
1066
+ get visibleShapes(): any;
1067
+ get anyEraserInActiveShapes(): any;
1068
+ get insertType(): ShapeType;
1069
+ get lineWidth(): number;
1070
+ private getDevicePixelRatio;
1071
+ render: () => void;
1072
+ /**
1073
+ * 立即绘制图形
1074
+ */
1075
+ doRender: () => void;
1076
+ /**
1077
+ * 更新背景图和课件
1078
+ */
1079
+ updateBg: () => void;
1080
+ /**
1081
+ * 绘制当前页面内的活跃图形(所有图形除了静态缓存图层之外的)
1082
+ */
1083
+ private renderActiveShapes;
1084
+ /**
1085
+ * cacheCtx 绘制的内容是否过时
1086
+ */
1087
+ private get isCacheCtxOutdated();
1088
+ /**
1089
+ * 绘制当前页面内所有图形
1090
+ *
1091
+ * 如果缓存可用,则绘制缓存图层,否则仅绘制动态图层和顶层图形
1092
+ */
1093
+ private renderShapes;
1094
+ /**
1095
+ * 在cache层完整绘制所有图形作为缓存,
1096
+ * 并清除和重绘顶层白板
1097
+ */
1098
+ doRebuildCacheRenderer: () => void;
1099
+ private rebuildCacheRenderer;
1100
+ /**
1101
+ * 渲染所有可见的形状
1102
+ */
1103
+ renderAllVisibleShapes(ctx: CanvasRenderingContext2D, translate: any, scale: number, forceRenderText: boolean): void;
1104
+ /**
1105
+ * 渲染顶层图形,包括镭射笔,鼠标,选中图形的外边框,选择框
1106
+ */
1107
+ renderTopShapes(ctx: CanvasRenderingContext2D, translate?: any, scale?: number): void;
1108
+ }
1109
+
1110
+ interface IDSMsg {
1111
+ type: 'snapshot' | 'clear' | 'resource' | 'object';
1112
+ }
1113
+ interface IBaseMessage<T extends string> extends IDSMsg {
1114
+ type: 'resource' | 'object';
1115
+ editor: string;
1116
+ operationTime: number;
1117
+ updateTime?: number;
1118
+ version: number;
1119
+ messageSettingsDTO: {
1120
+ autoDelete: boolean;
1121
+ };
1122
+ moziMessageIdDTO: {
1123
+ channelId: string;
1124
+ messageId: T;
1125
+ userDTO: {
1126
+ appId: string;
1127
+ userId: string;
1128
+ };
1129
+ };
1130
+ }
1131
+ /**
1132
+ * 文档资源,所有文档操作都以此同步, docId 组成 doc-{uid}-{randomid}
1133
+ */
1134
+ interface IDocResourceMsg extends IBaseMessage<string> {
1135
+ type: 'resource';
1136
+ message: {
1137
+ resourceType: 'doc';
1138
+ creator: string;
1139
+ curpage: string;
1140
+ fileKey: string;
1141
+ maxSeq: string;
1142
+ name: string;
1143
+ pagelist: string;
1144
+ docType?: DocType;
1145
+ url?: string;
1146
+ download?: string;
1147
+ /**
1148
+ * doc0-1 doc0-2
1149
+ */
1150
+ /**
1151
+ * 可选 externalDoc和标注相关字段,用于指定externalDoc和标注区域的大小
1152
+ */
1153
+ width?: string;
1154
+ /**
1155
+ * 可选 externalDoc和标注相关字段,用于指定externalDoc和标注区域的大小
1156
+ */
1157
+ height?: string;
1158
+ /**
1159
+ * 可选 pdf或滚动文档相关字段
1160
+ */
1161
+ pageNum?: string;
1162
+ /**
1163
+ * 可选 pdf或滚动文档相关字段
1164
+ */
1165
+ y?: string;
1166
+ };
1167
+ }
1168
+ /**
1169
+ * 定义all, others, self, specific四种type和subtype,针对只clear某一页的场景需要使用specific type和对应的subtype
1170
+ *
1171
+ * self/others: 端上收到clear消息后,根据clearType和clearSubType,清除对应的对象,发给别人的一般都通过 clearedMessageIds 清除
1172
+ *
1173
+ * 本地会使用 self/others 来减少遍历直接删除
1174
+ */
1175
+ interface IClearResourceMsg extends IDSMsg {
1176
+ type: 'clear';
1177
+ channelId: string;
1178
+ clearSubType: 'all' | 'specific' | 'self' | 'others';
1179
+ clearType: 'all' | 'specific' | 'self' | 'others';
1180
+ /**
1181
+ * {channelId, messageId, userDTO: {appId, userId}}
1182
+ */
1183
+ clearedMessageIds: string[];
1184
+ messageType: 'resource';
1185
+ resourceType: 'doc' | 'laserPointer' | 'cursor' | 'stamp' | 'vision';
1186
+ operator: {
1187
+ appId: string;
1188
+ userId: string;
1189
+ };
1190
+ }
1191
+ interface IClearObjMsg extends IDSMsg {
1192
+ type: 'clear';
1193
+ channelId: string;
1194
+ clearSubType: 'all' | 'specific' | 'self' | 'others';
1195
+ clearType: 'all' | 'specific' | 'self' | 'others';
1196
+ /**
1197
+ * {channelId, messageId, userDTO: {appId, userId}}
1198
+ */
1199
+ clearedMessageIds: string[];
1200
+ messageType: 'object';
1201
+ operator: {
1202
+ appId: string;
1203
+ userId: string;
1204
+ };
1205
+ }
1206
+
1207
+ type ConnectionInfo = {
1208
+ sessionId: string;
1209
+ userId: string;
1210
+ userName: string;
1211
+ pid: string;
1212
+ appId: string;
1213
+ token: string;
1214
+ channelId: string;
1215
+ gslb: string;
1216
+ securityToken: string;
1217
+ };
1218
+ declare abstract class ISession extends EventEmitter<{
1219
+ 'data-received': (data: string, from: string, isBroadcast: boolean) => void;
1220
+ 'cmd-received': (from_pid: string, cmdType: CmdDataType, cmd: string, data: string, broadcast: boolean, reqId?: number | undefined) => void;
1221
+ 'status-sync': () => void;
1222
+ 'user-join': (userId: string) => void;
1223
+ 'user-leave': (userId: string) => void;
1224
+ }> {
1225
+ private clearCursorTimer?;
1226
+ abstract get isConnected(): boolean;
1227
+ abstract get connectionInfo(): ConnectionInfo;
1228
+ abstract sendData(data: string, sendBack: boolean, broadcast: boolean, to?: string): void;
1229
+ generateBaseMessage(messageId: string, autoDelete: boolean, creatorUserId: string): IBaseMessage<string>;
1230
+ /**
1231
+ * 发送文档资源消息
1232
+ * @param doc 文档资源
1233
+ * @param curPage 可选,如果改变当前页面,传入指定页面
1234
+ * @param pages 可选,如果有页面增删,传入增删后的页面列表
1235
+ * @returns
1236
+ */
1237
+ sendDocResourceMessage(doc: BaseDoc, curPage?: string, pages?: string[]): void;
1238
+ /**
1239
+ * 发送文档资源消息
1240
+ */
1241
+ sendCreateDocResourceMessage(docId: string, pages: number, name: string, width?: number, height?: number): void;
1242
+ /**
1243
+ * 发送 pdf 文档资源消息
1244
+ */
1245
+ sendCreatePdfDocResourceMessage(docId: string, name: string, url: string, fileKey?: string): void;
1246
+ /**
1247
+ * 发送文档激活(切换到某个文档)消息
1248
+ */
1249
+ sendActiveDocResourceMessage(docId: string): void;
1250
+ /**
1251
+ * 发送图形绘制消息
1252
+ */
1253
+ sendShapeDrawMessage(shape: BaseShape): void;
1254
+ /**
1255
+ * 发送图形形变消息
1256
+ */
1257
+ sendShapeRgnMessage(shape: BaseShape): void;
1258
+ /**
1259
+ * 发送激光笔资源
1260
+ */
1261
+ sendLaserPointerMsg(x: number, y: number): void;
1262
+ /**
1263
+ * 发送图章资源缓存消息
1264
+ */
1265
+ sendStampMsg(id: string, url: string, resizable: boolean): void;
1266
+ /**
1267
+ * 发送鼠标位置同步消息
1268
+ */
1269
+ sendCursorMsg(x: number, y: number, color: string, type: MouseType): void;
1270
+ /**
1271
+ * 发送视角同步消息
1272
+ */
1273
+ sendVisionResourceMsg(width: number, height: number, minx: number, miny: number): void;
1274
+ /**
1275
+ * 发送清除资源消息
1276
+ */
1277
+ sendClearResourceMsg(resourceType: 'doc' | 'laserPointer' | 'cursor' | 'vision', ids: string[]): void;
1278
+ /**
1279
+ * 发送清除绘制内容消息
1280
+ */
1281
+ sendClearDrawMsg(ids: {
1282
+ seq: string;
1283
+ userId: string;
1284
+ }[]): void;
1285
+ }
1286
+
1287
+ /**
1288
+ * 自定义文档
1289
+ */
1290
+ declare class ExternalDoc extends BaseDoc {
1291
+ static DOC_TYPE: DocType;
1292
+ externalDocWidth: number;
1293
+ externalDocHeight: number;
1294
+ get width(): number;
1295
+ get type(): DocType;
1296
+ get sharePageSize(): boolean;
1297
+ get canModifyPage(): boolean;
1298
+ constructor(docInfo: {
1299
+ docId: string;
1300
+ name: string;
1301
+ creator: string;
1302
+ curPageId: string;
1303
+ pageVersion: number;
1304
+ fileKey?: string;
1305
+ browseMode: DocBrowserMode;
1306
+ width: number;
1307
+ height: number;
1308
+ });
1309
+ }
1310
+
1311
+ declare class DocManager extends EventEmitter<{
1312
+ requestRender: () => any;
1313
+ /**
1314
+ * 文档切换、页码切换,或者缩放、平移事件都会导致viewprot 更新
1315
+ */
1316
+ 'viewport-updated': () => any;
1317
+ 'page-index-changed': (activeDocId: string, pageIndex: number, totalPages: number) => void;
1318
+ 'doc-created': (docId: string) => void;
1319
+ 'doc-deleted': (docId: string) => void;
1320
+ 'doc-switched': () => void;
1321
+ 'doc-load-failed': (docId: string, docName: string) => void;
1322
+ }> {
1323
+ private browseMode;
1324
+ private docs;
1325
+ private _activeDocId;
1326
+ /**
1327
+ * 切换当前激活的文档
1328
+ * @param docId
1329
+ */
1330
+ switchActiveDoc(docId: string): void;
1331
+ get activeDocId(): string;
1332
+ get activeDoc(): any;
1333
+ /**
1334
+ * 设置文档浏览模式,flip为翻页模式, scroll 为滚动模式
1335
+ *
1336
+ * scroll 模式的一些限制: 不允许从中间删除删除页码,只可以从最后一页新建页码
1337
+ * @param mode
1338
+ */
1339
+ setBrowserMode(mode: DocBrowserMode, disableScale?: boolean, defaultDocPages?: number, defaultDocPageSize?: {
1340
+ width: number;
1341
+ height: number;
1342
+ }): void;
1343
+ private onDocRequestRender;
1344
+ private onViewportUpdate;
1345
+ private onPageIndexChanged;
1346
+ addDoc(doc: BaseDoc): void;
1347
+ deleteDoc(doc: BaseDoc): void;
1348
+ deleteDocByDocId(docId: string): void;
1349
+ getDocByDocId(docId: string): any;
1350
+ getDocByPageId(pageId: string): any;
1351
+ getDocs(): BaseDoc[];
1352
+ constructor();
1353
+ private setup;
1354
+ handleDocCommnad(cmd: IDocResourceMsg, isSendByMe: boolean, wrapperDomRect: IDomRect, sizeConfig?: {
1355
+ width: number;
1356
+ height: number;
1357
+ limited: boolean;
1358
+ }): void;
1359
+ private handlePdfResource;
1360
+ /**
1361
+ * pdf doc文档居中显示
1362
+ */
1363
+ private centerPdfDoc;
1364
+ private updateDocFromCommand;
1365
+ private createDocFromCommand;
1366
+ reset(): void;
1367
+ }
1368
+
1369
+ declare abstract class Whiteboard extends EventEmitter<IWhiteboardEvents> {
1370
+ sessionId: string;
1371
+ static PdfPlugin?: PdfPlugin;
1372
+ /**
1373
+ * 使用pdf插件
1374
+ * @params plugin
1375
+ */
1376
+ static usePdf(plugin: PdfPlugin): void;
1377
+ static MAX_SCALE: number;
1378
+ static MIN_SCALE: number;
1379
+ static MAX_MEDIA_SIZE: number;
1380
+ static DEFAULE_DOC_URL_DURATION: number;
1381
+ protected static RENDER_INTEVAL: number;
1382
+ protected static CMD_SEND_WAIT: number;
1383
+ static sdkVersion: string;
1384
+ static docTranscodeStaicMaxSize: number;
1385
+ isOpen: boolean;
1386
+ private _everOpened;
1387
+ protected bSharingVision: boolean;
1388
+ protected _lockVisonUserId: string;
1389
+ _prevPenetrable: boolean;
1390
+ lastMediaStates: {
1391
+ id: string;
1392
+ is_play: boolean;
1393
+ muted: boolean;
1394
+ pos: number;
1395
+ time: number;
1396
+ }[];
1397
+ protected connection?: ISession;
1398
+ protected cwSnapshotCbMap: Map<string, (data: any) => any>;
1399
+ private stampId?;
1400
+ /**
1401
+ * 手写板缩放倍率,默认情况下手写板1:1缩放到屏幕
1402
+ */
1403
+ tabletScale: number;
1404
+ /**
1405
+ * 手写板和画布的匹配模式,默认保证宽度匹配
1406
+ */
1407
+ tabletMatchMode: 'fitWidth' | 'fitHeight';
1408
+ /**
1409
+ * 手写板相对画布的位移,不受缩放影响
1410
+ */
1411
+ tabletTranslate: [number, number];
1412
+ isWhiteboardOpen: boolean;
1413
+ _penetrable: boolean;
1414
+ protected _cursorSyncEnabled: boolean;
1415
+ sizeLimitVisible: boolean;
1416
+ /**
1417
+ * 移动画布时,手写板书写出现在画板的位置是否受影响。
1418
+ * static: 跟随画布移动;
1419
+ * sticky: 不随画布移动
1420
+ */
1421
+ tabletWriteMode: 'static' | 'sticky';
1422
+ protected _innerEventhub: EventEmitter<{
1423
+ sessionReady: () => void;
1424
+ syncCompleted: () => void;
1425
+ pageSwitched: () => void;
1426
+ 'doc-switched': (docId: string) => void;
1427
+ roleChanged: (data: {
1428
+ eventId: string;
1429
+ result: number;
1430
+ }) => void;
1431
+ }>;
1432
+ private pinchShapeCenter;
1433
+ private lastPanMoveDelta;
1434
+ private pinchBoardOriginalScale;
1435
+ private wheelDsiabled;
1436
+ private frameRenderRateInterval;
1437
+ protected wrapperDomRect?: DOMRect;
1438
+ bgImg: HTMLImageElement;
1439
+ textArea: HTMLTextAreaElement;
1440
+ private renderFPS;
1441
+ wbWrapperDom: HTMLDivElement;
1442
+ pdfWrapper: HTMLDivElement;
1443
+ private insertingShape?;
1444
+ private hammer;
1445
+ private metricsBuffer;
1446
+ private sendMetricsTimeout?;
1447
+ private clearLaserPointerId?;
1448
+ private panMoveType;
1449
+ protected natureObjSeq: number;
1450
+ selectIndicator: SelectIndicator;
1451
+ eraserIndicator: EraserIndicator;
1452
+ private _shiftPressing;
1453
+ /**
1454
+ * 画布默认大小
1455
+ */
1456
+ sizeConfig?: {
1457
+ width: number;
1458
+ height: number;
1459
+ limited: boolean;
1460
+ };
1461
+ /**
1462
+ * 禁止手势缩放和移动画布
1463
+ */
1464
+ private _scaleAndMoveDisabled;
1465
+ /**
1466
+ * 图形是否可见
1467
+ */
1468
+ isShapesVisible: boolean;
1469
+ laserPointers: LaserPointer[];
1470
+ cursors: Cursor[];
1471
+ protected _visionLockInfo?: {
1472
+ width: number;
1473
+ height: number;
1474
+ minx: number;
1475
+ miny: number;
1476
+ userId: string;
1477
+ };
1478
+ private pinchEndTime;
1479
+ scrollToScale: boolean;
1480
+ _bFollowVision: boolean;
1481
+ docManager: DocManager;
1482
+ private _cursorSyncType;
1483
+ private originalTranslate;
1484
+ private originalDragStartPonit;
1485
+ protected renderer: Renderer;
1486
+ private failoverShapeCache;
1487
+ private failoverDocCache;
1488
+ get isSynchronizer(): boolean;
1489
+ /**
1490
+ * 获取画布容器的位置信息
1491
+ */
1492
+ protected getWrapperDomRect(): IDomRect;
1493
+ get history(): any;
1494
+ get userId(): string;
1495
+ get appId(): string;
1496
+ get channelId(): string;
1497
+ get token(): string;
1498
+ get userName(): string;
1499
+ get cid(): string;
1500
+ get activeDoc(): any;
1501
+ get activeDocId(): string;
1502
+ get isSizeLimited(): boolean;
1503
+ protected get pages(): any;
1504
+ abstract get isConnected(): boolean;
1505
+ /**
1506
+ * 画笔颜色,对新绘制的 shape 生效
1507
+ */
1508
+ strokeStyle: string;
1509
+ /**
1510
+ * 填充颜色,对新绘制的 shape 生效
1511
+ */
1512
+ fillStyle: string;
1513
+ /**
1514
+ * 新绘制的 shape 的填充类型,填充颜色或者不填充
1515
+ */
1516
+ fillType: ShapeFillType;
1517
+ /**
1518
+ * 画笔宽度,对新绘制 shape 生效
1519
+ */
1520
+ private _lineWidth;
1521
+ get lineWidth(): number;
1522
+ set lineWidth(value: number);
1523
+ /**
1524
+ * 是否绘制虚线
1525
+ */
1526
+ dashed: boolean;
1527
+ /**
1528
+ * 文字是否斜体,对新插入的文本生效
1529
+ */
1530
+ italic: boolean;
1531
+ /**
1532
+ * 文字是否加粗,对新插入的文本生效
1533
+ */
1534
+ bold: boolean;
1535
+ /**
1536
+ * 字体大小,对插入的文本生效
1537
+ */
1538
+ private _fontSize;
1539
+ get fontSize(): number;
1540
+ set fontSize(value: number);
1541
+ /**
1542
+ * 画布缩放适应背景图的模式
1543
+ */
1544
+ bgScaleMode: ImageScalingMode;
1545
+ protected _role: WBRoleType;
1546
+ /**
1547
+ * 获取当前用户的角色
1548
+ */
1549
+ get role(): WBRoleType;
1550
+ /**
1551
+ * 当前用户是否是 admin 用户
1552
+ */
1553
+ get isAdmin(): boolean;
1554
+ get currentPage(): any;
1555
+ /**
1556
+ * 获取当前白板视图的缩放比例
1557
+ */
1558
+ get scale(): number;
1559
+ set scale(nextScale: number);
1560
+ protected _hookShapeRenderRequest(shape: BaseShape): void;
1561
+ getCursorSyncType(): "write" | "all";
1562
+ setCursorSyncType(type: 'write' | 'all'): void;
1563
+ /**
1564
+ * 设置白板角色类型
1565
+ * @param roleType 角色类型
1566
+ * @param force 是否是failover时设置角色
1567
+ */
1568
+ setRoleType(roleType: WBRoleType): void;
1569
+ private insertType;
1570
+ /**
1571
+ * 获取当前的工具类型
1572
+ */
1573
+ getToolType(): ShapeType;
1574
+ /**
1575
+ * 设置工具类型
1576
+ * @param insertType 工具类型
1577
+ */
1578
+ setToolType(insertType: ShapeType): void;
1579
+ private checkDocAndSetPenetrable;
1580
+ protected getDevicePixelRatio(): number;
1581
+ /**
1582
+ * 列举出所有的文档信息
1583
+ */
1584
+ enumerateDocs(): {
1585
+ docId: string;
1586
+ name: string;
1587
+ creator: string;
1588
+ currentPage: number;
1589
+ fileKey: string;
1590
+ }[];
1591
+ private multiSelecetedShapes;
1592
+ private _selectedShape?;
1593
+ /**
1594
+ * 当前被选中的 shape
1595
+ */
1596
+ get selectedShape(): BaseShape | undefined;
1597
+ /**
1598
+ * 设置或清除当前选择的 shape
1599
+ */
1600
+ set selectedShape(shape: BaseShape | undefined);
1601
+ /**
1602
+ * 设置当前选中 shape 的 style
1603
+ * @param style
1604
+ */
1605
+ setSelectedShapeStyle(style: {
1606
+ lineWidth?: number;
1607
+ strokeStyle?: string;
1608
+ fillStyle?: string;
1609
+ fillType?: string;
1610
+ }): void;
1611
+ /**
1612
+ * 设置当前选中 shape 的 fontStyle
1613
+ * @param fontStyle
1614
+ */
1615
+ setSelectedShapeFontStyle(style: {
1616
+ italic?: boolean;
1617
+ bold?: boolean;
1618
+ fontSize?: number;
1619
+ }): void;
1620
+ get pageIndex(): any;
1621
+ /**
1622
+ * 切换白板文件
1623
+ * @param docId
1624
+ */
1625
+ switchToDoc(docId: string): void;
1626
+ /**
1627
+ * 获取当前页码
1628
+ */
1629
+ getCurrentPageNumber(): any;
1630
+ /**
1631
+ * 跳转到指定页码 (从 0 开始)
1632
+ * @param pageIndex 页码
1633
+ * @param docId 文档 id,默认操作当前文档
1634
+ * @param autoSwitchTo 是否自动切换到该文档
1635
+ */
1636
+ gotoPage(pageIndex: number, docId?: string, autoSwitchToDoc?: boolean): void;
1637
+ private gotoPdfPage;
1638
+ /**
1639
+ * 切换到下一页
1640
+ */
1641
+ nextPage(): void;
1642
+ /**
1643
+ * 切换到上一页
1644
+ */
1645
+ prevPage(): void;
1646
+ /**
1647
+ * 获取当前白板视图的背景颜色
1648
+ */
1649
+ get backgroundColor(): string;
1650
+ /**
1651
+ * 设置当前白板视图的背景颜色(仅支持 rgba颜色,如: rgba(0,0,0,0.7))
1652
+ */
1653
+ set backgroundColor(color: string);
1654
+ /**
1655
+ * 获取总白板页码数
1656
+ */
1657
+ getTotalNumberOfPages(): any;
1658
+ get visibleShapes(): any;
1659
+ get translate(): any;
1660
+ /**
1661
+ * 获取画板当前在水平和竖直方向的位移
1662
+ */
1663
+ getTranslate(): {
1664
+ x: any;
1665
+ y: any;
1666
+ };
1667
+ /**
1668
+ * 设置画板偏移
1669
+ * @param x 水平方向偏移
1670
+ * @param y 竖直方向偏移 (如果是pdf view,只能垂直方向移动)
1671
+ * @param smooth 是否平滑移动
1672
+ * @param duration 平滑移动时间,默认 400 ms
1673
+ */
1674
+ setTranslate(x: number, y: number, smooth?: boolean, duration?: number): void;
1675
+ /**
1676
+ * 获取当前视角下最大的可见的横坐标取值
1677
+ */
1678
+ private getVisionMaxX;
1679
+ private getVisionMaxY;
1680
+ private onHistoryChanged;
1681
+ private onActiveDocSwitched;
1682
+ private onActivePageChanged;
1683
+ private setUpHistoryListener;
1684
+ /**
1685
+ * 撤消上一次操作
1686
+ */
1687
+ undo(): void;
1688
+ /**
1689
+ * 重做白板的上一次被撤销操作
1690
+ */
1691
+ redo(): void;
1692
+ /**
1693
+ *
1694
+ * @param shapeId 要恢复状态的 shapeID
1695
+ * @param actionType shape 最近一次操作的动作
1696
+ * @param lastState 要恢复到的 state, 如果 actionType 是 HistoryActionType.newShape 则不用传
1697
+ */
1698
+ private restoreShapeFormSavedState;
1699
+ /**
1700
+ * 通过 id 获取 shape
1701
+ */
1702
+ getShapeById(id: string): any;
1703
+ /**
1704
+ * 清理白板状态,恢复到初始状态
1705
+ */
1706
+ reset(): void;
1707
+ /**
1708
+ * 设置白板背景图缩放模式
1709
+ * @param mode 背景图缩放模式
1710
+ */
1711
+ setBackgroundImageScalingMode(scaleMode: ImageScalingMode): void;
1712
+ private getShapeStyle;
1713
+ /**
1714
+ * 限制图片最大宽度,
1715
+ * 当有sizeConfig限制时,以sizeConfig位置,否则最多 2048
1716
+ * @param img
1717
+ * @param docId 跟进 docId 判断是否需要考虑 sizeConfig 限定图片大小
1718
+ */
1719
+ _getLimitedImgSize(width: number, height: number): {
1720
+ imgWidth: number;
1721
+ imgHeight: number;
1722
+ };
1723
+ /**
1724
+ * 缩放 page 里的每一页到fit传入的长宽
1725
+ * @param page
1726
+ * @param bgWidth
1727
+ * @param bgHeight
1728
+ * @param scaleMode
1729
+ */
1730
+ _scaleBoardFitBackground(doc: BaseDoc): void;
1731
+ /**
1732
+ * 根据 sizeConfig 缩放相关页面
1733
+ */
1734
+ protected fitWithSizeConfig(): void;
1735
+ /**
1736
+ * 设置背景图片
1737
+ * @param url 背景图片 url
1738
+ * @param scaleMode 画布缩放贴合背景图片的模式
1739
+ */
1740
+ setBackgroundImage(url: string): any;
1741
+ protected updateBgImgPosition(backgroundImage: Image, imgWidth: number, imgHeight: number): void;
1742
+ /**
1743
+ * 添加图片到白板中
1744
+ * @param url 背景图片 url
1745
+ */
1746
+ addImageShape(url: string): Promise<void>;
1747
+ setStamp(stampId: string): void;
1748
+ /**
1749
+ * 返回当前白板页的缩略图
1750
+ */
1751
+ get thumbnails(): any;
1752
+ protected setMediaShapeCallback(shape: MediaShape): void;
1753
+ /**
1754
+ * 添加音频文件到白板中
1755
+ * @param url 音频文件 url
1756
+ */
1757
+ addAudioShape(url: string): Promise<unknown>;
1758
+ /**
1759
+ * 添加视频到白板中
1760
+ * @param url 视频 url
1761
+ */
1762
+ addVideoShape(url: string): Promise<unknown>;
1763
+ private setAsSelectedShape;
1764
+ /**
1765
+ * 添加一个新页面到指定位置
1766
+ * @param pageIndex 指定位置
1767
+ * @param autoSwitch 是否自动切换到新页面
1768
+ * @param docId 文档 id,默认操作当前文档
1769
+ * @param autoSwitchTo 是否自动切换到该文档
1770
+ */
1771
+ insertPage(pageIndex: number, autoSwitch?: boolean, docId?: string, autoSwitchToDoc?: boolean): any;
1772
+ /**
1773
+ * 添加一个新页面到最后
1774
+ * @param autoSwitch 是否自动切换到新页面
1775
+ */
1776
+ addPage: (autoSwitch?: boolean) => any;
1777
+ /**
1778
+ * 删除指定页面
1779
+ * @param index 页码
1780
+ * @param docId 文档 id,默认操作当前文档
1781
+ */
1782
+ removePage: (index?: number, docId?: string) => void;
1783
+ /**
1784
+ * 滚动模式下删除某页时删除此页的所有图形
1785
+ */
1786
+ private removeScrollDocShapesByScrollY;
1787
+ /**
1788
+ * 设置是否显示限制大小区域的边界
1789
+ * @param visible
1790
+ * @param style
1791
+ */
1792
+ setSizeLimitVisible(visible: boolean): void;
1793
+ /**
1794
+ * 在页面scroll和window resize 时自动更新画布大小
1795
+ */
1796
+ protected autoUpdateCanvasSize: any;
1797
+ /**
1798
+ * 手动调用更新画布 size(一般用于在外部画布容器变化后,主动调用更新画板大小信息)
1799
+ * @param autoAdjust 是否自动调整画布内容
1800
+ * @param keepScale 自动调整画布内容时是否保持缩放比例
1801
+ */
1802
+ updateCanvasSize: (autoAdjust?: boolean, keepScale?: boolean, recheck?: boolean) => void;
1803
+ /**
1804
+ * 更新自定义透明文档位置
1805
+ */
1806
+ protected updateCustomDocPosition(doc: ExternalDoc): void;
1807
+ /**
1808
+ * pdf doc文档居中显示
1809
+ */
1810
+ protected centerPdfDoc(doc?: BaseDoc): void;
1811
+ /**
1812
+ * 检测当前滚动位置,显示周围几张PDF图片
1813
+ */
1814
+ protected lazyLoadPdfPage: any;
1815
+ /**
1816
+ * 检测当前展示位置,如果当前位置的pfd未渲染,则开始渲染当前页面
1817
+ */
1818
+ protected lazyRenderPdfPage: any;
1819
+ protected getPdfVisiblePage(): {
1820
+ pagesNum: number;
1821
+ start: number;
1822
+ end: number;
1823
+ firstVisibleIndex: number;
1824
+ lastVisibleIndex: number;
1825
+ };
1826
+ protected followVision(vision: {
1827
+ width: number;
1828
+ height: number;
1829
+ minx: number;
1830
+ miny: number;
1831
+ }): void;
1832
+ /**
1833
+ * 计算在当前画布大小下,居中显示某个视角时,画布的scale和translate值
1834
+ */
1835
+ protected calculateScaleAndTranslate(visionInfo: {
1836
+ width: number;
1837
+ height: number;
1838
+ minx: number;
1839
+ miny: number;
1840
+ }): {
1841
+ scale: number;
1842
+ translate: number[];
1843
+ };
1844
+ showFps(): void;
1845
+ stopShowFps(): void;
1846
+ /**
1847
+ * 设置白板是否穿透点击,点击穿透开启时可以透过白板直接和课件交互,例如播放课件中的媒体文件,点击课件翻页等
1848
+ */
1849
+ setPenetrable(nextPenetrable: boolean): void;
1850
+ /**
1851
+ * 获取当前视窗的坐标范围
1852
+ */
1853
+ getViewport(page?: any, canvasDomRect?: IDomRect): {
1854
+ minx: number;
1855
+ miny: number;
1856
+ maxx: number;
1857
+ maxy: number;
1858
+ };
1859
+ /**
1860
+ * 隐藏白板上绘制的轨迹,所有的轨迹都会隐藏,可以控制是否隐藏背景图
1861
+ * @param hideBackgroundImg 是否隐藏背景图
1862
+ */
1863
+ setShapesVisible(enabled: boolean, hideBackgroundImg?: boolean): void;
1864
+ protected render: () => void;
1865
+ /**
1866
+ * 触摸或点击点位转换成缩放和平移后的坐标
1867
+ * @param p
1868
+ */
1869
+ private convertPointCoords;
1870
+ /**
1871
+ * delta 长度缩放转换
1872
+ */
1873
+ private convertDelta;
1874
+ private checkMouseOverAndSetType;
1875
+ private focusTetxArea;
1876
+ /**
1877
+ * 检测文本图形是否超出边界,如果超出边界将内容调整至可见区域内
1878
+ */
1879
+ private chackIfTextAreaOutofBound;
1880
+ protected _selectShape(shape: BaseShape): void;
1881
+ protected _focusShape(shape: BaseShape): void;
1882
+ /**
1883
+ * 如果点位在 shpe 的四个角的 resize handle 上,返回这个 handle point,否则返回 undefined
1884
+ * @param x
1885
+ * @param y
1886
+ */
1887
+ private getShapeResizeHandle;
1888
+ private rangeSelect;
1889
+ private clearSelectedShapes;
1890
+ /**
1891
+ * 容器大小变化后需要更新绘制内容视角的情况
1892
+ */
1893
+ protected get shouldUpdateViewAfterSizeChange(): boolean;
1894
+ protected get moveAndScaleDisabled(): boolean;
1895
+ private onDoubleClick;
1896
+ private getShapeByPoint;
1897
+ private onMouseDown;
1898
+ /**
1899
+ * 使白板视野回到居中位置(初始位置)
1900
+ */
1901
+ center(doc?: any): void;
1902
+ enableCursorSync(): void;
1903
+ disableCursorSync(): void;
1904
+ /**
1905
+ * 处理选中元素的四个角上的 resize handle 的移入和移出事件
1906
+ */
1907
+ private onMouseMove;
1908
+ /**
1909
+ * 限定鼠标同步发送频率
1910
+ */
1911
+ private sendCursor;
1912
+ /**
1913
+ * 所给点位是否在任意一个多选的 shape 边框范围内
1914
+ * @param x x坐标
1915
+ * @param y y坐标
1916
+ */
1917
+ private isPointInAnyMultySlectedShape;
1918
+ private onPaste;
1919
+ protected uploadLocalImage(file: File, setAsBackground: boolean, onProgress?: (state: {
1920
+ total: number;
1921
+ loaded: number;
1922
+ }) => void): void;
1923
+ private _onPenEvent;
1924
+ private onMouseUp;
1925
+ private onTouchEnd;
1926
+ private onTap;
1927
+ private onPanStart;
1928
+ private batchSendRgnShapes;
1929
+ private onPanMove;
1930
+ private onPanEnd;
1931
+ /**
1932
+ * 删除批量选中的图形
1933
+ */
1934
+ private deleteRageSelectedShapes;
1935
+ private onPinchStart;
1936
+ private onPinch;
1937
+ private onPinchEnd;
1938
+ private onPinchMove;
1939
+ /**
1940
+ * 以 传入的点位更新当前白板页面 scale 比例,如果白板被限制大小,会自动计算出合适的 scale 和 translate
1941
+ * @param nextScale 要更新的 scale
1942
+ * @param originalX 缩放点的 x 坐标,点位是在白板 canvas 元素上的位置
1943
+ * @param originalY 缩放点的 y 坐标,点位是在白板 canvas 元素上的位置
1944
+ */
1945
+ protected _updateBoardWithNewScale: (nextScale: number, originalX: number, originalY: number) => void;
1946
+ private onWheel;
1947
+ private throttledOnWheel;
1948
+ /**
1949
+ * 发送用户自己操作导致视图大小变化的事件
1950
+ */
1951
+ private emitViewportUpdateBySelfEvent;
1952
+ private onContextMenu;
1953
+ private onKeyDown;
1954
+ private copyShapeInfoToClipboard;
1955
+ private onKeyUp;
1956
+ private onMouseOut;
1957
+ /**
1958
+ * 禁止手势缩放面板和移动画布
1959
+ */
1960
+ disableScaleAndMove(): void;
1961
+ /**
1962
+ * 启用手势缩放面板和移动画布
1963
+ */
1964
+ enableScaleAndMove(): void;
1965
+ /**
1966
+ * 禁止通过滚轮缩放画板
1967
+ */
1968
+ disableWheelScale(): void;
1969
+ /**
1970
+ * 允许通过滚轮缩放画板
1971
+ */
1972
+ enableWheelScale(): void;
1973
+ protected enableInteraction(role?: WBRoleType): void;
1974
+ protected stopInteraction(): void;
1975
+ /**
1976
+ * 删除所传点位上的形状
1977
+ */
1978
+ private deleteShapeOnPosition;
1979
+ /**
1980
+ * 软删除,将 shape 设置为不可见
1981
+ */
1982
+ private deleteShape;
1983
+ /**
1984
+ * 截图当前白板内容
1985
+ * @param autoDownload 是否自动下载,默认下载
1986
+ * @param mode 截取全部或者只截取可视区域(pdf 文档只支持截取可视区域)
1987
+ */
1988
+ snapshot(autoDownload?: boolean, mode?: 'all' | 'view', format?: 'png' | 'jpeg', quality?: number): Promise<string>;
1989
+ private getNewShapeId;
1990
+ protected _onLoadImageError: (url: string) => void;
1991
+ protected isPermittedShape(shape: BaseShape): boolean;
1992
+ /**
1993
+ * 统计用户创建的图形数据
1994
+ */
1995
+ getStatistics(): {
1996
+ userId: string;
1997
+ shapes: {
1998
+ shapeStyle?: ShapeStyle;
1999
+ shapeId: string;
2000
+ visible: boolean;
2001
+ type: ShapeType;
2002
+ fontStyle?: FontStyle;
2003
+ text?: string;
2004
+ creator: string;
2005
+ }[];
2006
+ }[];
2007
+ /**
2008
+ * 清除某个用户绘制的内容
2009
+ * @param userId 用户id
2010
+ * @param curPage 是否只清除当前页面
2011
+ * @param clearType 要清除的类型
2012
+ */
2013
+ clearUserContents(userId: string, curPage: boolean, clearType: WBClearType): void;
2014
+ protected throttleSendLaserPointerMsg: any;
2015
+ constructor(sessionId?: string);
2016
+ /**
2017
+ * 创建文档
2018
+ * @param totalPages 文档页数
2019
+ * @param docName 文档名称
2020
+ */
2021
+ createDoc(totalPages: number, docName: string, width?: number, height?: number, docId?: string): void;
2022
+ /**
2023
+ * 设定语言,默认配置包含 zh_CN、zh_TW、en、de、fr、ja、ko
2024
+ * @param locale
2025
+ */
2026
+ setLocale(locale: string): void;
2027
+ setI18nConfig(config: Record<string, any>): void;
2028
+ getI18nConfig(): {
2029
+ zh_CN: {
2030
+ repeatPlay: string;
2031
+ };
2032
+ de: {
2033
+ repeatPlay: string;
2034
+ };
2035
+ fr: {
2036
+ repeatPlay: string;
2037
+ };
2038
+ ja: {
2039
+ repeatPlay: string;
2040
+ };
2041
+ ko: {
2042
+ repeatPlay: string;
2043
+ };
2044
+ zh_TW: {
2045
+ repeatPlay: string;
2046
+ };
2047
+ en: {
2048
+ repeatPlay: string;
2049
+ };
2050
+ };
2051
+ resendLocalInfoOnFailover(): void;
2052
+ /**
2053
+ * 收集本地图形数据,等待 syncCompleted 后确认哪些数据需要重新发送
2054
+ */
2055
+ private sendLocalDocAndShapesOnReconnect;
2056
+ open(wrapperEle: HTMLElement): void;
2057
+ /**
2058
+ * 关闭白板
2059
+ */
2060
+ close(): void;
2061
+ /**
2062
+ * 会中单次同步视角,其他端会被强制设置为与设定的视角一致(该设置仅对当前页面生效)
2063
+ */
2064
+ alignVision(): void;
2065
+ /**
2066
+ * 设置白板视窗位置,画布会自动缩放到合适的比例,保证所选取的视窗在当前可见区域的正中央。
2067
+ * 这是对白板会议的全局设置,设定后其他用户也会遵循这个配置。
2068
+ *
2069
+ * 在指定 sizeConfig 后,默认白板新建的空白白板页也会遵循这个配置。
2070
+ * (动态课件、转码文档、包含背景图的页面除外,这些版面会根据课件或背景图作合适的缩放)
2071
+ * @param width 视窗宽度
2072
+ * @param height 视窗高度
2073
+ * @param limited 白板是否限定大小
2074
+ */
2075
+ initVision(width: number, height: number, limited?: boolean): void;
2076
+ private onViewPortChanged;
2077
+ protected throttleSendVisionCmd: any;
2078
+ /**
2079
+ * 开启自己的视角锁定共享,将把自己的视角同步给别人
2080
+ */
2081
+ startVisionShare(): void;
2082
+ /**
2083
+ * 关闭自己的视角锁定,并发消息清除自己的视角resource信息
2084
+ */
2085
+ stopVisionShare(): void;
2086
+ /**
2087
+ * 开启视角跟随
2088
+ */
2089
+ startFollowVision(): void;
2090
+ /**
2091
+ * 关闭视角跟随
2092
+ */
2093
+ stopFollowVision(): void;
2094
+ /**
2095
+ * 删除文档
2096
+ * @param docId 删除文档的 id
2097
+ * @param switchDocId 删除后跳转到指定文档(如果不传值,当删除的文档是当前文档时跳转至默认文档,其他文档默认不跳转)
2098
+ */
2099
+ deleteDoc(docId: string, switchDocId?: string): void;
2100
+ protected throttleSendDocResourceMsg: any;
2101
+ /**
2102
+ * 清除所有用户在画布上的内容
2103
+ * @param curPage 是否只清除当前页面
2104
+ * @param clearType 清除类型
2105
+ */
2106
+ clearContents(curPage: boolean, clearType: WBClearType): void;
2107
+ /**
2108
+ * 清除某个文档的内容
2109
+ * @param docId
2110
+ * @param clearType
2111
+ * @returns
2112
+ */
2113
+ clearDocContents(docId: string, clearType: WBClearType): void;
2114
+ /**
2115
+ * 发送shape消息到server
2116
+ */
2117
+ sendDrawCmd: (shape: BaseShape, type: "draw" | "rgn") => void;
2118
+ /**
2119
+ * 节流发送shape消息到server
2120
+ *
2121
+ * @param {BaseShape} shape
2122
+ * @param {string} type
2123
+ */
2124
+ throttleSendDrawCmd: any;
2125
+ setScale(scale: number): void;
2126
+ uploadPDF(onProgress?: (state: {
2127
+ total: number;
2128
+ loaded: number;
2129
+ }) => void): Promise<{
2130
+ url: string;
2131
+ fileName: string;
2132
+ docId: string;
2133
+ }>;
2134
+ /**
2135
+ * 通过 URL 添加 PDF 文档
2136
+ */
2137
+ addPdfDoc(url: string, name: string, docId?: string, fileKey?: string): string;
2138
+ /**
2139
+ * 文件转码
2140
+ * @param target: 'png' | 'jpg' | 'pdf'
2141
+ * @param onUploadProgress 上传进度回调
2142
+ * @param onDocTranscodeStatus 发布进度回调,支持上传进度回调,code 为4时表示发布上传进入,在code 为 3 时表示转成成功,会返回 docId,code 定义:
2143
+ * 0或正数表示正常状态,负数表示失败。最大支持40M文件
2144
+ * 0: start upload,1: upload success,2: transcoding,3: transcode success, 4: uploading, 5: preview ready
2145
+ * -1: file too large, -2: upload failed, -3: transcoding failed
2146
+ * @param onSuccess
2147
+ * @param meta
2148
+ */
2149
+ transcodeFile(params: {
2150
+ targetType: 'png' | 'jpg' | 'pdf';
2151
+ onUploadProgress?: (state: {
2152
+ total: number;
2153
+ loaded: number;
2154
+ }) => void;
2155
+ onTranscodeProgress?: (status: 'init' | 'processing' | 'success' | 'failed') => void;
2156
+ }): Promise<{
2157
+ pageCount: number;
2158
+ url: string[];
2159
+ fileName: string;
2160
+ docId: string;
2161
+ }>;
2162
+ /**
2163
+ * 导入指定数量的背景图并创建一个新的文档,以这些图片作为背景
2164
+ * @param urls 图片 url 列表
2165
+ * @param docName 文档名称
2166
+ * @param docId
2167
+ */
2168
+ addBackgroundImages(urls: string[], docName?: string, docId?: string): void;
2169
+ /**
2170
+ * 上传音频
2171
+ * @param callback 音频上传回调, 支持上传进度, code值对应状态:
2172
+ * -3: upload_failed, -2: err_failed_fetch_upload_token, -1: err_file_too_large,
2173
+ */
2174
+ uploadAudio(onProgress?: (state: {
2175
+ total: number;
2176
+ loaded: number;
2177
+ }) => void): Promise<{
2178
+ url: string;
2179
+ fileName: string;
2180
+ docId: string;
2181
+ }>;
2182
+ /**
2183
+ * 上传视频
2184
+ * @param callback 视频上传回调, 支持上传进度, code值对应状态:
2185
+ * -3: upload_failed, -2: err_failed_fetch_upload_token, -1: err_file_too_large,
2186
+ */
2187
+ uploadVideo(onProgress?: (state: {
2188
+ total: number;
2189
+ loaded: number;
2190
+ }) => void): Promise<void>;
2191
+ private _sendMetrics;
2192
+ private doSendMetrics;
2193
+ /**
2194
+ * 上传图片
2195
+ * @param callback 图片上传回调, 支持上传进度, code值对应状态:
2196
+ * -3: upload_failed, -2: err_failed_fetch_upload_token, -1: err_file_too_large,
2197
+ * @param setAsBackground 是否设置为背景图,默认 true
2198
+ */
2199
+ uploadImage(setAsBackground?: boolean, onProgress?: (state: {
2200
+ total: number;
2201
+ loaded: number;
2202
+ }) => void): Promise<void>;
2203
+ /**
2204
+ * 设置图章资源
2205
+ */
2206
+ addStamp(stampId: string, url: string, resizable: boolean): void;
2207
+ getSdkVersion(): string;
2208
+ /**
2209
+ * 打印白板当前的一些关键信息,用于排查问题
2210
+ */
2211
+ exportAsJson(saveFile?: boolean): Promise<{
2212
+ snapshot: string;
2213
+ docsInfo: {
2214
+ docId: string;
2215
+ name: string;
2216
+ creator: string;
2217
+ pageIndex: number;
2218
+ pageVersion: number;
2219
+ pages: {
2220
+ pageId: string;
2221
+ scale: number;
2222
+ translate: [number, number];
2223
+ backgroundColor: string;
2224
+ backgroundImage: ShapeReservedState;
2225
+ shapes: ShapeReservedState[];
2226
+ }[];
2227
+ fileKey: string;
2228
+ }[];
2229
+ }>;
2230
+ /**
2231
+ * 保存日志
2232
+ */
2233
+ saveLogs(fileName?: string): void;
2234
+ }
2235
+
2236
+ declare class WebSession extends ISession {
2237
+ session: DSSession;
2238
+ private wbManager;
2239
+ get sessionId(): string;
2240
+ get isConnected(): boolean;
2241
+ constructor(session: DSSession, wbManager: WhiteboardManager);
2242
+ get connectionInfo(): {
2243
+ userId: string;
2244
+ userName: string;
2245
+ channelId: string;
2246
+ token: string;
2247
+ appId: string;
2248
+ pid: string;
2249
+ securityToken: string;
2250
+ gslb: string;
2251
+ sessionId: string;
2252
+ };
2253
+ private onReceiveUserUpdate;
2254
+ private onReceiveCmdData;
2255
+ private onReceiveData;
2256
+ /**
2257
+ * 离开该白板频道,其他用户也会收到当前用户离开的事件。
2258
+ * 用于中途离开白板,对其他用户无影响。
2259
+ *
2260
+ * 调用后当前白板实例仍然保留,可通过id获取到白板实例。
2261
+ * 如果后续仍想继续使用白板,可以在获取白板实例后调用joinSession再次入会
2262
+ */
2263
+ leave: () => void;
2264
+ /**
2265
+ * 关闭该白板频道,其他用户也会收到频道关闭信号。
2266
+ * 用于结束白板,影响所有用户。
2267
+ *
2268
+ * 调用后当前白板实例会被清理回收掉。
2269
+ */
2270
+ stop: () => void;
2271
+ joinSession(): Promise<void>;
2272
+ sendData: (command: string, sendBack?: boolean) => void;
2273
+ }
2274
+
2275
+ interface WhiteboardUser {
2276
+ userId: string;
2277
+ }
2278
+ declare class RtcWhiteboard extends Whiteboard {
2279
+ wbManager: WhiteboardManager;
2280
+ connection: WebSession;
2281
+ users: WhiteboardUser[];
2282
+ joinStatus: 'init' | 'joining' | 'joined' | 'leaving' | 'left';
2283
+ openStatus: 'init' | 'opening' | 'opened' | 'closing' | 'closed';
2284
+ constructor(connection: WebSession, wbManager: WhiteboardManager);
2285
+ get isConnected(): boolean;
2286
+ /**
2287
+ * 调用后当前白板实例仍然保留,可通过id获取到白板实例。
2288
+ * 如果后续仍想继续使用白板,可以在获取白板实例后调用joinSession再次入会
2289
+ */
2290
+ leave: () => void;
2291
+ /**
2292
+ * 关闭该白板频道,其他用户也会收到频道关闭信号。
2293
+ * 用于结束白板,影响所有用户。
2294
+ *
2295
+ * 调用后当前白板实例会被清理回收掉。
2296
+ */
2297
+ stop: () => void;
2298
+ open(wrapperEle: HTMLElement): Promise<void>;
2299
+ close(): void;
2300
+ joinSession(): Promise<void> | Promise<boolean>;
2301
+ protected onReceiveCommand: (command: IDSMsg) => void;
2302
+ private _handleSnapshotCommand;
2303
+ private _handleCoursorCommand;
2304
+ protected _handleClearResource(command: IClearResourceMsg): void;
2305
+ protected _handleClearObj(command: IClearObjMsg): void;
2306
+ private _handleStampResourceCommand;
2307
+ /**
2308
+ * 处理激光笔消息
2309
+ */
2310
+ private _handleLaserPointerCommand;
2311
+ private _handleVisionCommand;
2312
+ private _handleDrawCommand;
2313
+ }
2314
+
2315
+ declare class WhiteboardManager extends EventEmitter<IWhiteboardManagerEvents> {
2316
+ private id;
2317
+ private whiteboardMap;
2318
+ private channel;
2319
+ reporter: Reporter;
2320
+ get gslb(): string;
2321
+ constructor();
2322
+ getWhiteboard(whiteboardId: string): RtcWhiteboard;
2323
+ getAnnotation(annotationId: string, sourceType: AnnotationSourceType): RtcWhiteboard;
2324
+ get connectionInfo(): {
2325
+ userId: string;
2326
+ userName: string;
2327
+ channelId: string;
2328
+ token: string;
2329
+ appId: string;
2330
+ pid: string;
2331
+ securityToken: string;
2332
+ gslb: string;
2333
+ };
2334
+ detach(): void;
2335
+ attach(channel: DingRTCChannel): void;
2336
+ get isConnected(): boolean;
2337
+ private setupChannel;
2338
+ /**
2339
+ * 加入白板频道
2340
+ * @param joinInfo
2341
+ * @returns
2342
+ */
2343
+ join(joinInfo: JoinParam): Promise<void>;
2344
+ /**
2345
+ * 离开频道,所有白板都会离开
2346
+ */
2347
+ leave(): void;
2348
+ /**
2349
+ * 清理本地白板缓存
2350
+ */
2351
+ clear(): void;
2352
+ }
2353
+
2354
+ export { RtcWhiteboard, ShapeFillType, ShapeFontFormatType, ShapeLineType, ShapeOrderType, ShapeVisibleType, ShapeType as ToolType, WBClearType, Whiteboard, WhiteboardManager, WhiteboardManager as default };
2355
+ export type { AnnotationSourceType, IDomRect, IWhiteboardEvents, IWhiteboardManagerEvents };