@netless/forge-whiteboard 0.1.14 → 0.1.16

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 (96) hide show
  1. package/changelog.md +11 -1
  2. package/dist/Camera.d.ts +7 -5
  3. package/dist/Camera.d.ts.map +1 -1
  4. package/dist/Gesture.d.ts +1 -1
  5. package/dist/Gesture.d.ts.map +1 -1
  6. package/dist/IndexedNavigation.d.ts +31 -29
  7. package/dist/IndexedNavigation.d.ts.map +1 -1
  8. package/dist/SequenceExecutor.d.ts +7 -0
  9. package/dist/SequenceExecutor.d.ts.map +1 -0
  10. package/dist/WhitePermissions.d.ts +7 -46
  11. package/dist/WhitePermissions.d.ts.map +1 -1
  12. package/dist/Whiteboard.d.ts +120 -108
  13. package/dist/Whiteboard.d.ts.map +1 -1
  14. package/dist/WhiteboardApplication.d.ts +7 -4
  15. package/dist/WhiteboardApplication.d.ts.map +1 -1
  16. package/dist/edit/Editor.d.ts +5 -5
  17. package/dist/edit/Editor.d.ts.map +1 -1
  18. package/dist/edit/EditorConfig.d.ts +1 -1
  19. package/dist/edit/EditorConfig.d.ts.map +1 -1
  20. package/dist/edit/TextEditor.d.ts +2 -2
  21. package/dist/edit/TextEditor.d.ts.map +1 -1
  22. package/dist/index.d.ts +6 -6
  23. package/dist/model/PageModel.d.ts +5 -4
  24. package/dist/model/PageModel.d.ts.map +1 -1
  25. package/dist/model/RenderableModel.d.ts +22 -20
  26. package/dist/model/RenderableModel.d.ts.map +1 -1
  27. package/dist/model/SelectElementsModel.d.ts +4 -4
  28. package/dist/model/SelectElementsModel.d.ts.map +1 -1
  29. package/dist/model/ToolbarModel.d.ts +4 -3
  30. package/dist/model/ToolbarModel.d.ts.map +1 -1
  31. package/dist/model/TrashedElementsModel.d.ts +4 -4
  32. package/dist/model/TrashedElementsModel.d.ts.map +1 -1
  33. package/dist/model/renderable/CurveModel.d.ts +7 -4
  34. package/dist/model/renderable/CurveModel.d.ts.map +1 -1
  35. package/dist/model/renderable/CurveModel_old.d.ts +28 -0
  36. package/dist/model/renderable/CurveModel_old.d.ts.map +1 -0
  37. package/dist/model/renderable/ElementModel.d.ts +5 -3
  38. package/dist/model/renderable/ElementModel.d.ts.map +1 -1
  39. package/dist/model/renderable/EraserModel.d.ts +5 -4
  40. package/dist/model/renderable/EraserModel.d.ts.map +1 -1
  41. package/dist/model/renderable/ImageModel.d.ts +20 -0
  42. package/dist/model/renderable/ImageModel.d.ts.map +1 -0
  43. package/dist/model/renderable/LaserPointerModel.d.ts +5 -4
  44. package/dist/model/renderable/LaserPointerModel.d.ts.map +1 -1
  45. package/dist/model/renderable/LineModel.d.ts +9 -8
  46. package/dist/model/renderable/LineModel.d.ts.map +1 -1
  47. package/dist/model/renderable/PointTextModel.d.ts +4 -3
  48. package/dist/model/renderable/PointTextModel.d.ts.map +1 -1
  49. package/dist/model/renderable/RectangleModel.d.ts +5 -4
  50. package/dist/model/renderable/RectangleModel.d.ts.map +1 -1
  51. package/dist/model/renderable/SegmentsModel.d.ts +6 -5
  52. package/dist/model/renderable/SegmentsModel.d.ts.map +1 -1
  53. package/dist/model/renderable/SelectorModel.d.ts +5 -4
  54. package/dist/model/renderable/SelectorModel.d.ts.map +1 -1
  55. package/dist/model/renderable/StraightLineModel.d.ts +5 -4
  56. package/dist/model/renderable/StraightLineModel.d.ts.map +1 -1
  57. package/dist/model/renderable/TriangleModel.d.ts +5 -4
  58. package/dist/model/renderable/TriangleModel.d.ts.map +1 -1
  59. package/dist/tool/CurveTool.d.ts +4 -4
  60. package/dist/tool/CurveTool.d.ts.map +1 -1
  61. package/dist/tool/EllipseTool.d.ts +4 -4
  62. package/dist/tool/EllipseTool.d.ts.map +1 -1
  63. package/dist/tool/EraserTool.d.ts +6 -6
  64. package/dist/tool/EraserTool.d.ts.map +1 -1
  65. package/dist/tool/GrabTool.d.ts +4 -4
  66. package/dist/tool/GrabTool.d.ts.map +1 -1
  67. package/dist/tool/LaserPointerTool.d.ts +5 -5
  68. package/dist/tool/LaserPointerTool.d.ts.map +1 -1
  69. package/dist/tool/LineTool.d.ts +4 -4
  70. package/dist/tool/LineTool.d.ts.map +1 -1
  71. package/dist/tool/PointerTool.d.ts +10 -0
  72. package/dist/tool/PointerTool.d.ts.map +1 -0
  73. package/dist/tool/RectangleTool.d.ts +4 -4
  74. package/dist/tool/RectangleTool.d.ts.map +1 -1
  75. package/dist/tool/SelectorTool.d.ts +5 -5
  76. package/dist/tool/SelectorTool.d.ts.map +1 -1
  77. package/dist/tool/StraightLineTool.d.ts +4 -4
  78. package/dist/tool/StraightLineTool.d.ts.map +1 -1
  79. package/dist/tool/TextTool.d.ts +6 -6
  80. package/dist/tool/TextTool.d.ts.map +1 -1
  81. package/dist/tool/TriangleTool.d.ts +4 -4
  82. package/dist/tool/TriangleTool.d.ts.map +1 -1
  83. package/dist/tool/WhiteboardTool.d.ts +2 -2
  84. package/dist/tool/WhiteboardTool.d.ts.map +1 -1
  85. package/dist/utils/FPS.d.ts +15 -0
  86. package/dist/utils/FPS.d.ts.map +1 -0
  87. package/dist/utils/Recognizer.d.ts +1 -1
  88. package/dist/utils/Recognizer.d.ts.map +1 -1
  89. package/dist/utils/ShadowEmitter.d.ts +2 -2
  90. package/dist/utils/ShadowEmitter.d.ts.map +1 -1
  91. package/dist/utils/async.d.ts.map +1 -1
  92. package/dist/whiteboard.esm.js +599 -337
  93. package/dist/whiteboard.esm.js.map +4 -4
  94. package/dist/whiteboard.js +600 -338
  95. package/dist/whiteboard.js.map +4 -4
  96. package/package.json +4 -3
@@ -25362,13 +25362,14 @@ var require_lodash = __commonJS({
25362
25362
 
25363
25363
  // src/WhiteboardApplication.ts
25364
25364
  var import_paper = __toESM(require_paper_full(), 1);
25365
- import { AbstractApplication, log as log3 } from "@netless/forge-room";
25365
+ import { AbstractApplication, log as log4 } from "@netless/forge-room";
25366
25366
  import * as Y15 from "yjs";
25367
25367
 
25368
25368
  // src/model/RenderableModel.ts
25369
25369
  import * as Y12 from "yjs";
25370
- import EventEmitter2 from "eventemitter3";
25370
+ import EventEmitter from "eventemitter3";
25371
25371
  import { v4 as uuidv4 } from "uuid";
25372
+ import { log, removeObserver as removeObserver2 } from "@netless/forge-room";
25372
25373
 
25373
25374
  // src/model/renderable/CurveModel.ts
25374
25375
  import * as Y2 from "yjs";
@@ -25526,6 +25527,7 @@ var import_lodash = __toESM(require_lodash(), 1);
25526
25527
 
25527
25528
  // src/model/renderable/ElementModel.ts
25528
25529
  import * as Y from "yjs";
25530
+ import { removeDeepObserver } from "@netless/forge-room";
25529
25531
  function _defineProperty(e, r, t) {
25530
25532
  return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
25531
25533
  }
@@ -25708,6 +25710,10 @@ var ElementModel = class _ElementModel {
25708
25710
  const ext = this.styleKeys();
25709
25711
  return Array.from(new Set(["dashArray", "strokeColor", "fillColor", "strokeWidth"].filter((v) => ext.exclude.indexOf(v) < 0).concat(ext.include)));
25710
25712
  }
25713
+ dispose() {
25714
+ this.subDispose();
25715
+ removeDeepObserver(this.root, this.handlePropChange);
25716
+ }
25711
25717
  };
25712
25718
  _defineProperty(ElementModel, "KEYS", {
25713
25719
  index: "index",
@@ -25781,12 +25787,15 @@ var CurveModel = class extends ElementModel {
25781
25787
  constructor(root, scope) {
25782
25788
  super(root, scope);
25783
25789
  _defineProperty3(this, "item", null);
25790
+ _defineProperty3(this, "debugPath", void 0);
25791
+ _defineProperty3(this, "debug", false);
25784
25792
  if (!this.root.has("type")) {
25785
25793
  this.root.set("type", "curve");
25786
25794
  }
25787
25795
  if (!this.root.has("points")) {
25788
25796
  this.root.set("points", new Y2.Array());
25789
25797
  }
25798
+ this.debugPath = new scope.Path();
25790
25799
  }
25791
25800
  average(a2, b2) {
25792
25801
  return (a2 + b2) / 2;
@@ -25795,23 +25804,23 @@ var CurveModel = class extends ElementModel {
25795
25804
  const groupPoints = (0, import_lodash.chunk)(points, 2);
25796
25805
  return ae(groupPoints, {
25797
25806
  size: this.strokeWidth,
25798
- smoothing: 0,
25799
- thinning: 0.5,
25807
+ smoothing: 0.5,
25808
+ thinning: -0.5,
25800
25809
  streamline: 0.5,
25801
25810
  simulatePressure: true,
25802
25811
  start: {
25803
- taper: 10,
25812
+ taper: this.strokeWidth * 10,
25804
25813
  cap: true
25805
25814
  },
25806
25815
  end: {
25807
- taper: 10,
25816
+ taper: this.strokeWidth * 20,
25808
25817
  cap: true
25809
25818
  }
25810
25819
  });
25811
25820
  }
25812
25821
  matrixedPoints() {
25813
- const groupPoints = (0, import_lodash.chunk)(this.points, 2);
25814
- return groupPoints.map((_ref) => {
25822
+ const currentPoints = (0, import_lodash.chunk)(this.points, 2);
25823
+ return currentPoints.map((_ref) => {
25815
25824
  let [x, y] = _ref;
25816
25825
  return new this.scope.Point(x, y);
25817
25826
  }).map((p) => p.transform(new this.scope.Matrix(this.pointsMatrix))).reduce((result, next) => {
@@ -25845,27 +25854,41 @@ var CurveModel = class extends ElementModel {
25845
25854
  }
25846
25855
  return path;
25847
25856
  }
25848
- getNextSegments() {
25849
- const points = this.parsePoints(this.matrixedPoints());
25850
- const path = this.createPath(points);
25851
- return path.segments;
25857
+ updateDebugPath() {
25858
+ this.debugPath = new this.scope.Path();
25859
+ const points = (0, import_lodash.chunk)(this.points, 2);
25860
+ for (let i = 0, len = points.length; i < len; i++) {
25861
+ const point = new this.scope.Point(points[i][0], points[i][1]);
25862
+ if (i === 0) {
25863
+ this.debugPath.moveTo(point);
25864
+ } else {
25865
+ this.debugPath.lineTo(point);
25866
+ }
25867
+ this.debugPath.strokeWidth = 1;
25868
+ this.debugPath.strokeColor = new this.scope.Color(1, 0, 0, 1);
25869
+ }
25852
25870
  }
25853
25871
  onVectorUpdate() {
25854
25872
  if (!this.item) {
25855
25873
  return;
25856
25874
  }
25875
+ if (this.debug) {
25876
+ this.debugPath.remove();
25877
+ this.updateDebugPath();
25878
+ }
25879
+ const points = this.parsePoints(this.matrixedPoints());
25880
+ const path = this.createPath(points);
25857
25881
  this.item.removeSegments();
25858
- this.item.addSegments(this.getNextSegments());
25859
- this.item.simplify(2.5);
25882
+ this.item.addSegments(path.segments);
25883
+ if (this.debug) {
25884
+ this.item.addChild(this.debugPath);
25885
+ }
25860
25886
  }
25861
25887
  createPaperItem() {
25862
25888
  this.item = new this.scope.Path();
25863
- this.item.strokeCap = "round";
25864
- this.item.strokeJoin = "round";
25865
- this.item.strokeScaling = false;
25866
25889
  this.item.strokeColor = new this.scope.Color(this.strokeColor);
25867
25890
  this.item.fillColor = new this.scope.Color(this.strokeColor);
25868
- this.item.addSegments(this.getNextSegments());
25891
+ this.onVectorUpdate();
25869
25892
  }
25870
25893
  editorConfig() {
25871
25894
  return new EditorConfig();
@@ -25875,8 +25898,8 @@ var CurveModel = class extends ElementModel {
25875
25898
  }
25876
25899
  styleKeys() {
25877
25900
  return {
25878
- include: ["strokeColor"],
25879
- exclude: ["fillColor", "dashArray"]
25901
+ include: ["strokeColor", "strokeWidth"],
25902
+ exclude: ["dashArray", "fillColor"]
25880
25903
  };
25881
25904
  }
25882
25905
  onStyleKeyUpdate(key) {
@@ -25886,8 +25909,12 @@ var CurveModel = class extends ElementModel {
25886
25909
  if (key === "strokeColor") {
25887
25910
  this.item.strokeColor = new this.scope.Color(this.strokeColor);
25888
25911
  this.item.fillColor = new this.scope.Color(this.strokeColor);
25912
+ } else if (key === "strokeWidth") {
25913
+ this.onVectorUpdate();
25889
25914
  }
25890
25915
  }
25916
+ subDispose() {
25917
+ }
25891
25918
  };
25892
25919
 
25893
25920
  // src/model/renderable/SelectorModel.ts
@@ -25922,14 +25949,12 @@ var SelectorModel = class extends ElementModel {
25922
25949
  this.root.set("points", initPoints);
25923
25950
  }
25924
25951
  }
25952
+ subDispose() {
25953
+ }
25925
25954
  createPaperRect() {
25926
25955
  const scope = this.scope;
25927
25956
  const bounds = new scope.Rectangle(new scope.Point(this.points[0], this.points[1]), new scope.Size(this.points[2], this.points[3]));
25928
- return new scope.Path.Rectangle(
25929
- bounds,
25930
- new scope.Point(this.points[4], this.points[4])
25931
- // 圆角
25932
- );
25957
+ return new scope.Path.Rectangle(bounds, new scope.Point(this.points[4], this.points[4]));
25933
25958
  }
25934
25959
  onVectorUpdate() {
25935
25960
  if (!this.item) {
@@ -25955,7 +25980,7 @@ var SelectorModel = class extends ElementModel {
25955
25980
  exclude: []
25956
25981
  };
25957
25982
  }
25958
- onStyleKeyUpdate(key) {
25983
+ onStyleKeyUpdate(_key) {
25959
25984
  }
25960
25985
  };
25961
25986
 
@@ -26007,7 +26032,7 @@ var AnimationFrame = class {
26007
26032
  _defineProperty5(this, "lastTime", 0);
26008
26033
  _defineProperty5(this, "fps", 45);
26009
26034
  _defineProperty5(this, "handleCallbacks", () => {
26010
- let functions = this.callbacks;
26035
+ const functions = this.callbacks;
26011
26036
  this.callbacks = [];
26012
26037
  for (let i = 0, l2 = functions.length; i < l2; i++) {
26013
26038
  functions[i]();
@@ -26060,6 +26085,8 @@ var SegmentsModel = class extends ElementModel {
26060
26085
  this.root.set("points", new Y4.Array());
26061
26086
  }
26062
26087
  }
26088
+ subDispose() {
26089
+ }
26063
26090
  onVectorUpdate() {
26064
26091
  if (!this.item) {
26065
26092
  return;
@@ -26094,7 +26121,7 @@ var SegmentsModel = class extends ElementModel {
26094
26121
  exclude: []
26095
26122
  };
26096
26123
  }
26097
- onStyleKeyUpdate(key) {
26124
+ onStyleKeyUpdate(_key) {
26098
26125
  }
26099
26126
  };
26100
26127
 
@@ -26188,6 +26215,9 @@ var LineTool = class extends WhiteboardTool {
26188
26215
  this.tool.minDistance = 1;
26189
26216
  }
26190
26217
  onMouseDown(event) {
26218
+ if (this.elementModel) {
26219
+ this.elementModel.dispose();
26220
+ }
26191
26221
  this.elementModel = this.modelGetter().createLinePath(true);
26192
26222
  this.from = event.point.clone();
26193
26223
  this.to = event.point.clone();
@@ -26263,6 +26293,8 @@ var LineModel = class extends ElementModel {
26263
26293
  this.root.set("tailArrow", "normal");
26264
26294
  }
26265
26295
  }
26296
+ subDispose() {
26297
+ }
26266
26298
  onVectorUpdate() {
26267
26299
  if (!this.item) {
26268
26300
  return;
@@ -26299,7 +26331,7 @@ var LineModel = class extends ElementModel {
26299
26331
  this.item.addChildren(this.renderLine());
26300
26332
  }
26301
26333
  createArrow(path) {
26302
- let [headPath, tailPath] = [new this.scope.Path(), new this.scope.Path()];
26334
+ const [headPath, tailPath] = [new this.scope.Path(), new this.scope.Path()];
26303
26335
  if (!path) {
26304
26336
  return [headPath, tailPath];
26305
26337
  }
@@ -26353,7 +26385,7 @@ var LineModel = class extends ElementModel {
26353
26385
  exclude: ["fillColor"]
26354
26386
  };
26355
26387
  }
26356
- onStyleKeyUpdate(key) {
26388
+ onStyleKeyUpdate(_key) {
26357
26389
  this.onVectorUpdate();
26358
26390
  }
26359
26391
  };
@@ -26408,6 +26440,7 @@ var LineControlPoint = class {
26408
26440
 
26409
26441
  // src/model/renderable/PointTextModel.ts
26410
26442
  import * as Y6 from "yjs";
26443
+ import { removeObserver } from "@netless/forge-room";
26411
26444
  function _defineProperty10(e, r, t) {
26412
26445
  return (r = _toPropertyKey10(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
26413
26446
  }
@@ -26476,6 +26509,9 @@ var PointTextModel = class extends ElementModel {
26476
26509
  }, 60);
26477
26510
  }
26478
26511
  }
26512
+ subDispose() {
26513
+ removeObserver(this.root, this.handleTextPropChange);
26514
+ }
26479
26515
  getInternalMeasurement() {
26480
26516
  if (!this.item) {
26481
26517
  return null;
@@ -26581,6 +26617,8 @@ var TriangleModel = class extends ElementModel {
26581
26617
  this.root.set("points", new Y7.Array());
26582
26618
  }
26583
26619
  }
26620
+ subDispose() {
26621
+ }
26584
26622
  createPaperItem() {
26585
26623
  this.item = new this.scope.Path();
26586
26624
  this.item.strokeCap = "butt";
@@ -26637,7 +26675,7 @@ var TriangleModel = class extends ElementModel {
26637
26675
  exclude: []
26638
26676
  };
26639
26677
  }
26640
- onStyleKeyUpdate(key) {
26678
+ onStyleKeyUpdate(_key) {
26641
26679
  }
26642
26680
  };
26643
26681
 
@@ -26676,6 +26714,8 @@ var RectangleModel = class extends ElementModel {
26676
26714
  this.root.set("radius", 0);
26677
26715
  }
26678
26716
  }
26717
+ subDispose() {
26718
+ }
26679
26719
  createSegments() {
26680
26720
  const [a2, b2, c, d] = this.points;
26681
26721
  const matrix = new this.scope.Matrix(this.pointsMatrix);
@@ -26807,7 +26847,7 @@ var RectangleModel = class extends ElementModel {
26807
26847
  exclude: []
26808
26848
  };
26809
26849
  }
26810
- onStyleKeyUpdate(key) {
26850
+ onStyleKeyUpdate(_key) {
26811
26851
  }
26812
26852
  };
26813
26853
 
@@ -26948,9 +26988,11 @@ var EraserModel = class extends ElementModel {
26948
26988
  exclude: []
26949
26989
  };
26950
26990
  }
26951
- onStyleKeyUpdate(key) {
26991
+ onStyleKeyUpdate(_key) {
26952
26992
  return;
26953
26993
  }
26994
+ subDispose() {
26995
+ }
26954
26996
  };
26955
26997
 
26956
26998
  // src/model/renderable/LaserPointerModel.ts
@@ -27107,30 +27149,15 @@ var LaserPointerModel = class extends ElementModel {
27107
27149
  exclude: []
27108
27150
  };
27109
27151
  }
27110
- onStyleKeyUpdate(key) {
27152
+ onStyleKeyUpdate(_key) {
27111
27153
  return;
27112
27154
  }
27155
+ subDispose() {
27156
+ }
27113
27157
  };
27114
27158
 
27115
27159
  // src/WhitePermissions.ts
27116
- import EventEmitter from "eventemitter3";
27117
- function _defineProperty15(e, r, t) {
27118
- return (r = _toPropertyKey15(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27119
- }
27120
- function _toPropertyKey15(t) {
27121
- var i = _toPrimitive15(t, "string");
27122
- return "symbol" == typeof i ? i : i + "";
27123
- }
27124
- function _toPrimitive15(t, r) {
27125
- if ("object" != typeof t || !t) return t;
27126
- var e = t[Symbol.toPrimitive];
27127
- if (void 0 !== e) {
27128
- var i = e.call(t, r || "default");
27129
- if ("object" != typeof i) return i;
27130
- throw new TypeError("@@toPrimitive must return a primitive value.");
27131
- }
27132
- return ("string" === r ? String : Number)(t);
27133
- }
27160
+ import { AbstractApplicationPermissions } from "@netless/forge-room";
27134
27161
  var WhiteboardPermissionFlag = function(WhiteboardPermissionFlag2) {
27135
27162
  WhiteboardPermissionFlag2[WhiteboardPermissionFlag2["none"] = 0] = "none";
27136
27163
  WhiteboardPermissionFlag2[WhiteboardPermissionFlag2["draw"] = 1] = "draw";
@@ -27143,120 +27170,28 @@ var WhiteboardPermissionFlag = function(WhiteboardPermissionFlag2) {
27143
27170
  WhiteboardPermissionFlag2[WhiteboardPermissionFlag2["all"] = WhiteboardPermissionFlag2.draw | WhiteboardPermissionFlag2.editSelf | WhiteboardPermissionFlag2.editOthers | WhiteboardPermissionFlag2.deleteSelf | WhiteboardPermissionFlag2.deleteOthers | WhiteboardPermissionFlag2.mainView | WhiteboardPermissionFlag2.setOthersView] = "all";
27144
27171
  return WhiteboardPermissionFlag2;
27145
27172
  }({});
27146
- var WhiteboardPermissions = class extends EventEmitter {
27147
- constructor(userManager, requestUserMap) {
27148
- super();
27149
- _defineProperty15(this, "requestUserMap", void 0);
27150
- _defineProperty15(this, "userManager", void 0);
27151
- _defineProperty15(this, "observers", /* @__PURE__ */ new Map());
27152
- _defineProperty15(this, "handleUserLeave", (user) => {
27153
- const cb = this.observers.get(user.id);
27154
- if (cb) {
27155
- this.requestUserMap(user.id).unobserve(cb);
27156
- }
27157
- });
27158
- _defineProperty15(this, "handleUserJoin", (user) => {
27159
- this.addObserve(user.id);
27160
- });
27161
- this.userManager = userManager;
27162
- this.requestUserMap = requestUserMap;
27163
- this.createModel(this.userManager.selfId);
27164
- this.userManager.userIdList().forEach((userId) => {
27165
- this.addObserve(userId);
27166
- });
27167
- this.userManager.on("join", this.handleUserJoin);
27168
- this.userManager.on("leave", this.handleUserLeave);
27169
- }
27170
- addObserve(userId) {
27171
- if (this.observers.has(userId)) {
27172
- return;
27173
- }
27174
- const observer = (evt) => {
27175
- this.handleUserPermissionChange(userId, evt);
27176
- };
27177
- this.observers.set(userId, observer);
27178
- this.requestUserMap(userId).observe(observer);
27179
- }
27180
- createModel(userId) {
27181
- const userMap = this.requestUserMap(userId);
27182
- if (!userMap.has("permission")) {
27183
- userMap.set("permission", 0);
27184
- }
27185
- }
27186
- handleUserPermissionChange(userId, evt) {
27187
- for (const [key, value] of evt.changes.keys.entries()) {
27188
- if (key === "permission") {
27189
- if (value.action === "add" || value.action === "update") {
27190
- const newValue = this.requestUserMap(userId).get("permission");
27191
- this.emit("change", userId, this.resolveFlags(newValue), newValue);
27192
- }
27193
- }
27194
- }
27195
- }
27173
+ var WhiteboardPermissions = class extends AbstractApplicationPermissions {
27196
27174
  /**
27197
- * 解析权限列表组合
27198
- * @param {number} value - 权限数字值
27199
- * @return {WhiteboardPermissionFlag[]} - 权限列表
27200
- */
27175
+ * 解析权限列表组合
27176
+ * @param {number} value - 权限数字值
27177
+ * @return {WhiteboardPermissionFlag[]} - 权限列表
27178
+ */
27201
27179
  resolveFlags(value) {
27202
27180
  return [WhiteboardPermissionFlag.draw, WhiteboardPermissionFlag.editSelf, WhiteboardPermissionFlag.editOthers, WhiteboardPermissionFlag.deleteSelf, WhiteboardPermissionFlag.deleteOthers, WhiteboardPermissionFlag.mainView, WhiteboardPermissionFlag.setOthersView].filter((v) => (v & value) !== 0);
27203
27181
  }
27204
- /**
27205
- * 获取权限列表组合对应的数值
27206
- * @param { string } userId 不传表示获取自己
27207
- */
27208
- getPermissionValue(userId) {
27209
- return this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0;
27210
- }
27211
- /**
27212
- * 获取权限列表
27213
- * @param {string=} userId 可选, 不传表示获取自己
27214
- */
27215
- getPermissionFlags(userId) {
27216
- const value = this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0;
27217
- return this.resolveFlags(value);
27218
- }
27219
- /**
27220
- * 返回对应 userId 是否有相应权限
27221
- * @param {string=} userId 可选, 不传表示返回自己是否有相应权限
27222
- * @param {WhiteboardPermissionFlag} flag
27223
- */
27224
- hasPermission(flag, userId) {
27225
- return ((this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0) & flag) !== 0;
27226
- }
27227
- /**
27228
- * 添加权限
27229
- * @param {WhiteboardPermissionFlag} flag 权限标记
27230
- * @param {string=} userId 可选, 为 userId 添加权限, 不传表示为自己添加权限
27231
- */
27232
- addPermission(flag, userId) {
27233
- const userMap = this.requestUserMap(userId ?? this.userManager.selfId);
27234
- const oldValue = userMap.get("permission") ?? 0;
27235
- this.requestUserMap(userId ?? this.userManager.selfId).set("permission", oldValue | flag);
27236
- }
27237
- /**
27238
- * 移除权限
27239
- * @param {WhiteboardPermissionFlag} flag 权限标记
27240
- * @param {string=} userId 可选, 为 userId 移除权限, 不传表示为自己移除权限
27241
- */
27242
- removePermission(flag, userId) {
27243
- const userMap = this.requestUserMap(userId ?? this.userManager.selfId);
27244
- const oldValue = userMap.get("permission") ?? 0;
27245
- this.requestUserMap(userId ?? this.userManager.selfId).set("permission", oldValue & ~flag);
27246
- }
27247
27182
  };
27248
27183
 
27249
27184
  // src/model/renderable/StraightLineModel.ts
27250
27185
  var import_lodash7 = __toESM(require_lodash(), 1);
27251
27186
  import * as Y11 from "yjs";
27252
- function _defineProperty16(e, r, t) {
27253
- return (r = _toPropertyKey16(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27187
+ function _defineProperty15(e, r, t) {
27188
+ return (r = _toPropertyKey15(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27254
27189
  }
27255
- function _toPropertyKey16(t) {
27256
- var i = _toPrimitive16(t, "string");
27190
+ function _toPropertyKey15(t) {
27191
+ var i = _toPrimitive15(t, "string");
27257
27192
  return "symbol" == typeof i ? i : i + "";
27258
27193
  }
27259
- function _toPrimitive16(t, r) {
27194
+ function _toPrimitive15(t, r) {
27260
27195
  if ("object" != typeof t || !t) return t;
27261
27196
  var e = t[Symbol.toPrimitive];
27262
27197
  if (void 0 !== e) {
@@ -27269,7 +27204,7 @@ function _toPrimitive16(t, r) {
27269
27204
  var StraightLineModel = class extends ElementModel {
27270
27205
  constructor(root, scope) {
27271
27206
  super(root, scope);
27272
- _defineProperty16(this, "item", null);
27207
+ _defineProperty15(this, "item", null);
27273
27208
  if (!this.root.has("type")) {
27274
27209
  this.root.set("type", "line");
27275
27210
  }
@@ -27277,6 +27212,8 @@ var StraightLineModel = class extends ElementModel {
27277
27212
  this.root.set("points", new Y11.Array());
27278
27213
  }
27279
27214
  }
27215
+ subDispose() {
27216
+ }
27280
27217
  onVectorUpdate() {
27281
27218
  if (!this.item) {
27282
27219
  return;
@@ -27350,7 +27287,7 @@ var StraightLineModel = class extends ElementModel {
27350
27287
  exclude: ["fillColor"]
27351
27288
  };
27352
27289
  }
27353
- onStyleKeyUpdate(key) {
27290
+ onStyleKeyUpdate(_key) {
27354
27291
  if (!this.item) {
27355
27292
  return;
27356
27293
  }
@@ -27360,6 +27297,83 @@ var StraightLineModel = class extends ElementModel {
27360
27297
  }
27361
27298
  };
27362
27299
 
27300
+ // src/model/renderable/ImageModel.ts
27301
+ function _defineProperty16(e, r, t) {
27302
+ return (r = _toPropertyKey16(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27303
+ }
27304
+ function _toPropertyKey16(t) {
27305
+ var i = _toPrimitive16(t, "string");
27306
+ return "symbol" == typeof i ? i : i + "";
27307
+ }
27308
+ function _toPrimitive16(t, r) {
27309
+ if ("object" != typeof t || !t) return t;
27310
+ var e = t[Symbol.toPrimitive];
27311
+ if (void 0 !== e) {
27312
+ var i = e.call(t, r || "default");
27313
+ if ("object" != typeof i) return i;
27314
+ throw new TypeError("@@toPrimitive must return a primitive value.");
27315
+ }
27316
+ return ("string" === r ? String : Number)(t);
27317
+ }
27318
+ var ImageModel = class extends ElementModel {
27319
+ get src() {
27320
+ return this.root.get("src");
27321
+ }
27322
+ constructor(root, scope, imageSets) {
27323
+ super(root, scope);
27324
+ _defineProperty16(this, "item", null);
27325
+ _defineProperty16(this, "imageSets", void 0);
27326
+ this.imageSets = imageSets;
27327
+ if (!this.root.has("type")) {
27328
+ this.root.set("type", "image");
27329
+ }
27330
+ this.root.set(ElementModel.KEYS.shadow, "");
27331
+ }
27332
+ subDispose() {
27333
+ const img = this.imageSets.querySelector(`[id='${this.uuid}']`);
27334
+ if (img) {
27335
+ img.remove();
27336
+ }
27337
+ }
27338
+ createPaperItem() {
27339
+ if (this.item) {
27340
+ return;
27341
+ }
27342
+ if (!this.imageSets.querySelector(`[id='${this.uuid}']`)) {
27343
+ const img = document.createElement("img");
27344
+ img.src = this.src;
27345
+ img.id = this.uuid;
27346
+ this.imageSets.appendChild(img);
27347
+ }
27348
+ this.item = new this.scope.Raster(this.uuid);
27349
+ const matrix = new this.scope.Matrix(this.pointsMatrix);
27350
+ this.item.matrix = matrix;
27351
+ }
27352
+ onVectorUpdate() {
27353
+ const matrix = new this.scope.Matrix(this.pointsMatrix);
27354
+ if (this.item) {
27355
+ this.item.matrix = matrix;
27356
+ }
27357
+ }
27358
+ vectorKeys() {
27359
+ return [];
27360
+ }
27361
+ styleKeys() {
27362
+ return {
27363
+ include: [],
27364
+ exclude: ["dashArray", "strokeColor", "fillColor", "strokeWidth"]
27365
+ };
27366
+ }
27367
+ onStyleKeyUpdate(_key) {
27368
+ }
27369
+ editorConfig() {
27370
+ const cfg = new EditorConfig();
27371
+ cfg.resizeModel = () => "four-corner";
27372
+ cfg.uniformScale = () => true;
27373
+ return cfg;
27374
+ }
27375
+ };
27376
+
27363
27377
  // src/model/RenderableModel.ts
27364
27378
  function _defineProperty17(e, r, t) {
27365
27379
  return (r = _toPropertyKey17(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
@@ -27378,11 +27392,11 @@ function _toPrimitive17(t, r) {
27378
27392
  }
27379
27393
  return ("string" === r ? String : Number)(t);
27380
27394
  }
27381
- var RenderableModel = class extends EventEmitter2 {
27395
+ var RenderableModel = class extends EventEmitter {
27382
27396
  get uuid() {
27383
- return uuidv4();
27397
+ return uuidv4().replace(/-/g, "");
27384
27398
  }
27385
- constructor(layerId, shadowEmitter, elements, scope, toolbarModel, userManager, hasPermission) {
27399
+ constructor(layerId, shadowEmitter, elements, scope, toolbarModel, userManager, imageSets, hasPermission) {
27386
27400
  super();
27387
27401
  _defineProperty17(this, "scope", void 0);
27388
27402
  _defineProperty17(this, "toolbarModel", void 0);
@@ -27393,6 +27407,7 @@ var RenderableModel = class extends EventEmitter2 {
27393
27407
  _defineProperty17(this, "maxIndex", -1);
27394
27408
  _defineProperty17(this, "hasPermission", void 0);
27395
27409
  _defineProperty17(this, "shadowEmitter", void 0);
27410
+ _defineProperty17(this, "imageSets", void 0);
27396
27411
  _defineProperty17(this, "onElementsChange", (event) => {
27397
27412
  for (const [key, value] of event.changes.keys.entries()) {
27398
27413
  if (value.action === "add") {
@@ -27408,6 +27423,7 @@ var RenderableModel = class extends EventEmitter2 {
27408
27423
  }
27409
27424
  }
27410
27425
  });
27426
+ this.imageSets = imageSets;
27411
27427
  this.hasPermission = hasPermission;
27412
27428
  this.shadowEmitter = shadowEmitter;
27413
27429
  this.layerId = layerId;
@@ -27467,6 +27483,8 @@ var RenderableModel = class extends EventEmitter2 {
27467
27483
  model = new LaserPointerModel(this.userManager.selfId, yMap, this.scope, (uuid) => {
27468
27484
  this.removeElementItem(uuid);
27469
27485
  });
27486
+ } else if (type === "image") {
27487
+ model = new ImageModel(yMap, this.scope, this.imageSets);
27470
27488
  }
27471
27489
  if (model) {
27472
27490
  model.shadowEmitter = this.shadowEmitter;
@@ -27499,10 +27517,26 @@ var RenderableModel = class extends EventEmitter2 {
27499
27517
  confirmPermission() {
27500
27518
  const hasPermission = this.hasPermission(WhiteboardPermissionFlag.draw);
27501
27519
  if (!hasPermission) {
27502
- console.warn("[@netless/forge-whiteboard] no permission to draw");
27520
+ log("[@netless/forge-whiteboard] no permission to draw", {}, "warning");
27503
27521
  }
27504
27522
  return hasPermission;
27505
27523
  }
27524
+ createImage(src) {
27525
+ if (!this.confirmPermission()) {
27526
+ return;
27527
+ }
27528
+ const model = new ImageModel(new Y12.Map(), this.scope, this.imageSets);
27529
+ model.root.set("src", src);
27530
+ const initMatrix = new this.scope.Matrix();
27531
+ const center = this.scope.project.view.center;
27532
+ initMatrix.translate({
27533
+ x: center.x,
27534
+ y: center.y
27535
+ });
27536
+ model.appendPointsMatrix(initMatrix);
27537
+ model.ownerId = this.userManager.selfId;
27538
+ this.addElementToDoc(model.root);
27539
+ }
27506
27540
  createCurve() {
27507
27541
  let shadow = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
27508
27542
  if (!this.confirmPermission()) {
@@ -27572,7 +27606,7 @@ var RenderableModel = class extends EventEmitter2 {
27572
27606
  return segmentsModel;
27573
27607
  }
27574
27608
  createSelector() {
27575
- let shadow = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
27609
+ let _shadow = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
27576
27610
  if (!this.hasPermission(WhiteboardPermissionFlag.editSelf) && !this.hasPermission(WhiteboardPermissionFlag.deleteOthers)) {
27577
27611
  return null;
27578
27612
  }
@@ -27629,7 +27663,11 @@ var RenderableModel = class extends EventEmitter2 {
27629
27663
  });
27630
27664
  }
27631
27665
  dispose() {
27666
+ removeObserver2(this.elements, this.onElementsChange);
27632
27667
  this.elements.clear();
27668
+ Array.from(this.elementModels.values()).forEach((model) => {
27669
+ model.dispose();
27670
+ });
27633
27671
  }
27634
27672
  };
27635
27673
 
@@ -27672,10 +27710,10 @@ var AnglePrecision = Deg2Rad(2);
27672
27710
  var Phi = 0.5 * (-1 + Math.sqrt(5));
27673
27711
  function DollarRecognizer() {
27674
27712
  this.Unistrokes = new Array(3);
27675
- this.Unistrokes[0] = new Unistroke("triangle", new Array(new Point(137, 139), new Point(135, 141), new Point(133, 144), new Point(132, 146), new Point(130, 149), new Point(128, 151), new Point(126, 155), new Point(123, 160), new Point(120, 166), new Point(116, 171), new Point(112, 177), new Point(107, 183), new Point(102, 188), new Point(100, 191), new Point(95, 195), new Point(90, 199), new Point(86, 203), new Point(82, 206), new Point(80, 209), new Point(75, 213), new Point(73, 213), new Point(70, 216), new Point(67, 219), new Point(64, 221), new Point(61, 223), new Point(60, 225), new Point(62, 226), new Point(65, 225), new Point(67, 226), new Point(74, 226), new Point(77, 227), new Point(85, 229), new Point(91, 230), new Point(99, 231), new Point(108, 232), new Point(116, 233), new Point(125, 233), new Point(134, 234), new Point(145, 233), new Point(153, 232), new Point(160, 233), new Point(170, 234), new Point(177, 235), new Point(179, 236), new Point(186, 237), new Point(193, 238), new Point(198, 239), new Point(200, 237), new Point(202, 239), new Point(204, 238), new Point(206, 234), new Point(205, 230), new Point(202, 222), new Point(197, 216), new Point(192, 207), new Point(186, 198), new Point(179, 189), new Point(174, 183), new Point(170, 178), new Point(164, 171), new Point(161, 168), new Point(154, 160), new Point(148, 155), new Point(143, 150), new Point(138, 148), new Point(136, 148)));
27676
- this.Unistrokes[1] = new Unistroke("rectangle", new Array(new Point(78, 149), new Point(78, 153), new Point(78, 157), new Point(78, 160), new Point(79, 162), new Point(79, 164), new Point(79, 167), new Point(79, 169), new Point(79, 173), new Point(79, 178), new Point(79, 183), new Point(80, 189), new Point(80, 193), new Point(80, 198), new Point(80, 202), new Point(81, 208), new Point(81, 210), new Point(81, 216), new Point(82, 222), new Point(82, 224), new Point(82, 227), new Point(83, 229), new Point(83, 231), new Point(85, 230), new Point(88, 232), new Point(90, 233), new Point(92, 232), new Point(94, 233), new Point(99, 232), new Point(102, 233), new Point(106, 233), new Point(109, 234), new Point(117, 235), new Point(123, 236), new Point(126, 236), new Point(135, 237), new Point(142, 238), new Point(145, 238), new Point(152, 238), new Point(154, 239), new Point(165, 238), new Point(174, 237), new Point(179, 236), new Point(186, 235), new Point(191, 235), new Point(195, 233), new Point(197, 233), new Point(200, 233), new Point(201, 235), new Point(201, 233), new Point(199, 231), new Point(198, 226), new Point(198, 220), new Point(196, 207), new Point(195, 195), new Point(195, 181), new Point(195, 173), new Point(195, 163), new Point(194, 155), new Point(192, 145), new Point(192, 143), new Point(192, 138), new Point(191, 135), new Point(191, 133), new Point(191, 130), new Point(190, 128), new Point(188, 129), new Point(186, 129), new Point(181, 132), new Point(173, 131), new Point(162, 131), new Point(151, 132), new Point(149, 132), new Point(138, 132), new Point(136, 132), new Point(122, 131), new Point(120, 131), new Point(109, 130), new Point(107, 130), new Point(90, 132), new Point(81, 133), new Point(76, 133)));
27677
- this.Unistrokes[2] = new Unistroke("circle", new Array(new Point(127, 141), new Point(124, 140), new Point(120, 139), new Point(118, 139), new Point(116, 139), new Point(111, 140), new Point(109, 141), new Point(104, 144), new Point(100, 147), new Point(96, 152), new Point(93, 157), new Point(90, 163), new Point(87, 169), new Point(85, 175), new Point(83, 181), new Point(82, 190), new Point(82, 195), new Point(83, 200), new Point(84, 205), new Point(88, 213), new Point(91, 216), new Point(96, 219), new Point(103, 222), new Point(108, 224), new Point(111, 224), new Point(120, 224), new Point(133, 223), new Point(142, 222), new Point(152, 218), new Point(160, 214), new Point(167, 210), new Point(173, 204), new Point(178, 198), new Point(179, 196), new Point(182, 188), new Point(182, 177), new Point(178, 167), new Point(170, 150), new Point(163, 138), new Point(152, 130), new Point(143, 129), new Point(140, 131), new Point(129, 136), new Point(126, 139)));
27678
- this.Unistrokes[3] = new Unistroke("arrow", new Array(new Point(68, 222), new Point(70, 220), new Point(73, 218), new Point(75, 217), new Point(77, 215), new Point(80, 213), new Point(82, 212), new Point(84, 210), new Point(87, 209), new Point(89, 208), new Point(92, 206), new Point(95, 204), new Point(101, 201), new Point(106, 198), new Point(112, 194), new Point(118, 191), new Point(124, 187), new Point(127, 186), new Point(132, 183), new Point(138, 181), new Point(141, 180), new Point(146, 178), new Point(154, 173), new Point(159, 171), new Point(161, 170), new Point(166, 167), new Point(168, 167), new Point(171, 166), new Point(174, 164), new Point(177, 162), new Point(180, 160), new Point(182, 158), new Point(183, 156), new Point(181, 154), new Point(178, 153), new Point(171, 153), new Point(164, 153), new Point(160, 153), new Point(150, 154), new Point(147, 155), new Point(141, 157), new Point(137, 158), new Point(135, 158), new Point(137, 158), new Point(140, 157), new Point(143, 156), new Point(151, 154), new Point(160, 152), new Point(170, 149), new Point(179, 147), new Point(185, 145), new Point(192, 144), new Point(196, 144), new Point(198, 144), new Point(200, 144), new Point(201, 147), new Point(199, 149), new Point(194, 157), new Point(191, 160), new Point(186, 167), new Point(180, 176), new Point(177, 179), new Point(171, 187), new Point(169, 189), new Point(165, 194), new Point(164, 196)));
27713
+ this.Unistrokes[0] = new Unistroke("triangle", [new Point(137, 139), new Point(135, 141), new Point(133, 144), new Point(132, 146), new Point(130, 149), new Point(128, 151), new Point(126, 155), new Point(123, 160), new Point(120, 166), new Point(116, 171), new Point(112, 177), new Point(107, 183), new Point(102, 188), new Point(100, 191), new Point(95, 195), new Point(90, 199), new Point(86, 203), new Point(82, 206), new Point(80, 209), new Point(75, 213), new Point(73, 213), new Point(70, 216), new Point(67, 219), new Point(64, 221), new Point(61, 223), new Point(60, 225), new Point(62, 226), new Point(65, 225), new Point(67, 226), new Point(74, 226), new Point(77, 227), new Point(85, 229), new Point(91, 230), new Point(99, 231), new Point(108, 232), new Point(116, 233), new Point(125, 233), new Point(134, 234), new Point(145, 233), new Point(153, 232), new Point(160, 233), new Point(170, 234), new Point(177, 235), new Point(179, 236), new Point(186, 237), new Point(193, 238), new Point(198, 239), new Point(200, 237), new Point(202, 239), new Point(204, 238), new Point(206, 234), new Point(205, 230), new Point(202, 222), new Point(197, 216), new Point(192, 207), new Point(186, 198), new Point(179, 189), new Point(174, 183), new Point(170, 178), new Point(164, 171), new Point(161, 168), new Point(154, 160), new Point(148, 155), new Point(143, 150), new Point(138, 148), new Point(136, 148)]);
27714
+ this.Unistrokes[1] = new Unistroke("rectangle", [new Point(78, 149), new Point(78, 153), new Point(78, 157), new Point(78, 160), new Point(79, 162), new Point(79, 164), new Point(79, 167), new Point(79, 169), new Point(79, 173), new Point(79, 178), new Point(79, 183), new Point(80, 189), new Point(80, 193), new Point(80, 198), new Point(80, 202), new Point(81, 208), new Point(81, 210), new Point(81, 216), new Point(82, 222), new Point(82, 224), new Point(82, 227), new Point(83, 229), new Point(83, 231), new Point(85, 230), new Point(88, 232), new Point(90, 233), new Point(92, 232), new Point(94, 233), new Point(99, 232), new Point(102, 233), new Point(106, 233), new Point(109, 234), new Point(117, 235), new Point(123, 236), new Point(126, 236), new Point(135, 237), new Point(142, 238), new Point(145, 238), new Point(152, 238), new Point(154, 239), new Point(165, 238), new Point(174, 237), new Point(179, 236), new Point(186, 235), new Point(191, 235), new Point(195, 233), new Point(197, 233), new Point(200, 233), new Point(201, 235), new Point(201, 233), new Point(199, 231), new Point(198, 226), new Point(198, 220), new Point(196, 207), new Point(195, 195), new Point(195, 181), new Point(195, 173), new Point(195, 163), new Point(194, 155), new Point(192, 145), new Point(192, 143), new Point(192, 138), new Point(191, 135), new Point(191, 133), new Point(191, 130), new Point(190, 128), new Point(188, 129), new Point(186, 129), new Point(181, 132), new Point(173, 131), new Point(162, 131), new Point(151, 132), new Point(149, 132), new Point(138, 132), new Point(136, 132), new Point(122, 131), new Point(120, 131), new Point(109, 130), new Point(107, 130), new Point(90, 132), new Point(81, 133), new Point(76, 133)]);
27715
+ this.Unistrokes[2] = new Unistroke("circle", [new Point(127, 141), new Point(124, 140), new Point(120, 139), new Point(118, 139), new Point(116, 139), new Point(111, 140), new Point(109, 141), new Point(104, 144), new Point(100, 147), new Point(96, 152), new Point(93, 157), new Point(90, 163), new Point(87, 169), new Point(85, 175), new Point(83, 181), new Point(82, 190), new Point(82, 195), new Point(83, 200), new Point(84, 205), new Point(88, 213), new Point(91, 216), new Point(96, 219), new Point(103, 222), new Point(108, 224), new Point(111, 224), new Point(120, 224), new Point(133, 223), new Point(142, 222), new Point(152, 218), new Point(160, 214), new Point(167, 210), new Point(173, 204), new Point(178, 198), new Point(179, 196), new Point(182, 188), new Point(182, 177), new Point(178, 167), new Point(170, 150), new Point(163, 138), new Point(152, 130), new Point(143, 129), new Point(140, 131), new Point(129, 136), new Point(126, 139)]);
27716
+ this.Unistrokes[3] = new Unistroke("arrow", [new Point(68, 222), new Point(70, 220), new Point(73, 218), new Point(75, 217), new Point(77, 215), new Point(80, 213), new Point(82, 212), new Point(84, 210), new Point(87, 209), new Point(89, 208), new Point(92, 206), new Point(95, 204), new Point(101, 201), new Point(106, 198), new Point(112, 194), new Point(118, 191), new Point(124, 187), new Point(127, 186), new Point(132, 183), new Point(138, 181), new Point(141, 180), new Point(146, 178), new Point(154, 173), new Point(159, 171), new Point(161, 170), new Point(166, 167), new Point(168, 167), new Point(171, 166), new Point(174, 164), new Point(177, 162), new Point(180, 160), new Point(182, 158), new Point(183, 156), new Point(181, 154), new Point(178, 153), new Point(171, 153), new Point(164, 153), new Point(160, 153), new Point(150, 154), new Point(147, 155), new Point(141, 157), new Point(137, 158), new Point(135, 158), new Point(137, 158), new Point(140, 157), new Point(143, 156), new Point(151, 154), new Point(160, 152), new Point(170, 149), new Point(179, 147), new Point(185, 145), new Point(192, 144), new Point(196, 144), new Point(198, 144), new Point(200, 144), new Point(201, 147), new Point(199, 149), new Point(194, 157), new Point(191, 160), new Point(186, 167), new Point(180, 176), new Point(177, 179), new Point(171, 187), new Point(169, 189), new Point(165, 194), new Point(164, 196)]);
27679
27717
  this.Recognize = function(points, useProtractor) {
27680
27718
  var t0 = Date.now();
27681
27719
  var candidate = new Unistroke("", points);
@@ -27736,7 +27774,7 @@ function RotateBy(points, radians) {
27736
27774
  var c = Centroid(points);
27737
27775
  var cos = Math.cos(radians);
27738
27776
  var sin = Math.sin(radians);
27739
- var newpoints = new Array();
27777
+ var newpoints = [];
27740
27778
  for (var i = 0; i < points.length; i++) {
27741
27779
  var qx = (points[i].X - c.X) * cos - (points[i].Y - c.Y) * sin + c.X;
27742
27780
  var qy = (points[i].X - c.X) * sin + (points[i].Y - c.Y) * cos + c.Y;
@@ -27746,7 +27784,7 @@ function RotateBy(points, radians) {
27746
27784
  }
27747
27785
  function ScaleTo(points, size) {
27748
27786
  var B2 = BoundingBox(points);
27749
- var newpoints = new Array();
27787
+ var newpoints = [];
27750
27788
  for (var i = 0; i < points.length; i++) {
27751
27789
  var qx = points[i].X * (size / B2.Width);
27752
27790
  var qy = points[i].Y * (size / B2.Height);
@@ -27756,7 +27794,7 @@ function ScaleTo(points, size) {
27756
27794
  }
27757
27795
  function TranslateTo(points, pt) {
27758
27796
  var c = Centroid(points);
27759
- var newpoints = new Array();
27797
+ var newpoints = [];
27760
27798
  for (var i = 0; i < points.length; i++) {
27761
27799
  var qx = points[i].X + pt.X - c.X;
27762
27800
  var qy = points[i].Y + pt.Y - c.Y;
@@ -27766,14 +27804,14 @@ function TranslateTo(points, pt) {
27766
27804
  }
27767
27805
  function Vectorize(points) {
27768
27806
  var sum = 0;
27769
- var vector = new Array();
27770
- for (var i = 0; i < points.length; i++) {
27807
+ var vector = [];
27808
+ for (let i = 0; i < points.length; i++) {
27771
27809
  vector[vector.length] = points[i].X;
27772
27810
  vector[vector.length] = points[i].Y;
27773
27811
  sum += points[i].X * points[i].X + points[i].Y * points[i].Y;
27774
27812
  }
27775
27813
  var magnitude = Math.sqrt(sum);
27776
- for (var i = 0; i < vector.length; i++)
27814
+ for (let i = 0; i < vector.length; i++)
27777
27815
  vector[i] /= magnitude;
27778
27816
  return vector;
27779
27817
  }
@@ -27927,17 +27965,35 @@ var CurveTool = class extends WhiteboardTool {
27927
27965
  _defineProperty19(this, "pointCount", 0);
27928
27966
  this.tool.minDistance = 1;
27929
27967
  }
27930
- onMouseDown(event) {
27968
+ onMouseDown(_event) {
27931
27969
  this.pointCount = 0;
27970
+ if (this.elementModel) {
27971
+ this.elementModel.dispose();
27972
+ }
27932
27973
  this.elementModel = this.modelGetter().createCurve(true);
27933
27974
  }
27934
27975
  onMouseDrag(event) {
27935
27976
  if (this.pointCount > 1024) {
27936
27977
  return;
27937
27978
  }
27979
+ const MIN_DISTANCE = 4;
27938
27980
  if (this.elementModel) {
27939
- this.pointCount += 1;
27940
- this.elementModel.appendPoints([Math.round(event.point.x), Math.round(event.point.y)]);
27981
+ const len = this.elementModel.points.length;
27982
+ let last = {
27983
+ x: 0,
27984
+ y: 0
27985
+ };
27986
+ if (len >= 2) {
27987
+ last = {
27988
+ x: this.elementModel.points[len - 2],
27989
+ y: this.elementModel.points[len - 1]
27990
+ };
27991
+ }
27992
+ const dist = Math.max(Math.abs(last.x - event.point.x), Math.abs(last.y - event.point.y));
27993
+ if (dist >= MIN_DISTANCE) {
27994
+ this.pointCount += 1;
27995
+ this.elementModel.appendPoints([Math.round(event.point.x), Math.round(event.point.y)]);
27996
+ }
27941
27997
  }
27942
27998
  }
27943
27999
  onMouseUp(event) {
@@ -27999,6 +28055,9 @@ var RectangleTool = class extends WhiteboardTool {
27999
28055
  this.tool.minDistance = 1;
28000
28056
  }
28001
28057
  onMouseDown(event) {
28058
+ if (this.elementModel) {
28059
+ this.elementModel.dispose();
28060
+ }
28002
28061
  this.elementModel = this.modelGetter().createRectangle(true);
28003
28062
  this.from = event.point.clone();
28004
28063
  this.to = event.point.clone();
@@ -28020,7 +28079,8 @@ var RectangleTool = class extends WhiteboardTool {
28020
28079
  };
28021
28080
 
28022
28081
  // src/model/ToolbarModel.ts
28023
- import EventEmitter3 from "eventemitter3";
28082
+ import EventEmitter2 from "eventemitter3";
28083
+ import { removeObserver as removeObserver3 } from "@netless/forge-room";
28024
28084
  function _defineProperty21(e, r, t) {
28025
28085
  return (r = _toPropertyKey21(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
28026
28086
  }
@@ -28047,7 +28107,7 @@ var TOOLBAR_KEYS = {
28047
28107
  strokeWidth: "strokeWidth",
28048
28108
  dashArray: "dashArray"
28049
28109
  };
28050
- var ToolbarModel = class extends EventEmitter3 {
28110
+ var ToolbarModel = class extends EventEmitter2 {
28051
28111
  get currentTool() {
28052
28112
  return this.root.get(TOOLBAR_KEYS.tool);
28053
28113
  }
@@ -28116,6 +28176,10 @@ var ToolbarModel = class extends EventEmitter3 {
28116
28176
  }
28117
28177
  });
28118
28178
  }
28179
+ dispose() {
28180
+ removeObserver3(this.root, this.handleRootUpdate);
28181
+ this.removeAllListeners();
28182
+ }
28119
28183
  };
28120
28184
 
28121
28185
  // src/tool/SelectorTool.ts
@@ -28149,6 +28213,9 @@ var SelectorTool = class extends WhiteboardTool {
28149
28213
  onMouseDown(event) {
28150
28214
  this.from = null;
28151
28215
  this.to = null;
28216
+ if (this.elementModel) {
28217
+ this.elementModel.dispose();
28218
+ }
28152
28219
  this.elementModel = this.modelGetter().createSelector();
28153
28220
  this.from = event.point.clone();
28154
28221
  this.to = event.point.clone();
@@ -28198,7 +28265,8 @@ var SelectorTool = class extends WhiteboardTool {
28198
28265
 
28199
28266
  // src/model/SelectElementsModel.ts
28200
28267
  import * as Y13 from "yjs";
28201
- import EventEmitter4 from "eventemitter3";
28268
+ import EventEmitter3 from "eventemitter3";
28269
+ import { removeDeepObserver as removeDeepObserver2 } from "@netless/forge-room";
28202
28270
 
28203
28271
  // src/WhiteboardKeys.ts
28204
28272
  var WhiteboardKeys = {
@@ -28229,7 +28297,7 @@ function _toPrimitive23(t, r) {
28229
28297
  }
28230
28298
  return ("string" === r ? String : Number)(t);
28231
28299
  }
28232
- var SelectElementsModel = class extends EventEmitter4 {
28300
+ var SelectElementsModel = class extends EventEmitter3 {
28233
28301
  get hasEditSelfPermission() {
28234
28302
  return this.hasPermission(WhiteboardPermissionFlag.editSelf);
28235
28303
  }
@@ -28245,13 +28313,17 @@ var SelectElementsModel = class extends EventEmitter4 {
28245
28313
  _defineProperty23(this, "handleUserLeave", (user) => {
28246
28314
  const cb = this.observers.get(user.id);
28247
28315
  if (cb) {
28248
- this.requestUserMap(user.id).unobserveDeep(cb);
28316
+ removeDeepObserver2(this.requestUserMap(user.id), cb);
28317
+ this.observers.delete(user.id);
28249
28318
  }
28250
28319
  });
28251
28320
  _defineProperty23(this, "handleUserJoin", (user) => {
28252
28321
  const observer = (evts) => {
28253
28322
  this.handleUserSelectElementsChange(user.id, evts);
28254
28323
  };
28324
+ if (this.observers.has(user.id)) {
28325
+ removeDeepObserver2(this.requestUserMap(user.id), this.observers.get(user.id));
28326
+ }
28255
28327
  this.requestUserMap(user.id).observeDeep(observer);
28256
28328
  this.observers.set(user.id, observer);
28257
28329
  });
@@ -28271,6 +28343,9 @@ var SelectElementsModel = class extends EventEmitter4 {
28271
28343
  const observer = (evts) => {
28272
28344
  this.handleUserSelectElementsChange(userId, evts);
28273
28345
  };
28346
+ if (this.observers.has(userId)) {
28347
+ removeDeepObserver2(this.requestUserMap(userId), this.observers.get(userId));
28348
+ }
28274
28349
  this.requestUserMap(userId).observeDeep(observer);
28275
28350
  this.observers.set(userId, observer);
28276
28351
  });
@@ -28325,12 +28400,9 @@ var SelectElementsModel = class extends EventEmitter4 {
28325
28400
  });
28326
28401
  }
28327
28402
  dispose() {
28328
- this.userManager.userIdList().forEach((userId) => {
28329
- const cb = this.observers.get(userId);
28330
- if (cb) {
28331
- this.requestUserMap(userId).unobserveDeep(cb);
28332
- }
28333
- });
28403
+ for (const [key, value] of this.observers.entries()) {
28404
+ removeDeepObserver2(this.requestUserMap(key), value);
28405
+ }
28334
28406
  this.observers.clear();
28335
28407
  this.userManager.off("leave", this.handleUserLeave);
28336
28408
  this.userManager.off("join", this.handleUserJoin);
@@ -28338,10 +28410,10 @@ var SelectElementsModel = class extends EventEmitter4 {
28338
28410
  };
28339
28411
 
28340
28412
  // src/edit/Editor.ts
28341
- import EventEmitter6 from "eventemitter3";
28413
+ import EventEmitter5 from "eventemitter3";
28342
28414
 
28343
28415
  // src/edit/TextEditor.ts
28344
- import { EventEmitter as EventEmitter5 } from "eventemitter3";
28416
+ import { EventEmitter as EventEmitter4 } from "eventemitter3";
28345
28417
  function _defineProperty24(e, r, t) {
28346
28418
  return (r = _toPropertyKey24(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
28347
28419
  }
@@ -28359,7 +28431,7 @@ function _toPrimitive24(t, r) {
28359
28431
  }
28360
28432
  return ("string" === r ? String : Number)(t);
28361
28433
  }
28362
- var TextEditor = class extends EventEmitter5 {
28434
+ var TextEditor = class extends EventEmitter4 {
28363
28435
  constructor(camera) {
28364
28436
  super();
28365
28437
  _defineProperty24(this, "rootView", void 0);
@@ -28392,12 +28464,12 @@ var TextEditor = class extends EventEmitter5 {
28392
28464
  });
28393
28465
  this.camera = camera;
28394
28466
  this.rootView = document.createElement("div");
28395
- this.rootView.style.cssText = `position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden;`;
28467
+ this.rootView.style.cssText = "position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden;";
28396
28468
  this.content = document.createElement("div");
28397
28469
  this.content.setAttribute("spellcheck", "false");
28398
28470
  this.content.textContent = "";
28399
28471
  this.content.setAttribute("contenteditable", "plaintext-only");
28400
- this.content.style.cssText = `white-space: nowrap;border:1px solid red;text-wrap:nowrap;caret-color:red;line-height:1.2em;position:absolute;z-index:2;color:transparent;outline:none;`;
28472
+ this.content.style.cssText = "white-space: nowrap;border:1px solid red;text-wrap:nowrap;caret-color:red;line-height:1.2em;position:absolute;z-index:2;color:transparent;outline:none;";
28401
28473
  this.content.style.transformOrigin = "0 0";
28402
28474
  this.rootView.appendChild(this.content);
28403
28475
  this.content.addEventListener("input", this.handleContentInput);
@@ -28502,7 +28574,7 @@ var ANCHOR_STYLE = {
28502
28574
  b: "cursor:s-resize;bottom:-3px;left:50%;translate:-50%;",
28503
28575
  br: "cursor:se-resize;bottom:-3px;right:-3px"
28504
28576
  };
28505
- var Bounds = class extends EventEmitter6 {
28577
+ var Bounds = class extends EventEmitter5 {
28506
28578
  get width() {
28507
28579
  return this.maxX - this.minX;
28508
28580
  }
@@ -28641,7 +28713,7 @@ var Bounds = class extends EventEmitter6 {
28641
28713
  this.maxY = maxY;
28642
28714
  }
28643
28715
  };
28644
- var Editor = class extends EventEmitter6 {
28716
+ var Editor = class extends EventEmitter5 {
28645
28717
  constructor(scope, shadowScope, shadowEmitter, canvasElement, camera, initConfig) {
28646
28718
  super();
28647
28719
  _defineProperty25(this, "rootView", void 0);
@@ -28742,7 +28814,7 @@ var Editor = class extends EventEmitter6 {
28742
28814
  }
28743
28815
  if (this.editMode === "matrix" && this.editAnchor && this.lastEditPoint) {
28744
28816
  const offsetX = evt.pageX - this.lastEditPoint.x;
28745
- let offsetY = evt.pageY - this.lastEditPoint.y;
28817
+ const offsetY = evt.pageY - this.lastEditPoint.y;
28746
28818
  this.bounds.offsetBy(this.editAnchor, offsetX, offsetY, this.uniformScale ? this.aspectRatio : -1);
28747
28819
  this.lastEditPoint = {
28748
28820
  x: evt.pageX,
@@ -28767,7 +28839,7 @@ var Editor = class extends EventEmitter6 {
28767
28839
  }
28768
28840
  if (this.editMode === "translate" && this.lastEditPoint) {
28769
28841
  const offsetX = evt.pageX - this.lastEditPoint.x;
28770
- let offsetY = evt.pageY - this.lastEditPoint.y;
28842
+ const offsetY = evt.pageY - this.lastEditPoint.y;
28771
28843
  this.bounds.translate(offsetX, offsetY);
28772
28844
  this.updateBoundsByShadow();
28773
28845
  this.lastEditPoint = {
@@ -28844,7 +28916,7 @@ var Editor = class extends EventEmitter6 {
28844
28916
  this.ctrlId = initConfig.ctrlId;
28845
28917
  this.ctrlNickName = initConfig.ctrlNickName;
28846
28918
  this.rootView = document.createElement("div");
28847
- this.rootView.style.cssText = `position:absolute;display:none;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);`;
28919
+ this.rootView.style.cssText = "overflow:hidden;position:absolute;display:none;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);";
28848
28920
  this.frame = document.createElement("div");
28849
28921
  this.frame.style.position = "absolute";
28850
28922
  this.frame.style.padding = "8px";
@@ -28865,7 +28937,7 @@ var Editor = class extends EventEmitter6 {
28865
28937
  } else {
28866
28938
  this.title = document.createElement("div");
28867
28939
  this.title.textContent = `${this.ctrlNickName}`;
28868
- this.title.style.cssText = `color:#fff;font-size:12px;padding: 0.2em 0.4em;border-radius: 0.4em;position: absolute;top: 0%;left: 0;margin: -0.4em;transform: translate(-100%, -100%);`;
28940
+ this.title.style.cssText = "color:#fff;font-size:12px;padding: 0.2em 0.4em;border-radius: 0.4em;position: absolute;top: 0%;left: 0;margin: -0.4em;transform: translate(-100%, -100%);";
28869
28941
  this.frame.appendChild(this.title);
28870
28942
  this.rootView.style.pointerEvents = "none";
28871
28943
  }
@@ -29037,7 +29109,9 @@ var Editor = class extends EventEmitter6 {
29037
29109
  this.targets = [];
29038
29110
  this.editorConfig = null;
29039
29111
  if (this.ctrlId !== this.viewerId) {
29040
- this.scope.project.view.off("frame", this.updateBounds);
29112
+ if (this.scope.project.view) {
29113
+ this.scope.project.view.off("frame", this.updateBounds);
29114
+ }
29041
29115
  }
29042
29116
  }
29043
29117
  show() {
@@ -29096,7 +29170,7 @@ var TextTool = class extends WhiteboardTool {
29096
29170
  onMouseDown(event) {
29097
29171
  this.from = event.point.clone();
29098
29172
  }
29099
- onMouseDrag(event) {
29173
+ onMouseDrag(_event) {
29100
29174
  }
29101
29175
  onMouseUp(event) {
29102
29176
  this.to = event.point.clone();
@@ -29108,6 +29182,9 @@ var TextTool = class extends WhiteboardTool {
29108
29182
  }
29109
29183
  }
29110
29184
  createPointEditor(x, y) {
29185
+ if (this.elementModel) {
29186
+ this.elementModel.dispose();
29187
+ }
29111
29188
  this.elementModel = this.modelGetter().createPointText(x, y, true);
29112
29189
  if (this.elementModel === null) {
29113
29190
  return;
@@ -29148,10 +29225,10 @@ var TextTool = class extends WhiteboardTool {
29148
29225
  };
29149
29226
 
29150
29227
  // src/Camera.ts
29151
- import EventEmitter8 from "eventemitter3";
29228
+ import EventEmitter7 from "eventemitter3";
29152
29229
 
29153
29230
  // src/Gesture.ts
29154
- import EventEmitter7 from "eventemitter3";
29231
+ import EventEmitter6 from "eventemitter3";
29155
29232
  function _defineProperty27(e, r, t) {
29156
29233
  return (r = _toPropertyKey27(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29157
29234
  }
@@ -29169,7 +29246,7 @@ function _toPrimitive27(t, r) {
29169
29246
  }
29170
29247
  return ("string" === r ? String : Number)(t);
29171
29248
  }
29172
- var Gesture = class extends EventEmitter7 {
29249
+ var Gesture = class extends EventEmitter6 {
29173
29250
  constructor(element, scope) {
29174
29251
  super();
29175
29252
  _defineProperty27(this, "element", void 0);
@@ -29233,6 +29310,7 @@ var Gesture = class extends EventEmitter7 {
29233
29310
  };
29234
29311
 
29235
29312
  // src/Camera.ts
29313
+ import { removeObserver as removeObserver4 } from "@netless/forge-room";
29236
29314
  function _defineProperty28(e, r, t) {
29237
29315
  return (r = _toPropertyKey28(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29238
29316
  }
@@ -29250,7 +29328,7 @@ function _toPrimitive28(t, r) {
29250
29328
  }
29251
29329
  return ("string" === r ? String : Number)(t);
29252
29330
  }
29253
- var Camera = class extends EventEmitter8 {
29331
+ var Camera = class extends EventEmitter7 {
29254
29332
  get inherentMatrix() {
29255
29333
  const inherentMatrix = new this.scope.Matrix();
29256
29334
  inherentMatrix.scale(this.inherentScale, [0, 0]);
@@ -29306,13 +29384,16 @@ var Camera = class extends EventEmitter8 {
29306
29384
  _defineProperty28(this, "handleUserLeave", (user) => {
29307
29385
  const cb = this.observers.get(user.id);
29308
29386
  if (cb) {
29309
- this.requestUserMap(user.id).unobserve(cb);
29387
+ removeObserver4(this.requestUserMap(user.id), cb);
29310
29388
  }
29311
29389
  });
29312
29390
  _defineProperty28(this, "handleUserJoin", (user) => {
29313
29391
  const observer = (evt) => {
29314
29392
  this.handleViewMatrixUpdate(user.id, evt);
29315
29393
  };
29394
+ if (this.observers.has(user.id)) {
29395
+ removeObserver4(this.requestUserMap(user.id), observer);
29396
+ }
29316
29397
  this.requestUserMap(user.id).observe(observer);
29317
29398
  this.observers.set(user.id, observer);
29318
29399
  });
@@ -29392,7 +29473,7 @@ var Camera = class extends EventEmitter8 {
29392
29473
  });
29393
29474
  this.maxScale = maxScale;
29394
29475
  this.bound = window.document.createElement("div");
29395
- this.bound.style.cssText = `transition: box-shadow 100ms;pointer-events:none;z-index:99;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);`;
29476
+ this.bound.style.cssText = "transition: box-shadow 100ms;pointer-events:none;z-index:99;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);";
29396
29477
  this.initSize = initSize;
29397
29478
  this.hasPermission = hasPermission;
29398
29479
  this.paperSize = _paperSize;
@@ -29417,6 +29498,9 @@ var Camera = class extends EventEmitter8 {
29417
29498
  const observer = (evt) => {
29418
29499
  this.handleViewMatrixUpdate(userId, evt);
29419
29500
  };
29501
+ if (this.observers.has(userId)) {
29502
+ removeObserver4(this.requestUserMap(userId), observer);
29503
+ }
29420
29504
  this.requestUserMap(userId).observe(observer);
29421
29505
  this.observers.set(userId, observer);
29422
29506
  });
@@ -29453,7 +29537,7 @@ var Camera = class extends EventEmitter8 {
29453
29537
  this.bound.style.boxShadow = `inset 0px 0px 6px 2px ${this.boundaryColor}`;
29454
29538
  window.clearTimeout(this.boundTiemoutId);
29455
29539
  this.boundTiemoutId = window.setTimeout(() => {
29456
- this.bound.style.boxShadow = `none`;
29540
+ this.bound.style.boxShadow = "none";
29457
29541
  }, 100);
29458
29542
  }
29459
29543
  }
@@ -29463,6 +29547,9 @@ var Camera = class extends EventEmitter8 {
29463
29547
  updateInherentScale(scale) {
29464
29548
  this.inherentScale = scale;
29465
29549
  }
29550
+ getInherentScale() {
29551
+ return this.inherentScale;
29552
+ }
29466
29553
  getActiveMatrix() {
29467
29554
  const cameraMode = this.requestUserMap(this.userManager.selfId).get(WhiteboardKeys.cameraMode);
29468
29555
  let matrixValue;
@@ -29605,6 +29692,19 @@ var Camera = class extends EventEmitter8 {
29605
29692
  y: 0
29606
29693
  };
29607
29694
  }
29695
+ dispose() {
29696
+ Array.from(this.observers.keys()).forEach((userId) => {
29697
+ const cb = this.observers.get(userId);
29698
+ if (cb) {
29699
+ removeObserver4(this.requestUserMap(userId), cb);
29700
+ }
29701
+ });
29702
+ removeObserver4(this.whiteboardAttrsMap, this.handleMainCameraChange);
29703
+ this.userManager.off("join", this.handleUserJoin);
29704
+ this.userManager.off("leave", this.handleUserLeave);
29705
+ this.gesture.removeAllListeners();
29706
+ this.removeAllListeners();
29707
+ }
29608
29708
  };
29609
29709
 
29610
29710
  // src/tool/EllipseTool.ts
@@ -29634,6 +29734,9 @@ var EllipseTool = class extends WhiteboardTool {
29634
29734
  this.tool.minDistance = 1;
29635
29735
  }
29636
29736
  onMouseDown(event) {
29737
+ if (this.elementModel) {
29738
+ this.elementModel.dispose();
29739
+ }
29637
29740
  this.elementModel = this.modelGetter().createSegmentedPath("ellipse", true);
29638
29741
  this.from = event.point.clone();
29639
29742
  this.to = event.point.clone();
@@ -29685,6 +29788,9 @@ var TriangleTool = class extends WhiteboardTool {
29685
29788
  this.tool.minDistance = 1;
29686
29789
  }
29687
29790
  onMouseDown(event) {
29791
+ if (this.elementModel) {
29792
+ this.elementModel.dispose();
29793
+ }
29688
29794
  this.elementModel = this.modelGetter().createTriangle(true);
29689
29795
  this.from = event.point.clone();
29690
29796
  this.to = event.point.clone();
@@ -29706,7 +29812,7 @@ var TriangleTool = class extends WhiteboardTool {
29706
29812
  };
29707
29813
 
29708
29814
  // src/Whiteboard.ts
29709
- import EventEmitter9 from "eventemitter3";
29815
+ import EventEmitter8 from "eventemitter3";
29710
29816
  function _defineProperty31(e, r, t) {
29711
29817
  return (r = _toPropertyKey31(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29712
29818
  }
@@ -29724,8 +29830,7 @@ function _toPrimitive31(t, r) {
29724
29830
  }
29725
29831
  return ("string" === r ? String : Number)(t);
29726
29832
  }
29727
- var Whiteboard = class extends EventEmitter9 {
29728
- // public insertImage!: (src: string) => void;
29833
+ var Whiteboard = class extends EventEmitter8 {
29729
29834
  constructor(view) {
29730
29835
  super();
29731
29836
  _defineProperty31(this, "view", void 0);
@@ -29744,6 +29849,7 @@ var Whiteboard = class extends EventEmitter9 {
29744
29849
  _defineProperty31(this, "enableCameraBoundaryHighlight", void 0);
29745
29850
  _defineProperty31(this, "getElementAttribute", void 0);
29746
29851
  _defineProperty31(this, "setElementAttribute", void 0);
29852
+ _defineProperty31(this, "removeElement", void 0);
29747
29853
  _defineProperty31(this, "getCurrentTool", void 0);
29748
29854
  _defineProperty31(this, "setCurrentTool", void 0);
29749
29855
  _defineProperty31(this, "setCanvasBackgroundColor", void 0);
@@ -29770,6 +29876,7 @@ var Whiteboard = class extends EventEmitter9 {
29770
29876
  _defineProperty31(this, "rasterizeElementsBounds", void 0);
29771
29877
  _defineProperty31(this, "rasterizeMaxBounds", void 0);
29772
29878
  _defineProperty31(this, "setInputType", void 0);
29879
+ _defineProperty31(this, "insertImage", void 0);
29773
29880
  this.view = view;
29774
29881
  }
29775
29882
  };
@@ -29801,8 +29908,11 @@ var EraserTool = class extends WhiteboardTool {
29801
29908
  this.trashedElementsModel = trashedElementsModel;
29802
29909
  this.tool.minDistance = 1;
29803
29910
  }
29804
- onMouseDown(event) {
29911
+ onMouseDown(_event) {
29805
29912
  this.pointCount = 0;
29913
+ if (this.elementModel) {
29914
+ this.elementModel.dispose();
29915
+ }
29806
29916
  this.elementModel = this.modelGetter().createEraser();
29807
29917
  }
29808
29918
  onMouseDrag(event) {
@@ -29824,7 +29934,7 @@ var EraserTool = class extends WhiteboardTool {
29824
29934
  }
29825
29935
  });
29826
29936
  }
29827
- onMouseUp(event) {
29937
+ onMouseUp(_event) {
29828
29938
  if (this.elementModel) {
29829
29939
  this.modelGetter().removeElementItem(this.elementModel.uuid);
29830
29940
  }
@@ -29834,7 +29944,8 @@ var EraserTool = class extends WhiteboardTool {
29834
29944
 
29835
29945
  // src/model/TrashedElementsModel.ts
29836
29946
  import * as Y14 from "yjs";
29837
- import EventEmitter10 from "eventemitter3";
29947
+ import EventEmitter9 from "eventemitter3";
29948
+ import { removeDeepObserver as removeDeepObserver3 } from "@netless/forge-room";
29838
29949
  function _defineProperty33(e, r, t) {
29839
29950
  return (r = _toPropertyKey33(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29840
29951
  }
@@ -29852,7 +29963,7 @@ function _toPrimitive33(t, r) {
29852
29963
  }
29853
29964
  return ("string" === r ? String : Number)(t);
29854
29965
  }
29855
- var TrashedElementsModel = class extends EventEmitter10 {
29966
+ var TrashedElementsModel = class extends EventEmitter9 {
29856
29967
  get hasDeleteSelfPermission() {
29857
29968
  return this.hasPermission(WhiteboardPermissionFlag.deleteSelf);
29858
29969
  }
@@ -29868,13 +29979,16 @@ var TrashedElementsModel = class extends EventEmitter10 {
29868
29979
  _defineProperty33(this, "handleUserLeave", (user) => {
29869
29980
  const cb = this.observers.get(user.id);
29870
29981
  if (cb) {
29871
- this.requestUserMap(user.id).unobserveDeep(cb);
29982
+ removeDeepObserver3(this.requestUserMap(user.id), cb);
29872
29983
  }
29873
29984
  });
29874
29985
  _defineProperty33(this, "handleUserJoin", (user) => {
29875
29986
  const observer = (evts) => {
29876
29987
  this.handleUserTrashElementsChange(user.id, evts);
29877
29988
  };
29989
+ if (this.observers.has(user.id)) {
29990
+ removeDeepObserver3(this.requestUserMap(user.id), this.observers.get(user.id));
29991
+ }
29878
29992
  this.requestUserMap(user.id).observeDeep(observer);
29879
29993
  this.observers.set(user.id, observer);
29880
29994
  });
@@ -29886,6 +30000,9 @@ var TrashedElementsModel = class extends EventEmitter10 {
29886
30000
  const observer = (evts) => {
29887
30001
  this.handleUserTrashElementsChange(userId, evts);
29888
30002
  };
30003
+ if (this.observers.has(userId)) {
30004
+ removeDeepObserver3(this.requestUserMap(userId), userId);
30005
+ }
29889
30006
  this.requestUserMap(userId).observeDeep(observer);
29890
30007
  this.observers.set(userId, observer);
29891
30008
  });
@@ -29940,12 +30057,9 @@ var TrashedElementsModel = class extends EventEmitter10 {
29940
30057
  });
29941
30058
  }
29942
30059
  dispose() {
29943
- this.userManager.userIdList().forEach((userId) => {
29944
- const cb = this.observers.get(userId);
29945
- if (cb) {
29946
- this.requestUserMap(userId).unobserveDeep(cb);
29947
- }
29948
- });
30060
+ for (const [key, value] of this.observers.entries()) {
30061
+ removeDeepObserver3(this.requestUserMap(key), value);
30062
+ }
29949
30063
  this.observers.clear();
29950
30064
  this.userManager.off("leave", this.handleUserLeave);
29951
30065
  this.userManager.off("join", this.handleUserJoin);
@@ -29977,8 +30091,11 @@ var LaserPointerTool = class extends WhiteboardTool {
29977
30091
  _defineProperty34(this, "pointCount", 0);
29978
30092
  this.tool.minDistance = 5;
29979
30093
  }
29980
- onMouseDown(event) {
30094
+ onMouseDown(_event) {
29981
30095
  this.pointCount = 0;
30096
+ if (this.elementModel) {
30097
+ this.elementModel.dispose();
30098
+ }
29982
30099
  this.elementModel = this.modelGetter().createLaserPointer();
29983
30100
  }
29984
30101
  onMouseDrag(event) {
@@ -29990,7 +30107,7 @@ var LaserPointerTool = class extends WhiteboardTool {
29990
30107
  this.elementModel.appendPoints([event.point.x, event.point.y]);
29991
30108
  }
29992
30109
  }
29993
- onMouseUp(event) {
30110
+ onMouseUp(_event) {
29994
30111
  if (this.elementModel) {
29995
30112
  this.elementModel.beginRemoveAnimate();
29996
30113
  }
@@ -29998,8 +30115,8 @@ var LaserPointerTool = class extends WhiteboardTool {
29998
30115
  };
29999
30116
 
30000
30117
  // src/model/PageModel.ts
30001
- import EventEmitter11 from "eventemitter3";
30002
- import { log } from "@netless/forge-room";
30118
+ import EventEmitter10 from "eventemitter3";
30119
+ import { log as log2, removeObserver as removeObserver5 } from "@netless/forge-room";
30003
30120
  function _defineProperty35(e, r, t) {
30004
30121
  return (r = _toPropertyKey35(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30005
30122
  }
@@ -30017,7 +30134,7 @@ function _toPrimitive35(t, r) {
30017
30134
  }
30018
30135
  return ("string" === r ? String : Number)(t);
30019
30136
  }
30020
- var PageModel = class extends EventEmitter11 {
30137
+ var PageModel = class extends EventEmitter10 {
30021
30138
  constructor(whiteboardAttrsMap, userManager, requestUserMap, pageMap, hasPermission) {
30022
30139
  super();
30023
30140
  _defineProperty35(this, "whiteboardAttrsMap", void 0);
@@ -30029,7 +30146,7 @@ var PageModel = class extends EventEmitter11 {
30029
30146
  _defineProperty35(this, "handleUserLeave", (user) => {
30030
30147
  const cb = this.observers.get(user.id);
30031
30148
  if (cb) {
30032
- this.requestUserMap(user.id).unobserve(cb);
30149
+ removeObserver5(this.requestUserMap(user.id), cb);
30033
30150
  }
30034
30151
  });
30035
30152
  _defineProperty35(this, "handleUserJoin", (user) => {
@@ -30043,7 +30160,7 @@ var PageModel = class extends EventEmitter11 {
30043
30160
  if (cameraMode === "main") {
30044
30161
  const targetPage = this.whiteboardAttrsMap.get(WhiteboardKeys.currentPage);
30045
30162
  if (!this.pageMap.has(targetPage) && targetPage !== "_i_") {
30046
- log(`main page {${targetPage}} not found.`, {}, "error");
30163
+ log2(`main page {${targetPage}} not found.`, {}, "error");
30047
30164
  return;
30048
30165
  }
30049
30166
  this.requestUserMap(this.userManager.selfId).set(WhiteboardKeys.currentPage, targetPage);
@@ -30112,11 +30229,11 @@ var PageModel = class extends EventEmitter11 {
30112
30229
  }
30113
30230
  const cameraMode = this.requestUserMap(this.userManager.selfId).get(WhiteboardKeys.cameraMode);
30114
30231
  if (cameraMode !== "main") {
30115
- console.warn(`cannot modify pages in non-main view mode.`);
30232
+ console.warn("cannot modify pages in non-main view mode.");
30116
30233
  return false;
30117
30234
  }
30118
30235
  if (!this.hasPermission(WhiteboardPermissionFlag.mainView)) {
30119
- console.warn(`cannot modify pages without WhiteboardPermissionFlag.mainView.`);
30236
+ console.warn("cannot modify pages without WhiteboardPermissionFlag.mainView.");
30120
30237
  return false;
30121
30238
  }
30122
30239
  return true;
@@ -30168,21 +30285,31 @@ var PageModel = class extends EventEmitter11 {
30168
30285
  }
30169
30286
  }
30170
30287
  }
30288
+ dispose() {
30289
+ for (const entry of this.observers.entries()) {
30290
+ const [userId, observer] = entry;
30291
+ removeObserver5(this.requestUserMap(userId), observer);
30292
+ }
30293
+ this.userManager.off("join", this.handleUserJoin);
30294
+ this.userManager.off("leave", this.handleUserLeave);
30295
+ removeObserver5(this.whiteboardAttrsMap, this.handleMainPageChange);
30296
+ removeObserver5(this.pageMap, this.handlePageMapChange);
30297
+ }
30171
30298
  };
30172
30299
 
30173
30300
  // src/utils/async.ts
30174
30301
  var delay = (value) => new Promise((resolve) => setTimeout(resolve, value));
30175
30302
  async function waitUntil(fn, timeout) {
30176
- let start = Date.now();
30303
+ const start = Date.now();
30177
30304
  while (!fn() && Date.now() - start < timeout) {
30178
30305
  await delay(50);
30179
- start = Date.now();
30180
30306
  }
30181
30307
  }
30182
30308
 
30183
30309
  // src/IndexedNavigation.ts
30184
- import EventEmitter12 from "eventemitter3";
30185
- import { log as log2 } from "@netless/forge-room";
30310
+ import EventEmitter11 from "eventemitter3";
30311
+ import { log as log3 } from "@netless/forge-room";
30312
+ import { removeObserver as removeObserver6 } from "@netless/forge-room";
30186
30313
  function _defineProperty36(e, r, t) {
30187
30314
  return (r = _toPropertyKey36(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30188
30315
  }
@@ -30200,19 +30327,19 @@ function _toPrimitive36(t, r) {
30200
30327
  }
30201
30328
  return ("string" === r ? String : Number)(t);
30202
30329
  }
30203
- var IndexedNavigation = class extends EventEmitter12 {
30330
+ var IndexedNavigation = class extends EventEmitter11 {
30204
30331
  get idList() {
30205
30332
  return this.pageModel.pageList().filter((id) => /^_i_/.test(id));
30206
30333
  }
30207
30334
  get head() {
30208
- let headId = Object.keys(this.list).find((key) => {
30335
+ const headId = Object.keys(this.list).find((key) => {
30209
30336
  return this.list[key] && this.list[key].prev === "";
30210
30337
  });
30211
30338
  if (!headId) {
30212
- log2(`indexed navigation confusion`, {
30339
+ log3("indexed navigation confusion", {
30213
30340
  list: JSON.stringify(this.list)
30214
30341
  }, "error");
30215
- throw new Error(`indexed navigation confusion`);
30342
+ throw new Error("indexed navigation confusion");
30216
30343
  }
30217
30344
  return headId;
30218
30345
  }
@@ -30233,7 +30360,7 @@ var IndexedNavigation = class extends EventEmitter12 {
30233
30360
  _defineProperty36(this, "indexedPageMap", void 0);
30234
30361
  _defineProperty36(this, "list", {});
30235
30362
  _defineProperty36(this, "hasPermission", void 0);
30236
- _defineProperty36(this, "handleIndexedPageMapUpdate", (evt) => {
30363
+ _defineProperty36(this, "handleIndexedPageMapUpdate", (_evt) => {
30237
30364
  this.list = this.indexedPageMap.get("list");
30238
30365
  const needRemoveList = this.pageModel.pageList().filter((v) => /^_i_/.test(v) && Object.keys(this.list).indexOf(v) < 0);
30239
30366
  const needAddList = Object.keys(this.list).filter((v) => this.pageModel.pageList().indexOf(v) < 0);
@@ -30288,8 +30415,8 @@ var IndexedNavigation = class extends EventEmitter12 {
30288
30415
  initIndexed() {
30289
30416
  return new Promise((resolve) => {
30290
30417
  setTimeout(() => {
30418
+ this.pageModel.addPage("_i_");
30291
30419
  if (this.pageModel.pageList().length === 0) {
30292
- this.pageModel.addPage("_i_");
30293
30420
  resolve(true);
30294
30421
  } else {
30295
30422
  resolve(false);
@@ -30298,19 +30425,22 @@ var IndexedNavigation = class extends EventEmitter12 {
30298
30425
  });
30299
30426
  }
30300
30427
  /**
30301
- * 获取总页数
30302
- * @returns {number}
30303
- */
30428
+ * 获取总页数
30429
+ * @returns {number}
30430
+ */
30304
30431
  get pageCount() {
30305
30432
  return this.idList.length;
30306
30433
  }
30307
30434
  /**
30308
- * 获取当前页索引
30309
- */
30435
+ * 获取当前页索引
30436
+ */
30310
30437
  get currentPageIndex() {
30311
30438
  const userPageId = this.userMap.get(WhiteboardKeys.currentPage);
30312
30439
  return this.getPageIndex(userPageId);
30313
30440
  }
30441
+ get currentPageId() {
30442
+ return this.userMap.get(WhiteboardKeys.currentPage);
30443
+ }
30314
30444
  getPageIndex(pageId) {
30315
30445
  let i = 0;
30316
30446
  let currentId = this.head;
@@ -30326,9 +30456,9 @@ var IndexedNavigation = class extends EventEmitter12 {
30326
30456
  return i;
30327
30457
  }
30328
30458
  /**
30329
- * 获取指定索引对应的 pageId
30330
- * @param {number} index
30331
- */
30459
+ * 获取指定索引对应的 pageId
30460
+ * @param {number} index
30461
+ */
30332
30462
  getPageId(index) {
30333
30463
  const firstKey = this.head;
30334
30464
  if (firstKey) {
@@ -30350,20 +30480,20 @@ var IndexedNavigation = class extends EventEmitter12 {
30350
30480
  modifyDetect() {
30351
30481
  const cameraMode = this.userMap.get(WhiteboardKeys.cameraMode);
30352
30482
  if (cameraMode !== "main") {
30353
- console.warn(`cannot modify pages in non-main view mode.`);
30483
+ console.warn("cannot modify pages in non-main view mode.");
30354
30484
  return false;
30355
30485
  }
30356
30486
  if (!this.hasPermission(WhiteboardPermissionFlag.mainView)) {
30357
- console.warn(`cannot modify pages without WhiteboardPermissionFlag.mainView.`);
30487
+ console.warn("cannot modify pages without WhiteboardPermissionFlag.mainView.");
30358
30488
  return false;
30359
30489
  }
30360
30490
  return true;
30361
30491
  }
30362
30492
  /**
30363
- * 在尾部插入新页面
30364
- * @param {boolean=} goto 是否跳转到新页面, 默认 true
30365
- * @return 总页数
30366
- */
30493
+ * 在尾部插入新页面
30494
+ * @param {boolean=} goto 是否跳转到新页面, 默认 true
30495
+ * @return 总页数
30496
+ */
30367
30497
  pushPage() {
30368
30498
  let goto = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
30369
30499
  this.indexedPageMap.doc.transact(() => {
@@ -30392,11 +30522,11 @@ var IndexedNavigation = class extends EventEmitter12 {
30392
30522
  return this.pageCount;
30393
30523
  }
30394
30524
  /**
30395
- * 在 after 之后插入新页面
30396
- * @param {number} after 在此页之后插入
30397
- * @param {boolean=} goto 是否跳转到新页面, 默认 true
30398
- * @return 总页数
30399
- */
30525
+ * 在 after 之后插入新页面
30526
+ * @param {number} after 在此页之后插入
30527
+ * @param {boolean=} goto 是否跳转到新页面, 默认 true
30528
+ * @return 总页数
30529
+ */
30400
30530
  insertPage(after) {
30401
30531
  let goto = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
30402
30532
  const afterPageId = this.getPageId(after);
@@ -30405,7 +30535,7 @@ var IndexedNavigation = class extends EventEmitter12 {
30405
30535
  }
30406
30536
  const cameraMode = this.userMap.get(WhiteboardKeys.cameraMode);
30407
30537
  if (cameraMode !== "main") {
30408
- console.warn(`cannot modify pages in non-main view mode.`);
30538
+ console.warn("cannot modify pages in non-main view mode.");
30409
30539
  return this.pageCount;
30410
30540
  }
30411
30541
  const prev = this.list[afterPageId];
@@ -30448,8 +30578,8 @@ var IndexedNavigation = class extends EventEmitter12 {
30448
30578
  return this.pageCount;
30449
30579
  }
30450
30580
  /**
30451
- * 跳转至上一页, 并返回跳转后的页面索引.
30452
- */
30581
+ * 跳转至上一页, 并返回跳转后的页面索引.
30582
+ */
30453
30583
  prevPage() {
30454
30584
  const currentPageId = this.userMap.get(WhiteboardKeys.currentPage);
30455
30585
  const data = this.list[currentPageId];
@@ -30461,8 +30591,8 @@ var IndexedNavigation = class extends EventEmitter12 {
30461
30591
  return nextIndex;
30462
30592
  }
30463
30593
  /**
30464
- * 跳转至下一页, 并返回跳转后的页面索引.
30465
- */
30594
+ * 跳转至下一页, 并返回跳转后的页面索引.
30595
+ */
30466
30596
  nextPage() {
30467
30597
  const currentPageId = this.userMap.get(WhiteboardKeys.currentPage);
30468
30598
  const data = this.list[currentPageId];
@@ -30474,16 +30604,14 @@ var IndexedNavigation = class extends EventEmitter12 {
30474
30604
  return nextIndex;
30475
30605
  }
30476
30606
  /**
30477
- * 删除指定页面
30478
- * @param {number} index
30479
- */
30607
+ * 删除指定页面
30608
+ * @param {number} index
30609
+ */
30480
30610
  removePage(index) {
30481
30611
  if (this.pageCount <= 1) {
30482
30612
  return this.pageCount;
30483
30613
  }
30484
- const cameraMode = this.userMap.get(WhiteboardKeys.cameraMode);
30485
- if (cameraMode !== "main") {
30486
- console.warn(`cannot modify pages in non-main view mode.`);
30614
+ if (!this.modifyDetect()) {
30487
30615
  return this.pageCount;
30488
30616
  }
30489
30617
  const targetId = this.getPageId(index);
@@ -30523,10 +30651,15 @@ var IndexedNavigation = class extends EventEmitter12 {
30523
30651
  this.pageModel.gotoPage(targetId);
30524
30652
  }
30525
30653
  }
30654
+ dispose() {
30655
+ removeObserver6(this.indexedPageMap, this.handleIndexedPageMapUpdate);
30656
+ this.pageModel.off("switchPage");
30657
+ this.pageModel.off("pagesChange");
30658
+ }
30526
30659
  };
30527
30660
 
30528
30661
  // src/utils/ShadowEmitter.ts
30529
- import EventEmitter13 from "eventemitter3";
30662
+ import EventEmitter12 from "eventemitter3";
30530
30663
  function _defineProperty37(e, r, t) {
30531
30664
  return (r = _toPropertyKey37(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30532
30665
  }
@@ -30544,7 +30677,7 @@ function _toPrimitive37(t, r) {
30544
30677
  }
30545
30678
  return ("string" === r ? String : Number)(t);
30546
30679
  }
30547
- var ShadowEmitter = class extends EventEmitter13 {
30680
+ var ShadowEmitter = class extends EventEmitter12 {
30548
30681
  constructor(userMap) {
30549
30682
  super();
30550
30683
  _defineProperty37(this, "userMap", void 0);
@@ -30585,6 +30718,9 @@ var StraightLineTool = class extends WhiteboardTool {
30585
30718
  this.tool.minDistance = 1;
30586
30719
  }
30587
30720
  onMouseDown(event) {
30721
+ if (this.elementModel) {
30722
+ this.elementModel.dispose();
30723
+ }
30588
30724
  this.elementModel = this.modelGetter().createStraightLine(true);
30589
30725
  this.from = event.point.clone();
30590
30726
  this.to = event.point.clone();
@@ -30647,7 +30783,20 @@ var GrabTool = class extends WhiteboardTool {
30647
30783
  }
30648
30784
  };
30649
30785
 
30650
- // src/WhiteboardApplication.ts
30786
+ // src/tool/PointerTool.ts
30787
+ var PointerTool = class extends WhiteboardTool {
30788
+ constructor(enableToolEvent, modelGetter, shadowEmitter, scope) {
30789
+ super(enableToolEvent, modelGetter, shadowEmitter, scope);
30790
+ }
30791
+ onMouseDown(_event) {
30792
+ }
30793
+ onMouseDrag(_event) {
30794
+ }
30795
+ onMouseUp() {
30796
+ }
30797
+ };
30798
+
30799
+ // src/SequenceExecutor.ts
30651
30800
  function _defineProperty40(e, r, t) {
30652
30801
  return (r = _toPropertyKey40(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30653
30802
  }
@@ -30665,6 +30814,54 @@ function _toPrimitive40(t, r) {
30665
30814
  }
30666
30815
  return ("string" === r ? String : Number)(t);
30667
30816
  }
30817
+ var SequenceExecutor = class {
30818
+ constructor() {
30819
+ _defineProperty40(this, "tasks", []);
30820
+ _defineProperty40(this, "isRunning", false);
30821
+ }
30822
+ addTask(task) {
30823
+ this.tasks.push(task);
30824
+ if (!this.isRunning) {
30825
+ this.execute();
30826
+ }
30827
+ }
30828
+ async execute() {
30829
+ if (this.isRunning) {
30830
+ return;
30831
+ }
30832
+ this.isRunning = true;
30833
+ while (this.tasks.length > 0) {
30834
+ const task = this.tasks.shift();
30835
+ if (task) {
30836
+ try {
30837
+ await task();
30838
+ } catch (e) {
30839
+ }
30840
+ }
30841
+ }
30842
+ this.isRunning = false;
30843
+ }
30844
+ };
30845
+
30846
+ // src/WhiteboardApplication.ts
30847
+ import { removeObserver as removeObserver7 } from "@netless/forge-room";
30848
+ function _defineProperty41(e, r, t) {
30849
+ return (r = _toPropertyKey41(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30850
+ }
30851
+ function _toPropertyKey41(t) {
30852
+ var i = _toPrimitive41(t, "string");
30853
+ return "symbol" == typeof i ? i : i + "";
30854
+ }
30855
+ function _toPrimitive41(t, r) {
30856
+ if ("object" != typeof t || !t) return t;
30857
+ var e = t[Symbol.toPrimitive];
30858
+ if (void 0 !== e) {
30859
+ var i = e.call(t, r || "default");
30860
+ if ("object" != typeof i) return i;
30861
+ throw new TypeError("@@toPrimitive must return a primitive value.");
30862
+ }
30863
+ return ("string" === r ? String : Number)(t);
30864
+ }
30668
30865
  var WHITEBOARD_APP_NAME = "whiteboard";
30669
30866
  var WhiteboardApplication = class extends AbstractApplication {
30670
30867
  get undoManager() {
@@ -30678,43 +30875,46 @@ var WhiteboardApplication = class extends AbstractApplication {
30678
30875
  var _this;
30679
30876
  super();
30680
30877
  _this = this;
30681
- _defineProperty40(this, "name", WHITEBOARD_APP_NAME);
30682
- _defineProperty40(this, "emitter", void 0);
30683
- _defineProperty40(this, "toolbarModel", void 0);
30684
- _defineProperty40(this, "selectElementsModel", void 0);
30685
- _defineProperty40(this, "trashedElementsModel", void 0);
30686
- _defineProperty40(this, "pageModel", void 0);
30687
- _defineProperty40(this, "layers", /* @__PURE__ */ new Map());
30688
- _defineProperty40(this, "undoManagers", /* @__PURE__ */ new Map());
30689
- _defineProperty40(this, "rootElement", document.createElement("div"));
30690
- _defineProperty40(this, "paperScope", new import_paper.default.PaperScope());
30691
- _defineProperty40(this, "canvasElement", document.createElement("canvas"));
30692
- _defineProperty40(this, "shadowScope", new import_paper.default.PaperScope());
30693
- _defineProperty40(this, "snapshotCanvasElement", document.createElement("canvas"));
30694
- _defineProperty40(this, "snapshotScope", new import_paper.default.PaperScope());
30695
- _defineProperty40(this, "shadowCanvasElement", document.createElement("canvas"));
30696
- _defineProperty40(this, "shadowEmitter", void 0);
30697
- _defineProperty40(this, "tools", void 0);
30698
- _defineProperty40(this, "editors", /* @__PURE__ */ new Map());
30699
- _defineProperty40(this, "camera", void 0);
30700
- _defineProperty40(this, "resizeObserver", void 0);
30701
- _defineProperty40(this, "option", void 0);
30702
- _defineProperty40(this, "permissions", void 0);
30703
- _defineProperty40(this, "inputType", "any");
30704
- _defineProperty40(this, "isPenEvent", false);
30705
- _defineProperty40(this, "hasPenInput", null);
30706
- _defineProperty40(this, "disableViewModelUpdate", false);
30707
- _defineProperty40(this, "internalResizeObserver", true);
30708
- _defineProperty40(this, "linkTarget", null);
30709
- _defineProperty40(this, "enableToolEvent", () => {
30878
+ _defineProperty41(this, "name", WHITEBOARD_APP_NAME);
30879
+ _defineProperty41(this, "emitter", void 0);
30880
+ _defineProperty41(this, "toolbarModel", void 0);
30881
+ _defineProperty41(this, "selectElementsModel", void 0);
30882
+ _defineProperty41(this, "trashedElementsModel", void 0);
30883
+ _defineProperty41(this, "pageModel", void 0);
30884
+ _defineProperty41(this, "layers", /* @__PURE__ */ new Map());
30885
+ _defineProperty41(this, "undoManagers", /* @__PURE__ */ new Map());
30886
+ _defineProperty41(this, "imageSets", document.createElement("div"));
30887
+ _defineProperty41(this, "rootElement", document.createElement("div"));
30888
+ _defineProperty41(this, "paperScope", new import_paper.default.PaperScope());
30889
+ _defineProperty41(this, "canvasElement", document.createElement("canvas"));
30890
+ _defineProperty41(this, "shadowScope", new import_paper.default.PaperScope());
30891
+ _defineProperty41(this, "snapshotCanvasElement", document.createElement("canvas"));
30892
+ _defineProperty41(this, "snapshotScope", new import_paper.default.PaperScope());
30893
+ _defineProperty41(this, "shadowCanvasElement", document.createElement("canvas"));
30894
+ _defineProperty41(this, "shadowEmitter", void 0);
30895
+ _defineProperty41(this, "tools", void 0);
30896
+ _defineProperty41(this, "editors", /* @__PURE__ */ new Map());
30897
+ _defineProperty41(this, "camera", void 0);
30898
+ _defineProperty41(this, "resizeObserver", void 0);
30899
+ _defineProperty41(this, "option", void 0);
30900
+ _defineProperty41(this, "permissions", void 0);
30901
+ _defineProperty41(this, "inputType", "any");
30902
+ _defineProperty41(this, "isPenEvent", false);
30903
+ _defineProperty41(this, "hasPenInput", null);
30904
+ _defineProperty41(this, "disableViewModelUpdate", false);
30905
+ _defineProperty41(this, "internalResizeObserver", true);
30906
+ _defineProperty41(this, "sequenceExecutor", new SequenceExecutor());
30907
+ _defineProperty41(this, "linkTarget", null);
30908
+ _defineProperty41(this, "enableToolEvent", () => {
30710
30909
  return !(this.inputType === "pen" && !this.isPenEvent);
30711
30910
  });
30712
- _defineProperty40(this, "handlePageSwitch", (pageId) => {
30713
- for (const editor of this.editors.values()) {
30714
- editor.hidden();
30715
- }
30716
- this.selectElementsModel.clearSelectElementForSelf();
30717
- waitUntil(() => this.layers.has(pageId), 3e3).then(() => {
30911
+ _defineProperty41(this, "handlePageSwitch", (pageId) => {
30912
+ this.sequenceExecutor.addTask(async () => {
30913
+ for (const editor of this.editors.values()) {
30914
+ editor.hidden();
30915
+ }
30916
+ this.selectElementsModel.clearSelectElementForSelf();
30917
+ await waitUntil(() => this.layers.has(pageId), 1e3);
30718
30918
  if (this.layers.has(pageId)) {
30719
30919
  for (const entry of this.layers.entries()) {
30720
30920
  entry[1].off("elementInsert", this.handleElementInsert);
@@ -30726,6 +30926,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30726
30926
  renderableModel.on("elementRemove", this.handleElementRemove);
30727
30927
  renderableModel.on("elementClear", this.handleElementClear);
30728
30928
  renderableModel.flushRenderables();
30929
+ this.paperScope.project.activeLayer.data.pageId = pageId;
30729
30930
  const others = this.userManager.userIdList().filter((v) => v !== this.userId);
30730
30931
  for (const other of others) {
30731
30932
  if (this.userMap(other).get(WhiteboardKeys.currentPage) === pageId) {
@@ -30735,9 +30936,11 @@ var WhiteboardApplication = class extends AbstractApplication {
30735
30936
  }
30736
30937
  }
30737
30938
  }
30939
+ } else {
30940
+ console.warn(`[@netless/forge-whiteboard] page ${pageId} not found`);
30941
+ log4(`[@netless/forge-whiteboard] page ${pageId} not found`, {}, "warning");
30738
30942
  }
30739
- });
30740
- waitUntil(() => this.undoManagers.has(pageId), 3e3).then(() => {
30943
+ await waitUntil(() => this.undoManagers.has(pageId), 1e3);
30741
30944
  if (this.undoManagers.has(pageId)) {
30742
30945
  for (const entry of this.undoManagers.entries()) {
30743
30946
  entry[1].off("stack-item-added", this.handleStackItemAdded);
@@ -30745,29 +30948,32 @@ var WhiteboardApplication = class extends AbstractApplication {
30745
30948
  }
30746
30949
  this.undoManagers.get(pageId).on("stack-item-added", this.handleStackItemAdded);
30747
30950
  this.undoManagers.get(pageId).on("stack-item-popped", this.handleStackItemPopped);
30951
+ } else {
30952
+ console.warn(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`);
30953
+ log4(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`, {}, "warning");
30748
30954
  }
30955
+ this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30956
+ this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
30749
30957
  });
30750
- this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30751
- this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
30752
30958
  });
30753
- _defineProperty40(this, "hasPermission", (flag) => {
30959
+ _defineProperty41(this, "hasPermission", (flag) => {
30754
30960
  return this.permissions.hasPermission(flag, this.userId);
30755
30961
  });
30756
- _defineProperty40(this, "handleStackItemAdded", () => {
30962
+ _defineProperty41(this, "handleStackItemAdded", () => {
30757
30963
  this.selectElementsModel.clearSelectElementForSelf();
30758
30964
  this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30759
30965
  this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
30760
30966
  });
30761
- _defineProperty40(this, "handleStackItemPopped", () => {
30967
+ _defineProperty41(this, "handleStackItemPopped", () => {
30762
30968
  this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30763
30969
  this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
30764
30970
  });
30765
- _defineProperty40(this, "handleLayersChange", (ids) => {
30971
+ _defineProperty41(this, "handleLayersChange", (ids) => {
30766
30972
  for (let i = 0, len = ids.length; i < len; i++) {
30767
30973
  const id = ids[i];
30768
30974
  if (!this.layers.has(id)) {
30769
30975
  const elementsMap = this.getMap(`layer/${id}/elements`);
30770
- const renderableModel = new RenderableModel(id, this.shadowEmitter, elementsMap, this.paperScope, this.toolbarModel, this.userManager, this.hasPermission);
30976
+ const renderableModel = new RenderableModel(id, this.shadowEmitter, elementsMap, this.paperScope, this.toolbarModel, this.userManager, this.imageSets, this.hasPermission);
30771
30977
  this.layers.set(id, renderableModel);
30772
30978
  }
30773
30979
  if (!this.undoManagers.has(id)) {
@@ -30778,7 +30984,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30778
30984
  this.undoManagers.set(id, undoManager);
30779
30985
  }
30780
30986
  }
30781
- for (let entry of this.layers.entries()) {
30987
+ for (const entry of this.layers.entries()) {
30782
30988
  if (ids.indexOf(entry[0]) < 0) {
30783
30989
  const renderableModel = this.layers.get(entry[0]);
30784
30990
  this.layers.delete(entry[0]);
@@ -30794,17 +31000,17 @@ var WhiteboardApplication = class extends AbstractApplication {
30794
31000
  }
30795
31001
  }
30796
31002
  });
30797
- _defineProperty40(this, "getCurrentRenderableModel", () => {
30798
- let layerId = this.userMap(this.userId).get(WhiteboardKeys.currentPage);
31003
+ _defineProperty41(this, "getCurrentRenderableModel", () => {
31004
+ const layerId = this.userMap(this.userId).get(WhiteboardKeys.currentPage);
30799
31005
  if (!this.layers.has(layerId)) {
30800
31006
  this.emitter.emit("error", 300002, `target page: ${layerId} not found`);
30801
31007
  }
30802
31008
  return this.layers.get(layerId);
30803
31009
  });
30804
- _defineProperty40(this, "handleElementClear", () => {
31010
+ _defineProperty41(this, "handleElementClear", () => {
30805
31011
  this.paperScope.project.activeLayer.removeChildren();
30806
31012
  });
30807
- _defineProperty40(this, "handleElementInsert", (elements) => {
31013
+ _defineProperty41(this, "handleElementInsert", (elements) => {
30808
31014
  for (const element of elements) {
30809
31015
  element.createPaperElement();
30810
31016
  const scope = element.shadow === "" ? this.paperScope : this.shadowScope;
@@ -30816,7 +31022,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30816
31022
  this.insertElementToParent(element.item, scope.project.activeLayer);
30817
31023
  }
30818
31024
  });
30819
- _defineProperty40(this, "handleElementRemove", (elementId, layerId) => {
31025
+ _defineProperty41(this, "handleElementRemove", (elementId, layerId) => {
30820
31026
  const layerModel = this.layers.get(layerId);
30821
31027
  if (!layerModel) {
30822
31028
  return;
@@ -30827,11 +31033,11 @@ var WhiteboardApplication = class extends AbstractApplication {
30827
31033
  }
30828
31034
  layerModel.elementModels.delete(elementId);
30829
31035
  });
30830
- _defineProperty40(this, "handleRemoveTrashedElementForSelf", (userId, elementId) => {
31036
+ _defineProperty41(this, "handleRemoveTrashedElementForSelf", (userId, elementId) => {
30831
31037
  const selfLayerId = this.userMap(this.userId).get(WhiteboardKeys.currentPage);
30832
31038
  this.layers.get(selfLayerId)?.removeElementItem(elementId);
30833
31039
  });
30834
- _defineProperty40(this, "handleElementsTrash", (userId, elements) => {
31040
+ _defineProperty41(this, "handleElementsTrash", (userId, elements) => {
30835
31041
  const targetLayerId = this.userMap(userId).get(WhiteboardKeys.currentPage);
30836
31042
  const selfLayerId = this.userMap(this.userId).get(WhiteboardKeys.currentPage);
30837
31043
  if (targetLayerId !== selfLayerId || !this.layers.has(targetLayerId)) {
@@ -30844,7 +31050,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30844
31050
  }
30845
31051
  });
30846
31052
  });
30847
- _defineProperty40(this, "handleElementsSelect", (userId, elements) => {
31053
+ _defineProperty41(this, "handleElementsSelect", (userId, elements) => {
30848
31054
  if (!this.editors.has(userId)) {
30849
31055
  const ctrl = this.userManager.getUser(userId);
30850
31056
  const editor2 = new Editor(this.paperScope, this.shadowScope, this.shadowEmitter, this.canvasElement, this.camera, {
@@ -30876,7 +31082,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30876
31082
  }).filter((v) => !!v);
30877
31083
  editor.setTargets(elementModels);
30878
31084
  if (elementModels.length === 1) {
30879
- let model = elementModels[0];
31085
+ const model = elementModels[0];
30880
31086
  if (model.item) {
30881
31087
  const topLeft = this.paperScope.project.view.projectToView(model.item.bounds.topLeft);
30882
31088
  const bottomRight = this.paperScope.project.view.projectToView(model.item.bounds.bottomRight);
@@ -30887,7 +31093,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30887
31093
  this.emitter.emit("elementDeselected", userId);
30888
31094
  }
30889
31095
  });
30890
- _defineProperty40(this, "handleLinkedMapChange", (evt) => {
31096
+ _defineProperty41(this, "handleLinkedMapChange", (evt) => {
30891
31097
  for (const [key, value] of evt.changes.keys.entries()) {
30892
31098
  if (Object.keys(TOOLBAR_KEYS).indexOf(key) >= 0 && (value.action === "add" || value.action === "update")) {
30893
31099
  this.toolbarModel.currentTool = evt.target.get(TOOLBAR_KEYS.tool);
@@ -30904,7 +31110,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30904
31110
  }
30905
31111
  }
30906
31112
  });
30907
- _defineProperty40(this, "adjustByOutFrame", (frameWidth, frameHeight) => {
31113
+ _defineProperty41(this, "adjustByOutFrame", (frameWidth, frameHeight) => {
30908
31114
  if (this.option.width > 0 && this.option.height > 0) {
30909
31115
  const minWidth = Math.max(frameWidth, 10);
30910
31116
  const minHeight = Math.max(frameHeight, 10);
@@ -30920,9 +31126,14 @@ var WhiteboardApplication = class extends AbstractApplication {
30920
31126
  this.camera.triggerZoom();
30921
31127
  }
30922
31128
  });
31129
+ window.__wb = this;
30923
31130
  requestAnimationFrameHook(this.paperScope);
30924
31131
  requestAnimationFrameHook(this.shadowScope);
31132
+ const that = this;
30925
31133
  this.rootElement.setAttribute("data-forge-app", "whiteboard");
31134
+ this.imageSets.style.display = "none";
31135
+ this.imageSets.setAttribute("data-image-sets", "");
31136
+ this.rootElement.appendChild(this.imageSets);
30926
31137
  document.body.addEventListener("pointerdown", (evt) => {
30927
31138
  this.isPenEvent = evt.pointerType === "pen";
30928
31139
  if (evt.pointerType === "pen" && this.hasPenInput === null) {
@@ -30984,7 +31195,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30984
31195
  this.emitter.setViewModeToFree = (userId) => {
30985
31196
  if (that.disableViewModelUpdate) {
30986
31197
  console.warn("Operation failed. Perspective mode switching is disabled in the current environment.");
30987
- log3("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31198
+ log4("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
30988
31199
  return;
30989
31200
  }
30990
31201
  const targetId = userId ? this.hasPermission(WhiteboardPermissionFlag.setOthersView) ? userId : null : this.userId;
@@ -30995,7 +31206,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30995
31206
  this.emitter.setViewModeToFlow = (flowId, userId) => {
30996
31207
  if (that.disableViewModelUpdate) {
30997
31208
  console.warn("Operation failed. Perspective mode switching is disabled in the current environment.");
30998
- log3("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31209
+ log4("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
30999
31210
  return;
31000
31211
  }
31001
31212
  const targetId = userId ? this.hasPermission(WhiteboardPermissionFlag.setOthersView) ? userId : null : this.userId;
@@ -31010,7 +31221,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31010
31221
  this.emitter.setViewModeToMain = (userId) => {
31011
31222
  if (that.disableViewModelUpdate) {
31012
31223
  console.warn("Operation failed. Perspective mode switching is disabled in the current environment.");
31013
- log3("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31224
+ log4("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31014
31225
  return;
31015
31226
  }
31016
31227
  const targetId = userId ? this.hasPermission(WhiteboardPermissionFlag.setOthersView) ? userId : null : this.userId;
@@ -31022,6 +31233,30 @@ var WhiteboardApplication = class extends AbstractApplication {
31022
31233
  this.camera.resetViewMatrixToMain();
31023
31234
  }
31024
31235
  };
31236
+ this.emitter.insertImage = (src, pageId) => {
31237
+ if (!/https/.test(src)) {
31238
+ log4("[@netless/forge-whiteboard] invalid image url, src needs to be in the HTTPS protocol.", {
31239
+ src
31240
+ }, "warning");
31241
+ return;
31242
+ }
31243
+ let targetPageId = pageId;
31244
+ if (!targetPageId) {
31245
+ targetPageId = this.pageModel.getCurrentPage(this.userManager.selfId);
31246
+ }
31247
+ if (!targetPageId) {
31248
+ log4("[@netless/forge-whiteboard] page not found", {}, "warning");
31249
+ return;
31250
+ }
31251
+ this.layers.get(targetPageId)?.createImage(src);
31252
+ };
31253
+ this.emitter.removeElement = (pageId, elementId) => {
31254
+ if (!this.layers.has(pageId)) {
31255
+ log4("[@netless/forge-whiteboard] page not found", {}, "warning");
31256
+ return;
31257
+ }
31258
+ this.layers.get(pageId)?.removeElementItem(elementId);
31259
+ };
31025
31260
  this.emitter.getViewModel = (userId) => {
31026
31261
  const targetId = userId ? userId : this.userId;
31027
31262
  return this.userMap(targetId).get(WhiteboardKeys.cameraMode);
@@ -31037,7 +31272,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31037
31272
  const source = this.getMap(`layer/${sourceId}/elements`);
31038
31273
  const target = this.getMap(`layer/${targetId}/elements`);
31039
31274
  if (!this.layers.has(targetId)) {
31040
- this.layers.set(targetId, new RenderableModel(targetId, this.shadowEmitter, target, this.paperScope, this.toolbarModel, this.userManager, this.hasPermission));
31275
+ this.layers.set(targetId, new RenderableModel(targetId, this.shadowEmitter, target, this.paperScope, this.toolbarModel, this.userManager, this.imageSets, this.hasPermission));
31041
31276
  }
31042
31277
  if (!this.undoManagers.has(targetId)) {
31043
31278
  const undoManager = new Y15.UndoManager(target, {
@@ -31088,12 +31323,11 @@ var WhiteboardApplication = class extends AbstractApplication {
31088
31323
  this.camera.reset();
31089
31324
  };
31090
31325
  this.emitter.on("error", (errorCode, errorMessage) => {
31091
- log3("WhiteboardApplicationError", {
31326
+ log4("WhiteboardApplicationError", {
31092
31327
  errorCode,
31093
31328
  errorMessage
31094
31329
  });
31095
31330
  });
31096
- const that = this;
31097
31331
  Object.defineProperty(this.emitter, "tool", {
31098
31332
  get() {
31099
31333
  return that.toolbarModel.currentTool;
@@ -31190,6 +31424,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31190
31424
  this.permissions = new WhiteboardPermissions(this.userManager, (userId) => {
31191
31425
  return this.userMap(userId);
31192
31426
  });
31427
+ this.permissions.setPermission(WhiteboardPermissionFlag.all);
31193
31428
  this.emitter["permissions"] = this.permissions;
31194
31429
  this.emitter["selfUserId"] = this.userId;
31195
31430
  this.option = option;
@@ -31242,6 +31477,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31242
31477
  return this.userMap(userId);
31243
31478
  }, this.hasPermission);
31244
31479
  this.tools = {
31480
+ pointer: new PointerTool(this.enableToolEvent, this.getCurrentRenderableModel, this.shadowEmitter, this.paperScope),
31245
31481
  curve: new CurveTool(this.enableToolEvent, this.getCurrentRenderableModel, this.shadowEmitter, this.paperScope),
31246
31482
  rectangle: new RectangleTool(this.enableToolEvent, this.getCurrentRenderableModel, this.shadowEmitter, this.paperScope),
31247
31483
  selector: new SelectorTool(this.enableToolEvent, this.getCurrentRenderableModel, this.shadowEmitter, this.paperScope, this.selectElementsModel),
@@ -31257,6 +31493,11 @@ var WhiteboardApplication = class extends AbstractApplication {
31257
31493
  this.toolbarModel.on("update", (style) => {
31258
31494
  if (this.tools[style.tool]) {
31259
31495
  this.paperScope.tool = this.tools[style.tool].tool;
31496
+ if (style.tool === "pointer") {
31497
+ this.rootElement.style.pointerEvents = "none";
31498
+ } else {
31499
+ this.rootElement.style.pointerEvents = "auto";
31500
+ }
31260
31501
  } else {
31261
31502
  this.emitter.emit("error", 300001, `${style.tool} not supported`);
31262
31503
  }
@@ -31266,7 +31507,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31266
31507
  this.paperScope.tool = this.tools[this.toolbarModel.currentTool].tool;
31267
31508
  } else {
31268
31509
  this.paperScope.tool = this.tools["curve"].tool;
31269
- log3(`${this.toolbarModel.currentTool} not supported, backup to curve`);
31510
+ log4(`${this.toolbarModel.currentTool} not supported, backup to curve`);
31270
31511
  }
31271
31512
  this.selectElementsModel.on("elementsChange", this.handleElementsSelect);
31272
31513
  this.trashedElementsModel.on("elementsChange", this.handleElementsTrash);
@@ -31435,7 +31676,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31435
31676
  if (renderableModel.elementModels.has(key)) {
31436
31677
  elementModel = renderableModel.elementModels.get(key) ?? null;
31437
31678
  } else {
31438
- let elementMap = renderableModel.elements.get(key);
31679
+ const elementMap = renderableModel.elements.get(key);
31439
31680
  if (elementMap) {
31440
31681
  elementModel = renderableModel.convertToModel(elementMap);
31441
31682
  }
@@ -31511,7 +31752,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31511
31752
  }
31512
31753
  unlink() {
31513
31754
  if (this.linkTarget) {
31514
- this.linkTarget.unobserve(this.handleLinkedMapChange);
31755
+ removeObserver7(this.linkTarget, this.handleLinkedMapChange);
31515
31756
  }
31516
31757
  }
31517
31758
  setViewSize(width, height) {
@@ -31522,6 +31763,9 @@ var WhiteboardApplication = class extends AbstractApplication {
31522
31763
  const size = this.paperScope.view.viewSize;
31523
31764
  return [size.width, size.height];
31524
31765
  }
31766
+ getInherentScale() {
31767
+ return this.camera.getInherentScale();
31768
+ }
31525
31769
  updateInternalResizeObserverStatus(value) {
31526
31770
  this.internalResizeObserver = value;
31527
31771
  }
@@ -31541,9 +31785,27 @@ var WhiteboardApplication = class extends AbstractApplication {
31541
31785
  this.shadowScope.project.clear();
31542
31786
  this.snapshotScope.project.clear();
31543
31787
  this.resizeObserver.disconnect();
31788
+ this.unlink();
31789
+ for (const entry of this.undoManagers.entries()) {
31790
+ entry[1].off("stack-item-added", this.handleStackItemAdded);
31791
+ entry[1].off("stack-item-popped", this.handleStackItemPopped);
31792
+ }
31793
+ for (const entry of this.layers.entries()) {
31794
+ entry[1].dispose();
31795
+ entry[1].removeAllListeners();
31796
+ }
31797
+ this.camera.dispose();
31798
+ this.pageModel.dispose();
31799
+ this.pageModel.removeAllListeners();
31800
+ for (const entry of this.editors.entries()) {
31801
+ entry[1].dispose();
31802
+ }
31803
+ this.toolbarModel.dispose();
31804
+ this.emitter.indexedNavigation.dispose();
31805
+ this.permissions.dispose();
31544
31806
  }
31545
31807
  };
31546
- _defineProperty40(WhiteboardApplication, "applicationName", WHITEBOARD_APP_NAME);
31808
+ _defineProperty41(WhiteboardApplication, "applicationName", WHITEBOARD_APP_NAME);
31547
31809
  export {
31548
31810
  Whiteboard,
31549
31811
  WhiteboardApplication,