@grafana/faro-web-sdk 2.3.0 → 2.4.0
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/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/navigation/instrumentation.d.ts +1 -1
- 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/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
- 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 +3 -4
- package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
- package/dist/cjs/config/makeCoreConfig.js +48 -60
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/initialize.js +3 -3
- package/dist/cjs/initialize.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js +44 -65
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js +11 -17
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js +5 -5
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js +28 -30
- package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js +7 -7
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js +8 -8
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js +24 -32
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/console/instrumentation.js +29 -49
- package/dist/cjs/instrumentations/console/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/csp/instrumentation.js +14 -32
- package/dist/cjs/instrumentations/csp/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/errors/getErrorDetails.js +23 -23
- package/dist/cjs/instrumentations/errors/getErrorDetails.js.map +1 -1
- package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js +5 -5
- package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js.map +1 -1
- package/dist/cjs/instrumentations/errors/instrumentation.js +11 -29
- package/dist/cjs/instrumentations/errors/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/errors/registerOnerror.js +6 -10
- package/dist/cjs/instrumentations/errors/registerOnerror.js.map +1 -1
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js +16 -17
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js +2 -2
- package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js +4 -4
- package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js +16 -17
- package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js.map +1 -1
- package/dist/cjs/instrumentations/navigation/instrumentation.js +27 -45
- package/dist/cjs/instrumentations/navigation/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/instrumentation.js +19 -74
- package/dist/cjs/instrumentations/performance/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/navigation.js +15 -26
- package/dist/cjs/instrumentations/performance/navigation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/performanceUtils.js +18 -33
- package/dist/cjs/instrumentations/performance/performanceUtils.js.map +1 -1
- package/dist/cjs/instrumentations/performance/resource.js +13 -25
- package/dist/cjs/instrumentations/performance/resource.js.map +1 -1
- package/dist/cjs/instrumentations/session/instrumentation.js +45 -74
- package/dist/cjs/instrumentations/session/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js +21 -24
- package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js +21 -24
- package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js +2 -2
- package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/sampling.js +5 -5
- package/dist/cjs/instrumentations/session/sessionManager/sampling.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js +64 -61
- package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/instrumentation.js +15 -34
- package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +11 -11
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/userActionController.js +49 -53
- package/dist/cjs/instrumentations/userActions/userActionController.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/util.js +4 -4
- package/dist/cjs/instrumentations/userActions/util.js.map +1 -1
- package/dist/cjs/instrumentations/view/instrumentation.js +12 -30
- package/dist/cjs/instrumentations/view/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/instrumentation.js +11 -29
- package/dist/cjs/instrumentations/webVitals/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js +87 -94
- package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
- package/dist/cjs/metas/browser/meta.js +14 -14
- package/dist/cjs/metas/browser/meta.js.map +1 -1
- package/dist/cjs/metas/k6/meta.js +3 -14
- package/dist/cjs/metas/k6/meta.js.map +1 -1
- package/dist/cjs/metas/page/meta.js +7 -19
- package/dist/cjs/metas/page/meta.js.map +1 -1
- package/dist/cjs/metas/sdk/meta.js +3 -3
- package/dist/cjs/metas/sdk/meta.js.map +1 -1
- package/dist/cjs/metas/session/createSession.js +2 -2
- package/dist/cjs/metas/session/createSession.js.map +1 -1
- package/dist/cjs/transports/console/transport.js +10 -29
- package/dist/cjs/transports/console/transport.js.map +1 -1
- package/dist/cjs/transports/fetch/transport.js +82 -176
- package/dist/cjs/transports/fetch/transport.js.map +1 -1
- package/dist/cjs/utils/throttle.js +6 -10
- package/dist/cjs/utils/throttle.js.map +1 -1
- package/dist/cjs/utils/url.js +4 -5
- package/dist/cjs/utils/url.js.map +1 -1
- package/dist/cjs/utils/webStorage.js +4 -4
- package/dist/cjs/utils/webStorage.js.map +1 -1
- package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js +0 -1
- package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -1
- package/dist/esm/instrumentations/errors/getErrorDetails.js +1 -0
- package/dist/esm/instrumentations/errors/getErrorDetails.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js +22 -2
- package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
- package/dist/esm/transports/fetch/transport.js +1 -1
- package/dist/esm/transports/fetch/transport.js.map +1 -1
- 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/navigation/instrumentation.d.ts +1 -1
- 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/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/package.json +9 -6
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getWebInstrumentations = getWebInstrumentations;
|
|
4
|
-
|
|
5
|
-
function getWebInstrumentations(options) {
|
|
6
|
-
|
|
7
|
-
var instrumentations = [
|
|
4
|
+
const instrumentations_1 = require("../instrumentations");
|
|
5
|
+
function getWebInstrumentations(options = {}) {
|
|
6
|
+
const instrumentations = [
|
|
8
7
|
new instrumentations_1.UserActionInstrumentation(),
|
|
9
8
|
new instrumentations_1.ErrorsInstrumentation(),
|
|
10
9
|
new instrumentations_1.WebVitalsInstrumentation(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getWebInstrumentations.js","sourceRoot":"","sources":["../../../src/config/getWebInstrumentations.ts"],"names":[],"mappings":";;AAgBA,wDAwBC;AAtCD,
|
|
1
|
+
{"version":3,"file":"getWebInstrumentations.js","sourceRoot":"","sources":["../../../src/config/getWebInstrumentations.ts"],"names":[],"mappings":";;AAgBA,wDAwBC;AAtCD,0DAU6B;AAI7B,SAAgB,sBAAsB,CAAC,UAAyC,EAAE;IAChF,MAAM,gBAAgB,GAAsB;QAC1C,IAAI,4CAAyB,EAAE;QAC/B,IAAI,wCAAqB,EAAE;QAC3B,IAAI,2CAAwB,EAAE;QAC9B,IAAI,yCAAsB,EAAE;QAC5B,IAAI,sCAAmB,EAAE;QACzB,IAAI,4CAAyB,EAAE;KAChC,CAAC;IAEF,IAAI,OAAO,CAAC,gCAAgC,KAAK,KAAK,EAAE,CAAC;QACvD,iFAAiF;QACjF,gBAAgB,CAAC,OAAO,CAAC,IAAI,6CAA0B,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,OAAO,CAAC,0CAA0C,KAAK,KAAK,EAAE,CAAC;QACjE,gBAAgB,CAAC,IAAI,CAAC,IAAI,qCAAkB,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACrC,gBAAgB,CAAC,IAAI,CAAC,IAAI,yCAAsB,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC","sourcesContent":["import type { Instrumentation } from '@grafana/faro-core';\n\nimport {\n ConsoleInstrumentation,\n CSPInstrumentation,\n ErrorsInstrumentation,\n NavigationInstrumentation,\n PerformanceInstrumentation,\n SessionInstrumentation,\n UserActionInstrumentation,\n ViewInstrumentation,\n WebVitalsInstrumentation,\n} from '../instrumentations';\n\nimport type { GetWebInstrumentationsOptions } from './types';\n\nexport function getWebInstrumentations(options: GetWebInstrumentationsOptions = {}): Instrumentation[] {\n const instrumentations: Instrumentation[] = [\n new UserActionInstrumentation(),\n new ErrorsInstrumentation(),\n new WebVitalsInstrumentation(),\n new SessionInstrumentation(),\n new ViewInstrumentation(),\n new NavigationInstrumentation(),\n ];\n\n if (options.enablePerformanceInstrumentation !== false) {\n // unshift to ensure that initialization starts before the other instrumentations\n instrumentations.unshift(new PerformanceInstrumentation());\n }\n\n if (options.enableContentSecurityPolicyInstrumentation !== false) {\n instrumentations.push(new CSPInstrumentation());\n }\n\n if (options.captureConsole !== false) {\n instrumentations.push(new ConsoleInstrumentation());\n }\n\n return instrumentations;\n}\n"]}
|
|
@@ -1,15 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
2
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
14
3
|
var t = {};
|
|
15
4
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -21,36 +10,27 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
21
10
|
}
|
|
22
11
|
return t;
|
|
23
12
|
};
|
|
24
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
25
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
26
|
-
if (ar || !(i in from)) {
|
|
27
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
28
|
-
ar[i] = from[i];
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
32
|
-
};
|
|
33
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
14
|
exports.makeCoreConfig = makeCoreConfig;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
15
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
16
|
+
const consts_1 = require("../consts");
|
|
17
|
+
const instrumentations_1 = require("../instrumentations");
|
|
18
|
+
const session_1 = require("../instrumentations/session");
|
|
19
|
+
const const_1 = require("../instrumentations/userActions/const");
|
|
20
|
+
const metas_1 = require("../metas");
|
|
21
|
+
const k6_1 = require("../metas/k6");
|
|
22
|
+
const page_1 = require("../metas/page");
|
|
23
|
+
const transports_1 = require("../transports");
|
|
24
|
+
const getWebInstrumentations_1 = require("./getWebInstrumentations");
|
|
45
25
|
function makeCoreConfig(browserConfig) {
|
|
46
26
|
var _a, _b, _c, _d, _e;
|
|
47
|
-
|
|
48
|
-
|
|
27
|
+
const transports = [];
|
|
28
|
+
const internalLogger = (0, faro_core_1.createInternalLogger)(browserConfig.unpatchedConsole, browserConfig.internalLoggerLevel);
|
|
49
29
|
if (browserConfig.transports) {
|
|
50
30
|
if (browserConfig.url || browserConfig.apiKey) {
|
|
51
31
|
internalLogger.error('if "transports" is defined, "url" and "apiKey" should not be defined');
|
|
52
32
|
}
|
|
53
|
-
transports.push
|
|
33
|
+
transports.push(...browserConfig.transports);
|
|
54
34
|
}
|
|
55
35
|
else if (browserConfig.url) {
|
|
56
36
|
transports.push(new transports_1.FetchTransport({
|
|
@@ -61,35 +41,44 @@ function makeCoreConfig(browserConfig) {
|
|
|
61
41
|
else {
|
|
62
42
|
internalLogger.error('either "url" or "transports" must be defined');
|
|
63
43
|
}
|
|
64
|
-
|
|
65
|
-
// properties with default values
|
|
66
|
-
_f = browserConfig.dedupe,
|
|
44
|
+
const {
|
|
67
45
|
// properties with default values
|
|
68
|
-
dedupe =
|
|
46
|
+
dedupe = true, eventDomain = consts_1.defaultEventDomain, globalObjectKey = faro_core_1.defaultGlobalObjectKey, instrumentations = (0, getWebInstrumentations_1.getWebInstrumentations)(), internalLoggerLevel = faro_core_1.defaultInternalLoggerLevel, isolate = false, logArgsSerializer = faro_core_1.defaultLogArgsSerializer, metas = createDefaultMetas(browserConfig), paused = false, preventGlobalExposure = false, unpatchedConsole = faro_core_1.defaultUnpatchedConsole, url: browserConfigUrl, experimental } = browserConfig,
|
|
69
47
|
// Properties without default values or which aren't used to create derived config
|
|
70
48
|
restProperties = __rest(browserConfig, ["dedupe", "eventDomain", "globalObjectKey", "instrumentations", "internalLoggerLevel", "isolate", "logArgsSerializer", "metas", "paused", "preventGlobalExposure", "unpatchedConsole", "url", "experimental"]);
|
|
71
49
|
// Extract experimental features with defaults
|
|
72
|
-
|
|
50
|
+
const trackNavigation = (_a = experimental === null || experimental === void 0 ? void 0 : experimental.trackNavigation) !== null && _a !== void 0 ? _a : false;
|
|
73
51
|
// Extract user actions instrumentation with defaults
|
|
74
|
-
|
|
52
|
+
const userActionsInstrumentation = {
|
|
75
53
|
dataAttributeName: (_c = (_b = browserConfig.userActionsInstrumentation) === null || _b === void 0 ? void 0 : _b.dataAttributeName) !== null && _c !== void 0 ? _c : const_1.userActionDataAttribute,
|
|
76
54
|
excludeItem: (_d = browserConfig.userActionsInstrumentation) === null || _d === void 0 ? void 0 : _d.excludeItem,
|
|
77
55
|
};
|
|
78
|
-
return
|
|
56
|
+
return Object.assign(Object.assign({}, restProperties), { batching: Object.assign(Object.assign({}, faro_core_1.defaultBatchingConfig), browserConfig.batching), dedupe: dedupe, globalObjectKey, instrumentations: getFilteredInstrumentations(instrumentations, browserConfig), internalLoggerLevel,
|
|
57
|
+
isolate,
|
|
58
|
+
logArgsSerializer,
|
|
59
|
+
metas,
|
|
60
|
+
parseStacktrace: instrumentations_1.parseStacktrace,
|
|
61
|
+
paused,
|
|
62
|
+
preventGlobalExposure,
|
|
63
|
+
transports,
|
|
64
|
+
unpatchedConsole,
|
|
65
|
+
eventDomain, ignoreUrls: [
|
|
66
|
+
...((_e = browserConfig.ignoreUrls) !== null && _e !== void 0 ? _e : []),
|
|
67
|
+
// ignore configured cloud collector url by default
|
|
68
|
+
...(browserConfigUrl ? [browserConfigUrl] : []),
|
|
79
69
|
// Try our best to exclude collector URLs form other Faro instances. By default these are URLs ending with /collect or /collect/ followed by alphanumeric characters.
|
|
80
70
|
/\/collect(?:\/[\w]*)?$/,
|
|
81
|
-
],
|
|
71
|
+
], sessionTracking: Object.assign(Object.assign(Object.assign({}, session_1.defaultSessionTrackingConfig), browserConfig.sessionTracking), crateSessionMeta({
|
|
82
72
|
trackGeolocation: browserConfig.trackGeolocation,
|
|
83
73
|
sessionTracking: browserConfig.sessionTracking,
|
|
84
|
-
})), userActionsInstrumentation
|
|
85
|
-
trackNavigation
|
|
74
|
+
})), userActionsInstrumentation, experimental: {
|
|
75
|
+
trackNavigation,
|
|
86
76
|
} });
|
|
87
77
|
}
|
|
88
|
-
function getFilteredInstrumentations(instrumentations,
|
|
89
|
-
var
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return instrumentations.filter(function (instr) {
|
|
78
|
+
function getFilteredInstrumentations(instrumentations, { experimental }) {
|
|
79
|
+
var _a;
|
|
80
|
+
const trackNavigation = (_a = experimental === null || experimental === void 0 ? void 0 : experimental.trackNavigation) !== null && _a !== void 0 ? _a : false;
|
|
81
|
+
return instrumentations.filter((instr) => {
|
|
93
82
|
if (instr.name === '@grafana/faro-web-sdk:instrumentation-navigation' && !trackNavigation) {
|
|
94
83
|
return false;
|
|
95
84
|
}
|
|
@@ -98,23 +87,22 @@ function getFilteredInstrumentations(instrumentations, _a) {
|
|
|
98
87
|
}
|
|
99
88
|
function createDefaultMetas(browserConfig) {
|
|
100
89
|
var _a, _b;
|
|
101
|
-
|
|
102
|
-
|
|
90
|
+
const { page, generatePageId } = (_a = browserConfig === null || browserConfig === void 0 ? void 0 : browserConfig.pageTracking) !== null && _a !== void 0 ? _a : {};
|
|
91
|
+
const initialMetas = [
|
|
103
92
|
metas_1.browserMeta,
|
|
104
|
-
(0, page_1.createPageMeta)({ generatePageId
|
|
105
|
-
|
|
93
|
+
(0, page_1.createPageMeta)({ generatePageId, initialPageMeta: page }),
|
|
94
|
+
...((_b = browserConfig.metas) !== null && _b !== void 0 ? _b : []),
|
|
106
95
|
metas_1.sdkMeta,
|
|
107
|
-
]
|
|
108
|
-
|
|
96
|
+
];
|
|
97
|
+
const isK6BrowserSession = (0, faro_core_1.isObject)(window === null || window === void 0 ? void 0 : window.k6);
|
|
109
98
|
if (isK6BrowserSession) {
|
|
110
|
-
return
|
|
99
|
+
return [...initialMetas, k6_1.k6Meta];
|
|
111
100
|
}
|
|
112
101
|
return initialMetas;
|
|
113
102
|
}
|
|
114
|
-
function crateSessionMeta(
|
|
115
|
-
var
|
|
116
|
-
|
|
117
|
-
var overrides = {};
|
|
103
|
+
function crateSessionMeta({ trackGeolocation, sessionTracking, }) {
|
|
104
|
+
var _a;
|
|
105
|
+
const overrides = {};
|
|
118
106
|
if ((0, faro_core_1.isBoolean)(trackGeolocation)) {
|
|
119
107
|
overrides.geoLocationTrackingEnabled = trackGeolocation;
|
|
120
108
|
}
|
|
@@ -122,7 +110,7 @@ function crateSessionMeta(_a) {
|
|
|
122
110
|
return {};
|
|
123
111
|
}
|
|
124
112
|
return {
|
|
125
|
-
session:
|
|
113
|
+
session: Object.assign(Object.assign({}, ((_a = sessionTracking === null || sessionTracking === void 0 ? void 0 : sessionTracking.session) !== null && _a !== void 0 ? _a : {})), { overrides }),
|
|
126
114
|
};
|
|
127
115
|
}
|
|
128
116
|
//# sourceMappingURL=makeCoreConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeCoreConfig.js","sourceRoot":"","sources":["../../../src/config/makeCoreConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"makeCoreConfig.js","sourceRoot":"","sources":["../../../src/config/makeCoreConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createInternalLogger,\n defaultBatchingConfig,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultLogArgsSerializer,\n defaultUnpatchedConsole,\n isBoolean,\n isEmpty,\n isObject,\n} from '@grafana/faro-core';\nimport type { Config, Instrumentation, MetaItem, MetaSession, Transport } from '@grafana/faro-core';\n\nimport { defaultEventDomain } from '../consts';\nimport { parseStacktrace } from '../instrumentations';\nimport { defaultSessionTrackingConfig } from '../instrumentations/session';\nimport { userActionDataAttribute } from '../instrumentations/userActions/const';\nimport { browserMeta, sdkMeta } from '../metas';\nimport { k6Meta } from '../metas/k6';\nimport { createPageMeta } from '../metas/page';\nimport { FetchTransport } from '../transports';\n\nimport { getWebInstrumentations } from './getWebInstrumentations';\nimport type { BrowserConfig } from './types';\n\nexport function makeCoreConfig(browserConfig: BrowserConfig): Config {\n const transports: Transport[] = [];\n\n const internalLogger = createInternalLogger(browserConfig.unpatchedConsole, browserConfig.internalLoggerLevel);\n\n if (browserConfig.transports) {\n if (browserConfig.url || browserConfig.apiKey) {\n internalLogger.error('if \"transports\" is defined, \"url\" and \"apiKey\" should not be defined');\n }\n\n transports.push(...browserConfig.transports);\n } else if (browserConfig.url) {\n transports.push(\n new FetchTransport({\n url: browserConfig.url,\n apiKey: browserConfig.apiKey,\n })\n );\n } else {\n internalLogger.error('either \"url\" or \"transports\" must be defined');\n }\n\n const {\n // properties with default values\n dedupe = true,\n eventDomain = defaultEventDomain,\n globalObjectKey = defaultGlobalObjectKey,\n instrumentations = getWebInstrumentations(),\n internalLoggerLevel = defaultInternalLoggerLevel,\n isolate = false,\n logArgsSerializer = defaultLogArgsSerializer,\n metas = createDefaultMetas(browserConfig),\n paused = false,\n preventGlobalExposure = false,\n unpatchedConsole = defaultUnpatchedConsole,\n url: browserConfigUrl,\n experimental,\n // Properties without default values or which aren't used to create derived config\n ...restProperties\n }: BrowserConfig = browserConfig;\n\n // Extract experimental features with defaults\n const trackNavigation = experimental?.trackNavigation ?? false;\n\n // Extract user actions instrumentation with defaults\n const userActionsInstrumentation = {\n dataAttributeName: browserConfig.userActionsInstrumentation?.dataAttributeName ?? userActionDataAttribute,\n excludeItem: browserConfig.userActionsInstrumentation?.excludeItem,\n };\n\n return {\n ...restProperties,\n\n batching: {\n ...defaultBatchingConfig,\n ...browserConfig.batching,\n },\n dedupe: dedupe,\n globalObjectKey,\n instrumentations: getFilteredInstrumentations(instrumentations, browserConfig),\n internalLoggerLevel,\n isolate,\n logArgsSerializer,\n metas,\n parseStacktrace,\n paused,\n preventGlobalExposure,\n transports,\n unpatchedConsole,\n eventDomain,\n ignoreUrls: [\n ...(browserConfig.ignoreUrls ?? []),\n // ignore configured cloud collector url by default\n ...(browserConfigUrl ? [browserConfigUrl] : []),\n // Try our best to exclude collector URLs form other Faro instances. By default these are URLs ending with /collect or /collect/ followed by alphanumeric characters.\n /\\/collect(?:\\/[\\w]*)?$/,\n ],\n sessionTracking: {\n ...defaultSessionTrackingConfig,\n ...browserConfig.sessionTracking,\n ...crateSessionMeta({\n trackGeolocation: browserConfig.trackGeolocation,\n sessionTracking: browserConfig.sessionTracking,\n }),\n },\n userActionsInstrumentation,\n experimental: {\n trackNavigation,\n },\n };\n}\n\nfunction getFilteredInstrumentations(\n instrumentations: Instrumentation[],\n { experimental }: BrowserConfig\n): Instrumentation[] {\n const trackNavigation = experimental?.trackNavigation ?? false;\n\n return instrumentations.filter((instr) => {\n if (instr.name === '@grafana/faro-web-sdk:instrumentation-navigation' && !trackNavigation) {\n return false;\n }\n return true;\n });\n}\n\nfunction createDefaultMetas(browserConfig: BrowserConfig): MetaItem[] {\n const { page, generatePageId } = browserConfig?.pageTracking ?? {};\n\n const initialMetas: MetaItem[] = [\n browserMeta,\n createPageMeta({ generatePageId, initialPageMeta: page }),\n ...(browserConfig.metas ?? []),\n sdkMeta,\n ];\n\n const isK6BrowserSession = isObject((window as any)?.k6);\n if (isK6BrowserSession) {\n return [...initialMetas, k6Meta];\n }\n\n return initialMetas;\n}\n\nfunction crateSessionMeta({\n trackGeolocation,\n sessionTracking,\n}: Pick<BrowserConfig, 'trackGeolocation' | 'sessionTracking'>): { session: MetaSession } | {} {\n const overrides: MetaSession['overrides'] = {};\n\n if (isBoolean(trackGeolocation)) {\n overrides.geoLocationTrackingEnabled = trackGeolocation;\n }\n\n if (isEmpty(overrides)) {\n return {};\n }\n\n return {\n session: {\n ...(sessionTracking?.session ?? {}),\n overrides,\n },\n };\n}\n"]}
|
package/dist/cjs/initialize.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.initializeFaro = initializeFaro;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
const config_1 = require("./config");
|
|
6
6
|
function initializeFaro(config) {
|
|
7
|
-
|
|
7
|
+
const coreConfig = (0, config_1.makeCoreConfig)(config);
|
|
8
8
|
if (!coreConfig) {
|
|
9
9
|
return undefined;
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../src/initialize.ts"],"names":[],"mappings":";;AAMA,wCAQC;AAdD,
|
|
1
|
+
{"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../src/initialize.ts"],"names":[],"mappings":";;AAMA,wCAQC;AAdD,kDAAgE;AAGhE,qCAA0C;AAG1C,SAAgB,cAAc,CAAC,MAAqB;IAClD,MAAM,UAAU,GAAG,IAAA,uBAAc,EAAC,MAAM,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAU,CAAC;IACpB,CAAC;IAED,OAAO,IAAA,0BAAQ,EAAC,UAAU,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["import { initializeFaro as coreInit } from '@grafana/faro-core';\nimport type { Faro } from '@grafana/faro-core';\n\nimport { makeCoreConfig } from './config';\nimport type { BrowserConfig } from './config';\n\nexport function initializeFaro(config: BrowserConfig): Faro {\n const coreConfig = makeCoreConfig(config);\n\n if (!coreConfig) {\n return undefined!;\n }\n\n return coreInit(coreConfig);\n}\n"]}
|
|
@@ -1,25 +1,10 @@
|
|
|
1
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
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
3
|
exports.ActivityWindowTracker = void 0;
|
|
19
4
|
exports.isRequestStartMessage = isRequestStartMessage;
|
|
20
5
|
exports.isRequestEndMessage = isRequestEndMessage;
|
|
21
|
-
|
|
22
|
-
|
|
6
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
7
|
+
const const_1 = require("./monitors/const");
|
|
23
8
|
function isRequestStartMessage(msg) {
|
|
24
9
|
return msg.type === const_1.MESSAGE_TYPE_HTTP_REQUEST_START;
|
|
25
10
|
}
|
|
@@ -31,44 +16,41 @@ function isRequestEndMessage(msg) {
|
|
|
31
16
|
* it enters a draining phase: new short events are ignored; only active operations are awaited
|
|
32
17
|
* until they end or `drainTimeoutMs` elapses.
|
|
33
18
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
function ActivityWindowTracker(eventsObservable, options) {
|
|
19
|
+
class ActivityWindowTracker extends faro_core_1.Observable {
|
|
20
|
+
constructor(eventsObservable, options) {
|
|
37
21
|
var _a, _b, _c, _d;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
22
|
+
super();
|
|
23
|
+
this._tracking = false;
|
|
24
|
+
this.eventsObservable = eventsObservable;
|
|
25
|
+
this._options = {
|
|
42
26
|
inactivityMs: (_a = options === null || options === void 0 ? void 0 : options.inactivityMs) !== null && _a !== void 0 ? _a : 100,
|
|
43
27
|
drainTimeoutMs: (_b = options === null || options === void 0 ? void 0 : options.drainTimeoutMs) !== null && _b !== void 0 ? _b : 10 * 1000,
|
|
44
|
-
isOperationStart: (_c = options === null || options === void 0 ? void 0 : options.isOperationStart) !== null && _c !== void 0 ? _c : (
|
|
45
|
-
isOperationEnd: (_d = options === null || options === void 0 ? void 0 : options.isOperationEnd) !== null && _d !== void 0 ? _d : (
|
|
28
|
+
isOperationStart: (_c = options === null || options === void 0 ? void 0 : options.isOperationStart) !== null && _c !== void 0 ? _c : (() => undefined),
|
|
29
|
+
isOperationEnd: (_d = options === null || options === void 0 ? void 0 : options.isOperationEnd) !== null && _d !== void 0 ? _d : (() => undefined),
|
|
46
30
|
};
|
|
47
|
-
|
|
48
|
-
return _this;
|
|
31
|
+
this._initialize();
|
|
49
32
|
}
|
|
50
|
-
|
|
51
|
-
var _this = this;
|
|
33
|
+
_initialize() {
|
|
52
34
|
this.eventsObservable
|
|
53
|
-
.filter(
|
|
54
|
-
return
|
|
35
|
+
.filter(() => {
|
|
36
|
+
return this._tracking;
|
|
55
37
|
})
|
|
56
|
-
.subscribe(
|
|
38
|
+
.subscribe((event) => {
|
|
57
39
|
var _a, _b, _c;
|
|
58
|
-
|
|
59
|
-
(_a =
|
|
60
|
-
|
|
40
|
+
this._lastEventTime = Date.now();
|
|
41
|
+
(_a = this._currentEvents) === null || _a === void 0 ? void 0 : _a.push(event);
|
|
42
|
+
const startKey = this._options.isOperationStart(event);
|
|
61
43
|
if (startKey) {
|
|
62
|
-
(_b =
|
|
44
|
+
(_b = this._activeOperations) === null || _b === void 0 ? void 0 : _b.set(startKey, true);
|
|
63
45
|
}
|
|
64
|
-
|
|
46
|
+
const endKey = this._options.isOperationEnd(event);
|
|
65
47
|
if (endKey) {
|
|
66
|
-
(_c =
|
|
48
|
+
(_c = this._activeOperations) === null || _c === void 0 ? void 0 : _c.delete(endKey);
|
|
67
49
|
}
|
|
68
|
-
|
|
50
|
+
this._scheduleInactivityCheck();
|
|
69
51
|
});
|
|
70
|
-
}
|
|
71
|
-
|
|
52
|
+
}
|
|
53
|
+
startTracking() {
|
|
72
54
|
if (this._tracking) {
|
|
73
55
|
return;
|
|
74
56
|
}
|
|
@@ -81,12 +63,12 @@ var ActivityWindowTracker = /** @class */ (function (_super) {
|
|
|
81
63
|
this._currentEvents = [];
|
|
82
64
|
this._activeOperations = new Map();
|
|
83
65
|
this._scheduleInactivityCheck();
|
|
84
|
-
}
|
|
85
|
-
|
|
66
|
+
}
|
|
67
|
+
stopTracking() {
|
|
86
68
|
this._tracking = false;
|
|
87
69
|
this._clearTimer(this._inactivityTid);
|
|
88
70
|
this._clearTimer(this._drainTid);
|
|
89
|
-
|
|
71
|
+
let duration;
|
|
90
72
|
if (this.hasActiveOperations()) {
|
|
91
73
|
duration = Date.now() - this._startTime;
|
|
92
74
|
}
|
|
@@ -98,41 +80,38 @@ var ActivityWindowTracker = /** @class */ (function (_super) {
|
|
|
98
80
|
events: this._currentEvents,
|
|
99
81
|
duration: duration,
|
|
100
82
|
});
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
_this._startDrainTimeout();
|
|
83
|
+
}
|
|
84
|
+
_scheduleInactivityCheck() {
|
|
85
|
+
this._inactivityTid = startTimeout(this._inactivityTid, () => {
|
|
86
|
+
if (this.hasActiveOperations()) {
|
|
87
|
+
this._startDrainTimeout();
|
|
107
88
|
}
|
|
108
89
|
else {
|
|
109
|
-
|
|
90
|
+
this.stopTracking();
|
|
110
91
|
}
|
|
111
92
|
}, this._options.inactivityMs);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
_this.stopTracking();
|
|
93
|
+
}
|
|
94
|
+
_startDrainTimeout() {
|
|
95
|
+
this._drainTid = startTimeout(this._drainTid, () => {
|
|
96
|
+
this.stopTracking();
|
|
117
97
|
}, this._options.drainTimeoutMs);
|
|
118
|
-
}
|
|
119
|
-
|
|
98
|
+
}
|
|
99
|
+
hasActiveOperations() {
|
|
120
100
|
return !!this._activeOperations && this._activeOperations.size > 0;
|
|
121
|
-
}
|
|
122
|
-
|
|
101
|
+
}
|
|
102
|
+
_clearTimer(id) {
|
|
123
103
|
if (id) {
|
|
124
104
|
clearTimeout(id);
|
|
125
105
|
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
}(faro_core_1.Observable));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
129
108
|
exports.ActivityWindowTracker = ActivityWindowTracker;
|
|
130
109
|
function startTimeout(timeoutId, cb, delay) {
|
|
131
110
|
if (timeoutId) {
|
|
132
111
|
clearTimeout(timeoutId);
|
|
133
112
|
}
|
|
134
113
|
//@ts-expect-error for some reason vscode is using the node types
|
|
135
|
-
timeoutId = setTimeout(
|
|
114
|
+
timeoutId = setTimeout(() => {
|
|
136
115
|
cb();
|
|
137
116
|
}, delay);
|
|
138
117
|
return timeoutId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activityWindowTracker.js","sourceRoot":"","sources":["../../../../src/instrumentations/_internal/activityWindowTracker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"activityWindowTracker.js","sourceRoot":"","sources":["../../../../src/instrumentations/_internal/activityWindowTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './monitors/const';\nimport type { HttpRequestEndMessage, HttpRequestStartMessage } from './monitors/types';\n\ntype OperationKey = string;\n\nexport function isRequestStartMessage(msg: any): msg is HttpRequestStartMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;\n}\n\nexport function isRequestEndMessage(msg: any): msg is HttpRequestEndMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_END;\n}\n\nexport interface ActivityWindowTrackerOptions<TMsg = any> {\n inactivityMs?: number;\n drainTimeoutMs?: number;\n isOperationStart?: (msg: TMsg) => OperationKey | undefined;\n isOperationEnd?: (msg: TMsg) => OperationKey | undefined;\n}\n\n/**\n * Tracks events in a time‑boxed activity window. When the window goes quiet for `inactivityMs`,\n * it enters a draining phase: new short events are ignored; only active operations are awaited\n * until they end or `drainTimeoutMs` elapses.\n */\nexport class ActivityWindowTracker extends Observable {\n eventsObservable: Observable;\n\n private _tracking = false;\n private _inactivityTid?: number;\n private _drainTid?: number;\n private _currentEvents?: any[];\n private _activeOperations?: Map<OperationKey, true>;\n private _startTime?: number;\n private _lastEventTime?: number;\n private _options: Required<ActivityWindowTrackerOptions>;\n\n constructor(eventsObservable: Observable, options?: ActivityWindowTrackerOptions) {\n super();\n this.eventsObservable = eventsObservable;\n this._options = {\n inactivityMs: options?.inactivityMs ?? 100,\n drainTimeoutMs: options?.drainTimeoutMs ?? 10 * 1000,\n isOperationStart: options?.isOperationStart ?? (() => undefined),\n isOperationEnd: options?.isOperationEnd ?? (() => undefined),\n } as Required<ActivityWindowTrackerOptions>;\n this._initialize();\n }\n\n private _initialize() {\n this.eventsObservable\n .filter(() => {\n return this._tracking;\n })\n .subscribe((event) => {\n this._lastEventTime = Date.now();\n this._currentEvents?.push(event);\n\n const startKey = this._options.isOperationStart(event as any);\n if (startKey) {\n this._activeOperations?.set(startKey, true);\n }\n\n const endKey = this._options.isOperationEnd(event as any);\n if (endKey) {\n this._activeOperations?.delete(endKey);\n }\n\n this._scheduleInactivityCheck();\n });\n }\n\n startTracking() {\n if (this._tracking) {\n return;\n }\n\n this._tracking = true;\n this._startTime = Date.now();\n this._lastEventTime = Date.now();\n\n this.notify({\n message: 'tracking-started',\n });\n\n this._currentEvents = [];\n this._activeOperations = new Map<OperationKey, true>();\n this._scheduleInactivityCheck();\n }\n\n stopTracking() {\n this._tracking = false;\n this._clearTimer(this._inactivityTid);\n this._clearTimer(this._drainTid);\n\n let duration;\n if (this.hasActiveOperations()) {\n duration = Date.now() - this._startTime!;\n } else {\n duration = this._lastEventTime ? this._lastEventTime - this._startTime! : 0;\n }\n\n this.notify({\n message: 'tracking-ended',\n events: this._currentEvents,\n duration: duration,\n });\n }\n\n private _scheduleInactivityCheck() {\n this._inactivityTid = startTimeout(\n this._inactivityTid,\n () => {\n if (this.hasActiveOperations()) {\n this._startDrainTimeout();\n } else {\n this.stopTracking();\n }\n },\n this._options.inactivityMs\n );\n }\n\n private _startDrainTimeout() {\n this._drainTid = startTimeout(\n this._drainTid,\n () => {\n this.stopTracking();\n },\n this._options.drainTimeoutMs\n );\n }\n\n private hasActiveOperations(): boolean {\n return !!this._activeOperations && this._activeOperations.size > 0;\n }\n\n private _clearTimer(id?: number) {\n if (id) {\n clearTimeout(id);\n }\n }\n}\n\nfunction startTimeout(timeoutId: number | undefined, cb: () => void, delay: number) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n //@ts-expect-error for some reason vscode is using the node types\n timeoutId = setTimeout(() => {\n cb();\n }, delay);\n\n return timeoutId;\n}\n"]}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.monitorConsole = monitorConsole;
|
|
4
4
|
exports.__resetConsoleMonitorForTests = __resetConsoleMonitorForTests;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
6
|
+
const const_1 = require("./const");
|
|
7
|
+
let consoleObservable;
|
|
8
|
+
let isInstrumented = false;
|
|
9
9
|
/**
|
|
10
10
|
* Monitors console methods and emits events to subscribers.
|
|
11
11
|
* @param unpatchedConsole - Optional console to call after notifying subscribers.
|
|
@@ -17,24 +17,19 @@ function monitorConsole(unpatchedConsole) {
|
|
|
17
17
|
consoleObservable = new faro_core_1.Observable();
|
|
18
18
|
}
|
|
19
19
|
if (!isInstrumented) {
|
|
20
|
-
|
|
20
|
+
const originalConsole = unpatchedConsole !== null && unpatchedConsole !== void 0 ? unpatchedConsole : faro_core_1.defaultUnpatchedConsole;
|
|
21
21
|
// Patch ALL console methods - subscribers decide which levels to process
|
|
22
|
-
faro_core_1.allLogLevels.forEach(
|
|
23
|
-
|
|
24
|
-
console[level] = function () {
|
|
22
|
+
faro_core_1.allLogLevels.forEach((level) => {
|
|
23
|
+
console[level] = (...args) => {
|
|
25
24
|
var _a;
|
|
26
|
-
var args = [];
|
|
27
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
28
|
-
args[_i] = arguments[_i];
|
|
29
|
-
}
|
|
30
25
|
// Notify all subscribers
|
|
31
26
|
consoleObservable.notify({
|
|
32
27
|
type: const_1.MESSAGE_TYPE_CONSOLE,
|
|
33
|
-
level
|
|
34
|
-
args
|
|
28
|
+
level,
|
|
29
|
+
args,
|
|
35
30
|
});
|
|
36
31
|
// Call the unpatchedConsole method
|
|
37
|
-
(_a =
|
|
32
|
+
(_a = originalConsole[level]) === null || _a === void 0 ? void 0 : _a.apply(console, args);
|
|
38
33
|
};
|
|
39
34
|
});
|
|
40
35
|
isInstrumented = true;
|
|
@@ -44,8 +39,7 @@ function monitorConsole(unpatchedConsole) {
|
|
|
44
39
|
// Test-only utility to reset state between tests
|
|
45
40
|
function __resetConsoleMonitorForTests() {
|
|
46
41
|
// Restore original console methods from defaultUnpatchedConsole
|
|
47
|
-
for (
|
|
48
|
-
var level = allLogLevels_1[_i];
|
|
42
|
+
for (const level of faro_core_1.allLogLevels) {
|
|
49
43
|
if (faro_core_1.defaultUnpatchedConsole[level]) {
|
|
50
44
|
console[level] = faro_core_1.defaultUnpatchedConsole[level];
|
|
51
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consoleMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/consoleMonitor.ts"],"names":[],"mappings":";;AAeA,
|
|
1
|
+
{"version":3,"file":"consoleMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/consoleMonitor.ts"],"names":[],"mappings":";;AAeA,wCA2BC;AAGD,sEAUC;AAvDD,kDAAuF;AAGvF,mCAA+C;AAG/C,IAAI,iBAAyD,CAAC;AAC9D,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,gBAAmC;IAChE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,IAAI,sBAAU,EAAkB,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,mCAAuB,CAAC;QAEpE,yEAAyE;QACzE,wBAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;;gBACtC,yBAAyB;gBACzB,iBAAkB,CAAC,MAAM,CAAC;oBACxB,IAAI,EAAE,4BAAoB;oBAC1B,KAAK;oBACL,IAAI;iBACL,CAAC,CAAC;gBAEH,mCAAmC;gBACnC,MAAA,eAAe,CAAC,KAAK,CAAC,0CAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,iDAAiD;AACjD,SAAgB,6BAA6B;IAC3C,gEAAgE;IAChE,KAAK,MAAM,KAAK,IAAI,wBAAY,EAAE,CAAC;QACjC,IAAI,mCAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,GAAG,mCAAuB,CAAC,KAAK,CAAuB,CAAC;QACxE,CAAC;IACH,CAAC;IAED,iBAAiB,GAAG,SAAS,CAAC;IAC9B,cAAc,GAAG,KAAK,CAAC;AACzB,CAAC","sourcesContent":["import { allLogLevels, defaultUnpatchedConsole, Observable } from '@grafana/faro-core';\nimport type { UnpatchedConsole } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_CONSOLE } from './const';\nimport type { ConsoleMessage } from './types';\n\nlet consoleObservable: Observable<ConsoleMessage> | undefined;\nlet isInstrumented = false;\n\n/**\n * Monitors console methods and emits events to subscribers.\n * @param unpatchedConsole - Optional console to call after notifying subscribers.\n * Only the first caller's value is used (since we patch once).\n * Defaults to defaultUnpatchedConsole.\n */\nexport function monitorConsole(unpatchedConsole?: UnpatchedConsole): Observable<ConsoleMessage> {\n if (!consoleObservable) {\n consoleObservable = new Observable<ConsoleMessage>();\n }\n\n if (!isInstrumented) {\n const originalConsole = unpatchedConsole ?? defaultUnpatchedConsole;\n\n // Patch ALL console methods - subscribers decide which levels to process\n allLogLevels.forEach((level) => {\n console[level] = (...args: unknown[]) => {\n // Notify all subscribers\n consoleObservable!.notify({\n type: MESSAGE_TYPE_CONSOLE,\n level,\n args,\n });\n\n // Call the unpatchedConsole method\n originalConsole[level]?.apply(console, args);\n };\n });\n\n isInstrumented = true;\n }\n\n return consoleObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetConsoleMonitorForTests() {\n // Restore original console methods from defaultUnpatchedConsole\n for (const level of allLogLevels) {\n if (defaultUnpatchedConsole[level]) {\n console[level] = defaultUnpatchedConsole[level] as typeof console.log;\n }\n }\n\n consoleObservable = undefined;\n isInstrumented = false;\n}\n"]}
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.monitorDomMutations = monitorDomMutations;
|
|
4
4
|
exports.__resetDomMutationMonitorForTests = __resetDomMutationMonitorForTests;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
6
|
+
const const_1 = require("./const");
|
|
7
|
+
let domMutationObservable;
|
|
8
|
+
let domMutationObserver;
|
|
9
9
|
function monitorDomMutations() {
|
|
10
10
|
if (!domMutationObservable) {
|
|
11
11
|
domMutationObservable = new faro_core_1.Observable();
|
|
12
12
|
}
|
|
13
13
|
if (!domMutationObserver) {
|
|
14
|
-
domMutationObserver = new MutationObserver(
|
|
14
|
+
domMutationObserver = new MutationObserver((_mutationsList, _observer) => {
|
|
15
15
|
domMutationObservable.notify({ type: const_1.MESSAGE_TYPE_DOM_MUTATION });
|
|
16
16
|
});
|
|
17
17
|
domMutationObserver.observe(document, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domMutationMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/domMutationMonitor.ts"],"names":[],"mappings":";;AAQA,kDAmBC;AAGD,8EAMC;AApCD,
|
|
1
|
+
{"version":3,"file":"domMutationMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/domMutationMonitor.ts"],"names":[],"mappings":";;AAQA,kDAmBC;AAGD,8EAMC;AApCD,kDAAgD;AAEhD,mCAAoD;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,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE;YACvE,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"]}
|