@grafana/faro-web-sdk 1.14.2 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/faro-web-sdk.iife.js +1 -1
- package/dist/bundle/types/index.d.ts +2 -2
- package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/errors/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/session/sessionManager/sessionManagerUtils.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/const.d.ts +0 -1
- package/dist/bundle/types/instrumentations/userActions/httpRequestMonitor.d.ts +2 -1
- package/dist/bundle/types/instrumentations/userActions/index.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/processUserActionEventHandler.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/types.d.ts +10 -2
- 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 +8 -10
- package/dist/bundle/types/instrumentations/webVitals/webVitalsWithAttribution.d.ts +2 -4
- package/dist/bundle/types/transports/console/transport.d.ts +1 -1
- package/dist/bundle/types/transports/fetch/transport.d.ts +3 -3
- package/dist/bundle/types/utils/index.d.ts +1 -1
- package/dist/bundle/types/utils/url.d.ts +8 -0
- package/dist/cjs/config/getWebInstrumentations.js +1 -2
- package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
- package/dist/cjs/config/makeCoreConfig.js +1 -2
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/index.js +5 -5
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/initialize.js +1 -2
- package/dist/cjs/initialize.js.map +1 -1
- package/dist/cjs/instrumentations/console/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/errors/getErrorDetails.js +3 -4
- package/dist/cjs/instrumentations/errors/getErrorDetails.js.map +1 -1
- package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js +1 -2
- package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js.map +1 -1
- package/dist/cjs/instrumentations/errors/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/errors/registerOnerror.js +1 -2
- package/dist/cjs/instrumentations/errors/registerOnerror.js.map +1 -1
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js +1 -2
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js +1 -2
- package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js +1 -2
- package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js +1 -2
- package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js +1 -2
- package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js.map +1 -1
- package/dist/cjs/instrumentations/performance/instrumentation.js +2 -2
- package/dist/cjs/instrumentations/performance/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/navigation.js +1 -2
- package/dist/cjs/instrumentations/performance/navigation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/performanceUtils.js +7 -10
- package/dist/cjs/instrumentations/performance/performanceUtils.js.map +1 -1
- package/dist/cjs/instrumentations/performance/resource.js +1 -2
- package/dist/cjs/instrumentations/performance/resource.js.map +1 -1
- package/dist/cjs/instrumentations/session/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js +1 -2
- package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/sampling.js +1 -2
- package/dist/cjs/instrumentations/session/sessionManager/sampling.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js +5 -6
- package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/const.js +1 -2
- package/dist/cjs/instrumentations/userActions/const.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/domMutationMonitor.js +1 -2
- package/dist/cjs/instrumentations/userActions/domMutationMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/httpRequestMonitor.js +56 -47
- package/dist/cjs/instrumentations/userActions/httpRequestMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/index.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/performanceEntriesMonitor.js +1 -2
- package/dist/cjs/instrumentations/userActions/performanceEntriesMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +104 -59
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/types.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/util.js +1 -2
- package/dist/cjs/instrumentations/userActions/util.js.map +1 -1
- package/dist/cjs/instrumentations/view/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
- package/dist/cjs/metas/browser/meta.js.map +1 -1
- package/dist/cjs/metas/page/meta.js +1 -2
- package/dist/cjs/metas/page/meta.js.map +1 -1
- package/dist/cjs/metas/session/createSession.js +1 -2
- package/dist/cjs/metas/session/createSession.js.map +1 -1
- package/dist/cjs/transports/console/transport.js.map +1 -1
- package/dist/cjs/transports/fetch/transport.js +3 -4
- package/dist/cjs/transports/fetch/transport.js.map +1 -1
- package/dist/cjs/utils/index.js +2 -1
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/throttle.js +1 -2
- package/dist/cjs/utils/throttle.js.map +1 -1
- package/dist/cjs/utils/url.js +22 -3
- package/dist/cjs/utils/url.js.map +1 -1
- package/dist/cjs/utils/webStorage.js +5 -5
- package/dist/cjs/utils/webStorage.js.map +1 -1
- package/dist/esm/config/getWebInstrumentations.js.map +1 -1
- package/dist/esm/config/makeCoreConfig.js.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/initialize.js.map +1 -1
- package/dist/esm/instrumentations/console/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/errors/getErrorDetails.js.map +1 -1
- package/dist/esm/instrumentations/errors/registerOnerror.js.map +1 -1
- package/dist/esm/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
- package/dist/esm/instrumentations/errors/stackFrames/buildStackFrame.js.map +1 -1
- package/dist/esm/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js.map +1 -1
- package/dist/esm/instrumentations/errors/stackFrames/getStackFramesFromError.js.map +1 -1
- package/dist/esm/instrumentations/performance/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/performance/navigation.js.map +1 -1
- package/dist/esm/instrumentations/performance/performanceUtils.js +1 -3
- package/dist/esm/instrumentations/performance/performanceUtils.js.map +1 -1
- package/dist/esm/instrumentations/performance/resource.js.map +1 -1
- package/dist/esm/instrumentations/session/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionManager/sampling.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
- package/dist/esm/instrumentations/userActions/const.js +0 -1
- package/dist/esm/instrumentations/userActions/const.js.map +1 -1
- package/dist/esm/instrumentations/userActions/httpRequestMonitor.js +56 -48
- package/dist/esm/instrumentations/userActions/httpRequestMonitor.js.map +1 -1
- package/dist/esm/instrumentations/userActions/index.js.map +1 -1
- package/dist/esm/instrumentations/userActions/performanceEntriesMonitor.js.map +1 -1
- package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js +105 -59
- package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/esm/instrumentations/userActions/types.js.map +1 -1
- package/dist/esm/instrumentations/view/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/webVitals/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
- package/dist/esm/metas/browser/meta.js.map +1 -1
- package/dist/esm/metas/page/meta.js.map +1 -1
- package/dist/esm/transports/fetch/transport.js +1 -1
- package/dist/esm/transports/fetch/transport.js.map +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/throttle.js.map +1 -1
- package/dist/esm/utils/url.js +20 -1
- package/dist/esm/utils/url.js.map +1 -1
- package/dist/esm/utils/webStorage.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/errors/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/session/sessionManager/sessionManagerUtils.d.ts +1 -1
- package/dist/types/instrumentations/userActions/const.d.ts +0 -1
- package/dist/types/instrumentations/userActions/httpRequestMonitor.d.ts +2 -1
- package/dist/types/instrumentations/userActions/index.d.ts +1 -1
- package/dist/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/userActions/processUserActionEventHandler.d.ts +1 -1
- package/dist/types/instrumentations/userActions/types.d.ts +10 -2
- 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 +8 -10
- package/dist/types/instrumentations/webVitals/webVitalsWithAttribution.d.ts +2 -4
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +3 -3
- package/dist/types/utils/index.d.ts +1 -1
- package/dist/types/utils/url.d.ts +8 -0
- package/package.json +3 -3
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseStacktrace =
|
|
3
|
+
exports.parseStacktrace = parseStacktrace;
|
|
4
4
|
var getStackFramesFromError_1 = require("./getStackFramesFromError");
|
|
5
5
|
function parseStacktrace(error) {
|
|
6
6
|
return {
|
|
7
7
|
frames: (0, getStackFramesFromError_1.getStackFramesFromError)(error),
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
|
-
exports.parseStacktrace = parseStacktrace;
|
|
11
10
|
//# sourceMappingURL=parseStacktrace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseStacktrace.js","sourceRoot":"","sources":["../../../../../src/instrumentations/errors/stackFrames/parseStacktrace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parseStacktrace.js","sourceRoot":"","sources":["../../../../../src/instrumentations/errors/stackFrames/parseStacktrace.ts"],"names":[],"mappings":";;AAIA,0CAIC;AAND,qEAAoE;AAEpE,SAAgB,eAAe,CAAC,KAAoB;IAClD,OAAO;QACL,MAAM,EAAE,IAAA,iDAAuB,EAAC,KAAK,CAAC;KACvC,CAAC;AACJ,CAAC","sourcesContent":["import type { ExtendedError, Stacktrace } from '@grafana/faro-core';\n\nimport { getStackFramesFromError } from './getStackFramesFromError';\n\nexport function parseStacktrace(error: ExtendedError): Stacktrace {\n return {\n frames: getStackFramesFromError(error),\n };\n}\n"]}
|
|
@@ -24,8 +24,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
24
24
|
});
|
|
25
25
|
};
|
|
26
26
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
-
return g =
|
|
27
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
28
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
29
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
30
|
function step(op) {
|
|
31
31
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAA8E;AAE9E,2CAAoD;AACpD,uDAAmF;AACnF,uCAAoD;AAGvC,QAAA,8BAA8B,GAAG,IAAI,sBAAU,EAAwB,CAAC;AAErF;IAAgD,8CAAmB;IAAnE
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAA8E;AAE9E,2CAAoD;AACpD,uDAAmF;AACnF,uCAAoD;AAGvC,QAAA,8BAA8B,GAAG,IAAI,sBAAU,EAAwB,CAAC;AAErF;IAAgD,8CAAmB;IAAnE;;QACW,UAAI,GAAG,mDAAmD,CAAC;QAC3D,aAAO,GAAG,mBAAO,CAAC;;IAkB7B,CAAC;IAhBC,+CAAU,GAAV;QAAA,iBAeC;QAdC,IAAI,CAAC,IAAA,+CAA4B,GAAE,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,0EAA0E,CAAC,CAAC;YAC1F,OAAO;QACT,CAAC;QAED,IAAA,kCAAe,EAAC;;;;;wBACR,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;wBAER,qBAAM,IAAA,iCAAoB,EAAC,SAAS,CAAC,EAAA;;wBAA1D,gBAAgB,GAAK,CAAA,SAAqC,CAAA,iBAA1C;wBAExB,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;4BAC7B,IAAA,iCAAsB,EAAC,gBAAgB,EAAE,SAAS,EAAE,sCAA8B,CAAC,CAAC;wBACtF,CAAC;;;;aACF,CAAC,CAAC;IACL,CAAC;IACH,iCAAC;AAAD,CAAC,AApBD,CAAgD,+BAAmB,GAoBlE;AApBY,gEAA0B","sourcesContent":["import { BaseInstrumentation, Observable, VERSION } from '@grafana/faro-core';\n\nimport { getNavigationTimings } from './navigation';\nimport { onDocumentReady, performanceObserverSupported } from './performanceUtils';\nimport { observeResourceTimings } from './resource';\nimport type { ResourceEntryMessage } from './types';\n\nexport const performanceEntriesSubscription = new Observable<ResourceEntryMessage>();\n\nexport class PerformanceInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-performance';\n readonly version = VERSION;\n\n initialize() {\n if (!performanceObserverSupported()) {\n this.logDebug('performance observer not supported. Disable performance instrumentation.');\n return;\n }\n\n onDocumentReady(async () => {\n const pushEvent = this.api.pushEvent;\n\n const { faroNavigationId } = await getNavigationTimings(pushEvent);\n\n if (faroNavigationId != null) {\n observeResourceTimings(faroNavigationId, pushEvent, performanceEntriesSubscription);\n }\n });\n }\n}\n"]}
|
|
@@ -11,7 +11,7 @@ var __assign = (this && this.__assign) || function () {
|
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.getNavigationTimings =
|
|
14
|
+
exports.getNavigationTimings = getNavigationTimings;
|
|
15
15
|
var faro_core_1 = require("@grafana/faro-core");
|
|
16
16
|
var utils_1 = require("../../utils");
|
|
17
17
|
var url_1 = require("../../utils/url");
|
|
@@ -46,5 +46,4 @@ function getNavigationTimings(pushEvent) {
|
|
|
46
46
|
});
|
|
47
47
|
return faroNavigationEntryPromise;
|
|
48
48
|
}
|
|
49
|
-
exports.getNavigationTimings = getNavigationTimings;
|
|
50
49
|
//# sourceMappingURL=navigation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/navigation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/navigation.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAaA,oDAyCC;AAtDD,gDAA+D;AAG/D,qCAA+D;AAC/D,uCAA+C;AAC/C,wEAAwE;AAExE,+DAA0D;AAC1D,uDAAgG;AAKhG,SAAgB,oBAAoB,CAAC,SAAiC;IACpE,IAAI,0BAA+D,CAAC;IACpE,IAAM,0BAA0B,GAAG,IAAI,OAAO,CAAqB,UAAC,OAAO;QACzE,0BAA0B,GAAG,OAAO,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,UAAC,eAAe;;QAChD,IAAA,kBAAkB,GAAI,eAAe,CAAC,UAAU,EAAE,GAAhC,CAAiC;QAE1D,IAAI,kBAAkB,IAAI,IAAI,IAAI,IAAA,kBAAY,EAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,OAAO;QACT,CAAC;QAED,IAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAEjD,IAAI,WAAW,GAAgB,IAAA,iDAA8B,EAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,YAAY,CAAC,CAAC;QAE1F,IAAM,wBAAwB,GAAG,MAAA,IAAA,eAAO,EAAC,oDAAyB,EAAE,sBAAc,CAAC,OAAO,CAAC,mCAAI,yBAAa,CAAC;QAE7G,IAAM,mBAAmB,yBACpB,IAAA,6CAA0B,EAAC,YAAY,CAAC,KAC3C,gBAAgB,EAAE,IAAA,sBAAU,GAAE,EAC9B,wBAAwB,0BAAA,GACzB,CAAC;QAEF,IAAA,eAAO,EAAC,oDAAyB,EAAE,mBAAmB,CAAC,gBAAgB,EAAE,sBAAc,CAAC,OAAO,CAAC,CAAC;QAEjG,SAAS,CAAC,6BAA6B,EAAE,mBAAmB,EAAE,SAAS,EAAE;YACvE,WAAW,aAAA;YACX,oBAAoB,EAAE,WAAW,CAAC,UAAU,GAAG,YAAY,CAAC,SAAS;SACtE,CAAC,CAAC;QAEH,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC;QACf,IAAI,EAAE,uCAAgB;QACtB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,OAAO,0BAA0B,CAAC;AACpC,CAAC","sourcesContent":["import { genShortID, unknownString } from '@grafana/faro-core';\nimport type { EventsAPI, PushEventOptions } from '@grafana/faro-core';\n\nimport { getItem, setItem, webStorageType } from '../../utils';\nimport { isUrlIgnored } from '../../utils/url';\nimport { NAVIGATION_ID_STORAGE_KEY } from '../instrumentationConstants';\n\nimport { NAVIGATION_ENTRY } from './performanceConstants';\nimport { createFaroNavigationTiming, getSpanContextFromServerTiming } from './performanceUtils';\nimport type { FaroNavigationItem } from './types';\n\ntype SpanContext = PushEventOptions['spanContext'];\n\nexport function getNavigationTimings(pushEvent: EventsAPI['pushEvent']): Promise<FaroNavigationItem> {\n let faroNavigationEntryResolve: (value: FaroNavigationItem) => void;\n const faroNavigationEntryPromise = new Promise<FaroNavigationItem>((resolve) => {\n faroNavigationEntryResolve = resolve;\n });\n\n const observer = new PerformanceObserver((observedEntries) => {\n const [navigationEntryRaw] = observedEntries.getEntries();\n\n if (navigationEntryRaw == null || isUrlIgnored(navigationEntryRaw.name)) {\n return;\n }\n\n const navEntryJson = navigationEntryRaw.toJSON();\n\n let spanContext: SpanContext = getSpanContextFromServerTiming(navEntryJson?.serverTiming);\n\n const faroPreviousNavigationId = getItem(NAVIGATION_ID_STORAGE_KEY, webStorageType.session) ?? unknownString;\n\n const faroNavigationEntry: FaroNavigationItem = {\n ...createFaroNavigationTiming(navEntryJson),\n faroNavigationId: genShortID(),\n faroPreviousNavigationId,\n };\n\n setItem(NAVIGATION_ID_STORAGE_KEY, faroNavigationEntry.faroNavigationId, webStorageType.session);\n\n pushEvent('faro.performance.navigation', faroNavigationEntry, undefined, {\n spanContext,\n timestampOverwriteMs: performance.timeOrigin + navEntryJson.startTime,\n });\n\n faroNavigationEntryResolve(faroNavigationEntry);\n });\n\n observer.observe({\n type: NAVIGATION_ENTRY,\n buffered: true,\n });\n\n return faroNavigationEntryPromise;\n}\n"]}
|
|
@@ -11,7 +11,12 @@ var __assign = (this && this.__assign) || function () {
|
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.
|
|
14
|
+
exports.getSpanContextFromServerTiming = getSpanContextFromServerTiming;
|
|
15
|
+
exports.performanceObserverSupported = performanceObserverSupported;
|
|
16
|
+
exports.onDocumentReady = onDocumentReady;
|
|
17
|
+
exports.includePerformanceEntry = includePerformanceEntry;
|
|
18
|
+
exports.createFaroResourceTiming = createFaroResourceTiming;
|
|
19
|
+
exports.createFaroNavigationTiming = createFaroNavigationTiming;
|
|
15
20
|
var faro_core_1 = require("@grafana/faro-core");
|
|
16
21
|
var w3cTraceparentFormat = /^00-[a-f0-9]{32}-[a-f0-9]{16}-[0-9]{1,2}$/;
|
|
17
22
|
// Extract traceparent from serverTiming, if present
|
|
@@ -32,11 +37,9 @@ function getSpanContextFromServerTiming(serverTimings) {
|
|
|
32
37
|
}
|
|
33
38
|
return undefined;
|
|
34
39
|
}
|
|
35
|
-
exports.getSpanContextFromServerTiming = getSpanContextFromServerTiming;
|
|
36
40
|
function performanceObserverSupported() {
|
|
37
41
|
return 'PerformanceObserver' in window;
|
|
38
42
|
}
|
|
39
|
-
exports.performanceObserverSupported = performanceObserverSupported;
|
|
40
43
|
function onDocumentReady(handleReady) {
|
|
41
44
|
if (document.readyState === 'complete') {
|
|
42
45
|
handleReady();
|
|
@@ -51,7 +54,6 @@ function onDocumentReady(handleReady) {
|
|
|
51
54
|
document.addEventListener('readystatechange', readyStateCompleteHandler_1);
|
|
52
55
|
}
|
|
53
56
|
}
|
|
54
|
-
exports.onDocumentReady = onDocumentReady;
|
|
55
57
|
function includePerformanceEntry(performanceEntryJSON, allowProps) {
|
|
56
58
|
if (allowProps === void 0) { allowProps = {}; }
|
|
57
59
|
for (var _i = 0, _a = Object.entries(allowProps); _i < _a.length; _i++) {
|
|
@@ -68,13 +70,10 @@ function includePerformanceEntry(performanceEntryJSON, allowProps) {
|
|
|
68
70
|
// empty object allows all
|
|
69
71
|
return true;
|
|
70
72
|
}
|
|
71
|
-
exports.includePerformanceEntry = includePerformanceEntry;
|
|
72
73
|
function createFaroResourceTiming(resourceEntryRaw) {
|
|
73
74
|
var connectEnd = resourceEntryRaw.connectEnd, connectStart = resourceEntryRaw.connectStart, decodedBodySize = resourceEntryRaw.decodedBodySize, domainLookupEnd = resourceEntryRaw.domainLookupEnd, domainLookupStart = resourceEntryRaw.domainLookupStart, duration = resourceEntryRaw.duration, encodedBodySize = resourceEntryRaw.encodedBodySize, fetchStart = resourceEntryRaw.fetchStart, initiatorType = resourceEntryRaw.initiatorType, name = resourceEntryRaw.name, nextHopProtocol = resourceEntryRaw.nextHopProtocol, redirectEnd = resourceEntryRaw.redirectEnd, redirectStart = resourceEntryRaw.redirectStart,
|
|
74
75
|
// @ts-expect-error the renderBlockingStatus property is not available in all browsers
|
|
75
|
-
rbs = resourceEntryRaw.renderBlockingStatus, requestStart = resourceEntryRaw.requestStart, responseEnd = resourceEntryRaw.responseEnd, responseStart = resourceEntryRaw.responseStart,
|
|
76
|
-
// @ts-expect-error the renderBlockingStatus property is not available in all browsers
|
|
77
|
-
responseStatus = resourceEntryRaw.responseStatus, secureConnectionStart = resourceEntryRaw.secureConnectionStart, transferSize = resourceEntryRaw.transferSize, workerStart = resourceEntryRaw.workerStart;
|
|
76
|
+
rbs = resourceEntryRaw.renderBlockingStatus, requestStart = resourceEntryRaw.requestStart, responseEnd = resourceEntryRaw.responseEnd, responseStart = resourceEntryRaw.responseStart, responseStatus = resourceEntryRaw.responseStatus, secureConnectionStart = resourceEntryRaw.secureConnectionStart, transferSize = resourceEntryRaw.transferSize, workerStart = resourceEntryRaw.workerStart;
|
|
78
77
|
return {
|
|
79
78
|
name: name,
|
|
80
79
|
duration: toFaroPerformanceTimingString(duration),
|
|
@@ -118,7 +117,6 @@ function createFaroResourceTiming(resourceEntryRaw) {
|
|
|
118
117
|
return cacheType;
|
|
119
118
|
}
|
|
120
119
|
}
|
|
121
|
-
exports.createFaroResourceTiming = createFaroResourceTiming;
|
|
122
120
|
function createFaroNavigationTiming(navigationEntryRaw) {
|
|
123
121
|
var activationStart = navigationEntryRaw.activationStart, domComplete = navigationEntryRaw.domComplete, domContentLoadedEventEnd = navigationEntryRaw.domContentLoadedEventEnd, domContentLoadedEventStart = navigationEntryRaw.domContentLoadedEventStart, domInteractive = navigationEntryRaw.domInteractive, fetchStart = navigationEntryRaw.fetchStart, loadEventEnd = navigationEntryRaw.loadEventEnd, loadEventStart = navigationEntryRaw.loadEventStart, responseStart = navigationEntryRaw.responseStart, type = navigationEntryRaw.type;
|
|
124
122
|
var parserStart = getDocumentParsingTime();
|
|
@@ -128,7 +126,6 @@ function createFaroNavigationTiming(navigationEntryRaw) {
|
|
|
128
126
|
// clamp to 0 if activationStart occurs after first byte is received.
|
|
129
127
|
ttfb: toFaroPerformanceTimingString(Math.max(responseStart - (activationStart !== null && activationStart !== void 0 ? activationStart : 0), 0)), type: type });
|
|
130
128
|
}
|
|
131
|
-
exports.createFaroNavigationTiming = createFaroNavigationTiming;
|
|
132
129
|
function getDocumentParsingTime() {
|
|
133
130
|
var _a;
|
|
134
131
|
if (((_a = performance.timing) === null || _a === void 0 ? void 0 : _a.domLoading) != null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performanceUtils.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/performanceUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { isArray, type PushEventOptions, unknownString } from '@grafana/faro-core';\n\nimport type { CacheType, FaroNavigationTiming, FaroResourceTiming } from './types';\n\nconst w3cTraceparentFormat = /^00-[a-f0-9]{32}-[a-f0-9]{16}-[0-9]{1,2}$/;\n\ntype SpanContext = PushEventOptions['spanContext'];\n\n// Extract traceparent from serverTiming, if present\nexport function getSpanContextFromServerTiming(serverTimings: PerformanceServerTiming[] = []): SpanContext | undefined {\n for (const serverEntry of serverTimings) {\n if (serverEntry.name === 'traceparent') {\n if (!w3cTraceparentFormat.test(serverEntry.description)) {\n continue;\n }\n\n const [, traceId, spanId] = serverEntry.description.split('-');\n if (traceId != null && spanId != null) {\n return { traceId, spanId };\n }\n\n break;\n }\n }\n\n return undefined;\n}\n\nexport function performanceObserverSupported(): boolean {\n return 'PerformanceObserver' in window;\n}\n\nexport function onDocumentReady(handleReady: () => void) {\n if (document.readyState === 'complete') {\n handleReady();\n } else {\n const readyStateCompleteHandler = () => {\n if (document.readyState === 'complete') {\n handleReady();\n document.removeEventListener('readystatechange', readyStateCompleteHandler);\n }\n };\n\n document.addEventListener('readystatechange', readyStateCompleteHandler);\n }\n}\n\ntype PerformanceEntryAllowProperties = Record<string, Array<string | number> | string | number>;\n\nexport function includePerformanceEntry(\n performanceEntryJSON: Record<string, any>,\n allowProps: PerformanceEntryAllowProperties = {}\n): boolean {\n for (const [allowPropKey, allowPropValue] of Object.entries(allowProps)) {\n const perfEntryPropVal = performanceEntryJSON[allowPropKey];\n\n if (perfEntryPropVal == null) {\n return false;\n }\n\n if (isArray(allowPropValue)) {\n return allowPropValue.includes(perfEntryPropVal);\n }\n\n return perfEntryPropVal === allowPropValue;\n }\n\n // empty object allows all\n return true;\n}\n\nexport function createFaroResourceTiming(resourceEntryRaw: PerformanceResourceTiming): FaroResourceTiming {\n const {\n connectEnd,\n connectStart,\n decodedBodySize,\n domainLookupEnd,\n domainLookupStart,\n duration,\n encodedBodySize,\n fetchStart,\n initiatorType,\n name,\n nextHopProtocol,\n redirectEnd,\n redirectStart,\n // @ts-expect-error the renderBlockingStatus property is not available in all browsers\n renderBlockingStatus: rbs,\n requestStart,\n responseEnd,\n responseStart,\n // @ts-expect-error the renderBlockingStatus property is not available in all browsers\n responseStatus,\n secureConnectionStart,\n transferSize,\n workerStart,\n } = resourceEntryRaw;\n\n return {\n name: name,\n duration: toFaroPerformanceTimingString(duration),\n tcpHandshakeTime: toFaroPerformanceTimingString(connectEnd - connectStart),\n dnsLookupTime: toFaroPerformanceTimingString(domainLookupEnd - domainLookupStart),\n tlsNegotiationTime: toFaroPerformanceTimingString(requestStart - secureConnectionStart),\n responseStatus: toFaroPerformanceTimingString(responseStatus),\n redirectTime: toFaroPerformanceTimingString(redirectEnd - redirectStart),\n requestTime: toFaroPerformanceTimingString(responseStart - requestStart),\n responseTime: toFaroPerformanceTimingString(responseEnd - responseStart),\n fetchTime: toFaroPerformanceTimingString(responseEnd - fetchStart),\n serviceWorkerTime: toFaroPerformanceTimingString(fetchStart - workerStart),\n decodedBodySize: toFaroPerformanceTimingString(decodedBodySize),\n encodedBodySize: toFaroPerformanceTimingString(encodedBodySize),\n cacheHitStatus: getCacheType(),\n renderBlockingStatus: toFaroPerformanceTimingString(rbs) as FaroResourceTiming['renderBlockingStatus'],\n protocol: nextHopProtocol,\n initiatorType: initiatorType,\n visibilityState: document.visibilityState,\n ttfb: toFaroPerformanceTimingString(responseStart - requestStart),\n\n // TODO: add in future iteration, ideally after nested objects are supported by the collector.\n // serverTiming: resourceEntryRaw.serverTiming,\n };\n\n function getCacheType(): CacheType {\n let cacheType: CacheType = 'fullLoad';\n if (transferSize === 0) {\n if (decodedBodySize > 0) {\n cacheType = 'cache';\n }\n } else {\n if (responseStatus != null) {\n if (responseStatus === 304) {\n cacheType = 'conditionalFetch';\n }\n } else if (encodedBodySize > 0 && transferSize < encodedBodySize) {\n cacheType = 'conditionalFetch';\n }\n }\n return cacheType;\n }\n}\n\nexport function createFaroNavigationTiming(navigationEntryRaw: PerformanceNavigationTiming): FaroNavigationTiming {\n const {\n activationStart,\n domComplete,\n domContentLoadedEventEnd,\n domContentLoadedEventStart,\n domInteractive,\n fetchStart,\n loadEventEnd,\n loadEventStart,\n responseStart,\n type,\n } = navigationEntryRaw;\n\n const parserStart = getDocumentParsingTime();\n\n return {\n ...createFaroResourceTiming(navigationEntryRaw),\n pageLoadTime: toFaroPerformanceTimingString(domComplete - fetchStart),\n documentParsingTime: toFaroPerformanceTimingString(parserStart ? domInteractive - parserStart : null),\n domProcessingTime: toFaroPerformanceTimingString(domComplete - domInteractive),\n domContentLoadHandlerTime: toFaroPerformanceTimingString(domContentLoadedEventEnd - domContentLoadedEventStart),\n onLoadTime: toFaroPerformanceTimingString(loadEventEnd - loadEventStart),\n\n // For navigation entries we can calculate the TTFB based on activationStart. We overwrite the TTFB value coming with the resource entry.\n // For more accuracy on prerendered pages page we calculate relative top the activationStart instead of the start of the navigation.\n // clamp to 0 if activationStart occurs after first byte is received.\n ttfb: toFaroPerformanceTimingString(Math.max(responseStart - (activationStart ?? 0), 0)),\n type: type,\n };\n}\n\nfunction getDocumentParsingTime(): number | null {\n if (performance.timing?.domLoading != null) {\n // the browser is about to start parsing the first received bytes of the HTML document.\n // This property is deprecated but there isn't a really good alternative atm.\n // For now we stick with domLoading and keep researching a better alternative.\n return performance.timing.domLoading - performance.timeOrigin;\n }\n\n return null;\n}\n\nfunction toFaroPerformanceTimingString(v: unknown): string {\n if (v == null) {\n return unknownString;\n }\n\n if (typeof v === 'number') {\n return Math.round(v).toString();\n }\n\n return v.toString();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"performanceUtils.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/performanceUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { isArray, type PushEventOptions, unknownString } from '@grafana/faro-core';\n\nimport type { CacheType, FaroNavigationTiming, FaroResourceTiming } from './types';\n\nconst w3cTraceparentFormat = /^00-[a-f0-9]{32}-[a-f0-9]{16}-[0-9]{1,2}$/;\n\ntype SpanContext = PushEventOptions['spanContext'];\n\n// Extract traceparent from serverTiming, if present\nexport function getSpanContextFromServerTiming(serverTimings: PerformanceServerTiming[] = []): SpanContext | undefined {\n for (const serverEntry of serverTimings) {\n if (serverEntry.name === 'traceparent') {\n if (!w3cTraceparentFormat.test(serverEntry.description)) {\n continue;\n }\n\n const [, traceId, spanId] = serverEntry.description.split('-');\n if (traceId != null && spanId != null) {\n return { traceId, spanId };\n }\n\n break;\n }\n }\n\n return undefined;\n}\n\nexport function performanceObserverSupported(): boolean {\n return 'PerformanceObserver' in window;\n}\n\nexport function onDocumentReady(handleReady: () => void) {\n if (document.readyState === 'complete') {\n handleReady();\n } else {\n const readyStateCompleteHandler = () => {\n if (document.readyState === 'complete') {\n handleReady();\n document.removeEventListener('readystatechange', readyStateCompleteHandler);\n }\n };\n\n document.addEventListener('readystatechange', readyStateCompleteHandler);\n }\n}\n\ntype PerformanceEntryAllowProperties = Record<string, Array<string | number> | string | number>;\n\nexport function includePerformanceEntry(\n performanceEntryJSON: Record<string, any>,\n allowProps: PerformanceEntryAllowProperties = {}\n): boolean {\n for (const [allowPropKey, allowPropValue] of Object.entries(allowProps)) {\n const perfEntryPropVal = performanceEntryJSON[allowPropKey];\n\n if (perfEntryPropVal == null) {\n return false;\n }\n\n if (isArray(allowPropValue)) {\n return allowPropValue.includes(perfEntryPropVal);\n }\n\n return perfEntryPropVal === allowPropValue;\n }\n\n // empty object allows all\n return true;\n}\n\nexport function createFaroResourceTiming(resourceEntryRaw: PerformanceResourceTiming): FaroResourceTiming {\n const {\n connectEnd,\n connectStart,\n decodedBodySize,\n domainLookupEnd,\n domainLookupStart,\n duration,\n encodedBodySize,\n fetchStart,\n initiatorType,\n name,\n nextHopProtocol,\n redirectEnd,\n redirectStart,\n // @ts-expect-error the renderBlockingStatus property is not available in all browsers\n renderBlockingStatus: rbs,\n requestStart,\n responseEnd,\n responseStart,\n responseStatus,\n secureConnectionStart,\n transferSize,\n workerStart,\n } = resourceEntryRaw;\n\n return {\n name: name,\n duration: toFaroPerformanceTimingString(duration),\n tcpHandshakeTime: toFaroPerformanceTimingString(connectEnd - connectStart),\n dnsLookupTime: toFaroPerformanceTimingString(domainLookupEnd - domainLookupStart),\n tlsNegotiationTime: toFaroPerformanceTimingString(requestStart - secureConnectionStart),\n responseStatus: toFaroPerformanceTimingString(responseStatus),\n redirectTime: toFaroPerformanceTimingString(redirectEnd - redirectStart),\n requestTime: toFaroPerformanceTimingString(responseStart - requestStart),\n responseTime: toFaroPerformanceTimingString(responseEnd - responseStart),\n fetchTime: toFaroPerformanceTimingString(responseEnd - fetchStart),\n serviceWorkerTime: toFaroPerformanceTimingString(fetchStart - workerStart),\n decodedBodySize: toFaroPerformanceTimingString(decodedBodySize),\n encodedBodySize: toFaroPerformanceTimingString(encodedBodySize),\n cacheHitStatus: getCacheType(),\n renderBlockingStatus: toFaroPerformanceTimingString(rbs) as FaroResourceTiming['renderBlockingStatus'],\n protocol: nextHopProtocol,\n initiatorType: initiatorType,\n visibilityState: document.visibilityState,\n ttfb: toFaroPerformanceTimingString(responseStart - requestStart),\n\n // TODO: add in future iteration, ideally after nested objects are supported by the collector.\n // serverTiming: resourceEntryRaw.serverTiming,\n };\n\n function getCacheType(): CacheType {\n let cacheType: CacheType = 'fullLoad';\n if (transferSize === 0) {\n if (decodedBodySize > 0) {\n cacheType = 'cache';\n }\n } else {\n if (responseStatus != null) {\n if (responseStatus === 304) {\n cacheType = 'conditionalFetch';\n }\n } else if (encodedBodySize > 0 && transferSize < encodedBodySize) {\n cacheType = 'conditionalFetch';\n }\n }\n return cacheType;\n }\n}\n\nexport function createFaroNavigationTiming(navigationEntryRaw: PerformanceNavigationTiming): FaroNavigationTiming {\n const {\n activationStart,\n domComplete,\n domContentLoadedEventEnd,\n domContentLoadedEventStart,\n domInteractive,\n fetchStart,\n loadEventEnd,\n loadEventStart,\n responseStart,\n type,\n } = navigationEntryRaw;\n\n const parserStart = getDocumentParsingTime();\n\n return {\n ...createFaroResourceTiming(navigationEntryRaw),\n pageLoadTime: toFaroPerformanceTimingString(domComplete - fetchStart),\n documentParsingTime: toFaroPerformanceTimingString(parserStart ? domInteractive - parserStart : null),\n domProcessingTime: toFaroPerformanceTimingString(domComplete - domInteractive),\n domContentLoadHandlerTime: toFaroPerformanceTimingString(domContentLoadedEventEnd - domContentLoadedEventStart),\n onLoadTime: toFaroPerformanceTimingString(loadEventEnd - loadEventStart),\n\n // For navigation entries we can calculate the TTFB based on activationStart. We overwrite the TTFB value coming with the resource entry.\n // For more accuracy on prerendered pages page we calculate relative top the activationStart instead of the start of the navigation.\n // clamp to 0 if activationStart occurs after first byte is received.\n ttfb: toFaroPerformanceTimingString(Math.max(responseStart - (activationStart ?? 0), 0)),\n type: type,\n };\n}\n\nfunction getDocumentParsingTime(): number | null {\n if (performance.timing?.domLoading != null) {\n // the browser is about to start parsing the first received bytes of the HTML document.\n // This property is deprecated but there isn't a really good alternative atm.\n // For now we stick with domLoading and keep researching a better alternative.\n return performance.timing.domLoading - performance.timeOrigin;\n }\n\n return null;\n}\n\nfunction toFaroPerformanceTimingString(v: unknown): string {\n if (v == null) {\n return unknownString;\n }\n\n if (typeof v === 'number') {\n return Math.round(v).toString();\n }\n\n return v.toString();\n}\n"]}
|
|
@@ -11,7 +11,7 @@ var __assign = (this && this.__assign) || function () {
|
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.observeResourceTimings =
|
|
14
|
+
exports.observeResourceTimings = observeResourceTimings;
|
|
15
15
|
var faro_core_1 = require("@grafana/faro-core");
|
|
16
16
|
var url_1 = require("../../utils/url");
|
|
17
17
|
var performanceConstants_1 = require("./performanceConstants");
|
|
@@ -48,5 +48,4 @@ function observeResourceTimings(faroNavigationId, pushEvent, observable) {
|
|
|
48
48
|
buffered: true,
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
|
-
exports.observeResourceTimings = observeResourceTimings;
|
|
52
51
|
//# sourceMappingURL=resource.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/resource.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/resource.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAaA,wDA+CC;AA5DD,gDAAsD;AAGtD,uCAA+C;AAE/C,+DAAwD;AACxD,uDAAuH;AAKvH,IAAM,uBAAuB,GAAG,EAAE,aAAa,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;AAE/E,SAAgB,sBAAsB,CACpC,gBAAwB,EACxB,SAAiC,EACjC,UAA4C;IAE5C,IAAM,cAAc,GAAG,gBAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IAElD,IAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,UAAC,eAAe;QACvD,IAAM,OAAO,GAAG,eAAe,CAAC,UAAU,EAAE,CAAC;QAE7C,KAA+B,UAAO,EAAP,mBAAO,EAAP,qBAAO,EAAP,IAAO,EAAE,CAAC;YAApC,IAAM,gBAAgB,gBAAA;YACzB,IAAI,IAAA,kBAAY,EAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,OAAO;YACT,CAAC;YAED,IAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAEpD,IAAI,WAAW,GAAgB,IAAA,iDAA8B,EAAC,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,YAAY,CAAC,CAAC;YAE/F,IACE,CAAC,cAAc,IAAI,IAAI,IAAI,IAAA,0CAAuB,EAAC,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;gBAC/F,cAAc,EACd,CAAC;gBACD,IAAM,iBAAiB,yBAClB,IAAA,2CAAwB,EAAC,iBAAiB,CAAC,KAC9C,gBAAgB,kBAAA,EAChB,cAAc,EAAE,IAAA,sBAAU,GAAE,GAC7B,CAAC;gBAEF,IAAI,gBAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;oBACxC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,CAAC;wBACjB,IAAI,EAAE,qCAAc;qBACrB,CAAC,CAAC;gBACL,CAAC;gBAED,SAAS,CAAC,2BAA2B,EAAE,iBAAiB,EAAE,SAAS,EAAE;oBACnE,WAAW,aAAA;oBACX,oBAAoB,EAAE,WAAW,CAAC,UAAU,GAAG,iBAAiB,CAAC,SAAS;iBAC3E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC;QACf,IAAI,EAAE,qCAAc;QACpB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { faro, genShortID } from '@grafana/faro-core';\nimport type { EventsAPI, Observable, PushEventOptions } from '@grafana/faro-core';\n\nimport { isUrlIgnored } from '../../utils/url';\n\nimport { RESOURCE_ENTRY } from './performanceConstants';\nimport { createFaroResourceTiming, getSpanContextFromServerTiming, includePerformanceEntry } from './performanceUtils';\nimport type { ResourceEntryMessage } from './types';\n\ntype SpanContext = PushEventOptions['spanContext'];\n\nconst DEFAULT_TRACK_RESOURCES = { initiatorType: ['xmlhttprequest', 'fetch'] };\n\nexport function observeResourceTimings(\n faroNavigationId: string,\n pushEvent: EventsAPI['pushEvent'],\n observable: Observable<ResourceEntryMessage>\n) {\n const trackResources = faro.config.trackResources;\n\n const observer = new PerformanceObserver((observedEntries) => {\n const entries = observedEntries.getEntries();\n\n for (const resourceEntryRaw of entries) {\n if (isUrlIgnored(resourceEntryRaw.name)) {\n return;\n }\n\n const resourceEntryJson = resourceEntryRaw.toJSON();\n\n let spanContext: SpanContext = getSpanContextFromServerTiming(resourceEntryJson?.serverTiming);\n\n if (\n (trackResources == null && includePerformanceEntry(resourceEntryJson, DEFAULT_TRACK_RESOURCES)) ||\n trackResources\n ) {\n const faroResourceEntry = {\n ...createFaroResourceTiming(resourceEntryJson),\n faroNavigationId,\n faroResourceId: genShortID(),\n };\n\n if (faro.config.trackUserActionsPreview) {\n observable?.notify({\n type: RESOURCE_ENTRY,\n });\n }\n\n pushEvent('faro.performance.resource', faroResourceEntry, undefined, {\n spanContext,\n timestampOverwriteMs: performance.timeOrigin + resourceEntryJson.startTime,\n });\n }\n }\n });\n\n observer.observe({\n type: RESOURCE_ENTRY,\n buffered: true,\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/instrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseInstrumentation,\n dateNow,\n EVENT_SESSION_EXTEND,\n EVENT_SESSION_RESUME,\n EVENT_SESSION_START,\n Meta,\n MetaSession,\n VERSION,\n} from '@grafana/faro-core';\nimport type { Config } from '@grafana/faro-core';\n\nimport type { TransportItem } from '../..';\nimport { createSession } from '../../metas';\n\nimport { type FaroUserSession, getSessionManagerByConfig, isSampled } from './sessionManager';\nimport { PersistentSessionsManager } from './sessionManager/PersistentSessionsManager';\nimport { createUserSessionObject, isUserSessionValid } from './sessionManager/sessionManagerUtils';\nimport type { SessionManager } from './sessionManager/types';\n\ntype LifecycleType = typeof EVENT_SESSION_RESUME | typeof EVENT_SESSION_START;\n\nexport class SessionInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-session';\n readonly version = VERSION;\n\n // previously notified session, to ensure we don't send session start\n // event twice for the same session\n private notifiedSession: MetaSession | undefined;\n\n private sendSessionStartEvent(meta: Meta): void {\n const session = meta.session;\n\n if (session && session.id !== this.notifiedSession?.id) {\n if (this.notifiedSession && this.notifiedSession.id === session.attributes?.['previousSession']) {\n this.api.pushEvent(EVENT_SESSION_EXTEND, {}, undefined, { skipDedupe: true });\n this.notifiedSession = session;\n return;\n }\n\n this.notifiedSession = session;\n // no need to add attributes and session id, they are included as part of meta\n // automatically\n this.api.pushEvent(EVENT_SESSION_START, {}, undefined, { skipDedupe: true });\n }\n }\n\n private createInitialSession(\n SessionManager: SessionManager,\n sessionsConfig: Required<Config>['sessionTracking']\n ): {\n initialSession: FaroUserSession;\n lifecycleType: LifecycleType;\n } {\n let storedUserSession: FaroUserSession | null = SessionManager.fetchUserSession();\n\n if (sessionsConfig.persistent && sessionsConfig.maxSessionPersistenceTime && storedUserSession) {\n const now = dateNow();\n const shouldClearPersistentSession =\n storedUserSession.lastActivity < now - sessionsConfig.maxSessionPersistenceTime;\n\n if (shouldClearPersistentSession) {\n PersistentSessionsManager.removeUserSession();\n storedUserSession = null;\n }\n }\n\n let lifecycleType: LifecycleType;\n let initialSession: FaroUserSession;\n\n if (isUserSessionValid(storedUserSession)) {\n const sessionId = storedUserSession?.sessionId;\n\n initialSession = createUserSessionObject({\n sessionId,\n isSampled: storedUserSession!.isSampled || false,\n started: storedUserSession?.started,\n });\n\n const storedUserSessionMeta = storedUserSession?.sessionMeta;\n\n // For resumed sessions we want to merge the previous overrides with the configured ones.\n // If the same key is present in both, the new one will override the old one.\n const overrides = { ...sessionsConfig.session?.overrides, ...storedUserSessionMeta?.overrides };\n\n initialSession.sessionMeta = {\n ...sessionsConfig.session,\n id: sessionId,\n attributes: {\n ...sessionsConfig.session?.attributes,\n ...storedUserSessionMeta?.attributes,\n // For valid resumed sessions we do not want to recalculate the sampling decision on each init phase.\n isSampled: initialSession.isSampled.toString(),\n },\n overrides,\n };\n\n lifecycleType = EVENT_SESSION_RESUME;\n } else {\n const sessionId = sessionsConfig.session?.id ?? createSession().id;\n\n initialSession = createUserSessionObject({\n sessionId,\n isSampled: isSampled(),\n });\n\n const overrides = sessionsConfig.session?.overrides;\n\n initialSession.sessionMeta = {\n id: sessionId,\n attributes: {\n isSampled: initialSession.isSampled.toString(),\n ...sessionsConfig.session?.attributes,\n },\n // new session we don't care about previous overrides\n ...(overrides ? { overrides } : {}),\n };\n\n lifecycleType = EVENT_SESSION_START;\n }\n\n return { initialSession, lifecycleType };\n }\n\n private registerBeforeSendHook(SessionManager: SessionManager) {\n const { updateSession } = new SessionManager();\n\n this.transports?.addBeforeSendHooks((item) => {\n updateSession();\n\n const attributes = item.meta.session?.attributes;\n\n if (attributes && attributes?.['isSampled'] === 'true') {\n let newItem: TransportItem = JSON.parse(JSON.stringify(item));\n\n const newAttributes = newItem.meta.session?.attributes;\n delete newAttributes?.['isSampled'];\n\n if (Object.keys(newAttributes ?? {}).length === 0) {\n delete newItem.meta.session?.attributes;\n }\n\n return newItem;\n }\n\n return null;\n });\n }\n\n initialize() {\n this.logDebug('init session instrumentation');\n\n const sessionTrackingConfig = this.config.sessionTracking;\n\n if (sessionTrackingConfig?.enabled) {\n const SessionManager = getSessionManagerByConfig(sessionTrackingConfig);\n\n this.registerBeforeSendHook(SessionManager);\n\n const { initialSession, lifecycleType } = this.createInitialSession(SessionManager, sessionTrackingConfig);\n\n SessionManager.storeUserSession(initialSession);\n\n const initialSessionMeta = initialSession.sessionMeta;\n\n this.notifiedSession = initialSessionMeta;\n this.api.setSession(initialSessionMeta);\n\n if (lifecycleType === EVENT_SESSION_START) {\n this.api.pushEvent(EVENT_SESSION_START, {}, undefined, { skipDedupe: true });\n }\n\n if (lifecycleType === EVENT_SESSION_RESUME) {\n this.api.pushEvent(EVENT_SESSION_RESUME, {}, undefined, { skipDedupe: true });\n }\n }\n\n this.metas.addListener(this.sendSessionStartEvent.bind(this));\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/instrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseInstrumentation,\n dateNow,\n EVENT_SESSION_EXTEND,\n EVENT_SESSION_RESUME,\n EVENT_SESSION_START,\n VERSION,\n} from '@grafana/faro-core';\nimport type { Config, Meta, MetaSession } from '@grafana/faro-core';\n\nimport type { TransportItem } from '../..';\nimport { createSession } from '../../metas';\n\nimport { type FaroUserSession, getSessionManagerByConfig, isSampled } from './sessionManager';\nimport { PersistentSessionsManager } from './sessionManager/PersistentSessionsManager';\nimport { createUserSessionObject, isUserSessionValid } from './sessionManager/sessionManagerUtils';\nimport type { SessionManager } from './sessionManager/types';\n\ntype LifecycleType = typeof EVENT_SESSION_RESUME | typeof EVENT_SESSION_START;\n\nexport class SessionInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-session';\n readonly version = VERSION;\n\n // previously notified session, to ensure we don't send session start\n // event twice for the same session\n private notifiedSession: MetaSession | undefined;\n\n private sendSessionStartEvent(meta: Meta): void {\n const session = meta.session;\n\n if (session && session.id !== this.notifiedSession?.id) {\n if (this.notifiedSession && this.notifiedSession.id === session.attributes?.['previousSession']) {\n this.api.pushEvent(EVENT_SESSION_EXTEND, {}, undefined, { skipDedupe: true });\n this.notifiedSession = session;\n return;\n }\n\n this.notifiedSession = session;\n // no need to add attributes and session id, they are included as part of meta\n // automatically\n this.api.pushEvent(EVENT_SESSION_START, {}, undefined, { skipDedupe: true });\n }\n }\n\n private createInitialSession(\n SessionManager: SessionManager,\n sessionsConfig: Required<Config>['sessionTracking']\n ): {\n initialSession: FaroUserSession;\n lifecycleType: LifecycleType;\n } {\n let storedUserSession: FaroUserSession | null = SessionManager.fetchUserSession();\n\n if (sessionsConfig.persistent && sessionsConfig.maxSessionPersistenceTime && storedUserSession) {\n const now = dateNow();\n const shouldClearPersistentSession =\n storedUserSession.lastActivity < now - sessionsConfig.maxSessionPersistenceTime;\n\n if (shouldClearPersistentSession) {\n PersistentSessionsManager.removeUserSession();\n storedUserSession = null;\n }\n }\n\n let lifecycleType: LifecycleType;\n let initialSession: FaroUserSession;\n\n if (isUserSessionValid(storedUserSession)) {\n const sessionId = storedUserSession?.sessionId;\n\n initialSession = createUserSessionObject({\n sessionId,\n isSampled: storedUserSession!.isSampled || false,\n started: storedUserSession?.started,\n });\n\n const storedUserSessionMeta = storedUserSession?.sessionMeta;\n\n // For resumed sessions we want to merge the previous overrides with the configured ones.\n // If the same key is present in both, the new one will override the old one.\n const overrides = { ...sessionsConfig.session?.overrides, ...storedUserSessionMeta?.overrides };\n\n initialSession.sessionMeta = {\n ...sessionsConfig.session,\n id: sessionId,\n attributes: {\n ...sessionsConfig.session?.attributes,\n ...storedUserSessionMeta?.attributes,\n // For valid resumed sessions we do not want to recalculate the sampling decision on each init phase.\n isSampled: initialSession.isSampled.toString(),\n },\n overrides,\n };\n\n lifecycleType = EVENT_SESSION_RESUME;\n } else {\n const sessionId = sessionsConfig.session?.id ?? createSession().id;\n\n initialSession = createUserSessionObject({\n sessionId,\n isSampled: isSampled(),\n });\n\n const overrides = sessionsConfig.session?.overrides;\n\n initialSession.sessionMeta = {\n id: sessionId,\n attributes: {\n isSampled: initialSession.isSampled.toString(),\n ...sessionsConfig.session?.attributes,\n },\n // new session we don't care about previous overrides\n ...(overrides ? { overrides } : {}),\n };\n\n lifecycleType = EVENT_SESSION_START;\n }\n\n return { initialSession, lifecycleType };\n }\n\n private registerBeforeSendHook(SessionManager: SessionManager) {\n const { updateSession } = new SessionManager();\n\n this.transports?.addBeforeSendHooks((item) => {\n updateSession();\n\n const attributes = item.meta.session?.attributes;\n\n if (attributes && attributes?.['isSampled'] === 'true') {\n let newItem: TransportItem = JSON.parse(JSON.stringify(item));\n\n const newAttributes = newItem.meta.session?.attributes;\n delete newAttributes?.['isSampled'];\n\n if (Object.keys(newAttributes ?? {}).length === 0) {\n delete newItem.meta.session?.attributes;\n }\n\n return newItem;\n }\n\n return null;\n });\n }\n\n initialize() {\n this.logDebug('init session instrumentation');\n\n const sessionTrackingConfig = this.config.sessionTracking;\n\n if (sessionTrackingConfig?.enabled) {\n const SessionManager = getSessionManagerByConfig(sessionTrackingConfig);\n\n this.registerBeforeSendHook(SessionManager);\n\n const { initialSession, lifecycleType } = this.createInitialSession(SessionManager, sessionTrackingConfig);\n\n SessionManager.storeUserSession(initialSession);\n\n const initialSessionMeta = initialSession.sessionMeta;\n\n this.notifiedSession = initialSessionMeta;\n this.api.setSession(initialSessionMeta);\n\n if (lifecycleType === EVENT_SESSION_START) {\n this.api.pushEvent(EVENT_SESSION_START, {}, undefined, { skipDedupe: true });\n }\n\n if (lifecycleType === EVENT_SESSION_RESUME) {\n this.api.pushEvent(EVENT_SESSION_RESUME, {}, undefined, { skipDedupe: true });\n }\n }\n\n this.metas.addListener(this.sendSessionStartEvent.bind(this));\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersistentSessionsManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/PersistentSessionsManager.ts"],"names":[],"mappings":";;;AAAA,gDAAiE;AAEjE,wCAA0C;AAC1C,wDAAyF;AAEzF,uDAAuE;AACvE,6DAA2F;AAG3F;IAIE;QAAA,iBAOC;QAoBD,kBAAa,GAAG,IAAA,gBAAQ,EAAC,cAAM,OAAA,KAAI,CAAC,iBAAiB,EAAE,EAAxB,CAAwB,EAAE,uCAAoB,CAAC,CAAC;QA1B7E,IAAI,CAAC,iBAAiB,GAAG,IAAA,2CAAqB,EAAC;YAC7C,gBAAgB,EAAE,yBAAyB,CAAC,gBAAgB;YAC5D,gBAAgB,EAAE,yBAAyB,CAAC,gBAAgB;SAC7D,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEM,2CAAiB,GAAxB;QACE,IAAA,uBAAU,EAAC,8BAAW,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IACtE,CAAC;IAEM,0CAAgB,GAAvB,UAAwB,OAAwB;QAC9C,IAAA,oBAAO,EAAC,8BAAW,EAAE,IAAA,iCAAqB,EAAC,OAAO,CAAC,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IACnG,CAAC;IAEM,0CAAgB,GAAvB;QACE,IAAM,aAAa,GAAG,IAAA,oBAAO,EAAC,8BAAW,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAEvF,IAAI,aAAa,EAAE;
|
|
1
|
+
{"version":3,"file":"PersistentSessionsManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/PersistentSessionsManager.ts"],"names":[],"mappings":";;;AAAA,gDAAiE;AAEjE,wCAA0C;AAC1C,wDAAyF;AAEzF,uDAAuE;AACvE,6DAA2F;AAG3F;IAIE;QAAA,iBAOC;QAoBD,kBAAa,GAAG,IAAA,gBAAQ,EAAC,cAAM,OAAA,KAAI,CAAC,iBAAiB,EAAE,EAAxB,CAAwB,EAAE,uCAAoB,CAAC,CAAC;QA1B7E,IAAI,CAAC,iBAAiB,GAAG,IAAA,2CAAqB,EAAC;YAC7C,gBAAgB,EAAE,yBAAyB,CAAC,gBAAgB;YAC5D,gBAAgB,EAAE,yBAAyB,CAAC,gBAAgB;SAC7D,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEM,2CAAiB,GAAxB;QACE,IAAA,uBAAU,EAAC,8BAAW,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IACtE,CAAC;IAEM,0CAAgB,GAAvB,UAAwB,OAAwB;QAC9C,IAAA,oBAAO,EAAC,8BAAW,EAAE,IAAA,iCAAqB,EAAC,OAAO,CAAC,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IACnG,CAAC;IAEM,0CAAgB,GAAvB;QACE,IAAM,aAAa,GAAG,IAAA,oBAAO,EAAC,8BAAW,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAEvF,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAoB,CAAC;QACtD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAIO,wCAAI,GAAZ;QAAA,iBAcC;QAbC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE;YAC5C,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBAC3C,KAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,iGAAiG;QACjG,gBAAI,CAAC,KAAK,CAAC,WAAW,CACpB,IAAA,iDAA2B,EAAC;YAC1B,gBAAgB,EAAE,yBAAyB,CAAC,gBAAgB;YAC5D,gBAAgB,EAAE,yBAAyB,CAAC,gBAAgB;SAC7D,CAAC,CACH,CAAC;IACJ,CAAC;IA9Cc,0CAAgB,GAAG,2BAAc,CAAC,KAAK,AAAvB,CAAwB;IA+CzD,gCAAC;CAAA,AAhDD,IAgDC;AAhDY,8DAAyB","sourcesContent":["import { faro, stringifyExternalJson } from '@grafana/faro-core';\n\nimport { throttle } from '../../../utils';\nimport { getItem, removeItem, setItem, webStorageType } from '../../../utils/webStorage';\n\nimport { STORAGE_KEY, STORAGE_UPDATE_DELAY } from './sessionConstants';\nimport { getSessionMetaUpdateHandler, getUserSessionUpdater } from './sessionManagerUtils';\nimport type { FaroUserSession } from './types';\n\nexport class PersistentSessionsManager {\n private static storageTypeLocal = webStorageType.local;\n private updateUserSession: ReturnType<typeof getUserSessionUpdater>;\n\n constructor() {\n this.updateUserSession = getUserSessionUpdater({\n fetchUserSession: PersistentSessionsManager.fetchUserSession,\n storeUserSession: PersistentSessionsManager.storeUserSession,\n });\n\n this.init();\n }\n\n static removeUserSession() {\n removeItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal);\n }\n\n static storeUserSession(session: FaroUserSession): void {\n setItem(STORAGE_KEY, stringifyExternalJson(session), PersistentSessionsManager.storageTypeLocal);\n }\n\n static fetchUserSession(): FaroUserSession | null {\n const storedSession = getItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal);\n\n if (storedSession) {\n return JSON.parse(storedSession) as FaroUserSession;\n }\n\n return null;\n }\n\n updateSession = throttle(() => this.updateUserSession(), STORAGE_UPDATE_DELAY);\n\n private init(): void {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n this.updateSession();\n }\n });\n\n // Users can call the setSession() method, so we need to sync this with the local storage session\n faro.metas.addListener(\n getSessionMetaUpdateHandler({\n fetchUserSession: PersistentSessionsManager.fetchUserSession,\n storeUserSession: PersistentSessionsManager.storeUserSession,\n })\n );\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VolatileSessionManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/VolatileSessionManager.ts"],"names":[],"mappings":";;;AAAA,gDAAiE;AAEjE,wCAA0C;AAC1C,wDAAyF;AAEzF,uDAAuE;AACvE,6DAA2F;AAG3F;IAIE;QAAA,iBAOC;QAoBD,kBAAa,GAAG,IAAA,gBAAQ,EAAC,cAAM,OAAA,KAAI,CAAC,iBAAiB,EAAE,EAAxB,CAAwB,EAAE,uCAAoB,CAAC,CAAC;QA1B7E,IAAI,CAAC,iBAAiB,GAAG,IAAA,2CAAqB,EAAC;YAC7C,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB;YAC1D,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB;SAC3D,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEM,yCAAiB,GAAxB;QACE,IAAA,uBAAU,EAAC,8BAAW,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IACtE,CAAC;IAEM,wCAAgB,GAAvB,UAAwB,OAAwB;QAC9C,IAAA,oBAAO,EAAC,8BAAW,EAAE,IAAA,iCAAqB,EAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IACnG,CAAC;IAEM,wCAAgB,GAAvB;QACE,IAAM,aAAa,GAAG,IAAA,oBAAO,EAAC,8BAAW,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;QAEvF,IAAI,aAAa,EAAE;
|
|
1
|
+
{"version":3,"file":"VolatileSessionManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/VolatileSessionManager.ts"],"names":[],"mappings":";;;AAAA,gDAAiE;AAEjE,wCAA0C;AAC1C,wDAAyF;AAEzF,uDAAuE;AACvE,6DAA2F;AAG3F;IAIE;QAAA,iBAOC;QAoBD,kBAAa,GAAG,IAAA,gBAAQ,EAAC,cAAM,OAAA,KAAI,CAAC,iBAAiB,EAAE,EAAxB,CAAwB,EAAE,uCAAoB,CAAC,CAAC;QA1B7E,IAAI,CAAC,iBAAiB,GAAG,IAAA,2CAAqB,EAAC;YAC7C,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB;YAC1D,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB;SAC3D,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEM,yCAAiB,GAAxB;QACE,IAAA,uBAAU,EAAC,8BAAW,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IACtE,CAAC;IAEM,wCAAgB,GAAvB,UAAwB,OAAwB;QAC9C,IAAA,oBAAO,EAAC,8BAAW,EAAE,IAAA,iCAAqB,EAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IACnG,CAAC;IAEM,wCAAgB,GAAvB;QACE,IAAM,aAAa,GAAG,IAAA,oBAAO,EAAC,8BAAW,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;QAEvF,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAoB,CAAC;QACtD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAIO,sCAAI,GAAZ;QAAA,iBAcC;QAbC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE;YAC5C,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBAC3C,KAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,iGAAiG;QACjG,gBAAI,CAAC,KAAK,CAAC,WAAW,CACpB,IAAA,iDAA2B,EAAC;YAC1B,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB;YAC1D,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB;SAC3D,CAAC,CACH,CAAC;IACJ,CAAC;IA9Cc,0CAAkB,GAAG,2BAAc,CAAC,OAAO,AAAzB,CAA0B;IA+C7D,8BAAC;CAAA,AAhDD,IAgDC;AAhDY,0DAAuB","sourcesContent":["import { faro, stringifyExternalJson } from '@grafana/faro-core';\n\nimport { throttle } from '../../../utils';\nimport { getItem, removeItem, setItem, webStorageType } from '../../../utils/webStorage';\n\nimport { STORAGE_KEY, STORAGE_UPDATE_DELAY } from './sessionConstants';\nimport { getSessionMetaUpdateHandler, getUserSessionUpdater } from './sessionManagerUtils';\nimport type { FaroUserSession } from './types';\n\nexport class VolatileSessionsManager {\n private static storageTypeSession = webStorageType.session;\n private updateUserSession: ReturnType<typeof getUserSessionUpdater>;\n\n constructor() {\n this.updateUserSession = getUserSessionUpdater({\n fetchUserSession: VolatileSessionsManager.fetchUserSession,\n storeUserSession: VolatileSessionsManager.storeUserSession,\n });\n\n this.init();\n }\n\n static removeUserSession() {\n removeItem(STORAGE_KEY, VolatileSessionsManager.storageTypeSession);\n }\n\n static storeUserSession(session: FaroUserSession): void {\n setItem(STORAGE_KEY, stringifyExternalJson(session), VolatileSessionsManager.storageTypeSession);\n }\n\n static fetchUserSession(): FaroUserSession | null {\n const storedSession = getItem(STORAGE_KEY, VolatileSessionsManager.storageTypeSession);\n\n if (storedSession) {\n return JSON.parse(storedSession) as FaroUserSession;\n }\n\n return null;\n }\n\n updateSession = throttle(() => this.updateUserSession(), STORAGE_UPDATE_DELAY);\n\n private init(): void {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n this.updateSession();\n }\n });\n\n // Users can call the setSession() method, so we need to sync this with the local storage session\n faro.metas.addListener(\n getSessionMetaUpdateHandler({\n fetchUserSession: VolatileSessionsManager.fetchUserSession,\n storeUserSession: VolatileSessionsManager.storeUserSession,\n })\n );\n }\n}\n"]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSessionManagerByConfig =
|
|
3
|
+
exports.getSessionManagerByConfig = getSessionManagerByConfig;
|
|
4
4
|
var PersistentSessionsManager_1 = require("./PersistentSessionsManager");
|
|
5
5
|
var VolatileSessionManager_1 = require("./VolatileSessionManager");
|
|
6
6
|
function getSessionManagerByConfig(sessionTrackingConfig) {
|
|
7
7
|
return (sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.persistent) ? PersistentSessionsManager_1.PersistentSessionsManager : VolatileSessionManager_1.VolatileSessionsManager;
|
|
8
8
|
}
|
|
9
|
-
exports.getSessionManagerByConfig = getSessionManagerByConfig;
|
|
10
9
|
//# sourceMappingURL=getSessionManagerByConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSessionManagerByConfig.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/getSessionManagerByConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getSessionManagerByConfig.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/getSessionManagerByConfig.ts"],"names":[],"mappings":";;AAMA,8DAEC;AAND,yEAAwE;AAExE,mEAAmE;AAEnE,SAAgB,yBAAyB,CAAC,qBAAgD;IACxF,OAAO,CAAA,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,UAAU,EAAC,CAAC,CAAC,qDAAyB,CAAC,CAAC,CAAC,gDAAuB,CAAC;AACjG,CAAC","sourcesContent":["import type { Config } from '@grafana/faro-core';\n\nimport { PersistentSessionsManager } from './PersistentSessionsManager';\nimport type { SessionManager } from './types';\nimport { VolatileSessionsManager } from './VolatileSessionManager';\n\nexport function getSessionManagerByConfig(sessionTrackingConfig: Config['sessionTracking']): SessionManager {\n return sessionTrackingConfig?.persistent ? PersistentSessionsManager : VolatileSessionsManager;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isSampled =
|
|
3
|
+
exports.isSampled = isSampled;
|
|
4
4
|
var faro_core_1 = require("@grafana/faro-core");
|
|
5
5
|
function isSampled() {
|
|
6
6
|
var _a, _b, _c;
|
|
@@ -13,5 +13,4 @@ function isSampled() {
|
|
|
13
13
|
}
|
|
14
14
|
return Math.random() < samplingRate;
|
|
15
15
|
}
|
|
16
|
-
exports.isSampled = isSampled;
|
|
17
16
|
//# sourceMappingURL=sampling.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sampling.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sampling.ts"],"names":[],"mappings":";;AAEA,8BAYC;AAdD,gDAA0C;AAE1C,SAAgB,SAAS;;IACvB,IAAM,cAAc,GAAG,CAAC,CAAC;IACzB,IAAM,eAAe,GAAG,gBAAI,CAAC,MAAM,CAAC,eAAe,CAAC;IACpD,IAAI,YAAY,GACd,MAAA,MAAA,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,OAAO,gEAAG,EAAE,KAAK,EAAE,gBAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,mCAAI,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,YAAY,mCAAI,cAAc,CAAC;IAE7G,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrC,IAAM,aAAa,GAAG,CAAC,CAAC;QACxB,YAAY,GAAG,aAAa,CAAC;IAC/B,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC;AACtC,CAAC","sourcesContent":["import { faro } from '@grafana/faro-core';\n\nexport function isSampled(): boolean {\n const sendAllSignals = 1;\n const sessionTracking = faro.config.sessionTracking;\n let samplingRate =\n sessionTracking?.sampler?.({ metas: faro.metas.value }) ?? sessionTracking?.samplingRate ?? sendAllSignals;\n\n if (typeof samplingRate !== 'number') {\n const sendNoSignals = 0;\n samplingRate = sendNoSignals;\n }\n\n return Math.random() < samplingRate;\n}\n"]}
|
|
@@ -11,7 +11,11 @@ var __assign = (this && this.__assign) || function () {
|
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.
|
|
14
|
+
exports.createUserSessionObject = createUserSessionObject;
|
|
15
|
+
exports.isUserSessionValid = isUserSessionValid;
|
|
16
|
+
exports.getUserSessionUpdater = getUserSessionUpdater;
|
|
17
|
+
exports.addSessionMetadataToNextSession = addSessionMetadataToNextSession;
|
|
18
|
+
exports.getSessionMetaUpdateHandler = getSessionMetaUpdateHandler;
|
|
15
19
|
var faro_core_1 = require("@grafana/faro-core");
|
|
16
20
|
var utils_1 = require("../../../utils");
|
|
17
21
|
var sampling_1 = require("./sampling");
|
|
@@ -31,7 +35,6 @@ function createUserSessionObject(_a) {
|
|
|
31
35
|
isSampled: isSampled,
|
|
32
36
|
};
|
|
33
37
|
}
|
|
34
|
-
exports.createUserSessionObject = createUserSessionObject;
|
|
35
38
|
function isUserSessionValid(session) {
|
|
36
39
|
if (session == null) {
|
|
37
40
|
return false;
|
|
@@ -44,7 +47,6 @@ function isUserSessionValid(session) {
|
|
|
44
47
|
var inactivityPeriodValid = now - session.lastActivity < sessionConstants_1.SESSION_INACTIVITY_TIME;
|
|
45
48
|
return inactivityPeriodValid;
|
|
46
49
|
}
|
|
47
|
-
exports.isUserSessionValid = isUserSessionValid;
|
|
48
50
|
function getUserSessionUpdater(_a) {
|
|
49
51
|
var fetchUserSession = _a.fetchUserSession, storeUserSession = _a.storeUserSession;
|
|
50
52
|
return function updateSession(_a) {
|
|
@@ -70,7 +72,6 @@ function getUserSessionUpdater(_a) {
|
|
|
70
72
|
}
|
|
71
73
|
};
|
|
72
74
|
}
|
|
73
|
-
exports.getUserSessionUpdater = getUserSessionUpdater;
|
|
74
75
|
function addSessionMetadataToNextSession(newSession, previousSession) {
|
|
75
76
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
76
77
|
var sessionWithMeta = __assign(__assign({}, newSession), { sessionMeta: {
|
|
@@ -87,7 +88,6 @@ function addSessionMetadataToNextSession(newSession, previousSession) {
|
|
|
87
88
|
}
|
|
88
89
|
return sessionWithMeta;
|
|
89
90
|
}
|
|
90
|
-
exports.addSessionMetadataToNextSession = addSessionMetadataToNextSession;
|
|
91
91
|
function getSessionMetaUpdateHandler(_a) {
|
|
92
92
|
var fetchUserSession = _a.fetchUserSession, storeUserSession = _a.storeUserSession;
|
|
93
93
|
return function syncSessionIfChangedExternally(meta) {
|
|
@@ -109,7 +109,6 @@ function getSessionMetaUpdateHandler(_a) {
|
|
|
109
109
|
}
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
|
-
exports.getSessionMetaUpdateHandler = getSessionMetaUpdateHandler;
|
|
113
112
|
function sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides, storedSessionOverrides) {
|
|
114
113
|
var _a, _b, _c;
|
|
115
114
|
if (sessionOverrides === void 0) { sessionOverrides = {}; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionManagerUtils.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sessionManagerUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { dateNow, deepEqual, EVENT_OVERRIDES_SERVICE_NAME, faro, genShortID, isEmpty, Meta } from '@grafana/faro-core';\nimport type { MetaOverrides } from '@grafana/faro-core';\n\nimport { isLocalStorageAvailable, isSessionStorageAvailable } from '../../../utils';\n\nimport { isSampled } from './sampling';\nimport { SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME } from './sessionConstants';\nimport type { FaroUserSession } from './types';\n\ntype CreateUserSessionObjectParams = {\n sessionId?: string;\n started?: number;\n lastActivity?: number;\n isSampled?: boolean;\n};\n\nexport function createUserSessionObject({\n sessionId,\n started,\n lastActivity,\n isSampled = true,\n}: CreateUserSessionObjectParams = {}): FaroUserSession {\n const now = dateNow();\n\n const generateSessionId = faro.config?.sessionTracking?.generateSessionId;\n\n if (sessionId == null) {\n sessionId = typeof generateSessionId === 'function' ? generateSessionId() : genShortID();\n }\n\n return {\n sessionId,\n lastActivity: lastActivity ?? now,\n started: started ?? now,\n isSampled: isSampled,\n };\n}\n\nexport function isUserSessionValid(session: FaroUserSession | null): boolean {\n if (session == null) {\n return false;\n }\n\n const now = dateNow();\n const lifetimeValid = now - session.started < SESSION_EXPIRATION_TIME;\n\n if (!lifetimeValid) {\n return false;\n }\n\n const inactivityPeriodValid = now - session.lastActivity < SESSION_INACTIVITY_TIME;\n return inactivityPeriodValid;\n}\n\ntype GetUserSessionUpdaterParams = {\n storeUserSession: (session: FaroUserSession) => void;\n fetchUserSession: () => FaroUserSession | null;\n};\n\ntype UpdateSessionParams = { forceSessionExtend: boolean };\n\nexport function getUserSessionUpdater({\n fetchUserSession,\n storeUserSession,\n}: GetUserSessionUpdaterParams): (options?: UpdateSessionParams) => void {\n return function updateSession({ forceSessionExtend } = { forceSessionExtend: false }): void {\n if (!fetchUserSession || !storeUserSession) {\n return;\n }\n\n const sessionTrackingConfig = faro.config.sessionTracking;\n const isPersistentSessions = sessionTrackingConfig?.persistent;\n\n if ((isPersistentSessions && !isLocalStorageAvailable) || (!isPersistentSessions && !isSessionStorageAvailable)) {\n return;\n }\n\n const sessionFromStorage = fetchUserSession();\n\n if (forceSessionExtend === false && isUserSessionValid(sessionFromStorage)) {\n storeUserSession({ ...sessionFromStorage!, lastActivity: dateNow() });\n } else {\n let newSession = addSessionMetadataToNextSession(\n createUserSessionObject({ isSampled: isSampled() }),\n sessionFromStorage\n );\n\n storeUserSession(newSession);\n\n faro.api?.setSession(newSession.sessionMeta);\n sessionTrackingConfig?.onSessionChange?.(sessionFromStorage?.sessionMeta ?? null, newSession.sessionMeta!);\n }\n };\n}\n\nexport function addSessionMetadataToNextSession(newSession: FaroUserSession, previousSession: FaroUserSession | null) {\n const sessionWithMeta: Required<FaroUserSession> = {\n ...newSession,\n sessionMeta: {\n id: newSession.sessionId,\n attributes: {\n ...faro.config.sessionTracking?.session?.attributes,\n ...(faro.metas.value.session?.attributes ?? {}),\n isSampled: newSession.isSampled.toString(),\n },\n },\n };\n\n const overrides = faro.metas.value.session?.overrides ?? previousSession?.sessionMeta?.overrides;\n if (!isEmpty(overrides)) {\n sessionWithMeta.sessionMeta.overrides = overrides;\n }\n\n const previousSessionId = previousSession?.sessionId;\n if (previousSessionId != null) {\n sessionWithMeta.sessionMeta.attributes!['previousSession'] = previousSessionId;\n }\n\n return sessionWithMeta;\n}\n\ntype GetUserSessionMetaUpdateHandlerParams = {\n storeUserSession: (session: FaroUserSession) => void;\n fetchUserSession: () => FaroUserSession | null;\n};\n\nexport function getSessionMetaUpdateHandler({\n fetchUserSession,\n storeUserSession,\n}: GetUserSessionMetaUpdateHandlerParams) {\n return function syncSessionIfChangedExternally(meta: Meta) {\n const session = meta.session;\n const sessionFromSessionStorage = fetchUserSession();\n\n let sessionId = session?.id;\n const sessionAttributes = session?.attributes;\n const sessionOverrides = session?.overrides;\n\n const storedSessionMeta = sessionFromSessionStorage?.sessionMeta;\n const storedSessionMetaOverrides = storedSessionMeta?.overrides;\n\n const hasSessionOverridesChanged = !!sessionOverrides && !deepEqual(sessionOverrides, storedSessionMetaOverrides);\n const hasAttributesChanged = !!sessionAttributes && !deepEqual(sessionAttributes, storedSessionMeta?.attributes);\n const hasSessionIdChanged = !!session && sessionId !== sessionFromSessionStorage?.sessionId;\n\n if (hasSessionIdChanged || hasAttributesChanged || hasSessionOverridesChanged) {\n const userSession = addSessionMetadataToNextSession(\n createUserSessionObject({ sessionId, isSampled: isSampled() }),\n sessionFromSessionStorage\n );\n\n storeUserSession(userSession);\n sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides, storedSessionMetaOverrides);\n faro.api.setSession(userSession.sessionMeta);\n }\n };\n}\n\nfunction sendOverrideEvent(\n hasSessionOverridesChanged: boolean,\n sessionOverrides: MetaOverrides = {},\n storedSessionOverrides: MetaOverrides = {}\n) {\n if (!hasSessionOverridesChanged) {\n return;\n }\n\n const serviceName = sessionOverrides.serviceName;\n const previousServiceName = storedSessionOverrides.serviceName ?? faro.metas.value.app?.name ?? '';\n\n if (serviceName && serviceName !== previousServiceName) {\n faro.api.pushEvent(EVENT_OVERRIDES_SERVICE_NAME, {\n serviceName,\n previousServiceName,\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sessionManagerUtils.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sessionManagerUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { dateNow, deepEqual, EVENT_OVERRIDES_SERVICE_NAME, faro, genShortID, isEmpty } from '@grafana/faro-core';\nimport type { Meta, MetaOverrides } from '@grafana/faro-core';\n\nimport { isLocalStorageAvailable, isSessionStorageAvailable } from '../../../utils';\n\nimport { isSampled } from './sampling';\nimport { SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME } from './sessionConstants';\nimport type { FaroUserSession } from './types';\n\ntype CreateUserSessionObjectParams = {\n sessionId?: string;\n started?: number;\n lastActivity?: number;\n isSampled?: boolean;\n};\n\nexport function createUserSessionObject({\n sessionId,\n started,\n lastActivity,\n isSampled = true,\n}: CreateUserSessionObjectParams = {}): FaroUserSession {\n const now = dateNow();\n\n const generateSessionId = faro.config?.sessionTracking?.generateSessionId;\n\n if (sessionId == null) {\n sessionId = typeof generateSessionId === 'function' ? generateSessionId() : genShortID();\n }\n\n return {\n sessionId,\n lastActivity: lastActivity ?? now,\n started: started ?? now,\n isSampled: isSampled,\n };\n}\n\nexport function isUserSessionValid(session: FaroUserSession | null): boolean {\n if (session == null) {\n return false;\n }\n\n const now = dateNow();\n const lifetimeValid = now - session.started < SESSION_EXPIRATION_TIME;\n\n if (!lifetimeValid) {\n return false;\n }\n\n const inactivityPeriodValid = now - session.lastActivity < SESSION_INACTIVITY_TIME;\n return inactivityPeriodValid;\n}\n\ntype GetUserSessionUpdaterParams = {\n storeUserSession: (session: FaroUserSession) => void;\n fetchUserSession: () => FaroUserSession | null;\n};\n\ntype UpdateSessionParams = { forceSessionExtend: boolean };\n\nexport function getUserSessionUpdater({\n fetchUserSession,\n storeUserSession,\n}: GetUserSessionUpdaterParams): (options?: UpdateSessionParams) => void {\n return function updateSession({ forceSessionExtend } = { forceSessionExtend: false }): void {\n if (!fetchUserSession || !storeUserSession) {\n return;\n }\n\n const sessionTrackingConfig = faro.config.sessionTracking;\n const isPersistentSessions = sessionTrackingConfig?.persistent;\n\n if ((isPersistentSessions && !isLocalStorageAvailable) || (!isPersistentSessions && !isSessionStorageAvailable)) {\n return;\n }\n\n const sessionFromStorage = fetchUserSession();\n\n if (forceSessionExtend === false && isUserSessionValid(sessionFromStorage)) {\n storeUserSession({ ...sessionFromStorage!, lastActivity: dateNow() });\n } else {\n let newSession = addSessionMetadataToNextSession(\n createUserSessionObject({ isSampled: isSampled() }),\n sessionFromStorage\n );\n\n storeUserSession(newSession);\n\n faro.api?.setSession(newSession.sessionMeta);\n sessionTrackingConfig?.onSessionChange?.(sessionFromStorage?.sessionMeta ?? null, newSession.sessionMeta!);\n }\n };\n}\n\nexport function addSessionMetadataToNextSession(newSession: FaroUserSession, previousSession: FaroUserSession | null) {\n const sessionWithMeta: Required<FaroUserSession> = {\n ...newSession,\n sessionMeta: {\n id: newSession.sessionId,\n attributes: {\n ...faro.config.sessionTracking?.session?.attributes,\n ...(faro.metas.value.session?.attributes ?? {}),\n isSampled: newSession.isSampled.toString(),\n },\n },\n };\n\n const overrides = faro.metas.value.session?.overrides ?? previousSession?.sessionMeta?.overrides;\n if (!isEmpty(overrides)) {\n sessionWithMeta.sessionMeta.overrides = overrides;\n }\n\n const previousSessionId = previousSession?.sessionId;\n if (previousSessionId != null) {\n sessionWithMeta.sessionMeta.attributes!['previousSession'] = previousSessionId;\n }\n\n return sessionWithMeta;\n}\n\ntype GetUserSessionMetaUpdateHandlerParams = {\n storeUserSession: (session: FaroUserSession) => void;\n fetchUserSession: () => FaroUserSession | null;\n};\n\nexport function getSessionMetaUpdateHandler({\n fetchUserSession,\n storeUserSession,\n}: GetUserSessionMetaUpdateHandlerParams) {\n return function syncSessionIfChangedExternally(meta: Meta) {\n const session = meta.session;\n const sessionFromSessionStorage = fetchUserSession();\n\n let sessionId = session?.id;\n const sessionAttributes = session?.attributes;\n const sessionOverrides = session?.overrides;\n\n const storedSessionMeta = sessionFromSessionStorage?.sessionMeta;\n const storedSessionMetaOverrides = storedSessionMeta?.overrides;\n\n const hasSessionOverridesChanged = !!sessionOverrides && !deepEqual(sessionOverrides, storedSessionMetaOverrides);\n const hasAttributesChanged = !!sessionAttributes && !deepEqual(sessionAttributes, storedSessionMeta?.attributes);\n const hasSessionIdChanged = !!session && sessionId !== sessionFromSessionStorage?.sessionId;\n\n if (hasSessionIdChanged || hasAttributesChanged || hasSessionOverridesChanged) {\n const userSession = addSessionMetadataToNextSession(\n createUserSessionObject({ sessionId, isSampled: isSampled() }),\n sessionFromSessionStorage\n );\n\n storeUserSession(userSession);\n sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides, storedSessionMetaOverrides);\n faro.api.setSession(userSession.sessionMeta);\n }\n };\n}\n\nfunction sendOverrideEvent(\n hasSessionOverridesChanged: boolean,\n sessionOverrides: MetaOverrides = {},\n storedSessionOverrides: MetaOverrides = {}\n) {\n if (!hasSessionOverridesChanged) {\n return;\n }\n\n const serviceName = sessionOverrides.serviceName;\n const previousServiceName = storedSessionOverrides.serviceName ?? faro.metas.value.app?.name ?? '';\n\n if (serviceName && serviceName !== previousServiceName) {\n faro.api.pushEvent(EVENT_OVERRIDES_SERVICE_NAME, {\n serviceName,\n previousServiceName,\n });\n }\n}\n"]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.userActionDataAttribute = exports.userActionDataAttributeParsed = exports.MESSAGE_TYPE_DOM_MUTATION = exports.
|
|
3
|
+
exports.userActionDataAttribute = exports.userActionDataAttributeParsed = exports.MESSAGE_TYPE_DOM_MUTATION = exports.MESSAGE_TYPE_HTTP_REQUEST_END = exports.MESSAGE_TYPE_HTTP_REQUEST_START = exports.MESSAGE_TYPE_RESOURCE_ENTRY = void 0;
|
|
4
4
|
exports.MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';
|
|
5
5
|
exports.MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';
|
|
6
6
|
exports.MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';
|
|
7
|
-
exports.MESSAGE_TYPE_HTTP_REQUEST_PENDING = 'http-request-pending';
|
|
8
7
|
exports.MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';
|
|
9
8
|
exports.userActionDataAttributeParsed = 'faroUserActionName';
|
|
10
9
|
exports.userActionDataAttribute = 'data-faro-user-action-name';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,2BAA2B,GAAG,gBAAgB,CAAC;AAC/C,QAAA,+BAA+B,GAAG,oBAAoB,CAAC;AACvD,QAAA,6BAA6B,GAAG,kBAAkB,CAAC;AACnD,QAAA,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,2BAA2B,GAAG,gBAAgB,CAAC;AAC/C,QAAA,+BAA+B,GAAG,oBAAoB,CAAC;AACvD,QAAA,6BAA6B,GAAG,kBAAkB,CAAC;AACnD,QAAA,yBAAyB,GAAG,cAAc,CAAC;AAE3C,QAAA,6BAA6B,GAAG,oBAAoB,CAAC;AACrD,QAAA,uBAAuB,GAAG,4BAA4B,CAAC","sourcesContent":["export const MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';\nexport const MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';\nexport const MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';\nexport const MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';\n\nexport const userActionDataAttributeParsed = 'faroUserActionName';\nexport const userActionDataAttribute = 'data-faro-user-action-name';\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.monitorDomMutations =
|
|
3
|
+
exports.monitorDomMutations = monitorDomMutations;
|
|
4
4
|
var faro_core_1 = require("@grafana/faro-core");
|
|
5
5
|
var const_1 = require("./const");
|
|
6
6
|
function monitorDomMutations() {
|
|
@@ -16,5 +16,4 @@ function monitorDomMutations() {
|
|
|
16
16
|
});
|
|
17
17
|
return observable;
|
|
18
18
|
}
|
|
19
|
-
exports.monitorDomMutations = monitorDomMutations;
|
|
20
19
|
//# sourceMappingURL=domMutationMonitor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domMutationMonitor.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/domMutationMonitor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"domMutationMonitor.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/domMutationMonitor.ts"],"names":[],"mappings":";;AAKA,kDAeC;AApBD,gDAAgD;AAEhD,iCAAoD;AAGpD,SAAgB,mBAAmB;IACjC,IAAM,UAAU,GAAG,IAAI,sBAAU,EAAsB,CAAC;IAExD,IAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,UAAC,cAAc,EAAE,SAAS;QAC9D,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,iCAAyB,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE;QACzB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_DOM_MUTATION } from './const';\nimport type { DomMutationMessage } from './types';\n\nexport function monitorDomMutations(): Observable {\n const observable = new Observable<DomMutationMessage>();\n\n const observer = new MutationObserver((_mutationsList, _observer) => {\n observable.notify({ type: MESSAGE_TYPE_DOM_MUTATION });\n });\n\n observer.observe(document, {\n attributes: true,\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n return observable;\n}\n"]}
|