diff --git a/dist/anka-tracker.min.js b/dist/anka-tracker.min.js index d47007a..7177ff4 100644 --- a/dist/anka-tracker.min.js +++ b/dist/anka-tracker.min.js @@ -1,8 +1,8 @@ /** * @anka-dev/tracker. - * Thu Aug 09 2018 17:03:17 GMT+0800 (CST) + * Fri Aug 10 2018 18:04:31 GMT+0800 (CST) * MIT License. */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.Tracker={})}(this,function(t){"use strict";function e(t,e){function r(){this.constructor=t}for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}function r(t){return new Promise(function(e,r){wx.request(c({},t,{success:function(t){t.statusCode>=200&&t.statusCode<300?e&&e(t.data):r&&r(t.data)},fail:function(t){r&&r(t)}}))})}function n(t){return new Promise(function(e,r){wx.setStorage(c({},t,{success:function(t){e(t)},fail:function(t){r(t)}}))})}function o(t){return new Promise(function(e,r){wx.getStorage({key:t,success:function(t){e(t.data)},fail:function(t){r(t)}})})}function i(){return new Promise(function(t,e){wx.getSystemInfo({success:function(e){t(e)},fail:function(t){e(t)}})})}function a(){return new Promise(function(t,e){wx.getNetworkType({success:function(e){t(e.networkType)},fail:function(t){e(t)}})})}function s(t){wx.onNetworkStatusChange(function(e){t(e.networkType)})}const c=Object.assign||function(t){for(var e,r=1;r=u.FAILED&&t.status<=this.config.retry&&(this.failedQueue.push(t),this.updateStore(),this.run())},t.prototype.pop=function(){var t=this.failedQueue.length,e=this.config.groupMaxLength,r=t-e>=0?this.failedQueue.splice(0,e):this.failedQueue.splice(0,t-1).concat(this.queue.splice(0,e-t));return this.updateStore(),r},t.prototype.updateStore=function(t){var e=Date.now();(this.store&&e-this.lastStoreUpdate>=500||t&&this.store)&&(this.store.update(this.queue.concat(this.failedQueue)),this.lastStoreUpdate=e)},t.prototype.run=function(){this.executor.run()},t.prototype.suspend=function(t){this.updateStore(!0),this.executor.suspend(t)},t}(),d=function(){function t(){this.status=l.IDLE}return Object.defineProperty(t.prototype,"isIdle",{get:function(){return this.sender&&this.queueManager&&this.status===l.IDLE},enumerable:!0,configurable:!0}),t.prototype.init=function(t,e){this.sender=t,this.queueManager=e},t.prototype.run=function(){this.isIdle&&this.exec()},t.prototype.exec=function(){var t=this,e=this.queueManager.pop();if(!e.length)return void(this.status=l.IDLE);this.status=l.RUNNING,Promise.all(e.map(function(e){return t.sender.send(e)})).then(function(e){e.forEach(function(e){e.status!==u.SUCCESS&&t.queueManager.push(e)})}).then(function(){t.timer=setTimeout(function(){t.exec()},t.queueManager.config.interval)})},t.prototype.suspend=function(t){t?(this.status=l.PAUSE,clearTimeout(this.timer)):this.status===l.PAUSE?(this.status=l.IDLE,this.run()):this.status===l.IDLE&&this.run()},t}(),y=function(){function t(t){this.config=t,this.queueManager=new h(this.config)}return t.prototype.init=function(t){this.queueManager.init(c({},t))},t.prototype.log=function(t){this.queueManager.push(t)},t}(),g={debug:!0,retry:2,interval:1e3,groupMaxLength:5,timestampKey:"timestamp_ms",queueMaxLength:500,commonData:{},attachActionToUrl:!1,extractOnLaunchOption:!0},m=function(){function t(t){void 0===t&&(t={}),t=Object.assign(g,t),this.debug=t.debug,this.trackerHost=t.trackerHost,this.retry=t.retry,this.interval=t.interval,this.commonData=t.commonData,this.groupMaxLength=t.groupMaxLength,this.timestampKey=t.timestampKey,this.queueMaxLength=t.queueMaxLength,this.attachActionToUrl=t.attachActionToUrl,this.extractOnLaunchOption=t.extractOnLaunchOption}return t}(),v=function(){function t(t){this.data=[],this.config=t}return t.prototype.get=function(){return o("tracker_tasks").then(function(t){return Promise.resolve(t)}).catch(function(t){return Promise.resolve([])})},t.prototype.update=function(t){return this.data=t,n({key:"tracker_tasks",data:t})},t}(),b=Object.prototype.hasOwnProperty,w=function(){for(var t=[],e=0;e<256;++e)t.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return t}(),_=function(t){for(var e;t.length;){var r=t.pop();if(e=r.obj[r.prop],Array.isArray(e)){for(var n=[],o=0;o=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122?r+=e.charAt(n):o<128?r+=w[o]:o<2048?r+=w[192|o>>6]+w[128|63&o]:o<55296||o>=57344?r+=w[224|o>>12]+w[128|o>>6&63]+w[128|63&o]:(n+=1,o=65536+((1023&o)<<10|1023&e.charCodeAt(n)),r+=w[240|o>>18]+w[128|o>>12&63]+w[128|o>>6&63]+w[128|63&o])}return r},isBuffer:function(t){return null!==t&&void 0!==t&&!!(t.constructor&&t.constructor.isBuffer&&t.constructor.isBuffer(t))},isRegExp:function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},merge:function t(e,r,n){if(!r)return e;if("object"!=typeof r){if(Array.isArray(e))e.push(r);else{if("object"!=typeof e)return[e,r];(n.plainObjects||n.allowPrototypes||!b.call(Object.prototype,r))&&(e[r]=!0)}return e}if("object"!=typeof e)return[e].concat(r);var o=e;return Array.isArray(e)&&!Array.isArray(r)&&(o=O(e,n)),Array.isArray(e)&&Array.isArray(r)?(r.forEach(function(r,o){b.call(e,o)?e[o]&&"object"==typeof e[o]?e[o]=t(e[o],r,n):e.push(r):e[o]=r}),e):Object.keys(r).reduce(function(e,o){var i=r[o];return b.call(e,o)?e[o]=t(e[o],i,n):e[o]=i,e},o)}},D=String.prototype.replace,j={default:"RFC3986",formatters:{RFC1738:function(t){return D.call(t,/%20/g,"+")},RFC3986:function(t){return t}},RFC1738:"RFC1738",RFC3986:"RFC3986"},S={brackets:function(t){return t+"[]"},indices:function(t,e){return t+"["+e+"]"},repeat:function(t){return t}},x=Date.prototype.toISOString,P={delimiter:"&",encode:!0,encoder:k.encode,encodeValuesOnly:!1,serializeDate:function(t){return x.call(t)},skipNulls:!1,strictNullHandling:!1},A=function t(e,r,n,o,i,a,s,c,u,p,l,f){var h=e;if("function"==typeof s)h=s(r,h);else if(h instanceof Date)h=p(h);else if(null===h){if(o)return a&&!f?a(r,P.encoder):r;h=""}if("string"==typeof h||"number"==typeof h||"boolean"==typeof h||k.isBuffer(h))return a?[l(f?r:a(r,P.encoder))+"="+l(a(h,P.encoder))]:[l(r)+"="+l(String(h))];var d=[];if(void 0===h)return d;var y;if(Array.isArray(s))y=s;else{var g=Object.keys(h);y=c?g.sort(c):g}for(var m=0;m0?O+_:""},N=Object.prototype.hasOwnProperty,E={allowDots:!1,allowPrototypes:!1,arrayLimit:20,decoder:k.decode,delimiter:"&",depth:5,parameterLimit:1e3,plainObjects:!1,strictNullHandling:!1},I=function(t,e){for(var r={},n=e.ignoreQueryPrefix?t.replace(/^\?/,""):t,o=e.parameterLimit===1/0?void 0:e.parameterLimit,i=n.split(e.delimiter,o),a=0;a=0;--o){var i,a=t[o];if("[]"===a)i=(i=[]).concat(n);else{i=r.plainObjects?Object.create(null):{};var s="["===a.charAt(0)&&"]"===a.charAt(a.length-1)?a.slice(1,-1):a,c=parseInt(s,10);!isNaN(c)&&a!==s&&String(c)===s&&c>=0&&r.parseArrays&&c<=r.arrayLimit?(i=[])[c]=n:i[s]=n}n=i}return n},q=function(t,e,r){if(t){var n=r.allowDots?t.replace(/\.([^.[]+)/g,"[$1]"):t,o=/(\[[^[\]]*])/g,i=/(\[[^[\]]*])/.exec(n),a=i?n.slice(0,i.index):n,s=[];if(a){if(!r.plainObjects&&N.call(Object.prototype,a)&&!r.allowPrototypes)return;s.push(a)}for(var c=0;null!==(i=o.exec(n))&&c=0;s--)(o=t[s])&&(a=(i<3?o(a):i>3?o(e,r,a):o(e,r))||a);return i>3&&a&&Object.defineProperty(e,r,a),a}function n(t){return new Promise(function(e,r){wx.request(p({},t,{success:function(t){t.statusCode>=200&&t.statusCode<300?e&&e(t.data):r&&r(t.data)},fail:function(t){r&&r(t)}}))})}function o(t){return new Promise(function(e,r){wx.setStorage(p({},t,{success:function(t){e(t)},fail:function(t){r(t)}}))})}function i(t){return new Promise(function(e,r){wx.getStorage({key:t,success:function(t){e(t.data)},fail:function(t){r(t)}})})}function a(){return new Promise(function(t,e){wx.getSystemInfo({success:function(e){t(e)},fail:function(t){e(t)}})})}function s(){return new Promise(function(t,e){wx.getNetworkType({success:function(e){t(e.networkType)},fail:function(t){e(t)}})})}function c(t){wx.onNetworkStatusChange(function(e){t(e.networkType)})}function u(){return function(t,e,r){r.writable=!1}}const p=Object.assign||function(t){for(var e,r=1;r=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122?r+=e.charAt(n):o<128?r+=y[o]:o<2048?r+=y[192|o>>6]+y[128|63&o]:o<55296||o>=57344?r+=y[224|o>>12]+y[128|o>>6&63]+y[128|63&o]:(n+=1,o=65536+((1023&o)<<10|1023&e.charCodeAt(n)),r+=y[240|o>>18]+y[128|o>>12&63]+y[128|o>>6&63]+y[128|63&o])}return r},isBuffer:function(t){return null!==t&&void 0!==t&&!!(t.constructor&&t.constructor.isBuffer&&t.constructor.isBuffer(t))},isRegExp:function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},merge:function t(e,r,n){if(!r)return e;if("object"!=typeof r){if(Array.isArray(e))e.push(r);else{if("object"!=typeof e)return[e,r];(n.plainObjects||n.allowPrototypes||!d.call(Object.prototype,r))&&(e[r]=!0)}return e}if("object"!=typeof e)return[e].concat(r);var o=e;return Array.isArray(e)&&!Array.isArray(r)&&(o=m(e,n)),Array.isArray(e)&&Array.isArray(r)?(r.forEach(function(r,o){d.call(e,o)?e[o]&&"object"==typeof e[o]?e[o]=t(e[o],r,n):e.push(r):e[o]=r}),e):Object.keys(r).reduce(function(e,o){var i=r[o];return d.call(e,o)?e[o]=t(e[o],i,n):e[o]=i,e},o)}},b=String.prototype.replace,w={default:"RFC3986",formatters:{RFC1738:function(t){return b.call(t,/%20/g,"+")},RFC3986:function(t){return t}},RFC1738:"RFC1738",RFC3986:"RFC3986"},O={brackets:function(t){return t+"[]"},indices:function(t,e){return t+"["+e+"]"},repeat:function(t){return t}},_=Date.prototype.toISOString,k={delimiter:"&",encode:!0,encoder:v.encode,encodeValuesOnly:!1,serializeDate:function(t){return _.call(t)},skipNulls:!1,strictNullHandling:!1},j=function t(e,r,n,o,i,a,s,c,u,p,l,f){var h=e;if("function"==typeof s)h=s(r,h);else if(h instanceof Date)h=p(h);else if(null===h){if(o)return a&&!f?a(r,k.encoder):r;h=""}if("string"==typeof h||"number"==typeof h||"boolean"==typeof h||v.isBuffer(h))return a?[l(f?r:a(r,k.encoder))+"="+l(a(h,k.encoder))]:[l(r)+"="+l(String(h))];var d=[];if(void 0===h)return d;var y;if(Array.isArray(s))y=s;else{var g=Object.keys(h);y=c?g.sort(c):g}for(var m=0;m0?S+P:""},P=Object.prototype.hasOwnProperty,S={allowDots:!1,allowPrototypes:!1,arrayLimit:20,decoder:v.decode,delimiter:"&",depth:5,parameterLimit:1e3,plainObjects:!1,strictNullHandling:!1},x=function(t,e){for(var r={},n=e.ignoreQueryPrefix?t.replace(/^\?/,""):t,o=e.parameterLimit===1/0?void 0:e.parameterLimit,i=n.split(e.delimiter,o),a=0;a=0;--o){var i,a=t[o];if("[]"===a)i=(i=[]).concat(n);else{i=r.plainObjects?Object.create(null):{};var s="["===a.charAt(0)&&"]"===a.charAt(a.length-1)?a.slice(1,-1):a,c=parseInt(s,10);!isNaN(c)&&a!==s&&String(c)===s&&c>=0&&r.parseArrays&&c<=r.arrayLimit?(i=[])[c]=n:i[s]=n}n=i}return n},A=function(t,e,r){if(t){var n=r.allowDots?t.replace(/\.([^.[]+)/g,"[$1]"):t,o=/(\[[^[\]]*])/g,i=/(\[[^[\]]*])/.exec(n),a=i?n.slice(0,i.index):n,s=[];if(a){if(!r.plainObjects&&P.call(Object.prototype,a)&&!r.allowPrototypes)return;s.push(a)}for(var c=0;null!==(i=o.exec(n))&&c=l.FAILED&&t.status<=this.config.retry&&(this.failedQueue.push(t),this.updateStore(),this.run())},t.prototype.pop=function(){var t=this.failedQueue.length,e=this.config.groupMaxLength,r=t-e>=0?this.failedQueue.splice(0,e):this.failedQueue.splice(0,t).concat(this.queue.splice(0,e-t));return this.updateStore(),r},t.prototype.updateStore=function(t){var e=Date.now();(this.store&&e-this.lastStoreUpdate>=500||t&&this.store)&&(this.store.update(this.queue.concat(this.failedQueue)),this.lastStoreUpdate=e)},t.prototype.run=function(){this.executor.run()},t.prototype.suspend=function(t){this.updateStore(!0),this.executor.suspend(t)},t}(),M=function(){function t(){this.status=q.IDLE}return Object.defineProperty(t.prototype,"isIdle",{get:function(){return this.sender&&this.queueManager&&this.status===q.IDLE},enumerable:!0,configurable:!0}),t.prototype.init=function(t,e){this.sender=t,this.queueManager=e},t.prototype.run=function(){this.isIdle&&this.exec()},t.prototype.exec=function(){var t=this,e=this.queueManager.pop();if(!e.length)return void(this.status=q.IDLE);this.status=q.RUNNING,Promise.all(e.map(function(e){return t.sender.send(e)})).then(function(e){e.forEach(function(e){e.status!==l.SUCCESS&&t.queueManager.push(e)})}).then(function(){t.timer=setTimeout(function(){t.exec()},t.queueManager.config.interval)})},t.prototype.suspend=function(t){t?(this.status=q.PAUSE,clearTimeout(this.timer)):this.status===q.PAUSE?(this.status=q.IDLE,this.run()):this.status===q.IDLE&&this.run()},t}(),R=function(){function t(t){this.config=t,this.queueManager=new T(this.config)}return t.prototype.init=function(t){this.queueManager.init(p({},t))},t.prototype.log=function(t){this.queueManager.push(t)},t}(),F={debug:!0,retry:2,interval:1e3,groupMaxLength:5,timestampKey:"timestamp_ms",queueMaxLength:500,commonData:{},attachActionToUrl:!1,extractOnLaunchOption:!0},H=function(){function t(t){void 0===t&&(t={}),t=Object.assign(F,t),this.debug=t.debug,this.trackerHost=t.trackerHost,this.retry=t.retry,this.interval=t.interval,this.commonData=t.commonData,this.groupMaxLength=t.groupMaxLength,this.timestampKey=t.timestampKey,this.queueMaxLength=t.queueMaxLength,this.attachActionToUrl=t.attachActionToUrl,this.extractOnLaunchOption=t.extractOnLaunchOption}return t}(),K=function(){function t(t){void 0===t&&(t={}),this.config=new H(t),this.core=new R(this.config),h.DEBUG=this.config.debug,this.core.queueManager.suspend(!0),this.networkDetector=new C,this.commonDataVendor=new E}return t.prototype.init=function(t){if(!this.sender){var e=this.handleNetworkStatusChange.bind(this);this.sender=new I(this.config,t),this.store=new f(this.config),this.core.init({sender:this.sender,store:this.store}),this.networkDetector.getNetworkStatus().then(e,e),this.networkDetector.watchNetworkStatusChange(e),h.log("初始化完成")}},t.prototype.handleNetworkStatusChange=function(t){var e="none"===t||t instanceof Error;this.core.queueManager.suspend(e)},t.prototype.log=function(t){var e=Date.now();t[this.config.timestampKey]=e,this.core.log(new U(t))},r([u()],t.prototype,"init",null),r([u()],t.prototype,"handleNetworkStatusChange",null),r([u()],t.prototype,"log",null),t}(),G=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.generateTrackerInstance=function(){var t={};try{t=require("./anka-tracker.config.js")}catch(t){}var e=new n(t);return t.extractOnLaunchOption&&e.extractOnLaunchOption(),e},n.prototype.asyncInitWithCommonData=function(t){var e=this;return void 0===t&&(t={}),this.commonDataVendor.getCommonData({onLaunchOption:this.onLaunchOption}).then(function(r){e.init(Object.assign(r,e.config.commonData,t))}).catch(function(t){h.log("初始化失败"),console.log(t)})},n.prototype.extractOnLaunchOption=function(){function t(t){e.onLaunchOption=t}var e=this,r=App;App=function(e){var n=e.onLaunch;e.onLaunch=function(e){t.call(this,e),n&&n.call(this,e)},r(e)}},n.prototype.track=function(){for(var t=this,e=[],r=0;r {\n return new Promise((resolve, reject) => {\n wx.request({\n ...requestPramas,\n success: (res: any) => {\n if (res.statusCode >= 200 && res.statusCode < 300) {\n resolve && resolve(res.data)\n } else {\n reject && reject(res.data)\n }\n },\n fail: (err: Error) => {\n reject && reject(err)\n }\n })\n })\n}\n\n/**\n * 将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。\n * @param pramas\n */\nexport function setStorage (pramas: SetStorageParams): Promise {\n return new Promise((resolve, reject) => {\n wx.setStorage({\n ...pramas,\n success: (res: any): void => {\n resolve(res)\n },\n fail: (err: Error): void => {\n reject(err)\n }\n })\n })\n}\n\n/**\n * 从本地缓存中异步获取指定 key 对应的内容\n * @param pramas\n */\nexport function getStorage (key: string): Promise {\n return new Promise((resolve, reject) => {\n wx.getStorage({\n key: key,\n success: (res: any): void => {\n resolve(res.data)\n },\n fail: (err: Error): void => {\n reject(err)\n }\n })\n })\n}\n\n/**\n * 获取系统信息。\n */\nexport function getSystemInfo (): Promise {\n return new Promise((resolve, reject) => {\n wx.getSystemInfo({\n success: (res: any): void => {\n resolve(res)\n },\n fail: (err: Error): void => {\n reject(err)\n }\n })\n })\n}\n\n/**\n * 获取网络类型。\n */\nexport function getNetworkType (): Promise {\n return new Promise((resolve, reject) => {\n wx.getNetworkType({\n success: (res: any): void => {\n resolve(res.networkType)\n },\n fail: (err: Error): void => {\n reject(err)\n }\n })\n })\n}\n\n/**\n * 监听网络状态变化。\n * @param callback\n */\nexport function onNetworkStatusChange (callback: Function): void {\n wx.onNetworkStatusChange((res: {isConnected: boolean, networkType: string}) => {\n callback(res.networkType)\n })\n}","export enum TASK_STATUS {\n SUCCESS = -1,\n PENDING,\n FAILED\n}\nexport class Task {\n private _id: string\n public data: {}\n public status: number\n public timestamp?: number\n\n constructor (trackData: TrackData) {\n const now = Date.now()\n this._id = Math.random().toString(16).replace('.', '')\n this.status = TASK_STATUS.PENDING\n this.data = trackData\n this.timestamp = now\n }\n\n isSucceed () {\n this.status = TASK_STATUS.SUCCESS\n }\n\n isFailed () {\n this.status++\n }\n}","export default {\n DEBUG: true,\n\n log (...e: any[]): void {\n this.DEBUG && console.log('[ 🔍 tracker]', ...e)\n }\n}","import { Task } from './Task'\nimport { Store } from './Store'\nimport { Sender } from './Sender'\nimport * as helper from '../helper'\nimport { Initializer } from './Initializer'\nimport { TASK_STATUS } from './Task'\n\nexport enum QUEUE_EXECUTOR_STATUS {\n IDLE,\n PAUSE,\n RUNNING,\n}\n\n/**\n * Class 任务队列管理器\n * 管理器不考虑任务执行细节,以及何时暂停\n */\nexport class QueueManager {\n public config: Initializer\n private sender: Sender\n private queue: Array\n private failedQueue: Array\n private store: Store\n private lastStoreUpdate: number // 上次缓存更新时间\n private executor: Executor\n\n constructor (config: Initializer) {\n this.queue = []\n this.failedQueue = []\n this.config = config\n this.lastStoreUpdate = 0\n this.executor = new Executor()\n }\n\n /**\n * 初始化任务队列管理器\n */\n init (config: { sender: Sender, store?: Store }): void {\n if (this.sender === void(0)) {\n this.sender = config.sender\n this.executor.init(this.sender, this)\n }\n if (this.store === void(0)) {\n this.store = config.store\n }\n if (this.store) {\n this.store.get().then(tasks => {\n this.queue.push(...tasks.map((task: Task) => new Task(task.data)))\n this.run()\n })\n } else {\n this.run()\n }\n }\n\n /**\n * 将任务推入队列\n * @param task\n */\n push (task: Task): void {\n if (task.status === TASK_STATUS.PENDING && this.queue.length < this.config.queueMaxLength) {\n this.queue.push(task)\n this.updateStore()\n this.run()\n } else if ((task.status >= TASK_STATUS.FAILED) && (task.status <= this.config.retry)) {\n this.failedQueue.push(task)\n this.updateStore()\n this.run()\n }\n }\n\n /**\n * 取出任务执行\n */\n pop (): Task[] {\n const failedQueueLength = this.failedQueue.length\n const groupMaxLength = this.config.groupMaxLength\n const tasks: Task[] = failedQueueLength - groupMaxLength >= 0 ?\n this.failedQueue.splice(0, groupMaxLength) :\n this.failedQueue.splice(0, failedQueueLength - 1).concat(this.queue.splice(0, groupMaxLength - failedQueueLength))\n\n this.updateStore()\n return tasks\n }\n\n /**\n * 更新任务缓存\n */\n updateStore (force?: boolean): void {\n const now = Date.now()\n if (this.store && now - this.lastStoreUpdate >= 500 || force && this.store) {\n this.store.update([...this.queue, ...this.failedQueue])\n this.lastStoreUpdate = now\n }\n }\n\n /**\n * 任务的执行者\n */\n run (): void {\n this.executor.run()\n }\n\n suspend (suspended: boolean): void {\n this.updateStore(true)\n this.executor.suspend(suspended)\n }\n}\n\n\nclass Executor {\n status: QUEUE_EXECUTOR_STATUS\n sender: Sender\n timeoutId: Timer\n queueManager: QueueManager\n timer: Timer\n\n constructor () {\n this.status = QUEUE_EXECUTOR_STATUS.IDLE\n }\n\n get isIdle () {\n return this.sender &&\n this.queueManager &&\n this.status === QUEUE_EXECUTOR_STATUS.IDLE\n }\n\n init (sender: Sender, queueManager: QueueManager) {\n this.sender = sender\n this.queueManager = queueManager\n }\n\n run () {\n if (this.isIdle) {\n this.exec()\n }\n }\n\n exec () {\n const tasks = this.queueManager.pop()\n if (tasks.length) {\n this.status = QUEUE_EXECUTOR_STATUS.RUNNING\n } else {\n this.status = QUEUE_EXECUTOR_STATUS.IDLE\n return\n }\n Promise.all(tasks.map(task => this.sender.send(task)))\n .then((results: Task[]) => {\n results.forEach((task: Task) => {\n if (task.status !== TASK_STATUS.SUCCESS) {\n this.queueManager.push(task)\n }\n })\n })\n .then((): void => {\n this.timer = setTimeout(() => {\n this.exec()\n }, this.queueManager.config.interval)\n })\n }\n\n suspend (pause: boolean) {\n if (pause) {\n this.status = QUEUE_EXECUTOR_STATUS.PAUSE\n // pause\n clearTimeout(this.timer)\n // 只有暂停状态时才能撤销暂停\n } else if (this.status === QUEUE_EXECUTOR_STATUS.PAUSE) {\n this.status = QUEUE_EXECUTOR_STATUS.IDLE\n // clearTimeout(this.timer)\n this.run()\n } else if (this.status === QUEUE_EXECUTOR_STATUS.IDLE) {\n this.run()\n }\n }\n}","import { Task } from './Task'\nimport { Store } from './Store'\nimport { Sender } from './Sender'\nimport { Initializer } from './Initializer'\nimport { QueueManager } from './QueueManager'\n\nexport default class Core {\n readonly config: Initializer\n readonly queueManager: QueueManager\n\n constructor (config: Initializer) {\n this.config = config\n this.queueManager = new QueueManager(this.config)\n }\n\n init (config: { sender: Sender, store?: Store }) {\n // config.sender.\n this.queueManager.init({\n ...config\n })\n }\n\n log (trackData: Task): void {\n this.queueManager.push(trackData)\n }\n}\n","import { Sender } from './Sender'\n\nconst DEFAULT_CONFIG: InilialzeConfig = {\n debug: true,\n retry: 2,\n interval: 1000,\n groupMaxLength: 5,\n timestampKey: 'timestamp_ms',\n queueMaxLength: 500,\n commonData: {},\n attachActionToUrl: false,\n extractOnLaunchOption: true\n}\n\nexport class Initializer implements InilialzeConfig {\n readonly debug: boolean\n readonly trackerHost: string\n readonly retry: number\n readonly interval: number\n readonly commonData: Object\n readonly groupMaxLength: number\n readonly timestampKey?: string\n readonly queueMaxLength: number\n readonly attachActionToUrl: boolean\n readonly extractOnLaunchOption: boolean\n\n constructor (config: InilialzeConfig = {}) {\n config = Object.assign(DEFAULT_CONFIG, config)\n this.debug = config.debug\n this.trackerHost = config.trackerHost\n this.retry = config.retry\n this.interval = config.interval\n this.commonData = config.commonData\n this.groupMaxLength = config.groupMaxLength\n this.timestampKey = config.timestampKey\n this.queueMaxLength = config.queueMaxLength\n this.attachActionToUrl = config.attachActionToUrl\n this.extractOnLaunchOption = config.extractOnLaunchOption\n }\n}","import * as wechat from './utils'\nimport { Store } from '../core/Store'\nimport { Initializer } from '../core/Initializer'\n\nconst STORAGE_KEY = 'tracker_tasks'\n\nexport class WeChatStore implements Store {\n data: any[]\n config: Initializer\n\n constructor (config: Initializer) {\n this.data = []\n this.config = config\n }\n\n get (): Promise {\n return wechat.getStorage(STORAGE_KEY)\n .then(data => Promise.resolve(data))\n .catch(err => Promise.resolve([]))\n }\n\n update (data: any[]): Promise {\n this.data = data\n return wechat.setStorage({\n key: STORAGE_KEY,\n data\n })\n }\n}","'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar hexTable = (function () {\n var array = [];\n for (var i = 0; i < 256; ++i) {\n array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n }\n\n return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n var obj;\n\n while (queue.length) {\n var item = queue.pop();\n obj = item.obj[item.prop];\n\n if (Array.isArray(obj)) {\n var compacted = [];\n\n for (var j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted.push(obj[j]);\n }\n }\n\n item.obj[item.prop] = compacted;\n }\n }\n\n return obj;\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n var obj = options && options.plainObjects ? Object.create(null) : {};\n for (var i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n\n return obj;\n};\n\nvar merge = function merge(target, source, options) {\n if (!source) {\n return target;\n }\n\n if (typeof source !== 'object') {\n if (Array.isArray(target)) {\n target.push(source);\n } else if (typeof target === 'object') {\n if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {\n target[source] = true;\n }\n } else {\n return [target, source];\n }\n\n return target;\n }\n\n if (typeof target !== 'object') {\n return [target].concat(source);\n }\n\n var mergeTarget = target;\n if (Array.isArray(target) && !Array.isArray(source)) {\n mergeTarget = arrayToObject(target, options);\n }\n\n if (Array.isArray(target) && Array.isArray(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n if (target[i] && typeof target[i] === 'object') {\n target[i] = merge(target[i], item, options);\n } else {\n target.push(item);\n }\n } else {\n target[i] = item;\n }\n });\n return target;\n }\n\n return Object.keys(source).reduce(function (acc, key) {\n var value = source[key];\n\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n } else {\n acc[key] = value;\n }\n return acc;\n }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n};\n\nvar decode = function (str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, ' '));\n } catch (e) {\n return str;\n }\n};\n\nvar encode = function encode(str) {\n // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n\n var string = typeof str === 'string' ? str : String(str);\n\n var out = '';\n for (var i = 0; i < string.length; ++i) {\n var c = string.charCodeAt(i);\n\n if (\n c === 0x2D // -\n || c === 0x2E // .\n || c === 0x5F // _\n || c === 0x7E // ~\n || (c >= 0x30 && c <= 0x39) // 0-9\n || (c >= 0x41 && c <= 0x5A) // a-z\n || (c >= 0x61 && c <= 0x7A) // A-Z\n ) {\n out += string.charAt(i);\n continue;\n }\n\n if (c < 0x80) {\n out = out + hexTable[c];\n continue;\n }\n\n if (c < 0x800) {\n out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n if (c < 0xD800 || c >= 0xE000) {\n out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n i += 1;\n c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n out += hexTable[0xF0 | (c >> 18)]\n + hexTable[0x80 | ((c >> 12) & 0x3F)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n }\n\n return out;\n};\n\nvar compact = function compact(value) {\n var queue = [{ obj: { o: value }, prop: 'o' }];\n var refs = [];\n\n for (var i = 0; i < queue.length; ++i) {\n var item = queue[i];\n var obj = item.obj[item.prop];\n\n var keys = Object.keys(obj);\n for (var j = 0; j < keys.length; ++j) {\n var key = keys[j];\n var val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue.push({ obj: obj, prop: key });\n refs.push(val);\n }\n }\n }\n\n return compactQueue(queue);\n};\n\nvar isRegExp = function isRegExp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nmodule.exports = {\n arrayToObject: arrayToObject,\n assign: assign,\n compact: compact,\n decode: decode,\n encode: encode,\n isBuffer: isBuffer,\n isRegExp: isRegExp,\n merge: merge\n};\n","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nmodule.exports = {\n 'default': 'RFC3986',\n formatters: {\n RFC1738: function (value) {\n return replace.call(value, percentTwenties, '+');\n },\n RFC3986: function (value) {\n return value;\n }\n },\n RFC1738: 'RFC1738',\n RFC3986: 'RFC3986'\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar formats = require('./formats');\n\nvar arrayPrefixGenerators = {\n brackets: function brackets(prefix) { // eslint-disable-line func-name-matching\n return prefix + '[]';\n },\n indices: function indices(prefix, key) { // eslint-disable-line func-name-matching\n return prefix + '[' + key + ']';\n },\n repeat: function repeat(prefix) { // eslint-disable-line func-name-matching\n return prefix;\n }\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaults = {\n delimiter: '&',\n encode: true,\n encoder: utils.encode,\n encodeValuesOnly: false,\n serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching\n return toISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false\n};\n\nvar stringify = function stringify( // eslint-disable-line func-name-matching\n object,\n prefix,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly\n) {\n var obj = object;\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n } else if (obj instanceof Date) {\n obj = serializeDate(obj);\n } else if (obj === null) {\n if (strictNullHandling) {\n return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;\n }\n\n obj = '';\n }\n\n if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {\n if (encoder) {\n var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);\n return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];\n }\n return [formatter(prefix) + '=' + formatter(String(obj))];\n }\n\n var values = [];\n\n if (typeof obj === 'undefined') {\n return values;\n }\n\n var objKeys;\n if (Array.isArray(filter)) {\n objKeys = filter;\n } else {\n var keys = Object.keys(obj);\n objKeys = sort ? keys.sort(sort) : keys;\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (skipNulls && obj[key] === null) {\n continue;\n }\n\n if (Array.isArray(obj)) {\n values = values.concat(stringify(\n obj[key],\n generateArrayPrefix(prefix, key),\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly\n ));\n } else {\n values = values.concat(stringify(\n obj[key],\n prefix + (allowDots ? '.' + key : '[' + key + ']'),\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly\n ));\n }\n }\n\n return values;\n};\n\nmodule.exports = function (object, opts) {\n var obj = object;\n var options = opts ? utils.assign({}, opts) : {};\n\n if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n\n var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;\n var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;\n var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;\n var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;\n var sort = typeof options.sort === 'function' ? options.sort : null;\n var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;\n var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;\n var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;\n if (typeof options.format === 'undefined') {\n options.format = formats['default'];\n } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n var formatter = formats.formatters[options.format];\n var objKeys;\n var filter;\n\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n } else if (Array.isArray(options.filter)) {\n filter = options.filter;\n objKeys = filter;\n }\n\n var keys = [];\n\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n\n var arrayFormat;\n if (options.arrayFormat in arrayPrefixGenerators) {\n arrayFormat = options.arrayFormat;\n } else if ('indices' in options) {\n arrayFormat = options.indices ? 'indices' : 'repeat';\n } else {\n arrayFormat = 'indices';\n }\n\n var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n if (!objKeys) {\n objKeys = Object.keys(obj);\n }\n\n if (sort) {\n objKeys.sort(sort);\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (skipNulls && obj[key] === null) {\n continue;\n }\n\n keys = keys.concat(stringify(\n obj[key],\n key,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encode ? encoder : null,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly\n ));\n }\n\n var joined = keys.join(delimiter);\n var prefix = options.addQueryPrefix === true ? '?' : '';\n\n return joined.length > 0 ? prefix + joined : '';\n};\n","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar defaults = {\n allowDots: false,\n allowPrototypes: false,\n arrayLimit: 20,\n decoder: utils.decode,\n delimiter: '&',\n depth: 5,\n parameterLimit: 1000,\n plainObjects: false,\n strictNullHandling: false\n};\n\nvar parseValues = function parseQueryStringValues(str, options) {\n var obj = {};\n var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n var parts = cleanStr.split(options.delimiter, limit);\n\n for (var i = 0; i < parts.length; ++i) {\n var part = parts[i];\n\n var bracketEqualsPos = part.indexOf(']=');\n var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n var key, val;\n if (pos === -1) {\n key = options.decoder(part, defaults.decoder);\n val = options.strictNullHandling ? null : '';\n } else {\n key = options.decoder(part.slice(0, pos), defaults.decoder);\n val = options.decoder(part.slice(pos + 1), defaults.decoder);\n }\n if (has.call(obj, key)) {\n obj[key] = [].concat(obj[key]).concat(val);\n } else {\n obj[key] = val;\n }\n }\n\n return obj;\n};\n\nvar parseObject = function (chain, val, options) {\n var leaf = val;\n\n for (var i = chain.length - 1; i >= 0; --i) {\n var obj;\n var root = chain[i];\n\n if (root === '[]') {\n obj = [];\n obj = obj.concat(leaf);\n } else {\n obj = options.plainObjects ? Object.create(null) : {};\n var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n var index = parseInt(cleanRoot, 10);\n if (\n !isNaN(index)\n && root !== cleanRoot\n && String(index) === cleanRoot\n && index >= 0\n && (options.parseArrays && index <= options.arrayLimit)\n ) {\n obj = [];\n obj[index] = leaf;\n } else {\n obj[cleanRoot] = leaf;\n }\n }\n\n leaf = obj;\n }\n\n return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options) {\n if (!givenKey) {\n return;\n }\n\n // Transform dot notation to bracket notation\n var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n // The regex chunks\n\n var brackets = /(\\[[^[\\]]*])/;\n var child = /(\\[[^[\\]]*])/g;\n\n // Get the parent\n\n var segment = brackets.exec(key);\n var parent = segment ? key.slice(0, segment.index) : key;\n\n // Stash the parent if it exists\n\n var keys = [];\n if (parent) {\n // If we aren't using plain objects, optionally prefix keys\n // that would overwrite object prototype properties\n if (!options.plainObjects && has.call(Object.prototype, parent)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n keys.push(parent);\n }\n\n // Loop through children appending to the array until we hit depth\n\n var i = 0;\n while ((segment = child.exec(key)) !== null && i < options.depth) {\n i += 1;\n if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n keys.push(segment[1]);\n }\n\n // If there's a remainder, just add whatever is left\n\n if (segment) {\n keys.push('[' + key.slice(segment.index) + ']');\n }\n\n return parseObject(keys, val, options);\n};\n\nmodule.exports = function (str, opts) {\n var options = opts ? utils.assign({}, opts) : {};\n\n if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {\n throw new TypeError('Decoder has to be a function.');\n }\n\n options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;\n options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;\n options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;\n options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;\n options.parseArrays = options.parseArrays !== false;\n options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;\n options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;\n options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;\n options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;\n options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;\n options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n\n if (str === '' || str === null || typeof str === 'undefined') {\n return options.plainObjects ? Object.create(null) : {};\n }\n\n var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n var obj = options.plainObjects ? Object.create(null) : {};\n\n // Iterate over the keys and setup the new object\n\n var keys = Object.keys(tempObj);\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n var newObj = parseKeys(key, tempObj[key], options);\n obj = utils.merge(obj, newObj, options);\n }\n\n return utils.compact(obj);\n};\n","'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n formats: formats,\n parse: parse,\n stringify: stringify\n};\n","import qs from 'qs'\nimport * as wechat from './utils'\nimport { CommonDataVendor } from '../core/CommonDataVendor'\nimport { version } from '../../package.json' // [!] (tslint plugin) FatalError: Ensure that the files supplied to lint have a .ts, .tsx, .d.ts, .js or .jsx extension.\n\nexport class WeChatCommonDataVender extends CommonDataVendor {\n getCommonData (config: {\n onLaunchOption: onLaunchOption\n }): Promise {\n const { onLaunchOption = {} } = config\n return Promise.all([\n this.getTrackId(),\n wechat.getSystemInfo(),\n wechat.getNetworkType()\n ]).then(([trackId, systemInfo, networkType]) => {\n const system = systemInfo.system.split(/\\s+/)\n const query = qs.stringify(onLaunchOption.query)\n const commonData = {\n // 开发信息\n __debug: 1, // 当前小程序是否是开发版本\n\n // sdk 信息\n sdk_version: version,\n\n // 设备相关信息\n model: systemInfo.model,\n os: system[0],\n os_version: system[1],\n network_type: networkType,\n env_version: systemInfo.version,\n ip: '', // TODO:暂时无法得知\n\n // app 相关\n app_type: 'wx', // 或者 alipay\n app_id: '',\n app_name: '',\n template_version: '',\n app_category: '',\n source: onLaunchOption.scene,\n source_path: onLaunchOption.path,\n source_app_id: onLaunchOption.referrerInfo ? onLaunchOption.referrerInfo.appId : '',\n source_params: query,\n source_src_key: onLaunchOption.query ? onLaunchOption.query.src || '' : '',\n // 业务相关\n\n track_id: trackId\n }\n return Promise.resolve(commonData)\n })\n }\n\n getTrackId (): Promise {\n return wechat.getStorage(WeChatCommonDataVender.TRACK_ID_KEY)\n .then((trackId: string) => {\n return Promise.resolve(trackId)\n })\n .catch(err => {\n return this.setTrackId()\n })\n }\n\n setTrackId (): Promise {\n const UUID = this.genUUId()\n return wechat.setStorage({\n key: WeChatCommonDataVender.TRACK_ID_KEY,\n data: UUID\n }).then(() => {\n return Promise.resolve(UUID)\n }, () => {\n wechat.setStorage({\n key: WeChatCommonDataVender.TRACK_ID_KEY,\n data: UUID\n })\n return Promise.resolve(UUID)\n })\n }\n\n genUUId () {\n return '' + Date.now() + '-' +\n Math.floor(1e7 * Math.random()) + '-' +\n Math.random().toString(16).replace('.', '') + '-' +\n String(Math.random() * 31242).replace('.', '').slice(0, 8)\n }\n\n validate (data: any): Object {\n const result = {\n required: [],\n optional: []\n }\n const dataScheme = WeChatCommonDataVender.dataScheme\n for (let key in dataScheme) {\n if (dataScheme.hasOwnProperty(key) && !data[key]) {\n result[dataScheme[key] === 1 ? 'required' : 'optional'].push(key)\n }\n }\n return result\n }\n}","export abstract class CommonDataVendor {\n static TRACK_ID_KEY = 'bx_track_id'\n\n /**\n * 0 可选,1 必选\n */\n static dataScheme = {\n event_type: 1,\n tracktype: 1,\n action: 1,\n timestamp_ms: 1,\n __debug: 0,\n app_type: 1,\n app_id: 1,\n app_name: 1,\n template_version: 1,\n app_category: 1,\n preview_version: 0,\n app_role: 0,\n internal_app: 0,\n track_id: 1,\n open_id: 0,\n union_id: 0,\n bx_user_id: 0,\n visitor_mobile: 0,\n distinct_id: 0,\n ip: 0,\n os: 1,\n os_version: 1,\n model: 1,\n network_type: 1,\n env_version: 0,\n source: 1,\n source_path: 1,\n source_params: 0,\n source_src_key: 0,\n source_app_id: 0,\n page_type: 1,\n page_id: 1,\n last_page_type: 0,\n last_page_id: 0,\n page_level: 1,\n sdk_version: 1\n }\n\n abstract getCommonData (config: {\n onLaunchOption: onLaunchOption\n }): Promise\n abstract getTrackId (): Promise\n abstract setTrackId (): Promise\n abstract genUUId (): string\n // abstract static validate (data: any): Object\n\n static validate (data: any): Object {\n const result = {\n required: [],\n optional: []\n }\n const dataScheme = this.dataScheme\n for (let key in dataScheme) {\n if (dataScheme.hasOwnProperty(key) && !data[key]) {\n result[dataScheme[key] === 1 ? 'required' : 'optional'].push(key)\n }\n }\n return result\n }\n}","import * as wechat from './utils'\nimport helper from '../helper'\nimport { Task } from '../core/Task'\nimport { Sender } from '../core/Sender'\nimport { WeChatCommonDataVender } from './CommonDataVendor'\nimport { Initializer } from '../core/Initializer'\n\nexport class WeChatSender implements Sender {\n url: string\n commonData: Object\n config: Initializer\n\n constructor (config: Initializer, commonData?: Object) {\n this.url = config.trackerHost\n this.config = config\n this.commonData = commonData\n }\n\n send (task: Task): Promise {\n const data = {\n ...this.commonData,\n ...task.data\n }\n let url = this.url\n if (this.config.attachActionToUrl) {\n const trackAction = data.action || ''\n url = /\\/$/.test(this.url) ? `${this.url}${trackAction}` : `${this.url}/${trackAction}`\n }\n helper.log('打点数据校验结果:', task, WeChatCommonDataVender.validate(data))\n\n return wechat.request({\n url,\n method: 'POST',\n data\n }).then(() => {\n // 这一步肥肠重要,只需改变状态即可\n task.isSucceed()\n return Promise.resolve(task)\n }).catch(() => {\n task.isFailed()\n return Promise.resolve(task)\n })\n }\n}","import * as wechat from './utils'\nimport { NetworkDetector } from '../core/NetworkDetector'\n\nexport class WeChatNetworkDetector extends NetworkDetector {\n getNetworkStatus (): Promise {\n return wechat.getNetworkType()\n .then(networkType => {\n return Promise.resolve(networkType)\n }, err => {\n console.error('[tracker] 获取网络状态失败', err)\n return Promise.resolve('none')\n })\n }\n\n watchNetworkStatusChange (callback: Function): void {\n wechat.onNetworkStatusChange(callback)\n }\n}","export abstract class NetworkDetector {\n abstract getNetworkStatus (): Promise\n abstract watchNetworkStatusChange (callback: (networkType: string) => void): void\n}","import helper from './helper'\nimport Core from './core/index'\nimport { Task } from './core/Task'\nimport { Store } from './core/Store'\nimport { Sender } from './core/Sender'\nimport { Initializer } from './core/Initializer'\nimport {\n WeChatStore,\n WeChatSender,\n WeChatNetworkDetector,\n WeChatCommonDataVender,\n} from './wechat/index'\nimport { AliPaySender } from './alipay/index'\nimport { NetworkDetector } from './core/NetworkDetector'\nimport { CommonDataVendor } from './core/CommonDataVendor'\nimport { resolve } from 'dns';\n\nexport class Tracker {\n private core: Core\n private store: Store\n private sender: Sender\n public config: Initializer\n public networkDetector: NetworkDetector\n public commonDataVendor: CommonDataVendor\n public onLaunchOption: onLaunchOption\n\n constructor (config: InilialzeConfig = {}) {\n this.config = new Initializer(config)\n this.core = new Core(this.config)\n helper.DEBUG = this.config.debug\n // 默认暂停 task runner\n this.core.queueManager.suspend(true)\n this.networkDetector = new WeChatNetworkDetector()\n this.commonDataVendor = new WeChatCommonDataVender()\n }\n\n static generateTrackerInstance (): Tracker {\n let config = {}\n try {\n config = require('./anka-tracker.config.js')\n } catch (err) {}\n const tracker = new Tracker(config)\n if (config.extractOnLaunchOption) {\n tracker.extractOnLaunchOption()\n }\n return tracker\n }\n\n init (commonData?: Object) {\n const handleNetworkStatusChange = this.handleNetworkStatusChange.bind(this)\n\n // 之所以留下 AliPaySender,是为了支付宝小程序的打点功能做准备\n this.sender = new WeChatSender(this.config, commonData)\n this.store = new WeChatStore(this.config)\n this.core.init({\n sender: this.sender,\n store: this.store\n })\n this.networkDetector.getNetworkStatus().then(\n handleNetworkStatusChange,\n handleNetworkStatusChange\n )\n this.networkDetector.watchNetworkStatusChange(handleNetworkStatusChange)\n }\n\n handleNetworkStatusChange (networdkType: string | Error): void {\n const suspended = networdkType === 'none' || networdkType instanceof Error\n this.core.queueManager.suspend(suspended)\n }\n\n asyncInitWithCommonData (commonData: object = {}): Promise {\n return this.commonDataVendor.getCommonData({\n onLaunchOption: this.onLaunchOption\n }).then(res => {\n helper.log('初始化完成')\n this.init(Object.assign(res, this.config.commonData, commonData))\n }).catch(err => {\n helper.log('初始化失败')\n console.log(err)\n })\n }\n\n extractOnLaunchOption (): void {\n const tracker = this\n const _App = App\n\n App = function (object) {\n const AppLaunchHook = object.onLaunch\n object['onLaunch'] = function (options) {\n onAppLaunch.call(this, options)\n AppLaunchHook && AppLaunchHook.call(this, options)\n }\n _App(object)\n }\n\n function onAppLaunch (options: onLaunchOption) {\n tracker.onLaunchOption = options\n }\n }\n\n log (data: TrackData): void {\n const now = Date.now()\n data[this.config.timestampKey] = now\n this.core.log(new Task(data))\n }\n\n action (action: string = '', data: TrackData): void {\n if (typeof action !== 'string') throw new Error('缺少 action 参数')\n data.action = action\n this.log(data)\n }\n}\n\nexport const tracker = Tracker.generateTrackerInstance()"],"names":["requestPramas","Promise","resolve","reject","wx","request","success","res","statusCode","data","fail","err","pramas","setStorage","key","getStorage","getSystemInfo","getNetworkType","networkType","callback","onNetworkStatusChange","TASK_STATUS","DEBUG","log","_i","e","this","console","QUEUE_EXECUTOR_STATUS","trackData","now","Date","_id","Math","random","toString","replace","status","PENDING","timestamp","Task","SUCCESS","config","queue","failedQueue","lastStoreUpdate","executor","Executor","QueueManager","sender","init","store","get","then","tasks","_a","_this","push","map","task","run","length","queueMaxLength","updateStore","FAILED","retry","failedQueueLength","groupMaxLength","splice","concat","force","update","suspended","suspend","IDLE","Object","queueManager","isIdle","exec","pop","RUNNING","all","send","results","forEach","timer","setTimeout","interval","pause","PAUSE","clearTimeout","Core","DEFAULT_CONFIG","debug","timestampKey","commonData","attachActionToUrl","extractOnLaunchOption","assign","trackerHost","WeChatStore","wechat.getStorage","catch","wechat.setStorage","has","prototype","hasOwnProperty","hexTable","array","i","toUpperCase","compactQueue","obj","item","prop","Array","isArray","compacted","j","arrayToObject","source","options","plainObjects","create","target","keys","reduce","acc","compact","value","o","refs","val","indexOf","decode","str","decodeURIComponent","encode","string","String","out","c","charCodeAt","charAt","isBuffer","constructor","isRegExp","call","merge","allowPrototypes","mergeTarget","default","formatters","RFC1738","RFC3986","arrayPrefixGenerators","brackets","prefix","indices","repeat","toISO","toISOString","defaults","delimiter","encoder","utils","encodeValuesOnly","serializeDate","date","skipNulls","strictNullHandling","stringify","object","generateArrayPrefix","filter","sort","allowDots","formatter","values","objKeys","opts","undefined","TypeError","format","formats","arrayFormat","joined","join","addQueryPrefix","arrayLimit","decoder","depth","parameterLimit","parseValues","cleanStr","ignoreQueryPrefix","limit","Infinity","parts","split","part","bracketEqualsPos","pos","slice","parseObject","chain","leaf","root","cleanRoot","index","parseInt","isNaN","parseArrays","parseKeys","givenKey","child","segment","parent","parse","tempObj","newObj","__extends","WeChatCommonDataVender","onLaunchOption","getTrackId","wechat.getSystemInfo","wechat.getNetworkType","trackId","systemInfo","system","query","qs","__debug","sdk_version","model","os","os_version","network_type","env_version","version","ip","app_type","app_id","app_name","template_version","app_category","scene","source_path","path","source_app_id","referrerInfo","appId","source_params","source_src_key","src","track_id","TRACK_ID_KEY","setTrackId","UUID","genUUId","floor","result","required","optional","dataScheme","CommonDataVendor","event_type","tracktype","action","timestamp_ms","preview_version","app_role","internal_app","open_id","union_id","bx_user_id","visitor_mobile","distinct_id","page_type","page_id","last_page_type","last_page_id","page_level","url","WeChatSender","__assign","trackAction","test","helper","validate","wechat.request","method","isSucceed","isFailed","WeChatNetworkDetector","error","wechat.onNetworkStatusChange","Initializer","core","networkDetector","commonDataVendor","Tracker","require","tracker","handleNetworkStatusChange","bind","getNetworkStatus","watchNetworkStatusChange","networdkType","Error","getCommonData","_App","App","AppLaunchHook","onLaunch","onAppLaunch","generateTrackerInstance"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"anka-tracker.min.js","sources":["../src/wechat/utils.ts","../src/helper/index.ts","../src/wechat/Store.ts","../src/core/Task.ts","../node_modules/qs/lib/utils.js","../node_modules/qs/lib/formats.js","../node_modules/qs/lib/stringify.js","../node_modules/qs/lib/parse.js","../node_modules/qs/lib/index.js","../src/wechat/CommonDataVendor.ts","../src/core/CommonDataVendor.ts","../src/wechat/Sender.ts","../src/wechat/NetworkDetector.ts","../src/core/NetworkDetector.ts","../src/core/QueueManager.ts","../src/core/index.ts","../src/core/Initializer.ts","../src/Tracker.ts","../src/BxTracker.ts"],"sourcesContent":["declare interface RequestPramas {\n url: string,\n data?: Object,\n method: string,\n header?: Object,\n dataType?: string,\n responseType?: string\n}\n\ndeclare interface SetStorageParams {\n key: string,\n data: Object | string\n}\n\n/**\n * WeChat HTTP 请求\n * @param requestPramas\n */\nexport function request (requestPramas: RequestPramas): Promise {\n return new Promise((resolve, reject) => {\n wx.request({\n ...requestPramas,\n success: (res: any) => {\n if (res.statusCode >= 200 && res.statusCode < 300) {\n resolve && resolve(res.data)\n } else {\n reject && reject(res.data)\n }\n },\n fail: (err: Error) => {\n reject && reject(err)\n }\n })\n })\n}\n\n/**\n * 将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。\n * @param pramas\n */\nexport function setStorage (pramas: SetStorageParams): Promise {\n return new Promise((resolve, reject) => {\n wx.setStorage({\n ...pramas,\n success: (res: any): void => {\n resolve(res)\n },\n fail: (err: Error): void => {\n reject(err)\n }\n })\n })\n}\n\n/**\n * 从本地缓存中异步获取指定 key 对应的内容\n * @param pramas\n */\nexport function getStorage (key: string): Promise {\n return new Promise((resolve, reject) => {\n wx.getStorage({\n key: key,\n success: (res: any): void => {\n resolve(res.data)\n },\n fail: (err: Error): void => {\n reject(err)\n }\n })\n })\n}\n\n/**\n * 获取系统信息。\n */\nexport function getSystemInfo (): Promise {\n return new Promise((resolve, reject) => {\n wx.getSystemInfo({\n success: (res: any): void => {\n resolve(res)\n },\n fail: (err: Error): void => {\n reject(err)\n }\n })\n })\n}\n\n/**\n * 获取网络类型。\n */\nexport function getNetworkType (): Promise {\n return new Promise((resolve, reject) => {\n wx.getNetworkType({\n success: (res: any): void => {\n resolve(res.networkType)\n },\n fail: (err: Error): void => {\n reject(err)\n }\n })\n })\n}\n\n/**\n * 监听网络状态变化。\n * @param callback\n */\nexport function onNetworkStatusChange (callback: Function): void {\n wx.onNetworkStatusChange((res: {isConnected: boolean, networkType: string}) => {\n callback(res.networkType)\n })\n}","export default {\n DEBUG: true,\n\n log (...e: any[]): void {\n this.DEBUG && console.log('[ 🔍 tracker]', ...e)\n }\n}\n\nexport function readonlyDecorator () {\n return function (target: any, propertyKey: string, propertyDescriptor: PropertyDescriptor) {\n propertyDescriptor.writable = false\n }\n}","import * as wechat from './utils'\nimport { Store } from '../core/Store'\nimport { Initializer } from '../core/Initializer'\n\nconst STORAGE_KEY = 'tracker_tasks'\n\nexport class WeChatStore implements Store {\n data: any[]\n config: Initializer\n\n constructor (config: Initializer) {\n this.data = []\n this.config = config\n }\n\n get (): Promise {\n return wechat.getStorage(STORAGE_KEY)\n .then(data => Promise.resolve(data))\n .catch(err => Promise.resolve([]))\n }\n\n update (data: any[]): Promise {\n this.data = data\n return wechat.setStorage({\n key: STORAGE_KEY,\n data\n })\n }\n}","export enum TASK_STATUS {\n SUCCESS = -1,\n PENDING,\n FAILED\n}\nexport class Task {\n private _id: string\n public data: {}\n public status: number\n public timestamp?: number\n\n constructor (trackData: TrackData) {\n const now = Date.now()\n this._id = Math.random().toString(16).replace('.', '')\n this.status = TASK_STATUS.PENDING\n this.data = trackData\n this.timestamp = now\n }\n\n isSucceed () {\n this.status = TASK_STATUS.SUCCESS\n }\n\n isFailed () {\n this.status++\n }\n}","'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar hexTable = (function () {\n var array = [];\n for (var i = 0; i < 256; ++i) {\n array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n }\n\n return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n var obj;\n\n while (queue.length) {\n var item = queue.pop();\n obj = item.obj[item.prop];\n\n if (Array.isArray(obj)) {\n var compacted = [];\n\n for (var j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted.push(obj[j]);\n }\n }\n\n item.obj[item.prop] = compacted;\n }\n }\n\n return obj;\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n var obj = options && options.plainObjects ? Object.create(null) : {};\n for (var i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n\n return obj;\n};\n\nvar merge = function merge(target, source, options) {\n if (!source) {\n return target;\n }\n\n if (typeof source !== 'object') {\n if (Array.isArray(target)) {\n target.push(source);\n } else if (typeof target === 'object') {\n if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {\n target[source] = true;\n }\n } else {\n return [target, source];\n }\n\n return target;\n }\n\n if (typeof target !== 'object') {\n return [target].concat(source);\n }\n\n var mergeTarget = target;\n if (Array.isArray(target) && !Array.isArray(source)) {\n mergeTarget = arrayToObject(target, options);\n }\n\n if (Array.isArray(target) && Array.isArray(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n if (target[i] && typeof target[i] === 'object') {\n target[i] = merge(target[i], item, options);\n } else {\n target.push(item);\n }\n } else {\n target[i] = item;\n }\n });\n return target;\n }\n\n return Object.keys(source).reduce(function (acc, key) {\n var value = source[key];\n\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n } else {\n acc[key] = value;\n }\n return acc;\n }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n};\n\nvar decode = function (str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, ' '));\n } catch (e) {\n return str;\n }\n};\n\nvar encode = function encode(str) {\n // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n\n var string = typeof str === 'string' ? str : String(str);\n\n var out = '';\n for (var i = 0; i < string.length; ++i) {\n var c = string.charCodeAt(i);\n\n if (\n c === 0x2D // -\n || c === 0x2E // .\n || c === 0x5F // _\n || c === 0x7E // ~\n || (c >= 0x30 && c <= 0x39) // 0-9\n || (c >= 0x41 && c <= 0x5A) // a-z\n || (c >= 0x61 && c <= 0x7A) // A-Z\n ) {\n out += string.charAt(i);\n continue;\n }\n\n if (c < 0x80) {\n out = out + hexTable[c];\n continue;\n }\n\n if (c < 0x800) {\n out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n if (c < 0xD800 || c >= 0xE000) {\n out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n i += 1;\n c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n out += hexTable[0xF0 | (c >> 18)]\n + hexTable[0x80 | ((c >> 12) & 0x3F)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n }\n\n return out;\n};\n\nvar compact = function compact(value) {\n var queue = [{ obj: { o: value }, prop: 'o' }];\n var refs = [];\n\n for (var i = 0; i < queue.length; ++i) {\n var item = queue[i];\n var obj = item.obj[item.prop];\n\n var keys = Object.keys(obj);\n for (var j = 0; j < keys.length; ++j) {\n var key = keys[j];\n var val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue.push({ obj: obj, prop: key });\n refs.push(val);\n }\n }\n }\n\n return compactQueue(queue);\n};\n\nvar isRegExp = function isRegExp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nmodule.exports = {\n arrayToObject: arrayToObject,\n assign: assign,\n compact: compact,\n decode: decode,\n encode: encode,\n isBuffer: isBuffer,\n isRegExp: isRegExp,\n merge: merge\n};\n","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nmodule.exports = {\n 'default': 'RFC3986',\n formatters: {\n RFC1738: function (value) {\n return replace.call(value, percentTwenties, '+');\n },\n RFC3986: function (value) {\n return value;\n }\n },\n RFC1738: 'RFC1738',\n RFC3986: 'RFC3986'\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar formats = require('./formats');\n\nvar arrayPrefixGenerators = {\n brackets: function brackets(prefix) { // eslint-disable-line func-name-matching\n return prefix + '[]';\n },\n indices: function indices(prefix, key) { // eslint-disable-line func-name-matching\n return prefix + '[' + key + ']';\n },\n repeat: function repeat(prefix) { // eslint-disable-line func-name-matching\n return prefix;\n }\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaults = {\n delimiter: '&',\n encode: true,\n encoder: utils.encode,\n encodeValuesOnly: false,\n serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching\n return toISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false\n};\n\nvar stringify = function stringify( // eslint-disable-line func-name-matching\n object,\n prefix,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly\n) {\n var obj = object;\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n } else if (obj instanceof Date) {\n obj = serializeDate(obj);\n } else if (obj === null) {\n if (strictNullHandling) {\n return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;\n }\n\n obj = '';\n }\n\n if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {\n if (encoder) {\n var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);\n return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];\n }\n return [formatter(prefix) + '=' + formatter(String(obj))];\n }\n\n var values = [];\n\n if (typeof obj === 'undefined') {\n return values;\n }\n\n var objKeys;\n if (Array.isArray(filter)) {\n objKeys = filter;\n } else {\n var keys = Object.keys(obj);\n objKeys = sort ? keys.sort(sort) : keys;\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (skipNulls && obj[key] === null) {\n continue;\n }\n\n if (Array.isArray(obj)) {\n values = values.concat(stringify(\n obj[key],\n generateArrayPrefix(prefix, key),\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly\n ));\n } else {\n values = values.concat(stringify(\n obj[key],\n prefix + (allowDots ? '.' + key : '[' + key + ']'),\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly\n ));\n }\n }\n\n return values;\n};\n\nmodule.exports = function (object, opts) {\n var obj = object;\n var options = opts ? utils.assign({}, opts) : {};\n\n if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n\n var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;\n var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;\n var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;\n var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;\n var sort = typeof options.sort === 'function' ? options.sort : null;\n var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;\n var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;\n var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;\n if (typeof options.format === 'undefined') {\n options.format = formats['default'];\n } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n var formatter = formats.formatters[options.format];\n var objKeys;\n var filter;\n\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n } else if (Array.isArray(options.filter)) {\n filter = options.filter;\n objKeys = filter;\n }\n\n var keys = [];\n\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n\n var arrayFormat;\n if (options.arrayFormat in arrayPrefixGenerators) {\n arrayFormat = options.arrayFormat;\n } else if ('indices' in options) {\n arrayFormat = options.indices ? 'indices' : 'repeat';\n } else {\n arrayFormat = 'indices';\n }\n\n var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n if (!objKeys) {\n objKeys = Object.keys(obj);\n }\n\n if (sort) {\n objKeys.sort(sort);\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (skipNulls && obj[key] === null) {\n continue;\n }\n\n keys = keys.concat(stringify(\n obj[key],\n key,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encode ? encoder : null,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly\n ));\n }\n\n var joined = keys.join(delimiter);\n var prefix = options.addQueryPrefix === true ? '?' : '';\n\n return joined.length > 0 ? prefix + joined : '';\n};\n","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar defaults = {\n allowDots: false,\n allowPrototypes: false,\n arrayLimit: 20,\n decoder: utils.decode,\n delimiter: '&',\n depth: 5,\n parameterLimit: 1000,\n plainObjects: false,\n strictNullHandling: false\n};\n\nvar parseValues = function parseQueryStringValues(str, options) {\n var obj = {};\n var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n var parts = cleanStr.split(options.delimiter, limit);\n\n for (var i = 0; i < parts.length; ++i) {\n var part = parts[i];\n\n var bracketEqualsPos = part.indexOf(']=');\n var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n var key, val;\n if (pos === -1) {\n key = options.decoder(part, defaults.decoder);\n val = options.strictNullHandling ? null : '';\n } else {\n key = options.decoder(part.slice(0, pos), defaults.decoder);\n val = options.decoder(part.slice(pos + 1), defaults.decoder);\n }\n if (has.call(obj, key)) {\n obj[key] = [].concat(obj[key]).concat(val);\n } else {\n obj[key] = val;\n }\n }\n\n return obj;\n};\n\nvar parseObject = function (chain, val, options) {\n var leaf = val;\n\n for (var i = chain.length - 1; i >= 0; --i) {\n var obj;\n var root = chain[i];\n\n if (root === '[]') {\n obj = [];\n obj = obj.concat(leaf);\n } else {\n obj = options.plainObjects ? Object.create(null) : {};\n var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n var index = parseInt(cleanRoot, 10);\n if (\n !isNaN(index)\n && root !== cleanRoot\n && String(index) === cleanRoot\n && index >= 0\n && (options.parseArrays && index <= options.arrayLimit)\n ) {\n obj = [];\n obj[index] = leaf;\n } else {\n obj[cleanRoot] = leaf;\n }\n }\n\n leaf = obj;\n }\n\n return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options) {\n if (!givenKey) {\n return;\n }\n\n // Transform dot notation to bracket notation\n var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n // The regex chunks\n\n var brackets = /(\\[[^[\\]]*])/;\n var child = /(\\[[^[\\]]*])/g;\n\n // Get the parent\n\n var segment = brackets.exec(key);\n var parent = segment ? key.slice(0, segment.index) : key;\n\n // Stash the parent if it exists\n\n var keys = [];\n if (parent) {\n // If we aren't using plain objects, optionally prefix keys\n // that would overwrite object prototype properties\n if (!options.plainObjects && has.call(Object.prototype, parent)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n keys.push(parent);\n }\n\n // Loop through children appending to the array until we hit depth\n\n var i = 0;\n while ((segment = child.exec(key)) !== null && i < options.depth) {\n i += 1;\n if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n keys.push(segment[1]);\n }\n\n // If there's a remainder, just add whatever is left\n\n if (segment) {\n keys.push('[' + key.slice(segment.index) + ']');\n }\n\n return parseObject(keys, val, options);\n};\n\nmodule.exports = function (str, opts) {\n var options = opts ? utils.assign({}, opts) : {};\n\n if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {\n throw new TypeError('Decoder has to be a function.');\n }\n\n options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;\n options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;\n options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;\n options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;\n options.parseArrays = options.parseArrays !== false;\n options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;\n options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;\n options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;\n options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;\n options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;\n options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n\n if (str === '' || str === null || typeof str === 'undefined') {\n return options.plainObjects ? Object.create(null) : {};\n }\n\n var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n var obj = options.plainObjects ? Object.create(null) : {};\n\n // Iterate over the keys and setup the new object\n\n var keys = Object.keys(tempObj);\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n var newObj = parseKeys(key, tempObj[key], options);\n obj = utils.merge(obj, newObj, options);\n }\n\n return utils.compact(obj);\n};\n","'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n formats: formats,\n parse: parse,\n stringify: stringify\n};\n","import qs from 'qs'\nimport * as wechat from './utils'\nimport { CommonDataVendor } from '../core/CommonDataVendor'\nimport { version } from '../../package.json' // [!] (tslint plugin) FatalError: Ensure that the files supplied to lint have a .ts, .tsx, .d.ts, .js or .jsx extension.\n\nexport class WeChatCommonDataVender extends CommonDataVendor {\n getCommonData (config: {\n onLaunchOption: onLaunchOption\n }): Promise {\n const { onLaunchOption = {} } = config\n return Promise.all([\n this.getTrackId(),\n wechat.getSystemInfo(),\n wechat.getNetworkType()\n ]).then(([trackId, systemInfo, networkType]) => {\n const system = systemInfo.system.split(/\\s+/)\n const query = qs.stringify(onLaunchOption.query)\n const commonData = {\n // 开发信息\n __debug: 1, // 当前小程序是否是开发版本\n\n // sdk 信息\n sdk_version: version,\n\n // 设备相关信息\n model: systemInfo.model,\n os: system[0],\n os_version: system[1],\n network_type: networkType,\n env_version: systemInfo.version,\n ip: '', // TODO:暂时无法得知\n\n // app 相关\n app_type: 'wx', // 或者 alipay\n app_id: '',\n app_name: '',\n template_version: '',\n app_category: '',\n source: onLaunchOption.scene,\n source_path: onLaunchOption.path,\n source_app_id: onLaunchOption.referrerInfo ? onLaunchOption.referrerInfo.appId : '',\n source_params: query,\n source_src_key: onLaunchOption.query ? onLaunchOption.query.src || '' : '',\n // 业务相关\n\n track_id: trackId\n }\n return Promise.resolve(commonData)\n })\n }\n\n getTrackId (): Promise {\n return wechat.getStorage(WeChatCommonDataVender.TRACK_ID_KEY)\n .then((trackId: string) => {\n return Promise.resolve(trackId)\n })\n .catch(err => {\n return this.setTrackId()\n })\n }\n\n setTrackId (): Promise {\n const UUID = this.genUUId()\n return wechat.setStorage({\n key: WeChatCommonDataVender.TRACK_ID_KEY,\n data: UUID\n }).then(() => {\n return Promise.resolve(UUID)\n }, () => {\n wechat.setStorage({\n key: WeChatCommonDataVender.TRACK_ID_KEY,\n data: UUID\n })\n return Promise.resolve(UUID)\n })\n }\n\n genUUId () {\n return '' + Date.now() + '-' +\n Math.floor(1e7 * Math.random()) + '-' +\n Math.random().toString(16).replace('.', '') + '-' +\n String(Math.random() * 31242).replace('.', '').slice(0, 8)\n }\n\n validate (data: any): Object {\n const result = {\n required: [],\n optional: []\n }\n const dataScheme = WeChatCommonDataVender.dataScheme\n for (let key in dataScheme) {\n if (dataScheme.hasOwnProperty(key) && !data[key]) {\n result[dataScheme[key] === 1 ? 'required' : 'optional'].push(key)\n }\n }\n return result\n }\n}","export abstract class CommonDataVendor {\n static TRACK_ID_KEY = 'bx_track_id'\n\n /**\n * 0 可选,1 必选\n */\n static dataScheme = {\n event_type: 1,\n tracktype: 1,\n action: 1,\n timestamp_ms: 1,\n __debug: 0,\n app_type: 1,\n app_id: 1,\n app_name: 1,\n template_version: 1,\n app_category: 1,\n preview_version: 0,\n app_role: 0,\n internal_app: 0,\n track_id: 1,\n open_id: 0,\n union_id: 0,\n bx_user_id: 0,\n visitor_mobile: 0,\n distinct_id: 0,\n ip: 0,\n os: 1,\n os_version: 1,\n model: 1,\n network_type: 1,\n env_version: 0,\n source: 1,\n source_path: 1,\n source_params: 0,\n source_src_key: 0,\n source_app_id: 0,\n page_type: 1,\n page_id: 1,\n last_page_type: 0,\n last_page_id: 0,\n page_level: 1,\n sdk_version: 1\n }\n\n abstract getCommonData (config: {\n onLaunchOption: onLaunchOption\n }): Promise\n abstract getTrackId (): Promise\n abstract setTrackId (): Promise\n abstract genUUId (): string\n // abstract static validate (data: any): Object\n\n static validate (data: any): Object {\n const result = {\n required: [],\n optional: []\n }\n const dataScheme = this.dataScheme\n for (let key in dataScheme) {\n if (dataScheme.hasOwnProperty(key) && !data[key]) {\n result[dataScheme[key] === 1 ? 'required' : 'optional'].push(key)\n }\n }\n return result\n }\n}","import * as wechat from './utils'\nimport helper from '../helper'\nimport { Task } from '../core/Task'\nimport { Sender } from '../core/Sender'\nimport { WeChatCommonDataVender } from './CommonDataVendor'\nimport { Initializer } from '../core/Initializer'\n\nexport class WeChatSender implements Sender {\n url: string\n commonData: Object\n config: Initializer\n\n constructor (config: Initializer, commonData?: Object) {\n this.url = config.trackerHost\n this.config = config\n this.commonData = commonData\n }\n\n send (task: Task): Promise {\n const data = {\n ...this.commonData,\n ...task.data\n }\n let url = this.url\n if (this.config.attachActionToUrl) {\n const trackAction = data.action || ''\n url = /\\/$/.test(this.url) ? `${this.url}${trackAction}` : `${this.url}/${trackAction}`\n }\n helper.log('打点数据校验结果:', task, WeChatCommonDataVender.validate(data))\n\n return wechat.request({\n url,\n method: 'POST',\n data\n }).then(() => {\n // 这一步肥肠重要,只需改变状态即可\n task.isSucceed()\n return Promise.resolve(task)\n }).catch(() => {\n task.isFailed()\n return Promise.resolve(task)\n })\n }\n}","import * as wechat from './utils'\nimport { NetworkDetector } from '../core/NetworkDetector'\n\nexport class WeChatNetworkDetector extends NetworkDetector {\n getNetworkStatus (): Promise {\n return wechat.getNetworkType()\n .then(networkType => {\n return Promise.resolve(networkType)\n }, err => {\n console.error('[tracker] 获取网络状态失败', err)\n return Promise.resolve('none')\n })\n }\n\n watchNetworkStatusChange (callback: Function): void {\n wechat.onNetworkStatusChange(callback)\n }\n}","export abstract class NetworkDetector {\n abstract getNetworkStatus (): Promise\n abstract watchNetworkStatusChange (callback: (networkType: string) => void): void\n}","import { Task } from './Task'\nimport { Store } from './Store'\nimport { Sender } from './Sender'\nimport * as helper from '../helper'\nimport { Initializer } from './Initializer'\nimport { TASK_STATUS } from './Task'\n\nexport enum QUEUE_EXECUTOR_STATUS {\n IDLE,\n PAUSE,\n RUNNING,\n}\n\n/**\n * Class 任务队列管理器\n * 管理器不考虑任务执行细节,以及何时暂停\n */\nexport class QueueManager {\n public config: Initializer\n private sender: Sender\n private queue: Array\n private failedQueue: Array\n private store: Store\n private lastStoreUpdate: number // 上次缓存更新时间\n private executor: Executor\n\n constructor (config: Initializer) {\n this.queue = []\n this.failedQueue = []\n this.config = config\n this.lastStoreUpdate = 0\n this.executor = new Executor()\n }\n\n /**\n * 初始化任务队列管理器\n */\n init (config: { sender: Sender, store: Store }): void {\n if (this.sender) return\n this.store = config.store\n this.sender = config.sender\n this.executor.init(this.sender, this)\n this.store.get().then(tasks => {\n this.queue.push(...tasks.map((task: Task) => new Task(task.data)))\n this.run()\n })\n }\n\n /**\n * 将任务推入队列\n * @param task\n */\n push (task: Task): void {\n if (task.status === TASK_STATUS.PENDING && this.queue.length < this.config.queueMaxLength) {\n this.queue.push(task)\n this.updateStore()\n this.run()\n } else if ((task.status >= TASK_STATUS.FAILED) && (task.status <= this.config.retry)) {\n this.failedQueue.push(task)\n this.updateStore()\n this.run()\n }\n }\n\n /**\n * 取出任务执行\n */\n pop (): Task[] {\n const failedQueueLength = this.failedQueue.length\n const groupMaxLength = this.config.groupMaxLength\n const tasks: Task[] = failedQueueLength - groupMaxLength >= 0 ?\n this.failedQueue.splice(0, groupMaxLength) :\n this.failedQueue.splice(0, failedQueueLength).concat(this.queue.splice(0, groupMaxLength - failedQueueLength))\n\n this.updateStore()\n return tasks\n }\n\n /**\n * 更新任务缓存\n */\n updateStore (force?: boolean): void {\n const now = Date.now()\n if (this.store && now - this.lastStoreUpdate >= 500 || force && this.store) {\n this.store.update([...this.queue, ...this.failedQueue])\n this.lastStoreUpdate = now\n }\n }\n\n /**\n * 任务的执行者\n */\n run (): void {\n this.executor.run()\n }\n\n suspend (suspended: boolean): void {\n this.updateStore(true)\n this.executor.suspend(suspended)\n }\n}\n\n\nclass Executor {\n status: QUEUE_EXECUTOR_STATUS\n sender: Sender\n timeoutId: Timer\n queueManager: QueueManager\n timer: Timer\n\n constructor () {\n this.status = QUEUE_EXECUTOR_STATUS.IDLE\n }\n\n get isIdle () {\n return this.sender &&\n this.queueManager &&\n this.status === QUEUE_EXECUTOR_STATUS.IDLE\n }\n\n init (sender: Sender, queueManager: QueueManager) {\n this.sender = sender\n this.queueManager = queueManager\n }\n\n run () {\n if (this.isIdle) {\n this.exec()\n }\n }\n\n exec () {\n const tasks = this.queueManager.pop()\n if (tasks.length) {\n this.status = QUEUE_EXECUTOR_STATUS.RUNNING\n } else {\n this.status = QUEUE_EXECUTOR_STATUS.IDLE\n return\n }\n Promise.all(tasks.map(task => this.sender.send(task)))\n .then((results: Task[]) => {\n results.forEach((task: Task) => {\n if (task.status !== TASK_STATUS.SUCCESS) {\n this.queueManager.push(task)\n }\n })\n })\n .then((): void => {\n this.timer = setTimeout(() => {\n this.exec()\n }, this.queueManager.config.interval)\n })\n }\n\n suspend (pause: boolean) {\n if (pause) {\n this.status = QUEUE_EXECUTOR_STATUS.PAUSE\n // pause\n clearTimeout(this.timer)\n // 只有暂停状态时才能撤销暂停\n } else if (this.status === QUEUE_EXECUTOR_STATUS.PAUSE) {\n this.status = QUEUE_EXECUTOR_STATUS.IDLE\n // clearTimeout(this.timer)\n this.run()\n } else if (this.status === QUEUE_EXECUTOR_STATUS.IDLE) {\n this.run()\n }\n }\n}","import { Task } from './Task'\nimport { Store } from './Store'\nimport { Sender } from './Sender'\nimport { Initializer } from './Initializer'\nimport { QueueManager } from './QueueManager'\n\nexport default class Core {\n readonly config: Initializer\n readonly queueManager: QueueManager\n\n constructor (config: Initializer) {\n this.config = config\n this.queueManager = new QueueManager(this.config)\n }\n\n init (config: { sender: Sender, store: Store }) {\n // config.sender.\n this.queueManager.init({\n ...config\n })\n }\n\n log (trackData: Task): void {\n this.queueManager.push(trackData)\n }\n}\n","import { Sender } from './Sender'\n\nconst DEFAULT_CONFIG: InilialzeConfig = {\n debug: true,\n retry: 2,\n interval: 1000,\n groupMaxLength: 5,\n timestampKey: 'timestamp_ms',\n queueMaxLength: 500,\n commonData: {},\n attachActionToUrl: false,\n extractOnLaunchOption: true\n}\n\nexport class Initializer implements InilialzeConfig {\n readonly debug: boolean\n readonly trackerHost: string\n readonly retry: number\n readonly interval: number\n readonly commonData: Object\n readonly groupMaxLength: number\n readonly timestampKey?: string\n readonly queueMaxLength: number\n readonly attachActionToUrl: boolean\n readonly extractOnLaunchOption: boolean\n\n constructor (config: InilialzeConfig = {}) {\n config = Object.assign(DEFAULT_CONFIG, config)\n this.debug = config.debug\n this.trackerHost = config.trackerHost\n this.retry = config.retry\n this.interval = config.interval\n this.commonData = config.commonData\n this.groupMaxLength = config.groupMaxLength\n this.timestampKey = config.timestampKey\n this.queueMaxLength = config.queueMaxLength\n this.attachActionToUrl = config.attachActionToUrl\n this.extractOnLaunchOption = config.extractOnLaunchOption\n }\n}","import {\n WeChatStore,\n WeChatSender,\n WeChatNetworkDetector,\n WeChatCommonDataVender,\n} from './wechat/index'\nimport Core from './core/index'\nimport { Task } from './core/Task'\nimport { Store } from './core/Store'\nimport { Sender } from './core/Sender'\nimport { AliPaySender } from './alipay/index'\nimport { Initializer } from './core/Initializer'\nimport helper, { readonlyDecorator } from './helper'\nimport { NetworkDetector } from './core/NetworkDetector'\nimport { CommonDataVendor } from './core/CommonDataVendor'\n\nexport class Tracker {\n private core: Core\n private store: Store\n private sender: Sender\n public config: Initializer\n public networkDetector: NetworkDetector\n public commonDataVendor: CommonDataVendor\n public onLaunchOption: onLaunchOption\n\n constructor (config: InilialzeConfig = {}) {\n this.config = new Initializer(config)\n this.core = new Core(this.config)\n helper.DEBUG = this.config.debug\n // 默认暂停 task runner\n this.core.queueManager.suspend(true)\n this.networkDetector = new WeChatNetworkDetector()\n this.commonDataVendor = new WeChatCommonDataVender()\n }\n\n @readonlyDecorator()\n init (commonData?: Object) {\n\n // 只允许初始化一次\n if (this.sender) return\n const handleNetworkStatusChange = this.handleNetworkStatusChange.bind(this)\n\n // 之所以留下 AliPaySender,是为了支付宝小程序的打点功能做准备\n this.sender = new WeChatSender(this.config, commonData)\n this.store = new WeChatStore(this.config)\n this.core.init({\n sender: this.sender,\n store: this.store\n })\n this.networkDetector.getNetworkStatus().then(\n handleNetworkStatusChange,\n handleNetworkStatusChange\n )\n this.networkDetector.watchNetworkStatusChange(handleNetworkStatusChange)\n helper.log('初始化完成')\n }\n\n @readonlyDecorator()\n handleNetworkStatusChange (networdkType: string | Error): void {\n const suspended = networdkType === 'none' || networdkType instanceof Error\n this.core.queueManager.suspend(suspended)\n }\n\n @readonlyDecorator()\n log (data: TrackData): void {\n const now = Date.now()\n data[this.config.timestampKey] = now\n this.core.log(new Task(data))\n }\n}\n","import { Tracker } from './Tracker'\nimport helper, { readonlyDecorator } from './helper'\n\nexport class BxTracker extends Tracker {\n static generateTrackerInstance (): Tracker {\n let config = {}\n try {\n config = require('./anka-tracker.config.js')\n } catch (err) {}\n const tracker = new BxTracker(config)\n if (config.extractOnLaunchOption) {\n tracker.extractOnLaunchOption()\n }\n return tracker\n }\n\n @readonlyDecorator()\n asyncInitWithCommonData (commonData: object = {}): Promise {\n return this.commonDataVendor.getCommonData({\n onLaunchOption: this.onLaunchOption\n }).then(res => {\n this.init(Object.assign(res, this.config.commonData, commonData))\n }).catch(err => {\n helper.log('初始化失败')\n console.log(err)\n })\n }\n\n @readonlyDecorator()\n extractOnLaunchOption (): void {\n const tracker = this\n const _App = App\n\n App = function (object) {\n const AppLaunchHook = object.onLaunch\n object['onLaunch'] = function (options) {\n onAppLaunch.call(this, options)\n AppLaunchHook && AppLaunchHook.call(this, options)\n }\n _App(object)\n }\n\n function onAppLaunch (options: onLaunchOption) {\n tracker.onLaunchOption = options\n }\n }\n\n @readonlyDecorator()\n track (...dataList: Array): void {\n const tasks: Promise[] = []\n dataList.map(data => {\n if (typeof data === 'function') {\n tasks.push(new Promise(resolve => {\n data(resolve)\n }))\n } else {\n console.log(data)\n tasks.push(Promise.resolve(data))\n }\n })\n Promise.all(tasks).then((commonDataList: TrackData[]) => {\n this.log(Object.assign({}, ...commonDataList))\n })\n }\n\n @readonlyDecorator()\n action (action: string = '', ...dataList: Array): void {\n if (typeof action !== 'string') throw new Error('缺少 action 参数')\n this.track(...dataList, {\n action\n })\n }\n}\n\nexport const tracker = BxTracker.generateTrackerInstance()"],"names":["requestPramas","Promise","resolve","reject","wx","request","success","res","statusCode","data","fail","err","pramas","setStorage","key","getStorage","getSystemInfo","getNetworkType","networkType","callback","onNetworkStatusChange","target","propertyKey","propertyDescriptor","writable","TASK_STATUS","config","this","WeChatStore","wechat.getStorage","then","catch","wechat.setStorage","DEBUG","log","_i","e","console","has","Object","prototype","hasOwnProperty","hexTable","array","i","push","toString","toUpperCase","compactQueue","queue","obj","length","item","pop","prop","Array","isArray","compacted","j","arrayToObject","source","options","plainObjects","create","assign","keys","reduce","acc","compact","value","o","refs","val","indexOf","decode","str","decodeURIComponent","replace","encode","string","String","out","c","charCodeAt","charAt","isBuffer","constructor","isRegExp","call","merge","allowPrototypes","concat","mergeTarget","forEach","default","formatters","RFC1738","RFC3986","arrayPrefixGenerators","brackets","prefix","indices","repeat","toISO","Date","toISOString","defaults","delimiter","encoder","utils","encodeValuesOnly","serializeDate","date","skipNulls","strictNullHandling","stringify","object","generateArrayPrefix","filter","sort","allowDots","formatter","values","objKeys","opts","undefined","TypeError","format","formats","arrayFormat","joined","join","addQueryPrefix","arrayLimit","decoder","depth","parameterLimit","parseValues","cleanStr","ignoreQueryPrefix","limit","Infinity","parts","split","part","bracketEqualsPos","pos","slice","parseObject","chain","leaf","root","cleanRoot","index","parseInt","isNaN","parseArrays","parseKeys","givenKey","child","segment","exec","parent","parse","tempObj","newObj","__extends","WeChatCommonDataVender","_a","onLaunchOption","all","getTrackId","wechat.getSystemInfo","wechat.getNetworkType","trackId","systemInfo","system","query","qs","commonData","__debug","sdk_version","model","os","os_version","network_type","env_version","version","ip","app_type","app_id","app_name","template_version","app_category","scene","source_path","path","source_app_id","referrerInfo","appId","source_params","source_src_key","src","track_id","TRACK_ID_KEY","_this","setTrackId","UUID","genUUId","now","Math","floor","random","result","required","optional","dataScheme","CommonDataVendor","event_type","tracktype","action","timestamp_ms","preview_version","app_role","internal_app","open_id","union_id","bx_user_id","visitor_mobile","distinct_id","page_type","page_id","last_page_type","last_page_id","page_level","url","trackerHost","WeChatSender","task","__assign","attachActionToUrl","trackAction","test","helper","validate","wechat.request","method","isSucceed","isFailed","WeChatNetworkDetector","error","wechat.onNetworkStatusChange","QUEUE_EXECUTOR_STATUS","trackData","_id","status","PENDING","timestamp","Task","SUCCESS","failedQueue","lastStoreUpdate","executor","Executor","QueueManager","sender","store","init","get","tasks","map","run","queueMaxLength","updateStore","FAILED","retry","failedQueueLength","groupMaxLength","splice","force","update","suspended","suspend","IDLE","queueManager","isIdle","RUNNING","send","results","timer","setTimeout","interval","pause","PAUSE","clearTimeout","Core","DEFAULT_CONFIG","debug","timestampKey","extractOnLaunchOption","Initializer","core","networkDetector","commonDataVendor","Tracker","handleNetworkStatusChange","bind","getNetworkStatus","watchNetworkStatusChange","networdkType","Error","__decorate","readonlyDecorator","BxTracker","require","tracker","getCommonData","_App","App","AppLaunchHook","onLaunch","onAppLaunch","dataList","commonDataList","track","generateTrackerInstance"],"mappings":"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"} \ No newline at end of file