@arms/rum-reactnative 0.1.3-beta.5 → 0.1.4-beta.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.
Files changed (83) hide show
  1. package/README.md +6 -0
  2. package/android/src/main/java/com/rumsdkreactnative/RumSdkReactnativeModule.kt +31 -0
  3. package/docs/ReactNative SDK/351/205/215/347/275/256/345/217/202/350/200/203.md" +25 -0
  4. package/docs/SDK /347/211/210/346/234/254/350/257/264/346/230/216.md" +14 -0
  5. package/ios/RumAppStateRecorder.h +69 -0
  6. package/ios/RumAppStateRecorder.mm +547 -0
  7. package/ios/RumCrashReporter.h +32 -0
  8. package/ios/RumCrashReporter.mm +97 -11
  9. package/ios/RumSdkReactnative.mm +81 -1
  10. package/lib/commonjs/NativeRumSdkReactnative.js +1 -54
  11. package/lib/commonjs/collector/action/index.js +1 -108
  12. package/lib/commonjs/collector/exception/crash.js +1 -148
  13. package/lib/commonjs/collector/exception/index.js +1 -238
  14. package/lib/commonjs/collector/exception/oom.js +1 -0
  15. package/lib/commonjs/collector/index.js +1 -42
  16. package/lib/commonjs/collector/resource/api.js +1 -292
  17. package/lib/commonjs/collector/view/perf.js +1 -79
  18. package/lib/commonjs/collector/view/pv.js +1 -88
  19. package/lib/commonjs/expoConfigPlugin.js +1 -37
  20. package/lib/commonjs/index.js +1 -29
  21. package/lib/commonjs/plugin.js +1 -47
  22. package/lib/commonjs/processor/default-processor.js +1 -27
  23. package/lib/commonjs/processor/session-processor.js +1 -47
  24. package/lib/commonjs/reporter/index.js +1 -148
  25. package/lib/commonjs/reporter/monitor-reporter.js +1 -43
  26. package/lib/commonjs/shell.js +1 -91
  27. package/lib/commonjs/types/client.js +1 -6
  28. package/lib/commonjs/types/crash.js +1 -37
  29. package/lib/commonjs/types/index.js +1 -2
  30. package/lib/commonjs/types/oom.js +1 -0
  31. package/lib/commonjs/utils/action.js +1 -305
  32. package/lib/commonjs/utils/api.js +1 -84
  33. package/lib/commonjs/utils/base.js +1 -95
  34. package/lib/commonjs/utils/crash.js +1 -149
  35. package/lib/commonjs/utils/platform.js +1 -162
  36. package/lib/commonjs/utils/session.js +1 -158
  37. package/lib/commonjs/utils/url.js +1 -59
  38. package/lib/commonjs/utils/view.js +1 -93
  39. package/lib/module/NativeRumSdkReactnative.js +1 -51
  40. package/lib/module/collector/action/index.js +1 -103
  41. package/lib/module/collector/exception/crash.js +1 -143
  42. package/lib/module/collector/exception/index.js +1 -233
  43. package/lib/module/collector/exception/oom.js +1 -0
  44. package/lib/module/collector/index.js +1 -8
  45. package/lib/module/collector/resource/api.js +1 -287
  46. package/lib/module/collector/view/perf.js +1 -79
  47. package/lib/module/collector/view/pv.js +1 -83
  48. package/lib/module/expoConfigPlugin.js +1 -33
  49. package/lib/module/index.js +1 -7
  50. package/lib/module/plugin.js +1 -42
  51. package/lib/module/processor/default-processor.js +1 -22
  52. package/lib/module/processor/session-processor.js +1 -42
  53. package/lib/module/reporter/index.js +1 -144
  54. package/lib/module/reporter/monitor-reporter.js +1 -38
  55. package/lib/module/shell.js +1 -84
  56. package/lib/module/types/client.js +1 -4
  57. package/lib/module/types/crash.js +1 -33
  58. package/lib/module/types/index.js +1 -2
  59. package/lib/module/types/oom.js +1 -0
  60. package/lib/module/utils/action.js +1 -299
  61. package/lib/module/utils/api.js +1 -76
  62. package/lib/module/utils/base.js +1 -90
  63. package/lib/module/utils/crash.js +1 -144
  64. package/lib/module/utils/platform.js +1 -150
  65. package/lib/module/utils/session.js +1 -154
  66. package/lib/module/utils/url.js +1 -54
  67. package/lib/module/utils/view.js +1 -88
  68. package/lib/typescript/commonjs/src/NativeRumSdkReactnative.d.ts +10 -0
  69. package/lib/typescript/commonjs/src/collector/exception/oom.d.ts +34 -0
  70. package/lib/typescript/commonjs/src/collector/index.d.ts +1 -0
  71. package/lib/typescript/commonjs/src/shell.d.ts +1 -1
  72. package/lib/typescript/commonjs/src/types/client.d.ts +27 -0
  73. package/lib/typescript/commonjs/src/types/oom.d.ts +58 -0
  74. package/lib/typescript/commonjs/src/utils/crash.d.ts +13 -0
  75. package/lib/typescript/module/src/NativeRumSdkReactnative.d.ts +10 -0
  76. package/lib/typescript/module/src/collector/exception/oom.d.ts +34 -0
  77. package/lib/typescript/module/src/collector/index.d.ts +1 -0
  78. package/lib/typescript/module/src/shell.d.ts +1 -1
  79. package/lib/typescript/module/src/types/client.d.ts +27 -0
  80. package/lib/typescript/module/src/types/oom.d.ts +58 -0
  81. package/lib/typescript/module/src/utils/crash.d.ts +13 -0
  82. package/package.json +1 -2
  83. package/src/NativeRumSdkReactnative.ts +18 -0
@@ -1,88 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _rumCore = require("@arms/rum-core");
8
- var _view = require("../../utils/view");
9
- var _crash = require("../../types/crash");
10
- class PvCollector {
11
- name = 'pv-collector';
12
- pageMap = {};
13
- setup(ctx, sendEvent) {
14
- this.ctx = ctx;
15
- this.sendEvent = sendEvent;
16
- (0, _view.addNavigateListener)(this.onChange);
17
- }
18
- onChange = route => {
19
- // {"name":"index","path":"/","key":"index-SB2hXmOGNdpiLskG5sXwj"}
20
- // {"name":"__root","key":"__root-jPbNqG7-HaM-OUx_FcCUw"}
21
- const {
22
- key,
23
- name,
24
- path,
25
- params
26
- } = route;
27
- const page = {
28
- name,
29
- path,
30
- id: key,
31
- params
32
- };
33
- if (name === '__root') return;
34
- this.sendPv(page);
35
- };
36
- sendPv = page => {
37
- const prevPage = this.prevPage;
38
- const ctx = this.ctx;
39
- if (page.id === prevPage?.id) {
40
- // 路由没有发生变化,不发送
41
- return;
42
- }
43
- page.name = this.getViewName(page.path || page.name || '', page);
44
- if (prevPage && prevPage.id in this.pageMap) {
45
- delete this.pageMap[prevPage.id];
46
- ctx.removeView(prevPage.id);
47
- }
48
- this.prevPage = page;
49
- ctx.addView(page);
50
-
51
- // 路由回退情况下已经上报
52
- if (page.id in this.pageMap) {
53
- return;
54
- }
55
- this.pageMap[page.id] = page;
56
- this.sendEvent?.({
57
- event_type: _rumCore.RumEventType.VIEW,
58
- type: 'pv',
59
- loading_type: 'initial_load',
60
- ...page
61
- });
62
-
63
- // 同步当前 view 上下文到原生侧(崩溃报告关联用)
64
- const sessionId = ctx.session?.getSessionId?.() || '';
65
- const userId = ctx.session?.getUserId?.() || '';
66
- ctx.emitter.emit(_crash.CRASH_CONTEXT_EVENT, {
67
- session_id: sessionId,
68
- user_id: userId,
69
- view_id: page.id,
70
- view_name: page.name
71
- });
72
- };
73
- getViewName(url, page) {
74
- let {
75
- parseViewName
76
- } = this.ctx?.getConfig();
77
- let name = page.name;
78
- if (parseViewName && (0, _rumCore.isFunction)(parseViewName)) {
79
- name = parseViewName(url, page) || name;
80
- }
81
- return name;
82
- }
83
- destroy() {
84
- (0, _view.removeNavigateListener)(this.onChange);
85
- }
86
- }
87
- exports.default = PvCollector;
88
- //# sourceMappingURL=pv.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _rumCore=require("@arms/rum-core"),_view=require("../../utils/view"),_crash=require("../../types/crash");class PvCollector{name="pv-collector";pageMap={};setup(e,t){this.ctx=e,this.sendEvent=t,(0,_view.addNavigateListener)(this.onChange)}onChange=e=>{const{key:t,name:i,path:s,params:a}=e,r={name:i,path:s,id:t,params:a};"__root"!==i&&this.sendPv(r)};sendPv=e=>{const t=this.prevPage,i=this.ctx;if(e.id===t?.id)return;if(e.name=this.getViewName(e.path||e.name||"",e),t&&t.id in this.pageMap&&(delete this.pageMap[t.id],i.removeView(t.id)),this.prevPage=e,i.addView(e),e.id in this.pageMap)return;this.pageMap[e.id]=e,this.sendEvent?.({event_type:_rumCore.RumEventType.VIEW,type:"pv",loading_type:"initial_load",...e});const s=i.session?.getSessionId?.()||"",a=i.session?.getUserId?.()||"";i.emitter.emit(_crash.CRASH_CONTEXT_EVENT,{session_id:s,user_id:a,view_id:e.id,view_name:e.name})};getViewName(e,t){let{parseViewName:i}=this.ctx?.getConfig(),s=t.name;return i&&(0,_rumCore.isFunction)(i)&&(s=i(e,t)||s),s}destroy(){(0,_view.removeNavigateListener)(this.onChange)}}exports.default=PvCollector;
@@ -1,37 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- /**
8
- * Expo config plugin for @arms/rum-reactnative.
9
- *
10
- * 在 app.config 中声明后,将 SDK 配置写入 `expoConfig.extra.rumSdk`,运行时可通过
11
- * `Constants.expoConfig?.extra?.rumSdk` 读取,避免在 JS 入口硬编码 endpoint。
12
- *
13
- * app.config.ts 示例:
14
- * plugins: [['@arms/rum-reactnative', { endpoint: '...', env: 'prod' }]]
15
- *
16
- * 仅做配置透传,不注入原生构建设置(podspec / gradle 已由 autolinking 处理)。
17
- * 零运行时依赖,非 Expo 用户安装本包不会拉入 @expo/* 。
18
- */
19
-
20
- /** 本插件触碰到的 expo config 切片,故意放宽以避免对 @expo/config-types 的硬依赖。 */
21
-
22
- const withRumSdk = (config, props) => {
23
- const extra = {
24
- ...(config.extra ?? {})
25
- };
26
- extra.rumSdk = {
27
- endpoint: props?.endpoint,
28
- env: props?.env ?? 'prod',
29
- version: props?.version
30
- };
31
- return {
32
- ...config,
33
- extra
34
- };
35
- };
36
- var _default = exports.default = withRumSdk;
37
- //# sourceMappingURL=expoConfigPlugin.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;const withRumSdk=(e,t)=>{const r={...e.extra??{}};return r.rumSdk={endpoint:t?.endpoint,env:t?.env??"prod",version:t?.version},{...e,extra:r}};var _default=exports.default=withRumSdk;
@@ -1,29 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "ArmsRum", {
7
- enumerable: true,
8
- get: function () {
9
- return _shell.ArmsRum;
10
- }
11
- });
12
- Object.defineProperty(exports, "callMonitored", {
13
- enumerable: true,
14
- get: function () {
15
- return _rumCore.callMonitored;
16
- }
17
- });
18
- exports.default = void 0;
19
- Object.defineProperty(exports, "logger", {
20
- enumerable: true,
21
- get: function () {
22
- return _rumCore.logger;
23
- }
24
- });
25
- var _shell = _interopRequireWildcard(require("./shell"));
26
- var _rumCore = require("@arms/rum-core");
27
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
28
- var _default = exports.default = _shell.default;
29
- //# sourceMappingURL=index.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"ArmsRum",{enumerable:!0,get:function(){return _shell.ArmsRum}}),Object.defineProperty(exports,"callMonitored",{enumerable:!0,get:function(){return _rumCore.callMonitored}}),exports.default=void 0,Object.defineProperty(exports,"logger",{enumerable:!0,get:function(){return _rumCore.logger}});var _shell=_interopRequireWildcard(require("./shell")),_rumCore=require("@arms/rum-core");function _interopRequireWildcard(e,r){if("function"==typeof WeakMap)var t=new WeakMap,o=new WeakMap;return(_interopRequireWildcard=function(e,r){if(!r&&e&&e.__esModule)return e;var n,u,l={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return l;if(n=r?o:t){if(n.has(e))return n.get(e);n.set(e,l)}for(const r in e)"default"!==r&&{}.hasOwnProperty.call(e,r)&&((u=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,r))&&(u.get||u.set)?n(l,r,u):l[r]=e[r]);return l})(e,r)}var _default=exports.default=_shell.default;
@@ -1,47 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _reactNative = require("react-native");
8
- var _rumCore = require("@arms/rum-core");
9
- var _platform = require("./utils/platform");
10
- var _shell = _interopRequireDefault(require("./shell"));
11
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
- const RumSdkModule = _reactNative.NativeModules.RumSdkModule;
13
- function initRum(config) {
14
- _shell.default.init({
15
- ...config,
16
- beforeReport(bundle) {
17
- RumSdkModule.sendEvent(JSON.stringify(bundle));
18
- return null;
19
- }
20
- });
21
- }
22
- if (RumSdkModule) {
23
- const eventEmitter = new _reactNative.NativeEventEmitter(RumSdkModule);
24
- eventEmitter.addListener('rumNativeEvent', config => {
25
- if ((0, _rumCore.isString)(config)) {
26
- try {
27
- config = JSON.parse(config);
28
- } catch (e) {
29
- console.warn('getConfig error', e);
30
- return;
31
- }
32
- }
33
- // pid 为可选配置,未提供时使用默认值(格式:react-native@{VERSION})
34
- // 这确保了即使未在ARMS控制台创建应用,SDK也能正常初始化和上报
35
- if (!config.pid) {
36
- config.pid = `react-native@${_platform.VERSION}`;
37
- }
38
- // endpoint 为必填配置,未提供时使用本地回环地址作为兜底
39
- if (!config.endpoint) {
40
- config.endpoint = `http://127.0.0.1/?version=${_platform.VERSION}`;
41
- }
42
- initRum(config);
43
- });
44
- RumSdkModule?.getConfig?.();
45
- }
46
- var _default = exports.default = _shell.default;
47
- //# sourceMappingURL=plugin.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _reactNative=require("react-native"),_rumCore=require("@arms/rum-core"),_platform=require("./utils/platform"),_shell=_interopRequireDefault(require("./shell"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const RumSdkModule=_reactNative.NativeModules.RumSdkModule;function initRum(e){_shell.default.init({...e,beforeReport:e=>(RumSdkModule.sendEvent(JSON.stringify(e)),null)})}if(RumSdkModule){new _reactNative.NativeEventEmitter(RumSdkModule).addListener("rumNativeEvent",e=>{if((0,_rumCore.isString)(e))try{e=JSON.parse(e)}catch(e){return void console.warn("getConfig error",e)}e.pid||(e.pid=`react-native@${_platform.VERSION}`),e.endpoint||(e.endpoint=`http://127.0.0.1/?version=${_platform.VERSION}`),initRum(e)}),RumSdkModule?.getConfig?.()}var _default=exports.default=_shell.default;
@@ -1,27 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _base = require("../utils/base");
8
- var _view = require("../utils/view");
9
- class DefaultProcessor {
10
- name = 'default-processor';
11
- process(ctx) {
12
- const event = ctx.getRumEvent();
13
- const view = (0, _view.getCurView)(ctx);
14
- const session_id = ctx.session.getSessionId();
15
- const event_id = ctx.session.getEventId();
16
- const rumEvent = {
17
- timestamp: (0, _base.getCurrentTime)(),
18
- session_id,
19
- event_id,
20
- view,
21
- ...event
22
- };
23
- return rumEvent;
24
- }
25
- }
26
- exports.default = DefaultProcessor;
27
- //# sourceMappingURL=default-processor.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _base=require("../utils/base"),_view=require("../utils/view");class DefaultProcessor{name="default-processor";process(e){const s=e.getRumEvent(),t=(0,_view.getCurView)(e),r=e.session.getSessionId(),i=e.session.getEventId();return{timestamp:(0,_base.getCurrentTime)(),session_id:r,event_id:i,view:t,...s}}}exports.default=DefaultProcessor;
@@ -1,47 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _rumCore = require("@arms/rum-core");
8
- var _crash = require("../types/crash");
9
- var _view = require("../utils/view");
10
- class SessionProcessor {
11
- name = 'session-processor';
12
- lastSessionId = '';
13
- setup(ctx) {
14
- this.ctx = ctx;
15
- this.update = (0, _rumCore.debounce)(this.update, _rumCore.ONE_SECOND);
16
- // 延迟到下一个事件循环执行,确保 collectors 已完成 setup 并注册了
17
- // CRASH_CONTEXT_EVENT 监听器(rum-core 中 processors.setup() 先于
18
- // collectors.setup() 执行)。消除 session 创建后 1 秒内的 context
19
- // 同步窗口,同时避免 emit 事件因无监听器而被丢弃
20
- setTimeout(() => this.syncCrashContext(), 0);
21
- // sdk.onTouchStart(this.update)
22
- }
23
- update = e => {
24
- if (e && !e.isTrusted) return;
25
- this.ctx?.session.updateSession();
26
- this.syncCrashContext();
27
- };
28
- process(ctx) {
29
- this.update();
30
- return ctx.getRumEvent();
31
- }
32
- syncCrashContext() {
33
- if (!this.ctx) return;
34
- const sessionId = this.ctx.session.getSessionId();
35
- if (sessionId === this.lastSessionId) return;
36
- this.lastSessionId = sessionId;
37
- const view = (0, _view.getCurView)(this.ctx);
38
- this.ctx.emitter.emit(_crash.CRASH_CONTEXT_EVENT, {
39
- session_id: sessionId,
40
- user_id: this.ctx.session.getUserId(),
41
- view_id: view?.id || '',
42
- view_name: view?.name || ''
43
- });
44
- }
45
- }
46
- exports.default = SessionProcessor;
47
- //# sourceMappingURL=session-processor.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _rumCore=require("@arms/rum-core"),_crash=require("../types/crash"),_view=require("../utils/view");class SessionProcessor{name="session-processor";lastSessionId="";setup(s){this.ctx=s,this.update=(0,_rumCore.debounce)(this.update,_rumCore.ONE_SECOND),setTimeout(()=>this.syncCrashContext(),0)}update=s=>{s&&!s.isTrusted||(this.ctx?.session.updateSession(),this.syncCrashContext())};process(s){return this.update(),s.getRumEvent()}syncCrashContext(){if(!this.ctx)return;const s=this.ctx.session.getSessionId();if(s===this.lastSessionId)return;this.lastSessionId=s;const e=(0,_view.getCurView)(this.ctx);this.ctx.emitter.emit(_crash.CRASH_CONTEXT_EVENT,{session_id:s,user_id:this.ctx.session.getUserId(),view_id:e?.id||"",view_name:e?.name||""})}}exports.default=SessionProcessor;
@@ -1,148 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _rumCore = require("@arms/rum-core");
8
- var _platform = require("../utils/platform");
9
- var _crash = require("../types/crash");
10
- var _reactNative = require("react-native");
11
- // @ts-ignore
12
-
13
- /**
14
- * 从 bundle.events 的 snapshots 中提取携带的 crash_id(瞬态字段)。
15
- * crash_id 由 CrashCollector 注入到 snapshots JSON 字符串中,
16
- * reporter 提取后用于 ack,并在序列化前从 snapshots 中剥离,不会发送到后端。
17
- * 兼容旧版降级路径:crash_id 可能残留在事件根级。
18
- */
19
- function extractCrashIds(bundle) {
20
- const ids = [];
21
- const events = bundle?.events;
22
- if (Array.isArray(events)) {
23
- for (const ev of events) {
24
- if (!ev) continue;
25
- // 优先从 snapshots 提取
26
- let cid;
27
- try {
28
- const snapshotsObj = JSON.parse(ev.snapshots);
29
- cid = snapshotsObj?.[_crash.CRASH_ID_FIELD];
30
- } catch {
31
- // snapshots 解析失败
32
- }
33
- // 兼容旧版降级路径:检查根级
34
- if (!cid) {
35
- cid = ev[_crash.CRASH_ID_FIELD];
36
- }
37
- if (typeof cid === 'string' && cid) ids.push(cid);
38
- }
39
- }
40
- return ids;
41
- }
42
-
43
- /**
44
- * 序列化前剥离事件上的 crash_id 瞬态字段:
45
- * - 从 snapshots JSON 字符串中移除;
46
- * - 兼容旧版降级路径:从事件根级移除。
47
- */
48
- function stripCrashIds(bundle) {
49
- const events = bundle?.events;
50
- if (!Array.isArray(events)) return;
51
- for (const ev of events) {
52
- if (!ev) continue;
53
- // 从 snapshots 中移除
54
- if (typeof ev.snapshots === 'string') {
55
- try {
56
- const snapshotsObj = JSON.parse(ev.snapshots);
57
- if (snapshotsObj && _crash.CRASH_ID_FIELD in snapshotsObj) {
58
- delete snapshotsObj[_crash.CRASH_ID_FIELD];
59
- ev.snapshots = JSON.stringify(snapshotsObj);
60
- }
61
- } catch {
62
- // snapshots 解析失败,跳过
63
- }
64
- }
65
- // 兼容旧版降级路径:从根级移除
66
- if (_crash.CRASH_ID_FIELD in ev) {
67
- delete ev[_crash.CRASH_ID_FIELD];
68
- }
69
- }
70
- }
71
-
72
- /**
73
- * rn-app reporter
74
- */
75
- class RNReporter extends _rumCore.Reporter {
76
- name = 'rn-reporter';
77
- constructor() {
78
- super();
79
- // 离开之前 flushEventQueue
80
- try {
81
- this.appStateListener = _reactNative.AppState.addEventListener('change', this.onAppStateChanged);
82
- } catch (error) {
83
- _rumCore.logger.warn('reporter', 'AppState listener binding failed', error);
84
- }
85
- }
86
- init(ctx) {
87
- this.ctx = ctx;
88
- }
89
- onAppStateChanged = nextAppState => {
90
- if (nextAppState === 'background') {
91
- // 执行后台操作:暂停动画、保存数据、停止网络请求等
92
- if (typeof this.flushEventQueue === 'function') {
93
- this.flushEventQueue();
94
- }
95
- // 后台前 flush 自监控数据
96
- _rumCore.Telemetry.get()?.flush();
97
- }
98
- // else if (nextAppState === 'active') {
99
- // console.warn('RUM:应用回到前台');
100
- // }
101
- };
102
- async request(ctx, bundle) {
103
- // 先从事件中提取崩溃 crash_id(瞬态字段),用于上报后 ack 删文件
104
- const crashIds = extractCrashIds(bundle);
105
- try {
106
- const batchedEvents = await (0, _platform.fixAttrs)(bundle);
107
- // 序列化前剥离瞬态字段,避免发送到后端
108
- stripCrashIds(batchedEvents);
109
- const config = ctx.getConfig();
110
- fetch(config.endpoint, {
111
- method: 'POST',
112
- headers: {
113
- 'Content-Type': 'text/plain'
114
- },
115
- body: JSON.stringify(batchedEvents)
116
- }).then(res => {
117
- this.ackCrashes(ctx, crashIds, !!(res && res.ok));
118
- }).catch(err => {
119
- this.catchHandle(err);
120
- this.ackCrashes(ctx, crashIds, false);
121
- });
122
- } catch (err) {
123
- this.catchHandle(err);
124
- this.ackCrashes(ctx, crashIds, false);
125
- }
126
- }
127
-
128
- /** 通过共享 emitter 通知崩溃采集器上报结果(成功则删文件,失败保留重试) */
129
- ackCrashes(ctx, crashIds, success) {
130
- if (!crashIds.length) return;
131
- try {
132
- ctx.emitter?.emit(_crash.CRASH_REPORT_ACK_EVENT, {
133
- crashIds,
134
- success
135
- });
136
- } catch (e) {
137
- _rumCore.logger.warn('reporter', 'emit crash ack failed', e);
138
- }
139
- }
140
- catchHandle = err => {
141
- _rumCore.logger.warn('reporter', 'sendRequest failed', err);
142
- };
143
- destroy() {
144
- this.appStateListener?.remove();
145
- }
146
- }
147
- var _default = exports.default = RNReporter;
148
- //# sourceMappingURL=index.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _rumCore=require("@arms/rum-core"),_platform=require("../utils/platform"),_crash=require("../types/crash"),_reactNative=require("react-native");function extractCrashIds(e){const t=[],r=e?.events;if(Array.isArray(r))for(const e of r){if(!e)continue;let r;try{const t=JSON.parse(e.snapshots);r=t?.[_crash.CRASH_ID_FIELD]}catch{}r||(r=e[_crash.CRASH_ID_FIELD]),"string"==typeof r&&r&&t.push(r)}return t}function stripCrashIds(e){const t=e?.events;if(Array.isArray(t))for(const e of t)if(e){if("string"==typeof e.snapshots)try{const t=JSON.parse(e.snapshots);t&&_crash.CRASH_ID_FIELD in t&&(delete t[_crash.CRASH_ID_FIELD],e.snapshots=JSON.stringify(t))}catch{}_crash.CRASH_ID_FIELD in e&&delete e[_crash.CRASH_ID_FIELD]}}class RNReporter extends _rumCore.Reporter{name="rn-reporter";constructor(){super();try{this.appStateListener=_reactNative.AppState.addEventListener("change",this.onAppStateChanged)}catch(e){_rumCore.logger.warn("reporter","AppState listener binding failed",e)}}init(e){this.ctx=e}onAppStateChanged=e=>{"background"===e&&("function"==typeof this.flushEventQueue&&this.flushEventQueue(),_rumCore.Telemetry.get()?.flush())};async request(e,t){const r=extractCrashIds(t);try{const s=await(0,_platform.fixAttrs)(t);stripCrashIds(s);const a=e.getConfig();fetch(a.endpoint,{method:"POST",headers:{"Content-Type":"text/plain"},body:JSON.stringify(s)}).then(t=>{this.ackCrashes(e,r,!(!t||!t.ok))}).catch(t=>{this.catchHandle(t),this.ackCrashes(e,r,!1)})}catch(t){this.catchHandle(t),this.ackCrashes(e,r,!1)}}ackCrashes(e,t,r){if(t.length)try{e.emitter?.emit(_crash.CRASH_REPORT_ACK_EVENT,{crashIds:t,success:r})}catch(e){_rumCore.logger.warn("reporter","emit crash ack failed",e)}}catchHandle=e=>{_rumCore.logger.warn("reporter","sendRequest failed",e)};destroy(){this.appStateListener?.remove()}}var _default=exports.default=RNReporter;
@@ -1,43 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.RNMonitorReporter = void 0;
7
- var _rumCore = require("@arms/rum-core");
8
- class RNMonitorReporter {
9
- constructor(endpoint) {
10
- this.endpoint = this.buildMonitorEndpoint(endpoint);
11
- }
12
- send(data) {
13
- if (!data || data.length === 0) return;
14
- try {
15
- // 使用 rum-core 的 Protobuf 编码器将数据编码为 SLS LogGroup 二进制格式
16
- const protobufBody = (0, _rumCore.convertBundlesToLogGroup)(data);
17
- fetch(this.endpoint, {
18
- method: 'POST',
19
- headers: {
20
- 'Content-Type': 'application/x-protobuf',
21
- 'x-log-apiversion': '0.6.0',
22
- 'x-log-compresstype': '',
23
- 'x-log-date': new Date().toUTCString()
24
- },
25
- body: protobufBody
26
- }).catch(() => {
27
- // 静默处理,避免反馈循环(不调用 logger)
28
- });
29
- } catch (_) {
30
- // 吞掉异常,防止自监控影响宿主应用
31
- }
32
- }
33
- buildMonitorEndpoint(endpoint) {
34
- try {
35
- const url = new URL(endpoint);
36
- return `${url.origin}/rum/monitor`;
37
- } catch (_) {
38
- return endpoint;
39
- }
40
- }
41
- }
42
- exports.RNMonitorReporter = RNMonitorReporter;
43
- //# sourceMappingURL=monitor-reporter.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.RNMonitorReporter=void 0;var _rumCore=require("@arms/rum-core");class RNMonitorReporter{constructor(o){this.endpoint=this.buildMonitorEndpoint(o)}send(o){if(o&&0!==o.length)try{const r=(0,_rumCore.convertBundlesToLogGroup)(o);fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/x-protobuf","x-log-apiversion":"0.6.0","x-log-compresstype":"","x-log-date":(new Date).toUTCString()},body:r}).catch(()=>{})}catch(o){}}buildMonitorEndpoint(o){try{return`${new URL(o).origin}/rum/monitor`}catch(r){return o}}}exports.RNMonitorReporter=RNMonitorReporter;
@@ -1,91 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = exports.ArmsRum = void 0;
7
- var _rumCore = require("@arms/rum-core");
8
- var collectors = _interopRequireWildcard(require("./collector"));
9
- var _defaultProcessor = _interopRequireDefault(require("./processor/default-processor"));
10
- var _sessionProcessor = _interopRequireDefault(require("./processor/session-processor"));
11
- var _reporter = _interopRequireDefault(require("./reporter"));
12
- var _monitorReporter = require("./reporter/monitor-reporter");
13
- var _platform = require("./utils/platform");
14
- var _session = require("./utils/session");
15
- var _view = require("./utils/view");
16
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
18
- const builtInCollectors = [...Object.values(collectors).filter(Collector => (0, _rumCore.isFunction)(Collector))];
19
- /**
20
- * 对外导出 shell 层, 所有 shell 层模型的 API 设计约定:
21
- * 1. API 命名空间按照 variables / functions / events 来组织
22
- * 2. 事件(events)的命名格式为:on[Will|Did]VerbNoun?,参考 https://code.visualstudio.com/api/references/vscode-api#events
23
- * 3. 基于 Disposable 模式,对于事件的绑定、快捷键的绑定函数,返回值则是解绑函数
24
- */
25
- class ArmsRum extends _rumCore.Shell {
26
- version = _platform.VERSION;
27
-
28
- /**
29
- * 初始化
30
- */
31
- init(config) {
32
- this.client.useCollectors(builtInCollectors.map(Collector => (0, _rumCore.callMonitored)(() => new Collector(), undefined, [], 'shell', `init ${Collector.name}`)).filter(Boolean));
33
- this.client.useProcessors([new _defaultProcessor.default(), new _sessionProcessor.default()]);
34
- this.client.useReporter(new _reporter.default());
35
- // 传入 MonitorReporter 激活自监控
36
- const monitorReporter = config.endpoint ? new _monitorReporter.RNMonitorReporter(config.endpoint) : undefined;
37
- this.client.init(config, new _session.RumSession(), undefined, monitorReporter);
38
- return this;
39
- }
40
-
41
- /**
42
- * set config
43
- */
44
-
45
- setConfig(...params) {
46
- const ctx = this.client.getContext();
47
- if (params.length === 2) {
48
- const oldConfig = ctx.getConfig();
49
- ctx.setConfig({
50
- ...oldConfig,
51
- [params[0]]: params[1]
52
- });
53
- } else {
54
- ctx.setConfig(params[0]);
55
- }
56
- }
57
-
58
- /**
59
- * 开启路由变化监听,自动采集 PV 数据
60
- *
61
- * 必须在 NavigationContainer 的 `onReady` 回调中调用,以确保
62
- * navigationRef 已正确初始化。
63
- *
64
- * @example
65
- * ```tsx
66
- * <NavigationContainer
67
- * ref={navigationRef}
68
- * onReady={() => {
69
- * ArmsRum.startTrackingViews(navigationRef);
70
- * }}
71
- * >
72
- * ...
73
- * </NavigationContainer>
74
- * ```
75
- *
76
- * @param navigationRef - NavigationContainer 的 ref 引用
77
- */
78
- startTrackingViews(navigationRef) {
79
- if (!navigationRef) return;
80
- (0, _view.startTrackingViews)(navigationRef);
81
- }
82
- stopTrackingViews() {
83
- (0, _view.stopTrackingViews)();
84
- }
85
- getCollector(name) {
86
- return this.client.getCollectors().find(collector => collector.name === name);
87
- }
88
- }
89
- exports.ArmsRum = ArmsRum;
90
- var _default = exports.default = new ArmsRum();
91
- //# sourceMappingURL=shell.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.ArmsRum=void 0;var _rumCore=require("@arms/rum-core"),collectors=_interopRequireWildcard(require("./collector")),_defaultProcessor=_interopRequireDefault(require("./processor/default-processor")),_sessionProcessor=_interopRequireDefault(require("./processor/session-processor")),_reporter=_interopRequireDefault(require("./reporter")),_monitorReporter=require("./reporter/monitor-reporter"),_platform=require("./utils/platform"),_session=require("./utils/session"),_view=require("./utils/view");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _interopRequireWildcard(e,r){if("function"==typeof WeakMap)var t=new WeakMap,o=new WeakMap;return(_interopRequireWildcard=function(e,r){if(!r&&e&&e.__esModule)return e;var i,s,n={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return n;if(i=r?o:t){if(i.has(e))return i.get(e);i.set(e,n)}for(const r in e)"default"!==r&&{}.hasOwnProperty.call(e,r)&&((s=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,r))&&(s.get||s.set)?i(n,r,s):n[r]=e[r]);return n})(e,r)}const builtInCollectors=[...Object.values(collectors).filter(e=>(0,_rumCore.isFunction)(e))];class ArmsRum extends _rumCore.Shell{version=_platform.VERSION;init(e){this.client.useCollectors(builtInCollectors.map(e=>(0,_rumCore.callMonitored)(()=>new e,void 0,[],"shell",`init ${e.name}`)).filter(Boolean)),this.client.useProcessors([new _defaultProcessor.default,new _sessionProcessor.default]),this.client.useReporter(new _reporter.default);const r=e.endpoint?new _monitorReporter.RNMonitorReporter(e.endpoint):void 0;return this.client.init(e,new _session.RumSession,void 0,r),this}setConfig(...e){const r=this.client.getContext();if(2===e.length){const t=r.getConfig();r.setConfig({...t,[e[0]]:e[1]})}else r.setConfig(e[0])}startTrackingViews(e){e&&(0,_view.startTrackingViews)(e)}stopTrackingViews(){(0,_view.stopTrackingViews)()}getCollector(e){return this.client.getCollectors().find(r=>r.name===e)}}exports.ArmsRum=ArmsRum;var _default=exports.default=new ArmsRum;
@@ -1,6 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- //# sourceMappingURL=client.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});
@@ -1,37 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.CRASH_REPORT_ACK_EVENT = exports.CRASH_ID_FIELD = exports.CRASH_CONTEXT_EVENT = void 0;
7
- /**
8
- * 崩溃相关类型定义
9
- */
10
-
11
- /** 崩溃上下文同步事件名 */
12
- const CRASH_CONTEXT_EVENT = exports.CRASH_CONTEXT_EVENT = 'crash_context_change';
13
-
14
- /** 崩溃上报确认事件名(reporter -> crash collector,用于 ack 后删除文件) */
15
- const CRASH_REPORT_ACK_EVENT = exports.CRASH_REPORT_ACK_EVENT = 'crash_report_ack';
16
-
17
- /**
18
- * 挂在崩溃 RumEvent 上的瞬态字段名,携带 crash_id。
19
- * reporter 上报前提取用于 ack、并在序列化前剥离,不会发送到后端。
20
- */
21
- const CRASH_ID_FIELD = exports.CRASH_ID_FIELD = '__rum_crash_id';
22
-
23
- /** 崩溃上报确认事件负载 */
24
-
25
- /**
26
- * 崩溃上下文快照(session / view 变更时同步到原生侧)。
27
- */
28
-
29
- /**
30
- * 原生崩溃栈帧数据结构。
31
- */
32
-
33
- /**
34
- * 原生崩溃数据结构(与原生侧 RumCrashReporter / CrashContextManager 写入的 JSON 对齐)。
35
- * 仅声明 JS 层会用到的字段,未列出的字段会通过 snapshots 透传给后端。
36
- */
37
- //# sourceMappingURL=crash.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CRASH_REPORT_ACK_EVENT=exports.CRASH_ID_FIELD=exports.CRASH_CONTEXT_EVENT=void 0;const CRASH_CONTEXT_EVENT=exports.CRASH_CONTEXT_EVENT="crash_context_change",CRASH_REPORT_ACK_EVENT=exports.CRASH_REPORT_ACK_EVENT="crash_report_ack",CRASH_ID_FIELD=exports.CRASH_ID_FIELD="__rum_crash_id";
@@ -1,2 +1 @@
1
- "use strict";
2
- //# sourceMappingURL=index.js.map
1
+ "use strict";
@@ -0,0 +1 @@
1
+ "use strict";