@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.
@@ -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 : 2025-12-18
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.logDebug("Task ".concat(taskId, " already retrying, skipped"));
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 = this.calculateDelay(task.retries, task.baseDelay, task.useBackoff);
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 this.sleep(delay);
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: "calculateDelay",
162
- value: function calculateDelay(attempt, baseDelay, useBackoff) {
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
  }();
@@ -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 = (opts === null || opts === void 0 ? void 0 : opts.pixelParam) || 'data';
185
- maxLen = (opts === null || opts === void 0 ? void 0 : opts.maxPixelUrlLen) || 1900; // 构建 URL
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
- /** 环境标识:prod/stage/dev */
55
- env: Env;
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
- stack?: string;
62
- /** 发生页面 URL */
63
- url: string;
73
+ throwable?: string;
64
74
  /** 可选:用户 ID(脱敏) */
65
75
  userId?: string;
66
- /** 会话标识 */
67
- sessionId: string;
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 : 2025-12-30 16:46:31
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.6",
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": "npm i",
28
+ "init-install": "yarn install",
29
29
  "build-types": "tsc",
30
30
  "build": "father build",
31
31
  "test": "vitest run",