@antglobal/rlog-sdk 0.0.1755855517-dev.9 → 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 +13 -6
  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 -119
  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 +13 -6
  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 -120
  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
@@ -18,8 +18,16 @@ export declare class MemoryAdapter implements StorageAdapter {
18
18
  pull(deviceId: string, length: number): Promise<any[]>;
19
19
  clear(deviceId: string): Promise<void>;
20
20
  /**
21
- * 获取当前存储状态(调试用)
21
+ * 按时间范围提取事件(不移除)
22
22
  */
23
- getStorageState(): Record<string, number>;
23
+ pullByTimeRange(deviceId: string, startTime: number, endTime: number): Promise<any[]>;
24
+ /**
25
+ * 按时间范围移除事件(移除 sinceTime 及之后的所有事件)
26
+ */
27
+ removeByTimeRange(deviceId: string, sinceTime: number): Promise<void>;
28
+ /**
29
+ * 获取存储的事件数量(非破坏性只读操作)
30
+ */
31
+ count(deviceId: string): Promise<number>;
24
32
  }
25
33
  //# sourceMappingURL=memory-adapt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-adapt.d.ts","sourceRoot":"","sources":["../../../../src/lib/drive/memory-adapt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,KAAK,CAAyC;IAEtD,OAAO;WAEO,WAAW,IAAI,aAAa;IAO1C;;OAEG;YACW,WAAW;IAuBnB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBnD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB1D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IA2BtD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C;;OAEG;IACH,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAO1C"}
1
+ {"version":3,"file":"memory-adapt.d.ts","sourceRoot":"","sources":["../../../../src/lib/drive/memory-adapt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,KAAK,CAAyC;IAEtD,OAAO;WAEO,WAAW,IAAI,aAAa;IAO1C;;OAEG;YACW,WAAW;IAuBnB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBnD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB1D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IA2BtD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C;;OAEG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,EAAE,CAAC;IAajB;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3E;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAU/C"}
@@ -1,10 +1,4 @@
1
1
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
3
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
- 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); }
5
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
6
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
7
- 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; }
8
2
  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; }
9
3
  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); } }
10
4
  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); }); }; }
@@ -14,6 +8,8 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
14
8
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
9
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
16
10
  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); }
11
+ import { MAX_STORAGE_EVENTS } from "../constants";
12
+
17
13
  /**
18
14
  * 线程安全的内存适配器
19
15
  */
@@ -89,8 +85,8 @@ export var MemoryAdapter = /*#__PURE__*/function () {
89
85
  list.push(data);
90
86
 
91
87
  // 限制最大存储量
92
- if (list.length > 10000) {
93
- list.splice(0, list.length - 10000);
88
+ if (list.length > MAX_STORAGE_EVENTS) {
89
+ list.splice(0, list.length - MAX_STORAGE_EVENTS);
94
90
  }
95
91
  } finally {
96
92
  release();
@@ -126,8 +122,8 @@ export var MemoryAdapter = /*#__PURE__*/function () {
126
122
  list.unshift(data);
127
123
 
128
124
  // 限制最大存储量
129
- if (list.length > 10000) {
130
- list.splice(0, list.length - 10000);
125
+ if (list.length > MAX_STORAGE_EVENTS) {
126
+ list.splice(0, list.length - MAX_STORAGE_EVENTS);
131
127
  }
132
128
  } finally {
133
129
  release();
@@ -147,7 +143,7 @@ export var MemoryAdapter = /*#__PURE__*/function () {
147
143
  key: "unshiftBatch",
148
144
  value: function () {
149
145
  var _unshiftBatch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(deviceId, data) {
150
- var release, list;
146
+ var release, existing, merged;
151
147
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
152
148
  while (1) switch (_context4.prev = _context4.next) {
153
149
  case 0:
@@ -159,13 +155,12 @@ export var MemoryAdapter = /*#__PURE__*/function () {
159
155
  if (!this.storage.has(deviceId)) {
160
156
  this.storage.set(deviceId, []);
161
157
  }
162
- list = this.storage.get(deviceId);
163
- list.unshift.apply(list, _toConsumableArray(data));
164
-
165
- // 限制最大存储量
166
- if (list.length > 10000) {
167
- list.splice(0, list.length - 10000);
158
+ existing = this.storage.get(deviceId);
159
+ merged = data.concat(existing); // 限制最大存储量
160
+ if (merged.length > MAX_STORAGE_EVENTS) {
161
+ merged.splice(0, merged.length - MAX_STORAGE_EVENTS);
168
162
  }
163
+ this.storage.set(deviceId, merged);
169
164
  } finally {
170
165
  release();
171
166
  }
@@ -253,17 +248,114 @@ export var MemoryAdapter = /*#__PURE__*/function () {
253
248
  return clear;
254
249
  }()
255
250
  /**
256
- * 获取当前存储状态(调试用)
251
+ * 按时间范围提取事件(不移除)
257
252
  */
258
253
  }, {
259
- key: "getStorageState",
260
- value: function getStorageState() {
261
- var state = {};
262
- this.storage.forEach(function (value, key) {
263
- state[key] = value.length;
264
- });
265
- return state;
266
- }
254
+ key: "pullByTimeRange",
255
+ value: (function () {
256
+ var _pullByTimeRange = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(deviceId, startTime, endTime) {
257
+ var release, data;
258
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
259
+ while (1) switch (_context7.prev = _context7.next) {
260
+ case 0:
261
+ _context7.next = 2;
262
+ return this.acquireLock(deviceId);
263
+ case 2:
264
+ release = _context7.sent;
265
+ _context7.prev = 3;
266
+ data = this.storage.get(deviceId) || [];
267
+ return _context7.abrupt("return", data.filter(function (event) {
268
+ return event.timestamp >= startTime && event.timestamp <= endTime;
269
+ }));
270
+ case 6:
271
+ _context7.prev = 6;
272
+ release();
273
+ return _context7.finish(6);
274
+ case 9:
275
+ case "end":
276
+ return _context7.stop();
277
+ }
278
+ }, _callee7, this, [[3,, 6, 9]]);
279
+ }));
280
+ function pullByTimeRange(_x11, _x12, _x13) {
281
+ return _pullByTimeRange.apply(this, arguments);
282
+ }
283
+ return pullByTimeRange;
284
+ }()
285
+ /**
286
+ * 按时间范围移除事件(移除 sinceTime 及之后的所有事件)
287
+ */
288
+ )
289
+ }, {
290
+ key: "removeByTimeRange",
291
+ value: (function () {
292
+ var _removeByTimeRange = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(deviceId, sinceTime) {
293
+ var release, data, remaining;
294
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
295
+ while (1) switch (_context8.prev = _context8.next) {
296
+ case 0:
297
+ _context8.next = 2;
298
+ return this.acquireLock(deviceId);
299
+ case 2:
300
+ release = _context8.sent;
301
+ try {
302
+ data = this.storage.get(deviceId) || []; // 保留 sinceTime 之前的事件
303
+ remaining = data.filter(function (e) {
304
+ return e.timestamp < sinceTime;
305
+ });
306
+ if (remaining.length > 0) {
307
+ this.storage.set(deviceId, remaining);
308
+ } else {
309
+ this.storage.delete(deviceId);
310
+ }
311
+ } finally {
312
+ release();
313
+ }
314
+ case 4:
315
+ case "end":
316
+ return _context8.stop();
317
+ }
318
+ }, _callee8, this);
319
+ }));
320
+ function removeByTimeRange(_x14, _x15) {
321
+ return _removeByTimeRange.apply(this, arguments);
322
+ }
323
+ return removeByTimeRange;
324
+ }()
325
+ /**
326
+ * 获取存储的事件数量(非破坏性只读操作)
327
+ */
328
+ )
329
+ }, {
330
+ key: "count",
331
+ value: (function () {
332
+ var _count = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(deviceId) {
333
+ var release, data;
334
+ return _regeneratorRuntime().wrap(function _callee9$(_context9) {
335
+ while (1) switch (_context9.prev = _context9.next) {
336
+ case 0:
337
+ _context9.next = 2;
338
+ return this.acquireLock(deviceId);
339
+ case 2:
340
+ release = _context9.sent;
341
+ _context9.prev = 3;
342
+ data = this.storage.get(deviceId) || [];
343
+ return _context9.abrupt("return", data.length);
344
+ case 6:
345
+ _context9.prev = 6;
346
+ release();
347
+ return _context9.finish(6);
348
+ case 9:
349
+ case "end":
350
+ return _context9.stop();
351
+ }
352
+ }, _callee9, this, [[3,, 6, 9]]);
353
+ }));
354
+ function count(_x16) {
355
+ return _count.apply(this, arguments);
356
+ }
357
+ return count;
358
+ }())
267
359
  }], [{
268
360
  key: "getInstance",
269
361
  value: function getInstance() {
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 安全的 KV 存储工具
3
+ * 提供与 localStorage 相同的 getItem/setItem/removeItem 接口,
4
+ * 当 localStorage 不可用时自动降级到内存 Map 存储。
5
+ *
6
+ * 用途:给 utils.ts 中 deviceId、session 注册表等轻量 KV 场景使用,
7
+ * 避免直接裸调 localStorage 导致在隐私模式、iframe sandbox 等环境下抛异常。
8
+ */
9
+ declare class SafeStorage {
10
+ private memoryFallback;
11
+ private useMemory;
12
+ constructor();
13
+ /**
14
+ * 检测 localStorage 是否可用
15
+ */
16
+ private isLocalStorageAvailable;
17
+ getItem(key: string): string | null;
18
+ setItem(key: string, value: string): void;
19
+ removeItem(key: string): void;
20
+ }
21
+ /** 单例导出 */
22
+ export declare const safeStorage: SafeStorage;
23
+ export {};
24
+ //# sourceMappingURL=safe-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-storage.d.ts","sourceRoot":"","sources":["../../../../src/lib/drive/safe-storage.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,SAAS,CAAS;;IAS1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAanC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAazC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAY9B;AAED,WAAW;AACX,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -0,0 +1,96 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
4
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
5
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
7
+ 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); }
8
+ import logger from "../logger";
9
+ import { SAFE_STORAGE_TEST_KEY } from "../constants";
10
+
11
+ /**
12
+ * 安全的 KV 存储工具
13
+ * 提供与 localStorage 相同的 getItem/setItem/removeItem 接口,
14
+ * 当 localStorage 不可用时自动降级到内存 Map 存储。
15
+ *
16
+ * 用途:给 utils.ts 中 deviceId、session 注册表等轻量 KV 场景使用,
17
+ * 避免直接裸调 localStorage 导致在隐私模式、iframe sandbox 等环境下抛异常。
18
+ */
19
+ var SafeStorage = /*#__PURE__*/function () {
20
+ function SafeStorage() {
21
+ _classCallCheck(this, SafeStorage);
22
+ _defineProperty(this, "memoryFallback", new Map());
23
+ _defineProperty(this, "useMemory", false);
24
+ this.useMemory = !this.isLocalStorageAvailable();
25
+ if (this.useMemory) {
26
+ logger.warn('localStorage 不可用,SafeStorage 已降级为内存存储');
27
+ }
28
+ }
29
+
30
+ /**
31
+ * 检测 localStorage 是否可用
32
+ */
33
+ _createClass(SafeStorage, [{
34
+ key: "isLocalStorageAvailable",
35
+ value: function isLocalStorageAvailable() {
36
+ try {
37
+ if (typeof window === 'undefined' || !window.localStorage) {
38
+ return false;
39
+ }
40
+ var testKey = SAFE_STORAGE_TEST_KEY;
41
+ window.localStorage.setItem(testKey, '1');
42
+ window.localStorage.removeItem(testKey);
43
+ return true;
44
+ } catch (_unused) {
45
+ return false;
46
+ }
47
+ }
48
+ }, {
49
+ key: "getItem",
50
+ value: function getItem(key) {
51
+ if (this.useMemory) {
52
+ var _this$memoryFallback$;
53
+ return (_this$memoryFallback$ = this.memoryFallback.get(key)) !== null && _this$memoryFallback$ !== void 0 ? _this$memoryFallback$ : null;
54
+ }
55
+ try {
56
+ return localStorage.getItem(key);
57
+ } catch (_unused2) {
58
+ var _this$memoryFallback$2;
59
+ // 运行时突然不可用(如存储配额超限),降级到内存
60
+ this.useMemory = true;
61
+ return (_this$memoryFallback$2 = this.memoryFallback.get(key)) !== null && _this$memoryFallback$2 !== void 0 ? _this$memoryFallback$2 : null;
62
+ }
63
+ }
64
+ }, {
65
+ key: "setItem",
66
+ value: function setItem(key, value) {
67
+ if (this.useMemory) {
68
+ this.memoryFallback.set(key, value);
69
+ return;
70
+ }
71
+ try {
72
+ localStorage.setItem(key, value);
73
+ } catch (_unused3) {
74
+ this.useMemory = true;
75
+ this.memoryFallback.set(key, value);
76
+ }
77
+ }
78
+ }, {
79
+ key: "removeItem",
80
+ value: function removeItem(key) {
81
+ if (this.useMemory) {
82
+ this.memoryFallback.delete(key);
83
+ return;
84
+ }
85
+ try {
86
+ localStorage.removeItem(key);
87
+ } catch (_unused4) {
88
+ this.useMemory = true;
89
+ this.memoryFallback.delete(key);
90
+ }
91
+ }
92
+ }]);
93
+ return SafeStorage;
94
+ }();
95
+ /** 单例导出 */
96
+ export var safeStorage = new SafeStorage();
@@ -4,5 +4,25 @@ export interface StorageAdapter {
4
4
  unshiftBatch(deviceId: string, data: any[]): Promise<void>;
5
5
  pull(deviceId: string, length: number): Promise<any[]>;
6
6
  clear?(deviceId: string): Promise<void>;
7
+ /**
8
+ * 按时间范围提取事件(用于 error 模式)
9
+ * @param deviceId 设备 ID
10
+ * @param startTime 起始时间戳(毫秒),包含
11
+ * @param endTime 结束时间戳(毫秒),包含
12
+ * @returns 时间范围内的事件数组
13
+ */
14
+ pullByTimeRange?(deviceId: string, startTime: number, endTime: number): Promise<any[]>;
15
+ /**
16
+ * 按时间范围移除事件(用于 error 模式)
17
+ * @param deviceId 设备 ID
18
+ * @param sinceTime 起始时间戳(毫秒),移除该时间点及之后的所有事件
19
+ */
20
+ removeByTimeRange?(deviceId: string, sinceTime: number): Promise<void>;
21
+ /**
22
+ * 获取存储的事件数量(非破坏性只读操作)
23
+ * @param deviceId 设备 ID
24
+ * @returns 事件数量
25
+ */
26
+ count?(deviceId: string): Promise<number>;
7
27
  }
8
28
  //# sourceMappingURL=storage-interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-interface.d.ts","sourceRoot":"","sources":["../../../../src/lib/drive/storage-interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC"}
1
+ {"version":3,"file":"storage-interface.d.ts","sourceRoot":"","sources":["../../../../src/lib/drive/storage-interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;;;;;OAMG;IACH,eAAe,CAAC,CACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAElB;;;;OAIG;IACH,iBAAiB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE;;;;OAIG;IACH,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * 错误触发与状态管理
3
+ *
4
+ * 状态机:
5
+ * idle → 错误触发 → uploading → afterDuration 内无新错误 → idle
6
+ *
7
+ * idle 阶段:
8
+ * - rrweb 事件写入 Storage
9
+ * - 上传循环跳过上传,但持续轮询
10
+ *
11
+ * 错误触发瞬间:
12
+ * 1. 设置上传时间窗口起点 = now - beforeDuration
13
+ * 2. 切换到 uploading 状态,上传循环开始上传
14
+ * 3. 启动 afterDuration 倒计时
15
+ *
16
+ * uploading 阶段:
17
+ * - 上传循环持续上传事件
18
+ * - 如果期间又有新错误 → 重置 afterDuration 倒计时(延长持续上传)
19
+ * - afterDuration 倒计时到期 → 回到 idle
20
+ *
21
+ * 统一的上传逻辑由 uploader.ts 中的 startUploadLoop 处理。
22
+ */
23
+ export interface ErrorInfo {
24
+ type: string;
25
+ message?: string;
26
+ timestamp: number;
27
+ [key: string]: any;
28
+ }
29
+ export declare class ErrorTrigger {
30
+ private beforeDuration;
31
+ private afterDuration;
32
+ private state;
33
+ private cooldownTimer;
34
+ private destroyed;
35
+ constructor(options?: {
36
+ beforeDuration?: number;
37
+ afterDuration?: number;
38
+ });
39
+ /**
40
+ * 当前是否处于持续上传状态
41
+ */
42
+ isUploading(): boolean;
43
+ /**
44
+ * 接收错误通知
45
+ *
46
+ * idle 状态下:
47
+ * 1. 设置上传窗口起点
48
+ * 2. 切换到 uploading 状态
49
+ * 3. 启动 afterDuration 倒计时
50
+ *
51
+ * uploading 状态下:
52
+ * 重置 afterDuration 倒计时(延长持续上传窗口)
53
+ */
54
+ onError(errorInfo: ErrorInfo): void;
55
+ /**
56
+ * 进入 uploading 状态
57
+ */
58
+ private enterUploadingState;
59
+ /**
60
+ * 重置 afterDuration 倒计时
61
+ * 每次有新错误时调用,延长持续上传窗口
62
+ */
63
+ private resetCooldown;
64
+ /**
65
+ * 退出 uploading 状态,回到 idle
66
+ */
67
+ private exitUploadingState;
68
+ /**
69
+ * 销毁实例,清理所有定时器
70
+ */
71
+ destroy(): void;
72
+ }
73
+ //# sourceMappingURL=error-trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-trigger.d.ts","sourceRoot":"","sources":["../../../src/lib/error-trigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAG9B,OAAO,CAAC,KAAK,CAAwB;IAGrC,OAAO,CAAC,aAAa,CAA8C;IAGnE,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,GAAE;QACnB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;KACnB;IAKN;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAcnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,IAAI,IAAI;CAahB"}
@@ -0,0 +1,162 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
4
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
5
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
7
+ 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); }
8
+ /**
9
+ * 错误触发与状态管理
10
+ *
11
+ * 状态机:
12
+ * idle → 错误触发 → uploading → afterDuration 内无新错误 → idle
13
+ *
14
+ * idle 阶段:
15
+ * - rrweb 事件写入 Storage
16
+ * - 上传循环跳过上传,但持续轮询
17
+ *
18
+ * 错误触发瞬间:
19
+ * 1. 设置上传时间窗口起点 = now - beforeDuration
20
+ * 2. 切换到 uploading 状态,上传循环开始上传
21
+ * 3. 启动 afterDuration 倒计时
22
+ *
23
+ * uploading 阶段:
24
+ * - 上传循环持续上传事件
25
+ * - 如果期间又有新错误 → 重置 afterDuration 倒计时(延长持续上传)
26
+ * - afterDuration 倒计时到期 → 回到 idle
27
+ *
28
+ * 统一的上传逻辑由 uploader.ts 中的 startUploadLoop 处理。
29
+ */
30
+
31
+ import { setErrorModeUploading, setErrorModeWindowStart } from "./uploader";
32
+ import logger from "./logger";
33
+ export var ErrorTrigger = /*#__PURE__*/function () {
34
+ function ErrorTrigger() {
35
+ var _options$beforeDurati, _options$afterDuratio;
36
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
37
+ _classCallCheck(this, ErrorTrigger);
38
+ _defineProperty(this, "beforeDuration", void 0);
39
+ _defineProperty(this, "afterDuration", void 0);
40
+ // 状态机
41
+ _defineProperty(this, "state", 'idle');
42
+ // afterDuration 倒计时定时器
43
+ _defineProperty(this, "cooldownTimer", null);
44
+ // 标记是否已销毁
45
+ _defineProperty(this, "destroyed", false);
46
+ this.beforeDuration = (_options$beforeDurati = options.beforeDuration) !== null && _options$beforeDurati !== void 0 ? _options$beforeDurati : 30000;
47
+ this.afterDuration = (_options$afterDuratio = options.afterDuration) !== null && _options$afterDuratio !== void 0 ? _options$afterDuratio : 30000;
48
+ }
49
+
50
+ /**
51
+ * 当前是否处于持续上传状态
52
+ */
53
+ _createClass(ErrorTrigger, [{
54
+ key: "isUploading",
55
+ value: function isUploading() {
56
+ return this.state === 'uploading';
57
+ }
58
+
59
+ /**
60
+ * 接收错误通知
61
+ *
62
+ * idle 状态下:
63
+ * 1. 设置上传窗口起点
64
+ * 2. 切换到 uploading 状态
65
+ * 3. 启动 afterDuration 倒计时
66
+ *
67
+ * uploading 状态下:
68
+ * 重置 afterDuration 倒计时(延长持续上传窗口)
69
+ */
70
+ }, {
71
+ key: "onError",
72
+ value: function onError(errorInfo) {
73
+ if (this.destroyed) return;
74
+ if (this.state === 'idle') {
75
+ // ===== 首次错误触发 =====
76
+ this.enterUploadingState(errorInfo.timestamp);
77
+ } else {
78
+ // ===== uploading 状态下又有新错误 → 重置 cooldown =====
79
+ this.resetCooldown();
80
+ }
81
+ }
82
+
83
+ // ===== 内部方法 =====
84
+
85
+ /**
86
+ * 进入 uploading 状态
87
+ */
88
+ }, {
89
+ key: "enterUploadingState",
90
+ value: function enterUploadingState(errorTimestamp) {
91
+ this.state = 'uploading';
92
+
93
+ // 1. 设置上传窗口起点(错误时间 - beforeDuration)
94
+ var windowStart = errorTimestamp - this.beforeDuration;
95
+ setErrorModeWindowStart(windowStart);
96
+
97
+ // 2. 切换上传状态,上传循环开始工作
98
+ setErrorModeUploading(true);
99
+
100
+ // 3. 启动 afterDuration 倒计时
101
+ this.resetCooldown();
102
+ }
103
+
104
+ /**
105
+ * 重置 afterDuration 倒计时
106
+ * 每次有新错误时调用,延长持续上传窗口
107
+ */
108
+ }, {
109
+ key: "resetCooldown",
110
+ value: function resetCooldown() {
111
+ var _this = this;
112
+ if (this.cooldownTimer) {
113
+ clearTimeout(this.cooldownTimer);
114
+ this.cooldownTimer = null;
115
+ }
116
+ this.cooldownTimer = setTimeout(function () {
117
+ try {
118
+ _this.exitUploadingState();
119
+ } catch (error) {
120
+ logger.warn('Error in exitUploadingState:', error);
121
+ }
122
+ }, this.afterDuration);
123
+ }
124
+
125
+ /**
126
+ * 退出 uploading 状态,回到 idle
127
+ */
128
+ }, {
129
+ key: "exitUploadingState",
130
+ value: function exitUploadingState() {
131
+ // 清理 cooldown 定时器
132
+ if (this.cooldownTimer) {
133
+ clearTimeout(this.cooldownTimer);
134
+ this.cooldownTimer = null;
135
+ }
136
+
137
+ // 切换回 idle 状态,上传循环将跳过上传
138
+ setErrorModeUploading(false);
139
+
140
+ // 回到 idle
141
+ this.state = 'idle';
142
+ }
143
+
144
+ /**
145
+ * 销毁实例,清理所有定时器
146
+ */
147
+ }, {
148
+ key: "destroy",
149
+ value: function destroy() {
150
+ this.destroyed = true;
151
+ if (this.cooldownTimer) {
152
+ clearTimeout(this.cooldownTimer);
153
+ this.cooldownTimer = null;
154
+ }
155
+
156
+ // 确保上传状态重置
157
+ setErrorModeUploading(false);
158
+ this.state = 'idle';
159
+ }
160
+ }]);
161
+ return ErrorTrigger;
162
+ }();
@@ -1,3 +1,12 @@
1
+ import { ErrorTrigger } from './error-trigger';
2
+ /**
3
+ * 设置错误触发器实例(错误采集模式下由 init.ts 调用)
4
+ */
5
+ export declare function setErrorTrigger(trigger: ErrorTrigger | null): void;
6
+ /**
7
+ * 获取错误触发器实例
8
+ */
9
+ export declare function getErrorTrigger(): ErrorTrigger | null;
1
10
  export declare const sendErrorToAnalytics: (data: any) => void;
2
11
  export declare function initErrorHandler(): void;
3
12
  export declare function cleanupErrorHandler(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/lib/error.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB,SAAU,GAAG,SAe7C,CAAC;AAGF,wBAAgB,gBAAgB,SAoJ/B;AAGD,wBAAgB,mBAAmB,SAgBlC"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/lib/error.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU/C;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAElE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAGD,eAAO,MAAM,oBAAoB,SAAU,GAAG,SAuB7C,CAAC;AA6EF,wBAAgB,gBAAgB,SAO/B;AAGD,wBAAgB,mBAAmB,SAOlC"}