@grafana/faro-web-sdk 2.0.0-beta → 2.0.2
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/dist/bundle/faro-web-sdk.iife.js +1 -1
- package/dist/bundle/types/index.d.ts +3 -3
- package/dist/bundle/types/instrumentations/_internal/activityWindowTracker.d.ts +36 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/const.d.ts +4 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/domMutationMonitor.d.ts +4 -0
- package/dist/bundle/types/instrumentations/{userActions → _internal/monitors}/httpRequestMonitor.d.ts +1 -3
- package/dist/bundle/types/instrumentations/_internal/monitors/index.d.ts +5 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/interactionMonitor.d.ts +8 -0
- package/dist/{types/instrumentations/userActions → bundle/types/instrumentations/_internal/monitors}/performanceEntriesMonitor.d.ts +1 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/urlChangeMonitor.d.ts +10 -0
- package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/csp/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/index.d.ts +1 -0
- package/dist/bundle/types/instrumentations/navigation/index.d.ts +1 -0
- package/dist/bundle/types/instrumentations/navigation/instrumentation.d.ts +6 -0
- package/dist/bundle/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/const.d.ts +1 -4
- package/dist/bundle/types/instrumentations/userActions/index.d.ts +3 -2
- package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/processUserActionEventHandler.d.ts +1 -4
- package/dist/bundle/types/instrumentations/userActions/userActionController.d.ts +22 -0
- package/dist/bundle/types/instrumentations/userActions/util.d.ts +4 -0
- package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -2
- package/dist/bundle/types/transports/console/transport.d.ts +1 -1
- package/dist/bundle/types/transports/fetch/transport.d.ts +1 -1
- package/dist/cjs/config/getWebInstrumentations.js +1 -0
- package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
- package/dist/cjs/config/makeCoreConfig.js +20 -9
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js +140 -0
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/const.js +8 -0
- package/dist/cjs/instrumentations/_internal/monitors/const.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js +34 -0
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/{userActions → _internal/monitors}/httpRequestMonitor.js +45 -17
- package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/index.js +14 -0
- package/dist/cjs/instrumentations/_internal/monitors/index.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js +36 -0
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js +35 -0
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/types.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js +138 -0
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/index.js +3 -1
- package/dist/cjs/instrumentations/index.js.map +1 -1
- package/dist/cjs/instrumentations/navigation/index.js +6 -0
- package/dist/cjs/instrumentations/navigation/index.js.map +1 -0
- package/dist/cjs/instrumentations/navigation/instrumentation.js +68 -0
- package/dist/cjs/instrumentations/navigation/instrumentation.js.map +1 -0
- package/dist/cjs/instrumentations/performance/resource.js +4 -6
- package/dist/cjs/instrumentations/performance/resource.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/const.js +5 -5
- package/dist/cjs/instrumentations/userActions/const.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/index.js +3 -2
- package/dist/cjs/instrumentations/userActions/index.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/instrumentation.js +2 -2
- package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +8 -56
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/userActionController.js +125 -0
- package/dist/cjs/instrumentations/userActions/userActionController.js.map +1 -0
- package/dist/cjs/instrumentations/userActions/util.js +20 -0
- package/dist/cjs/instrumentations/userActions/util.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/instrumentation.js +1 -10
- package/dist/cjs/instrumentations/webVitals/instrumentation.js.map +1 -1
- package/dist/cjs/utils/webStorage.js +1 -1
- package/dist/cjs/utils/webStorage.js.map +1 -1
- package/dist/esm/config/getWebInstrumentations.js +2 -1
- package/dist/esm/config/getWebInstrumentations.js.map +1 -1
- package/dist/esm/config/makeCoreConfig.js +19 -9
- package/dist/esm/config/makeCoreConfig.js.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instrumentations/_internal/activityWindowTracker.js +113 -0
- package/dist/esm/instrumentations/_internal/activityWindowTracker.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/const.js +5 -0
- package/dist/esm/instrumentations/_internal/monitors/const.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/domMutationMonitor.js +30 -0
- package/dist/esm/instrumentations/_internal/monitors/domMutationMonitor.js.map +1 -0
- package/dist/esm/instrumentations/{userActions → _internal/monitors}/httpRequestMonitor.js +44 -17
- package/dist/esm/instrumentations/_internal/monitors/httpRequestMonitor.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/index.js +6 -0
- package/dist/esm/instrumentations/_internal/monitors/index.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/interactionMonitor.js +31 -0
- package/dist/esm/instrumentations/_internal/monitors/interactionMonitor.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/performanceEntriesMonitor.js +31 -0
- package/dist/esm/instrumentations/_internal/monitors/performanceEntriesMonitor.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/types.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/urlChangeMonitor.js +125 -0
- package/dist/esm/instrumentations/_internal/monitors/urlChangeMonitor.js.map +1 -0
- package/dist/esm/instrumentations/index.js +1 -0
- package/dist/esm/instrumentations/index.js.map +1 -1
- package/dist/esm/instrumentations/navigation/index.js +2 -0
- package/dist/esm/instrumentations/navigation/index.js.map +1 -0
- package/dist/esm/instrumentations/navigation/instrumentation.js +46 -0
- package/dist/esm/instrumentations/navigation/instrumentation.js.map +1 -0
- package/dist/esm/instrumentations/performance/resource.js +4 -6
- package/dist/esm/instrumentations/performance/resource.js.map +1 -1
- package/dist/esm/instrumentations/userActions/const.js +1 -4
- package/dist/esm/instrumentations/userActions/const.js.map +1 -1
- package/dist/esm/instrumentations/userActions/index.js +2 -1
- package/dist/esm/instrumentations/userActions/index.js.map +1 -1
- package/dist/esm/instrumentations/userActions/instrumentation.js +2 -2
- package/dist/esm/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js +9 -55
- package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/esm/instrumentations/userActions/userActionController.js +117 -0
- package/dist/esm/instrumentations/userActions/userActionController.js.map +1 -0
- package/dist/esm/instrumentations/userActions/util.js +17 -0
- package/dist/esm/instrumentations/userActions/util.js.map +1 -1
- package/dist/esm/instrumentations/webVitals/instrumentation.js +1 -10
- package/dist/esm/instrumentations/webVitals/instrumentation.js.map +1 -1
- package/dist/esm/utils/webStorage.js +1 -1
- package/dist/esm/utils/webStorage.js.map +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/instrumentations/_internal/activityWindowTracker.d.ts +36 -0
- package/dist/types/instrumentations/_internal/monitors/const.d.ts +4 -0
- package/dist/types/instrumentations/_internal/monitors/domMutationMonitor.d.ts +4 -0
- package/dist/types/instrumentations/{userActions → _internal/monitors}/httpRequestMonitor.d.ts +1 -3
- package/dist/types/instrumentations/_internal/monitors/index.d.ts +5 -0
- package/dist/types/instrumentations/_internal/monitors/interactionMonitor.d.ts +8 -0
- package/dist/{bundle/types/instrumentations/userActions → types/instrumentations/_internal/monitors}/performanceEntriesMonitor.d.ts +1 -0
- package/dist/types/instrumentations/_internal/monitors/urlChangeMonitor.d.ts +10 -0
- package/dist/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/csp/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/index.d.ts +1 -0
- package/dist/types/instrumentations/navigation/index.d.ts +1 -0
- package/dist/types/instrumentations/navigation/instrumentation.d.ts +6 -0
- package/dist/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/userActions/const.d.ts +1 -4
- package/dist/types/instrumentations/userActions/index.d.ts +3 -2
- package/dist/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/userActions/processUserActionEventHandler.d.ts +1 -4
- package/dist/types/instrumentations/userActions/userActionController.d.ts +22 -0
- package/dist/types/instrumentations/userActions/util.d.ts +4 -0
- package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -2
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/package.json +10 -9
- package/dist/bundle/types/instrumentations/userActions/domMutationMonitor.d.ts +0 -2
- package/dist/bundle/types/instrumentations/webVitals/webVitalsBasic.d.ts +0 -14
- package/dist/cjs/instrumentations/userActions/domMutationMonitor.js +0 -19
- package/dist/cjs/instrumentations/userActions/domMutationMonitor.js.map +0 -1
- package/dist/cjs/instrumentations/userActions/httpRequestMonitor.js.map +0 -1
- package/dist/cjs/instrumentations/userActions/performanceEntriesMonitor.js +0 -17
- package/dist/cjs/instrumentations/userActions/performanceEntriesMonitor.js.map +0 -1
- package/dist/cjs/instrumentations/userActions/types.js.map +0 -1
- package/dist/cjs/instrumentations/webVitals/webVitalsBasic.js +0 -36
- package/dist/cjs/instrumentations/webVitals/webVitalsBasic.js.map +0 -1
- package/dist/esm/instrumentations/userActions/domMutationMonitor.js +0 -16
- package/dist/esm/instrumentations/userActions/domMutationMonitor.js.map +0 -1
- package/dist/esm/instrumentations/userActions/httpRequestMonitor.js.map +0 -1
- package/dist/esm/instrumentations/userActions/performanceEntriesMonitor.js +0 -14
- package/dist/esm/instrumentations/userActions/performanceEntriesMonitor.js.map +0 -1
- package/dist/esm/instrumentations/userActions/types.js.map +0 -1
- package/dist/esm/instrumentations/webVitals/webVitalsBasic.js +0 -28
- package/dist/esm/instrumentations/webVitals/webVitalsBasic.js.map +0 -1
- package/dist/types/instrumentations/userActions/domMutationMonitor.d.ts +0 -2
- package/dist/types/instrumentations/webVitals/webVitalsBasic.d.ts +0 -14
- /package/dist/bundle/types/instrumentations/{userActions → _internal/monitors}/types.d.ts +0 -0
- /package/dist/cjs/instrumentations/{userActions → _internal/monitors}/types.js +0 -0
- /package/dist/esm/instrumentations/{userActions → _internal/monitors}/types.js +0 -0
- /package/dist/types/instrumentations/{userActions → _internal/monitors}/types.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domMutationMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/domMutationMonitor.ts"],"names":[],"mappings":";;AAQA,kDAmBC;AAGD,8EAMC;AApCD,gDAAgD;AAEhD,iCAAoD;AAGpD,IAAI,qBAAiE,CAAC;AACtE,IAAI,mBAAiD,CAAC;AAEtD,SAAgB,mBAAmB;IACjC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,IAAI,sBAAU,EAAsB,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,mBAAmB,GAAG,IAAI,gBAAgB,CAAC,UAAC,cAAc,EAAE,SAAS;YACnE,qBAAsB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,iCAAyB,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE;YACpC,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,iDAAiD;AACjD,SAAgB,iCAAiC;IAC/C,IAAI,mBAAmB,EAAE,CAAC;QACxB,mBAAmB,CAAC,UAAU,EAAE,CAAC;IACnC,CAAC;IACD,mBAAmB,GAAG,SAAS,CAAC;IAChC,qBAAqB,GAAG,SAAS,CAAC;AACpC,CAAC","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_DOM_MUTATION } from './const';\nimport type { DomMutationMessage } from './types';\n\nlet domMutationObservable: Observable<DomMutationMessage> | undefined;\nlet domMutationObserver: MutationObserver | undefined;\n\nexport function monitorDomMutations(): Observable<DomMutationMessage> {\n if (!domMutationObservable) {\n domMutationObservable = new Observable<DomMutationMessage>();\n }\n\n if (!domMutationObserver) {\n domMutationObserver = new MutationObserver((_mutationsList, _observer) => {\n domMutationObservable!.notify({ type: MESSAGE_TYPE_DOM_MUTATION });\n });\n\n domMutationObserver.observe(document, {\n attributes: true,\n childList: true,\n subtree: true,\n characterData: true,\n });\n }\n\n return domMutationObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetDomMutationMonitorForTests() {\n if (domMutationObserver) {\n domMutationObserver.disconnect();\n }\n domMutationObserver = undefined;\n domMutationObservable = undefined;\n}\n"]}
|
|
@@ -1,41 +1,54 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.monitorHttpRequests = monitorHttpRequests;
|
|
4
|
+
exports.__resetHttpRequestMonitorForTests = __resetHttpRequestMonitorForTests;
|
|
4
5
|
var faro_core_1 = require("@grafana/faro-core");
|
|
5
|
-
var url_1 = require("
|
|
6
|
+
var url_1 = require("../../../utils/url");
|
|
6
7
|
var const_1 = require("./const");
|
|
7
8
|
var apiTypeFetch = 'fetch';
|
|
8
9
|
var apiTypeXhr = 'xhr';
|
|
9
10
|
/**
|
|
10
11
|
* Monitors if any http requests are in progress.
|
|
11
12
|
*/
|
|
13
|
+
var httpRequestObservable;
|
|
14
|
+
var isInstrumented = false;
|
|
15
|
+
var originalXhrOpen;
|
|
16
|
+
var originalFetchFn;
|
|
12
17
|
function monitorHttpRequests() {
|
|
13
|
-
|
|
18
|
+
if (httpRequestObservable) {
|
|
19
|
+
return httpRequestObservable;
|
|
20
|
+
}
|
|
21
|
+
httpRequestObservable = new faro_core_1.Observable();
|
|
14
22
|
function emitStartMessage(requestProps) {
|
|
15
|
-
|
|
23
|
+
httpRequestObservable.notify({
|
|
16
24
|
type: const_1.MESSAGE_TYPE_HTTP_REQUEST_START,
|
|
17
25
|
request: requestProps,
|
|
18
26
|
});
|
|
19
27
|
}
|
|
20
28
|
function emitEndMessage(requestProps) {
|
|
21
|
-
|
|
29
|
+
httpRequestObservable.notify({
|
|
22
30
|
type: const_1.MESSAGE_TYPE_HTTP_REQUEST_END,
|
|
23
31
|
request: requestProps,
|
|
24
32
|
});
|
|
25
33
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
if (!isInstrumented) {
|
|
35
|
+
monitorFetch({
|
|
36
|
+
onRequestStart: emitStartMessage,
|
|
37
|
+
onRequestEnd: emitEndMessage,
|
|
38
|
+
});
|
|
39
|
+
monitorXhr({
|
|
40
|
+
onRequestStart: emitStartMessage,
|
|
41
|
+
onRequestEnd: emitEndMessage,
|
|
42
|
+
});
|
|
43
|
+
isInstrumented = true;
|
|
44
|
+
}
|
|
45
|
+
return httpRequestObservable;
|
|
35
46
|
}
|
|
36
47
|
function monitorXhr(_a) {
|
|
37
48
|
var onRequestStart = _a.onRequestStart, onRequestEnd = _a.onRequestEnd;
|
|
38
|
-
|
|
49
|
+
if (!originalXhrOpen) {
|
|
50
|
+
originalXhrOpen = XMLHttpRequest.prototype.open;
|
|
51
|
+
}
|
|
39
52
|
XMLHttpRequest.prototype.open = function () {
|
|
40
53
|
var url = arguments[1];
|
|
41
54
|
var isIgnoredUrl = (0, url_1.isUrlIgnored)(url);
|
|
@@ -63,12 +76,14 @@ function monitorXhr(_a) {
|
|
|
63
76
|
onRequestEnd({ url: url, method: method, requestId: requestId, apiType: apiTypeXhr });
|
|
64
77
|
}
|
|
65
78
|
});
|
|
66
|
-
|
|
79
|
+
originalXhrOpen.apply(this, arguments);
|
|
67
80
|
};
|
|
68
81
|
}
|
|
69
82
|
function monitorFetch(_a) {
|
|
70
83
|
var onRequestEnd = _a.onRequestEnd, onRequestStart = _a.onRequestStart;
|
|
71
|
-
|
|
84
|
+
if (!originalFetchFn) {
|
|
85
|
+
originalFetchFn = window.fetch;
|
|
86
|
+
}
|
|
72
87
|
window.fetch = function () {
|
|
73
88
|
var _a, _b;
|
|
74
89
|
var url = (_a = (0, url_1.getUrlFromResource)(arguments[0])) !== null && _a !== void 0 ? _a : '';
|
|
@@ -78,7 +93,7 @@ function monitorFetch(_a) {
|
|
|
78
93
|
if (!isIgnoredUrl) {
|
|
79
94
|
onRequestStart({ url: url, method: method, requestId: requestId, apiType: apiTypeFetch });
|
|
80
95
|
}
|
|
81
|
-
return
|
|
96
|
+
return originalFetchFn
|
|
82
97
|
.apply(this, arguments)
|
|
83
98
|
.then(function (response) {
|
|
84
99
|
if (!isIgnoredUrl) {
|
|
@@ -94,4 +109,17 @@ function monitorFetch(_a) {
|
|
|
94
109
|
});
|
|
95
110
|
};
|
|
96
111
|
}
|
|
112
|
+
// Test-only utility to reset instrumentation and singleton between tests
|
|
113
|
+
function __resetHttpRequestMonitorForTests() {
|
|
114
|
+
if (originalXhrOpen) {
|
|
115
|
+
XMLHttpRequest.prototype.open = originalXhrOpen;
|
|
116
|
+
}
|
|
117
|
+
if (originalFetchFn) {
|
|
118
|
+
window.fetch = originalFetchFn;
|
|
119
|
+
}
|
|
120
|
+
httpRequestObservable = undefined;
|
|
121
|
+
isInstrumented = false;
|
|
122
|
+
originalXhrOpen = undefined;
|
|
123
|
+
originalFetchFn = undefined;
|
|
124
|
+
}
|
|
97
125
|
//# sourceMappingURL=httpRequestMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpRequestMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/httpRequestMonitor.ts"],"names":[],"mappings":"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","sourcesContent":["import { genShortID, Observable } from '@grafana/faro-core';\n\nimport { getUrlFromResource, isUrlIgnored } from '../../../utils/url';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './const';\nimport type { HttpRequestEndMessage, HttpRequestMessagePayload, HttpRequestStartMessage } from './types';\n\ntype RequestProps = HttpRequestMessagePayload;\n\nconst apiTypeFetch = 'fetch';\nconst apiTypeXhr = 'xhr';\n\n/**\n * Monitors if any http requests are in progress.\n */\nlet httpRequestObservable: Observable<HttpRequestStartMessage | HttpRequestEndMessage> | undefined;\nlet isInstrumented = false;\nlet originalXhrOpen: typeof XMLHttpRequest.prototype.open | undefined;\nlet originalFetchFn: typeof window.fetch | undefined;\n\nexport function monitorHttpRequests(): Observable<HttpRequestStartMessage | HttpRequestEndMessage> {\n if (httpRequestObservable) {\n return httpRequestObservable;\n }\n\n httpRequestObservable = new Observable<HttpRequestStartMessage | HttpRequestEndMessage>();\n\n function emitStartMessage(requestProps: RequestProps) {\n httpRequestObservable!.notify({\n type: MESSAGE_TYPE_HTTP_REQUEST_START,\n request: requestProps,\n });\n }\n\n function emitEndMessage(requestProps: RequestProps) {\n httpRequestObservable!.notify({\n type: MESSAGE_TYPE_HTTP_REQUEST_END,\n request: requestProps,\n });\n }\n\n if (!isInstrumented) {\n monitorFetch({\n onRequestStart: emitStartMessage,\n onRequestEnd: emitEndMessage,\n });\n\n monitorXhr({\n onRequestStart: emitStartMessage,\n onRequestEnd: emitEndMessage,\n });\n\n isInstrumented = true;\n }\n\n return httpRequestObservable;\n}\n\nfunction monitorXhr({\n onRequestStart,\n onRequestEnd,\n}: {\n onRequestStart: (props: RequestProps) => void;\n onRequestEnd: (props: RequestProps) => void;\n}) {\n if (!originalXhrOpen) {\n originalXhrOpen = XMLHttpRequest.prototype.open;\n }\n\n XMLHttpRequest.prototype.open = function () {\n const url = arguments[1];\n const isIgnoredUrl = isUrlIgnored(url);\n const method = arguments[0];\n\n const requestId = genShortID();\n\n // request has started to load data.\n this.addEventListener('loadstart', function () {\n if (!isIgnoredUrl) {\n onRequestStart({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n // transaction completes successfully.\n this.addEventListener('load', function () {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n this.addEventListener('error', function () {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n this.addEventListener('abort', function () {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n originalXhrOpen!.apply(this, arguments as any);\n };\n}\n\nfunction monitorFetch({\n onRequestEnd,\n onRequestStart,\n}: {\n onRequestStart: (props: RequestProps) => void;\n onRequestEnd: (props: RequestProps) => void;\n}) {\n if (!originalFetchFn) {\n originalFetchFn = window.fetch;\n }\n\n window.fetch = function () {\n const url = getUrlFromResource(arguments[0]) ?? '';\n const isIgnoredUrl = isUrlIgnored(url);\n const method = (arguments[1] ?? {}).method;\n\n const requestId = genShortID();\n\n if (!isIgnoredUrl) {\n onRequestStart({ url, method, requestId, apiType: apiTypeFetch });\n }\n\n return originalFetchFn!\n .apply(this, arguments as any)\n .then((response) => {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeFetch });\n }\n return response;\n })\n .catch((error) => {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeFetch });\n }\n throw error;\n });\n };\n}\n\n// Test-only utility to reset instrumentation and singleton between tests\nexport function __resetHttpRequestMonitorForTests() {\n if (originalXhrOpen) {\n XMLHttpRequest.prototype.open = originalXhrOpen;\n }\n if (originalFetchFn) {\n (window as any).fetch = originalFetchFn;\n }\n httpRequestObservable = undefined;\n isInstrumented = false;\n originalXhrOpen = undefined;\n originalFetchFn = undefined;\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.monitorInteractions = exports.monitorUrlChanges = exports.monitorPerformanceEntries = exports.monitorHttpRequests = exports.monitorDomMutations = void 0;
|
|
4
|
+
var domMutationMonitor_1 = require("./domMutationMonitor");
|
|
5
|
+
Object.defineProperty(exports, "monitorDomMutations", { enumerable: true, get: function () { return domMutationMonitor_1.monitorDomMutations; } });
|
|
6
|
+
var httpRequestMonitor_1 = require("./httpRequestMonitor");
|
|
7
|
+
Object.defineProperty(exports, "monitorHttpRequests", { enumerable: true, get: function () { return httpRequestMonitor_1.monitorHttpRequests; } });
|
|
8
|
+
var performanceEntriesMonitor_1 = require("./performanceEntriesMonitor");
|
|
9
|
+
Object.defineProperty(exports, "monitorPerformanceEntries", { enumerable: true, get: function () { return performanceEntriesMonitor_1.monitorPerformanceEntries; } });
|
|
10
|
+
var urlChangeMonitor_1 = require("./urlChangeMonitor");
|
|
11
|
+
Object.defineProperty(exports, "monitorUrlChanges", { enumerable: true, get: function () { return urlChangeMonitor_1.monitorUrlChanges; } });
|
|
12
|
+
var interactionMonitor_1 = require("./interactionMonitor");
|
|
13
|
+
Object.defineProperty(exports, "monitorInteractions", { enumerable: true, get: function () { return interactionMonitor_1.monitorInteractions; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/index.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA;AAC5B,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA;AAC5B,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,uDAAuD;AAA9C,qHAAA,iBAAiB,OAAA;AAC1B,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA","sourcesContent":["export { monitorDomMutations } from './domMutationMonitor';\nexport { monitorHttpRequests } from './httpRequestMonitor';\nexport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nexport { monitorUrlChanges } from './urlChangeMonitor';\nexport { monitorInteractions } from './interactionMonitor';\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MESSAGE_TYPE_INTERACTION = void 0;
|
|
4
|
+
exports.monitorInteractions = monitorInteractions;
|
|
5
|
+
exports.__resetInteractionMonitorForTests = __resetInteractionMonitorForTests;
|
|
6
|
+
var faro_core_1 = require("@grafana/faro-core");
|
|
7
|
+
exports.MESSAGE_TYPE_INTERACTION = 'interaction';
|
|
8
|
+
var interactionObservable;
|
|
9
|
+
var registeredEventNames = new Set();
|
|
10
|
+
var eventNameToHandler = new Map();
|
|
11
|
+
function monitorInteractions(eventNames) {
|
|
12
|
+
if (!interactionObservable) {
|
|
13
|
+
interactionObservable = new faro_core_1.Observable();
|
|
14
|
+
}
|
|
15
|
+
eventNames.forEach(function (eventName) {
|
|
16
|
+
if (!registeredEventNames.has(eventName)) {
|
|
17
|
+
var handler = function () {
|
|
18
|
+
interactionObservable.notify({ type: exports.MESSAGE_TYPE_INTERACTION, name: eventName });
|
|
19
|
+
};
|
|
20
|
+
window.addEventListener(eventName, handler);
|
|
21
|
+
registeredEventNames.add(eventName);
|
|
22
|
+
eventNameToHandler.set(eventName, handler);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return interactionObservable;
|
|
26
|
+
}
|
|
27
|
+
// Test-only utility to reset state between tests
|
|
28
|
+
function __resetInteractionMonitorForTests() {
|
|
29
|
+
eventNameToHandler.forEach(function (handler, eventName) {
|
|
30
|
+
window.removeEventListener(eventName, handler);
|
|
31
|
+
});
|
|
32
|
+
eventNameToHandler.clear();
|
|
33
|
+
registeredEventNames.clear();
|
|
34
|
+
interactionObservable = undefined;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=interactionMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactionMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/interactionMonitor.ts"],"names":[],"mappings":";;;AAaA,kDAiBC;AAGD,8EAOC;AAxCD,gDAAgD;AAEnC,QAAA,wBAAwB,GAAG,aAAa,CAAC;AAOtD,IAAI,qBAAiE,CAAC;AACtE,IAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;AAC/C,IAAM,kBAAkB,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEjE,SAAgB,mBAAmB,CAAC,UAAoB;IACtD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,IAAI,sBAAU,EAAsB,CAAC;IAC/D,CAAC;IAED,UAAU,CAAC,OAAO,CAAC,UAAC,SAAS;QAC3B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,IAAM,OAAO,GAAG;gBACd,qBAAsB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gCAAwB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACrF,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC5C,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,iDAAiD;AACjD,SAAgB,iCAAiC;IAC/C,kBAAkB,CAAC,OAAO,CAAC,UAAC,OAAO,EAAE,SAAS;QAC5C,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAC3B,oBAAoB,CAAC,KAAK,EAAE,CAAC;IAC7B,qBAAqB,GAAG,SAAS,CAAC;AACpC,CAAC","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nexport const MESSAGE_TYPE_INTERACTION = 'interaction';\n\nexport type InteractionMessage = {\n type: typeof MESSAGE_TYPE_INTERACTION;\n name: string;\n};\n\nlet interactionObservable: Observable<InteractionMessage> | undefined;\nconst registeredEventNames = new Set<string>();\nconst eventNameToHandler = new Map<string, (e: Event) => void>();\n\nexport function monitorInteractions(eventNames: string[]): Observable<InteractionMessage> {\n if (!interactionObservable) {\n interactionObservable = new Observable<InteractionMessage>();\n }\n\n eventNames.forEach((eventName) => {\n if (!registeredEventNames.has(eventName)) {\n const handler = () => {\n interactionObservable!.notify({ type: MESSAGE_TYPE_INTERACTION, name: eventName });\n };\n window.addEventListener(eventName, handler);\n registeredEventNames.add(eventName);\n eventNameToHandler.set(eventName, handler);\n }\n });\n\n return interactionObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetInteractionMonitorForTests() {\n eventNameToHandler.forEach((handler, eventName) => {\n window.removeEventListener(eventName, handler);\n });\n eventNameToHandler.clear();\n registeredEventNames.clear();\n interactionObservable = undefined;\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.monitorPerformanceEntries = monitorPerformanceEntries;
|
|
4
|
+
exports.__resetPerformanceEntriesMonitorForTests = __resetPerformanceEntriesMonitorForTests;
|
|
5
|
+
var faro_core_1 = require("@grafana/faro-core");
|
|
6
|
+
var instrumentation_1 = require("../../performance/instrumentation");
|
|
7
|
+
var performanceConstants_1 = require("../../performance/performanceConstants");
|
|
8
|
+
var const_1 = require("./const");
|
|
9
|
+
var performanceObservable;
|
|
10
|
+
var isSubscribed = false;
|
|
11
|
+
var subscription;
|
|
12
|
+
function monitorPerformanceEntries() {
|
|
13
|
+
if (!performanceObservable) {
|
|
14
|
+
performanceObservable = new faro_core_1.Observable();
|
|
15
|
+
}
|
|
16
|
+
if (!isSubscribed) {
|
|
17
|
+
subscription = instrumentation_1.performanceEntriesSubscription.subscribe(function (data) {
|
|
18
|
+
if (data.type === performanceConstants_1.RESOURCE_ENTRY) {
|
|
19
|
+
performanceObservable.notify({ type: const_1.MESSAGE_TYPE_RESOURCE_ENTRY });
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
isSubscribed = true;
|
|
23
|
+
}
|
|
24
|
+
return performanceObservable;
|
|
25
|
+
}
|
|
26
|
+
// Test-only utility to reset state between tests
|
|
27
|
+
function __resetPerformanceEntriesMonitorForTests() {
|
|
28
|
+
if (subscription) {
|
|
29
|
+
subscription.unsubscribe();
|
|
30
|
+
}
|
|
31
|
+
subscription = undefined;
|
|
32
|
+
isSubscribed = false;
|
|
33
|
+
performanceObservable = undefined;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=performanceEntriesMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performanceEntriesMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/performanceEntriesMonitor.ts"],"names":[],"mappings":";;AAYA,8DAeC;AAGD,4FAOC;AArCD,gDAAgD;AAGhD,qEAAmF;AACnF,+EAAwE;AAExE,iCAAsD;AAEtD,IAAI,qBAA6C,CAAC;AAClD,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,IAAI,YAAsC,CAAC;AAE3C,SAAgB,yBAAyB;IACvC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,IAAI,sBAAU,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,gDAA8B,CAAC,SAAS,CAAC,UAAC,IAAI;YAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,qCAAc,EAAE,CAAC;gBACjC,qBAAsB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,mCAA2B,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,iDAAiD;AACjD,SAAgB,wCAAwC;IACtD,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IACD,YAAY,GAAG,SAAS,CAAC;IACzB,YAAY,GAAG,KAAK,CAAC;IACrB,qBAAqB,GAAG,SAAS,CAAC;AACpC,CAAC","sourcesContent":["import { Observable } from '@grafana/faro-core';\nimport type { Subscription } from '@grafana/faro-core';\n\nimport { performanceEntriesSubscription } from '../../performance/instrumentation';\nimport { RESOURCE_ENTRY } from '../../performance/performanceConstants';\n\nimport { MESSAGE_TYPE_RESOURCE_ENTRY } from './const';\n\nlet performanceObservable: Observable | undefined;\nlet isSubscribed = false;\nlet subscription: Subscription | undefined;\n\nexport function monitorPerformanceEntries(): Observable {\n if (!performanceObservable) {\n performanceObservable = new Observable();\n }\n\n if (!isSubscribed) {\n subscription = performanceEntriesSubscription.subscribe((data) => {\n if (data.type === RESOURCE_ENTRY) {\n performanceObservable!.notify({ type: MESSAGE_TYPE_RESOURCE_ENTRY });\n }\n });\n isSubscribed = true;\n }\n\n return performanceObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetPerformanceEntriesMonitorForTests() {\n if (subscription) {\n subscription.unsubscribe();\n }\n subscription = undefined;\n isSubscribed = false;\n performanceObservable = undefined;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\ntype RequestApiType = 'xhr' | 'fetch';\n\nexport type HttpRequestMessagePayload = {\n requestId: string;\n url: string;\n method: string;\n apiType: RequestApiType;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n request: HttpRequestMessagePayload;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n request: HttpRequestMessagePayload;\n};\n"]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MESSAGE_TYPE_URL_CHANGE = void 0;
|
|
4
|
+
exports.monitorUrlChanges = monitorUrlChanges;
|
|
5
|
+
exports.__resetUrlChangeMonitorForTests = __resetUrlChangeMonitorForTests;
|
|
6
|
+
var faro_core_1 = require("@grafana/faro-core");
|
|
7
|
+
exports.MESSAGE_TYPE_URL_CHANGE = 'url-change';
|
|
8
|
+
var urlChangeObservable;
|
|
9
|
+
var isInstrumented = false;
|
|
10
|
+
var lastHref;
|
|
11
|
+
var originalPushState;
|
|
12
|
+
var originalReplaceState;
|
|
13
|
+
var onPopStateHandler;
|
|
14
|
+
var onHashChangeHandler;
|
|
15
|
+
var onNavigateHandler;
|
|
16
|
+
var originalNavigateEventIntercept;
|
|
17
|
+
function monitorUrlChanges() {
|
|
18
|
+
if (!urlChangeObservable) {
|
|
19
|
+
urlChangeObservable = new faro_core_1.Observable();
|
|
20
|
+
lastHref = location.href;
|
|
21
|
+
}
|
|
22
|
+
function emit(trigger, toOverride) {
|
|
23
|
+
var next = toOverride !== null && toOverride !== void 0 ? toOverride : location.href;
|
|
24
|
+
if (next !== lastHref) {
|
|
25
|
+
urlChangeObservable.notify({ type: exports.MESSAGE_TYPE_URL_CHANGE, from: lastHref, to: next, trigger: trigger });
|
|
26
|
+
lastHref = next;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!isInstrumented) {
|
|
30
|
+
var hasNavigation = 'navigation' in window && 'NavigateEvent' in window;
|
|
31
|
+
if (hasNavigation) {
|
|
32
|
+
// Prefer Navigation API when supported: do not patch history or add popstate/hashchange listeners
|
|
33
|
+
onNavigateHandler = function (e) {
|
|
34
|
+
try {
|
|
35
|
+
var destination = e === null || e === void 0 ? void 0 : e.destination;
|
|
36
|
+
if ((destination === null || destination === void 0 ? void 0 : destination.sameDocument) && typeof destination.url === 'string') {
|
|
37
|
+
emit('navigate', destination.url);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (_err) {
|
|
41
|
+
// Swallow to avoid impacting host app
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
window.navigation.addEventListener('navigate', onNavigateHandler);
|
|
45
|
+
var NavigateEventConstructor = window.NavigateEvent;
|
|
46
|
+
if (NavigateEventConstructor &&
|
|
47
|
+
NavigateEventConstructor.prototype &&
|
|
48
|
+
typeof NavigateEventConstructor.prototype.intercept === 'function') {
|
|
49
|
+
if (!originalNavigateEventIntercept) {
|
|
50
|
+
originalNavigateEventIntercept = NavigateEventConstructor.prototype.intercept;
|
|
51
|
+
}
|
|
52
|
+
// Wrap intercept to detect soft navigations (cross-document turned same-document)
|
|
53
|
+
NavigateEventConstructor.prototype.intercept = function (options) {
|
|
54
|
+
try {
|
|
55
|
+
var canIntercept = !!(this === null || this === void 0 ? void 0 : this.canIntercept);
|
|
56
|
+
var destination = this === null || this === void 0 ? void 0 : this.destination;
|
|
57
|
+
if (canIntercept &&
|
|
58
|
+
destination &&
|
|
59
|
+
destination.sameDocument === false &&
|
|
60
|
+
typeof destination.url === 'string') {
|
|
61
|
+
emit('navigate-intercept', destination.url);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (_err) {
|
|
65
|
+
// ignore
|
|
66
|
+
}
|
|
67
|
+
return originalNavigateEventIntercept.call(this, options);
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
isInstrumented = true;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Fallback: history API patching + popstate/hashchange
|
|
74
|
+
if (!originalPushState) {
|
|
75
|
+
originalPushState = window.history.pushState;
|
|
76
|
+
}
|
|
77
|
+
window.history.pushState = function () {
|
|
78
|
+
var args = [];
|
|
79
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
80
|
+
args[_i] = arguments[_i];
|
|
81
|
+
}
|
|
82
|
+
var result = originalPushState.apply(window.history, args);
|
|
83
|
+
emit('pushState');
|
|
84
|
+
return result;
|
|
85
|
+
};
|
|
86
|
+
if (!originalReplaceState) {
|
|
87
|
+
originalReplaceState = window.history.replaceState;
|
|
88
|
+
}
|
|
89
|
+
window.history.replaceState = function () {
|
|
90
|
+
var args = [];
|
|
91
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
92
|
+
args[_i] = arguments[_i];
|
|
93
|
+
}
|
|
94
|
+
var result = originalReplaceState.apply(window.history, args);
|
|
95
|
+
emit('replaceState');
|
|
96
|
+
return result;
|
|
97
|
+
};
|
|
98
|
+
onPopStateHandler = function () { return emit('popstate'); };
|
|
99
|
+
onHashChangeHandler = function () { return emit('hashchange'); };
|
|
100
|
+
window.addEventListener('popstate', onPopStateHandler);
|
|
101
|
+
window.addEventListener('hashchange', onHashChangeHandler);
|
|
102
|
+
isInstrumented = true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return urlChangeObservable;
|
|
106
|
+
}
|
|
107
|
+
// Test-only utility to reset state between tests
|
|
108
|
+
function __resetUrlChangeMonitorForTests() {
|
|
109
|
+
var _a, _b;
|
|
110
|
+
if (onPopStateHandler) {
|
|
111
|
+
window.removeEventListener('popstate', onPopStateHandler);
|
|
112
|
+
}
|
|
113
|
+
if (onHashChangeHandler) {
|
|
114
|
+
window.removeEventListener('hashchange', onHashChangeHandler);
|
|
115
|
+
}
|
|
116
|
+
if (onNavigateHandler && ((_a = window.navigation) === null || _a === void 0 ? void 0 : _a.removeEventListener)) {
|
|
117
|
+
window.navigation.removeEventListener('navigate', onNavigateHandler);
|
|
118
|
+
}
|
|
119
|
+
if (originalPushState) {
|
|
120
|
+
window.history.pushState = originalPushState;
|
|
121
|
+
}
|
|
122
|
+
if (originalReplaceState) {
|
|
123
|
+
window.history.replaceState = originalReplaceState;
|
|
124
|
+
}
|
|
125
|
+
if (originalNavigateEventIntercept && ((_b = window.NavigateEvent) === null || _b === void 0 ? void 0 : _b.prototype)) {
|
|
126
|
+
window.NavigateEvent.prototype.intercept = originalNavigateEventIntercept;
|
|
127
|
+
}
|
|
128
|
+
urlChangeObservable = undefined;
|
|
129
|
+
isInstrumented = false;
|
|
130
|
+
lastHref = undefined;
|
|
131
|
+
onPopStateHandler = undefined;
|
|
132
|
+
onHashChangeHandler = undefined;
|
|
133
|
+
onNavigateHandler = undefined;
|
|
134
|
+
originalPushState = undefined;
|
|
135
|
+
originalReplaceState = undefined;
|
|
136
|
+
originalNavigateEventIntercept = undefined;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=urlChangeMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlChangeMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/urlChangeMonitor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nexport const MESSAGE_TYPE_URL_CHANGE = 'url-change';\n\nexport type UrlChangeMessage = {\n type: typeof MESSAGE_TYPE_URL_CHANGE;\n from: string;\n to: string;\n trigger: 'pushState' | 'replaceState' | 'popstate' | 'hashchange' | 'navigate' | 'navigate-intercept';\n};\n\nlet urlChangeObservable: Observable<UrlChangeMessage> | undefined;\nlet isInstrumented = false;\nlet lastHref: string | undefined;\nlet originalPushState: typeof window.history.pushState | undefined;\nlet originalReplaceState: typeof window.history.replaceState | undefined;\nlet onPopStateHandler: ((this: Window, ev: PopStateEvent) => any) | undefined;\nlet onHashChangeHandler: ((this: Window, ev: HashChangeEvent) => any) | undefined;\nlet onNavigateHandler: ((this: any, ev: any) => any) | undefined;\nlet originalNavigateEventIntercept: (((this: any, options?: any) => any) & { _faroWrapped?: boolean }) | undefined;\n\nexport function monitorUrlChanges(): Observable<UrlChangeMessage> {\n if (!urlChangeObservable) {\n urlChangeObservable = new Observable<UrlChangeMessage>();\n lastHref = location.href;\n }\n\n function emit(trigger: UrlChangeMessage['trigger'], toOverride?: string) {\n const next = toOverride ?? location.href;\n if (next !== lastHref) {\n urlChangeObservable!.notify({ type: MESSAGE_TYPE_URL_CHANGE, from: lastHref!, to: next, trigger });\n lastHref = next;\n }\n }\n\n if (!isInstrumented) {\n const hasNavigation = 'navigation' in window && 'NavigateEvent' in (window as any);\n\n if (hasNavigation) {\n // Prefer Navigation API when supported: do not patch history or add popstate/hashchange listeners\n onNavigateHandler = (e: any) => {\n try {\n const destination = e?.destination as { url?: string; sameDocument?: boolean } | undefined;\n if (destination?.sameDocument && typeof destination.url === 'string') {\n emit('navigate', destination.url);\n }\n } catch (_err) {\n // Swallow to avoid impacting host app\n }\n };\n (window as any).navigation.addEventListener('navigate', onNavigateHandler as any);\n\n const NavigateEventConstructor = (window as any).NavigateEvent;\n if (\n NavigateEventConstructor &&\n NavigateEventConstructor.prototype &&\n typeof NavigateEventConstructor.prototype.intercept === 'function'\n ) {\n if (!originalNavigateEventIntercept) {\n originalNavigateEventIntercept = NavigateEventConstructor.prototype.intercept;\n }\n\n // Wrap intercept to detect soft navigations (cross-document turned same-document)\n NavigateEventConstructor.prototype.intercept = function (this: any, options?: any) {\n try {\n const canIntercept = !!this?.canIntercept;\n const destination = this?.destination as { url?: string; sameDocument?: boolean } | undefined;\n if (\n canIntercept &&\n destination &&\n destination.sameDocument === false &&\n typeof destination.url === 'string'\n ) {\n emit('navigate-intercept', destination.url);\n }\n } catch (_err) {\n // ignore\n }\n return originalNavigateEventIntercept!.call(this, options);\n } as typeof originalNavigateEventIntercept;\n }\n\n isInstrumented = true;\n } else {\n // Fallback: history API patching + popstate/hashchange\n if (!originalPushState) {\n originalPushState = window.history.pushState;\n }\n window.history.pushState = function (...args: Parameters<typeof window.history.pushState>) {\n const result = originalPushState!.apply(window.history, args as any);\n emit('pushState');\n return result;\n } as typeof window.history.pushState;\n\n if (!originalReplaceState) {\n originalReplaceState = window.history.replaceState;\n }\n window.history.replaceState = function (...args: Parameters<typeof window.history.replaceState>) {\n const result = originalReplaceState!.apply(window.history, args as any);\n emit('replaceState');\n return result;\n } as typeof window.history.replaceState;\n\n onPopStateHandler = () => emit('popstate');\n onHashChangeHandler = () => emit('hashchange');\n window.addEventListener('popstate', onPopStateHandler);\n window.addEventListener('hashchange', onHashChangeHandler);\n\n isInstrumented = true;\n }\n }\n\n return urlChangeObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetUrlChangeMonitorForTests() {\n if (onPopStateHandler) {\n window.removeEventListener('popstate', onPopStateHandler);\n }\n if (onHashChangeHandler) {\n window.removeEventListener('hashchange', onHashChangeHandler);\n }\n if (onNavigateHandler && (window as any).navigation?.removeEventListener) {\n (window as any).navigation.removeEventListener('navigate', onNavigateHandler as any);\n }\n if (originalPushState) {\n window.history.pushState = originalPushState;\n }\n if (originalReplaceState) {\n window.history.replaceState = originalReplaceState;\n }\n if (originalNavigateEventIntercept && (window as any).NavigateEvent?.prototype) {\n (window as any).NavigateEvent.prototype.intercept = originalNavigateEventIntercept;\n }\n urlChangeObservable = undefined;\n isInstrumented = false;\n lastHref = undefined;\n onPopStateHandler = undefined;\n onHashChangeHandler = undefined;\n onNavigateHandler = undefined;\n originalPushState = undefined;\n originalReplaceState = undefined;\n originalNavigateEventIntercept = undefined;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CSPInstrumentation = exports.userActionDataAttribute = exports.UserActionInstrumentation = exports.PerformanceInstrumentation = exports.STORAGE_KEY = exports.SESSION_INACTIVITY_TIME = exports.SESSION_EXPIRATION_TIME = exports.MAX_SESSION_PERSISTENCE_TIME = exports.VolatileSessionsManager = exports.PersistentSessionsManager = exports.WebVitalsInstrumentation = exports.ViewInstrumentation = exports.parseStacktrace = exports.getStackFramesFromError = exports.getDataFromSafariExtensions = exports.ErrorsInstrumentation = exports.buildStackFrame = exports.ConsoleInstrumentation = exports.SessionInstrumentation = void 0;
|
|
3
|
+
exports.NavigationInstrumentation = exports.CSPInstrumentation = exports.userActionDataAttribute = exports.UserActionInstrumentation = exports.PerformanceInstrumentation = exports.STORAGE_KEY = exports.SESSION_INACTIVITY_TIME = exports.SESSION_EXPIRATION_TIME = exports.MAX_SESSION_PERSISTENCE_TIME = exports.VolatileSessionsManager = exports.PersistentSessionsManager = exports.WebVitalsInstrumentation = exports.ViewInstrumentation = exports.parseStacktrace = exports.getStackFramesFromError = exports.getDataFromSafariExtensions = exports.ErrorsInstrumentation = exports.buildStackFrame = exports.ConsoleInstrumentation = exports.SessionInstrumentation = void 0;
|
|
4
4
|
var session_1 = require("./session");
|
|
5
5
|
Object.defineProperty(exports, "SessionInstrumentation", { enumerable: true, get: function () { return session_1.SessionInstrumentation; } });
|
|
6
6
|
var console_1 = require("./console");
|
|
@@ -29,4 +29,6 @@ Object.defineProperty(exports, "UserActionInstrumentation", { enumerable: true,
|
|
|
29
29
|
Object.defineProperty(exports, "userActionDataAttribute", { enumerable: true, get: function () { return userActions_1.userActionDataAttribute; } });
|
|
30
30
|
var csp_1 = require("./csp");
|
|
31
31
|
Object.defineProperty(exports, "CSPInstrumentation", { enumerable: true, get: function () { return csp_1.CSPInstrumentation; } });
|
|
32
|
+
var navigation_1 = require("./navigation");
|
|
33
|
+
Object.defineProperty(exports, "NavigationInstrumentation", { enumerable: true, get: function () { return navigation_1.NavigationInstrumentation; } });
|
|
32
34
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/instrumentations/index.ts"],"names":[],"mappings":";;;AAAA,qCAAmD;AAA1C,iHAAA,sBAAsB,OAAA;AAE/B,qCAAmD;AAA1C,iHAAA,sBAAsB,OAAA;AAE/B,mCAMkB;AALhB,yGAAA,eAAe,OAAA;AACf,+GAAA,qBAAqB,OAAA;AACrB,qHAAA,2BAA2B,OAAA;AAC3B,iHAAA,uBAAuB,OAAA;AACvB,yGAAA,eAAe,OAAA;AAIjB,+BAA6C;AAApC,2GAAA,mBAAmB,OAAA;AAE5B,yCAAuD;AAA9C,qHAAA,wBAAwB,OAAA;AAEjC,qCAOmB;AANjB,oHAAA,yBAAyB,OAAA;AACzB,kHAAA,uBAAuB,OAAA;AACvB,uHAAA,4BAA4B,OAAA;AAC5B,kHAAA,uBAAuB,OAAA;AACvB,kHAAA,uBAAuB,OAAA;AACvB,sGAAA,WAAW,OAAA;AAGb,6CAA2D;AAAlD,yHAAA,0BAA0B,OAAA;AAEnC,6CAAmF;AAA1E,wHAAA,yBAAyB,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AAE3D,6BAA2C;AAAlC,yGAAA,kBAAkB,OAAA","sourcesContent":["export { SessionInstrumentation } from './session';\n\nexport { ConsoleInstrumentation } from './console';\n\nexport {\n buildStackFrame,\n ErrorsInstrumentation,\n getDataFromSafariExtensions,\n getStackFramesFromError,\n parseStacktrace,\n} from './errors';\nexport type { ErrorEvent, ExtendedPromiseRejectionEvent } from './errors';\n\nexport { ViewInstrumentation } from './view';\n\nexport { WebVitalsInstrumentation } from './webVitals';\n\nexport {\n PersistentSessionsManager,\n VolatileSessionsManager,\n MAX_SESSION_PERSISTENCE_TIME,\n SESSION_EXPIRATION_TIME,\n SESSION_INACTIVITY_TIME,\n STORAGE_KEY,\n} from './session';\n\nexport { PerformanceInstrumentation } from './performance';\n\nexport { UserActionInstrumentation, userActionDataAttribute } from './userActions';\n\nexport { CSPInstrumentation } from './csp';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/instrumentations/index.ts"],"names":[],"mappings":";;;AAAA,qCAAmD;AAA1C,iHAAA,sBAAsB,OAAA;AAE/B,qCAAmD;AAA1C,iHAAA,sBAAsB,OAAA;AAE/B,mCAMkB;AALhB,yGAAA,eAAe,OAAA;AACf,+GAAA,qBAAqB,OAAA;AACrB,qHAAA,2BAA2B,OAAA;AAC3B,iHAAA,uBAAuB,OAAA;AACvB,yGAAA,eAAe,OAAA;AAIjB,+BAA6C;AAApC,2GAAA,mBAAmB,OAAA;AAE5B,yCAAuD;AAA9C,qHAAA,wBAAwB,OAAA;AAEjC,qCAOmB;AANjB,oHAAA,yBAAyB,OAAA;AACzB,kHAAA,uBAAuB,OAAA;AACvB,uHAAA,4BAA4B,OAAA;AAC5B,kHAAA,uBAAuB,OAAA;AACvB,kHAAA,uBAAuB,OAAA;AACvB,sGAAA,WAAW,OAAA;AAGb,6CAA2D;AAAlD,yHAAA,0BAA0B,OAAA;AAEnC,6CAAmF;AAA1E,wHAAA,yBAAyB,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AAE3D,6BAA2C;AAAlC,yGAAA,kBAAkB,OAAA;AAE3B,2CAAyD;AAAhD,uHAAA,yBAAyB,OAAA","sourcesContent":["export { SessionInstrumentation } from './session';\n\nexport { ConsoleInstrumentation } from './console';\n\nexport {\n buildStackFrame,\n ErrorsInstrumentation,\n getDataFromSafariExtensions,\n getStackFramesFromError,\n parseStacktrace,\n} from './errors';\nexport type { ErrorEvent, ExtendedPromiseRejectionEvent } from './errors';\n\nexport { ViewInstrumentation } from './view';\n\nexport { WebVitalsInstrumentation } from './webVitals';\n\nexport {\n PersistentSessionsManager,\n VolatileSessionsManager,\n MAX_SESSION_PERSISTENCE_TIME,\n SESSION_EXPIRATION_TIME,\n SESSION_INACTIVITY_TIME,\n STORAGE_KEY,\n} from './session';\n\nexport { PerformanceInstrumentation } from './performance';\n\nexport { UserActionInstrumentation, userActionDataAttribute } from './userActions';\n\nexport { CSPInstrumentation } from './csp';\n\nexport { NavigationInstrumentation } from './navigation';\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NavigationInstrumentation = void 0;
|
|
4
|
+
var instrumentation_1 = require("./instrumentation");
|
|
5
|
+
Object.defineProperty(exports, "NavigationInstrumentation", { enumerable: true, get: function () { return instrumentation_1.NavigationInstrumentation; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/navigation/index.ts"],"names":[],"mappings":";;;AAAA,qDAA8D;AAArD,4HAAA,yBAAyB,OAAA","sourcesContent":["export { NavigationInstrumentation } from './instrumentation';\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.NavigationInstrumentation = void 0;
|
|
19
|
+
var faro_core_1 = require("@grafana/faro-core");
|
|
20
|
+
var activityWindowTracker_1 = require("../_internal/activityWindowTracker");
|
|
21
|
+
var domMutationMonitor_1 = require("../_internal/monitors/domMutationMonitor");
|
|
22
|
+
var httpRequestMonitor_1 = require("../_internal/monitors/httpRequestMonitor");
|
|
23
|
+
var interactionMonitor_1 = require("../_internal/monitors/interactionMonitor");
|
|
24
|
+
var urlChangeMonitor_1 = require("../_internal/monitors/urlChangeMonitor");
|
|
25
|
+
var NavigationInstrumentation = /** @class */ (function (_super) {
|
|
26
|
+
__extends(NavigationInstrumentation, _super);
|
|
27
|
+
function NavigationInstrumentation() {
|
|
28
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
29
|
+
_this.name = '@grafana/faro-web-sdk:instrumentation-navigation';
|
|
30
|
+
_this.version = faro_core_1.VERSION;
|
|
31
|
+
return _this;
|
|
32
|
+
}
|
|
33
|
+
NavigationInstrumentation.prototype.initialize = function () {
|
|
34
|
+
var httpMonitor = (0, httpRequestMonitor_1.monitorHttpRequests)();
|
|
35
|
+
var domMutationsMonitor = (0, domMutationMonitor_1.monitorDomMutations)();
|
|
36
|
+
var urlMonitor = (0, urlChangeMonitor_1.monitorUrlChanges)();
|
|
37
|
+
var interactionMonitor = (0, interactionMonitor_1.monitorInteractions)(['pointerdown', 'keydown']);
|
|
38
|
+
var activityWindowTracker = new activityWindowTracker_1.ActivityWindowTracker(new faro_core_1.Observable().merge(httpMonitor, domMutationsMonitor, urlMonitor), {
|
|
39
|
+
inactivityMs: 100,
|
|
40
|
+
drainTimeoutMs: 10 * 1000,
|
|
41
|
+
isOperationStart: function (msg) { return ((0, activityWindowTracker_1.isRequestStartMessage)(msg) ? msg.request.requestId : undefined); },
|
|
42
|
+
isOperationEnd: function (msg) { return ((0, activityWindowTracker_1.isRequestEndMessage)(msg) ? msg.request.requestId : undefined); },
|
|
43
|
+
});
|
|
44
|
+
activityWindowTracker
|
|
45
|
+
.filter(function (msg) {
|
|
46
|
+
return msg.message === 'tracking-ended';
|
|
47
|
+
})
|
|
48
|
+
.subscribe(function (msg) {
|
|
49
|
+
var _a, _b, _c;
|
|
50
|
+
if (((_a = msg.events) === null || _a === void 0 ? void 0 : _a.some(function (e) { return e.type === 'url-change'; })) &&
|
|
51
|
+
((_b = msg.events) === null || _b === void 0 ? void 0 : _b.some(function (e) { return e.type === 'dom-mutation'; }))) {
|
|
52
|
+
var urlChange = (_c = msg.events) === null || _c === void 0 ? void 0 : _c.find(function (e) { return e.type === 'url-change'; });
|
|
53
|
+
faro_core_1.faro.api.pushEvent('faro.navigation', {
|
|
54
|
+
fromUrl: urlChange === null || urlChange === void 0 ? void 0 : urlChange.from,
|
|
55
|
+
toUrl: urlChange === null || urlChange === void 0 ? void 0 : urlChange.to,
|
|
56
|
+
sameDocument: String(true),
|
|
57
|
+
duration: msg.duration,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
interactionMonitor.subscribe(function () {
|
|
62
|
+
activityWindowTracker.startTracking();
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
return NavigationInstrumentation;
|
|
66
|
+
}(faro_core_1.BaseInstrumentation));
|
|
67
|
+
exports.NavigationInstrumentation = NavigationInstrumentation;
|
|
68
|
+
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/navigation/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAoF;AAEpF,4EAAuH;AACvH,+EAA+E;AAC/E,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAE3E;IAA+C,6CAAmB;IAAlE;;QACW,UAAI,GAAG,kDAAkD,CAAC;QAC1D,aAAO,GAAG,mBAAO,CAAC;;IAyC7B,CAAC;IAvCU,8CAAU,GAAnB;QACE,IAAM,WAAW,GAAG,IAAA,wCAAmB,GAAE,CAAC;QAC1C,IAAM,mBAAmB,GAAG,IAAA,wCAAmB,GAAE,CAAC;QAClD,IAAM,UAAU,GAAG,IAAA,oCAAiB,GAAE,CAAC;QACvC,IAAM,kBAAkB,GAAG,IAAA,wCAAmB,EAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;QAE3E,IAAM,qBAAqB,GAAG,IAAI,6CAAqB,CACrD,IAAI,sBAAU,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,mBAAmB,EAAE,UAAU,CAAC,EACpE;YACE,YAAY,EAAE,GAAG;YACjB,cAAc,EAAE,EAAE,GAAG,IAAI;YACzB,gBAAgB,EAAE,UAAC,GAAG,IAAK,OAAA,CAAC,IAAA,6CAAqB,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EAAhE,CAAgE;YAC3F,cAAc,EAAE,UAAC,GAAG,IAAK,OAAA,CAAC,IAAA,2CAAmB,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EAA9D,CAA8D;SACxF,CACF,CAAC;QAEF,qBAAqB;aAClB,MAAM,CAAC,UAAC,GAAG;YACV,OAAO,GAAG,CAAC,OAAO,KAAK,gBAAgB,CAAC;QAC1C,CAAC,CAAC;aACD,SAAS,CAAC,UAAC,GAAG;;YACb,IACE,CAAA,MAAA,GAAG,CAAC,MAAM,0CAAE,IAAI,CAAC,UAAC,CAAM,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,YAAY,EAAvB,CAAuB,CAAC;iBACrD,MAAA,GAAG,CAAC,MAAM,0CAAE,IAAI,CAAC,UAAC,CAAM,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,cAAc,EAAzB,CAAyB,CAAC,CAAA,EACvD,CAAC;gBACD,IAAM,SAAS,GAAG,MAAA,GAAG,CAAC,MAAM,0CAAE,IAAI,CAAC,UAAC,CAAM,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,YAAY,EAAvB,CAAuB,CAAC,CAAC;gBACxE,gBAAI,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE;oBACpC,OAAO,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI;oBACxB,KAAK,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,EAAE;oBACpB,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC;oBAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,kBAAkB,CAAC,SAAS,CAAC;YAC3B,qBAAqB,CAAC,aAAa,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IACH,gCAAC;AAAD,CAAC,AA3CD,CAA+C,+BAAmB,GA2CjE;AA3CY,8DAAyB","sourcesContent":["import { BaseInstrumentation, faro, Observable, VERSION } from '@grafana/faro-core';\n\nimport { ActivityWindowTracker, isRequestEndMessage, isRequestStartMessage } from '../_internal/activityWindowTracker';\nimport { monitorDomMutations } from '../_internal/monitors/domMutationMonitor';\nimport { monitorHttpRequests } from '../_internal/monitors/httpRequestMonitor';\nimport { monitorInteractions } from '../_internal/monitors/interactionMonitor';\nimport { monitorUrlChanges } from '../_internal/monitors/urlChangeMonitor';\n\nexport class NavigationInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-navigation';\n readonly version = VERSION;\n\n override initialize(): void {\n const httpMonitor = monitorHttpRequests();\n const domMutationsMonitor = monitorDomMutations();\n const urlMonitor = monitorUrlChanges();\n const interactionMonitor = monitorInteractions(['pointerdown', 'keydown']);\n\n const activityWindowTracker = new ActivityWindowTracker(\n new Observable().merge(httpMonitor, domMutationsMonitor, urlMonitor),\n {\n inactivityMs: 100,\n drainTimeoutMs: 10 * 1000,\n isOperationStart: (msg) => (isRequestStartMessage(msg) ? msg.request.requestId : undefined),\n isOperationEnd: (msg) => (isRequestEndMessage(msg) ? msg.request.requestId : undefined),\n }\n );\n\n activityWindowTracker\n .filter((msg) => {\n return msg.message === 'tracking-ended';\n })\n .subscribe((msg) => {\n if (\n msg.events?.some((e: any) => e.type === 'url-change') &&\n msg.events?.some((e: any) => e.type === 'dom-mutation')\n ) {\n const urlChange = msg.events?.find((e: any) => e.type === 'url-change');\n faro.api.pushEvent('faro.navigation', {\n fromUrl: urlChange?.from,\n toUrl: urlChange?.to,\n sameDocument: String(true),\n duration: msg.duration,\n });\n }\n });\n\n interactionMonitor.subscribe(() => {\n activityWindowTracker.startTracking();\n });\n }\n}\n"]}
|
|
@@ -24,18 +24,16 @@ function observeResourceTimings(faroNavigationId, pushEvent, observable) {
|
|
|
24
24
|
for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
|
|
25
25
|
var resourceEntryRaw = entries_1[_i];
|
|
26
26
|
if ((0, url_1.isUrlIgnored)(resourceEntryRaw.name)) {
|
|
27
|
-
|
|
27
|
+
continue;
|
|
28
28
|
}
|
|
29
|
+
observable === null || observable === void 0 ? void 0 : observable.notify({
|
|
30
|
+
type: performanceConstants_1.RESOURCE_ENTRY,
|
|
31
|
+
});
|
|
29
32
|
var resourceEntryJson = resourceEntryRaw.toJSON();
|
|
30
33
|
var spanContext = (0, performanceUtils_1.getSpanContextFromServerTiming)(resourceEntryJson === null || resourceEntryJson === void 0 ? void 0 : resourceEntryJson.serverTiming);
|
|
31
34
|
if ((trackResources == null && (0, performanceUtils_1.includePerformanceEntry)(resourceEntryJson, DEFAULT_TRACK_RESOURCES)) ||
|
|
32
35
|
trackResources) {
|
|
33
36
|
var faroResourceEntry = __assign(__assign({}, (0, performanceUtils_1.createFaroResourceTiming)(resourceEntryJson)), { faroNavigationId: faroNavigationId, faroResourceId: (0, faro_core_1.genShortID)() });
|
|
34
|
-
if (faro_core_1.faro.config.trackUserActionsPreview) {
|
|
35
|
-
observable === null || observable === void 0 ? void 0 : observable.notify({
|
|
36
|
-
type: performanceConstants_1.RESOURCE_ENTRY,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
37
|
pushEvent('faro.performance.resource', faroResourceEntry, undefined, {
|
|
40
38
|
spanContext: spanContext,
|
|
41
39
|
timestampOverwriteMs: performance.timeOrigin + resourceEntryJson.startTime,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/resource.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAaA,
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/resource.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAaA,wDA4CC;AAzDD,gDAAsD;AAGtD,uCAA+C;AAE/C,+DAAwD;AACxD,uDAAuH;AAKvH,IAAM,uBAAuB,GAAG,EAAE,aAAa,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;AAE/E,SAAgB,sBAAsB,CACpC,gBAAwB,EACxB,SAAiC,EACjC,UAA4C;IAE5C,IAAM,cAAc,GAAG,gBAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IAElD,IAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,UAAC,eAAe;QACvD,IAAM,OAAO,GAAG,eAAe,CAAC,UAAU,EAAE,CAAC;QAE7C,KAA+B,UAAO,EAAP,mBAAO,EAAP,qBAAO,EAAP,IAAO,EAAE,CAAC;YAApC,IAAM,gBAAgB,gBAAA;YACzB,IAAI,IAAA,kBAAY,EAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,qCAAc;aACrB,CAAC,CAAC;YAEH,IAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;YACpD,IAAI,WAAW,GAAgB,IAAA,iDAA8B,EAAC,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,YAAY,CAAC,CAAC;YAE/F,IACE,CAAC,cAAc,IAAI,IAAI,IAAI,IAAA,0CAAuB,EAAC,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;gBAC/F,cAAc,EACd,CAAC;gBACD,IAAM,iBAAiB,yBAClB,IAAA,2CAAwB,EAAC,iBAAiB,CAAC,KAC9C,gBAAgB,kBAAA,EAChB,cAAc,EAAE,IAAA,sBAAU,GAAE,GAC7B,CAAC;gBAEF,SAAS,CAAC,2BAA2B,EAAE,iBAAiB,EAAE,SAAS,EAAE;oBACnE,WAAW,aAAA;oBACX,oBAAoB,EAAE,WAAW,CAAC,UAAU,GAAG,iBAAiB,CAAC,SAAS;iBAC3E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC;QACf,IAAI,EAAE,qCAAc;QACpB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { faro, genShortID } from '@grafana/faro-core';\nimport type { EventsAPI, Observable, PushEventOptions } from '@grafana/faro-core';\n\nimport { isUrlIgnored } from '../../utils/url';\n\nimport { RESOURCE_ENTRY } from './performanceConstants';\nimport { createFaroResourceTiming, getSpanContextFromServerTiming, includePerformanceEntry } from './performanceUtils';\nimport type { ResourceEntryMessage } from './types';\n\ntype SpanContext = PushEventOptions['spanContext'];\n\nconst DEFAULT_TRACK_RESOURCES = { initiatorType: ['xmlhttprequest', 'fetch'] };\n\nexport function observeResourceTimings(\n faroNavigationId: string,\n pushEvent: EventsAPI['pushEvent'],\n observable: Observable<ResourceEntryMessage>\n) {\n const trackResources = faro.config.trackResources;\n\n const observer = new PerformanceObserver((observedEntries) => {\n const entries = observedEntries.getEntries();\n\n for (const resourceEntryRaw of entries) {\n if (isUrlIgnored(resourceEntryRaw.name)) {\n continue;\n }\n\n observable?.notify({\n type: RESOURCE_ENTRY,\n });\n\n const resourceEntryJson = resourceEntryRaw.toJSON();\n let spanContext: SpanContext = getSpanContextFromServerTiming(resourceEntryJson?.serverTiming);\n\n if (\n (trackResources == null && includePerformanceEntry(resourceEntryJson, DEFAULT_TRACK_RESOURCES)) ||\n trackResources\n ) {\n const faroResourceEntry = {\n ...createFaroResourceTiming(resourceEntryJson),\n faroNavigationId,\n faroResourceId: genShortID(),\n };\n\n pushEvent('faro.performance.resource', faroResourceEntry, undefined, {\n spanContext,\n timestampOverwriteMs: performance.timeOrigin + resourceEntryJson.startTime,\n });\n }\n }\n });\n\n observer.observe({\n type: RESOURCE_ENTRY,\n buffered: true,\n });\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';
|
|
5
|
-
exports.MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';
|
|
6
|
-
exports.MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';
|
|
7
|
-
exports.MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';
|
|
3
|
+
exports.MESSAGE_TYPE_HTTP_REQUEST_END = exports.MESSAGE_TYPE_HTTP_REQUEST_START = exports.MESSAGE_TYPE_DOM_MUTATION = exports.userActionDataAttribute = exports.userActionDataAttributeParsed = void 0;
|
|
8
4
|
exports.userActionDataAttributeParsed = 'faroUserActionName';
|
|
9
5
|
exports.userActionDataAttribute = 'data-faro-user-action-name';
|
|
6
|
+
var const_1 = require("../_internal/monitors/const");
|
|
7
|
+
Object.defineProperty(exports, "MESSAGE_TYPE_DOM_MUTATION", { enumerable: true, get: function () { return const_1.MESSAGE_TYPE_DOM_MUTATION; } });
|
|
8
|
+
Object.defineProperty(exports, "MESSAGE_TYPE_HTTP_REQUEST_START", { enumerable: true, get: function () { return const_1.MESSAGE_TYPE_HTTP_REQUEST_START; } });
|
|
9
|
+
Object.defineProperty(exports, "MESSAGE_TYPE_HTTP_REQUEST_END", { enumerable: true, get: function () { return const_1.MESSAGE_TYPE_HTTP_REQUEST_END; } });
|
|
10
10
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,6BAA6B,GAAG,oBAAoB,CAAC;AACrD,QAAA,uBAAuB,GAAG,4BAA4B,CAAC;AAEpE,qDAIqC;AAHnC,kHAAA,yBAAyB,OAAA;AACzB,wHAAA,+BAA+B,OAAA;AAC/B,sHAAA,6BAA6B,OAAA","sourcesContent":["export const userActionDataAttributeParsed = 'faroUserActionName';\nexport const userActionDataAttribute = 'data-faro-user-action-name';\n\nexport {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n} from '../_internal/monitors/const';\n"]}
|
|
@@ -3,9 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.userActionDataAttribute = exports.MESSAGE_TYPE_HTTP_REQUEST_START = exports.MESSAGE_TYPE_HTTP_REQUEST_END = exports.MESSAGE_TYPE_DOM_MUTATION = exports.UserActionInstrumentation = void 0;
|
|
4
4
|
var instrumentation_1 = require("./instrumentation");
|
|
5
5
|
Object.defineProperty(exports, "UserActionInstrumentation", { enumerable: true, get: function () { return instrumentation_1.UserActionInstrumentation; } });
|
|
6
|
-
var const_1 = require("
|
|
6
|
+
var const_1 = require("../_internal/monitors/const");
|
|
7
7
|
Object.defineProperty(exports, "MESSAGE_TYPE_DOM_MUTATION", { enumerable: true, get: function () { return const_1.MESSAGE_TYPE_DOM_MUTATION; } });
|
|
8
8
|
Object.defineProperty(exports, "MESSAGE_TYPE_HTTP_REQUEST_END", { enumerable: true, get: function () { return const_1.MESSAGE_TYPE_HTTP_REQUEST_END; } });
|
|
9
9
|
Object.defineProperty(exports, "MESSAGE_TYPE_HTTP_REQUEST_START", { enumerable: true, get: function () { return const_1.MESSAGE_TYPE_HTTP_REQUEST_START; } });
|
|
10
|
-
|
|
10
|
+
var const_2 = require("./const");
|
|
11
|
+
Object.defineProperty(exports, "userActionDataAttribute", { enumerable: true, get: function () { return const_2.userActionDataAttribute; } });
|
|
11
12
|
//# sourceMappingURL=index.js.map
|