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
package/README.md ADDED
@@ -0,0 +1,302 @@
1
+ # Webfunny Event Node SDK
2
+
3
+ Webfunny事件上报Node.js SDK,对齐Java SDK API设计。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install webfunny-event-node-sdk
9
+ ```
10
+
11
+ ## 快速开始
12
+
13
+ ### 1. 创建客户端
14
+
15
+ ```typescript
16
+ import { WebfunnyEventClient, WebfunnyEvent } from 'webfunny-event-node-sdk';
17
+
18
+ // 方式1: 使用Builder模式(推荐)
19
+ const client = WebfunnyEventClient.builder()
20
+ .serverUrl('https://your-server.com')
21
+ .projectId('your-project-id')
22
+ .eventSecret('your-secret') // 可选,开启签名
23
+ .debug(true) // 可选,开启调试日志
24
+ .build();
25
+
26
+ // 方式2: 直接使用配置对象
27
+ const client = new WebfunnyEventClient({
28
+ serverUrl: 'https://your-server.com',
29
+ projectId: 'your-project-id',
30
+ debug: true
31
+ });
32
+ ```
33
+
34
+ ### 2. 上报事件
35
+
36
+ ```typescript
37
+ // 简单上报 - 只传点位ID
38
+ client.track('12');
39
+
40
+ // 带参数上报
41
+ client.track('13', {
42
+ productId: 'P001',
43
+ amount: 99.99,
44
+ currency: 'CNY'
45
+ });
46
+
47
+ // 使用事件对象上报
48
+ const event = new WebfunnyEvent('your-project-id', '12')
49
+ .setWeUserId('user123')
50
+ .setWeIp('192.168.1.1')
51
+ .addParam('platform', 'web')
52
+ .addParam('version', '1.0.0');
53
+
54
+ client.track(event);
55
+ ```
56
+
57
+ ### 3. 立即上报
58
+
59
+ ```typescript
60
+ // 同步立即上报(阻塞等待结果)
61
+ const response = client.trackImmediately(event);
62
+ console.log(response.code); // 200表示成功
63
+ ```
64
+
65
+ ### 4. 批量上报
66
+
67
+ ```typescript
68
+ const events = [
69
+ new WebfunnyEvent('project-id', 'event_1'),
70
+ new WebfunnyEvent('project-id', 'event_2'),
71
+ new WebfunnyEvent('project-id', 'event_3')
72
+ ];
73
+
74
+ const response = client.trackBatch(events);
75
+ ```
76
+
77
+ ### 5. 关闭客户端
78
+
79
+ ```typescript
80
+ // 应用关闭时调用,会刷新队列中剩余的事件
81
+ client.shutdown();
82
+ ```
83
+
84
+ ## 配置项
85
+
86
+ | 配置项 | 类型 | 必填 | 默认值 | 说明 |
87
+ |--------|------|------|--------|------|
88
+ | serverUrl | string | 是 | - | 服务端点地址 |
89
+ | projectId | string | 是 | - | 项目ID |
90
+ | eventSecret | string | 否 | - | 事件密钥,用于签名 |
91
+ | signatureEnabled | boolean | 否 | false | 是否开启签名验证 |
92
+ | batchSize | number | 否 | 10 | 批量上报大小 |
93
+ | flushIntervalMs | number | 否 | 5000 | 自动刷新间隔(ms) |
94
+ | maxQueueSize | number | 否 | 1000 | 最大队列大小 |
95
+ | maxRetries | number | 否 | 3 | 最大重试次数 |
96
+ | retryIntervalMs | number | 否 | 1000 | 重试间隔(ms) |
97
+ | connectTimeoutMs | number | 否 | 5000 | 连接超时(ms) |
98
+ | socketTimeoutMs | number | 否 | 10000 | 读取超时(ms) |
99
+ | debug | boolean | 否 | false | 调试模式 |
100
+
101
+ ## WebfunnyEvent 事件对象
102
+
103
+ ### 系统字段(we开头)
104
+
105
+ | 字段 | 类型 | 说明 |
106
+ |------|------|------|
107
+ | projectId | string | 项目ID(必填) |
108
+ | pointId | string | 点位ID(必填) |
109
+ | weUserId | string | 用户ID |
110
+ | weCustomerKey | string | 客户Key |
111
+ | weIp | string | IP地址 |
112
+ | weCountry | string | 国家 |
113
+ | weProvince | string | 省份 |
114
+ | weCity | string | 城市 |
115
+ | weHappenTime | number | 发生时间戳 |
116
+ | weHappenDate | string | 发生日期 |
117
+ | weHappenHour | string | 发生小时 |
118
+ | weHappenMinute | string | 发生分钟 |
119
+ | wePath | string | 页面路径 |
120
+ | weFirstStepDay | string | 首次访问日期 |
121
+ | weRelationPointId | string | 关联点位ID |
122
+ | weRelationField | string | 关联字段 |
123
+
124
+ ### 自定义参数
125
+
126
+ ```typescript
127
+ const event = new WebfunnyEvent('project-id', 'custom_event')
128
+ .addParam('productName', 'iPhone 15') // 添加单个参数
129
+ .addParams({ // 批量添加参数
130
+ category: 'electronics',
131
+ price: 6999,
132
+ count: 2
133
+ });
134
+ ```
135
+
136
+ **注意**:自定义参数名不能以`we`开头,会被自动过滤。
137
+
138
+ ## 生命周期钩子
139
+
140
+ ```typescript
141
+ client.setHooks({
142
+ beforeInit: () => {
143
+ console.log('SDK初始化前');
144
+ },
145
+ afterInit: () => {
146
+ console.log('SDK初始化后');
147
+ },
148
+ beforeReport: (event) => {
149
+ console.log('上报前:', event);
150
+ // 返回false可拦截上报
151
+ return true;
152
+ },
153
+ afterReport: (response) => {
154
+ console.log('上报后:', response);
155
+ },
156
+ onError: (error) => {
157
+ console.error('上报错误:', error);
158
+ }
159
+ });
160
+ ```
161
+
162
+ ## 手动刷新队列
163
+
164
+ ```typescript
165
+ // 同步刷新
166
+ client.flush();
167
+
168
+ // 异步刷新
169
+ client.flushAsync();
170
+
171
+ // 获取队列大小
172
+ const size = client.getQueueSize();
173
+ ```
174
+
175
+ ## 异常处理
176
+
177
+ ```typescript
178
+ import { WebfunnyEventException } from 'webfunny-event-node-sdk';
179
+
180
+ try {
181
+ client.track(event);
182
+ } catch (e) {
183
+ if (e instanceof WebfunnyEventException) {
184
+ console.error('错误码:', e.getCode());
185
+ console.error('错误信息:', e.message);
186
+ }
187
+ }
188
+ ```
189
+
190
+ ## 签名验证
191
+
192
+ 开启签名验证可防止数据篡改:
193
+
194
+ ```typescript
195
+ const client = WebfunnyEventClient.builder()
196
+ .serverUrl('https://your-server.com')
197
+ .projectId('your-project-id')
198
+ .eventSecret('your-secret-key') // 设置密钥自动开启签名
199
+ .build();
200
+ ```
201
+
202
+ ## 完整示例
203
+
204
+ ```typescript
205
+ import { WebfunnyEventClient, WebfunnyEvent, WebfunnyEventException } from 'webfunny-event-node-sdk';
206
+
207
+ async function main() {
208
+ // 创建客户端
209
+ const client = WebfunnyEventClient.builder()
210
+ .serverUrl('https://event.webfunny.com')
211
+ .projectId('proj_123456')
212
+ .eventSecret('sk_abcdef')
213
+ .debug(true)
214
+ .batchSize(5)
215
+ .flushIntervalMs(3000)
216
+ .build();
217
+
218
+ // 设置钩子
219
+ client.setHooks({
220
+ beforeReport: (event) => {
221
+ console.log('准备上报:', event.pointId);
222
+ return true;
223
+ },
224
+ afterReport: (response) => {
225
+ console.log('上报完成:', response.code);
226
+ }
227
+ });
228
+
229
+ // 上报各种事件
230
+ client.track('app_start');
231
+
232
+ client.track('page_view', {
233
+ page: '/home',
234
+ duration: 30
235
+ });
236
+
237
+ const clickEvent = new WebfunnyEvent('proj_123456', 'button_click')
238
+ .setWeUserId('user_001')
239
+ .addParam('buttonId', 'submit')
240
+ .addParam('page', '/checkout');
241
+
242
+ client.track(clickEvent);
243
+
244
+ // 模拟应用关闭
245
+ setTimeout(() => {
246
+ client.shutdown();
247
+ }, 10000);
248
+ }
249
+
250
+ main().catch(console.error);
251
+ ```
252
+
253
+ ## API 参考
254
+
255
+ ### WebfunnyEventClient
256
+
257
+ | 方法 | 说明 |
258
+ |------|------|
259
+ | `track(event)` | 上报事件到队列 |
260
+ | `track(pointId, params)` | 快速上报带参数 |
261
+ | `trackImmediately(event)` | 立即同步上报 |
262
+ | `trackBatch(events)` | 批量上报 |
263
+ | `flush()` | 刷新队列 |
264
+ | `flushAsync()` | 异步刷新队列 |
265
+ | `shutdown()` | 关闭客户端 |
266
+ | `getQueueSize()` | 获取队列大小 |
267
+ | `setHooks(hooks)` | 设置生命周期钩子 |
268
+ | `builder()` | 获取Builder实例 |
269
+
270
+ ### WebfunnyEvent
271
+
272
+ | 方法 | 说明 |
273
+ |------|------|
274
+ | `setProjectId(id)` | 设置项目ID |
275
+ | `setPointId(id)` | 设置点位ID |
276
+ | `setWeUserId(id)` | 设置用户ID |
277
+ | `setWeIp(ip)` | 设置IP地址 |
278
+ | `setWeCountry(country)` | 设置国家 |
279
+ | `setWeProvince(province)` | 设置省份 |
280
+ | `setWeCity(city)` | 设置城市 |
281
+ | `setWeHappenTime(time)` | 设置发生时间 |
282
+ | `setWePath(path)` | 设置页面路径 |
283
+ | `addParam(key, value)` | 添加自定义参数 |
284
+ | `addParams(params)` | 批量添加参数 |
285
+ | `toObject()` | 转换为普通对象 |
286
+
287
+ ## 与Java SDK对比
288
+
289
+ | 功能 | Java SDK | Node.js SDK |
290
+ |------|----------|-------------|
291
+ | 创建客户端 | `WebfunnyEventClient.builder()` | `WebfunnyEventClient.builder()` |
292
+ | 上报事件 | `track(event)` | `track(event)` |
293
+ | 立即上报 | `trackImmediately(event)` | `trackImmediately(event)` |
294
+ | 批量上报 | `trackBatch(events)` | `trackBatch(events)` |
295
+ | 关闭客户端 | `shutdown()` | `shutdown()` |
296
+ | 事件对象 | `WebfunnyEvent` | `WebfunnyEvent` |
297
+ | 异常类 | `WebfunnyEventException` | `WebfunnyEventException` |
298
+ | 签名工具 | `SignatureUtil` | `SignatureUtil` |
299
+
300
+ ## License
301
+
302
+ MIT
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Webfunny Event SDK 常量定义
3
+ * 对齐Java SDK的常量类设计
4
+ */
5
+ /**
6
+ * SDK默认配置常量 - 对齐Java版
7
+ */
8
+ export declare class DefaultConfig {
9
+ /** 默认批量大小 */
10
+ static readonly DEFAULT_BATCH_SIZE: number;
11
+ /** 默认刷新间隔(ms) */
12
+ static readonly DEFAULT_FLUSH_INTERVAL_MS: number;
13
+ /** 默认最大队列大小 */
14
+ static readonly DEFAULT_MAX_QUEUE_SIZE: number;
15
+ /** 默认最大重试次数 */
16
+ static readonly DEFAULT_MAX_RETRIES: number;
17
+ /** 默认重试间隔(ms) */
18
+ static readonly DEFAULT_RETRY_INTERVAL_MS: number;
19
+ /** 默认连接超时(ms) */
20
+ static readonly DEFAULT_CONNECT_TIMEOUT_MS: number;
21
+ /** 默认读取超时(ms) */
22
+ static readonly DEFAULT_SOCKET_TIMEOUT_MS: number;
23
+ /** SDK版本 */
24
+ static readonly SDK_VERSION: string;
25
+ }
26
+ /**
27
+ * HTTP常量
28
+ */
29
+ export declare class HttpConstants {
30
+ /** 默认Content-Type */
31
+ static readonly CONTENT_TYPE: string;
32
+ /** 成功状态码 */
33
+ static readonly SUCCESS_CODE: number;
34
+ /** 上报接口路径 */
35
+ static readonly UPLOAD_PATH: string;
36
+ }
37
+ /**
38
+ * 错误码常量
39
+ */
40
+ export declare class ErrorCode {
41
+ /** 成功 */
42
+ static readonly SUCCESS: number;
43
+ /** HTTP成功 */
44
+ static readonly HTTP_SUCCESS: number;
45
+ /** 参数错误 */
46
+ static readonly PARAM_ERROR: number;
47
+ /** 网络错误 */
48
+ static readonly NETWORK_ERROR: number;
49
+ /** 服务器错误 */
50
+ static readonly SERVER_ERROR: number;
51
+ /** 队列已满 */
52
+ static readonly QUEUE_FULL: number;
53
+ /** SDK未初始化 */
54
+ static readonly SDK_NOT_INIT: number;
55
+ /** 上报失败 */
56
+ static readonly REPORT_FAILED: number;
57
+ }
58
+ /**
59
+ * 错误消息常量
60
+ */
61
+ export declare class ErrorMessage {
62
+ static readonly SDK_NOT_INITIALIZED: string;
63
+ static readonly PROJECT_ID_REQUIRED: string;
64
+ static readonly SERVER_URL_REQUIRED: string;
65
+ static readonly QUEUE_IS_FULL: string;
66
+ static readonly POINT_ID_REQUIRED: string;
67
+ static readonly CLIENT_SHUTDOWN: string;
68
+ }
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,aAAa;IACxB,aAAa;IACb,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAM;IAChD,iBAAiB;IACjB,MAAM,CAAC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAQ;IACzD,eAAe;IACf,MAAM,CAAC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAQ;IACtD,eAAe;IACf,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAK;IAChD,iBAAiB;IACjB,MAAM,CAAC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAQ;IACzD,iBAAiB;IACjB,MAAM,CAAC,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAQ;IAC1D,iBAAiB;IACjB,MAAM,CAAC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAS;IAC1D,YAAY;IACZ,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAW;CAC/C;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,qBAAqB;IACrB,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAsB;IAC1D,YAAY;IACZ,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAO;IAC3C,aAAa;IACb,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAe;CACnD;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,SAAS;IACT,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAK;IACpC,aAAa;IACb,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAO;IAC3C,WAAW;IACX,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAQ;IAC3C,WAAW;IACX,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAQ;IAC7C,YAAY;IACZ,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAQ;IAC5C,WAAW;IACX,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAQ;IAC1C,cAAc;IACd,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAQ;IAC5C,WAAW;IACX,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAQ;CAC9C;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAA0B;IACrE,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAoB;IAC/D,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAoB;IAC/D,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAkB;IACvD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAkB;IAC3D,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAsB;CAC9D"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * Webfunny Event SDK 常量定义
4
+ * 对齐Java SDK的常量类设计
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ErrorMessage = exports.ErrorCode = exports.HttpConstants = exports.DefaultConfig = void 0;
8
+ /**
9
+ * SDK默认配置常量 - 对齐Java版
10
+ */
11
+ class DefaultConfig {
12
+ }
13
+ exports.DefaultConfig = DefaultConfig;
14
+ /** 默认批量大小 */
15
+ DefaultConfig.DEFAULT_BATCH_SIZE = 10;
16
+ /** 默认刷新间隔(ms) */
17
+ DefaultConfig.DEFAULT_FLUSH_INTERVAL_MS = 5000;
18
+ /** 默认最大队列大小 */
19
+ DefaultConfig.DEFAULT_MAX_QUEUE_SIZE = 1000;
20
+ /** 默认最大重试次数 */
21
+ DefaultConfig.DEFAULT_MAX_RETRIES = 3;
22
+ /** 默认重试间隔(ms) */
23
+ DefaultConfig.DEFAULT_RETRY_INTERVAL_MS = 1000;
24
+ /** 默认连接超时(ms) */
25
+ DefaultConfig.DEFAULT_CONNECT_TIMEOUT_MS = 5000;
26
+ /** 默认读取超时(ms) */
27
+ DefaultConfig.DEFAULT_SOCKET_TIMEOUT_MS = 10000;
28
+ /** SDK版本 */
29
+ DefaultConfig.SDK_VERSION = '1.0.0';
30
+ /**
31
+ * HTTP常量
32
+ */
33
+ class HttpConstants {
34
+ }
35
+ exports.HttpConstants = HttpConstants;
36
+ /** 默认Content-Type */
37
+ HttpConstants.CONTENT_TYPE = 'application/json';
38
+ /** 成功状态码 */
39
+ HttpConstants.SUCCESS_CODE = 200;
40
+ /** 上报接口路径 */
41
+ HttpConstants.UPLOAD_PATH = '/upEvents';
42
+ /**
43
+ * 错误码常量
44
+ */
45
+ class ErrorCode {
46
+ }
47
+ exports.ErrorCode = ErrorCode;
48
+ /** 成功 */
49
+ ErrorCode.SUCCESS = 0;
50
+ /** HTTP成功 */
51
+ ErrorCode.HTTP_SUCCESS = 200;
52
+ /** 参数错误 */
53
+ ErrorCode.PARAM_ERROR = 1001;
54
+ /** 网络错误 */
55
+ ErrorCode.NETWORK_ERROR = 1002;
56
+ /** 服务器错误 */
57
+ ErrorCode.SERVER_ERROR = 1003;
58
+ /** 队列已满 */
59
+ ErrorCode.QUEUE_FULL = 1004;
60
+ /** SDK未初始化 */
61
+ ErrorCode.SDK_NOT_INIT = 1005;
62
+ /** 上报失败 */
63
+ ErrorCode.REPORT_FAILED = 1006;
64
+ /**
65
+ * 错误消息常量
66
+ */
67
+ class ErrorMessage {
68
+ }
69
+ exports.ErrorMessage = ErrorMessage;
70
+ ErrorMessage.SDK_NOT_INITIALIZED = 'SDK未初始化,请先调用init()方法';
71
+ ErrorMessage.PROJECT_ID_REQUIRED = 'projectId是必填参数';
72
+ ErrorMessage.SERVER_URL_REQUIRED = 'serverUrl是必填参数';
73
+ ErrorMessage.QUEUE_IS_FULL = '事件队列已满,事件被丢弃';
74
+ ErrorMessage.POINT_ID_REQUIRED = 'pointId是必填参数';
75
+ ErrorMessage.CLIENT_SHUTDOWN = 'Client已关闭,无法上报事件';
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RhbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVIOztHQUVHO0FBQ0gsTUFBYSxhQUFhOztBQUExQixzQ0FpQkM7QUFoQkMsYUFBYTtBQUNHLGdDQUFrQixHQUFXLEVBQUUsQ0FBQztBQUNoRCxpQkFBaUI7QUFDRCx1Q0FBeUIsR0FBVyxJQUFJLENBQUM7QUFDekQsZUFBZTtBQUNDLG9DQUFzQixHQUFXLElBQUksQ0FBQztBQUN0RCxlQUFlO0FBQ0MsaUNBQW1CLEdBQVcsQ0FBQyxDQUFDO0FBQ2hELGlCQUFpQjtBQUNELHVDQUF5QixHQUFXLElBQUksQ0FBQztBQUN6RCxpQkFBaUI7QUFDRCx3Q0FBMEIsR0FBVyxJQUFJLENBQUM7QUFDMUQsaUJBQWlCO0FBQ0QsdUNBQXlCLEdBQVcsS0FBSyxDQUFDO0FBQzFELFlBQVk7QUFDSSx5QkFBVyxHQUFXLE9BQU8sQ0FBQztBQUdoRDs7R0FFRztBQUNILE1BQWEsYUFBYTs7QUFBMUIsc0NBT0M7QUFOQyxxQkFBcUI7QUFDTCwwQkFBWSxHQUFXLGtCQUFrQixDQUFDO0FBQzFELFlBQVk7QUFDSSwwQkFBWSxHQUFXLEdBQUcsQ0FBQztBQUMzQyxhQUFhO0FBQ0cseUJBQVcsR0FBVyxXQUFXLENBQUM7QUFHcEQ7O0dBRUc7QUFDSCxNQUFhLFNBQVM7O0FBQXRCLDhCQWlCQztBQWhCQyxTQUFTO0FBQ08saUJBQU8sR0FBVyxDQUFDLENBQUM7QUFDcEMsYUFBYTtBQUNHLHNCQUFZLEdBQVcsR0FBRyxDQUFDO0FBQzNDLFdBQVc7QUFDSyxxQkFBVyxHQUFXLElBQUksQ0FBQztBQUMzQyxXQUFXO0FBQ0ssdUJBQWEsR0FBVyxJQUFJLENBQUM7QUFDN0MsWUFBWTtBQUNJLHNCQUFZLEdBQVcsSUFBSSxDQUFDO0FBQzVDLFdBQVc7QUFDSyxvQkFBVSxHQUFXLElBQUksQ0FBQztBQUMxQyxjQUFjO0FBQ0Usc0JBQVksR0FBVyxJQUFJLENBQUM7QUFDNUMsV0FBVztBQUNLLHVCQUFhLEdBQVcsSUFBSSxDQUFDO0FBRy9DOztHQUVHO0FBQ0gsTUFBYSxZQUFZOztBQUF6QixvQ0FPQztBQU5pQixnQ0FBbUIsR0FBVyxzQkFBc0IsQ0FBQztBQUNyRCxnQ0FBbUIsR0FBVyxnQkFBZ0IsQ0FBQztBQUMvQyxnQ0FBbUIsR0FBVyxnQkFBZ0IsQ0FBQztBQUMvQywwQkFBYSxHQUFXLGNBQWMsQ0FBQztBQUN2Qyw4QkFBaUIsR0FBVyxjQUFjLENBQUM7QUFDM0MsNEJBQWUsR0FBVyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2ViZnVubnkgRXZlbnQgU0RLIOW4uOmHj+WumuS5iVxuICog5a+56b2QSmF2YSBTREvnmoTluLjph4/nsbvorr7orqFcbiAqL1xuXG4vKipcbiAqIFNES+m7mOiupOmFjee9ruW4uOmHjyAtIOWvuem9kEphdmHniYhcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmF1bHRDb25maWcge1xuICAvKiog6buY6K6k5om56YeP5aSn5bCPICovXG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0JBVENIX1NJWkU6IG51bWJlciA9IDEwO1xuICAvKiog6buY6K6k5Yi35paw6Ze06ZqUKG1zKSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GTFVTSF9JTlRFUlZBTF9NUzogbnVtYmVyID0gNTAwMDtcbiAgLyoqIOm7mOiupOacgOWkp+mYn+WIl+Wkp+WwjyAqL1xuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfUVVFVUVfU0laRTogbnVtYmVyID0gMTAwMDtcbiAgLyoqIOm7mOiupOacgOWkp+mHjeivleasoeaVsCAqL1xuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfUkVUUklFUzogbnVtYmVyID0gMztcbiAgLyoqIOm7mOiupOmHjeivlemXtOmalChtcykgKi9cbiAgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUkVUUllfSU5URVJWQUxfTVM6IG51bWJlciA9IDEwMDA7XG4gIC8qKiDpu5jorqTov57mjqXotoXml7YobXMpICovXG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9NUzogbnVtYmVyID0gNTAwMDtcbiAgLyoqIOm7mOiupOivu+WPlui2heaXtihtcykgKi9cbiAgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfU09DS0VUX1RJTUVPVVRfTVM6IG51bWJlciA9IDEwMDAwO1xuICAvKiogU0RL54mI5pysICovXG4gIHN0YXRpYyByZWFkb25seSBTREtfVkVSU0lPTjogc3RyaW5nID0gJzEuMC4wJztcbn1cblxuLyoqXG4gKiBIVFRQ5bi46YePXG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwQ29uc3RhbnRzIHtcbiAgLyoqIOm7mOiupENvbnRlbnQtVHlwZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgQ09OVEVOVF9UWVBFOiBzdHJpbmcgPSAnYXBwbGljYXRpb24vanNvbic7XG4gIC8qKiDmiJDlip/nirbmgIHnoIEgKi9cbiAgc3RhdGljIHJlYWRvbmx5IFNVQ0NFU1NfQ09ERTogbnVtYmVyID0gMjAwO1xuICAvKiog5LiK5oql5o6l5Y+j6Lev5b6EICovXG4gIHN0YXRpYyByZWFkb25seSBVUExPQURfUEFUSDogc3RyaW5nID0gJy91cEV2ZW50cyc7XG59XG5cbi8qKlxuICog6ZSZ6K+v56CB5bi46YePXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckNvZGUge1xuICAvKiog5oiQ5YqfICovXG4gIHN0YXRpYyByZWFkb25seSBTVUNDRVNTOiBudW1iZXIgPSAwO1xuICAvKiogSFRUUOaIkOWKnyAqL1xuICBzdGF0aWMgcmVhZG9ubHkgSFRUUF9TVUNDRVNTOiBudW1iZXIgPSAyMDA7XG4gIC8qKiDlj4LmlbDplJnor68gKi9cbiAgc3RhdGljIHJlYWRvbmx5IFBBUkFNX0VSUk9SOiBudW1iZXIgPSAxMDAxO1xuICAvKiog572R57uc6ZSZ6K+vICovXG4gIHN0YXRpYyByZWFkb25seSBORVRXT1JLX0VSUk9SOiBudW1iZXIgPSAxMDAyO1xuICAvKiog5pyN5Yqh5Zmo6ZSZ6K+vICovXG4gIHN0YXRpYyByZWFkb25seSBTRVJWRVJfRVJST1I6IG51bWJlciA9IDEwMDM7XG4gIC8qKiDpmJ/liJflt7Lmu6EgKi9cbiAgc3RhdGljIHJlYWRvbmx5IFFVRVVFX0ZVTEw6IG51bWJlciA9IDEwMDQ7XG4gIC8qKiBTREvmnKrliJ3lp4vljJYgKi9cbiAgc3RhdGljIHJlYWRvbmx5IFNES19OT1RfSU5JVDogbnVtYmVyID0gMTAwNTtcbiAgLyoqIOS4iuaKpeWksei0pSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgUkVQT1JUX0ZBSUxFRDogbnVtYmVyID0gMTAwNjtcbn1cblxuLyoqXG4gKiDplJnor6/mtojmga/luLjph49cbiAqL1xuZXhwb3J0IGNsYXNzIEVycm9yTWVzc2FnZSB7XG4gIHN0YXRpYyByZWFkb25seSBTREtfTk9UX0lOSVRJQUxJWkVEOiBzdHJpbmcgPSAnU0RL5pyq5Yid5aeL5YyW77yM6K+35YWI6LCD55SoaW5pdCgp5pa55rOVJztcbiAgc3RhdGljIHJlYWRvbmx5IFBST0pFQ1RfSURfUkVRVUlSRUQ6IHN0cmluZyA9ICdwcm9qZWN0SWTmmK/lv4Xloavlj4LmlbAnO1xuICBzdGF0aWMgcmVhZG9ubHkgU0VSVkVSX1VSTF9SRVFVSVJFRDogc3RyaW5nID0gJ3NlcnZlclVybOaYr+W/heWhq+WPguaVsCc7XG4gIHN0YXRpYyByZWFkb25seSBRVUVVRV9JU19GVUxMOiBzdHJpbmcgPSAn5LqL5Lu26Zif5YiX5bey5ruh77yM5LqL5Lu26KKr5Lii5byDJztcbiAgc3RhdGljIHJlYWRvbmx5IFBPSU5UX0lEX1JFUVVJUkVEOiBzdHJpbmcgPSAncG9pbnRJZOaYr+W/heWhq+WPguaVsCc7XG4gIHN0YXRpYyByZWFkb25seSBDTElFTlRfU0hVVERPV046IHN0cmluZyA9ICdDbGllbnTlt7LlhbPpl63vvIzml6Dms5XkuIrmiqXkuovku7YnO1xufVxuIl19
@@ -0,0 +1,98 @@
1
+ /**
2
+ * 事件构建器
3
+ * 类似Java SDK的Builder模式
4
+ */
5
+ import { EventData, EventType, EventLevel, SDKConfig } from '../types';
6
+ /**
7
+ * 事件构建器类
8
+ * 使用Builder模式构建事件对象
9
+ */
10
+ export declare class EventBuilder {
11
+ private event;
12
+ private config;
13
+ /**
14
+ * 构造函数
15
+ */
16
+ constructor(config: SDKConfig);
17
+ /**
18
+ * 初始化默认值
19
+ */
20
+ private initDefaultValues;
21
+ /**
22
+ * 设置事件名称
23
+ */
24
+ setEventName(eventName: string): EventBuilder;
25
+ /**
26
+ * 设置事件类型
27
+ */
28
+ setEventType(eventType: EventType): EventBuilder;
29
+ /**
30
+ * 设置事件级别
31
+ */
32
+ setLevel(level: EventLevel): EventBuilder;
33
+ /**
34
+ * 设置用户ID
35
+ */
36
+ setUserId(userId: string): EventBuilder;
37
+ /**
38
+ * 设置会话ID
39
+ */
40
+ setSessionId(sessionId: string): EventBuilder;
41
+ /**
42
+ * 设置页面URL
43
+ */
44
+ setPageUrl(pageUrl: string): EventBuilder;
45
+ /**
46
+ * 设置页面标题
47
+ */
48
+ setPageTitle(pageTitle: string): EventBuilder;
49
+ /**
50
+ * 添加属性
51
+ */
52
+ addProperty(key: string, value: any): EventBuilder;
53
+ /**
54
+ * 添加多个属性
55
+ */
56
+ addProperties(properties: Record<string, any>): EventBuilder;
57
+ /**
58
+ * 设置扩展数据
59
+ */
60
+ setExtra(extra: Record<string, any>): EventBuilder;
61
+ /**
62
+ * 添加扩展字段
63
+ */
64
+ addExtra(key: string, value: any): EventBuilder;
65
+ /**
66
+ * 设置时间戳
67
+ */
68
+ setTimestamp(timestamp: number): EventBuilder;
69
+ /**
70
+ * 构建事件对象
71
+ */
72
+ build(): EventData;
73
+ /**
74
+ * 重置构建器
75
+ */
76
+ reset(): EventBuilder;
77
+ /**
78
+ * 创建点击事件
79
+ */
80
+ static createClickEvent(config: SDKConfig, elementName: string): EventBuilder;
81
+ /**
82
+ * 创建页面浏览事件
83
+ */
84
+ static createPageViewEvent(config: SDKConfig, pageUrl: string, pageTitle?: string): EventBuilder;
85
+ /**
86
+ * 创建错误事件
87
+ */
88
+ static createErrorEvent(config: SDKConfig, errorMessage: string, errorStack?: string): EventBuilder;
89
+ /**
90
+ * 验证属性键
91
+ */
92
+ private validatePropertyKey;
93
+ /**
94
+ * 验证属性值
95
+ */
96
+ private validatePropertyValue;
97
+ }
98
+ //# sourceMappingURL=EventBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventBuilder.d.ts","sourceRoot":"","sources":["../../src/core/EventBuilder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAIvE;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,MAAM,CAAY;IAE1B;;OAEG;gBACS,MAAM,EAAE,SAAS;IAK7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACI,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IAQpD;;OAEG;IACI,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY;IAKvD;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY;IAKhD;;OAEG;IACI,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAK9C;;OAEG;IACI,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IAKpD;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IAKhD;;OAEG;IACI,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IAKpD;;OAEG;IACI,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,YAAY;IAkBzD;;OAEG;IACI,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,YAAY;IAWnE;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,YAAY;IAKzD;;OAEG;IACI,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,YAAY;IAQtD;;OAEG;IACI,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IAKpD;;OAEG;IACI,KAAK,IAAI,SAAS;IAQzB;;OAEG;IACI,KAAK,IAAI,YAAY;IAK5B;;OAEG;WACW,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY;IAOpF;;OAEG;WACW,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY;IAavG;;OAEG;WACW,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY;IAc1G;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAU9B"}