@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.
- package/LICENSE +21 -0
- package/README.md +389 -0
- package/dist/collector/auto-tracker.d.ts +45 -0
- package/dist/collector/auto-tracker.d.ts.map +1 -0
- package/dist/collector/click-tracker.d.ts +38 -0
- package/dist/collector/click-tracker.d.ts.map +1 -0
- package/dist/collector/custom-tracker.d.ts +10 -0
- package/dist/collector/custom-tracker.d.ts.map +1 -0
- package/dist/collector/error-tracker.d.ts +43 -0
- package/dist/collector/error-tracker.d.ts.map +1 -0
- package/dist/collector/exposure-tracker.d.ts +60 -0
- package/dist/collector/exposure-tracker.d.ts.map +1 -0
- package/dist/collector/input-tracker.d.ts +30 -0
- package/dist/collector/input-tracker.d.ts.map +1 -0
- package/dist/collector/performance-tracker.d.ts +48 -0
- package/dist/collector/performance-tracker.d.ts.map +1 -0
- package/dist/collector/view-tracker.d.ts +38 -0
- package/dist/collector/view-tracker.d.ts.map +1 -0
- package/dist/core/config.d.ts +27 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/event-bus.d.ts +30 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/request.d.ts +35 -0
- package/dist/core/request.d.ts.map +1 -0
- package/dist/core/storage.d.ts +67 -0
- package/dist/core/storage.d.ts.map +1 -0
- package/dist/core/utils.d.ts +61 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/extension/behavior-analysis.d.ts +41 -0
- package/dist/extension/behavior-analysis.d.ts.map +1 -0
- package/dist/extension/network-interceptor.d.ts +32 -0
- package/dist/extension/network-interceptor.d.ts.map +1 -0
- package/dist/extension/plugin-manager.d.ts +32 -0
- package/dist/extension/plugin-manager.d.ts.map +1 -0
- package/dist/extension/session-replay.d.ts +80 -0
- package/dist/extension/session-replay.d.ts.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +8443 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.iife.js +3 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/index.umd.js +3 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/processor/compressor.d.ts +16 -0
- package/dist/processor/compressor.d.ts.map +1 -0
- package/dist/processor/data-processor.d.ts +36 -0
- package/dist/processor/data-processor.d.ts.map +1 -0
- package/dist/processor/deduplicator.d.ts +29 -0
- package/dist/processor/deduplicator.d.ts.map +1 -0
- package/dist/processor/sampler.d.ts +16 -0
- package/dist/processor/sampler.d.ts.map +1 -0
- package/dist/tracker.d.ts +111 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/transport/batch-sender.d.ts +80 -0
- package/dist/transport/batch-sender.d.ts.map +1 -0
- package/dist/transport/offline-storage.d.ts +60 -0
- package/dist/transport/offline-storage.d.ts.map +1 -0
- package/dist/transport/retry-handler.d.ts +29 -0
- package/dist/transport/retry-handler.d.ts.map +1 -0
- package/dist/transport/sender.d.ts +27 -0
- package/dist/transport/sender.d.ts.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
declare class Compressor {
|
|
2
|
+
/**
|
|
3
|
+
* 压缩数据
|
|
4
|
+
*/
|
|
5
|
+
compress(data: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* 解压数据
|
|
8
|
+
*/
|
|
9
|
+
decompress(compressedData: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* 判断是否需要压缩(数据大于1KB时压缩)
|
|
12
|
+
*/
|
|
13
|
+
shouldCompress(data: string): boolean;
|
|
14
|
+
}
|
|
15
|
+
export default Compressor;
|
|
16
|
+
//# sourceMappingURL=compressor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../../src/processor/compressor.ts"],"names":[],"mappings":"AAKA,cAAM,UAAU;IACd;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAwB9B;;OAEG;IACH,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IA4B1C;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGtC;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { TrackerEvent } from '../types';
|
|
2
|
+
|
|
3
|
+
interface ProcessOptions {
|
|
4
|
+
/** 采样率 */
|
|
5
|
+
sampleRate?: number;
|
|
6
|
+
/** 是否启用去重 */
|
|
7
|
+
enableDeduplication?: boolean;
|
|
8
|
+
/** 是否启用压缩 */
|
|
9
|
+
enableCompression?: boolean;
|
|
10
|
+
/** 是否关键事件 */
|
|
11
|
+
isCritical?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare class DataProcessor {
|
|
14
|
+
private sampler;
|
|
15
|
+
private deduplicator;
|
|
16
|
+
private compressor;
|
|
17
|
+
constructor();
|
|
18
|
+
/**
|
|
19
|
+
* 处理事件
|
|
20
|
+
*/
|
|
21
|
+
process(event: TrackerEvent, options?: ProcessOptions): TrackerEvent | null;
|
|
22
|
+
/**
|
|
23
|
+
* 批量处理事件
|
|
24
|
+
*/
|
|
25
|
+
processBatch(events: TrackerEvent[], options?: ProcessOptions): TrackerEvent[];
|
|
26
|
+
/**
|
|
27
|
+
* 序列化事件
|
|
28
|
+
*/
|
|
29
|
+
serialize(event: TrackerEvent): string;
|
|
30
|
+
/**
|
|
31
|
+
* 反序列化事件
|
|
32
|
+
*/
|
|
33
|
+
deserialize(data: string): TrackerEvent | null;
|
|
34
|
+
}
|
|
35
|
+
export default DataProcessor;
|
|
36
|
+
//# sourceMappingURL=data-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-processor.d.ts","sourceRoot":"","sources":["../../src/processor/data-processor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM5C,UAAU,cAAc;IACtB,UAAU;IACV,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa;IACb,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,aAAa;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,cAAM,aAAa;IACjB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAa;;IAQ/B;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,cAAmB,GAAG,YAAY,GAAG,IAAI;IAkC/E;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,YAAY,EAAE;IAMlF;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;IAStC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;CAQ/C;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { TrackerEvent } from '../types';
|
|
2
|
+
|
|
3
|
+
declare class Deduplicator {
|
|
4
|
+
private eventCache;
|
|
5
|
+
private cacheTimeouts;
|
|
6
|
+
private defaultCacheTimeout;
|
|
7
|
+
/**
|
|
8
|
+
* 判断事件是否重复
|
|
9
|
+
*/
|
|
10
|
+
isDuplicate(event: TrackerEvent): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* 获取事件唯一标识
|
|
13
|
+
*/
|
|
14
|
+
private getEventKey;
|
|
15
|
+
/**
|
|
16
|
+
* 简单的字符串hash函数(用于输入值去重)
|
|
17
|
+
*/
|
|
18
|
+
private simpleHash;
|
|
19
|
+
/**
|
|
20
|
+
* 清理过期缓存
|
|
21
|
+
*/
|
|
22
|
+
private cleanExpiredCache;
|
|
23
|
+
/**
|
|
24
|
+
* 清空缓存
|
|
25
|
+
*/
|
|
26
|
+
clear(): void;
|
|
27
|
+
}
|
|
28
|
+
export default Deduplicator;
|
|
29
|
+
//# sourceMappingURL=deduplicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deduplicator.d.ts","sourceRoot":"","sources":["../../src/processor/deduplicator.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,cAAM,YAAY;IAChB,OAAO,CAAC,UAAU,CAAkC;IAEpD,OAAO,CAAC,aAAa,CAQnB;IACF,OAAO,CAAC,mBAAmB,CAAiB;IAE5C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;IAyBzC;;OAEG;IACH,OAAO,CAAC,WAAW;IAkHnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAWlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 采样器
|
|
3
|
+
*/
|
|
4
|
+
declare class Sampler {
|
|
5
|
+
/**
|
|
6
|
+
* 判断是否采样
|
|
7
|
+
* @param sampleRate 采样率(0-1)
|
|
8
|
+
*/
|
|
9
|
+
shouldSample(sampleRate: number): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* 判断关键事件是否应该采样(关键事件总是采样)
|
|
12
|
+
*/
|
|
13
|
+
shouldSampleCritical(isCritical: boolean, sampleRate: number): boolean;
|
|
14
|
+
}
|
|
15
|
+
export default Sampler;
|
|
16
|
+
//# sourceMappingURL=sampler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampler.d.ts","sourceRoot":"","sources":["../../src/processor/sampler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAM,OAAO;IACX;;;OAGG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAUzC;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;CAMvE;AAED,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { TrackerConfig, TrackerEvent, TrackerPlugin, UserInfo } from './types';
|
|
2
|
+
import { default as AutoTracker } from './collector/auto-tracker';
|
|
3
|
+
import { BehaviorMetrics } from './extension/behavior-analysis';
|
|
4
|
+
import { DOMSnapshot, UserInteraction } from './extension/session-replay';
|
|
5
|
+
|
|
6
|
+
declare class Tracker {
|
|
7
|
+
private config;
|
|
8
|
+
private autoTracker;
|
|
9
|
+
private errorTracker;
|
|
10
|
+
private performanceTracker;
|
|
11
|
+
private customTracker;
|
|
12
|
+
private dataProcessor;
|
|
13
|
+
private batchSender;
|
|
14
|
+
private pluginManager;
|
|
15
|
+
private behaviorAnalysis;
|
|
16
|
+
private sessionReplay;
|
|
17
|
+
private userInfo;
|
|
18
|
+
private deviceId;
|
|
19
|
+
private sessionId;
|
|
20
|
+
constructor(config: TrackerConfig);
|
|
21
|
+
/**
|
|
22
|
+
* 初始化
|
|
23
|
+
*/
|
|
24
|
+
private init;
|
|
25
|
+
/**
|
|
26
|
+
* 设置自动埋点监听器
|
|
27
|
+
*/
|
|
28
|
+
private setupAutoTrackListeners;
|
|
29
|
+
/**
|
|
30
|
+
* 发送事件
|
|
31
|
+
*/
|
|
32
|
+
send(event: TrackerEvent): void;
|
|
33
|
+
/**
|
|
34
|
+
* 丰富事件数据
|
|
35
|
+
*/
|
|
36
|
+
private enrichEvent;
|
|
37
|
+
/**
|
|
38
|
+
* 追踪自定义事件
|
|
39
|
+
*/
|
|
40
|
+
track(eventName: string, properties?: Record<string, unknown>): void;
|
|
41
|
+
/**
|
|
42
|
+
* 设置用户信息
|
|
43
|
+
*/
|
|
44
|
+
setUser(user: UserInfo): void;
|
|
45
|
+
/**
|
|
46
|
+
* 获取用户信息
|
|
47
|
+
*/
|
|
48
|
+
getUser(): UserInfo | null;
|
|
49
|
+
/**
|
|
50
|
+
* 手动上报错误
|
|
51
|
+
*/
|
|
52
|
+
trackError(error: Error | string, errorInfo?: Record<string, unknown>): void;
|
|
53
|
+
/**
|
|
54
|
+
* 手动上报性能
|
|
55
|
+
*/
|
|
56
|
+
trackPerformance(): void;
|
|
57
|
+
/**
|
|
58
|
+
* 页面浏览追踪
|
|
59
|
+
*/
|
|
60
|
+
trackPageView(): void;
|
|
61
|
+
/**
|
|
62
|
+
* 使用插件
|
|
63
|
+
*/
|
|
64
|
+
use(plugin: TrackerPlugin): void;
|
|
65
|
+
/**
|
|
66
|
+
* 更新配置
|
|
67
|
+
*/
|
|
68
|
+
updateConfig(config: Partial<TrackerConfig>): void;
|
|
69
|
+
/**
|
|
70
|
+
* 获取配置
|
|
71
|
+
*/
|
|
72
|
+
getConfig(): TrackerConfig;
|
|
73
|
+
/**
|
|
74
|
+
* 获取行为分析数据
|
|
75
|
+
*/
|
|
76
|
+
getBehaviorMetrics(): BehaviorMetrics;
|
|
77
|
+
/**
|
|
78
|
+
* 获取会话回放数据
|
|
79
|
+
*/
|
|
80
|
+
getSessionReplayData(): {
|
|
81
|
+
snapshots: DOMSnapshot[];
|
|
82
|
+
interactions: UserInteraction[];
|
|
83
|
+
} | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* 获取离线存储的所有事件
|
|
86
|
+
*/
|
|
87
|
+
getOfflineEvents(): Promise<TrackerEvent[]>;
|
|
88
|
+
/**
|
|
89
|
+
* 获取离线存储的事件数量
|
|
90
|
+
*/
|
|
91
|
+
getOfflineEventCount(): Promise<number>;
|
|
92
|
+
/**
|
|
93
|
+
* 清空离线存储
|
|
94
|
+
*/
|
|
95
|
+
clearOfflineStorage(): Promise<boolean>;
|
|
96
|
+
/**
|
|
97
|
+
* 获取自动追踪器实例
|
|
98
|
+
* 如果未启用自动埋点,返回null
|
|
99
|
+
*/
|
|
100
|
+
getAutoTracker(): AutoTracker | null;
|
|
101
|
+
/**
|
|
102
|
+
* 销毁(同步版本)
|
|
103
|
+
*/
|
|
104
|
+
destroy(): void;
|
|
105
|
+
/**
|
|
106
|
+
* 异步销毁(等待所有事件发送完成)
|
|
107
|
+
*/
|
|
108
|
+
destroyAsync(): Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
export default Tracker;
|
|
111
|
+
//# sourceMappingURL=tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAc,MAAM,SAAS,CAAC;AAIhG,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAOnD,OAAyB,EAAE,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAsB,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAEnG,cAAM,OAAO;IACX,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,aAAa;IAmDjC;;OAEG;IACH,OAAO,CAAC,IAAI;IAgCZ;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgC/B;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IA4D/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAiCnB;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKpE;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAK7B;;OAEG;IACH,OAAO,IAAI,QAAQ,GAAG,IAAI;IAI1B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqB5E;;OAEG;IACH,gBAAgB,IAAI,IAAI;IASxB;;OAEG;IACH,aAAa,IAAI,IAAI;IAOrB;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAIhC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAclD;;OAEG;IACH,SAAS,IAAI,aAAa;IAI1B;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,oBAAoB,IAAI;QAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAAC,YAAY,EAAE,eAAe,EAAE,CAAA;KAAE,GAAG,SAAS;IAIjG;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIjD;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7C;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7C;;;OAGG;IACH,cAAc,IAAI,WAAW,GAAG,IAAI;IAIpC;;OAEG;IACH,OAAO,IAAI,IAAI;IAUf;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CASpC;AAED,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { TrackerEvent } from '../types';
|
|
2
|
+
|
|
3
|
+
interface BatchSenderOptions {
|
|
4
|
+
/** 批量大小 */
|
|
5
|
+
batchSize?: number;
|
|
6
|
+
/** 批量等待时间(毫秒) */
|
|
7
|
+
batchWait?: number;
|
|
8
|
+
/** 是否启用离线存储 */
|
|
9
|
+
enableOfflineStorage?: boolean;
|
|
10
|
+
/** 离线存储最大事件数量 */
|
|
11
|
+
maxOfflineStorageSize?: number;
|
|
12
|
+
}
|
|
13
|
+
interface AddEventOptions {
|
|
14
|
+
/** 批量发送完成回调 */
|
|
15
|
+
onBatchComplete?: (events: TrackerEvent[], success: boolean) => void;
|
|
16
|
+
}
|
|
17
|
+
declare class BatchSender {
|
|
18
|
+
private sender;
|
|
19
|
+
private offlineStorage;
|
|
20
|
+
private queue;
|
|
21
|
+
private timer;
|
|
22
|
+
private batchSize;
|
|
23
|
+
private batchWait;
|
|
24
|
+
private enableOfflineStorage;
|
|
25
|
+
private isProcessing;
|
|
26
|
+
private isInitialized;
|
|
27
|
+
private initPromise;
|
|
28
|
+
private eventCallbacks;
|
|
29
|
+
constructor(serverUrl: string, options?: BatchSenderOptions);
|
|
30
|
+
/**
|
|
31
|
+
* 初始化
|
|
32
|
+
*/
|
|
33
|
+
private init;
|
|
34
|
+
/**
|
|
35
|
+
* 确保初始化完成
|
|
36
|
+
*/
|
|
37
|
+
private ensureInitialized;
|
|
38
|
+
/**
|
|
39
|
+
* 添加事件到队列
|
|
40
|
+
*/
|
|
41
|
+
add(event: TrackerEvent, options?: AddEventOptions): void;
|
|
42
|
+
/**
|
|
43
|
+
* 添加事件到队列(异步版本,确保初始化完成)
|
|
44
|
+
*/
|
|
45
|
+
addAsync(event: TrackerEvent): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* 立即发送队列中的所有事件
|
|
48
|
+
*/
|
|
49
|
+
flush(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* 发送离线存储的事件
|
|
52
|
+
*/
|
|
53
|
+
private flushOfflineEvents;
|
|
54
|
+
/**
|
|
55
|
+
* 更新服务器地址
|
|
56
|
+
*/
|
|
57
|
+
setServerUrl(url: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* 获取离线存储的所有事件
|
|
60
|
+
*/
|
|
61
|
+
getOfflineEvents(): Promise<TrackerEvent[]>;
|
|
62
|
+
/**
|
|
63
|
+
* 获取离线存储的事件数量
|
|
64
|
+
*/
|
|
65
|
+
getOfflineEventCount(): Promise<number>;
|
|
66
|
+
/**
|
|
67
|
+
* 清空离线存储
|
|
68
|
+
*/
|
|
69
|
+
clearOfflineStorage(): Promise<boolean>;
|
|
70
|
+
/**
|
|
71
|
+
* 销毁(同步版本,不等待异步操作完成)
|
|
72
|
+
*/
|
|
73
|
+
destroy(): void;
|
|
74
|
+
/**
|
|
75
|
+
* 异步销毁(等待所有事件发送完成)
|
|
76
|
+
*/
|
|
77
|
+
destroyAsync(): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
export default BatchSender;
|
|
80
|
+
//# sourceMappingURL=batch-sender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-sender.d.ts","sourceRoot":"","sources":["../../src/transport/batch-sender.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,UAAU,kBAAkB;IAC1B,WAAW;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe;IACf,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,UAAU,eAAe;IACvB,eAAe;IACf,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtE;AAED,cAAM,WAAW;IACf,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,oBAAoB,CAAU;IACtC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,cAAc,CAAiD;gBAE3D,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;IAW/D;;OAEG;YACW,IAAI;IASlB;;OAEG;YACW,iBAAiB;IAM/B;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAsBzD;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwF5B;;OAEG;YACW,kBAAkB;IA0BhC;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKjD;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAK7C;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK7C;;OAEG;IACH,OAAO,IAAI,IAAI;IAaf;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAQpC;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { TrackerEvent } from '../types';
|
|
2
|
+
|
|
3
|
+
declare class OfflineStorage {
|
|
4
|
+
private storageKey;
|
|
5
|
+
private maxSize;
|
|
6
|
+
private useIndexedDB;
|
|
7
|
+
private memoryStorage;
|
|
8
|
+
private saveQueue;
|
|
9
|
+
/**
|
|
10
|
+
* 构造函数
|
|
11
|
+
* @param maxSize 最大存储事件数量,默认1000
|
|
12
|
+
*/
|
|
13
|
+
constructor(maxSize?: number);
|
|
14
|
+
/**
|
|
15
|
+
* 初始化
|
|
16
|
+
*/
|
|
17
|
+
init(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* 保存事件(使用队列确保并发安全)
|
|
20
|
+
*/
|
|
21
|
+
save(event: TrackerEvent): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* 实际保存操作
|
|
24
|
+
*/
|
|
25
|
+
private doSave;
|
|
26
|
+
/**
|
|
27
|
+
* 清理事件对象,移除循环引用
|
|
28
|
+
*/
|
|
29
|
+
private sanitizeEvent;
|
|
30
|
+
/**
|
|
31
|
+
* 清理对象,移除循环引用
|
|
32
|
+
*/
|
|
33
|
+
private sanitizeObject;
|
|
34
|
+
/**
|
|
35
|
+
* 安全的JSON序列化,处理循环引用
|
|
36
|
+
*/
|
|
37
|
+
private safeStringify;
|
|
38
|
+
/**
|
|
39
|
+
* 获取所有事件
|
|
40
|
+
*/
|
|
41
|
+
getAll(): Promise<TrackerEvent[]>;
|
|
42
|
+
/**
|
|
43
|
+
* 删除事件
|
|
44
|
+
*/
|
|
45
|
+
remove(events: TrackerEvent[]): Promise<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* 清空所有事件
|
|
48
|
+
*/
|
|
49
|
+
clear(): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* 获取事件数量
|
|
52
|
+
*/
|
|
53
|
+
getCount(): Promise<number>;
|
|
54
|
+
/**
|
|
55
|
+
* 获取事件唯一标识
|
|
56
|
+
*/
|
|
57
|
+
private getEventKey;
|
|
58
|
+
}
|
|
59
|
+
export default OfflineStorage;
|
|
60
|
+
//# sourceMappingURL=offline-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-storage.d.ts","sourceRoot":"","sources":["../../src/transport/offline-storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,cAAM,cAAc;IAClB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,SAAS,CAAoC;IAErD;;;OAGG;gBACS,OAAO,GAAE,MAAa;IAOlC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IA+BjD;;OAEG;YACW,MAAM;IAkDpB;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAuBvC;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAuCtD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAc/B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAKjC;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 重试处理器
|
|
3
|
+
*/
|
|
4
|
+
interface RetryOptions {
|
|
5
|
+
/** 最大重试次数 */
|
|
6
|
+
maxRetries?: number;
|
|
7
|
+
/** 初始延迟时间(毫秒) */
|
|
8
|
+
initialDelay?: number;
|
|
9
|
+
/** 最大延迟时间(毫秒) */
|
|
10
|
+
maxDelay?: number;
|
|
11
|
+
/** 重试条件函数 */
|
|
12
|
+
shouldRetry?: (error: unknown) => boolean;
|
|
13
|
+
}
|
|
14
|
+
declare class RetryHandler {
|
|
15
|
+
/**
|
|
16
|
+
* 执行带重试的函数
|
|
17
|
+
*/
|
|
18
|
+
execute<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
19
|
+
/**
|
|
20
|
+
* 延迟函数
|
|
21
|
+
*/
|
|
22
|
+
private sleep;
|
|
23
|
+
/**
|
|
24
|
+
* 判断错误是否可重试
|
|
25
|
+
*/
|
|
26
|
+
isRetryableError(error: unknown): boolean;
|
|
27
|
+
}
|
|
28
|
+
export default RetryHandler;
|
|
29
|
+
//# sourceMappingURL=retry-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-handler.d.ts","sourceRoot":"","sources":["../../src/transport/retry-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,UAAU,YAAY;IACpB,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAED,cAAM,YAAY;IAChB;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC;IA+Bb;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;CAe1C;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { TrackerEvent } from '../types';
|
|
2
|
+
|
|
3
|
+
interface SendOptions {
|
|
4
|
+
/** 是否启用重试 */
|
|
5
|
+
enableRetry?: boolean;
|
|
6
|
+
/** 最大重试次数 */
|
|
7
|
+
maxRetries?: number;
|
|
8
|
+
}
|
|
9
|
+
declare class Sender {
|
|
10
|
+
private serverUrl;
|
|
11
|
+
private retryHandler;
|
|
12
|
+
constructor(serverUrl: string);
|
|
13
|
+
/**
|
|
14
|
+
* 发送单个事件
|
|
15
|
+
*/
|
|
16
|
+
send(event: TrackerEvent, options?: SendOptions): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* 批量发送事件
|
|
19
|
+
*/
|
|
20
|
+
sendBatch(events: TrackerEvent[], options?: SendOptions): Promise<boolean>;
|
|
21
|
+
/**
|
|
22
|
+
* 更新服务器地址
|
|
23
|
+
*/
|
|
24
|
+
setServerUrl(url: string): void;
|
|
25
|
+
}
|
|
26
|
+
export default Sender;
|
|
27
|
+
//# sourceMappingURL=sender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../src/transport/sender.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,UAAU,WAAW;IACnB,aAAa;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,cAAM,MAAM;IACV,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAe;gBAEvB,SAAS,EAAE,MAAM;IAK7B;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAqC5E;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAyCpF;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAGhC;AAED,eAAe,MAAM,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@feiyangdefeng/sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "前端全埋点SDK,支持自动埋点、错误监控、性能监控、会话回放等功能",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.umd.js",
|
|
7
|
+
"module": "./dist/index.es.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.es.js",
|
|
12
|
+
"require": "./dist/index.umd.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "vite build --watch",
|
|
21
|
+
"build": "vite build",
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"lint": "eslint . --ext .ts",
|
|
24
|
+
"format": "prettier --write \"src/**/*.{ts,js}\"",
|
|
25
|
+
"test": "vitest",
|
|
26
|
+
"prepublishOnly": "pnpm typecheck && pnpm build",
|
|
27
|
+
"publish:npm": "node scripts/publish.js"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"tracker",
|
|
31
|
+
"analytics",
|
|
32
|
+
"sdk",
|
|
33
|
+
"埋点",
|
|
34
|
+
"监控"
|
|
35
|
+
],
|
|
36
|
+
"author": "",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://gitee.com/feiyangdefeng_yyx/tracker_sdk.git"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://gitee.com/feiyangdefeng_yyx/tracker_sdk#readme",
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://gitee.com/feiyangdefeng_yyx/tracker_sdk/issues"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=19.0.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^20.10.0",
|
|
51
|
+
"@types/pako": "^2.0.4",
|
|
52
|
+
"@typescript-eslint/eslint-plugin": "^6.13.0",
|
|
53
|
+
"@typescript-eslint/parser": "^6.13.0",
|
|
54
|
+
"@vitest/ui": "^1.6.1",
|
|
55
|
+
"eslint": "^8.54.0",
|
|
56
|
+
"jsdom": "^23.2.0",
|
|
57
|
+
"prettier": "^3.1.0",
|
|
58
|
+
"terser": "^5.44.1",
|
|
59
|
+
"typescript": "^5.3.2",
|
|
60
|
+
"vite": "^5.0.0",
|
|
61
|
+
"vite-plugin-dts": "^3.6.3",
|
|
62
|
+
"vitest": "^1.0.0"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"pako": "^2.1.0"
|
|
66
|
+
},
|
|
67
|
+
"peerDependencies": {
|
|
68
|
+
"node-fetch": "^3.0.0"
|
|
69
|
+
}
|
|
70
|
+
}
|