@cloudcare/browser-core 3.1.18 → 3.1.20
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 +62 -32
- package/cjs/browser/fetchObservable.js.map +1 -1
- package/cjs/browser/xhrObservable.js +31 -39
- package/cjs/browser/xhrObservable.js.map +1 -1
- package/cjs/dataMap.js +1 -0
- package/cjs/dataMap.js.map +1 -1
- package/cjs/helper/deviceInfo.js +1 -2
- package/cjs/helper/deviceInfo.js.map +1 -1
- package/cjs/helper/enums.js +6 -1
- package/cjs/helper/enums.js.map +1 -1
- package/cjs/helper/instrumentMethod.js +47 -44
- package/cjs/helper/instrumentMethod.js.map +1 -1
- package/cjs/helper/tools.js +15 -0
- package/cjs/helper/tools.js.map +1 -1
- package/cjs/helper/valueHistory.js +123 -0
- package/cjs/helper/valueHistory.js.map +1 -0
- package/cjs/index.js +4 -4
- package/cjs/index.js.map +1 -1
- package/cjs/session/sessionManagement.js +4 -2
- package/cjs/session/sessionManagement.js.map +1 -1
- package/cjs/tracekit/tracekit.js +29 -25
- package/cjs/tracekit/tracekit.js.map +1 -1
- package/esm/browser/fetchObservable.js +63 -34
- package/esm/browser/fetchObservable.js.map +1 -1
- package/esm/browser/xhrObservable.js +33 -41
- package/esm/browser/xhrObservable.js.map +1 -1
- package/esm/dataMap.js +1 -0
- package/esm/dataMap.js.map +1 -1
- package/esm/helper/deviceInfo.js +1 -2
- package/esm/helper/deviceInfo.js.map +1 -1
- package/esm/helper/enums.js +4 -0
- package/esm/helper/enums.js.map +1 -1
- package/esm/helper/instrumentMethod.js +48 -44
- package/esm/helper/instrumentMethod.js.map +1 -1
- package/esm/helper/tools.js +13 -0
- package/esm/helper/tools.js.map +1 -1
- package/esm/helper/valueHistory.js +115 -0
- package/esm/helper/valueHistory.js.map +1 -0
- package/esm/index.js +1 -1
- package/esm/index.js.map +1 -1
- package/esm/session/sessionManagement.js +4 -2
- package/esm/session/sessionManagement.js.map +1 -1
- package/esm/tracekit/tracekit.js +30 -26
- package/esm/tracekit/tracekit.js.map +1 -1
- package/package.json +2 -2
- package/src/browser/fetchObservable.js +71 -50
- package/src/browser/xhrObservable.js +39 -54
- package/src/dataMap.js +1 -0
- package/src/helper/deviceInfo.js +1 -2
- package/src/helper/enums.js +4 -1
- package/src/helper/instrumentMethod.js +61 -44
- package/src/helper/tools.js +13 -0
- package/src/helper/valueHistory.js +116 -0
- package/src/index.js +1 -1
- package/src/session/sessionManagement.js +4 -2
- package/src/tracekit/tracekit.js +29 -25
- package/cjs/helper/contextHistory.js +0 -117
- package/cjs/helper/contextHistory.js.map +0 -1
- package/esm/helper/contextHistory.js +0 -109
- package/esm/helper/contextHistory.js.map +0 -1
- package/src/helper/contextHistory.js +0 -101
|
@@ -1,18 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { instrumentMethod } from '../helper/instrumentMethod'
|
|
2
2
|
import { Observable } from '../helper/observable'
|
|
3
3
|
import { normalizeUrl } from '../helper/urlPolyfill'
|
|
4
|
-
import {
|
|
5
|
-
shallowClone,
|
|
6
|
-
elapsed,
|
|
7
|
-
relativeNow,
|
|
8
|
-
clocksNow,
|
|
9
|
-
timeStampNow,
|
|
10
|
-
UUID
|
|
11
|
-
} from '../helper/tools'
|
|
4
|
+
import { shallowClone, elapsed, clocksNow, timeStampNow } from '../helper/tools'
|
|
12
5
|
import { addEventListener } from '../browser/addEventListener'
|
|
13
6
|
var xhrObservable
|
|
14
|
-
var xhrContexts =
|
|
15
|
-
var DATA_FLUX_REQUEST_ID_KEY = '_DATAFLUX_REQUEST_UUID'
|
|
7
|
+
var xhrContexts = new WeakMap()
|
|
16
8
|
export function initXhrObservable() {
|
|
17
9
|
if (!xhrObservable) {
|
|
18
10
|
xhrObservable = createXhrObservable()
|
|
@@ -22,30 +14,25 @@ export function initXhrObservable() {
|
|
|
22
14
|
|
|
23
15
|
function createXhrObservable() {
|
|
24
16
|
return new Observable(function (observable) {
|
|
25
|
-
var openInstrumentMethod =
|
|
17
|
+
var openInstrumentMethod = instrumentMethod(
|
|
26
18
|
XMLHttpRequest.prototype,
|
|
27
19
|
'open',
|
|
28
|
-
|
|
29
|
-
before: openXhr
|
|
30
|
-
}
|
|
20
|
+
openXhr
|
|
31
21
|
)
|
|
32
22
|
|
|
33
|
-
var sendInstrumentMethod =
|
|
23
|
+
var sendInstrumentMethod = instrumentMethod(
|
|
34
24
|
XMLHttpRequest.prototype,
|
|
35
25
|
'send',
|
|
36
|
-
{
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
26
|
+
function (call) {
|
|
27
|
+
sendXhr(call, observable)
|
|
28
|
+
},
|
|
29
|
+
{ computeHandlingStack: true }
|
|
41
30
|
)
|
|
42
31
|
|
|
43
|
-
var abortInstrumentMethod =
|
|
32
|
+
var abortInstrumentMethod = instrumentMethod(
|
|
44
33
|
XMLHttpRequest.prototype,
|
|
45
34
|
'abort',
|
|
46
|
-
|
|
47
|
-
before: abortXhr
|
|
48
|
-
}
|
|
35
|
+
abortXhr
|
|
49
36
|
)
|
|
50
37
|
|
|
51
38
|
return function () {
|
|
@@ -56,40 +43,41 @@ function createXhrObservable() {
|
|
|
56
43
|
})
|
|
57
44
|
}
|
|
58
45
|
|
|
59
|
-
function openXhr(
|
|
60
|
-
var
|
|
61
|
-
|
|
62
|
-
|
|
46
|
+
function openXhr(params) {
|
|
47
|
+
var xhr = params.target
|
|
48
|
+
var method = params.parameters[0]
|
|
49
|
+
var url = params.parameters[1]
|
|
50
|
+
xhrContexts.set(xhr, {
|
|
63
51
|
state: 'open',
|
|
64
52
|
method: String(method).toUpperCase(),
|
|
65
53
|
url: normalizeUrl(String(url))
|
|
66
|
-
}
|
|
54
|
+
})
|
|
67
55
|
}
|
|
68
56
|
|
|
69
|
-
function sendXhr(observable) {
|
|
70
|
-
var
|
|
57
|
+
function sendXhr(params, observable) {
|
|
58
|
+
var xhr = params.target
|
|
59
|
+
var handlingStack = params.handlingStack
|
|
60
|
+
var context = xhrContexts.get(xhr)
|
|
71
61
|
if (!context) {
|
|
72
62
|
return
|
|
73
63
|
}
|
|
74
64
|
var startContext = context
|
|
75
65
|
startContext.state = 'start'
|
|
76
|
-
startContext.startTime = relativeNow()
|
|
77
66
|
startContext.startClocks = clocksNow()
|
|
78
67
|
startContext.isAborted = false
|
|
79
|
-
startContext.xhr =
|
|
68
|
+
startContext.xhr = xhr
|
|
69
|
+
startContext.handlingStack = handlingStack
|
|
80
70
|
var hasBeenReported = false
|
|
81
|
-
var stopInstrumentingOnReadyStateChange =
|
|
82
|
-
|
|
71
|
+
var stopInstrumentingOnReadyStateChange = instrumentMethod(
|
|
72
|
+
xhr,
|
|
83
73
|
'onreadystatechange',
|
|
84
|
-
{
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
onEnd.call(this)
|
|
92
|
-
}
|
|
74
|
+
function () {
|
|
75
|
+
if (xhr.readyState === XMLHttpRequest.DONE) {
|
|
76
|
+
// Try to report the XHR as soon as possible, because the XHR may be mutated by the
|
|
77
|
+
// application during a future event. For example, Angular is calling .abort() on
|
|
78
|
+
// completed requests during a onreadystatechange event, so the status becomes '0'
|
|
79
|
+
// before the request is collected.
|
|
80
|
+
onEnd()
|
|
93
81
|
}
|
|
94
82
|
}
|
|
95
83
|
).stop
|
|
@@ -107,19 +95,16 @@ function sendXhr(observable) {
|
|
|
107
95
|
startContext.startClocks.timeStamp,
|
|
108
96
|
timeStampNow()
|
|
109
97
|
)
|
|
110
|
-
completeContext.status =
|
|
98
|
+
completeContext.status = xhr.status
|
|
111
99
|
observable.notify(shallowClone(completeContext))
|
|
112
|
-
clearRequestId.call(this)
|
|
113
100
|
}
|
|
114
|
-
var unsubscribeLoadEndListener = addEventListener(
|
|
101
|
+
var unsubscribeLoadEndListener = addEventListener(xhr, 'loadend', onEnd).stop
|
|
115
102
|
observable.notify(startContext)
|
|
116
103
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
function abortXhr() {
|
|
122
|
-
var context = xhrContexts[this[DATA_FLUX_REQUEST_ID_KEY]]
|
|
104
|
+
|
|
105
|
+
function abortXhr(params) {
|
|
106
|
+
var xhr = params.target
|
|
107
|
+
var context = xhrContexts.get(xhr)
|
|
123
108
|
if (context) {
|
|
124
109
|
context.isAborted = true
|
|
125
110
|
}
|
package/src/dataMap.js
CHANGED
|
@@ -67,6 +67,7 @@ export var dataMap = {
|
|
|
67
67
|
largest_contentful_paint_element_selector:
|
|
68
68
|
'view.largest_contentful_paint_element_selector',
|
|
69
69
|
cumulative_layout_shift: 'view.cumulative_layout_shift',
|
|
70
|
+
cumulative_layout_shift_time: 'view.cumulative_layout_shift_time',
|
|
70
71
|
cumulative_layout_shift_target_selector:
|
|
71
72
|
'view.cumulative_layout_shift_target_selector',
|
|
72
73
|
first_input_delay: 'view.first_input_delay',
|
package/src/helper/deviceInfo.js
CHANGED
|
@@ -612,7 +612,6 @@ var _deviceInfo = {}
|
|
|
612
612
|
if (typeof window !== 'undefined') {
|
|
613
613
|
_deviceInfo = {
|
|
614
614
|
os: MethodLibrary.getOS(),
|
|
615
|
-
MethodLibrary,
|
|
616
615
|
osVersion: MethodLibrary.getOSVersion().version,
|
|
617
616
|
osVersionMajor: MethodLibrary.getOSVersion().osMajor,
|
|
618
617
|
browser: MethodLibrary.getBrowserInfo().browser,
|
|
@@ -620,7 +619,7 @@ if (typeof window !== 'undefined') {
|
|
|
620
619
|
browserVersionMajor: MethodLibrary.getBrowserInfo().browserMajor,
|
|
621
620
|
screenSize: window.screen.width + '*' + window.screen.height,
|
|
622
621
|
networkType: MethodLibrary.getNetwork(),
|
|
623
|
-
|
|
622
|
+
device: MethodLibrary.getDeviceType()
|
|
624
623
|
}
|
|
625
624
|
}
|
|
626
625
|
export var deviceInfo = _deviceInfo
|
package/src/helper/enums.js
CHANGED
|
@@ -64,7 +64,10 @@ export var RumEventType = {
|
|
|
64
64
|
RESOURCE: 'resource',
|
|
65
65
|
LOGGER: 'logger'
|
|
66
66
|
}
|
|
67
|
-
|
|
67
|
+
export var RumLongTaskEntryType = {
|
|
68
|
+
LONG_TASK: 'long-task',
|
|
69
|
+
LONG_ANIMATION_FRAME: 'long-animation-frame'
|
|
70
|
+
}
|
|
68
71
|
export var ViewLoadingType = {
|
|
69
72
|
INITIAL_LOAD: 'initial_load',
|
|
70
73
|
ROUTE_CHANGE: 'route_change'
|
|
@@ -1,53 +1,70 @@
|
|
|
1
|
-
import { noop } from './tools'
|
|
1
|
+
import { noop, arrayFrom, startsWith } from './tools'
|
|
2
2
|
import { setTimeout } from './timer'
|
|
3
3
|
import { callMonitored } from './monitor'
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { createHandlingStack } from './errorTools'
|
|
5
|
+
export function instrumentMethod(targetPrototype, method, onPreCall, opts) {
|
|
6
|
+
var computeHandlingStack = opts && opts.computeHandlingStack
|
|
7
|
+
var original = targetPrototype[method]
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
if (typeof original !== 'function') {
|
|
10
|
+
if (startsWith(method, 'on')) {
|
|
11
|
+
original = noop
|
|
12
|
+
} else {
|
|
13
|
+
return { stop: noop }
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
var stopped = false
|
|
8
18
|
|
|
9
|
-
var
|
|
10
|
-
if (
|
|
11
|
-
return
|
|
19
|
+
var instrumentation = function () {
|
|
20
|
+
if (stopped) {
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call
|
|
22
|
+
return original.apply(this, arguments)
|
|
12
23
|
}
|
|
24
|
+
|
|
25
|
+
var parameters = arrayFrom(arguments)
|
|
26
|
+
|
|
27
|
+
var postCallCallback
|
|
28
|
+
|
|
29
|
+
callMonitored(onPreCall, null, [
|
|
30
|
+
{
|
|
31
|
+
target: this,
|
|
32
|
+
parameters: parameters,
|
|
33
|
+
onPostCall: function (callback) {
|
|
34
|
+
postCallCallback = callback
|
|
35
|
+
},
|
|
36
|
+
handlingStack: computeHandlingStack ? createHandlingStack() : undefined
|
|
37
|
+
}
|
|
38
|
+
])
|
|
39
|
+
|
|
40
|
+
var result = original.apply(this, parameters)
|
|
41
|
+
|
|
42
|
+
if (postCallCallback) {
|
|
43
|
+
callMonitored(postCallCallback, null, [result])
|
|
44
|
+
}
|
|
45
|
+
|
|
13
46
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
14
|
-
return
|
|
47
|
+
return result
|
|
15
48
|
}
|
|
16
|
-
|
|
49
|
+
|
|
50
|
+
targetPrototype[method] = instrumentation
|
|
51
|
+
|
|
17
52
|
return {
|
|
18
53
|
stop: function () {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
54
|
+
stopped = true
|
|
55
|
+
// If the instrumentation has been removed by a third party, keep the last one
|
|
56
|
+
if (targetPrototype[method] === instrumentation) {
|
|
57
|
+
targetPrototype[method] = original
|
|
23
58
|
}
|
|
24
59
|
}
|
|
25
60
|
}
|
|
26
61
|
}
|
|
27
62
|
|
|
28
|
-
export function
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
callMonitored(aliasOption.before, this, arguments)
|
|
34
|
-
// aliasOption.before.apply(this, arguments)
|
|
35
|
-
}
|
|
36
|
-
if (typeof original === 'function') {
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
38
|
-
result = original.apply(this, arguments)
|
|
39
|
-
}
|
|
40
|
-
if (aliasOption && aliasOption.after) {
|
|
41
|
-
callMonitored(aliasOption.after, this, arguments)
|
|
42
|
-
// aliasOption.after.apply(this, arguments)
|
|
43
|
-
}
|
|
44
|
-
return result
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function instrumentSetter(object, property, after) {
|
|
50
|
-
var originalDescriptor = Object.getOwnPropertyDescriptor(object, property)
|
|
63
|
+
export function instrumentSetter(targetPrototype, property, after) {
|
|
64
|
+
var originalDescriptor = Object.getOwnPropertyDescriptor(
|
|
65
|
+
targetPrototype,
|
|
66
|
+
property
|
|
67
|
+
)
|
|
51
68
|
if (
|
|
52
69
|
!originalDescriptor ||
|
|
53
70
|
!originalDescriptor.set ||
|
|
@@ -55,12 +72,13 @@ export function instrumentSetter(object, property, after) {
|
|
|
55
72
|
) {
|
|
56
73
|
return { stop: noop }
|
|
57
74
|
}
|
|
75
|
+
|
|
58
76
|
var stoppedInstrumentation = noop
|
|
59
|
-
var instrumentation = function (
|
|
77
|
+
var instrumentation = function (target, value) {
|
|
60
78
|
// put hooked setter into event loop to avoid of set latency
|
|
61
79
|
setTimeout(function () {
|
|
62
80
|
if (instrumentation !== stoppedInstrumentation) {
|
|
63
|
-
after(
|
|
81
|
+
after(target, value)
|
|
64
82
|
}
|
|
65
83
|
}, 0)
|
|
66
84
|
}
|
|
@@ -70,21 +88,20 @@ export function instrumentSetter(object, property, after) {
|
|
|
70
88
|
instrumentation(this, value)
|
|
71
89
|
}
|
|
72
90
|
|
|
73
|
-
Object.defineProperty(
|
|
91
|
+
Object.defineProperty(targetPrototype, property, {
|
|
74
92
|
set: instrumentationWrapper
|
|
75
93
|
})
|
|
76
94
|
|
|
77
95
|
return {
|
|
78
96
|
stop: function () {
|
|
79
97
|
if (
|
|
80
|
-
Object.getOwnPropertyDescriptor(
|
|
81
|
-
Object.getOwnPropertyDescriptor(
|
|
98
|
+
Object.getOwnPropertyDescriptor(targetPrototype, property) &&
|
|
99
|
+
Object.getOwnPropertyDescriptor(targetPrototype, property).set ===
|
|
82
100
|
instrumentationWrapper
|
|
83
101
|
) {
|
|
84
|
-
Object.defineProperty(
|
|
85
|
-
} else {
|
|
86
|
-
instrumentation = stoppedInstrumentation
|
|
102
|
+
Object.defineProperty(targetPrototype, property, originalDescriptor)
|
|
87
103
|
}
|
|
104
|
+
instrumentation = stoppedInstrumentation
|
|
88
105
|
}
|
|
89
106
|
}
|
|
90
107
|
}
|
package/src/helper/tools.js
CHANGED
|
@@ -1729,7 +1729,20 @@ export function startsWith(candidate, search) {
|
|
|
1729
1729
|
export function endsWith(candidate, search) {
|
|
1730
1730
|
return candidate.slice(-search.length) === search
|
|
1731
1731
|
}
|
|
1732
|
+
export function removeDuplicates(array) {
|
|
1733
|
+
var set = new Set()
|
|
1734
|
+
array.forEach(function (item) {
|
|
1735
|
+
set.add(item)
|
|
1736
|
+
})
|
|
1737
|
+
return arrayFrom(set)
|
|
1738
|
+
}
|
|
1732
1739
|
|
|
1740
|
+
export function removeItem(array, item) {
|
|
1741
|
+
var index = array.indexOf(item)
|
|
1742
|
+
if (index >= 0) {
|
|
1743
|
+
array.splice(index, 1)
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1733
1746
|
export function tryToClone(response) {
|
|
1734
1747
|
try {
|
|
1735
1748
|
return response.clone()
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { relativeNow, ONE_MINUTE, removeItem, addDuration } from './tools'
|
|
2
|
+
import { setInterval, clearInterval } from './timer'
|
|
3
|
+
var END_OF_TIMES = Infinity
|
|
4
|
+
|
|
5
|
+
export var CLEAR_OLD_VALUES_INTERVAL = ONE_MINUTE
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @param {expireDelay,maxEntries } params
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
export function createValueHistory(params) {
|
|
13
|
+
var expireDelay = params.expireDelay
|
|
14
|
+
var maxEntries = params.maxEntries
|
|
15
|
+
|
|
16
|
+
var entries = []
|
|
17
|
+
var clearOldValuesInterval = setInterval(function () {
|
|
18
|
+
return clearOldValues()
|
|
19
|
+
}, CLEAR_OLD_VALUES_INTERVAL)
|
|
20
|
+
|
|
21
|
+
function clearOldValues() {
|
|
22
|
+
var oldTimeThreshold = relativeNow() - expireDelay
|
|
23
|
+
while (
|
|
24
|
+
entries.length > 0 &&
|
|
25
|
+
entries[entries.length - 1].endTime < oldTimeThreshold
|
|
26
|
+
) {
|
|
27
|
+
entries.pop()
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function add(value, startTime) {
|
|
32
|
+
var entry = {
|
|
33
|
+
value: value,
|
|
34
|
+
startTime: startTime,
|
|
35
|
+
endTime: END_OF_TIMES,
|
|
36
|
+
remove: function () {
|
|
37
|
+
removeItem(entries, entry)
|
|
38
|
+
},
|
|
39
|
+
close: function (endTime) {
|
|
40
|
+
entry.endTime = endTime
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (maxEntries && entries.length >= maxEntries) {
|
|
45
|
+
entries.pop()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
entries.unshift(entry)
|
|
49
|
+
|
|
50
|
+
return entry
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function find(startTime, options) {
|
|
54
|
+
if (typeof startTime === 'undefined') {
|
|
55
|
+
startTime = END_OF_TIMES
|
|
56
|
+
}
|
|
57
|
+
if (typeof options === 'undefined') {
|
|
58
|
+
options = { returnInactive: false }
|
|
59
|
+
}
|
|
60
|
+
for (var entry of entries) {
|
|
61
|
+
if (entry.startTime <= startTime) {
|
|
62
|
+
if (options.returnInactive || startTime <= entry.endTime) {
|
|
63
|
+
return entry.value
|
|
64
|
+
}
|
|
65
|
+
break
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function closeActive(endTime) {
|
|
71
|
+
var latestEntry = entries[0]
|
|
72
|
+
if (latestEntry && latestEntry.endTime === END_OF_TIMES) {
|
|
73
|
+
latestEntry.close(endTime)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function findAll(startTime, duration) {
|
|
78
|
+
if (startTime === undefined) {
|
|
79
|
+
startTime = END_OF_TIMES
|
|
80
|
+
}
|
|
81
|
+
if (duration === undefined) {
|
|
82
|
+
duration = 0
|
|
83
|
+
}
|
|
84
|
+
var endTime = addDuration(startTime, duration)
|
|
85
|
+
return entries
|
|
86
|
+
.filter(function (entry) {
|
|
87
|
+
return entry.startTime <= endTime && startTime <= entry.endTime
|
|
88
|
+
})
|
|
89
|
+
.map(function (entry) {
|
|
90
|
+
return entry.value
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Remove all entries from this collection.
|
|
96
|
+
*/
|
|
97
|
+
function reset() {
|
|
98
|
+
entries = []
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Stop internal garbage collection of past entries.
|
|
103
|
+
*/
|
|
104
|
+
function stop() {
|
|
105
|
+
clearInterval(clearOldValuesInterval)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
add: add,
|
|
110
|
+
find: find,
|
|
111
|
+
closeActive: closeActive,
|
|
112
|
+
findAll: findAll,
|
|
113
|
+
reset: reset,
|
|
114
|
+
stop: stop
|
|
115
|
+
}
|
|
116
|
+
}
|
package/src/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
addEventListeners,
|
|
4
4
|
addEventListener
|
|
5
5
|
} from '../browser/addEventListener'
|
|
6
|
-
import {
|
|
6
|
+
import { createValueHistory } from '../helper/valueHistory'
|
|
7
7
|
import { startSessionStore } from './sessionStore'
|
|
8
8
|
import { SESSION_TIME_OUT_DELAY } from './sessionConstants'
|
|
9
9
|
import { DOM_EVENT } from '../helper/enums'
|
|
@@ -25,7 +25,9 @@ export var startSessionManager = function (
|
|
|
25
25
|
return sessionStore.stop()
|
|
26
26
|
})
|
|
27
27
|
|
|
28
|
-
var sessionContextHistory =
|
|
28
|
+
var sessionContextHistory = createValueHistory({
|
|
29
|
+
expireDelay: SESSION_CONTEXT_TIMEOUT_DELAY
|
|
30
|
+
})
|
|
29
31
|
stopCallbacks.push(function () {
|
|
30
32
|
return sessionContextHistory.stop()
|
|
31
33
|
})
|
package/src/tracekit/tracekit.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { instrumentMethod } from '../helper/instrumentMethod'
|
|
2
2
|
import { isNullUndefinedDefaultValue } from '../helper/tools'
|
|
3
3
|
import { computeStackTrace } from './computeStackTrace'
|
|
4
4
|
|
|
@@ -52,27 +52,31 @@ export function startUnhandledErrorCollection(callback) {
|
|
|
52
52
|
* Install a global onerror handler
|
|
53
53
|
*/
|
|
54
54
|
function instrumentOnError(callback) {
|
|
55
|
-
return
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
55
|
+
return instrumentMethod(window, 'onerror', function (params) {
|
|
56
|
+
var parameters = params.parameters
|
|
57
|
+
var messageObj = parameters[0]
|
|
58
|
+
var url = parameters[1]
|
|
59
|
+
var line = parameters[2]
|
|
60
|
+
var column = parameters[3]
|
|
61
|
+
var errorObj = parameters[4]
|
|
62
|
+
var stackTrace
|
|
63
|
+
if (errorObj instanceof Error) {
|
|
64
|
+
stackTrace = computeStackTrace(errorObj)
|
|
65
|
+
} else {
|
|
66
|
+
var location = {
|
|
67
|
+
url: url,
|
|
68
|
+
column: column,
|
|
69
|
+
line: line
|
|
70
|
+
}
|
|
71
|
+
var parse = tryToParseMessage(messageObj)
|
|
67
72
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
+
stackTrace = {
|
|
74
|
+
name: parse.name,
|
|
75
|
+
message: parse.message,
|
|
76
|
+
stack: [location]
|
|
73
77
|
}
|
|
74
|
-
callback(stackTrace, isNullUndefinedDefaultValue(errorObj, messageObj))
|
|
75
78
|
}
|
|
79
|
+
callback(stackTrace, isNullUndefinedDefaultValue(errorObj, messageObj))
|
|
76
80
|
})
|
|
77
81
|
}
|
|
78
82
|
function tryToParseMessage(messageObj) {
|
|
@@ -91,11 +95,11 @@ function tryToParseMessage(messageObj) {
|
|
|
91
95
|
* Install a global onunhandledrejection handler
|
|
92
96
|
*/
|
|
93
97
|
function instrumentUnhandledRejection(callback) {
|
|
94
|
-
return
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
return instrumentMethod(window, 'onunhandledrejection', function (params) {
|
|
99
|
+
var parameters = params.parameters
|
|
100
|
+
var e = parameters[0]
|
|
101
|
+
var reason = e.reason || 'Empty reason'
|
|
102
|
+
var stack = computeStackTrace(reason)
|
|
103
|
+
callback(stack, reason)
|
|
100
104
|
})
|
|
101
105
|
}
|