@antglobal/rlog-sdk 0.0.1755855517-dev.8 → 1.0.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.
Files changed (127) hide show
  1. package/README.md +192 -432
  2. package/dist/esm/index.d.ts +14 -41
  3. package/dist/esm/index.d.ts.map +1 -1
  4. package/dist/esm/index.js +92 -76
  5. package/dist/esm/lib/api.d.ts +10 -0
  6. package/dist/esm/lib/api.d.ts.map +1 -1
  7. package/dist/esm/lib/api.js +58 -35
  8. package/dist/esm/lib/config.d.ts +14 -16
  9. package/dist/esm/lib/config.d.ts.map +1 -1
  10. package/dist/esm/lib/config.js +61 -33
  11. package/dist/esm/lib/constants.d.ts +89 -0
  12. package/dist/esm/lib/constants.d.ts.map +1 -0
  13. package/dist/esm/lib/constants.js +145 -0
  14. package/dist/esm/lib/drive/indexeddb-adapt.d.ts +12 -0
  15. package/dist/esm/lib/drive/indexeddb-adapt.d.ts.map +1 -1
  16. package/dist/esm/lib/drive/indexeddb-adapt.js +190 -20
  17. package/dist/esm/lib/drive/localstorage-adapt.d.ts +12 -0
  18. package/dist/esm/lib/drive/localstorage-adapt.d.ts.map +1 -1
  19. package/dist/esm/lib/drive/localstorage-adapt.js +179 -36
  20. package/dist/esm/lib/drive/memory-adapt.d.ts +10 -2
  21. package/dist/esm/lib/drive/memory-adapt.d.ts.map +1 -1
  22. package/dist/esm/lib/drive/memory-adapt.js +118 -26
  23. package/dist/esm/lib/drive/safe-storage.d.ts +24 -0
  24. package/dist/esm/lib/drive/safe-storage.d.ts.map +1 -0
  25. package/dist/esm/lib/drive/safe-storage.js +96 -0
  26. package/dist/esm/lib/drive/storage-interface.d.ts +20 -0
  27. package/dist/esm/lib/drive/storage-interface.d.ts.map +1 -1
  28. package/dist/esm/lib/error-trigger.d.ts +73 -0
  29. package/dist/esm/lib/error-trigger.d.ts.map +1 -0
  30. package/dist/esm/lib/error-trigger.js +162 -0
  31. package/dist/esm/lib/error.d.ts +9 -0
  32. package/dist/esm/lib/error.d.ts.map +1 -1
  33. package/dist/esm/lib/error.js +70 -118
  34. package/dist/esm/lib/init.d.ts +0 -4
  35. package/dist/esm/lib/init.d.ts.map +1 -1
  36. package/dist/esm/lib/init.js +148 -47
  37. package/dist/esm/lib/logger.d.ts +27 -0
  38. package/dist/esm/lib/logger.d.ts.map +1 -0
  39. package/dist/esm/lib/logger.js +79 -0
  40. package/dist/esm/lib/net.d.ts +11 -0
  41. package/dist/esm/lib/net.d.ts.map +1 -1
  42. package/dist/esm/lib/net.js +264 -116
  43. package/dist/esm/lib/request.d.ts.map +1 -1
  44. package/dist/esm/lib/request.js +2 -2
  45. package/dist/esm/lib/router-monitor.d.ts.map +1 -1
  46. package/dist/esm/lib/router-monitor.js +135 -49
  47. package/dist/esm/lib/rrweb.d.ts.map +1 -1
  48. package/dist/esm/lib/rrweb.js +31 -24
  49. package/dist/esm/lib/storage-manager.d.ts +12 -0
  50. package/dist/esm/lib/storage-manager.d.ts.map +1 -1
  51. package/dist/esm/lib/storage-manager.js +129 -46
  52. package/dist/esm/lib/upload-worker-manager.d.ts +47 -0
  53. package/dist/esm/lib/upload-worker-manager.d.ts.map +1 -0
  54. package/dist/esm/lib/upload-worker-manager.js +559 -0
  55. package/dist/esm/lib/upload-worker.d.ts +58 -0
  56. package/dist/esm/lib/upload-worker.d.ts.map +1 -0
  57. package/dist/esm/lib/upload-worker.js +28 -0
  58. package/dist/esm/lib/uploader.d.ts +43 -0
  59. package/dist/esm/lib/uploader.d.ts.map +1 -1
  60. package/dist/esm/lib/uploader.js +464 -102
  61. package/dist/esm/lib/utils.d.ts +75 -0
  62. package/dist/esm/lib/utils.d.ts.map +1 -1
  63. package/dist/esm/lib/utils.js +268 -5
  64. package/dist/lib/index.d.ts +14 -41
  65. package/dist/lib/index.d.ts.map +1 -1
  66. package/dist/lib/index.js +81 -63
  67. package/dist/lib/lib/api.d.ts +10 -0
  68. package/dist/lib/lib/api.d.ts.map +1 -1
  69. package/dist/lib/lib/api.js +59 -35
  70. package/dist/lib/lib/config.d.ts +14 -16
  71. package/dist/lib/lib/config.d.ts.map +1 -1
  72. package/dist/lib/lib/config.js +63 -33
  73. package/dist/lib/lib/constants.d.ts +89 -0
  74. package/dist/lib/lib/constants.d.ts.map +1 -0
  75. package/dist/lib/lib/constants.js +151 -0
  76. package/dist/lib/lib/drive/indexeddb-adapt.d.ts +12 -0
  77. package/dist/lib/lib/drive/indexeddb-adapt.d.ts.map +1 -1
  78. package/dist/lib/lib/drive/indexeddb-adapt.js +191 -19
  79. package/dist/lib/lib/drive/localstorage-adapt.d.ts +12 -0
  80. package/dist/lib/lib/drive/localstorage-adapt.d.ts.map +1 -1
  81. package/dist/lib/lib/drive/localstorage-adapt.js +179 -36
  82. package/dist/lib/lib/drive/memory-adapt.d.ts +10 -2
  83. package/dist/lib/lib/drive/memory-adapt.d.ts.map +1 -1
  84. package/dist/lib/lib/drive/memory-adapt.js +117 -26
  85. package/dist/lib/lib/drive/safe-storage.d.ts +24 -0
  86. package/dist/lib/lib/drive/safe-storage.d.ts.map +1 -0
  87. package/dist/lib/lib/drive/safe-storage.js +102 -0
  88. package/dist/lib/lib/drive/storage-interface.d.ts +20 -0
  89. package/dist/lib/lib/drive/storage-interface.d.ts.map +1 -1
  90. package/dist/lib/lib/error-trigger.d.ts +73 -0
  91. package/dist/lib/lib/error-trigger.d.ts.map +1 -0
  92. package/dist/lib/lib/error-trigger.js +167 -0
  93. package/dist/lib/lib/error.d.ts +9 -0
  94. package/dist/lib/lib/error.d.ts.map +1 -1
  95. package/dist/lib/lib/error.js +73 -118
  96. package/dist/lib/lib/init.d.ts +0 -4
  97. package/dist/lib/lib/init.d.ts.map +1 -1
  98. package/dist/lib/lib/init.js +144 -43
  99. package/dist/lib/lib/logger.d.ts +27 -0
  100. package/dist/lib/lib/logger.d.ts.map +1 -0
  101. package/dist/lib/lib/logger.js +84 -0
  102. package/dist/lib/lib/net.d.ts +11 -0
  103. package/dist/lib/lib/net.d.ts.map +1 -1
  104. package/dist/lib/lib/net.js +268 -117
  105. package/dist/lib/lib/request.d.ts.map +1 -1
  106. package/dist/lib/lib/request.js +3 -3
  107. package/dist/lib/lib/router-monitor.d.ts.map +1 -1
  108. package/dist/lib/lib/router-monitor.js +136 -49
  109. package/dist/lib/lib/rrweb.d.ts.map +1 -1
  110. package/dist/lib/lib/rrweb.js +31 -23
  111. package/dist/lib/lib/storage-manager.d.ts +12 -0
  112. package/dist/lib/lib/storage-manager.d.ts.map +1 -1
  113. package/dist/lib/lib/storage-manager.js +130 -46
  114. package/dist/lib/lib/upload-worker-manager.d.ts +47 -0
  115. package/dist/lib/lib/upload-worker-manager.d.ts.map +1 -0
  116. package/dist/lib/lib/upload-worker-manager.js +570 -0
  117. package/dist/lib/lib/upload-worker.d.ts +58 -0
  118. package/dist/lib/lib/upload-worker.d.ts.map +1 -0
  119. package/dist/lib/lib/upload-worker.js +33 -0
  120. package/dist/lib/lib/uploader.d.ts +43 -0
  121. package/dist/lib/lib/uploader.d.ts.map +1 -1
  122. package/dist/lib/lib/uploader.js +468 -101
  123. package/dist/lib/lib/utils.d.ts +75 -0
  124. package/dist/lib/lib/utils.d.ts.map +1 -1
  125. package/dist/lib/lib/utils.js +276 -6
  126. package/dist/rlog-sdk.min.js +1 -1
  127. package/package.json +3 -2
@@ -5,18 +5,42 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.cancelUploadLoop = cancelUploadLoop;
8
+ exports.flushOrphanSessions = flushOrphanSessions;
8
9
  exports.forceResetUploadState = forceResetUploadState;
9
10
  exports.resetUploadLoop = resetUploadLoop;
11
+ exports.setCancelCallback = setCancelCallback;
12
+ exports.setErrorModeUploading = setErrorModeUploading;
13
+ exports.setErrorModeWindowStart = setErrorModeWindowStart;
10
14
  exports.startUploadLoop = startUploadLoop;
11
15
  var _api = require("./api");
12
16
  var _storageManager = require("./storage-manager");
13
17
  var _utils = require("./utils");
14
18
  var _config = require("./config");
15
19
  var _rrweb = require("rrweb");
16
- var _init = require("./init");
20
+ var _uploadWorkerManager = require("./upload-worker-manager");
21
+ var _logger = _interopRequireDefault(require("./logger"));
22
+ var _constants = require("./constants");
23
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
25
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
26
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
17
27
  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 e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
18
28
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
19
29
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
30
+ // ==================== 取消回调 ====================
31
+
32
+ // 由 init.ts 注入的取消回调,解除循环依赖
33
+ var onCancelCallback = null;
34
+
35
+ /**
36
+ * 设置 SDK 取消回调(由 init.ts 在启动上传循环前注入)
37
+ */
38
+ function setCancelCallback(callback) {
39
+ onCancelCallback = callback;
40
+ }
41
+
42
+ // ==================== 主线程降级模式状态 ====================
43
+
20
44
  // 全局取消标志
21
45
  var isUploadCancelled = false;
22
46
 
@@ -26,51 +50,252 @@ var uploadFailureCount = new Map();
26
50
  // 上传锁,防止并发上传
27
51
  var isUploading = false;
28
52
 
53
+ // 错误模式状态:是否处于上传状态(由 ErrorTrigger 控制)
54
+ var errorModeUploading = false;
55
+
56
+ // 上传时间窗口起点(错误模式专用,用于记录历史事件起点)
57
+ var errorModeWindowStart = 0;
58
+
29
59
  /**
30
- * 启动数据上传循环
60
+ * 设置错误模式上传状态
61
+ * 由 ErrorTrigger 调用:错误触发时设置为 true,cooldown 结束时设置为 false
62
+ * 自动分发到 Worker 模式或主线程模式
63
+ */
64
+ function setErrorModeUploading(uploading) {
65
+ if ((0, _uploadWorkerManager.isUsingWorkerMode)()) {
66
+ (0, _uploadWorkerManager.setWorkerErrorModeUploading)(uploading);
67
+ } else {
68
+ errorModeUploading = uploading;
69
+ }
70
+ }
71
+
72
+ /**
73
+ * 设置错误模式上传时间窗口起点
74
+ * 由 ErrorTrigger 调用,记录错误触发前的时间窗口起点
75
+ * 自动分发到 Worker 模式或主线程模式
76
+ */
77
+ function setErrorModeWindowStart(startTime) {
78
+ if ((0, _uploadWorkerManager.isUsingWorkerMode)()) {
79
+ (0, _uploadWorkerManager.setWorkerErrorModeWindowStart)(startTime);
80
+ } else {
81
+ errorModeWindowStart = startTime;
82
+ }
83
+ }
84
+
85
+ // ==================== 主线程降级模式上传逻辑 ====================
86
+
87
+ /**
88
+ * 统一的上传函数(主线程降级模式)
31
89
  * @param serv 服务器地址
32
90
  * @param appId 应用ID
91
+ * @param events 要上传的事件数组
92
+ * @returns 上传结果:success 表示是否成功,error 包含错误信息(失败时)
33
93
  */
34
- function startUploadLoop(serv, appId) {
94
+ function uploadEvents(_x, _x2, _x3) {
95
+ return _uploadEvents.apply(this, arguments);
96
+ }
97
+ /**
98
+ * 处理上传失败(主线程降级模式)
99
+ * @param events 失败的事件
100
+ * @param error 错误信息
101
+ * @param appId 应用ID
102
+ * @param serv 服务器地址
103
+ * @param maxRetryCount 最大重试次数
104
+ * @param currentCount 当前失败次数
105
+ * @returns 是否应该停止上传循环
106
+ */
107
+ function _uploadEvents() {
108
+ _uploadEvents = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(serv, appId, events) {
109
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
110
+ while (1) switch (_context2.prev = _context2.next) {
111
+ case 0:
112
+ if (!(!events || events.length === 0)) {
113
+ _context2.next = 2;
114
+ break;
115
+ }
116
+ return _context2.abrupt("return", {
117
+ success: true
118
+ });
119
+ case 2:
120
+ _context2.prev = 2;
121
+ _context2.next = 5;
122
+ return (0, _api.upload)({
123
+ appId: appId,
124
+ data: events,
125
+ deviceId: (0, _utils.getDeviceId)(),
126
+ url: serv
127
+ });
128
+ case 5:
129
+ return _context2.abrupt("return", {
130
+ success: true
131
+ });
132
+ case 8:
133
+ _context2.prev = 8;
134
+ _context2.t0 = _context2["catch"](2);
135
+ _logger.default.warn('Upload failed:', _context2.t0);
136
+ return _context2.abrupt("return", {
137
+ success: false,
138
+ error: _context2.t0
139
+ });
140
+ case 12:
141
+ case "end":
142
+ return _context2.stop();
143
+ }
144
+ }, _callee2, null, [[2, 8]]);
145
+ }));
146
+ return _uploadEvents.apply(this, arguments);
147
+ }
148
+ function handleUploadFailure(_x4, _x5, _x6, _x7, _x8, _x9) {
149
+ return _handleUploadFailure.apply(this, arguments);
150
+ }
151
+ /**
152
+ * 主线程降级模式的上传循环
153
+ */
154
+ function _handleUploadFailure() {
155
+ _handleUploadFailure = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(events, error, appId, serv, maxRetryCount, currentCount) {
156
+ var newCount, batchKey, event;
157
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
158
+ while (1) switch (_context3.prev = _context3.next) {
159
+ case 0:
160
+ newCount = currentCount + 1;
161
+ batchKey = "".concat(appId, "_").concat((0, _utils.getStorageKey)());
162
+ uploadFailureCount.set(batchKey, newCount);
163
+
164
+ // 检查是否达到最大重试次数
165
+ if (!(newCount >= maxRetryCount)) {
166
+ _context3.next = 16;
167
+ break;
168
+ }
169
+ _logger.default.warn("Upload failed ".concat(maxRetryCount, " times consecutively, stopping upload"));
170
+
171
+ // 将事件放回存储
172
+ _context3.next = 7;
173
+ return _storageManager.storage.unshiftBatch((0, _utils.getStorageKey)(), events);
174
+ case 7:
175
+ // 创建并派发自定义事件
176
+ event = new CustomEvent(_constants.EVENT_UPLOAD_FAILURE, {
177
+ detail: {
178
+ error: error,
179
+ retryCount: maxRetryCount,
180
+ appId: appId,
181
+ deviceId: (0, _utils.getDeviceId)()
182
+ }
183
+ });
184
+ if (typeof window !== 'undefined') {
185
+ window.dispatchEvent(event);
186
+ }
187
+
188
+ // 使用 addCustomEvent 记录上传失败事件
189
+ try {
190
+ _rrweb.record.addCustomEvent(_constants.EVENT_UPLOAD_FAILURE, {
191
+ error: error,
192
+ retryCount: maxRetryCount,
193
+ appId: appId,
194
+ deviceId: (0, _utils.getDeviceId)(),
195
+ timestamp: Date.now()
196
+ });
197
+ } catch (e) {
198
+ _logger.default.warn('Failed to record upload failure event via addCustomEvent:', e);
199
+ }
200
+
201
+ // 重置计数器
202
+ uploadFailureCount.delete(batchKey);
203
+
204
+ // 停止 rrweb 录制(通过回调避免循环依赖)
205
+ if (onCancelCallback) {
206
+ setTimeout(function () {
207
+ try {
208
+ var _onCancelCallback;
209
+ (_onCancelCallback = onCancelCallback) === null || _onCancelCallback === void 0 || _onCancelCallback();
210
+ } catch (error) {
211
+ _logger.default.error('Error in cancel callback:', error);
212
+ }
213
+ }, 0);
214
+ }
215
+ _logger.default.error('Upload and recording stopped due to repeated failures');
216
+ return _context3.abrupt("return", true);
217
+ case 16:
218
+ _logger.default.warn("Upload failed ".concat(newCount, " time(s), will retry in next cycle"));
219
+ // 将事件放回存储头部,保持时间戳顺序
220
+ _context3.next = 19;
221
+ return _storageManager.storage.unshiftBatch((0, _utils.getStorageKey)(), events);
222
+ case 19:
223
+ return _context3.abrupt("return", false);
224
+ case 20:
225
+ case "end":
226
+ return _context3.stop();
227
+ }
228
+ }, _callee3);
229
+ }));
230
+ return _handleUploadFailure.apply(this, arguments);
231
+ }
232
+ function startMainThreadUploadLoop(serv, appId) {
35
233
  var push = /*#__PURE__*/function () {
36
234
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
37
- var currentConfig, events, config, consumeOnly, batchKey, maxRetryCount, _batchKey, currentCount, newCount, event;
235
+ var currentConfig, isErrorMode, events, windowStart, config, consumeOnly, result, batchKey, lastEvent, maxRetryCount, _batchKey, currentCount, shouldStop;
38
236
  return _regeneratorRuntime().wrap(function _callee$(_context) {
39
237
  while (1) switch (_context.prev = _context.next) {
40
238
  case 0:
41
239
  if (!isUploadCancelled) {
42
- _context.next = 3;
240
+ _context.next = 2;
43
241
  break;
44
242
  }
45
- console.log('RLog upload has been cancelled');
46
243
  return _context.abrupt("return");
47
- case 3:
244
+ case 2:
48
245
  if (!isUploading) {
49
- _context.next = 6;
246
+ _context.next = 5;
50
247
  break;
51
248
  }
52
249
  setTimeout(function () {
53
250
  push();
54
- }, 100); // 延迟重试
251
+ }, _constants.UPLOAD_RETRY_DELAY); // 延迟重试
55
252
  return _context.abrupt("return");
56
- case 6:
253
+ case 5:
57
254
  // 检查采集总开关
58
255
  currentConfig = (0, _config.getConfig)();
59
256
  if (currentConfig.enable) {
60
- _context.next = 10;
257
+ _context.next = 8;
61
258
  break;
62
259
  }
63
- console.log('RLog is disabled by config, stopping upload');
64
260
  return _context.abrupt("return");
65
- case 10:
66
- _context.prev = 10;
261
+ case 8:
262
+ isErrorMode = currentConfig.captureMode === 'error'; // 错误模式下,如果未处于 uploading 状态,跳过上传但继续轮询
263
+ if (!(isErrorMode && !errorModeUploading)) {
264
+ _context.next = 12;
265
+ break;
266
+ }
267
+ setTimeout(function () {
268
+ push();
269
+ }, currentConfig.uploadInterval);
270
+ return _context.abrupt("return");
271
+ case 12:
272
+ _context.prev = 12;
67
273
  isUploading = true;
68
- _context.next = 14;
69
- return _storageManager.storage.pull((0, _utils.getDeviceId)(), 100);
70
- case 14:
274
+ windowStart = 0;
275
+ if (!isErrorMode) {
276
+ _context.next = 23;
277
+ break;
278
+ }
279
+ // 错误模式:按时间范围提取事件
280
+ // 如果 errorModeWindowStart > 0,使用该值;否则从当前时间开始提取新事件
281
+ windowStart = errorModeWindowStart > 0 ? errorModeWindowStart : Date.now();
282
+ _context.next = 19;
283
+ return _storageManager.storage.pullByTimeRange((0, _utils.getStorageKey)(), windowStart, Date.now());
284
+ case 19:
285
+ events = _context.sent;
286
+ // 重置窗口起点为 0,下次上传时会从当前时间开始
287
+ // 但如果本次有事件上传成功,会更新为最后事件的时间戳
288
+ errorModeWindowStart = 0;
289
+ _context.next = 26;
290
+ break;
291
+ case 23:
292
+ _context.next = 25;
293
+ return _storageManager.storage.pull((0, _utils.getStorageKey)(), _constants.PULL_BATCH_SIZE);
294
+ case 25:
71
295
  events = _context.sent;
296
+ case 26:
72
297
  if (!(!events || events.length === 0)) {
73
- _context.next = 19;
298
+ _context.next = 30;
74
299
  break;
75
300
  }
76
301
  isUploading = false;
@@ -78,114 +303,88 @@ function startUploadLoop(serv, appId) {
78
303
  push();
79
304
  }, currentConfig.uploadInterval);
80
305
  return _context.abrupt("return");
81
- case 19:
306
+ case 30:
82
307
  // 检查是否只消费不上报
83
- config = (0, _config.getConfig)(); // 支持通过配置或sessionStorage控制消费模式
84
- consumeOnly = sessionStorage.getItem('RLOG_CONSUME_ONLY') === 'true' || config.consumeOnly;
308
+ config = (0, _config.getConfig)();
309
+ consumeOnly = sessionStorage.getItem(_constants.STORAGE_KEY_CONSUME_ONLY) === _constants.STORAGE_VALUE_CONSUME_ONLY || config.consumeOnly;
85
310
  if (!consumeOnly) {
86
- _context.next = 26;
311
+ _context.next = 36;
87
312
  break;
88
313
  }
89
- console.log('RLog consume only mode, skip upload');
90
314
  isUploading = false;
91
- _context.next = 59;
92
- break;
93
- case 26:
94
- _context.prev = 26;
95
- _context.next = 29;
96
- return (0, _api.upload)({
97
- appId: appId,
98
- data: events,
99
- deviceId: (0, _utils.getDeviceId)(),
100
- url: serv
101
- });
102
- case 29:
315
+ setTimeout(function () {
316
+ push();
317
+ }, currentConfig.uploadInterval);
318
+ return _context.abrupt("return");
319
+ case 36:
320
+ _context.next = 38;
321
+ return uploadEvents(serv, appId, events);
322
+ case 38:
323
+ result = _context.sent;
324
+ if (!result.success) {
325
+ _context.next = 50;
326
+ break;
327
+ }
103
328
  // 上传成功,重置失败计数
104
- batchKey = "".concat(appId, "_").concat((0, _utils.getDeviceId)());
329
+ batchKey = "".concat(appId, "_").concat((0, _utils.getStorageKey)());
105
330
  uploadFailureCount.delete(batchKey);
331
+
332
+ // 错误模式:上传成功后移除已上传的事件
333
+ if (!(isErrorMode && windowStart > 0 && events.length > 0)) {
334
+ _context.next = 47;
335
+ break;
336
+ }
337
+ _context.next = 45;
338
+ return _storageManager.storage.removeByTimeRange((0, _utils.getStorageKey)(), windowStart);
339
+ case 45:
340
+ // 更新窗口起点为最后一个事件的时间戳,避免下次重复提取
341
+ lastEvent = events[events.length - 1];
342
+ if (lastEvent && lastEvent.timestamp) {
343
+ errorModeWindowStart = lastEvent.timestamp;
344
+ }
345
+ case 47:
346
+ // 全量模式:pull 已经自动移除了
347
+
106
348
  isUploading = false;
107
349
  _context.next = 59;
108
350
  break;
109
- case 34:
110
- _context.prev = 34;
111
- _context.t0 = _context["catch"](26);
112
- console.warn('Upload failed:', _context.t0);
351
+ case 50:
113
352
  isUploading = false;
114
353
 
115
354
  // 获取最大重试次数,默认3次
116
355
  maxRetryCount = config.maxRetryCount || 3; // 记录失败次数
117
- _batchKey = "".concat(appId, "_").concat((0, _utils.getDeviceId)());
118
- currentCount = uploadFailureCount.get(_batchKey) || 0;
119
- newCount = currentCount + 1;
120
- uploadFailureCount.set(_batchKey, newCount);
121
-
122
- // 检查是否达到最大重试次数
123
- if (!(newCount >= maxRetryCount)) {
124
- _context.next = 56;
356
+ _batchKey = "".concat(appId, "_").concat((0, _utils.getStorageKey)());
357
+ currentCount = uploadFailureCount.get(_batchKey) || 0; // 处理上传失败
358
+ _context.next = 56;
359
+ return handleUploadFailure(events, result.error, appId, serv, maxRetryCount, currentCount);
360
+ case 56:
361
+ shouldStop = _context.sent;
362
+ if (!shouldStop) {
363
+ _context.next = 59;
125
364
  break;
126
365
  }
127
- console.warn("Upload failed ".concat(maxRetryCount, " times consecutively, stopping upload"));
128
- // 将事件放回存储
129
- _context.next = 47;
130
- return _storageManager.storage.unshiftBatch((0, _utils.getDeviceId)(), events);
131
- case 47:
132
- // 创建并派发自定义事件
133
- event = new CustomEvent('rlog-upload-failure', {
134
- detail: {
135
- error: _context.t0,
136
- retryCount: maxRetryCount,
137
- appId: appId,
138
- deviceId: (0, _utils.getDeviceId)()
139
- }
140
- });
141
- if (typeof window !== 'undefined') {
142
- window.dispatchEvent(event);
143
- }
144
-
145
- // 使用addCustomEvent记录上传失败事件
146
- try {
147
- _rrweb.record.addCustomEvent('rlog-upload-failure', {
148
- error: _context.t0,
149
- retryCount: maxRetryCount,
150
- appId: appId,
151
- deviceId: (0, _utils.getDeviceId)(),
152
- timestamp: Date.now()
153
- });
154
- } catch (e) {
155
- console.warn('Failed to record upload failure event via addCustomEvent:', e);
156
- }
157
-
158
- // 重置计数器
159
- uploadFailureCount.delete(_batchKey);
160
-
161
- // 停止rrweb录制
162
- setTimeout(function () {
163
- (0, _init.cancelRlog)();
164
- }, 0);
165
- console.error('RLog upload and recording stopped due to repeated failures');
166
366
  return _context.abrupt("return");
167
- case 56:
168
- console.warn("Upload failed ".concat(newCount, " time(s), will retry in next cycle"));
169
- // 将事件放回存储头部,保持时间戳顺序
170
- _context.next = 59;
171
- return _storageManager.storage.unshiftBatch((0, _utils.getDeviceId)(), events);
172
367
  case 59:
173
368
  _context.next = 65;
174
369
  break;
175
370
  case 61:
176
371
  _context.prev = 61;
177
- _context.t1 = _context["catch"](10);
372
+ _context.t0 = _context["catch"](12);
178
373
  isUploading = false;
179
- console.error('Error in upload loop:', _context.t1);
374
+ _logger.default.error('Error in upload loop:', _context.t0);
180
375
  case 65:
181
- setTimeout(function () {
182
- push();
183
- }, currentConfig.uploadInterval);
376
+ try {
377
+ setTimeout(function () {
378
+ push();
379
+ }, currentConfig.uploadInterval);
380
+ } catch (error) {
381
+ _logger.default.error('Failed to schedule next upload:', error);
382
+ }
184
383
  case 66:
185
384
  case "end":
186
385
  return _context.stop();
187
386
  }
188
- }, _callee, null, [[10, 61], [26, 34]]);
387
+ }, _callee, null, [[12, 61]]);
189
388
  }));
190
389
  return function push() {
191
390
  return _ref.apply(this, arguments);
@@ -194,27 +393,195 @@ function startUploadLoop(serv, appId) {
194
393
  push();
195
394
  }
196
395
 
396
+ // ==================== 对外 API ====================
397
+
398
+ /**
399
+ * 启动数据上传循环
400
+ * 优先尝试 Worker 模式,失败则降级到主线程模式
401
+ *
402
+ * 全量模式:持续轮询上传
403
+ * 错误模式:idle 时跳过上传,uploading 时轮询上传(由 ErrorTrigger 控制状态)
404
+ * @param serv 服务器地址
405
+ * @param appId 应用ID
406
+ */
407
+ function startUploadLoop(serv, appId) {
408
+ // 设置 Worker 降级回调
409
+ (0, _uploadWorkerManager.setWorkerFallbackCallback)(function () {
410
+ _logger.default.log('Worker mode was downgraded, starting main thread upload');
411
+ startMainThreadUploadLoop(serv, appId);
412
+ });
413
+
414
+ // 优先尝试 Worker 模式
415
+ var workerInitialized = (0, _uploadWorkerManager.initWorkerUpload)(serv, appId);
416
+ if (workerInitialized) {
417
+ // Worker 模式下,超时降级逻辑在 initWorkerUpload 中处理
418
+ // 如果 Worker READY 超时,会自动调用 destroyWorker 并通过回调启动主线程上传
419
+ return;
420
+ }
421
+
422
+ // Worker 不可用,降级到主线程模式
423
+ _logger.default.log('Worker not available, falling back to main thread upload');
424
+ startMainThreadUploadLoop(serv, appId);
425
+ }
426
+
197
427
  /**
198
428
  * 取消上传循环
429
+ * 同时处理 Worker 模式和主线程模式
199
430
  */
200
431
  function cancelUploadLoop() {
432
+ // 清理降级回调
433
+ (0, _uploadWorkerManager.setWorkerFallbackCallback)(null);
434
+
435
+ // 销毁 Worker(如果存在)
436
+ if ((0, _uploadWorkerManager.isUsingWorkerMode)()) {
437
+ (0, _uploadWorkerManager.destroyWorker)();
438
+ }
439
+
440
+ // 重置主线程模式状态
201
441
  isUploadCancelled = true;
202
442
  isUploading = false;
443
+ errorModeUploading = false;
444
+ errorModeWindowStart = 0;
203
445
  }
204
446
 
205
447
  /**
206
448
  * 重置上传循环状态(用于重新初始化)
207
449
  */
208
450
  function resetUploadLoop() {
451
+ // 清理降级回调
452
+ (0, _uploadWorkerManager.setWorkerFallbackCallback)(null);
453
+
454
+ // 销毁 Worker(如果存在)
455
+ if ((0, _uploadWorkerManager.isUsingWorkerMode)()) {
456
+ (0, _uploadWorkerManager.destroyWorker)();
457
+ }
458
+
459
+ // 重置主线程模式状态
209
460
  isUploadCancelled = false;
210
461
  isUploading = false;
462
+ errorModeUploading = false;
463
+ errorModeWindowStart = 0;
464
+ uploadFailureCount.clear();
211
465
  }
212
466
 
213
467
  /**
214
468
  * 强制重置上传状态(用于测试)
215
469
  */
216
470
  function forceResetUploadState() {
217
- isUploadCancelled = false;
218
- isUploading = false;
219
- uploadFailureCount.clear();
471
+ resetUploadLoop();
472
+ }
473
+
474
+ // ==================== 孤儿 Session 残留数据回收 ====================
475
+
476
+ /**
477
+ * 扫描并回收孤儿 session 的残留数据
478
+ *
479
+ * 在多页面应用(MPA)中,当用户从页面 A 导航到页面 B 时:
480
+ * - 页面 A 的上传循环被中断,storage 中可能还有未上传的事件数据
481
+ * - 页面 B 生成新的 sessionId,只会读取自己的数据
482
+ * - 页面 A 的残留数据成为"孤儿数据"
483
+ *
484
+ * 此函数在上传循环启动前调用(await),将孤儿数据合并到当前 session 的
485
+ * storage 队列头部,确保上传循环启动时数据已就位。
486
+ *
487
+ * 优势:
488
+ * - 不额外发起上传请求,复用现有上传循环
489
+ * - 孤儿数据在前、当前数据在后,时序天然连贯
490
+ * - 自动复用上传循环的重试机制
491
+ *
492
+ * 安全策略:
493
+ * 1. 只处理近期的 session(5 分钟内注册的)
494
+ * 2. 只回收时间跨度合理的数据(2 分钟内,即上传周期内的残留)
495
+ * 3. 回收失败不影响当前页面的正常录制和上传
496
+ */
497
+ function flushOrphanSessions() {
498
+ return _flushOrphanSessions.apply(this, arguments);
499
+ }
500
+ function _flushOrphanSessions() {
501
+ _flushOrphanSessions = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
502
+ var orphans, currentStorageKey, _iterator, _step, orphan, events;
503
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
504
+ while (1) switch (_context4.prev = _context4.next) {
505
+ case 0:
506
+ _context4.prev = 0;
507
+ orphans = (0, _utils.getOrphanSessions)();
508
+ if (!(orphans.length === 0)) {
509
+ _context4.next = 4;
510
+ break;
511
+ }
512
+ return _context4.abrupt("return");
513
+ case 4:
514
+ _logger.default.log("Found ".concat(orphans.length, " orphan session(s) with residual data"));
515
+ currentStorageKey = (0, _utils.getStorageKey)();
516
+ _iterator = _createForOfIteratorHelper(orphans);
517
+ _context4.prev = 7;
518
+ _iterator.s();
519
+ case 9:
520
+ if ((_step = _iterator.n()).done) {
521
+ _context4.next = 34;
522
+ break;
523
+ }
524
+ orphan = _step.value;
525
+ _context4.prev = 11;
526
+ _context4.next = 14;
527
+ return _storageManager.storage.pull(orphan.storageKey, _constants.ORPHAN_PULL_LIMIT);
528
+ case 14:
529
+ events = _context4.sent;
530
+ if (!(!events || events.length === 0)) {
531
+ _context4.next = 18;
532
+ break;
533
+ }
534
+ (0, _utils.cleanupOrphanSession)(orphan.sessionId);
535
+ return _context4.abrupt("continue", 32);
536
+ case 18:
537
+ if ((0, _utils.isOrphanDataValid)(events)) {
538
+ _context4.next = 22;
539
+ break;
540
+ }
541
+ _logger.default.log("Orphan session ".concat(orphan.sessionId, " data is out of valid range, discarding ").concat(events.length, " events"));
542
+ (0, _utils.cleanupOrphanSession)(orphan.sessionId);
543
+ return _context4.abrupt("continue", 32);
544
+ case 22:
545
+ _context4.next = 24;
546
+ return _storageManager.storage.unshiftBatch(currentStorageKey, events);
547
+ case 24:
548
+ _logger.default.log("Merged ".concat(events.length, " residual events from orphan session ").concat(orphan.sessionId, " into current storage"));
549
+
550
+ // 清理孤儿 session 的注册信息和存储
551
+ (0, _utils.cleanupOrphanSession)(orphan.sessionId);
552
+ _context4.next = 32;
553
+ break;
554
+ case 28:
555
+ _context4.prev = 28;
556
+ _context4.t0 = _context4["catch"](11);
557
+ _logger.default.warn("Error processing orphan session ".concat(orphan.sessionId, ":"), _context4.t0);
558
+ (0, _utils.cleanupOrphanSession)(orphan.sessionId);
559
+ case 32:
560
+ _context4.next = 9;
561
+ break;
562
+ case 34:
563
+ _context4.next = 39;
564
+ break;
565
+ case 36:
566
+ _context4.prev = 36;
567
+ _context4.t1 = _context4["catch"](7);
568
+ _iterator.e(_context4.t1);
569
+ case 39:
570
+ _context4.prev = 39;
571
+ _iterator.f();
572
+ return _context4.finish(39);
573
+ case 42:
574
+ _context4.next = 47;
575
+ break;
576
+ case 44:
577
+ _context4.prev = 44;
578
+ _context4.t2 = _context4["catch"](0);
579
+ _logger.default.warn('Error in flushOrphanSessions:', _context4.t2);
580
+ case 47:
581
+ case "end":
582
+ return _context4.stop();
583
+ }
584
+ }, _callee4, null, [[0, 44], [7, 36, 39, 42], [11, 28]]);
585
+ }));
586
+ return _flushOrphanSessions.apply(this, arguments);
220
587
  }