agora-rte-sdk 2.8.21 → 2.8.40

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 (58) hide show
  1. package/dist/index.js +2 -2
  2. package/lib/configs/index.d.ts +8 -6
  3. package/lib/configs/index.js +8 -6
  4. package/lib/core/engine/index.js +1 -7
  5. package/lib/core/logger/index.d.ts +1 -0
  6. package/lib/core/logger/index.js +22 -2
  7. package/lib/core/logger/log.worker.js +4 -2
  8. package/lib/core/media/control.d.ts +11 -8
  9. package/lib/core/media/control.js +42 -32
  10. package/lib/core/media/player.d.ts +9 -0
  11. package/lib/core/media/player.js +36 -0
  12. package/lib/core/media/track.d.ts +8 -1
  13. package/lib/core/media/track.js +18 -0
  14. package/lib/core/media/type.d.ts +113 -0
  15. package/lib/core/media/type.js +31 -0
  16. package/lib/core/processor/channel-msg/data.d.ts +1 -0
  17. package/lib/core/processor/channel-msg/data.js +5 -0
  18. package/lib/core/processor/channel-msg/handler.d.ts +1 -3
  19. package/lib/core/processor/channel-msg/handler.js +20 -21
  20. package/lib/core/processor/channel-msg/message-parser.d.ts +6 -0
  21. package/lib/core/processor/channel-msg/message-parser.js +57 -0
  22. package/lib/core/processor/channel-msg/struct.d.ts +5 -0
  23. package/lib/core/processor/channel-msg/synchronizer.d.ts +7 -14
  24. package/lib/core/processor/channel-msg/synchronizer.js +33 -48
  25. package/lib/core/processor/peer-msg/handler.d.ts +16 -0
  26. package/lib/core/processor/peer-msg/handler.js +57 -0
  27. package/lib/core/processor/peer-msg/struct.d.ts +4 -0
  28. package/lib/core/processor/type.d.ts +200 -0
  29. package/lib/core/rc/index.js +6 -2
  30. package/lib/core/rtc/adapter/base.d.ts +6 -7
  31. package/lib/core/rtc/adapter/electron/device.d.ts +0 -1
  32. package/lib/core/rtc/adapter/electron/device.js +0 -5
  33. package/lib/core/rtc/adapter/electron/index.d.ts +6 -7
  34. package/lib/core/rtc/adapter/electron/index.js +22 -24
  35. package/lib/core/rtc/adapter/web/client.d.ts +11 -9
  36. package/lib/core/rtc/adapter/web/client.js +40 -38
  37. package/lib/core/rtc/adapter/web/device.d.ts +0 -1
  38. package/lib/core/rtc/adapter/web/device.js +0 -5
  39. package/lib/core/rtc/adapter/web/dispatcher.d.ts +61 -0
  40. package/lib/core/rtc/adapter/web/dispatcher.js +166 -0
  41. package/lib/core/rtc/adapter/web/index.d.ts +11 -7
  42. package/lib/core/rtc/adapter/web/index.js +25 -16
  43. package/lib/core/rtc/adapter/web/thread.d.ts +18 -11
  44. package/lib/core/rtc/adapter/web/thread.js +241 -133
  45. package/lib/core/rtc/channel.d.ts +2 -3
  46. package/lib/core/rtc/index.d.ts +5 -4
  47. package/lib/core/rtc/index.js +12 -12
  48. package/lib/core/rtc/type.d.ts +0 -4
  49. package/lib/core/services/api.d.ts +15 -0
  50. package/lib/core/services/api.js +36 -1
  51. package/lib/core/utils/events.d.ts +0 -1
  52. package/lib/index.d.ts +3 -1
  53. package/lib/index.js +24 -17
  54. package/lib/scene/index.d.ts +1 -5
  55. package/lib/scene/index.js +88 -66
  56. package/lib/scene/state-sync.d.ts +21 -0
  57. package/lib/scene/state-sync.js +169 -0
  58. package/package.json +1 -1
@@ -88,6 +88,11 @@ var AgoraRteSyncDataStore = /*#__PURE__*/function () {
88
88
  value: function deleteStream(key) {
89
89
  this._streams = this._streams["delete"](key);
90
90
  }
91
+ }, {
92
+ key: "deleteStreams",
93
+ value: function deleteStreams(keys) {
94
+ this._streams = this._streams.deleteAll(keys);
95
+ }
91
96
  }, {
92
97
  key: "findStream",
93
98
  value: function findStream(streamUuid) {
@@ -1,4 +1,4 @@
1
- import { AgoraRteMessageHandleTask, AgoraRtePeerMessageHandleTask, AgoraRteSyncSnapshotData } from './struct';
1
+ import { AgoraRteMessageHandleTask, AgoraRteSyncSnapshotData } from './struct';
2
2
  import { AgoraRteSyncDataStore } from './data';
3
3
  import { AGEventEmitter } from '../../utils/events';
4
4
  import { Logger } from '../../logger';
@@ -70,8 +70,6 @@ export declare class AgoraRteChannelMessageHandle extends AGEventEmitter {
70
70
  private _handleSimpleMessage;
71
71
  private _handleBatchMessage;
72
72
  private _handleUserPropertyList;
73
- handlePeerMessage(task: AgoraRtePeerMessageHandleTask): void;
74
- private _handlePeerChat;
75
73
  private _handleChat;
76
74
  private _mergeProperties;
77
75
  private _handleRoomProperties;
@@ -271,23 +271,6 @@ var AgoraRteChannelMessageHandle = (_dec = _decorator.Log.attach({
271
271
  };
272
272
  this.emit(AgoraRteEventType.UserPropertyListUpdated, changedProperties, transformed, operator, cause);
273
273
  }
274
- }, {
275
- key: "handlePeerMessage",
276
- value: function handlePeerMessage(task) {
277
- switch (task.cmd) {
278
- case AgoraRtePeerMessageCmd.PeerChat:
279
- this._handlePeerChat(task);
280
- break;
281
- }
282
- }
283
- }, {
284
- key: "_handlePeerChat",
285
- value: function _handlePeerChat(task) {
286
- var data = task.data;
287
- var message = _struct.AgoraChatMessage.fromData(data);
288
- this._dataStore.addMessage(message);
289
- this.emit(AgoraRteEventType.ChatUserMessage, message);
290
- }
291
274
  }, {
292
275
  key: "_handleChat",
293
276
  value: function _handleChat(task) {
@@ -358,6 +341,7 @@ var AgoraRteChannelMessageHandle = (_dec = _decorator.Log.attach({
358
341
  var users = data.users;
359
342
  var subscribeUsersData = [];
360
343
  var unsubscribeUsersData = [];
344
+ var removedStreamsData = [];
361
345
  users.forEach(function (u) {
362
346
  var user = _struct.AgoraUser.fromData(u);
363
347
  if (u.subscribe === 1) {
@@ -376,8 +360,15 @@ var AgoraRteChannelMessageHandle = (_dec = _decorator.Log.attach({
376
360
  });
377
361
  subscribeUsersData.push(user);
378
362
  } else if (u.subscribe === 0) {
379
- _this3._dataStore.deleteStream(u.streamUuid);
363
+ var _streams = _this3._dataStore.findUserStreams(u.userUuid);
364
+ var streamUuids = _streams.map(function (stream) {
365
+ return stream.streamUuid;
366
+ });
367
+ _this3._dataStore.deleteStreams(streamUuids);
380
368
  _this3._dataStore.deleteUser(u.userUuid);
369
+ if (_streams.length) {
370
+ removedStreamsData = _streams;
371
+ }
381
372
  unsubscribeUsersData.push(user);
382
373
  }
383
374
  });
@@ -385,7 +376,7 @@ var AgoraRteChannelMessageHandle = (_dec = _decorator.Log.attach({
385
376
  this.emit(AgoraRteEventType.UserAdded, subscribeUsersData);
386
377
  }
387
378
  if (unsubscribeUsersData.length > 0) {
388
- this.emit(AgoraRteEventType.UserRemoved, unsubscribeUsersData);
379
+ this.emit(AgoraRteEventType.UserRemoved, unsubscribeUsersData, removedStreamsData);
389
380
  }
390
381
  }
391
382
  }, {
@@ -396,10 +387,18 @@ var AgoraRteChannelMessageHandle = (_dec = _decorator.Log.attach({
396
387
  var offlineUsers = data.offlineUsers,
397
388
  onlineUsers = data.onlineUsers,
398
389
  total = data.total;
390
+ var removedStreamsData = [];
399
391
  var offlineUsersData = offlineUsers.map(function (u) {
400
392
  var user = _struct.AgoraUser.fromData(u);
401
- _this4._dataStore.deleteStream(u.streamUuid);
393
+ var streams = _this4._dataStore.findUserStreams(u.userUuid);
394
+ var streamUuids = streams.map(function (stream) {
395
+ return stream.streamUuid;
396
+ });
397
+ _this4._dataStore.deleteStreams(streamUuids);
402
398
  _this4._dataStore.deleteUser(u.userUuid);
399
+ if (streams.length) {
400
+ removedStreamsData = streams;
401
+ }
403
402
  return user;
404
403
  });
405
404
  var onlineUsersData = onlineUsers.map(function (u) {
@@ -425,7 +424,7 @@ var AgoraRteChannelMessageHandle = (_dec = _decorator.Log.attach({
425
424
  if (offlineUsersData.length > 0) {
426
425
  // type is guaranteed the same value in a batch, so just pick the first one
427
426
  var type = offlineUsers.length ? offlineUsers[0].type : undefined;
428
- this.emit(AgoraRteEventType.UserRemoved, offlineUsersData, type);
427
+ this.emit(AgoraRteEventType.UserRemoved, offlineUsersData, removedStreamsData, type);
429
428
  }
430
429
  if (total !== undefined) {
431
430
  this.emit(AgoraRteEventType.UserCountUpdated, total);
@@ -0,0 +1,6 @@
1
+ import { AgoraRteSequenceVersion } from '../../services/api';
2
+ import { AgoraRteMessagePacket } from './struct';
3
+ export interface SequenceMessageParser {
4
+ parsePacket(message: string): AgoraRteMessagePacket;
5
+ }
6
+ export declare const getMessageParser: (sequenceVersion: AgoraRteSequenceVersion) => SequenceMessageParser;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.object.define-property.js");
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.getMessageParser = exports.SequenceMessageParserV2 = exports.SequenceMessageParserV1 = void 0;
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
+ var _api = require("../../services/api");
12
+ /**
13
+ * @internal
14
+ */
15
+ var SequenceMessageParserV1 = /*#__PURE__*/function () {
16
+ function SequenceMessageParserV1() {
17
+ (0, _classCallCheck2["default"])(this, SequenceMessageParserV1);
18
+ }
19
+ (0, _createClass2["default"])(SequenceMessageParserV1, [{
20
+ key: "parsePacket",
21
+ value: function parsePacket(message) {
22
+ var sequence = JSON.parse(message);
23
+ return {
24
+ total: 1,
25
+ startSequence: sequence.sequence,
26
+ list: [sequence]
27
+ };
28
+ }
29
+ }]);
30
+ return SequenceMessageParserV1;
31
+ }();
32
+ /**
33
+ * @internal
34
+ */
35
+ exports.SequenceMessageParserV1 = SequenceMessageParserV1;
36
+ var SequenceMessageParserV2 = /*#__PURE__*/function () {
37
+ function SequenceMessageParserV2() {
38
+ (0, _classCallCheck2["default"])(this, SequenceMessageParserV2);
39
+ }
40
+ (0, _createClass2["default"])(SequenceMessageParserV2, [{
41
+ key: "parsePacket",
42
+ value: function parsePacket(message) {
43
+ var packet = JSON.parse(message);
44
+ return packet;
45
+ }
46
+ }]);
47
+ return SequenceMessageParserV2;
48
+ }();
49
+ exports.SequenceMessageParserV2 = SequenceMessageParserV2;
50
+ var getMessageParser = function getMessageParser(sequenceVersion) {
51
+ if (sequenceVersion === _api.AgoraRteSequenceVersion.v1) {
52
+ return new SequenceMessageParserV1();
53
+ } else {
54
+ return new SequenceMessageParserV2();
55
+ }
56
+ };
57
+ exports.getMessageParser = getMessageParser;
@@ -40,6 +40,11 @@ export interface AgoraRteMessageBatchDetail {
40
40
  sequence: number;
41
41
  ts: number;
42
42
  }
43
+ export interface AgoraRteMessagePacket {
44
+ total: number;
45
+ startSequence: number;
46
+ list: AgoraRteSequenceMessage[];
47
+ }
43
48
  export interface AgoraRteMessageHandleTask {
44
49
  sequence: AgoraRteSequenceMessage;
45
50
  }
@@ -2,14 +2,12 @@
2
2
  import { EventEmitter } from 'events';
3
3
  import { AgoraRteScene } from '../../../scene';
4
4
  import { Logger } from '../../logger';
5
- import { AGRtmManager } from '../../rtm';
6
5
  import { AgoraRteSyncDataStore } from './data';
7
6
  import { AgoraRteChannelMessageHandle } from './handler';
8
7
  import { AgoraRteMessageHandleTask, AgoraRteSyncSnapshotData } from './struct';
8
+ import { AgoraRteSequenceVersion } from '../../services/api';
9
9
  export declare class AgoraRteSynchronizer {
10
10
  logger: Logger;
11
- userUuid: string;
12
- streamUuid: string;
13
11
  private _scene;
14
12
  private _channelObserver;
15
13
  private _snapshot?;
@@ -17,20 +15,16 @@ export declare class AgoraRteSynchronizer {
17
15
  private _currentTask?;
18
16
  private _lastSeq;
19
17
  private _requestingGap;
20
- private _handleChannelMessage;
21
- private _handlePeerMessage;
22
- handle: AgoraRteChannelMessageHandle;
23
- constructor(dataStore: AgoraRteSyncDataStore, { scene, userUuid, streamUuid, channelObserver, rtm, }: {
18
+ private _seqMessageParser;
19
+ private _handle;
20
+ constructor(dataStore: AgoraRteSyncDataStore, { scene, userUuid, streamUuid, channelObserver, sequenceVersion, }: {
24
21
  scene: AgoraRteScene;
25
22
  userUuid: string;
26
23
  streamUuid: string;
27
24
  channelObserver: EventEmitter;
28
- rtm: AGRtmManager;
25
+ sequenceVersion: AgoraRteSequenceVersion;
29
26
  });
30
- handlePeerMessage({ message, peerId }: {
31
- message: string;
32
- peerId: string;
33
- }): void;
27
+ get handle(): AgoraRteChannelMessageHandle;
34
28
  handleChannelMessage({ message, memberId, }: {
35
29
  message: {
36
30
  text: string;
@@ -44,12 +38,11 @@ export declare class AgoraRteSynchronizer {
44
38
  queueHeadSeq: number;
45
39
  } | null;
46
40
  sortTasks(): void;
47
- addTask(task: AgoraRteMessageHandleTask): void;
41
+ addTasks(tasks: AgoraRteMessageHandleTask[]): void;
48
42
  prependTasks(tasks: AgoraRteMessageHandleTask[]): void;
49
43
  notifyTaskQueueUpdate(): void;
50
44
  runNextTask: () => void;
51
45
  dequeueTask(): AgoraRteMessageHandleTask | null | undefined;
52
46
  processTask(task: AgoraRteMessageHandleTask): Promise<void>;
53
47
  syncSequenceUntilSuccess(lastSeq: number, count: number): Promise<void>;
54
- reset(): void;
55
48
  }
@@ -24,36 +24,37 @@ Object.defineProperty(exports, "__esModule", {
24
24
  value: true
25
25
  });
26
26
  exports.AgoraRteSynchronizer = void 0;
27
- require("core-js/modules/es.function.bind.js");
28
27
  require("core-js/modules/es.array.concat.js");
28
+ require("core-js/modules/es.array.map.js");
29
29
  require("core-js/modules/es.array.sort.js");
30
30
  require("core-js/modules/es.object.to-string.js");
31
31
  require("core-js/modules/es.promise.js");
32
32
  require("core-js/modules/web.timers.js");
33
- require("core-js/modules/es.array.map.js");
34
33
  require("core-js/modules/es.array.slice.js");
34
+ require("core-js/modules/es.object.get-own-property-descriptor.js");
35
35
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
36
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
36
37
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
37
38
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
39
+ var _applyDecoratedDescriptor2 = _interopRequireDefault(require("@babel/runtime/helpers/applyDecoratedDescriptor"));
38
40
  var _decorator = require("../../decorator");
39
41
  var _handler = require("./handler");
40
- var _dec, _class;
42
+ var _messageParser = require("./message-parser");
43
+ var _dec, _class, _class2;
41
44
  function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
42
45
  var AgoraRteSynchronizer = (_dec = _decorator.Log.attach({
43
46
  proxyMethods: false,
44
47
  label: 'channel-message'
45
- }), _dec(_class = /*#__PURE__*/function () {
48
+ }), _dec(_class = (_class2 = /*#__PURE__*/function () {
46
49
  function AgoraRteSynchronizer(dataStore, _ref) {
47
50
  var _this = this;
48
51
  var scene = _ref.scene,
49
52
  userUuid = _ref.userUuid,
50
53
  streamUuid = _ref.streamUuid,
51
54
  channelObserver = _ref.channelObserver,
52
- rtm = _ref.rtm;
55
+ sequenceVersion = _ref.sequenceVersion;
53
56
  (0, _classCallCheck2["default"])(this, AgoraRteSynchronizer);
54
57
  this.logger = void 0;
55
- this.userUuid = void 0;
56
- this.streamUuid = void 0;
57
58
  this._scene = void 0;
58
59
  this._channelObserver = void 0;
59
60
  this._snapshot = void 0;
@@ -61,9 +62,8 @@ var AgoraRteSynchronizer = (_dec = _decorator.Log.attach({
61
62
  this._currentTask = void 0;
62
63
  this._lastSeq = -1;
63
64
  this._requestingGap = false;
64
- this._handleChannelMessage = void 0;
65
- this._handlePeerMessage = void 0;
66
- this.handle = void 0;
65
+ this._seqMessageParser = void 0;
66
+ this._handle = void 0;
67
67
  this.runNextTask = function () {
68
68
  if (_this._currentTask) {
69
69
  _this.logger.info("task Running");
@@ -86,48 +86,37 @@ var AgoraRteSynchronizer = (_dec = _decorator.Log.attach({
86
86
  }
87
87
  };
88
88
  this._scene = scene;
89
- this.streamUuid = streamUuid;
90
- this.userUuid = userUuid;
91
- this._handleChannelMessage = this.handleChannelMessage.bind(this);
92
- this._handlePeerMessage = this.handlePeerMessage.bind(this);
93
89
  this._channelObserver = channelObserver;
94
- this._channelObserver.on('ChannelMessage', this._handleChannelMessage);
95
- rtm.on('MessageFromPeer', this._handlePeerMessage);
96
- this.handle = new _handler.AgoraRteChannelMessageHandle(dataStore, {
90
+ this._seqMessageParser = (0, _messageParser.getMessageParser)(sequenceVersion);
91
+ this._channelObserver.on('ChannelMessage', this.handleChannelMessage);
92
+ this._handle = new _handler.AgoraRteChannelMessageHandle(dataStore, {
97
93
  sceneId: scene.sceneId,
98
94
  userUuid: userUuid,
99
95
  streamUuid: streamUuid
100
96
  });
101
97
  }
102
98
  (0, _createClass2["default"])(AgoraRteSynchronizer, [{
103
- key: "handlePeerMessage",
104
- value: function handlePeerMessage(_ref2) {
105
- var message = _ref2.message,
106
- peerId = _ref2.peerId;
107
- // only process channel message from server
108
- this.logger.info("peer message from [".concat(this._scene.sceneId, "]: ").concat(message, ", peerId: ").concat(peerId));
109
- if (peerId === 'server') {
110
- try {
111
- var task = JSON.parse(message);
112
- this.handle.handlePeerMessage(task);
113
- } catch (e) {
114
- this.logger.error("".concat(e.message, " original: ").concat(message));
115
- }
116
- }
99
+ key: "handle",
100
+ get: function get() {
101
+ return this._handle;
117
102
  }
118
103
  }, {
119
104
  key: "handleChannelMessage",
120
- value: function handleChannelMessage(_ref3) {
121
- var message = _ref3.message,
122
- memberId = _ref3.memberId;
105
+ value: function handleChannelMessage(_ref2) {
106
+ var message = _ref2.message,
107
+ memberId = _ref2.memberId;
123
108
  this.logger.info("channel message from [".concat(this._scene.sceneId, "]: ").concat(message.text, ", memberId: ").concat(memberId));
124
109
  // only process channel message from server
125
110
  if (memberId === 'server') {
126
111
  try {
127
- var sequence = JSON.parse(message.text);
128
- this.addTask({
129
- sequence: sequence
112
+ var packet = this._seqMessageParser.parsePacket(message.text);
113
+ this.logger.info("add ".concat(packet.total, " tasks to task queue, start: ").concat(packet.startSequence, ", total: ").concat(packet.total));
114
+ var tasks = packet.list.map(function (sequence) {
115
+ return {
116
+ sequence: sequence
117
+ };
130
118
  });
119
+ this.addTasks(tasks);
131
120
  } catch (e) {
132
121
  this.logger.error("".concat(e.message, " original: ").concat(message.text));
133
122
  }
@@ -137,7 +126,7 @@ var AgoraRteSynchronizer = (_dec = _decorator.Log.attach({
137
126
  key: "syncSnapshot",
138
127
  value: function syncSnapshot(snapshot) {
139
128
  this._snapshot = snapshot;
140
- this.handle.handleSnapshot(snapshot);
129
+ this._handle.handleSnapshot(snapshot);
141
130
  this._lastSeq = snapshot.sequence;
142
131
  this.notifyTaskQueueUpdate();
143
132
  }
@@ -167,9 +156,10 @@ var AgoraRteSynchronizer = (_dec = _decorator.Log.attach({
167
156
  });
168
157
  }
169
158
  }, {
170
- key: "addTask",
171
- value: function addTask(task) {
172
- this._queueTasks.push(task);
159
+ key: "addTasks",
160
+ value: function addTasks(tasks) {
161
+ var _this$_queueTasks;
162
+ (_this$_queueTasks = this._queueTasks).push.apply(_this$_queueTasks, (0, _toConsumableArray2["default"])(tasks));
173
163
  this.sortTasks();
174
164
  this.notifyTaskQueueUpdate();
175
165
  }
@@ -229,7 +219,7 @@ var AgoraRteSynchronizer = (_dec = _decorator.Log.attach({
229
219
  return _context.abrupt("return");
230
220
  case 5:
231
221
  this.logger.info("process sequence ".concat(task.sequence.sequence, ", snapshot ").concat(this._snapshot.sequence, ", last ").concat(this._lastSeq));
232
- this.handle.handleMessage(task);
222
+ this._handle.handleMessage(task);
233
223
  this._lastSeq = task.sequence.sequence;
234
224
 
235
225
  // prevent main thread jam/stack overflow
@@ -316,12 +306,7 @@ var AgoraRteSynchronizer = (_dec = _decorator.Log.attach({
316
306
  }
317
307
  return syncSequenceUntilSuccess;
318
308
  }()
319
- }, {
320
- key: "reset",
321
- value: function reset() {
322
- this._channelObserver.off('ChannelMessage', this._handleChannelMessage);
323
- }
324
309
  }]);
325
310
  return AgoraRteSynchronizer;
326
- }()) || _class);
311
+ }(), ((0, _applyDecoratedDescriptor2["default"])(_class2.prototype, "handleChannelMessage", [_decorator.bound], Object.getOwnPropertyDescriptor(_class2.prototype, "handleChannelMessage"), _class2.prototype)), _class2)) || _class);
327
312
  exports.AgoraRteSynchronizer = AgoraRteSynchronizer;
@@ -0,0 +1,16 @@
1
+ import { AGEventEmitter } from '../../utils/events';
2
+ import { AgoraRteSyncDataStore } from '../channel-msg/data';
3
+ import { AgoraRteEventType } from '../channel-msg/handler';
4
+ import { AgoraRtePeerMessageHandleTask } from '../channel-msg/struct';
5
+ export interface AgoraRtePeerMessageHandle {
6
+ on(evt: AgoraRteEventType, ...args: any[]): this;
7
+ off(evt: AgoraRteEventType, ...args: any[]): this;
8
+ }
9
+ export declare class AgoraRtePeerMessageHandle extends AGEventEmitter {
10
+ private _dataStore;
11
+ constructor({ dataStore }: {
12
+ dataStore: AgoraRteSyncDataStore;
13
+ });
14
+ handlePeerMessage(task: AgoraRtePeerMessageHandleTask): void;
15
+ private _handlePeerChat;
16
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.reflect.construct.js");
4
+ require("core-js/modules/es.object.define-property.js");
5
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.AgoraRtePeerMessageHandle = void 0;
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
14
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
15
+ var _log = require("../../decorator/log");
16
+ var _events = require("../../utils/events");
17
+ var _handler = require("../channel-msg/handler");
18
+ var _struct = require("../channel-msg/struct");
19
+ var _dec, _class;
20
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
21
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
22
+ var AgoraRtePeerMessageHandle = (_dec = _log.Log.attach({
23
+ proxyMethods: false,
24
+ label: 'peer-message'
25
+ }), _dec(_class = /*#__PURE__*/function (_AGEventEmitter) {
26
+ (0, _inherits2["default"])(AgoraRtePeerMessageHandle, _AGEventEmitter);
27
+ var _super = _createSuper(AgoraRtePeerMessageHandle);
28
+ function AgoraRtePeerMessageHandle(_ref) {
29
+ var _this;
30
+ var dataStore = _ref.dataStore;
31
+ (0, _classCallCheck2["default"])(this, AgoraRtePeerMessageHandle);
32
+ _this = _super.call(this);
33
+ _this._dataStore = void 0;
34
+ _this._dataStore = dataStore;
35
+ return _this;
36
+ }
37
+ (0, _createClass2["default"])(AgoraRtePeerMessageHandle, [{
38
+ key: "handlePeerMessage",
39
+ value: function handlePeerMessage(task) {
40
+ switch (task.cmd) {
41
+ case _handler.AgoraRtePeerMessageCmd.PeerChat:
42
+ this._handlePeerChat(task);
43
+ break;
44
+ }
45
+ }
46
+ }, {
47
+ key: "_handlePeerChat",
48
+ value: function _handlePeerChat(task) {
49
+ var data = task.data;
50
+ var message = _struct.AgoraChatMessage.fromData(data);
51
+ this._dataStore.addMessage(message);
52
+ this.emit(_handler.AgoraRteEventType.ChatUserMessage, message);
53
+ }
54
+ }]);
55
+ return AgoraRtePeerMessageHandle;
56
+ }(_events.AGEventEmitter)) || _class);
57
+ exports.AgoraRtePeerMessageHandle = AgoraRtePeerMessageHandle;
@@ -0,0 +1,4 @@
1
+ export interface AgoraRtePeerMessageHandleTask {
2
+ cmd: number;
3
+ data: any;
4
+ }