@cloudcare/browser-core 2.0.3 → 2.0.5

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.
Files changed (97) hide show
  1. package/cjs/browser/addEventListener.js +57 -0
  2. package/cjs/browser/pageExitObservable.js +4 -2
  3. package/cjs/browser/runOnReadyState.js +21 -0
  4. package/cjs/browser/xhrObservable.js +7 -5
  5. package/cjs/configuration/configuration.js +5 -3
  6. package/cjs/console/consoleObservable.js +3 -1
  7. package/cjs/dataMap.js +1 -0
  8. package/cjs/helper/byteUtils.js +26 -0
  9. package/cjs/helper/contextHistory.js +4 -2
  10. package/cjs/helper/createEventRateLimiter.js +3 -1
  11. package/cjs/helper/errorTools.js +4 -2
  12. package/cjs/helper/instrumentMethod.js +2 -4
  13. package/cjs/helper/serialisation/contextManager.js +84 -0
  14. package/cjs/helper/serialisation/heavyCustomerDataWarning.js +34 -0
  15. package/cjs/helper/serialisation/jsonStringify.js +57 -0
  16. package/cjs/helper/serialisation/rowData.js +50 -0
  17. package/cjs/helper/timer.js +29 -0
  18. package/cjs/helper/tools.js +10 -331
  19. package/cjs/index.js +117 -0
  20. package/cjs/init.js +6 -6
  21. package/cjs/report/reportObservable.js +4 -2
  22. package/cjs/session/sessionCookieStore.js +3 -1
  23. package/cjs/session/sessionManagement.js +10 -5
  24. package/cjs/session/sessionStore.js +10 -4
  25. package/cjs/transport/batch.js +40 -91
  26. package/cjs/transport/flushController.js +121 -0
  27. package/cjs/transport/httpRequest.js +6 -2
  28. package/cjs/transport/index.js +9 -1
  29. package/cjs/transport/sendWithRetryStrategy.js +8 -4
  30. package/cjs/transport/startBatchWithReplica.js +10 -2
  31. package/cjs/user/index.js +18 -0
  32. package/cjs/user/user.js +42 -0
  33. package/esm/browser/addEventListener.js +46 -0
  34. package/esm/browser/pageExitObservable.js +2 -1
  35. package/esm/browser/runOnReadyState.js +12 -0
  36. package/esm/browser/xhrObservable.js +6 -5
  37. package/esm/configuration/configuration.js +2 -1
  38. package/esm/console/consoleObservable.js +2 -1
  39. package/esm/dataMap.js +1 -0
  40. package/esm/helper/byteUtils.js +16 -0
  41. package/esm/helper/contextHistory.js +1 -0
  42. package/esm/helper/createEventRateLimiter.js +1 -0
  43. package/esm/helper/errorTools.js +2 -1
  44. package/esm/helper/instrumentMethod.js +1 -3
  45. package/esm/helper/serialisation/contextManager.js +70 -0
  46. package/esm/helper/serialisation/heavyCustomerDataWarning.js +20 -0
  47. package/esm/helper/serialisation/jsonStringify.js +46 -0
  48. package/esm/helper/serialisation/rowData.js +33 -0
  49. package/esm/helper/timer.js +14 -0
  50. package/esm/helper/tools.js +1 -292
  51. package/esm/index.js +10 -1
  52. package/esm/init.js +6 -6
  53. package/esm/report/reportObservable.js +3 -2
  54. package/esm/session/sessionCookieStore.js +1 -0
  55. package/esm/session/sessionManagement.js +5 -2
  56. package/esm/session/sessionStore.js +7 -2
  57. package/esm/transport/batch.js +31 -85
  58. package/esm/transport/flushController.js +114 -0
  59. package/esm/transport/httpRequest.js +5 -2
  60. package/esm/transport/index.js +2 -1
  61. package/esm/transport/sendWithRetryStrategy.js +3 -1
  62. package/esm/transport/startBatchWithReplica.js +9 -2
  63. package/esm/user/index.js +1 -0
  64. package/esm/user/user.js +32 -0
  65. package/package.json +22 -22
  66. package/src/browser/addEventListener.js +50 -0
  67. package/src/browser/pageExitObservable.js +4 -5
  68. package/src/browser/runOnReadyState.js +16 -0
  69. package/src/browser/xhrObservable.js +57 -32
  70. package/src/configuration/configuration.js +1 -1
  71. package/src/console/consoleObservable.js +22 -12
  72. package/src/dataMap.js +1 -0
  73. package/src/helper/byteUtils.js +17 -0
  74. package/src/helper/contextHistory.js +1 -1
  75. package/src/helper/createEventRateLimiter.js +7 -9
  76. package/src/helper/errorTools.js +2 -1
  77. package/src/helper/instrumentMethod.js +1 -2
  78. package/src/helper/serialisation/contextManager.js +79 -0
  79. package/src/helper/serialisation/heavyCustomerDataWarning.js +28 -0
  80. package/src/helper/serialisation/jsonStringify.js +47 -0
  81. package/src/helper/serialisation/rowData.js +41 -0
  82. package/src/helper/timer.js +21 -0
  83. package/src/helper/tools.js +2 -301
  84. package/src/index.js +11 -0
  85. package/src/init.js +6 -6
  86. package/src/report/reportObservable.js +40 -25
  87. package/src/session/sessionCookieStore.js +24 -14
  88. package/src/session/sessionManagement.js +34 -17
  89. package/src/session/sessionStore.js +7 -2
  90. package/src/transport/batch.js +39 -91
  91. package/src/transport/flushController.js +115 -0
  92. package/src/transport/httpRequest.js +13 -6
  93. package/src/transport/index.js +1 -0
  94. package/src/transport/sendWithRetryStrategy.js +3 -7
  95. package/src/transport/startBatchWithReplica.js +11 -7
  96. package/src/user/index.js +1 -0
  97. 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,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, _tools.addEventListeners)(document, [_enums.DOM_EVENT.VISIBILITY_CHANGE, _enums.DOM_EVENT.FREEZE, _enums.DOM_EVENT.PAGE_HIDE], function (event) {
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, _tools.addEventListener)(window, _enums.DOM_EVENT.BEFORE_UNLOAD, function () {
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 onreadyStateChangeInstrumentMethod = (0, _instrumentMethod.instrumentMethodAndCallOriginal)(this, 'onreadystatechange', {
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
- this.removeEventListener('loadend', onEnd);
88
- onreadyStateChangeInstrumentMethod.stop();
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
- this.addEventListener('loadend', onEnd);
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 * _tools.ONE_KIBI_BYTE,
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 * _tools.ONE_KIBI_BYTE,
68
- resourceUrlLimit: 5 * _tools.ONE_KIBI_BYTE
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, _tools.jsonStringify)(param, undefined, 2);
85
+ return (0, _jsonStringify.jsonStringify)(param, undefined, 2);
84
86
  }
package/cjs/dataMap.js CHANGED
@@ -58,6 +58,7 @@ var dataMap = {
58
58
  },
59
59
  fields: {
60
60
  session_replay_stats: '_dd.replay_stats',
61
+ session_is_active: 'session.is_active',
61
62
  view_error_count: 'view.error.count',
62
63
  view_resource_count: 'view.resource.count',
63
64
  view_long_task_count: 'view.long_task.count',
@@ -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
  }
@@ -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, _tools.jsonStringify)(originalError),
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, _tools.jsonStringify)(errorObject),
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 _getZoneJsOriginalValue = require("./getZoneJsOriginalValue");
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
+ }