@cloudcare/browser-core 1.2.9 → 1.2.12
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/cjs/browser/fetchObservable.js +1 -1
- package/cjs/helper/tools.js +2 -2
- package/cjs/transport/httpRequest.js +4 -2
- package/cjs/transport/sendWithRetryStrategy.js +3 -3
- package/esm/browser/fetchObservable.js +1 -1
- package/esm/helper/tools.js +2 -2
- package/esm/transport/httpRequest.js +4 -2
- package/esm/transport/sendWithRetryStrategy.js +3 -3
- package/package.json +22 -22
- package/src/browser/fetchObservable.js +20 -14
- package/src/helper/tools.js +4 -3
- package/src/transport/httpRequest.js +25 -25
- package/src/transport/sendWithRetryStrategy.js +9 -4
|
@@ -80,7 +80,7 @@ function afterSend(observable, responsePromise, startContext) {
|
|
|
80
80
|
observable.notify(context);
|
|
81
81
|
} else if ('status' in response) {
|
|
82
82
|
context.response = response;
|
|
83
|
-
context.responseType = response.type;
|
|
83
|
+
context.responseType = response instanceof Response && response.type || '';
|
|
84
84
|
context.status = response.status;
|
|
85
85
|
context.isAborted = false;
|
|
86
86
|
observable.notify(context);
|
package/cjs/helper/tools.js
CHANGED
|
@@ -1448,7 +1448,7 @@ var getURLSearchParams = function getURLSearchParams(queryString) {
|
|
|
1448
1448
|
queryString = queryString || '';
|
|
1449
1449
|
|
|
1450
1450
|
var decodeParam = function decodeParam(str) {
|
|
1451
|
-
return decodeURIComponent(str)
|
|
1451
|
+
return str; // return decodeURIComponent(str)
|
|
1452
1452
|
};
|
|
1453
1453
|
|
|
1454
1454
|
var args = {};
|
|
@@ -2265,7 +2265,7 @@ function escapeJsonValue(value) {
|
|
|
2265
2265
|
}
|
|
2266
2266
|
|
|
2267
2267
|
function escapeFieldValueStr(str) {
|
|
2268
|
-
return '"' + str.replace(/[\\]*"/g, '"').replace(/"/g, '\\"')
|
|
2268
|
+
return '"' + str.replace(/\\/g, '\\\\').replace(/[\\]*"/g, '"').replace(/"/g, '\\"') + '"';
|
|
2269
2269
|
}
|
|
2270
2270
|
|
|
2271
2271
|
function escapeRowField(value) {
|
|
@@ -73,11 +73,13 @@ function fetchKeepAliveStrategy(endpointUrl, bytesLimit, payload, onResponse) {
|
|
|
73
73
|
fetch(url, {
|
|
74
74
|
method: 'POST',
|
|
75
75
|
body: data,
|
|
76
|
-
keepalive: true
|
|
76
|
+
keepalive: true,
|
|
77
|
+
mode: 'cors'
|
|
77
78
|
}).then(function (response) {
|
|
78
79
|
if (typeof onResponse === 'function') {
|
|
79
80
|
onResponse({
|
|
80
|
-
status: response.status
|
|
81
|
+
status: response.status,
|
|
82
|
+
type: response.type
|
|
81
83
|
});
|
|
82
84
|
}
|
|
83
85
|
}, function () {
|
|
@@ -80,7 +80,7 @@ function send(payload, state, sendStrategy, responseData) {
|
|
|
80
80
|
sendStrategy(payload, function (response) {
|
|
81
81
|
state.bandwidthMonitor.remove(payload);
|
|
82
82
|
|
|
83
|
-
if (
|
|
83
|
+
if (!shouldRetryRequest(response)) {
|
|
84
84
|
state.transportStatus = TransportStatus.UP;
|
|
85
85
|
onSuccess();
|
|
86
86
|
} else {
|
|
@@ -110,8 +110,8 @@ function retryQueuedPayloads(reason, state, sendStrategy, reportError) {
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
function
|
|
114
|
-
return response.
|
|
113
|
+
function shouldRetryRequest(response) {
|
|
114
|
+
return response.type !== 'opaque' && (response.status === 0 && !navigator.onLine || response.status === 408 || response.status === 429 || response.status >= 500);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
function newRetryState() {
|
|
@@ -66,7 +66,7 @@ function afterSend(observable, responsePromise, startContext) {
|
|
|
66
66
|
observable.notify(context);
|
|
67
67
|
} else if ('status' in response) {
|
|
68
68
|
context.response = response;
|
|
69
|
-
context.responseType = response.type;
|
|
69
|
+
context.responseType = response instanceof Response && response.type || '';
|
|
70
70
|
context.status = response.status;
|
|
71
71
|
context.isAborted = false;
|
|
72
72
|
observable.notify(context);
|
package/esm/helper/tools.js
CHANGED
|
@@ -1177,7 +1177,7 @@ export var getURLSearchParams = function getURLSearchParams(queryString) {
|
|
|
1177
1177
|
queryString = queryString || '';
|
|
1178
1178
|
|
|
1179
1179
|
var decodeParam = function decodeParam(str) {
|
|
1180
|
-
return decodeURIComponent(str)
|
|
1180
|
+
return str; // return decodeURIComponent(str)
|
|
1181
1181
|
};
|
|
1182
1182
|
|
|
1183
1183
|
var args = {};
|
|
@@ -1909,7 +1909,7 @@ export function escapeJsonValue(value) {
|
|
|
1909
1909
|
}
|
|
1910
1910
|
}
|
|
1911
1911
|
export function escapeFieldValueStr(str) {
|
|
1912
|
-
return '"' + str.replace(/[\\]*"/g, '"').replace(/"/g, '\\"')
|
|
1912
|
+
return '"' + str.replace(/\\/g, '\\\\').replace(/[\\]*"/g, '"').replace(/"/g, '\\"') + '"';
|
|
1913
1913
|
}
|
|
1914
1914
|
export function escapeRowField(value) {
|
|
1915
1915
|
if (typeof value === 'object' && value) {
|
|
@@ -65,11 +65,13 @@ export function fetchKeepAliveStrategy(endpointUrl, bytesLimit, payload, onRespo
|
|
|
65
65
|
fetch(url, {
|
|
66
66
|
method: 'POST',
|
|
67
67
|
body: data,
|
|
68
|
-
keepalive: true
|
|
68
|
+
keepalive: true,
|
|
69
|
+
mode: 'cors'
|
|
69
70
|
}).then(function (response) {
|
|
70
71
|
if (typeof onResponse === 'function') {
|
|
71
72
|
onResponse({
|
|
72
|
-
status: response.status
|
|
73
|
+
status: response.status,
|
|
74
|
+
type: response.type
|
|
73
75
|
});
|
|
74
76
|
}
|
|
75
77
|
}, function () {
|
|
@@ -63,7 +63,7 @@ function send(payload, state, sendStrategy, responseData) {
|
|
|
63
63
|
sendStrategy(payload, function (response) {
|
|
64
64
|
state.bandwidthMonitor.remove(payload);
|
|
65
65
|
|
|
66
|
-
if (
|
|
66
|
+
if (!shouldRetryRequest(response)) {
|
|
67
67
|
state.transportStatus = TransportStatus.UP;
|
|
68
68
|
onSuccess();
|
|
69
69
|
} else {
|
|
@@ -93,8 +93,8 @@ function retryQueuedPayloads(reason, state, sendStrategy, reportError) {
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
function
|
|
97
|
-
return response.
|
|
96
|
+
function shouldRetryRequest(response) {
|
|
97
|
+
return response.type !== 'opaque' && (response.status === 0 && !navigator.onLine || response.status === 408 || response.status === 429 || response.status >= 500);
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
export function newRetryState() {
|
package/package.json
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
2
|
+
"name": "@cloudcare/browser-core",
|
|
3
|
+
"version": "1.2.12",
|
|
4
|
+
"main": "cjs/index.js",
|
|
5
|
+
"module": "esm/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "run-p build:cjs build:esm",
|
|
8
|
+
"build:cjs": "rm -rf cjs && babel --config-file ./babel.cjs.json --out-dir cjs ./src",
|
|
9
|
+
"build:esm": "rm -rf esm && babel --config-file ./babel.esm.json --out-dir esm ./src "
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"dataflux",
|
|
13
|
+
"logs",
|
|
14
|
+
"sdk"
|
|
15
|
+
],
|
|
16
|
+
"repository": {
|
|
17
|
+
"url": "https://github.com/DataFlux-cn/datakit-js",
|
|
18
|
+
"type": "git"
|
|
19
|
+
},
|
|
20
|
+
"author": "dataflux",
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"description": "DataFlux RUM Web 端数据指标监控",
|
|
23
|
+
"gitHead": "35aef5d669cd504346a31a1c92381f150d8fff75"
|
|
24
24
|
}
|
|
@@ -13,7 +13,7 @@ export function initFetchObservable() {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
function createFetchObservable() {
|
|
16
|
-
var observable = new Observable(function() {
|
|
16
|
+
var observable = new Observable(function () {
|
|
17
17
|
if (!window.fetch) {
|
|
18
18
|
return
|
|
19
19
|
}
|
|
@@ -21,19 +21,23 @@ function createFetchObservable() {
|
|
|
21
21
|
var fetchMethod = instrumentMethod(
|
|
22
22
|
window,
|
|
23
23
|
'fetch',
|
|
24
|
-
function(originalFetch) {
|
|
24
|
+
function (originalFetch) {
|
|
25
25
|
return function (input, init) {
|
|
26
26
|
var responsePromise
|
|
27
27
|
var context = beforeSend(observable, input, init)
|
|
28
28
|
if (context) {
|
|
29
|
-
responsePromise = originalFetch.call(
|
|
29
|
+
responsePromise = originalFetch.call(
|
|
30
|
+
this,
|
|
31
|
+
context.input,
|
|
32
|
+
context.init
|
|
33
|
+
)
|
|
30
34
|
afterSend(observable, responsePromise, context)
|
|
31
35
|
} else {
|
|
32
36
|
responsePromise = originalFetch.call(this, input, init)
|
|
33
37
|
}
|
|
34
38
|
return responsePromise
|
|
35
39
|
}
|
|
36
|
-
}
|
|
40
|
+
}
|
|
37
41
|
)
|
|
38
42
|
return fetchMethod.stop
|
|
39
43
|
})
|
|
@@ -42,7 +46,10 @@ function createFetchObservable() {
|
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
function beforeSend(observable, input, init) {
|
|
45
|
-
var method =
|
|
49
|
+
var method =
|
|
50
|
+
(init && init.method) ||
|
|
51
|
+
(typeof input === 'object' && input.method) ||
|
|
52
|
+
'GET'
|
|
46
53
|
var url = normalizeUrl((typeof input === 'object' && input.url) || input)
|
|
47
54
|
var startClocks = clocksNow()
|
|
48
55
|
|
|
@@ -52,7 +59,7 @@ function beforeSend(observable, input, init) {
|
|
|
52
59
|
input: input,
|
|
53
60
|
method: method,
|
|
54
61
|
startClocks: startClocks,
|
|
55
|
-
url: url
|
|
62
|
+
url: url
|
|
56
63
|
}
|
|
57
64
|
|
|
58
65
|
observable.notify(context)
|
|
@@ -60,23 +67,22 @@ function beforeSend(observable, input, init) {
|
|
|
60
67
|
return context
|
|
61
68
|
}
|
|
62
69
|
|
|
63
|
-
function afterSend(
|
|
64
|
-
|
|
65
|
-
responsePromise,
|
|
66
|
-
startContext
|
|
67
|
-
) {
|
|
68
|
-
var reportFetch = function(response) {
|
|
70
|
+
function afterSend(observable, responsePromise, startContext) {
|
|
71
|
+
var reportFetch = function (response) {
|
|
69
72
|
var context = startContext
|
|
70
73
|
context.state = 'complete'
|
|
71
74
|
context.duration = elapsed(context.startClocks.timeStamp, timeStampNow())
|
|
72
75
|
if ('stack' in response || response instanceof Error) {
|
|
73
76
|
context.status = 0
|
|
74
|
-
context.isAborted =
|
|
77
|
+
context.isAborted =
|
|
78
|
+
response instanceof DOMException &&
|
|
79
|
+
response.code === DOMException.ABORT_ERR
|
|
75
80
|
context.error = response
|
|
76
81
|
observable.notify(context)
|
|
77
82
|
} else if ('status' in response) {
|
|
78
83
|
context.response = response
|
|
79
|
-
context.responseType =
|
|
84
|
+
context.responseType =
|
|
85
|
+
(response instanceof Response && response.type) || ''
|
|
80
86
|
context.status = response.status
|
|
81
87
|
context.isAborted = false
|
|
82
88
|
observable.notify(context)
|
package/src/helper/tools.js
CHANGED
|
@@ -1143,7 +1143,8 @@ export var getQueryParamsFromUrl = function (url) {
|
|
|
1143
1143
|
export var getURLSearchParams = function (queryString) {
|
|
1144
1144
|
queryString = queryString || ''
|
|
1145
1145
|
var decodeParam = function (str) {
|
|
1146
|
-
return
|
|
1146
|
+
return str
|
|
1147
|
+
// return decodeURIComponent(str)
|
|
1147
1148
|
}
|
|
1148
1149
|
var args = {}
|
|
1149
1150
|
var query = queryString.substring(1)
|
|
@@ -1887,9 +1888,9 @@ export function escapeFieldValueStr(str) {
|
|
|
1887
1888
|
return (
|
|
1888
1889
|
'"' +
|
|
1889
1890
|
str
|
|
1891
|
+
.replace(/\\/g, '\\\\')
|
|
1890
1892
|
.replace(/[\\]*"/g, '"')
|
|
1891
|
-
.replace(/"/g, '\\"')
|
|
1892
|
-
.replace(/\\/g, '\\\\') +
|
|
1893
|
+
.replace(/"/g, '\\"') +
|
|
1893
1894
|
'"'
|
|
1894
1895
|
)
|
|
1895
1896
|
}
|
|
@@ -12,27 +12,28 @@ function addBatchPrecision(url) {
|
|
|
12
12
|
if (!url) return url
|
|
13
13
|
return url + (url.indexOf('?') === -1 ? '?' : '&') + 'precision=ms'
|
|
14
14
|
}
|
|
15
|
-
export function createHttpRequest(
|
|
16
|
-
endpointUrl,
|
|
17
|
-
bytesLimit,
|
|
18
|
-
reportError
|
|
19
|
-
) {
|
|
15
|
+
export function createHttpRequest(endpointUrl, bytesLimit, reportError) {
|
|
20
16
|
var retryState = newRetryState()
|
|
21
|
-
var sendStrategyForRetry = function(payload, onResponse) {
|
|
17
|
+
var sendStrategyForRetry = function (payload, onResponse) {
|
|
22
18
|
return fetchKeepAliveStrategy(endpointUrl, bytesLimit, payload, onResponse)
|
|
23
19
|
}
|
|
24
|
-
|
|
20
|
+
|
|
25
21
|
return {
|
|
26
|
-
send: function(payload) {
|
|
27
|
-
sendWithRetryStrategy(
|
|
22
|
+
send: function (payload) {
|
|
23
|
+
sendWithRetryStrategy(
|
|
24
|
+
payload,
|
|
25
|
+
retryState,
|
|
26
|
+
sendStrategyForRetry,
|
|
27
|
+
reportError
|
|
28
|
+
)
|
|
28
29
|
},
|
|
29
30
|
/**
|
|
30
31
|
* Since fetch keepalive behaves like regular fetch on Firefox,
|
|
31
32
|
* keep using sendBeaconStrategy on exit
|
|
32
33
|
*/
|
|
33
|
-
sendOnExit: function(payload) {
|
|
34
|
+
sendOnExit: function (payload) {
|
|
34
35
|
sendBeaconStrategy(endpointUrl, bytesLimit, payload)
|
|
35
|
-
}
|
|
36
|
+
}
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
|
|
@@ -55,8 +56,6 @@ function sendBeaconStrategy(endpointUrl, bytesLimit, payload) {
|
|
|
55
56
|
sendXHR(url, data)
|
|
56
57
|
}
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
60
59
|
export function fetchKeepAliveStrategy(
|
|
61
60
|
endpointUrl,
|
|
62
61
|
bytesLimit,
|
|
@@ -68,14 +67,18 @@ export function fetchKeepAliveStrategy(
|
|
|
68
67
|
var url = addBatchPrecision(endpointUrl)
|
|
69
68
|
var canUseKeepAlive = isKeepAliveSupported() && bytesCount < bytesLimit
|
|
70
69
|
if (canUseKeepAlive) {
|
|
71
|
-
fetch(url, {
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
fetch(url, {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
body: data,
|
|
73
|
+
keepalive: true,
|
|
74
|
+
mode: 'cors'
|
|
75
|
+
}).then(
|
|
76
|
+
function (response) {
|
|
74
77
|
if (typeof onResponse === 'function') {
|
|
75
|
-
onResponse({ status: response.status })
|
|
78
|
+
onResponse({ status: response.status, type: response.type })
|
|
76
79
|
}
|
|
77
80
|
},
|
|
78
|
-
function() {
|
|
81
|
+
function () {
|
|
79
82
|
// failed to queue the request
|
|
80
83
|
sendXHR(url, data, onResponse)
|
|
81
84
|
}
|
|
@@ -98,12 +101,9 @@ function sendXHR(url, data, onResponse) {
|
|
|
98
101
|
const request = new XMLHttpRequest()
|
|
99
102
|
request.open('POST', url, true)
|
|
100
103
|
request.send(data)
|
|
101
|
-
request.addEventListener(
|
|
102
|
-
'
|
|
103
|
-
|
|
104
|
-
if (typeof onResponse === 'function') {
|
|
105
|
-
onResponse({ status: request.status })
|
|
106
|
-
}
|
|
104
|
+
request.addEventListener('loadend', function () {
|
|
105
|
+
if (typeof onResponse === 'function') {
|
|
106
|
+
onResponse({ status: request.status })
|
|
107
107
|
}
|
|
108
|
-
)
|
|
108
|
+
})
|
|
109
109
|
}
|
|
@@ -92,7 +92,7 @@ function send(payload, state, sendStrategy, responseData) {
|
|
|
92
92
|
state.bandwidthMonitor.add(payload)
|
|
93
93
|
sendStrategy(payload, function (response) {
|
|
94
94
|
state.bandwidthMonitor.remove(payload)
|
|
95
|
-
if (
|
|
95
|
+
if (!shouldRetryRequest(response)) {
|
|
96
96
|
state.transportStatus = TransportStatus.UP
|
|
97
97
|
onSuccess()
|
|
98
98
|
} else {
|
|
@@ -135,10 +135,15 @@ function retryQueuedPayloads(reason, state, sendStrategy, reportError) {
|
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
function
|
|
139
|
-
return
|
|
138
|
+
function shouldRetryRequest(response) {
|
|
139
|
+
return (
|
|
140
|
+
response.type !== 'opaque' &&
|
|
141
|
+
((response.status === 0 && !navigator.onLine) ||
|
|
142
|
+
response.status === 408 ||
|
|
143
|
+
response.status === 429 ||
|
|
144
|
+
response.status >= 500)
|
|
145
|
+
)
|
|
140
146
|
}
|
|
141
|
-
|
|
142
147
|
export function newRetryState() {
|
|
143
148
|
return {
|
|
144
149
|
transportStatus: TransportStatus.UP,
|