@cloudcare/browser-core 1.2.6 → 1.2.8
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/dataMap.js +1 -1
- package/cjs/helper/contextHistory.js +7 -22
- package/cjs/helper/limitModification.js +7 -21
- package/esm/dataMap.js +1 -1
- package/esm/helper/contextHistory.js +4 -2
- package/esm/helper/limitModification.js +4 -1
- package/esm/transport/sendWithRetryStrategy.js +4 -9
- package/package.json +2 -2
- package/src/dataMap.js +1 -1
- package/src/helper/contextHistory.js +26 -19
- package/src/helper/limitModification.js +4 -1
- package/src/transport/sendWithRetryStrategy.js +81 -63
package/cjs/dataMap.js
CHANGED
|
@@ -143,10 +143,10 @@ var dataMap = {
|
|
|
143
143
|
action: {
|
|
144
144
|
type: _enums.RumEventType.ACTION,
|
|
145
145
|
tags: {
|
|
146
|
-
action_name: 'action.target.name',
|
|
147
146
|
action_type: 'action.type'
|
|
148
147
|
},
|
|
149
148
|
fields: {
|
|
149
|
+
action_name: 'action.target.name',
|
|
150
150
|
duration: 'action.loading_time',
|
|
151
151
|
action_error_count: 'action.error.count',
|
|
152
152
|
action_resource_count: 'action.resource.count',
|
|
@@ -8,12 +8,6 @@ exports.ContextHistory = ContextHistory;
|
|
|
8
8
|
|
|
9
9
|
var _tools = require("./tools");
|
|
10
10
|
|
|
11
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
12
|
-
|
|
13
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
14
|
-
|
|
15
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
16
|
-
|
|
17
11
|
var END_OF_TIMES = Infinity;
|
|
18
12
|
var CLEAR_OLD_CONTEXTS_INTERVAL = _tools.ONE_MINUTE;
|
|
19
13
|
exports.CLEAR_OLD_CONTEXTS_INTERVAL = CLEAR_OLD_CONTEXTS_INTERVAL;
|
|
@@ -56,25 +50,16 @@ ContextHistory.prototype.find = function (startTime) {
|
|
|
56
50
|
startTime = END_OF_TIMES;
|
|
57
51
|
}
|
|
58
52
|
|
|
59
|
-
var
|
|
60
|
-
|
|
53
|
+
for (var i = 0; i < this.entries.length; i++) {
|
|
54
|
+
var entry = this.entries[i];
|
|
61
55
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (entry.startTime <= startTime) {
|
|
67
|
-
if (startTime <= entry.endTime) {
|
|
68
|
-
return entry.context;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
break;
|
|
56
|
+
if (entry.startTime <= startTime) {
|
|
57
|
+
if (startTime <= entry.endTime) {
|
|
58
|
+
return entry.context;
|
|
72
59
|
}
|
|
60
|
+
|
|
61
|
+
break;
|
|
73
62
|
}
|
|
74
|
-
} catch (err) {
|
|
75
|
-
_iterator.e(err);
|
|
76
|
-
} finally {
|
|
77
|
-
_iterator.f();
|
|
78
63
|
}
|
|
79
64
|
};
|
|
80
65
|
/**
|
|
@@ -9,12 +9,6 @@ var _tools = require("./tools");
|
|
|
9
9
|
|
|
10
10
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
11
11
|
|
|
12
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
13
|
-
|
|
14
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
15
|
-
|
|
16
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
17
|
-
|
|
18
12
|
/**
|
|
19
13
|
* Current limitations:
|
|
20
14
|
* - field path do not support array, 'a.b.c' only
|
|
@@ -36,24 +30,16 @@ function limitModification(object, modifiableFieldPaths, modifier) {
|
|
|
36
30
|
|
|
37
31
|
function get(object, path) {
|
|
38
32
|
var current = object;
|
|
33
|
+
var fields = path.split('.');
|
|
39
34
|
|
|
40
|
-
var
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
45
|
-
var field = _step.value;
|
|
46
|
-
|
|
47
|
-
if (!isValidObjectContaining(current, field)) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
35
|
+
for (var i = 0; i < fields.length; i++) {
|
|
36
|
+
var field = fields[i];
|
|
50
37
|
|
|
51
|
-
|
|
38
|
+
if (!isValidObjectContaining(current, field)) {
|
|
39
|
+
return;
|
|
52
40
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
} finally {
|
|
56
|
-
_iterator.f();
|
|
41
|
+
|
|
42
|
+
current = current[field];
|
|
57
43
|
}
|
|
58
44
|
|
|
59
45
|
return current;
|
package/esm/dataMap.js
CHANGED
|
@@ -134,10 +134,10 @@ export var dataMap = {
|
|
|
134
134
|
action: {
|
|
135
135
|
type: RumEventType.ACTION,
|
|
136
136
|
tags: {
|
|
137
|
-
action_name: 'action.target.name',
|
|
138
137
|
action_type: 'action.type'
|
|
139
138
|
},
|
|
140
139
|
fields: {
|
|
140
|
+
action_name: 'action.target.name',
|
|
141
141
|
duration: 'action.loading_time',
|
|
142
142
|
action_error_count: 'action.error.count',
|
|
143
143
|
action_resource_count: 'action.resource.count',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { relativeNow, ONE_MINUTE, filter, map } from './tools';
|
|
1
|
+
import { relativeNow, ONE_MINUTE, filter, map, each } from './tools';
|
|
2
2
|
var END_OF_TIMES = Infinity;
|
|
3
3
|
export var CLEAR_OLD_CONTEXTS_INTERVAL = ONE_MINUTE;
|
|
4
4
|
export function ContextHistory(expireDelay) {
|
|
@@ -39,7 +39,9 @@ ContextHistory.prototype.find = function (startTime) {
|
|
|
39
39
|
startTime = END_OF_TIMES;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
for (var
|
|
42
|
+
for (var i = 0; i < this.entries.length; i++) {
|
|
43
|
+
var entry = this.entries[i];
|
|
44
|
+
|
|
43
45
|
if (entry.startTime <= startTime) {
|
|
44
46
|
if (startTime <= entry.endTime) {
|
|
45
47
|
return entry.context;
|
|
@@ -21,8 +21,11 @@ export function limitModification(object, modifiableFieldPaths, modifier) {
|
|
|
21
21
|
|
|
22
22
|
function get(object, path) {
|
|
23
23
|
var current = object;
|
|
24
|
+
var fields = path.split('.');
|
|
25
|
+
|
|
26
|
+
for (var i = 0; i < fields.length; i++) {
|
|
27
|
+
var field = fields[i];
|
|
24
28
|
|
|
25
|
-
for (var field of path.split('.')) {
|
|
26
29
|
if (!isValidObjectContaining(current, field)) {
|
|
27
30
|
return;
|
|
28
31
|
}
|
|
@@ -120,12 +120,10 @@ function newPayloadQueue() {
|
|
|
120
120
|
queue.push(payload);
|
|
121
121
|
this.bytesCount += payload.bytesCount;
|
|
122
122
|
},
|
|
123
|
-
|
|
124
|
-
first() {
|
|
123
|
+
first: function first() {
|
|
125
124
|
return queue[0];
|
|
126
125
|
},
|
|
127
|
-
|
|
128
|
-
dequeue() {
|
|
126
|
+
dequeue: function dequeue() {
|
|
129
127
|
var payload = queue.shift();
|
|
130
128
|
|
|
131
129
|
if (payload) {
|
|
@@ -134,15 +132,12 @@ function newPayloadQueue() {
|
|
|
134
132
|
|
|
135
133
|
return payload;
|
|
136
134
|
},
|
|
137
|
-
|
|
138
|
-
size() {
|
|
135
|
+
size: function size() {
|
|
139
136
|
return queue.length;
|
|
140
137
|
},
|
|
141
|
-
|
|
142
|
-
isFull() {
|
|
138
|
+
isFull: function isFull() {
|
|
143
139
|
return this.bytesCount >= MAX_QUEUE_BYTES_COUNT;
|
|
144
140
|
}
|
|
145
|
-
|
|
146
141
|
};
|
|
147
142
|
}
|
|
148
143
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcare/browser-core",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.8",
|
|
4
4
|
"main": "cjs/index.js",
|
|
5
5
|
"module": "esm/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -20,5 +20,5 @@
|
|
|
20
20
|
"author": "dataflux",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"description": "DataFlux RUM Web 端数据指标监控",
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "7a00f6c0d6380acd59c36f5f0e0b0d46f0d0630a"
|
|
24
24
|
}
|
package/src/dataMap.js
CHANGED
|
@@ -133,10 +133,10 @@ export var dataMap = {
|
|
|
133
133
|
action: {
|
|
134
134
|
type: RumEventType.ACTION,
|
|
135
135
|
tags: {
|
|
136
|
-
action_name: 'action.target.name',
|
|
137
136
|
action_type: 'action.type'
|
|
138
137
|
},
|
|
139
138
|
fields: {
|
|
139
|
+
action_name: 'action.target.name',
|
|
140
140
|
duration: 'action.loading_time',
|
|
141
141
|
action_error_count: 'action.error.count',
|
|
142
142
|
action_resource_count: 'action.resource.count',
|
|
@@ -1,40 +1,41 @@
|
|
|
1
|
-
import { relativeNow, ONE_MINUTE, filter, map} from './tools'
|
|
1
|
+
import { relativeNow, ONE_MINUTE, filter, map, each } from './tools'
|
|
2
2
|
|
|
3
3
|
var END_OF_TIMES = Infinity
|
|
4
4
|
|
|
5
5
|
export var CLEAR_OLD_CONTEXTS_INTERVAL = ONE_MINUTE
|
|
6
6
|
export function ContextHistory(expireDelay) {
|
|
7
|
-
this.expireDelay = expireDelay
|
|
7
|
+
this.expireDelay = expireDelay
|
|
8
8
|
this.entries = []
|
|
9
9
|
var _this = this
|
|
10
|
-
this.clearOldContextsInterval = setInterval(function(){
|
|
10
|
+
this.clearOldContextsInterval = setInterval(function () {
|
|
11
11
|
_this.clearOldContexts()
|
|
12
|
-
}, CLEAR_OLD_CONTEXTS_INTERVAL)
|
|
12
|
+
}, CLEAR_OLD_CONTEXTS_INTERVAL)
|
|
13
13
|
}
|
|
14
|
-
ContextHistory.prototype.add = function(context, startTime) {
|
|
14
|
+
ContextHistory.prototype.add = function (context, startTime) {
|
|
15
15
|
var _this = this
|
|
16
16
|
var entry = {
|
|
17
17
|
context: context,
|
|
18
18
|
startTime: startTime,
|
|
19
19
|
endTime: END_OF_TIMES,
|
|
20
|
-
remove: function() {
|
|
20
|
+
remove: function () {
|
|
21
21
|
var index = _this.entries.indexOf(entry)
|
|
22
22
|
if (index >= 0) {
|
|
23
23
|
_this.entries.splice(index, 1)
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
|
-
close: function(endTime){
|
|
26
|
+
close: function (endTime) {
|
|
27
27
|
entry.endTime = endTime
|
|
28
|
-
}
|
|
28
|
+
}
|
|
29
29
|
}
|
|
30
30
|
this.entries.unshift(entry)
|
|
31
31
|
return entry
|
|
32
32
|
}
|
|
33
|
-
ContextHistory.prototype.find = function(startTime) {
|
|
33
|
+
ContextHistory.prototype.find = function (startTime) {
|
|
34
34
|
if (typeof startTime === 'undefined') {
|
|
35
35
|
startTime = END_OF_TIMES
|
|
36
36
|
}
|
|
37
|
-
for (var
|
|
37
|
+
for (var i = 0; i < this.entries.length; i++) {
|
|
38
|
+
var entry = this.entries[i]
|
|
38
39
|
if (entry.startTime <= startTime) {
|
|
39
40
|
if (startTime <= entry.endTime) {
|
|
40
41
|
return entry.context
|
|
@@ -47,7 +48,7 @@ ContextHistory.prototype.find = function(startTime) {
|
|
|
47
48
|
* Helper function to close the currently active context, if any. This method assumes that entries
|
|
48
49
|
* are not overlapping.
|
|
49
50
|
*/
|
|
50
|
-
ContextHistory.prototype.closeActive = function(endTime) {
|
|
51
|
+
ContextHistory.prototype.closeActive = function (endTime) {
|
|
51
52
|
var latestEntry = this.entries[0]
|
|
52
53
|
if (latestEntry && latestEntry.endTime === END_OF_TIMES) {
|
|
53
54
|
latestEntry.close(endTime)
|
|
@@ -57,29 +58,35 @@ ContextHistory.prototype.closeActive = function(endTime) {
|
|
|
57
58
|
* Return all contexts that were active during `startTime`, or all currently active contexts if no
|
|
58
59
|
* `startTime` is provided.
|
|
59
60
|
*/
|
|
60
|
-
ContextHistory.prototype.findAll = function(startTime){
|
|
61
|
+
ContextHistory.prototype.findAll = function (startTime) {
|
|
61
62
|
if (typeof startTime === 'undefined') {
|
|
62
63
|
startTime = END_OF_TIMES
|
|
63
64
|
}
|
|
64
|
-
var result = filter(this.entries, function(entry) {
|
|
65
|
-
|
|
65
|
+
var result = filter(this.entries, function (entry) {
|
|
66
|
+
return entry.startTime <= startTime && startTime <= entry.endTime
|
|
67
|
+
})
|
|
68
|
+
return map(result, function (entry) {
|
|
69
|
+
return entry.context
|
|
70
|
+
})
|
|
66
71
|
}
|
|
67
72
|
/**
|
|
68
73
|
* Remove all entries from this collection.
|
|
69
74
|
*/
|
|
70
|
-
ContextHistory.prototype.reset = function
|
|
75
|
+
ContextHistory.prototype.reset = function () {
|
|
71
76
|
this.entries = []
|
|
72
77
|
}
|
|
73
78
|
/**
|
|
74
79
|
* Stop internal garbage collection of past entries.
|
|
75
80
|
*/
|
|
76
|
-
ContextHistory.prototype.stop = function() {
|
|
81
|
+
ContextHistory.prototype.stop = function () {
|
|
77
82
|
clearInterval(this.clearOldContextsInterval)
|
|
78
83
|
}
|
|
79
|
-
ContextHistory.prototype.clearOldContexts = function() {
|
|
84
|
+
ContextHistory.prototype.clearOldContexts = function () {
|
|
80
85
|
var oldTimeThreshold = relativeNow() - this.expireDelay
|
|
81
|
-
while (
|
|
86
|
+
while (
|
|
87
|
+
this.entries.length > 0 &&
|
|
88
|
+
this.entries[this.entries.length - 1].endTime < oldTimeThreshold
|
|
89
|
+
) {
|
|
82
90
|
this.entries.pop()
|
|
83
91
|
}
|
|
84
92
|
}
|
|
85
|
-
|
|
@@ -21,12 +21,15 @@ export function limitModification(object, modifiableFieldPaths, modifier) {
|
|
|
21
21
|
|
|
22
22
|
function get(object, path) {
|
|
23
23
|
var current = object
|
|
24
|
-
|
|
24
|
+
var fields = path.split('.')
|
|
25
|
+
for (var i = 0; i < fields.length; i++) {
|
|
26
|
+
var field = fields[i]
|
|
25
27
|
if (!isValidObjectContaining(current, field)) {
|
|
26
28
|
return
|
|
27
29
|
}
|
|
28
30
|
current = current[field]
|
|
29
31
|
}
|
|
32
|
+
|
|
30
33
|
return current
|
|
31
34
|
}
|
|
32
35
|
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
clocksNow,
|
|
3
|
+
ONE_KIBI_BYTE,
|
|
4
|
+
ONE_MEBI_BYTE,
|
|
5
|
+
ONE_SECOND
|
|
6
|
+
} from '../helper/tools'
|
|
2
7
|
import { ErrorSource } from '../helper/errorTools'
|
|
3
8
|
|
|
4
9
|
export var MAX_ONGOING_BYTES_COUNT = 80 * ONE_KIBI_BYTE
|
|
@@ -10,12 +15,12 @@ export var INITIAL_BACKOFF_TIME = ONE_SECOND
|
|
|
10
15
|
var TransportStatus = {
|
|
11
16
|
UP: 'UP',
|
|
12
17
|
FAILURE_DETECTED: 'FAILURE_DETECTED',
|
|
13
|
-
DOWN: 'DOWN'
|
|
18
|
+
DOWN: 'DOWN'
|
|
14
19
|
}
|
|
15
20
|
|
|
16
21
|
var RetryReason = {
|
|
17
22
|
AFTER_SUCCESS: 'AFTER_SUCCESS',
|
|
18
|
-
AFTER_RESUME: 'AFTER_RESUME'
|
|
23
|
+
AFTER_RESUME: 'AFTER_RESUME'
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
export function sendWithRetryStrategy(
|
|
@@ -30,59 +35,62 @@ export function sendWithRetryStrategy(
|
|
|
30
35
|
state.bandwidthMonitor.canHandle(payload)
|
|
31
36
|
) {
|
|
32
37
|
send(payload, state, sendStrategy, {
|
|
33
|
-
onSuccess: function
|
|
34
|
-
|
|
38
|
+
onSuccess: function () {
|
|
39
|
+
return retryQueuedPayloads(
|
|
40
|
+
RetryReason.AFTER_SUCCESS,
|
|
41
|
+
state,
|
|
42
|
+
sendStrategy,
|
|
43
|
+
reportError
|
|
44
|
+
)
|
|
45
|
+
},
|
|
46
|
+
onFailure: function () {
|
|
35
47
|
state.queuedPayloads.enqueue(payload)
|
|
36
48
|
scheduleRetry(state, sendStrategy, reportError)
|
|
37
|
-
}
|
|
49
|
+
}
|
|
38
50
|
})
|
|
39
51
|
} else {
|
|
40
52
|
state.queuedPayloads.enqueue(payload)
|
|
41
53
|
}
|
|
42
54
|
}
|
|
43
55
|
|
|
44
|
-
function scheduleRetry(
|
|
45
|
-
state,
|
|
46
|
-
sendStrategy,
|
|
47
|
-
reportError
|
|
48
|
-
) {
|
|
56
|
+
function scheduleRetry(state, sendStrategy, reportError) {
|
|
49
57
|
if (state.transportStatus !== TransportStatus.DOWN) {
|
|
50
58
|
return
|
|
51
59
|
}
|
|
52
|
-
setTimeout(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
60
|
+
setTimeout(function () {
|
|
61
|
+
var payload = state.queuedPayloads.first()
|
|
62
|
+
send(payload, state, sendStrategy, {
|
|
63
|
+
onSuccess: function () {
|
|
64
|
+
state.queuedPayloads.dequeue()
|
|
65
|
+
// if (state.lastFailureStatus !== 0) {
|
|
66
|
+
// addTelemetryDebug('resuming after transport down', {
|
|
67
|
+
// failureStatus: state.lastFailureStatus,
|
|
68
|
+
// })
|
|
69
|
+
// }
|
|
70
|
+
state.currentBackoffTime = INITIAL_BACKOFF_TIME
|
|
71
|
+
retryQueuedPayloads(
|
|
72
|
+
RetryReason.AFTER_RESUME,
|
|
73
|
+
state,
|
|
74
|
+
sendStrategy,
|
|
75
|
+
reportError
|
|
76
|
+
)
|
|
77
|
+
},
|
|
78
|
+
onFailure: function () {
|
|
79
|
+
state.currentBackoffTime = Math.min(
|
|
80
|
+
MAX_BACKOFF_TIME,
|
|
81
|
+
state.currentBackoffTime * 2
|
|
82
|
+
)
|
|
83
|
+
scheduleRetry(state, sendStrategy, reportError)
|
|
84
|
+
}
|
|
85
|
+
})
|
|
86
|
+
}, state.currentBackoffTime)
|
|
74
87
|
}
|
|
75
88
|
|
|
76
|
-
function send(
|
|
77
|
-
payload,
|
|
78
|
-
state,
|
|
79
|
-
sendStrategy,
|
|
80
|
-
responseData
|
|
81
|
-
) {
|
|
89
|
+
function send(payload, state, sendStrategy, responseData) {
|
|
82
90
|
var onSuccess = responseData.onSuccess
|
|
83
91
|
var onFailure = responseData.onFailure
|
|
84
92
|
state.bandwidthMonitor.add(payload)
|
|
85
|
-
sendStrategy(payload, function(response) {
|
|
93
|
+
sendStrategy(payload, function (response) {
|
|
86
94
|
state.bandwidthMonitor.remove(payload)
|
|
87
95
|
if (wasRequestSuccessful(response)) {
|
|
88
96
|
state.transportStatus = TransportStatus.UP
|
|
@@ -90,31 +98,40 @@ function send(
|
|
|
90
98
|
} else {
|
|
91
99
|
// do not consider transport down if another ongoing request could succeed
|
|
92
100
|
state.transportStatus =
|
|
93
|
-
state.bandwidthMonitor.ongoingRequestCount > 0
|
|
101
|
+
state.bandwidthMonitor.ongoingRequestCount > 0
|
|
102
|
+
? TransportStatus.FAILURE_DETECTED
|
|
103
|
+
: TransportStatus.DOWN
|
|
94
104
|
state.lastFailureStatus = response.status
|
|
95
105
|
onFailure()
|
|
96
106
|
}
|
|
97
107
|
})
|
|
98
108
|
}
|
|
99
109
|
|
|
100
|
-
function retryQueuedPayloads(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
) {
|
|
106
|
-
if (reason === RetryReason.AFTER_SUCCESS && state.queuedPayloads.isFull() && !state.queueFullReported) {
|
|
110
|
+
function retryQueuedPayloads(reason, state, sendStrategy, reportError) {
|
|
111
|
+
if (
|
|
112
|
+
reason === RetryReason.AFTER_SUCCESS &&
|
|
113
|
+
state.queuedPayloads.isFull() &&
|
|
114
|
+
!state.queueFullReported
|
|
115
|
+
) {
|
|
107
116
|
reportError({
|
|
108
|
-
message:
|
|
117
|
+
message:
|
|
118
|
+
'Reached max events size queued for upload: ' +
|
|
119
|
+
MAX_QUEUE_BYTES_COUNT / ONE_MEBI_BYTE +
|
|
120
|
+
'MiB',
|
|
109
121
|
source: ErrorSource.AGENT,
|
|
110
|
-
startClocks: clocksNow()
|
|
122
|
+
startClocks: clocksNow()
|
|
111
123
|
})
|
|
112
124
|
state.queueFullReported = true
|
|
113
125
|
}
|
|
114
126
|
var previousQueue = state.queuedPayloads
|
|
115
127
|
state.queuedPayloads = newPayloadQueue()
|
|
116
128
|
while (previousQueue.size() > 0) {
|
|
117
|
-
sendWithRetryStrategy(
|
|
129
|
+
sendWithRetryStrategy(
|
|
130
|
+
previousQueue.dequeue(),
|
|
131
|
+
state,
|
|
132
|
+
sendStrategy,
|
|
133
|
+
reportError
|
|
134
|
+
)
|
|
118
135
|
}
|
|
119
136
|
}
|
|
120
137
|
|
|
@@ -129,7 +146,7 @@ export function newRetryState() {
|
|
|
129
146
|
currentBackoffTime: INITIAL_BACKOFF_TIME,
|
|
130
147
|
bandwidthMonitor: newBandwidthMonitor(),
|
|
131
148
|
queuedPayloads: newPayloadQueue(),
|
|
132
|
-
queueFullReported: false
|
|
149
|
+
queueFullReported: false
|
|
133
150
|
}
|
|
134
151
|
}
|
|
135
152
|
|
|
@@ -137,29 +154,29 @@ function newPayloadQueue() {
|
|
|
137
154
|
var queue = []
|
|
138
155
|
return {
|
|
139
156
|
bytesCount: 0,
|
|
140
|
-
enqueue: function(payload) {
|
|
157
|
+
enqueue: function (payload) {
|
|
141
158
|
if (this.isFull()) {
|
|
142
159
|
return
|
|
143
160
|
}
|
|
144
161
|
queue.push(payload)
|
|
145
162
|
this.bytesCount += payload.bytesCount
|
|
146
163
|
},
|
|
147
|
-
first() {
|
|
164
|
+
first: function () {
|
|
148
165
|
return queue[0]
|
|
149
166
|
},
|
|
150
|
-
dequeue() {
|
|
167
|
+
dequeue: function () {
|
|
151
168
|
var payload = queue.shift()
|
|
152
169
|
if (payload) {
|
|
153
170
|
this.bytesCount -= payload.bytesCount
|
|
154
171
|
}
|
|
155
172
|
return payload
|
|
156
173
|
},
|
|
157
|
-
size() {
|
|
174
|
+
size: function () {
|
|
158
175
|
return queue.length
|
|
159
176
|
},
|
|
160
|
-
isFull() {
|
|
177
|
+
isFull: function () {
|
|
161
178
|
return this.bytesCount >= MAX_QUEUE_BYTES_COUNT
|
|
162
|
-
}
|
|
179
|
+
}
|
|
163
180
|
}
|
|
164
181
|
}
|
|
165
182
|
|
|
@@ -167,20 +184,21 @@ function newBandwidthMonitor() {
|
|
|
167
184
|
return {
|
|
168
185
|
ongoingRequestCount: 0,
|
|
169
186
|
ongoingByteCount: 0,
|
|
170
|
-
canHandle: function(payload) {
|
|
187
|
+
canHandle: function (payload) {
|
|
171
188
|
return (
|
|
172
189
|
this.ongoingRequestCount === 0 ||
|
|
173
|
-
(this.ongoingByteCount + payload.bytesCount <=
|
|
190
|
+
(this.ongoingByteCount + payload.bytesCount <=
|
|
191
|
+
MAX_ONGOING_BYTES_COUNT &&
|
|
174
192
|
this.ongoingRequestCount < MAX_ONGOING_REQUESTS)
|
|
175
193
|
)
|
|
176
194
|
},
|
|
177
|
-
add: function(payload) {
|
|
195
|
+
add: function (payload) {
|
|
178
196
|
this.ongoingRequestCount += 1
|
|
179
197
|
this.ongoingByteCount += payload.bytesCount
|
|
180
198
|
},
|
|
181
|
-
remove:function(payload) {
|
|
199
|
+
remove: function (payload) {
|
|
182
200
|
this.ongoingRequestCount -= 1
|
|
183
201
|
this.ongoingByteCount -= payload.bytesCount
|
|
184
|
-
}
|
|
202
|
+
}
|
|
185
203
|
}
|
|
186
204
|
}
|