keytops-game-framework 2.0.0 → 2.1.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.
@@ -1,4 +1,4 @@
1
- import { EmptyAnalyticsSender } from "./AnalyticsAble";
1
+ import { AnalyticsEventData, AnalyticsMappedEvent, AnalyticsUserProperties, EmptyAnalyticsSender } from "./AnalyticsAble";
2
2
  /**
3
3
  * 阿里云日志时间配置
4
4
  */
@@ -55,5 +55,6 @@ export declare class ALiAnalyticsSender extends EmptyAnalyticsSender {
55
55
  private _addListen;
56
56
  private _restoreEvents;
57
57
  protected _doReport(maxCount?: number, store?: boolean): boolean;
58
- send(eventName: string, data: any): Promise<void>;
58
+ mapEvent(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
59
+ send(eventName: string, eventData: AnalyticsEventData, userProperties: AnalyticsUserProperties): Promise<void>;
59
60
  }
@@ -1,7 +1,23 @@
1
1
  /**
2
2
  * 上报数据通用格式定义,方便项目间的通用数据统计
3
3
  */
4
- export type AnalyticsData = {
4
+ export type AnalyticsScalar = string | boolean | number;
5
+ export type AnalyticsItemData = {
6
+ itemId: string;
7
+ itemName?: string;
8
+ itemCategory?: string;
9
+ price: number;
10
+ quantity?: number;
11
+ [key: string]: AnalyticsScalar;
12
+ };
13
+ export type AnalyticsEventValue = AnalyticsScalar | AnalyticsItemData[];
14
+ export type AnalyticsEventData = {
15
+ [key: string]: AnalyticsEventValue;
16
+ };
17
+ export type AnalyticsUserProperties = {
18
+ [key: string]: AnalyticsScalar;
19
+ };
20
+ export type AnalyticsData = AnalyticsEventData & {
5
21
  /**
6
22
  * 标记型ID,可用于关卡id、道具\装备id、广告id等的标记
7
23
  */
@@ -26,16 +42,13 @@ export type AnalyticsData = {
26
42
  * number类型,定义偏向计数数值,可以用于模型行为的计数、数量等。
27
43
  */
28
44
  count?: number;
29
- [key: string]: string | boolean | number;
45
+ [key: string]: AnalyticsEventValue;
46
+ };
47
+ export type AnalyticsMappedEvent = {
48
+ eventName: string;
49
+ data: AnalyticsEventData;
30
50
  };
31
- export type AnalyticsUserPropertyMode = "event" | "sender";
32
51
  export interface IAnalyticsSender {
33
- /**
34
- * 用户属性的承载方式。
35
- * - event: 将用户属性合并到每个事件中(默认,兼容旧 Sender)
36
- * - sender: 由 Sender 通过 setUserProperty 独立处理
37
- */
38
- readonly userPropertyMode?: AnalyticsUserPropertyMode;
39
52
  /**
40
53
  * 是否需要发送
41
54
  * @param eventName
@@ -51,15 +64,15 @@ export interface IAnalyticsSender {
51
64
  * @param eventName 事件名称
52
65
  * @param data 事件数据
53
66
  */
54
- send(eventName: string, data: any): Promise<void>;
67
+ send(eventName: string, eventData: AnalyticsEventData, userProperties: AnalyticsUserProperties): Promise<void>;
55
68
  /**
56
- * 设置平台用户标识。
69
+ * 将框架语义事件转换成统计平台的物理事件。
57
70
  */
58
- setUserId?(userId: string | null): void;
71
+ mapEvent(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
59
72
  /**
60
- * 设置或清除平台用户属性,value 为 null 时表示清除。
73
+ * 设置平台用户标识。
61
74
  */
62
- setUserProperty?(key: string, value: string | number | boolean | null): void;
75
+ setUserId?(userId: string | null): void;
63
76
  }
64
77
  export declare class EmptyAnalyticsSender implements IAnalyticsSender {
65
78
  protected _exclude: string[];
@@ -73,7 +86,8 @@ export declare class EmptyAnalyticsSender implements IAnalyticsSender {
73
86
  */
74
87
  exclude(...excludeList: string[]): void;
75
88
  sendAble(eventName: string): boolean;
76
- send(eventName: string, data: any): Promise<void>;
89
+ mapEvent(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
90
+ send(eventName: string, eventData: AnalyticsEventData, userProperties: AnalyticsUserProperties): Promise<void>;
77
91
  }
78
92
  /**
79
93
  * 统计分析能力
@@ -86,9 +100,9 @@ export declare class AnalyticsAble {
86
100
  protected _senderList: IAnalyticsSender[];
87
101
  protected _staticProperties: AnalyticsData;
88
102
  protected _dynamicCalls: (() => AnalyticsData)[];
89
- protected _userProperties: AnalyticsData;
90
- protected _userOnceProperties: AnalyticsData;
91
- protected _userAddProperties: AnalyticsData;
103
+ protected _userProperties: AnalyticsUserProperties;
104
+ protected _userOnceProperties: AnalyticsUserProperties;
105
+ protected _userAddProperties: AnalyticsUserProperties;
92
106
  protected _timeEvents: Map<string, {
93
107
  start: number;
94
108
  once: boolean;
@@ -101,10 +115,7 @@ export declare class AnalyticsAble {
101
115
  */
102
116
  init(senders: IAnalyticsSender[], debugMode?: boolean): AnalyticsAble;
103
117
  private _initSenderList;
104
- private _usesSenderUserProperties;
105
118
  private _getUserProperties;
106
- private _syncSenderUserState;
107
- private _notifyUserProperty;
108
119
  /**
109
120
  * 设置排除
110
121
  * @param excludeEvents 排除事件名称或者名称列表。
@@ -212,5 +223,5 @@ export declare class AnalyticsAble {
212
223
  report(eventName: string, data?: AnalyticsData): Promise<void>;
213
224
  private _sendAble;
214
225
  private _copyToData;
215
- protected _sendReport(eventName: string, data: any): Promise<void>;
226
+ protected _sendReport(eventName: string, data: AnalyticsEventData): Promise<void>;
216
227
  }
@@ -0,0 +1,39 @@
1
+ import { AnalyticsEventData, AnalyticsMappedEvent } from "./AnalyticsAble";
2
+ /**
3
+ * 框架内部统一使用的业务语义事件名。
4
+ * Sender 负责将它们转换成统计平台实际接收的事件名和参数。
5
+ */
6
+ export declare enum AnalyticsBehavior {
7
+ APP_LAUNCH = "app.launch",
8
+ APP_SHOW = "app.show",
9
+ APP_HIDE = "app.hide",
10
+ APP_ERROR = "app.error",
11
+ SESSION_LOGIN = "session.login",
12
+ LEVEL_START = "level.start",
13
+ LEVEL_END = "level.end",
14
+ LEVEL_PAUSE = "level.pause",
15
+ LEVEL_TIMEOUT = "level.timeout",
16
+ LEVEL_ITEM_USE = "level.item_use",
17
+ AD_LIFECYCLE = "ad.lifecycle",
18
+ AD_IMPRESSION = "ad.impression",
19
+ SOCIAL_SHARE = "social.share",
20
+ SOCIAL_SUBSCRIBE_SHOW = "social.subscribe_show",
21
+ SOCIAL_SUBSCRIBE = "social.subscribe",
22
+ TUTORIAL_BEGIN = "tutorial.begin",
23
+ TUTORIAL_COMPLETE = "tutorial.complete",
24
+ TUTORIAL_SKIP = "tutorial.skip",
25
+ PAY_BEGIN = "pay.begin",
26
+ PAY_PURCHASE = "pay.purchase",
27
+ PAY_PENDING = "pay.pending",
28
+ PAY_CANCEL = "pay.cancel",
29
+ PAY_FAIL = "pay.fail"
30
+ }
31
+ /**
32
+ * Keytops/Ali 当前服务端仍使用的物理协议。
33
+ * 兼容逻辑集中在 Sender 边界,业务层无需继续依赖旧事件字符串。
34
+ */
35
+ export declare function mapCanonicalEventToLegacy(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
36
+ /**
37
+ * 小游戏平台通常不接受点号事件名,统一转换为下划线。
38
+ */
39
+ export declare function mapCanonicalEventToFlatName(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
@@ -1,4 +1,4 @@
1
- import { EmptyAnalyticsSender } from "./AnalyticsAble";
1
+ import { AnalyticsEventData, AnalyticsMappedEvent, AnalyticsUserProperties, EmptyAnalyticsSender } from "./AnalyticsAble";
2
2
  export interface KeytopsAnalyticsConfig {
3
3
  /**
4
4
  * 上报地址
@@ -62,6 +62,7 @@ export declare class KeytopsAnalyticsSender extends EmptyAnalyticsSender {
62
62
  private _sendBatch;
63
63
  private _sendBatchWithRetry;
64
64
  protected _doReport(maxCount?: number, store?: boolean): Promise<boolean>;
65
- send(eventName: string, data: any): Promise<void>;
65
+ mapEvent(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
66
+ send(eventName: string, eventData: AnalyticsEventData, userProperties: AnalyticsUserProperties): Promise<void>;
66
67
  }
67
68
  export {};
@@ -86,5 +86,5 @@ export declare class ADBehaviorReporter {
86
86
  * @param from 广告来源
87
87
  * @param msg 广告失败原因
88
88
  */
89
- report(type: ADType, event: ADEvent, from: AdFrom, msg?: string): void;
89
+ report(type: ADType, event: ADEvent, from: AdFrom, msg?: string, impression?: boolean): void;
90
90
  }
@@ -0,0 +1,39 @@
1
+ import { AnalyticsEventData, AnalyticsMappedEvent, AnalyticsUserProperties, EmptyAnalyticsSender } from "../AnalyticsAble";
2
+ export interface FirebaseAnalyticsSenderConfig {
3
+ /**
4
+ * 游戏工程内 FirebaseAnalyticsBridge 的完整 Java 类名。
5
+ */
6
+ bridgeClassName: string;
7
+ collectionEnabled?: boolean;
8
+ ignoredParameters?: string[];
9
+ maxParameters?: number;
10
+ /**
11
+ * Java Bridge 是否已支持把 items 转成 Bundle[]。
12
+ */
13
+ supportsStructuredItems?: boolean;
14
+ debug?: boolean;
15
+ }
16
+ /**
17
+ * Firebase Android Analytics 上报器。
18
+ *
19
+ * TS 端属于框架,Java Bridge 仍由具体游戏工程提供。非原生环境会安全忽略调用。
20
+ */
21
+ export declare class FirebaseAnalyticsSender extends EmptyAnalyticsSender {
22
+ private readonly _config;
23
+ private readonly _ignoredParameters;
24
+ private _lastUserId;
25
+ private _lastUserProperties;
26
+ constructor(config: FirebaseAnalyticsSenderConfig, exclude?: string[]);
27
+ get canSend(): boolean;
28
+ setUserId(userId: string | null): void;
29
+ mapEvent(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
30
+ send(eventName: string, eventData: AnalyticsEventData, userProperties: AnalyticsUserProperties): Promise<void>;
31
+ private mapParameters;
32
+ private syncUserProperties;
33
+ private setUserProperty;
34
+ private normalizeParameters;
35
+ private normalizeValue;
36
+ private isValidName;
37
+ private truncate;
38
+ private warn;
39
+ }
@@ -4,10 +4,24 @@ import { LevelAnalyticsAble } from "./level/LevelAnalyticsAble";
4
4
  import { LaunchAnalyticsAble } from "./launch/LaunchAnalyticsAble";
5
5
  import { SessionAnalyticsAble } from "./session/SessionAnalyticsAble";
6
6
  import { SocialAnalyticsAble } from "./social/SocialAnalyticsAble";
7
+ import { TutorialAnalyticsAble } from "./tutorial/TutorialAnalyticsAble";
8
+ import { PayAnalyticsAble } from "./pay/PayAnalyticsAble";
7
9
  export * from "./AnalyticsAble";
10
+ export * from "./AnalyticsEvent";
8
11
  export * from "./ALiAnalyticsSender";
9
12
  export * from "./KeytopsAnalyticsSender";
10
13
  export * from "./launch/LaunchAnalyticsAble";
14
+ export * from "./social/SocialAnalyticsAble";
15
+ export * from "./tutorial/TutorialAnalyticsAble";
16
+ export * from "./pay/PayAnalyticsAble";
17
+ export * from "./firebase/FirebaseAnalyticsSender";
18
+ /**
19
+ * 自定义统计能力构造器。
20
+ *
21
+ * 自定义能力通过构造参数复用 AnalyticsManager 的基础统计能力,
22
+ * 从而共享 Sender、公共属性、用户属性和调试配置。
23
+ */
24
+ export type AnalyticsAbilityConstructor<T> = new (baseAble: AnalyticsAble) => T;
11
25
  declare class AnalyticsManager {
12
26
  private hasRelayUrl;
13
27
  private hasAliDirectConfig;
@@ -42,6 +56,23 @@ declare class AnalyticsManager {
42
56
  * 社交统计能力
43
57
  */
44
58
  get social(): SocialAnalyticsAble;
59
+ private _tutorial;
60
+ /**
61
+ * 新手引导统计能力
62
+ */
63
+ get tutorial(): TutorialAnalyticsAble;
64
+ private _pay;
65
+ /**
66
+ * 支付漏斗统计能力
67
+ */
68
+ get pay(): PayAnalyticsAble;
69
+ private _abilityMap;
70
+ /**
71
+ * 获取由 AnalyticsManager 代管的自定义统计能力。
72
+ *
73
+ * 同一个构造器只会创建一个实例;自定义能力应通过构造参数接收基础统计能力。
74
+ */
75
+ getAbility<T>(abilityClass: AnalyticsAbilityConstructor<T>): T;
45
76
  /**
46
77
  * 启用统计(基础统计能力)
47
78
  * @param debugMode 调试模式,是否打印日志信息,默认为false
@@ -28,7 +28,7 @@ export declare class LevelAnalyticsAble {
28
28
  * @param gameFlag 关卡所属玩法标识
29
29
  * @param params 关卡参数, 会从端口下发的配置level_config中获取, 也允许手动指定,其他未指定的字段会采用配置中的值。
30
30
  */
31
- onStart(id: string, index: number, gameFlag?: string, data?: Omit<AnalyticsData, 'id' | 'index' | 'type' | 'progress' | 'code'>): Promise<void>;
31
+ onStart(id: string, index: number, gameFlag?: string, data?: Omit<AnalyticsData, 'levelId' | 'levelIndex' | 'gameId' | 'progress' | 'repeatCount'>): Promise<void>;
32
32
  /**
33
33
  * 记录用户操作(包括有效和无效操作)
34
34
  * @param progress 关卡进度 0.0 - 1.0
@@ -1,13 +1,13 @@
1
1
  import { AnalyticsAble, AnalyticsData } from "../AnalyticsAble";
2
2
  import { GameDimension } from "../level/GameDimension";
3
3
  export declare enum GameLeaveType {
4
- success = "lv_success",
5
- fail = "lv_fail",
6
- leave = "lv_leave",
7
- skip = "lv_skip",
8
- revive = "lv_revive",
9
- break = "lv_break",
10
- retry = "lv_retry"
4
+ success = "success",
5
+ fail = "fail",
6
+ leave = "leave",
7
+ skip = "skip",
8
+ revive = "revive",
9
+ break = "break",
10
+ retry = "retry"
11
11
  }
12
12
  /**
13
13
  * 关卡行为自动上报器
@@ -0,0 +1,27 @@
1
+ import { AnalyticsAble, AnalyticsData, AnalyticsItemData } from "../AnalyticsAble";
2
+ export type AnalyticsPayItem = AnalyticsItemData;
3
+ export type PayStage = "create_order" | "native_purchase" | "verify";
4
+ export type PayEventData = AnalyticsData & {
5
+ transactionId: string;
6
+ currency: string;
7
+ items: AnalyticsPayItem[];
8
+ paymentType?: string;
9
+ stage?: PayStage;
10
+ code?: number;
11
+ reason?: string;
12
+ };
13
+ /**
14
+ * 支付漏斗统计能力。价格由业务提供,value 由框架按商品明细统一计算。
15
+ */
16
+ export declare class PayAnalyticsAble {
17
+ private readonly _baseAble;
18
+ constructor(_baseAble: AnalyticsAble);
19
+ begin(data: PayEventData): void;
20
+ purchase(data: PayEventData): void;
21
+ pending(data: PayEventData): void;
22
+ cancel(data: PayEventData): void;
23
+ fail(data: PayEventData): void;
24
+ private report;
25
+ private normalize;
26
+ private invalid;
27
+ }
@@ -1,9 +1,20 @@
1
1
  import { AnalyticsAble } from "../AnalyticsAble";
2
2
  import { AnalyticsData } from "../AnalyticsAble";
3
+ export type SharePhase = "begin" | "success" | "fail";
4
+ export type ShareEventData = AnalyticsData & {
5
+ method?: string;
6
+ contentType?: string;
7
+ itemId?: string | number;
8
+ phase: SharePhase;
9
+ };
3
10
  export declare class SocialAnalyticsAble {
4
11
  private _baseAble;
5
12
  private _socialDimension;
6
13
  constructor(baseAble: AnalyticsAble);
14
+ share(data: ShareEventData): void;
15
+ /**
16
+ * @deprecated 请改用 share,并明确传入分享阶段。
17
+ */
7
18
  recordShare(data: AnalyticsData): void;
8
19
  recordInvite(success?: boolean): void;
9
20
  recordFriendAdd(count?: number): void;
@@ -0,0 +1,16 @@
1
+ import { AnalyticsAble, AnalyticsData } from "../AnalyticsAble";
2
+ export type TutorialEventData = AnalyticsData & {
3
+ tutorialId: string;
4
+ stepId?: string | number;
5
+ reason?: string;
6
+ };
7
+ /**
8
+ * 新手引导统计能力。只提供稳定的业务动作,不维护引导流程状态。
9
+ */
10
+ export declare class TutorialAnalyticsAble {
11
+ private readonly _baseAble;
12
+ constructor(_baseAble: AnalyticsAble);
13
+ begin(data: TutorialEventData): void;
14
+ complete(data: TutorialEventData): void;
15
+ skip(data: TutorialEventData): void;
16
+ }
@@ -1,4 +1,4 @@
1
- import { AnalyticsData } from "../analytics/index";
1
+ import { AnalyticsData, SharePhase } from "../analytics/index";
2
2
  import { KSShareParameters } from "./ks/KSShare";
3
3
  import { TTShareParameters } from "./tt/TTShare";
4
4
  import { WXShareParameters } from "./wx/WXShare";
@@ -21,7 +21,7 @@ export declare class IShareAble {
21
21
  protected _getShareQuery(analyticsName: string | {
22
22
  name: string;
23
23
  } & AnalyticsData, query?: string): string;
24
- protected _report(analyticsName: string | AnalyticsData, msg: string): void;
24
+ protected _report(analyticsName: string | AnalyticsData, phase: SharePhase, method?: string): void;
25
25
  /**
26
26
  * 分享图片或者文字
27
27
  * @param analyticsName 玩法发起分享的动作来源,用于统计。
@@ -1,9 +1,10 @@
1
- import { EmptyAnalyticsSender } from "../../analytics/index";
1
+ import { AnalyticsEventData, AnalyticsMappedEvent, AnalyticsUserProperties, EmptyAnalyticsSender } from "../../analytics/index";
2
2
  /**
3
3
  * 原生平台事件上报器
4
4
  */
5
5
  export declare class NativeAnalyticsSender extends EmptyAnalyticsSender {
6
6
  protected _className: string;
7
7
  constructor(className?: string, exclude?: string[]);
8
- send(eventName: string, data: object): Promise<void>;
8
+ mapEvent(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
9
+ send(eventName: string, eventData: AnalyticsEventData, userProperties: AnalyticsUserProperties): Promise<void>;
9
10
  }
@@ -1,7 +1,8 @@
1
- import { EmptyAnalyticsSender } from "../../analytics/index";
1
+ import { AnalyticsEventData, AnalyticsMappedEvent, AnalyticsUserProperties, EmptyAnalyticsSender } from "../../analytics/index";
2
2
  /**
3
3
  * TK事件上报器(window['tt'].reportAnalytics)
4
4
  */
5
5
  export declare class TKAnalyticsSender extends EmptyAnalyticsSender {
6
- send(eventName: string, data: any): Promise<void>;
6
+ mapEvent(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
7
+ send(eventName: string, eventData: AnalyticsEventData, userProperties: AnalyticsUserProperties): Promise<void>;
7
8
  }
@@ -1,7 +1,8 @@
1
- import { EmptyAnalyticsSender } from "../../analytics/index";
1
+ import { AnalyticsEventData, AnalyticsMappedEvent, AnalyticsUserProperties, EmptyAnalyticsSender } from "../../analytics/index";
2
2
  /**
3
3
  * 字节事件上报器(window['tt'].reportAnalytics)
4
4
  */
5
5
  export declare class TTAnalyticsSender extends EmptyAnalyticsSender {
6
- send(eventName: string, data: any): Promise<void>;
6
+ mapEvent(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
7
+ send(eventName: string, eventData: AnalyticsEventData, userProperties: AnalyticsUserProperties): Promise<void>;
7
8
  }
@@ -1,7 +1,8 @@
1
- import { EmptyAnalyticsSender } from "../../analytics/index";
1
+ import { AnalyticsEventData, AnalyticsMappedEvent, AnalyticsUserProperties, EmptyAnalyticsSender } from "../../analytics/index";
2
2
  /**
3
3
  * 微信事件上报器(window['wx'].reportEvent)
4
4
  */
5
5
  export declare class WXAnalyticsSender extends EmptyAnalyticsSender {
6
- send(eventName: string, data: any): Promise<void>;
6
+ mapEvent(eventName: string, eventData: AnalyticsEventData): AnalyticsMappedEvent;
7
+ send(eventName: string, eventData: AnalyticsEventData, userProperties: AnalyticsUserProperties): Promise<void>;
7
8
  }
package/dist/index.d.ts CHANGED
@@ -108,6 +108,7 @@ export * from './app/module/analytics/AnalyticsAbleConst';
108
108
  export * from './app/module/analytics/KeytopsAnalyticsSender';
109
109
  export * from './app/module/analytics/ALiAnalyticsSender';
110
110
  export * from './app/module/analytics/AnalyticsAble';
111
+ export * from './app/module/analytics/AnalyticsEvent';
111
112
  export * from './app/module/analytics/index';
112
113
  export * from './app/module/analytics/ad/ADBehaviorReporter';
113
114
  export * from './app/module/analytics/ad/AdDimension';
@@ -122,6 +123,9 @@ export * from './app/module/analytics/level/LevelBehaviorReporter';
122
123
  export * from './app/module/analytics/level/PlayerAbilityDimension';
123
124
  export * from './app/module/analytics/session/SessionDimension';
124
125
  export * from './app/module/analytics/session/SessionAnalyticsAble';
126
+ export * from './app/module/analytics/tutorial/TutorialAnalyticsAble';
127
+ export * from './app/module/analytics/pay/PayAnalyticsAble';
128
+ export * from './app/module/analytics/firebase/FirebaseAnalyticsSender';
125
129
  export * from './app/base/base';
126
130
  export * from './app/base/RuntimeApplicationImpl';
127
131
  export * from './app/base/utils/MathUtils';