@feiyangdefeng/sdk 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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +389 -0
  3. package/dist/collector/auto-tracker.d.ts +45 -0
  4. package/dist/collector/auto-tracker.d.ts.map +1 -0
  5. package/dist/collector/click-tracker.d.ts +38 -0
  6. package/dist/collector/click-tracker.d.ts.map +1 -0
  7. package/dist/collector/custom-tracker.d.ts +10 -0
  8. package/dist/collector/custom-tracker.d.ts.map +1 -0
  9. package/dist/collector/error-tracker.d.ts +43 -0
  10. package/dist/collector/error-tracker.d.ts.map +1 -0
  11. package/dist/collector/exposure-tracker.d.ts +60 -0
  12. package/dist/collector/exposure-tracker.d.ts.map +1 -0
  13. package/dist/collector/input-tracker.d.ts +30 -0
  14. package/dist/collector/input-tracker.d.ts.map +1 -0
  15. package/dist/collector/performance-tracker.d.ts +48 -0
  16. package/dist/collector/performance-tracker.d.ts.map +1 -0
  17. package/dist/collector/view-tracker.d.ts +38 -0
  18. package/dist/collector/view-tracker.d.ts.map +1 -0
  19. package/dist/core/config.d.ts +27 -0
  20. package/dist/core/config.d.ts.map +1 -0
  21. package/dist/core/event-bus.d.ts +30 -0
  22. package/dist/core/event-bus.d.ts.map +1 -0
  23. package/dist/core/request.d.ts +35 -0
  24. package/dist/core/request.d.ts.map +1 -0
  25. package/dist/core/storage.d.ts +67 -0
  26. package/dist/core/storage.d.ts.map +1 -0
  27. package/dist/core/utils.d.ts +61 -0
  28. package/dist/core/utils.d.ts.map +1 -0
  29. package/dist/extension/behavior-analysis.d.ts +41 -0
  30. package/dist/extension/behavior-analysis.d.ts.map +1 -0
  31. package/dist/extension/network-interceptor.d.ts +32 -0
  32. package/dist/extension/network-interceptor.d.ts.map +1 -0
  33. package/dist/extension/plugin-manager.d.ts +32 -0
  34. package/dist/extension/plugin-manager.d.ts.map +1 -0
  35. package/dist/extension/session-replay.d.ts +80 -0
  36. package/dist/extension/session-replay.d.ts.map +1 -0
  37. package/dist/index.d.ts +9 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.es.js +8443 -0
  40. package/dist/index.es.js.map +1 -0
  41. package/dist/index.iife.js +3 -0
  42. package/dist/index.iife.js.map +1 -0
  43. package/dist/index.umd.js +3 -0
  44. package/dist/index.umd.js.map +1 -0
  45. package/dist/processor/compressor.d.ts +16 -0
  46. package/dist/processor/compressor.d.ts.map +1 -0
  47. package/dist/processor/data-processor.d.ts +36 -0
  48. package/dist/processor/data-processor.d.ts.map +1 -0
  49. package/dist/processor/deduplicator.d.ts +29 -0
  50. package/dist/processor/deduplicator.d.ts.map +1 -0
  51. package/dist/processor/sampler.d.ts +16 -0
  52. package/dist/processor/sampler.d.ts.map +1 -0
  53. package/dist/tracker.d.ts +111 -0
  54. package/dist/tracker.d.ts.map +1 -0
  55. package/dist/transport/batch-sender.d.ts +80 -0
  56. package/dist/transport/batch-sender.d.ts.map +1 -0
  57. package/dist/transport/offline-storage.d.ts +60 -0
  58. package/dist/transport/offline-storage.d.ts.map +1 -0
  59. package/dist/transport/retry-handler.d.ts +29 -0
  60. package/dist/transport/retry-handler.d.ts.map +1 -0
  61. package/dist/transport/sender.d.ts +27 -0
  62. package/dist/transport/sender.d.ts.map +1 -0
  63. package/package.json +70 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tracker SDK Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,389 @@
1
+ # 前端全埋点SDK
2
+
3
+ 一套完整的前端全埋点SDK,支持自动埋点、错误监控、性能监控、会话回放等功能,具备高性能、高可靠、可扩展和强兼容性。
4
+
5
+ ## 特性
6
+
7
+ - ✅ **自动埋点**: 页面浏览、点击事件、元素曝光自动采集
8
+ - ✅ **错误监控**: JavaScript错误、资源加载错误、Promise错误监控
9
+ - ✅ **性能监控**: 页面加载性能、资源加载性能、长任务监控
10
+ - ✅ **会话回放**: DOM快照、用户交互记录
11
+ - ✅ **用户行为分析**: PV/UV统计、停留时长、访问路径
12
+ - ✅ **批量上报**: 数据批量上报,减少网络请求
13
+ - ✅ **离线存储**: 网络异常时数据离线存储,网络恢复后自动上报
14
+ - ✅ **失败重试**: 指数退避重试策略
15
+ - ✅ **数据采样**: 支持配置采样率,减少数据量
16
+ - ✅ **插件系统**: 基于事件总线的插件机制,支持网络请求拦截插件
17
+ - ✅ **网络请求拦截**: 自动拦截 fetch 和 XMLHttpRequest,记录请求和响应信息(包括响应体)
18
+ - ✅ **多环境支持**: 支持浏览器和Node.js环境
19
+
20
+ ## 安装
21
+
22
+ ```bash
23
+ pnpm add @tracker/sdk
24
+ ```
25
+
26
+ ## 文档
27
+
28
+ - [📖 详细使用说明](docs/USAGE.md) - 完整的使用文档,包含所有API、配置选项、使用场景和最佳实践
29
+ - [🧪 测试文档](tests/README.md) - 测试覆盖和测试说明
30
+
31
+ ## 快速开始
32
+
33
+ ### 基础使用
34
+
35
+ ```typescript
36
+ import Tracker from '@tracker/sdk';
37
+
38
+ // 方式1: 设置服务器地址(推荐)
39
+ const tracker = new Tracker({
40
+ appId: 'your-app-id',
41
+ serverUrl: 'https://api.example.com/track',
42
+ enableAutoTrack: true,
43
+ enableErrorTrack: true,
44
+ enablePerformanceTrack: true
45
+ });
46
+
47
+ // 方式2: 不设置服务器地址(仅本地收集,数据保存到离线存储)
48
+ const offlineTracker = new Tracker({
49
+ appId: 'your-app-id',
50
+ enableOfflineStorage: true // 建议启用
51
+ // serverUrl 不设置时,数据会保存到离线存储
52
+ });
53
+
54
+ // 后续可以设置serverUrl
55
+ offlineTracker.updateConfig({
56
+ serverUrl: 'https://api.example.com/track'
57
+ });
58
+ // 设置后,离线存储的数据会自动尝试上报
59
+ ```
60
+
61
+ ### 自定义埋点
62
+
63
+ ```typescript
64
+ // 追踪自定义事件
65
+ tracker.track('button-click', {
66
+ buttonName: 'submit',
67
+ page: 'home'
68
+ });
69
+ ```
70
+
71
+ ### 设置用户信息
72
+
73
+ ```typescript
74
+ tracker.setUser({
75
+ userId: '123',
76
+ userName: 'John',
77
+ userEmail: 'john@example.com'
78
+ });
79
+ ```
80
+
81
+ ### 手动上报错误
82
+
83
+ ```typescript
84
+ try {
85
+ // 业务代码
86
+ } catch (error) {
87
+ tracker.trackError(error, {
88
+ context: 'payment',
89
+ orderId: '12345'
90
+ });
91
+ }
92
+ ```
93
+
94
+ ## 配置选项
95
+
96
+ | 参数 | 类型 | 默认值 | 说明 |
97
+ |------|------|--------|------|
98
+ | `appId` | `string` | - | 应用ID(必填) |
99
+ | `serverUrl` | `string` | - | 上报服务器地址(可选,不设置时数据仅保存到离线存储) |
100
+ | `enableAutoTrack` | `boolean` | `true` | 是否启用自动埋点 |
101
+ | `enableErrorTrack` | `boolean` | `true` | 是否启用错误监控 |
102
+ | `enablePerformanceTrack` | `boolean` | `false` | 是否启用性能监控 |
103
+ | `enableSessionReplay` | `boolean` | `false` | 是否启用会话回放 |
104
+ | `batchSize` | `number` | `10` | 批量上报大小 |
105
+ | `batchWait` | `number` | `5000` | 批量上报等待时间(毫秒) |
106
+ | `sampleRate` | `number` | `1.0` | 采样率(0-1) |
107
+ | `enableOfflineStorage` | `boolean` | `true` | 是否启用离线存储 |
108
+ | `maxRetries` | `number` | `3` | 最大重试次数 |
109
+ | `userId` | `string` | `''` | 用户ID |
110
+ | `deviceId` | `string` | `''` | 设备ID(自动生成) |
111
+ | `customProperties` | `object` | `{}` | 自定义属性 |
112
+ | `beforeSend` | `function` | - | 上报前钩子 |
113
+ | `afterSend` | `function` | - | 上报后钩子 |
114
+ | `onError` | `function` | - | 错误处理函数 |
115
+
116
+ ## API
117
+
118
+ ### track(eventName, properties?)
119
+
120
+ 追踪自定义事件。
121
+
122
+ ```typescript
123
+ tracker.track('custom-event', {
124
+ key: 'value'
125
+ });
126
+ ```
127
+
128
+ ### setUser(user)
129
+
130
+ 设置用户信息。
131
+
132
+ ```typescript
133
+ tracker.setUser({
134
+ userId: '123',
135
+ userName: 'John'
136
+ });
137
+ ```
138
+
139
+ ### getUser()
140
+
141
+ 获取用户信息。
142
+
143
+ ```typescript
144
+ const user = tracker.getUser();
145
+ ```
146
+
147
+ ### trackError(error, errorInfo?)
148
+
149
+ 手动上报错误。
150
+
151
+ ```typescript
152
+ tracker.trackError(new Error('Something went wrong'), {
153
+ context: 'payment'
154
+ });
155
+ ```
156
+
157
+ ### trackPerformance()
158
+
159
+ 手动上报性能数据。
160
+
161
+ ```typescript
162
+ tracker.trackPerformance();
163
+ ```
164
+
165
+ ### trackPageView()
166
+
167
+ 手动触发页面浏览追踪。
168
+
169
+ ```typescript
170
+ tracker.trackPageView();
171
+ ```
172
+
173
+ ### use(plugin)
174
+
175
+ 使用插件。
176
+
177
+ ```typescript
178
+ const plugin = {
179
+ name: 'my-plugin',
180
+ install(tracker) {
181
+ // 插件逻辑
182
+ }
183
+ };
184
+
185
+ tracker.use(plugin);
186
+ ```
187
+
188
+ **网络请求拦截插件**:
189
+
190
+ ```typescript
191
+ import Tracker, { networkInterceptorPlugin, createNetworkInterceptorPlugin } from '@tracker/sdk';
192
+
193
+ const tracker = new Tracker({
194
+ appId: 'my-app',
195
+ serverUrl: 'https://api.example.com/track'
196
+ });
197
+
198
+ // 使用默认配置
199
+ tracker.use(networkInterceptorPlugin);
200
+
201
+ // 或使用自定义配置
202
+ const customNetworkPlugin = createNetworkInterceptorPlugin({
203
+ urlFilter: /^https?:\/\/api\./, // 只记录 API 请求
204
+ recordResponseBody: true, // 记录响应体
205
+ sensitiveFields: ['password', 'token'] // 过滤敏感字段
206
+ });
207
+ tracker.use(customNetworkPlugin);
208
+ ```
209
+
210
+ ### updateConfig(config)
211
+
212
+ 更新配置。
213
+
214
+ ```typescript
215
+ tracker.updateConfig({
216
+ sampleRate: 0.5
217
+ });
218
+ ```
219
+
220
+ ### getConfig()
221
+
222
+ 获取配置。
223
+
224
+ ```typescript
225
+ const config = tracker.getConfig();
226
+ ```
227
+
228
+ ### getBehaviorMetrics()
229
+
230
+ 获取行为分析数据。
231
+
232
+ ```typescript
233
+ const metrics = tracker.getBehaviorMetrics();
234
+ // { pv: 10, uv: 5, sessions: 3, avgDuration: 5000, paths: [...] }
235
+ ```
236
+
237
+ ### getSessionReplayData()
238
+
239
+ 获取会话回放数据。
240
+
241
+ ```typescript
242
+ const data = tracker.getSessionReplayData();
243
+ // { snapshots: [...], interactions: [...] }
244
+ ```
245
+
246
+ ### destroy()
247
+
248
+ 销毁Tracker实例。
249
+
250
+ ```typescript
251
+ tracker.destroy();
252
+ ```
253
+
254
+ ## 曝光采集
255
+
256
+ 为需要追踪曝光的元素添加 `data-track-exposure` 属性:
257
+
258
+ ```html
259
+ <div data-track-exposure>
260
+ 需要追踪曝光的内容
261
+ </div>
262
+ ```
263
+
264
+ ## 钩子函数
265
+
266
+ ### beforeSend
267
+
268
+ 上报前钩子,可以修改或取消事件上报。
269
+
270
+ ```typescript
271
+ const tracker = new Tracker({
272
+ // ...其他配置
273
+ beforeSend(event) {
274
+ // 修改事件
275
+ event.properties.customField = 'value';
276
+ return event;
277
+
278
+ // 或者取消上报
279
+ // return false;
280
+ }
281
+ });
282
+ ```
283
+
284
+ ### afterSend
285
+
286
+ 上报后钩子。
287
+
288
+ ```typescript
289
+ const tracker = new Tracker({
290
+ // ...其他配置
291
+ afterSend(event, success) {
292
+ if (success) {
293
+ console.log('Event sent successfully');
294
+ }
295
+ }
296
+ });
297
+ ```
298
+
299
+ ## 插件开发
300
+
301
+ ```typescript
302
+ import type { TrackerPlugin } from '@tracker/sdk';
303
+
304
+ const myPlugin: TrackerPlugin = {
305
+ name: 'my-plugin',
306
+ install(tracker) {
307
+ // 监听事件
308
+ // 修改配置
309
+ // 扩展功能
310
+ },
311
+ uninstall(tracker) {
312
+ // 清理工作
313
+ }
314
+ };
315
+
316
+ tracker.use(myPlugin);
317
+ ```
318
+
319
+ ## 性能优化
320
+
321
+ - SDK采用异步加载,不阻塞页面渲染
322
+ - 使用事件委托,避免内存泄漏
323
+ - 数据批量上报,减少网络请求
324
+ - 支持采样,减少数据量
325
+ - 使用Web Worker处理数据(可选)
326
+
327
+ ## 浏览器兼容性
328
+
329
+ - Chrome (最新版)
330
+ - Firefox (最新版)
331
+ - Safari (最新版)
332
+ - Edge (最新版)
333
+
334
+ ## Node.js支持
335
+
336
+ SDK支持在Node.js环境中使用:
337
+
338
+ ```typescript
339
+ import Tracker from '@tracker/sdk';
340
+
341
+ const tracker = new Tracker({
342
+ appId: 'your-app-id',
343
+ serverUrl: 'https://api.example.com/track'
344
+ });
345
+
346
+ tracker.track('server-event', {
347
+ server: 'node'
348
+ });
349
+ ```
350
+
351
+ ## 开发
352
+
353
+ ```bash
354
+ # 安装依赖
355
+ pnpm install
356
+
357
+ # 开发模式
358
+ pnpm dev
359
+
360
+ # 构建
361
+ pnpm build
362
+
363
+ # 类型检查
364
+ pnpm typecheck
365
+
366
+ # 代码检查
367
+ pnpm lint
368
+
369
+ # 格式化
370
+ pnpm format
371
+ ```
372
+
373
+ ## 技术栈
374
+
375
+ - **构建工具**: Vite
376
+ - **包管理器**: pnpm
377
+ - **Node版本**: 19+
378
+ - **语言**: TypeScript
379
+ - **测试**: Vitest
380
+
381
+ ## 更多文档
382
+
383
+ - [详细使用说明](docs/USAGE.md) - 完整的API文档、配置选项、使用场景和最佳实践
384
+ - [测试文档](tests/README.md) - 测试覆盖说明
385
+
386
+ ## 许可证
387
+
388
+ MIT
389
+
@@ -0,0 +1,45 @@
1
+ import { default as ViewTracker } from './view-tracker';
2
+ import { default as ClickTracker } from './click-tracker';
3
+ import { default as ExposureTracker } from './exposure-tracker';
4
+ import { default as InputTracker } from './input-tracker';
5
+
6
+ declare class AutoTracker {
7
+ private viewTracker;
8
+ private clickTracker;
9
+ private exposureTracker;
10
+ private inputTracker;
11
+ private enabled;
12
+ constructor();
13
+ /**
14
+ * 初始化自动埋点
15
+ */
16
+ init(options?: {
17
+ enableClick?: boolean;
18
+ enableExposure?: boolean;
19
+ enableInput?: boolean;
20
+ clickDebounceTime?: number;
21
+ inputDebounceTime?: number;
22
+ }): void;
23
+ /**
24
+ * 获取ViewTracker实例
25
+ */
26
+ getViewTracker(): ViewTracker;
27
+ /**
28
+ * 获取ClickTracker实例
29
+ */
30
+ getClickTracker(): ClickTracker;
31
+ /**
32
+ * 获取ExposureTracker实例
33
+ */
34
+ getExposureTracker(): ExposureTracker;
35
+ /**
36
+ * 获取InputTracker实例
37
+ */
38
+ getInputTracker(): InputTracker;
39
+ /**
40
+ * 销毁
41
+ */
42
+ destroy(): void;
43
+ }
44
+ export default AutoTracker;
45
+ //# sourceMappingURL=auto-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/auto-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAC3C,OAAO,eAAe,MAAM,oBAAoB,CAAC;AACjD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAE3C,cAAM,WAAW;IACf,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,OAAO,CAAkB;;IASjC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA4BxJ;;OAEG;IACH,cAAc,IAAI,WAAW;IAI7B;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,OAAO,IAAI,IAAI;CAYhB;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { ClickEvent } from '../types';
2
+
3
+ declare class ClickTracker {
4
+ private clickHandler;
5
+ private touchStartHandler;
6
+ private touchEndHandler;
7
+ private debounceTime;
8
+ private touchTimeout;
9
+ private lastTouch;
10
+ private readonly TOUCH_CLICK_THRESHOLD;
11
+ private readonly TOUCH_DISTANCE_THRESHOLD;
12
+ /**
13
+ * 初始化
14
+ */
15
+ init(debounceTime?: number): void;
16
+ /**
17
+ * 处理触摸事件
18
+ */
19
+ private handleTouch;
20
+ /**
21
+ * 处理触摸交互(模拟点击行为)
22
+ */
23
+ private processTouchInteraction;
24
+ /**
25
+ * 处理点击事件
26
+ */
27
+ private handleClick;
28
+ /**
29
+ * 获取点击事件
30
+ */
31
+ getClickEvent(event: MouseEvent): ClickEvent | null;
32
+ /**
33
+ * 销毁
34
+ */
35
+ destroy(): void;
36
+ }
37
+ export default ClickTracker;
38
+ //# sourceMappingURL=click-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"click-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/click-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C,cAAM,YAAY;IAChB,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAAuD;IACxE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAO;IAC7C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAM;IAE/C;;OAEG;IACH,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAoCjC;;OAEG;IACH,OAAO,CAAC,WAAW;IAuDnB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAkD/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAuDnB;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IA2BnD;;OAEG;IACH,OAAO,IAAI,IAAI;CAuBhB;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { CustomEvent } from '../types';
2
+
3
+ declare class CustomTracker {
4
+ /**
5
+ * 追踪自定义事件
6
+ */
7
+ track(eventName: string, properties?: Record<string, unknown>): CustomEvent;
8
+ }
9
+ export default CustomTracker;
10
+ //# sourceMappingURL=custom-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/custom-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,cAAM,aAAa;IACjB;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;CAa5E;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,43 @@
1
+ declare class ErrorTracker {
2
+ private handlers;
3
+ private errorCache;
4
+ private debounceTime;
5
+ /**
6
+ * 初始化
7
+ */
8
+ init(): void;
9
+ /**
10
+ * 处理JavaScript错误
11
+ */
12
+ private handleJSError;
13
+ /**
14
+ * 处理Promise错误
15
+ */
16
+ private handlePromiseError;
17
+ /**
18
+ * 处理资源加载错误
19
+ */
20
+ private handleResourceError;
21
+ /**
22
+ * 获取错误唯一标识
23
+ */
24
+ private getErrorKey;
25
+ /**
26
+ * 触发错误事件
27
+ */
28
+ private emitError;
29
+ /**
30
+ * 清理过期的错误缓存
31
+ */
32
+ private cleanExpiredErrorCache;
33
+ /**
34
+ * 手动上报错误
35
+ */
36
+ trackError(error: Error | string, errorInfo?: Record<string, unknown>): void;
37
+ /**
38
+ * 销毁
39
+ */
40
+ destroy(): void;
41
+ }
42
+ export default ErrorTracker;
43
+ //# sourceMappingURL=error-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/error-tracker.ts"],"names":[],"mappings":"AAMA,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,YAAY,CAAe;IAEnC;;OAEG;IACH,IAAI,IAAI,IAAI;IAgCZ;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8C3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAwBnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAuBjB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA8B5E;;OAEG;IACH,OAAO,IAAI,IAAI;CAKhB;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,60 @@
1
+ interface ExposureOptions {
2
+ /** 曝光阈值(0-1),元素可见比例达到此值才触发曝光 */
3
+ threshold?: number;
4
+ /** 根元素,默认为viewport */
5
+ root?: Element | null;
6
+ /** 根元素边距 */
7
+ rootMargin?: string;
8
+ }
9
+ declare class ExposureTracker {
10
+ private observer;
11
+ private exposedElements;
12
+ private options;
13
+ private exposureMap;
14
+ private scrollFallbackHandler;
15
+ private resizeFallbackHandler;
16
+ private cachedElements;
17
+ private lastCacheUpdate;
18
+ private readonly CACHE_UPDATE_INTERVAL;
19
+ constructor(options?: ExposureOptions);
20
+ /**
21
+ * 初始化
22
+ */
23
+ init(): void;
24
+ /**
25
+ * 观察元素
26
+ */
27
+ observeElements(): void;
28
+ /**
29
+ * 手动添加观察元素
30
+ */
31
+ observe(element: Element): void;
32
+ /**
33
+ * 取消观察元素
34
+ */
35
+ unobserve(element: Element): void;
36
+ /**
37
+ * 处理IntersectionObserver回调
38
+ */
39
+ private handleIntersection;
40
+ /**
41
+ * 触发曝光事件
42
+ * @param element 曝光元素
43
+ * @param duration 曝光时长(毫秒),可选
44
+ */
45
+ private triggerExposure;
46
+ /**
47
+ * 获取曝光元素列表(带缓存)
48
+ */
49
+ private getExposureElements;
50
+ /**
51
+ * 降级方案:使用scroll事件
52
+ */
53
+ private initScrollFallback;
54
+ /**
55
+ * 销毁
56
+ */
57
+ destroy(): void;
58
+ }
59
+ export default ExposureTracker;
60
+ //# sourceMappingURL=exposure-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exposure-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/exposure-tracker.ts"],"names":[],"mappings":"AAOA,UAAU,eAAe;IACvB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,YAAY;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAQ;gBAElC,OAAO,GAAE,eAAoB;IASzC;;OAEG;IACH,IAAI,IAAI,IAAI;IAyBZ;;OAEG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAa/B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAgBjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2D1B;;OAEG;IACH,OAAO,IAAI,IAAI;CAsBhB;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,30 @@
1
+ declare class InputTracker {
2
+ private inputHandler;
3
+ private changeHandler;
4
+ private inputDebounceTime;
5
+ private selectDebounceTime;
6
+ private skipEmptyInput;
7
+ private sensitiveKeywords;
8
+ /**
9
+ * 初始化
10
+ */
11
+ init(debounceTime?: number, skipEmptyInput?: boolean): void;
12
+ /**
13
+ * 处理 input 事件
14
+ */
15
+ private handleInput;
16
+ /**
17
+ * 处理 change 事件
18
+ */
19
+ private handleChange;
20
+ /**
21
+ * 判断是否为敏感字段
22
+ */
23
+ private isSensitiveField;
24
+ /**
25
+ * 销毁
26
+ */
27
+ destroy(): void;
28
+ }
29
+ export default InputTracker;
30
+ //# sourceMappingURL=input-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/input-tracker.ts"],"names":[],"mappings":"AAOA,cAAM,YAAY;IAChB,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,kBAAkB,CAAe;IACzC,OAAO,CAAC,cAAc,CAAiB;IAEvC,OAAO,CAAC,iBAAiB,CAAiF;IAE1G;;OAEG;IACH,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI;IAgC3D;;OAEG;IACH,OAAO,CAAC,WAAW;IAmGnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmFpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0CxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAWhB;AAED,eAAe,YAAY,CAAC"}