fcr-core 3.8.1 → 3.9.0-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/lib/chat-connector/type.d.ts +40 -0
  2. package/lib/{chat-connection → chat-connector}/type.js +1 -1
  3. package/lib/engine/index.d.ts +10 -11
  4. package/lib/engine/index.js +63 -72
  5. package/lib/engine/type.d.ts +96 -0
  6. package/lib/engine/type.js +5 -0
  7. package/lib/imports.d.ts +7 -4
  8. package/lib/imports.js +30 -4
  9. package/lib/index.d.ts +3 -2
  10. package/lib/index.js +21 -2
  11. package/lib/media-control/desktop.js +12 -12
  12. package/lib/media-control/mobile.js +4 -0
  13. package/lib/media-control/type.d.ts +32 -33
  14. package/lib/monitor-control/index.js +3 -3
  15. package/lib/peer-session/index.js +14 -14
  16. package/lib/peer-session/type.d.ts +1 -1
  17. package/lib/plugins/chat/chatroom.js +417 -0
  18. package/lib/{chat-connection → plugins/chat}/config.d.ts +1 -0
  19. package/lib/{room-control/chatroom-control → plugins/chat}/config.js +2 -1
  20. package/lib/plugins/chat/connector.d.ts +38 -0
  21. package/lib/{chat-connection/index.js → plugins/chat/connector.js} +181 -61
  22. package/lib/room-control/ability-control/index.js +5 -4
  23. package/lib/room-control/ability-control/type.d.ts +5 -1
  24. package/lib/room-control/ability-control/type.js +4 -0
  25. package/lib/room-control/chatroom-control/type.d.ts +44 -35
  26. package/lib/room-control/group-control/index.js +9 -9
  27. package/lib/room-control/index.js +37 -22
  28. package/lib/room-control/interpreter-control/index.js +7 -4
  29. package/lib/room-control/interpreter-control/room.js +3 -3
  30. package/lib/room-control/interpreter-control/types.d.ts +2 -2
  31. package/lib/room-control/join-before-host-waitingroom-control/index.js +3 -3
  32. package/lib/room-control/mainroom-control/index.js +15 -13
  33. package/lib/room-control/privilege-control/index.js +39 -24
  34. package/lib/room-control/privilege-control/type.d.ts +15 -15
  35. package/lib/room-control/room-connector-control/index.js +7 -5
  36. package/lib/room-control/room-connector-control/type.d.ts +1 -1
  37. package/lib/room-control/room-control-factory.d.ts +3 -3
  38. package/lib/room-control/room-control-factory.js +7 -7
  39. package/lib/room-control/room-session/index.js +17 -15
  40. package/lib/room-control/room-session/type.d.ts +3 -3
  41. package/lib/room-control/sharing-control/index.js +13 -7
  42. package/lib/room-control/stream-control/index.js +18 -16
  43. package/lib/room-control/stream-control/type.d.ts +5 -5
  44. package/lib/room-control/stt-control/index.js +38 -31
  45. package/lib/room-control/type.d.ts +19 -19
  46. package/lib/room-control/user-control/index.js +20 -22
  47. package/lib/room-control/user-control/type.d.ts +1 -1
  48. package/lib/room-control/waitingroom-control/index.js +11 -11
  49. package/lib/room-control/whiteboard-control-v1/board-window.d.ts +21 -20
  50. package/lib/room-control/whiteboard-control-v1/board-window.js +27 -8
  51. package/lib/room-control/whiteboard-control-v1/factory.js +1 -1
  52. package/lib/room-control/whiteboard-control-v1/index.js +26 -18
  53. package/lib/room-control/whiteboard-control-v1/type.d.ts +26 -25
  54. package/lib/room-control/whiteboard-control-v1/type.js +1 -0
  55. package/lib/room-control/whiteboard-control-v2/annotation-control/control.d.ts +15 -6
  56. package/lib/room-control/whiteboard-control-v2/annotation-control/control.js +39 -5
  57. package/lib/room-control/whiteboard-control-v2/annotation-control/factory.d.ts +4 -5
  58. package/lib/room-control/whiteboard-control-v2/annotation-control/factory.js +6 -5
  59. package/lib/room-control/whiteboard-control-v2/annotation-control/type.d.ts +7 -1
  60. package/lib/room-control/whiteboard-control-v2/base/index.d.ts +9 -8
  61. package/lib/room-control/whiteboard-control-v2/base/index.js +84 -42
  62. package/lib/room-control/whiteboard-control-v2/base/main-window.d.ts +16 -15
  63. package/lib/room-control/whiteboard-control-v2/base/main-window.js +23 -4
  64. package/lib/room-control/whiteboard-control-v2/type.d.ts +17 -17
  65. package/lib/room-control/whiteboard-control-v2/whiteboard-control/control.d.ts +12 -6
  66. package/lib/room-control/whiteboard-control-v2/whiteboard-control/control.js +64 -18
  67. package/lib/room-control/whiteboard-control-v2/whiteboard-control/factory.d.ts +2 -2
  68. package/lib/room-control/whiteboard-control-v2/whiteboard-control/factory.js +10 -10
  69. package/lib/room-control/whiteboard-control-v2/whiteboard-control/type.d.ts +1 -1
  70. package/lib/room-router/index.js +10 -7
  71. package/lib/room-router/type.d.ts +1 -1
  72. package/lib/schema.d.ts +24 -46
  73. package/lib/schema.js +1 -2
  74. package/lib/service/api.d.ts +5 -3
  75. package/lib/service/api.js +17 -12
  76. package/lib/type.d.ts +64 -45
  77. package/lib/type.js +76 -11
  78. package/lib/utilities/abortable-retry.d.ts +38 -0
  79. package/lib/utilities/abortable-retry.js +61 -0
  80. package/lib/utilities/dual-video-stream-config.d.ts +6 -0
  81. package/lib/utilities/dual-video-stream-config.js +25 -0
  82. package/lib/utilities/error-helpers.d.ts +10 -9
  83. package/lib/utilities/error-helpers.js +12 -11
  84. package/lib/utilities/error.d.ts +4 -40
  85. package/lib/utilities/error.js +20 -77
  86. package/lib/utilities/join-helper.js +2 -2
  87. package/lib/utilities/logger.d.ts +2 -2
  88. package/lib/utilities/logger.js +6 -25
  89. package/lib/utilities/package-info.d.ts +1 -2
  90. package/lib/utilities/package-info.js +4 -8
  91. package/lib/utilities/parameters.js +88 -15
  92. package/lib/utilities/validate-params.js +1 -1
  93. package/lib/utilities/video-encoder-config.d.ts +9 -0
  94. package/lib/utilities/video-encoder-config.js +109 -0
  95. package/lib-es/base-session.js +1 -0
  96. package/lib-es/chat-connector/type.js +6 -0
  97. package/lib-es/engine/index.js +412 -0
  98. package/lib-es/engine/type.js +1 -0
  99. package/lib-es/imports.js +59 -0
  100. package/lib-es/index.js +8 -0
  101. package/lib-es/media-control/desktop.js +172 -0
  102. package/lib-es/media-control/mobile.js +198 -0
  103. package/lib-es/media-control/type.js +6 -0
  104. package/lib-es/monitor-control/index.js +46 -0
  105. package/lib-es/monitor-control/type.js +1 -0
  106. package/lib-es/peer-session/index.js +279 -0
  107. package/lib-es/peer-session/type.js +1 -0
  108. package/lib-es/plugins/chat/chatroom.js +409 -0
  109. package/{lib/chat-connection → lib-es/plugins/chat}/config.js +5 -9
  110. package/lib-es/plugins/chat/connector.js +269 -0
  111. package/lib-es/plugins/electron-rtc-plugin.js +1 -0
  112. package/lib-es/plugins/rtm-plugin.js +1 -0
  113. package/lib-es/plugins/web-rtc-plugin.js +1 -0
  114. package/lib-es/room-control/ability-control/index.js +58 -0
  115. package/lib-es/room-control/ability-control/type.js +15 -0
  116. package/lib-es/room-control/chatroom-control/type.js +12 -0
  117. package/lib-es/room-control/group-control/index.js +256 -0
  118. package/lib-es/room-control/helpers/constants.js +92 -0
  119. package/lib-es/room-control/helpers/index.js +20 -0
  120. package/lib-es/room-control/helpers/validation-helper.js +46 -0
  121. package/lib-es/room-control/index.js +623 -0
  122. package/lib-es/room-control/interpreter-control/index.js +172 -0
  123. package/lib-es/room-control/interpreter-control/room.js +28 -0
  124. package/lib-es/room-control/interpreter-control/types.js +26 -0
  125. package/lib-es/room-control/join-before-host-waitingroom-control/index.js +29 -0
  126. package/lib-es/room-control/mainroom-control/index.js +248 -0
  127. package/lib-es/room-control/privilege-control/helper.js +97 -0
  128. package/lib-es/room-control/privilege-control/index.js +339 -0
  129. package/lib-es/room-control/privilege-control/type.js +159 -0
  130. package/lib-es/room-control/room-connector-control/index.js +182 -0
  131. package/lib-es/room-control/room-connector-control/type.js +28 -0
  132. package/lib-es/room-control/room-control-factory.js +77 -0
  133. package/lib-es/room-control/room-session/index.js +292 -0
  134. package/lib-es/room-control/room-session/type.js +1 -0
  135. package/lib-es/room-control/shared-cache.js +47 -0
  136. package/lib-es/room-control/sharing-control/index.js +307 -0
  137. package/lib-es/room-control/sharing-control/type.js +16 -0
  138. package/lib-es/room-control/stream-control/index.js +536 -0
  139. package/lib-es/room-control/stream-control/type.js +1 -0
  140. package/lib-es/room-control/stt-control/de-compress-gzip.js +33 -0
  141. package/lib-es/room-control/stt-control/index.js +350 -0
  142. package/lib-es/room-control/stt-control/type.js +10 -0
  143. package/lib-es/room-control/type.js +30 -0
  144. package/lib-es/room-control/user-control/index.js +344 -0
  145. package/lib-es/room-control/user-control/type.js +21 -0
  146. package/lib-es/room-control/waitingroom-control/index.js +68 -0
  147. package/lib-es/room-control/whiteboard-control/enum.js +18 -0
  148. package/lib-es/room-control/whiteboard-control/type.js +10 -0
  149. package/lib-es/room-control/whiteboard-control/utils.js +13 -0
  150. package/lib-es/room-control/whiteboard-control-v1/board-subwindow.js +18 -0
  151. package/lib-es/room-control/whiteboard-control-v1/board-window.js +573 -0
  152. package/lib-es/room-control/whiteboard-control-v1/enum.js +157 -0
  153. package/lib-es/room-control/whiteboard-control-v1/factory.js +12 -0
  154. package/lib-es/room-control/whiteboard-control-v1/index.js +427 -0
  155. package/lib-es/room-control/whiteboard-control-v1/mount-manager.js +6 -0
  156. package/lib-es/room-control/whiteboard-control-v1/type.js +8 -0
  157. package/lib-es/room-control/whiteboard-control-v1/utils.js +273 -0
  158. package/lib-es/room-control/whiteboard-control-v2/annotation-control/control.js +76 -0
  159. package/lib-es/room-control/whiteboard-control-v2/annotation-control/factory.js +37 -0
  160. package/lib-es/room-control/whiteboard-control-v2/annotation-control/type.js +1 -0
  161. package/lib-es/room-control/whiteboard-control-v2/base/index.js +347 -0
  162. package/lib-es/room-control/whiteboard-control-v2/base/main-window.js +269 -0
  163. package/lib-es/room-control/whiteboard-control-v2/constant.js +9 -0
  164. package/lib-es/room-control/whiteboard-control-v2/enum.js +28 -0
  165. package/lib-es/room-control/whiteboard-control-v2/type.js +1 -0
  166. package/lib-es/room-control/whiteboard-control-v2/utils.js +92 -0
  167. package/lib-es/room-control/whiteboard-control-v2/whiteboard-control/control.js +204 -0
  168. package/lib-es/room-control/whiteboard-control-v2/whiteboard-control/factory.js +61 -0
  169. package/lib-es/room-control/whiteboard-control-v2/whiteboard-control/type.js +1 -0
  170. package/lib-es/room-router/index.js +263 -0
  171. package/lib-es/room-router/type.js +5 -0
  172. package/lib-es/schema.js +231 -0
  173. package/lib-es/service/api.js +1211 -0
  174. package/lib-es/service/type.js +1 -0
  175. package/lib-es/type.js +222 -0
  176. package/lib-es/utilities/abortable-retry.js +54 -0
  177. package/lib-es/utilities/cmd.js +1 -0
  178. package/lib-es/utilities/collection.js +64 -0
  179. package/lib-es/utilities/dual-video-stream-config.js +19 -0
  180. package/lib-es/utilities/error-helpers.js +224 -0
  181. package/lib-es/utilities/error.js +43 -0
  182. package/lib-es/utilities/join-helper.js +219 -0
  183. package/lib-es/utilities/logger.js +7 -0
  184. package/lib-es/utilities/package-info.js +5 -0
  185. package/lib-es/utilities/parameters.js +106 -0
  186. package/lib-es/utilities/retry-helpers.js +66 -0
  187. package/lib-es/utilities/shared-storage.js +31 -0
  188. package/lib-es/utilities/stream.js +18 -0
  189. package/lib-es/utilities/user.js +30 -0
  190. package/lib-es/utilities/validate-params.js +8 -0
  191. package/lib-es/utilities/video-encoder-config.js +103 -0
  192. package/package.json +11 -10
  193. package/lib/chat-connection/index.d.ts +0 -24
  194. package/lib/chat-connection/type.d.ts +0 -17
  195. package/lib/plugins/chatroom.js +0 -454
  196. package/lib/room-control/chatroom-control/config.d.ts +0 -51
  197. package/lib/utilities/storage.d.ts +0 -8
  198. package/lib/utilities/storage.js +0 -33
  199. /package/lib/plugins/{chatroom.d.ts → chat/chatroom.d.ts} +0 -0
@@ -0,0 +1,573 @@
1
+ import "core-js/modules/es.array.push.js";
2
+ import "core-js/modules/esnext.function.metadata.js";
3
+ import "core-js/modules/esnext.map.delete-all.js";
4
+ import "core-js/modules/esnext.map.emplace.js";
5
+ import "core-js/modules/esnext.map.every.js";
6
+ import "core-js/modules/esnext.map.filter.js";
7
+ import "core-js/modules/esnext.map.find.js";
8
+ import "core-js/modules/esnext.map.find-key.js";
9
+ import "core-js/modules/esnext.map.includes.js";
10
+ import "core-js/modules/esnext.map.key-of.js";
11
+ import "core-js/modules/esnext.map.map-keys.js";
12
+ import "core-js/modules/esnext.map.map-values.js";
13
+ import "core-js/modules/esnext.map.merge.js";
14
+ import "core-js/modules/esnext.map.reduce.js";
15
+ import "core-js/modules/esnext.map.some.js";
16
+ import "core-js/modules/esnext.map.update.js";
17
+ import "core-js/modules/esnext.symbol.metadata.js";
18
+ let _initProto, _cleanDecs, _setToolTypeDecs, _setStrokeWidthDecs, _setStrokeColorDecs, _setTextColorDecs, _setTextSizeDecs, _setFillColorDecs, _setEraserSizeDecs, _setBackgroundColorDecs, _insertImageDecs, _insertMediaDecs, _mountDecs;
19
+ import "core-js/modules/esnext.iterator.constructor.js";
20
+ import "core-js/modules/esnext.iterator.map.js";
21
+ import "core-js/modules/web.url-search-params.delete.js";
22
+ import "core-js/modules/web.url-search-params.has.js";
23
+ import "core-js/modules/web.url-search-params.size.js";
24
+ function _applyDecs(e, t, r, n, o, a) { function i(e, t, r) { return function (n, o) { return r && r(n), e[t].call(n, o); }; } function c(e, t) { for (var r = 0; r < e.length; r++) e[r].call(t); return t; } function s(e, t, r, n) { if ("function" != typeof e && (n || void 0 !== e)) throw new TypeError(t + " must " + (r || "be") + " a function" + (n ? "" : " or undefined")); return e; } function applyDec(e, t, r, n, o, a, c, u, l, f, p, d, h) { function m(e) { if (!h(e)) throw new TypeError("Attempted to access private element on non-instance"); } var y, v = t[0], g = t[3], b = !u; if (!b) { r || Array.isArray(v) || (v = [v]); var w = {}, S = [], A = 3 === o ? "get" : 4 === o || d ? "set" : "value"; f ? (p || d ? w = { get: _setFunctionName(function () { return g(this); }, n, "get"), set: function (e) { t[4](this, e); } } : w[A] = g, p || _setFunctionName(w[A], n, 2 === o ? "" : A)) : p || (w = Object.getOwnPropertyDescriptor(e, n)); } for (var P = e, j = v.length - 1; j >= 0; j -= r ? 2 : 1) { var D = v[j], E = r ? v[j - 1] : void 0, I = {}, O = { kind: ["field", "accessor", "method", "getter", "setter", "class"][o], name: n, metadata: a, addInitializer: function (e, t) { if (e.v) throw Error("attempted to call addInitializer after decoration was finished"); s(t, "An initializer", "be", !0), c.push(t); }.bind(null, I) }; try { if (b) (y = s(D.call(E, P, O), "class decorators", "return")) && (P = y);else { var k, F; O.static = l, O.private = f, f ? 2 === o ? k = function (e) { return m(e), w.value; } : (o < 4 && (k = i(w, "get", m)), 3 !== o && (F = i(w, "set", m))) : (k = function (e) { return e[n]; }, (o < 2 || 4 === o) && (F = function (e, t) { e[n] = t; })); var N = O.access = { has: f ? h.bind() : function (e) { return n in e; } }; if (k && (N.get = k), F && (N.set = F), P = D.call(E, d ? { get: w.get, set: w.set } : w[A], O), d) { if ("object" == typeof P && P) (y = s(P.get, "accessor.get")) && (w.get = y), (y = s(P.set, "accessor.set")) && (w.set = y), (y = s(P.init, "accessor.init")) && S.push(y);else if (void 0 !== P) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0"); } else s(P, (p ? "field" : "method") + " decorators", "return") && (p ? S.push(P) : w[A] = P); } } finally { I.v = !0; } } return (p || d) && u.push(function (e, t) { for (var r = S.length - 1; r >= 0; r--) t = S[r].call(e, t); return t; }), p || b || (f ? d ? u.push(i(w, "get"), i(w, "set")) : u.push(2 === o ? w[A] : i.call.bind(w[A])) : Object.defineProperty(e, n, w)), P; } function u(e, t) { return Object.defineProperty(e, Symbol.metadata || Symbol.for("Symbol.metadata"), { configurable: !0, enumerable: !0, value: t }); } if (arguments.length >= 6) var l = a[Symbol.metadata || Symbol.for("Symbol.metadata")]; var f = Object.create(null == l ? null : l), p = function (e, t, r, n) { var o, a, i = [], s = function (t) { return _checkInRHS(t) === e; }, u = new Map(); function l(e) { e && i.push(c.bind(null, e)); } for (var f = 0; f < t.length; f++) { var p = t[f]; if (Array.isArray(p)) { var d = p[1], h = p[2], m = p.length > 3, y = 16 & d, v = !!(8 & d), g = 0 == (d &= 7), b = h + "/" + v; if (!g && !m) { var w = u.get(b); if (!0 === w || 3 === w && 4 !== d || 4 === w && 3 !== d) throw Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + h); u.set(b, !(d > 2) || d); } applyDec(v ? e : e.prototype, p, y, m ? "#" + h : _toPropertyKey(h), d, n, v ? a = a || [] : o = o || [], i, v, m, g, 1 === d, v && m ? s : r); } } return l(o), l(a), i; }(e, t, o, f); return r.length || u(e, f), { e: p, get c() { var t = []; return r.length && [u(applyDec(e, [r], n, e.name, 5, f, t), f), c.bind(null, t, e)]; } }; }
25
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
26
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
27
+ function _setFunctionName(e, t, n) { "symbol" == typeof t && (t = (t = t.description) ? "[" + t + "]" : ""); try { Object.defineProperty(e, "name", { configurable: !0, value: n ? n + " " + t : t }); } catch (e) {} return e; }
28
+ function _checkInRHS(e) { if (Object(e) !== e) throw TypeError("right-hand side of 'in' should be an object, got " + (null !== e ? typeof e : "null")); return e; }
29
+ import { snapshot } from '@netless/white-snapshot';
30
+ import { BuiltinApps, WindowManager } from '@netless/window-manager';
31
+ import { ApplianceMultiPlugin, EStrokeType } from '@netless/appliance-plugin';
32
+ import '@netless/appliance-plugin/dist/style.css';
33
+ import '@netless/window-manager/dist/style.css';
34
+ import { convertToNetlessBoardTool, convertToNetlessStorkeType, src2DataURL } from './utils';
35
+ import { fetchImageInfoByUrl, mergeCanvasImage } from './utils';
36
+ import { BoardMountManager } from './mount-manager';
37
+ import { md5 } from 'js-md5';
38
+ import { createLogger, generateLogObserver } from '../../utilities/logger';
39
+ import { AgoraObservable, bound, trace } from '../../imports';
40
+ import { FcrBoardSubWindowImpl } from './board-subwindow';
41
+ //@ts-ignore
42
+ import fullWorkerString from '@netless/appliance-plugin/dist/fullWorker.js?raw';
43
+ //@ts-ignore
44
+ import subWorkerString from '@netless/appliance-plugin/dist/subWorker.js?raw';
45
+ import { FcrReturnCode } from '../../type';
46
+ import { isPlainObject } from 'lodash';
47
+ import { jsonstring } from 'agora-rte-sdk/lib/imports';
48
+ export class FcrBoardMainWindowImpl {
49
+ static {
50
+ [_initProto] = _applyDecs(this, [[[bound, trace], 2, "getSnapshotImage"], [trace, 2, "addObserver"], [trace, 2, "removeObserver"], [trace, 2, "getContentView"], [bound, 2, "setScale"], [bound, 2, "openSubWindowWithTaskId"], [bound, 2, "openSubWindowWithPageList"], [trace, 2, "getPageInfo"], [[bound, trace], 2, "addPage"], [[bound, trace], 2, "removePage"], [trace, 2, "prevPage"], [trace, 2, "nextPage"], [[bound, trace], 2, "undo"], [[bound, trace], 2, "redo"], [_cleanDecs, 2, "clean"], [_setToolTypeDecs, 2, "setToolType"], [_setStrokeWidthDecs, 2, "setStrokeWidth"], [_setStrokeColorDecs, 2, "setStrokeColor"], [_setTextColorDecs, 2, "setTextColor"], [_setTextSizeDecs, 2, "setTextSize"], [_setFillColorDecs, 2, "setFillColor"], [_setEraserSizeDecs, 2, "setEraserSize"], [_setBackgroundColorDecs, 2, "setBackgroundColor"], [_insertImageDecs, 2, "insertImage"], [_insertMediaDecs, 2, "insertMedia"], [trace, 2, "destroy"], [trace, 2, "getWritable"], [_mountDecs, 2, "_mount"], [trace, 2, "_setRoom"]], []).e;
51
+ }
52
+ [(_cleanDecs = [bound, trace(['retainPpt'])], _setToolTypeDecs = [bound, trace(['type'])], _setStrokeWidthDecs = [bound, trace(['strokeWidth'])], _setStrokeColorDecs = [bound, trace(['color'])], _setTextColorDecs = [bound, trace(['color'])], _setTextSizeDecs = [bound, trace(['size'])], _setFillColorDecs = [bound, trace(['fillColor'])], _setEraserSizeDecs = [bound, trace(['size'])], _setBackgroundColorDecs = [bound, trace(['color'])], _insertImageDecs = [bound, trace(['resourceUrl', 'x', 'y', 'width', 'height'])], _insertMediaDecs = [bound, trace(['resourceUrl', 'title'])], _mountDecs = trace(['options', 'params']), "logger")] = (_initProto(this), createLogger({
53
+ prefix: 'FcrBoardMainWindowImpl'
54
+ }));
55
+ _memberState = {};
56
+ _observable = new AgoraObservable();
57
+ _destroyed = false;
58
+ constructor(room) {
59
+ this._whiteBoardroom = room;
60
+ this._whiteView = document.createElement('div');
61
+ this._initView();
62
+ this._addLogObserver();
63
+ }
64
+ async getSnapshotImage() {
65
+ this._preCheck({
66
+ wm: false
67
+ });
68
+ const whiteRoom = this._whiteBoardroom;
69
+ let result = new ImageData(1, 1);
70
+ if (whiteRoom) {
71
+ const sceneMap = whiteRoom.entireScenes();
72
+ const scenes = Object.keys(sceneMap);
73
+ if (scenes.length) {
74
+ const _room = Object.create(whiteRoom);
75
+ _room.state.cameraState = {
76
+ width: 2038,
77
+ height: 940
78
+ }; // 创建一个宽高
79
+
80
+ const cps = sceneMap['/'].map(scene => {
81
+ return () => snapshot(_room, {
82
+ scenePath: '/' + scene.name,
83
+ crossorigin: true,
84
+ background: '#fff',
85
+ src2dataurl: src2DataURL
86
+ });
87
+ });
88
+ try {
89
+ const merged = await mergeCanvasImage(cps);
90
+ const ctx = merged.getContext('2d');
91
+ if (ctx) {
92
+ result = ctx.getImageData(0, 0, merged.width, merged.height);
93
+ return result;
94
+ }
95
+ } catch (e) {
96
+ this.logger.error('failed to take snapshot', e);
97
+ }
98
+ }
99
+ }
100
+ return result;
101
+ }
102
+ addObserver(observer) {
103
+ this._observable.addObserver(observer);
104
+ return FcrReturnCode.SUCCESS;
105
+ }
106
+ removeObserver(observer) {
107
+ this._observable.removeObserver(observer);
108
+ return FcrReturnCode.SUCCESS;
109
+ }
110
+ getContentView() {
111
+ return this._whiteView;
112
+ }
113
+ setScale(value) {
114
+ const scale = Math.max(Math.min(value, 3), -3);
115
+ this._windowManager?.moveCamera({
116
+ scale
117
+ });
118
+ }
119
+ async openSubWindowWithTaskId(title, taskId, urlPrefix) {
120
+ const appId = await this._windowManager?.addApp({
121
+ kind: 'Slide',
122
+ options: {
123
+ scenePath: `/ppt${taskId}`,
124
+ title
125
+ },
126
+ attributes: {
127
+ taskId,
128
+ url: urlPrefix
129
+ }
130
+ });
131
+ if (appId) {
132
+ const app = this._windowManager?.apps?.[appId];
133
+ return app ? new FcrBoardSubWindowImpl(appId) : undefined;
134
+ }
135
+ }
136
+ async openSubWindowWithPageList(title, pageList) {
137
+ const scenePath = `/${Date.now()}`;
138
+ const appId = await this._windowManager?.addApp({
139
+ kind: BuiltinApps.DocsViewer,
140
+ options: {
141
+ scenePath,
142
+ title,
143
+ scenes: this._convertToScenes(pageList)
144
+ }
145
+ });
146
+ if (appId) {
147
+ const app = this._windowManager?.apps?.[appId];
148
+ return app ? new FcrBoardSubWindowImpl(appId) : undefined;
149
+ }
150
+ }
151
+ async setContainerSizeRatio(ratio) {
152
+ this._preCheck();
153
+ this._windowManager?.setContainerSizeRatio(ratio);
154
+ }
155
+ getPageInfo() {
156
+ this._preCheck();
157
+ const windowManager = this._windowManager;
158
+ return {
159
+ showIndex: windowManager?.mainViewSceneIndex || 0,
160
+ count: windowManager?.mainViewScenesLength || 0
161
+ };
162
+ }
163
+ async addPage() {
164
+ this._preCheck();
165
+ if (this._windowManager?.addPage) {
166
+ await this._windowManager.addPage();
167
+ await this._windowManager.nextPage();
168
+ }
169
+ return FcrReturnCode.SUCCESS;
170
+ }
171
+ async removePage() {
172
+ this._preCheck();
173
+ if (this._windowManager?.removePage) {
174
+ await this._windowManager.removePage();
175
+ }
176
+ return FcrReturnCode.SUCCESS;
177
+ }
178
+ async prevPage() {
179
+ this._preCheck();
180
+ if (this._windowManager?.prevPage) {
181
+ await this._windowManager.prevPage();
182
+ }
183
+ return FcrReturnCode.SUCCESS;
184
+ }
185
+ async nextPage() {
186
+ this._preCheck();
187
+ if (this._windowManager?.nextPage) {
188
+ await this._windowManager.nextPage();
189
+ }
190
+ return FcrReturnCode.SUCCESS;
191
+ }
192
+ async undo() {
193
+ this._preCheck({
194
+ wm: false
195
+ });
196
+ return this._whiteBoardroom.undo();
197
+ }
198
+ async redo() {
199
+ this._preCheck({
200
+ wm: false
201
+ });
202
+ return this._whiteBoardroom.redo();
203
+ }
204
+ async clean(retainPpt) {
205
+ this._preCheck({
206
+ wm: false
207
+ });
208
+ // this._whiteBoardroom?.cleanScene?.(true); // new version methods
209
+ this._whiteBoardroom.cleanCurrentScene(retainPpt);
210
+ return FcrReturnCode.SUCCESS;
211
+ }
212
+ async setToolType(type) {
213
+ this._preCheck({
214
+ wm: false
215
+ });
216
+ const [tool, shape] = convertToNetlessBoardTool(type);
217
+ const strokeType = convertToNetlessStorkeType(type);
218
+ const change = {
219
+ currentApplianceName: tool,
220
+ shapeType: shape,
221
+ strokeType
222
+ };
223
+ this._memberState = {
224
+ ...this._memberState,
225
+ ...change
226
+ };
227
+ if (this._windowManager) {
228
+ this._appliancePluginInstance?.setMemberState(change);
229
+ }
230
+ return FcrReturnCode.SUCCESS;
231
+ }
232
+ async setStrokeWidth(strokeWidth) {
233
+ this._preCheck();
234
+ const change = {
235
+ strokeWidth
236
+ };
237
+ this._memberState = {
238
+ ...this._memberState,
239
+ ...change
240
+ };
241
+ if (this._windowManager) {
242
+ this._whiteBoardroom.setMemberState(change);
243
+ }
244
+ return FcrReturnCode.SUCCESS;
245
+ }
246
+ async setStrokeColor(color) {
247
+ this._preCheck();
248
+ const change = {
249
+ strokeColor: [color.r, color.g, color.b],
250
+ strokeOpacity: color.a ?? 1
251
+ };
252
+ this._memberState = {
253
+ ...this._memberState,
254
+ ...change
255
+ };
256
+ if (this._windowManager) {
257
+ this._whiteBoardroom.setMemberState(change);
258
+ }
259
+ return FcrReturnCode.SUCCESS;
260
+ }
261
+ async setTextColor(color) {
262
+ this._preCheck();
263
+ const change = {
264
+ textColor: [color.r, color.g, color.b],
265
+ textOpacity: color.a ?? 1
266
+ };
267
+ this._memberState = {
268
+ ...this._memberState,
269
+ ...change
270
+ };
271
+ if (this._windowManager) {
272
+ this._whiteBoardroom.setMemberState(change);
273
+ }
274
+ return FcrReturnCode.SUCCESS;
275
+ }
276
+ async setTextSize(size) {
277
+ this._preCheck();
278
+ const change = {
279
+ textSize: size
280
+ };
281
+ this._memberState = {
282
+ ...this._memberState,
283
+ ...change
284
+ };
285
+ if (this._windowManager) {
286
+ this._whiteBoardroom.setMemberState(change);
287
+ }
288
+ return FcrReturnCode.SUCCESS;
289
+ }
290
+ async setFillColor(fillColor) {
291
+ this._preCheck();
292
+ const change = {
293
+ fillColor: [fillColor.r, fillColor.g, fillColor.b],
294
+ fillOpacity: fillColor.a ?? 1
295
+ };
296
+ this._memberState = {
297
+ ...this._memberState,
298
+ ...change
299
+ };
300
+ if (this._windowManager) {
301
+ this._whiteBoardroom.setMemberState(change);
302
+ }
303
+ return FcrReturnCode.SUCCESS;
304
+ }
305
+ async setEraserSize(size) {
306
+ this._preCheck();
307
+ const change = {
308
+ pencilEraserSize: size
309
+ };
310
+ this._memberState = {
311
+ ...this._memberState,
312
+ ...change
313
+ };
314
+ if (this._windowManager) {
315
+ this._whiteBoardroom.setMemberState(change);
316
+ }
317
+ return FcrReturnCode.SUCCESS;
318
+ }
319
+ async setBackgroundColor(color) {
320
+ this._preCheck();
321
+ this._backgroundColor = color;
322
+ this._whiteView.querySelector('.netless-whiteboard')?.style.setProperty('background-color', color);
323
+ return FcrReturnCode.SUCCESS;
324
+ }
325
+ async insertImage(resourceUrl, x, y, width, height) {
326
+ const room = this._whiteBoardroom;
327
+ const windowManager = this._windowManager;
328
+ const preX = x;
329
+ const preY = y;
330
+ const preWidth = width;
331
+ const preHeight = height;
332
+ if (windowManager) {
333
+ let originX = 0;
334
+ let originY = 0;
335
+ if (this._whiteView) {
336
+ originX = this._whiteView.clientWidth / 2;
337
+ originY = this._whiteView.clientHeight / 2;
338
+ }
339
+ const {
340
+ x,
341
+ y
342
+ } = windowManager.mainView.convertToPointInWorld({
343
+ x: preX ?? originX,
344
+ y: preY ?? originY
345
+ });
346
+ const containerSize = {
347
+ width: this._whiteView?.clientWidth ?? window.innerWidth,
348
+ height: this._whiteView?.clientHeight ?? window.innerHeight
349
+ };
350
+ const uuid = md5(resourceUrl);
351
+ const {
352
+ width,
353
+ height
354
+ } = await fetchImageInfoByUrl(resourceUrl, containerSize);
355
+ const imageInfo = {
356
+ uuid: uuid,
357
+ centerX: x,
358
+ centerY: y,
359
+ width: preWidth ?? width,
360
+ height: preHeight ?? height,
361
+ locked: false
362
+ };
363
+ windowManager.switchMainViewToWriter();
364
+ room.insertImage(imageInfo);
365
+ room.completeImageUpload(uuid, resourceUrl);
366
+ }
367
+ return FcrReturnCode.SUCCESS;
368
+ }
369
+ async insertMedia(resourceUrl, title) {
370
+ const windowManager = this._windowManager;
371
+ const room = this._whiteBoardroom;
372
+ if (windowManager) {
373
+ windowManager.addApp({
374
+ kind: BuiltinApps.MediaPlayer,
375
+ src: resourceUrl,
376
+ options: {
377
+ title: title
378
+ },
379
+ attributes: {
380
+ url: resourceUrl
381
+ }
382
+ });
383
+ }
384
+ return FcrReturnCode.SUCCESS;
385
+ }
386
+ destroy() {
387
+ if (this._windowManager) {
388
+ this._windowManager.destroy();
389
+ this._windowManager = undefined;
390
+ }
391
+ this._destroyed = true;
392
+ return FcrReturnCode.SUCCESS;
393
+ }
394
+ getWritable() {
395
+ return this._whiteBoardroom.isWritable;
396
+ }
397
+ _convertToScenes(pageList) {
398
+ return pageList.map(page => ({
399
+ name: page.name,
400
+ ppt: {
401
+ src: page.contentUrl,
402
+ width: page.contentWidth,
403
+ height: page.contentHeight,
404
+ previewURL: page.previewUrl
405
+ }
406
+ }));
407
+ }
408
+ _preCheck(options = {}) {
409
+ const {
410
+ privilege = true,
411
+ wm = true
412
+ } = options;
413
+ if (privilege && !this._whiteBoardroom.isWritable) {
414
+ this.logger.warn('Try to operate on board window without operation privilege');
415
+ }
416
+ if (wm && !this._windowManager) {
417
+ this.logger.warn('Try to operate on board window when board window not mounted');
418
+ }
419
+ }
420
+ _addWindowManagerEventListeners() {
421
+ const windowManager = this._windowManager;
422
+ windowManager?.emitter.on('mainViewSceneIndexChange', showIndex => {
423
+ const state = {
424
+ showIndex: showIndex,
425
+ count: windowManager?.mainViewScenesLength || 0
426
+ };
427
+ this._observable.notifyObservers('onPageInfoUpdated', state);
428
+ });
429
+ windowManager?.emitter.on('mainViewScenesLengthChange', count => {
430
+ const state = {
431
+ showIndex: windowManager?.mainViewSceneIndex || 0,
432
+ count: count
433
+ };
434
+ this._observable.notifyObservers('onPageInfoUpdated', state);
435
+ });
436
+ windowManager?.emitter.on('canUndoStepsChange', steps => {
437
+ this._observable.notifyObservers('onUndoStateUpdated', steps > 0);
438
+ });
439
+ windowManager?.emitter.on('canRedoStepsChange', steps => {
440
+ this._observable.notifyObservers('onRedoStateUpdated', steps > 0);
441
+ });
442
+ }
443
+
444
+ // don't remove, used by FcrWhiteboardControl
445
+ async _mount(options = {}, params = {}) {
446
+ this._whiteboardPrivateParameters = params;
447
+ if (this._whiteBoardroom) {
448
+ this._destroyed = false;
449
+ if (BoardMountManager.isMounting) {
450
+ this.logger.info('[FcrBoardMainWindow] wait for previous board window mounted, white room id:', this._whiteBoardroom.uuid);
451
+ // await when(() => !BoardMountManager.isMounting);
452
+ this.logger.info('[FcrBoardMainWindow] previous board window mounted, start mount current board window, white room id:', this._whiteBoardroom.uuid);
453
+ }
454
+ if (this._destroyed) {
455
+ this.logger.info('[FcrBoardMainWindow] current board window has been destroyed, white room id:', this._whiteBoardroom.uuid);
456
+ return;
457
+ }
458
+ BoardMountManager.setIsMounting(true);
459
+ this.logger.info('start mount board window, white room id:', this._whiteBoardroom.uuid);
460
+ const extras = this._whiteboardPrivateParameters?.extras ?? {};
461
+ const cursor = this._whiteboardPrivateParameters?.cursor ?? true;
462
+ const extendClass = this._whiteboardPrivateParameters?.extendClass;
463
+ const containerElement = this._whiteboardPrivateParameters?.containerElement;
464
+ let windowManagerParams = this._whiteboardPrivateParameters?.windowManagerParams ?? {};
465
+ this.logger.info(`set whiteboard extendClass: ${extendClass}`);
466
+ this.logger.info(`set whiteboard cursor: ${cursor}`);
467
+ this.logger.info(`set whiteboard extras: ${jsonstring(extras)}`);
468
+ this.logger.info(`set whiteboard windowManagerParams: ${jsonstring(windowManagerParams)}`);
469
+ if (!isPlainObject(windowManagerParams)) {
470
+ this.logger.warn('windowManagerParams is not a plain object');
471
+ windowManagerParams = {};
472
+ }
473
+
474
+ // 提前将 view 挂载到 containerElement 上,避免白板初始化时无法获取到正确的宽高
475
+ if (containerElement) {
476
+ containerElement.appendChild(this._whiteView);
477
+ }
478
+ await WindowManager.mount({
479
+ debug: true,
480
+ room: this._whiteBoardroom,
481
+ container: this._whiteView,
482
+ cursor: cursor,
483
+ chessboard: false,
484
+ collectorContainer: options.collectorContainer,
485
+ containerSizeRatio: options.containerSizeRatio,
486
+ supportAppliancePlugin: true,
487
+ ...windowManagerParams
488
+ }, extendClass).then(async wm => {
489
+ if (this._destroyed) {
490
+ wm.destroy();
491
+ return;
492
+ }
493
+ //@ts-ignore
494
+ window._wm = wm;
495
+ this._windowManager = wm;
496
+ this._windowManager.mainView.disableCameraTransform = true;
497
+ this._addWindowManagerEventListeners();
498
+ if (this._backgroundColor) {
499
+ this._whiteView.querySelector('.netless-whiteboard')?.style.setProperty('background-color', this._backgroundColor);
500
+ }
501
+ const fullWorkerBlob = new Blob([fullWorkerString], {
502
+ type: 'text/javascript'
503
+ });
504
+ const fullWorkerUrl = URL.createObjectURL(fullWorkerBlob);
505
+ const subWorkerBlob = new Blob([subWorkerString], {
506
+ type: 'text/javascript'
507
+ });
508
+ const subWorkerUrl = URL.createObjectURL(subWorkerBlob);
509
+ await this._windowManager.switchMainViewToWriter();
510
+ const appliancePluginInstance = await ApplianceMultiPlugin.getInstance(wm, {
511
+ options: {
512
+ cdn: {
513
+ fullWorkerUrl,
514
+ subWorkerUrl
515
+ },
516
+ extras
517
+ }
518
+ });
519
+
520
+ //@ts-ignore
521
+ window.appliancePluginInstance = appliancePluginInstance;
522
+ this._appliancePluginInstance = appliancePluginInstance;
523
+ if (appliancePluginInstance.injectMethodToObject) {
524
+ appliancePluginInstance.injectMethodToObject(window, 'requestIdleCallback');
525
+ appliancePluginInstance.injectMethodToObject(window, 'cancelIdleCallback');
526
+ }
527
+ appliancePluginInstance.addListener('forceStop', reason => {
528
+ if (reason == 'longPencil') {
529
+ window.postMessage({
530
+ type: 'white-board-error',
531
+ data: {
532
+ reason: 'longPencil'
533
+ }
534
+ }, '*');
535
+ }
536
+ });
537
+ const hasPermission = this._whiteBoardroom.isWritable;
538
+ this.logger.info(`after mount, isWritable: ${hasPermission}`);
539
+ if (hasPermission) {
540
+ this._whiteBoardroom.setMemberState(this._memberState);
541
+ appliancePluginInstance.setMemberState({
542
+ strokeType: EStrokeType.Normal
543
+ });
544
+ }
545
+ }).catch(e => {
546
+ this.logger.error('failed to mount', e);
547
+ }).finally(() => {
548
+ this.logger.info('[FcrBoardMainWindow] finish mount board window, white room id:', this._whiteBoardroom.uuid);
549
+ BoardMountManager.setIsMounting(false);
550
+ });
551
+ }
552
+ }
553
+ _initView() {
554
+ this._whiteView.style.width = '100%';
555
+ this._whiteView.style.height = '100%';
556
+ this._whiteView.classList.add('fcr-whiteboard-window-view');
557
+ }
558
+
559
+ // don't remove, used by FcrWhiteboardControl
560
+ async _setRoom(room, options, params) {
561
+ this._whiteBoardroom = room;
562
+ if (this._windowManager) {
563
+ this.logger.info('destroy previous window manager');
564
+ this._windowManager.destroy();
565
+ }
566
+ await this._mount(options, params);
567
+ this.logger.info('restore member state');
568
+ room.setMemberState(this._memberState);
569
+ }
570
+ _addLogObserver() {
571
+ this.addObserver(generateLogObserver(this.logger, [['onWritable', ['isWritable']], ['onPageInfoUpdated', ['info']], ['onUndoStateUpdated', ['enable']], ['onRedoStateUpdated', ['enable']]]));
572
+ }
573
+ }