fcr-core 3.4.5 → 3.5.0
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.
- package/lib/chat-connection/index.js +22 -39
- package/lib/engine/index.js +63 -74
- package/lib/imports.d.ts +14 -4
- package/lib/imports.js +130 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +0 -6
- package/lib/media-control/desktop.js +6 -11
- package/lib/media-control/mobile.js +19 -18
- package/lib/media-control/type.d.ts +12 -7
- package/lib/media-control/type.js +8 -1
- package/lib/monitor-control/index.js +29 -0
- package/lib/monitor-control/type.d.ts +8 -1
- package/lib/peer-session/index.js +37 -47
- package/lib/peer-session/type.d.ts +2 -9
- package/lib/plugins/chatroom.js +217 -183
- package/lib/room-control/ability-control/index.d.ts +1 -0
- package/lib/room-control/ability-control/index.js +62 -0
- package/lib/room-control/ability-control/type.d.ts +9 -0
- package/lib/room-control/ability-control/type.js +11 -0
- package/lib/room-control/chatroom-control/type.d.ts +25 -23
- package/lib/room-control/group-control/index.js +14 -22
- package/lib/room-control/index.js +118 -146
- package/lib/room-control/interpreter-control/index.js +12 -17
- package/lib/room-control/interpreter-control/room.js +4 -6
- package/lib/room-control/interpreter-control/types.d.ts +2 -5
- package/lib/room-control/mainroom-control/index.js +26 -44
- package/lib/room-control/privilege-control/helper.js +5 -10
- package/lib/room-control/privilege-control/index.js +15 -21
- package/lib/room-control/privilege-control/type.d.ts +3 -9
- package/lib/room-control/privilege-control/type.js +1 -0
- package/lib/room-control/room-connector-control/index.js +16 -24
- package/lib/room-control/room-connector-control/type.d.ts +3 -9
- package/lib/room-control/room-session/index.js +39 -49
- package/lib/room-control/room-session/type.d.ts +4 -7
- package/lib/room-control/stream-control/index.js +143 -152
- package/lib/room-control/stream-control/type.d.ts +5 -6
- package/lib/room-control/type.d.ts +18 -14
- package/lib/room-control/type.js +6 -1
- package/lib/room-control/user-control/index.js +135 -138
- package/lib/room-control/user-control/type.d.ts +17 -3
- package/lib/room-control/user-control/type.js +10 -1
- package/lib/room-control/waitingroom-control/index.js +11 -16
- package/lib/room-control/whiteboard-control/board-subwindow.d.ts +6 -0
- package/lib/room-control/whiteboard-control/board-subwindow.js +25 -0
- package/lib/room-control/whiteboard-control/board-window.js +52 -57
- package/lib/room-control/whiteboard-control/enums.js +84 -0
- package/lib/room-control/whiteboard-control/index.js +25 -35
- package/lib/room-control/whiteboard-control/mount-manager.js +2 -4
- package/lib/room-control/whiteboard-control/types.d.ts +2 -5
- package/lib/room-control/whiteboard-control/utils.js +14 -17
- package/lib/room-control/whiteboard-control-v2/index.js +33 -43
- package/lib/room-control/whiteboard-control-v2/main-window.js +15 -23
- package/lib/schema.d.ts +990 -0
- package/lib/schema.js +283 -0
- package/lib/service/api.d.ts +10 -5
- package/lib/service/api.js +99 -90
- package/lib/type.d.ts +19 -48
- package/lib/type.js +47 -34
- package/lib/utilities/collection.js +2 -3
- package/lib/utilities/error.d.ts +3 -1
- package/lib/utilities/error.js +17 -8
- package/lib/utilities/logger.js +1 -2
- package/lib/utilities/parameters.js +4 -8
- package/lib/utilities/stream.js +12 -20
- package/lib/utilities/user.js +2 -1
- package/lib/utilities/validate-params.d.ts +2 -0
- package/lib/utilities/validate-params.js +13 -0
- package/package.json +4 -4
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
require("core-js/modules/es.symbol.description.js");
|
|
4
|
-
require("core-js/modules/es.error.cause.js");
|
|
5
3
|
require("core-js/modules/es.array.push.js");
|
|
6
|
-
require("core-js/modules/esnext.async-iterator.filter.js");
|
|
7
|
-
require("core-js/modules/esnext.async-iterator.for-each.js");
|
|
8
4
|
require("core-js/modules/esnext.function.metadata.js");
|
|
9
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
10
|
-
require("core-js/modules/esnext.iterator.filter.js");
|
|
11
|
-
require("core-js/modules/esnext.iterator.for-each.js");
|
|
12
5
|
require("core-js/modules/esnext.map.delete-all.js");
|
|
13
6
|
require("core-js/modules/esnext.map.emplace.js");
|
|
14
7
|
require("core-js/modules/esnext.map.every.js");
|
|
@@ -24,39 +17,32 @@ require("core-js/modules/esnext.map.reduce.js");
|
|
|
24
17
|
require("core-js/modules/esnext.map.some.js");
|
|
25
18
|
require("core-js/modules/esnext.map.update.js");
|
|
26
19
|
require("core-js/modules/esnext.symbol.metadata.js");
|
|
27
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
28
20
|
Object.defineProperty(exports, "__esModule", {
|
|
29
21
|
value: true
|
|
30
22
|
});
|
|
31
23
|
exports.FcrChatConnectionImpl = void 0;
|
|
32
|
-
require("core-js/modules/es.json.stringify.js");
|
|
33
|
-
require("core-js/modules/es.regexp.exec.js");
|
|
34
|
-
require("core-js/modules/web.dom-collections.iterator.js");
|
|
35
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
36
24
|
var _imports = require("../imports");
|
|
37
25
|
var _type = require("./type");
|
|
38
26
|
var _parameters = require("../utilities/parameters");
|
|
39
27
|
var _config2 = require("./config");
|
|
40
28
|
var _logger = require("../utilities/logger");
|
|
41
|
-
var _FcrChatConnectionImpl;
|
|
42
29
|
let _initProto;
|
|
43
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
44
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
45
30
|
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)]; } }; }
|
|
46
31
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
47
32
|
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); }
|
|
48
33
|
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; }
|
|
49
34
|
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; }
|
|
50
35
|
class FcrChatConnectionImpl {
|
|
36
|
+
static #_ = (() => [_initProto] = _applyDecs(this, [[_logger.trace, 2, "login"], [_logger.trace, 2, "logout"], [_logger.trace, 2, "getConnectionState"], [_logger.trace, 2, "getConnectionInstance"]], []).e)();
|
|
37
|
+
logger = (() => (_initProto(this), (0, _imports.getLogger)()))();
|
|
38
|
+
_observable = (() => new _imports.AgoraObservable())();
|
|
39
|
+
_connectionState = (() => _type.FcrChatConnectionState.DISCONNECTED)();
|
|
40
|
+
_offlineListener = () => {
|
|
41
|
+
if (this._connectionState !== _type.FcrChatConnectionState.DISCONNECTED) {
|
|
42
|
+
this._setConnectionState(_type.FcrChatConnectionState.DISCONNECTED);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
51
45
|
constructor(_config, _api) {
|
|
52
|
-
(0, _defineProperty2.default)(this, "logger", (_initProto(this), (0, _imports.getLogger)()));
|
|
53
|
-
(0, _defineProperty2.default)(this, "_observable", new _imports.AgoraObservable());
|
|
54
|
-
(0, _defineProperty2.default)(this, "_connectionState", _type.FcrChatConnectionState.DISCONNECTED);
|
|
55
|
-
(0, _defineProperty2.default)(this, "_offlineListener", () => {
|
|
56
|
-
if (this._connectionState !== _type.FcrChatConnectionState.DISCONNECTED) {
|
|
57
|
-
this._setConnectionState(_type.FcrChatConnectionState.DISCONNECTED);
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
46
|
this._config = _config;
|
|
61
47
|
this._api = _api;
|
|
62
48
|
}
|
|
@@ -70,9 +56,12 @@ class FcrChatConnectionImpl {
|
|
|
70
56
|
await (0, _imports.to)((0, _imports.retryAttempt)(async () => {
|
|
71
57
|
const tokenResult = await this._api.getUserToken(this._config.userId);
|
|
72
58
|
this._initConfig = tokenResult;
|
|
73
|
-
const connParams =
|
|
74
|
-
|
|
75
|
-
|
|
59
|
+
const connParams = {
|
|
60
|
+
..._config2.agoraChatConfig,
|
|
61
|
+
...privateConfig,
|
|
62
|
+
appKey: tokenResult.appKey,
|
|
63
|
+
autoReconnectNumMax: 99999
|
|
64
|
+
};
|
|
76
65
|
_imports.EasemobChatSDK.logger.setConsoleLogVisibility(false);
|
|
77
66
|
this._conn = new _imports.EasemobChatSDK.connection(connParams);
|
|
78
67
|
await this._conn.open({
|
|
@@ -92,15 +81,14 @@ class FcrChatConnectionImpl {
|
|
|
92
81
|
if (error instanceof _imports.AgoraRestfulClientError) {
|
|
93
82
|
throw error;
|
|
94
83
|
}
|
|
95
|
-
this.logger.error(
|
|
84
|
+
this.logger.error(`[ChatConnection] retry to login ChatConnection, ${error.message},retry ${currentRetry} times`);
|
|
96
85
|
await timeFn();
|
|
97
86
|
return true;
|
|
98
87
|
}).exec());
|
|
99
88
|
}
|
|
100
89
|
_addEventListeners() {
|
|
101
|
-
var _this$_conn;
|
|
102
90
|
window.addEventListener('offline', this._offlineListener);
|
|
103
|
-
|
|
91
|
+
this._conn?.addEventHandler('connection', {
|
|
104
92
|
onError: e => {
|
|
105
93
|
// this._observable.notifyObservers('onErrorOccurred', this._initConfig.roomId);
|
|
106
94
|
},
|
|
@@ -115,9 +103,8 @@ class FcrChatConnectionImpl {
|
|
|
115
103
|
});
|
|
116
104
|
}
|
|
117
105
|
logout() {
|
|
118
|
-
var _this$_conn2;
|
|
119
106
|
window.removeEventListener('offline', this._offlineListener);
|
|
120
|
-
|
|
107
|
+
this._conn?.close();
|
|
121
108
|
}
|
|
122
109
|
_setConnectionState(state) {
|
|
123
110
|
this._connectionState = state;
|
|
@@ -136,22 +123,18 @@ class FcrChatConnectionImpl {
|
|
|
136
123
|
this._observable.removeObserver(observer);
|
|
137
124
|
}
|
|
138
125
|
_getPrivateConfig() {
|
|
139
|
-
|
|
140
|
-
if ((_this$_chatIpList = this._chatIpList) !== null && _this$_chatIpList !== void 0 && _this$_chatIpList.length || (_this$_restIpList = this._restIpList) !== null && _this$_restIpList !== void 0 && _this$_restIpList.length) {
|
|
141
|
-
var _this$_chatIpList2, _this$_restIpList2;
|
|
126
|
+
if (this._chatIpList?.length || this._restIpList?.length) {
|
|
142
127
|
const privateConfig = {
|
|
143
128
|
isHttpDNS: false
|
|
144
129
|
};
|
|
145
|
-
if (
|
|
130
|
+
if (this._chatIpList?.length) {
|
|
146
131
|
privateConfig.url = this._chatIpList[0];
|
|
147
132
|
}
|
|
148
|
-
if (
|
|
133
|
+
if (this._restIpList?.length) {
|
|
149
134
|
privateConfig.apiUrl = this._restIpList[0];
|
|
150
135
|
}
|
|
151
136
|
return privateConfig;
|
|
152
137
|
}
|
|
153
138
|
}
|
|
154
139
|
}
|
|
155
|
-
exports.FcrChatConnectionImpl = FcrChatConnectionImpl;
|
|
156
|
-
_FcrChatConnectionImpl = FcrChatConnectionImpl;
|
|
157
|
-
[_initProto] = _applyDecs(_FcrChatConnectionImpl, [[_logger.trace, 2, "login"], [_logger.trace, 2, "logout"], [_logger.trace, 2, "getConnectionState"], [_logger.trace, 2, "getConnectionInstance"]], []).e;
|
|
140
|
+
exports.FcrChatConnectionImpl = FcrChatConnectionImpl;
|
package/lib/engine/index.js
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
require("core-js/modules/es.symbol.description.js");
|
|
4
3
|
require("core-js/modules/es.array.push.js");
|
|
5
|
-
require("core-js/modules/esnext.async-iterator.filter.js");
|
|
6
|
-
require("core-js/modules/esnext.async-iterator.for-each.js");
|
|
7
4
|
require("core-js/modules/esnext.function.metadata.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
9
|
-
require("core-js/modules/esnext.iterator.filter.js");
|
|
10
|
-
require("core-js/modules/esnext.iterator.for-each.js");
|
|
11
5
|
require("core-js/modules/esnext.map.delete-all.js");
|
|
12
6
|
require("core-js/modules/esnext.map.emplace.js");
|
|
13
7
|
require("core-js/modules/esnext.map.every.js");
|
|
@@ -28,13 +22,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
28
22
|
value: true
|
|
29
23
|
});
|
|
30
24
|
exports.FcrCoreEngine = void 0;
|
|
31
|
-
require("core-js/modules/
|
|
32
|
-
require("core-js/modules/es.json.stringify.js");
|
|
33
|
-
require("core-js/modules/es.regexp.exec.js");
|
|
34
|
-
require("core-js/modules/esnext.async-iterator.map.js");
|
|
25
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
35
26
|
require("core-js/modules/esnext.iterator.map.js");
|
|
36
|
-
require("core-js/modules/web.dom-collections.iterator.js");
|
|
37
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
38
27
|
var _imports = require("../imports");
|
|
39
28
|
var _api = require("../service/api");
|
|
40
29
|
var _monitorControl = require("../monitor-control");
|
|
@@ -42,7 +31,6 @@ var _type = require("../type");
|
|
|
42
31
|
var _desktop = require("../media-control/desktop");
|
|
43
32
|
var _peerSession = require("../peer-session");
|
|
44
33
|
var _parameters = require("../utilities/parameters");
|
|
45
|
-
var _packageInfo = require("../utilities/package-info");
|
|
46
34
|
var _error = require("../utilities/error");
|
|
47
35
|
var _cmd = require("../utilities/cmd");
|
|
48
36
|
var _type2 = require("../room-control/type");
|
|
@@ -57,22 +45,40 @@ var _mobile = require("../media-control/mobile");
|
|
|
57
45
|
var _chatroom = require("../plugins/chatroom");
|
|
58
46
|
var _whiteboardControlV = require("../room-control/whiteboard-control-v2");
|
|
59
47
|
var _logger = require("../utilities/logger");
|
|
60
|
-
var
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
48
|
+
var _validateParams = _interopRequireDefault(require("../utilities/validate-params"));
|
|
49
|
+
var _schema = require("../schema");
|
|
50
|
+
var _error2 = require("agora-rte-sdk/lib/core/utilities/error");
|
|
51
|
+
let _initProto, _createMainRoomControlDecs, _createWaitingRoomControlDecs, _createRoomControlAndJoinDecs, _sendPeerMessageDecs, _setParametersDecs;
|
|
64
52
|
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)]; } }; }
|
|
65
53
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
66
54
|
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); }
|
|
67
55
|
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; }
|
|
68
56
|
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; }
|
|
69
57
|
class FcrCoreEngine {
|
|
58
|
+
static #_ = (() => [_initProto] = _applyDecs(this, [[_logger.trace, 2, "release"], [_logger.trace, 2, "login"], [_logger.trace, 2, "logout"], [_logger.trace, 2, "getVersion"], [_createMainRoomControlDecs, 2, "createMainRoomControl"], [_createWaitingRoomControlDecs, 2, "createWaitingRoomControl"], [_createRoomControlAndJoinDecs, 2, "createRoomControlAndJoin"], [_logger.trace, 2, "getDesktopMediaControl"], [_logger.trace, 2, "getMobileMediaControl"], [_logger.trace, 2, "getMonitorControl"], [_logger.trace, 2, "getPeerSessionControl"], [_sendPeerMessageDecs, 2, "sendPeerMessage"], [_setParametersDecs, 2, "setParameters"]], []).e)();
|
|
59
|
+
// @internal
|
|
60
|
+
[(_createMainRoomControlDecs = [_logger.trace, (0, _validateParams.default)(_schema.stringSchema)], _createWaitingRoomControlDecs = [_logger.trace, (0, _validateParams.default)(_schema.stringSchema)], _createRoomControlAndJoinDecs = [_logger.trace, (0, _validateParams.default)(_schema.stringSchema, _schema.fcrRoomJoinOptionsSchema)], _sendPeerMessageDecs = [_logger.trace, (0, _validateParams.default)(_schema.stringKeyUnknownValueSchema, _schema.booleanSchema, _schema.stringSchema)], _setParametersDecs = [_logger.trace, (0, _validateParams.default)(_schema.stringKeyUnknownValueSchema)], "logger")] = (() => (_initProto(this), (0, _logger.createLogger)({
|
|
61
|
+
prefix: 'FcrCoreEngine'
|
|
62
|
+
})))();
|
|
63
|
+
// @internal
|
|
64
|
+
|
|
65
|
+
// @internal
|
|
66
|
+
|
|
67
|
+
// @internal
|
|
68
|
+
|
|
69
|
+
// @internal
|
|
70
|
+
|
|
71
|
+
// @internal
|
|
72
|
+
|
|
73
|
+
// @internal
|
|
74
|
+
|
|
75
|
+
// @internal
|
|
76
|
+
|
|
77
|
+
// @internal
|
|
78
|
+
|
|
79
|
+
// @internal
|
|
80
|
+
_isLoggingIn = false;
|
|
70
81
|
constructor(config) {
|
|
71
|
-
var _config$parameters, _config$parameters2, _config$parameters3;
|
|
72
|
-
// @internal
|
|
73
|
-
(0, _defineProperty2.default)(this, "logger", (_initProto(this), (0, _logger.getLogger)()));
|
|
74
|
-
// @internal
|
|
75
|
-
(0, _defineProperty2.default)(this, "_isLoggingIn", false);
|
|
76
82
|
this._config = config;
|
|
77
83
|
(0, _domainHolder.resetSharedDomainHolder)();
|
|
78
84
|
this._rteEngine = new _imports.AgoraRteEngine({
|
|
@@ -85,9 +91,9 @@ class FcrCoreEngine {
|
|
|
85
91
|
dualCameraVideoStreamConfig: config.dualCameraVideoStreamConfig,
|
|
86
92
|
dualScreenVideoStreamConfig: config.dualScreenVideoStreamConfig,
|
|
87
93
|
parameters: {
|
|
88
|
-
rte:
|
|
89
|
-
rtc:
|
|
90
|
-
rtm:
|
|
94
|
+
rte: config.parameters?.rte,
|
|
95
|
+
rtc: config.parameters?.rtc,
|
|
96
|
+
rtm: config.parameters?.rtm
|
|
91
97
|
}
|
|
92
98
|
});
|
|
93
99
|
const restfulClient = new _agoraRteSdk.AgoraRestfulClientImpl(this._rteEngine.getHttpAuthHeadersProvider(), (0, _imports.getSharedDomainHolder)(config.region));
|
|
@@ -103,7 +109,7 @@ class FcrCoreEngine {
|
|
|
103
109
|
this._addRteEngineObserver();
|
|
104
110
|
const coreIpList = (0, _parameters.getCoreIpList)(config.parameters);
|
|
105
111
|
if (coreIpList) {
|
|
106
|
-
this.logger.info(
|
|
112
|
+
this.logger.info(`set fixed domain list: ${JSON.stringify(coreIpList)}`);
|
|
107
113
|
(0, _imports.getSharedDomainHolder)(this._config.region).setFixedDomainList(coreIpList);
|
|
108
114
|
}
|
|
109
115
|
}
|
|
@@ -148,7 +154,7 @@ class FcrCoreEngine {
|
|
|
148
154
|
* @returns The version of the SDK.
|
|
149
155
|
*/
|
|
150
156
|
getVersion() {
|
|
151
|
-
return (0,
|
|
157
|
+
return (0, _imports.getVersion)();
|
|
152
158
|
}
|
|
153
159
|
|
|
154
160
|
/**
|
|
@@ -184,77 +190,62 @@ class FcrCoreEngine {
|
|
|
184
190
|
const {
|
|
185
191
|
userId
|
|
186
192
|
} = this._rteEngine.getConfig();
|
|
187
|
-
let
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
res = await this._apiService.checkIn({
|
|
193
|
+
let roomControl = null;
|
|
194
|
+
let [error] = await (0, _imports.to)((0, _imports.retryAttempt)(async () => {
|
|
195
|
+
const res = await (0, _error.handleRequestError)(() => this._apiService.checkIn({
|
|
191
196
|
userName: options.userName,
|
|
192
197
|
userId,
|
|
193
198
|
userRole: _type.FcrUserRoleToStringMap[options.userRole],
|
|
194
199
|
userProperties: options.userProperties,
|
|
195
200
|
roomId,
|
|
196
201
|
platform: (0, _imports.getPlatform)(),
|
|
197
|
-
streams:
|
|
202
|
+
streams: options.createStreamConfigs?.map(s => ({
|
|
198
203
|
videoSourceUuid: s.videoSourceId,
|
|
199
204
|
audioSourceUuid: s.audioSourceId,
|
|
200
|
-
streamName: s.streamName
|
|
201
|
-
|
|
205
|
+
streamName: s.streamName,
|
|
206
|
+
...(0, _helper.convertStreamTypeToPublishState)(s.streamType),
|
|
202
207
|
videoSourceType: s.videoSourceType,
|
|
203
208
|
audioSourceType: s.audioSourceType,
|
|
204
209
|
audioSourceState: s.audioSourceState,
|
|
205
210
|
videoSourceState: s.videoSourceState
|
|
206
211
|
})),
|
|
207
|
-
version: (0,
|
|
212
|
+
version: (0, _imports.getVersion)(),
|
|
208
213
|
password: options.password
|
|
214
|
+
}), _error.FcrErrorModuleCode.ENGINE);
|
|
215
|
+
const {
|
|
216
|
+
data,
|
|
217
|
+
ts
|
|
218
|
+
} = res;
|
|
219
|
+
if (data.room.roomProperties.roomType === _type2.FcrRoomType.Waitingroom) {
|
|
220
|
+
roomControl = this.createWaitingRoomControl(data.room.roomInfo.roomUuid);
|
|
221
|
+
} else {
|
|
222
|
+
roomControl = this.createMainRoomControl(roomId);
|
|
223
|
+
}
|
|
224
|
+
await roomControl.join({
|
|
225
|
+
...options,
|
|
226
|
+
snapshot: data,
|
|
227
|
+
timestamp: ts,
|
|
228
|
+
createStreamConfigs: data.room.roomProperties.roomType === _type2.FcrRoomType.Waitingroom ? [] : options.createStreamConfigs
|
|
209
229
|
});
|
|
210
230
|
}, [], {
|
|
211
|
-
retriesMax:
|
|
231
|
+
retriesMax: 10
|
|
212
232
|
}).fail(async _ref => {
|
|
213
233
|
let {
|
|
214
234
|
error,
|
|
215
235
|
timeFn,
|
|
216
236
|
currentRetry
|
|
217
237
|
} = _ref;
|
|
218
|
-
if (error instanceof
|
|
238
|
+
if ((error instanceof _error2.AgoraRteError || error instanceof _error.FcrError) && _error.RTE_ERROR_CODES_NOT_RETRYABLE_WHEN_JOINING_ROOM.includes(error.code)) {
|
|
219
239
|
throw error;
|
|
220
240
|
}
|
|
221
|
-
this.logger.error(
|
|
241
|
+
this.logger.error(`retry to join room, ${error.message}, retry ${currentRetry} times`);
|
|
222
242
|
await timeFn();
|
|
223
243
|
return true;
|
|
224
244
|
}).exec());
|
|
225
245
|
if (error) {
|
|
226
|
-
this.logger.error(
|
|
227
|
-
|
|
228
|
-
if (error.httpCode < 100) {
|
|
229
|
-
throw (0, _error.generateFcrCoreClientError)(_error.FcrErrorModuleCode.ROOM, _error.FcrErrorCode.LOCAL_HTTP_REQUEST_FAILED, "entry room failed, ".concat(error.message), error);
|
|
230
|
-
} else {
|
|
231
|
-
var _error$serviceCode;
|
|
232
|
-
throw (0, _error.generateFcrCoreServerError)((_error$serviceCode = error.serviceCode) !== null && _error$serviceCode !== void 0 ? _error$serviceCode : -1, error.message, error);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
throw (0, _error.generateFcrCoreClientError)(_error.FcrErrorModuleCode.ROOM, _error.FcrErrorCode.UNDEFINED_ERROR, 'join room failed', error);
|
|
236
|
-
}
|
|
237
|
-
if (!res) {
|
|
238
|
-
this.logger.error("[RoomControl] cannot get data from check in respnose");
|
|
239
|
-
throw (0, _error.generateFcrCoreClientError)(_error.FcrErrorModuleCode.ROOM, _error.FcrErrorCode.UNDEFINED_ERROR, 'join room failed', new Error('cannot get data from check in respnose'));
|
|
240
|
-
}
|
|
241
|
-
const {
|
|
242
|
-
data,
|
|
243
|
-
ts
|
|
244
|
-
} = res;
|
|
245
|
-
// console.log('data.room.roomProperties.roomType', data.room.roomProperties.roomType);
|
|
246
|
-
|
|
247
|
-
let roomControl = null;
|
|
248
|
-
if (data.room.roomProperties.roomType === _type2.FcrRoomType.Waitingroom) {
|
|
249
|
-
roomControl = this.createWaitingRoomControl(data.room.roomInfo.roomUuid);
|
|
250
|
-
} else {
|
|
251
|
-
roomControl = this.createMainRoomControl(roomId);
|
|
246
|
+
this.logger.error(`join room failed, ${error.message}-${JSON.stringify(error)}`);
|
|
247
|
+
throw error;
|
|
252
248
|
}
|
|
253
|
-
await roomControl.join(_objectSpread(_objectSpread({}, options), {}, {
|
|
254
|
-
snapshot: data,
|
|
255
|
-
timestamp: ts,
|
|
256
|
-
createStreamConfigs: data.room.roomProperties.roomType === _type2.FcrRoomType.Waitingroom ? [] : options.createStreamConfigs
|
|
257
|
-
}));
|
|
258
249
|
return roomControl;
|
|
259
250
|
}
|
|
260
251
|
|
|
@@ -297,7 +288,7 @@ class FcrCoreEngine {
|
|
|
297
288
|
* @param receiverId
|
|
298
289
|
*/
|
|
299
290
|
async sendPeerMessage(payload, guaranteedDelivery, receiverId) {
|
|
300
|
-
await this._rteEngine.sendPeerMessage(payload,
|
|
291
|
+
await this._rteEngine.sendPeerMessage(payload, `${_cmd.CMD_PEER_MESSAGE}`, guaranteedDelivery, receiverId);
|
|
301
292
|
}
|
|
302
293
|
|
|
303
294
|
/**
|
|
@@ -317,7 +308,7 @@ class FcrCoreEngine {
|
|
|
317
308
|
rte: rte
|
|
318
309
|
});
|
|
319
310
|
} catch (e) {
|
|
320
|
-
this.logger.warn('
|
|
311
|
+
this.logger.warn('setParameters failed', e);
|
|
321
312
|
}
|
|
322
313
|
}
|
|
323
314
|
|
|
@@ -349,6 +340,4 @@ class FcrCoreEngine {
|
|
|
349
340
|
this.addObserver((0, _logger.generateLogObserver)(this.logger, ['onConnectionStateUpdated', 'onPeerMessageReceived']));
|
|
350
341
|
}
|
|
351
342
|
}
|
|
352
|
-
exports.FcrCoreEngine = FcrCoreEngine;
|
|
353
|
-
_FcrCoreEngine = FcrCoreEngine;
|
|
354
|
-
[_initProto] = _applyDecs(_FcrCoreEngine, [[_logger.trace, 2, "release"], [_logger.trace, 2, "login"], [_logger.trace, 2, "logout"], [_logger.trace, 2, "getVersion"], [_logger.trace, 2, "createMainRoomControl"], [_logger.trace, 2, "createWaitingRoomControl"], [_logger.trace, 2, "createRoomControlAndJoin"], [_logger.trace, 2, "getDesktopMediaControl"], [_logger.trace, 2, "getMobileMediaControl"], [_logger.trace, 2, "getMonitorControl"], [_logger.trace, 2, "getPeerSessionControl"], [_logger.trace, 2, "sendPeerMessage"], [_logger.trace, 2, "setParameters"]], []).e;
|
|
343
|
+
exports.FcrCoreEngine = FcrCoreEngine;
|
package/lib/imports.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export { z, ZodError, anySchema, booleanSchema, numberSchema, stringSchema, fcrRenderViewSchema, unknownSchema, objectSchema, createRecordSchemaWithKey, createUnionSchema, createArraySchema, } from 'agora-foundation/lib/utilities/schema';
|
|
2
|
+
export { validateParams } from 'agora-foundation/lib/decorator/validate';
|
|
1
3
|
export { md5 } from 'js-md5';
|
|
2
4
|
import to from 'await-to-js';
|
|
3
5
|
import get from 'lodash/get';
|
|
@@ -5,6 +7,7 @@ import padStart from 'lodash/padStart';
|
|
|
5
7
|
import padEnd from 'lodash/padEnd';
|
|
6
8
|
import toLower from 'lodash/toLower';
|
|
7
9
|
import { default as EasemobChatSDK } from 'easemob-websdk';
|
|
10
|
+
import { FcrVideoEncoderConfigurationSchema, FcrMediaStreamCreateConfigSchema, FcrStreamBindConfigSchema } from './schema';
|
|
8
11
|
export { to, get, padStart, padEnd, toLower, EasemobChatSDK };
|
|
9
12
|
export { EasemobChat } from 'easemob-websdk';
|
|
10
13
|
export { WhiteWebSdk, createPlugins } from 'white-web-sdk';
|
|
@@ -18,12 +21,16 @@ export { getPlatform } from 'agora-foundation/lib/utilities/env';
|
|
|
18
21
|
export { Duration } from 'agora-foundation/lib/schedule/scheduler';
|
|
19
22
|
export { trace, bound } from 'agora-foundation/lib/decorator';
|
|
20
23
|
export { AgoraScheduler, ActionWhenTaskFail } from 'agora-foundation/lib/schedule';
|
|
24
|
+
export { sleep, jsonstring } from 'agora-foundation/lib/utilities/misc';
|
|
21
25
|
export type { AgoraRtcNetworkStats, AgoraRtcDeviceInfo, AgoraRtcDisplayInfo, AgoraRtcWindowInfo, AgoraRtePerformanceInfo, AgoraRteScenePropertiesDeletedEvent, AgoraRteStreamEncryptionConfig, AgoraRteStreamJoinConfig, AgoraRteDualVideoStreamConfig, AgoraRteMessage, AgoraRteScenePropertiesUpdatedEvent, AgoraRteRenderView, AgoraRteScene, } from 'agora-rte-sdk';
|
|
22
|
-
export type {
|
|
26
|
+
export type { AgoraRteEngineObserver } from 'agora-rte-sdk/lib/type';
|
|
23
27
|
export type { AgoraRteNetworkQualityEvent } from 'agora-rte-sdk/lib/core/scene/type';
|
|
24
28
|
export type { AgoraRteOperatCause } from 'agora-rte-sdk/lib/core/processor/type';
|
|
25
29
|
export type { AgoraRestfulClient } from 'agora-rte-sdk/lib/core/services/client';
|
|
26
|
-
export type { AgoraRteUserUpdatedReason as FcrUserUpdatedReason, AgoraRteUserPageParams, AgoraRteUserPageResponse, AgoraRteUserPropertiesDeletedEvent, AgoraRteUserPropertiesUpdatedEvent, AgoraRteUserInfo, AgoraRteSceneObserver, AgoraRteSnapshotInfo,
|
|
30
|
+
export type { AgoraRteUserUpdatedReason as FcrUserUpdatedReason, AgoraRteUserPageParams, AgoraRteUserPageResponse, AgoraRteUserPropertiesDeletedEvent, AgoraRteUserPropertiesUpdatedEvent, AgoraRteUserInfo, AgoraRteSceneObserver, AgoraRteSnapshotInfo, AgoraRteEntryRoomResponse, AgoraRteMediaStreamEvent, } from 'agora-rte-sdk/lib/core/scene/type';
|
|
31
|
+
export type AgoraRteMediaStreamCreateConfig = FcrMediaStreamCreateConfigSchema;
|
|
32
|
+
export type AgoraRteStreamBindConfig = FcrStreamBindConfigSchema;
|
|
33
|
+
export type AgoraRteVideoEncoderConfig = FcrVideoEncoderConfigurationSchema;
|
|
27
34
|
export type { AgoraRtcLocalVideoStats, AgoraRtcLocalAudioStats, AgoraRtcRemoteVideoStats, AgoraRtcRemoteAudioStats, AgoraRtcDimensions, } from 'agora-rte-sdk/lib/core/rtc/type';
|
|
28
35
|
export type { AgoraRteAudioRawDataConfig, AgoraRteBeautyOptions, AgoraRteCameraPosition, AgoraRteScreenCaptureParams, AgoraRteVirtualBackgroundOptions, AgoraRteCameraCaptureParams, } from 'agora-rte-sdk/lib/core/media/type';
|
|
29
36
|
export type { AgoraRteMediaStreamInfo } from 'agora-rte-sdk/lib/core/processor/struct';
|
|
@@ -31,14 +38,17 @@ export type { AgoraRteMonitor } from 'agora-rte-sdk/lib/core/monitor';
|
|
|
31
38
|
export type { AgoraRteMediaControl } from 'agora-rte-sdk/lib/core/media';
|
|
32
39
|
export { AgoraRteConnectionState, AgoraRteEngine, convertStreamTypeToPublishState, AgoraRteLatencyLevel, } from 'agora-rte-sdk';
|
|
33
40
|
export { AgoraRteRoomConnectorType, AgoraRteStreamPrivilegeOperation, AgoraRteStreamPrivilegeVideoSourceType, AgoraRteStreamPrivilegeAudioSourceType, AgoraRteMediaStreamType, } from 'agora-rte-sdk/lib/core/scene/type';
|
|
34
|
-
export { AgoraRtcRegion, AgoraRtcVideoSourceType, AgoraRtcAudioSourceType, AgoraRtcMediaSourceState, AgoraRtcRenderMode, AgoraRtcVideoStreamType, AgoraRtcCapability, AgoraRtcAiDenoiseLevel, AgoraRtcAudioOutputRouting, } from 'agora-rte-sdk/lib/core/rtc/type';
|
|
41
|
+
export { AgoraRtcRegion, AgoraRtcVideoSourceType, AgoraRtcAudioSourceType, AgoraRtcMediaSourceState, AgoraRtcRenderMode, AgoraRtcVideoStreamType, AgoraRtcCapability, AgoraRtcAiDenoiseLevel, AgoraRtcAudioOutputRouting, AgoraRtcLatencyLevelType, AgoraRtcEncryptionMode, } from 'agora-rte-sdk/lib/core/rtc/type';
|
|
35
42
|
export { AgoraRtmRegion } from 'agora-rte-sdk/lib/core/rtm/type';
|
|
36
|
-
export { AgoraRteRegion } from 'agora-rte-sdk/lib/type';
|
|
43
|
+
export { AgoraRteRegion, AgoraRteAudioSourceType, AgoraRteVideoSourceType, } from 'agora-rte-sdk/lib/type';
|
|
37
44
|
export { AgoraRestfulClientError } from 'agora-rte-sdk/lib/core/services/client';
|
|
38
45
|
export { getSharedDomainHolder } from 'agora-rte-sdk/lib/core/services/domain-holder';
|
|
39
46
|
export { AgoraRteScreenCaptureType, AgoraRteVideoOrientation, } from 'agora-rte-sdk/lib/core/media/type';
|
|
40
47
|
export { registerPlugin } from 'agora-rte-sdk/lib/core/engine/plugin';
|
|
41
48
|
export { AgoraRteUserUpdatedReason } from 'agora-rte-sdk/lib/core/scene/type';
|
|
49
|
+
export type { AgoraRteUploadEvent } from 'agora-rte-sdk/lib/core/monitor/type';
|
|
50
|
+
export { AgoraRtePlatform } from 'agora-rte-sdk/lib/type';
|
|
42
51
|
export { FcrCoreEngine } from './engine';
|
|
43
52
|
export type FcrImageData = ImageData;
|
|
44
53
|
export type FcrWhiteboardView = HTMLElement;
|
|
54
|
+
export { getVersion } from './utilities/package-info';
|