@omega-tracker/omg-abstract-strategy-plugin 0.0.1-security → 934.746.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.
Potentially problematic release.
This version of @omega-tracker/omg-abstract-strategy-plugin might be problematic. Click here for more details.
- package/index.js +28 -0
- package/package.json +15 -3
- package/src/com/didichuxing/tracker/plugin/AReportingStrategyPlugin.ts +460 -0
- package/src/com/didichuxing/tracker/plugin/events/AEvent.ts +261 -0
- package/src/com/didichuxing/tracker/plugin/events/BlockedEvent.ts +57 -0
- package/src/com/didichuxing/tracker/plugin/events/EventStatus.ts +34 -0
- package/src/com/didichuxing/tracker/plugin/events/FailedEvent.ts +65 -0
- package/src/com/didichuxing/tracker/plugin/events/SequencedEvent.ts +85 -0
- package/src/com/didichuxing/tracker/plugin/events/TimeoutEvent.ts +49 -0
- package/src/com/didichuxing/tracker/plugin/reportor/AH5EventReportor.ts +135 -0
- package/src/com/didichuxing/tracker/plugin/reportor/DataQueueSet.ts +61 -0
- package/src/com/didichuxing/tracker/plugin/reportor/PostEventReportor.ts +61 -0
- package/src/com/didichuxing/tracker/plugin/utils/EncodeHash.ts +22 -0
- package/src/com/didichuxing/tracker/plugin/utils/GlobalUtil.ts +70 -0
- package/src/com/didichuxing/tracker/plugin/utils/PluginUtils.ts +135 -0
- package/src/com/didichuxing/tracker/plugin/utils/ReportCallbackUtil.ts +79 -0
- package/src/com/didichuxing/tracker/plugin/utils/UUID.ts +63 -0
- package/README.md +0 -5
| @@ -0,0 +1,261 @@ | |
| 1 | 
            +
            /**
         | 
| 2 | 
            +
             * Copyright (c) 2018-present, Didi, Inc.
         | 
| 3 | 
            +
             * All rights reserved.
         | 
| 4 | 
            +
             *
         | 
| 5 | 
            +
             * @author Cory(kuanghongrui@didichuxing.com)
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * @file The class of AEvent
         | 
| 8 | 
            +
             */
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            import { IPlanObject } from 'com/didichuxing/IPlanObject';
         | 
| 11 | 
            +
            import { IObjectMap } from 'com/didichuxing/IObjectMap';
         | 
| 12 | 
            +
            import { IContext } from 'com/didichuxing/context/IContext';
         | 
| 13 | 
            +
            import { ITrackerContext } from 'com/didichuxing/tracker/context/ITrackerContext';
         | 
| 14 | 
            +
            import { IContextContainer } from 'com/didichuxing/context/IContextContainer';
         | 
| 15 | 
            +
            import { ITrackedEvent } from 'com/didichuxing/tracker/event/ITrackedEvent';
         | 
| 16 | 
            +
            import { ITrackedEventData } from 'com/didichuxing/tracker/event/ITrackedEventData';
         | 
| 17 | 
            +
            import { IAttrs } from 'com/didichuxing/tracker/IAttrs';
         | 
| 18 | 
            +
            import { EventStatus } from 'com/didichuxing/tracker/plugin/events/EventStatus';
         | 
| 19 | 
            +
            import GlobalUtil from 'com/didichuxing/tracker/plugin/utils/GlobalUtil';
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            export default abstract class AEvent implements ITrackedEvent, IContextContainer {
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              /**
         | 
| 24 | 
            +
               * 上报的上下文环境
         | 
| 25 | 
            +
               */
         | 
| 26 | 
            +
              private readonly context: IContext;
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              /**
         | 
| 29 | 
            +
               * 事件的额外参数。
         | 
| 30 | 
            +
               */
         | 
| 31 | 
            +
              private readonly attrs: IAttrs;
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              /**
         | 
| 34 | 
            +
               * @constructor
         | 
| 35 | 
            +
               * @param {IAttrs} attrs
         | 
| 36 | 
            +
               * @param {IContext} context
         | 
| 37 | 
            +
               */
         | 
| 38 | 
            +
              constructor(attrs: IAttrs, context: IContext) {
         | 
| 39 | 
            +
                this.attrs = attrs;
         | 
| 40 | 
            +
                this.context = context;
         | 
| 41 | 
            +
              }
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              /**
         | 
| 44 | 
            +
               * 获取版本号
         | 
| 45 | 
            +
               */
         | 
| 46 | 
            +
              private getVersion() {
         | 
| 47 | 
            +
                return {
         | 
| 48 | 
            +
                  trackerVersion: this.getContext().version
         | 
| 49 | 
            +
                };
         | 
| 50 | 
            +
              }
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              /**
         | 
| 53 | 
            +
               * @abstract
         | 
| 54 | 
            +
               * @returns {string}
         | 
| 55 | 
            +
               */
         | 
| 56 | 
            +
              public abstract getType(): string;
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              /**
         | 
| 59 | 
            +
               * @override
         | 
| 60 | 
            +
               * @inheritDoc
         | 
| 61 | 
            +
               * @returns {ITrackedEventData}
         | 
| 62 | 
            +
               */
         | 
| 63 | 
            +
              public getData(): ITrackedEventData {
         | 
| 64 | 
            +
                const context: ITrackerContext = this.getContext() as ITrackerContext;
         | 
| 65 | 
            +
                return {
         | 
| 66 | 
            +
                  eventId: this.getType(),
         | 
| 67 | 
            +
                  timestamp: new Date().getTime(),
         | 
| 68 | 
            +
                  viewportId: context.viewportId,
         | 
| 69 | 
            +
                  appName: context.appName,
         | 
| 70 | 
            +
                  appVersion: context.appVersion,
         | 
| 71 | 
            +
                  omgId: context.omgId,
         | 
| 72 | 
            +
                  url: context.url || location.href,
         | 
| 73 | 
            +
                  latitude: context.latitude,
         | 
| 74 | 
            +
                  longitude: context.longitude,
         | 
| 75 | 
            +
                  userAgent: context.userAgent,
         | 
| 76 | 
            +
                  osType: context.osType,
         | 
| 77 | 
            +
                  osVersion: context.osVersion,
         | 
| 78 | 
            +
                  appKey: context.appKey || context.productName,
         | 
| 79 | 
            +
                  userName: context.userName,
         | 
| 80 | 
            +
                  userId: context.userId,
         | 
| 81 | 
            +
                  cityId: context.cityId,
         | 
| 82 | 
            +
                  telephone: context.telephone,
         | 
| 83 | 
            +
                  bizId: context.bizId,
         | 
| 84 | 
            +
                  locale: context.locale,
         | 
| 85 | 
            +
                  countyId: context.countyId,
         | 
| 86 | 
            +
                  countryCallingCode: context.countryCallingCode,
         | 
| 87 | 
            +
                  utcOffset: context.utcOffset,
         | 
| 88 | 
            +
                  attrs: this.getAttrs(),
         | 
| 89 | 
            +
                  from: this.getFrom()
         | 
| 90 | 
            +
                };
         | 
| 91 | 
            +
              }
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              /**
         | 
| 94 | 
            +
               * 将事件数据属性映射成上报的字段。
         | 
| 95 | 
            +
               * @returns {IObjectMap<string>}
         | 
| 96 | 
            +
               */
         | 
| 97 | 
            +
              protected getDataKeyMap(): IObjectMap<string> {
         | 
| 98 | 
            +
                return {
         | 
| 99 | 
            +
                  eventId: 'e',
         | 
| 100 | 
            +
                  timestamp: 'ts',
         | 
| 101 | 
            +
                  viewportId: 'uwid',
         | 
| 102 | 
            +
                  version: 'jv',
         | 
| 103 | 
            +
                  appName: 'an',
         | 
| 104 | 
            +
                  appVersion: 'av',
         | 
| 105 | 
            +
                  omgId: 'oid',
         | 
| 106 | 
            +
                  url: 'v',
         | 
| 107 | 
            +
                  latitude: 'lat',
         | 
| 108 | 
            +
                  longitude: 'lng',
         | 
| 109 | 
            +
                  userAgent: 'ua',
         | 
| 110 | 
            +
                  osType: 'ot',
         | 
| 111 | 
            +
                  osVersion: 'ov',
         | 
| 112 | 
            +
                  appKey: 'ak',
         | 
| 113 | 
            +
                  userName: 'un',
         | 
| 114 | 
            +
                  userId: 'uid',
         | 
| 115 | 
            +
                  cityId: 'cityid',
         | 
| 116 | 
            +
                  telephone: 'tel',
         | 
| 117 | 
            +
                  bizId: 'bizId',
         | 
| 118 | 
            +
                  locale: 'le',
         | 
| 119 | 
            +
                  countyId: 'coi',
         | 
| 120 | 
            +
                  countryCallingCode: 'dcc',
         | 
| 121 | 
            +
                  utcOffset: 'uo',
         | 
| 122 | 
            +
                  from: 'fr'
         | 
| 123 | 
            +
                };
         | 
| 124 | 
            +
              }
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              /**
         | 
| 127 | 
            +
               * 将attrs属性映射成上报的字段。
         | 
| 128 | 
            +
               * @returns {IObjectMap<string>}
         | 
| 129 | 
            +
               */
         | 
| 130 | 
            +
              protected getAttrsKeyMap(): IObjectMap<string> {
         | 
| 131 | 
            +
                return {
         | 
| 132 | 
            +
                  _label: 'l',
         | 
| 133 | 
            +
                  trackerVersion: 'jv'
         | 
| 134 | 
            +
                };
         | 
| 135 | 
            +
              }
         | 
| 136 | 
            +
             | 
| 137 | 
            +
              /**
         | 
| 138 | 
            +
               * 把event data(去除attrs)序列化成json字符串。
         | 
| 139 | 
            +
               * @returns {string}
         | 
| 140 | 
            +
               */
         | 
| 141 | 
            +
              public serialize2JsonStrWithoutAttrs(): string {
         | 
| 142 | 
            +
                try {
         | 
| 143 | 
            +
                  const eventData: ITrackedEventData = this.getData();
         | 
| 144 | 
            +
                  const obj: IPlanObject = {};
         | 
| 145 | 
            +
                  const dataKeyMap: IObjectMap<string> = this.getDataKeyMap();
         | 
| 146 | 
            +
                  for (const prop in eventData) {
         | 
| 147 | 
            +
                    if (prop !== 'attrs' && !/Null|Undefined/.test(Object.prototype.toString.call(eventData[prop]))) {
         | 
| 148 | 
            +
                      obj[dataKeyMap[prop] || prop] = eventData[prop];
         | 
| 149 | 
            +
                    }
         | 
| 150 | 
            +
                  }
         | 
| 151 | 
            +
                  return JSON.stringify(obj);
         | 
| 152 | 
            +
                } catch (e) {
         | 
| 153 | 
            +
                  GlobalUtil.dispatchOmgLog('serialize2JsonStrWithoutAttrs Error');
         | 
| 154 | 
            +
                  return '';
         | 
| 155 | 
            +
                }
         | 
| 156 | 
            +
              }
         | 
| 157 | 
            +
             | 
| 158 | 
            +
              /**
         | 
| 159 | 
            +
               * @override
         | 
| 160 | 
            +
               * @inheritDoc
         | 
| 161 | 
            +
               * @returns {string}
         | 
| 162 | 
            +
               */
         | 
| 163 | 
            +
              public serialize(): string {
         | 
| 164 | 
            +
                try {
         | 
| 165 | 
            +
                  const eventData: ITrackedEventData = this.getData();
         | 
| 166 | 
            +
                  // 先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
         | 
| 167 | 
            +
                  const newkeys = Object.keys(eventData).sort();
         | 
| 168 | 
            +
                  const kvs: string[] = [];
         | 
| 169 | 
            +
                  const dataKeyMap: IObjectMap<string> = this.getDataKeyMap();
         | 
| 170 | 
            +
                  // 要保证顺序 所以attrs也放进了循环
         | 
| 171 | 
            +
                  newkeys.forEach((prop) => {
         | 
| 172 | 
            +
                    if (prop !== 'attrs' && !/Null|Undefined/.test(Object.prototype.toString.call(eventData[prop]))) {
         | 
| 173 | 
            +
                      kvs.push(`${ dataKeyMap[prop] || prop }=${ encodeURIComponent(eventData[prop]) }`);
         | 
| 174 | 
            +
                    } else if (prop === 'attrs') {
         | 
| 175 | 
            +
                      const attrsJsonStr: string = this.serializeAttrs2JsonStr(eventData.attrs || {});
         | 
| 176 | 
            +
                      if (attrsJsonStr !== '{}') {
         | 
| 177 | 
            +
                        kvs.push(`attrs=${ encodeURIComponent(attrsJsonStr) }`);
         | 
| 178 | 
            +
                      }
         | 
| 179 | 
            +
                    }
         | 
| 180 | 
            +
                  });
         | 
| 181 | 
            +
                  return kvs.join('&');
         | 
| 182 | 
            +
                } catch (e) {
         | 
| 183 | 
            +
                  GlobalUtil.dispatchOmgLog('serialize Error');
         | 
| 184 | 
            +
                  return '';
         | 
| 185 | 
            +
                }
         | 
| 186 | 
            +
              }
         | 
| 187 | 
            +
             | 
| 188 | 
            +
              /**
         | 
| 189 | 
            +
               * 格式化attrs
         | 
| 190 | 
            +
               * @param {IAttrs} attrs
         | 
| 191 | 
            +
               * @returns {string}
         | 
| 192 | 
            +
               */
         | 
| 193 | 
            +
              public serializeAttrs2JsonStr(attrs: IAttrs): string {
         | 
| 194 | 
            +
                try {
         | 
| 195 | 
            +
                  const serializedAttrs: IPlanObject = {};
         | 
| 196 | 
            +
                  const attrsKeyMap: IObjectMap<string> = this.getAttrsKeyMap();
         | 
| 197 | 
            +
                  for (const prop in attrs) {
         | 
| 198 | 
            +
                    if (attrs.hasOwnProperty(prop)) {
         | 
| 199 | 
            +
                      const key: string = attrsKeyMap[prop] || prop;
         | 
| 200 | 
            +
                      if (/Object|Array/.test(Object.prototype.toString.call(attrs[prop]))) {
         | 
| 201 | 
            +
                        serializedAttrs[key] = JSON.stringify(attrs[prop]);
         | 
| 202 | 
            +
                      } else if (/String/.test(Object.prototype.toString.call(attrs[prop])) && attrs[prop]) {
         | 
| 203 | 
            +
                        serializedAttrs[key] = attrs[prop];
         | 
| 204 | 
            +
                      } else if (/Number/.test(Object.prototype.toString.call(attrs[prop]))) {
         | 
| 205 | 
            +
                        serializedAttrs[key] = attrs[prop];
         | 
| 206 | 
            +
                      } else if (/Boolean/.test(Object.prototype.toString.call(attrs[prop]))) {
         | 
| 207 | 
            +
                        serializedAttrs[key] = attrs[prop] | 0;
         | 
| 208 | 
            +
                      }
         | 
| 209 | 
            +
                    }
         | 
| 210 | 
            +
                  }
         | 
| 211 | 
            +
                  return JSON.stringify(serializedAttrs);
         | 
| 212 | 
            +
                } catch (e) {
         | 
| 213 | 
            +
                  GlobalUtil.dispatchOmgLog('serializeAttrs2JsonStr Error');
         | 
| 214 | 
            +
                  return '';
         | 
| 215 | 
            +
                }
         | 
| 216 | 
            +
             | 
| 217 | 
            +
              }
         | 
| 218 | 
            +
             | 
| 219 | 
            +
              /**
         | 
| 220 | 
            +
               * @override
         | 
| 221 | 
            +
               * @inheritDoc
         | 
| 222 | 
            +
               * @returns {IContext}
         | 
| 223 | 
            +
               */
         | 
| 224 | 
            +
              public getContext(): IContext {
         | 
| 225 | 
            +
                return this.context;
         | 
| 226 | 
            +
              }
         | 
| 227 | 
            +
             | 
| 228 | 
            +
              /**
         | 
| 229 | 
            +
               * 该事件的额外参数。
         | 
| 230 | 
            +
               * @returns {IAttrs}
         | 
| 231 | 
            +
               */
         | 
| 232 | 
            +
              protected getAttrs(): IAttrs {
         | 
| 233 | 
            +
                const thisAttrs: any = {};
         | 
| 234 | 
            +
                const context = this.getContext() as ITrackerContext;
         | 
| 235 | 
            +
                if (context.openId) {
         | 
| 236 | 
            +
                  thisAttrs['_OMGPUID'] = context.openId;
         | 
| 237 | 
            +
                }
         | 
| 238 | 
            +
             | 
| 239 | 
            +
                return Object.assign(thisAttrs, context.attrs || {}, this.attrs, this.getVersion());
         | 
| 240 | 
            +
              }
         | 
| 241 | 
            +
             | 
| 242 | 
            +
              /**
         | 
| 243 | 
            +
               * 获取框架来源
         | 
| 244 | 
            +
               * 由业务方指定
         | 
| 245 | 
            +
               */
         | 
| 246 | 
            +
              protected getFrom(): string {
         | 
| 247 | 
            +
                const context: ITrackerContext = this.getContext() as ITrackerContext;
         | 
| 248 | 
            +
                if (GlobalUtil.isEmptyString(context.from)) {
         | 
| 249 | 
            +
                  return `h5-${ context.from }`;
         | 
| 250 | 
            +
                } else {
         | 
| 251 | 
            +
                  return 'h5';
         | 
| 252 | 
            +
                }
         | 
| 253 | 
            +
              }
         | 
| 254 | 
            +
             | 
| 255 | 
            +
              /**
         | 
| 256 | 
            +
               * 事件的状态。
         | 
| 257 | 
            +
               * {@link com/didichuxing/tracker/h5/plugins/events/EventStatus}
         | 
| 258 | 
            +
               * @returns {EventStatus}
         | 
| 259 | 
            +
               */
         | 
| 260 | 
            +
              public abstract get status(): EventStatus;
         | 
| 261 | 
            +
            }
         | 
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            /**
         | 
| 2 | 
            +
             * Copyright (c) 2018-present, Didi, Inc.
         | 
| 3 | 
            +
             * All rights reserved.
         | 
| 4 | 
            +
             *
         | 
| 5 | 
            +
             * @author Cory(kuanghongrui@didichuxing.com)
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * @file The class of BlockedEvent
         | 
| 8 | 
            +
             */
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            import { IContext } from 'com/didichuxing/context/IContext';
         | 
| 11 | 
            +
            import { IAttrs } from 'com/didichuxing/tracker/IAttrs';
         | 
| 12 | 
            +
            import { EventStatus } from 'com/didichuxing/tracker/plugin/events/EventStatus';
         | 
| 13 | 
            +
            import AEvent from 'com/didichuxing/tracker/plugin/events/AEvent';
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            export default class BlockedEvent extends AEvent {
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              /**
         | 
| 18 | 
            +
               * custom event id
         | 
| 19 | 
            +
               */
         | 
| 20 | 
            +
              private readonly eventId: string;
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              /**
         | 
| 23 | 
            +
               * @constructor
         | 
| 24 | 
            +
               * @param {IAttrs} attrs
         | 
| 25 | 
            +
               * @param {IContext} context
         | 
| 26 | 
            +
               */
         | 
| 27 | 
            +
              constructor(eventId: string, attrs: IAttrs, context: IContext) {
         | 
| 28 | 
            +
                super(attrs, context);
         | 
| 29 | 
            +
                this.eventId = eventId;
         | 
| 30 | 
            +
              }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              /**
         | 
| 33 | 
            +
               * @override
         | 
| 34 | 
            +
               * @inheritDoc
         | 
| 35 | 
            +
               */
         | 
| 36 | 
            +
              protected initSequence(): void {
         | 
| 37 | 
            +
                /* stop sequence */
         | 
| 38 | 
            +
              }
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              /**
         | 
| 41 | 
            +
               * @override
         | 
| 42 | 
            +
               * @inheritDoc
         | 
| 43 | 
            +
               * @returns {string}
         | 
| 44 | 
            +
               */
         | 
| 45 | 
            +
              public getType(): string {
         | 
| 46 | 
            +
                return this.eventId;
         | 
| 47 | 
            +
              }
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              /**
         | 
| 50 | 
            +
               * @override
         | 
| 51 | 
            +
               * @inheritDoc
         | 
| 52 | 
            +
               * @returns {EventStatus}
         | 
| 53 | 
            +
               */
         | 
| 54 | 
            +
              public get status(): EventStatus {
         | 
| 55 | 
            +
                return EventStatus.BLOCKED;
         | 
| 56 | 
            +
              }
         | 
| 57 | 
            +
            }
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            /**
         | 
| 2 | 
            +
             * Copyright (c) 2018-present, Didi, Inc.
         | 
| 3 | 
            +
             * All rights reserved.
         | 
| 4 | 
            +
             *
         | 
| 5 | 
            +
             * @author Cory(kuanghongrui@didichuxing.com)
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * @file The enum class of EventStatus
         | 
| 8 | 
            +
             */
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            export enum EventStatus {
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              /**
         | 
| 13 | 
            +
               * 正常状态的事件。
         | 
| 14 | 
            +
               */
         | 
| 15 | 
            +
              NORMAL = 'normal',
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              /**
         | 
| 18 | 
            +
               * 被阻止上报的事件
         | 
| 19 | 
            +
               * @type {string}
         | 
| 20 | 
            +
               */
         | 
| 21 | 
            +
              BLOCKED = 'blocked',
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              /**
         | 
| 24 | 
            +
               * 上报失败的事件。
         | 
| 25 | 
            +
               * @type {string}
         | 
| 26 | 
            +
               */
         | 
| 27 | 
            +
              FAILED = 'failed',
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              /**
         | 
| 30 | 
            +
               * 上报超时的事件。
         | 
| 31 | 
            +
               * @type {string}
         | 
| 32 | 
            +
               */
         | 
| 33 | 
            +
              TIMEOUT = 'timeout'
         | 
| 34 | 
            +
            }
         | 
| @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            /**
         | 
| 2 | 
            +
             * Copyright (c) 2018-present, Didi, Inc.
         | 
| 3 | 
            +
             * All rights reserved.
         | 
| 4 | 
            +
             *
         | 
| 5 | 
            +
             * @author Cory(kuanghongrui@didichuxing.com)
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * @file The class of FailedEvent
         | 
| 8 | 
            +
             */
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            import { IContext } from 'com/didichuxing/context/IContext';
         | 
| 11 | 
            +
            import { IAttrs } from 'com/didichuxing/tracker/IAttrs';
         | 
| 12 | 
            +
            import { EventStatus } from 'com/didichuxing/tracker/plugin/events/EventStatus';
         | 
| 13 | 
            +
            import AEvent from 'com/didichuxing/tracker/plugin/events/AEvent';
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            export default class FailedEvent extends AEvent {
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              /**
         | 
| 18 | 
            +
               * custom event id
         | 
| 19 | 
            +
               */
         | 
| 20 | 
            +
              private readonly eventId: string;
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              /**
         | 
| 23 | 
            +
               * error event
         | 
| 24 | 
            +
               * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error}
         | 
| 25 | 
            +
               */
         | 
| 26 | 
            +
              private readonly error: Error;
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              /**
         | 
| 29 | 
            +
               * @constructor
         | 
| 30 | 
            +
               * @param {IAttrs} attrs
         | 
| 31 | 
            +
               * @param {IContext} context
         | 
| 32 | 
            +
               */
         | 
| 33 | 
            +
              constructor(error: Error, eventId: string, attrs: IAttrs, context: IContext) {
         | 
| 34 | 
            +
                super(attrs, context);
         | 
| 35 | 
            +
                this.error = error;
         | 
| 36 | 
            +
                this.eventId = eventId;
         | 
| 37 | 
            +
              }
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              /**
         | 
| 40 | 
            +
               * @override
         | 
| 41 | 
            +
               * @inheritDoc
         | 
| 42 | 
            +
               * @returns {string}
         | 
| 43 | 
            +
               */
         | 
| 44 | 
            +
              public getType(): string {
         | 
| 45 | 
            +
                return this.eventId;
         | 
| 46 | 
            +
              }
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              /**
         | 
| 49 | 
            +
               * @override
         | 
| 50 | 
            +
               * @inheritDoc
         | 
| 51 | 
            +
               * @returns {EventStatus}
         | 
| 52 | 
            +
               */
         | 
| 53 | 
            +
              public get status(): EventStatus {
         | 
| 54 | 
            +
                return EventStatus.FAILED;
         | 
| 55 | 
            +
              }
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              /**
         | 
| 58 | 
            +
               * 获取出错信息事件。
         | 
| 59 | 
            +
               * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error}
         | 
| 60 | 
            +
               * @returns {ErrorEvent}
         | 
| 61 | 
            +
               */
         | 
| 62 | 
            +
              public getError(): Error {
         | 
| 63 | 
            +
                return this.error;
         | 
| 64 | 
            +
              }
         | 
| 65 | 
            +
            }
         | 
| @@ -0,0 +1,85 @@ | |
| 1 | 
            +
            /**
         | 
| 2 | 
            +
             * Copyright (c) 2018-present, Didi, Inc.
         | 
| 3 | 
            +
             * All rights reserved.
         | 
| 4 | 
            +
             *
         | 
| 5 | 
            +
             * @author Cory(kuanghongrui@didichuxing.com)
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * @file The class of SequencedEvent
         | 
| 8 | 
            +
             */
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            import { IContext } from 'com/didichuxing/context/IContext';
         | 
| 11 | 
            +
            import { IObjectMap } from 'com/didichuxing/IObjectMap';
         | 
| 12 | 
            +
            import { IAttrs } from 'com/didichuxing/tracker/IAttrs';
         | 
| 13 | 
            +
            import { ITrackerContext } from 'com/didichuxing/tracker/context/ITrackerContext';
         | 
| 14 | 
            +
            import { ITrackedEventData } from 'com/didichuxing/tracker/event/ITrackedEventData';
         | 
| 15 | 
            +
            import { EventStatus } from 'com/didichuxing/tracker/plugin/events/EventStatus';
         | 
| 16 | 
            +
            import AEvent from 'com/didichuxing/tracker/plugin/events/AEvent';
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            export default abstract class SequencedEvent extends AEvent {
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              /**
         | 
| 21 | 
            +
               * Omega事件全局序列名称前缀。
         | 
| 22 | 
            +
               * @type {string}
         | 
| 23 | 
            +
               */
         | 
| 24 | 
            +
              public static readonly OMG_SEQUENCE_NAME_PREFIX: string = '__OMG_SEQUENCE_';
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              /**
         | 
| 27 | 
            +
               * Omega事件全局序列名称后缀。
         | 
| 28 | 
            +
               * @type {string}
         | 
| 29 | 
            +
               */
         | 
| 30 | 
            +
              public static readonly OMG_SEQUENCE_NAME_SUFFIX: string = '__';
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              /**
         | 
| 33 | 
            +
               * 事件的序列号。
         | 
| 34 | 
            +
               * 默认为-1,表示没有序列号。
         | 
| 35 | 
            +
               */
         | 
| 36 | 
            +
              private readonly sequence: number;
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              /**
         | 
| 39 | 
            +
               * @constructor
         | 
| 40 | 
            +
               * @param {IAttrs} attrs
         | 
| 41 | 
            +
               * @param {IContext} context
         | 
| 42 | 
            +
               */
         | 
| 43 | 
            +
              constructor(attrs: IAttrs, context: IContext) {
         | 
| 44 | 
            +
                super(attrs, context);
         | 
| 45 | 
            +
                const prefix: string = SequencedEvent.OMG_SEQUENCE_NAME_PREFIX;
         | 
| 46 | 
            +
                const suffix: string = SequencedEvent.OMG_SEQUENCE_NAME_SUFFIX;
         | 
| 47 | 
            +
                if (!(window as any)[`${ prefix }${ (context as ITrackerContext).viewportId }${ suffix }`]) {
         | 
| 48 | 
            +
                  (window as any)[`${ prefix }${ (context as ITrackerContext).viewportId }${ suffix }`] = 0;
         | 
| 49 | 
            +
                }
         | 
| 50 | 
            +
                this.sequence = (window as any)[`${ prefix }${ (context as ITrackerContext).viewportId }${ suffix }`]++;
         | 
| 51 | 
            +
              }
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              /**
         | 
| 54 | 
            +
               * @override
         | 
| 55 | 
            +
               * @inheritDoc
         | 
| 56 | 
            +
               * @returns {ITrackedEventData}
         | 
| 57 | 
            +
               */
         | 
| 58 | 
            +
              public getData(): ITrackedEventData {
         | 
| 59 | 
            +
                return {
         | 
| 60 | 
            +
                  ...super.getData(),
         | 
| 61 | 
            +
                  sequence: this.sequence
         | 
| 62 | 
            +
                };
         | 
| 63 | 
            +
              }
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              /**
         | 
| 66 | 
            +
               * @override
         | 
| 67 | 
            +
               * @inheritDoc
         | 
| 68 | 
            +
               * @returns {IObjectMap<string>}
         | 
| 69 | 
            +
               */
         | 
| 70 | 
            +
              protected getDataKeyMap(): IObjectMap<string> {
         | 
| 71 | 
            +
                return {
         | 
| 72 | 
            +
                  ...super.getDataKeyMap(),
         | 
| 73 | 
            +
                  sequence: 'seq'
         | 
| 74 | 
            +
                };
         | 
| 75 | 
            +
              }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              /**
         | 
| 78 | 
            +
               * @override
         | 
| 79 | 
            +
               * @inheritDoc
         | 
| 80 | 
            +
               * @returns {EventStatus}
         | 
| 81 | 
            +
               */
         | 
| 82 | 
            +
              public get status(): EventStatus {
         | 
| 83 | 
            +
                return EventStatus.NORMAL;
         | 
| 84 | 
            +
              }
         | 
| 85 | 
            +
            }
         | 
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            /**
         | 
| 2 | 
            +
             * Copyright (c) 2018-present, Didi, Inc.
         | 
| 3 | 
            +
             * All rights reserved.
         | 
| 4 | 
            +
             *
         | 
| 5 | 
            +
             * @author Cory(kuanghongrui@didichuxing.com)
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * @file The class of TimeoutEvent
         | 
| 8 | 
            +
             */
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            import { IContext } from 'com/didichuxing/context/IContext';
         | 
| 11 | 
            +
            import { IAttrs } from 'com/didichuxing/tracker/IAttrs';
         | 
| 12 | 
            +
            import { EventStatus } from 'com/didichuxing/tracker/plugin/events/EventStatus';
         | 
| 13 | 
            +
            import AEvent from 'com/didichuxing/tracker/plugin/events/AEvent';
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            export default class TimeoutEvent extends AEvent {
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              /**
         | 
| 18 | 
            +
               * custom event id
         | 
| 19 | 
            +
               */
         | 
| 20 | 
            +
              private readonly eventId: string;
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              /**
         | 
| 23 | 
            +
               * @constructor
         | 
| 24 | 
            +
               * @param {IAttrs} attrs
         | 
| 25 | 
            +
               * @param {IContext} context
         | 
| 26 | 
            +
               */
         | 
| 27 | 
            +
              constructor(eventId: string, attrs: IAttrs, context: IContext) {
         | 
| 28 | 
            +
                super(attrs, context);
         | 
| 29 | 
            +
                this.eventId = eventId;
         | 
| 30 | 
            +
              }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              /**
         | 
| 33 | 
            +
               * @override
         | 
| 34 | 
            +
               * @inheritDoc
         | 
| 35 | 
            +
               * @returns {string}
         | 
| 36 | 
            +
               */
         | 
| 37 | 
            +
              public getType(): string {
         | 
| 38 | 
            +
                return this.eventId;
         | 
| 39 | 
            +
              }
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              /**
         | 
| 42 | 
            +
               * @override
         | 
| 43 | 
            +
               * @inheritDoc
         | 
| 44 | 
            +
               * @returns {EventStatus}
         | 
| 45 | 
            +
               */
         | 
| 46 | 
            +
              public get status(): EventStatus {
         | 
| 47 | 
            +
                return EventStatus.TIMEOUT;
         | 
| 48 | 
            +
              }
         | 
| 49 | 
            +
            }
         | 
| @@ -0,0 +1,135 @@ | |
| 1 | 
            +
            /**
         | 
| 2 | 
            +
             * Copyright (c) 2018-present, Didi, Inc.
         | 
| 3 | 
            +
             * All rights reserved.
         | 
| 4 | 
            +
             *
         | 
| 5 | 
            +
             * @author Cory(kuanghongrui@didichuxing.com)
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * @file The class of AH5EventReportor
         | 
| 8 | 
            +
             */
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            import { ITrackerContext } from 'com/didichuxing/tracker/context/ITrackerContext';
         | 
| 11 | 
            +
            import { IEventReportor } from 'com/didichuxing/tracker/plugin/reportor/IEventReportor';
         | 
| 12 | 
            +
            import { ITrackedEvent } from 'com/didichuxing/tracker/event/ITrackedEvent';
         | 
| 13 | 
            +
            import PluginUtils from 'com/didichuxing/tracker/plugin/utils/PluginUtils';
         | 
| 14 | 
            +
            import GlobalUtil from 'com/didichuxing/tracker/plugin/utils/GlobalUtil';
         | 
| 15 | 
            +
            import DataQueueSet from 'com/didichuxing/tracker/plugin/reportor/DataQueueSet';
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            interface IUnreportedItem {
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              /**
         | 
| 20 | 
            +
               * 未上报事件
         | 
| 21 | 
            +
               */
         | 
| 22 | 
            +
              event: ITrackedEvent;
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              /**
         | 
| 25 | 
            +
               * 该事件上报成功后执行的方法。
         | 
| 26 | 
            +
               * @param {ITrackedEvent} evt
         | 
| 27 | 
            +
               */
         | 
| 28 | 
            +
              resolve(evt: ITrackedEvent): void;
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              /**
         | 
| 31 | 
            +
               * 该事件上报失败后执行的方法。
         | 
| 32 | 
            +
               * @param {ITrackedEvent} evt
         | 
| 33 | 
            +
               */
         | 
| 34 | 
            +
              reject(evt: ITrackedEvent): void;
         | 
| 35 | 
            +
            }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            export default abstract class AH5EventReportor implements IEventReportor {
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              private context: ITrackerContext;
         | 
| 40 | 
            +
              private event: ITrackedEvent;
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              /**
         | 
| 43 | 
            +
               * 待上报事件。
         | 
| 44 | 
            +
               */
         | 
| 45 | 
            +
              private unreportedEvents: IUnreportedItem[];
         | 
| 46 | 
            +
              /**
         | 
| 47 | 
            +
               * 上报失败事件
         | 
| 48 | 
            +
               */
         | 
| 49 | 
            +
              protected readonly errorreportedEvents = DataQueueSet.getInstance();
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              /**
         | 
| 52 | 
            +
               * @constructor
         | 
| 53 | 
            +
               * @param {ITrackerContext} context
         | 
| 54 | 
            +
               * @param {ITrackedEvent} event
         | 
| 55 | 
            +
               */
         | 
| 56 | 
            +
              constructor(context: ITrackerContext, event: ITrackedEvent) {
         | 
| 57 | 
            +
                this.event = event;
         | 
| 58 | 
            +
                this.context = context;
         | 
| 59 | 
            +
                this.unreportedEvents = [];
         | 
| 60 | 
            +
                this.reportEventsAfterLoad = this.reportEventsAfterLoad.bind(this);
         | 
| 61 | 
            +
                window.addEventListener('load', this.reportEventsAfterLoad);
         | 
| 62 | 
            +
              }
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              /**
         | 
| 65 | 
            +
               * load之后,将未上报事件集中依次上报。
         | 
| 66 | 
            +
               */
         | 
| 67 | 
            +
              private reportEventsAfterLoad(): void {
         | 
| 68 | 
            +
                window.removeEventListener('load', this.reportEventsAfterLoad);
         | 
| 69 | 
            +
                while (this.unreportedEvents.length) {
         | 
| 70 | 
            +
                  const unreportedItem: IUnreportedItem | undefined = this.unreportedEvents.shift();
         | 
| 71 | 
            +
                  if (unreportedItem) {
         | 
| 72 | 
            +
                    this.reportEventImmediately(unreportedItem.event).then(unreportedItem.resolve, unreportedItem.reject);
         | 
| 73 | 
            +
                  }
         | 
| 74 | 
            +
                }
         | 
| 75 | 
            +
              }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              /**
         | 
| 78 | 
            +
               * 得到context信息
         | 
| 79 | 
            +
               * @returns {ITrackerContext}
         | 
| 80 | 
            +
               */
         | 
| 81 | 
            +
              protected getContext(): ITrackerContext {
         | 
| 82 | 
            +
                return this.context;
         | 
| 83 | 
            +
              }
         | 
| 84 | 
            +
             | 
| 85 | 
            +
              /**
         | 
| 86 | 
            +
               * 上报路径path
         | 
| 87 | 
            +
               * @returns {string}
         | 
| 88 | 
            +
               */
         | 
| 89 | 
            +
              protected get reportPath(): string {
         | 
| 90 | 
            +
                return '/api/web/stat';
         | 
| 91 | 
            +
              }
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              /**
         | 
| 94 | 
            +
               * @override
         | 
| 95 | 
            +
               * @inheritDoc
         | 
| 96 | 
            +
               * @returns {Promise<ITrackedEvent>}
         | 
| 97 | 
            +
               */
         | 
| 98 | 
            +
              public reportEvent(): Promise<ITrackedEvent> {
         | 
| 99 | 
            +
                if (!GlobalUtil.isEmptyString(this.event.getData().appKey)) {
         | 
| 100 | 
            +
                  GlobalUtil.dispatchOmgLog('[Omega] H5 appKey 参数 不可为空');
         | 
| 101 | 
            +
                  throw new Error('[Omega] H5 appKey 参数 不可为空');
         | 
| 102 | 
            +
                  return Promise.reject();
         | 
| 103 | 
            +
                }
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                if (GlobalUtil.isLoaded() || this.event.getType() === PluginUtils.EVENT_ID_PAGE_INIT ||
         | 
| 106 | 
            +
                  this.event.getType() === PluginUtils.EVENT_ID_OMG_LOG) {
         | 
| 107 | 
            +
                  // onload已经执行完或者当前事件为页面初始化事件
         | 
| 108 | 
            +
                  // 如果有上报错误的数据也去上报
         | 
| 109 | 
            +
                  if (!this.errorreportedEvents.empty()) {
         | 
| 110 | 
            +
                    this.errorreportedEvents.getData().forEach((value) => {
         | 
| 111 | 
            +
                      this.reportEventImmediately(value);
         | 
| 112 | 
            +
                    });
         | 
| 113 | 
            +
                  }
         | 
| 114 | 
            +
                  this.errorreportedEvents.removeAll();
         | 
| 115 | 
            +
                  return this.reportEventImmediately(this.event);
         | 
| 116 | 
            +
                } else {
         | 
| 117 | 
            +
                  // load未完成,将事件聚集,等待集中上报。
         | 
| 118 | 
            +
                  return new Promise<ITrackedEvent>((resolve: (evt: ITrackedEvent) => void,
         | 
| 119 | 
            +
                    reject: (evt: ITrackedEvent) => void): void => {
         | 
| 120 | 
            +
                    this.unreportedEvents.push({
         | 
| 121 | 
            +
                      event: this.event,
         | 
| 122 | 
            +
                      resolve: resolve,
         | 
| 123 | 
            +
                      reject: reject
         | 
| 124 | 
            +
                    });
         | 
| 125 | 
            +
                  });
         | 
| 126 | 
            +
                }
         | 
| 127 | 
            +
              }
         | 
| 128 | 
            +
             | 
| 129 | 
            +
              /**
         | 
| 130 | 
            +
               * 马上直接上报事件。
         | 
| 131 | 
            +
               * @param {ITrackedEvent} event
         | 
| 132 | 
            +
               * @returns {Promise<ITrackedEvent>}
         | 
| 133 | 
            +
               */
         | 
| 134 | 
            +
              protected abstract reportEventImmediately(event: ITrackedEvent): Promise<ITrackedEvent>;
         | 
| 135 | 
            +
            }
         |