@arms/rum-miniapp 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/collector/resource/api.d.ts +19 -3
- package/lib/collector/resource/api.js +2 -2
- package/lib/collector/view/perf.js +1 -2
- package/lib/processor/session-processor.js +2 -2
- package/lib/utils/base.d.ts +2 -2
- package/lib/utils/base.js +4 -4
- package/lib/utils/url.d.ts +11 -7
- package/lib/utils/url.js +17 -6
- package/lib/utils/uuid.js +4 -3
- package/package.json +2 -2
|
@@ -1,7 +1,22 @@
|
|
|
1
|
-
import { ICollector, IContext, RumEvent } from '@arms/rum-core';
|
|
1
|
+
import { ICollector, IContext, ITracingHeaders, IViewData, RumEvent } from '@arms/rum-core';
|
|
2
2
|
interface IMeasure {
|
|
3
3
|
[key: string]: number;
|
|
4
4
|
}
|
|
5
|
+
interface IApiAttr {
|
|
6
|
+
view: IViewData;
|
|
7
|
+
url: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
startTime: number;
|
|
10
|
+
method: string;
|
|
11
|
+
trace_id?: string;
|
|
12
|
+
}
|
|
13
|
+
interface Options {
|
|
14
|
+
url: string;
|
|
15
|
+
method?: string;
|
|
16
|
+
headers?: any;
|
|
17
|
+
success?: (res: any) => void;
|
|
18
|
+
fail?: (res: any) => void;
|
|
19
|
+
}
|
|
5
20
|
export default class ApiCollector implements ICollector {
|
|
6
21
|
name: string;
|
|
7
22
|
ctx: IContext;
|
|
@@ -11,9 +26,10 @@ export default class ApiCollector implements ICollector {
|
|
|
11
26
|
httpRequest: (options: any) => void;
|
|
12
27
|
};
|
|
13
28
|
setup(ctx: IContext, sendEvent: (payload: RumEvent) => void): void;
|
|
29
|
+
injectTracing(apiAttr: IApiAttr, inject: (tracingHeaders: ITracingHeaders) => void): void;
|
|
14
30
|
hackRequest(key: any): void;
|
|
15
|
-
rebuildRequestOptions(options:
|
|
16
|
-
sendApi(
|
|
31
|
+
rebuildRequestOptions(options: Options): Options;
|
|
32
|
+
sendApi(apiAttr: any, resp: any, success: any): void;
|
|
17
33
|
/**
|
|
18
34
|
* 解析小程序的性能数据
|
|
19
35
|
* 参考:https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule=!0,exports["default"]=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends")),_rumCore=require("@arms/rum-core"),_platform=_interopRequireDefault(require("../../utils/platform")),_url=require("../../utils/url"),_base=require("../../utils/base"),_view=require("../../utils/view"),ApiCollector=exports["default"]=/*#__PURE__*/function(){function a(){this.name="api-collector",this.ctx=void 0,this.sendEvent=void 0,this.origin={request:_platform["default"].request,httpRequest:_platform["default"].httpRequest}}var b=a.prototype;return b.setup=function setup(a,b){var c=this,d=a.getConfig(),e=d.collectors,f=void 0===e?{}:e;!1===f.api||(this.ctx=a,this.sendEvent=b,Object.keys(this.origin).forEach(function(a){return c.hackRequest(a)}))},b.hackRequest=function hackRequest(a){var b=this;a in _platform["default"]&&Object.defineProperty(_platform["default"],a,{configurable:!0,enumerable:!0,writable:!0,value:function value(){for(var c=arguments.length,d=Array(c),e=0;e<c;e++)d[e]=arguments[e];return d[0]=b.rebuildRequestOptions(d[0]),b.origin[a].apply(this,d)}})},b.rebuildRequestOptions=function rebuildRequestOptions(a){var b=this,c=a.url,d=a.success,e=a.fail,f=(0,_base.getCurrentTime)();// SDK自己的请求不监控
|
|
2
|
-
if((0,_url.isEndpoint)(this.ctx,c))return a;var g=(0,_extends2["default"])({},a);return g.success=function(){for(var
|
|
1
|
+
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule=!0,exports["default"]=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends")),_rumCore=require("@arms/rum-core"),_platform=_interopRequireDefault(require("../../utils/platform")),_url=require("../../utils/url"),_base=require("../../utils/base"),_view=require("../../utils/view"),_uuid=require("../../utils/uuid"),ApiCollector=exports["default"]=/*#__PURE__*/function(){function a(){this.name="api-collector",this.ctx=void 0,this.sendEvent=void 0,this.origin={request:_platform["default"].request,httpRequest:_platform["default"].httpRequest}}var b=a.prototype;return b.setup=function setup(a,b){var c=this,d=a.getConfig(),e=d.collectors,f=void 0===e?{}:e;!1===f.api||(this.ctx=a,this.sendEvent=b,Object.keys(this.origin).forEach(function(a){return c.hackRequest(a)}))},b.injectTracing=function injectTracing(a,b){var c=this.ctx.getConfig(),d=c.tracing,e=c.pid,f=(0,_rumCore.parseTracingOptions)(d),g=f.enable,h=f.allowedUrls,i=f.sample,j=f.tracestate;if(g){var k=(0,_rumCore.generateTraceId)(),l=(0,_rumCore.generateSpanId)(),m=(0,_rumCore.performDraw)(i),n=void 0===j||j?"rum=browser&"+e+"&"+(0,_uuid.getSessionID)():"",o=(0,_rumCore.find)(h,function(b){return(0,_rumCore.matchList)([b.match],a.url)});if(o){var p=(0,_rumCore.makeTracingHeaders)(k,l,m,o.propagatorTypes,n);a.trace_id=k,b(p)}}},b.hackRequest=function hackRequest(a){var b=this;a in _platform["default"]&&Object.defineProperty(_platform["default"],a,{configurable:!0,enumerable:!0,writable:!0,value:function value(){for(var c=arguments.length,d=Array(c),e=0;e<c;e++)d[e]=arguments[e];return d[0]=b.rebuildRequestOptions(d[0]),b.origin[a].apply(this,d)}})},b.rebuildRequestOptions=function rebuildRequestOptions(a){var b=this,c=a.url,d=a.success,e=a.fail,f=(0,_base.getCurrentTime)();// SDK自己的请求不监控 & 过滤不需要监控的url
|
|
2
|
+
if((0,_url.isEndpoint)(this.ctx,c)||(0,_rumCore.urlMatch)(c))return a;var g=(0,_extends2["default"])({},a),h={view:(0,_view.getCurView)(this.ctx),startTime:f,url:c,name:(0,_url.getPathByURL)(c),method:a.method||"GET"};return this.injectTracing(h,function(a){g.headers=(0,_extends2["default"])({},g.headers,a)}),g.success=function(){for(var a=arguments.length,c=Array(a),e=0;e<a;e++)c[e]=arguments[e];b.sendApi(h,c[0],!0),d&&d.apply(this,c)},g.fail=function(){for(var a=arguments.length,c=Array(a),d=0;d<a;d++)c[d]=arguments[d];b.sendApi(h,c[0],!1),e&&e.apply(this,c)},g},b.sendApi=function sendApi(a,b,c){var d,e,f=(0,_view.getCurView)(this.ctx),g=b.statusCode,h=b.status,i=b.errMsg,j=b.errorMessage,k=b.message,l=b.profile;l&&(d=this.parseProfile(l),e=JSON.stringify(l)),this.sendEvent((0,_extends2["default"])({event_type:_rumCore.RumEventType.RESOURCE},a,{type:"api",status_code:h||g,message:j||i||k,view:f,success:c,duration:(0,_base.getCurrentTime)()-a.startTime},d,{times:1,timing_data:e}))}/**
|
|
3
3
|
* 解析小程序的性能数据
|
|
4
4
|
* 参考:https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html
|
|
5
5
|
* https://opendocs.alipay.com/mini/api/owycmh?pathHash=c91640f8
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"use strict";exports.__esModule=!0,exports["default"]=void 0;var _platform=require("../../utils/platform"),_view=require("../../utils/view"),PerfCollector=exports["default"]=/*#__PURE__*/function(){function a(){var a=this;this.name="perf-collector",this.ctx=void 0,this.sendEvent=void 0,this.perfObserver=void 0,this.observerHandler=function(b){var c=b.getEntries(),d={view:(0,_view.getCurView)(a.ctx)};if(Array.isArray(c)&&0<c.length)for(var e,f=0;f<c.length;f++)if(e=c[f],"number"==typeof e.duration)switch(e.name){case"appLaunch":case"app-click":d.launch=e.duration;break;case"firstPaint":d["first-paint"]=e.duration;break;case"firstRender":d.first_render=e.duration;break;case"firstContentfulPaint":d.first_contentful_paint=e.duration;break;case"largestContentfulPaint":d.largest_contentful_paint=e.duration;break;case"resourceTiming":case"resource-timing":d.timing_data=JSON.stringify(e);break;default:}Object.keys(d).length
|
|
2
|
-
console.warn("perf-collector: ",d)}}var b=a.prototype;return b.setup=function setup(a,b){var c=a.getConfig(),d=c.collectors,e=void 0===d?{}:d;if(!1!==e.perf){this.ctx=a,this.sendEvent=b;var f=(0,_platform.getPerformance)();f&&f.createObserver&&(this.perfObserver=f.createObserver(this.observerHandler),this.perfObserver.observe({entryTypes:["launch","navigation","render","paint","resource"]}))}},b.destroy=function destroy(){this.perfObserver&&this.perfObserver.disconnect()},a}();// import {addPageListener, removePageListener} from "../../utils/hackPage";
|
|
1
|
+
"use strict";exports.__esModule=!0,exports["default"]=void 0;var _platform=require("../../utils/platform"),_view=require("../../utils/view"),PerfCollector=exports["default"]=/*#__PURE__*/function(){function a(){var a=this;this.name="perf-collector",this.ctx=void 0,this.sendEvent=void 0,this.perfObserver=void 0,this.observerHandler=function(b){var c=b.getEntries(),d={view:(0,_view.getCurView)(a.ctx)};if(Array.isArray(c)&&0<c.length)for(var e,f=0;f<c.length;f++)if(e=c[f],"number"==typeof e.duration)switch(e.name){case"appLaunch":case"app-click":d.launch=e.duration;break;case"firstPaint":d["first-paint"]=e.duration;break;case"firstRender":d.first_render=e.duration;break;case"firstContentfulPaint":d.first_contentful_paint=e.duration;break;case"largestContentfulPaint":d.largest_contentful_paint=e.duration;break;case"resourceTiming":case"resource-timing":d.timing_data=JSON.stringify(e);break;default:}!Object.keys(d).length}}var b=a.prototype;return b.setup=function setup(a,b){var c=a.getConfig(),d=c.collectors,e=void 0===d?{}:d;if(!1!==e.perf){this.ctx=a,this.sendEvent=b;var f=(0,_platform.getPerformance)();f&&f.createObserver&&(this.perfObserver=f.createObserver(this.observerHandler),this.perfObserver.observe({entryTypes:["launch","navigation","render","paint","resource"]}))}},b.destroy=function destroy(){this.perfObserver&&this.perfObserver.disconnect()},a}();// import {addPageListener, removePageListener} from "../../utils/hackPage";
|
|
3
2
|
/*
|
|
4
3
|
* 参考资料:
|
|
5
4
|
* https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceEntry.html
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";exports.__esModule=!0,exports["default"]=void 0;var _uuid=require("../utils/uuid"),_base=require("../utils/base"),SessionProcessor=exports["default"]=/*#__PURE__*/function(){function a(){this.name="session-processor",this.lastTime=(0,_base.getCurrentTime)(),this.sessionOvertime=
|
|
2
|
-
return b-this.lastTime>this.sessionOvertime&&(
|
|
1
|
+
"use strict";exports.__esModule=!0,exports["default"]=void 0;var _uuid=require("../utils/uuid"),_base=require("../utils/base"),SessionProcessor=exports["default"]=/*#__PURE__*/function(){function a(){this.name="session-processor",this.lastTime=(0,_base.getCurrentTime)(),this.sessionOvertime=3600000}var b=a.prototype;return b.process=function process(a){var b=(0,_base.getCurrentTime)();// 30 分钟内不上报更新session
|
|
2
|
+
return b-this.lastTime>this.sessionOvertime&&(0,_uuid.setSessionID)(),this.lastTime=b,a.getRumEvent()},a}();
|
package/lib/utils/base.d.ts
CHANGED
|
@@ -12,8 +12,8 @@ export declare function formatNumber(num: number, decimal?: number): number;
|
|
|
12
12
|
* 目前(2022年10月29日15:56:26)只有微信支持wx.getPerformance,具备now的功能,但功能仅仅是封装了Date.now
|
|
13
13
|
* qq支持getPerformance,但返回的依然是Date.now()
|
|
14
14
|
* 字节跳动支持 tt.performance 但不支持now方法
|
|
15
|
-
* 微信、百度、字节小程序支持
|
|
16
|
-
* 支付宝、钉钉小程序占不支持
|
|
15
|
+
* 微信、百度、字节小程序支持 performance.now
|
|
16
|
+
* 支付宝、钉钉小程序占不支持 performance.now
|
|
17
17
|
* @returns
|
|
18
18
|
*/
|
|
19
19
|
export declare function getCurrentTime(timeOffset?: number): number;
|
package/lib/utils/base.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.__esModule=!0,exports.formatNumber=formatNumber,exports.getCurrentTime=getCurrentTime;/**
|
|
1
|
+
"use strict";var _platform=require("./platform");exports.__esModule=!0,exports.formatNumber=formatNumber,exports.getCurrentTime=getCurrentTime;/**
|
|
2
2
|
* 保留指定位数的小数
|
|
3
3
|
* @param num 原数据
|
|
4
4
|
* @param decimal 小数位数
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* 目前(2022年10月29日15:56:26)只有微信支持wx.getPerformance,具备now的功能,但功能仅仅是封装了Date.now
|
|
11
11
|
* qq支持getPerformance,但返回的依然是Date.now()
|
|
12
12
|
* 字节跳动支持 tt.performance 但不支持now方法
|
|
13
|
-
* 微信、百度、字节小程序支持
|
|
14
|
-
* 支付宝、钉钉小程序占不支持
|
|
13
|
+
* 微信、百度、字节小程序支持 performance.now
|
|
14
|
+
* 支付宝、钉钉小程序占不支持 performance.now
|
|
15
15
|
* @returns
|
|
16
|
-
*/function getCurrentTime(a){var b,
|
|
16
|
+
*/function getCurrentTime(a){var b=(0,_platform.getPerformance)();return b&&b.timeOrigin&&b.now?Math.round(b.timeOrigin+(a?a:b.now())):Date.now()}
|
package/lib/utils/url.d.ts
CHANGED
|
@@ -4,16 +4,20 @@ import { IContext } from "@arms/rum-core";
|
|
|
4
4
|
* @param url 需要提取路径部分的 URL
|
|
5
5
|
* @param isHash 是否为 hash 模式路由的 URL
|
|
6
6
|
*/
|
|
7
|
-
export declare function getPathByURL(url: string, isHash?: boolean):
|
|
7
|
+
export declare function getPathByURL(url: string, isHash?: boolean): string;
|
|
8
8
|
/**
|
|
9
9
|
* 检查是否为上报域名
|
|
10
10
|
* @param ctx
|
|
11
11
|
* @param url 需要提取路径部分的 URL
|
|
12
12
|
*/
|
|
13
13
|
export declare function isEndpoint(ctx: IContext, url: string): boolean;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
export declare function getURL(url: string): {
|
|
15
|
+
uri: string;
|
|
16
|
+
protocol: string;
|
|
17
|
+
host: string;
|
|
18
|
+
hostname: string;
|
|
19
|
+
port: string;
|
|
20
|
+
pathname: string;
|
|
21
|
+
search: string;
|
|
22
|
+
hash: string;
|
|
23
|
+
};
|
package/lib/utils/url.js
CHANGED
|
@@ -6,9 +6,20 @@
|
|
|
6
6
|
* 检查是否为上报域名
|
|
7
7
|
* @param ctx
|
|
8
8
|
* @param url 需要提取路径部分的 URL
|
|
9
|
-
*/function isEndpoint(a,b){var c=a.getConfig(),d=c.endpoint;try{return getURL(b).
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
*/function isEndpoint(a,b){var c=a.getConfig(),d=c.endpoint;try{return getURL(b).hostname===getURL(d).hostname}catch(a){return!1}}var REGEX=/^(?:([^:\/?#]+):\/\/)?((?:([^\/?#@]*)@)?([^\/?#:]*)(?:\:(\d*))?)?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n)*))?/i;// function mapSearchParams(search: string) {
|
|
10
|
+
// const map = {}
|
|
11
|
+
// if (typeof search === 'string') {
|
|
12
|
+
// search.split('&').forEach(function (str) {
|
|
13
|
+
// let values = str.split('=')
|
|
14
|
+
// if (map.hasOwnProperty(values[0])) {
|
|
15
|
+
// map[values[0]] = Array.isArray(map[values[0]]) ? map[values[0]] : [map[values[0]]]
|
|
16
|
+
// map[values[0]].push(values[1])
|
|
17
|
+
// } else {
|
|
18
|
+
// map[values[0]] = values[1]
|
|
19
|
+
// }
|
|
20
|
+
// })
|
|
21
|
+
// return map
|
|
22
|
+
// }
|
|
23
|
+
// }
|
|
24
|
+
function getURL(a){var b=decodeURIComponent(a).match(REGEX),c=(b[3]||"").split(":"),d=c.length?(b[2]||"").replace(/(.*\@)/,""):b[2];return{uri:b[0],protocol:b[1],host:d,hostname:b[4],port:b[5],pathname:b[6],search:b[7],// query: mapSearchParams(parts[7]),
|
|
25
|
+
hash:b[8]}}
|
package/lib/utils/uuid.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
"use strict";exports.__esModule=!0,exports.getEventId=getEventId,exports.getSessionID=getSessionID,exports.getUUID=getUUID,exports.getUserID=getUserID,exports.getViewId=getViewId,exports.setSessionID=setSessionID;var _platform=require("./platform"),_rumCore=require("@arms/rum-core"),SESSION_ID="
|
|
1
|
+
"use strict";exports.__esModule=!0,exports.getEventId=getEventId,exports.getSessionID=getSessionID,exports.getUUID=getUUID,exports.getUserID=getUserID,exports.getViewId=getViewId,exports.setSessionID=setSessionID;var _platform=require("./platform"),_rumCore=require("@arms/rum-core"),SESSION_ID="_arms_sid",SESSION_ID_EXP="_arms_sid_exp",USER_ID="_arms_uid";// 存储sessionID的键名
|
|
2
|
+
// 存储sessionID的过期id
|
|
2
3
|
// 存储userID的键名
|
|
3
4
|
/**
|
|
4
5
|
* 获取uuid
|
|
5
6
|
*/function getUUID(a){return void 0===a&&(a=""),a&&(a+="_"),""+a+(0,_rumCore.generateUUID)()}// 每次启动重置Session.id
|
|
6
7
|
(0,_platform.setStorageSync)(SESSION_ID,void 0);/**
|
|
7
8
|
* 获取唯一的sessionID
|
|
8
|
-
*/function getSessionID(){var a=(0,_platform.getStorageSync)(SESSION_ID);return a||(a=setSessionID()),a}/**
|
|
9
|
+
*/function getSessionID(){var a=(0,_platform.getStorageSync)(SESSION_ID),b=new Date((0,_platform.getStorageSync)(SESSION_ID_EXP));return a&&b.valueOf()&&!(b<new Date)||(a=setSessionID()),a}/**
|
|
9
10
|
* 设置唯一的sessionID
|
|
10
|
-
*/function setSessionID(){var a=(0,_rumCore.generateGUID)();return(0,_platform.setStorageSync)(SESSION_ID,a),a}/**
|
|
11
|
+
*/function setSessionID(){var a=(0,_rumCore.generateGUID)();return(0,_platform.setStorageSync)(SESSION_ID,a),(0,_platform.setStorageSync)(SESSION_ID_EXP,new Date(Date.now()+86400000).toString()),a}/**
|
|
11
12
|
* 获取唯一的userID
|
|
12
13
|
*/function getUserID(){var a=(0,_platform.getStorageSync)(USER_ID);return a||(a=getUUID("user"),(0,_platform.setStorageSync)(USER_ID,a)),a}function getEventId(){return(0,_rumCore.generateGUID)()}function getViewId(){return(0,_rumCore.generateGUID)()}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arms/rum-miniapp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "arms rum javascript sdk for miniapp",
|
|
5
5
|
"author": "guangli.fj <guangli.fj@alibaba-inc.com>",
|
|
6
6
|
"license": "ISC",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"test": "node ./__tests__/@arms/miniapp.test.js"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@arms/rum-core": "^0.0.
|
|
24
|
+
"@arms/rum-core": "^0.0.5"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"typescript": "^4.9.4"
|