@pluve/logger-sdk 0.0.6 → 0.0.7
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.
- package/README.md +122 -455
- package/dist/loggerSDK.d.ts +8 -15
- package/dist/loggerSDK.js +118 -131
- package/dist/queueManager.d.ts +0 -4
- package/dist/queueManager.js +10 -25
- package/dist/retryManager.d.ts +2 -2
- package/dist/retryManager.js +36 -35
- package/dist/transportAdapter.js +2 -2
- package/dist/types.d.ts +29 -19
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +43 -1
- package/package.json +2 -2
- package/README.html +0 -982
package/dist/retryManager.js
CHANGED
|
@@ -12,11 +12,13 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
|
|
|
12
12
|
* @Author : 黄震 huangzhen@yfpharmacy.com
|
|
13
13
|
* @Date : 2025-12-18
|
|
14
14
|
* @LastEditors : 黄震 huangzhen@yfpharmacy.com
|
|
15
|
-
* @LastEditTime :
|
|
15
|
+
* @LastEditTime : 2026-01-14 10:38:45
|
|
16
16
|
* @Description : 重试管理器 - 支持指数退避策略
|
|
17
17
|
* Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
+
import { logDebug } from "./utils";
|
|
21
|
+
|
|
20
22
|
/** 重试配置选项 */
|
|
21
23
|
|
|
22
24
|
/** 重试任务 */
|
|
@@ -53,7 +55,7 @@ export var RetryManager = /*#__PURE__*/function () {
|
|
|
53
55
|
_context.next = 3;
|
|
54
56
|
break;
|
|
55
57
|
}
|
|
56
|
-
this.
|
|
58
|
+
logDebug(this.opts.debug, "Task ".concat(taskId, " already retrying, skipped"));
|
|
57
59
|
throw new Error("Task ".concat(taskId, " already retrying"));
|
|
58
60
|
case 3:
|
|
59
61
|
task = {
|
|
@@ -116,6 +118,7 @@ export var RetryManager = /*#__PURE__*/function () {
|
|
|
116
118
|
case 9:
|
|
117
119
|
_context2.prev = 9;
|
|
118
120
|
_context2.t0 = _context2["catch"](1);
|
|
121
|
+
// eslint-disable-next-line no-param-reassign
|
|
119
122
|
task.retries += 1;
|
|
120
123
|
|
|
121
124
|
// 达到最大重试次数
|
|
@@ -127,12 +130,14 @@ export var RetryManager = /*#__PURE__*/function () {
|
|
|
127
130
|
throw _context2.t0;
|
|
128
131
|
case 15:
|
|
129
132
|
// 计算延迟时间
|
|
130
|
-
delay =
|
|
133
|
+
delay = RetryManager.calculateDelay(task.retries, task.baseDelay, task.useBackoff);
|
|
131
134
|
this.logDebug("Task ".concat(task.id, " failed (attempt ").concat(task.retries, "/").concat(task.maxRetries, "), retrying in ").concat(delay, "ms"));
|
|
132
135
|
|
|
136
|
+
// @ts-ignore
|
|
133
137
|
// 等待后重试
|
|
138
|
+
// eslint-disable-next-line no-await-in-loop
|
|
134
139
|
_context2.next = 19;
|
|
135
|
-
return
|
|
140
|
+
return RetryManager.sleep(delay);
|
|
136
141
|
case 19:
|
|
137
142
|
_context2.next = 0;
|
|
138
143
|
break;
|
|
@@ -158,40 +163,12 @@ export var RetryManager = /*#__PURE__*/function () {
|
|
|
158
163
|
*/
|
|
159
164
|
)
|
|
160
165
|
}, {
|
|
161
|
-
key: "
|
|
162
|
-
value:
|
|
163
|
-
if (!useBackoff) {
|
|
164
|
-
return baseDelay;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// 指数退避策略:baseDelay * 2^(attempt-1)
|
|
168
|
-
// 第1次重试:baseDelay * 2^0 = baseDelay
|
|
169
|
-
// 第2次重试:baseDelay * 2^1 = baseDelay * 2
|
|
170
|
-
// 第3次重试:baseDelay * 2^2 = baseDelay * 4
|
|
171
|
-
var delay = baseDelay * Math.pow(2, attempt - 1);
|
|
172
|
-
|
|
173
|
-
// 添加随机抖动,避免惊群效应(thundering herd)
|
|
174
|
-
var jitter = Math.random() * 0.3 * delay; // 0-30% 的随机抖动
|
|
175
|
-
return Math.min(delay + jitter, 30000); // 最大不超过 30 秒
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* 睡眠函数
|
|
180
|
-
*/
|
|
181
|
-
}, {
|
|
182
|
-
key: "sleep",
|
|
183
|
-
value: function sleep(ms) {
|
|
184
|
-
return new Promise(function (resolve) {
|
|
185
|
-
return setTimeout(resolve, ms);
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
166
|
+
key: "getRetryingCount",
|
|
167
|
+
value:
|
|
189
168
|
/**
|
|
190
169
|
* 获取正在重试的任务数量
|
|
191
170
|
*/
|
|
192
|
-
|
|
193
|
-
key: "getRetryingCount",
|
|
194
|
-
value: function getRetryingCount() {
|
|
171
|
+
function getRetryingCount() {
|
|
195
172
|
return this.retryingTasks.size;
|
|
196
173
|
}
|
|
197
174
|
|
|
@@ -218,6 +195,30 @@ export var RetryManager = /*#__PURE__*/function () {
|
|
|
218
195
|
(_console = console).debug.apply(_console, ['[RetryManager]'].concat(args));
|
|
219
196
|
}
|
|
220
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
|
+
}
|
|
221
222
|
}]);
|
|
222
223
|
return RetryManager;
|
|
223
224
|
}();
|
package/dist/transportAdapter.js
CHANGED
|
@@ -181,8 +181,8 @@ export var imageTransport = {
|
|
|
181
181
|
case 0:
|
|
182
182
|
body = typeof payload === 'string' ? payload : safeStringify(payload);
|
|
183
183
|
endpoint = getEndpoint(opts);
|
|
184
|
-
param =
|
|
185
|
-
maxLen = (opts === null || opts === void 0 ? void 0 : opts.maxPixelUrlLen) ||
|
|
184
|
+
param = 'data'; // opts?.pixelParam || 'data';
|
|
185
|
+
maxLen = (opts === null || opts === void 0 ? void 0 : opts.maxPixelUrlLen) || 4096; // 构建 URL
|
|
186
186
|
cacheBuster = "_=".concat(now());
|
|
187
187
|
qs = "".concat(param, "=").concat(encodeURIComponent(body), "&").concat(cacheBuster);
|
|
188
188
|
url = endpoint.includes('?') ? "".concat(endpoint, "&").concat(qs) : "".concat(endpoint, "?").concat(qs); // URL 长度检查
|
package/dist/types.d.ts
CHANGED
|
@@ -14,16 +14,14 @@ export interface SDKOptions {
|
|
|
14
14
|
env?: Env;
|
|
15
15
|
/** 是否开启调试模式 */
|
|
16
16
|
debug?: boolean;
|
|
17
|
-
/** 像素上报参数名,默认 'data' */
|
|
18
|
-
pixelParam?: string;
|
|
19
|
-
/** 像素上报 URL 最大长度,默认 1900 */
|
|
20
|
-
maxPixelUrlLen?: number;
|
|
21
|
-
/** 是否启用 gzip 压缩,默认 false */
|
|
22
|
-
enableGzip?: boolean;
|
|
23
17
|
/** 是否启用批量上报,默认 true */
|
|
24
18
|
enableBatch?: boolean;
|
|
25
19
|
/** 批量上报最大数量,默认 10 */
|
|
26
20
|
batchSize?: number;
|
|
21
|
+
/** 是否启用 gzip 压缩,默认 true */
|
|
22
|
+
enableGzip?: boolean;
|
|
23
|
+
/** 最大像素图 URL 长度,默认 1900 */
|
|
24
|
+
maxPixelUrlLen?: number;
|
|
27
25
|
/** 批量上报时间间隔(毫秒),默认 5000 */
|
|
28
26
|
batchInterval?: number;
|
|
29
27
|
/** 队列最大长度,默认 100 */
|
|
@@ -40,31 +38,43 @@ export interface SDKOptions {
|
|
|
40
38
|
retryDelay?: number;
|
|
41
39
|
/** 是否使用指数退避策略,默认 true */
|
|
42
40
|
retryBackoff?: boolean;
|
|
41
|
+
/** 可选:用户 ID(脱敏) */
|
|
42
|
+
userId?: string;
|
|
43
|
+
/** 可选:店铺编码 */
|
|
44
|
+
storeCode?: string;
|
|
43
45
|
}
|
|
46
|
+
export type TrackOptions = {
|
|
47
|
+
message: string;
|
|
48
|
+
error?: Error;
|
|
49
|
+
traceId?: string;
|
|
50
|
+
logLevel?: LogEventLevel;
|
|
51
|
+
};
|
|
44
52
|
/** 标准化日志上报格式 */
|
|
45
53
|
export interface LogEvent {
|
|
54
|
+
/** 日志 ID */
|
|
46
55
|
logId: string;
|
|
47
|
-
traceId?: string;
|
|
48
|
-
/** 事件类型:error/crash/pageview/custom/session_start */
|
|
49
|
-
eventType: LogEventType;
|
|
50
|
-
/** 毫秒时间戳 */
|
|
51
|
-
ts: number;
|
|
52
56
|
/** 应用标识 */
|
|
53
57
|
appId: string;
|
|
54
|
-
/**
|
|
55
|
-
|
|
58
|
+
/** 环境标识 */
|
|
59
|
+
stage: string;
|
|
56
60
|
/** 日志级别:info/warn/error/fatal */
|
|
57
61
|
level: LogEventLevel;
|
|
58
|
-
/**
|
|
62
|
+
/** 可选:跟踪 ID(跨服务调用链跟踪) */
|
|
63
|
+
traceId?: string;
|
|
64
|
+
/** 会话标识,同 sessionId */
|
|
65
|
+
frontendId: string;
|
|
66
|
+
/** 发生页面 URL */
|
|
67
|
+
url?: string;
|
|
68
|
+
/** 异常发生位置,结构待定 */
|
|
69
|
+
location: string;
|
|
70
|
+
/** 异常信息 */
|
|
59
71
|
message: string;
|
|
60
72
|
/** 可选:堆栈信息(长字符串) */
|
|
61
|
-
|
|
62
|
-
/** 发生页面 URL */
|
|
63
|
-
url: string;
|
|
73
|
+
throwable?: string;
|
|
64
74
|
/** 可选:用户 ID(脱敏) */
|
|
65
75
|
userId?: string;
|
|
66
|
-
/**
|
|
67
|
-
|
|
76
|
+
/** 可选:店铺编码 */
|
|
77
|
+
storeCode?: string;
|
|
68
78
|
/** 可选的结构化额外信息 */
|
|
69
79
|
tags?: Record<string, any>;
|
|
70
80
|
}
|
package/dist/utils.d.ts
CHANGED
|
@@ -45,3 +45,8 @@ export declare function parseBrowserInfo(userAgent: string): {
|
|
|
45
45
|
os: string;
|
|
46
46
|
osVersion: string;
|
|
47
47
|
};
|
|
48
|
+
/**
|
|
49
|
+
* 收集环境信息并生成 tags(仅在初始化时执行一次)
|
|
50
|
+
*/
|
|
51
|
+
export declare function collectEnvironmentTags(debug: boolean): Record<string, any>;
|
|
52
|
+
export declare function logDebug(debug: boolean, ...args: any[]): void;
|
package/dist/utils.js
CHANGED
|
@@ -12,7 +12,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
|
|
|
12
12
|
* @Author : 黄震 huangzhen@yfpharmacy.com
|
|
13
13
|
* @Date : 2025-11-21 14:31:33
|
|
14
14
|
* @LastEditors : 黄震 huangzhen@yfpharmacy.com
|
|
15
|
-
* @LastEditTime :
|
|
15
|
+
* @LastEditTime : 2026-01-14 10:12:15
|
|
16
16
|
* @Description : utils 工具函数
|
|
17
17
|
* Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
|
|
18
18
|
*/
|
|
@@ -303,4 +303,46 @@ export function parseBrowserInfo(userAgent) {
|
|
|
303
303
|
os: os,
|
|
304
304
|
osVersion: osVersion
|
|
305
305
|
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* 收集环境信息并生成 tags(仅在初始化时执行一次)
|
|
310
|
+
*/
|
|
311
|
+
export function collectEnvironmentTags(debug) {
|
|
312
|
+
var envInfo = getEnvironmentInfo();
|
|
313
|
+
var tags = {
|
|
314
|
+
platform: envInfo.platform
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
// 浏览器环境
|
|
318
|
+
if (envInfo.platform === 'browser' && envInfo.userAgent) {
|
|
319
|
+
var browserInfo = parseBrowserInfo(envInfo.userAgent);
|
|
320
|
+
tags.browser = browserInfo.browser;
|
|
321
|
+
tags.browserVersion = browserInfo.browserVersion;
|
|
322
|
+
tags.os = browserInfo.os;
|
|
323
|
+
tags.osVersion = browserInfo.osVersion;
|
|
324
|
+
tags.screenWidth = envInfo.screenWidth;
|
|
325
|
+
tags.screenHeight = envInfo.screenHeight;
|
|
326
|
+
tags.language = envInfo.language;
|
|
327
|
+
}
|
|
328
|
+
// 微信小程序环境
|
|
329
|
+
else if (envInfo.platform === 'wechat' && envInfo.systemInfo) {
|
|
330
|
+
tags.brand = envInfo.systemInfo.brand;
|
|
331
|
+
tags.model = envInfo.systemInfo.model;
|
|
332
|
+
tags.system = envInfo.systemInfo.system;
|
|
333
|
+
tags.wechatVersion = envInfo.systemInfo.version;
|
|
334
|
+
tags.SDKVersion = envInfo.systemInfo.SDKVersion;
|
|
335
|
+
tags.screenWidth = envInfo.screenWidth;
|
|
336
|
+
tags.screenHeight = envInfo.screenHeight;
|
|
337
|
+
tags.language = envInfo.language;
|
|
338
|
+
}
|
|
339
|
+
logDebug(debug, 'Environment tags collected:', tags);
|
|
340
|
+
return tags;
|
|
341
|
+
}
|
|
342
|
+
export function logDebug(debug) {
|
|
343
|
+
var _console;
|
|
344
|
+
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
345
|
+
args[_key - 1] = arguments[_key];
|
|
346
|
+
}
|
|
347
|
+
if (debug) (_console = console).debug.apply(_console, ['[LoggerSDK]'].concat(args));
|
|
306
348
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pluve/logger-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "logger sdk",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"logger"
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"url": "https://gitlab.pharmacyyf.com/frontend-common/pluve-lib.git"
|
|
26
26
|
},
|
|
27
27
|
"scripts": {
|
|
28
|
-
"init-install": "
|
|
28
|
+
"init-install": "yarn install",
|
|
29
29
|
"build-types": "tsc",
|
|
30
30
|
"build": "father build",
|
|
31
31
|
"test": "vitest run",
|