@grafana/faro-web-sdk 1.18.2 → 2.0.0-beta
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/config/types.d.ts +2 -2
- package/dist/bundle/types/index.d.ts +6 -6
- package/dist/bundle/types/instrumentations/console/index.d.ts +0 -1
- package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -4
- package/dist/bundle/types/instrumentations/csp/index.d.ts +1 -0
- package/dist/bundle/types/instrumentations/csp/instrumentation.d.ts +10 -0
- package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/index.d.ts +3 -3
- package/dist/bundle/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/session/index.d.ts +1 -1
- package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/session/sessionManager/index.d.ts +1 -1
- package/dist/bundle/types/instrumentations/session/sessionManager/sessionConstants.d.ts +0 -4
- package/dist/bundle/types/instrumentations/userActions/index.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +3 -2
- package/dist/bundle/types/instrumentations/userActions/processUserActionEventHandler.d.ts +10 -3
- package/dist/bundle/types/instrumentations/userActions/types.d.ts +0 -5
- 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/instrumentations/webVitals/webVitalsBasic.d.ts +1 -2
- package/dist/bundle/types/instrumentations/webVitals/webVitalsWithAttribution.d.ts +0 -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 +4 -3
- package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
- package/dist/cjs/config/makeCoreConfig.js +6 -5
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/config/types.js.map +1 -1
- package/dist/cjs/index.js +3 -11
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/instrumentations/console/index.js.map +1 -1
- package/dist/cjs/instrumentations/console/instrumentation.js +11 -25
- package/dist/cjs/instrumentations/console/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/csp/index.js +6 -0
- package/dist/cjs/instrumentations/csp/index.js.map +1 -0
- package/dist/cjs/instrumentations/csp/instrumentation.js +40 -0
- package/dist/cjs/instrumentations/csp/instrumentation.js.map +1 -0
- package/dist/cjs/instrumentations/errors/stackFrames/const.js +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/const.js.map +1 -1
- package/dist/cjs/instrumentations/index.js +3 -3
- package/dist/cjs/instrumentations/index.js.map +1 -1
- package/dist/cjs/instrumentations/session/index.js +1 -2
- package/dist/cjs/instrumentations/session/index.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/index.js +1 -2
- package/dist/cjs/instrumentations/session/sessionManager/index.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/sessionConstants.js +1 -5
- package/dist/cjs/instrumentations/session/sessionManager/sessionConstants.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/index.js +1 -2
- package/dist/cjs/instrumentations/userActions/index.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/instrumentation.js +17 -15
- package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +30 -129
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/types.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/webVitalsBasic.js +0 -1
- package/dist/cjs/instrumentations/webVitals/webVitalsBasic.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js +2 -17
- package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
- package/dist/esm/config/getWebInstrumentations.js +5 -4
- package/dist/esm/config/getWebInstrumentations.js.map +1 -1
- package/dist/esm/config/makeCoreConfig.js +9 -5
- package/dist/esm/config/makeCoreConfig.js.map +1 -1
- package/dist/esm/config/types.js.map +1 -1
- package/dist/esm/index.js +4 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instrumentations/console/index.js.map +1 -1
- package/dist/esm/instrumentations/console/instrumentation.js +9 -11
- package/dist/esm/instrumentations/console/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/csp/index.js +2 -0
- package/dist/esm/instrumentations/csp/index.js.map +1 -0
- package/dist/esm/instrumentations/csp/instrumentation.js +18 -0
- package/dist/esm/instrumentations/csp/instrumentation.js.map +1 -0
- package/dist/esm/instrumentations/errors/stackFrames/const.js +1 -1
- package/dist/esm/instrumentations/errors/stackFrames/const.js.map +1 -1
- package/dist/esm/instrumentations/index.js +3 -2
- package/dist/esm/instrumentations/index.js.map +1 -1
- package/dist/esm/instrumentations/session/index.js +1 -1
- package/dist/esm/instrumentations/session/index.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionManager/index.js +1 -1
- package/dist/esm/instrumentations/session/sessionManager/index.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionManager/sessionConstants.js +0 -4
- package/dist/esm/instrumentations/session/sessionManager/sessionConstants.js.map +1 -1
- package/dist/esm/instrumentations/userActions/index.js +1 -1
- package/dist/esm/instrumentations/userActions/index.js.map +1 -1
- package/dist/esm/instrumentations/userActions/instrumentation.js +17 -15
- package/dist/esm/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js +30 -125
- package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/esm/instrumentations/userActions/types.js.map +1 -1
- package/dist/esm/instrumentations/webVitals/webVitalsBasic.js +1 -2
- package/dist/esm/instrumentations/webVitals/webVitalsBasic.js.map +1 -1
- package/dist/esm/instrumentations/webVitals/webVitalsWithAttribution.js +3 -17
- package/dist/esm/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
- package/dist/types/config/types.d.ts +2 -2
- package/dist/types/index.d.ts +6 -6
- package/dist/types/instrumentations/console/index.d.ts +0 -1
- package/dist/types/instrumentations/console/instrumentation.d.ts +1 -4
- package/dist/types/instrumentations/csp/index.d.ts +1 -0
- package/dist/types/instrumentations/csp/instrumentation.d.ts +10 -0
- package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/index.d.ts +3 -3
- package/dist/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/session/index.d.ts +1 -1
- package/dist/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/session/sessionManager/index.d.ts +1 -1
- package/dist/types/instrumentations/session/sessionManager/sessionConstants.d.ts +0 -4
- package/dist/types/instrumentations/userActions/index.d.ts +1 -1
- package/dist/types/instrumentations/userActions/instrumentation.d.ts +3 -2
- package/dist/types/instrumentations/userActions/processUserActionEventHandler.d.ts +10 -3
- package/dist/types/instrumentations/userActions/types.d.ts +0 -5
- package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/webVitals/webVitalsBasic.d.ts +1 -2
- package/dist/types/instrumentations/webVitals/webVitalsWithAttribution.d.ts +0 -1
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/package.json +10 -10
- package/dist/bundle/types/instrumentations/console/types.d.ts +0 -6
- package/dist/cjs/instrumentations/console/types.js +0 -3
- package/dist/cjs/instrumentations/console/types.js.map +0 -1
- package/dist/esm/instrumentations/console/types.js +0 -2
- package/dist/esm/instrumentations/console/types.js.map +0 -1
- package/dist/types/instrumentations/console/types.d.ts +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/instrumentations/index.ts"],"names":[],"mappings":";;;AAAA,qCAAmD;AAA1C,iHAAA,sBAAsB,OAAA;AAE/B,qCAAmD;AAA1C,iHAAA,sBAAsB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/instrumentations/index.ts"],"names":[],"mappings":";;;AAAA,qCAAmD;AAA1C,iHAAA,sBAAsB,OAAA;AAE/B,qCAAmD;AAA1C,iHAAA,sBAAsB,OAAA;AAE/B,mCAMkB;AALhB,yGAAA,eAAe,OAAA;AACf,+GAAA,qBAAqB,OAAA;AACrB,qHAAA,2BAA2B,OAAA;AAC3B,iHAAA,uBAAuB,OAAA;AACvB,yGAAA,eAAe,OAAA;AAIjB,+BAA6C;AAApC,2GAAA,mBAAmB,OAAA;AAE5B,yCAAuD;AAA9C,qHAAA,wBAAwB,OAAA;AAEjC,qCAOmB;AANjB,oHAAA,yBAAyB,OAAA;AACzB,kHAAA,uBAAuB,OAAA;AACvB,uHAAA,4BAA4B,OAAA;AAC5B,kHAAA,uBAAuB,OAAA;AACvB,kHAAA,uBAAuB,OAAA;AACvB,sGAAA,WAAW,OAAA;AAGb,6CAA2D;AAAlD,yHAAA,0BAA0B,OAAA;AAEnC,6CAAmF;AAA1E,wHAAA,yBAAyB,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AAE3D,6BAA2C;AAAlC,yGAAA,kBAAkB,OAAA","sourcesContent":["export { SessionInstrumentation } from './session';\n\nexport { ConsoleInstrumentation } from './console';\n\nexport {\n buildStackFrame,\n ErrorsInstrumentation,\n getDataFromSafariExtensions,\n getStackFramesFromError,\n parseStacktrace,\n} from './errors';\nexport type { ErrorEvent, ExtendedPromiseRejectionEvent } from './errors';\n\nexport { ViewInstrumentation } from './view';\n\nexport { WebVitalsInstrumentation } from './webVitals';\n\nexport {\n PersistentSessionsManager,\n VolatileSessionsManager,\n MAX_SESSION_PERSISTENCE_TIME,\n SESSION_EXPIRATION_TIME,\n SESSION_INACTIVITY_TIME,\n STORAGE_KEY,\n} from './session';\n\nexport { PerformanceInstrumentation } from './performance';\n\nexport { UserActionInstrumentation, userActionDataAttribute } from './userActions';\n\nexport { CSPInstrumentation } from './csp';\n"]}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isSampled = exports.defaultSessionTrackingConfig = exports.VolatileSessionsManager = exports.STORAGE_UPDATE_DELAY = exports.STORAGE_KEY = exports.SESSION_INACTIVITY_TIME = exports.SESSION_EXPIRATION_TIME = exports.PersistentSessionsManager = exports.
|
|
3
|
+
exports.isSampled = exports.defaultSessionTrackingConfig = exports.VolatileSessionsManager = exports.STORAGE_UPDATE_DELAY = exports.STORAGE_KEY = exports.SESSION_INACTIVITY_TIME = exports.SESSION_EXPIRATION_TIME = exports.PersistentSessionsManager = exports.MAX_SESSION_PERSISTENCE_TIME = exports.SessionInstrumentation = void 0;
|
|
4
4
|
var instrumentation_1 = require("./instrumentation");
|
|
5
5
|
Object.defineProperty(exports, "SessionInstrumentation", { enumerable: true, get: function () { return instrumentation_1.SessionInstrumentation; } });
|
|
6
6
|
var sessionManager_1 = require("./sessionManager");
|
|
7
7
|
Object.defineProperty(exports, "MAX_SESSION_PERSISTENCE_TIME", { enumerable: true, get: function () { return sessionManager_1.MAX_SESSION_PERSISTENCE_TIME; } });
|
|
8
|
-
Object.defineProperty(exports, "MAX_SESSION_PERSISTENCE_TIME_BUFFER", { enumerable: true, get: function () { return sessionManager_1.MAX_SESSION_PERSISTENCE_TIME_BUFFER; } });
|
|
9
8
|
Object.defineProperty(exports, "PersistentSessionsManager", { enumerable: true, get: function () { return sessionManager_1.PersistentSessionsManager; } });
|
|
10
9
|
Object.defineProperty(exports, "SESSION_EXPIRATION_TIME", { enumerable: true, get: function () { return sessionManager_1.SESSION_EXPIRATION_TIME; } });
|
|
11
10
|
Object.defineProperty(exports, "SESSION_INACTIVITY_TIME", { enumerable: true, get: function () { return sessionManager_1.SESSION_INACTIVITY_TIME; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/index.ts"],"names":[],"mappings":";;;AAAA,qDAA2D;AAAlD,yHAAA,sBAAsB,OAAA;AAE/B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/index.ts"],"names":[],"mappings":";;;AAAA,qDAA2D;AAAlD,yHAAA,sBAAsB,OAAA;AAE/B,mDAU0B;AATxB,8HAAA,4BAA4B,OAAA;AAC5B,2HAAA,yBAAyB,OAAA;AACzB,yHAAA,uBAAuB,OAAA;AACvB,yHAAA,uBAAuB,OAAA;AACvB,6GAAA,WAAW,OAAA;AACX,sHAAA,oBAAoB,OAAA;AACpB,yHAAA,uBAAuB,OAAA;AACvB,8HAAA,4BAA4B,OAAA;AAC5B,2GAAA,SAAS,OAAA","sourcesContent":["export { SessionInstrumentation } from './instrumentation';\n\nexport {\n MAX_SESSION_PERSISTENCE_TIME,\n PersistentSessionsManager,\n SESSION_EXPIRATION_TIME,\n SESSION_INACTIVITY_TIME,\n STORAGE_KEY,\n STORAGE_UPDATE_DELAY,\n VolatileSessionsManager,\n defaultSessionTrackingConfig,\n isSampled,\n} from './sessionManager';\n\nexport type { FaroUserSession } from './sessionManager';\n"]}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSessionManagerByConfig = exports.isSampled = exports.defaultSessionTrackingConfig = exports.STORAGE_UPDATE_DELAY = exports.STORAGE_KEY = exports.SESSION_INACTIVITY_TIME = exports.SESSION_EXPIRATION_TIME = exports.
|
|
3
|
+
exports.getSessionManagerByConfig = exports.isSampled = exports.defaultSessionTrackingConfig = exports.STORAGE_UPDATE_DELAY = exports.STORAGE_KEY = exports.SESSION_INACTIVITY_TIME = exports.SESSION_EXPIRATION_TIME = exports.MAX_SESSION_PERSISTENCE_TIME = exports.VolatileSessionsManager = exports.PersistentSessionsManager = void 0;
|
|
4
4
|
var PersistentSessionsManager_1 = require("./PersistentSessionsManager");
|
|
5
5
|
Object.defineProperty(exports, "PersistentSessionsManager", { enumerable: true, get: function () { return PersistentSessionsManager_1.PersistentSessionsManager; } });
|
|
6
6
|
var VolatileSessionManager_1 = require("./VolatileSessionManager");
|
|
7
7
|
Object.defineProperty(exports, "VolatileSessionsManager", { enumerable: true, get: function () { return VolatileSessionManager_1.VolatileSessionsManager; } });
|
|
8
8
|
var sessionConstants_1 = require("./sessionConstants");
|
|
9
9
|
Object.defineProperty(exports, "MAX_SESSION_PERSISTENCE_TIME", { enumerable: true, get: function () { return sessionConstants_1.MAX_SESSION_PERSISTENCE_TIME; } });
|
|
10
|
-
Object.defineProperty(exports, "MAX_SESSION_PERSISTENCE_TIME_BUFFER", { enumerable: true, get: function () { return sessionConstants_1.MAX_SESSION_PERSISTENCE_TIME_BUFFER; } });
|
|
11
10
|
Object.defineProperty(exports, "SESSION_EXPIRATION_TIME", { enumerable: true, get: function () { return sessionConstants_1.SESSION_EXPIRATION_TIME; } });
|
|
12
11
|
Object.defineProperty(exports, "SESSION_INACTIVITY_TIME", { enumerable: true, get: function () { return sessionConstants_1.SESSION_INACTIVITY_TIME; } });
|
|
13
12
|
Object.defineProperty(exports, "STORAGE_KEY", { enumerable: true, get: function () { return sessionConstants_1.STORAGE_KEY; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/index.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,mEAAmE;AAA1D,iIAAA,uBAAuB,OAAA;AAEhC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/index.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,mEAAmE;AAA1D,iIAAA,uBAAuB,OAAA;AAEhC,uDAO4B;AAN1B,gIAAA,4BAA4B,OAAA;AAC5B,2HAAA,uBAAuB,OAAA;AACvB,2HAAA,uBAAuB,OAAA;AACvB,+GAAA,WAAW,OAAA;AACX,wHAAA,oBAAoB,OAAA;AACpB,gIAAA,4BAA4B,OAAA;AAG9B,uCAAuC;AAA9B,qGAAA,SAAS,OAAA;AAIlB,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA","sourcesContent":["export { PersistentSessionsManager } from './PersistentSessionsManager';\nexport { VolatileSessionsManager } from './VolatileSessionManager';\n\nexport {\n MAX_SESSION_PERSISTENCE_TIME,\n SESSION_EXPIRATION_TIME,\n SESSION_INACTIVITY_TIME,\n STORAGE_KEY,\n STORAGE_UPDATE_DELAY,\n defaultSessionTrackingConfig,\n} from './sessionConstants';\n\nexport { isSampled } from './sampling';\n\nexport type { FaroUserSession } from './types';\n\nexport { getSessionManagerByConfig } from './getSessionManagerByConfig';\n"]}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.defaultSessionTrackingConfig = exports.MAX_SESSION_PERSISTENCE_TIME = exports.
|
|
3
|
+
exports.defaultSessionTrackingConfig = exports.MAX_SESSION_PERSISTENCE_TIME = exports.STORAGE_UPDATE_DELAY = exports.SESSION_INACTIVITY_TIME = exports.SESSION_EXPIRATION_TIME = exports.STORAGE_KEY = void 0;
|
|
4
4
|
exports.STORAGE_KEY = 'com.grafana.faro.session';
|
|
5
5
|
exports.SESSION_EXPIRATION_TIME = 4 * 60 * 60 * 1000; // hrs
|
|
6
6
|
exports.SESSION_INACTIVITY_TIME = 15 * 60 * 1000; // minutes
|
|
7
7
|
exports.STORAGE_UPDATE_DELAY = 1 * 1000; // seconds
|
|
8
|
-
/**
|
|
9
|
-
* @deprecated MAX_SESSION_PERSISTENCE_TIME_BUFFER is not used anymore. The constant will be removed in the future
|
|
10
|
-
*/
|
|
11
|
-
exports.MAX_SESSION_PERSISTENCE_TIME_BUFFER = 1 * 60 * 1000;
|
|
12
8
|
exports.MAX_SESSION_PERSISTENCE_TIME = exports.SESSION_INACTIVITY_TIME;
|
|
13
9
|
exports.defaultSessionTrackingConfig = {
|
|
14
10
|
enabled: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionConstants.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sessionConstants.ts"],"names":[],"mappings":";;;AAEa,QAAA,WAAW,GAAG,0BAA0B,CAAC;AACzC,QAAA,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;AACpD,QAAA,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;AACpD,QAAA,oBAAoB,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"sessionConstants.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sessionConstants.ts"],"names":[],"mappings":";;;AAEa,QAAA,WAAW,GAAG,0BAA0B,CAAC;AACzC,QAAA,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;AACpD,QAAA,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;AACpD,QAAA,oBAAoB,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU;AAE3C,QAAA,4BAA4B,GAAG,+BAAuB,CAAC;AAEvD,QAAA,4BAA4B,GAA8B;IACrE,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,KAAK;IACjB,yBAAyB,EAAE,oCAA4B;CAC/C,CAAC","sourcesContent":["import type { Config } from '@grafana/faro-core';\n\nexport const STORAGE_KEY = 'com.grafana.faro.session';\nexport const SESSION_EXPIRATION_TIME = 4 * 60 * 60 * 1000; // hrs\nexport const SESSION_INACTIVITY_TIME = 15 * 60 * 1000; // minutes\nexport const STORAGE_UPDATE_DELAY = 1 * 1000; // seconds\n\nexport const MAX_SESSION_PERSISTENCE_TIME = SESSION_INACTIVITY_TIME;\n\nexport const defaultSessionTrackingConfig: Config['sessionTracking'] = {\n enabled: true,\n persistent: false,\n maxSessionPersistenceTime: MAX_SESSION_PERSISTENCE_TIME,\n} as const;\n"]}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.userActionDataAttribute = exports.MESSAGE_TYPE_HTTP_REQUEST_START = exports.MESSAGE_TYPE_HTTP_REQUEST_END = exports.MESSAGE_TYPE_DOM_MUTATION = exports.
|
|
3
|
+
exports.userActionDataAttribute = exports.MESSAGE_TYPE_HTTP_REQUEST_START = exports.MESSAGE_TYPE_HTTP_REQUEST_END = exports.MESSAGE_TYPE_DOM_MUTATION = exports.UserActionInstrumentation = void 0;
|
|
4
4
|
var instrumentation_1 = require("./instrumentation");
|
|
5
5
|
Object.defineProperty(exports, "UserActionInstrumentation", { enumerable: true, get: function () { return instrumentation_1.UserActionInstrumentation; } });
|
|
6
|
-
Object.defineProperty(exports, "startUserAction", { enumerable: true, get: function () { return instrumentation_1.startUserAction; } });
|
|
7
6
|
var const_1 = require("./const");
|
|
8
7
|
Object.defineProperty(exports, "MESSAGE_TYPE_DOM_MUTATION", { enumerable: true, get: function () { return const_1.MESSAGE_TYPE_DOM_MUTATION; } });
|
|
9
8
|
Object.defineProperty(exports, "MESSAGE_TYPE_HTTP_REQUEST_END", { enumerable: true, get: function () { return const_1.MESSAGE_TYPE_HTTP_REQUEST_END; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/index.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/index.ts"],"names":[],"mappings":";;;AAAA,qDAA8D;AAArD,4HAAA,yBAAyB,OAAA;AASlC,iCAKiB;AAJf,kHAAA,yBAAyB,OAAA;AACzB,sHAAA,6BAA6B,OAAA;AAC7B,wHAAA,+BAA+B,OAAA;AAC/B,gHAAA,uBAAuB,OAAA","sourcesContent":["export { UserActionInstrumentation } from './instrumentation';\n\nexport type {\n DomMutationMessage,\n HttpRequestEndMessage,\n HttpRequestStartMessage,\n HttpRequestMessagePayload,\n} from './types';\n\nexport {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n userActionDataAttribute,\n} from './const';\n"]}
|
|
@@ -16,10 +16,8 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
16
16
|
})();
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.UserActionInstrumentation = void 0;
|
|
19
|
-
exports.startUserAction = startUserAction;
|
|
20
19
|
var faro_core_1 = require("@grafana/faro-core");
|
|
21
20
|
var processUserActionEventHandler_1 = require("./processUserActionEventHandler");
|
|
22
|
-
var processUserEventHandler;
|
|
23
21
|
var UserActionInstrumentation = /** @class */ (function (_super) {
|
|
24
22
|
__extends(UserActionInstrumentation, _super);
|
|
25
23
|
function UserActionInstrumentation() {
|
|
@@ -29,21 +27,25 @@ var UserActionInstrumentation = /** @class */ (function (_super) {
|
|
|
29
27
|
return _this;
|
|
30
28
|
}
|
|
31
29
|
UserActionInstrumentation.prototype.initialize = function () {
|
|
32
|
-
|
|
33
|
-
window.addEventListener('pointerdown',
|
|
34
|
-
window.addEventListener('keydown',
|
|
30
|
+
var _a = (0, processUserActionEventHandler_1.getUserEventHandler)(faro_core_1.faro), processUserEvent = _a.processUserEvent, proceessUserActionStarted = _a.proceessUserActionStarted;
|
|
31
|
+
window.addEventListener('pointerdown', processUserEvent);
|
|
32
|
+
window.addEventListener('keydown', function (ev) {
|
|
33
|
+
if ([' ', 'Enter'].includes(ev.key)) {
|
|
34
|
+
processUserEvent(ev);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
this._userActionSub = faro_core_1.userActionsMessageBus.subscribe(function (_a) {
|
|
38
|
+
var type = _a.type, userAction = _a.userAction;
|
|
39
|
+
if (type === 'user_action_start') {
|
|
40
|
+
proceessUserActionStarted(userAction);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
UserActionInstrumentation.prototype.destroy = function () {
|
|
45
|
+
var _a;
|
|
46
|
+
(_a = this._userActionSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
35
47
|
};
|
|
36
48
|
return UserActionInstrumentation;
|
|
37
49
|
}(faro_core_1.BaseInstrumentation));
|
|
38
50
|
exports.UserActionInstrumentation = UserActionInstrumentation;
|
|
39
|
-
function startUserAction(name, attributes) {
|
|
40
|
-
processUserEventHandler === null || processUserEventHandler === void 0 ? void 0 : processUserEventHandler(createUserActionApiEvent(name, attributes));
|
|
41
|
-
}
|
|
42
|
-
function createUserActionApiEvent(name, attributes) {
|
|
43
|
-
return {
|
|
44
|
-
name: name,
|
|
45
|
-
attributes: attributes,
|
|
46
|
-
type: 'apiEvent',
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
51
|
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAkH;AAElH,iFAAsE;AAEtE;IAA+C,6CAAmB;IAAlE;;QACW,UAAI,GAAG,mDAAmD,CAAC;QAC3D,aAAO,GAAG,mBAAO,CAAC;;IAuB7B,CAAC;IAnBC,8CAAU,GAAV;QACQ,IAAA,KAAkD,IAAA,mDAAmB,EAAC,gBAAI,CAAC,EAAzE,gBAAgB,sBAAA,EAAE,yBAAyB,+BAA8B,CAAC;QAClF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAC,EAAiB;YACnD,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,iCAAqB,CAAC,SAAS,CAAC,UAAC,EAAoB;gBAAlB,IAAI,UAAA,EAAE,UAAU,gBAAA;YACvE,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACjC,yBAAyB,CAAC,UAAU,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2CAAO,GAAP;;QACE,MAAA,IAAI,CAAC,cAAc,0CAAE,WAAW,EAAE,CAAC;IACrC,CAAC;IACH,gCAAC;AAAD,CAAC,AAzBD,CAA+C,+BAAmB,GAyBjE;AAzBY,8DAAyB","sourcesContent":["import { BaseInstrumentation, faro, type Subscription, userActionsMessageBus, VERSION } from '@grafana/faro-core';\n\nimport { getUserEventHandler } from './processUserActionEventHandler';\n\nexport class UserActionInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-user-action';\n readonly version = VERSION;\n\n private _userActionSub?: Subscription;\n\n initialize(): void {\n const { processUserEvent, proceessUserActionStarted } = getUserEventHandler(faro);\n window.addEventListener('pointerdown', processUserEvent);\n window.addEventListener('keydown', (ev: KeyboardEvent) => {\n if ([' ', 'Enter'].includes(ev.key)) {\n processUserEvent(ev);\n }\n });\n\n this._userActionSub = userActionsMessageBus.subscribe(({ type, userAction }) => {\n if (type === 'user_action_start') {\n proceessUserActionStarted(userAction);\n }\n });\n }\n\n destroy() {\n this._userActionSub?.unsubscribe();\n }\n}\n"]}
|
|
@@ -1,70 +1,42 @@
|
|
|
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.getUserEventHandler = getUserEventHandler;
|
|
4
|
+
exports.getUserActionNameFromElement = getUserActionNameFromElement;
|
|
5
|
+
exports.unsubscribeAllMonitors = unsubscribeAllMonitors;
|
|
6
|
+
exports.isRequestStartMessage = isRequestStartMessage;
|
|
7
|
+
exports.isRequestEndMessage = isRequestEndMessage;
|
|
15
8
|
var faro_core_1 = require("@grafana/faro-core");
|
|
16
9
|
var const_1 = require("./const");
|
|
17
10
|
var domMutationMonitor_1 = require("./domMutationMonitor");
|
|
18
11
|
var httpRequestMonitor_1 = require("./httpRequestMonitor");
|
|
19
12
|
var performanceEntriesMonitor_1 = require("./performanceEntriesMonitor");
|
|
20
13
|
var util_1 = require("./util");
|
|
21
|
-
var maxFollowUpActionTimeRange = 100;
|
|
22
14
|
function getUserEventHandler(faro) {
|
|
23
15
|
var api = faro.api, config = faro.config;
|
|
24
16
|
var httpMonitor = (0, httpRequestMonitor_1.monitorHttpRequests)();
|
|
25
17
|
var domMutationsMonitor = (0, domMutationMonitor_1.monitorDomMutations)();
|
|
26
18
|
var performanceEntriesMonitor = (0, performanceEntriesMonitor_1.monitorPerformanceEntries)();
|
|
27
|
-
var timeoutId;
|
|
28
|
-
var actionRunning = false;
|
|
29
19
|
function processUserEvent(event) {
|
|
30
20
|
var _a;
|
|
31
|
-
var userActionName;
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
userActionName = event.name;
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
userActionName = getUserActionName(event.target, (_a = config.trackUserActionsDataAttributeName) !== null && _a !== void 0 ? _a : const_1.userActionDataAttributeParsed);
|
|
38
|
-
}
|
|
39
|
-
if (actionRunning || userActionName == null) {
|
|
21
|
+
var userActionName = getUserActionNameFromElement(event.target, (_a = config.trackUserActionsDataAttributeName) !== null && _a !== void 0 ? _a : const_1.userActionDataAttributeParsed);
|
|
22
|
+
// We don't have a data attribute
|
|
23
|
+
if (!userActionName) {
|
|
40
24
|
return;
|
|
41
25
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
name: userActionName,
|
|
49
|
-
startTime: startTime,
|
|
50
|
-
parentId: actionId,
|
|
51
|
-
});
|
|
52
|
-
// Triggers if no initial action happened within the first 100ms
|
|
53
|
-
timeoutId = startTimeout(timeoutId, function () {
|
|
54
|
-
endTime = (0, faro_core_1.dateNow)();
|
|
55
|
-
// Listening for follow up activities stops once action is cancelled (set to false)
|
|
56
|
-
actionRunning = false;
|
|
57
|
-
sendUserActionCancelMessage(userActionName, actionId);
|
|
58
|
-
}, maxFollowUpActionTimeRange);
|
|
26
|
+
var userAction = api.startUserAction(userActionName, {}, { triggerName: event.type });
|
|
27
|
+
if (userAction) {
|
|
28
|
+
proceessUserActionStarted(userAction);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function proceessUserActionStarted(userAction) {
|
|
59
32
|
var runningRequests = new Map();
|
|
60
|
-
var isHalted = false;
|
|
61
|
-
var pendingActionTimeoutId;
|
|
62
33
|
var allMonitorsSub = new faro_core_1.Observable()
|
|
63
34
|
.merge(httpMonitor, domMutationsMonitor, performanceEntriesMonitor)
|
|
64
|
-
.takeWhile(function () { return
|
|
35
|
+
.takeWhile(function () { return [faro_core_1.UserActionState.Started, faro_core_1.UserActionState.Halted].includes(userAction.getState()); })
|
|
65
36
|
.filter(function (msg) {
|
|
66
37
|
// If the user action is in halt state, we only keep listening to ended http requests
|
|
67
|
-
if (
|
|
38
|
+
if (userAction.getState() === faro_core_1.UserActionState.Halted &&
|
|
39
|
+
!(isRequestEndMessage(msg) && runningRequests.has(msg.request.requestId))) {
|
|
68
40
|
return false;
|
|
69
41
|
}
|
|
70
42
|
return true;
|
|
@@ -80,74 +52,23 @@ function getUserEventHandler(faro) {
|
|
|
80
52
|
if (isRequestEndMessage(msg)) {
|
|
81
53
|
runningRequests.delete(msg.request.requestId);
|
|
82
54
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
isHalted = true;
|
|
96
|
-
faro_core_1.apiMessageBus.notify({
|
|
97
|
-
type: faro_core_1.USER_ACTION_HALT,
|
|
98
|
-
name: userActionName,
|
|
99
|
-
parentId: actionId,
|
|
100
|
-
reason: 'pending-requests',
|
|
101
|
-
haltTime: (0, faro_core_1.dateNow)(),
|
|
102
|
-
});
|
|
103
|
-
pendingActionTimeoutId = startTimeout(undefined, function () {
|
|
104
|
-
unsubscribeAllMonitors(allMonitorsSub);
|
|
105
|
-
endUserAction(userActionParentEventProps);
|
|
106
|
-
actionRunning = false;
|
|
107
|
-
isHalted = false;
|
|
108
|
-
}, 1000 * 10);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
unsubscribeAllMonitors(allMonitorsSub);
|
|
112
|
-
endUserAction(userActionParentEventProps);
|
|
113
|
-
actionRunning = false;
|
|
114
|
-
isHalted = false;
|
|
115
|
-
}
|
|
116
|
-
}, maxFollowUpActionTimeRange);
|
|
55
|
+
if (!isRequestEndMessage(msg)) {
|
|
56
|
+
userAction.extend(function () { return runningRequests.size > 0; });
|
|
57
|
+
}
|
|
58
|
+
else if (userAction.getState() === faro_core_1.UserActionState.Halted && runningRequests.size === 0) {
|
|
59
|
+
userAction.end();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
userAction
|
|
63
|
+
.filter(function (v) { return [faro_core_1.UserActionState.Ended, faro_core_1.UserActionState.Cancelled].includes(v); })
|
|
64
|
+
.first()
|
|
65
|
+
.subscribe(function () {
|
|
66
|
+
unsubscribeAllMonitors(allMonitorsSub);
|
|
117
67
|
});
|
|
118
68
|
}
|
|
119
|
-
return processUserEvent;
|
|
69
|
+
return { processUserEvent: processUserEvent, proceessUserActionStarted: proceessUserActionStarted };
|
|
120
70
|
}
|
|
121
|
-
|
|
122
|
-
* User action was successfully completed and we send the final event(s)
|
|
123
|
-
*/
|
|
124
|
-
function endUserAction(props) {
|
|
125
|
-
var api = props.api, userActionName = props.userActionName, startTime = props.startTime, endTime = props.endTime, actionId = props.actionId, event = props.event, attributes = props.attributes;
|
|
126
|
-
var duration = endTime - startTime;
|
|
127
|
-
var eventType = event.type;
|
|
128
|
-
// order matters, first emit the user-action-end event and afterwards push the parent event
|
|
129
|
-
faro_core_1.apiMessageBus.notify({
|
|
130
|
-
type: faro_core_1.USER_ACTION_END,
|
|
131
|
-
name: userActionName,
|
|
132
|
-
id: actionId,
|
|
133
|
-
startTime: startTime,
|
|
134
|
-
endTime: endTime,
|
|
135
|
-
duration: duration,
|
|
136
|
-
eventType: eventType,
|
|
137
|
-
});
|
|
138
|
-
// Send the final action parent event
|
|
139
|
-
api.pushEvent(userActionName, __assign({ userActionStartTime: startTime.toString(), userActionEndTime: endTime.toString(), userActionDuration: duration.toString(), userActionEventType: eventType }, (0, faro_core_1.stringifyObjectValues)(attributes)), undefined, {
|
|
140
|
-
timestampOverwriteMs: startTime,
|
|
141
|
-
customPayloadTransformer: function (payload) {
|
|
142
|
-
payload.action = {
|
|
143
|
-
id: actionId,
|
|
144
|
-
name: userActionName,
|
|
145
|
-
};
|
|
146
|
-
return payload;
|
|
147
|
-
},
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
function getUserActionName(element, dataAttributeName) {
|
|
71
|
+
function getUserActionNameFromElement(element, dataAttributeName) {
|
|
151
72
|
var parsedDataAttributeName = (0, util_1.convertDataAttributeName)(dataAttributeName);
|
|
152
73
|
var dataset = element.dataset;
|
|
153
74
|
for (var key in dataset) {
|
|
@@ -157,23 +78,6 @@ function getUserActionName(element, dataAttributeName) {
|
|
|
157
78
|
}
|
|
158
79
|
return undefined;
|
|
159
80
|
}
|
|
160
|
-
function startTimeout(timeoutId, cb, delay) {
|
|
161
|
-
if (timeoutId) {
|
|
162
|
-
clearTimeout(timeoutId);
|
|
163
|
-
}
|
|
164
|
-
//@ts-expect-error for some reason vscode is using the node types
|
|
165
|
-
timeoutId = setTimeout(function () {
|
|
166
|
-
cb();
|
|
167
|
-
}, delay);
|
|
168
|
-
return timeoutId;
|
|
169
|
-
}
|
|
170
|
-
function sendUserActionCancelMessage(userActionName, actionId) {
|
|
171
|
-
faro_core_1.apiMessageBus.notify({
|
|
172
|
-
type: faro_core_1.USER_ACTION_CANCEL,
|
|
173
|
-
name: userActionName,
|
|
174
|
-
parentId: actionId,
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
81
|
function unsubscribeAllMonitors(allMonitorsSub) {
|
|
178
82
|
allMonitorsSub === null || allMonitorsSub === void 0 ? void 0 : allMonitorsSub.unsubscribe();
|
|
179
83
|
allMonitorsSub = undefined;
|
|
@@ -184,7 +88,4 @@ function isRequestStartMessage(msg) {
|
|
|
184
88
|
function isRequestEndMessage(msg) {
|
|
185
89
|
return msg.type === const_1.MESSAGE_TYPE_HTTP_REQUEST_END;
|
|
186
90
|
}
|
|
187
|
-
function isApiEvent(apiEvent) {
|
|
188
|
-
return apiEvent.type === 'apiEvent' && typeof apiEvent.name === 'string';
|
|
189
|
-
}
|
|
190
91
|
//# sourceMappingURL=processUserActionEventHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processUserActionEventHandler.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/processUserActionEventHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n apiMessageBus,\n dateNow,\n genShortID,\n Observable,\n stringifyObjectValues,\n USER_ACTION_CANCEL,\n USER_ACTION_END,\n USER_ACTION_HALT,\n USER_ACTION_START,\n} from '@grafana/faro-core';\nimport type { Faro, Subscription } from '@grafana/faro-core';\n\nimport {\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n userActionDataAttributeParsed as userActionDataAttribute,\n} from './const';\nimport { monitorDomMutations } from './domMutationMonitor';\nimport { monitorHttpRequests } from './httpRequestMonitor';\nimport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nimport type { ApiEvent, HttpRequestEndMessage, HttpRequestMessagePayload, HttpRequestStartMessage } from './types';\nimport { convertDataAttributeName } from './util';\n\nconst maxFollowUpActionTimeRange = 100;\n\nexport function getUserEventHandler(faro: Faro) {\n const { api, config } = faro;\n\n const httpMonitor = monitorHttpRequests();\n const domMutationsMonitor = monitorDomMutations();\n const performanceEntriesMonitor = monitorPerformanceEntries();\n\n let timeoutId: number | undefined;\n let actionRunning = false;\n\n function processUserEvent(event: PointerEvent | KeyboardEvent | ApiEvent) {\n let userActionName: string | undefined;\n\n const isApiEventDetected = isApiEvent(event);\n if (isApiEventDetected) {\n userActionName = event.name;\n } else {\n userActionName = getUserActionName(\n event.target as HTMLElement,\n config.trackUserActionsDataAttributeName ?? userActionDataAttribute\n );\n }\n\n if (actionRunning || userActionName == null) {\n return;\n }\n\n actionRunning = true;\n\n const startTime = dateNow();\n let endTime: number | undefined;\n\n const actionId = genShortID();\n\n apiMessageBus.notify({\n type: USER_ACTION_START,\n name: userActionName,\n startTime: startTime,\n parentId: actionId,\n });\n\n // Triggers if no initial action happened within the first 100ms\n timeoutId = startTimeout(\n timeoutId,\n () => {\n endTime = dateNow();\n\n // Listening for follow up activities stops once action is cancelled (set to false)\n actionRunning = false;\n sendUserActionCancelMessage(userActionName, actionId);\n },\n maxFollowUpActionTimeRange\n );\n\n const runningRequests = new Map<string, HttpRequestMessagePayload>();\n let isHalted = false;\n let pendingActionTimeoutId: number | undefined;\n\n const allMonitorsSub = new Observable()\n .merge(httpMonitor, domMutationsMonitor, performanceEntriesMonitor)\n .takeWhile(() => actionRunning)\n .filter((msg) => {\n // If the user action is in halt state, we only keep listening to ended http requests\n if (isHalted && !(isRequestEndMessage(msg) && runningRequests.has(msg.request.requestId))) {\n return false;\n }\n\n return true;\n })\n .subscribe((msg) => {\n if (isRequestStartMessage(msg)) {\n // An action is on halt if it has pending items, like pending HTTP requests.\n // In this case we start a separate timeout to wait for the requests to finish\n // If in the halt state, we stop adding Faro signals to the action's buffer (see userActionLifecycleHandler.ts)\n // But we are still subscribed to\n runningRequests.set(msg.request.requestId, msg.request);\n }\n if (isRequestEndMessage(msg)) {\n runningRequests.delete(msg.request.requestId);\n }\n\n // A http request, a DOM mutation or a performance entry happened so we have a follow up activity and start the timeout again\n // If timeout is triggered the user action is done and we send respective messages and events\n timeoutId = startTimeout(\n timeoutId,\n () => {\n endTime = dateNow();\n\n const userActionParentEventProps = {\n api,\n userActionName,\n startTime,\n endTime: endTime!,\n actionId,\n event,\n ...(isApiEventDetected ? { attributes: event.attributes } : {}),\n };\n\n const hasPendingRequests = runningRequests.size > 0;\n const isAllPendingRequestsResolved = isHalted && !hasPendingRequests;\n\n if (isAllPendingRequestsResolved) {\n clearTimeout(pendingActionTimeoutId);\n isHalted = false;\n }\n\n if (hasPendingRequests) {\n isHalted = true;\n\n apiMessageBus.notify({\n type: USER_ACTION_HALT,\n name: userActionName,\n parentId: actionId,\n reason: 'pending-requests',\n haltTime: dateNow(),\n });\n\n pendingActionTimeoutId = startTimeout(\n undefined,\n () => {\n unsubscribeAllMonitors(allMonitorsSub);\n endUserAction(userActionParentEventProps);\n actionRunning = false;\n isHalted = false;\n },\n 1000 * 10\n );\n } else {\n unsubscribeAllMonitors(allMonitorsSub);\n endUserAction(userActionParentEventProps);\n actionRunning = false;\n isHalted = false;\n }\n },\n maxFollowUpActionTimeRange\n );\n });\n }\n\n return processUserEvent;\n}\n\n/**\n * User action was successfully completed and we send the final event(s)\n */\nfunction endUserAction(props: {\n api: Faro['api'];\n userActionName: string;\n startTime: number;\n endTime: number;\n actionId: string;\n event: PointerEvent | KeyboardEvent | ApiEvent;\n attributes?: Record<string, string>;\n}) {\n const { api, userActionName, startTime, endTime, actionId, event, attributes } = props;\n const duration = endTime - startTime;\n const eventType = event.type;\n\n // order matters, first emit the user-action-end event and afterwards push the parent event\n apiMessageBus.notify({\n type: USER_ACTION_END,\n name: userActionName,\n id: actionId,\n startTime,\n endTime,\n duration,\n eventType,\n });\n\n // Send the final action parent event\n api.pushEvent(\n userActionName,\n {\n userActionStartTime: startTime.toString(),\n userActionEndTime: endTime.toString(),\n userActionDuration: duration.toString(),\n userActionEventType: eventType,\n ...stringifyObjectValues(attributes),\n },\n undefined,\n {\n timestampOverwriteMs: startTime,\n customPayloadTransformer: (payload) => {\n payload.action = {\n id: actionId,\n name: userActionName,\n };\n\n return payload;\n },\n }\n );\n}\n\nfunction getUserActionName(element: HTMLElement, dataAttributeName: string): string | undefined {\n const parsedDataAttributeName = convertDataAttributeName(dataAttributeName);\n const dataset = element.dataset;\n\n for (const key in dataset) {\n if (key === parsedDataAttributeName) {\n return dataset[key];\n }\n }\n\n return undefined;\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\nfunction sendUserActionCancelMessage(userActionName: string, actionId: string) {\n apiMessageBus.notify({\n type: USER_ACTION_CANCEL,\n name: userActionName,\n parentId: actionId,\n });\n}\n\nfunction unsubscribeAllMonitors(allMonitorsSub: Subscription | undefined) {\n allMonitorsSub?.unsubscribe();\n allMonitorsSub = undefined;\n}\n\nfunction isRequestStartMessage(msg: any): msg is HttpRequestStartMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;\n}\n\nfunction isRequestEndMessage(msg: any): msg is HttpRequestEndMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_END;\n}\n\nfunction isApiEvent(apiEvent: any): apiEvent is { name: string; attributes?: Record<string, string> } {\n return apiEvent.type === 'apiEvent' && typeof apiEvent.name === 'string';\n}\n"]}
|
|
1
|
+
{"version":3,"file":"processUserActionEventHandler.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/processUserActionEventHandler.ts"],"names":[],"mappings":";;AAcA,kDAqEC;AAED,oEAWC;AAED,wDAGC;AAED,sDAEC;AAED,kDAEC;AA7GD,gDAAiE;AAGjE,iCAIiB;AACjB,2DAA2D;AAC3D,2DAA2D;AAC3D,yEAAwE;AAExE,+BAAkD;AAElD,SAAgB,mBAAmB,CAAC,IAAU;IACpC,IAAA,GAAG,GAAa,IAAI,IAAjB,EAAE,MAAM,GAAK,IAAI,OAAT,CAAU;IAE7B,IAAM,WAAW,GAAG,IAAA,wCAAmB,GAAE,CAAC;IAC1C,IAAM,mBAAmB,GAAG,IAAA,wCAAmB,GAAE,CAAC;IAClD,IAAM,yBAAyB,GAAG,IAAA,qDAAyB,GAAE,CAAC;IAE9D,SAAS,gBAAgB,CAAC,KAAmC;;QAC3D,IAAM,cAAc,GAAG,4BAA4B,CACjD,KAAK,CAAC,MAAqB,EAC3B,MAAA,MAAM,CAAC,iCAAiC,mCAAI,qCAAuB,CACpE,CAAC;QAEF,iCAAiC;QACjC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAM,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACxF,IAAI,UAAU,EAAE,CAAC;YACf,yBAAyB,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,SAAS,yBAAyB,CAAC,UAA+B;QAChE,IAAM,eAAe,GAAG,IAAI,GAAG,EAAqC,CAAC;QACrE,IAAM,cAAc,GAAG,IAAI,sBAAU,EAAE;aACpC,KAAK,CAAC,WAAW,EAAE,mBAAmB,EAAE,yBAAyB,CAAC;aAClE,SAAS,CAAC,cAAM,OAAA,CAAC,2BAAe,CAAC,OAAO,EAAE,2BAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAjF,CAAiF,CAAC;aAClG,MAAM,CAAC,UAAC,GAAG;YACV,qFAAqF;YACrF,IACE,UAAU,CAAC,QAAQ,EAAE,KAAK,2BAAe,CAAC,MAAM;gBAChD,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EACzE,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,SAAS,CAAC,UAAC,GAAG;YACb,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,4EAA4E;gBAC5E,8EAA8E;gBAC9E,+GAA+G;gBAC/G,iCAAiC;gBACjC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;YAED,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,UAAU,CAAC,MAAM,CAAC,cAAM,OAAA,eAAe,CAAC,IAAI,GAAG,CAAC,EAAxB,CAAwB,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,2BAAe,CAAC,MAAM,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC1F,UAAU,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEJ,UAAoC;aAClC,MAAM,CAAC,UAAC,CAAkB,IAAK,OAAA,CAAC,2BAAe,CAAC,KAAK,EAAE,2BAAe,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAA9D,CAA8D,CAAC;aAC9F,KAAK,EAAE;aACP,SAAS,CAAC;YACT,sBAAsB,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,EAAE,gBAAgB,kBAAA,EAAE,yBAAyB,2BAAA,EAAE,CAAC;AACzD,CAAC;AAED,SAAgB,4BAA4B,CAAC,OAAoB,EAAE,iBAAyB;IAC1F,IAAM,uBAAuB,GAAG,IAAA,+BAAwB,EAAC,iBAAiB,CAAC,CAAC;IAC5E,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,KAAK,IAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,KAAK,uBAAuB,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,sBAAsB,CAAC,cAAwC;IAC7E,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,EAAE,CAAC;IAC9B,cAAc,GAAG,SAAS,CAAC;AAC7B,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 { Observable, UserActionState } from '@grafana/faro-core';\nimport type { Faro, Subscription, UserActionInterface } from '@grafana/faro-core';\n\nimport {\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n userActionDataAttributeParsed as userActionDataAttribute,\n} from './const';\nimport { monitorDomMutations } from './domMutationMonitor';\nimport { monitorHttpRequests } from './httpRequestMonitor';\nimport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nimport type { HttpRequestEndMessage, HttpRequestMessagePayload, HttpRequestStartMessage } from './types';\nimport { convertDataAttributeName } from './util';\n\nexport function getUserEventHandler(faro: Faro) {\n const { api, config } = faro;\n\n const httpMonitor = monitorHttpRequests();\n const domMutationsMonitor = monitorDomMutations();\n const performanceEntriesMonitor = monitorPerformanceEntries();\n\n function processUserEvent(event: PointerEvent | KeyboardEvent) {\n const userActionName = getUserActionNameFromElement(\n event.target as HTMLElement,\n config.trackUserActionsDataAttributeName ?? userActionDataAttribute\n );\n\n // We don't have a data attribute\n if (!userActionName) {\n return;\n }\n\n const userAction = api.startUserAction(userActionName, {}, { triggerName: event.type });\n if (userAction) {\n proceessUserActionStarted(userAction);\n }\n }\n\n function proceessUserActionStarted(userAction: UserActionInterface) {\n const runningRequests = new Map<string, HttpRequestMessagePayload>();\n const allMonitorsSub = new Observable()\n .merge(httpMonitor, domMutationsMonitor, performanceEntriesMonitor)\n .takeWhile(() => [UserActionState.Started, UserActionState.Halted].includes(userAction.getState()))\n .filter((msg) => {\n // If the user action is in halt state, we only keep listening to ended http requests\n if (\n userAction.getState() === UserActionState.Halted &&\n !(isRequestEndMessage(msg) && runningRequests.has(msg.request.requestId))\n ) {\n return false;\n }\n\n return true;\n })\n .subscribe((msg) => {\n if (isRequestStartMessage(msg)) {\n // An action is on halt if it has pending items, like pending HTTP requests.\n // In this case we start a separate timeout to wait for the requests to finish\n // If in the halt state, we stop adding Faro signals to the action's buffer (see userActionLifecycleHandler.ts)\n // But we are still subscribed to\n runningRequests.set(msg.request.requestId, msg.request);\n }\n\n if (isRequestEndMessage(msg)) {\n runningRequests.delete(msg.request.requestId);\n }\n\n if (!isRequestEndMessage(msg)) {\n userAction.extend(() => runningRequests.size > 0);\n } else if (userAction.getState() === UserActionState.Halted && runningRequests.size === 0) {\n userAction.end();\n }\n });\n\n (userAction as unknown as Observable)\n .filter((v: UserActionState) => [UserActionState.Ended, UserActionState.Cancelled].includes(v))\n .first()\n .subscribe(() => {\n unsubscribeAllMonitors(allMonitorsSub);\n });\n }\n\n return { processUserEvent, proceessUserActionStarted };\n}\n\nexport function getUserActionNameFromElement(element: HTMLElement, dataAttributeName: string): string | undefined {\n const parsedDataAttributeName = convertDataAttributeName(dataAttributeName);\n const dataset = element.dataset;\n\n for (const key in dataset) {\n if (key === parsedDataAttributeName) {\n return dataset[key];\n }\n }\n\n return undefined;\n}\n\nexport function unsubscribeAllMonitors(allMonitorsSub: Subscription | undefined) {\n allMonitorsSub?.unsubscribe();\n allMonitorsSub = undefined;\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\ntype RequestApiType = 'xhr' | 'fetch';\n\nexport type HttpRequestMessagePayload = {\n requestId: string;\n url: string;\n method: string;\n apiType: RequestApiType;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n request: HttpRequestMessagePayload;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n request: HttpRequestMessagePayload;\n};\n
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\ntype RequestApiType = 'xhr' | 'fetch';\n\nexport type HttpRequestMessagePayload = {\n requestId: string;\n url: string;\n method: string;\n apiType: RequestApiType;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n request: HttpRequestMessagePayload;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n request: HttpRequestMessagePayload;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webVitalsBasic.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/webVitalsBasic.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"webVitalsBasic.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/webVitalsBasic.ts"],"names":[],"mappings":";;;AAAA,yCAAgE;AAIhE;IASE,wBACU,eAAmD,EACnD,cAAmD;QADnD,oBAAe,GAAf,eAAe,CAAoC;QACnD,mBAAc,GAAd,cAAc,CAAqC;IAC1D,CAAC;IAEJ,mCAAU,GAAV;QAAA,iBAeC;QAdC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,UAAC,EAAqB;;gBAApB,SAAS,QAAA,EAAE,QAAQ,QAAA;YAClE,QAAQ,CACN,UAAC,MAAM;;gBACL,KAAI,CAAC,eAAe,CAAC;oBACnB,IAAI,EAAE,YAAY;oBAElB,MAAM;wBACJ,GAAC,SAAS,IAAG,MAAM,CAAC,KAAK;2BAC1B;iBACF,CAAC,CAAC;YACL,CAAC,EACD,EAAE,gBAAgB,EAAE,MAAA,KAAI,CAAC,cAAc,0CAAE,gBAAgB,EAAE,CAC5D,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IA5BM,sBAAO,GAAG;QACf,GAAG,EAAE,kBAAK;QACV,GAAG,EAAE,kBAAK;QACV,GAAG,EAAE,kBAAK;QACV,GAAG,EAAE,kBAAK;QACV,IAAI,EAAE,mBAAM;KACb,CAAC;IAuBJ,qBAAC;CAAA,AA9BD,IA8BC;AA9BY,wCAAc","sourcesContent":["import { onCLS, onFCP, onINP, onLCP, onTTFB } from 'web-vitals';\n\nimport type { Config, MeasurementsAPI } from '@grafana/faro-core';\n\nexport class WebVitalsBasic {\n static mapping = {\n cls: onCLS,\n fcp: onFCP,\n inp: onINP,\n lcp: onLCP,\n ttfb: onTTFB,\n };\n\n constructor(\n private pushMeasurement: MeasurementsAPI['pushMeasurement'],\n private webVitalConfig?: Config['webVitalsInstrumentation']\n ) {}\n\n initialize(): void {\n Object.entries(WebVitalsBasic.mapping).forEach(([indicator, executor]) => {\n executor(\n (metric) => {\n this.pushMeasurement({\n type: 'web-vitals',\n\n values: {\n [indicator]: metric.value,\n },\n });\n },\n { reportAllChanges: this.webVitalConfig?.reportAllChanges }\n );\n });\n }\n}\n"]}
|
|
@@ -17,7 +17,6 @@ var WebVitalsWithAttribution = /** @class */ (function () {
|
|
|
17
17
|
WebVitalsWithAttribution.prototype.initialize = function () {
|
|
18
18
|
this.measureCLS();
|
|
19
19
|
this.measureFCP();
|
|
20
|
-
this.measureFID();
|
|
21
20
|
this.measureINP();
|
|
22
21
|
this.measureLCP();
|
|
23
22
|
this.measureTTFB();
|
|
@@ -49,20 +48,6 @@ var WebVitalsWithAttribution = /** @class */ (function () {
|
|
|
49
48
|
_this.pushMeasurement(values, context);
|
|
50
49
|
}, { reportAllChanges: (_a = this.webVitalConfig) === null || _a === void 0 ? void 0 : _a.reportAllChanges });
|
|
51
50
|
};
|
|
52
|
-
WebVitalsWithAttribution.prototype.measureFID = function () {
|
|
53
|
-
var _this = this;
|
|
54
|
-
var _a;
|
|
55
|
-
(0, attribution_1.onFID)(function (metric) {
|
|
56
|
-
var _a = metric.attribution, eventTime = _a.eventTime, eventTarget = _a.eventTarget, eventType = _a.eventType, loadState = _a.loadState;
|
|
57
|
-
var values = _this.buildInitialValues(metric);
|
|
58
|
-
_this.addIfPresent(values, 'event_time', eventTime);
|
|
59
|
-
var context = _this.buildInitialContext(metric);
|
|
60
|
-
_this.addIfPresent(context, 'event_target', eventTarget);
|
|
61
|
-
_this.addIfPresent(context, 'event_type', eventType);
|
|
62
|
-
_this.addIfPresent(context, loadStateKey, loadState);
|
|
63
|
-
_this.pushMeasurement(values, context);
|
|
64
|
-
}, { reportAllChanges: (_a = this.webVitalConfig) === null || _a === void 0 ? void 0 : _a.reportAllChanges });
|
|
65
|
-
};
|
|
66
51
|
WebVitalsWithAttribution.prototype.measureINP = function () {
|
|
67
52
|
var _this = this;
|
|
68
53
|
var _a;
|
|
@@ -85,14 +70,14 @@ var WebVitalsWithAttribution = /** @class */ (function () {
|
|
|
85
70
|
var _this = this;
|
|
86
71
|
var _a;
|
|
87
72
|
(0, attribution_1.onLCP)(function (metric) {
|
|
88
|
-
var _a = metric.attribution, elementRenderDelay = _a.elementRenderDelay, resourceLoadDelay = _a.resourceLoadDelay, resourceLoadDuration = _a.resourceLoadDuration, timeToFirstByte = _a.timeToFirstByte,
|
|
73
|
+
var _a = metric.attribution, elementRenderDelay = _a.elementRenderDelay, resourceLoadDelay = _a.resourceLoadDelay, resourceLoadDuration = _a.resourceLoadDuration, timeToFirstByte = _a.timeToFirstByte, target = _a.target;
|
|
89
74
|
var values = _this.buildInitialValues(metric);
|
|
90
75
|
_this.addIfPresent(values, 'element_render_delay', elementRenderDelay);
|
|
91
76
|
_this.addIfPresent(values, 'resource_load_delay', resourceLoadDelay);
|
|
92
77
|
_this.addIfPresent(values, 'resource_load_duration', resourceLoadDuration);
|
|
93
78
|
_this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte);
|
|
94
79
|
var context = _this.buildInitialContext(metric);
|
|
95
|
-
_this.addIfPresent(context, 'element',
|
|
80
|
+
_this.addIfPresent(context, 'element', target);
|
|
96
81
|
_this.pushMeasurement(values, context);
|
|
97
82
|
}, { reportAllChanges: (_a = this.webVitalConfig) === null || _a === void 0 ? void 0 : _a.reportAllChanges });
|
|
98
83
|
};
|
|
@@ -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, onFID, 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.measureFID();\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 measureFID(): void {\n onFID(\n (metric) => {\n const { eventTime, eventTarget, eventType, loadState } = metric.attribution;\n\n const values = this.buildInitialValues(metric);\n this.addIfPresent(values, 'event_time', eventTime);\n\n const context = this.buildInitialContext(metric);\n this.addIfPresent(context, 'event_target', eventTarget);\n this.addIfPresent(context, 'event_type', eventType);\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, element } =\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', element);\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,4 +1,4 @@
|
|
|
1
|
-
import { ConsoleInstrumentation, ErrorsInstrumentation, PerformanceInstrumentation, SessionInstrumentation, UserActionInstrumentation, ViewInstrumentation, WebVitalsInstrumentation, } from '../instrumentations';
|
|
1
|
+
import { ConsoleInstrumentation, CSPInstrumentation, ErrorsInstrumentation, PerformanceInstrumentation, SessionInstrumentation, UserActionInstrumentation, ViewInstrumentation, WebVitalsInstrumentation, } from '../instrumentations';
|
|
2
2
|
export function getWebInstrumentations(options = {}) {
|
|
3
3
|
const instrumentations = [
|
|
4
4
|
new UserActionInstrumentation(),
|
|
@@ -11,10 +11,11 @@ export function getWebInstrumentations(options = {}) {
|
|
|
11
11
|
// unshift to ensure that initialization starts before the other instrumentations
|
|
12
12
|
instrumentations.unshift(new PerformanceInstrumentation());
|
|
13
13
|
}
|
|
14
|
+
if (options.enableContentSecurityPolicyInstrumentation !== false) {
|
|
15
|
+
instrumentations.push(new CSPInstrumentation());
|
|
16
|
+
}
|
|
14
17
|
if (options.captureConsole !== false) {
|
|
15
|
-
instrumentations.push(new ConsoleInstrumentation(
|
|
16
|
-
disabledLevels: options.captureConsoleDisabledLevels,
|
|
17
|
-
}));
|
|
18
|
+
instrumentations.push(new ConsoleInstrumentation());
|
|
18
19
|
}
|
|
19
20
|
return instrumentations;
|
|
20
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getWebInstrumentations.js","sourceRoot":"","sources":["../../../src/config/getWebInstrumentations.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAI7B,MAAM,UAAU,sBAAsB,CAAC,UAAyC,EAAE;IAChF,MAAM,gBAAgB,GAAsB;QAC1C,IAAI,yBAAyB,EAAE;QAC/B,IAAI,qBAAqB,EAAE;QAC3B,IAAI,wBAAwB,EAAE;QAC9B,IAAI,sBAAsB,EAAE;QAC5B,IAAI,mBAAmB,EAAE;KAC1B,CAAC;IAEF,IAAI,OAAO,CAAC,gCAAgC,KAAK,KAAK,EAAE,CAAC;QACvD,iFAAiF;QACjF,gBAAgB,CAAC,OAAO,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"getWebInstrumentations.js","sourceRoot":"","sources":["../../../src/config/getWebInstrumentations.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAI7B,MAAM,UAAU,sBAAsB,CAAC,UAAyC,EAAE;IAChF,MAAM,gBAAgB,GAAsB;QAC1C,IAAI,yBAAyB,EAAE;QAC/B,IAAI,qBAAqB,EAAE;QAC3B,IAAI,wBAAwB,EAAE;QAC9B,IAAI,sBAAsB,EAAE;QAC5B,IAAI,mBAAmB,EAAE;KAC1B,CAAC;IAEF,IAAI,OAAO,CAAC,gCAAgC,KAAK,KAAK,EAAE,CAAC;QACvD,iFAAiF;QACjF,gBAAgB,CAAC,OAAO,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,OAAO,CAAC,0CAA0C,KAAK,KAAK,EAAE,CAAC;QACjE,gBAAgB,CAAC,IAAI,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACrC,gBAAgB,CAAC,IAAI,CAAC,IAAI,sBAAsB,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 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 ];\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"]}
|