@pluve/logger-sdk 0.0.7 → 0.0.8

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 (103) hide show
  1. package/README.md +60 -20
  2. package/dist/cjs/capture/jsError.js +48 -0
  3. package/dist/cjs/capture/promiseError.js +49 -0
  4. package/dist/cjs/capture/resourceError.js +48 -0
  5. package/dist/cjs/capture/wechatError.js +95 -0
  6. package/dist/cjs/compress/compression.js +84 -0
  7. package/dist/cjs/config/index.js +55 -0
  8. package/dist/cjs/core/fingerprint.js +36 -0
  9. package/dist/cjs/core/httpClient.js +96 -0
  10. package/dist/cjs/core/loggerSDK.js +641 -0
  11. package/dist/cjs/core/queueManager.js +249 -0
  12. package/dist/cjs/core/retryManager.js +127 -0
  13. package/dist/cjs/index.js +29 -0
  14. package/dist/cjs/logger-sdk.mermaid +84 -0
  15. package/dist/cjs/logger-sdk.svg +1 -0
  16. package/dist/cjs/stack/stacktrace.js +48 -0
  17. package/dist/cjs/transport/beaconTransport.js +64 -0
  18. package/dist/cjs/transport/pixelImageTransport.js +100 -0
  19. package/dist/cjs/transport/transport.js +17 -0
  20. package/dist/cjs/transport/transportAdapter.js +56 -0
  21. package/dist/cjs/transport/wechatTransport.js +103 -0
  22. package/dist/cjs/types/api.js +17 -0
  23. package/dist/cjs/types/env.js +17 -0
  24. package/dist/cjs/types/external.d.ts +21 -0
  25. package/dist/cjs/types/logEvent.js +17 -0
  26. package/dist/cjs/types/logEventLevel.js +17 -0
  27. package/dist/cjs/types/sdkOptions.js +17 -0
  28. package/dist/cjs/types/trackOptions.js +17 -0
  29. package/dist/cjs/utils/environment.js +183 -0
  30. package/dist/cjs/utils/session.js +31 -0
  31. package/dist/cjs/utils/tools.js +82 -0
  32. package/dist/cjs/utils/uuid.js +35 -0
  33. package/dist/esm/capture/jsError.js +45 -0
  34. package/dist/esm/capture/promiseError.js +46 -0
  35. package/dist/esm/capture/resourceError.js +24 -0
  36. package/dist/esm/capture/wechatError.js +92 -0
  37. package/dist/esm/compress/compression.js +82 -0
  38. package/dist/esm/config/index.js +28 -0
  39. package/dist/esm/core/fingerprint.js +12 -0
  40. package/dist/esm/core/httpClient.js +95 -0
  41. package/dist/esm/core/loggerSDK.js +650 -0
  42. package/dist/esm/core/queueManager.js +269 -0
  43. package/dist/esm/core/retryManager.js +129 -0
  44. package/dist/esm/index.js +5 -0
  45. package/dist/esm/logger-sdk.mermaid +84 -0
  46. package/dist/esm/logger-sdk.svg +1 -0
  47. package/dist/esm/stack/stacktrace.js +37 -0
  48. package/dist/esm/transport/beaconTransport.js +81 -0
  49. package/dist/esm/transport/pixelImageTransport.js +99 -0
  50. package/dist/esm/transport/transport.js +0 -0
  51. package/dist/esm/transport/transportAdapter.js +32 -0
  52. package/dist/esm/transport/wechatTransport.js +120 -0
  53. package/dist/esm/types/api.js +0 -0
  54. package/dist/esm/types/env.js +0 -0
  55. package/dist/esm/types/external.d.ts +21 -0
  56. package/dist/esm/types/logEvent.js +0 -0
  57. package/dist/esm/types/logEventLevel.js +0 -0
  58. package/dist/esm/types/sdkOptions.js +0 -0
  59. package/dist/esm/types/trackOptions.js +0 -0
  60. package/dist/esm/utils/environment.js +154 -0
  61. package/dist/esm/utils/session.js +7 -0
  62. package/dist/esm/utils/tools.js +76 -0
  63. package/dist/esm/utils/uuid.js +11 -0
  64. package/dist/types/capture/jsError.d.ts +2 -0
  65. package/dist/types/capture/promiseError.d.ts +2 -0
  66. package/dist/types/capture/resourceError.d.ts +2 -0
  67. package/dist/types/capture/wechatError.d.ts +3 -0
  68. package/dist/types/compress/compression.d.ts +10 -0
  69. package/dist/types/config/index.d.ts +9 -0
  70. package/dist/types/core/fingerprint.d.ts +8 -0
  71. package/dist/types/core/httpClient.d.ts +11 -0
  72. package/dist/{loggerSDK.d.ts → types/core/loggerSDK.d.ts} +27 -2
  73. package/dist/{queueManager.d.ts → types/core/queueManager.d.ts} +9 -1
  74. package/dist/{retryManager.d.ts → types/core/retryManager.d.ts} +0 -4
  75. package/dist/types/index.d.ts +1 -0
  76. package/dist/types/stack/stacktrace.d.ts +2 -0
  77. package/dist/types/transport/beaconTransport.d.ts +11 -0
  78. package/dist/types/transport/pixelImageTransport.d.ts +11 -0
  79. package/dist/types/transport/transport.d.ts +14 -0
  80. package/dist/types/transport/transportAdapter.d.ts +10 -0
  81. package/dist/types/transport/wechatTransport.d.ts +11 -0
  82. package/dist/types/types/api.d.ts +12 -0
  83. package/dist/types/types/env.d.ts +14 -0
  84. package/dist/types/types/logEvent.d.ts +57 -0
  85. package/dist/types/types/logEventLevel.d.ts +2 -0
  86. package/dist/{types.d.ts → types/types/sdkOptions.d.ts} +23 -42
  87. package/dist/types/types/trackOptions.d.ts +7 -0
  88. package/dist/types/utils/environment.d.ts +21 -0
  89. package/dist/types/utils/session.d.ts +1 -0
  90. package/dist/types/utils/tools.d.ts +12 -0
  91. package/dist/types/utils/uuid.d.ts +7 -0
  92. package/dist/umd/logger-sdk.min.js +1 -0
  93. package/package.json +29 -5
  94. package/dist/index.d.ts +0 -10
  95. package/dist/index.js +0 -13
  96. package/dist/loggerSDK.js +0 -560
  97. package/dist/queueManager.js +0 -186
  98. package/dist/retryManager.js +0 -224
  99. package/dist/transportAdapter.d.ts +0 -51
  100. package/dist/transportAdapter.js +0 -315
  101. package/dist/types.js +0 -1
  102. package/dist/utils.d.ts +0 -52
  103. package/dist/utils.js +0 -348
@@ -1,186 +0,0 @@
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
- * @Author : 黄震 huangzhen@yfpharmacy.com
10
- * @Date : 2025-12-18
11
- * @LastEditors : 黄震 huangzhen@yfpharmacy.com
12
- * @LastEditTime : 2026-01-14 09:33:41
13
- * @Description : 队列管理器 - 支持内存队列和持久化存储
14
- * Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
15
- */
16
-
17
- import { isBrowser, isWeChatMiniProgram, logDebug, safeStringify } from "./utils";
18
-
19
- /** 队列配置选项 */
20
-
21
- /**
22
- * 队列管理器
23
- * - 内存队列:快速访问
24
- * - 持久化存储:防止页面刷新/关闭时数据丢失
25
- */
26
- export var QueueManager = /*#__PURE__*/function () {
27
- function QueueManager(options) {
28
- _classCallCheck(this, QueueManager);
29
- _defineProperty(this, "queue", []);
30
- _defineProperty(this, "opts", void 0);
31
- _defineProperty(this, "storageKey", void 0);
32
- this.opts = options;
33
- this.storageKey = "".concat(options.storagePrefix, "_queue");
34
-
35
- // 从持久化存储恢复队列
36
- if (this.opts.enableStorage) {
37
- this.loadFromStorage();
38
- }
39
- }
40
-
41
- /**
42
- * 添加日志到队列
43
- */
44
- _createClass(QueueManager, [{
45
- key: "enqueue",
46
- value: function enqueue(event) {
47
- // 队列已满,丢弃最旧的日志
48
- if (this.queue.length >= this.opts.maxSize) {
49
- this.queue.shift();
50
- logDebug(this.opts.debug, 'Queue full, dropped oldest event');
51
- }
52
- this.queue.push(event);
53
- logDebug(this.opts.debug, 'Enqueued event', event);
54
-
55
- // 持久化到存储
56
- if (this.opts.enableStorage) {
57
- this.saveToStorage();
58
- }
59
- return true;
60
- }
61
-
62
- /**
63
- * 批量获取日志(不移除)
64
- */
65
- }, {
66
- key: "peek",
67
- value: function peek(count) {
68
- return this.queue.slice(0, count);
69
- }
70
-
71
- /**
72
- * 批量移除日志
73
- */
74
- }, {
75
- key: "dequeue",
76
- value: function dequeue(count) {
77
- var items = this.queue.splice(0, count);
78
- logDebug(this.opts.debug, "Dequeued ".concat(items.length, " events"));
79
-
80
- // 更新持久化存储
81
- if (this.opts.enableStorage) {
82
- this.saveToStorage();
83
- }
84
- return items;
85
- }
86
-
87
- /**
88
- * 获取队列长度
89
- */
90
- }, {
91
- key: "size",
92
- value: function size() {
93
- return this.queue.length;
94
- }
95
-
96
- /**
97
- * 清空队列
98
- */
99
- }, {
100
- key: "clear",
101
- value: function clear() {
102
- this.queue = [];
103
- logDebug(this.opts.debug, 'Queue cleared');
104
- if (this.opts.enableStorage) {
105
- this.removeFromStorage();
106
- }
107
- }
108
-
109
- /**
110
- * 从持久化存储加载队列
111
- */
112
- }, {
113
- key: "loadFromStorage",
114
- value: function loadFromStorage() {
115
- try {
116
- var stored = null;
117
-
118
- // 微信小程序环境
119
- if (isWeChatMiniProgram()) {
120
- // @ts-ignore
121
- stored = wx.getStorageSync(this.storageKey);
122
- }
123
- // 浏览器环境
124
- else if (isBrowser() && typeof localStorage !== 'undefined') {
125
- stored = localStorage.getItem(this.storageKey);
126
- }
127
- if (stored) {
128
- var parsed = JSON.parse(stored);
129
- if (Array.isArray(parsed)) {
130
- this.queue = parsed.slice(0, this.opts.maxSize);
131
- logDebug(this.opts.debug, "Loaded ".concat(this.queue.length, " events from storage"));
132
- }
133
- }
134
- } catch (error) {
135
- logDebug(this.opts.debug, 'Failed to load queue from storage', error);
136
- // 加载失败不影响运行,使用空队列
137
- }
138
- }
139
-
140
- /**
141
- * 保存队列到持久化存储
142
- */
143
- }, {
144
- key: "saveToStorage",
145
- value: function saveToStorage() {
146
- try {
147
- var data = safeStringify(this.queue);
148
-
149
- // 微信小程序环境
150
- if (isWeChatMiniProgram()) {
151
- // @ts-ignore
152
- wx.setStorageSync(this.storageKey, data);
153
- }
154
- // 浏览器环境
155
- else if (isBrowser() && typeof localStorage !== 'undefined') {
156
- localStorage.setItem(this.storageKey, data);
157
- }
158
- } catch (error) {
159
- logDebug(this.opts.debug, 'Failed to save queue to storage', error);
160
- // 保存失败不影响运行
161
- }
162
- }
163
-
164
- /**
165
- * 从持久化存储移除队列
166
- */
167
- }, {
168
- key: "removeFromStorage",
169
- value: function removeFromStorage() {
170
- try {
171
- // 微信小程序环境
172
- if (isWeChatMiniProgram()) {
173
- // @ts-ignore
174
- wx.removeStorageSync(this.storageKey);
175
- }
176
- // 浏览器环境
177
- else if (isBrowser() && typeof localStorage !== 'undefined') {
178
- localStorage.removeItem(this.storageKey);
179
- }
180
- } catch (error) {
181
- logDebug(this.opts.debug, 'Failed to remove queue from storage', error);
182
- }
183
- }
184
- }]);
185
- return QueueManager;
186
- }();
@@ -1,224 +0,0 @@
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 _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; }
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); } }
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); }); }; }
5
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6
- 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); } }
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
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; }
9
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
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
- /*
12
- * @Author : 黄震 huangzhen@yfpharmacy.com
13
- * @Date : 2025-12-18
14
- * @LastEditors : 黄震 huangzhen@yfpharmacy.com
15
- * @LastEditTime : 2026-01-14 10:38:45
16
- * @Description : 重试管理器 - 支持指数退避策略
17
- * Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
18
- */
19
-
20
- import { logDebug } from "./utils";
21
-
22
- /** 重试配置选项 */
23
-
24
- /** 重试任务 */
25
-
26
- /**
27
- * 重试管理器
28
- * - 支持自定义重试次数
29
- * - 支持指数退避策略(exponential backoff)
30
- * - 防止重复重试同一任务
31
- */
32
- export var RetryManager = /*#__PURE__*/function () {
33
- function RetryManager(options) {
34
- _classCallCheck(this, RetryManager);
35
- _defineProperty(this, "opts", void 0);
36
- _defineProperty(this, "retryingTasks", new Map());
37
- this.opts = options;
38
- }
39
-
40
- /**
41
- * 执行带重试的任务
42
- * @param taskId - 任务唯一标识
43
- * @param fn - 要执行的异步函数
44
- * @returns Promise
45
- */
46
- _createClass(RetryManager, [{
47
- key: "executeWithRetry",
48
- value: (function () {
49
- var _executeWithRetry = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(taskId, fn) {
50
- var task, result;
51
- return _regeneratorRuntime().wrap(function _callee$(_context) {
52
- while (1) switch (_context.prev = _context.next) {
53
- case 0:
54
- if (!this.retryingTasks.has(taskId)) {
55
- _context.next = 3;
56
- break;
57
- }
58
- logDebug(this.opts.debug, "Task ".concat(taskId, " already retrying, skipped"));
59
- throw new Error("Task ".concat(taskId, " already retrying"));
60
- case 3:
61
- task = {
62
- id: taskId,
63
- fn: fn,
64
- retries: 0,
65
- maxRetries: this.opts.maxRetries,
66
- baseDelay: this.opts.baseDelay,
67
- useBackoff: this.opts.useBackoff
68
- };
69
- this.retryingTasks.set(taskId, task);
70
- _context.prev = 5;
71
- _context.next = 8;
72
- return this.executeTask(task);
73
- case 8:
74
- result = _context.sent;
75
- this.retryingTasks.delete(taskId);
76
- return _context.abrupt("return", result);
77
- case 13:
78
- _context.prev = 13;
79
- _context.t0 = _context["catch"](5);
80
- this.retryingTasks.delete(taskId);
81
- throw _context.t0;
82
- case 17:
83
- case "end":
84
- return _context.stop();
85
- }
86
- }, _callee, this, [[5, 13]]);
87
- }));
88
- function executeWithRetry(_x, _x2) {
89
- return _executeWithRetry.apply(this, arguments);
90
- }
91
- return executeWithRetry;
92
- }()
93
- /**
94
- * 执行任务(带重试逻辑)
95
- */
96
- )
97
- }, {
98
- key: "executeTask",
99
- value: (function () {
100
- var _executeTask = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(task) {
101
- var result, delay;
102
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
103
- while (1) switch (_context2.prev = _context2.next) {
104
- case 0:
105
- if (!(task.retries <= task.maxRetries)) {
106
- _context2.next = 21;
107
- break;
108
- }
109
- _context2.prev = 1;
110
- _context2.next = 4;
111
- return task.fn();
112
- case 4:
113
- result = _context2.sent;
114
- if (task.retries > 0) {
115
- this.logDebug("Task ".concat(task.id, " succeeded after ").concat(task.retries, " retries"));
116
- }
117
- return _context2.abrupt("return", result);
118
- case 9:
119
- _context2.prev = 9;
120
- _context2.t0 = _context2["catch"](1);
121
- // eslint-disable-next-line no-param-reassign
122
- task.retries += 1;
123
-
124
- // 达到最大重试次数
125
- if (!(task.retries > task.maxRetries)) {
126
- _context2.next = 15;
127
- break;
128
- }
129
- this.logDebug("Task ".concat(task.id, " failed after ").concat(task.maxRetries, " retries"));
130
- throw _context2.t0;
131
- case 15:
132
- // 计算延迟时间
133
- delay = RetryManager.calculateDelay(task.retries, task.baseDelay, task.useBackoff);
134
- this.logDebug("Task ".concat(task.id, " failed (attempt ").concat(task.retries, "/").concat(task.maxRetries, "), retrying in ").concat(delay, "ms"));
135
-
136
- // @ts-ignore
137
- // 等待后重试
138
- // eslint-disable-next-line no-await-in-loop
139
- _context2.next = 19;
140
- return RetryManager.sleep(delay);
141
- case 19:
142
- _context2.next = 0;
143
- break;
144
- case 21:
145
- throw new Error("Task ".concat(task.id, " exceeded max retries"));
146
- case 22:
147
- case "end":
148
- return _context2.stop();
149
- }
150
- }, _callee2, this, [[1, 9]]);
151
- }));
152
- function executeTask(_x3) {
153
- return _executeTask.apply(this, arguments);
154
- }
155
- return executeTask;
156
- }()
157
- /**
158
- * 计算延迟时间
159
- * @param attempt - 当前重试次数
160
- * @param baseDelay - 基础延迟时间
161
- * @param useBackoff - 是否使用指数退避
162
- * @returns 延迟时间(毫秒)
163
- */
164
- )
165
- }, {
166
- key: "getRetryingCount",
167
- value:
168
- /**
169
- * 获取正在重试的任务数量
170
- */
171
- function getRetryingCount() {
172
- return this.retryingTasks.size;
173
- }
174
-
175
- /**
176
- * 清空所有重试任务
177
- */
178
- }, {
179
- key: "clear",
180
- value: function clear() {
181
- this.retryingTasks.clear();
182
- }
183
-
184
- /**
185
- * 调试日志
186
- */
187
- }, {
188
- key: "logDebug",
189
- value: function logDebug() {
190
- if (this.opts.debug) {
191
- var _console;
192
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
193
- args[_key] = arguments[_key];
194
- }
195
- (_console = console).debug.apply(_console, ['[RetryManager]'].concat(args));
196
- }
197
- }
198
- }], [{
199
- key: "calculateDelay",
200
- value: function calculateDelay(attempt, baseDelay, useBackoff) {
201
- if (!useBackoff) {
202
- return baseDelay;
203
- }
204
- var factor = Math.pow(2, attempt - 1);
205
- var delay = baseDelay * factor;
206
- var jitterRatio = 0.3;
207
- var maxDelay = 30000;
208
- var jitter = Math.random() * jitterRatio * delay;
209
- return Math.min(delay + jitter, maxDelay);
210
- }
211
-
212
- /**
213
- * 睡眠函数
214
- */
215
- }, {
216
- key: "sleep",
217
- value: function sleep(ms) {
218
- return new Promise(function (resolve) {
219
- return setTimeout(resolve, ms);
220
- });
221
- }
222
- }]);
223
- return RetryManager;
224
- }();
@@ -1,51 +0,0 @@
1
- import { SDKOptions } from './types';
2
- /** 传输选项接口 */
3
- export interface TransportOptions extends Omit<SDKOptions, 'endpoint'> {
4
- endpoint: string;
5
- }
6
- /** 传输适配器接口 */
7
- export interface TransportAdapter {
8
- /** 适配器名称 */
9
- name: string;
10
- /** 是否支持当前环境 */
11
- isSupported(opts?: TransportOptions): boolean;
12
- /** 发送数据 */
13
- send(payload: any, opts?: TransportOptions): Promise<void>;
14
- }
15
- /**
16
- * Beacon 传输适配器
17
- * - 兼容性:现代浏览器(Chrome 39+, Firefox 31+, Edge 14+)
18
- * - 健壮性:页面卸载时可靠传输、不阻塞页面卸载
19
- * - 适用场景:页面关闭、visibilitychange、pagehide、beforeunload 事件
20
- * - 限制:无法获取响应、队列有大小限制(通常 64KB)
21
- */
22
- export declare const beaconTransport: TransportAdapter;
23
- /**
24
- * 微信小程序传输适配器
25
- * - 兼容性:微信小程序环境
26
- * - 健壮性:支持超时控制、完善的错误处理
27
- * - 适用场景:微信小程序环境下的日志上报
28
- */
29
- export declare const wechatTransport: TransportAdapter;
30
- /**
31
- * Image 像素上报适配器
32
- * - 兼容性:所有浏览器
33
- * - 健壮性:轻量级、无跨域限制、支持超时控制
34
- * - 适用场景:数据量小的快速上报、跨域场景、降级方案
35
- * - 限制:URL 长度限制(默认 1900 字符)
36
- */
37
- export declare const imageTransport: TransportAdapter;
38
- /**
39
- * 默认传输函数 - 按环境选择最佳传输方式
40
- * 浏览器策略:Beacon(可靠) > Image(兼容)
41
- * 微信小程序策略:WeChat Request
42
- */
43
- export declare function defaultTransport(payload: any, opts?: TransportOptions): Promise<void>;
44
- /**
45
- * 导出所有适配器,方便自定义使用
46
- */
47
- export declare const TransportAdapters: {
48
- beacon: TransportAdapter;
49
- wechat: TransportAdapter;
50
- image: TransportAdapter;
51
- };