@macroui/event-tracker 1.3.0 → 1.3.1
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/dist/event-tracker.cjs +4252 -879
- package/dist/event-tracker.cjs.map +1 -0
- package/dist/event-tracker.js +4252 -879
- package/dist/event-tracker.js.map +1 -0
- package/dist/event-tracker.min.js +2 -1
- package/dist/event-tracker.min.js.map +1 -0
- package/dist/event-tracker.mjs +4212 -880
- package/dist/event-tracker.mjs.map +1 -0
- package/dist/plugin/debug-sender.cjs +53 -2
- package/dist/plugin/debug-sender.mjs +53 -2
- package/dist/plugin/experiment.cjs +181 -0
- package/dist/plugin/experiment.cjs.map +1 -0
- package/dist/plugin/experiment.mjs +178 -0
- package/dist/plugin/experiment.mjs.map +1 -0
- package/dist/plugin/indexeddb-sender.cjs +51 -2
- package/dist/plugin/indexeddb-sender.mjs +51 -2
- package/dist/plugin/otel-bridge.cjs +164 -0
- package/dist/plugin/otel-bridge.cjs.map +1 -0
- package/dist/plugin/otel-bridge.mjs +162 -0
- package/dist/plugin/otel-bridge.mjs.map +1 -0
- package/dist/plugin/predictive-batcher.cjs +61 -0
- package/dist/plugin/predictive-batcher.cjs.map +1 -0
- package/dist/plugin/predictive-batcher.mjs +58 -0
- package/dist/plugin/predictive-batcher.mjs.map +1 -0
- package/dist/plugin/webview-bridge.cjs +83 -31
- package/dist/plugin/webview-bridge.mjs +83 -31
- package/dist/stats.cjs +148 -0
- package/dist/stats.cjs.map +1 -0
- package/dist/stats.mjs +145 -0
- package/dist/stats.mjs.map +1 -0
- package/dist/types/core/env.d.ts +2 -0
- package/dist/types/core/failed-queue.d.ts +19 -2
- package/dist/types/core/idle.d.ts +23 -0
- package/dist/types/core/payload-signer.d.ts +31 -0
- package/dist/types/core/pii.d.ts +46 -0
- package/dist/types/core/platform.d.ts +23 -0
- package/dist/types/core/privacy.d.ts +42 -0
- package/dist/types/core/replay.d.ts +41 -0
- package/dist/types/core/retry-policy.d.ts +11 -8
- package/dist/types/core/send-pipeline.d.ts +5 -1
- package/dist/types/core/stats.d.ts +77 -0
- package/dist/types/core/tracker.d.ts +7 -1
- package/dist/types/core/wasm-crypto.d.ts +28 -0
- package/dist/types/edge/index.d.ts +41 -0
- package/dist/types/federation.d.ts +34 -0
- package/dist/types/index.d.ts +42 -1
- package/dist/types/plugins/audience-sync/index.d.ts +67 -0
- package/dist/types/plugins/cross-domain/index.d.ts +20 -0
- package/dist/types/plugins/csp-compliant/index.d.ts +17 -0
- package/dist/types/plugins/experiment/index.d.ts +43 -0
- package/dist/types/plugins/otel-bridge/index.d.ts +22 -0
- package/dist/types/plugins/otel-exporter/index.d.ts +50 -0
- package/dist/types/plugins/pii-detector/index.d.ts +8 -0
- package/dist/types/plugins/predictive-batcher/index.d.ts +29 -0
- package/dist/types/plugins/privacy/index.d.ts +19 -0
- package/dist/types/plugins/rate-limiter/index.d.ts +41 -0
- package/dist/types/plugins/schema-registry/index.d.ts +41 -0
- package/dist/types/plugins/webview-bridge/index.d.ts +33 -9
- package/dist/types/send/ajax-sender.d.ts +6 -1
- package/dist/types/send/batch-sender.d.ts +12 -1
- package/dist/types/send/encode.d.ts +13 -1
- package/dist/types/send/offscreen-sender.d.ts +25 -0
- package/dist/types/send/sender.d.ts +20 -3
- package/dist/types/send/ws-sender.d.ts +38 -0
- package/dist/types/types/config.d.ts +17 -1
- package/dist/types/types/index.d.ts +1 -1
- package/package.json +1 -1
- package/dist/types/types.test-d.d.ts +0 -5
- package/dist/types.test-d.ts +0 -103
|
@@ -1,22 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* WebView 桥(
|
|
3
|
-
* - 客户端(iOS/Android)注入 window.vapph5define 对象
|
|
4
|
-
* - H5 通过 vapph5define.call(name, args) 调用客户端方法
|
|
5
|
-
* - 客户端通过 vapph5define.handle(name, fn) 监听 H5 调用
|
|
2
|
+
* WebView 桥(v2 RPC)
|
|
6
3
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
4
|
+
* v1: vapph5define.call(name, args) 同步返回,缺点:
|
|
5
|
+
* - 没法 timeout
|
|
6
|
+
* - 没法传 callback-style
|
|
7
|
+
* - 没法识别 native async
|
|
8
|
+
*
|
|
9
|
+
* v2:
|
|
10
|
+
* - RPC 协议:call(name, args, cbId) → native 通过 vapph5define.rpc.response(cbId, result)
|
|
11
|
+
* - 自动超时(默认 5s)→ reject
|
|
12
|
+
* - 自动探测:window.vapph5define.rpc / window.vapph5define.call 任一可用
|
|
13
|
+
* - SDK 暴露 sdk.bridge.callAsync(name, args) 返回 Promise
|
|
14
|
+
* - 兼容旧 sdk.bridge.call(name, args)
|
|
15
|
+
* - install 时 fetch app info 可 await
|
|
12
16
|
*/
|
|
13
17
|
import type { Plugin } from '../../core/plugin.js';
|
|
14
18
|
declare global {
|
|
15
19
|
interface Window {
|
|
16
20
|
vapph5define?: {
|
|
21
|
+
/** v1 同步调用 */
|
|
17
22
|
call: (name: string, ...args: unknown[]) => unknown;
|
|
23
|
+
/** v1 监听 */
|
|
18
24
|
handle: (name: string, fn: (...args: unknown[]) => unknown) => void;
|
|
25
|
+
/** 是否在 app 中 */
|
|
19
26
|
isInApp?: boolean;
|
|
27
|
+
/** v2 RPC */
|
|
28
|
+
rpc?: {
|
|
29
|
+
call: (name: string, cbId: string, args: unknown) => void;
|
|
30
|
+
response: (cbId: string, result: unknown, err?: string) => void;
|
|
31
|
+
};
|
|
20
32
|
};
|
|
21
33
|
}
|
|
22
34
|
}
|
|
@@ -27,7 +39,19 @@ export interface WebViewBridgeOptions {
|
|
|
27
39
|
fetchOnInit?: boolean;
|
|
28
40
|
/** 自定义取 app 信息的协议名(默认 'getAppInfo') */
|
|
29
41
|
protocolName?: string;
|
|
42
|
+
/** RPC 默认超时(ms) */
|
|
43
|
+
timeout?: number;
|
|
30
44
|
/** 取回的应用信息合并到 SDK 的字段映射 */
|
|
31
45
|
fieldMap?: Partial<Record<'app_version' | 'app_id' | 'app_state' | 'channel' | 'lib', string>>;
|
|
32
46
|
}
|
|
47
|
+
export interface BridgeAPI {
|
|
48
|
+
/** 同步调用(v1 风格) */
|
|
49
|
+
call: <T = unknown>(name: string, ...args: unknown[]) => T | undefined;
|
|
50
|
+
/** 异步 RPC 调用(v2) */
|
|
51
|
+
callAsync: <T = unknown>(name: string, args?: unknown, timeoutMs?: number) => Promise<T>;
|
|
52
|
+
/** 注册 native handler */
|
|
53
|
+
on: (name: string, fn: (...args: unknown[]) => unknown) => void;
|
|
54
|
+
/** 检测是否在 webview 中 */
|
|
55
|
+
isInApp: () => boolean;
|
|
56
|
+
}
|
|
33
57
|
export declare function webviewBridge(opts?: WebViewBridgeOptions): Plugin;
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Ajax 发送器(fetch + keepalive)
|
|
2
|
+
* Ajax 发送器(fetch + keepalive + gzip)
|
|
3
|
+
*
|
|
4
|
+
* - 支持 gzip(v1.2.0 #6):通过 CompressionStream('gzip')
|
|
5
|
+
* - keepalive: true 支持 unload 后继续发送
|
|
6
|
+
* - Content-Encoding: gzip 用于告诉服务端解码
|
|
3
7
|
*/
|
|
4
8
|
import type { SendContext, Sender } from './sender.js';
|
|
5
9
|
import type { EventData } from '../types/index.js';
|
|
6
10
|
export declare class AjaxSender implements Sender {
|
|
7
11
|
name: "ajax";
|
|
8
12
|
canUse(): boolean;
|
|
13
|
+
private getGzipEnabled;
|
|
9
14
|
send(event: EventData, ctx: SendContext): Promise<void>;
|
|
10
15
|
sendBatch(events: EventData[], ctx: SendContext): Promise<void>;
|
|
11
16
|
}
|
|
@@ -1,15 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Batch 发送器:事件先入队到 localStorage
|
|
2
|
+
* Batch 发送器:事件先入队到 localStorage,链式 setTimeout 调度
|
|
3
|
+
*
|
|
4
|
+
* - 不使用 setInterval,改为每次 flush 完后再排下一次(chain)
|
|
5
|
+
* - 队列满 / 显式 flush 时立即发送
|
|
6
|
+
* - 支持 gzip(v1.2.0 #6)+ CompressionStream
|
|
7
|
+
* - 链式调度避免 setInterval 在页面隐藏时仍在跑
|
|
3
8
|
*/
|
|
4
9
|
import type { SendContext, Sender } from './sender.js';
|
|
5
10
|
import type { EventData } from '../types/index.js';
|
|
6
11
|
export declare class BatchSender implements Sender {
|
|
7
12
|
name: "batch";
|
|
8
13
|
private timer;
|
|
14
|
+
private running;
|
|
15
|
+
private ctx?;
|
|
9
16
|
canUse(): boolean;
|
|
10
17
|
start(ctx: SendContext): void;
|
|
11
18
|
stop(): void;
|
|
12
19
|
send(event: EventData, ctx: SendContext): Promise<void>;
|
|
20
|
+
/** 链式调度:flush 完后再排下一次 */
|
|
21
|
+
private scheduleNext;
|
|
22
|
+
/** 窥探当前队列长度(pipeline.flush 用于 onFlush 计数) */
|
|
23
|
+
peekQueueSize(): number;
|
|
13
24
|
private enqueue;
|
|
14
25
|
private read;
|
|
15
26
|
private write;
|
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 序列化 &
|
|
2
|
+
* 序列化 & 编码(v1.2.0 性能优化)
|
|
3
|
+
*
|
|
4
|
+
* - TextEncoder / URLSearchParams 单例
|
|
5
|
+
* - payload cache(同一 event 短时间内不重复编码)
|
|
6
|
+
* - 提供 base64url safe encode
|
|
3
7
|
*/
|
|
4
8
|
import type { EventData } from '../types/index.js';
|
|
5
9
|
export type EncryptFn = (data: string) => string | Promise<string>;
|
|
10
|
+
export declare function getTextEncoder(): TextEncoder;
|
|
11
|
+
export declare function getTextDecoder(): TextDecoder;
|
|
6
12
|
export declare function encodeEvent(event: EventData, encryptor?: EncryptFn): string | Promise<string>;
|
|
7
13
|
export declare function encodeBatch(events: EventData[], encryptor?: EncryptFn): string | Promise<string>;
|
|
8
14
|
export declare function buildUrl(serverUrl: string | string[], payload: string, contentType?: 'json' | 'form'): string;
|
|
15
|
+
export declare function strToBytes(s: string): Uint8Array;
|
|
16
|
+
export declare function bytesToStr(b: Uint8Array): string;
|
|
17
|
+
export declare function toBase64Url(bytes: Uint8Array): string;
|
|
18
|
+
export declare function _clearPayloadCache(): void;
|
|
19
|
+
/** 反序列化(带缓存) */
|
|
20
|
+
export declare function decodeEvent<T = unknown>(json: string): T;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OffscreenSender (v1.3.0)
|
|
3
|
+
*
|
|
4
|
+
* 把 send/gzip/encrypt 全部挪到 Web Worker,主线程零阻塞
|
|
5
|
+
*
|
|
6
|
+
* - 使用专用 Worker(postMessage 协议)
|
|
7
|
+
* - 主线程仅保留外壳:encodeEvent + postMessage
|
|
8
|
+
* - 支持 batch send(同 worker 内聚合 + 单次 flush)
|
|
9
|
+
* - 不可用时(Safari 14 之前 / Node)自动 fallback 到 ajax
|
|
10
|
+
*/
|
|
11
|
+
import type { Sender, SendContext } from './sender.js';
|
|
12
|
+
import type { EventData } from '../types/index.js';
|
|
13
|
+
export declare class OffscreenSender implements Sender {
|
|
14
|
+
name: "offscreen";
|
|
15
|
+
private worker;
|
|
16
|
+
private fallback?;
|
|
17
|
+
private queue;
|
|
18
|
+
canUse(): boolean;
|
|
19
|
+
private getWorker;
|
|
20
|
+
send(event: EventData, ctx: SendContext): Promise<void>;
|
|
21
|
+
/** 批量发送(worker 内聚合) */
|
|
22
|
+
sendBatch(events: EventData[], ctx: SendContext): Promise<void>;
|
|
23
|
+
/** 关闭 worker */
|
|
24
|
+
destroy(): void;
|
|
25
|
+
}
|
|
@@ -3,18 +3,35 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { EventData, TrackerConfig, SendType } from '../types/index.js';
|
|
5
5
|
import type { Logger } from '../core/logger.js';
|
|
6
|
+
import type { StatsCollector } from '../core/stats.js';
|
|
6
7
|
export interface SendContext {
|
|
7
8
|
config: TrackerConfig;
|
|
8
9
|
logger: Logger;
|
|
10
|
+
/** 可选的 stats 收集器,未提供时退化为无统计模式 */
|
|
11
|
+
stats?: StatsCollector;
|
|
9
12
|
}
|
|
10
13
|
export interface Sender {
|
|
11
14
|
/** 此发送器是否适用于当前上下文 */
|
|
12
15
|
canUse(): boolean;
|
|
16
|
+
/** 发送器名称,用于 pickSender/stats 聚合 */
|
|
17
|
+
name: SendType | string;
|
|
13
18
|
/** 发送单条事件 */
|
|
14
19
|
send(event: EventData, ctx: SendContext): Promise<void> | void;
|
|
15
|
-
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 带 stats 计时 + onSendSuccess / onSendError 钩子的发送包装。
|
|
23
|
+
* 由 SendPipeline 调用,统一埋点失败统计与可观测性。
|
|
24
|
+
*
|
|
25
|
+
* 不作为 Sender 接口成员,由 SendPipeline 显式调用本函数包一层,
|
|
26
|
+
* 这样所有 Sender 子类都不必各自实现。
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export declare function sendWithStats(sender: Sender, event: EventData, ctx: SendContext): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* 支持批量发送的发送器(image/beacon 不支持,ajax/batch 支持)
|
|
32
|
+
*/
|
|
33
|
+
export interface BatchCapableSender extends Sender {
|
|
34
|
+
/** 批量发送 */
|
|
16
35
|
sendBatch?(events: EventData[], ctx: SendContext): Promise<void> | void;
|
|
17
|
-
/** 名称 */
|
|
18
|
-
name: SendType | string;
|
|
19
36
|
}
|
|
20
37
|
export declare function pickSender(type: SendType | undefined, candidates: Sender[]): Sender;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Sender(v1.3.0)
|
|
3
|
+
*
|
|
4
|
+
* - 长连接上报,适合实时数据
|
|
5
|
+
* - 支持服务端反向下发配置(dynamic config)
|
|
6
|
+
* - 自动重连(指数退避)
|
|
7
|
+
* - 离线时本地缓冲
|
|
8
|
+
*/
|
|
9
|
+
import type { Sender, SendContext } from './sender.js';
|
|
10
|
+
import type { EventData, TrackerConfig } from '../types/index.js';
|
|
11
|
+
export interface WebSocketSenderOptions {
|
|
12
|
+
/** WS 服务地址 */
|
|
13
|
+
url: string;
|
|
14
|
+
/** 鉴权 token(首条消息携带) */
|
|
15
|
+
authToken?: string;
|
|
16
|
+
/** 重连延迟上限(ms) */
|
|
17
|
+
maxReconnectMs?: number;
|
|
18
|
+
/** 离线缓冲上限 */
|
|
19
|
+
maxBuffer?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class WebSocketSender implements Sender {
|
|
22
|
+
private opts;
|
|
23
|
+
name: "ws";
|
|
24
|
+
private ws;
|
|
25
|
+
private buffer;
|
|
26
|
+
private reconnectDelay;
|
|
27
|
+
private reconnectTimer;
|
|
28
|
+
private configCb;
|
|
29
|
+
constructor(opts: WebSocketSenderOptions);
|
|
30
|
+
canUse(): boolean;
|
|
31
|
+
connect(): void;
|
|
32
|
+
onConfig(cb: (cfg: Partial<TrackerConfig>) => void): void;
|
|
33
|
+
send(event: EventData, _ctx: SendContext): Promise<void>;
|
|
34
|
+
sendBatch(events: EventData[], _ctx: SendContext): Promise<void>;
|
|
35
|
+
close(): void;
|
|
36
|
+
private safeSend;
|
|
37
|
+
private scheduleReconnect;
|
|
38
|
+
}
|
|
@@ -89,8 +89,24 @@ export interface DebugConfig {
|
|
|
89
89
|
debug?: 0 | 1 | 2;
|
|
90
90
|
/** 是否显示日志 */
|
|
91
91
|
show_log?: boolean;
|
|
92
|
+
/** 自动打印 stats(默认 debug >= 1 时启用) */
|
|
93
|
+
show_stats?: boolean;
|
|
94
|
+
/** stats 打印间隔(ms,默认 60000) */
|
|
95
|
+
stats_interval?: number;
|
|
92
96
|
}
|
|
93
|
-
export
|
|
97
|
+
export interface ObservabilityConfig {
|
|
98
|
+
/** 发送成功(事件 + 耗时) */
|
|
99
|
+
onSendSuccess?: (event: Record<string, unknown>, durationMs: number) => void;
|
|
100
|
+
/** 发送失败 */
|
|
101
|
+
onSendError?: (err: Error, event: Record<string, unknown>) => void;
|
|
102
|
+
/** 每次 flush 完成 */
|
|
103
|
+
onFlush?: (count: number, durationMs: number) => void;
|
|
104
|
+
/** 进入失败队列 */
|
|
105
|
+
onFailedEnqueue?: (event: Record<string, unknown>, reason: string) => void;
|
|
106
|
+
/** 即将重试 */
|
|
107
|
+
onRetry?: (event: Record<string, unknown>, attempt: number) => void;
|
|
108
|
+
}
|
|
109
|
+
export type TrackerConfig = BaseConfig & SendConfig & StorageConfig & IdentityConfig & EncryptConfig & PresetConfig & DebugConfig & ObservabilityConfig & JsAppConfig & ClientConfig & DebugSenderConfig;
|
|
94
110
|
export interface JsAppConfig {
|
|
95
111
|
/** 应用版本(JS) */
|
|
96
112
|
app_version?: string;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 类型总入口(v1.1.1)
|
|
3
3
|
*/
|
|
4
4
|
export type { SendType, StorageType, LogLevel, Callback, JSONValue, JSONObject, JSONArray, PropertyMap, ServerURL, StageName, HookName, } from './common.js';
|
|
5
|
-
export type { BaseConfig, SendConfig, StorageConfig, IdentityConfig, EncryptConfig, PresetConfig, DebugConfig, JsAppConfig, ClientConfig, DebugSenderConfig, TrackerConfig, } from './config.js';
|
|
5
|
+
export type { BaseConfig, SendConfig, StorageConfig, IdentityConfig, EncryptConfig, PresetConfig, DebugConfig, ObservabilityConfig, JsAppConfig, ClientConfig, DebugSenderConfig, TrackerConfig, } from './config.js';
|
|
6
6
|
/** 待发送事件结构 */
|
|
7
7
|
export interface EventData {
|
|
8
8
|
type: 'track' | 'track_signup' | 'track_id_bind' | 'track_id_unbind' | 'profile_set' | 'profile_set_once' | 'profile_increment' | 'profile_append' | 'profile_unset' | 'profile_delete' | 'item_set' | 'item_delete';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@macroui/event-tracker",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "A self-developed web event tracking SDK, inspired by Sensors Analytics. Supports image/beacon/ajax/batch send, full auto-tracking, WebView bridge, and pluggable encryption.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"analytics",
|
package/dist/types.test-d.ts
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 公共 API 类型测试(tsd)
|
|
3
|
-
* 验证公开类型签名稳定
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { expectType, expectAssignable, expectNotAssignable } from 'tsd';
|
|
7
|
-
import { EventTracker } from './types/index.js';
|
|
8
|
-
import type { TrackerConfig, EventData, Callback, SendType, StorageType, ServerURL, StageName, HookName, Plugin, InstallContext, StageInterceptor, Lifecycle, SDKError } from './types/index.js';
|
|
9
|
-
import type { SignedIdentity } from './types/core/signed-identity.js';
|
|
10
|
-
|
|
11
|
-
// ============ EventTracker ============
|
|
12
|
-
expectType<EventTracker>(new EventTracker());
|
|
13
|
-
expectAssignable<{ track: Function }>(new EventTracker());
|
|
14
|
-
expectNotAssignable<EventTracker>({});
|
|
15
|
-
|
|
16
|
-
// ============ TrackerConfig ============
|
|
17
|
-
const cfg: TrackerConfig = {
|
|
18
|
-
app_id: 'demo',
|
|
19
|
-
server_url: 'https://api.test/sa',
|
|
20
|
-
send_type: 'image',
|
|
21
|
-
storage_type: 'memory',
|
|
22
|
-
debug: 1,
|
|
23
|
-
};
|
|
24
|
-
expectAssignable<TrackerConfig>(cfg);
|
|
25
|
-
expectAssignable<TrackerConfig>({ app_id: 'a', server_url: 'https://x' });
|
|
26
|
-
|
|
27
|
-
const single: ServerURL = 'https://api.test';
|
|
28
|
-
const multi: ServerURL = ['https://a.test', 'https://b.test'];
|
|
29
|
-
expectAssignable<ServerURL>(single);
|
|
30
|
-
expectAssignable<ServerURL>(multi);
|
|
31
|
-
|
|
32
|
-
// ============ EventData ============
|
|
33
|
-
const ev: EventData = {
|
|
34
|
-
type: 'track',
|
|
35
|
-
event: 'demo',
|
|
36
|
-
time: Date.now(),
|
|
37
|
-
distinct_id: 'd',
|
|
38
|
-
properties: { x: 1 },
|
|
39
|
-
};
|
|
40
|
-
expectAssignable<EventData>(ev);
|
|
41
|
-
expectAssignable<EventData>({
|
|
42
|
-
type: 'profile_set',
|
|
43
|
-
time: 1,
|
|
44
|
-
distinct_id: 'd',
|
|
45
|
-
properties: { name: 'Alice' },
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// ============ Callback ============
|
|
49
|
-
const cb: Callback = (err: Error | null) => { void err; };
|
|
50
|
-
expectAssignable<Callback>(cb);
|
|
51
|
-
|
|
52
|
-
// ============ SendType / StorageType ============
|
|
53
|
-
const st: SendType = 'beacon';
|
|
54
|
-
expectAssignable<SendType>(st);
|
|
55
|
-
const sto: StorageType = 'localStorage';
|
|
56
|
-
expectAssignable<StorageType>(sto);
|
|
57
|
-
|
|
58
|
-
// ============ StageName / HookName ============
|
|
59
|
-
expectAssignable<StageName>('buildDataStage');
|
|
60
|
-
expectAssignable<StageName>('businessStage');
|
|
61
|
-
expectAssignable<StageName>('sendDataStage');
|
|
62
|
-
expectAssignable<HookName>('sdkReady');
|
|
63
|
-
expectAssignable<HookName>('sdkAfterInitPara');
|
|
64
|
-
|
|
65
|
-
// ============ Plugin / InstallContext ============
|
|
66
|
-
const plugin: Plugin = {
|
|
67
|
-
name: 'demo',
|
|
68
|
-
install(ctx: InstallContext) {
|
|
69
|
-
expectAssignable<TrackerConfig>(ctx.config);
|
|
70
|
-
expectAssignable<EventTracker>(ctx.sdk);
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
expectAssignable<Plugin>(plugin);
|
|
74
|
-
|
|
75
|
-
// ============ StageInterceptor ============
|
|
76
|
-
const interceptor: StageInterceptor<unknown> = {
|
|
77
|
-
name: 'demo',
|
|
78
|
-
priority: 10,
|
|
79
|
-
entry(ctx: { data: unknown; meta: any; cancellationToken: any; owner?: unknown }) {
|
|
80
|
-
expectAssignable<unknown>(ctx.data);
|
|
81
|
-
return undefined;
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
expectAssignable<StageInterceptor<unknown>>(interceptor);
|
|
85
|
-
|
|
86
|
-
// ============ Lifecycle(type-only) ============
|
|
87
|
-
expectAssignable<Lifecycle>({} as Lifecycle);
|
|
88
|
-
|
|
89
|
-
// ============ Errors ============
|
|
90
|
-
expectAssignable<SDKError>({} as SDKError);
|
|
91
|
-
|
|
92
|
-
// ============ SignedIdentity ============
|
|
93
|
-
const si: SignedIdentity = {
|
|
94
|
-
sign: (v: string) => v,
|
|
95
|
-
verify: (v: string, sig: string) => v === sig,
|
|
96
|
-
encode: (v: string) => v,
|
|
97
|
-
decode: (v: string) => v,
|
|
98
|
-
signAsync: async (v: string) => v,
|
|
99
|
-
verifyAsync: async (v: string, s: string) => v === s,
|
|
100
|
-
encodeAsync: async (v: string) => v,
|
|
101
|
-
decodeAsync: async (v: string) => v,
|
|
102
|
-
};
|
|
103
|
-
expectAssignable<SignedIdentity>(si);
|