keytops-game-framework 2.0.0 → 2.1.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/dist/index.js CHANGED
@@ -1416,7 +1416,10 @@ class EmptyAnalyticsSender {
1416
1416
  }
1417
1417
  return true;
1418
1418
  }
1419
- send(eventName, data) {
1419
+ mapEvent(eventName, eventData) {
1420
+ return { eventName, data: Object.assign({}, eventData) };
1421
+ }
1422
+ send(eventName, eventData, userProperties) {
1420
1423
  return __awaiter(this, void 0, void 0, function* () {
1421
1424
  });
1422
1425
  }
@@ -1452,44 +1455,14 @@ class AnalyticsAble {
1452
1455
  for (let i = 0; i < senders.length; i++) {
1453
1456
  const sender = senders[i];
1454
1457
  this._senderList.push(sender);
1455
- this._syncSenderUserState(sender);
1456
- }
1457
- }
1458
- _usesSenderUserProperties(sender) {
1459
- if (sender.userPropertyMode !== "sender") {
1460
- return false;
1461
- }
1462
- if (typeof sender.setUserProperty === "function") {
1463
- return true;
1458
+ if (this._hasSetUserId && typeof sender.setUserId === "function") {
1459
+ sender.setUserId(this._userId);
1460
+ }
1464
1461
  }
1465
- this._debugMode && console.error("[Analytics] userPropertyMode=sender 的 Sender 必须实现 setUserProperty,已回退为 event 模式。");
1466
- return false;
1467
1462
  }
1468
1463
  _getUserProperties() {
1469
1464
  return Object.assign({}, this._userOnceProperties || {}, this._userAddProperties || {}, this._userProperties || {});
1470
1465
  }
1471
- _syncSenderUserState(sender) {
1472
- if (this._hasSetUserId && typeof sender.setUserId === "function") {
1473
- sender.setUserId(this._userId);
1474
- }
1475
- if (!this._usesSenderUserProperties(sender)) {
1476
- return;
1477
- }
1478
- const properties = this._getUserProperties();
1479
- for (const key in properties) {
1480
- if (Object.prototype.hasOwnProperty.call(properties, key)) {
1481
- sender.setUserProperty(key, properties[key]);
1482
- }
1483
- }
1484
- }
1485
- _notifyUserProperty(key, value) {
1486
- for (let i = 0; i < this._senderList.length; i++) {
1487
- const sender = this._senderList[i];
1488
- if (this._usesSenderUserProperties(sender)) {
1489
- sender.setUserProperty(key, value);
1490
- }
1491
- }
1492
- }
1493
1466
  /**
1494
1467
  * 设置排除
1495
1468
  * @param excludeEvents 排除事件名称或者名称列表。
@@ -1509,11 +1482,11 @@ class AnalyticsAble {
1509
1482
  }
1510
1483
  }
1511
1484
  _onAppShow() {
1512
- this.time("app_hide");
1513
- this.report("app_show", publisher.publisher.enterOptions.getAllOption());
1485
+ this.time("app.hide");
1486
+ this.report("app.show", publisher.publisher.enterOptions.getAllOption());
1514
1487
  }
1515
1488
  _onAppHide() {
1516
- this.report("app_hide");
1489
+ this.report("app.hide");
1517
1490
  }
1518
1491
  /**
1519
1492
  * 设置所有上报事件的基础属性
@@ -1632,7 +1605,6 @@ class AnalyticsAble {
1632
1605
  console.warn(`用户属性中已经存在${key}:${this._userProperties[key]}, 将替换为${value}`);
1633
1606
  }
1634
1607
  this._userProperties[key] = value;
1635
- this._notifyUserProperty(key, value);
1636
1608
  }
1637
1609
  /**
1638
1610
  * 如果您要上传的用户属性只要设置一次,则可以调用 userSetOnce 来进行设置。
@@ -1662,12 +1634,10 @@ class AnalyticsAble {
1662
1634
  if (storageValue != null && storageValue != "") {
1663
1635
  this._debugMode && console.info(`用户属性中已经存在once属性${key}:${storageValue}`);
1664
1636
  this._userOnceProperties[key] = typeof value === "number" ? Number(storageValue) : storageValue;
1665
- this._notifyUserProperty(key, this._userOnceProperties[key]);
1666
1637
  return;
1667
1638
  }
1668
1639
  storage.setUValue(`analytics_user_once_${key}`, value);
1669
1640
  this._userOnceProperties[key] = value;
1670
- this._notifyUserProperty(key, value);
1671
1641
  }
1672
1642
  /**
1673
1643
  *设置用户累积属性,当您要上传数值型的属性时,您可以调用 userAdd 来对该属性进行累加操作,
@@ -1690,7 +1660,6 @@ class AnalyticsAble {
1690
1660
  let total = Number(this._userAddProperties[key] || storage.getUValue(`analytics_user_add_${key}`, 0) || 0);
1691
1661
  this._userAddProperties[key] = total + value;
1692
1662
  storage.setUValue(`analytics_user_add_${key}`, total + value);
1693
- this._notifyUserProperty(key, total + value);
1694
1663
  }
1695
1664
  /**
1696
1665
  * 移除用户属性。当您要清空用户的用户属性值时,您可以调用 userUnset 来对指定属性进行清空操作,如果该属性还未在集群中被创建,则 user_unset 不会创建该属性
@@ -1702,14 +1671,13 @@ class AnalyticsAble {
1702
1671
  this._userAddProperties && delete this._userAddProperties[key];
1703
1672
  storage.removeUValue(`analytics_user_once_${key}`);
1704
1673
  storage.removeUValue(`analytics_user_add_${key}`);
1705
- this._notifyUserProperty(key, null);
1706
1674
  }
1707
1675
  /**
1708
1676
  * 上报错误
1709
1677
  * @param error 错误信息
1710
1678
  */
1711
1679
  error(error) {
1712
- this.report("app_error", { error: error });
1680
+ this.report("app.error", { error: error });
1713
1681
  }
1714
1682
  /**
1715
1683
  * 开始事件计时
@@ -1794,16 +1762,170 @@ class AnalyticsAble {
1794
1762
  return Promise.all(this._senderList
1795
1763
  .filter((sender) => sender.sendAble(eventName))
1796
1764
  .map((sender) => {
1797
- const senderData = Object.assign({}, data);
1798
- if (!this._usesSenderUserProperties(sender)) {
1799
- this._copyToData(eventName, senderData, userProperties);
1765
+ const mapped = sender.mapEvent(eventName, Object.assign({}, data));
1766
+ if (!sender.sendAble(mapped.eventName)) {
1767
+ return Promise.resolve();
1800
1768
  }
1801
- return sender.send(eventName, senderData);
1769
+ return sender.send(mapped.eventName, Object.assign({}, mapped.data), Object.assign({}, userProperties));
1802
1770
  })).then();
1803
1771
  });
1804
1772
  }
1805
1773
  }
1806
1774
 
1775
+ /**
1776
+ * 框架内部统一使用的业务语义事件名。
1777
+ * Sender 负责将它们转换成统计平台实际接收的事件名和参数。
1778
+ */
1779
+ var AnalyticsBehavior;
1780
+ (function (AnalyticsBehavior) {
1781
+ AnalyticsBehavior["APP_LAUNCH"] = "app.launch";
1782
+ AnalyticsBehavior["APP_SHOW"] = "app.show";
1783
+ AnalyticsBehavior["APP_HIDE"] = "app.hide";
1784
+ AnalyticsBehavior["APP_ERROR"] = "app.error";
1785
+ AnalyticsBehavior["SESSION_LOGIN"] = "session.login";
1786
+ AnalyticsBehavior["LEVEL_START"] = "level.start";
1787
+ AnalyticsBehavior["LEVEL_END"] = "level.end";
1788
+ AnalyticsBehavior["LEVEL_PAUSE"] = "level.pause";
1789
+ AnalyticsBehavior["LEVEL_TIMEOUT"] = "level.timeout";
1790
+ AnalyticsBehavior["LEVEL_ITEM_USE"] = "level.item_use";
1791
+ AnalyticsBehavior["AD_LIFECYCLE"] = "ad.lifecycle";
1792
+ AnalyticsBehavior["AD_IMPRESSION"] = "ad.impression";
1793
+ AnalyticsBehavior["SOCIAL_SHARE"] = "social.share";
1794
+ AnalyticsBehavior["SOCIAL_SUBSCRIBE_SHOW"] = "social.subscribe_show";
1795
+ AnalyticsBehavior["SOCIAL_SUBSCRIBE"] = "social.subscribe";
1796
+ AnalyticsBehavior["TUTORIAL_BEGIN"] = "tutorial.begin";
1797
+ AnalyticsBehavior["TUTORIAL_COMPLETE"] = "tutorial.complete";
1798
+ AnalyticsBehavior["TUTORIAL_SKIP"] = "tutorial.skip";
1799
+ AnalyticsBehavior["PAY_BEGIN"] = "pay.begin";
1800
+ AnalyticsBehavior["PAY_PURCHASE"] = "pay.purchase";
1801
+ AnalyticsBehavior["PAY_PENDING"] = "pay.pending";
1802
+ AnalyticsBehavior["PAY_CANCEL"] = "pay.cancel";
1803
+ AnalyticsBehavior["PAY_FAIL"] = "pay.fail";
1804
+ })(AnalyticsBehavior || (AnalyticsBehavior = {}));
1805
+ const LEVEL_RESULT_EVENT = {
1806
+ success: "lv_success",
1807
+ fail: "lv_fail",
1808
+ leave: "lv_leave",
1809
+ skip: "lv_skip",
1810
+ revive: "lv_revive",
1811
+ break: "lv_break",
1812
+ retry: "lv_retry",
1813
+ };
1814
+ const SHARE_PHASE_MESSAGE = {
1815
+ begin: "发起",
1816
+ success: "成功",
1817
+ fail: "失败",
1818
+ };
1819
+ function move(data, source, target) {
1820
+ if (data[source] !== undefined) {
1821
+ data[target] = data[source];
1822
+ delete data[source];
1823
+ }
1824
+ }
1825
+ /**
1826
+ * Keytops/Ali 当前服务端仍使用的物理协议。
1827
+ * 兼容逻辑集中在 Sender 边界,业务层无需继续依赖旧事件字符串。
1828
+ */
1829
+ function mapCanonicalEventToLegacy(eventName, eventData) {
1830
+ const data = Object.assign({}, eventData);
1831
+ let mappedName = eventName;
1832
+ switch (eventName) {
1833
+ case AnalyticsBehavior.APP_LAUNCH:
1834
+ case AnalyticsBehavior.APP_SHOW:
1835
+ case AnalyticsBehavior.APP_HIDE:
1836
+ case AnalyticsBehavior.APP_ERROR:
1837
+ case AnalyticsBehavior.SESSION_LOGIN:
1838
+ mappedName = eventName.replace(".", "_");
1839
+ if (eventName === AnalyticsBehavior.SESSION_LOGIN) {
1840
+ mappedName = "login";
1841
+ move(data, "options", "msg");
1842
+ }
1843
+ break;
1844
+ case AnalyticsBehavior.LEVEL_START:
1845
+ mappedName = "lv_enter";
1846
+ break;
1847
+ case AnalyticsBehavior.LEVEL_END:
1848
+ mappedName = LEVEL_RESULT_EVENT[String(data.result || "")] || "lv_leave";
1849
+ delete data.result;
1850
+ break;
1851
+ case AnalyticsBehavior.LEVEL_PAUSE:
1852
+ mappedName = "lv_leave";
1853
+ break;
1854
+ case AnalyticsBehavior.LEVEL_TIMEOUT:
1855
+ mappedName = "lv_timeout";
1856
+ break;
1857
+ case AnalyticsBehavior.LEVEL_ITEM_USE:
1858
+ mappedName = "lv_item";
1859
+ break;
1860
+ case AnalyticsBehavior.AD_LIFECYCLE:
1861
+ case AnalyticsBehavior.AD_IMPRESSION:
1862
+ mappedName = "ad";
1863
+ move(data, "adType", "_adtype");
1864
+ move(data, "lifecycle", "_adevent");
1865
+ move(data, "message", "msg");
1866
+ delete data.group;
1867
+ break;
1868
+ case AnalyticsBehavior.SOCIAL_SHARE:
1869
+ mappedName = "share";
1870
+ if (data.itemId !== undefined && data.name === undefined) {
1871
+ data.name = data.itemId;
1872
+ }
1873
+ if (data.phase !== undefined) {
1874
+ data.msg = SHARE_PHASE_MESSAGE[String(data.phase)] || String(data.phase);
1875
+ }
1876
+ break;
1877
+ case AnalyticsBehavior.SOCIAL_SUBSCRIBE_SHOW:
1878
+ mappedName = "subscribe_show";
1879
+ break;
1880
+ case AnalyticsBehavior.SOCIAL_SUBSCRIBE:
1881
+ mappedName = "subscribe";
1882
+ break;
1883
+ case AnalyticsBehavior.TUTORIAL_BEGIN:
1884
+ case AnalyticsBehavior.TUTORIAL_COMPLETE:
1885
+ case AnalyticsBehavior.TUTORIAL_SKIP:
1886
+ case AnalyticsBehavior.PAY_BEGIN:
1887
+ case AnalyticsBehavior.PAY_PURCHASE:
1888
+ case AnalyticsBehavior.PAY_PENDING:
1889
+ case AnalyticsBehavior.PAY_CANCEL:
1890
+ case AnalyticsBehavior.PAY_FAIL:
1891
+ mappedName = eventName.replace(".", "_");
1892
+ break;
1893
+ }
1894
+ if (eventName === AnalyticsBehavior.LEVEL_START ||
1895
+ eventName === AnalyticsBehavior.LEVEL_END ||
1896
+ eventName === AnalyticsBehavior.LEVEL_PAUSE ||
1897
+ eventName === AnalyticsBehavior.LEVEL_TIMEOUT ||
1898
+ eventName === AnalyticsBehavior.LEVEL_ITEM_USE) {
1899
+ move(data, "levelId", "id");
1900
+ move(data, "levelIndex", "index");
1901
+ move(data, "gameId", "type");
1902
+ move(data, "repeatCount", "code");
1903
+ move(data, "averageThinkTimeMs", "time");
1904
+ move(data, "itemName", "name");
1905
+ if (eventName === AnalyticsBehavior.LEVEL_TIMEOUT) {
1906
+ data.name = "超时";
1907
+ delete data.reason;
1908
+ }
1909
+ else if (eventName === AnalyticsBehavior.LEVEL_PAUSE) {
1910
+ data.name = "切出游戏";
1911
+ delete data.reason;
1912
+ }
1913
+ else {
1914
+ move(data, "reason", "name");
1915
+ }
1916
+ }
1917
+ return { eventName: mappedName, data };
1918
+ }
1919
+ /**
1920
+ * 小游戏平台通常不接受点号事件名,统一转换为下划线。
1921
+ */
1922
+ function mapCanonicalEventToFlatName(eventName, eventData) {
1923
+ return {
1924
+ eventName: eventName.replace(/\./g, "_"),
1925
+ data: Object.assign({}, eventData),
1926
+ };
1927
+ }
1928
+
1807
1929
  const ALI_ANALYTICS_EVENT_CACHE = "ALI_ANALYTICS_EVENT_CACHE";
1808
1930
  /**
1809
1931
  * 内部阿里云日志事件上报器
@@ -1898,10 +2020,13 @@ class ALiAnalyticsSender extends EmptyAnalyticsSender {
1898
2020
  return false;
1899
2021
  }
1900
2022
  }
1901
- send(eventName, data) {
2023
+ mapEvent(eventName, eventData) {
2024
+ return mapCanonicalEventToLegacy(eventName, eventData);
2025
+ }
2026
+ send(eventName, eventData, userProperties) {
1902
2027
  return __awaiter(this, void 0, void 0, function* () {
1903
- const payload = data && typeof data === "object" && !Array.isArray(data)
1904
- ? Object.assign({}, data) : { value: data };
2028
+ const payload = eventData && typeof eventData === "object" && !Array.isArray(eventData)
2029
+ ? Object.assign(Object.assign({}, userProperties), eventData) : Object.assign({}, userProperties);
1905
2030
  payload['_event'] = eventName;
1906
2031
  let msg_data = {
1907
2032
  appid: publisher.appId,
@@ -2235,7 +2360,7 @@ class ADBehaviorReporter {
2235
2360
  * @param from 广告来源
2236
2361
  */
2237
2362
  onShowComplete(type, from) {
2238
- this.report(type, ADEvent.SHOW_COMPLETE, from);
2363
+ this.report(type, ADEvent.SHOW_COMPLETE, from, undefined, true);
2239
2364
  }
2240
2365
  /**
2241
2366
  * 广告显示失败
@@ -2261,20 +2386,20 @@ class ADBehaviorReporter {
2261
2386
  * @param from 广告来源
2262
2387
  * @param msg 广告失败原因
2263
2388
  */
2264
- report(type, event, from, msg) {
2265
- from = from || {};
2266
- const group = from.group || "game";
2267
- from.group && delete from.group;
2268
- from._adtype = type;
2269
- from._adevent = event;
2389
+ report(type, event, from, msg, impression = false) {
2390
+ const source = Object.assign({}, (from || {}));
2391
+ const group = source.group || "game";
2392
+ delete source.group;
2270
2393
  if (!this._groupCount[group]) {
2271
2394
  this._groupCount[group] = 0;
2272
2395
  }
2273
- from.count = event == ADEvent.SHOW_COMPLETE ? ++this._groupCount[group] : this._groupCount[group];
2396
+ const data = Object.assign(Object.assign({}, source), { group, adType: type, lifecycle: event, count: event == ADEvent.SHOW_COMPLETE
2397
+ ? ++this._groupCount[group]
2398
+ : this._groupCount[group] });
2274
2399
  if (msg) {
2275
- from.msg = msg;
2400
+ data.message = msg;
2276
2401
  }
2277
- this.baseAble.report("ad", from);
2402
+ this.baseAble.report(impression ? AnalyticsBehavior.AD_IMPRESSION : AnalyticsBehavior.AD_LIFECYCLE, data);
2278
2403
  }
2279
2404
  }
2280
2405
 
@@ -2942,13 +3067,13 @@ LevelOnlineConfig = __decorate([
2942
3067
 
2943
3068
  var GameLeaveType;
2944
3069
  (function (GameLeaveType) {
2945
- GameLeaveType["success"] = "lv_success";
2946
- GameLeaveType["fail"] = "lv_fail";
2947
- GameLeaveType["leave"] = "lv_leave";
2948
- GameLeaveType["skip"] = "lv_skip";
2949
- GameLeaveType["revive"] = "lv_revive";
2950
- GameLeaveType["break"] = "lv_break";
2951
- GameLeaveType["retry"] = "lv_retry";
3070
+ GameLeaveType["success"] = "success";
3071
+ GameLeaveType["fail"] = "fail";
3072
+ GameLeaveType["leave"] = "leave";
3073
+ GameLeaveType["skip"] = "skip";
3074
+ GameLeaveType["revive"] = "revive";
3075
+ GameLeaveType["break"] = "break";
3076
+ GameLeaveType["retry"] = "retry";
2952
3077
  })(GameLeaveType || (GameLeaveType = {}));
2953
3078
  /**
2954
3079
  * 关卡行为自动上报器
@@ -2967,7 +3092,7 @@ class LevelBehaviorReporter {
2967
3092
  this.reset();
2968
3093
  this._setTimers();
2969
3094
  App.onHide(this._leaveApp, this);
2970
- this.baseAble.report("lv_enter", context);
3095
+ this.baseAble.report(AnalyticsBehavior.LEVEL_START, context);
2971
3096
  }
2972
3097
  end(type, data) {
2973
3098
  const context = this._getContext();
@@ -2978,7 +3103,7 @@ class LevelBehaviorReporter {
2978
3103
  const levelsession = this._game.getCurrentLevelSession();
2979
3104
  // 有效操作的平均思考时间
2980
3105
  const time = levelsession.stepsUsed > 0 ? Math.floor(levelsession.thinkTimeTotal / levelsession.stepsUsed) : 0;
2981
- this.baseAble.report(type, Object.assign(Object.assign(Object.assign({}, context), data), { time }));
3106
+ this.baseAble.report(AnalyticsBehavior.LEVEL_END, Object.assign(Object.assign(Object.assign({}, context), data), { result: type, averageThinkTimeMs: time }));
2982
3107
  this.reset();
2983
3108
  }
2984
3109
  reportLeave(data) {
@@ -2986,47 +3111,39 @@ class LevelBehaviorReporter {
2986
3111
  if (!context) {
2987
3112
  return;
2988
3113
  }
2989
- this.baseAble.report(GameLeaveType.leave, Object.assign(Object.assign(Object.assign({}, context), { name: "切出游戏" }), data));
3114
+ this.baseAble.report(AnalyticsBehavior.LEVEL_PAUSE, Object.assign(Object.assign(Object.assign({}, context), { reason: "app_hide" }), data));
2990
3115
  }
2991
3116
  reportTimeout(data) {
2992
3117
  const context = this._getContext();
2993
3118
  if (!context) {
2994
3119
  return;
2995
3120
  }
2996
- this.baseAble.report("lv_timeout", Object.assign(Object.assign(Object.assign({}, context), { name: "超时" }), data));
3121
+ this.baseAble.report(AnalyticsBehavior.LEVEL_TIMEOUT, Object.assign(Object.assign(Object.assign({}, context), { reason: "timeout" }), data));
2997
3122
  }
2998
3123
  reportItem(name, data) {
2999
3124
  const context = this._getContext();
3000
3125
  if (!context) {
3001
3126
  return;
3002
3127
  }
3003
- this.baseAble.report("lv_item", Object.assign(Object.assign(Object.assign({}, context), { name: name.toLocaleLowerCase() }), data));
3128
+ this.baseAble.report(AnalyticsBehavior.LEVEL_ITEM_USE, Object.assign(Object.assign(Object.assign({}, context), { itemName: name.toLocaleLowerCase() }), data));
3004
3129
  }
3005
3130
  reset() {
3006
- this.baseAble.cancelTime(GameLeaveType.success);
3007
- this.baseAble.cancelTime(GameLeaveType.leave);
3008
- this.baseAble.cancelTime(GameLeaveType.fail);
3009
- this.baseAble.cancelTime(GameLeaveType.skip);
3010
- this.baseAble.cancelTime(GameLeaveType.revive);
3011
- this.baseAble.cancelTime(GameLeaveType.break);
3012
- this.baseAble.cancelTime(GameLeaveType.retry);
3013
- this.baseAble.cancelTime("lv_timeout");
3014
- this.baseAble.cancelTime("ad");
3131
+ this.baseAble.cancelTime(AnalyticsBehavior.LEVEL_END);
3132
+ this.baseAble.cancelTime(AnalyticsBehavior.LEVEL_PAUSE);
3133
+ this.baseAble.cancelTime(AnalyticsBehavior.LEVEL_TIMEOUT);
3134
+ this.baseAble.cancelTime(AnalyticsBehavior.AD_LIFECYCLE);
3135
+ this.baseAble.cancelTime(AnalyticsBehavior.AD_IMPRESSION);
3015
3136
  App.offHide(this._leaveApp, this);
3016
3137
  }
3017
3138
  _leaveApp() {
3018
3139
  this.reportLeave();
3019
3140
  }
3020
3141
  _setTimers() {
3021
- this.baseAble.time(GameLeaveType.success, false);
3022
- this.baseAble.time(GameLeaveType.leave, false);
3023
- this.baseAble.time(GameLeaveType.fail, false);
3024
- this.baseAble.time(GameLeaveType.skip, false);
3025
- this.baseAble.time(GameLeaveType.revive, false);
3026
- this.baseAble.time(GameLeaveType.break, false);
3027
- this.baseAble.time(GameLeaveType.retry, false);
3028
- this.baseAble.time("lv_timeout", false);
3029
- this.baseAble.time("ad", false);
3142
+ this.baseAble.time(AnalyticsBehavior.LEVEL_END, false);
3143
+ this.baseAble.time(AnalyticsBehavior.LEVEL_PAUSE, false);
3144
+ this.baseAble.time(AnalyticsBehavior.LEVEL_TIMEOUT, false);
3145
+ this.baseAble.time(AnalyticsBehavior.AD_LIFECYCLE, false);
3146
+ this.baseAble.time(AnalyticsBehavior.AD_IMPRESSION, false);
3030
3147
  }
3031
3148
  _getContext() {
3032
3149
  return this._game.getCurrentBehaviorContext();
@@ -3810,7 +3927,7 @@ class GameDimension extends BaseDimension {
3810
3927
  if (!this._currentLevelSession) {
3811
3928
  return null;
3812
3929
  }
3813
- return Object.assign({ id: this._currentLevelSession.levelId.toString(), index: this._currentLevelSession.levelIndex, type: this._gameFlag, progress: this._currentLevelSession.progress, code: Number((_b = (_a = this._currentEnterParams) === null || _a === void 0 ? void 0 : _a.repeat) !== null && _b !== void 0 ? _b : 0) }, this._currentEnterParams);
3930
+ return Object.assign(Object.assign({}, this._currentEnterParams), { levelId: this._currentLevelSession.levelId.toString(), levelIndex: this._currentLevelSession.levelIndex, gameId: this._gameFlag, progress: this._currentLevelSession.progress, repeatCount: Number((_b = (_a = this._currentEnterParams) === null || _a === void 0 ? void 0 : _a.repeat) !== null && _b !== void 0 ? _b : 0) });
3814
3931
  }
3815
3932
  onLevelStart(id, index, data) {
3816
3933
  this._currentEnterParams = data;
@@ -4109,7 +4226,7 @@ class LaunchAnalyticsAble {
4109
4226
  * 标记应用准备就绪,开始统计启动时间
4110
4227
  */
4111
4228
  ready() {
4112
- this._baseAble.time("app_launch");
4229
+ this._baseAble.time(AnalyticsBehavior.APP_LAUNCH);
4113
4230
  }
4114
4231
  /**
4115
4232
  * 上报启动事件
@@ -4118,7 +4235,7 @@ class LaunchAnalyticsAble {
4118
4235
  */
4119
4236
  report(name, data) {
4120
4237
  const payload = Object.assign(Object.assign({}, (data || {})), { name });
4121
- this._baseAble.report("app_launch", payload);
4238
+ this._baseAble.report(AnalyticsBehavior.APP_LAUNCH, payload);
4122
4239
  }
4123
4240
  }
4124
4241
 
@@ -4336,7 +4453,9 @@ class SessionAnalyticsAble {
4336
4453
  this._dimension = new SessionDimension();
4337
4454
  }
4338
4455
  recordLogin() {
4339
- this._baseAble.report("login", { msg: JSON.stringify(publisher.publisher.enterOptions.getAllOption()) });
4456
+ this._baseAble.report(AnalyticsBehavior.SESSION_LOGIN, {
4457
+ options: JSON.stringify(publisher.publisher.enterOptions.getAllOption()),
4458
+ });
4340
4459
  this._dimension.recordLogin();
4341
4460
  }
4342
4461
  updateSessionDuration() {
@@ -4418,9 +4537,15 @@ class SocialAnalyticsAble {
4418
4537
  this._baseAble = baseAble;
4419
4538
  this._socialDimension = new SocialDimension();
4420
4539
  }
4540
+ share(data) {
4541
+ this._baseAble.report(AnalyticsBehavior.SOCIAL_SHARE, data);
4542
+ data.phase === "success" && this._socialDimension.recordShare();
4543
+ }
4544
+ /**
4545
+ * @deprecated 请改用 share,并明确传入分享阶段。
4546
+ */
4421
4547
  recordShare(data) {
4422
- this._baseAble.report("share", data);
4423
- this._socialDimension.recordShare();
4548
+ this.share(Object.assign(Object.assign({}, data), { phase: "success" }));
4424
4549
  }
4425
4550
  recordInvite(success = false) {
4426
4551
  this._socialDimension.recordInvite(success);
@@ -4432,16 +4557,104 @@ class SocialAnalyticsAble {
4432
4557
  this._socialDimension.recordInteraction();
4433
4558
  }
4434
4559
  recordSubscribeShow(name) {
4435
- this._baseAble.report("subscribe_show", { name });
4560
+ this._baseAble.report(AnalyticsBehavior.SOCIAL_SUBSCRIBE_SHOW, { name });
4436
4561
  }
4437
4562
  recordSubscribe(name, code) {
4438
- this._baseAble.report("subscribe", { name, code });
4563
+ this._baseAble.report(AnalyticsBehavior.SOCIAL_SUBSCRIBE, { name, code });
4439
4564
  }
4440
4565
  getMetrics() {
4441
4566
  return this._socialDimension.getMetrics();
4442
4567
  }
4443
4568
  }
4444
4569
 
4570
+ /**
4571
+ * 新手引导统计能力。只提供稳定的业务动作,不维护引导流程状态。
4572
+ */
4573
+ class TutorialAnalyticsAble {
4574
+ constructor(_baseAble) {
4575
+ this._baseAble = _baseAble;
4576
+ }
4577
+ begin(data) {
4578
+ this._baseAble.report(AnalyticsBehavior.TUTORIAL_BEGIN, data);
4579
+ }
4580
+ complete(data) {
4581
+ this._baseAble.report(AnalyticsBehavior.TUTORIAL_COMPLETE, data);
4582
+ }
4583
+ skip(data) {
4584
+ this._baseAble.report(AnalyticsBehavior.TUTORIAL_SKIP, data);
4585
+ }
4586
+ }
4587
+
4588
+ /**
4589
+ * 支付漏斗统计能力。价格由业务提供,value 由框架按商品明细统一计算。
4590
+ */
4591
+ class PayAnalyticsAble {
4592
+ constructor(_baseAble) {
4593
+ this._baseAble = _baseAble;
4594
+ }
4595
+ begin(data) {
4596
+ this.report(AnalyticsBehavior.PAY_BEGIN, data);
4597
+ }
4598
+ purchase(data) {
4599
+ this.report(AnalyticsBehavior.PAY_PURCHASE, data);
4600
+ }
4601
+ pending(data) {
4602
+ this.report(AnalyticsBehavior.PAY_PENDING, data);
4603
+ }
4604
+ cancel(data) {
4605
+ this.report(AnalyticsBehavior.PAY_CANCEL, data);
4606
+ }
4607
+ fail(data) {
4608
+ this.report(AnalyticsBehavior.PAY_FAIL, data);
4609
+ }
4610
+ report(eventName, data) {
4611
+ const normalized = this.normalize(data);
4612
+ if (!normalized) {
4613
+ return;
4614
+ }
4615
+ this._baseAble.report(eventName, normalized);
4616
+ }
4617
+ normalize(data) {
4618
+ const transactionId = String(data && data.transactionId || "").trim();
4619
+ const currency = String(data && data.currency || "").trim().toUpperCase();
4620
+ const items = data && data.items;
4621
+ if (!transactionId) {
4622
+ return this.invalid("transactionId 不能为空");
4623
+ }
4624
+ if (!/^[A-Z]{3}$/.test(currency)) {
4625
+ return this.invalid(`currency 必须是三位大写货币代码: ${currency}`);
4626
+ }
4627
+ if (!Array.isArray(items) || items.length === 0) {
4628
+ return this.invalid("items 不能为空");
4629
+ }
4630
+ const normalizedItems = [];
4631
+ let value = 0;
4632
+ for (let i = 0; i < items.length; i++) {
4633
+ const item = items[i];
4634
+ const itemId = String(item && item.itemId || "").trim();
4635
+ const price = Number(item && item.price);
4636
+ const quantity = item && item.quantity === undefined
4637
+ ? 1
4638
+ : Number(item.quantity);
4639
+ if (!itemId || !Number.isFinite(price) || price < 0) {
4640
+ return this.invalid(`items[${i}] 的 itemId/price 无效`);
4641
+ }
4642
+ if (!Number.isInteger(quantity) || quantity <= 0) {
4643
+ return this.invalid(`items[${i}] 的 quantity 必须是正整数`);
4644
+ }
4645
+ const normalizedItem = Object.assign(Object.assign({}, item), { itemId, price, quantity });
4646
+ normalizedItems.push(normalizedItem);
4647
+ value += price * quantity;
4648
+ }
4649
+ return Object.assign(Object.assign({}, data), { transactionId,
4650
+ currency, items: normalizedItems, value: Math.round(value * 1000000) / 1000000 });
4651
+ }
4652
+ invalid(message) {
4653
+ console.warn(`[Analytics.pay] ${message},本次事件已忽略。`);
4654
+ return null;
4655
+ }
4656
+ }
4657
+
4445
4658
  /**
4446
4659
  * 请求进度改变时调度。
4447
4660
  * @eventType Event.PROGRESS
@@ -6214,10 +6427,13 @@ class KeytopsAnalyticsSender extends EmptyAnalyticsSender {
6214
6427
  }
6215
6428
  });
6216
6429
  }
6217
- send(eventName, data) {
6430
+ mapEvent(eventName, eventData) {
6431
+ return mapCanonicalEventToLegacy(eventName, eventData);
6432
+ }
6433
+ send(eventName, eventData, userProperties) {
6218
6434
  return __awaiter(this, void 0, void 0, function* () {
6219
- const payload = data && typeof data === "object" && !Array.isArray(data)
6220
- ? Object.assign({}, data) : { value: data };
6435
+ const payload = eventData && typeof eventData === "object" && !Array.isArray(eventData)
6436
+ ? Object.assign(Object.assign({}, userProperties), eventData) : Object.assign({}, userProperties);
6221
6437
  let msg_data = {
6222
6438
  appid: publisher.appId,
6223
6439
  openid: String(storage.userId || publisher.login.openID || ""),
@@ -6238,6 +6454,276 @@ class KeytopsAnalyticsSender extends EmptyAnalyticsSender {
6238
6454
  }
6239
6455
  }
6240
6456
 
6457
+ /*
6458
+ @name: NativeHelper
6459
+ @desc: 原生函数调用代理
6460
+ @author: timoo
6461
+ @date: 2022/11/26
6462
+ */
6463
+ class NativeHelper {
6464
+ static call(className, methodName, ...args) {
6465
+ NativeHelper.impl.call(className, methodName, ...args);
6466
+ }
6467
+ static callWithReturnType(className, methodName, returnType, ...args) {
6468
+ return NativeHelper.impl.callWithReturnType(className, methodName, returnType, ...args);
6469
+ }
6470
+ static registerCallback(caller, method, times, ...args) {
6471
+ return NativeHelper.impl.registerCallback(caller, method, times, ...args);
6472
+ }
6473
+ static registerCallbackOnce(caller, method, ...args) {
6474
+ return NativeHelper.impl.registerCallback(caller, method, 1, ...args);
6475
+ }
6476
+ static get impl() {
6477
+ if (this._impl == null) {
6478
+ this._impl = Injector.getInject(NativeHelper.KEY);
6479
+ }
6480
+ if (this._impl == null) {
6481
+ throw new Error(NativeHelper.KEY + " 未注入!");
6482
+ }
6483
+ return this._impl;
6484
+ }
6485
+ }
6486
+ NativeHelper.KEY = "NativeHelper";
6487
+
6488
+ const DEFAULT_IGNORED_PARAMETERS = [
6489
+ "device_system",
6490
+ "device_platform",
6491
+ "device_brand",
6492
+ "device_model",
6493
+ "app_version",
6494
+ ];
6495
+ const RESERVED_PREFIXES = ["firebase_", "google_", "ga_"];
6496
+ const RESERVED_USER_PROPERTIES = new Set([
6497
+ "first_open_time",
6498
+ "first_visit_time",
6499
+ "last_deep_link_referrer",
6500
+ "user_id",
6501
+ "first_open_after_install",
6502
+ ]);
6503
+ const FIREBASE_EVENT_NAMES = {
6504
+ [AnalyticsBehavior.SESSION_LOGIN]: "login",
6505
+ [AnalyticsBehavior.LEVEL_START]: "level_start",
6506
+ [AnalyticsBehavior.LEVEL_END]: "level_end",
6507
+ [AnalyticsBehavior.AD_IMPRESSION]: "ad_impression",
6508
+ [AnalyticsBehavior.TUTORIAL_BEGIN]: "tutorial_begin",
6509
+ [AnalyticsBehavior.TUTORIAL_COMPLETE]: "tutorial_complete",
6510
+ [AnalyticsBehavior.TUTORIAL_SKIP]: "tutorial_skip",
6511
+ [AnalyticsBehavior.PAY_BEGIN]: "begin_checkout",
6512
+ [AnalyticsBehavior.PAY_PURCHASE]: "purchase",
6513
+ [AnalyticsBehavior.PAY_PENDING]: "purchase_pending",
6514
+ [AnalyticsBehavior.PAY_CANCEL]: "purchase_cancel",
6515
+ [AnalyticsBehavior.PAY_FAIL]: "purchase_fail",
6516
+ };
6517
+ /**
6518
+ * Firebase Android Analytics 上报器。
6519
+ *
6520
+ * TS 端属于框架,Java Bridge 仍由具体游戏工程提供。非原生环境会安全忽略调用。
6521
+ */
6522
+ class FirebaseAnalyticsSender extends EmptyAnalyticsSender {
6523
+ constructor(config, exclude) {
6524
+ super(exclude);
6525
+ this._lastUserProperties = {};
6526
+ if (!config || !String(config.bridgeClassName || "").trim()) {
6527
+ throw new Error("FirebaseAnalyticsSender.bridgeClassName 不能为空");
6528
+ }
6529
+ this._config = {
6530
+ bridgeClassName: String(config.bridgeClassName).trim(),
6531
+ collectionEnabled: config.collectionEnabled !== false,
6532
+ ignoredParameters: config.ignoredParameters || DEFAULT_IGNORED_PARAMETERS,
6533
+ maxParameters: Math.min(Math.max(config.maxParameters || 25, 1), 25),
6534
+ supportsStructuredItems: !!config.supportsStructuredItems,
6535
+ debug: !!config.debug,
6536
+ };
6537
+ this._ignoredParameters = new Set(this._config.ignoredParameters);
6538
+ if (this.canSend) {
6539
+ NativeHelper.call(this._config.bridgeClassName, "setCollectionEnabled", this._config.collectionEnabled);
6540
+ }
6541
+ }
6542
+ get canSend() {
6543
+ var _a;
6544
+ const target = globalThis;
6545
+ const sys = target.cc && target.cc.sys;
6546
+ if (sys) {
6547
+ return !!(sys.isNative &&
6548
+ sys.os === ((_a = sys.OS) === null || _a === void 0 ? void 0 : _a.ANDROID) &&
6549
+ (target.jsb || target.native));
6550
+ }
6551
+ return !!(target.jsb || target.native);
6552
+ }
6553
+ setUserId(userId) {
6554
+ const normalized = userId == null ? null : String(userId).trim();
6555
+ const nextUserId = normalized ? this.truncate(normalized, 256) : null;
6556
+ if (this._lastUserId === nextUserId) {
6557
+ return;
6558
+ }
6559
+ this._lastUserId = nextUserId;
6560
+ if (!this.canSend) {
6561
+ return;
6562
+ }
6563
+ NativeHelper.call(this._config.bridgeClassName, nextUserId ? "setUserId" : "clearUserId", ...(nextUserId ? [nextUserId] : []));
6564
+ }
6565
+ mapEvent(eventName, eventData) {
6566
+ const data = this.mapParameters(eventName, eventData);
6567
+ let mappedName = FIREBASE_EVENT_NAMES[eventName] || eventName.replace(/\./g, "_");
6568
+ if (eventName === AnalyticsBehavior.SOCIAL_SHARE) {
6569
+ const phase = String(data.phase || "");
6570
+ mappedName = phase === "success" ? "share" : `share_${phase || "unknown"}`;
6571
+ }
6572
+ else if (eventName === AnalyticsBehavior.AD_LIFECYCLE) {
6573
+ mappedName = "ad_lifecycle";
6574
+ }
6575
+ return { eventName: mappedName, data };
6576
+ }
6577
+ send(eventName, eventData, userProperties) {
6578
+ return __awaiter(this, void 0, void 0, function* () {
6579
+ if (!this.canSend || !this._config.collectionEnabled) {
6580
+ return;
6581
+ }
6582
+ if (!this.isValidName(eventName, 40)) {
6583
+ this.warn(`忽略无效 Firebase 事件名: ${eventName}`);
6584
+ return;
6585
+ }
6586
+ if ((eventName === "purchase" || eventName === "begin_checkout") &&
6587
+ Array.isArray(eventData.items) &&
6588
+ !this._config.supportsStructuredItems) {
6589
+ this.syncUserProperties(userProperties);
6590
+ this.warn("当前 Java Bridge 不支持 Bundle[] items,支付事件已忽略。");
6591
+ return;
6592
+ }
6593
+ this.syncUserProperties(userProperties);
6594
+ const parameters = this.normalizeParameters(eventData);
6595
+ NativeHelper.call(this._config.bridgeClassName, "logEvent", eventName, JSON.stringify(parameters));
6596
+ });
6597
+ }
6598
+ mapParameters(eventName, eventData) {
6599
+ const data = Object.assign({}, eventData);
6600
+ if (eventName === AnalyticsBehavior.LEVEL_START ||
6601
+ eventName === AnalyticsBehavior.LEVEL_END) {
6602
+ if (data.levelId !== undefined) {
6603
+ data.level_name = data.levelId;
6604
+ delete data.levelId;
6605
+ }
6606
+ }
6607
+ if (eventName === AnalyticsBehavior.SOCIAL_SHARE) {
6608
+ if (data.contentType !== undefined) {
6609
+ data.content_type = data.contentType;
6610
+ delete data.contentType;
6611
+ }
6612
+ if (data.itemId !== undefined) {
6613
+ data.item_id = data.itemId;
6614
+ delete data.itemId;
6615
+ }
6616
+ }
6617
+ if (eventName === AnalyticsBehavior.PAY_BEGIN ||
6618
+ eventName === AnalyticsBehavior.PAY_PURCHASE) {
6619
+ if (data.transactionId !== undefined) {
6620
+ data.transaction_id = data.transactionId;
6621
+ delete data.transactionId;
6622
+ }
6623
+ if (Array.isArray(data.items)) {
6624
+ data.items = data.items.map((item) => {
6625
+ if (item.itemId === undefined) {
6626
+ return Object.assign({}, item);
6627
+ }
6628
+ const mapped = Object.assign(Object.assign({}, item), { item_id: item.itemId });
6629
+ delete mapped.itemId;
6630
+ if (item.itemName !== undefined) {
6631
+ mapped.item_name = item.itemName;
6632
+ delete mapped.itemName;
6633
+ }
6634
+ if (item.itemCategory !== undefined) {
6635
+ mapped.item_category = item.itemCategory;
6636
+ delete mapped.itemCategory;
6637
+ }
6638
+ return mapped;
6639
+ });
6640
+ }
6641
+ }
6642
+ return data;
6643
+ }
6644
+ syncUserProperties(properties) {
6645
+ const previous = this._lastUserProperties;
6646
+ Object.keys(previous).forEach((key) => {
6647
+ if (!Object.prototype.hasOwnProperty.call(properties, key)) {
6648
+ this.setUserProperty(key, null);
6649
+ }
6650
+ });
6651
+ Object.keys(properties).forEach((key) => {
6652
+ if (previous[key] !== properties[key]) {
6653
+ this.setUserProperty(key, properties[key]);
6654
+ }
6655
+ });
6656
+ this._lastUserProperties = Object.assign({}, properties);
6657
+ }
6658
+ setUserProperty(key, value) {
6659
+ if (!this.isValidName(key, 24) || RESERVED_USER_PROPERTIES.has(key)) {
6660
+ this.warn(`忽略无效 Firebase 用户属性: ${key}`);
6661
+ return;
6662
+ }
6663
+ if (value == null) {
6664
+ NativeHelper.call(this._config.bridgeClassName, "clearUserProperty", key);
6665
+ return;
6666
+ }
6667
+ const normalized = typeof value === "boolean"
6668
+ ? (value ? "1" : "0")
6669
+ : String(value);
6670
+ NativeHelper.call(this._config.bridgeClassName, "setUserProperty", key, this.truncate(normalized, 36));
6671
+ }
6672
+ normalizeParameters(data) {
6673
+ const result = {};
6674
+ const keys = Object.keys(data || {});
6675
+ for (let i = 0; i < keys.length; i++) {
6676
+ if (Object.keys(result).length >= this._config.maxParameters) {
6677
+ this.warn(`Firebase 事件参数超过 ${this._config.maxParameters} 个,后续参数已忽略。`);
6678
+ break;
6679
+ }
6680
+ const key = keys[i];
6681
+ if (this._ignoredParameters.has(key) || !this.isValidName(key, 40)) {
6682
+ continue;
6683
+ }
6684
+ const value = data[key];
6685
+ if (key === "items" && Array.isArray(value)) {
6686
+ if (this._config.supportsStructuredItems) {
6687
+ result[key] = value.map((item) => (Object.assign({}, item)));
6688
+ }
6689
+ continue;
6690
+ }
6691
+ const normalized = this.normalizeValue(value);
6692
+ if (normalized !== undefined) {
6693
+ result[key] = normalized;
6694
+ }
6695
+ }
6696
+ return result;
6697
+ }
6698
+ normalizeValue(value) {
6699
+ if (value == null) {
6700
+ return undefined;
6701
+ }
6702
+ if (typeof value === "boolean") {
6703
+ return value ? 1 : 0;
6704
+ }
6705
+ if (typeof value === "number") {
6706
+ return Number.isFinite(value) ? value : undefined;
6707
+ }
6708
+ if (typeof value === "string") {
6709
+ return this.truncate(value, 100);
6710
+ }
6711
+ return undefined;
6712
+ }
6713
+ isValidName(name, maxLength) {
6714
+ if (!name || name.length > maxLength || !/^[A-Za-z][A-Za-z0-9_]*$/.test(name)) {
6715
+ return false;
6716
+ }
6717
+ return !RESERVED_PREFIXES.some((prefix) => name.startsWith(prefix));
6718
+ }
6719
+ truncate(value, maxLength) {
6720
+ return value.length > maxLength ? value.slice(0, maxLength) : value;
6721
+ }
6722
+ warn(message) {
6723
+ this._config.debug && console.warn(`[FirebaseAnalyticsSender] ${message}`);
6724
+ }
6725
+ }
6726
+
6241
6727
  class AnalyticsManager {
6242
6728
  constructor() {
6243
6729
  this._base = null;
@@ -6246,6 +6732,8 @@ class AnalyticsManager {
6246
6732
  this._session = null;
6247
6733
  this._launch = null;
6248
6734
  this._social = null;
6735
+ this._tutorial = null;
6736
+ this._pay = null;
6249
6737
  this._assignmentSender = null;
6250
6738
  }
6251
6739
  hasRelayUrl(config) {
@@ -6333,6 +6821,30 @@ class AnalyticsManager {
6333
6821
  }
6334
6822
  return this._social;
6335
6823
  }
6824
+ /**
6825
+ * 新手引导统计能力
6826
+ */
6827
+ get tutorial() {
6828
+ if (!this.base.inited) {
6829
+ throw new Error("请先通过enable初始化基础统计能力");
6830
+ }
6831
+ if (!this._tutorial) {
6832
+ this._tutorial = new TutorialAnalyticsAble(this.base);
6833
+ }
6834
+ return this._tutorial;
6835
+ }
6836
+ /**
6837
+ * 支付漏斗统计能力
6838
+ */
6839
+ get pay() {
6840
+ if (!this.base.inited) {
6841
+ throw new Error("请先通过enable初始化基础统计能力");
6842
+ }
6843
+ if (!this._pay) {
6844
+ this._pay = new PayAnalyticsAble(this.base);
6845
+ }
6846
+ return this._pay;
6847
+ }
6336
6848
  /**
6337
6849
  * 启用统计(基础统计能力)
6338
6850
  * @param debugMode 调试模式,是否打印日志信息,默认为false
@@ -6398,7 +6910,7 @@ class AnalyticsManager {
6398
6910
  if (levelid !== undefined) {
6399
6911
  payload.level_id = levelid;
6400
6912
  }
6401
- this.assignmentSender.send(eventName, payload);
6913
+ this.assignmentSender.send(eventName, payload, {});
6402
6914
  });
6403
6915
  }
6404
6916
  }
@@ -6716,37 +7228,6 @@ Application.KEY = "Application";
6716
7228
  */
6717
7229
  const App = new Application();
6718
7230
 
6719
- /*
6720
- @name: NativeHelper
6721
- @desc: 原生函数调用代理
6722
- @author: timoo
6723
- @date: 2022/11/26
6724
- */
6725
- class NativeHelper {
6726
- static call(className, methodName, ...args) {
6727
- NativeHelper.impl.call(className, methodName, ...args);
6728
- }
6729
- static callWithReturnType(className, methodName, returnType, ...args) {
6730
- return NativeHelper.impl.callWithReturnType(className, methodName, returnType, ...args);
6731
- }
6732
- static registerCallback(caller, method, times, ...args) {
6733
- return NativeHelper.impl.registerCallback(caller, method, times, ...args);
6734
- }
6735
- static registerCallbackOnce(caller, method, ...args) {
6736
- return NativeHelper.impl.registerCallback(caller, method, 1, ...args);
6737
- }
6738
- static get impl() {
6739
- if (this._impl == null) {
6740
- this._impl = Injector.getInject(NativeHelper.KEY);
6741
- }
6742
- if (this._impl == null) {
6743
- throw new Error(NativeHelper.KEY + " 未注入!");
6744
- }
6745
- return this._impl;
6746
- }
6747
- }
6748
- NativeHelper.KEY = "NativeHelper";
6749
-
6750
7231
  /*
6751
7232
  @name: BusinessCenter
6752
7233
  @desc: 事务中心,管理事务
@@ -9872,15 +10353,18 @@ class IShareAble {
9872
10353
  let internalQuery = dataArr.join("&");
9873
10354
  return query ? query + "&" + internalQuery : internalQuery;
9874
10355
  }
9875
- _report(analyticsName, msg) {
9876
- let data = { msg };
10356
+ _report(analyticsName, phase, method = "text_or_image") {
10357
+ let data = { phase, method };
9877
10358
  if (typeof analyticsName === "string") {
9878
- data.name = analyticsName;
10359
+ data.itemId = analyticsName;
9879
10360
  }
9880
10361
  else if (typeof analyticsName == "object") {
9881
10362
  Object.assign(data, analyticsName);
10363
+ if (data.itemId === undefined && data.name !== undefined) {
10364
+ data.itemId = data.name;
10365
+ }
9882
10366
  }
9883
- analytics.social.recordShare(data);
10367
+ analytics.social.share(data);
9884
10368
  }
9885
10369
  /**
9886
10370
  * 分享图片或者文字
@@ -10619,9 +11103,12 @@ class NativeAnalyticsSender extends EmptyAnalyticsSender {
10619
11103
  this._className = "sdk.Share";
10620
11104
  this._className = className;
10621
11105
  }
10622
- send(eventName, data) {
11106
+ mapEvent(eventName, eventData) {
11107
+ return mapCanonicalEventToFlatName(eventName, eventData);
11108
+ }
11109
+ send(eventName, eventData, userProperties) {
10623
11110
  return new Promise((success) => {
10624
- NativeHelper.call(this._className, "report", eventName, JSON.stringify(data));
11111
+ NativeHelper.call(this._className, "report", eventName, JSON.stringify(Object.assign(Object.assign({}, userProperties), eventData)));
10625
11112
  success();
10626
11113
  });
10627
11114
  }
@@ -10892,14 +11379,14 @@ class NativeShare extends IShareAble {
10892
11379
  shareTextOrImage(analyticsName, data) {
10893
11380
  return __awaiter(this, void 0, void 0, function* () {
10894
11381
  console.log("发起分享:", analyticsName, data);
10895
- this._report(analyticsName, "发起");
11382
+ this._report(analyticsName, "begin");
10896
11383
  return this._share("textOrImage", analyticsName, data);
10897
11384
  });
10898
11385
  }
10899
11386
  shareVideo(analyticsName, data) {
10900
11387
  return __awaiter(this, void 0, void 0, function* () {
10901
11388
  console.log("发起视频分享:", analyticsName, data);
10902
- this._report(analyticsName, "发起");
11389
+ this._report(analyticsName, "begin", "video");
10903
11390
  return this._share("video", analyticsName, data);
10904
11391
  });
10905
11392
  }
@@ -10908,12 +11395,12 @@ class NativeShare extends IShareAble {
10908
11395
  let callbacks = [];
10909
11396
  callbacks.push(NativeHelper.registerCallbackOnce(this, () => {
10910
11397
  console.log("分享完成,分享是否成功:", true);
10911
- this._report(analyticsName, "成功");
11398
+ this._report(analyticsName, "success", action === "video" ? "video" : "text_or_image");
10912
11399
  resolve(true);
10913
11400
  }));
10914
11401
  callbacks.push(NativeHelper.registerCallbackOnce(this, () => {
10915
11402
  console.log("分享完成,分享是否成功:", false);
10916
- this._report(analyticsName, "失败");
11403
+ this._report(analyticsName, "fail", action === "video" ? "video" : "text_or_image");
10917
11404
  resolve(false);
10918
11405
  }));
10919
11406
  if (typeof data == "string") {
@@ -11358,10 +11845,13 @@ class TKAd extends IADAble {
11358
11845
  * TK事件上报器(window['tt'].reportAnalytics)
11359
11846
  */
11360
11847
  class TKAnalyticsSender extends EmptyAnalyticsSender {
11361
- send(eventName, data) {
11848
+ mapEvent(eventName, eventData) {
11849
+ return mapCanonicalEventToFlatName(eventName, eventData);
11850
+ }
11851
+ send(eventName, eventData, userProperties) {
11362
11852
  var _a, _b;
11363
11853
  return __awaiter(this, void 0, void 0, function* () {
11364
- (_b = (_a = window['TTMinis']) === null || _a === void 0 ? void 0 : _a.game) === null || _b === void 0 ? void 0 : _b.reportEvent(eventName, data);
11854
+ (_b = (_a = window['TTMinis']) === null || _a === void 0 ? void 0 : _a.game) === null || _b === void 0 ? void 0 : _b.reportEvent(eventName, Object.assign(Object.assign({}, userProperties), eventData));
11365
11855
  });
11366
11856
  }
11367
11857
  }
@@ -11383,9 +11873,12 @@ class WXPay extends IPayAble {
11383
11873
  * 微信事件上报器(window['wx'].reportEvent)
11384
11874
  */
11385
11875
  class WXAnalyticsSender extends EmptyAnalyticsSender {
11386
- send(eventName, data) {
11876
+ mapEvent(eventName, eventData) {
11877
+ return mapCanonicalEventToFlatName(eventName, eventData);
11878
+ }
11879
+ send(eventName, eventData, userProperties) {
11387
11880
  return __awaiter(this, void 0, void 0, function* () {
11388
- window['wx'].reportEvent(eventName, data);
11881
+ window['wx'].reportEvent(eventName, Object.assign(Object.assign({}, userProperties), eventData));
11389
11882
  });
11390
11883
  }
11391
11884
  }
@@ -11446,7 +11939,7 @@ class WXShare extends IShareAble {
11446
11939
  return __awaiter(this, void 0, void 0, function* () {
11447
11940
  return new Promise((resolve) => {
11448
11941
  console.log("发起分享:", analyticsName, data);
11449
- this._report(analyticsName, "发起");
11942
+ this._report(analyticsName, "begin");
11450
11943
  if (!this._wx) {
11451
11944
  console.error("wx接口不存在!");
11452
11945
  resolve(false);
@@ -11462,14 +11955,14 @@ class WXShare extends IShareAble {
11462
11955
  let duration = Math.floor((Date.now() - shareTime) / 1000);
11463
11956
  let shareResult = duration <= tempData.durationMax && duration >= tempData.durationMin;
11464
11957
  console.log("分享完成,分享是否成功:", shareResult);
11465
- this._report(analyticsName, "成功");
11958
+ this._report(analyticsName, shareResult ? "success" : "fail");
11466
11959
  resolve(shareResult);
11467
11960
  };
11468
11961
  App.onShow(onShareBack);
11469
11962
  }
11470
11963
  else {
11471
11964
  console.log("分享完成,分享是否成功:", false);
11472
- this._report(analyticsName, "失败");
11965
+ this._report(analyticsName, "fail");
11473
11966
  resolve(true);
11474
11967
  }
11475
11968
  });
@@ -12203,7 +12696,7 @@ class KSShare extends IShareAble {
12203
12696
  return __awaiter(this, void 0, void 0, function* () {
12204
12697
  return new Promise((resolve) => {
12205
12698
  console.log("发起分享:", data);
12206
- this._report(analyticsName, "发起");
12699
+ this._report(analyticsName, "begin");
12207
12700
  if (!this._ks) {
12208
12701
  console.error("快手接口不存在!");
12209
12702
  resolve(false);
@@ -12212,12 +12705,12 @@ class KSShare extends IShareAble {
12212
12705
  params.query = this._getShareQuery(analyticsName, params.query);
12213
12706
  params.success = () => {
12214
12707
  console.log("分享完成,分享是否成功:", true);
12215
- this._report(analyticsName, "成功");
12708
+ this._report(analyticsName, "success");
12216
12709
  resolve(true);
12217
12710
  };
12218
12711
  params.fail = (e) => {
12219
12712
  console.log("分享完成,分享是否成功:", false, e);
12220
- this._report(analyticsName, "失败");
12713
+ this._report(analyticsName, "fail");
12221
12714
  resolve(false);
12222
12715
  };
12223
12716
  this._ks.shareAppMessage(params);
@@ -12226,8 +12719,10 @@ class KSShare extends IShareAble {
12226
12719
  }
12227
12720
  shareVideo(analyticsName, data) {
12228
12721
  return __awaiter(this, void 0, void 0, function* () {
12229
- publisher.recordT().publicVideo(this._getShareQuery(analyticsName, data.query), data.mouldId);
12230
- return true;
12722
+ this._report(analyticsName, "begin", "video");
12723
+ const success = yield publisher.recordT().publicVideo(this._getShareQuery(analyticsName, data.query), data.mouldId);
12724
+ this._report(analyticsName, success ? "success" : "fail", "video");
12725
+ return success;
12231
12726
  });
12232
12727
  }
12233
12728
  }
@@ -12348,7 +12843,7 @@ class TTShare extends IShareAble {
12348
12843
  return __awaiter(this, void 0, void 0, function* () {
12349
12844
  return new Promise((resolve) => {
12350
12845
  console.log("发起分享:", data);
12351
- this._report(analyticsName, "发起");
12846
+ this._report(analyticsName, "begin");
12352
12847
  if (!this._tt) {
12353
12848
  console.error("tt接口不存在!");
12354
12849
  resolve(false);
@@ -12357,12 +12852,12 @@ class TTShare extends IShareAble {
12357
12852
  params.query = this._getShareQuery(analyticsName, params.query);
12358
12853
  params.success = () => {
12359
12854
  console.log("分享完成,分享是否成功:", true);
12360
- this._report(analyticsName, "成功");
12855
+ this._report(analyticsName, "success");
12361
12856
  resolve(true);
12362
12857
  };
12363
12858
  params.fail = (e) => {
12364
12859
  console.log("分享完成,分享是否成功:", false, e);
12365
- this._report(analyticsName, "失败");
12860
+ this._report(analyticsName, "fail");
12366
12861
  resolve(false);
12367
12862
  };
12368
12863
  this._tt.shareAppMessage(params);
@@ -12373,7 +12868,7 @@ class TTShare extends IShareAble {
12373
12868
  return __awaiter(this, void 0, void 0, function* () {
12374
12869
  return new Promise((resolve) => {
12375
12870
  console.log("发起视频分享:", data);
12376
- this._report(analyticsName, "发起");
12871
+ this._report(analyticsName, "begin", "video");
12377
12872
  if (!this._tt) {
12378
12873
  console.error("tt接口不存在!");
12379
12874
  resolve(false);
@@ -12390,12 +12885,12 @@ class TTShare extends IShareAble {
12390
12885
  },
12391
12886
  success: (res) => {
12392
12887
  console.log("分享完成,分享是否成功:", true);
12393
- this._report(analyticsName, "成功");
12888
+ this._report(analyticsName, "success", "video");
12394
12889
  resolve(true);
12395
12890
  },
12396
12891
  fail: (e) => {
12397
12892
  console.log("分享完成,分享是否成功:", false, e);
12398
- this._report(analyticsName, "失败");
12893
+ this._report(analyticsName, "fail", "video");
12399
12894
  resolve(false);
12400
12895
  },
12401
12896
  });
@@ -12761,9 +13256,12 @@ class TTAd extends IADAble {
12761
13256
  * 字节事件上报器(window['tt'].reportAnalytics)
12762
13257
  */
12763
13258
  class TTAnalyticsSender extends EmptyAnalyticsSender {
12764
- send(eventName, data) {
13259
+ mapEvent(eventName, eventData) {
13260
+ return mapCanonicalEventToFlatName(eventName, eventData);
13261
+ }
13262
+ send(eventName, eventData, userProperties) {
12765
13263
  return __awaiter(this, void 0, void 0, function* () {
12766
- window['tt'].reportAnalytics(eventName, data);
13264
+ window['tt'].reportAnalytics(eventName, Object.assign(Object.assign({}, userProperties), eventData));
12767
13265
  });
12768
13266
  }
12769
13267
  }
@@ -15222,4 +15720,4 @@ TipsView = __decorate([
15222
15720
  menu("基础视图/TipsView")
15223
15721
  ], TipsView);
15224
15722
 
15225
- export { ADAnalyticsAble, ADBehaviorReporter, ADEvent, ADType, AD_METRIC_ORDER_V1, ALiAnalyticsSender, AdDimension, AnalyticsAble, App, Application, Async, AudioBusiness, BaseDimension, BaseOnlineConfig, BaseProtocolHelper, BusinessCenter, ByteView, CCPViewLoader, CCSceneLoader, CocosNativeHelper, CocosStorageUtils, CocosViewManager, Component, ConfigHelper, DEFAULT_GAME_FLAG, Dictionary, DimensionType, ECS, EffectAudioSourceProxy, EmptyAnalyticsSender, EmptyLink, EnterOptionParser, Event$2 as Event, EventDispatcher, Fsm, FsmBase, GameDimension, GameLeaveType, GeometryUtils, Handler, HttpNode, HttpRequest, IADAble, IDevice, IGameUpdateAble, ILoginAble, INTERNAL_METHODS, INativeHelper, IPayAble, IPublisher, IPublisherManager, IRecordAble, IShareAble, IViewLoader, Injector, Json, KKTServer, KSAd, KSDevice, KSLogin, KSPublisher, KSRecorder, KSShare, KeytopsAnalyticsSender, LEVEL_STATS_METRIC_ORDER_V1, LaunchAnalyticsAble, LevelAnalyticsAble, LevelBehaviorReporter, LevelOnlineConfig, LevelStatsDimension, Link, List, LogType, Logger, MYAd, MYDevice, MYLogin, MYPublisher, Mask, MathUtils, MemeryStorage, NativeAd, NativeAnalyticsSender, NativeDevice, NativeHelper, NativeLogin, NativePay, NativePublisher, NativeRecorder, NativeShare, NativeUtils, NetManager, NoRequestServer, PLAYER_ABILITY_METRIC_ORDER_V1, PlayerAbilityDimension, Pool, PromiseUtils, PropSupport, PublisherManager, RemoteConfigService, RemoteConfigStore, ResourceManager, RewardVideoMaskBusiness, RuntimeApplicationImpl, Scene, Server, SessionAnalyticsAble, SessionDimension, SocialAnalyticsAble, SocialDimension, Socket, SocketLogType, SocketNode, Storage, StorageImpl, StringUtils, System, SystemOnlineConfig, TKAd, TKAnalyticsSender, TKDevice, TKLogin, TKPublisher, TTAd, TTAnalyticsSender, TTDevice, TTGameUpdater, TTLogin, TTPay, TTPublisher, TTRecorder, TTShare, Task, TaskQueue, TaskSequence, Timer, TimerImpl, TipsType, TipsView, View, ViewControl, ViewLevel, ViewManager, WXAd, WXAnalyticsSender, WXDevice, WXGameUpdater, WXLogin, WXPay, WXPublisher, WXShare, ab, analytics, audio, bidding, businessCenter, cmd, component, eventCenter, fsmManager, manager, maskView, md5, net, publisher, remoteConfig, remoteConfigService, res, server, storage, system, timer, version, viewAnalytics, viewClass, viewManager };
15723
+ export { ADAnalyticsAble, ADBehaviorReporter, ADEvent, ADType, AD_METRIC_ORDER_V1, ALiAnalyticsSender, AdDimension, AnalyticsAble, AnalyticsBehavior, App, Application, Async, AudioBusiness, BaseDimension, BaseOnlineConfig, BaseProtocolHelper, BusinessCenter, ByteView, CCPViewLoader, CCSceneLoader, CocosNativeHelper, CocosStorageUtils, CocosViewManager, Component, ConfigHelper, DEFAULT_GAME_FLAG, Dictionary, DimensionType, ECS, EffectAudioSourceProxy, EmptyAnalyticsSender, EmptyLink, EnterOptionParser, Event$2 as Event, EventDispatcher, FirebaseAnalyticsSender, Fsm, FsmBase, GameDimension, GameLeaveType, GeometryUtils, Handler, HttpNode, HttpRequest, IADAble, IDevice, IGameUpdateAble, ILoginAble, INTERNAL_METHODS, INativeHelper, IPayAble, IPublisher, IPublisherManager, IRecordAble, IShareAble, IViewLoader, Injector, Json, KKTServer, KSAd, KSDevice, KSLogin, KSPublisher, KSRecorder, KSShare, KeytopsAnalyticsSender, LEVEL_STATS_METRIC_ORDER_V1, LaunchAnalyticsAble, LevelAnalyticsAble, LevelBehaviorReporter, LevelOnlineConfig, LevelStatsDimension, Link, List, LogType, Logger, MYAd, MYDevice, MYLogin, MYPublisher, Mask, MathUtils, MemeryStorage, NativeAd, NativeAnalyticsSender, NativeDevice, NativeHelper, NativeLogin, NativePay, NativePublisher, NativeRecorder, NativeShare, NativeUtils, NetManager, NoRequestServer, PLAYER_ABILITY_METRIC_ORDER_V1, PayAnalyticsAble, PlayerAbilityDimension, Pool, PromiseUtils, PropSupport, PublisherManager, RemoteConfigService, RemoteConfigStore, ResourceManager, RewardVideoMaskBusiness, RuntimeApplicationImpl, Scene, Server, SessionAnalyticsAble, SessionDimension, SocialAnalyticsAble, SocialDimension, Socket, SocketLogType, SocketNode, Storage, StorageImpl, StringUtils, System, SystemOnlineConfig, TKAd, TKAnalyticsSender, TKDevice, TKLogin, TKPublisher, TTAd, TTAnalyticsSender, TTDevice, TTGameUpdater, TTLogin, TTPay, TTPublisher, TTRecorder, TTShare, Task, TaskQueue, TaskSequence, Timer, TimerImpl, TipsType, TipsView, TutorialAnalyticsAble, View, ViewControl, ViewLevel, ViewManager, WXAd, WXAnalyticsSender, WXDevice, WXGameUpdater, WXLogin, WXPay, WXPublisher, WXShare, ab, analytics, audio, bidding, businessCenter, cmd, component, eventCenter, fsmManager, manager, mapCanonicalEventToFlatName, mapCanonicalEventToLegacy, maskView, md5, net, publisher, remoteConfig, remoteConfigService, res, server, storage, system, timer, version, viewAnalytics, viewClass, viewManager };