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.
- package/README.md +302 -0
- package/dist/constants/index.d.ts +69 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +76 -0
- package/dist/core/EventBuilder.d.ts +98 -0
- package/dist/core/EventBuilder.d.ts.map +1 -0
- package/dist/core/EventBuilder.js +222 -0
- package/dist/core/WebfunnyEvent.d.ts +89 -0
- package/dist/core/WebfunnyEvent.d.ts.map +1 -0
- package/dist/core/WebfunnyEvent.js +261 -0
- package/dist/core/WebfunnyEventClient.d.ts +123 -0
- package/dist/core/WebfunnyEventClient.d.ts.map +1 -0
- package/dist/core/WebfunnyEventClient.js +493 -0
- package/dist/core/WebfunnyEventException.d.ts +21 -0
- package/dist/core/WebfunnyEventException.d.ts.map +1 -0
- package/dist/core/WebfunnyEventException.js +50 -0
- package/dist/core/WebfunnyEventSDK.d.ts +118 -0
- package/dist/core/WebfunnyEventSDK.d.ts.map +1 -0
- package/dist/core/WebfunnyEventSDK.js +304 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/types/index.d.ts +124 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/utils/Base64Util.d.ts +52 -0
- package/dist/utils/Base64Util.d.ts.map +1 -0
- package/dist/utils/Base64Util.js +136 -0
- package/dist/utils/EventQueue.d.ts +66 -0
- package/dist/utils/EventQueue.d.ts.map +1 -0
- package/dist/utils/EventQueue.js +181 -0
- package/dist/utils/HttpClient.d.ts +56 -0
- package/dist/utils/HttpClient.d.ts.map +1 -0
- package/dist/utils/HttpClient.js +146 -0
- package/dist/utils/IdGenerator.d.ts +32 -0
- package/dist/utils/IdGenerator.d.ts.map +1 -0
- package/dist/utils/IdGenerator.js +68 -0
- package/dist/utils/SignatureUtil.d.ts +48 -0
- package/dist/utils/SignatureUtil.d.ts.map +1 -0
- package/dist/utils/SignatureUtil.js +115 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- 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":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW;IACX,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IAExB,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAGhB,WAAW;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS;IACT,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS;IACT,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW;IACX,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,SAAS;IACT,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;AACvD,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW;IACX,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU;IACV,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC;IACzD,UAAU;IACV,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IACjD,WAAW;IACX,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC"}
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZTY0VXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9CYXNlNjRVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVIOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBQ3JCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFvQjtRQUN2QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFvQjtRQUN2QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQW9CO1FBQzlDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7aUJBQzlCLFFBQVEsQ0FBQyxRQUFRLENBQUM7aUJBQ2xCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO2lCQUNuQixPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztpQkFDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFvQjtRQUM5QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILFlBQVk7WUFDWixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELFlBQVk7WUFDWixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsQixNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFvQjtRQUNwRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFFNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLGFBQWE7Z0JBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsR0FBRyxNQUF5QjtRQUM1RCxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7UUFDbkMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBaElELGdDQWdJQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZTY057yW6Kej56CB5bel5YW357G7XG4gKiDlr7npvZBKYXZh54mIQmFzZTY0VXRpbFxuICovXG5cbi8qKlxuICogQmFzZTY05bel5YW357G7XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlNjRVdGlsIHtcbiAgLyoqXG4gICAqIEJhc2U2NOe8lueggSAoVVRGLTgpXG4gICAqIOWvuem9kEphdmHniYhlbmNvZGXmlrnms5VcbiAgICogQHBhcmFtIGlucHV0IOWOn+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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRRdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9FdmVudFF1ZXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUdILDRDQUFzRTtBQUN0RSw2Q0FBMEM7QUFFMUM7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFTckI7O09BRUc7SUFDSCxZQUNFLFNBQWlCLEVBQ2pCLFVBQWtCLHlCQUFhLENBQUMsc0JBQXNCLEVBQ3RELFlBQW9CLHlCQUFhLENBQUMsa0JBQWtCLEVBQ3BELGdCQUF3Qix5QkFBYSxDQUFDLHNCQUFzQjtRQWZ0RCxVQUFLLEdBQWdCLEVBQUUsQ0FBQztRQUl4QixVQUFLLEdBQTBDLElBQUksQ0FBQztRQUNwRCxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQVlwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLHVCQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPLENBQUMsS0FBZ0IsRUFBRSxVQUF5QixFQUFFO1FBQzFELFdBQVc7UUFDWCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQWM7WUFDdEIsS0FBSztZQUNMLE9BQU8sRUFBRTtnQkFDUCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxLQUFLO2dCQUNyQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDO2dCQUMvQixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSx5QkFBYSxDQUFDLG1CQUFtQjtnQkFDbkUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUkseUJBQWEsQ0FBQyxlQUFlO2FBQzFEO1lBQ0QsVUFBVSxFQUFFLENBQUM7WUFDYixVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtTQUN2QixDQUFDO1FBRUYsWUFBWTtRQUNaLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkQsV0FBVztZQUNYLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVMsQ0FBQyxDQUFDO1lBQ2xHLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxlQUFlO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUk7UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDVixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakQsT0FBTztnQkFDTCxPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUscUJBQVMsQ0FBQyxPQUFPO2dCQUN2QixPQUFPLEVBQUUsWUFBWTthQUN0QixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXpCLElBQUksQ0FBQztZQUNILFNBQVM7WUFDVCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0MsT0FBTztZQUNQLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFM0QsVUFBVTtZQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUscUJBQVMsQ0FBQyxhQUFhO2dCQUM3QixPQUFPLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTTthQUN6RCxDQUFDO1FBQ0osQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFnQjtRQUM3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLFdBQXdCO1FBQzFDLEtBQUssTUFBTSxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7WUFDL0IsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUkseUJBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsV0FBVztnQkFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxhQUFhLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVU7UUFDaEIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTztRQUNaLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsTUFJbkI7UUFDQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbk1ELGdDQW1NQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog5LqL5Lu26Zif5YiX566h55CG5ZmoXG4gKiDnsbvkvLxKYXZhIFNES+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=
|