@grafana/faro-web-sdk 2.3.1 → 2.5.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/README.md +1 -0
- package/dist/bundle/faro-web-sdk.iife.js +1 -1
- package/dist/bundle/types/index.d.ts +2 -2
- 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/metas/index.d.ts +1 -0
- package/dist/bundle/types/metas/os/index.d.ts +1 -0
- package/dist/bundle/types/metas/os/meta.d.ts +2 -0
- package/dist/bundle/types/metas/shared/index.d.ts +1 -0
- package/dist/bundle/types/metas/shared/uaParser.d.ts +4 -0
- 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 +49 -60
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/index.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 +52 -68
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js +11 -16
- 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 +47 -65
- 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 +13 -14
- package/dist/cjs/metas/browser/meta.js.map +1 -1
- package/dist/cjs/metas/index.js +3 -1
- package/dist/cjs/metas/index.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/os/index.js +6 -0
- package/dist/cjs/metas/os/index.js.map +1 -0
- package/dist/cjs/metas/os/meta.js +20 -0
- package/dist/cjs/metas/os/meta.js.map +1 -0
- 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/metas/shared/index.js +6 -0
- package/dist/cjs/metas/shared/index.js.map +1 -0
- package/dist/cjs/metas/shared/uaParser.js +18 -0
- package/dist/cjs/metas/shared/uaParser.js.map +1 -0
- 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/config/makeCoreConfig.js +2 -1
- package/dist/esm/config/makeCoreConfig.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instrumentations/_internal/activityWindowTracker.js +10 -5
- package/dist/esm/instrumentations/_internal/activityWindowTracker.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/metas/browser/meta.js +5 -6
- package/dist/esm/metas/browser/meta.js.map +1 -1
- package/dist/esm/metas/index.js +1 -0
- package/dist/esm/metas/index.js.map +1 -1
- package/dist/esm/metas/os/index.js +2 -0
- package/dist/esm/metas/os/index.js.map +1 -0
- package/dist/esm/metas/os/meta.js +16 -0
- package/dist/esm/metas/os/meta.js.map +1 -0
- package/dist/esm/metas/shared/index.js +2 -0
- package/dist/esm/metas/shared/index.js.map +1 -0
- package/dist/esm/metas/shared/uaParser.js +15 -0
- package/dist/esm/metas/shared/uaParser.js.map +1 -0
- package/dist/esm/transports/fetch/transport.js +1 -1
- package/dist/esm/transports/fetch/transport.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- 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/metas/index.d.ts +1 -0
- package/dist/types/metas/os/index.d.ts +1 -0
- package/dist/types/metas/os/meta.d.ts +2 -0
- package/dist/types/metas/shared/index.d.ts +1 -0
- package/dist/types/metas/shared/uaParser.d.ts +4 -0
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/package.json +5 -5
|
@@ -4,7 +4,7 @@ exports.convertDataAttributeName = convertDataAttributeName;
|
|
|
4
4
|
exports.startTimeout = startTimeout;
|
|
5
5
|
exports.isRequestStartMessage = isRequestStartMessage;
|
|
6
6
|
exports.isRequestEndMessage = isRequestEndMessage;
|
|
7
|
-
|
|
7
|
+
const const_1 = require("./const");
|
|
8
8
|
/**
|
|
9
9
|
* Parses the action attribute name by removing the 'data-' prefix and converting
|
|
10
10
|
* the remaining string to camelCase.
|
|
@@ -13,8 +13,8 @@ var const_1 = require("./const");
|
|
|
13
13
|
* data attributes and make then camelCase.
|
|
14
14
|
*/
|
|
15
15
|
function convertDataAttributeName(userActionDataAttribute) {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const withoutData = userActionDataAttribute.split('data-')[1];
|
|
17
|
+
const withUpperCase = withoutData === null || withoutData === void 0 ? void 0 : withoutData.replace(/-(.)/g, (_, char) => char.toUpperCase());
|
|
18
18
|
return withUpperCase === null || withUpperCase === void 0 ? void 0 : withUpperCase.replace(/-/g, '');
|
|
19
19
|
}
|
|
20
20
|
function startTimeout(timeoutId, cb, delay) {
|
|
@@ -22,7 +22,7 @@ function startTimeout(timeoutId, cb, delay) {
|
|
|
22
22
|
clearTimeout(timeoutId);
|
|
23
23
|
}
|
|
24
24
|
//@ts-expect-error for some reason vscode is using the node types
|
|
25
|
-
timeoutId = setTimeout(
|
|
25
|
+
timeoutId = setTimeout(() => {
|
|
26
26
|
cb();
|
|
27
27
|
}, delay);
|
|
28
28
|
return timeoutId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/util.ts"],"names":[],"mappings":";;AAWA,4DAIC;AAED,oCAWC;AAED,sDAEC;AAED,kDAEC;AAlCD,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/util.ts"],"names":[],"mappings":";;AAWA,4DAIC;AAED,oCAWC;AAED,sDAEC;AAED,kDAEC;AAlCD,mCAAyF;AAEzF;;;;;;GAMG;AACH,SAAgB,wBAAwB,CAAC,uBAA+B;IACtE,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrF,OAAO,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,YAAY,CAAC,SAA6B,EAAE,EAAc,EAAE,KAAa;IACvF,IAAI,SAAS,EAAE,CAAC;QACd,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,iEAAiE;IACjE,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;QAC1B,EAAE,EAAE,CAAC;IACP,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,qBAAqB,CAAC,GAAQ;IAC5C,OAAO,GAAG,CAAC,IAAI,KAAK,uCAA+B,CAAC;AACtD,CAAC;AAED,SAAgB,mBAAmB,CAAC,GAAQ;IAC1C,OAAO,GAAG,CAAC,IAAI,KAAK,qCAA6B,CAAC;AACpD,CAAC","sourcesContent":["import type { HttpRequestEndMessage, HttpRequestStartMessage } from '../_internal/monitors/types';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './const';\n\n/**\n * Parses the action attribute name by removing the 'data-' prefix and converting\n * the remaining string to camelCase.\n *\n * This is needed because the browser will remove the 'data-' prefix and the dashes from\n * data attributes and make then camelCase.\n */\nexport function convertDataAttributeName(userActionDataAttribute: string) {\n const withoutData = userActionDataAttribute.split('data-')[1];\n const withUpperCase = withoutData?.replace(/-(.)/g, (_, char) => char.toUpperCase());\n return withUpperCase?.replace(/-/g, '');\n}\n\nexport function 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\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"]}
|
|
@@ -1,34 +1,17 @@
|
|
|
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.ViewInstrumentation = void 0;
|
|
19
|
-
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
20
5
|
// all this does is send VIEW_CHANGED event
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
_this.version = faro_core_1.VERSION;
|
|
27
|
-
return _this;
|
|
6
|
+
class ViewInstrumentation extends faro_core_1.BaseInstrumentation {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
this.name = '@grafana/faro-web-sdk:instrumentation-view';
|
|
10
|
+
this.version = faro_core_1.VERSION;
|
|
28
11
|
}
|
|
29
|
-
|
|
12
|
+
sendViewChangedEvent(meta) {
|
|
30
13
|
var _a, _b, _c, _d;
|
|
31
|
-
|
|
14
|
+
const view = meta.view;
|
|
32
15
|
if (view && view.name !== ((_a = this.notifiedView) === null || _a === void 0 ? void 0 : _a.name)) {
|
|
33
16
|
this.api.pushEvent(faro_core_1.EVENT_VIEW_CHANGED, {
|
|
34
17
|
fromView: (_c = (_b = this.notifiedView) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : faro_core_1.unknownString,
|
|
@@ -36,11 +19,10 @@ var ViewInstrumentation = /** @class */ (function (_super) {
|
|
|
36
19
|
}, undefined, { skipDedupe: true });
|
|
37
20
|
this.notifiedView = view;
|
|
38
21
|
}
|
|
39
|
-
}
|
|
40
|
-
|
|
22
|
+
}
|
|
23
|
+
initialize() {
|
|
41
24
|
this.metas.addListener(this.sendViewChangedEvent.bind(this));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
}(faro_core_1.BaseInstrumentation));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
45
27
|
exports.ViewInstrumentation = ViewInstrumentation;
|
|
46
28
|
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/view/instrumentation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/view/instrumentation.ts"],"names":[],"mappings":";;;AAAA,kDAAqG;AAGrG,2CAA2C;AAC3C,MAAa,mBAAoB,SAAQ,+BAAmB;IAA5D;;QACW,SAAI,GAAG,4CAA4C,CAAC;QACpD,YAAO,GAAG,mBAAO,CAAC;IA2B7B,CAAC;IArBS,oBAAoB,CAAC,IAAU;;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAK,MAAA,IAAI,CAAC,YAAY,0CAAE,IAAI,CAAA,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,SAAS,CAChB,8BAAkB,EAClB;gBACE,QAAQ,EAAE,MAAA,MAAA,IAAI,CAAC,YAAY,0CAAE,IAAI,mCAAI,yBAAa;gBAClD,MAAM,EAAE,MAAA,IAAI,CAAC,IAAI,mCAAI,yBAAa;aACnC,EACD,SAAS,EACT,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;YAEF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;CACF;AA7BD,kDA6BC","sourcesContent":["import { BaseInstrumentation, EVENT_VIEW_CHANGED, unknownString, VERSION } from '@grafana/faro-core';\nimport type { Meta, MetaView } from '@grafana/faro-core';\n\n// all this does is send VIEW_CHANGED event\nexport class ViewInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-view';\n readonly version = VERSION;\n\n // previously notified view, to ensure we don't send view changed\n // event twice for the same view\n private notifiedView: MetaView | undefined;\n\n private sendViewChangedEvent(meta: Meta): void {\n const view = meta.view;\n\n if (view && view.name !== this.notifiedView?.name) {\n this.api.pushEvent(\n EVENT_VIEW_CHANGED,\n {\n fromView: this.notifiedView?.name ?? unknownString,\n toView: view.name ?? unknownString,\n },\n undefined,\n { skipDedupe: true }\n );\n\n this.notifiedView = view;\n }\n }\n\n initialize() {\n this.metas.addListener(this.sendViewChangedEvent.bind(this));\n }\n}\n"]}
|
|
@@ -1,37 +1,19 @@
|
|
|
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.WebVitalsInstrumentation = void 0;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
_this.version = faro_core_1.VERSION;
|
|
27
|
-
return _this;
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
const webVitalsWithAttribution_1 = require("./webVitalsWithAttribution");
|
|
6
|
+
class WebVitalsInstrumentation extends faro_core_1.BaseInstrumentation {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
this.name = '@grafana/faro-web-sdk:instrumentation-web-vitals';
|
|
10
|
+
this.version = faro_core_1.VERSION;
|
|
28
11
|
}
|
|
29
|
-
|
|
12
|
+
initialize() {
|
|
30
13
|
this.logDebug('Initializing');
|
|
31
|
-
|
|
14
|
+
const webVitals = new webVitalsWithAttribution_1.WebVitalsWithAttribution(this.api.pushMeasurement, this.config.webVitalsInstrumentation);
|
|
32
15
|
webVitals.initialize();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
}(faro_core_1.BaseInstrumentation));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
36
18
|
exports.WebVitalsInstrumentation = WebVitalsInstrumentation;
|
|
37
19
|
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/instrumentation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/instrumentation.ts"],"names":[],"mappings":";;;AAAA,kDAAkE;AAElE,yEAAsE;AAEtE,MAAa,wBAAyB,SAAQ,+BAAmB;IAAjE;;QACW,SAAI,GAAG,kDAAkD,CAAC;QAC1D,YAAO,GAAG,mBAAO,CAAC;IAO7B,CAAC;IALC,UAAU;QACR,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,mDAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAC/G,SAAS,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC;CACF;AATD,4DASC","sourcesContent":["import { BaseInstrumentation, VERSION } from '@grafana/faro-core';\n\nimport { WebVitalsWithAttribution } from './webVitalsWithAttribution';\n\nexport class WebVitalsInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-web-vitals';\n readonly version = VERSION;\n\n initialize(): void {\n this.logDebug('Initializing');\n const webVitals = new WebVitalsWithAttribution(this.api.pushMeasurement, this.config.webVitalsInstrumentation);\n webVitals.initialize();\n }\n}\n"]}
|
|
@@ -1,129 +1,122 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WebVitalsWithAttribution = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
const attribution_1 = require("web-vitals/attribution");
|
|
5
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
6
|
+
const utils_1 = require("../../utils");
|
|
7
|
+
const instrumentationConstants_1 = require("../instrumentationConstants");
|
|
8
8
|
// duplicate keys saved in variables to save bundle size
|
|
9
9
|
// refs: https://github.com/grafana/faro-web-sdk/pull/595#discussion_r1615833968
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const loadStateKey = 'load_state';
|
|
11
|
+
const timeToFirstByteKey = 'time_to_first_byte';
|
|
12
|
+
class WebVitalsWithAttribution {
|
|
13
|
+
constructor(corePushMeasurement, webVitalConfig) {
|
|
14
14
|
this.corePushMeasurement = corePushMeasurement;
|
|
15
15
|
this.webVitalConfig = webVitalConfig;
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
initialize() {
|
|
18
18
|
this.measureCLS();
|
|
19
19
|
this.measureFCP();
|
|
20
20
|
this.measureINP();
|
|
21
21
|
this.measureLCP();
|
|
22
22
|
this.measureTTFB();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
var _this = this;
|
|
23
|
+
}
|
|
24
|
+
measureCLS() {
|
|
26
25
|
var _a;
|
|
27
|
-
(0, attribution_1.onCLS)(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
(0, attribution_1.onCLS)((metric) => {
|
|
27
|
+
const { loadState, largestShiftValue, largestShiftTime, largestShiftTarget } = metric.attribution;
|
|
28
|
+
const values = this.buildInitialValues(metric);
|
|
29
|
+
this.addIfPresent(values, 'largest_shift_value', largestShiftValue);
|
|
30
|
+
this.addIfPresent(values, 'largest_shift_time', largestShiftTime);
|
|
31
|
+
const context = this.buildInitialContext(metric);
|
|
32
|
+
this.addIfPresent(context, loadStateKey, loadState);
|
|
33
|
+
this.addIfPresent(context, 'largest_shift_target', largestShiftTarget);
|
|
34
|
+
this.pushMeasurement(values, context);
|
|
36
35
|
}, { reportAllChanges: (_a = this.webVitalConfig) === null || _a === void 0 ? void 0 : _a.reportAllChanges });
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
var _this = this;
|
|
36
|
+
}
|
|
37
|
+
measureFCP() {
|
|
40
38
|
var _a;
|
|
41
|
-
(0, attribution_1.onFCP)(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
39
|
+
(0, attribution_1.onFCP)((metric) => {
|
|
40
|
+
const { firstByteToFCP, timeToFirstByte, loadState } = metric.attribution;
|
|
41
|
+
const values = this.buildInitialValues(metric);
|
|
42
|
+
this.addIfPresent(values, 'first_byte_to_fcp', firstByteToFCP);
|
|
43
|
+
this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte);
|
|
44
|
+
const context = this.buildInitialContext(metric);
|
|
45
|
+
this.addIfPresent(context, loadStateKey, loadState);
|
|
46
|
+
this.pushMeasurement(values, context);
|
|
49
47
|
}, { reportAllChanges: (_a = this.webVitalConfig) === null || _a === void 0 ? void 0 : _a.reportAllChanges });
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
var _this = this;
|
|
48
|
+
}
|
|
49
|
+
measureINP() {
|
|
53
50
|
var _a;
|
|
54
|
-
(0, attribution_1.onINP)(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
51
|
+
(0, attribution_1.onINP)((metric) => {
|
|
52
|
+
const { interactionTime, presentationDelay, inputDelay, processingDuration, nextPaintTime, loadState, interactionTarget, interactionType, } = metric.attribution;
|
|
53
|
+
const values = this.buildInitialValues(metric);
|
|
54
|
+
this.addIfPresent(values, 'interaction_time', interactionTime);
|
|
55
|
+
this.addIfPresent(values, 'presentation_delay', presentationDelay);
|
|
56
|
+
this.addIfPresent(values, 'input_delay', inputDelay);
|
|
57
|
+
this.addIfPresent(values, 'processing_duration', processingDuration);
|
|
58
|
+
this.addIfPresent(values, 'next_paint_time', nextPaintTime);
|
|
59
|
+
const context = this.buildInitialContext(metric);
|
|
60
|
+
this.addIfPresent(context, loadStateKey, loadState);
|
|
61
|
+
this.addIfPresent(context, 'interaction_target', interactionTarget);
|
|
62
|
+
this.addIfPresent(context, 'interaction_type', interactionType);
|
|
63
|
+
this.pushMeasurement(values, context);
|
|
67
64
|
}, { reportAllChanges: (_a = this.webVitalConfig) === null || _a === void 0 ? void 0 : _a.reportAllChanges });
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
var _this = this;
|
|
65
|
+
}
|
|
66
|
+
measureLCP() {
|
|
71
67
|
var _a;
|
|
72
|
-
(0, attribution_1.onLCP)(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
68
|
+
(0, attribution_1.onLCP)((metric) => {
|
|
69
|
+
const { elementRenderDelay, resourceLoadDelay, resourceLoadDuration, timeToFirstByte, target } = metric.attribution;
|
|
70
|
+
const values = this.buildInitialValues(metric);
|
|
71
|
+
this.addIfPresent(values, 'element_render_delay', elementRenderDelay);
|
|
72
|
+
this.addIfPresent(values, 'resource_load_delay', resourceLoadDelay);
|
|
73
|
+
this.addIfPresent(values, 'resource_load_duration', resourceLoadDuration);
|
|
74
|
+
this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte);
|
|
75
|
+
const context = this.buildInitialContext(metric);
|
|
76
|
+
this.addIfPresent(context, 'element', target);
|
|
77
|
+
this.pushMeasurement(values, context);
|
|
82
78
|
}, { reportAllChanges: (_a = this.webVitalConfig) === null || _a === void 0 ? void 0 : _a.reportAllChanges });
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
var _this = this;
|
|
79
|
+
}
|
|
80
|
+
measureTTFB() {
|
|
86
81
|
var _a;
|
|
87
|
-
(0, attribution_1.onTTFB)(
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
82
|
+
(0, attribution_1.onTTFB)((metric) => {
|
|
83
|
+
const { dnsDuration, connectionDuration, requestDuration, waitingDuration, cacheDuration } = metric.attribution;
|
|
84
|
+
const values = this.buildInitialValues(metric);
|
|
85
|
+
this.addIfPresent(values, 'dns_duration', dnsDuration);
|
|
86
|
+
this.addIfPresent(values, 'connection_duration', connectionDuration);
|
|
87
|
+
this.addIfPresent(values, 'request_duration', requestDuration);
|
|
88
|
+
this.addIfPresent(values, 'waiting_duration', waitingDuration);
|
|
89
|
+
this.addIfPresent(values, 'cache_duration', cacheDuration);
|
|
90
|
+
const context = this.buildInitialContext(metric);
|
|
91
|
+
this.pushMeasurement(values, context);
|
|
97
92
|
}, { reportAllChanges: (_a = this.webVitalConfig) === null || _a === void 0 ? void 0 : _a.reportAllChanges });
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
WebVitalsWithAttribution.prototype.buildInitialContext = function (metric) {
|
|
93
|
+
}
|
|
94
|
+
buildInitialValues(metric) {
|
|
95
|
+
const indicator = metric.name.toLowerCase();
|
|
96
|
+
return {
|
|
97
|
+
[indicator]: metric.value,
|
|
98
|
+
delta: metric.delta,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
buildInitialContext(metric) {
|
|
108
102
|
var _a;
|
|
109
|
-
|
|
103
|
+
const navigationEntryId = (_a = (0, utils_1.getItem)(instrumentationConstants_1.NAVIGATION_ID_STORAGE_KEY, utils_1.webStorageType.session)) !== null && _a !== void 0 ? _a : faro_core_1.unknownString;
|
|
110
104
|
return {
|
|
111
105
|
id: metric.id,
|
|
112
106
|
rating: metric.rating,
|
|
113
107
|
navigation_type: metric.navigationType,
|
|
114
108
|
navigation_entry_id: navigationEntryId,
|
|
115
109
|
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
this.corePushMeasurement({ type
|
|
120
|
-
}
|
|
121
|
-
|
|
110
|
+
}
|
|
111
|
+
pushMeasurement(values, context) {
|
|
112
|
+
const type = 'web-vitals';
|
|
113
|
+
this.corePushMeasurement({ type, values }, { context });
|
|
114
|
+
}
|
|
115
|
+
addIfPresent(source, key, metric) {
|
|
122
116
|
if (metric) {
|
|
123
117
|
source[key] = metric;
|
|
124
118
|
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
}());
|
|
119
|
+
}
|
|
120
|
+
}
|
|
128
121
|
exports.WebVitalsWithAttribution = WebVitalsWithAttribution;
|
|
129
122
|
//# sourceMappingURL=webVitalsWithAttribution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webVitalsWithAttribution.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/webVitalsWithAttribution.ts"],"names":[],"mappings":"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","sourcesContent":["import { onCLS, onFCP, onINP, onLCP, onTTFB } from 'web-vitals/attribution';\nimport type { Metric } from 'web-vitals/attribution';\n\nimport { unknownString } from '@grafana/faro-core';\nimport type { Config, MeasurementEvent, MeasurementsAPI, PushMeasurementOptions } from '@grafana/faro-core';\n\nimport { getItem, webStorageType } from '../../utils';\nimport { NAVIGATION_ID_STORAGE_KEY } from '../instrumentationConstants';\n\ntype Values = MeasurementEvent['values'];\ntype Context = Required<PushMeasurementOptions>['context'];\n\n// duplicate keys saved in variables to save bundle size\n// refs: https://github.com/grafana/faro-web-sdk/pull/595#discussion_r1615833968\nconst loadStateKey = 'load_state';\nconst timeToFirstByteKey = 'time_to_first_byte';\n\nexport class WebVitalsWithAttribution {\n constructor(\n private corePushMeasurement: MeasurementsAPI['pushMeasurement'],\n private webVitalConfig?: Config['webVitalsInstrumentation']\n ) {}\n\n initialize(): void {\n this.measureCLS();\n this.measureFCP();\n this.measureINP();\n this.measureLCP();\n this.measureTTFB();\n }\n\n private measureCLS(): void {\n onCLS(\n (metric) => {\n const { loadState, largestShiftValue, largestShiftTime, largestShiftTarget } = metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'largest_shift_value', largestShiftValue);\n this.addIfPresent(values, 'largest_shift_time', largestShiftTime);\n\n const context = this.buildInitialContext(metric);\n this.addIfPresent(context, loadStateKey, loadState);\n this.addIfPresent(context, 'largest_shift_target', largestShiftTarget);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private measureFCP(): void {\n onFCP(\n (metric) => {\n const { firstByteToFCP, timeToFirstByte, loadState } = metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'first_byte_to_fcp', firstByteToFCP);\n this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte);\n\n const context = this.buildInitialContext(metric);\n this.addIfPresent(context, loadStateKey, loadState);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private measureINP(): void {\n onINP(\n (metric) => {\n const {\n interactionTime,\n presentationDelay,\n inputDelay,\n processingDuration,\n nextPaintTime,\n loadState,\n interactionTarget,\n interactionType,\n } = metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'interaction_time', interactionTime);\n this.addIfPresent(values, 'presentation_delay', presentationDelay);\n this.addIfPresent(values, 'input_delay', inputDelay);\n this.addIfPresent(values, 'processing_duration', processingDuration);\n this.addIfPresent(values, 'next_paint_time', nextPaintTime);\n\n const context = this.buildInitialContext(metric);\n this.addIfPresent(context, loadStateKey, loadState);\n this.addIfPresent(context, 'interaction_target', interactionTarget);\n this.addIfPresent(context, 'interaction_type', interactionType);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private measureLCP(): void {\n onLCP(\n (metric) => {\n const { elementRenderDelay, resourceLoadDelay, resourceLoadDuration, timeToFirstByte, target } =\n metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'element_render_delay', elementRenderDelay);\n this.addIfPresent(values, 'resource_load_delay', resourceLoadDelay);\n this.addIfPresent(values, 'resource_load_duration', resourceLoadDuration);\n this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte);\n\n const context = this.buildInitialContext(metric);\n this.addIfPresent(context, 'element', target);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private measureTTFB(): void {\n onTTFB(\n (metric) => {\n const { dnsDuration, connectionDuration, requestDuration, waitingDuration, cacheDuration } = metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'dns_duration', dnsDuration);\n this.addIfPresent(values, 'connection_duration', connectionDuration);\n this.addIfPresent(values, 'request_duration', requestDuration);\n this.addIfPresent(values, 'waiting_duration', waitingDuration);\n this.addIfPresent(values, 'cache_duration', cacheDuration);\n\n const context = this.buildInitialContext(metric);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private buildInitialValues(metric: Metric): Values {\n const indicator = metric.name.toLowerCase();\n return {\n [indicator]: metric.value,\n delta: metric.delta,\n };\n }\n\n private buildInitialContext(metric: Metric): Context {\n const navigationEntryId = getItem(NAVIGATION_ID_STORAGE_KEY, webStorageType.session) ?? unknownString;\n\n return {\n id: metric.id,\n rating: metric.rating,\n navigation_type: metric.navigationType,\n navigation_entry_id: navigationEntryId,\n };\n }\n\n private pushMeasurement(values: Values, context: Context): void {\n const type = 'web-vitals';\n this.corePushMeasurement({ type, values }, { context });\n }\n\n private addIfPresent(source: Values | Context, key: string, metric?: number | string): void {\n if (metric) {\n source[key] = metric;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"webVitalsWithAttribution.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/webVitalsWithAttribution.ts"],"names":[],"mappings":"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","sourcesContent":["import { onCLS, onFCP, onINP, onLCP, onTTFB } from 'web-vitals/attribution';\nimport type { Metric } from 'web-vitals/attribution';\n\nimport { unknownString } from '@grafana/faro-core';\nimport type { Config, MeasurementEvent, MeasurementsAPI, PushMeasurementOptions } from '@grafana/faro-core';\n\nimport { getItem, webStorageType } from '../../utils';\nimport { NAVIGATION_ID_STORAGE_KEY } from '../instrumentationConstants';\n\ntype Values = MeasurementEvent['values'];\ntype Context = Required<PushMeasurementOptions>['context'];\n\n// duplicate keys saved in variables to save bundle size\n// refs: https://github.com/grafana/faro-web-sdk/pull/595#discussion_r1615833968\nconst loadStateKey = 'load_state';\nconst timeToFirstByteKey = 'time_to_first_byte';\n\nexport class WebVitalsWithAttribution {\n constructor(\n private corePushMeasurement: MeasurementsAPI['pushMeasurement'],\n private webVitalConfig?: Config['webVitalsInstrumentation']\n ) {}\n\n initialize(): void {\n this.measureCLS();\n this.measureFCP();\n this.measureINP();\n this.measureLCP();\n this.measureTTFB();\n }\n\n private measureCLS(): void {\n onCLS(\n (metric) => {\n const { loadState, largestShiftValue, largestShiftTime, largestShiftTarget } = metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'largest_shift_value', largestShiftValue);\n this.addIfPresent(values, 'largest_shift_time', largestShiftTime);\n\n const context = this.buildInitialContext(metric);\n this.addIfPresent(context, loadStateKey, loadState);\n this.addIfPresent(context, 'largest_shift_target', largestShiftTarget);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private measureFCP(): void {\n onFCP(\n (metric) => {\n const { firstByteToFCP, timeToFirstByte, loadState } = metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'first_byte_to_fcp', firstByteToFCP);\n this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte);\n\n const context = this.buildInitialContext(metric);\n this.addIfPresent(context, loadStateKey, loadState);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private measureINP(): void {\n onINP(\n (metric) => {\n const {\n interactionTime,\n presentationDelay,\n inputDelay,\n processingDuration,\n nextPaintTime,\n loadState,\n interactionTarget,\n interactionType,\n } = metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'interaction_time', interactionTime);\n this.addIfPresent(values, 'presentation_delay', presentationDelay);\n this.addIfPresent(values, 'input_delay', inputDelay);\n this.addIfPresent(values, 'processing_duration', processingDuration);\n this.addIfPresent(values, 'next_paint_time', nextPaintTime);\n\n const context = this.buildInitialContext(metric);\n this.addIfPresent(context, loadStateKey, loadState);\n this.addIfPresent(context, 'interaction_target', interactionTarget);\n this.addIfPresent(context, 'interaction_type', interactionType);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private measureLCP(): void {\n onLCP(\n (metric) => {\n const { elementRenderDelay, resourceLoadDelay, resourceLoadDuration, timeToFirstByte, target } =\n metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'element_render_delay', elementRenderDelay);\n this.addIfPresent(values, 'resource_load_delay', resourceLoadDelay);\n this.addIfPresent(values, 'resource_load_duration', resourceLoadDuration);\n this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte);\n\n const context = this.buildInitialContext(metric);\n this.addIfPresent(context, 'element', target);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private measureTTFB(): void {\n onTTFB(\n (metric) => {\n const { dnsDuration, connectionDuration, requestDuration, waitingDuration, cacheDuration } = metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'dns_duration', dnsDuration);\n this.addIfPresent(values, 'connection_duration', connectionDuration);\n this.addIfPresent(values, 'request_duration', requestDuration);\n this.addIfPresent(values, 'waiting_duration', waitingDuration);\n this.addIfPresent(values, 'cache_duration', cacheDuration);\n\n const context = this.buildInitialContext(metric);\n\n this.pushMeasurement(values, context);\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n }\n\n private buildInitialValues(metric: Metric): Values {\n const indicator = metric.name.toLowerCase();\n return {\n [indicator]: metric.value,\n delta: metric.delta,\n };\n }\n\n private buildInitialContext(metric: Metric): Context {\n const navigationEntryId = getItem(NAVIGATION_ID_STORAGE_KEY, webStorageType.session) ?? unknownString;\n\n return {\n id: metric.id,\n rating: metric.rating,\n navigation_type: metric.navigationType,\n navigation_entry_id: navigationEntryId,\n };\n }\n\n private pushMeasurement(values: Values, context: Context): void {\n const type = 'web-vitals';\n this.corePushMeasurement({ type, values }, { context });\n }\n\n private addIfPresent(source: Values | Context, key: string, metric?: number | string): void {\n if (metric) {\n source[key] = metric;\n }\n }\n}\n"]}
|
|
@@ -1,27 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.browserMeta = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var brands = getBrands();
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
const shared_1 = require("../shared");
|
|
6
|
+
const browserMeta = () => {
|
|
7
|
+
const { browser, os, ua: userAgent } = (0, shared_1.getUAResult)();
|
|
8
|
+
const { name, version } = browser;
|
|
9
|
+
const { name: osName, version: osVersion } = os;
|
|
10
|
+
const language = navigator.language;
|
|
11
|
+
const mobile = userAgent.includes('Mobi');
|
|
12
|
+
const brands = getBrands();
|
|
14
13
|
return {
|
|
15
14
|
browser: {
|
|
16
15
|
name: name !== null && name !== void 0 ? name : faro_core_1.unknownString,
|
|
17
16
|
version: version !== null && version !== void 0 ? version : faro_core_1.unknownString,
|
|
18
|
-
os:
|
|
17
|
+
os: `${osName !== null && osName !== void 0 ? osName : faro_core_1.unknownString} ${osVersion !== null && osVersion !== void 0 ? osVersion : faro_core_1.unknownString}`,
|
|
19
18
|
userAgent: userAgent !== null && userAgent !== void 0 ? userAgent : faro_core_1.unknownString,
|
|
20
19
|
language: language !== null && language !== void 0 ? language : faro_core_1.unknownString,
|
|
21
|
-
mobile
|
|
20
|
+
mobile,
|
|
22
21
|
brands: brands !== null && brands !== void 0 ? brands : faro_core_1.unknownString,
|
|
23
|
-
viewportWidth:
|
|
24
|
-
viewportHeight:
|
|
22
|
+
viewportWidth: `${window.innerWidth}`,
|
|
23
|
+
viewportHeight: `${window.innerHeight}`,
|
|
25
24
|
},
|
|
26
25
|
};
|
|
27
26
|
function getBrands() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/browser/meta.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/browser/meta.ts"],"names":[],"mappings":";;;AAAA,kDAAmD;AAGnD,sCAAwC;AAEjC,MAAM,WAAW,GAAoC,GAAG,EAAE;IAC/D,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,IAAA,oBAAW,GAAE,CAAC;IACrD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,yBAAa;YAC3B,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,yBAAa;YACjC,EAAE,EAAE,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,yBAAa,IAAI,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,yBAAa,EAAE;YAC9D,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,yBAAa;YACrC,QAAQ,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,yBAAa;YACnC,MAAM;YACN,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,yBAAa;YAC/B,aAAa,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE;YACrC,cAAc,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE;SACxC;KACF,CAAC;IAEF,SAAS,SAAS;QAChB,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,eAAe,IAAI,SAAS,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;YAC5D,iHAAiH;YACjH,OAAQ,SAAiB,CAAC,aAAa,CAAC,MAAM,CAAC;QACjD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAlCW,QAAA,WAAW,eAkCtB","sourcesContent":["import { unknownString } from '@grafana/faro-core';\nimport type { Meta, MetaBrowser, MetaItem } from '@grafana/faro-core';\n\nimport { getUAResult } from '../shared';\n\nexport const browserMeta: MetaItem<Pick<Meta, 'browser'>> = () => {\n const { browser, os, ua: userAgent } = getUAResult();\n const { name, version } = browser;\n const { name: osName, version: osVersion } = os;\n const language = navigator.language;\n const mobile = userAgent.includes('Mobi');\n const brands = getBrands();\n\n return {\n browser: {\n name: name ?? unknownString,\n version: version ?? unknownString,\n os: `${osName ?? unknownString} ${osVersion ?? unknownString}`,\n userAgent: userAgent ?? unknownString,\n language: language ?? unknownString,\n mobile,\n brands: brands ?? unknownString,\n viewportWidth: `${window.innerWidth}`,\n viewportHeight: `${window.innerHeight}`,\n },\n };\n\n function getBrands(): MetaBrowser['brands'] | undefined {\n if (!name || !version) {\n return undefined;\n }\n\n if ('userAgentData' in navigator && navigator.userAgentData) {\n // userAgentData in experimental (only Chrome supports it) thus TS does not ship the respective type declarations\n return (navigator as any).userAgentData.brands;\n }\n\n return undefined;\n }\n};\n"]}
|
package/dist/cjs/metas/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sdkMeta = exports.createSession = exports.browserMeta = void 0;
|
|
3
|
+
exports.sdkMeta = exports.createSession = exports.osMeta = exports.browserMeta = void 0;
|
|
4
4
|
var browser_1 = require("./browser");
|
|
5
5
|
Object.defineProperty(exports, "browserMeta", { enumerable: true, get: function () { return browser_1.browserMeta; } });
|
|
6
|
+
var os_1 = require("./os");
|
|
7
|
+
Object.defineProperty(exports, "osMeta", { enumerable: true, get: function () { return os_1.osMeta; } });
|
|
6
8
|
var session_1 = require("./session");
|
|
7
9
|
Object.defineProperty(exports, "createSession", { enumerable: true, get: function () { return session_1.createSession; } });
|
|
8
10
|
var sdk_1 = require("./sdk");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metas/index.ts"],"names":[],"mappings":";;;AAAA,qCAAwC;AAA/B,sGAAA,WAAW,OAAA;AAEpB,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AAEtB,6BAAgC;AAAvB,8FAAA,OAAO,OAAA","sourcesContent":["export { browserMeta } from './browser';\n\nexport { createSession } from './session';\n\nexport { sdkMeta } from './sdk';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metas/index.ts"],"names":[],"mappings":";;;AAAA,qCAAwC;AAA/B,sGAAA,WAAW,OAAA;AAEpB,2BAA8B;AAArB,4FAAA,MAAM,OAAA;AAEf,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AAEtB,6BAAgC;AAAvB,8FAAA,OAAO,OAAA","sourcesContent":["export { browserMeta } from './browser';\n\nexport { osMeta } from './os';\n\nexport { createSession } from './session';\n\nexport { sdkMeta } from './sdk';\n"]}
|
|
@@ -1,21 +1,10 @@
|
|
|
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
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
3
|
exports.k6Meta = void 0;
|
|
15
|
-
|
|
16
|
-
|
|
4
|
+
const k6Meta = () => {
|
|
5
|
+
const k6Properties = window.k6;
|
|
17
6
|
return {
|
|
18
|
-
k6:
|
|
7
|
+
k6: Object.assign({
|
|
19
8
|
// we only add the k6 meta if Faro is running inside a k6 environment, so this is always true
|
|
20
9
|
isK6Browser: true }, ((k6Properties === null || k6Properties === void 0 ? void 0 : k6Properties.testRunId) && { testRunId: k6Properties === null || k6Properties === void 0 ? void 0 : k6Properties.testRunId })),
|
|
21
10
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/k6/meta.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/k6/meta.ts"],"names":[],"mappings":";;;AAMO,MAAM,MAAM,GAA+B,GAAG,EAAE;IACrD,MAAM,YAAY,GAAkB,MAAc,CAAC,EAAE,CAAC;IAEtD,OAAO;QACL,EAAE;YACA,6FAA6F;YAC7F,WAAW,EAAE,IAAI,IACd,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,KAAI,EAAE,SAAS,EAAE,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,EAAE,CAAC,CACvE;KACF,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,MAAM,UAUjB","sourcesContent":["import type { Meta, MetaItem } from '@grafana/faro-core';\n\ntype K6Properties = {\n testRunId?: string;\n};\n\nexport const k6Meta: MetaItem<Pick<Meta, 'k6'>> = () => {\n const k6Properties: K6Properties = (window as any).k6;\n\n return {\n k6: {\n // we only add the k6 meta if Faro is running inside a k6 environment, so this is always true\n isK6Browser: true,\n ...(k6Properties?.testRunId && { testRunId: k6Properties?.testRunId }),\n },\n };\n};\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.osMeta = void 0;
|
|
4
|
+
var meta_1 = require("./meta");
|
|
5
|
+
Object.defineProperty(exports, "osMeta", { enumerable: true, get: function () { return meta_1.osMeta; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/metas/os/index.ts"],"names":[],"mappings":";;;AAAA,+BAAgC;AAAvB,8FAAA,MAAM,OAAA","sourcesContent":["export { osMeta } from './meta';\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.osMeta = void 0;
|
|
4
|
+
const shared_1 = require("../shared");
|
|
5
|
+
const osMeta = () => {
|
|
6
|
+
const { name, version } = (0, shared_1.getUAResult)().os;
|
|
7
|
+
if (!name && !version) {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
const os = {};
|
|
11
|
+
if (name) {
|
|
12
|
+
os.name = name;
|
|
13
|
+
}
|
|
14
|
+
if (version) {
|
|
15
|
+
os.version = version;
|
|
16
|
+
}
|
|
17
|
+
return { os };
|
|
18
|
+
};
|
|
19
|
+
exports.osMeta = osMeta;
|
|
20
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/os/meta.ts"],"names":[],"mappings":";;;AAEA,sCAAwC;AAEjC,MAAM,MAAM,GAAiC,GAAG,EAAE;IACvD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAA,oBAAW,GAAE,CAAC,EAAE,CAAC;IAE3C,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,EAAE,GAAW,EAAE,CAAC;IAEtB,IAAI,IAAI,EAAE,CAAC;QACT,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,EAAE,CAAC,OAAO,GAAG,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,CAAC;AAChB,CAAC,CAAC;AAlBW,QAAA,MAAM,UAkBjB","sourcesContent":["import type { Meta, MetaGetter, MetaOS } from '@grafana/faro-core';\n\nimport { getUAResult } from '../shared';\n\nexport const osMeta: MetaGetter<Pick<Meta, 'os'>> = () => {\n const { name, version } = getUAResult().os;\n\n if (!name && !version) {\n return {};\n }\n\n const os: MetaOS = {};\n\n if (name) {\n os.name = name;\n }\n\n if (version) {\n os.version = version;\n }\n\n return { os };\n};\n"]}
|