@pluve/logger-sdk 0.0.7 → 0.0.9

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 (100) hide show
  1. package/README.html +681 -0
  2. package/README.md +131 -153
  3. package/dist/cjs/capture/jsError.js +48 -0
  4. package/dist/cjs/capture/promiseError.js +49 -0
  5. package/dist/cjs/capture/resourceError.js +48 -0
  6. package/dist/cjs/capture/wechatError.js +95 -0
  7. package/dist/cjs/compress/compression.js +84 -0
  8. package/dist/cjs/config/index.js +55 -0
  9. package/dist/cjs/core/fingerprint.js +36 -0
  10. package/dist/cjs/core/httpClient.js +96 -0
  11. package/dist/cjs/core/loggerSDK.js +641 -0
  12. package/dist/cjs/core/queueManager.js +249 -0
  13. package/dist/cjs/core/retryManager.js +127 -0
  14. package/dist/cjs/index.js +29 -0
  15. package/dist/cjs/stack/stacktrace.js +48 -0
  16. package/dist/cjs/transport/beaconTransport.js +64 -0
  17. package/dist/cjs/transport/pixelImageTransport.js +100 -0
  18. package/dist/cjs/transport/transport.js +17 -0
  19. package/dist/cjs/transport/transportAdapter.js +56 -0
  20. package/dist/cjs/transport/wechatTransport.js +103 -0
  21. package/dist/cjs/types/api.js +17 -0
  22. package/dist/cjs/types/env.js +17 -0
  23. package/dist/cjs/types/external.d.ts +21 -0
  24. package/dist/cjs/types/logEvent.js +17 -0
  25. package/dist/cjs/types/logEventLevel.js +17 -0
  26. package/dist/cjs/types/sdkOptions.js +17 -0
  27. package/dist/cjs/types/trackOptions.js +17 -0
  28. package/dist/cjs/utils/environment.js +183 -0
  29. package/dist/cjs/utils/session.js +31 -0
  30. package/dist/cjs/utils/tools.js +82 -0
  31. package/dist/cjs/utils/uuid.js +35 -0
  32. package/dist/esm/capture/jsError.js +45 -0
  33. package/dist/esm/capture/promiseError.js +46 -0
  34. package/dist/esm/capture/resourceError.js +24 -0
  35. package/dist/esm/capture/wechatError.js +92 -0
  36. package/dist/esm/compress/compression.js +82 -0
  37. package/dist/esm/config/index.js +28 -0
  38. package/dist/esm/core/fingerprint.js +12 -0
  39. package/dist/esm/core/httpClient.js +95 -0
  40. package/dist/esm/core/loggerSDK.js +650 -0
  41. package/dist/esm/core/queueManager.js +269 -0
  42. package/dist/esm/core/retryManager.js +129 -0
  43. package/dist/esm/index.js +5 -0
  44. package/dist/esm/stack/stacktrace.js +37 -0
  45. package/dist/esm/transport/beaconTransport.js +81 -0
  46. package/dist/esm/transport/pixelImageTransport.js +99 -0
  47. package/dist/esm/transport/transport.js +0 -0
  48. package/dist/esm/transport/transportAdapter.js +32 -0
  49. package/dist/esm/transport/wechatTransport.js +120 -0
  50. package/dist/esm/types/api.js +0 -0
  51. package/dist/esm/types/env.js +0 -0
  52. package/dist/esm/types/external.d.ts +21 -0
  53. package/dist/esm/types/logEvent.js +0 -0
  54. package/dist/esm/types/logEventLevel.js +0 -0
  55. package/dist/esm/types/sdkOptions.js +0 -0
  56. package/dist/esm/types/trackOptions.js +0 -0
  57. package/dist/esm/utils/environment.js +154 -0
  58. package/dist/esm/utils/session.js +7 -0
  59. package/dist/esm/utils/tools.js +76 -0
  60. package/dist/esm/utils/uuid.js +11 -0
  61. package/dist/types/capture/jsError.d.ts +2 -0
  62. package/dist/types/capture/promiseError.d.ts +2 -0
  63. package/dist/types/capture/resourceError.d.ts +2 -0
  64. package/dist/types/capture/wechatError.d.ts +3 -0
  65. package/dist/types/compress/compression.d.ts +10 -0
  66. package/dist/types/config/index.d.ts +9 -0
  67. package/dist/types/core/fingerprint.d.ts +8 -0
  68. package/dist/types/core/httpClient.d.ts +11 -0
  69. package/dist/{loggerSDK.d.ts → types/core/loggerSDK.d.ts} +27 -2
  70. package/dist/{queueManager.d.ts → types/core/queueManager.d.ts} +9 -1
  71. package/dist/{retryManager.d.ts → types/core/retryManager.d.ts} +0 -4
  72. package/dist/types/index.d.ts +1 -0
  73. package/dist/types/stack/stacktrace.d.ts +2 -0
  74. package/dist/types/transport/beaconTransport.d.ts +11 -0
  75. package/dist/types/transport/pixelImageTransport.d.ts +11 -0
  76. package/dist/types/transport/transport.d.ts +14 -0
  77. package/dist/types/transport/transportAdapter.d.ts +10 -0
  78. package/dist/types/transport/wechatTransport.d.ts +11 -0
  79. package/dist/types/types/api.d.ts +12 -0
  80. package/dist/types/types/env.d.ts +14 -0
  81. package/dist/types/types/logEvent.d.ts +57 -0
  82. package/dist/types/types/logEventLevel.d.ts +2 -0
  83. package/dist/{types.d.ts → types/types/sdkOptions.d.ts} +23 -42
  84. package/dist/types/types/trackOptions.d.ts +7 -0
  85. package/dist/types/utils/environment.d.ts +21 -0
  86. package/dist/types/utils/session.d.ts +1 -0
  87. package/dist/types/utils/tools.d.ts +12 -0
  88. package/dist/types/utils/uuid.d.ts +7 -0
  89. package/dist/umd/logger-sdk.min.js +1 -0
  90. package/package.json +29 -5
  91. package/dist/index.d.ts +0 -10
  92. package/dist/index.js +0 -13
  93. package/dist/loggerSDK.js +0 -560
  94. package/dist/queueManager.js +0 -186
  95. package/dist/retryManager.js +0 -224
  96. package/dist/transportAdapter.d.ts +0 -51
  97. package/dist/transportAdapter.js +0 -315
  98. package/dist/types.js +0 -1
  99. package/dist/utils.d.ts +0 -52
  100. package/dist/utils.js +0 -348
package/README.md CHANGED
@@ -1,168 +1,146 @@
1
- # @pluve/logger-sdk 使用说明
1
+ # Logger SDK v2 说明文档
2
2
 
3
3
  ## 概览
4
- - 轻量级前端日志采集 SDK,支持浏览器与微信小程序
5
- - 传输优先级:Beacon(页面卸载可靠)→ Image(像素降级);小程序使用 wx.request
6
- - 支持:批量上报(默认关闭)、重试与指数退避、持久化队列、自动卸载刷新
7
- - 会话锁定:init 时生成并锁定 sessionId,destroy 前所有日志使用同一会话
8
4
 
9
- ## 安装与引入
10
- - 安装:`yarn add @pluve/logger-sdk`
11
- - ESM:`import { LoggerSDK } from '@pluve/logger-sdk'`
12
- - UMD:构建后全局为 `LoggerSDK`
5
+ - 跨环境支持:浏览器与微信小程序
6
+ - 采集与采样:开关、日志等级白名单、分级/来源/路径采样率
7
+ - 传输适配:Beacon、像素图 Image、微信 `wx.request`
8
+ - 批量与队列:批量阈值与定时器、队列持久化(localforage)
9
+ - 重试策略:可配置最大次数与指数退避
10
+ - 压缩能力:可选 gzip 压缩,优先使用浏览器 CompressionStream,回退 fflate.gzipSync
11
+
12
+ ## 快速开始
13
13
 
14
- ## 快速开始(单例 + init)
15
14
  ```ts
16
- import { LoggerSDK } from '@pluve/logger-sdk';
15
+ import { LoggerSDK } from './core/loggerSDK';
17
16
 
18
17
  const sdk = LoggerSDK.getInstance();
18
+
19
19
  sdk.init({
20
- endpoint: '/api/log',
21
- appId: 'web-shop',
22
- env: 'prod', // prod/stage/dev
20
+ // endpoint: 'https://logger.yfpharmacy.com/log', // 实际使用以 config 中 API 为准
21
+ appId: 'fe-vue-pc-seed-frontend',
22
+ env: 'develop',
23
+ logStage: 'develop',
23
24
  debug: true,
24
- // enableBatch: true, // 默认 false,如需开启批量
25
- });
26
-
27
- // 可选:设置用户与店铺编码,后续上报自动携带
28
- sdk.identify('user_123');
29
- sdk.setStoreCode('STORE_001');
30
-
31
- // 记录错误(推荐传入 Error,提高定位能力)
32
- await sdk.track({
33
- message: 'TypeError: Cannot read property',
34
- error: new Error('TypeError: Cannot read property'),
35
- traceId: 'trace-abc-123', // 可选
36
- logLevel: 'error', // 可选,默认 'info'
37
- });
38
-
39
- // 记录普通信息
40
- await sdk.track({
41
- message: 'User clicked submit',
42
- logLevel: 'info',
43
- });
44
- ```
45
-
46
- ## 事件数据结构(实际实现)
47
- ```ts
48
- {
49
- // 唯一日志标识:由 appId + UUID + 时间戳组成(非纯 v4)
50
- logId: "web-shop24f8d7ef-1ed4-41fc-8aa8-c1c01cfa5b291767079629320",
51
- traceId: "trace-123456", // 可选
52
- appId: "web-shop",
53
- stage: "prod", // prod/stage/dev
54
- level: "error", // info/warn/error/fatal
55
- message: "TypeError: ...",
56
- stack: "...", // 可选
57
- url: "https://...", // 当前页面
58
- userId: "123", // 可选(建议脱敏)
59
- frontendId: "session_xxx", // init 时锁定的会话标识(同 sessionId)
60
- tags: { // 环境标签(init 时收集)
61
- platform: "browser",
62
- browser: "Chrome",
63
- os: "macOS",
64
- screenWidth: 1920,
65
- screenHeight: 1080,
66
- language: "zh-CN"
67
- }
68
- }
69
- ```
70
-
71
- ## API 与行为
72
- ### 单例与初始化
73
- - `LoggerSDK.getInstance(): LoggerSDK` 获取全局唯一实例
74
- - `init(options: SDKOptions)` 初始化、锁定 `sessionId`、收集环境标签
75
- - `new LoggerSDK(options?: SDKOptions)` 构造时传入 options 会自动 init
76
-
77
- ### SDKOptions(实际默认值)
78
- ```ts
79
- interface SDKOptions {
80
- endpoint: string; // 必填
81
- appId: string; // 必填
82
- env?: 'prod' | 'stage' | 'dev'; // 默认 'dev'
83
- debug?: boolean; // 默认 false
84
- pixelParam?: string; // 默认 'data'
85
- maxPixelUrlLen?: number; // 默认 4096
86
- enableGzip?: boolean; // 默认 true(传输适配器内部处理)
87
- enableBatch?: boolean; // 默认 false(需显式开启)
88
- batchSize?: number; // 默认 10
89
- batchInterval?: number; // 默认 5000 ms
90
- maxQueueSize?: number; // 默认 100
91
- enableStorage?: boolean; // 默认 true(队列持久化)
92
- storagePrefix?: string; // 默认 'logger_sdk'
93
- enableRetry?: boolean; // 默认 true
94
- maxRetries?: number; // 默认 3
95
- retryDelay?: number; // 默认 1000 ms
96
- retryBackoff?: boolean; // 默认 true(指数退避 + 0-30% 抖动,上限 30s)
97
- }
98
- ```
99
-
100
- ### 事件上报
101
- - `track(options: TrackOptions)`
102
- - `message: string`(必填)
103
- - `error?: Error`(推荐在错误场景传入)
104
- - `traceId?: string`
105
- - `logLevel?: 'info' | 'warn' | 'error' | 'fatal'`(默认 'info')
106
- - `logId` 由 `appId + UUID + now()` 组成,保证唯一
107
- - `identify(userId: string)` 设置用户标识(自动随事件上报)
108
- - `setStoreCode(storeCode: string)` 设置店铺编码(自动随事件上报)
109
- - `flush()` 在批量开启时立即上报队列内容
110
- - `destroy()` 停止定时器与重试,刷新队列,清理单例并重置会话锁定
111
-
112
- ### 自动采集
113
- - 浏览器:visibilitychange/pagehide/beforeunload 触发 `flush()`,确保卸载时尽量发送
114
- - 微信小程序:建议在 App 生命周期中调用(SDK 内部识别环境)
115
-
116
- ## 传输适配器
117
- - 默认选择:
118
- - 小程序:`wx.request`
119
- - 浏览器:`navigator.sendBeacon` → 降级到 Image 像素
120
- - Content-Type:
121
- - Beacon:`application/json`;启用 gzip 时为 `application/json; charset=utf-8`
122
- - 小程序:`application/json`;启用 gzip 时为 `application/json; charset=utf-8`
123
- - Image:通过 query 拼接,受 URL 长度限制(默认 4096)
124
-
125
- ## 重试策略(实际实现)
126
- - 启用时对单事件与批量发送采用统一重试
127
- - 指数退避:`baseDelay * (2 ** (attempt - 1))`
128
- - 抖动:`delay * [0, 0.3]`,最大不超过 30000ms
129
- - 防重复:同一 taskId 重试中会拒绝重复执行
130
-
131
- ## 场景示例
132
- ```ts
133
- // 错误监控(浏览器)
134
- window.addEventListener('error', (event) => {
135
- sdk.track({
136
- message: event.message,
137
- error: event.error,
138
- logLevel: 'error',
139
- traceId: `err-${Date.now()}`,
140
- });
141
- });
142
-
143
- // Promise 未捕获
144
- window.addEventListener('unhandledrejection', (event) => {
145
- sdk.track({
146
- message: 'Unhandled Promise Rejection',
147
- error: new Error(String(event.reason)),
148
- logLevel: 'error',
149
- });
25
+ // 采集与性能
26
+ enableGzip: true,
27
+ enableBatch: true,
28
+ batchSize: 10,
29
+ batchInterval: 15000,
30
+ maxPixelUrlLen: 8192,
31
+ // 重试
32
+ enableRetry: true,
33
+ maxRetries: 3,
34
+ retryDelay: 1000,
35
+ retryBackoff: true,
36
+ // 身份与鉴权
37
+ userId: 'u-001',
38
+ storeCode: 's-001',
39
+ token: '<token>',
40
+ // 采样率(可选)
41
+ sampleRate: 1,
150
42
  });
151
43
 
152
- // 页面浏览
44
+ // 业务日志
153
45
  sdk.track({
154
- message: `Pageview: ${document.title}`,
155
- logLevel: 'info',
156
- traceId: `pv-${Date.now()}`,
46
+ message: '用户点击了购买按钮',
47
+ traceId: 'trace-xyz',
48
+ logLevel: 'INFO',
157
49
  });
158
- ```
159
50
 
160
- ## 最佳实践与安全
161
- - 初始化后统一设置用户与店铺信息(`identify`/`setStoreCode`)
162
- - userId/message/stack/tags 建议在业务侧脱敏与裁剪
163
- - 避免在 tags 中上传 cookie/localStorage 原始值、账户/手机号/身份证等敏感信息
51
+ // 动态设置
52
+ sdk.identify('u-002');
53
+ sdk.setStoreCode('s-002');
54
+ sdk.setStage('testing');
55
+ ```
164
56
 
165
- ## 迁移指南(多实例 → 单例 + init)
166
- - 统一在应用入口:`LoggerSDK.getInstance().init(opts)`
167
- - 其他模块直接使用该单例进行 `track/trace/flush`
168
- - 会话边界:登出/身份切换/子应用卸载时调用 `destroy()`,随后重新 `init()`
57
+ ## 配置项(节选)
58
+
59
+ - enableGzip:是否启用 gzip 压缩(默认 true)
60
+ - enableBatch:是否启用批量上报(默认需显式开启)
61
+ - batchSize:批量阈值(默认 10)
62
+ - batchInterval:批量定时器间隔(默认 15000ms)
63
+ - maxPixelUrlLen:像素图 URL 最大长度(默认 8192)
64
+ - enableStorage:队列持久化开关(默认 true)
65
+ - enableRetry/maxRetries/retryDelay/retryBackoff:重试相关配置
66
+ - sampleRate/levelSampleRate/sourceSampleRate/pathSampleRate:采样配置
67
+
68
+ 详细定义参考类型文件:[sdkOptions.ts](src/pages/logger-sdk-tester/logger-sdk-v2/types/sdkOptions.ts).
69
+
70
+ ## 压缩实现
71
+
72
+ - gzipCompress(data)
73
+ - 浏览器支持 CompressionStream 时,流式 gzip 压缩,再转 Base64 字符串
74
+ - 不支持时,回退到 fflate.gzipSync(默认压缩级别),转 Base64
75
+ - 返回值为 Base64 字符串,适用于传输(像素图 URL/JSON 体)
76
+ - 代码参考:[compression.ts](src/pages/logger-sdk-tester/logger-sdk-v2/compress/compression.ts).
77
+ - 备注:当前默认压缩级别,无级别可调参数暴露;如需级别控制可在 fflate 路径引入配置。
78
+
79
+ ## 传输适配
80
+
81
+ - TransportAdapter 根据环境选择传输器:
82
+ - 微信:WechatTransport(wx.request POST,支持 gzip)
83
+ - 浏览器:优先 BeaconTransport(sendBeacon Blob),否则 PixelImageTransport(Image GET)
84
+ - WechatTransport
85
+ - 请求体字符串化 safeStringify
86
+ - enableGzip 时使用 gzipCompress 生成 Base64,Content-Type 设为 `application/json; charset=utf-8`
87
+ - PixelImageTransport
88
+ - 字符串化 items,enableGzip 时压缩为 Base64,URL 参数附带 `gzip=1`
89
+ - 构造像素上报 URL(含 appId、appStage、items、cacheBuster)
90
+ - URL 超长打印警告
91
+ - BeaconTransport
92
+ - 使用 Blob 指定 Content-Type,通过 `navigator.sendBeacon` 发送
93
+
94
+ 代码参考:
95
+
96
+ - 适配器选择:[transportAdapter.ts](src/pages/logger-sdk-tester/logger-sdk-v2/transport/transportAdapter.ts)
97
+ - WeChat:[wechatTransport.ts](src/pages/logger-sdk-tester/logger-sdk-v2/transport/wechatTransport.ts)
98
+ - Pixel Image:[pixelImageTransport.ts](src/pages/logger-sdk-tester/logger-sdk-v2/transport/pixelImageTransport.ts)
99
+ - Beacon:[beaconTransport.ts](src/pages/logger-sdk-tester/logger-sdk-v2/transport/beaconTransport.ts)
100
+
101
+ ## 批量与队列
102
+
103
+ - 启用批量后,事件入队,当队列大小达到 batchSize 或定时器触发时 flush
104
+ - flush:按 appId|stage 分组与分块(最多 200/块),批量发送成功后出队
105
+ - 队列持久化:localforage 存储,页面刷新/卸载可恢复
106
+ - 页面事件触发 flush:visibilitychange(hidden)、pagehide、beforeunload
107
+ - 代码参考:
108
+ - [queueManager.ts](src/pages/logger-sdk-tester/logger-sdk-v2/core/queueManager.ts)
109
+ - [loggerSDK.ts(flush/sendBatch)](src/pages/logger-sdk-tester/logger-sdk-v2/core/loggerSDK.ts#L452-L485)
110
+
111
+ ## 重试策略
112
+
113
+ - 单个事件 sendEvent 与批量 sendBatch 均支持 executeWithRetry
114
+ - 可配置最大次数、基础延迟、指数退避
115
+ - 代码参考:[retryManager.ts](src/pages/logger-sdk-tester/logger-sdk-v2/core/retryManager.ts)
116
+
117
+ ## 采样与开关
118
+
119
+ - 后端注册返回:
120
+ - collectSwitch:采集开关(0 关闭)
121
+ - collectLogLevel:采集日志等级白名单
122
+ - samplingRate:全局采样率
123
+ - 前端 shouldSend:
124
+ - 综合 level/source/path/global 采样率
125
+ - 基于 seed 哈希概率决定是否发送
126
+ - 参考:
127
+ - [loggerSDK.ts(shouldSend)](src/pages/logger-sdk-tester/logger-sdk-v2/core/loggerSDK.ts#L348-L411)
128
+ - [api.ts](src/pages/logger-sdk-tester/logger-sdk-v2/types/api.ts)
129
+
130
+ ## 数据格式
131
+
132
+ - LogEvent:标准化日志格式(logId/seq/appId/stage/level/traceId/frontendId/url/location/message/throwable/userId/storeCode/tags)
133
+ - 类型参考:[logEvent.ts](src/pages/logger-sdk-tester/logger-sdk-v2/types/logEvent.ts)
134
+ - ReportData:上报批次(appId/appStage/items[])
135
+
136
+ ## 限制与注意
137
+
138
+ - Beacon:浏览器与网络环境兼容性依赖,失败仅打印不抛出
139
+ - 像素图:URL 长度受限;压缩可显著降低长度但 Base64 会比二进制略增
140
+ - 压缩:CompressionStream 不提供压缩级别参数;fflate 同步压缩适合小批量数据
141
+ - 安全:不要在日志中包含敏感数据(token、密码、隐私信息等)
142
+
143
+ ## 流程图
144
+
145
+ - 完整 Mermaid 流程图见文件:
146
+ - [logger-sdk.mermaid](src/pages/logger-sdk-tester/logger-sdk-v2/logger-sdk.mermaid)
@@ -0,0 +1,48 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/capture/jsError.ts
20
+ var jsError_exports = {};
21
+ __export(jsError_exports, {
22
+ registerJsErrorCapture: () => registerJsErrorCapture
23
+ });
24
+ module.exports = __toCommonJS(jsError_exports);
25
+ var import_stacktrace = require("../stack/stacktrace");
26
+ var import_tools = require("../utils/tools");
27
+ function registerJsErrorCapture(debug, callback) {
28
+ if (typeof window === "undefined")
29
+ return void 0;
30
+ const handler = async (e) => {
31
+ (0, import_tools.logDebug)(debug, "registerJsErrorCapture error", e);
32
+ if (!e.error)
33
+ return;
34
+ const stack = await (0, import_stacktrace.parseStack)(e.error);
35
+ callback({
36
+ type: "js",
37
+ message: e.error.message,
38
+ stack,
39
+ throwable: e.error.stack || ""
40
+ });
41
+ };
42
+ window.addEventListener("error", handler);
43
+ return () => window.removeEventListener("error", handler);
44
+ }
45
+ // Annotate the CommonJS export names for ESM import in node:
46
+ 0 && (module.exports = {
47
+ registerJsErrorCapture
48
+ });
@@ -0,0 +1,49 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/capture/promiseError.ts
20
+ var promiseError_exports = {};
21
+ __export(promiseError_exports, {
22
+ registerPromiseErrorCapture: () => registerPromiseErrorCapture
23
+ });
24
+ module.exports = __toCommonJS(promiseError_exports);
25
+ var import_stacktrace = require("../stack/stacktrace");
26
+ var import_tools = require("../utils/tools");
27
+ function registerPromiseErrorCapture(debug, callback) {
28
+ if (typeof window === "undefined")
29
+ return void 0;
30
+ const handler = async (e) => {
31
+ (0, import_tools.logDebug)(debug, "registerPromiseErrorCapture unhandledrejection", e);
32
+ const { reason } = e;
33
+ if (reason instanceof Error) {
34
+ const stack = await (0, import_stacktrace.parseStack)(reason);
35
+ callback({
36
+ type: "promise",
37
+ message: reason.message,
38
+ stack,
39
+ throwable: reason.stack || ""
40
+ });
41
+ }
42
+ };
43
+ window.addEventListener("unhandledrejection", handler);
44
+ return () => window.removeEventListener("unhandledrejection", handler);
45
+ }
46
+ // Annotate the CommonJS export names for ESM import in node:
47
+ 0 && (module.exports = {
48
+ registerPromiseErrorCapture
49
+ });
@@ -0,0 +1,48 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/capture/resourceError.ts
20
+ var resourceError_exports = {};
21
+ __export(resourceError_exports, {
22
+ registerResourceErrorCapture: () => registerResourceErrorCapture
23
+ });
24
+ module.exports = __toCommonJS(resourceError_exports);
25
+ var import_tools = require("../utils/tools");
26
+ function registerResourceErrorCapture(debug, callback) {
27
+ if (typeof window === "undefined")
28
+ return void 0;
29
+ const handler = (e) => {
30
+ var _a;
31
+ (0, import_tools.logDebug)(debug, "registerResourceErrorCapture error", e);
32
+ const target = e.target;
33
+ if ((target == null ? void 0 : target.src) || (target == null ? void 0 : target.href)) {
34
+ callback({
35
+ type: "resource",
36
+ message: `Resource load failed: ${(target == null ? void 0 : target.src) || (target == null ? void 0 : target.href)}`,
37
+ stack: [],
38
+ throwable: ((_a = e == null ? void 0 : e.error) == null ? void 0 : _a.stack) || ""
39
+ });
40
+ }
41
+ };
42
+ window.addEventListener("error", handler, true);
43
+ return () => window.removeEventListener("error", handler, true);
44
+ }
45
+ // Annotate the CommonJS export names for ESM import in node:
46
+ 0 && (module.exports = {
47
+ registerResourceErrorCapture
48
+ });
@@ -0,0 +1,95 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/capture/wechatError.ts
20
+ var wechatError_exports = {};
21
+ __export(wechatError_exports, {
22
+ registerWechatErrorCapture: () => registerWechatErrorCapture,
23
+ registerWechatUnhandledCapture: () => registerWechatUnhandledCapture
24
+ });
25
+ module.exports = __toCommonJS(wechatError_exports);
26
+ var import_stacktrace = require("../stack/stacktrace");
27
+ var import_environment = require("../utils/environment");
28
+ var import_tools = require("../utils/tools");
29
+ function registerWechatErrorCapture(debug, callback) {
30
+ if (!(0, import_environment.isWeChatMiniProgram)())
31
+ return void 0;
32
+ try {
33
+ const wxAny = globalThis.wx;
34
+ if (wxAny && typeof wxAny.onError === "function") {
35
+ const handler = async (error) => {
36
+ (0, import_tools.logDebug)(debug, "registerWechatErrorCapture onError", error);
37
+ const msg = String((error == null ? void 0 : error.message) ?? error);
38
+ const err = error instanceof Error ? error : new Error(msg);
39
+ const stack = await (0, import_stacktrace.parseStack)(err);
40
+ callback({
41
+ type: "js",
42
+ message: err.message,
43
+ stack,
44
+ throwable: err.stack || ""
45
+ });
46
+ };
47
+ wxAny.onError(handler);
48
+ return () => {
49
+ try {
50
+ wxAny.offError && wxAny.offError(handler);
51
+ } catch {
52
+ }
53
+ };
54
+ }
55
+ } catch (e) {
56
+ (0, import_tools.logDebug)(debug, "registerWechatErrorCapture attach failed", e);
57
+ }
58
+ return void 0;
59
+ }
60
+ function registerWechatUnhandledCapture(debug, callback) {
61
+ if (!(0, import_environment.isWeChatMiniProgram)())
62
+ return void 0;
63
+ try {
64
+ const wxAny = globalThis.wx;
65
+ if (wxAny && typeof wxAny.onUnhandledRejection === "function") {
66
+ const handler = async (res) => {
67
+ const reason = res == null ? void 0 : res.reason;
68
+ (0, import_tools.logDebug)(debug, "registerWechatUnhandledCapture onUnhandledRejection", reason);
69
+ const err = reason instanceof Error ? reason : new Error(String(reason));
70
+ const stack = await (0, import_stacktrace.parseStack)(err);
71
+ callback({
72
+ type: "promise",
73
+ message: err.message,
74
+ stack,
75
+ throwable: err.stack || ""
76
+ });
77
+ };
78
+ wxAny.onUnhandledRejection(handler);
79
+ return () => {
80
+ try {
81
+ wxAny.offUnhandledRejection && wxAny.offUnhandledRejection(handler);
82
+ } catch {
83
+ }
84
+ };
85
+ }
86
+ } catch (e) {
87
+ (0, import_tools.logDebug)(debug, "registerWechatUnhandledCapture attach failed", e);
88
+ }
89
+ return void 0;
90
+ }
91
+ // Annotate the CommonJS export names for ESM import in node:
92
+ 0 && (module.exports = {
93
+ registerWechatErrorCapture,
94
+ registerWechatUnhandledCapture
95
+ });
@@ -0,0 +1,84 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/compress/compression.ts
20
+ var compression_exports = {};
21
+ __export(compression_exports, {
22
+ gzipCompress: () => gzipCompress,
23
+ isGzipSupported: () => isGzipSupported
24
+ });
25
+ module.exports = __toCommonJS(compression_exports);
26
+ var import_fflate = require("fflate");
27
+ var import_js_base64 = require("js-base64");
28
+ var import_environment = require("../utils/environment");
29
+ function toUtf8Bytes(s) {
30
+ if (typeof TextEncoder !== "undefined") {
31
+ return new TextEncoder().encode(s);
32
+ }
33
+ const enc = encodeURIComponent(s);
34
+ const out = [];
35
+ for (let i = 0; i < enc.length; i += 1) {
36
+ const c = enc[i];
37
+ if (c === "%") {
38
+ out.push(parseInt(enc.slice(i + 1, i + 3), 16));
39
+ i += 2;
40
+ } else {
41
+ out.push(c.charCodeAt(0));
42
+ }
43
+ }
44
+ return new Uint8Array(out);
45
+ }
46
+ async function gzipCompress(data) {
47
+ if ((0, import_environment.isBrowser)() && typeof CompressionStream !== "undefined") {
48
+ try {
49
+ const encoder = new TextEncoder();
50
+ const input = encoder.encode(data);
51
+ const gzip = new CompressionStream("gzip");
52
+ const readable = new Blob([input]).stream();
53
+ const compressedStream = readable.pipeThrough(gzip);
54
+ const compressedBuffer = await new Response(compressedStream).arrayBuffer();
55
+ const bytes = new Uint8Array(compressedBuffer);
56
+ let binary = "";
57
+ for (let i = 0; i < bytes.byteLength; i += 1) {
58
+ binary += String.fromCharCode(bytes[i]);
59
+ }
60
+ if (typeof btoa !== "undefined") {
61
+ return btoa(binary);
62
+ }
63
+ return Buffer.from(binary, "base64").toString("base64");
64
+ } catch (e) {
65
+ console.log("gzipCompress 压缩失败,尝试使用 fflate 库", e);
66
+ }
67
+ }
68
+ try {
69
+ const input = toUtf8Bytes(data);
70
+ const compressed = (0, import_fflate.gzipSync)(input);
71
+ return import_js_base64.Base64.fromUint8Array(compressed, false);
72
+ } catch (e) {
73
+ console.log("gzipCompress 压缩失败", e);
74
+ }
75
+ return import_js_base64.Base64.encode(data, false);
76
+ }
77
+ function isGzipSupported() {
78
+ return (0, import_environment.isBrowser)() && typeof CompressionStream !== "undefined";
79
+ }
80
+ // Annotate the CommonJS export names for ESM import in node:
81
+ 0 && (module.exports = {
82
+ gzipCompress,
83
+ isGzipSupported
84
+ });
@@ -0,0 +1,55 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/config/index.ts
20
+ var config_exports = {};
21
+ __export(config_exports, {
22
+ getPixelBatchApi: () => getPixelBatchApi,
23
+ getRegisterApi: () => getRegisterApi,
24
+ getReportApi: () => getReportApi,
25
+ getSDKBaseApi: () => getSDKBaseApi
26
+ });
27
+ module.exports = __toCommonJS(config_exports);
28
+ var getSDKBaseApi = (env) => {
29
+ switch (env) {
30
+ case "product":
31
+ return "https://apm.pharmacyyf.com";
32
+ case "testing":
33
+ return "https://apm-te.pharmacyyf.com";
34
+ case "develop":
35
+ return "https://chief-dev.yifengx.com";
36
+ default:
37
+ return "https://apm.pharmacyyf.com";
38
+ }
39
+ };
40
+ var getRegisterApi = (env) => {
41
+ return `${getSDKBaseApi(env)}/yfcloud-apm/log/front/init`;
42
+ };
43
+ var getReportApi = (env) => {
44
+ return `${getSDKBaseApi(env)}/yfcloud-apm/log/front/batchSave`;
45
+ };
46
+ var getPixelBatchApi = (env) => {
47
+ return `${getSDKBaseApi(env)}/yfcloud-apm/log/front/pixelBatchSave`;
48
+ };
49
+ // Annotate the CommonJS export names for ESM import in node:
50
+ 0 && (module.exports = {
51
+ getPixelBatchApi,
52
+ getRegisterApi,
53
+ getReportApi,
54
+ getSDKBaseApi
55
+ });