@macroui/event-tracker 1.3.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +343 -0
  3. package/bin/event-tracker-suggest.mjs +141 -0
  4. package/bin/event-tracker.mjs +157 -0
  5. package/dist/event-tracker.cjs +3449 -0
  6. package/dist/event-tracker.js +3455 -0
  7. package/dist/event-tracker.min.js +1 -0
  8. package/dist/event-tracker.mjs +3402 -0
  9. package/dist/plugin/auto-track.cjs +201 -0
  10. package/dist/plugin/auto-track.mjs +199 -0
  11. package/dist/plugin/debug-sender.cjs +214 -0
  12. package/dist/plugin/debug-sender.mjs +211 -0
  13. package/dist/plugin/encrypt.cjs +284 -0
  14. package/dist/plugin/encrypt.mjs +275 -0
  15. package/dist/plugin/exposure.cjs +121 -0
  16. package/dist/plugin/exposure.mjs +119 -0
  17. package/dist/plugin/indexeddb-sender.cjs +94 -0
  18. package/dist/plugin/indexeddb-sender.mjs +92 -0
  19. package/dist/plugin/pageleave.cjs +74 -0
  20. package/dist/plugin/pageleave.mjs +72 -0
  21. package/dist/plugin/pageload.cjs +198 -0
  22. package/dist/plugin/pageload.mjs +196 -0
  23. package/dist/plugin/session-event.cjs +142 -0
  24. package/dist/plugin/session-event.mjs +140 -0
  25. package/dist/plugin/webview-bridge.cjs +111 -0
  26. package/dist/plugin/webview-bridge.mjs +109 -0
  27. package/dist/types/core/env.d.ts +10 -0
  28. package/dist/types/core/errors.d.ts +76 -0
  29. package/dist/types/core/failed-queue.d.ts +24 -0
  30. package/dist/types/core/identity-api.d.ts +6 -0
  31. package/dist/types/core/identity.d.ts +39 -0
  32. package/dist/types/core/instance-channel.d.ts +34 -0
  33. package/dist/types/core/lifecycle.d.ts +26 -0
  34. package/dist/types/core/logger.d.ts +13 -0
  35. package/dist/types/core/plugin.d.ts +60 -0
  36. package/dist/types/core/profile-api.d.ts +6 -0
  37. package/dist/types/core/profile-store.d.ts +23 -0
  38. package/dist/types/core/register-api.d.ts +22 -0
  39. package/dist/types/core/retry-policy.d.ts +33 -0
  40. package/dist/types/core/send-pipeline.d.ts +55 -0
  41. package/dist/types/core/signed-identity.d.ts +29 -0
  42. package/dist/types/core/stage.d.ts +48 -0
  43. package/dist/types/core/track-api.d.ts +6 -0
  44. package/dist/types/core/tracker.d.ts +130 -0
  45. package/dist/types/core/uuid.d.ts +4 -0
  46. package/dist/types/index.d.ts +40 -0
  47. package/dist/types/plugins/auto-track/index.d.ts +21 -0
  48. package/dist/types/plugins/debug-sender/index.d.ts +24 -0
  49. package/dist/types/plugins/encrypt/index.d.ts +56 -0
  50. package/dist/types/plugins/exposure/index.d.ts +18 -0
  51. package/dist/types/plugins/indexeddb-sender/index.d.ts +15 -0
  52. package/dist/types/plugins/pageleave/index.d.ts +12 -0
  53. package/dist/types/plugins/pageload/index.d.ts +14 -0
  54. package/dist/types/plugins/session-event/index.d.ts +14 -0
  55. package/dist/types/plugins/webview-bridge/index.d.ts +33 -0
  56. package/dist/types/presets/preset-properties.d.ts +25 -0
  57. package/dist/types/send/ajax-sender.d.ts +11 -0
  58. package/dist/types/send/batch-sender.d.ts +17 -0
  59. package/dist/types/send/beacon-sender.d.ts +10 -0
  60. package/dist/types/send/encode.d.ts +8 -0
  61. package/dist/types/send/image-sender.d.ts +10 -0
  62. package/dist/types/send/sender.d.ts +20 -0
  63. package/dist/types/storage/indexeddb-store.d.ts +14 -0
  64. package/dist/types/storage/store.d.ts +56 -0
  65. package/dist/types/types/common.d.ts +26 -0
  66. package/dist/types/types/config.d.ts +117 -0
  67. package/dist/types/types/constants.d.ts +110 -0
  68. package/dist/types/types/index.d.ts +25 -0
  69. package/dist/types/types.test-d.d.ts +5 -0
  70. package/dist/types.test-d.ts +103 -0
  71. package/package.json +218 -0
@@ -0,0 +1,142 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * 浏览器端辅助方法
5
+ */
6
+ function isBrowser() {
7
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
8
+ }
9
+
10
+ /**
11
+ * SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
12
+ * 命名风格对齐神策,方便跨平台对接
13
+ */
14
+ /** 预置事件名 */
15
+ /** 预置属性 key */
16
+ var PresetProperty = {
17
+ // 会话
18
+ EventSessionId: '$event_session_id'};
19
+
20
+ /**
21
+ * UUID v4 生成(无依赖,使用 crypto.getRandomValues)
22
+ */
23
+ function uuidv4() {
24
+ if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {
25
+ var arr = new Uint8Array(16);
26
+ crypto.getRandomValues(arr);
27
+ // RFC 4122 v4
28
+ arr[6] = (arr[6] & 0x0f) | 0x40;
29
+ arr[8] = (arr[8] & 0x3f) | 0x80;
30
+ var hex = Array.from(arr, function (b) { return b.toString(16).padStart(2, '0'); });
31
+ return (hex.slice(0, 4).join('') +
32
+ '-' +
33
+ hex.slice(4, 6).join('') +
34
+ '-' +
35
+ hex.slice(6, 8).join('') +
36
+ '-' +
37
+ hex.slice(8, 10).join('') +
38
+ '-' +
39
+ hex.slice(10, 16).join(''));
40
+ }
41
+ // 退化实现
42
+ var d = Date.now();
43
+ var d2 = (typeof performance !== 'undefined' && performance.now && performance.now() * 1000) || 0;
44
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
45
+ var r = Math.random() * 16;
46
+ if (d > 0) {
47
+ r = (d + r) % 16 | 0;
48
+ d = Math.floor(d / 16);
49
+ }
50
+ else {
51
+ r = (d2 + r) % 16 | 0;
52
+ d2 = Math.floor(d2 / 16);
53
+ }
54
+ return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
55
+ });
56
+ }
57
+
58
+ /**
59
+ * session-event 插件:会话管理
60
+ * - 每条事件附 $event_session_id(首次访问生成,存 storage)
61
+ * - $session_start / $session_end 事件
62
+ * - 超时(默认 30 分钟)则重开会话
63
+ */
64
+ var SESSION_KEY = 'et_session_id';
65
+ var SESSION_LAST_KEY = 'et_session_last_active';
66
+ var DEFAULT_TIMEOUT = 30 * 60 * 1000; // 30 分钟
67
+ function sessionEvent(opts) {
68
+ var _a;
69
+ if (opts === void 0) { opts = {}; }
70
+ var timeout = (_a = opts.timeout) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT;
71
+ var sdkRef = null;
72
+ var storeRef = null;
73
+ var sessionId = '';
74
+ var lastActive = 0;
75
+ function newSession(reason) {
76
+ sessionId = uuidv4();
77
+ lastActive = Date.now();
78
+ if (storeRef) {
79
+ storeRef.set(SESSION_KEY, sessionId);
80
+ storeRef.set(SESSION_LAST_KEY, String(lastActive));
81
+ }
82
+ if (sdkRef && reason === 'start') {
83
+ sdkRef.track('$session_start', { $event_session_id: sessionId });
84
+ }
85
+ }
86
+ function check() {
87
+ var now = Date.now();
88
+ if (!sessionId || (lastActive && now - lastActive > timeout)) {
89
+ newSession(now - lastActive > timeout ? 'timeout' : 'start');
90
+ }
91
+ lastActive = now;
92
+ if (storeRef)
93
+ storeRef.set(SESSION_LAST_KEY, String(lastActive));
94
+ }
95
+ var interceptor = {
96
+ name: 'session-event',
97
+ priority: 10, // 早于业务拦截器
98
+ entry: function (ctx) {
99
+ if (ctx.meta.stage !== 'buildDataStage')
100
+ return;
101
+ check();
102
+ var ev = ctx.data;
103
+ if (ev && ev.properties) {
104
+ ev.properties[PresetProperty.EventSessionId] = sessionId;
105
+ }
106
+ },
107
+ };
108
+ return {
109
+ name: 'session-event',
110
+ install: function (_a) {
111
+ var sdk = _a.sdk, stages = _a.stages, store = _a.store;
112
+ if (!isBrowser())
113
+ return;
114
+ sdkRef = sdk;
115
+ storeRef = store;
116
+ // 读已有
117
+ var existing = store.get(SESSION_KEY);
118
+ var last = Number(store.get(SESSION_LAST_KEY) || '0');
119
+ if (existing && last && Date.now() - last < timeout) {
120
+ sessionId = existing;
121
+ lastActive = last;
122
+ }
123
+ else {
124
+ newSession('start');
125
+ }
126
+ stages.buildDataStage.register(interceptor);
127
+ // 跨 tab 同步:通过 storage 事件检测其它 tab 关闭
128
+ window.addEventListener('storage', function (ev) {
129
+ if (ev.key === SESSION_KEY && !ev.newValue) {
130
+ // 其它 tab 关闭了会话,本地也清掉
131
+ sessionId = '';
132
+ }
133
+ });
134
+ },
135
+ uninstall: function () {
136
+ sdkRef = null;
137
+ storeRef = null;
138
+ },
139
+ };
140
+ }
141
+
142
+ exports.sessionEvent = sessionEvent;
@@ -0,0 +1,140 @@
1
+ /**
2
+ * 浏览器端辅助方法
3
+ */
4
+ function isBrowser() {
5
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
6
+ }
7
+
8
+ /**
9
+ * SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
10
+ * 命名风格对齐神策,方便跨平台对接
11
+ */
12
+ /** 预置事件名 */
13
+ /** 预置属性 key */
14
+ var PresetProperty = {
15
+ // 会话
16
+ EventSessionId: '$event_session_id'};
17
+
18
+ /**
19
+ * UUID v4 生成(无依赖,使用 crypto.getRandomValues)
20
+ */
21
+ function uuidv4() {
22
+ if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {
23
+ var arr = new Uint8Array(16);
24
+ crypto.getRandomValues(arr);
25
+ // RFC 4122 v4
26
+ arr[6] = (arr[6] & 0x0f) | 0x40;
27
+ arr[8] = (arr[8] & 0x3f) | 0x80;
28
+ var hex = Array.from(arr, function (b) { return b.toString(16).padStart(2, '0'); });
29
+ return (hex.slice(0, 4).join('') +
30
+ '-' +
31
+ hex.slice(4, 6).join('') +
32
+ '-' +
33
+ hex.slice(6, 8).join('') +
34
+ '-' +
35
+ hex.slice(8, 10).join('') +
36
+ '-' +
37
+ hex.slice(10, 16).join(''));
38
+ }
39
+ // 退化实现
40
+ var d = Date.now();
41
+ var d2 = (typeof performance !== 'undefined' && performance.now && performance.now() * 1000) || 0;
42
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
43
+ var r = Math.random() * 16;
44
+ if (d > 0) {
45
+ r = (d + r) % 16 | 0;
46
+ d = Math.floor(d / 16);
47
+ }
48
+ else {
49
+ r = (d2 + r) % 16 | 0;
50
+ d2 = Math.floor(d2 / 16);
51
+ }
52
+ return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
53
+ });
54
+ }
55
+
56
+ /**
57
+ * session-event 插件:会话管理
58
+ * - 每条事件附 $event_session_id(首次访问生成,存 storage)
59
+ * - $session_start / $session_end 事件
60
+ * - 超时(默认 30 分钟)则重开会话
61
+ */
62
+ var SESSION_KEY = 'et_session_id';
63
+ var SESSION_LAST_KEY = 'et_session_last_active';
64
+ var DEFAULT_TIMEOUT = 30 * 60 * 1000; // 30 分钟
65
+ function sessionEvent(opts) {
66
+ var _a;
67
+ if (opts === void 0) { opts = {}; }
68
+ var timeout = (_a = opts.timeout) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT;
69
+ var sdkRef = null;
70
+ var storeRef = null;
71
+ var sessionId = '';
72
+ var lastActive = 0;
73
+ function newSession(reason) {
74
+ sessionId = uuidv4();
75
+ lastActive = Date.now();
76
+ if (storeRef) {
77
+ storeRef.set(SESSION_KEY, sessionId);
78
+ storeRef.set(SESSION_LAST_KEY, String(lastActive));
79
+ }
80
+ if (sdkRef && reason === 'start') {
81
+ sdkRef.track('$session_start', { $event_session_id: sessionId });
82
+ }
83
+ }
84
+ function check() {
85
+ var now = Date.now();
86
+ if (!sessionId || (lastActive && now - lastActive > timeout)) {
87
+ newSession(now - lastActive > timeout ? 'timeout' : 'start');
88
+ }
89
+ lastActive = now;
90
+ if (storeRef)
91
+ storeRef.set(SESSION_LAST_KEY, String(lastActive));
92
+ }
93
+ var interceptor = {
94
+ name: 'session-event',
95
+ priority: 10, // 早于业务拦截器
96
+ entry: function (ctx) {
97
+ if (ctx.meta.stage !== 'buildDataStage')
98
+ return;
99
+ check();
100
+ var ev = ctx.data;
101
+ if (ev && ev.properties) {
102
+ ev.properties[PresetProperty.EventSessionId] = sessionId;
103
+ }
104
+ },
105
+ };
106
+ return {
107
+ name: 'session-event',
108
+ install: function (_a) {
109
+ var sdk = _a.sdk, stages = _a.stages, store = _a.store;
110
+ if (!isBrowser())
111
+ return;
112
+ sdkRef = sdk;
113
+ storeRef = store;
114
+ // 读已有
115
+ var existing = store.get(SESSION_KEY);
116
+ var last = Number(store.get(SESSION_LAST_KEY) || '0');
117
+ if (existing && last && Date.now() - last < timeout) {
118
+ sessionId = existing;
119
+ lastActive = last;
120
+ }
121
+ else {
122
+ newSession('start');
123
+ }
124
+ stages.buildDataStage.register(interceptor);
125
+ // 跨 tab 同步:通过 storage 事件检测其它 tab 关闭
126
+ window.addEventListener('storage', function (ev) {
127
+ if (ev.key === SESSION_KEY && !ev.newValue) {
128
+ // 其它 tab 关闭了会话,本地也清掉
129
+ sessionId = '';
130
+ }
131
+ });
132
+ },
133
+ uninstall: function () {
134
+ sdkRef = null;
135
+ storeRef = null;
136
+ },
137
+ };
138
+ }
139
+
140
+ export { sessionEvent };
@@ -0,0 +1,111 @@
1
+ 'use strict';
2
+
3
+ /******************************************************************************
4
+ Copyright (c) Microsoft Corporation.
5
+
6
+ Permission to use, copy, modify, and/or distribute this software for any
7
+ purpose with or without fee is hereby granted.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
+ PERFORMANCE OF THIS SOFTWARE.
16
+ ***************************************************************************** */
17
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
18
+
19
+
20
+ function __spreadArray(to, from, pack) {
21
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
22
+ if (ar || !(i in from)) {
23
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
24
+ ar[i] = from[i];
25
+ }
26
+ }
27
+ return to.concat(ar || Array.prototype.slice.call(from));
28
+ }
29
+
30
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
31
+ var e = new Error(message);
32
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
33
+ };
34
+
35
+ /**
36
+ * 浏览器端辅助方法
37
+ */
38
+ function isBrowser() {
39
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
40
+ }
41
+
42
+ /**
43
+ * WebView 桥(vapph5 协议)
44
+ * - 客户端(iOS/Android)注入 window.vapph5define 对象
45
+ * - H5 通过 vapph5define.call(name, args) 调用客户端方法
46
+ * - 客户端通过 vapph5define.handle(name, fn) 监听 H5 调用
47
+ *
48
+ * 本插件负责:
49
+ * 1. 探测 WebView 标识
50
+ * 2. 在 SDK 启动时调用 vapph5define.call('getAppInfo'),把 app_version/app_id/...
51
+ * 注入到 config 与公共属性
52
+ * 3. 暴露 helper:bridge.call(name, args) 与 bridge.on(name, fn)
53
+ */
54
+ function webviewBridge(opts) {
55
+ if (opts === void 0) { opts = {}; }
56
+ return {
57
+ name: 'webview-bridge',
58
+ install: function (_a) {
59
+ var sdk = _a.sdk, config = _a.config;
60
+ if (!isBrowser())
61
+ return;
62
+ var win = window;
63
+ var defineName = opts.defineName || 'vapph5define';
64
+ var define = win[defineName];
65
+ if (!define || typeof define.call !== 'function') {
66
+ return; // 不在 WebView 中
67
+ }
68
+ // 暴露 SDK 内部调用的便捷方法
69
+ var bridge = {
70
+ call: function (name) {
71
+ var args = [];
72
+ for (var _i = 1; _i < arguments.length; _i++) {
73
+ args[_i - 1] = arguments[_i];
74
+ }
75
+ return define.call.apply(define, __spreadArray([name], args, false));
76
+ },
77
+ on: function (name, fn) { return define.handle(name, fn); },
78
+ isInApp: function () { return define.isInApp === true || define.call('isInApp') === true; },
79
+ };
80
+ sdk.bridge = bridge;
81
+ config.is_webview = true;
82
+ if (opts.fetchOnInit !== false) {
83
+ try {
84
+ var protocolName = opts.protocolName || 'getAppInfo';
85
+ var result = define.call(protocolName);
86
+ if (result && typeof result === 'object') {
87
+ var fm = opts.fieldMap || {};
88
+ for (var _i = 0, _b = Object.entries(fm); _i < _b.length; _i++) {
89
+ var _c = _b[_i], sdkKey = _c[0], resultKey = _c[1];
90
+ var v = result[resultKey];
91
+ if (v !== undefined && v !== null) {
92
+ config[sdkKey] = v;
93
+ }
94
+ }
95
+ sdk.register({
96
+ $app_version: result.app_version || result.appVersion,
97
+ $app_id: result.app_id || result.appId,
98
+ $channel: result.channel,
99
+ $lib: result.lib || result.lib_name || result.libName,
100
+ });
101
+ }
102
+ }
103
+ catch (_d) {
104
+ /* ignore */
105
+ }
106
+ }
107
+ },
108
+ };
109
+ }
110
+
111
+ exports.webviewBridge = webviewBridge;
@@ -0,0 +1,109 @@
1
+ /******************************************************************************
2
+ Copyright (c) Microsoft Corporation.
3
+
4
+ Permission to use, copy, modify, and/or distribute this software for any
5
+ purpose with or without fee is hereby granted.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
8
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
9
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
10
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
11
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
12
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
13
+ PERFORMANCE OF THIS SOFTWARE.
14
+ ***************************************************************************** */
15
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
16
+
17
+
18
+ function __spreadArray(to, from, pack) {
19
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
20
+ if (ar || !(i in from)) {
21
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
22
+ ar[i] = from[i];
23
+ }
24
+ }
25
+ return to.concat(ar || Array.prototype.slice.call(from));
26
+ }
27
+
28
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
29
+ var e = new Error(message);
30
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
31
+ };
32
+
33
+ /**
34
+ * 浏览器端辅助方法
35
+ */
36
+ function isBrowser() {
37
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
38
+ }
39
+
40
+ /**
41
+ * WebView 桥(vapph5 协议)
42
+ * - 客户端(iOS/Android)注入 window.vapph5define 对象
43
+ * - H5 通过 vapph5define.call(name, args) 调用客户端方法
44
+ * - 客户端通过 vapph5define.handle(name, fn) 监听 H5 调用
45
+ *
46
+ * 本插件负责:
47
+ * 1. 探测 WebView 标识
48
+ * 2. 在 SDK 启动时调用 vapph5define.call('getAppInfo'),把 app_version/app_id/...
49
+ * 注入到 config 与公共属性
50
+ * 3. 暴露 helper:bridge.call(name, args) 与 bridge.on(name, fn)
51
+ */
52
+ function webviewBridge(opts) {
53
+ if (opts === void 0) { opts = {}; }
54
+ return {
55
+ name: 'webview-bridge',
56
+ install: function (_a) {
57
+ var sdk = _a.sdk, config = _a.config;
58
+ if (!isBrowser())
59
+ return;
60
+ var win = window;
61
+ var defineName = opts.defineName || 'vapph5define';
62
+ var define = win[defineName];
63
+ if (!define || typeof define.call !== 'function') {
64
+ return; // 不在 WebView 中
65
+ }
66
+ // 暴露 SDK 内部调用的便捷方法
67
+ var bridge = {
68
+ call: function (name) {
69
+ var args = [];
70
+ for (var _i = 1; _i < arguments.length; _i++) {
71
+ args[_i - 1] = arguments[_i];
72
+ }
73
+ return define.call.apply(define, __spreadArray([name], args, false));
74
+ },
75
+ on: function (name, fn) { return define.handle(name, fn); },
76
+ isInApp: function () { return define.isInApp === true || define.call('isInApp') === true; },
77
+ };
78
+ sdk.bridge = bridge;
79
+ config.is_webview = true;
80
+ if (opts.fetchOnInit !== false) {
81
+ try {
82
+ var protocolName = opts.protocolName || 'getAppInfo';
83
+ var result = define.call(protocolName);
84
+ if (result && typeof result === 'object') {
85
+ var fm = opts.fieldMap || {};
86
+ for (var _i = 0, _b = Object.entries(fm); _i < _b.length; _i++) {
87
+ var _c = _b[_i], sdkKey = _c[0], resultKey = _c[1];
88
+ var v = result[resultKey];
89
+ if (v !== undefined && v !== null) {
90
+ config[sdkKey] = v;
91
+ }
92
+ }
93
+ sdk.register({
94
+ $app_version: result.app_version || result.appVersion,
95
+ $app_id: result.app_id || result.appId,
96
+ $channel: result.channel,
97
+ $lib: result.lib || result.lib_name || result.libName,
98
+ });
99
+ }
100
+ }
101
+ catch (_d) {
102
+ /* ignore */
103
+ }
104
+ }
105
+ },
106
+ };
107
+ }
108
+
109
+ export { webviewBridge };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 浏览器端辅助方法
3
+ */
4
+ export declare function isBrowser(): boolean;
5
+ export declare function hasLocalStorage(): boolean;
6
+ export declare function hasSessionStorage(): boolean;
7
+ export declare function hasCookie(): boolean;
8
+ export declare function hasBeacon(): boolean;
9
+ export declare function hasFetch(): boolean;
10
+ export declare function hasImage(): boolean;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * SDK 统一错误类型(v1.1)
3
+ *
4
+ * 所有内部 / 暴露给用户的错误都继承 SDKError,带 code 字段方便用户处理:
5
+ * - SDKError
6
+ * ├── InitError 配置错误(缺 server_url 等)
7
+ * ├── SendError 发送失败
8
+ * ├── EncryptError 加密 / 解密失败
9
+ * ├── IdentityError 身份 / ID 操作失败
10
+ * ├── StorageError 存储读写失败
11
+ * ├── PluginError 插件 install / uninstall 失败
12
+ * └── ConfigError 配置校验失败
13
+ */
14
+ /** 基类 */
15
+ export declare class SDKError extends Error {
16
+ /** 错误码 */
17
+ readonly code: string;
18
+ /** 原始错误 */
19
+ readonly cause?: unknown;
20
+ /** 出错时间戳 */
21
+ readonly timestamp: number;
22
+ /** 上下文(带最少 1KB 容量) */
23
+ readonly context?: Record<string, unknown>;
24
+ constructor(code: string, message: string, options?: {
25
+ cause?: unknown;
26
+ context?: Record<string, unknown>;
27
+ });
28
+ /** 序列化为对象(方便日志) */
29
+ toJSON(): Record<string, unknown>;
30
+ }
31
+ export declare class InitError extends SDKError {
32
+ constructor(message: string, options?: {
33
+ cause?: unknown;
34
+ context?: Record<string, unknown>;
35
+ });
36
+ }
37
+ export declare class SendError extends SDKError {
38
+ readonly attempts: number;
39
+ constructor(message: string, attempts: number, options?: {
40
+ cause?: unknown;
41
+ context?: Record<string, unknown>;
42
+ });
43
+ }
44
+ export declare class EncryptError extends SDKError {
45
+ constructor(message: string, options?: {
46
+ cause?: unknown;
47
+ context?: Record<string, unknown>;
48
+ });
49
+ }
50
+ export declare class IdentityError extends SDKError {
51
+ constructor(message: string, options?: {
52
+ cause?: unknown;
53
+ context?: Record<string, unknown>;
54
+ });
55
+ }
56
+ export declare class StorageError extends SDKError {
57
+ constructor(message: string, options?: {
58
+ cause?: unknown;
59
+ context?: Record<string, unknown>;
60
+ });
61
+ }
62
+ export declare class PluginError extends SDKError {
63
+ readonly plugin: string;
64
+ constructor(plugin: string, message: string, options?: {
65
+ cause?: unknown;
66
+ context?: Record<string, unknown>;
67
+ });
68
+ }
69
+ export declare class ConfigError extends SDKError {
70
+ constructor(message: string, options?: {
71
+ cause?: unknown;
72
+ context?: Record<string, unknown>;
73
+ });
74
+ }
75
+ /** 判断是否是 SDKError */
76
+ export declare function isSDKError(e: unknown): e is SDKError;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 失败队列
3
+ * - 失败事件写入 localStorage(et_failed_queue)
4
+ * - 下次启动时优先 flush
5
+ * - 上限 50 条
6
+ */
7
+ import type { EventData } from '../types/index.js';
8
+ import { encodeBatch } from '../send/encode.js';
9
+ export declare class FailedQueue {
10
+ private config;
11
+ constructor(config?: {
12
+ max?: number;
13
+ encryptor?: (s: string) => string | Promise<string>;
14
+ });
15
+ /** 读队列 */
16
+ read(): EventData[];
17
+ /** 写一条 */
18
+ enqueue(event: EventData): void;
19
+ /** 清空 */
20
+ clear(): void;
21
+ /** 取走全部(同时清空) */
22
+ takeAll(): EventData[];
23
+ }
24
+ export { encodeBatch };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 身份 API(v1.1.1)
3
+ */
4
+ import type { EventTracker } from '../core/tracker.js';
5
+ import type { IdentityManager } from '../core/identity.js';
6
+ export declare function attachIdentityApi(sdk: EventTracker, identity: IdentityManager): void;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 用户身份管理
3
+ * - distinct_id 业务用户 ID
4
+ * - anonymous_id 匿名 ID(首次访问生成,永不重置)
5
+ * - first_id 首次访问 ID
6
+ */
7
+ import type { KVStore } from '../storage/store.js';
8
+ export declare class IdentityManager {
9
+ private store;
10
+ private opts;
11
+ private distinctId;
12
+ private anonymousId;
13
+ private firstId;
14
+ private loginId;
15
+ private originalId;
16
+ constructor(store: KVStore, opts?: {
17
+ getDistinctId?: () => string;
18
+ setDistinctId?: (id: string) => void;
19
+ getAnonymousId?: () => string;
20
+ setAnonymousId?: (id: string) => void;
21
+ getFirstId?: () => string;
22
+ setFirstId?: (id: string) => void;
23
+ });
24
+ private readOrCreate;
25
+ private persist;
26
+ getDistinctId(): string;
27
+ getAnonymousId(): string;
28
+ getFirstId(): string;
29
+ getLoginId(): string;
30
+ getOriginalId(): string;
31
+ /** 设置业务用户 ID(保留 anonymous/first 关系) */
32
+ identify(distinctId: string, isSave?: boolean): void;
33
+ /** 重置:业务用户登出,回到匿名 */
34
+ resetAnonymousIdentity(newAnonymousId?: string): void;
35
+ /** 登入:等价 identify */
36
+ login(loginId: string): void;
37
+ /** 登出:保留 anonymous,重置 distinct */
38
+ logout(): void;
39
+ }