@arms/rum-miniapp 0.0.1

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/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # `@arms/miniapp`
2
+
3
+ > TODO: description
4
+
5
+ ## Usage
6
+
7
+ ```javascript
8
+ import RumLogger from '@arms/rum-miniapp';
9
+ const Monitor = RumLogger.init({
10
+ pid: 'your arms application pid',
11
+ endpoint: 'your arms rum endpoint'
12
+ });
13
+
14
+ export default Monitor;
15
+ ```
@@ -0,0 +1,14 @@
1
+ import { ICollector, IContext, RumActionEvent, RumEvent } from '@arms/rum-core';
2
+ export default class ActionCollector implements ICollector {
3
+ name: string;
4
+ private DELAY_TIME;
5
+ ctx: IContext;
6
+ sendEvent: (payload: RumEvent) => void;
7
+ events: string[];
8
+ lastEvent: RumActionEvent;
9
+ timer: any;
10
+ setup(ctx: IContext, sendEvent: (payload: RumEvent) => void): void;
11
+ onEvent: (e: any) => void;
12
+ sendAction: () => void;
13
+ destroy(): void;
14
+ }
@@ -0,0 +1 @@
1
+ "use strict";exports.__esModule=!0,exports["default"]=void 0;var _rumCore=require("@arms/rum-core"),_view=require("../../utils/view"),_hackPage=require("../../utils/hackPage"),ActionCollector=exports["default"]=/*#__PURE__*/function(){function a(){var a=this;this.name="action-collector",this.DELAY_TIME=300,this.ctx=void 0,this.sendEvent=void 0,this.events=["tap"],this.lastEvent=void 0,this.timer=void 0,this.onEvent=function(b){if(b&&a.events.includes(b.type)&&b.target){var c=b.target,d=b.currentTarget,e=b.type,f=c.dataset,g=c.id;if(!g)return;if(d&&g!==d.id)return;var h=(0,_view.getCurView)(a.ctx),i={event_type:_rumCore.RumEventType.ACTION,type:e,name:g,snapshots:Object.keys(f).length?JSON.stringify(f):void 0,times:1,view:h};clearTimeout(a.timer),a.lastEvent?a.lastEvent.name===i.name?a.lastEvent.times+=1:a.sendAction():a.lastEvent=i,a.timer=setTimeout(a.sendAction,a.DELAY_TIME)}},this.sendAction=function(){a.sendEvent(a.lastEvent),a.lastEvent=null}}var b=a.prototype;return b.setup=function setup(a,b){var c=a.getConfig(),d=c.collectors,e=void 0===d?{}:d;!1===e.action||(this.ctx=a,this.sendEvent=b,(0,_hackPage.addPageListener)("*",this.onEvent))},b.destroy=function destroy(){(0,_hackPage.removePageListener)("*",this.onEvent)},a}();
@@ -0,0 +1,21 @@
1
+ import { ICollector, IContext, RumEvent } from '@arms/rum-core';
2
+ export default class ExceptionCollector implements ICollector {
3
+ name: string;
4
+ ctx: IContext;
5
+ sendEvent: (payload: RumEvent) => void;
6
+ private origin;
7
+ setup(ctx: IContext, sendEvent: (payload: RumEvent) => void): void;
8
+ hackOrigin(): void;
9
+ sendError(error: any): void;
10
+ /**
11
+ * 根据stack获取Error信息
12
+ * TODO: 增加基于Stack解析filename和lineNumber的能力
13
+ * @param stack
14
+ * @returns
15
+ */
16
+ getErrorByStack(stack?: string): {
17
+ name: string;
18
+ message: string;
19
+ };
20
+ destroy(): void;
21
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";exports.__esModule=!0,exports["default"]=void 0;var _rumCore=require("@arms/rum-core"),_base=require("@arms/rum-core/src/utils/base"),_view=require("../../utils/view"),ExceptionCollector=exports["default"]=/*#__PURE__*/function(){function a(){this.name="exception-collector",this.ctx=void 0,this.sendEvent=void 0,this.origin={app:App,consoleError:console.error}}var b=a.prototype;return b.setup=function setup(a,b){this.ctx=a,this.sendEvent=b,this.hackOrigin()},b.hackOrigin=function hackOrigin(){var a=this,b=this.ctx.getConfig(),c=b.collectors,d=void 0===c?{}:c;!1!==d.jsError&&(App=function App(b){b||(b={}),(0,_base.interceptFunction)(b,"onError",function(b){a.sendError(b)}),a.origin.app(b)}),!1!==d.consoleError&&(0,_base.interceptFunction)(console,"error",function(b){a.sendError(b)})},b.sendError=function sendError(a){var b,c,d,e,f,g,h=(0,_view.getCurView)(this.ctx);if(a instanceof Object)b=a.name,c=a.message,d=a.filename||a.fileName,e=a.stack,f=a.lineno||a.lineNumber,g=a.colno||a.columnNumber;else if("string"==typeof a){e=a;var i=this.getErrorByStack(a);i&&(b=i.name,c=i.message)}b&&c&&this.sendEvent({event_type:_rumCore.RumEventType.EXCEPTION,source:"event",type:"error",name:b,message:c,file:d,stack:e,line:f,column:g,times:1,view:h})}/**
2
+ * 根据stack获取Error信息
3
+ * TODO: 增加基于Stack解析filename和lineNumber的能力
4
+ * @param stack
5
+ * @returns
6
+ */,b.getErrorByStack=function getErrorByStack(a){void 0===a&&(a="");var b=a.split("\n");if(!(2>b.length))for(var c=1;c<b.length;c++)if(b[c].trim().startsWith("at ")){var d=b[c-1],e=d.indexOf(": ");return{name:d.substring(0,e),message:d.substring(e+2)}}},b.destroy=function destroy(){var a=this.origin;a.app&&(App=a.app),a.consoleError&&(console.error=a.consoleError)},a}();
@@ -0,0 +1,26 @@
1
+ import { ICollector, IContext, RumEvent } from '@arms/rum-core';
2
+ interface IMeasure {
3
+ [key: string]: number;
4
+ }
5
+ export default class ApiCollector implements ICollector {
6
+ name: string;
7
+ ctx: IContext;
8
+ sendEvent: (payload: RumEvent) => void;
9
+ origin: {
10
+ request: (options: any) => void;
11
+ httpRequest: (options: any) => void;
12
+ };
13
+ setup(ctx: IContext, sendEvent: (payload: RumEvent) => void): void;
14
+ hackRequest(key: any): void;
15
+ rebuildRequestOptions(options: any): any;
16
+ sendApi(resp: any, options: any, success: any, startTime: any): void;
17
+ /**
18
+ * 解析小程序的性能数据
19
+ * 参考:https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html
20
+ * https://opendocs.alipay.com/mini/api/owycmh?pathHash=c91640f8
21
+ * @param profile
22
+ * @returns
23
+ */
24
+ parseProfile(profile: IMeasure): IMeasure;
25
+ }
26
+ export {};
@@ -0,0 +1,10 @@
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 c=arguments.length,e=Array(c),g=0;g<c;g++)e[g]=arguments[g];b.sendApi(e[0],a,!0,f),d&&d.apply(this,e)},g.fail=function(){for(var c=arguments.length,d=Array(c),g=0;g<c;g++)d[g]=arguments[g];b.sendApi(d[0],a,!1,f),e&&e.apply(this,d)},g},b.sendApi=function sendApi(a,b,c,d){var e,f,g=(0,_view.getCurView)(this.ctx),h=a.statusCode,i=a.status,j=a.errMsg,k=a.errorMessage,l=a.message,m=a.profile,n=b.url,o=b.method,p=void 0===o?"GET":o,q=(0,_url.getPathByURL)(n),r=(0,_base.getCurrentTime)()-d;m&&(e=this.parseProfile(m),f=JSON.stringify(m)),this.sendEvent((0,_extends2["default"])({event_type:_rumCore.RumEventType.RESOURCE,url:n,name:q,type:"api",method:p.toUpperCase(),status_code:i||h,message:k||j||l,view:g,success:c,duration:r},e,{times:1,timing_data:f}))}/**
3
+ * 解析小程序的性能数据
4
+ * 参考:https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html
5
+ * https://opendocs.alipay.com/mini/api/owycmh?pathHash=c91640f8
6
+ * @param profile
7
+ * @returns
8
+ */,b.parseProfile=function parseProfile(a){function b(b,c){b in a&&0<a[b]&&(d[c]=a[b])}// 以下针对类alipay小程序的情况
9
+ function c(b,c,e){if(b in a&&b in a){var f=a[c]-a[b];0<f&&(d[e]=f)}}// 以下针对wx小程序相对标准的情况
10
+ var d={};return b("domainLookup","dns_duration"),b("connect","connect_duration"),b("SSLconnection","ssl_duration"),b("Waiting","first_byte_duration"),b("totalTime","duration"),b("receivedBytedCount","size"),c("connectStart","connectEnd","connect_duration"),c("SSLconnectionStart","SSLconnectionEnd","ssl_duration"),c("domainLookUpStart","domainLookUpEnd","dns_duration"),c("redirectStart","redirectEnd","redirect_duration"),c("responseStart","requestStart","first_byte_duration"),c("responseStart","requestEnd","download_duration"),c("redirectStart","responseEnd","duration"),d},a}();
@@ -0,0 +1,10 @@
1
+ import { ICollector, IContext, RumEvent } from '@arms/rum-core';
2
+ export default class PerfCollector implements ICollector {
3
+ name: string;
4
+ ctx: IContext;
5
+ sendEvent: (payload: RumEvent) => void;
6
+ perfObserver: any;
7
+ setup(ctx: IContext, sendEvent: (payload: RumEvent) => void): void;
8
+ observerHandler: (ev: any) => void;
9
+ destroy(): void;
10
+ }
@@ -0,0 +1 @@
1
+ "use strict";exports.__esModule=!0,exports["default"]=void 0;var _platform=require("../../utils/platform"),PerfCollector=exports["default"]=/*#__PURE__*/function(){function a(){this.name="perf-collector",this.ctx=void 0,this.sendEvent=void 0,this.perfObserver=void 0,this.observerHandler=function(a){var b=a.getEntries(),c={};if(Array.isArray(b)&&0<b.length)for(var d,e=0;e<b.length;e++)if(d=b[e],"number"==typeof d.duration)switch(d.name){case"appLaunch":c.launch=d.duration;break;case"firstPaint":c.fp=d.duration;break;case"firstRender":c.fpt=d.duration;break;case"firstContentfulPaint":c.fcp=d.duration;break;case"largestContentfulPaint":c.lcp=d.duration;break;default:}!Object.keys(c).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"]}))}},b.destroy=function destroy(){this.perfObserver&&this.perfObserver.disconnect()},a}();// import {addPageListener, removePageListener} from "../../utils/hackPage";
@@ -0,0 +1,9 @@
1
+ import { ICollector, IContext, RumEvent } from '@arms/rum-core';
2
+ export default class PvCollector implements ICollector {
3
+ name: string;
4
+ ctx: IContext;
5
+ sendEvent: (payload: RumEvent) => void;
6
+ setup(ctx: IContext, sendEvent: (payload: RumEvent) => void): void;
7
+ sendPv: () => void;
8
+ destroy(): void;
9
+ }
@@ -0,0 +1 @@
1
+ "use strict";exports.__esModule=!0,exports["default"]=void 0;var _rumCore=require("@arms/rum-core"),_uuid=require("../../utils/uuid"),_view=require("../../utils/view"),_hackPage=require("../../utils/hackPage"),PvCollector=exports["default"]=/*#__PURE__*/function(){function a(){var a=this;this.name="pv-collector",this.ctx=void 0,this.sendEvent=void 0,this.sendPv=function(){var b=(0,_view.getCurPage)();a.ctx.addView({id:(0,_uuid.getViewId)(),name:b}),a.sendEvent({event_type:_rumCore.RumEventType.VIEW,type:"pv",url:b,name:b,loading_type:"initial_load"})}}var b=a.prototype;return b.setup=function setup(a,b){this.ctx=a,this.sendEvent=b,(0,_hackPage.addPageListener)("onShow",this.sendPv)},b.destroy=function destroy(){(0,_hackPage.removePageListener)("onShow",this.sendPv)},a}();
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import armsRum, { ArmsRum } from './shell';
2
+ export { ArmsRum };
3
+ export default armsRum;
package/lib/index.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";var _shell=_interopRequireWildcard(require("./shell"));exports.__esModule=!0,exports["default"]=void 0;exports.ArmsRum=_shell.ArmsRum;function _getRequireWildcardCache(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(_getRequireWildcardCache=function(a){return a?c:b})(a)}function _interopRequireWildcard(b,c){if(!c&&b&&b.__esModule)return b;if(null===b||"object"!=typeof b&&"function"!=typeof b)return{default:b};var d=_getRequireWildcardCache(c);if(d&&d.has(b))return d.get(b);var e={__proto__:null},f=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in b)if("default"!=a&&Object.prototype.hasOwnProperty.call(b,a)){var g=f?Object.getOwnPropertyDescriptor(b,a):null;g&&(g.get||g.set)?Object.defineProperty(e,a,g):e[a]=b[a]}return e["default"]=b,d&&d.set(b,e),e}var _default=exports["default"]=_shell["default"];
@@ -0,0 +1,5 @@
1
+ import { IContext, IProcessor, RumEvent } from "@arms/rum-core";
2
+ export default class DefaultProcessor implements IProcessor {
3
+ name: string;
4
+ process(ctx: IContext): RumEvent;
5
+ }
@@ -0,0 +1 @@
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")),_uuid=require("../utils/uuid"),_base=require("../utils/base"),_view=require("../utils/view"),DefaultProcessor=exports["default"]=/*#__PURE__*/function(){function a(){this.name="default-processor"}var b=a.prototype;return b.process=function process(a){var b=a.getRumEvent(),c=(0,_view.getCurView)(a),d=(0,_extends2["default"])({timestamp:(0,_base.getCurrentTime)(),event_id:(0,_uuid.getEventId)(),view:c},b);return d},a}();
@@ -0,0 +1,7 @@
1
+ import { IContext, IProcessor } from "@arms/rum-core";
2
+ export default class SessionProcessor implements IProcessor {
3
+ name: string;
4
+ private lastTime;
5
+ private sessionOvertime;
6
+ process(ctx: IContext): import("@arms/rum-core").RumEvent;
7
+ }
@@ -0,0 +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=1800000}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}();
@@ -0,0 +1,10 @@
1
+ import { IContext, IReporter, IViewData, Reporter, RumEvent } from '@arms/rum-core';
2
+ /**
3
+ * miniapp reporter
4
+ */
5
+ declare class MiniappReporter extends Reporter implements IReporter {
6
+ name: string;
7
+ init(ctx: IContext): void;
8
+ request(ctx: IContext, events: RumEvent[], view: IViewData): void;
9
+ }
10
+ export default MiniappReporter;
@@ -0,0 +1,3 @@
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")),_inheritsLoose2=_interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")),_rumCore=require("@arms/rum-core"),_uuid=require("../utils/uuid"),_platform=_interopRequireDefault(require("../utils/platform")),MiniappReporter=/*#__PURE__*/function(a){function b(){for(var b,c=arguments.length,d=Array(c),e=0;e<c;e++)d[e]=arguments[e];return b=a.call.apply(a,[this].concat(d))||this,b.name="miniapp-reporter",b}(0,_inheritsLoose2["default"])(b,a);var c=b.prototype;return c.init=function init(){var a=this;_platform["default"].onAppHide(function(){a.flushEventQueue()})},c.request=function(a,b,c){var d=a.getConfig(),e=d.pid,f=d.env,g=d.version,h=d.endpoint,i=d.beforeReport,j=d.user,k=void 0===j?{}:j,l=d.net,m={app:{id:e,env:f,version:g,type:_rumCore.AppType.miniapp},user:(0,_extends2["default"])({id:(0,_uuid.getUserID)()},k),session:{id:(0,_uuid.getSessionID)()},view:c,net:l,events:b};if(!("function"==typeof i&&(m=i(m),!m)))try{var n=_platform["default"].request||_platform["default"].httpRequest;n({url:h,method:"POST",dataType:"text",data:JSON.stringify(m)})}catch(a){console.warn("[arms] sendRequest fail",a)}},b}(_rumCore.Reporter),_default=exports["default"]=MiniappReporter;/**
2
+ * miniapp reporter
3
+ */
package/lib/shell.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import { IClient, IConfiguration, IShell, RumEvent } from '@arms/rum-core';
2
+ /**
3
+ * 对外导出 shell 层, 所有 shell 层模型的 API 设计约定:
4
+ * 1. API 命名空间按照 variables / functions / events 来组织
5
+ * 2. 事件(events)的命名格式为:on[Will|Did]VerbNoun?,参考 https://code.visualstudio.com/api/references/vscode-api#events
6
+ * 3. 基于 Disposable 模式,对于事件的绑定、快捷键的绑定函数,返回值则是解绑函数
7
+ */
8
+ export declare class ArmsRum implements IShell {
9
+ client: IClient;
10
+ /**
11
+ * 初始化
12
+ */
13
+ init(configuration: IConfiguration): void;
14
+ updateNetType: (type: string) => void;
15
+ /**
16
+ * 自定义上传数据
17
+ */
18
+ sendEvent(payload: RumEvent): void;
19
+ /**
20
+ * get config
21
+ */
22
+ getConfig(): IConfiguration;
23
+ /**
24
+ * set config
25
+ */
26
+ setConfig<T extends keyof IConfiguration>(key: T, value: IConfiguration[T]): void;
27
+ setConfig(value: IConfiguration): void;
28
+ }
29
+ declare const _default: ArmsRum;
30
+ export default _default;
package/lib/shell.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule=!0,exports["default"]=exports.ArmsRum=void 0;var _extends3=_interopRequireDefault(require("@babel/runtime/helpers/extends")),_rumCore=require("@arms/rum-core"),_pv=_interopRequireDefault(require("./collector/view/pv")),_perf=_interopRequireDefault(require("./collector/view/perf")),_exception=_interopRequireDefault(require("./collector/exception")),_api=_interopRequireDefault(require("./collector/resource/api")),_action=_interopRequireDefault(require("./collector/action")),_defaultProcessor=_interopRequireDefault(require("./processor/default-processor")),_sessionProcessor=_interopRequireDefault(require("./processor/session-processor")),_reporter=_interopRequireDefault(require("./reporter")),_network=require("./utils/network"),ArmsRum=exports.ArmsRum=/*#__PURE__*/function(){function a(){var a=this;this.client=void 0,this.updateNetType=function(b){var c=a.getConfig(),d=c.net,e=void 0===d?{}:d;a.setConfig("net",(0,_extends3["default"])({},e,{type:b}))}}var b=a.prototype;return b.init=/**
2
+ * 初始化
3
+ */function init(a){this.client=new _rumCore.Client,this.client.useCollectors([new _pv["default"],new _perf["default"],new _exception["default"],new _api["default"],new _action["default"]]),this.client.useProcessors([new _defaultProcessor["default"],new _sessionProcessor["default"]]),this.client.useReporter(new _reporter["default"]),this.client.init(a),(0,_network.getNetType)(this.updateNetType)},b.sendEvent=/**
4
+ * 自定义上传数据
5
+ */function sendEvent(a){this.client.sendEvent(a)}/**
6
+ * get config
7
+ */,b.getConfig=function getConfig(){return this.client.getContext().getConfig()}/**
8
+ * set config
9
+ */,b.setConfig=function setConfig(){var a=this.client.getContext();if(2===arguments.length){var b,c=this.client.getContext(),d=c.getConfig();c.setConfig((0,_extends3["default"])({},d,(b={},b[0>=arguments.length?void 0:arguments[0]]=1>=arguments.length?void 0:arguments[1],b)))}else a.setConfig(0>=arguments.length?void 0:arguments[0])},a}(),_default=exports["default"]=new ArmsRum;/**
10
+ * 对外导出 shell 层, 所有 shell 层模型的 API 设计约定:
11
+ * 1. API 命名空间按照 variables / functions / events 来组织
12
+ * 2. 事件(events)的命名格式为:on[Will|Did]VerbNoun?,参考 https://code.visualstudio.com/api/references/vscode-api#events
13
+ * 3. 基于 Disposable 模式,对于事件的绑定、快捷键的绑定函数,返回值则是解绑函数
14
+ */
package/lib/style.js ADDED
@@ -0,0 +1 @@
1
+ //empty file
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 保留指定位数的小数
3
+ * @param num 原数据
4
+ * @param decimal 小数位数
5
+ * @returns
6
+ */
7
+ export declare function formatNumber(num: number, decimal?: number): number;
8
+ /**
9
+ * 获取获取当前时间 fix Data.now() 存在的缺陷
10
+ * duration方法用于计算时间跨度,由于Date.now存在bug,可能为负数,尽可能使用performance.now计算
11
+ * https://blog.insiderattack.net/how-not-to-measure-time-in-programming-11089d546180
12
+ * 目前(2022年10月29日15:56:26)只有微信支持wx.getPerformance,具备now的功能,但功能仅仅是封装了Date.now
13
+ * qq支持getPerformance,但返回的依然是Date.now()
14
+ * 字节跳动支持 tt.performance 但不支持now方法
15
+ * 微信、百度、字节小程序支持 window.performance.now
16
+ * 支付宝、钉钉小程序占不支持 window.performance.now
17
+ * @returns
18
+ */
19
+ export declare function getCurrentTime(timeOffset?: number): number;
@@ -0,0 +1,16 @@
1
+ "use strict";exports.__esModule=!0,exports.formatNumber=formatNumber,exports.getCurrentTime=getCurrentTime;/**
2
+ * 保留指定位数的小数
3
+ * @param num 原数据
4
+ * @param decimal 小数位数
5
+ * @returns
6
+ */function formatNumber(a,b){if(void 0===b&&(b=3),!a)return a;var c=a.toString(),d=c.indexOf(".");return c=-1===d?c.substring(0):c.substring(0,b+d+1),parseFloat(c)}/**
7
+ * 获取获取当前时间 fix Data.now() 存在的缺陷
8
+ * duration方法用于计算时间跨度,由于Date.now存在bug,可能为负数,尽可能使用performance.now计算
9
+ * https://blog.insiderattack.net/how-not-to-measure-time-in-programming-11089d546180
10
+ * 目前(2022年10月29日15:56:26)只有微信支持wx.getPerformance,具备now的功能,但功能仅仅是封装了Date.now
11
+ * qq支持getPerformance,但返回的依然是Date.now()
12
+ * 字节跳动支持 tt.performance 但不支持now方法
13
+ * 微信、百度、字节小程序支持 window.performance.now
14
+ * 支付宝、钉钉小程序占不支持 window.performance.now
15
+ * @returns
16
+ */function getCurrentTime(a){var b,c;return null!==(b=performance)&&void 0!==b&&b.timeOrigin&&null!==(c=performance)&&void 0!==c&&c.now?Math.round(performance.timeOrigin+(a?a:performance.now())):Date.now()}
@@ -0,0 +1,4 @@
1
+ export declare const originalPage: any;
2
+ export declare const originalComponent: any;
3
+ export declare function addPageListener(key: string, listener: Function): void;
4
+ export declare function removePageListener(key: string, listener: Function): void;
@@ -0,0 +1,3 @@
1
+ "use strict";exports.__esModule=!0,exports.addPageListener=addPageListener,exports.originalPage=exports.originalComponent=void 0,exports.removePageListener=removePageListener;var _rumCore=require("@arms/rum-core"),listeners={};function hackPage(a){Object.keys(a).forEach(function(b){(0,_rumCore.interceptFunction)(a,b,function(){for(var a=this,c=arguments.length,d=Array(c),e=0;e<c;e++)d[e]=arguments[e];var f=[].concat(listeners[b]||[]);"*"!==b&&(f=f.concat(listeners["*"]||[])),f.forEach(function(b){b.apply(a,d)})})})}var originalPage=exports.originalPage=Page,originalComponent=exports.originalComponent=Component;Page=function Page(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];try{hackPage.apply(this,b)}catch(a){//
2
+ }return originalPage.apply(this,b)},Component=function Component(){for(var a,b=arguments.length,c=Array(b),d=0;d<b;d++)c[d]=arguments[d];if("PAGE"===(null===this||void 0===this||null===(a=this.$component)||void 0===a?void 0:a.$componentType))try{hackPage.apply(this,c)}catch(a){//
3
+ }return originalComponent.apply(this,c)};function addPageListener(a,b){a in listeners||(listeners[a]=[]),listeners[a].push(b)}function removePageListener(a,b){if(a in listeners){var c=listeners[a],d=c.indexOf(b);c.splice(d,1)}}
@@ -0,0 +1 @@
1
+ export declare function getNetType(callback: (s: string) => void): void;
@@ -0,0 +1 @@
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _platform=_interopRequireDefault(require("./platform"));exports.__esModule=!0,exports.getNetType=getNetType;function getNetType(a){_platform["default"].getNetworkType&&_platform["default"].getNetworkType({success:function success(b){var c=b.networkType;a(c?c.toLowerCase():void 0)}}),_platform["default"].onNetworkStatusChange&&_platform["default"].onNetworkStatusChange(function(b){var c=b.networkType;a(c?c.toLowerCase():void 0)})}
@@ -0,0 +1,26 @@
1
+ interface SDK {
2
+ onAppShow: (listener: any) => void;
3
+ onAppHide: (listener: any) => void;
4
+ request: (options: any) => void;
5
+ httpRequest: (options: any) => void;
6
+ getStorageSync: (key: any) => any;
7
+ setStorageSync: (key: any, data?: string) => void;
8
+ getNetworkType: (listener: any) => void;
9
+ onNetworkStatusChange: (listener: any) => void;
10
+ getPerformance: () => any;
11
+ performance: any;
12
+ }
13
+ export declare enum PlatformName {
14
+ qq = "qq",
15
+ bytedance = "bytedance",
16
+ wechat = "wechat",
17
+ dingtalk = "dingtalk",
18
+ alipay = "alipay",
19
+ swan = "swan"
20
+ }
21
+ declare const sdk: SDK;
22
+ export declare const appName: string;
23
+ export declare function getStorageSync(key: any): any;
24
+ export declare function setStorageSync(key: string, data: string): void;
25
+ export declare function getPerformance(): any;
26
+ export default sdk;
@@ -0,0 +1,4 @@
1
+ "use strict";exports.__esModule=!0,exports["default"]=exports.appName=exports.PlatformName=void 0,exports.getPerformance=getPerformance,exports.getStorageSync=getStorageSync,exports.setStorageSync=setStorageSync;var PlatformName=exports.PlatformName=/*#__PURE__*/function(a){return a.qq="qq",a.bytedance="bytedance",a.wechat="wechat",a.dingtalk="dingtalk",a.alipay="alipay",a.swan="swan",a}({});/**
2
+ * 获取跨平台的 SDK
3
+ */function getSDK(){var a;if("object"==typeof qq)a=qq;else if("object"==typeof tt)a=tt;else if("object"==typeof wx)a=wx;else if("object"==typeof dd)// dd 必须出现在 my之前,因为现在dd环境里也有my
4
+ a=dd;else if("object"==typeof my)a=my;else if("object"==typeof swan)a=swan;else throw new Error("Current platform is not supported.");return a}function getAppName(){var a="unknown";return"object"==typeof qq?a=PlatformName.qq:"object"==typeof tt?a=PlatformName.bytedance:"object"==typeof wx?a=PlatformName.wechat:"object"==typeof dd?a=PlatformName.dingtalk:"object"==typeof my?a=PlatformName.alipay:"object"==typeof swan&&(a=PlatformName.swan),a}var sdk=getSDK(),appName=exports.appName=getAppName();function getStorageSync(a){return"function"==typeof sdk.getStorageSync?appName===PlatformName.alipay||appName===PlatformName.dingtalk?sdk.getStorageSync({key:a}).data:sdk.getStorageSync(a):void 0}function setStorageSync(a,b){return"function"==typeof sdk.setStorageSync?appName===PlatformName.alipay||appName===PlatformName.dingtalk?sdk.setStorageSync({key:a,data:b}):sdk.setStorageSync(a,b):void 0}function getPerformance(){return"function"==typeof sdk.getPerformance?sdk.getPerformance():"performance"in sdk?sdk.performance:void 0}var _default=exports["default"]=sdk;
@@ -0,0 +1,19 @@
1
+ import { IContext } from "@arms/rum-core";
2
+ /**
3
+ * 根据指定 URL 获取视图的名称,默认为其path部分
4
+ * @param url 需要提取路径部分的 URL
5
+ * @param isHash 是否为 hash 模式路由的 URL
6
+ */
7
+ export declare function getPathByURL(url: string, isHash?: boolean): any;
8
+ /**
9
+ * 检查是否为上报域名
10
+ * @param ctx
11
+ * @param url 需要提取路径部分的 URL
12
+ */
13
+ export declare function isEndpoint(ctx: IContext, url: string): boolean;
14
+ /**
15
+ * @description: 获取类 URL 对象
16
+ * @param {String} url
17
+ * @return {Object} : urlObj
18
+ */
19
+ export declare function getURL(url: any): any;
@@ -0,0 +1,14 @@
1
+ "use strict";exports.__esModule=!0,exports.getPathByURL=getPathByURL,exports.getURL=getURL,exports.isEndpoint=isEndpoint;/**
2
+ * 根据指定 URL 获取视图的名称,默认为其path部分
3
+ * @param url 需要提取路径部分的 URL
4
+ * @param isHash 是否为 hash 模式路由的 URL
5
+ */function getPathByURL(a,b){void 0===b&&(b=!1);try{var c=getURL(a);return b?c.hash:c.pathname}catch(a){return""}}/**
6
+ * 检查是否为上报域名
7
+ * @param ctx
8
+ * @param url 需要提取路径部分的 URL
9
+ */function isEndpoint(a,b){var c=a.getConfig(),d=c.endpoint;try{return getURL(b).domain===getURL(d).domain}catch(a){return!1}}/**
10
+ * @description: 获取类 URL 对象
11
+ * @param {String} url
12
+ * @return {Object} : urlObj
13
+ */function getURL(a){if(!a)return null;var b={},c=a.length,d=a.indexOf("://");if(0>d)// url 不完整不再处理
14
+ return null;b.protocol=a.substring(0,d+1);var e=a.indexOf("#"),f=a.indexOf("?");0>e&&(e=c),b.search=a.substring(e),0>f&&(f=e),b.search=a.substring(f,e);var g=a.substring(d+3,f),h=g.indexOf("/");return 0>h&&(h=g.length),b.domain=g.substring(0,h).split(":")[0],b.pathname=g.substring(h,g.length),b}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 获取uuid
3
+ */
4
+ export declare function getUUID(prefix?: string): string;
5
+ /**
6
+ * 获取唯一的sessionID
7
+ */
8
+ export declare function getSessionID(): any;
9
+ /**
10
+ * 设置唯一的sessionID
11
+ */
12
+ export declare function setSessionID(): string;
13
+ /**
14
+ * 获取唯一的userID
15
+ */
16
+ export declare function getUserID(): any;
17
+ export declare function getEventId(): string;
18
+ export declare function getViewId(): string;
@@ -0,0 +1,12 @@
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_SESSION_ID",USER_ID="ARMS_USER_ID";// 存储sessionID的键名
2
+ // 存储userID的键名
3
+ /**
4
+ * 获取uuid
5
+ */function getUUID(a){return void 0===a&&(a=""),a&&(a+="_"),""+a+(0,_rumCore.generateUUID)()}// 每次启动重置Session.id
6
+ (0,_platform.setStorageSync)(SESSION_ID,void 0);/**
7
+ * 获取唯一的sessionID
8
+ */function getSessionID(){var a=(0,_platform.getStorageSync)(SESSION_ID);return a||(a=setSessionID()),a}/**
9
+ * 设置唯一的sessionID
10
+ */function setSessionID(){var a=(0,_rumCore.generateGUID)();return(0,_platform.setStorageSync)(SESSION_ID,a),a}/**
11
+ * 获取唯一的userID
12
+ */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)()}
@@ -0,0 +1,12 @@
1
+ import { IContext } from "@arms/rum-core";
2
+ /**
3
+ * 获取当前 page
4
+ * @returns
5
+ */
6
+ export declare function getCurPage(): any;
7
+ /**
8
+ * 获取当前 view
9
+ * @param ctx
10
+ * @returns
11
+ */
12
+ export declare function getCurView(ctx: IContext): import("@arms/rum-core").IViewData;
@@ -0,0 +1,8 @@
1
+ "use strict";exports.__esModule=!0,exports.getCurPage=getCurPage,exports.getCurView=getCurView;/**
2
+ * 获取当前 page
3
+ * @returns
4
+ */function getCurPage(){if("function"==typeof getCurrentPages)try{var a=getCurrentPages()||[],b=a[a.length-1];return b&&b.route||null}catch(a){console.warn("[arms] error in getCurView",a)}}/**
5
+ * 获取当前 view
6
+ * @param ctx
7
+ * @returns
8
+ */function getCurView(a){if(a){var b=a.getViews();if(b&&b.length)return b[b.length-1]}}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@arms/rum-miniapp",
3
+ "version": "0.0.1",
4
+ "description": "arms rum javascript sdk for miniapp",
5
+ "author": "guangli.fj <guangli.fj@alibaba-inc.com>",
6
+ "homepage": "https://unpkg.com/@arms/rum-miniapp@0.0.1/build/index.html",
7
+ "license": "ISC",
8
+ "main": "lib/index.js",
9
+ "directories": {
10
+ "lib": "lib",
11
+ "test": "__tests__"
12
+ },
13
+ "files": [
14
+ "lib"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "scripts": {
20
+ "start": "build-scripts build --watch",
21
+ "build": "build-scripts build",
22
+ "test": "node ./__tests__/@arms/miniapp.test.js"
23
+ },
24
+ "dependencies": {
25
+ "@arms/rum-core": "^0.0.1"
26
+ },
27
+ "devDependencies": {
28
+ "typescript": "^4.9.4"
29
+ },
30
+ "repository": "git@gitlab.alibaba-inc.com:aliyun-rum/rum-sdk.git"
31
+ }