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,279 @@
1
+ import "core-js/modules/es.array.push.js";
2
+ import "core-js/modules/esnext.function.metadata.js";
3
+ import "core-js/modules/esnext.symbol.metadata.js";
4
+ let _initProto, _startPeerSessionDecs, _stopPeerSessionDecs, _acceptPeerSessionDecs, _rejectPeerSessionDecs;
5
+ import "core-js/modules/es.json.stringify.js";
6
+ import "core-js/modules/esnext.map.delete-all.js";
7
+ import "core-js/modules/esnext.map.emplace.js";
8
+ import "core-js/modules/esnext.map.every.js";
9
+ import "core-js/modules/esnext.map.filter.js";
10
+ import "core-js/modules/esnext.map.find.js";
11
+ import "core-js/modules/esnext.map.find-key.js";
12
+ import "core-js/modules/esnext.map.includes.js";
13
+ import "core-js/modules/esnext.map.key-of.js";
14
+ import "core-js/modules/esnext.map.map-keys.js";
15
+ import "core-js/modules/esnext.map.map-values.js";
16
+ import "core-js/modules/esnext.map.merge.js";
17
+ import "core-js/modules/esnext.map.reduce.js";
18
+ import "core-js/modules/esnext.map.some.js";
19
+ import "core-js/modules/esnext.map.update.js";
20
+ 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)]; } }; }
21
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
22
+ 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); }
23
+ 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; }
24
+ 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; }
25
+ import { AgoraObservable, md5, Duration, ActionWhenTaskFail, AgoraScheduler, trace } from '../imports';
26
+ import { generateFcrCoreServerError } from '../utilities/error';
27
+ import { createLogger, generateLogObserver } from '../utilities/logger';
28
+ import { fcrPeerSessionParamsSchema, fcrSessionBaseSchema, stringKeyUnknownValueSchema, stringSchema } from '../schema';
29
+ import validateParams from '../utilities/validate-params';
30
+ import { DetailErrorCode } from '../imports';
31
+ /**
32
+ * @internal
33
+ */
34
+ export class FcrPeerSessionControlImpl {
35
+ static {
36
+ [_initProto] = _applyDecs(this, [[_startPeerSessionDecs, 2, "startPeerSession"], [_stopPeerSessionDecs, 2, "stopPeerSession"], [_acceptPeerSessionDecs, 2, "acceptPeerSession"], [_rejectPeerSessionDecs, 2, "rejectPeerSession"]], []).e;
37
+ }
38
+ //@internal
39
+ [(_startPeerSessionDecs = [trace(['params']), validateParams(fcrPeerSessionParamsSchema)], _stopPeerSessionDecs = [trace(['sessionId']), validateParams(stringSchema)], _acceptPeerSessionDecs = [trace(['session', 'cause']), validateParams(fcrSessionBaseSchema, stringKeyUnknownValueSchema.optional())], _rejectPeerSessionDecs = [trace(['session', 'cause']), validateParams(fcrSessionBaseSchema, stringKeyUnknownValueSchema.optional())], "logger")] = (_initProto(this), createLogger({
40
+ prefix: 'FcrPeerSessionControlImpl'
41
+ }));
42
+ //@internal
43
+ _observable = new AgoraObservable();
44
+ //@internal
45
+ _taskInterval = Duration.second(1);
46
+ //@internal
47
+
48
+ //@internal
49
+ _scheduleMap = new Map();
50
+ //@internal
51
+ _receivedMap = new Map();
52
+ constructor(_rteEngine, _api, _userId) {
53
+ this._rteEngine = _rteEngine;
54
+ this._api = _api;
55
+ this._userId = _userId;
56
+ this._addLogObserver();
57
+ this._executeTask = this._executeTask.bind(this);
58
+ this._rteEngine.addObserver({
59
+ onPeerMessageReceived: this._handlePeerMessage.bind(this)
60
+ });
61
+ this._task = AgoraScheduler.shared.addPollingTask(this._executeTask, this._taskInterval, true, () => ActionWhenTaskFail.CONTINUE);
62
+ }
63
+ async startPeerSession(params) {
64
+ try {
65
+ const session = {
66
+ sessionId: md5(`${Date.now()}`),
67
+ sessionKey: params.sessionKey,
68
+ payload: params.payload,
69
+ duration: params.duration,
70
+ sender: this._userId
71
+ };
72
+ const {
73
+ data: {
74
+ interval
75
+ }
76
+ } = await this._api.updatePeerSession({
77
+ userId: this._userId,
78
+ sessionId: session.sessionId,
79
+ sessionKey: session.sessionKey,
80
+ duration: session.duration,
81
+ payload: session.payload,
82
+ targetId: params.receiverId
83
+ });
84
+ const nextTs = Date.now() + interval;
85
+ this._scheduleMap.set(session.sessionId, {
86
+ ...params,
87
+ nextTs,
88
+ startTs: Date.now()
89
+ });
90
+ this.logger.info(`[PeerSession] put into session schedule: ${session.sessionId}, next ts: ${nextTs}, remain: ${nextTs - Date.now()}ms`);
91
+ return session.sessionId;
92
+ } catch (e) {
93
+ throw generateFcrCoreServerError(DetailErrorCode.LOCAL_HTTP_REQUEST_FAILED, 'start peer session failed', e);
94
+ }
95
+ }
96
+ stopPeerSession(sessionId) {
97
+ return this._scheduleMap.delete(sessionId);
98
+ }
99
+ async acceptPeerSession(session, cause) {
100
+ if (this._isSessionExpired(session)) {
101
+ throw generateFcrCoreServerError(DetailErrorCode.EXPIRED, 'accept peer session failed: session expired', new Error());
102
+ }
103
+ try {
104
+ return this._api.deletePeerSession({
105
+ userId: this._userId,
106
+ sessionId: session.sessionId,
107
+ sessionKey: session.sessionKey,
108
+ receiverIds: [session.senderId],
109
+ action: 1,
110
+ payload: {
111
+ cause
112
+ }
113
+ });
114
+ } catch (e) {
115
+ throw generateFcrCoreServerError(DetailErrorCode.LOCAL_HTTP_REQUEST_FAILED, 'accept peer session failed', e);
116
+ }
117
+ }
118
+ async rejectPeerSession(session, cause) {
119
+ if (this._isSessionExpired(session)) {
120
+ throw generateFcrCoreServerError(DetailErrorCode.EXPIRED, 'reject peer session failed: session expired', new Error());
121
+ }
122
+ try {
123
+ return this._api.deletePeerSession({
124
+ userId: this._userId,
125
+ sessionId: session.sessionId,
126
+ sessionKey: session.sessionKey,
127
+ receiverIds: [session.senderId],
128
+ action: 2,
129
+ payload: {
130
+ cause
131
+ }
132
+ });
133
+ } catch (e) {
134
+ throw generateFcrCoreServerError(DetailErrorCode.LOCAL_HTTP_REQUEST_FAILED, 'reject peer session failed', e);
135
+ }
136
+ }
137
+ addObserver(observer) {
138
+ this._observable.addObserver(observer);
139
+ }
140
+ removeObserver(observer) {
141
+ this._observable.removeObserver(observer);
142
+ }
143
+
144
+ //@internal
145
+ async _executeTask() {
146
+ // ping sessions (sender side)
147
+ for (const key of this._scheduleMap.keys()) {
148
+ const params = this._scheduleMap.get(key);
149
+ const session = {
150
+ sessionId: key,
151
+ sessionKey: params.sessionKey,
152
+ payload: params.payload,
153
+ duration: params.duration,
154
+ senderId: this._userId,
155
+ timestamp: params.startTs,
156
+ interval: 0
157
+ };
158
+ if (this._isSessionExpired(session)) {
159
+ this.logger.info(`peer session expired, removed: ${session.sessionId}`);
160
+ this._scheduleMap.delete(session.sessionId);
161
+ continue;
162
+ }
163
+ // check timeout
164
+ if (params.nextTs < Date.now()) {
165
+ this.logger.info(`ping session: ${session.sessionId}`);
166
+ try {
167
+ const {
168
+ data: {
169
+ interval
170
+ }
171
+ } = await this._api.updatePeerSession({
172
+ userId: this._userId,
173
+ sessionId: session.sessionId,
174
+ sessionKey: session.sessionKey,
175
+ duration: params.duration,
176
+ payload: session.payload,
177
+ targetId: params.receiverId
178
+ });
179
+ const nextTs = Date.now() + interval;
180
+ if (this._scheduleMap.has(session.sessionId)) {
181
+ this._scheduleMap.set(session.sessionId, {
182
+ ...params,
183
+ nextTs
184
+ });
185
+ this.logger.info(`[PeerSession] refresh session schedule: ${session.sessionId}, next ts: ${nextTs}`);
186
+ }
187
+ } catch (e) {
188
+ this.logger.error(`ping session failed: ${e}`);
189
+ }
190
+ }
191
+ }
192
+ // clear expired sessions (receiver side)
193
+ for (const key of this._receivedMap.keys()) {
194
+ const session = this._receivedMap.get(key);
195
+ if (this._isSessionExpired(session)) {
196
+ this._receivedMap.delete(key);
197
+ this.logger.info(`delete session callback: ${key}`);
198
+ }
199
+ }
200
+ }
201
+
202
+ //@internal
203
+ async _handlePeerMessage(message) {
204
+ const {
205
+ senderId,
206
+ payload
207
+ } = message;
208
+ const {
209
+ data,
210
+ cmd
211
+ } = payload;
212
+ if (cmd === '1001') {
213
+ const session = {
214
+ sessionId: data.sessionUuid,
215
+ sessionKey: data.sessionKey,
216
+ senderId,
217
+ duration: data.duration,
218
+ timestamp: message.timestamp,
219
+ interval: data.interval,
220
+ payload: data.payload
221
+ };
222
+ const sessionCache = this._receivedMap.get(session.sessionId);
223
+ if (sessionCache) {
224
+ session.timestamp = sessionCache.timestamp;
225
+ }
226
+ if (!this._isSessionExpired(session)) {
227
+ if (!this._receivedMap.has(session.sessionId)) {
228
+ this.logger.info(`[PeerSession] received peer session request ${JSON.stringify(session)}`);
229
+ this._observable.notifyObservers('onPeerSessionReceived', session);
230
+ }
231
+ this._receivedMap.set(session.sessionId, session);
232
+ }
233
+ } else if (cmd === '1002') {
234
+ if (data.action === 1) {
235
+ if (this._scheduleMap.has(data.sessionUuid)) {
236
+ const session = this._scheduleMap.get(data.sessionUuid);
237
+ const sessionResponse = {
238
+ sessionId: data.sessionUuid,
239
+ sessionKey: data.sessionKey,
240
+ responderId: senderId,
241
+ // FIXME: session may be lost when the client refreshes
242
+ // get payload from original session
243
+ payload: session.payload ?? {},
244
+ cause: data.payload?.cause ?? {}
245
+ };
246
+ this.logger.info(`[PeerSession] received peer session accepted ${JSON.stringify(sessionResponse)}`);
247
+ this._scheduleMap.delete(data.sessionUuid);
248
+ this._observable.notifyObservers('onPeerSessionAccepted', sessionResponse);
249
+ }
250
+ } else if (data.action === 2) {
251
+ if (this._scheduleMap.has(data.sessionUuid)) {
252
+ const session = this._scheduleMap.get(data.sessionUuid);
253
+ const sessionResponse = {
254
+ sessionId: data.sessionUuid,
255
+ sessionKey: data.sessionKey,
256
+ responderId: senderId,
257
+ // FIXME: session may be lost when the client refreshes
258
+ // get payload from original session
259
+ payload: session.payload ?? {},
260
+ cause: data.payload?.cause ?? {}
261
+ };
262
+ this.logger.info(`[PeerSession] received peer session rejected ${JSON.stringify(sessionResponse)}`);
263
+ if (this._scheduleMap.has(data.sessionUuid)) {
264
+ this._scheduleMap.delete(data.sessionUuid);
265
+ this._observable.notifyObservers('onPeerSessionRejected', sessionResponse);
266
+ }
267
+ }
268
+ }
269
+ }
270
+ }
271
+
272
+ //@internal
273
+ _isSessionExpired(session) {
274
+ return session.timestamp + session.duration * Duration.second(1) < Date.now();
275
+ }
276
+ _addLogObserver() {
277
+ this.addObserver(generateLogObserver(this.logger, [['onPeerSessionAccepted', ['session']], ['onPeerSessionReceived', ['session']], ['onPeerSessionRejected', ['session']]]));
278
+ }
279
+ }
@@ -0,0 +1 @@
1
+ export {};