basicTrack.ts 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import { IBaseAction, ICustomAction, TrackActionOption, TrackEntityType } from '@medici/types';
  2. import type { SDKInitConfig, PlatformType, SDKConfigType } from './sdk';
  3. import type { IHistory } from './history';
  4. import { collect } from './collector';
  5. // import cloneDeep from 'lodash-es/cloneDeep';
  6. import { cloneDeep } from '@medici/utils';
  7. import { SDK } from './sdk';
  8. export class BaseTrack implements IBaseAction, ICustomAction {
  9. protected _platform: PlatformType;
  10. protected _config: SDKInitConfig;
  11. protected _history: IHistory;
  12. protected _endPoint: string;
  13. protected _appId: string;
  14. private _timeOut: ReturnType<typeof setTimeout>;
  15. constructor(params: SDKConfigType) {
  16. this._config = Object.assign({ user: '', version: '' }, params.config);
  17. this._platform = params.platform;
  18. this._appId = params.appId;
  19. this._endPoint = params.endPoint;
  20. }
  21. get _stopTrack() {
  22. return SDK._stopTrack;
  23. }
  24. get trackUrl() {
  25. return this._endPoint + '/tracking/log/save';
  26. }
  27. get trackPageViewUrl() {
  28. return this._endPoint + '/tracking/log/save';
  29. }
  30. private toTrackEntity(params: TrackEntityType): TrackEntityType {
  31. const entity = {
  32. appId: this._appId,
  33. module: params.module,
  34. type: params.type,
  35. url: params.url || this._history.playload.url,
  36. eventType: params.eventType,
  37. referrer: params.referrer || this._history.currentRef,
  38. requestData: params.requestData,
  39. };
  40. if (params.language) {
  41. entity['language'] = params.language;
  42. }
  43. if (params.networkType) {
  44. entity['networkType'] = params.networkType;
  45. }
  46. if (params.userId) {
  47. entity['userId'] = params.userId;
  48. }
  49. return entity;
  50. }
  51. public trackView(url: string, referrer: string, uuid: string): Promise<XMLHttpRequestResponseType> {
  52. console.log('BaseTrack-trackView', url, referrer, uuid);
  53. if (!this._stopTrack) {
  54. this._history.playload.url = url;
  55. const historyPlayload = cloneDeep(this._history.playload);
  56. // const payload = Object.assign(historyPlayload, {
  57. // ...this._config,
  58. // referrer: this._history.currentRef,
  59. // url: url,
  60. // });
  61. const payload: TrackEntityType = {
  62. module: 'pageview',
  63. url: url,
  64. type: 'pageview',
  65. eventType: 'pageview',
  66. language: historyPlayload.language,
  67. userId: this._config.user,
  68. };
  69. console.log('send-playload', payload);
  70. return collect(this.trackPageViewUrl, 'pageview', this.toTrackEntity(payload));
  71. }
  72. }
  73. public trackEvent(event_name: string, event_data: string, url?: string, uuid?: string): Promise<XMLHttpRequestResponseType> {
  74. if (!this._stopTrack) {
  75. console.log('BaseTrack-TrackEvent', event_name, event_data, url, uuid);
  76. this._history.playload.url = url;
  77. const historyPlayload = cloneDeep(this._history.playload);
  78. // const payload = Object.assign(historyPlayload, {
  79. // referrer: this._history.currentRef,
  80. // event_name: event_name,
  81. // url: url,
  82. // event_data: event_data,
  83. // ...this._config,
  84. // });
  85. const payload: TrackEntityType = {
  86. module: event_name,
  87. url: url,
  88. type: 'event',
  89. eventType: event_data,
  90. language: historyPlayload.language,
  91. userId: this._config.user,
  92. };
  93. console.log('send-playload', payload);
  94. return collect(this.trackPageViewUrl, 'event', this.toTrackEntity(payload));
  95. }
  96. }
  97. public track(trackActionName: string, trackActionOption?: TrackActionOption): Promise<XMLHttpRequestResponseType> {
  98. if (!this._stopTrack) {
  99. const historyPlayload = cloneDeep(this._history.playload);
  100. const trackObj = cloneDeep(trackActionOption);
  101. delete trackObj.eventType;
  102. delete trackObj.maxWaitTime;
  103. const payload: TrackEntityType = {
  104. module: trackActionName,
  105. type: 'track',
  106. eventType: trackActionOption.eventType,
  107. requestData: Object.assign({ screen: historyPlayload.screen }, trackObj, this._config),
  108. language: historyPlayload.language,
  109. networkType: trackActionOption.networkType,
  110. userId: this._config.user,
  111. };
  112. // this.toTrackEntity(payload);
  113. return collect(this.trackUrl, 'track', this.toTrackEntity(payload));
  114. }
  115. }
  116. public startTrack(trackActionName: string, trackActionOption?: TrackActionOption): Promise<XMLHttpRequestResponseType> {
  117. if (!this._stopTrack) {
  118. const historyPlayload = cloneDeep(this._history.playload);
  119. const trackObj = cloneDeep(trackActionOption);
  120. delete trackObj.eventType;
  121. delete trackObj.maxWaitTime;
  122. const payload: TrackEntityType = {
  123. module: trackActionName,
  124. type: 'start_track',
  125. eventType: trackActionOption.eventType,
  126. requestData: Object.assign({}, trackObj, this._config),
  127. language: historyPlayload.language,
  128. networkType: trackActionOption.networkType,
  129. userId: this._config.user,
  130. };
  131. if (trackActionOption.maxWaitTime) {
  132. this._timeOut = setTimeout(() => {
  133. this.endTrack(trackActionName, trackActionOption);
  134. }, trackActionOption.maxWaitTime);
  135. }
  136. return collect(this.trackUrl, 'period_track', this.toTrackEntity(payload));
  137. }
  138. }
  139. public endTrack(trackActionName: string, trackActionOption?: TrackActionOption): Promise<XMLHttpRequestResponseType> {
  140. this._timeOut && clearTimeout(this._timeOut);
  141. if (!this._stopTrack) {
  142. const historyPlayload = cloneDeep(this._history.playload);
  143. const trackObj = cloneDeep(trackActionOption);
  144. delete trackObj.eventType;
  145. delete trackObj.maxWaitTime;
  146. const payload: TrackEntityType = {
  147. module: trackActionName,
  148. type: 'end_track',
  149. eventType: trackActionOption.eventType,
  150. requestData: Object.assign({}, trackObj, this._config),
  151. language: historyPlayload.language,
  152. networkType: trackActionOption.networkType,
  153. userId: this._config.user,
  154. };
  155. return collect(this.trackUrl, 'period_track', this.toTrackEntity(payload));
  156. }
  157. }
  158. }