@cloudcare/browser-core 2.0.4 → 2.0.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.
- package/cjs/browser/addEventListener.js +57 -0
- package/cjs/browser/fetchObservable.js +4 -5
- package/cjs/browser/pageExitObservable.js +4 -2
- package/cjs/browser/runOnReadyState.js +21 -0
- package/cjs/browser/xhrObservable.js +7 -5
- package/cjs/configuration/configuration.js +5 -3
- package/cjs/console/consoleObservable.js +3 -1
- package/cjs/dataMap.js +1 -0
- package/cjs/helper/byteUtils.js +26 -0
- package/cjs/helper/contextHistory.js +4 -2
- package/cjs/helper/createEventRateLimiter.js +3 -1
- package/cjs/helper/errorTools.js +4 -2
- package/cjs/helper/instrumentMethod.js +2 -4
- package/cjs/helper/serialisation/contextManager.js +84 -0
- package/cjs/helper/serialisation/heavyCustomerDataWarning.js +34 -0
- package/cjs/helper/serialisation/jsonStringify.js +57 -0
- package/cjs/helper/serialisation/rowData.js +50 -0
- package/cjs/helper/timer.js +29 -0
- package/cjs/helper/tools.js +10 -331
- package/cjs/index.js +117 -0
- package/cjs/init.js +6 -6
- package/cjs/report/reportObservable.js +4 -2
- package/cjs/session/sessionCookieStore.js +3 -1
- package/cjs/session/sessionManagement.js +10 -5
- package/cjs/session/sessionStore.js +10 -4
- package/cjs/transport/batch.js +40 -91
- package/cjs/transport/flushController.js +121 -0
- package/cjs/transport/httpRequest.js +6 -2
- package/cjs/transport/index.js +9 -1
- package/cjs/transport/sendWithRetryStrategy.js +8 -4
- package/cjs/transport/startBatchWithReplica.js +10 -2
- package/cjs/user/index.js +18 -0
- package/cjs/user/user.js +42 -0
- package/esm/browser/addEventListener.js +46 -0
- package/esm/browser/fetchObservable.js +4 -3
- package/esm/browser/pageExitObservable.js +2 -1
- package/esm/browser/runOnReadyState.js +12 -0
- package/esm/browser/xhrObservable.js +6 -5
- package/esm/configuration/configuration.js +2 -1
- package/esm/console/consoleObservable.js +2 -1
- package/esm/dataMap.js +1 -0
- package/esm/helper/byteUtils.js +16 -0
- package/esm/helper/contextHistory.js +1 -0
- package/esm/helper/createEventRateLimiter.js +1 -0
- package/esm/helper/errorTools.js +2 -1
- package/esm/helper/instrumentMethod.js +1 -3
- package/esm/helper/serialisation/contextManager.js +70 -0
- package/esm/helper/serialisation/heavyCustomerDataWarning.js +20 -0
- package/esm/helper/serialisation/jsonStringify.js +46 -0
- package/esm/helper/serialisation/rowData.js +33 -0
- package/esm/helper/timer.js +14 -0
- package/esm/helper/tools.js +1 -292
- package/esm/index.js +10 -1
- package/esm/init.js +6 -6
- package/esm/report/reportObservable.js +3 -2
- package/esm/session/sessionCookieStore.js +1 -0
- package/esm/session/sessionManagement.js +5 -2
- package/esm/session/sessionStore.js +7 -2
- package/esm/transport/batch.js +31 -85
- package/esm/transport/flushController.js +114 -0
- package/esm/transport/httpRequest.js +5 -2
- package/esm/transport/index.js +2 -1
- package/esm/transport/sendWithRetryStrategy.js +3 -1
- package/esm/transport/startBatchWithReplica.js +9 -2
- package/esm/user/index.js +1 -0
- package/esm/user/user.js +32 -0
- package/package.json +22 -22
- package/src/browser/addEventListener.js +50 -0
- package/src/browser/fetchObservable.js +5 -5
- package/src/browser/pageExitObservable.js +4 -5
- package/src/browser/runOnReadyState.js +16 -0
- package/src/browser/xhrObservable.js +57 -32
- package/src/configuration/configuration.js +1 -1
- package/src/console/consoleObservable.js +22 -12
- package/src/dataMap.js +1 -0
- package/src/helper/byteUtils.js +17 -0
- package/src/helper/contextHistory.js +1 -1
- package/src/helper/createEventRateLimiter.js +7 -9
- package/src/helper/errorTools.js +2 -1
- package/src/helper/instrumentMethod.js +1 -2
- package/src/helper/serialisation/contextManager.js +79 -0
- package/src/helper/serialisation/heavyCustomerDataWarning.js +28 -0
- package/src/helper/serialisation/jsonStringify.js +47 -0
- package/src/helper/serialisation/rowData.js +41 -0
- package/src/helper/timer.js +21 -0
- package/src/helper/tools.js +2 -301
- package/src/index.js +11 -0
- package/src/init.js +6 -6
- package/src/report/reportObservable.js +40 -25
- package/src/session/sessionCookieStore.js +24 -14
- package/src/session/sessionManagement.js +34 -17
- package/src/session/sessionStore.js +7 -2
- package/src/transport/batch.js +39 -91
- package/src/transport/flushController.js +115 -0
- package/src/transport/httpRequest.js +13 -6
- package/src/transport/index.js +1 -0
- package/src/transport/sendWithRetryStrategy.js +3 -7
- package/src/transport/startBatchWithReplica.js +11 -7
- package/src/user/index.js +1 -0
- package/src/user/user.js +31 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.addEventListener = addEventListener;
|
|
7
|
+
exports.addEventListeners = addEventListeners;
|
|
8
|
+
|
|
9
|
+
var _tools = require("../helper/tools");
|
|
10
|
+
|
|
11
|
+
var _getZoneJsOriginalValue = require("../helper/getZoneJsOriginalValue");
|
|
12
|
+
|
|
13
|
+
function addEventListener(eventTarget, event, listener, options) {
|
|
14
|
+
return addEventListeners(eventTarget, [event], listener, options);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Add event listeners to an event emitter object (Window, Element, mock object...). This provides
|
|
18
|
+
* a few conveniences compared to using `element.addEventListener` directly:
|
|
19
|
+
*
|
|
20
|
+
* * supports IE11 by:
|
|
21
|
+
* * using an option object only if needed
|
|
22
|
+
* * emulating the `once` option
|
|
23
|
+
*
|
|
24
|
+
* * wraps the listener with a `monitor` function
|
|
25
|
+
*
|
|
26
|
+
* * returns a `stop` function to remove the listener
|
|
27
|
+
*
|
|
28
|
+
* * with `once: true`, the listener will be called at most once, even if different events are
|
|
29
|
+
* listened
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
function addEventListeners(eventTarget, events, listener, options) {
|
|
34
|
+
var wrappedListener = options && options.once ? function (event) {
|
|
35
|
+
stop();
|
|
36
|
+
listener(event);
|
|
37
|
+
} : listener;
|
|
38
|
+
options = options && options.passive ? {
|
|
39
|
+
capture: options.capture,
|
|
40
|
+
passive: options.passive
|
|
41
|
+
} : options && options.capture;
|
|
42
|
+
var add = (0, _getZoneJsOriginalValue.getZoneJsOriginalValue)(eventTarget, 'addEventListener');
|
|
43
|
+
(0, _tools.each)(events, function (event) {
|
|
44
|
+
add.call(eventTarget, event, wrappedListener, options);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
var stop = function stop() {
|
|
48
|
+
var remove = (0, _getZoneJsOriginalValue.getZoneJsOriginalValue)(eventTarget, 'removeEventListener');
|
|
49
|
+
(0, _tools.each)(events, function (event) {
|
|
50
|
+
remove.call(eventTarget, event, wrappedListener, options);
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
stop: stop
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -13,8 +13,6 @@ var _tools = require("../helper/tools");
|
|
|
13
13
|
|
|
14
14
|
var _urlPolyfill = require("../helper/urlPolyfill");
|
|
15
15
|
|
|
16
|
-
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); }
|
|
17
|
-
|
|
18
16
|
var fetchObservable;
|
|
19
17
|
|
|
20
18
|
function initFetchObservable() {
|
|
@@ -52,8 +50,8 @@ function createFetchObservable() {
|
|
|
52
50
|
}
|
|
53
51
|
|
|
54
52
|
function beforeSend(observable, input, init) {
|
|
55
|
-
var method = init && init.method ||
|
|
56
|
-
var url = (0, _urlPolyfill.normalizeUrl)(
|
|
53
|
+
var method = init && init.method || input instanceof Request && input.method || 'GET';
|
|
54
|
+
var url = input instanceof Request ? input.url : (0, _urlPolyfill.normalizeUrl)(String(input));
|
|
57
55
|
var startClocks = (0, _tools.clocksNow)();
|
|
58
56
|
var context = {
|
|
59
57
|
state: 'start',
|
|
@@ -78,7 +76,8 @@ function afterSend(observable, responsePromise, startContext) {
|
|
|
78
76
|
context.error = response;
|
|
79
77
|
} else if ('status' in response) {
|
|
80
78
|
context.response = response;
|
|
81
|
-
context.responseType = response.type;
|
|
79
|
+
context.responseType = response instanceof Response && response.type || ''; // issue The Response type getter can only be used on instances of Response
|
|
80
|
+
|
|
82
81
|
context.status = response.status;
|
|
83
82
|
context.isAborted = false;
|
|
84
83
|
}
|
|
@@ -13,6 +13,8 @@ var _tools = require("../helper/tools");
|
|
|
13
13
|
|
|
14
14
|
var _enums = require("../helper/enums");
|
|
15
15
|
|
|
16
|
+
var _addEventListener = require("../browser/addEventListener");
|
|
17
|
+
|
|
16
18
|
var PageExitReason = {
|
|
17
19
|
HIDDEN: 'visibility_hidden',
|
|
18
20
|
UNLOADING: 'before_unload',
|
|
@@ -27,7 +29,7 @@ function createPageExitObservable() {
|
|
|
27
29
|
* Only event that guarantee to fire on mobile devices when the page transitions to background state
|
|
28
30
|
* (e.g. when user switches to a different application, goes to homescreen, etc), or is being unloaded.
|
|
29
31
|
*/
|
|
30
|
-
var visibilityChangeListener = (0,
|
|
32
|
+
var visibilityChangeListener = (0, _addEventListener.addEventListeners)(document, [_enums.DOM_EVENT.VISIBILITY_CHANGE, _enums.DOM_EVENT.FREEZE, _enums.DOM_EVENT.PAGE_HIDE], function (event) {
|
|
31
33
|
if (event.type === _enums.DOM_EVENT.VISIBILITY_CHANGE && document.visibilityState === 'hidden') {
|
|
32
34
|
/**
|
|
33
35
|
* Only event that guarantee to fire on mobile devices when the page transitions to background state
|
|
@@ -54,7 +56,7 @@ function createPageExitObservable() {
|
|
|
54
56
|
* - a page hide transition (cf: https://bugs.webkit.org/show_bug.cgi?id=188329)
|
|
55
57
|
*/
|
|
56
58
|
|
|
57
|
-
var beforeUnloadListener = (0,
|
|
59
|
+
var beforeUnloadListener = (0, _addEventListener.addEventListener)(window, _enums.DOM_EVENT.BEFORE_UNLOAD, function () {
|
|
58
60
|
observable.notify({
|
|
59
61
|
reason: PageExitReason.UNLOADING
|
|
60
62
|
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.runOnReadyState = runOnReadyState;
|
|
7
|
+
|
|
8
|
+
var _addEventListener = require("./addEventListener");
|
|
9
|
+
|
|
10
|
+
var _enums = require("../helper/enums");
|
|
11
|
+
|
|
12
|
+
function runOnReadyState(expectedReadyState, callback) {
|
|
13
|
+
if (document.readyState === expectedReadyState || document.readyState === 'complete') {
|
|
14
|
+
callback();
|
|
15
|
+
} else {
|
|
16
|
+
var eventName = expectedReadyState === 'complete' ? _enums.DOM_EVENT.LOAD : _enums.DOM_EVENT.DOM_CONTENT_LOADED;
|
|
17
|
+
(0, _addEventListener.addEventListener)(window, eventName, callback, {
|
|
18
|
+
once: true
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -13,6 +13,8 @@ var _urlPolyfill = require("../helper/urlPolyfill");
|
|
|
13
13
|
|
|
14
14
|
var _tools = require("../helper/tools");
|
|
15
15
|
|
|
16
|
+
var _addEventListener = require("../browser/addEventListener");
|
|
17
|
+
|
|
16
18
|
var xhrObservable;
|
|
17
19
|
var xhrContexts = {};
|
|
18
20
|
var DATA_FLUX_REQUEST_ID_KEY = '_DATAFLUX_REQUEST_UUID';
|
|
@@ -71,7 +73,7 @@ function sendXhr(observable) {
|
|
|
71
73
|
startContext.isAborted = false;
|
|
72
74
|
startContext.xhr = this;
|
|
73
75
|
var hasBeenReported = false;
|
|
74
|
-
var
|
|
76
|
+
var stopInstrumentingOnReadyStateChange = (0, _instrumentMethod.instrumentMethodAndCallOriginal)(this, 'onreadystatechange', {
|
|
75
77
|
before: function before() {
|
|
76
78
|
if (this.readyState === XMLHttpRequest.DONE) {
|
|
77
79
|
// Try to report the XHR as soon as possible, because the XHR may be mutated by the
|
|
@@ -81,11 +83,11 @@ function sendXhr(observable) {
|
|
|
81
83
|
onEnd.call(this);
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
|
-
});
|
|
86
|
+
}).stop;
|
|
85
87
|
|
|
86
88
|
var onEnd = function onEnd() {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
unsubscribeLoadEndListener();
|
|
90
|
+
stopInstrumentingOnReadyStateChange();
|
|
89
91
|
|
|
90
92
|
if (hasBeenReported) {
|
|
91
93
|
return;
|
|
@@ -100,7 +102,7 @@ function sendXhr(observable) {
|
|
|
100
102
|
clearRequestId.call(this);
|
|
101
103
|
};
|
|
102
104
|
|
|
103
|
-
|
|
105
|
+
var unsubscribeLoadEndListener = (0, _addEventListener.addEventListener)(this, 'loadend', onEnd).stop;
|
|
104
106
|
observable.notify(startContext);
|
|
105
107
|
}
|
|
106
108
|
|
|
@@ -15,6 +15,8 @@ var _display = require("../helper/display");
|
|
|
15
15
|
|
|
16
16
|
var _tools = require("../helper/tools");
|
|
17
17
|
|
|
18
|
+
var _byteUtils = require("../helper/byteUtils");
|
|
19
|
+
|
|
18
20
|
var _transportConfiguration = require("./transportConfiguration");
|
|
19
21
|
|
|
20
22
|
var DefaultPrivacyLevel = {
|
|
@@ -51,7 +53,7 @@ function validateAndBuildConfiguration(initConfiguration) {
|
|
|
51
53
|
* beacon payload max queue size implementation is 64kb
|
|
52
54
|
* ensure that we leave room for logs, rum and potential other users
|
|
53
55
|
*/
|
|
54
|
-
batchBytesLimit: 16 *
|
|
56
|
+
batchBytesLimit: 16 * _byteUtils.ONE_KIBI_BYTE,
|
|
55
57
|
eventRateLimiterThreshold: 3000,
|
|
56
58
|
|
|
57
59
|
/**
|
|
@@ -64,8 +66,8 @@ function validateAndBuildConfiguration(initConfiguration) {
|
|
|
64
66
|
* Logs intake limit
|
|
65
67
|
*/
|
|
66
68
|
batchMessagesLimit: 50,
|
|
67
|
-
messageBytesLimit: 256 *
|
|
68
|
-
resourceUrlLimit: 5 *
|
|
69
|
+
messageBytesLimit: 256 * _byteUtils.ONE_KIBI_BYTE,
|
|
70
|
+
resourceUrlLimit: 5 * _byteUtils.ONE_KIBI_BYTE
|
|
69
71
|
}, (0, _transportConfiguration.computeTransportConfiguration)(initConfiguration));
|
|
70
72
|
}
|
|
71
73
|
|
|
@@ -13,6 +13,8 @@ var _observable = require("../helper/observable");
|
|
|
13
13
|
|
|
14
14
|
var _tools = require("../helper/tools");
|
|
15
15
|
|
|
16
|
+
var _jsonStringify = require("../helper/serialisation/jsonStringify");
|
|
17
|
+
|
|
16
18
|
var _display = require("../helper/display");
|
|
17
19
|
|
|
18
20
|
var consoleObservablesByApi = {};
|
|
@@ -80,5 +82,5 @@ function formatConsoleParameters(param) {
|
|
|
80
82
|
return (0, _errorTools.formatErrorMessage)((0, _tracekit.computeStackTrace)(param));
|
|
81
83
|
}
|
|
82
84
|
|
|
83
|
-
return (0,
|
|
85
|
+
return (0, _jsonStringify.jsonStringify)(param, undefined, 2);
|
|
84
86
|
}
|
package/cjs/dataMap.js
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ONE_MEBI_BYTE = exports.ONE_KIBI_BYTE = void 0;
|
|
7
|
+
exports.computeBytesCount = computeBytesCount;
|
|
8
|
+
var ONE_KIBI_BYTE = 1024;
|
|
9
|
+
exports.ONE_KIBI_BYTE = ONE_KIBI_BYTE;
|
|
10
|
+
var ONE_MEBI_BYTE = 1024 * ONE_KIBI_BYTE; // eslint-disable-next-line no-control-regex
|
|
11
|
+
|
|
12
|
+
exports.ONE_MEBI_BYTE = ONE_MEBI_BYTE;
|
|
13
|
+
var HAS_MULTI_BYTES_CHARACTERS = /[^\u0000-\u007F]/;
|
|
14
|
+
|
|
15
|
+
function computeBytesCount(candidate) {
|
|
16
|
+
// Accurate bytes count computations can degrade performances when there is a lot of events to process
|
|
17
|
+
if (!HAS_MULTI_BYTES_CHARACTERS.test(candidate)) {
|
|
18
|
+
return candidate.length;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (window.TextEncoder !== undefined) {
|
|
22
|
+
return new TextEncoder().encode(candidate).length;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return new Blob([candidate]).size;
|
|
26
|
+
}
|
|
@@ -8,6 +8,8 @@ exports.ContextHistory = ContextHistory;
|
|
|
8
8
|
|
|
9
9
|
var _tools = require("./tools");
|
|
10
10
|
|
|
11
|
+
var _timer = require("./timer");
|
|
12
|
+
|
|
11
13
|
var END_OF_TIMES = Infinity;
|
|
12
14
|
var CLEAR_OLD_CONTEXTS_INTERVAL = _tools.ONE_MINUTE;
|
|
13
15
|
exports.CLEAR_OLD_CONTEXTS_INTERVAL = CLEAR_OLD_CONTEXTS_INTERVAL;
|
|
@@ -18,7 +20,7 @@ function ContextHistory(expireDelay) {
|
|
|
18
20
|
|
|
19
21
|
var _this = this;
|
|
20
22
|
|
|
21
|
-
this.clearOldContextsInterval = setInterval(function () {
|
|
23
|
+
this.clearOldContextsInterval = (0, _timer.setInterval)(function () {
|
|
22
24
|
_this.clearOldContexts();
|
|
23
25
|
}, CLEAR_OLD_CONTEXTS_INTERVAL);
|
|
24
26
|
}
|
|
@@ -107,7 +109,7 @@ ContextHistory.prototype.reset = function () {
|
|
|
107
109
|
|
|
108
110
|
|
|
109
111
|
ContextHistory.prototype.stop = function () {
|
|
110
|
-
clearInterval(this.clearOldContextsInterval);
|
|
112
|
+
(0, _timer.clearInterval)(this.clearOldContextsInterval);
|
|
111
113
|
};
|
|
112
114
|
|
|
113
115
|
ContextHistory.prototype.clearOldContexts = function () {
|
|
@@ -9,13 +9,15 @@ var _errorTools = require("./errorTools");
|
|
|
9
9
|
|
|
10
10
|
var _tools = require("./tools");
|
|
11
11
|
|
|
12
|
+
var _timer = require("./timer");
|
|
13
|
+
|
|
12
14
|
function createEventRateLimiter(eventType, limit, onLimitReached) {
|
|
13
15
|
var eventCount = 0;
|
|
14
16
|
var allowNextEvent = false;
|
|
15
17
|
return {
|
|
16
18
|
isLimitReached: function isLimitReached() {
|
|
17
19
|
if (eventCount === 0) {
|
|
18
|
-
setTimeout(function () {
|
|
20
|
+
(0, _timer.setTimeout)(function () {
|
|
19
21
|
eventCount = 0;
|
|
20
22
|
}, _tools.ONE_MINUTE);
|
|
21
23
|
}
|
package/cjs/helper/errorTools.js
CHANGED
|
@@ -14,6 +14,8 @@ exports.toStackTraceString = toStackTraceString;
|
|
|
14
14
|
|
|
15
15
|
var _tools = require("./tools");
|
|
16
16
|
|
|
17
|
+
var _jsonStringify = require("../helper/serialisation/jsonStringify");
|
|
18
|
+
|
|
17
19
|
var _tracekit = require("../tracekit");
|
|
18
20
|
|
|
19
21
|
var ErrorSource = {
|
|
@@ -41,7 +43,7 @@ function computeRawError(data) {
|
|
|
41
43
|
source: source,
|
|
42
44
|
handling: handling,
|
|
43
45
|
originalError: originalError,
|
|
44
|
-
message: nonErrorPrefix + ' ' + (0,
|
|
46
|
+
message: nonErrorPrefix + ' ' + (0, _jsonStringify.jsonStringify)(originalError),
|
|
45
47
|
stack: 'No stack, consider using an instance of Error',
|
|
46
48
|
handlingStack: handlingStack,
|
|
47
49
|
type: stackTrace && stackTrace.name
|
|
@@ -64,7 +66,7 @@ function computeRawError(data) {
|
|
|
64
66
|
function formatUnknownError(stackTrace, errorObject, nonErrorPrefix, handlingStack) {
|
|
65
67
|
if (!stackTrace || stackTrace.message === undefined && !(errorObject instanceof Error)) {
|
|
66
68
|
return {
|
|
67
|
-
message: nonErrorPrefix + '' + (0,
|
|
69
|
+
message: nonErrorPrefix + '' + (0, _jsonStringify.jsonStringify)(errorObject),
|
|
68
70
|
stack: 'No stack, consider using an instance of Error',
|
|
69
71
|
handlingStack: handlingStack,
|
|
70
72
|
type: stackTrace && stackTrace.name
|
|
@@ -9,7 +9,7 @@ exports.instrumentSetter = instrumentSetter;
|
|
|
9
9
|
|
|
10
10
|
var _tools = require("./tools");
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _timer = require("./timer");
|
|
13
13
|
|
|
14
14
|
function instrumentMethod(object, method, instrumentationFactory) {
|
|
15
15
|
var original = object[method];
|
|
@@ -70,11 +70,9 @@ function instrumentSetter(object, property, after) {
|
|
|
70
70
|
// component, see issue RUMF-1443
|
|
71
71
|
|
|
72
72
|
|
|
73
|
-
var setTimeout = (0, _getZoneJsOriginalValue.getZoneJsOriginalValue)(window, 'setTimeout');
|
|
74
|
-
|
|
75
73
|
var instrumentation = function instrumentation(thisObject, value) {
|
|
76
74
|
// put hooked setter into event loop to avoid of set latency
|
|
77
|
-
setTimeout(function () {
|
|
75
|
+
(0, _timer.setTimeout)(function () {
|
|
78
76
|
after(thisObject, value);
|
|
79
77
|
}, 0);
|
|
80
78
|
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BYTES_COMPUTATION_THROTTLING_DELAY = void 0;
|
|
7
|
+
exports.createContextManager = createContextManager;
|
|
8
|
+
|
|
9
|
+
var _byteUtils = require("../byteUtils");
|
|
10
|
+
|
|
11
|
+
var _tools = require("../tools");
|
|
12
|
+
|
|
13
|
+
var _jsonStringify = require("./jsonStringify");
|
|
14
|
+
|
|
15
|
+
var _heavyCustomerDataWarning = require("./heavyCustomerDataWarning");
|
|
16
|
+
|
|
17
|
+
var BYTES_COMPUTATION_THROTTLING_DELAY = 200;
|
|
18
|
+
exports.BYTES_COMPUTATION_THROTTLING_DELAY = BYTES_COMPUTATION_THROTTLING_DELAY;
|
|
19
|
+
|
|
20
|
+
function createContextManager(customerDataType, computeBytesCountImpl) {
|
|
21
|
+
if (typeof computeBytesCountImpl === 'undefined') {
|
|
22
|
+
computeBytesCountImpl = _byteUtils.computeBytesCount;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var context = {};
|
|
26
|
+
var bytesCountCache;
|
|
27
|
+
var alreadyWarned = false; // Throttle the bytes computation to minimize the impact on performance.
|
|
28
|
+
// Especially useful if the user call context APIs synchronously multiple times in a row
|
|
29
|
+
|
|
30
|
+
var computeBytesCountThrottled = (0, _tools.throttle)(function (context) {
|
|
31
|
+
bytesCountCache = computeBytesCountImpl((0, _jsonStringify.jsonStringify)(context));
|
|
32
|
+
|
|
33
|
+
if (!alreadyWarned) {
|
|
34
|
+
alreadyWarned = (0, _heavyCustomerDataWarning.warnIfCustomerDataLimitReached)(bytesCountCache, customerDataType);
|
|
35
|
+
}
|
|
36
|
+
}, BYTES_COMPUTATION_THROTTLING_DELAY).throttled;
|
|
37
|
+
return {
|
|
38
|
+
getBytesCount: function getBytesCount() {
|
|
39
|
+
return bytesCountCache;
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
/** @deprecated use getContext instead */
|
|
43
|
+
get: function get() {
|
|
44
|
+
return context;
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
/** @deprecated use setContextProperty instead */
|
|
48
|
+
add: function add(key, value) {
|
|
49
|
+
context[key] = value;
|
|
50
|
+
computeBytesCountThrottled(context);
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
/** @deprecated renamed to removeContextProperty */
|
|
54
|
+
remove: function remove(key) {
|
|
55
|
+
delete context[key];
|
|
56
|
+
computeBytesCountThrottled(context);
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
/** @deprecated use setContext instead */
|
|
60
|
+
set: function set(newContext) {
|
|
61
|
+
context = newContext;
|
|
62
|
+
computeBytesCountThrottled(context);
|
|
63
|
+
},
|
|
64
|
+
getContext: function getContext() {
|
|
65
|
+
return (0, _tools.deepClone)(context);
|
|
66
|
+
},
|
|
67
|
+
setContext: function setContext(newContext) {
|
|
68
|
+
context = (0, _tools.deepClone)(newContext);
|
|
69
|
+
computeBytesCountThrottled(context);
|
|
70
|
+
},
|
|
71
|
+
setContextProperty: function setContextProperty(key, property) {
|
|
72
|
+
context[key] = (0, _tools.deepClone)(property);
|
|
73
|
+
computeBytesCountThrottled(context);
|
|
74
|
+
},
|
|
75
|
+
removeContextProperty: function removeContextProperty(key) {
|
|
76
|
+
delete context[key];
|
|
77
|
+
computeBytesCountThrottled(context);
|
|
78
|
+
},
|
|
79
|
+
clearContext: function clearContext() {
|
|
80
|
+
context = {};
|
|
81
|
+
bytesCountCache = 0;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CustomerDataType = exports.CUSTOMER_DATA_BYTES_LIMIT = void 0;
|
|
7
|
+
exports.warnIfCustomerDataLimitReached = warnIfCustomerDataLimitReached;
|
|
8
|
+
|
|
9
|
+
var _byteUtils = require("../byteUtils");
|
|
10
|
+
|
|
11
|
+
var _display = require("../display");
|
|
12
|
+
|
|
13
|
+
// RUM and logs batch bytes limit is 16KB
|
|
14
|
+
// ensure that we leave room for other event attributes and maintain a decent amount of event per batch
|
|
15
|
+
// (3KB (customer data) + 1KB (other attributes)) * 4 (events per batch) = 16KB
|
|
16
|
+
var CUSTOMER_DATA_BYTES_LIMIT = 3 * _byteUtils.ONE_KIBI_BYTE;
|
|
17
|
+
exports.CUSTOMER_DATA_BYTES_LIMIT = CUSTOMER_DATA_BYTES_LIMIT;
|
|
18
|
+
var CustomerDataType = {
|
|
19
|
+
FeatureFlag: 'feature flag evaluation',
|
|
20
|
+
User: 'user',
|
|
21
|
+
GlobalContext: 'global context',
|
|
22
|
+
LoggerContext: 'logger context'
|
|
23
|
+
};
|
|
24
|
+
exports.CustomerDataType = CustomerDataType;
|
|
25
|
+
|
|
26
|
+
function warnIfCustomerDataLimitReached(bytesCount, customerDataType) {
|
|
27
|
+
if (bytesCount > CUSTOMER_DATA_BYTES_LIMIT) {
|
|
28
|
+
_display.display.warn('The ' + customerDataType + 'data is over ' + CUSTOMER_DATA_BYTES_LIMIT / _byteUtils.ONE_KIBI_BYTE + " KiB. On low connectivity, the SDK has the potential to exhaust the user's upload bandwidth.");
|
|
29
|
+
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.detachToJsonMethod = detachToJsonMethod;
|
|
7
|
+
exports.jsonStringify = jsonStringify;
|
|
8
|
+
|
|
9
|
+
var _tools = require("../tools");
|
|
10
|
+
|
|
11
|
+
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); }
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Custom implementation of JSON.stringify that ignores some toJSON methods. We need to do that
|
|
15
|
+
* because some sites badly override toJSON on certain objects. Removing all toJSON methods from
|
|
16
|
+
* nested values would be too costly, so we just detach them from the root value, and native classes
|
|
17
|
+
* used to build JSON values (Array and Object).
|
|
18
|
+
*
|
|
19
|
+
* Note: this still assumes that JSON.stringify is correct.
|
|
20
|
+
*/
|
|
21
|
+
function jsonStringify(value, replacer, space) {
|
|
22
|
+
if (_typeof(value) !== 'object' || value === null) {
|
|
23
|
+
return JSON.stringify(value);
|
|
24
|
+
} // Note: The order matter here. We need to detach toJSON methods on parent classes before their
|
|
25
|
+
// subclasses.
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
var restoreObjectPrototypeToJson = detachToJsonMethod(Object.prototype);
|
|
29
|
+
var restoreArrayPrototypeToJson = detachToJsonMethod(Array.prototype);
|
|
30
|
+
var restoreValuePrototypeToJson = detachToJsonMethod(Object.getPrototypeOf(value));
|
|
31
|
+
var restoreValueToJson = detachToJsonMethod(value);
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
return JSON.stringify(value, replacer, space);
|
|
35
|
+
} catch (_unused) {
|
|
36
|
+
return '<error: unable to serialize object>';
|
|
37
|
+
} finally {
|
|
38
|
+
restoreObjectPrototypeToJson();
|
|
39
|
+
restoreArrayPrototypeToJson();
|
|
40
|
+
restoreValuePrototypeToJson();
|
|
41
|
+
restoreValueToJson();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function detachToJsonMethod(value) {
|
|
46
|
+
var object = value;
|
|
47
|
+
var objectToJson = object.toJSON;
|
|
48
|
+
|
|
49
|
+
if (objectToJson) {
|
|
50
|
+
delete object.toJSON;
|
|
51
|
+
return function () {
|
|
52
|
+
object.toJSON = objectToJson;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return _tools.noop;
|
|
57
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.escapeFieldValueStr = escapeFieldValueStr;
|
|
7
|
+
exports.escapeJsonValue = escapeJsonValue;
|
|
8
|
+
exports.escapeRowData = escapeRowData;
|
|
9
|
+
exports.escapeRowField = escapeRowField;
|
|
10
|
+
|
|
11
|
+
var _jsonStringify = require("./jsonStringify");
|
|
12
|
+
|
|
13
|
+
var _tools = require("../tools");
|
|
14
|
+
|
|
15
|
+
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); }
|
|
16
|
+
|
|
17
|
+
function escapeRowData(str) {
|
|
18
|
+
if (_typeof(str) === 'object' && str) {
|
|
19
|
+
str = (0, _jsonStringify.jsonStringify)(str);
|
|
20
|
+
} else if (!(0, _tools.isString)(str)) {
|
|
21
|
+
return str;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var reg = /[\s=,"]/g;
|
|
25
|
+
return String(str).replace(reg, function (word) {
|
|
26
|
+
return '\\' + word;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function escapeJsonValue(value) {
|
|
31
|
+
if ((0, _tools.isString)(value)) {
|
|
32
|
+
return value;
|
|
33
|
+
} else {
|
|
34
|
+
return (0, _jsonStringify.jsonStringify)(value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function escapeFieldValueStr(str) {
|
|
39
|
+
return '"' + str.replace(/\\/g, '\\\\').replace(/[\\]*"/g, '"').replace(/"/g, '\\"') + '"';
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function escapeRowField(value) {
|
|
43
|
+
if (_typeof(value) === 'object' && value) {
|
|
44
|
+
return escapeFieldValueStr((0, _jsonStringify.jsonStringify)(value));
|
|
45
|
+
} else if ((0, _tools.isString)(value)) {
|
|
46
|
+
return escapeFieldValueStr(value);
|
|
47
|
+
} else {
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.clearInterval = clearInterval;
|
|
7
|
+
exports.clearTimeout = clearTimeout;
|
|
8
|
+
exports.setInterval = setInterval;
|
|
9
|
+
exports.setTimeout = setTimeout;
|
|
10
|
+
|
|
11
|
+
var _getZoneJsOriginalValue = require("./getZoneJsOriginalValue");
|
|
12
|
+
|
|
13
|
+
var _init = require("../init");
|
|
14
|
+
|
|
15
|
+
function setTimeout(callback, delay) {
|
|
16
|
+
return (0, _getZoneJsOriginalValue.getZoneJsOriginalValue)((0, _init.getGlobalObject)(), 'setTimeout')(callback, delay);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function clearTimeout(timeoutId) {
|
|
20
|
+
(0, _getZoneJsOriginalValue.getZoneJsOriginalValue)((0, _init.getGlobalObject)(), 'clearTimeout')(timeoutId);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function setInterval(callback, delay) {
|
|
24
|
+
return (0, _getZoneJsOriginalValue.getZoneJsOriginalValue)(window, 'setInterval')(callback, delay);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function clearInterval(timeoutId) {
|
|
28
|
+
(0, _getZoneJsOriginalValue.getZoneJsOriginalValue)(window, 'clearInterval')(timeoutId);
|
|
29
|
+
}
|