webfunny-event-node-sdk-public 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 (47) hide show
  1. package/README.md +302 -0
  2. package/dist/constants/index.d.ts +69 -0
  3. package/dist/constants/index.d.ts.map +1 -0
  4. package/dist/constants/index.js +76 -0
  5. package/dist/core/EventBuilder.d.ts +98 -0
  6. package/dist/core/EventBuilder.d.ts.map +1 -0
  7. package/dist/core/EventBuilder.js +222 -0
  8. package/dist/core/WebfunnyEvent.d.ts +89 -0
  9. package/dist/core/WebfunnyEvent.d.ts.map +1 -0
  10. package/dist/core/WebfunnyEvent.js +261 -0
  11. package/dist/core/WebfunnyEventClient.d.ts +123 -0
  12. package/dist/core/WebfunnyEventClient.d.ts.map +1 -0
  13. package/dist/core/WebfunnyEventClient.js +493 -0
  14. package/dist/core/WebfunnyEventException.d.ts +21 -0
  15. package/dist/core/WebfunnyEventException.d.ts.map +1 -0
  16. package/dist/core/WebfunnyEventException.js +50 -0
  17. package/dist/core/WebfunnyEventSDK.d.ts +118 -0
  18. package/dist/core/WebfunnyEventSDK.d.ts.map +1 -0
  19. package/dist/core/WebfunnyEventSDK.js +304 -0
  20. package/dist/core/index.d.ts +7 -0
  21. package/dist/core/index.d.ts.map +1 -0
  22. package/dist/core/index.js +14 -0
  23. package/dist/index.d.ts +54 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +71 -0
  26. package/dist/types/index.d.ts +124 -0
  27. package/dist/types/index.d.ts.map +1 -0
  28. package/dist/types/index.js +7 -0
  29. package/dist/utils/Base64Util.d.ts +52 -0
  30. package/dist/utils/Base64Util.d.ts.map +1 -0
  31. package/dist/utils/Base64Util.js +136 -0
  32. package/dist/utils/EventQueue.d.ts +66 -0
  33. package/dist/utils/EventQueue.d.ts.map +1 -0
  34. package/dist/utils/EventQueue.js +181 -0
  35. package/dist/utils/HttpClient.d.ts +56 -0
  36. package/dist/utils/HttpClient.d.ts.map +1 -0
  37. package/dist/utils/HttpClient.js +146 -0
  38. package/dist/utils/IdGenerator.d.ts +32 -0
  39. package/dist/utils/IdGenerator.d.ts.map +1 -0
  40. package/dist/utils/IdGenerator.js +68 -0
  41. package/dist/utils/SignatureUtil.d.ts +48 -0
  42. package/dist/utils/SignatureUtil.d.ts.map +1 -0
  43. package/dist/utils/SignatureUtil.js +115 -0
  44. package/dist/utils/index.d.ts +6 -0
  45. package/dist/utils/index.d.ts.map +1 -0
  46. package/dist/utils/index.js +11 -0
  47. package/package.json +47 -0
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Webfunny Event SDK 类型定义
3
+ * 对齐Java SDK的类型系统
4
+ */
5
+ /**
6
+ * SDK配置接口 - 对齐Java版WebfunnyEventConfig
7
+ */
8
+ export interface SDKConfig {
9
+ /** 服务端点配置 */
10
+ serverUrl: string;
11
+ /** 项目ID */
12
+ projectId: string;
13
+ /** 签名配置 */
14
+ signatureEnabled?: boolean;
15
+ /** 事件密钥 */
16
+ eventSecret?: string;
17
+ /** 批量上报大小 */
18
+ batchSize?: number;
19
+ /** 上报间隔(ms) */
20
+ flushIntervalMs?: number;
21
+ /** 最大队列大小 */
22
+ maxQueueSize?: number;
23
+ /** 最大重试次数 */
24
+ maxRetries?: number;
25
+ /** 重试间隔(ms) */
26
+ retryIntervalMs?: number;
27
+ /** 连接超时(ms) */
28
+ connectTimeoutMs?: number;
29
+ /** 读取超时(ms) */
30
+ socketTimeoutMs?: number;
31
+ /** 调试模式 */
32
+ debug?: boolean;
33
+ }
34
+ /**
35
+ * 事件数据接口 - 对齐Java版WebfunnyEvent
36
+ */
37
+ export interface EventData {
38
+ /** 项目ID */
39
+ projectId: string;
40
+ /** 点位ID */
41
+ pointId: string;
42
+ /** 用户ID */
43
+ weUserId?: string;
44
+ /** 客户Key */
45
+ weCustomerKey?: string;
46
+ /** IP地址 */
47
+ weIp?: string;
48
+ /** 国家 */
49
+ weCountry?: string;
50
+ /** 省份 */
51
+ weProvince?: string;
52
+ /** 城市 */
53
+ weCity?: string;
54
+ /** 发生时间戳 */
55
+ weHappenTime?: number;
56
+ /** 发生日期 */
57
+ weHappenDate?: string;
58
+ /** 发生小时 */
59
+ weHappenHour?: string;
60
+ /** 发生分钟 */
61
+ weHappenMinute?: string;
62
+ /** 页面路径 */
63
+ wePath?: string;
64
+ /** 首次访问日期 */
65
+ weFirstStepDay?: string;
66
+ /** 关联点位ID */
67
+ weRelationPointId?: string;
68
+ /** 关联字段 */
69
+ weRelationField?: string;
70
+ [key: string]: any;
71
+ }
72
+ /**
73
+ * 上报响应接口 - 对齐Java版UploadResponse
74
+ */
75
+ export interface UploadResponse {
76
+ /** 响应码 */
77
+ code: number;
78
+ /** 响应消息 */
79
+ message?: string;
80
+ /** 响应数据 */
81
+ data?: any;
82
+ /** 签名 */
83
+ signature?: string;
84
+ }
85
+ /**
86
+ * 上报选项接口
87
+ */
88
+ export interface ReportOptions {
89
+ /** 是否立即上报 */
90
+ immediate?: boolean;
91
+ /** 优先级 */
92
+ priority?: number;
93
+ }
94
+ /**
95
+ * 队列项接口
96
+ */
97
+ export interface QueueItem {
98
+ /** 事件数据 */
99
+ event: EventData;
100
+ /** 创建时间 */
101
+ createTime: number;
102
+ }
103
+ /**
104
+ * 回调函数类型
105
+ */
106
+ export type EventCallback = (event: EventData) => void;
107
+ export type ReportCallback = (response: UploadResponse) => void;
108
+ export type ErrorCallback = (error: Error) => void;
109
+ /**
110
+ * 生命周期钩子接口
111
+ */
112
+ export interface LifecycleHooks {
113
+ /** 初始化前 */
114
+ beforeInit?: () => void;
115
+ /** 初始化后 */
116
+ afterInit?: () => void;
117
+ /** 上报前 */
118
+ beforeReport?: (event: EventData) => EventData | boolean;
119
+ /** 上报后 */
120
+ afterReport?: (response: UploadResponse) => void;
121
+ /** 发生错误 */
122
+ onError?: (error: Error) => void;
123
+ }
124
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Webfunny Event SDK 类型定义
4
+ * 对齐Java SDK的类型系统
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2ViZnVubnkgRXZlbnQgU0RLIOexu+Wei+WumuS5iVxuICog5a+56b2QSmF2YSBTREvnmoTnsbvlnovns7vnu59cbiAqL1xuXG4vKipcbiAqIFNES+mFjee9ruaOpeWPoyAtIOWvuem9kEphdmHniYhXZWJmdW5ueUV2ZW50Q29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU0RLQ29uZmlnIHtcbiAgLyoqIOacjeWKoeerr+eCuemFjee9riAqL1xuICBzZXJ2ZXJVcmw6IHN0cmluZztcbiAgLyoqIOmhueebrklEICovXG4gIHByb2plY3RJZDogc3RyaW5nO1xuICAvKiog562+5ZCN6YWN572uICovXG4gIHNpZ25hdHVyZUVuYWJsZWQ/OiBib29sZWFuO1xuICAvKiog5LqL5Lu25a+G6ZKlICovXG4gIGV2ZW50U2VjcmV0Pzogc3RyaW5nO1xuICAvKiog5om56YeP5LiK5oql5aSn5bCPICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIOS4iuaKpemXtOmalChtcykgKi9cbiAgZmx1c2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiog5pyA5aSn6Zif5YiX5aSn5bCPICovXG4gIG1heFF1ZXVlU2l6ZT86IG51bWJlcjtcbiAgLyoqIOacgOWkp+mHjeivleasoeaVsCAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICAvKiog6YeN6K+V6Ze06ZqUKG1zKSAqL1xuICByZXRyeUludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKiDov57mjqXotoXml7YobXMpICovXG4gIGNvbm5lY3RUaW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKiDor7vlj5botoXml7YobXMpICovXG4gIHNvY2tldFRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIOiwg+ivleaooeW8jyAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICog5LqL5Lu25pWw5o2u5o6l5Y+jIC0g5a+56b2QSmF2YeeJiFdlYmZ1bm55RXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmVudERhdGEge1xuICAvLyDlv4XloavlrZfmrrVcbiAgLyoqIOmhueebrklEICovXG4gIHByb2plY3RJZDogc3RyaW5nO1xuICAvKiog54K55L2NSUQgKi9cbiAgcG9pbnRJZDogc3RyaW5nO1xuICBcbiAgLy8g6YCa55So5a2X5q61ICh3ZeW8gOWktOeahOezu+e7n+Wtl+autSlcbiAgLyoqIOeUqOaIt0lEICovXG4gIHdlVXNlcklkPzogc3RyaW5nO1xuICAvKiog5a6i5oi3S2V5ICovXG4gIHdlQ3VzdG9tZXJLZXk/OiBzdHJpbmc7XG4gIC8qKiBJUOWcsOWdgCAqL1xuICB3ZUlwPzogc3RyaW5nO1xuICAvKiog5Zu95a62ICovXG4gIHdlQ291bnRyeT86IHN0cmluZztcbiAgLyoqIOecgeS7vSAqL1xuICB3ZVByb3ZpbmNlPzogc3RyaW5nO1xuICAvKiog5Z+O5biCICovXG4gIHdlQ2l0eT86IHN0cmluZztcbiAgLyoqIOWPkeeUn+aXtumXtOaIsyAqL1xuICB3ZUhhcHBlblRpbWU/OiBudW1iZXI7XG4gIC8qKiDlj5HnlJ/ml6XmnJ8gKi9cbiAgd2VIYXBwZW5EYXRlPzogc3RyaW5nO1xuICAvKiog5Y+R55Sf5bCP5pe2ICovXG4gIHdlSGFwcGVuSG91cj86IHN0cmluZztcbiAgLyoqIOWPkeeUn+WIhumSnyAqL1xuICB3ZUhhcHBlbk1pbnV0ZT86IHN0cmluZztcbiAgLyoqIOmhtemdoui3r+W+hCAqL1xuICB3ZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiDpppbmrKHorr/pl67ml6XmnJ8gKi9cbiAgd2VGaXJzdFN0ZXBEYXk/OiBzdHJpbmc7XG4gIC8qKiDlhbPogZTngrnkvY1JRCAqL1xuICB3ZVJlbGF0aW9uUG9pbnRJZD86IHN0cmluZztcbiAgLyoqIOWFs+iBlOWtl+autSAqL1xuICB3ZVJlbGF0aW9uRmllbGQ/OiBzdHJpbmc7XG4gIFxuICAvLyDoh6rlrprkuYnlj4LmlbDlrZfmrrUgKOmdnndl5byA5aS055qE5Lia5Yqh5a2X5q61KVxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICog5LiK5oql5ZON5bqU5o6l5Y+jIC0g5a+56b2QSmF2YeeJiFVwbG9hZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkUmVzcG9uc2Uge1xuICAvKiog5ZON5bqU56CBICovXG4gIGNvZGU6IG51bWJlcjtcbiAgLyoqIOWTjeW6lOa2iOaBryAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICAvKiog5ZON5bqU5pWw5o2uICovXG4gIGRhdGE/OiBhbnk7XG4gIC8qKiDnrb7lkI0gKi9cbiAgc2lnbmF0dXJlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIOS4iuaKpemAiemhueaOpeWPo1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydE9wdGlvbnMge1xuICAvKiog5piv5ZCm56uL5Y2z5LiK5oqlICovXG4gIGltbWVkaWF0ZT86IGJvb2xlYW47XG4gIC8qKiDkvJjlhYjnuqcgKi9cbiAgcHJpb3JpdHk/OiBudW1iZXI7XG59XG5cbi8qKlxuICog6Zif5YiX6aG55o6l5Y+jXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVJdGVtIHtcbiAgLyoqIOS6i+S7tuaVsOaNriAqL1xuICBldmVudDogRXZlbnREYXRhO1xuICAvKiog5Yib5bu65pe26Ze0ICovXG4gIGNyZWF0ZVRpbWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiDlm57osIPlh73mlbDnsbvlnotcbiAqL1xuZXhwb3J0IHR5cGUgRXZlbnRDYWxsYmFjayA9IChldmVudDogRXZlbnREYXRhKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgUmVwb3J0Q2FsbGJhY2sgPSAocmVzcG9uc2U6IFVwbG9hZFJlc3BvbnNlKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgRXJyb3JDYWxsYmFjayA9IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG5cbi8qKlxuICog55Sf5ZG95ZGo5pyf6ZKp5a2Q5o6l5Y+jXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlSG9va3Mge1xuICAvKiog5Yid5aeL5YyW5YmNICovXG4gIGJlZm9yZUluaXQ/OiAoKSA9PiB2b2lkO1xuICAvKiog5Yid5aeL5YyW5ZCOICovXG4gIGFmdGVySW5pdD86ICgpID0+IHZvaWQ7XG4gIC8qKiDkuIrmiqXliY0gKi9cbiAgYmVmb3JlUmVwb3J0PzogKGV2ZW50OiBFdmVudERhdGEpID0+IEV2ZW50RGF0YSB8IGJvb2xlYW47XG4gIC8qKiDkuIrmiqXlkI4gKi9cbiAgYWZ0ZXJSZXBvcnQ/OiAocmVzcG9uc2U6IFVwbG9hZFJlc3BvbnNlKSA9PiB2b2lkO1xuICAvKiog5Y+R55Sf6ZSZ6K+vICovXG4gIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufVxuIl19
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Base64编解码工具类
3
+ * 对齐Java版Base64Util
4
+ */
5
+ /**
6
+ * Base64工具类
7
+ */
8
+ export declare class Base64Util {
9
+ /**
10
+ * Base64编码 (UTF-8)
11
+ * 对齐Java版encode方法
12
+ * @param input 原始字符串
13
+ * @returns Base64编码后的字符串
14
+ */
15
+ static encode(input: string | null): string | null;
16
+ /**
17
+ * Base64解码 (UTF-8)
18
+ * 对齐Java版decode方法
19
+ * @param input Base64编码的字符串
20
+ * @returns 解码后的字符串
21
+ */
22
+ static decode(input: string | null): string | null;
23
+ /**
24
+ * URL安全的Base64编码
25
+ * @param input 原始字符串
26
+ * @returns URL安全的Base64编码
27
+ */
28
+ static encodeUrlSafe(input: string | null): string | null;
29
+ /**
30
+ * URL安全的Base64解码
31
+ * @param input URL安全的Base64编码
32
+ * @returns 解码后的字符串
33
+ */
34
+ static decodeUrlSafe(input: string | null): string | null;
35
+ /**
36
+ * 处理关联字段的特殊解码
37
+ * 对齐Java版decodeRelationField方法
38
+ * 格式: value1~wf~value2~wf~value3
39
+ * 每个value都是Base64编码的
40
+ * @param input 关联字段值
41
+ * @returns 解码后的值
42
+ */
43
+ static decodeRelationField(input: string | null): string | null;
44
+ /**
45
+ * 编码关联字段
46
+ * 对齐Java版encodeRelationField方法
47
+ * @param values 要编码的值数组
48
+ * @returns 编码后的关联字段值
49
+ */
50
+ static encodeRelationField(...values: (string | null)[]): string;
51
+ }
52
+ //# sourceMappingURL=Base64Util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Base64Util.d.ts","sourceRoot":"","sources":["../../src/utils/Base64Util.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,UAAU;IACrB;;;;;OAKG;WACW,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAWzD;;;;;OAKG;WACW,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAWzD;;;;OAIG;WACW,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAehE;;;;OAIG;WACW,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAkBhE;;;;;;;OAOG;WACW,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAqBtE;;;;;OAKG;WACW,mBAAmB,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM;CAexE"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * Base64编解码工具类
4
+ * 对齐Java版Base64Util
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Base64Util = void 0;
8
+ /**
9
+ * Base64工具类
10
+ */
11
+ class Base64Util {
12
+ /**
13
+ * Base64编码 (UTF-8)
14
+ * 对齐Java版encode方法
15
+ * @param input 原始字符串
16
+ * @returns Base64编码后的字符串
17
+ */
18
+ static encode(input) {
19
+ if (input === null || input === undefined) {
20
+ return null;
21
+ }
22
+ try {
23
+ return Buffer.from(input, 'utf8').toString('base64');
24
+ }
25
+ catch (e) {
26
+ return null;
27
+ }
28
+ }
29
+ /**
30
+ * Base64解码 (UTF-8)
31
+ * 对齐Java版decode方法
32
+ * @param input Base64编码的字符串
33
+ * @returns 解码后的字符串
34
+ */
35
+ static decode(input) {
36
+ if (input === null || input === undefined) {
37
+ return null;
38
+ }
39
+ try {
40
+ return Buffer.from(input, 'base64').toString('utf8');
41
+ }
42
+ catch (e) {
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * URL安全的Base64编码
48
+ * @param input 原始字符串
49
+ * @returns URL安全的Base64编码
50
+ */
51
+ static encodeUrlSafe(input) {
52
+ if (input === null || input === undefined) {
53
+ return null;
54
+ }
55
+ try {
56
+ return Buffer.from(input, 'utf8')
57
+ .toString('base64')
58
+ .replace(/\+/g, '-')
59
+ .replace(/\//g, '_')
60
+ .replace(/=/g, '');
61
+ }
62
+ catch (e) {
63
+ return null;
64
+ }
65
+ }
66
+ /**
67
+ * URL安全的Base64解码
68
+ * @param input URL安全的Base64编码
69
+ * @returns 解码后的字符串
70
+ */
71
+ static decodeUrlSafe(input) {
72
+ if (input === null || input === undefined) {
73
+ return null;
74
+ }
75
+ try {
76
+ // 还原URL安全字符
77
+ let base64 = input.replace(/-/g, '+').replace(/_/g, '/');
78
+ // 补齐padding
79
+ const padding = 4 - (base64.length % 4);
80
+ if (padding !== 4) {
81
+ base64 += '='.repeat(padding);
82
+ }
83
+ return Buffer.from(base64, 'base64').toString('utf8');
84
+ }
85
+ catch (e) {
86
+ return null;
87
+ }
88
+ }
89
+ /**
90
+ * 处理关联字段的特殊解码
91
+ * 对齐Java版decodeRelationField方法
92
+ * 格式: value1~wf~value2~wf~value3
93
+ * 每个value都是Base64编码的
94
+ * @param input 关联字段值
95
+ * @returns 解码后的值
96
+ */
97
+ static decodeRelationField(input) {
98
+ if (input === null || input === undefined || input === '') {
99
+ return input;
100
+ }
101
+ const parts = input.split('~wf~');
102
+ const result = [];
103
+ for (let i = 0; i < parts.length; i++) {
104
+ try {
105
+ const decoded = this.decode(parts[i]);
106
+ result.push(decoded !== null ? decoded : parts[i]);
107
+ }
108
+ catch (e) {
109
+ // 解码失败,使用原始值
110
+ result.push(parts[i]);
111
+ }
112
+ }
113
+ return result.join('~wf~');
114
+ }
115
+ /**
116
+ * 编码关联字段
117
+ * 对齐Java版encodeRelationField方法
118
+ * @param values 要编码的值数组
119
+ * @returns 编码后的关联字段值
120
+ */
121
+ static encodeRelationField(...values) {
122
+ if (values === null || values.length === 0) {
123
+ return '';
124
+ }
125
+ const encodedValues = [];
126
+ for (const value of values) {
127
+ if (value !== null && value !== undefined) {
128
+ const encoded = this.encode(value);
129
+ encodedValues.push(encoded !== null ? encoded : value);
130
+ }
131
+ }
132
+ return encodedValues.join('~wf~');
133
+ }
134
+ }
135
+ exports.Base64Util = Base64Util;
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZTY0VXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9CYXNlNjRVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVIOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBQ3JCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFvQjtRQUN2QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFvQjtRQUN2QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQW9CO1FBQzlDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FB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QixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBaElELGdDQWdJQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZTY057yW6Kej56CB5bel5YW357G7XG4gKiDlr7npvZBKYXZh54mIQmFzZTY0VXRpbFxuICovXG5cbi8qKlxuICogQmFzZTY05bel5YW357G7XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlNjRVdGlsIHtcbiAgLyoqXG4gICAqIEJhc2U2NOe8lueggSAoVVRGLTgpXG4gICAqIOWvuem9kEphdmHniYhlbmNvZGXmlrnms5VcbiAgICogQHBhcmFtIGlucHV0IOWOn+Wni+Wtl+espuS4slxuICAgKiBAcmV0dXJucyBCYXNlNjTnvJbnoIHlkI7nmoTlrZfnrKbkuLJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZW5jb2RlKGlucHV0OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGlucHV0LCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZTY06Kej56CBIChVVEYtOClcbiAgICog5a+56b2QSmF2YeeJiGRlY29kZeaWueazlVxuICAgKiBAcGFyYW0gaW5wdXQgQmFzZTY057yW56CB55qE5a2X56ym5LiyXG4gICAqIEByZXR1cm5zIOino+eggeWQjueahOWtl+espuS4slxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWNvZGUoaW5wdXQ6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oaW5wdXQsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVUkzlronlhajnmoRCYXNlNjTnvJbnoIFcbiAgICogQHBhcmFtIGlucHV0IOWOn+Wni+Wtl+espuS4slxuICAgKiBAcmV0dXJucyBVUkzlronlhajnmoRCYXNlNjTnvJbnoIFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZW5jb2RlVXJsU2FmZShpbnB1dDogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShpbnB1dCwgJ3V0ZjgnKVxuICAgICAgICAudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgICAgICAucmVwbGFjZSgvXFwvL2csICdfJylcbiAgICAgICAgLnJlcGxhY2UoLz0vZywgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVUkzlronlhajnmoRCYXNlNjTop6PnoIFcbiAgICogQHBhcmFtIGlucHV0IFVSTOWuieWFqOeahEJhc2U2NOe8lueggVxuICAgKiBAcmV0dXJucyDop6PnoIHlkI7nmoTlrZfnrKbkuLJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVjb2RlVXJsU2FmZShpbnB1dDogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIOi/mOWOn1VSTOWuieWFqOWtl+esplxuICAgICAgbGV0IGJhc2U2NCA9IGlucHV0LnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgICAvLyDooaXpvZBwYWRkaW5nXG4gICAgICBjb25zdCBwYWRkaW5nID0gNCAtIChiYXNlNjQubGVuZ3RoICUgNCk7XG4gICAgICBpZiAocGFkZGluZyAhPT0gNCkge1xuICAgICAgICBiYXNlNjQgKz0gJz0nLnJlcGVhdChwYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIblhbPogZTlrZfmrrXnmoTnibnmrorop6PnoIFcbiAgICog5a+56b2QSmF2YeeJiGRlY29kZVJlbGF0aW9uRmllbGTmlrnms5VcbiAgICog5qC85byPOiB2YWx1ZTF+d2Z+dmFsdWUyfndmfnZhbHVlM1xuICAgKiDmr4/kuKp2YWx1ZemDveaYr0Jhc2U2NOe8lueggeeahFxuICAgKiBAcGFyYW0gaW5wdXQg5YWz6IGU5a2X5q615YC8XG4gICAqIEByZXR1cm5zIOino+eggeWQjueahOWAvFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWNvZGVSZWxhdGlvbkZpZWxkKGlucHV0OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBpbnB1dC5zcGxpdCgnfndmficpO1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLmRlY29kZShwYXJ0c1tpXSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWQgIT09IG51bGwgPyBkZWNvZGVkIDogcGFydHNbaV0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyDop6PnoIHlpLHotKXvvIzkvb/nlKjljp/lp4vlgLxcbiAgICAgICAgcmVzdWx0LnB1c2gocGFydHNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQuam9pbignfndmficpO1xuICB9XG5cbiAgLyoqXG4gICAqIOe8lueggeWFs+iBlOWtl+autVxuICAgKiDlr7npvZBKYXZh54mIZW5jb2RlUmVsYXRpb25GaWVsZOaWueazlVxuICAgKiBAcGFyYW0gdmFsdWVzIOimgee8lueggeeahOWAvOaVsOe7hFxuICAgKiBAcmV0dXJucyDnvJbnoIHlkI7nmoTlhbPogZTlrZfmrrXlgLxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZW5jb2RlUmVsYXRpb25GaWVsZCguLi52YWx1ZXM6IChzdHJpbmcgfCBudWxsKVtdKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWVzID09PSBudWxsIHx8IHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBlbmNvZGVkVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gdGhpcy5lbmNvZGUodmFsdWUpO1xuICAgICAgICBlbmNvZGVkVmFsdWVzLnB1c2goZW5jb2RlZCAhPT0gbnVsbCA/IGVuY29kZWQgOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuY29kZWRWYWx1ZXMuam9pbignfndmficpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 事件队列管理器
3
+ * 类似Java SDK的队列设计
4
+ */
5
+ import { EventData, ReportOptions, ReportResponse } from '../types';
6
+ /**
7
+ * 事件队列管理器
8
+ */
9
+ export declare class EventQueue {
10
+ private queue;
11
+ private maxSize;
12
+ private batchSize;
13
+ private flushInterval;
14
+ private timer;
15
+ private isProcessing;
16
+ private httpClient;
17
+ /**
18
+ * 构造函数
19
+ */
20
+ constructor(serverUrl: string, maxSize?: number, batchSize?: number, flushInterval?: number);
21
+ /**
22
+ * 添加事件到队列
23
+ */
24
+ enqueue(event: EventData, options?: ReportOptions): boolean;
25
+ /**
26
+ * 获取队列大小
27
+ */
28
+ size(): number;
29
+ /**
30
+ * 清空队列
31
+ */
32
+ clear(): void;
33
+ /**
34
+ * 刷新队列(上报事件)
35
+ */
36
+ flush(): Promise<ReportResponse>;
37
+ /**
38
+ * 立即上报单条事件
39
+ */
40
+ reportImmediately(event: EventData): Promise<ReportResponse>;
41
+ /**
42
+ * 处理重试
43
+ */
44
+ private handleRetry;
45
+ /**
46
+ * 启动定时器
47
+ */
48
+ private startTimer;
49
+ /**
50
+ * 停止定时器
51
+ */
52
+ stopTimer(): void;
53
+ /**
54
+ * 销毁队列
55
+ */
56
+ destroy(): void;
57
+ /**
58
+ * 更新配置
59
+ */
60
+ updateConfig(config: {
61
+ maxSize?: number;
62
+ batchSize?: number;
63
+ flushInterval?: number;
64
+ }): void;
65
+ }
66
+ //# sourceMappingURL=EventQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventQueue.d.ts","sourceRoot":"","sources":["../../src/utils/EventQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAa,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI/E;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,UAAU,CAAa;IAE/B;;OAEG;gBAED,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAA6C,EACtD,SAAS,GAAE,MAAyC,EACpD,aAAa,GAAE,MAA6C;IAS9D;;OAEG;IACI,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO;IAwCtE;;OAEG;IACI,IAAI,IAAI,MAAM;IAIrB;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC;IAoC7C;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC;IAIzE;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;OAEG;IACI,SAAS,IAAI,IAAI;IAOxB;;OAEG;IACI,OAAO,IAAI,IAAI;IAKtB;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI;CAYT"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ /**
3
+ * 事件队列管理器
4
+ * 类似Java SDK的队列设计
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.EventQueue = void 0;
8
+ const constants_1 = require("../constants");
9
+ const HttpClient_1 = require("./HttpClient");
10
+ /**
11
+ * 事件队列管理器
12
+ */
13
+ class EventQueue {
14
+ /**
15
+ * 构造函数
16
+ */
17
+ constructor(serverUrl, maxSize = constants_1.DefaultConfig.DEFAULT_MAX_QUEUE_SIZE, batchSize = constants_1.DefaultConfig.DEFAULT_BATCH_SIZE, flushInterval = constants_1.DefaultConfig.DEFAULT_FLUSH_INTERVAL) {
18
+ this.queue = [];
19
+ this.timer = null;
20
+ this.isProcessing = false;
21
+ this.maxSize = maxSize;
22
+ this.batchSize = batchSize;
23
+ this.flushInterval = flushInterval;
24
+ this.httpClient = HttpClient_1.HttpClient.getInstance(serverUrl);
25
+ this.startTimer();
26
+ }
27
+ /**
28
+ * 添加事件到队列
29
+ */
30
+ enqueue(event, options = {}) {
31
+ // 检查队列是否已满
32
+ if (this.queue.length >= this.maxSize) {
33
+ console.warn(constants_1.ErrorMessage.QUEUE_IS_FULL);
34
+ return false;
35
+ }
36
+ const item = {
37
+ event,
38
+ options: {
39
+ immediate: options.immediate || false,
40
+ priority: options.priority || 0,
41
+ retryTimes: options.retryTimes || constants_1.DefaultConfig.DEFAULT_RETRY_TIMES,
42
+ timeout: options.timeout || constants_1.DefaultConfig.DEFAULT_TIMEOUT,
43
+ },
44
+ retryCount: 0,
45
+ createTime: Date.now(),
46
+ };
47
+ // 根据优先级插入队列
48
+ if (item.options.priority && item.options.priority > 0) {
49
+ // 高优先级插入队首
50
+ const insertIndex = this.queue.findIndex(i => (i.options.priority || 0) < item.options.priority);
51
+ if (insertIndex === -1) {
52
+ this.queue.push(item);
53
+ }
54
+ else {
55
+ this.queue.splice(insertIndex, 0, item);
56
+ }
57
+ }
58
+ else {
59
+ this.queue.push(item);
60
+ }
61
+ // 如果是立即上报,触发刷新
62
+ if (item.options.immediate) {
63
+ this.flush();
64
+ }
65
+ return true;
66
+ }
67
+ /**
68
+ * 获取队列大小
69
+ */
70
+ size() {
71
+ return this.queue.length;
72
+ }
73
+ /**
74
+ * 清空队列
75
+ */
76
+ clear() {
77
+ this.queue = [];
78
+ }
79
+ /**
80
+ * 刷新队列(上报事件)
81
+ */
82
+ async flush() {
83
+ if (this.isProcessing || this.queue.length === 0) {
84
+ return {
85
+ success: true,
86
+ code: constants_1.ErrorCode.SUCCESS,
87
+ message: '队列为空或正在处理中',
88
+ };
89
+ }
90
+ this.isProcessing = true;
91
+ try {
92
+ // 取出批次数据
93
+ const batch = this.queue.splice(0, this.batchSize);
94
+ const events = batch.map(item => item.event);
95
+ // 批量上报
96
+ const response = await this.httpClient.batchReport(events);
97
+ // 处理失败的重试
98
+ if (!response.success) {
99
+ this.handleRetry(batch);
100
+ }
101
+ return response;
102
+ }
103
+ catch (error) {
104
+ return {
105
+ success: false,
106
+ code: constants_1.ErrorCode.REPORT_FAILED,
107
+ message: error instanceof Error ? error.message : '上报失败',
108
+ };
109
+ }
110
+ finally {
111
+ this.isProcessing = false;
112
+ }
113
+ }
114
+ /**
115
+ * 立即上报单条事件
116
+ */
117
+ async reportImmediately(event) {
118
+ return await this.httpClient.singleReport(event);
119
+ }
120
+ /**
121
+ * 处理重试
122
+ */
123
+ handleRetry(failedItems) {
124
+ for (const item of failedItems) {
125
+ if (item.retryCount < (item.options.retryTimes || constants_1.DefaultConfig.DEFAULT_RETRY_TIMES)) {
126
+ item.retryCount++;
127
+ // 重新加入队列尾部
128
+ this.queue.push(item);
129
+ }
130
+ else {
131
+ console.warn(`事件 ${item.event.eventId} 重试次数已用完,丢弃`);
132
+ }
133
+ }
134
+ }
135
+ /**
136
+ * 启动定时器
137
+ */
138
+ startTimer() {
139
+ if (this.timer) {
140
+ clearInterval(this.timer);
141
+ }
142
+ this.timer = setInterval(() => {
143
+ if (this.queue.length > 0) {
144
+ this.flush();
145
+ }
146
+ }, this.flushInterval);
147
+ }
148
+ /**
149
+ * 停止定时器
150
+ */
151
+ stopTimer() {
152
+ if (this.timer) {
153
+ clearInterval(this.timer);
154
+ this.timer = null;
155
+ }
156
+ }
157
+ /**
158
+ * 销毁队列
159
+ */
160
+ destroy() {
161
+ this.stopTimer();
162
+ this.flush();
163
+ }
164
+ /**
165
+ * 更新配置
166
+ */
167
+ updateConfig(config) {
168
+ if (config.maxSize !== undefined) {
169
+ this.maxSize = config.maxSize;
170
+ }
171
+ if (config.batchSize !== undefined) {
172
+ this.batchSize = config.batchSize;
173
+ }
174
+ if (config.flushInterval !== undefined) {
175
+ this.flushInterval = config.flushInterval;
176
+ this.startTimer();
177
+ }
178
+ }
179
+ }
180
+ exports.EventQueue = EventQueue;
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRRdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9FdmVudFF1ZXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUdILDRDQUFzRTtBQUN0RSw2Q0FBMEM7QUFFMUM7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFTckI7O09BRUc7SUFDSCxZQUNFLFNBQWlCLEVBQ2pCLFVBQWtCLHlCQUFhLENBQUMsc0JBQXNCLEVBQ3RELFlBQW9CLHlCQUFhLENBQUMsa0JBQWtCLEVBQ3BELGdCQUF3Qix5QkFBYSxDQUFDLHNCQUFzQjtRQWZ0RCxVQUFLLEdBQWdCLEVBQUUsQ0FBQztRQUl4QixVQUFLLEdBQTBDLElBQUksQ0FBQztRQUNwRCxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQVlwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLHVCQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPLENBQUMsS0FBZ0IsRUFBRSxVQUF5QixFQUFFO1FBQzFELFdBQVc7UUFDWCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQWM7WUFDdEIsS0FBSztZQUNMLE9BQU8sRUFBRTtnQkFDUCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxLQUFLO2dCQUNyQyxR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LENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTztRQUNaLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsTUFJbkI7UUFDQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbk1ELGdDQW1NQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog5LqL5Lu26Zif5YiX566h55CG5ZmoXG4gKiDnsbvkvLxKYXZhIFNES+eahOmYn+WIl+iuvuiuoVxuICovXG5cbmltcG9ydCB7IFF1ZXVlSXRlbSwgRXZlbnREYXRhLCBSZXBvcnRPcHRpb25zLCBSZXBvcnRSZXNwb25zZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IERlZmF1bHRDb25maWcsIEVycm9yQ29kZSwgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICcuL0h0dHBDbGllbnQnO1xuXG4vKipcbiAqIOS6i+S7tumYn+WIl+euoeeQhuWZqFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRRdWV1ZSB7XG4gIHByaXZhdGUgcXVldWU6IFF1ZXVlSXRlbVtdID0gW107XG4gIHByaXZhdGUgbWF4U2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIGJhdGNoU2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIGZsdXNoSW50ZXJ2YWw6IG51bWJlcjtcbiAgcHJpdmF0ZSB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaXNQcm9jZXNzaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudDtcblxuICAvKipcbiAgICog5p6E6YCg5Ye95pWwXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBzZXJ2ZXJVcmw6IHN0cmluZyxcbiAgICBtYXhTaXplOiBudW1iZXIgPSBEZWZhdWx0Q29uZmlnLkRFRkFVTFRfTUFYX1FVRVVFX1NJWkUsXG4gICAgYmF0Y2hTaXplOiBudW1iZXIgPSBEZWZhdWx0Q29uZmlnLkRFRkFVTFRfQkFUQ0hfU0laRSxcbiAgICBmbHVzaEludGVydmFsOiBudW1iZXIgPSBEZWZhdWx0Q29uZmlnLkRFRkFVTFRfRkxVU0hfSU5URVJWQUxcbiAgKSB7XG4gICAgdGhpcy5tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLmJhdGNoU2l6ZSA9IGJhdGNoU2l6ZTtcbiAgICB0aGlzLmZsdXNoSW50ZXJ2YWwgPSBmbHVzaEludGVydmFsO1xuICAgIHRoaXMuaHR0cENsaWVudCA9IEh0dHBDbGllbnQuZ2V0SW5zdGFuY2Uoc2VydmVyVXJsKTtcbiAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmt7vliqDkuovku7bliLDpmJ/liJdcbiAgICovXG4gIHB1YmxpYyBlbnF1ZXVlKGV2ZW50OiBFdmVudERhdGEsIG9wdGlvbnM6IFJlcG9ydE9wdGlvbnMgPSB7fSk6IGJvb2xlYW4ge1xuICAgIC8vIOajgOafpemYn+WIl+aYr+WQpuW3sua7oVxuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+PSB0aGlzLm1heFNpemUpIHtcbiAgICAgIGNvbnNvbGUud2FybihFcnJvck1lc3NhZ2UuUVVFVUVfSVNfRlVMTCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbTogUXVldWVJdGVtID0ge1xuICAgICAgZXZlbnQsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGltbWVkaWF0ZTogb3B0aW9ucy5pbW1lZGlhdGUgfHwgZmFsc2UsXG4gICAgICAgIHByaW9yaXR5OiBvcHRpb25zLnByaW9yaXR5IHx8IDAsXG4gICAgICAgIHJldHJ5VGltZXM6IG9wdGlvbnMucmV0cnlUaW1lcyB8fCBEZWZhdWx0Q29uZmlnLkRFRkFVTFRfUkVUUllfVElNRVMsXG4gICAgICAgIHRpbWVvdXQ6IG9wdGlvbnMudGltZW91dCB8fCBEZWZhdWx0Q29uZmlnLkRFRkFVTFRfVElNRU9VVCxcbiAgICAgIH0sXG4gICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgY3JlYXRlVGltZTogRGF0ZS5ub3coKSxcbiAgICB9O1xuXG4gICAgLy8g5qC55o2u5LyY5YWI57qn5o+S5YWl6Zif5YiXXG4gICAgaWYgKGl0ZW0ub3B0aW9ucy5wcmlvcml0eSAmJiBpdGVtLm9wdGlvbnMucHJpb3JpdHkgPiAwKSB7XG4gICAgICAvLyDpq5jkvJjlhYjnuqfmj5LlhaXpmJ/pppZcbiAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gdGhpcy5xdWV1ZS5maW5kSW5kZXgoaSA9PiAoaS5vcHRpb25zLnByaW9yaXR5IHx8IDApIDwgaXRlbS5vcHRpb25zLnByaW9yaXR5ISk7XG4gICAgICBpZiAoaW5zZXJ0SW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRoaXMucXVldWUucHVzaChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucXVldWUuc3BsaWNlKGluc2VydEluZGV4LCAwLCBpdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIC8vIOWmguaenOaYr+eri+WNs+S4iuaKpe+8jOinpuWPkeWIt+aWsFxuICAgIGlmIChpdGVtLm9wdGlvbnMuaW1tZWRpYXRlKSB7XG4gICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6Zif5YiX5aSn5bCPXG4gICAqL1xuICBwdWJsaWMgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXnqbrpmJ/liJdcbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gIH1cblxuICAvKipcbiAgICog5Yi35paw6Zif5YiX77yI5LiK5oql5LqL5Lu277yJXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmx1c2goKTogUHJvbWlzZTxSZXBvcnRSZXNwb25zZT4ge1xuICAgIGlmICh0aGlzLmlzUHJvY2Vzc2luZyB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgY29kZTogRXJyb3JDb2RlLlNVQ0NFU1MsXG4gICAgICAgIG1lc3NhZ2U6ICfpmJ/liJfkuLrnqbrmiJbmraPlnKjlpITnkIbkuK0nLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8g5Y+W5Ye65om55qyh5pWw5o2uXG4gICAgICBjb25zdCBiYXRjaCA9IHRoaXMucXVldWUuc3BsaWNlKDAsIHRoaXMuYmF0Y2hTaXplKTtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IGJhdGNoLm1hcChpdGVtID0+IGl0ZW0uZXZlbnQpO1xuXG4gICAgICAvLyDmibnph4/kuIrmiqVcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5odHRwQ2xpZW50LmJhdGNoUmVwb3J0KGV2ZW50cyk7XG5cbiAgICAgIC8vIOWkhOeQhuWksei0peeahOmHjeivlVxuICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlUmV0cnkoYmF0Y2gpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBjb2RlOiBFcnJvckNvZGUuUkVQT1JUX0ZBSUxFRCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAn5LiK5oql5aSx6LSlJyxcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOeri+WNs+S4iuaKpeWNleadoeS6i+S7tlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcG9ydEltbWVkaWF0ZWx5KGV2ZW50OiBFdmVudERhdGEpOiBQcm9taXNlPFJlcG9ydFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaHR0cENsaWVudC5zaW5nbGVSZXBvcnQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhumHjeivlVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVSZXRyeShmYWlsZWRJdGVtczogUXVldWVJdGVtW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmFpbGVkSXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnJldHJ5Q291bnQgPCAoaXRlbS5vcHRpb25zLnJldHJ5VGltZXMgfHwgRGVmYXVsdENvbmZpZy5ERUZBVUxUX1JFVFJZX1RJTUVTKSkge1xuICAgICAgICBpdGVtLnJldHJ5Q291bnQrKztcbiAgICAgICAgLy8g6YeN5paw5Yqg5YWl6Zif5YiX5bC+6YOoXG4gICAgICAgIHRoaXMucXVldWUucHVzaChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihg5LqL5Lu2ICR7aXRlbS5ldmVudC5ldmVudElkfSDph43or5XmrKHmlbDlt7LnlKjlrozvvIzkuKLlvINgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5ZCv5Yqo5a6a5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIHN0YXJ0VGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgfVxuXG4gICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgfVxuICAgIH0sIHRoaXMuZmx1c2hJbnRlcnZhbCk7XG4gIH1cblxuICAvKipcbiAgICog5YGc5q2i5a6a5pe25ZmoXG4gICAqL1xuICBwdWJsaWMgc3RvcFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmUgOavgemYn+WIl1xuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB0aGlzLmZsdXNoKCk7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6YWN572uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ29uZmlnKGNvbmZpZzoge1xuICAgIG1heFNpemU/OiBudW1iZXI7XG4gICAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAgIGZsdXNoSW50ZXJ2YWw/OiBudW1iZXI7XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAoY29uZmlnLm1heFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tYXhTaXplID0gY29uZmlnLm1heFNpemU7XG4gICAgfVxuICAgIGlmIChjb25maWcuYmF0Y2hTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYmF0Y2hTaXplID0gY29uZmlnLmJhdGNoU2l6ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5mbHVzaEludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmx1c2hJbnRlcnZhbCA9IGNvbmZpZy5mbHVzaEludGVydmFsO1xuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgfVxuICB9XG59XG4iXX0=