@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"}
@@ -4,13 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.MemoryAdapter = void 0;
7
+ var _constants = require("../constants");
7
8
  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); }
8
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
9
- 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."); }
10
- 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); }
11
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
12
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
13
- 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; }
14
9
  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; }
15
10
  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); } }
16
11
  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); }); }; }
@@ -95,8 +90,8 @@ var MemoryAdapter = exports.MemoryAdapter = /*#__PURE__*/function () {
95
90
  list.push(data);
96
91
 
97
92
  // 限制最大存储量
98
- if (list.length > 10000) {
99
- list.splice(0, list.length - 10000);
93
+ if (list.length > _constants.MAX_STORAGE_EVENTS) {
94
+ list.splice(0, list.length - _constants.MAX_STORAGE_EVENTS);
100
95
  }
101
96
  } finally {
102
97
  release();
@@ -132,8 +127,8 @@ var MemoryAdapter = exports.MemoryAdapter = /*#__PURE__*/function () {
132
127
  list.unshift(data);
133
128
 
134
129
  // 限制最大存储量
135
- if (list.length > 10000) {
136
- list.splice(0, list.length - 10000);
130
+ if (list.length > _constants.MAX_STORAGE_EVENTS) {
131
+ list.splice(0, list.length - _constants.MAX_STORAGE_EVENTS);
137
132
  }
138
133
  } finally {
139
134
  release();
@@ -153,7 +148,7 @@ var MemoryAdapter = exports.MemoryAdapter = /*#__PURE__*/function () {
153
148
  key: "unshiftBatch",
154
149
  value: function () {
155
150
  var _unshiftBatch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(deviceId, data) {
156
- var release, list;
151
+ var release, existing, merged;
157
152
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
158
153
  while (1) switch (_context4.prev = _context4.next) {
159
154
  case 0:
@@ -165,13 +160,12 @@ var MemoryAdapter = exports.MemoryAdapter = /*#__PURE__*/function () {
165
160
  if (!this.storage.has(deviceId)) {
166
161
  this.storage.set(deviceId, []);
167
162
  }
168
- list = this.storage.get(deviceId);
169
- list.unshift.apply(list, _toConsumableArray(data));
170
-
171
- // 限制最大存储量
172
- if (list.length > 10000) {
173
- list.splice(0, list.length - 10000);
163
+ existing = this.storage.get(deviceId);
164
+ merged = data.concat(existing); // 限制最大存储量
165
+ if (merged.length > _constants.MAX_STORAGE_EVENTS) {
166
+ merged.splice(0, merged.length - _constants.MAX_STORAGE_EVENTS);
174
167
  }
168
+ this.storage.set(deviceId, merged);
175
169
  } finally {
176
170
  release();
177
171
  }
@@ -259,17 +253,114 @@ var MemoryAdapter = exports.MemoryAdapter = /*#__PURE__*/function () {
259
253
  return clear;
260
254
  }()
261
255
  /**
262
- * 获取当前存储状态(调试用)
256
+ * 按时间范围提取事件(不移除)
263
257
  */
264
258
  }, {
265
- key: "getStorageState",
266
- value: function getStorageState() {
267
- var state = {};
268
- this.storage.forEach(function (value, key) {
269
- state[key] = value.length;
270
- });
271
- return state;
272
- }
259
+ key: "pullByTimeRange",
260
+ value: (function () {
261
+ var _pullByTimeRange = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(deviceId, startTime, endTime) {
262
+ var release, data;
263
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
264
+ while (1) switch (_context7.prev = _context7.next) {
265
+ case 0:
266
+ _context7.next = 2;
267
+ return this.acquireLock(deviceId);
268
+ case 2:
269
+ release = _context7.sent;
270
+ _context7.prev = 3;
271
+ data = this.storage.get(deviceId) || [];
272
+ return _context7.abrupt("return", data.filter(function (event) {
273
+ return event.timestamp >= startTime && event.timestamp <= endTime;
274
+ }));
275
+ case 6:
276
+ _context7.prev = 6;
277
+ release();
278
+ return _context7.finish(6);
279
+ case 9:
280
+ case "end":
281
+ return _context7.stop();
282
+ }
283
+ }, _callee7, this, [[3,, 6, 9]]);
284
+ }));
285
+ function pullByTimeRange(_x11, _x12, _x13) {
286
+ return _pullByTimeRange.apply(this, arguments);
287
+ }
288
+ return pullByTimeRange;
289
+ }()
290
+ /**
291
+ * 按时间范围移除事件(移除 sinceTime 及之后的所有事件)
292
+ */
293
+ )
294
+ }, {
295
+ key: "removeByTimeRange",
296
+ value: (function () {
297
+ var _removeByTimeRange = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(deviceId, sinceTime) {
298
+ var release, data, remaining;
299
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
300
+ while (1) switch (_context8.prev = _context8.next) {
301
+ case 0:
302
+ _context8.next = 2;
303
+ return this.acquireLock(deviceId);
304
+ case 2:
305
+ release = _context8.sent;
306
+ try {
307
+ data = this.storage.get(deviceId) || []; // 保留 sinceTime 之前的事件
308
+ remaining = data.filter(function (e) {
309
+ return e.timestamp < sinceTime;
310
+ });
311
+ if (remaining.length > 0) {
312
+ this.storage.set(deviceId, remaining);
313
+ } else {
314
+ this.storage.delete(deviceId);
315
+ }
316
+ } finally {
317
+ release();
318
+ }
319
+ case 4:
320
+ case "end":
321
+ return _context8.stop();
322
+ }
323
+ }, _callee8, this);
324
+ }));
325
+ function removeByTimeRange(_x14, _x15) {
326
+ return _removeByTimeRange.apply(this, arguments);
327
+ }
328
+ return removeByTimeRange;
329
+ }()
330
+ /**
331
+ * 获取存储的事件数量(非破坏性只读操作)
332
+ */
333
+ )
334
+ }, {
335
+ key: "count",
336
+ value: (function () {
337
+ var _count = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(deviceId) {
338
+ var release, data;
339
+ return _regeneratorRuntime().wrap(function _callee9$(_context9) {
340
+ while (1) switch (_context9.prev = _context9.next) {
341
+ case 0:
342
+ _context9.next = 2;
343
+ return this.acquireLock(deviceId);
344
+ case 2:
345
+ release = _context9.sent;
346
+ _context9.prev = 3;
347
+ data = this.storage.get(deviceId) || [];
348
+ return _context9.abrupt("return", data.length);
349
+ case 6:
350
+ _context9.prev = 6;
351
+ release();
352
+ return _context9.finish(6);
353
+ case 9:
354
+ case "end":
355
+ return _context9.stop();
356
+ }
357
+ }, _callee9, this, [[3,, 6, 9]]);
358
+ }));
359
+ function count(_x16) {
360
+ return _count.apply(this, arguments);
361
+ }
362
+ return count;
363
+ }())
273
364
  }], [{
274
365
  key: "getInstance",
275
366
  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,102 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.safeStorage = void 0;
7
+ var _logger = _interopRequireDefault(require("../logger"));
8
+ var _constants = require("../constants");
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ 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); }
11
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
12
+ 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); } }
13
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
14
+ 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
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
16
+ 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); }
17
+ /**
18
+ * 安全的 KV 存储工具
19
+ * 提供与 localStorage 相同的 getItem/setItem/removeItem 接口,
20
+ * 当 localStorage 不可用时自动降级到内存 Map 存储。
21
+ *
22
+ * 用途:给 utils.ts 中 deviceId、session 注册表等轻量 KV 场景使用,
23
+ * 避免直接裸调 localStorage 导致在隐私模式、iframe sandbox 等环境下抛异常。
24
+ */
25
+ var SafeStorage = /*#__PURE__*/function () {
26
+ function SafeStorage() {
27
+ _classCallCheck(this, SafeStorage);
28
+ _defineProperty(this, "memoryFallback", new Map());
29
+ _defineProperty(this, "useMemory", false);
30
+ this.useMemory = !this.isLocalStorageAvailable();
31
+ if (this.useMemory) {
32
+ _logger.default.warn('localStorage 不可用,SafeStorage 已降级为内存存储');
33
+ }
34
+ }
35
+
36
+ /**
37
+ * 检测 localStorage 是否可用
38
+ */
39
+ _createClass(SafeStorage, [{
40
+ key: "isLocalStorageAvailable",
41
+ value: function isLocalStorageAvailable() {
42
+ try {
43
+ if (typeof window === 'undefined' || !window.localStorage) {
44
+ return false;
45
+ }
46
+ var testKey = _constants.SAFE_STORAGE_TEST_KEY;
47
+ window.localStorage.setItem(testKey, '1');
48
+ window.localStorage.removeItem(testKey);
49
+ return true;
50
+ } catch (_unused) {
51
+ return false;
52
+ }
53
+ }
54
+ }, {
55
+ key: "getItem",
56
+ value: function getItem(key) {
57
+ if (this.useMemory) {
58
+ var _this$memoryFallback$;
59
+ return (_this$memoryFallback$ = this.memoryFallback.get(key)) !== null && _this$memoryFallback$ !== void 0 ? _this$memoryFallback$ : null;
60
+ }
61
+ try {
62
+ return localStorage.getItem(key);
63
+ } catch (_unused2) {
64
+ var _this$memoryFallback$2;
65
+ // 运行时突然不可用(如存储配额超限),降级到内存
66
+ this.useMemory = true;
67
+ return (_this$memoryFallback$2 = this.memoryFallback.get(key)) !== null && _this$memoryFallback$2 !== void 0 ? _this$memoryFallback$2 : null;
68
+ }
69
+ }
70
+ }, {
71
+ key: "setItem",
72
+ value: function setItem(key, value) {
73
+ if (this.useMemory) {
74
+ this.memoryFallback.set(key, value);
75
+ return;
76
+ }
77
+ try {
78
+ localStorage.setItem(key, value);
79
+ } catch (_unused3) {
80
+ this.useMemory = true;
81
+ this.memoryFallback.set(key, value);
82
+ }
83
+ }
84
+ }, {
85
+ key: "removeItem",
86
+ value: function removeItem(key) {
87
+ if (this.useMemory) {
88
+ this.memoryFallback.delete(key);
89
+ return;
90
+ }
91
+ try {
92
+ localStorage.removeItem(key);
93
+ } catch (_unused4) {
94
+ this.useMemory = true;
95
+ this.memoryFallback.delete(key);
96
+ }
97
+ }
98
+ }]);
99
+ return SafeStorage;
100
+ }();
101
+ /** 单例导出 */
102
+ var safeStorage = exports.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,167 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ErrorTrigger = void 0;
7
+ var _uploader = require("./uploader");
8
+ var _logger = _interopRequireDefault(require("./logger"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ 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); }
11
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
12
+ 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); } }
13
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
14
+ 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
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
16
+ 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); } /**
17
+ * 错误触发与状态管理
18
+ *
19
+ * 状态机:
20
+ * idle → 错误触发 → uploading → afterDuration 内无新错误 → idle
21
+ *
22
+ * idle 阶段:
23
+ * - rrweb 事件写入 Storage
24
+ * - 上传循环跳过上传,但持续轮询
25
+ *
26
+ * 错误触发瞬间:
27
+ * 1. 设置上传时间窗口起点 = now - beforeDuration
28
+ * 2. 切换到 uploading 状态,上传循环开始上传
29
+ * 3. 启动 afterDuration 倒计时
30
+ *
31
+ * uploading 阶段:
32
+ * - 上传循环持续上传事件
33
+ * - 如果期间又有新错误 → 重置 afterDuration 倒计时(延长持续上传)
34
+ * - afterDuration 倒计时到期 → 回到 idle
35
+ *
36
+ * 统一的上传逻辑由 uploader.ts 中的 startUploadLoop 处理。
37
+ */
38
+ var ErrorTrigger = exports.ErrorTrigger = /*#__PURE__*/function () {
39
+ function ErrorTrigger() {
40
+ var _options$beforeDurati, _options$afterDuratio;
41
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
42
+ _classCallCheck(this, ErrorTrigger);
43
+ _defineProperty(this, "beforeDuration", void 0);
44
+ _defineProperty(this, "afterDuration", void 0);
45
+ // 状态机
46
+ _defineProperty(this, "state", 'idle');
47
+ // afterDuration 倒计时定时器
48
+ _defineProperty(this, "cooldownTimer", null);
49
+ // 标记是否已销毁
50
+ _defineProperty(this, "destroyed", false);
51
+ this.beforeDuration = (_options$beforeDurati = options.beforeDuration) !== null && _options$beforeDurati !== void 0 ? _options$beforeDurati : 30000;
52
+ this.afterDuration = (_options$afterDuratio = options.afterDuration) !== null && _options$afterDuratio !== void 0 ? _options$afterDuratio : 30000;
53
+ }
54
+
55
+ /**
56
+ * 当前是否处于持续上传状态
57
+ */
58
+ _createClass(ErrorTrigger, [{
59
+ key: "isUploading",
60
+ value: function isUploading() {
61
+ return this.state === 'uploading';
62
+ }
63
+
64
+ /**
65
+ * 接收错误通知
66
+ *
67
+ * idle 状态下:
68
+ * 1. 设置上传窗口起点
69
+ * 2. 切换到 uploading 状态
70
+ * 3. 启动 afterDuration 倒计时
71
+ *
72
+ * uploading 状态下:
73
+ * 重置 afterDuration 倒计时(延长持续上传窗口)
74
+ */
75
+ }, {
76
+ key: "onError",
77
+ value: function onError(errorInfo) {
78
+ if (this.destroyed) return;
79
+ if (this.state === 'idle') {
80
+ // ===== 首次错误触发 =====
81
+ this.enterUploadingState(errorInfo.timestamp);
82
+ } else {
83
+ // ===== uploading 状态下又有新错误 → 重置 cooldown =====
84
+ this.resetCooldown();
85
+ }
86
+ }
87
+
88
+ // ===== 内部方法 =====
89
+
90
+ /**
91
+ * 进入 uploading 状态
92
+ */
93
+ }, {
94
+ key: "enterUploadingState",
95
+ value: function enterUploadingState(errorTimestamp) {
96
+ this.state = 'uploading';
97
+
98
+ // 1. 设置上传窗口起点(错误时间 - beforeDuration)
99
+ var windowStart = errorTimestamp - this.beforeDuration;
100
+ (0, _uploader.setErrorModeWindowStart)(windowStart);
101
+
102
+ // 2. 切换上传状态,上传循环开始工作
103
+ (0, _uploader.setErrorModeUploading)(true);
104
+
105
+ // 3. 启动 afterDuration 倒计时
106
+ this.resetCooldown();
107
+ }
108
+
109
+ /**
110
+ * 重置 afterDuration 倒计时
111
+ * 每次有新错误时调用,延长持续上传窗口
112
+ */
113
+ }, {
114
+ key: "resetCooldown",
115
+ value: function resetCooldown() {
116
+ var _this = this;
117
+ if (this.cooldownTimer) {
118
+ clearTimeout(this.cooldownTimer);
119
+ this.cooldownTimer = null;
120
+ }
121
+ this.cooldownTimer = setTimeout(function () {
122
+ try {
123
+ _this.exitUploadingState();
124
+ } catch (error) {
125
+ _logger.default.warn('Error in exitUploadingState:', error);
126
+ }
127
+ }, this.afterDuration);
128
+ }
129
+
130
+ /**
131
+ * 退出 uploading 状态,回到 idle
132
+ */
133
+ }, {
134
+ key: "exitUploadingState",
135
+ value: function exitUploadingState() {
136
+ // 清理 cooldown 定时器
137
+ if (this.cooldownTimer) {
138
+ clearTimeout(this.cooldownTimer);
139
+ this.cooldownTimer = null;
140
+ }
141
+
142
+ // 切换回 idle 状态,上传循环将跳过上传
143
+ (0, _uploader.setErrorModeUploading)(false);
144
+
145
+ // 回到 idle
146
+ this.state = 'idle';
147
+ }
148
+
149
+ /**
150
+ * 销毁实例,清理所有定时器
151
+ */
152
+ }, {
153
+ key: "destroy",
154
+ value: function destroy() {
155
+ this.destroyed = true;
156
+ if (this.cooldownTimer) {
157
+ clearTimeout(this.cooldownTimer);
158
+ this.cooldownTimer = null;
159
+ }
160
+
161
+ // 确保上传状态重置
162
+ (0, _uploader.setErrorModeUploading)(false);
163
+ this.state = 'idle';
164
+ }
165
+ }]);
166
+ return ErrorTrigger;
167
+ }();
@@ -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"}