@netless/forge-whiteboard 0.1.13 → 0.1.15

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 (90) hide show
  1. package/changelog.md +9 -0
  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 +30 -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 +26 -25
  11. package/dist/WhitePermissions.d.ts.map +1 -1
  12. package/dist/Whiteboard.d.ts +106 -106
  13. package/dist/Whiteboard.d.ts.map +1 -1
  14. package/dist/WhiteboardApplication.d.ts +6 -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 +19 -19
  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 +4 -3
  34. package/dist/model/renderable/CurveModel.d.ts.map +1 -1
  35. package/dist/model/renderable/ElementModel.d.ts +5 -3
  36. package/dist/model/renderable/ElementModel.d.ts.map +1 -1
  37. package/dist/model/renderable/EraserModel.d.ts +5 -4
  38. package/dist/model/renderable/EraserModel.d.ts.map +1 -1
  39. package/dist/model/renderable/LaserPointerModel.d.ts +5 -4
  40. package/dist/model/renderable/LaserPointerModel.d.ts.map +1 -1
  41. package/dist/model/renderable/LineModel.d.ts +9 -8
  42. package/dist/model/renderable/LineModel.d.ts.map +1 -1
  43. package/dist/model/renderable/PointTextModel.d.ts +4 -3
  44. package/dist/model/renderable/PointTextModel.d.ts.map +1 -1
  45. package/dist/model/renderable/RectangleModel.d.ts +5 -4
  46. package/dist/model/renderable/RectangleModel.d.ts.map +1 -1
  47. package/dist/model/renderable/SegmentsModel.d.ts +6 -5
  48. package/dist/model/renderable/SegmentsModel.d.ts.map +1 -1
  49. package/dist/model/renderable/SelectorModel.d.ts +5 -4
  50. package/dist/model/renderable/SelectorModel.d.ts.map +1 -1
  51. package/dist/model/renderable/StraightLineModel.d.ts +5 -4
  52. package/dist/model/renderable/StraightLineModel.d.ts.map +1 -1
  53. package/dist/model/renderable/TriangleModel.d.ts +5 -4
  54. package/dist/model/renderable/TriangleModel.d.ts.map +1 -1
  55. package/dist/tool/CurveTool.d.ts +4 -4
  56. package/dist/tool/CurveTool.d.ts.map +1 -1
  57. package/dist/tool/EllipseTool.d.ts +4 -4
  58. package/dist/tool/EllipseTool.d.ts.map +1 -1
  59. package/dist/tool/EraserTool.d.ts +6 -6
  60. package/dist/tool/EraserTool.d.ts.map +1 -1
  61. package/dist/tool/GrabTool.d.ts +4 -4
  62. package/dist/tool/GrabTool.d.ts.map +1 -1
  63. package/dist/tool/LaserPointerTool.d.ts +5 -5
  64. package/dist/tool/LaserPointerTool.d.ts.map +1 -1
  65. package/dist/tool/LineTool.d.ts +4 -4
  66. package/dist/tool/LineTool.d.ts.map +1 -1
  67. package/dist/tool/PointerTool.d.ts +10 -0
  68. package/dist/tool/PointerTool.d.ts.map +1 -0
  69. package/dist/tool/RectangleTool.d.ts +4 -4
  70. package/dist/tool/RectangleTool.d.ts.map +1 -1
  71. package/dist/tool/SelectorTool.d.ts +5 -5
  72. package/dist/tool/SelectorTool.d.ts.map +1 -1
  73. package/dist/tool/StraightLineTool.d.ts +4 -4
  74. package/dist/tool/StraightLineTool.d.ts.map +1 -1
  75. package/dist/tool/TextTool.d.ts +6 -6
  76. package/dist/tool/TextTool.d.ts.map +1 -1
  77. package/dist/tool/TriangleTool.d.ts +4 -4
  78. package/dist/tool/TriangleTool.d.ts.map +1 -1
  79. package/dist/tool/WhiteboardTool.d.ts +2 -2
  80. package/dist/tool/WhiteboardTool.d.ts.map +1 -1
  81. package/dist/utils/Recognizer.d.ts +1 -1
  82. package/dist/utils/Recognizer.d.ts.map +1 -1
  83. package/dist/utils/ShadowEmitter.d.ts +2 -2
  84. package/dist/utils/ShadowEmitter.d.ts.map +1 -1
  85. package/dist/utils/async.d.ts.map +1 -1
  86. package/dist/whiteboard.esm.js +383 -171
  87. package/dist/whiteboard.esm.js.map +4 -4
  88. package/dist/whiteboard.js +383 -171
  89. package/dist/whiteboard.js.map +4 -4
  90. package/package.json +4 -3
@@ -25708,6 +25708,10 @@ var ElementModel = class _ElementModel {
25708
25708
  const ext = this.styleKeys();
25709
25709
  return Array.from(new Set(["dashArray", "strokeColor", "fillColor", "strokeWidth"].filter((v) => ext.exclude.indexOf(v) < 0).concat(ext.include)));
25710
25710
  }
25711
+ dispose() {
25712
+ this.subDispose();
25713
+ this.root.unobserveDeep(this.handlePropChange);
25714
+ }
25711
25715
  };
25712
25716
  _defineProperty(ElementModel, "KEYS", {
25713
25717
  index: "index",
@@ -25888,6 +25892,8 @@ var CurveModel = class extends ElementModel {
25888
25892
  this.item.fillColor = new this.scope.Color(this.strokeColor);
25889
25893
  }
25890
25894
  }
25895
+ subDispose() {
25896
+ }
25891
25897
  };
25892
25898
 
25893
25899
  // src/model/renderable/SelectorModel.ts
@@ -25922,14 +25928,12 @@ var SelectorModel = class extends ElementModel {
25922
25928
  this.root.set("points", initPoints);
25923
25929
  }
25924
25930
  }
25931
+ subDispose() {
25932
+ }
25925
25933
  createPaperRect() {
25926
25934
  const scope = this.scope;
25927
25935
  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
- );
25936
+ return new scope.Path.Rectangle(bounds, new scope.Point(this.points[4], this.points[4]));
25933
25937
  }
25934
25938
  onVectorUpdate() {
25935
25939
  if (!this.item) {
@@ -25955,7 +25959,7 @@ var SelectorModel = class extends ElementModel {
25955
25959
  exclude: []
25956
25960
  };
25957
25961
  }
25958
- onStyleKeyUpdate(key) {
25962
+ onStyleKeyUpdate(_key) {
25959
25963
  }
25960
25964
  };
25961
25965
 
@@ -26007,7 +26011,7 @@ var AnimationFrame = class {
26007
26011
  _defineProperty5(this, "lastTime", 0);
26008
26012
  _defineProperty5(this, "fps", 45);
26009
26013
  _defineProperty5(this, "handleCallbacks", () => {
26010
- let functions = this.callbacks;
26014
+ const functions = this.callbacks;
26011
26015
  this.callbacks = [];
26012
26016
  for (let i = 0, l2 = functions.length; i < l2; i++) {
26013
26017
  functions[i]();
@@ -26060,6 +26064,8 @@ var SegmentsModel = class extends ElementModel {
26060
26064
  this.root.set("points", new Y4.Array());
26061
26065
  }
26062
26066
  }
26067
+ subDispose() {
26068
+ }
26063
26069
  onVectorUpdate() {
26064
26070
  if (!this.item) {
26065
26071
  return;
@@ -26094,7 +26100,7 @@ var SegmentsModel = class extends ElementModel {
26094
26100
  exclude: []
26095
26101
  };
26096
26102
  }
26097
- onStyleKeyUpdate(key) {
26103
+ onStyleKeyUpdate(_key) {
26098
26104
  }
26099
26105
  };
26100
26106
 
@@ -26188,6 +26194,9 @@ var LineTool = class extends WhiteboardTool {
26188
26194
  this.tool.minDistance = 1;
26189
26195
  }
26190
26196
  onMouseDown(event) {
26197
+ if (this.elementModel) {
26198
+ this.elementModel.dispose();
26199
+ }
26191
26200
  this.elementModel = this.modelGetter().createLinePath(true);
26192
26201
  this.from = event.point.clone();
26193
26202
  this.to = event.point.clone();
@@ -26263,6 +26272,8 @@ var LineModel = class extends ElementModel {
26263
26272
  this.root.set("tailArrow", "normal");
26264
26273
  }
26265
26274
  }
26275
+ subDispose() {
26276
+ }
26266
26277
  onVectorUpdate() {
26267
26278
  if (!this.item) {
26268
26279
  return;
@@ -26299,7 +26310,7 @@ var LineModel = class extends ElementModel {
26299
26310
  this.item.addChildren(this.renderLine());
26300
26311
  }
26301
26312
  createArrow(path) {
26302
- let [headPath, tailPath] = [new this.scope.Path(), new this.scope.Path()];
26313
+ const [headPath, tailPath] = [new this.scope.Path(), new this.scope.Path()];
26303
26314
  if (!path) {
26304
26315
  return [headPath, tailPath];
26305
26316
  }
@@ -26353,7 +26364,7 @@ var LineModel = class extends ElementModel {
26353
26364
  exclude: ["fillColor"]
26354
26365
  };
26355
26366
  }
26356
- onStyleKeyUpdate(key) {
26367
+ onStyleKeyUpdate(_key) {
26357
26368
  this.onVectorUpdate();
26358
26369
  }
26359
26370
  };
@@ -26476,6 +26487,9 @@ var PointTextModel = class extends ElementModel {
26476
26487
  }, 60);
26477
26488
  }
26478
26489
  }
26490
+ subDispose() {
26491
+ this.root.unobserve(this.handleTextPropChange);
26492
+ }
26479
26493
  getInternalMeasurement() {
26480
26494
  if (!this.item) {
26481
26495
  return null;
@@ -26581,6 +26595,8 @@ var TriangleModel = class extends ElementModel {
26581
26595
  this.root.set("points", new Y7.Array());
26582
26596
  }
26583
26597
  }
26598
+ subDispose() {
26599
+ }
26584
26600
  createPaperItem() {
26585
26601
  this.item = new this.scope.Path();
26586
26602
  this.item.strokeCap = "butt";
@@ -26637,7 +26653,7 @@ var TriangleModel = class extends ElementModel {
26637
26653
  exclude: []
26638
26654
  };
26639
26655
  }
26640
- onStyleKeyUpdate(key) {
26656
+ onStyleKeyUpdate(_key) {
26641
26657
  }
26642
26658
  };
26643
26659
 
@@ -26676,6 +26692,8 @@ var RectangleModel = class extends ElementModel {
26676
26692
  this.root.set("radius", 0);
26677
26693
  }
26678
26694
  }
26695
+ subDispose() {
26696
+ }
26679
26697
  createSegments() {
26680
26698
  const [a2, b2, c, d] = this.points;
26681
26699
  const matrix = new this.scope.Matrix(this.pointsMatrix);
@@ -26807,7 +26825,7 @@ var RectangleModel = class extends ElementModel {
26807
26825
  exclude: []
26808
26826
  };
26809
26827
  }
26810
- onStyleKeyUpdate(key) {
26828
+ onStyleKeyUpdate(_key) {
26811
26829
  }
26812
26830
  };
26813
26831
 
@@ -26948,9 +26966,11 @@ var EraserModel = class extends ElementModel {
26948
26966
  exclude: []
26949
26967
  };
26950
26968
  }
26951
- onStyleKeyUpdate(key) {
26969
+ onStyleKeyUpdate(_key) {
26952
26970
  return;
26953
26971
  }
26972
+ subDispose() {
26973
+ }
26954
26974
  };
26955
26975
 
26956
26976
  // src/model/renderable/LaserPointerModel.ts
@@ -27107,9 +27127,11 @@ var LaserPointerModel = class extends ElementModel {
27107
27127
  exclude: []
27108
27128
  };
27109
27129
  }
27110
- onStyleKeyUpdate(key) {
27130
+ onStyleKeyUpdate(_key) {
27111
27131
  return;
27112
27132
  }
27133
+ subDispose() {
27134
+ }
27113
27135
  };
27114
27136
 
27115
27137
  // src/WhitePermissions.ts
@@ -27174,6 +27196,9 @@ var WhiteboardPermissions = class extends EventEmitter {
27174
27196
  const observer = (evt) => {
27175
27197
  this.handleUserPermissionChange(userId, evt);
27176
27198
  };
27199
+ if (this.observers.has(userId)) {
27200
+ this.requestUserMap(userId).unobserve(this.observers.get(userId));
27201
+ }
27177
27202
  this.observers.set(userId, observer);
27178
27203
  this.requestUserMap(userId).observe(observer);
27179
27204
  }
@@ -27194,56 +27219,64 @@ var WhiteboardPermissions = class extends EventEmitter {
27194
27219
  }
27195
27220
  }
27196
27221
  /**
27197
- * 解析权限列表组合
27198
- * @param {number} value - 权限数字值
27199
- * @return {WhiteboardPermissionFlag[]} - 权限列表
27200
- */
27222
+ * 解析权限列表组合
27223
+ * @param {number} value - 权限数字值
27224
+ * @return {WhiteboardPermissionFlag[]} - 权限列表
27225
+ */
27201
27226
  resolveFlags(value) {
27202
27227
  return [WhiteboardPermissionFlag.draw, WhiteboardPermissionFlag.editSelf, WhiteboardPermissionFlag.editOthers, WhiteboardPermissionFlag.deleteSelf, WhiteboardPermissionFlag.deleteOthers, WhiteboardPermissionFlag.mainView, WhiteboardPermissionFlag.setOthersView].filter((v) => (v & value) !== 0);
27203
27228
  }
27204
27229
  /**
27205
- * 获取权限列表组合对应的数值
27206
- * @param { string } userId 不传表示获取自己
27207
- */
27230
+ * 获取权限列表组合对应的数值
27231
+ * @param { string } userId 不传表示获取自己
27232
+ */
27208
27233
  getPermissionValue(userId) {
27209
27234
  return this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0;
27210
27235
  }
27211
27236
  /**
27212
- * 获取权限列表
27213
- * @param {string=} userId 可选, 不传表示获取自己
27214
- */
27237
+ * 获取权限列表
27238
+ * @param {string=} userId 可选, 不传表示获取自己
27239
+ */
27215
27240
  getPermissionFlags(userId) {
27216
27241
  const value = this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0;
27217
27242
  return this.resolveFlags(value);
27218
27243
  }
27219
27244
  /**
27220
- * 返回对应 userId 是否有相应权限
27221
- * @param {string=} userId 可选, 不传表示返回自己是否有相应权限
27222
- * @param {WhiteboardPermissionFlag} flag
27223
- */
27245
+ * 返回对应 userId 是否有相应权限
27246
+ * @param {string=} userId 可选, 不传表示返回自己是否有相应权限
27247
+ * @param {WhiteboardPermissionFlag} flag
27248
+ */
27224
27249
  hasPermission(flag, userId) {
27225
27250
  return ((this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0) & flag) !== 0;
27226
27251
  }
27227
27252
  /**
27228
- * 添加权限
27229
- * @param {WhiteboardPermissionFlag} flag 权限标记
27230
- * @param {string=} userId 可选, 为 userId 添加权限, 不传表示为自己添加权限
27231
- */
27253
+ * 添加权限
27254
+ * @param {WhiteboardPermissionFlag} flag 权限标记
27255
+ * @param {string=} userId 可选, 为 userId 添加权限, 不传表示为自己添加权限
27256
+ */
27232
27257
  addPermission(flag, userId) {
27233
27258
  const userMap = this.requestUserMap(userId ?? this.userManager.selfId);
27234
27259
  const oldValue = userMap.get("permission") ?? 0;
27235
27260
  this.requestUserMap(userId ?? this.userManager.selfId).set("permission", oldValue | flag);
27236
27261
  }
27237
27262
  /**
27238
- * 移除权限
27239
- * @param {WhiteboardPermissionFlag} flag 权限标记
27240
- * @param {string=} userId 可选, 为 userId 移除权限, 不传表示为自己移除权限
27241
- */
27263
+ * 移除权限
27264
+ * @param {WhiteboardPermissionFlag} flag 权限标记
27265
+ * @param {string=} userId 可选, 为 userId 移除权限, 不传表示为自己移除权限
27266
+ */
27242
27267
  removePermission(flag, userId) {
27243
27268
  const userMap = this.requestUserMap(userId ?? this.userManager.selfId);
27244
27269
  const oldValue = userMap.get("permission") ?? 0;
27245
27270
  this.requestUserMap(userId ?? this.userManager.selfId).set("permission", oldValue & ~flag);
27246
27271
  }
27272
+ dispose() {
27273
+ this.userManager.off("join", this.handleUserJoin);
27274
+ this.userManager.off("leave", this.handleUserLeave);
27275
+ this.observers.forEach((cb, userId) => {
27276
+ this.requestUserMap(userId).unobserve(cb);
27277
+ });
27278
+ this.observers.clear();
27279
+ }
27247
27280
  };
27248
27281
 
27249
27282
  // src/model/renderable/StraightLineModel.ts
@@ -27277,6 +27310,8 @@ var StraightLineModel = class extends ElementModel {
27277
27310
  this.root.set("points", new Y11.Array());
27278
27311
  }
27279
27312
  }
27313
+ subDispose() {
27314
+ }
27280
27315
  onVectorUpdate() {
27281
27316
  if (!this.item) {
27282
27317
  return;
@@ -27350,7 +27385,7 @@ var StraightLineModel = class extends ElementModel {
27350
27385
  exclude: ["fillColor"]
27351
27386
  };
27352
27387
  }
27353
- onStyleKeyUpdate(key) {
27388
+ onStyleKeyUpdate(_key) {
27354
27389
  if (!this.item) {
27355
27390
  return;
27356
27391
  }
@@ -27572,7 +27607,7 @@ var RenderableModel = class extends EventEmitter2 {
27572
27607
  return segmentsModel;
27573
27608
  }
27574
27609
  createSelector() {
27575
- let shadow = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
27610
+ let _shadow = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
27576
27611
  if (!this.hasPermission(WhiteboardPermissionFlag.editSelf) && !this.hasPermission(WhiteboardPermissionFlag.deleteOthers)) {
27577
27612
  return null;
27578
27613
  }
@@ -27629,7 +27664,11 @@ var RenderableModel = class extends EventEmitter2 {
27629
27664
  });
27630
27665
  }
27631
27666
  dispose() {
27667
+ this.elements.unobserve(this.onElementsChange);
27632
27668
  this.elements.clear();
27669
+ Array.from(this.elementModels.values()).forEach((model) => {
27670
+ model.dispose();
27671
+ });
27633
27672
  }
27634
27673
  };
27635
27674
 
@@ -27672,10 +27711,10 @@ var AnglePrecision = Deg2Rad(2);
27672
27711
  var Phi = 0.5 * (-1 + Math.sqrt(5));
27673
27712
  function DollarRecognizer() {
27674
27713
  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)));
27714
+ 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)]);
27715
+ 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)]);
27716
+ 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)]);
27717
+ 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
27718
  this.Recognize = function(points, useProtractor) {
27680
27719
  var t0 = Date.now();
27681
27720
  var candidate = new Unistroke("", points);
@@ -27736,7 +27775,7 @@ function RotateBy(points, radians) {
27736
27775
  var c = Centroid(points);
27737
27776
  var cos = Math.cos(radians);
27738
27777
  var sin = Math.sin(radians);
27739
- var newpoints = new Array();
27778
+ var newpoints = [];
27740
27779
  for (var i = 0; i < points.length; i++) {
27741
27780
  var qx = (points[i].X - c.X) * cos - (points[i].Y - c.Y) * sin + c.X;
27742
27781
  var qy = (points[i].X - c.X) * sin + (points[i].Y - c.Y) * cos + c.Y;
@@ -27746,7 +27785,7 @@ function RotateBy(points, radians) {
27746
27785
  }
27747
27786
  function ScaleTo(points, size) {
27748
27787
  var B2 = BoundingBox(points);
27749
- var newpoints = new Array();
27788
+ var newpoints = [];
27750
27789
  for (var i = 0; i < points.length; i++) {
27751
27790
  var qx = points[i].X * (size / B2.Width);
27752
27791
  var qy = points[i].Y * (size / B2.Height);
@@ -27756,7 +27795,7 @@ function ScaleTo(points, size) {
27756
27795
  }
27757
27796
  function TranslateTo(points, pt) {
27758
27797
  var c = Centroid(points);
27759
- var newpoints = new Array();
27798
+ var newpoints = [];
27760
27799
  for (var i = 0; i < points.length; i++) {
27761
27800
  var qx = points[i].X + pt.X - c.X;
27762
27801
  var qy = points[i].Y + pt.Y - c.Y;
@@ -27766,14 +27805,14 @@ function TranslateTo(points, pt) {
27766
27805
  }
27767
27806
  function Vectorize(points) {
27768
27807
  var sum = 0;
27769
- var vector = new Array();
27770
- for (var i = 0; i < points.length; i++) {
27808
+ var vector = [];
27809
+ for (let i = 0; i < points.length; i++) {
27771
27810
  vector[vector.length] = points[i].X;
27772
27811
  vector[vector.length] = points[i].Y;
27773
27812
  sum += points[i].X * points[i].X + points[i].Y * points[i].Y;
27774
27813
  }
27775
27814
  var magnitude = Math.sqrt(sum);
27776
- for (var i = 0; i < vector.length; i++)
27815
+ for (let i = 0; i < vector.length; i++)
27777
27816
  vector[i] /= magnitude;
27778
27817
  return vector;
27779
27818
  }
@@ -27927,8 +27966,11 @@ var CurveTool = class extends WhiteboardTool {
27927
27966
  _defineProperty19(this, "pointCount", 0);
27928
27967
  this.tool.minDistance = 1;
27929
27968
  }
27930
- onMouseDown(event) {
27969
+ onMouseDown(_event) {
27931
27970
  this.pointCount = 0;
27971
+ if (this.elementModel) {
27972
+ this.elementModel.dispose();
27973
+ }
27932
27974
  this.elementModel = this.modelGetter().createCurve(true);
27933
27975
  }
27934
27976
  onMouseDrag(event) {
@@ -27999,6 +28041,9 @@ var RectangleTool = class extends WhiteboardTool {
27999
28041
  this.tool.minDistance = 1;
28000
28042
  }
28001
28043
  onMouseDown(event) {
28044
+ if (this.elementModel) {
28045
+ this.elementModel.dispose();
28046
+ }
28002
28047
  this.elementModel = this.modelGetter().createRectangle(true);
28003
28048
  this.from = event.point.clone();
28004
28049
  this.to = event.point.clone();
@@ -28116,6 +28161,10 @@ var ToolbarModel = class extends EventEmitter3 {
28116
28161
  }
28117
28162
  });
28118
28163
  }
28164
+ dispose() {
28165
+ this.root.unobserve(this.handleRootUpdate);
28166
+ this.removeAllListeners();
28167
+ }
28119
28168
  };
28120
28169
 
28121
28170
  // src/tool/SelectorTool.ts
@@ -28149,6 +28198,9 @@ var SelectorTool = class extends WhiteboardTool {
28149
28198
  onMouseDown(event) {
28150
28199
  this.from = null;
28151
28200
  this.to = null;
28201
+ if (this.elementModel) {
28202
+ this.elementModel.dispose();
28203
+ }
28152
28204
  this.elementModel = this.modelGetter().createSelector();
28153
28205
  this.from = event.point.clone();
28154
28206
  this.to = event.point.clone();
@@ -28246,12 +28298,16 @@ var SelectElementsModel = class extends EventEmitter4 {
28246
28298
  const cb = this.observers.get(user.id);
28247
28299
  if (cb) {
28248
28300
  this.requestUserMap(user.id).unobserveDeep(cb);
28301
+ this.observers.delete(user.id);
28249
28302
  }
28250
28303
  });
28251
28304
  _defineProperty23(this, "handleUserJoin", (user) => {
28252
28305
  const observer = (evts) => {
28253
28306
  this.handleUserSelectElementsChange(user.id, evts);
28254
28307
  };
28308
+ if (this.observers.has(user.id)) {
28309
+ this.requestUserMap(user.id).unobserveDeep(this.observers.get(user.id));
28310
+ }
28255
28311
  this.requestUserMap(user.id).observeDeep(observer);
28256
28312
  this.observers.set(user.id, observer);
28257
28313
  });
@@ -28271,6 +28327,9 @@ var SelectElementsModel = class extends EventEmitter4 {
28271
28327
  const observer = (evts) => {
28272
28328
  this.handleUserSelectElementsChange(userId, evts);
28273
28329
  };
28330
+ if (this.observers.has(userId)) {
28331
+ this.requestUserMap(userId).unobserveDeep(this.observers.get(userId));
28332
+ }
28274
28333
  this.requestUserMap(userId).observeDeep(observer);
28275
28334
  this.observers.set(userId, observer);
28276
28335
  });
@@ -28325,12 +28384,9 @@ var SelectElementsModel = class extends EventEmitter4 {
28325
28384
  });
28326
28385
  }
28327
28386
  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
- });
28387
+ for (const [key, value] of this.observers.entries()) {
28388
+ this.requestUserMap(key).unobserveDeep(value);
28389
+ }
28334
28390
  this.observers.clear();
28335
28391
  this.userManager.off("leave", this.handleUserLeave);
28336
28392
  this.userManager.off("join", this.handleUserJoin);
@@ -28392,12 +28448,12 @@ var TextEditor = class extends EventEmitter5 {
28392
28448
  });
28393
28449
  this.camera = camera;
28394
28450
  this.rootView = document.createElement("div");
28395
- this.rootView.style.cssText = `position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden;`;
28451
+ this.rootView.style.cssText = "position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden;";
28396
28452
  this.content = document.createElement("div");
28397
28453
  this.content.setAttribute("spellcheck", "false");
28398
28454
  this.content.textContent = "";
28399
28455
  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;`;
28456
+ 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
28457
  this.content.style.transformOrigin = "0 0";
28402
28458
  this.rootView.appendChild(this.content);
28403
28459
  this.content.addEventListener("input", this.handleContentInput);
@@ -28742,7 +28798,7 @@ var Editor = class extends EventEmitter6 {
28742
28798
  }
28743
28799
  if (this.editMode === "matrix" && this.editAnchor && this.lastEditPoint) {
28744
28800
  const offsetX = evt.pageX - this.lastEditPoint.x;
28745
- let offsetY = evt.pageY - this.lastEditPoint.y;
28801
+ const offsetY = evt.pageY - this.lastEditPoint.y;
28746
28802
  this.bounds.offsetBy(this.editAnchor, offsetX, offsetY, this.uniformScale ? this.aspectRatio : -1);
28747
28803
  this.lastEditPoint = {
28748
28804
  x: evt.pageX,
@@ -28767,7 +28823,7 @@ var Editor = class extends EventEmitter6 {
28767
28823
  }
28768
28824
  if (this.editMode === "translate" && this.lastEditPoint) {
28769
28825
  const offsetX = evt.pageX - this.lastEditPoint.x;
28770
- let offsetY = evt.pageY - this.lastEditPoint.y;
28826
+ const offsetY = evt.pageY - this.lastEditPoint.y;
28771
28827
  this.bounds.translate(offsetX, offsetY);
28772
28828
  this.updateBoundsByShadow();
28773
28829
  this.lastEditPoint = {
@@ -28844,7 +28900,7 @@ var Editor = class extends EventEmitter6 {
28844
28900
  this.ctrlId = initConfig.ctrlId;
28845
28901
  this.ctrlNickName = initConfig.ctrlNickName;
28846
28902
  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%);`;
28903
+ this.rootView.style.cssText = "position:absolute;display:none;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);";
28848
28904
  this.frame = document.createElement("div");
28849
28905
  this.frame.style.position = "absolute";
28850
28906
  this.frame.style.padding = "8px";
@@ -28865,7 +28921,7 @@ var Editor = class extends EventEmitter6 {
28865
28921
  } else {
28866
28922
  this.title = document.createElement("div");
28867
28923
  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%);`;
28924
+ 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
28925
  this.frame.appendChild(this.title);
28870
28926
  this.rootView.style.pointerEvents = "none";
28871
28927
  }
@@ -29037,7 +29093,9 @@ var Editor = class extends EventEmitter6 {
29037
29093
  this.targets = [];
29038
29094
  this.editorConfig = null;
29039
29095
  if (this.ctrlId !== this.viewerId) {
29040
- this.scope.project.view.off("frame", this.updateBounds);
29096
+ if (this.scope.project.view) {
29097
+ this.scope.project.view.off("frame", this.updateBounds);
29098
+ }
29041
29099
  }
29042
29100
  }
29043
29101
  show() {
@@ -29096,7 +29154,7 @@ var TextTool = class extends WhiteboardTool {
29096
29154
  onMouseDown(event) {
29097
29155
  this.from = event.point.clone();
29098
29156
  }
29099
- onMouseDrag(event) {
29157
+ onMouseDrag(_event) {
29100
29158
  }
29101
29159
  onMouseUp(event) {
29102
29160
  this.to = event.point.clone();
@@ -29108,6 +29166,9 @@ var TextTool = class extends WhiteboardTool {
29108
29166
  }
29109
29167
  }
29110
29168
  createPointEditor(x, y) {
29169
+ if (this.elementModel) {
29170
+ this.elementModel.dispose();
29171
+ }
29111
29172
  this.elementModel = this.modelGetter().createPointText(x, y, true);
29112
29173
  if (this.elementModel === null) {
29113
29174
  return;
@@ -29313,6 +29374,9 @@ var Camera = class extends EventEmitter8 {
29313
29374
  const observer = (evt) => {
29314
29375
  this.handleViewMatrixUpdate(user.id, evt);
29315
29376
  };
29377
+ if (this.observers.has(user.id)) {
29378
+ this.requestUserMap(user.id).unobserve(observer);
29379
+ }
29316
29380
  this.requestUserMap(user.id).observe(observer);
29317
29381
  this.observers.set(user.id, observer);
29318
29382
  });
@@ -29392,7 +29456,7 @@ var Camera = class extends EventEmitter8 {
29392
29456
  });
29393
29457
  this.maxScale = maxScale;
29394
29458
  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%);`;
29459
+ 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
29460
  this.initSize = initSize;
29397
29461
  this.hasPermission = hasPermission;
29398
29462
  this.paperSize = _paperSize;
@@ -29417,6 +29481,9 @@ var Camera = class extends EventEmitter8 {
29417
29481
  const observer = (evt) => {
29418
29482
  this.handleViewMatrixUpdate(userId, evt);
29419
29483
  };
29484
+ if (this.observers.has(userId)) {
29485
+ this.requestUserMap(userId).unobserve(observer);
29486
+ }
29420
29487
  this.requestUserMap(userId).observe(observer);
29421
29488
  this.observers.set(userId, observer);
29422
29489
  });
@@ -29453,7 +29520,7 @@ var Camera = class extends EventEmitter8 {
29453
29520
  this.bound.style.boxShadow = `inset 0px 0px 6px 2px ${this.boundaryColor}`;
29454
29521
  window.clearTimeout(this.boundTiemoutId);
29455
29522
  this.boundTiemoutId = window.setTimeout(() => {
29456
- this.bound.style.boxShadow = `none`;
29523
+ this.bound.style.boxShadow = "none";
29457
29524
  }, 100);
29458
29525
  }
29459
29526
  }
@@ -29463,6 +29530,9 @@ var Camera = class extends EventEmitter8 {
29463
29530
  updateInherentScale(scale) {
29464
29531
  this.inherentScale = scale;
29465
29532
  }
29533
+ getInherentScale() {
29534
+ return this.inherentScale;
29535
+ }
29466
29536
  getActiveMatrix() {
29467
29537
  const cameraMode = this.requestUserMap(this.userManager.selfId).get(WhiteboardKeys.cameraMode);
29468
29538
  let matrixValue;
@@ -29605,6 +29675,19 @@ var Camera = class extends EventEmitter8 {
29605
29675
  y: 0
29606
29676
  };
29607
29677
  }
29678
+ dispose() {
29679
+ Array.from(this.observers.keys()).forEach((userId) => {
29680
+ const cb = this.observers.get(userId);
29681
+ if (cb) {
29682
+ this.requestUserMap(userId).unobserve(cb);
29683
+ }
29684
+ });
29685
+ this.whiteboardAttrsMap.unobserve(this.handleMainCameraChange);
29686
+ this.userManager.off("join", this.handleUserJoin);
29687
+ this.userManager.off("leave", this.handleUserLeave);
29688
+ this.gesture.removeAllListeners();
29689
+ this.removeAllListeners();
29690
+ }
29608
29691
  };
29609
29692
 
29610
29693
  // src/tool/EllipseTool.ts
@@ -29634,6 +29717,9 @@ var EllipseTool = class extends WhiteboardTool {
29634
29717
  this.tool.minDistance = 1;
29635
29718
  }
29636
29719
  onMouseDown(event) {
29720
+ if (this.elementModel) {
29721
+ this.elementModel.dispose();
29722
+ }
29637
29723
  this.elementModel = this.modelGetter().createSegmentedPath("ellipse", true);
29638
29724
  this.from = event.point.clone();
29639
29725
  this.to = event.point.clone();
@@ -29685,6 +29771,9 @@ var TriangleTool = class extends WhiteboardTool {
29685
29771
  this.tool.minDistance = 1;
29686
29772
  }
29687
29773
  onMouseDown(event) {
29774
+ if (this.elementModel) {
29775
+ this.elementModel.dispose();
29776
+ }
29688
29777
  this.elementModel = this.modelGetter().createTriangle(true);
29689
29778
  this.from = event.point.clone();
29690
29779
  this.to = event.point.clone();
@@ -29801,8 +29890,11 @@ var EraserTool = class extends WhiteboardTool {
29801
29890
  this.trashedElementsModel = trashedElementsModel;
29802
29891
  this.tool.minDistance = 1;
29803
29892
  }
29804
- onMouseDown(event) {
29893
+ onMouseDown(_event) {
29805
29894
  this.pointCount = 0;
29895
+ if (this.elementModel) {
29896
+ this.elementModel.dispose();
29897
+ }
29806
29898
  this.elementModel = this.modelGetter().createEraser();
29807
29899
  }
29808
29900
  onMouseDrag(event) {
@@ -29824,7 +29916,7 @@ var EraserTool = class extends WhiteboardTool {
29824
29916
  }
29825
29917
  });
29826
29918
  }
29827
- onMouseUp(event) {
29919
+ onMouseUp(_event) {
29828
29920
  if (this.elementModel) {
29829
29921
  this.modelGetter().removeElementItem(this.elementModel.uuid);
29830
29922
  }
@@ -29875,6 +29967,9 @@ var TrashedElementsModel = class extends EventEmitter10 {
29875
29967
  const observer = (evts) => {
29876
29968
  this.handleUserTrashElementsChange(user.id, evts);
29877
29969
  };
29970
+ if (this.observers.has(user.id)) {
29971
+ this.requestUserMap(user.id).unobserveDeep(this.observers.get(user.id));
29972
+ }
29878
29973
  this.requestUserMap(user.id).observeDeep(observer);
29879
29974
  this.observers.set(user.id, observer);
29880
29975
  });
@@ -29886,6 +29981,9 @@ var TrashedElementsModel = class extends EventEmitter10 {
29886
29981
  const observer = (evts) => {
29887
29982
  this.handleUserTrashElementsChange(userId, evts);
29888
29983
  };
29984
+ if (this.observers.has(userId)) {
29985
+ this.requestUserMap(userId).unobserveDeep(this.observers.get(userId));
29986
+ }
29889
29987
  this.requestUserMap(userId).observeDeep(observer);
29890
29988
  this.observers.set(userId, observer);
29891
29989
  });
@@ -29940,12 +30038,9 @@ var TrashedElementsModel = class extends EventEmitter10 {
29940
30038
  });
29941
30039
  }
29942
30040
  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
- });
30041
+ for (const [key, value] of this.observers.entries()) {
30042
+ this.requestUserMap(key).unobserveDeep(value);
30043
+ }
29949
30044
  this.observers.clear();
29950
30045
  this.userManager.off("leave", this.handleUserLeave);
29951
30046
  this.userManager.off("join", this.handleUserJoin);
@@ -29977,8 +30072,11 @@ var LaserPointerTool = class extends WhiteboardTool {
29977
30072
  _defineProperty34(this, "pointCount", 0);
29978
30073
  this.tool.minDistance = 5;
29979
30074
  }
29980
- onMouseDown(event) {
30075
+ onMouseDown(_event) {
29981
30076
  this.pointCount = 0;
30077
+ if (this.elementModel) {
30078
+ this.elementModel.dispose();
30079
+ }
29982
30080
  this.elementModel = this.modelGetter().createLaserPointer();
29983
30081
  }
29984
30082
  onMouseDrag(event) {
@@ -29990,7 +30088,7 @@ var LaserPointerTool = class extends WhiteboardTool {
29990
30088
  this.elementModel.appendPoints([event.point.x, event.point.y]);
29991
30089
  }
29992
30090
  }
29993
- onMouseUp(event) {
30091
+ onMouseUp(_event) {
29994
30092
  if (this.elementModel) {
29995
30093
  this.elementModel.beginRemoveAnimate();
29996
30094
  }
@@ -30112,11 +30210,11 @@ var PageModel = class extends EventEmitter11 {
30112
30210
  }
30113
30211
  const cameraMode = this.requestUserMap(this.userManager.selfId).get(WhiteboardKeys.cameraMode);
30114
30212
  if (cameraMode !== "main") {
30115
- console.warn(`cannot modify pages in non-main view mode.`);
30213
+ console.warn("cannot modify pages in non-main view mode.");
30116
30214
  return false;
30117
30215
  }
30118
30216
  if (!this.hasPermission(WhiteboardPermissionFlag.mainView)) {
30119
- console.warn(`cannot modify pages without WhiteboardPermissionFlag.mainView.`);
30217
+ console.warn("cannot modify pages without WhiteboardPermissionFlag.mainView.");
30120
30218
  return false;
30121
30219
  }
30122
30220
  return true;
@@ -30168,15 +30266,24 @@ var PageModel = class extends EventEmitter11 {
30168
30266
  }
30169
30267
  }
30170
30268
  }
30269
+ dispose() {
30270
+ for (const entry of this.observers.entries()) {
30271
+ const [userId, observer] = entry;
30272
+ this.requestUserMap(userId).unobserve(observer);
30273
+ }
30274
+ this.userManager.off("join", this.handleUserJoin);
30275
+ this.userManager.off("leave", this.handleUserLeave);
30276
+ this.whiteboardAttrsMap.unobserve(this.handleMainPageChange);
30277
+ this.pageMap.unobserve(this.handlePageMapChange);
30278
+ }
30171
30279
  };
30172
30280
 
30173
30281
  // src/utils/async.ts
30174
30282
  var delay = (value) => new Promise((resolve) => setTimeout(resolve, value));
30175
30283
  async function waitUntil(fn, timeout) {
30176
- let start = Date.now();
30284
+ const start = Date.now();
30177
30285
  while (!fn() && Date.now() - start < timeout) {
30178
30286
  await delay(50);
30179
- start = Date.now();
30180
30287
  }
30181
30288
  }
30182
30289
 
@@ -30205,14 +30312,14 @@ var IndexedNavigation = class extends EventEmitter12 {
30205
30312
  return this.pageModel.pageList().filter((id) => /^_i_/.test(id));
30206
30313
  }
30207
30314
  get head() {
30208
- let headId = Object.keys(this.list).find((key) => {
30315
+ const headId = Object.keys(this.list).find((key) => {
30209
30316
  return this.list[key] && this.list[key].prev === "";
30210
30317
  });
30211
30318
  if (!headId) {
30212
- log2(`indexed navigation confusion`, {
30319
+ log2("indexed navigation confusion", {
30213
30320
  list: JSON.stringify(this.list)
30214
30321
  }, "error");
30215
- throw new Error(`indexed navigation confusion`);
30322
+ throw new Error("indexed navigation confusion");
30216
30323
  }
30217
30324
  return headId;
30218
30325
  }
@@ -30233,7 +30340,7 @@ var IndexedNavigation = class extends EventEmitter12 {
30233
30340
  _defineProperty36(this, "indexedPageMap", void 0);
30234
30341
  _defineProperty36(this, "list", {});
30235
30342
  _defineProperty36(this, "hasPermission", void 0);
30236
- _defineProperty36(this, "handleIndexedPageMapUpdate", (evt) => {
30343
+ _defineProperty36(this, "handleIndexedPageMapUpdate", (_evt) => {
30237
30344
  this.list = this.indexedPageMap.get("list");
30238
30345
  const needRemoveList = this.pageModel.pageList().filter((v) => /^_i_/.test(v) && Object.keys(this.list).indexOf(v) < 0);
30239
30346
  const needAddList = Object.keys(this.list).filter((v) => this.pageModel.pageList().indexOf(v) < 0);
@@ -30288,8 +30395,8 @@ var IndexedNavigation = class extends EventEmitter12 {
30288
30395
  initIndexed() {
30289
30396
  return new Promise((resolve) => {
30290
30397
  setTimeout(() => {
30398
+ this.pageModel.addPage("_i_");
30291
30399
  if (this.pageModel.pageList().length === 0) {
30292
- this.pageModel.addPage("_i_");
30293
30400
  resolve(true);
30294
30401
  } else {
30295
30402
  resolve(false);
@@ -30298,15 +30405,15 @@ var IndexedNavigation = class extends EventEmitter12 {
30298
30405
  });
30299
30406
  }
30300
30407
  /**
30301
- * 获取总页数
30302
- * @returns {number}
30303
- */
30408
+ * 获取总页数
30409
+ * @returns {number}
30410
+ */
30304
30411
  get pageCount() {
30305
30412
  return this.idList.length;
30306
30413
  }
30307
30414
  /**
30308
- * 获取当前页索引
30309
- */
30415
+ * 获取当前页索引
30416
+ */
30310
30417
  get currentPageIndex() {
30311
30418
  const userPageId = this.userMap.get(WhiteboardKeys.currentPage);
30312
30419
  return this.getPageIndex(userPageId);
@@ -30326,9 +30433,9 @@ var IndexedNavigation = class extends EventEmitter12 {
30326
30433
  return i;
30327
30434
  }
30328
30435
  /**
30329
- * 获取指定索引对应的 pageId
30330
- * @param {number} index
30331
- */
30436
+ * 获取指定索引对应的 pageId
30437
+ * @param {number} index
30438
+ */
30332
30439
  getPageId(index) {
30333
30440
  const firstKey = this.head;
30334
30441
  if (firstKey) {
@@ -30350,20 +30457,20 @@ var IndexedNavigation = class extends EventEmitter12 {
30350
30457
  modifyDetect() {
30351
30458
  const cameraMode = this.userMap.get(WhiteboardKeys.cameraMode);
30352
30459
  if (cameraMode !== "main") {
30353
- console.warn(`cannot modify pages in non-main view mode.`);
30460
+ console.warn("cannot modify pages in non-main view mode.");
30354
30461
  return false;
30355
30462
  }
30356
30463
  if (!this.hasPermission(WhiteboardPermissionFlag.mainView)) {
30357
- console.warn(`cannot modify pages without WhiteboardPermissionFlag.mainView.`);
30464
+ console.warn("cannot modify pages without WhiteboardPermissionFlag.mainView.");
30358
30465
  return false;
30359
30466
  }
30360
30467
  return true;
30361
30468
  }
30362
30469
  /**
30363
- * 在尾部插入新页面
30364
- * @param {boolean=} goto 是否跳转到新页面, 默认 true
30365
- * @return 总页数
30366
- */
30470
+ * 在尾部插入新页面
30471
+ * @param {boolean=} goto 是否跳转到新页面, 默认 true
30472
+ * @return 总页数
30473
+ */
30367
30474
  pushPage() {
30368
30475
  let goto = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
30369
30476
  this.indexedPageMap.doc.transact(() => {
@@ -30392,11 +30499,11 @@ var IndexedNavigation = class extends EventEmitter12 {
30392
30499
  return this.pageCount;
30393
30500
  }
30394
30501
  /**
30395
- * 在 after 之后插入新页面
30396
- * @param {number} after 在此页之后插入
30397
- * @param {boolean=} goto 是否跳转到新页面, 默认 true
30398
- * @return 总页数
30399
- */
30502
+ * 在 after 之后插入新页面
30503
+ * @param {number} after 在此页之后插入
30504
+ * @param {boolean=} goto 是否跳转到新页面, 默认 true
30505
+ * @return 总页数
30506
+ */
30400
30507
  insertPage(after) {
30401
30508
  let goto = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
30402
30509
  const afterPageId = this.getPageId(after);
@@ -30405,7 +30512,7 @@ var IndexedNavigation = class extends EventEmitter12 {
30405
30512
  }
30406
30513
  const cameraMode = this.userMap.get(WhiteboardKeys.cameraMode);
30407
30514
  if (cameraMode !== "main") {
30408
- console.warn(`cannot modify pages in non-main view mode.`);
30515
+ console.warn("cannot modify pages in non-main view mode.");
30409
30516
  return this.pageCount;
30410
30517
  }
30411
30518
  const prev = this.list[afterPageId];
@@ -30448,8 +30555,8 @@ var IndexedNavigation = class extends EventEmitter12 {
30448
30555
  return this.pageCount;
30449
30556
  }
30450
30557
  /**
30451
- * 跳转至上一页, 并返回跳转后的页面索引.
30452
- */
30558
+ * 跳转至上一页, 并返回跳转后的页面索引.
30559
+ */
30453
30560
  prevPage() {
30454
30561
  const currentPageId = this.userMap.get(WhiteboardKeys.currentPage);
30455
30562
  const data = this.list[currentPageId];
@@ -30461,8 +30568,8 @@ var IndexedNavigation = class extends EventEmitter12 {
30461
30568
  return nextIndex;
30462
30569
  }
30463
30570
  /**
30464
- * 跳转至下一页, 并返回跳转后的页面索引.
30465
- */
30571
+ * 跳转至下一页, 并返回跳转后的页面索引.
30572
+ */
30466
30573
  nextPage() {
30467
30574
  const currentPageId = this.userMap.get(WhiteboardKeys.currentPage);
30468
30575
  const data = this.list[currentPageId];
@@ -30474,16 +30581,16 @@ var IndexedNavigation = class extends EventEmitter12 {
30474
30581
  return nextIndex;
30475
30582
  }
30476
30583
  /**
30477
- * 删除指定页面
30478
- * @param {number} index
30479
- */
30584
+ * 删除指定页面
30585
+ * @param {number} index
30586
+ */
30480
30587
  removePage(index) {
30481
30588
  if (this.pageCount <= 1) {
30482
30589
  return this.pageCount;
30483
30590
  }
30484
30591
  const cameraMode = this.userMap.get(WhiteboardKeys.cameraMode);
30485
30592
  if (cameraMode !== "main") {
30486
- console.warn(`cannot modify pages in non-main view mode.`);
30593
+ console.warn("cannot modify pages in non-main view mode.");
30487
30594
  return this.pageCount;
30488
30595
  }
30489
30596
  const targetId = this.getPageId(index);
@@ -30523,6 +30630,11 @@ var IndexedNavigation = class extends EventEmitter12 {
30523
30630
  this.pageModel.gotoPage(targetId);
30524
30631
  }
30525
30632
  }
30633
+ dispose() {
30634
+ this.indexedPageMap.unobserve(this.handleIndexedPageMapUpdate);
30635
+ this.pageModel.off("switchPage");
30636
+ this.pageModel.off("pagesChange");
30637
+ }
30526
30638
  };
30527
30639
 
30528
30640
  // src/utils/ShadowEmitter.ts
@@ -30585,6 +30697,9 @@ var StraightLineTool = class extends WhiteboardTool {
30585
30697
  this.tool.minDistance = 1;
30586
30698
  }
30587
30699
  onMouseDown(event) {
30700
+ if (this.elementModel) {
30701
+ this.elementModel.dispose();
30702
+ }
30588
30703
  this.elementModel = this.modelGetter().createStraightLine(true);
30589
30704
  this.from = event.point.clone();
30590
30705
  this.to = event.point.clone();
@@ -30647,7 +30762,20 @@ var GrabTool = class extends WhiteboardTool {
30647
30762
  }
30648
30763
  };
30649
30764
 
30650
- // src/WhiteboardApplication.ts
30765
+ // src/tool/PointerTool.ts
30766
+ var PointerTool = class extends WhiteboardTool {
30767
+ constructor(enableToolEvent, modelGetter, shadowEmitter, scope) {
30768
+ super(enableToolEvent, modelGetter, shadowEmitter, scope);
30769
+ }
30770
+ onMouseDown(_event) {
30771
+ }
30772
+ onMouseDrag(_event) {
30773
+ }
30774
+ onMouseUp() {
30775
+ }
30776
+ };
30777
+
30778
+ // src/SequenceExecutor.ts
30651
30779
  function _defineProperty40(e, r, t) {
30652
30780
  return (r = _toPropertyKey40(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30653
30781
  }
@@ -30665,6 +30793,53 @@ function _toPrimitive40(t, r) {
30665
30793
  }
30666
30794
  return ("string" === r ? String : Number)(t);
30667
30795
  }
30796
+ var SequenceExecutor = class {
30797
+ constructor() {
30798
+ _defineProperty40(this, "tasks", []);
30799
+ _defineProperty40(this, "isRunning", false);
30800
+ }
30801
+ addTask(task) {
30802
+ this.tasks.push(task);
30803
+ if (!this.isRunning) {
30804
+ this.execute();
30805
+ }
30806
+ }
30807
+ async execute() {
30808
+ if (this.isRunning) {
30809
+ return;
30810
+ }
30811
+ this.isRunning = true;
30812
+ while (this.tasks.length > 0) {
30813
+ const task = this.tasks.shift();
30814
+ if (task) {
30815
+ try {
30816
+ await task();
30817
+ } catch (e) {
30818
+ }
30819
+ }
30820
+ }
30821
+ this.isRunning = false;
30822
+ }
30823
+ };
30824
+
30825
+ // src/WhiteboardApplication.ts
30826
+ function _defineProperty41(e, r, t) {
30827
+ return (r = _toPropertyKey41(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30828
+ }
30829
+ function _toPropertyKey41(t) {
30830
+ var i = _toPrimitive41(t, "string");
30831
+ return "symbol" == typeof i ? i : i + "";
30832
+ }
30833
+ function _toPrimitive41(t, r) {
30834
+ if ("object" != typeof t || !t) return t;
30835
+ var e = t[Symbol.toPrimitive];
30836
+ if (void 0 !== e) {
30837
+ var i = e.call(t, r || "default");
30838
+ if ("object" != typeof i) return i;
30839
+ throw new TypeError("@@toPrimitive must return a primitive value.");
30840
+ }
30841
+ return ("string" === r ? String : Number)(t);
30842
+ }
30668
30843
  var WHITEBOARD_APP_NAME = "whiteboard";
30669
30844
  var WhiteboardApplication = class extends AbstractApplication {
30670
30845
  get undoManager() {
@@ -30678,43 +30853,45 @@ var WhiteboardApplication = class extends AbstractApplication {
30678
30853
  var _this;
30679
30854
  super();
30680
30855
  _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", () => {
30856
+ _defineProperty41(this, "name", WHITEBOARD_APP_NAME);
30857
+ _defineProperty41(this, "emitter", void 0);
30858
+ _defineProperty41(this, "toolbarModel", void 0);
30859
+ _defineProperty41(this, "selectElementsModel", void 0);
30860
+ _defineProperty41(this, "trashedElementsModel", void 0);
30861
+ _defineProperty41(this, "pageModel", void 0);
30862
+ _defineProperty41(this, "layers", /* @__PURE__ */ new Map());
30863
+ _defineProperty41(this, "undoManagers", /* @__PURE__ */ new Map());
30864
+ _defineProperty41(this, "rootElement", document.createElement("div"));
30865
+ _defineProperty41(this, "paperScope", new import_paper.default.PaperScope());
30866
+ _defineProperty41(this, "canvasElement", document.createElement("canvas"));
30867
+ _defineProperty41(this, "shadowScope", new import_paper.default.PaperScope());
30868
+ _defineProperty41(this, "snapshotCanvasElement", document.createElement("canvas"));
30869
+ _defineProperty41(this, "snapshotScope", new import_paper.default.PaperScope());
30870
+ _defineProperty41(this, "shadowCanvasElement", document.createElement("canvas"));
30871
+ _defineProperty41(this, "shadowEmitter", void 0);
30872
+ _defineProperty41(this, "tools", void 0);
30873
+ _defineProperty41(this, "editors", /* @__PURE__ */ new Map());
30874
+ _defineProperty41(this, "camera", void 0);
30875
+ _defineProperty41(this, "resizeObserver", void 0);
30876
+ _defineProperty41(this, "option", void 0);
30877
+ _defineProperty41(this, "permissions", void 0);
30878
+ _defineProperty41(this, "inputType", "any");
30879
+ _defineProperty41(this, "isPenEvent", false);
30880
+ _defineProperty41(this, "hasPenInput", null);
30881
+ _defineProperty41(this, "disableViewModelUpdate", false);
30882
+ _defineProperty41(this, "internalResizeObserver", true);
30883
+ _defineProperty41(this, "sequenceExecutor", new SequenceExecutor());
30884
+ _defineProperty41(this, "linkTarget", null);
30885
+ _defineProperty41(this, "enableToolEvent", () => {
30710
30886
  return !(this.inputType === "pen" && !this.isPenEvent);
30711
30887
  });
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(() => {
30888
+ _defineProperty41(this, "handlePageSwitch", (pageId) => {
30889
+ this.sequenceExecutor.addTask(async () => {
30890
+ for (const editor of this.editors.values()) {
30891
+ editor.hidden();
30892
+ }
30893
+ this.selectElementsModel.clearSelectElementForSelf();
30894
+ await waitUntil(() => this.layers.has(pageId), 1e3);
30718
30895
  if (this.layers.has(pageId)) {
30719
30896
  for (const entry of this.layers.entries()) {
30720
30897
  entry[1].off("elementInsert", this.handleElementInsert);
@@ -30726,6 +30903,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30726
30903
  renderableModel.on("elementRemove", this.handleElementRemove);
30727
30904
  renderableModel.on("elementClear", this.handleElementClear);
30728
30905
  renderableModel.flushRenderables();
30906
+ this.paperScope.project.activeLayer.data.pageId = pageId;
30729
30907
  const others = this.userManager.userIdList().filter((v) => v !== this.userId);
30730
30908
  for (const other of others) {
30731
30909
  if (this.userMap(other).get(WhiteboardKeys.currentPage) === pageId) {
@@ -30735,9 +30913,11 @@ var WhiteboardApplication = class extends AbstractApplication {
30735
30913
  }
30736
30914
  }
30737
30915
  }
30916
+ } else {
30917
+ console.warn(`[@netless/forge-whiteboard] page ${pageId} not found`);
30918
+ log3(`[@netless/forge-whiteboard] page ${pageId} not found`, {}, "warning");
30738
30919
  }
30739
- });
30740
- waitUntil(() => this.undoManagers.has(pageId), 3e3).then(() => {
30920
+ await waitUntil(() => this.undoManagers.has(pageId), 1e3);
30741
30921
  if (this.undoManagers.has(pageId)) {
30742
30922
  for (const entry of this.undoManagers.entries()) {
30743
30923
  entry[1].off("stack-item-added", this.handleStackItemAdded);
@@ -30745,24 +30925,27 @@ var WhiteboardApplication = class extends AbstractApplication {
30745
30925
  }
30746
30926
  this.undoManagers.get(pageId).on("stack-item-added", this.handleStackItemAdded);
30747
30927
  this.undoManagers.get(pageId).on("stack-item-popped", this.handleStackItemPopped);
30928
+ } else {
30929
+ console.warn(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`);
30930
+ log3(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`, {}, "warning");
30748
30931
  }
30932
+ this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30933
+ this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
30749
30934
  });
30750
- this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30751
- this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
30752
30935
  });
30753
- _defineProperty40(this, "hasPermission", (flag) => {
30936
+ _defineProperty41(this, "hasPermission", (flag) => {
30754
30937
  return this.permissions.hasPermission(flag, this.userId);
30755
30938
  });
30756
- _defineProperty40(this, "handleStackItemAdded", () => {
30939
+ _defineProperty41(this, "handleStackItemAdded", () => {
30757
30940
  this.selectElementsModel.clearSelectElementForSelf();
30758
30941
  this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30759
30942
  this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
30760
30943
  });
30761
- _defineProperty40(this, "handleStackItemPopped", () => {
30944
+ _defineProperty41(this, "handleStackItemPopped", () => {
30762
30945
  this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30763
30946
  this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
30764
30947
  });
30765
- _defineProperty40(this, "handleLayersChange", (ids) => {
30948
+ _defineProperty41(this, "handleLayersChange", (ids) => {
30766
30949
  for (let i = 0, len = ids.length; i < len; i++) {
30767
30950
  const id = ids[i];
30768
30951
  if (!this.layers.has(id)) {
@@ -30778,7 +30961,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30778
30961
  this.undoManagers.set(id, undoManager);
30779
30962
  }
30780
30963
  }
30781
- for (let entry of this.layers.entries()) {
30964
+ for (const entry of this.layers.entries()) {
30782
30965
  if (ids.indexOf(entry[0]) < 0) {
30783
30966
  const renderableModel = this.layers.get(entry[0]);
30784
30967
  this.layers.delete(entry[0]);
@@ -30794,17 +30977,17 @@ var WhiteboardApplication = class extends AbstractApplication {
30794
30977
  }
30795
30978
  }
30796
30979
  });
30797
- _defineProperty40(this, "getCurrentRenderableModel", () => {
30798
- let layerId = this.userMap(this.userId).get(WhiteboardKeys.currentPage);
30980
+ _defineProperty41(this, "getCurrentRenderableModel", () => {
30981
+ const layerId = this.userMap(this.userId).get(WhiteboardKeys.currentPage);
30799
30982
  if (!this.layers.has(layerId)) {
30800
30983
  this.emitter.emit("error", 300002, `target page: ${layerId} not found`);
30801
30984
  }
30802
30985
  return this.layers.get(layerId);
30803
30986
  });
30804
- _defineProperty40(this, "handleElementClear", () => {
30987
+ _defineProperty41(this, "handleElementClear", () => {
30805
30988
  this.paperScope.project.activeLayer.removeChildren();
30806
30989
  });
30807
- _defineProperty40(this, "handleElementInsert", (elements) => {
30990
+ _defineProperty41(this, "handleElementInsert", (elements) => {
30808
30991
  for (const element of elements) {
30809
30992
  element.createPaperElement();
30810
30993
  const scope = element.shadow === "" ? this.paperScope : this.shadowScope;
@@ -30816,7 +30999,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30816
30999
  this.insertElementToParent(element.item, scope.project.activeLayer);
30817
31000
  }
30818
31001
  });
30819
- _defineProperty40(this, "handleElementRemove", (elementId, layerId) => {
31002
+ _defineProperty41(this, "handleElementRemove", (elementId, layerId) => {
30820
31003
  const layerModel = this.layers.get(layerId);
30821
31004
  if (!layerModel) {
30822
31005
  return;
@@ -30827,11 +31010,11 @@ var WhiteboardApplication = class extends AbstractApplication {
30827
31010
  }
30828
31011
  layerModel.elementModels.delete(elementId);
30829
31012
  });
30830
- _defineProperty40(this, "handleRemoveTrashedElementForSelf", (userId, elementId) => {
31013
+ _defineProperty41(this, "handleRemoveTrashedElementForSelf", (userId, elementId) => {
30831
31014
  const selfLayerId = this.userMap(this.userId).get(WhiteboardKeys.currentPage);
30832
31015
  this.layers.get(selfLayerId)?.removeElementItem(elementId);
30833
31016
  });
30834
- _defineProperty40(this, "handleElementsTrash", (userId, elements) => {
31017
+ _defineProperty41(this, "handleElementsTrash", (userId, elements) => {
30835
31018
  const targetLayerId = this.userMap(userId).get(WhiteboardKeys.currentPage);
30836
31019
  const selfLayerId = this.userMap(this.userId).get(WhiteboardKeys.currentPage);
30837
31020
  if (targetLayerId !== selfLayerId || !this.layers.has(targetLayerId)) {
@@ -30844,7 +31027,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30844
31027
  }
30845
31028
  });
30846
31029
  });
30847
- _defineProperty40(this, "handleElementsSelect", (userId, elements) => {
31030
+ _defineProperty41(this, "handleElementsSelect", (userId, elements) => {
30848
31031
  if (!this.editors.has(userId)) {
30849
31032
  const ctrl = this.userManager.getUser(userId);
30850
31033
  const editor2 = new Editor(this.paperScope, this.shadowScope, this.shadowEmitter, this.canvasElement, this.camera, {
@@ -30876,7 +31059,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30876
31059
  }).filter((v) => !!v);
30877
31060
  editor.setTargets(elementModels);
30878
31061
  if (elementModels.length === 1) {
30879
- let model = elementModels[0];
31062
+ const model = elementModels[0];
30880
31063
  if (model.item) {
30881
31064
  const topLeft = this.paperScope.project.view.projectToView(model.item.bounds.topLeft);
30882
31065
  const bottomRight = this.paperScope.project.view.projectToView(model.item.bounds.bottomRight);
@@ -30887,7 +31070,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30887
31070
  this.emitter.emit("elementDeselected", userId);
30888
31071
  }
30889
31072
  });
30890
- _defineProperty40(this, "handleLinkedMapChange", (evt) => {
31073
+ _defineProperty41(this, "handleLinkedMapChange", (evt) => {
30891
31074
  for (const [key, value] of evt.changes.keys.entries()) {
30892
31075
  if (Object.keys(TOOLBAR_KEYS).indexOf(key) >= 0 && (value.action === "add" || value.action === "update")) {
30893
31076
  this.toolbarModel.currentTool = evt.target.get(TOOLBAR_KEYS.tool);
@@ -30899,11 +31082,12 @@ var WhiteboardApplication = class extends AbstractApplication {
30899
31082
  this.toolbarModel.dashArray = evt.target.get(TOOLBAR_KEYS.dashArray);
30900
31083
  }
30901
31084
  if (key === "permission" && (value.action === "add" || value.action === "update")) {
31085
+ this.permissions.removePermission(WhiteboardPermissionFlag.all);
30902
31086
  this.permissions.addPermission(evt.target.get("permission"), this.userId);
30903
31087
  }
30904
31088
  }
30905
31089
  });
30906
- _defineProperty40(this, "adjustByOutFrame", (frameWidth, frameHeight) => {
31090
+ _defineProperty41(this, "adjustByOutFrame", (frameWidth, frameHeight) => {
30907
31091
  if (this.option.width > 0 && this.option.height > 0) {
30908
31092
  const minWidth = Math.max(frameWidth, 10);
30909
31093
  const minHeight = Math.max(frameHeight, 10);
@@ -30921,6 +31105,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30921
31105
  });
30922
31106
  requestAnimationFrameHook(this.paperScope);
30923
31107
  requestAnimationFrameHook(this.shadowScope);
31108
+ const that = this;
30924
31109
  this.rootElement.setAttribute("data-forge-app", "whiteboard");
30925
31110
  document.body.addEventListener("pointerdown", (evt) => {
30926
31111
  this.isPenEvent = evt.pointerType === "pen";
@@ -31092,7 +31277,6 @@ var WhiteboardApplication = class extends AbstractApplication {
31092
31277
  errorMessage
31093
31278
  });
31094
31279
  });
31095
- const that = this;
31096
31280
  Object.defineProperty(this.emitter, "tool", {
31097
31281
  get() {
31098
31282
  return that.toolbarModel.currentTool;
@@ -31241,6 +31425,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31241
31425
  return this.userMap(userId);
31242
31426
  }, this.hasPermission);
31243
31427
  this.tools = {
31428
+ pointer: new PointerTool(this.enableToolEvent, this.getCurrentRenderableModel, this.shadowEmitter, this.paperScope),
31244
31429
  curve: new CurveTool(this.enableToolEvent, this.getCurrentRenderableModel, this.shadowEmitter, this.paperScope),
31245
31430
  rectangle: new RectangleTool(this.enableToolEvent, this.getCurrentRenderableModel, this.shadowEmitter, this.paperScope),
31246
31431
  selector: new SelectorTool(this.enableToolEvent, this.getCurrentRenderableModel, this.shadowEmitter, this.paperScope, this.selectElementsModel),
@@ -31256,6 +31441,11 @@ var WhiteboardApplication = class extends AbstractApplication {
31256
31441
  this.toolbarModel.on("update", (style) => {
31257
31442
  if (this.tools[style.tool]) {
31258
31443
  this.paperScope.tool = this.tools[style.tool].tool;
31444
+ if (style.tool === "pointer") {
31445
+ this.rootElement.style.pointerEvents = "none";
31446
+ } else {
31447
+ this.rootElement.style.pointerEvents = "auto";
31448
+ }
31259
31449
  } else {
31260
31450
  this.emitter.emit("error", 300001, `${style.tool} not supported`);
31261
31451
  }
@@ -31434,7 +31624,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31434
31624
  if (renderableModel.elementModels.has(key)) {
31435
31625
  elementModel = renderableModel.elementModels.get(key) ?? null;
31436
31626
  } else {
31437
- let elementMap = renderableModel.elements.get(key);
31627
+ const elementMap = renderableModel.elements.get(key);
31438
31628
  if (elementMap) {
31439
31629
  elementModel = renderableModel.convertToModel(elementMap);
31440
31630
  }
@@ -31503,6 +31693,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31503
31693
  this.toolbarModel.fontFamily = this.linkTarget.get(TOOLBAR_KEYS.fontFamily);
31504
31694
  this.toolbarModel.strokeWidth = this.linkTarget.get(TOOLBAR_KEYS.strokeWidth);
31505
31695
  this.toolbarModel.dashArray = this.linkTarget.get(TOOLBAR_KEYS.dashArray);
31696
+ this.permissions.removePermission(WhiteboardPermissionFlag.all);
31506
31697
  this.permissions.addPermission(this.linkTarget.get("permission"), this.userId);
31507
31698
  this.linkTarget.observe(this.handleLinkedMapChange);
31508
31699
  }
@@ -31520,6 +31711,9 @@ var WhiteboardApplication = class extends AbstractApplication {
31520
31711
  const size = this.paperScope.view.viewSize;
31521
31712
  return [size.width, size.height];
31522
31713
  }
31714
+ getInherentScale() {
31715
+ return this.camera.getInherentScale();
31716
+ }
31523
31717
  updateInternalResizeObserverStatus(value) {
31524
31718
  this.internalResizeObserver = value;
31525
31719
  }
@@ -31539,9 +31733,27 @@ var WhiteboardApplication = class extends AbstractApplication {
31539
31733
  this.shadowScope.project.clear();
31540
31734
  this.snapshotScope.project.clear();
31541
31735
  this.resizeObserver.disconnect();
31736
+ this.unlink();
31737
+ for (const entry of this.undoManagers.entries()) {
31738
+ entry[1].off("stack-item-added", this.handleStackItemAdded);
31739
+ entry[1].off("stack-item-popped", this.handleStackItemPopped);
31740
+ }
31741
+ for (const entry of this.layers.entries()) {
31742
+ entry[1].dispose();
31743
+ entry[1].removeAllListeners();
31744
+ }
31745
+ this.camera.dispose();
31746
+ this.pageModel.dispose();
31747
+ this.pageModel.removeAllListeners();
31748
+ for (const entry of this.editors.entries()) {
31749
+ entry[1].dispose();
31750
+ }
31751
+ this.toolbarModel.dispose();
31752
+ this.emitter.indexedNavigation.dispose();
31753
+ this.permissions.dispose();
31542
31754
  }
31543
31755
  };
31544
- _defineProperty40(WhiteboardApplication, "applicationName", WHITEBOARD_APP_NAME);
31756
+ _defineProperty41(WhiteboardApplication, "applicationName", WHITEBOARD_APP_NAME);
31545
31757
  export {
31546
31758
  Whiteboard,
31547
31759
  WhiteboardApplication,