@arms/rum-core 0.0.38 → 0.0.40
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/es/model/reporter.d.ts +1 -0
- package/es/model/reporter.js +10 -3
- package/es/types/client.d.ts +2 -1
- package/es/types/rum-event.d.ts +1 -0
- package/es/utils/base.js +8 -9
- package/es/utils/url.d.ts +2 -0
- package/es/utils/url.js +61 -0
- package/lib/model/reporter.d.ts +1 -0
- package/lib/model/reporter.js +11 -3
- package/lib/types/client.d.ts +2 -1
- package/lib/types/rum-event.d.ts +1 -0
- package/lib/utils/base.js +8 -9
- package/lib/utils/url.d.ts +2 -0
- package/lib/utils/url.js +65 -0
- package/package.json +2 -2
package/es/model/reporter.d.ts
CHANGED
package/es/model/reporter.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
1
2
|
import { RumEventType } from '../types/rum-event';
|
|
2
3
|
import { getErrorID } from '../utils/exception';
|
|
3
4
|
import { isNumber, isObject, isString } from "../utils/is";
|
|
4
5
|
import { verifyProperties } from "../utils/verify";
|
|
6
|
+
import { getUrlParams } from "../utils/url";
|
|
5
7
|
var FLUSH_TIME = 3000;
|
|
6
8
|
var MAX_EVENT_COUNT = 20;
|
|
7
9
|
var attrs = ['app', 'user', 'device', 'os', 'geo', 'isp', 'net', 'properties'];
|
|
@@ -15,6 +17,7 @@ var Reporter = /*#__PURE__*/function () {
|
|
|
15
17
|
this.eventQueue = [];
|
|
16
18
|
this.ctx = void 0;
|
|
17
19
|
this.timer = void 0;
|
|
20
|
+
this._init = false;
|
|
18
21
|
}
|
|
19
22
|
var _proto = Reporter.prototype;
|
|
20
23
|
_proto.getReportCfg = function getReportCfg() {
|
|
@@ -33,7 +36,10 @@ var Reporter = /*#__PURE__*/function () {
|
|
|
33
36
|
_proto.report = function report(ctx) {
|
|
34
37
|
var _this = this;
|
|
35
38
|
this.ctx = ctx;
|
|
36
|
-
this.
|
|
39
|
+
if (!this._init) {
|
|
40
|
+
this.init(ctx);
|
|
41
|
+
this._init = true;
|
|
42
|
+
}
|
|
37
43
|
clearTimeout(this.timer);
|
|
38
44
|
this.pushToQueue();
|
|
39
45
|
var reportConfig = this.getReportCfg();
|
|
@@ -139,7 +145,8 @@ var Reporter = /*#__PURE__*/function () {
|
|
|
139
145
|
}
|
|
140
146
|
}
|
|
141
147
|
if (events.length === 0) return;
|
|
142
|
-
var
|
|
148
|
+
var extend = getUrlParams(config.endpoint);
|
|
149
|
+
var bundle = _extends({
|
|
143
150
|
app: {
|
|
144
151
|
id: config.pid,
|
|
145
152
|
env: config.env || 'prod',
|
|
@@ -155,7 +162,7 @@ var Reporter = /*#__PURE__*/function () {
|
|
|
155
162
|
net: {},
|
|
156
163
|
view: view,
|
|
157
164
|
events: events
|
|
158
|
-
};
|
|
165
|
+
}, extend);
|
|
159
166
|
attrs.forEach(function (key) {
|
|
160
167
|
var obj = config[key];
|
|
161
168
|
isObject(obj) && Object.keys(obj).forEach(function (k) {
|
package/es/types/client.d.ts
CHANGED
package/es/types/rum-event.d.ts
CHANGED
package/es/utils/base.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { isFunction } from "./is";
|
|
2
2
|
|
|
3
|
-
// 插值前缀
|
|
4
|
-
var PRE_SUF_FIX = '__';
|
|
5
3
|
// 类型匹配正则
|
|
6
4
|
var TYPE_REG = /^\[object ([a-z]*)\]$/;
|
|
7
5
|
|
|
@@ -13,8 +11,7 @@ export function interceptFunction(target, name, callback, isPrototype) {
|
|
|
13
11
|
isPrototype = false;
|
|
14
12
|
}
|
|
15
13
|
var registeredMethod = target[name];
|
|
16
|
-
|
|
17
|
-
target[name] = function () {
|
|
14
|
+
var proxyMethod = function proxyMethod() {
|
|
18
15
|
var ctx = isPrototype ? this : target;
|
|
19
16
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
20
17
|
args[_key] = arguments[_key];
|
|
@@ -24,17 +21,19 @@ export function interceptFunction(target, name, callback, isPrototype) {
|
|
|
24
21
|
return registeredMethod.apply(ctx, args);
|
|
25
22
|
}
|
|
26
23
|
};
|
|
24
|
+
proxyMethod._rum_intercepted = registeredMethod;
|
|
25
|
+
target[name] = proxyMethod;
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
/**
|
|
30
29
|
* 还原函数
|
|
31
30
|
*/
|
|
32
31
|
export function restoreFunction(target, name) {
|
|
33
|
-
var
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
var proxyMethod = target[name];
|
|
33
|
+
if (isFunction(proxyMethod)) return;
|
|
34
|
+
var originalMethod = proxyMethod._rum_intercepted;
|
|
35
|
+
if (isFunction(originalMethod)) return;
|
|
36
|
+
target[name] = originalMethod;
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
/**
|
package/es/utils/url.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
var safeDecode = function safeDecode(str) {
|
|
2
|
+
// 添加空值检查
|
|
3
|
+
if (str.length === 0) return "";
|
|
4
|
+
try {
|
|
5
|
+
// 先处理加号,然后进行 URL 解码
|
|
6
|
+
return decodeURIComponent(str.replace(/\+/g, ' '));
|
|
7
|
+
} catch (_unused) {
|
|
8
|
+
// 解码失败时的降级处理:处理常见的 URL 编码字符
|
|
9
|
+
return str.replace(/\+/g, ' ').replace(/%20/g, ' ').replace(/%2F/g, '/').replace(/%3D/g, '=').replace(/%26/g, '&').replace(/%3F/g, '?');
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
var getQueryString = function getQueryString(input) {
|
|
13
|
+
// 添加空值检查
|
|
14
|
+
if (input.length === 0) return "";
|
|
15
|
+
|
|
16
|
+
// 移除 hash 部分,然后提取查询字符串
|
|
17
|
+
var hashIndex = input.indexOf('#');
|
|
18
|
+
var withoutHash = hashIndex >= 0 ? input.slice(0, hashIndex) : input;
|
|
19
|
+
var queryStart = withoutHash.indexOf('?');
|
|
20
|
+
if (queryStart === -1) return "";
|
|
21
|
+
return withoutHash.slice(queryStart + 1);
|
|
22
|
+
};
|
|
23
|
+
export function getUrlParams(input) {
|
|
24
|
+
// 输入验证:检查是否为有效字符串
|
|
25
|
+
if (typeof input !== 'string' || !input.trim()) return {};
|
|
26
|
+
var params = {};
|
|
27
|
+
var query = getQueryString(input);
|
|
28
|
+
|
|
29
|
+
// 提前检查空查询
|
|
30
|
+
if (!query) return params;
|
|
31
|
+
|
|
32
|
+
// 使用 for 循环提高性能
|
|
33
|
+
var pairs = query.split('&');
|
|
34
|
+
for (var i = 0; i < pairs.length; i++) {
|
|
35
|
+
var pair = pairs[i];
|
|
36
|
+
|
|
37
|
+
// 跳过空键值对
|
|
38
|
+
if (!pair) continue;
|
|
39
|
+
|
|
40
|
+
// 查找第一个等号作为分隔符
|
|
41
|
+
var separatorIndex = pair.indexOf('=');
|
|
42
|
+
// 检查键是否存在且不为空
|
|
43
|
+
if (separatorIndex <= 0) continue;
|
|
44
|
+
var key = safeDecode(pair.slice(0, separatorIndex));
|
|
45
|
+
// 处理值为空的情况(如 key=)
|
|
46
|
+
var value = separatorIndex < pair.length - 1 ? safeDecode(pair.slice(separatorIndex + 1)) : "";
|
|
47
|
+
|
|
48
|
+
// 处理重复键:将单个值转换为数组
|
|
49
|
+
var existing = params[key];
|
|
50
|
+
if (existing !== undefined) {
|
|
51
|
+
if (Array.isArray(existing)) {
|
|
52
|
+
existing.push(value);
|
|
53
|
+
} else {
|
|
54
|
+
params[key] = [existing, value];
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
params[key] = value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return params;
|
|
61
|
+
}
|
package/lib/model/reporter.d.ts
CHANGED
package/lib/model/reporter.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
exports.__esModule = true;
|
|
4
5
|
exports["default"] = void 0;
|
|
6
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
5
7
|
var _rumEvent = require("../types/rum-event");
|
|
6
8
|
var _exception = require("../utils/exception");
|
|
7
9
|
var _is = require("../utils/is");
|
|
8
10
|
var _verify = require("../utils/verify");
|
|
11
|
+
var _url = require("../utils/url");
|
|
9
12
|
var FLUSH_TIME = 3000;
|
|
10
13
|
var MAX_EVENT_COUNT = 20;
|
|
11
14
|
var attrs = ['app', 'user', 'device', 'os', 'geo', 'isp', 'net', 'properties'];
|
|
@@ -19,6 +22,7 @@ var Reporter = exports["default"] = /*#__PURE__*/function () {
|
|
|
19
22
|
this.eventQueue = [];
|
|
20
23
|
this.ctx = void 0;
|
|
21
24
|
this.timer = void 0;
|
|
25
|
+
this._init = false;
|
|
22
26
|
}
|
|
23
27
|
var _proto = Reporter.prototype;
|
|
24
28
|
_proto.getReportCfg = function getReportCfg() {
|
|
@@ -37,7 +41,10 @@ var Reporter = exports["default"] = /*#__PURE__*/function () {
|
|
|
37
41
|
_proto.report = function report(ctx) {
|
|
38
42
|
var _this = this;
|
|
39
43
|
this.ctx = ctx;
|
|
40
|
-
this.
|
|
44
|
+
if (!this._init) {
|
|
45
|
+
this.init(ctx);
|
|
46
|
+
this._init = true;
|
|
47
|
+
}
|
|
41
48
|
clearTimeout(this.timer);
|
|
42
49
|
this.pushToQueue();
|
|
43
50
|
var reportConfig = this.getReportCfg();
|
|
@@ -143,7 +150,8 @@ var Reporter = exports["default"] = /*#__PURE__*/function () {
|
|
|
143
150
|
}
|
|
144
151
|
}
|
|
145
152
|
if (events.length === 0) return;
|
|
146
|
-
var
|
|
153
|
+
var extend = (0, _url.getUrlParams)(config.endpoint);
|
|
154
|
+
var bundle = (0, _extends2["default"])({
|
|
147
155
|
app: {
|
|
148
156
|
id: config.pid,
|
|
149
157
|
env: config.env || 'prod',
|
|
@@ -159,7 +167,7 @@ var Reporter = exports["default"] = /*#__PURE__*/function () {
|
|
|
159
167
|
net: {},
|
|
160
168
|
view: view,
|
|
161
169
|
events: events
|
|
162
|
-
};
|
|
170
|
+
}, extend);
|
|
163
171
|
attrs.forEach(function (key) {
|
|
164
172
|
var obj = config[key];
|
|
165
173
|
(0, _is.isObject)(obj) && Object.keys(obj).forEach(function (k) {
|
package/lib/types/client.d.ts
CHANGED
package/lib/types/rum-event.d.ts
CHANGED
package/lib/utils/base.js
CHANGED
|
@@ -13,8 +13,6 @@ exports.restoreFunction = restoreFunction;
|
|
|
13
13
|
exports.toRegFormat = toRegFormat;
|
|
14
14
|
exports.transStrToReg = transStrToReg;
|
|
15
15
|
var _is = require("./is");
|
|
16
|
-
// 插值前缀
|
|
17
|
-
var PRE_SUF_FIX = '__';
|
|
18
16
|
// 类型匹配正则
|
|
19
17
|
var TYPE_REG = /^\[object ([a-z]*)\]$/;
|
|
20
18
|
|
|
@@ -26,8 +24,7 @@ function interceptFunction(target, name, callback, isPrototype) {
|
|
|
26
24
|
isPrototype = false;
|
|
27
25
|
}
|
|
28
26
|
var registeredMethod = target[name];
|
|
29
|
-
|
|
30
|
-
target[name] = function () {
|
|
27
|
+
var proxyMethod = function proxyMethod() {
|
|
31
28
|
var ctx = isPrototype ? this : target;
|
|
32
29
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
33
30
|
args[_key] = arguments[_key];
|
|
@@ -37,17 +34,19 @@ function interceptFunction(target, name, callback, isPrototype) {
|
|
|
37
34
|
return registeredMethod.apply(ctx, args);
|
|
38
35
|
}
|
|
39
36
|
};
|
|
37
|
+
proxyMethod._rum_intercepted = registeredMethod;
|
|
38
|
+
target[name] = proxyMethod;
|
|
40
39
|
}
|
|
41
40
|
|
|
42
41
|
/**
|
|
43
42
|
* 还原函数
|
|
44
43
|
*/
|
|
45
44
|
function restoreFunction(target, name) {
|
|
46
|
-
var
|
|
47
|
-
if (
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
var proxyMethod = target[name];
|
|
46
|
+
if ((0, _is.isFunction)(proxyMethod)) return;
|
|
47
|
+
var originalMethod = proxyMethod._rum_intercepted;
|
|
48
|
+
if ((0, _is.isFunction)(originalMethod)) return;
|
|
49
|
+
target[name] = originalMethod;
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
/**
|
package/lib/utils/url.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.getUrlParams = getUrlParams;
|
|
5
|
+
var safeDecode = function safeDecode(str) {
|
|
6
|
+
// 添加空值检查
|
|
7
|
+
if (str.length === 0) return "";
|
|
8
|
+
try {
|
|
9
|
+
// 先处理加号,然后进行 URL 解码
|
|
10
|
+
return decodeURIComponent(str.replace(/\+/g, ' '));
|
|
11
|
+
} catch (_unused) {
|
|
12
|
+
// 解码失败时的降级处理:处理常见的 URL 编码字符
|
|
13
|
+
return str.replace(/\+/g, ' ').replace(/%20/g, ' ').replace(/%2F/g, '/').replace(/%3D/g, '=').replace(/%26/g, '&').replace(/%3F/g, '?');
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var getQueryString = function getQueryString(input) {
|
|
17
|
+
// 添加空值检查
|
|
18
|
+
if (input.length === 0) return "";
|
|
19
|
+
|
|
20
|
+
// 移除 hash 部分,然后提取查询字符串
|
|
21
|
+
var hashIndex = input.indexOf('#');
|
|
22
|
+
var withoutHash = hashIndex >= 0 ? input.slice(0, hashIndex) : input;
|
|
23
|
+
var queryStart = withoutHash.indexOf('?');
|
|
24
|
+
if (queryStart === -1) return "";
|
|
25
|
+
return withoutHash.slice(queryStart + 1);
|
|
26
|
+
};
|
|
27
|
+
function getUrlParams(input) {
|
|
28
|
+
// 输入验证:检查是否为有效字符串
|
|
29
|
+
if (typeof input !== 'string' || !input.trim()) return {};
|
|
30
|
+
var params = {};
|
|
31
|
+
var query = getQueryString(input);
|
|
32
|
+
|
|
33
|
+
// 提前检查空查询
|
|
34
|
+
if (!query) return params;
|
|
35
|
+
|
|
36
|
+
// 使用 for 循环提高性能
|
|
37
|
+
var pairs = query.split('&');
|
|
38
|
+
for (var i = 0; i < pairs.length; i++) {
|
|
39
|
+
var pair = pairs[i];
|
|
40
|
+
|
|
41
|
+
// 跳过空键值对
|
|
42
|
+
if (!pair) continue;
|
|
43
|
+
|
|
44
|
+
// 查找第一个等号作为分隔符
|
|
45
|
+
var separatorIndex = pair.indexOf('=');
|
|
46
|
+
// 检查键是否存在且不为空
|
|
47
|
+
if (separatorIndex <= 0) continue;
|
|
48
|
+
var key = safeDecode(pair.slice(0, separatorIndex));
|
|
49
|
+
// 处理值为空的情况(如 key=)
|
|
50
|
+
var value = separatorIndex < pair.length - 1 ? safeDecode(pair.slice(separatorIndex + 1)) : "";
|
|
51
|
+
|
|
52
|
+
// 处理重复键:将单个值转换为数组
|
|
53
|
+
var existing = params[key];
|
|
54
|
+
if (existing !== undefined) {
|
|
55
|
+
if (Array.isArray(existing)) {
|
|
56
|
+
existing.push(value);
|
|
57
|
+
} else {
|
|
58
|
+
params[key] = [existing, value];
|
|
59
|
+
}
|
|
60
|
+
} else {
|
|
61
|
+
params[key] = value;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return params;
|
|
65
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arms/rum-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.40",
|
|
4
4
|
"description": "arms rum javascript sdk core",
|
|
5
5
|
"author": "guangli.fj <guangli.fj@alibaba-inc.com>",
|
|
6
6
|
"license": "ISC",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"start": "build-scripts build --watch",
|
|
24
24
|
"build": "build-scripts build --skip-demo",
|
|
25
25
|
"prepublishOnly": "npm run build",
|
|
26
|
-
"test": "
|
|
26
|
+
"test": "npm run build && jest ./__tests__"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"@babel/runtime": "^7.24.5"
|