@arms/rum-core 0.1.5 → 0.1.6

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.
@@ -0,0 +1,46 @@
1
+ export type MonitorLogLevel = 'debug' | 'info' | 'warn' | 'error' | 'crash';
2
+ export interface MonitorLogEvent {
3
+ level: MonitorLogLevel;
4
+ content: string;
5
+ stack?: string;
6
+ type?: string;
7
+ [key: string]: unknown;
8
+ }
9
+ export interface MonitorEventBundle {
10
+ 'app.type': string;
11
+ _v: string;
12
+ endpoint: string;
13
+ 'session.id'?: string;
14
+ 'view.id'?: string;
15
+ timestamp: number;
16
+ event_type: 'log';
17
+ log?: MonitorLogEvent;
18
+ [key: string]: unknown;
19
+ }
20
+ export interface IMonitorReporter {
21
+ send(data: MonitorEventBundle[]): void;
22
+ }
23
+ /**
24
+ * 自监控配置
25
+ */
26
+ export interface ISelfMonitorConfig {
27
+ /**
28
+ * 是否启用自监控,默认 true
29
+ */
30
+ enable?: boolean;
31
+ /**
32
+ * 采样率,取值范围 0 - 100,支持小数(如 50.5 表示 50.5%)
33
+ * 所有级别日志统一受采样率控制
34
+ */
35
+ sampling?: number;
36
+ /**
37
+ * 是否在浏览器控制台输出自监控日志,默认 false
38
+ * 设为 true 时,所有级别日志会同时输出到控制台
39
+ */
40
+ console?: boolean;
41
+ /**
42
+ * 需要上报到 Telemetry 的日志级别列表
43
+ * 默认值: ['debug', 'error', 'crash']
44
+ */
45
+ reportLevels?: MonitorLogLevel[];
46
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
@@ -5,6 +5,7 @@ import { RumEvent, RumEventBundle, IViewData } from './rum-event';
5
5
  import { MatchOption } from '../utils/match';
6
6
  import { IConfigManager } from './config';
7
7
  import { EventEmitter } from '../utils/events';
8
+ import { ISelfMonitorConfig, IMonitorReporter } from '../monitor/types';
8
9
  export declare enum EventType {
9
10
  /**
10
11
  * 收集数据
@@ -54,6 +55,10 @@ export interface IReportConfig {
54
55
  }
55
56
  export interface IRumSession {
56
57
  init(ctx: IContext): void;
58
+ /** 平台类型标识,如 'browser'/'miniapp' */
59
+ appType: string;
60
+ /** SDK 版本号 */
61
+ sdkVersion: string;
57
62
  sessionConfig: SessionConfig;
58
63
  getSessionId: () => string;
59
64
  getSampled: () => boolean;
@@ -110,7 +115,7 @@ export interface IClient {
110
115
  /**
111
116
  * 初始化
112
117
  */
113
- init: (configuration: IConfiguration, rumSession?: IRumSession, configManager?: IConfigManager) => void;
118
+ init: (configuration: IConfiguration, rumSession?: IRumSession, configManager?: IConfigManager, monitorReporter?: IMonitorReporter) => void;
114
119
  /**
115
120
  * 业务自定义上传数据
116
121
  */
@@ -235,5 +240,13 @@ export interface IConfiguration {
235
240
  attributeName: string;
236
241
  attributeValue?: Array<string | RegExp> | null;
237
242
  }>;
243
+ /**
244
+ * 自监控(Self-Monitor)配置
245
+ * 用于控制 SDK 内部异常和错误的自动上报行为
246
+ * - `boolean`: 简单启用/禁用自监控
247
+ * - `ISelfMonitorConfig`: 详细配置,可指定采样率等
248
+ * @default true
249
+ */
250
+ selfMonitor?: boolean | ISelfMonitorConfig;
238
251
  [key: string]: unknown;
239
252
  }
package/lib/utils/base.js CHANGED
@@ -38,9 +38,9 @@ function interceptFunction(target, name, callback, isPrototype) {
38
38
  */
39
39
  function restoreFunction(target, name) {
40
40
  var proxyMethod = target[name];
41
- if ((0, _is.isFunction)(proxyMethod)) return;
41
+ if (!(0, _is.isFunction)(proxyMethod)) return;
42
42
  var originalMethod = proxyMethod._rum_intercepted;
43
- if ((0, _is.isFunction)(originalMethod)) return;
43
+ if (!(0, _is.isFunction)(originalMethod)) return;
44
44
  target[name] = originalMethod;
45
45
  }
46
46
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.EventEmitter = void 0;
5
+ var _logger = require("../monitor/logger");
5
6
  var EventEmitter = exports.EventEmitter = /*#__PURE__*/function () {
6
7
  function EventEmitter() {
7
8
  this.events = {};
@@ -36,7 +37,7 @@ var EventEmitter = exports.EventEmitter = /*#__PURE__*/function () {
36
37
  try {
37
38
  handlersCopy[i].apply(handlersCopy, args);
38
39
  } catch (err) {
39
- console.error("Error in handler for \"" + eventName + "\":", err);
40
+ _logger.logger.error('EventEmitter', "Error in handler for \"" + eventName + "\"", err);
40
41
  }
41
42
  }
42
43
  }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * SLS LogGroup Protobuf 编码器(最小化实现,零外部依赖)
3
+ *
4
+ * Schema:
5
+ * message Log {
6
+ * required uint32 Time = 1;
7
+ * message Content { required string Key = 1; required string Value = 2; }
8
+ * repeated Content Contents = 2;
9
+ * }
10
+ * message LogTag { required string Key = 1; required string Value = 2; }
11
+ * message LogGroup {
12
+ * repeated Log Logs = 1;
13
+ * optional string Topic = 3;
14
+ * optional string Source = 4;
15
+ * repeated LogTag LogTags = 6;
16
+ * }
17
+ */
18
+ export declare function encodeLogGroup(logs: Array<{
19
+ time: number;
20
+ contents: Array<{
21
+ key: string;
22
+ value: string;
23
+ }>;
24
+ }>, topic?: string, source?: string): Uint8Array;
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.encodeLogGroup = encodeLogGroup;
5
+ /**
6
+ * SLS LogGroup Protobuf 编码器(最小化实现,零外部依赖)
7
+ *
8
+ * Schema:
9
+ * message Log {
10
+ * required uint32 Time = 1;
11
+ * message Content { required string Key = 1; required string Value = 2; }
12
+ * repeated Content Contents = 2;
13
+ * }
14
+ * message LogTag { required string Key = 1; required string Value = 2; }
15
+ * message LogGroup {
16
+ * repeated Log Logs = 1;
17
+ * optional string Topic = 3;
18
+ * optional string Source = 4;
19
+ * repeated LogTag LogTags = 6;
20
+ * }
21
+ */
22
+
23
+ var WIRE_TYPE_VARINT = 0;
24
+ var WIRE_TYPE_LEN = 2;
25
+
26
+ /**
27
+ * UTF-8 编码 fallback(当 TextEncoder 不可用时使用,如部分小程序环境)
28
+ */
29
+ function encodeUtf8Fallback(str) {
30
+ var bytes = [];
31
+ for (var i = 0; i < str.length; i++) {
32
+ var charCode = str.charCodeAt(i);
33
+ if (charCode < 0x80) {
34
+ bytes.push(charCode);
35
+ } else if (charCode < 0x800) {
36
+ bytes.push(0xc0 | charCode >> 6);
37
+ bytes.push(0x80 | charCode & 0x3f);
38
+ } else if (charCode >= 0xd800 && charCode <= 0xdbff) {
39
+ // 代理对处理
40
+ i++;
41
+ var low = str.charCodeAt(i);
42
+ charCode = 0x10000 + (charCode - 0xd800 << 10) + (low - 0xdc00);
43
+ bytes.push(0xf0 | charCode >> 18);
44
+ bytes.push(0x80 | charCode >> 12 & 0x3f);
45
+ bytes.push(0x80 | charCode >> 6 & 0x3f);
46
+ bytes.push(0x80 | charCode & 0x3f);
47
+ } else {
48
+ bytes.push(0xe0 | charCode >> 12);
49
+ bytes.push(0x80 | charCode >> 6 & 0x3f);
50
+ bytes.push(0x80 | charCode & 0x3f);
51
+ }
52
+ }
53
+ return new Uint8Array(bytes);
54
+ }
55
+ var utf8Encoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : {
56
+ encode: encodeUtf8Fallback
57
+ };
58
+ var ProtobufWriter = /*#__PURE__*/function () {
59
+ function ProtobufWriter() {
60
+ this.buf = [];
61
+ }
62
+ var _proto = ProtobufWriter.prototype;
63
+ _proto.writeVarint = function writeVarint(value) {
64
+ // Base-128 可变长整数编码(仅处理非负整数)
65
+ var v = value >>> 0;
66
+ while (v > 0x7f) {
67
+ this.buf.push(v & 0x7f | 0x80);
68
+ v = v >>> 7;
69
+ }
70
+ this.buf.push(v & 0x7f);
71
+ };
72
+ _proto.writeTag = function writeTag(fieldNumber, wireType) {
73
+ this.writeVarint(fieldNumber << 3 | wireType);
74
+ };
75
+ _proto.writeString = function writeString(fieldNumber, value) {
76
+ var bytes = utf8Encoder.encode(value);
77
+ this.writeTag(fieldNumber, WIRE_TYPE_LEN);
78
+ this.writeVarint(bytes.length);
79
+ for (var i = 0; i < bytes.length; i++) {
80
+ this.buf.push(bytes[i]);
81
+ }
82
+ };
83
+ _proto.writeUint32 = function writeUint32(fieldNumber, value) {
84
+ this.writeTag(fieldNumber, WIRE_TYPE_VARINT);
85
+ this.writeVarint(value);
86
+ };
87
+ _proto.writeBytes = function writeBytes(fieldNumber, data) {
88
+ this.writeTag(fieldNumber, WIRE_TYPE_LEN);
89
+ this.writeVarint(data.length);
90
+ for (var i = 0; i < data.length; i++) {
91
+ this.buf.push(data[i]);
92
+ }
93
+ };
94
+ _proto.finish = function finish() {
95
+ return new Uint8Array(this.buf);
96
+ };
97
+ return ProtobufWriter;
98
+ }();
99
+ function encodeContent(key, value) {
100
+ var w = new ProtobufWriter();
101
+ w.writeString(1, key);
102
+ w.writeString(2, value);
103
+ return w.finish();
104
+ }
105
+ function encodeLog(time, contents) {
106
+ var w = new ProtobufWriter();
107
+ w.writeUint32(1, time);
108
+ for (var i = 0; i < contents.length; i++) {
109
+ var c = contents[i];
110
+ w.writeBytes(2, encodeContent(c.key, c.value));
111
+ }
112
+ return w.finish();
113
+ }
114
+ function encodeLogGroup(logs, topic, source) {
115
+ var w = new ProtobufWriter();
116
+ for (var i = 0; i < logs.length; i++) {
117
+ var log = logs[i];
118
+ w.writeBytes(1, encodeLog(log.time, log.contents));
119
+ }
120
+ if (topic !== undefined) {
121
+ w.writeString(3, topic);
122
+ }
123
+ if (source !== undefined) {
124
+ w.writeString(4, source);
125
+ }
126
+ return w.finish();
127
+ }
package/package.json CHANGED
@@ -1,11 +1,20 @@
1
1
  {
2
2
  "name": "@arms/rum-core",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "arms rum javascript sdk core",
5
5
  "author": "guangli.fj <guangli.fj@alibaba-inc.com>",
6
6
  "license": "ISC",
7
7
  "main": "lib/index.js",
8
8
  "module": "es/index.js",
9
+ "types": "es/index.d.ts",
10
+ "sideEffects": false,
11
+ "exports": {
12
+ ".": {
13
+ "types": "./es/index.d.ts",
14
+ "import": "./es/index.js",
15
+ "require": "./lib/index.js"
16
+ }
17
+ },
9
18
  "directories": {
10
19
  "lib": "lib",
11
20
  "es": "es",