@grafana/faro-web-sdk 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/faro-web-sdk.iife.js +1 -1
- package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/csp/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/navigation/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
- package/dist/bundle/types/transports/console/transport.d.ts +1 -1
- package/dist/bundle/types/transports/fetch/transport.d.ts +1 -1
- package/dist/cjs/config/getWebInstrumentations.js +3 -4
- package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
- package/dist/cjs/config/makeCoreConfig.js +48 -60
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/initialize.js +3 -3
- package/dist/cjs/initialize.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js +44 -65
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js +11 -17
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js +5 -5
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js +28 -30
- package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js +7 -7
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js +8 -8
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js +24 -32
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/console/instrumentation.js +29 -49
- package/dist/cjs/instrumentations/console/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/csp/instrumentation.js +14 -32
- package/dist/cjs/instrumentations/csp/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/errors/getErrorDetails.js +23 -23
- package/dist/cjs/instrumentations/errors/getErrorDetails.js.map +1 -1
- package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js +5 -5
- package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js.map +1 -1
- package/dist/cjs/instrumentations/errors/instrumentation.js +11 -29
- package/dist/cjs/instrumentations/errors/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/errors/registerOnerror.js +6 -10
- package/dist/cjs/instrumentations/errors/registerOnerror.js.map +1 -1
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js +16 -17
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js +2 -2
- package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js +4 -4
- package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js +16 -17
- package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js.map +1 -1
- package/dist/cjs/instrumentations/navigation/instrumentation.js +27 -45
- package/dist/cjs/instrumentations/navigation/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/instrumentation.js +19 -74
- package/dist/cjs/instrumentations/performance/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/navigation.js +15 -26
- package/dist/cjs/instrumentations/performance/navigation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/performanceUtils.js +18 -33
- package/dist/cjs/instrumentations/performance/performanceUtils.js.map +1 -1
- package/dist/cjs/instrumentations/performance/resource.js +13 -25
- package/dist/cjs/instrumentations/performance/resource.js.map +1 -1
- package/dist/cjs/instrumentations/session/instrumentation.js +45 -74
- package/dist/cjs/instrumentations/session/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js +21 -24
- package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js +21 -24
- package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js +2 -2
- package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/sampling.js +5 -5
- package/dist/cjs/instrumentations/session/sessionManager/sampling.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js +64 -61
- package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/instrumentation.js +15 -34
- package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +11 -11
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/userActionController.js +49 -53
- package/dist/cjs/instrumentations/userActions/userActionController.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/util.js +4 -4
- package/dist/cjs/instrumentations/userActions/util.js.map +1 -1
- package/dist/cjs/instrumentations/view/instrumentation.js +12 -30
- package/dist/cjs/instrumentations/view/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/instrumentation.js +11 -29
- package/dist/cjs/instrumentations/webVitals/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js +87 -94
- package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
- package/dist/cjs/metas/browser/meta.js +14 -14
- package/dist/cjs/metas/browser/meta.js.map +1 -1
- package/dist/cjs/metas/k6/meta.js +3 -14
- package/dist/cjs/metas/k6/meta.js.map +1 -1
- package/dist/cjs/metas/page/meta.js +7 -19
- package/dist/cjs/metas/page/meta.js.map +1 -1
- package/dist/cjs/metas/sdk/meta.js +3 -3
- package/dist/cjs/metas/sdk/meta.js.map +1 -1
- package/dist/cjs/metas/session/createSession.js +2 -2
- package/dist/cjs/metas/session/createSession.js.map +1 -1
- package/dist/cjs/transports/console/transport.js +10 -29
- package/dist/cjs/transports/console/transport.js.map +1 -1
- package/dist/cjs/transports/fetch/transport.js +82 -176
- package/dist/cjs/transports/fetch/transport.js.map +1 -1
- package/dist/cjs/utils/throttle.js +6 -10
- package/dist/cjs/utils/throttle.js.map +1 -1
- package/dist/cjs/utils/url.js +4 -5
- package/dist/cjs/utils/url.js.map +1 -1
- package/dist/cjs/utils/webStorage.js +4 -4
- package/dist/cjs/utils/webStorage.js.map +1 -1
- package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js +0 -1
- package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -1
- package/dist/esm/instrumentations/errors/getErrorDetails.js +1 -0
- package/dist/esm/instrumentations/errors/getErrorDetails.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js +22 -2
- package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
- package/dist/esm/transports/fetch/transport.js +1 -1
- package/dist/esm/transports/fetch/transport.js.map +1 -1
- package/dist/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/csp/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/navigation/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/package.json +9 -6
|
@@ -1,48 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __assign = (this && this.__assign) || function () {
|
|
18
|
-
__assign = Object.assign || function(t) {
|
|
19
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
20
|
-
s = arguments[i];
|
|
21
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
22
|
-
t[p] = s[p];
|
|
23
|
-
}
|
|
24
|
-
return t;
|
|
25
|
-
};
|
|
26
|
-
return __assign.apply(this, arguments);
|
|
27
|
-
};
|
|
28
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
3
|
exports.SessionInstrumentation = void 0;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
_this.version = faro_core_1.VERSION;
|
|
41
|
-
return _this;
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
const metas_1 = require("../../metas");
|
|
6
|
+
const sessionManager_1 = require("./sessionManager");
|
|
7
|
+
const PersistentSessionsManager_1 = require("./sessionManager/PersistentSessionsManager");
|
|
8
|
+
const sessionManagerUtils_1 = require("./sessionManager/sessionManagerUtils");
|
|
9
|
+
class SessionInstrumentation extends faro_core_1.BaseInstrumentation {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
|
+
this.name = '@grafana/faro-web-sdk:instrumentation-session';
|
|
13
|
+
this.version = faro_core_1.VERSION;
|
|
42
14
|
}
|
|
43
|
-
|
|
15
|
+
sendSessionStartEvent(meta) {
|
|
44
16
|
var _a, _b;
|
|
45
|
-
|
|
17
|
+
const session = meta.session;
|
|
46
18
|
if (session && session.id !== ((_a = this.notifiedSession) === null || _a === void 0 ? void 0 : _a.id)) {
|
|
47
19
|
if (this.notifiedSession && this.notifiedSession.id === ((_b = session.attributes) === null || _b === void 0 ? void 0 : _b['previousSession'])) {
|
|
48
20
|
this.api.pushEvent(faro_core_1.EVENT_SESSION_EXTEND, {}, undefined, { skipDedupe: true });
|
|
@@ -54,58 +26,58 @@ var SessionInstrumentation = /** @class */ (function (_super) {
|
|
|
54
26
|
// automatically
|
|
55
27
|
this.api.pushEvent(faro_core_1.EVENT_SESSION_START, {}, undefined, { skipDedupe: true });
|
|
56
28
|
}
|
|
57
|
-
}
|
|
58
|
-
|
|
29
|
+
}
|
|
30
|
+
createInitialSession(SessionManager, sessionsConfig) {
|
|
59
31
|
var _a, _b, _c, _d, _e, _f;
|
|
60
|
-
|
|
32
|
+
let storedUserSession = SessionManager.fetchUserSession();
|
|
61
33
|
if (sessionsConfig.persistent && sessionsConfig.maxSessionPersistenceTime && storedUserSession) {
|
|
62
|
-
|
|
63
|
-
|
|
34
|
+
const now = (0, faro_core_1.dateNow)();
|
|
35
|
+
const shouldClearPersistentSession = storedUserSession.lastActivity < now - sessionsConfig.maxSessionPersistenceTime;
|
|
64
36
|
if (shouldClearPersistentSession) {
|
|
65
37
|
PersistentSessionsManager_1.PersistentSessionsManager.removeUserSession();
|
|
66
38
|
storedUserSession = null;
|
|
67
39
|
}
|
|
68
40
|
}
|
|
69
|
-
|
|
70
|
-
|
|
41
|
+
let lifecycleType;
|
|
42
|
+
let initialSession;
|
|
71
43
|
if ((0, sessionManagerUtils_1.isUserSessionValid)(storedUserSession)) {
|
|
72
|
-
|
|
44
|
+
const sessionId = storedUserSession === null || storedUserSession === void 0 ? void 0 : storedUserSession.sessionId;
|
|
73
45
|
initialSession = (0, sessionManagerUtils_1.createUserSessionObject)({
|
|
74
|
-
sessionId
|
|
46
|
+
sessionId,
|
|
75
47
|
isSampled: storedUserSession.isSampled || false,
|
|
76
48
|
started: storedUserSession === null || storedUserSession === void 0 ? void 0 : storedUserSession.started,
|
|
77
49
|
});
|
|
78
|
-
|
|
50
|
+
const storedUserSessionMeta = storedUserSession === null || storedUserSession === void 0 ? void 0 : storedUserSession.sessionMeta;
|
|
79
51
|
// For resumed sessions we want to merge the previous overrides with the configured ones.
|
|
80
52
|
// If the same key is present in both, the new one will override the old one.
|
|
81
|
-
|
|
82
|
-
initialSession.sessionMeta =
|
|
53
|
+
const overrides = Object.assign(Object.assign({}, (_a = sessionsConfig.session) === null || _a === void 0 ? void 0 : _a.overrides), storedUserSessionMeta === null || storedUserSessionMeta === void 0 ? void 0 : storedUserSessionMeta.overrides);
|
|
54
|
+
initialSession.sessionMeta = Object.assign(Object.assign({}, sessionsConfig.session), { id: sessionId, attributes: Object.assign(Object.assign(Object.assign({}, (_b = sessionsConfig.session) === null || _b === void 0 ? void 0 : _b.attributes), storedUserSessionMeta === null || storedUserSessionMeta === void 0 ? void 0 : storedUserSessionMeta.attributes), {
|
|
83
55
|
// For valid resumed sessions we do not want to recalculate the sampling decision on each init phase.
|
|
84
|
-
isSampled: initialSession.isSampled.toString() }), overrides
|
|
56
|
+
isSampled: initialSession.isSampled.toString() }), overrides });
|
|
85
57
|
lifecycleType = faro_core_1.EVENT_SESSION_RESUME;
|
|
86
58
|
}
|
|
87
59
|
else {
|
|
88
|
-
|
|
60
|
+
const sessionId = (_d = (_c = sessionsConfig.session) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : (0, metas_1.createSession)().id;
|
|
89
61
|
initialSession = (0, sessionManagerUtils_1.createUserSessionObject)({
|
|
90
|
-
sessionId
|
|
62
|
+
sessionId,
|
|
91
63
|
isSampled: (0, sessionManager_1.isSampled)(),
|
|
92
64
|
});
|
|
93
|
-
|
|
94
|
-
initialSession.sessionMeta =
|
|
65
|
+
const overrides = (_e = sessionsConfig.session) === null || _e === void 0 ? void 0 : _e.overrides;
|
|
66
|
+
initialSession.sessionMeta = Object.assign({ id: sessionId, attributes: Object.assign({ isSampled: initialSession.isSampled.toString() }, (_f = sessionsConfig.session) === null || _f === void 0 ? void 0 : _f.attributes) }, (overrides ? { overrides } : {}));
|
|
95
67
|
lifecycleType = faro_core_1.EVENT_SESSION_START;
|
|
96
68
|
}
|
|
97
|
-
return { initialSession
|
|
98
|
-
}
|
|
99
|
-
|
|
69
|
+
return { initialSession, lifecycleType };
|
|
70
|
+
}
|
|
71
|
+
registerBeforeSendHook(SessionManager) {
|
|
100
72
|
var _a;
|
|
101
|
-
|
|
102
|
-
(_a = this.transports) === null || _a === void 0 ? void 0 : _a.addBeforeSendHooks(
|
|
73
|
+
const { updateSession } = new SessionManager();
|
|
74
|
+
(_a = this.transports) === null || _a === void 0 ? void 0 : _a.addBeforeSendHooks((item) => {
|
|
103
75
|
var _a, _b, _c;
|
|
104
76
|
updateSession();
|
|
105
|
-
|
|
77
|
+
const attributes = (_a = item.meta.session) === null || _a === void 0 ? void 0 : _a.attributes;
|
|
106
78
|
if (attributes && (attributes === null || attributes === void 0 ? void 0 : attributes['isSampled']) === 'true') {
|
|
107
|
-
|
|
108
|
-
|
|
79
|
+
let newItem = JSON.parse(JSON.stringify(item));
|
|
80
|
+
const newAttributes = (_b = newItem.meta.session) === null || _b === void 0 ? void 0 : _b.attributes;
|
|
109
81
|
newAttributes === null || newAttributes === void 0 ? true : delete newAttributes['isSampled'];
|
|
110
82
|
if (Object.keys(newAttributes !== null && newAttributes !== void 0 ? newAttributes : {}).length === 0) {
|
|
111
83
|
(_c = newItem.meta.session) === null || _c === void 0 ? true : delete _c.attributes;
|
|
@@ -114,16 +86,16 @@ var SessionInstrumentation = /** @class */ (function (_super) {
|
|
|
114
86
|
}
|
|
115
87
|
return null;
|
|
116
88
|
});
|
|
117
|
-
}
|
|
118
|
-
|
|
89
|
+
}
|
|
90
|
+
initialize() {
|
|
119
91
|
this.logDebug('init session instrumentation');
|
|
120
|
-
|
|
92
|
+
const sessionTrackingConfig = this.config.sessionTracking;
|
|
121
93
|
if (sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.enabled) {
|
|
122
|
-
|
|
94
|
+
const SessionManager = (0, sessionManager_1.getSessionManagerByConfig)(sessionTrackingConfig);
|
|
123
95
|
this.registerBeforeSendHook(SessionManager);
|
|
124
|
-
|
|
96
|
+
const { initialSession, lifecycleType } = this.createInitialSession(SessionManager, sessionTrackingConfig);
|
|
125
97
|
SessionManager.storeUserSession(initialSession);
|
|
126
|
-
|
|
98
|
+
const initialSessionMeta = initialSession.sessionMeta;
|
|
127
99
|
this.notifiedSession = initialSessionMeta;
|
|
128
100
|
this.api.setSession(initialSessionMeta);
|
|
129
101
|
if (lifecycleType === faro_core_1.EVENT_SESSION_START) {
|
|
@@ -134,8 +106,7 @@ var SessionInstrumentation = /** @class */ (function (_super) {
|
|
|
134
106
|
}
|
|
135
107
|
}
|
|
136
108
|
this.metas.addListener(this.sendSessionStartEvent.bind(this));
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
}(faro_core_1.BaseInstrumentation));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
140
111
|
exports.SessionInstrumentation = SessionInstrumentation;
|
|
141
112
|
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -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 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
|
+
{"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,39 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PersistentSessionsManager = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
this.updateSession = (0, utils_1.throttle)(function () { return _this.updateUserSession(); }, sessionConstants_1.STORAGE_UPDATE_DELAY);
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
const utils_1 = require("../../../utils");
|
|
6
|
+
const webStorage_1 = require("../../../utils/webStorage");
|
|
7
|
+
const sessionConstants_1 = require("./sessionConstants");
|
|
8
|
+
const sessionManagerUtils_1 = require("./sessionManagerUtils");
|
|
9
|
+
class PersistentSessionsManager {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.updateSession = (0, utils_1.throttle)(() => this.updateUserSession(), sessionConstants_1.STORAGE_UPDATE_DELAY);
|
|
13
12
|
this.updateUserSession = (0, sessionManagerUtils_1.getUserSessionUpdater)({
|
|
14
13
|
fetchUserSession: PersistentSessionsManager.fetchUserSession,
|
|
15
14
|
storeUserSession: PersistentSessionsManager.storeUserSession,
|
|
16
15
|
});
|
|
17
16
|
this.init();
|
|
18
17
|
}
|
|
19
|
-
|
|
18
|
+
static removeUserSession() {
|
|
20
19
|
(0, webStorage_1.removeItem)(sessionConstants_1.STORAGE_KEY, PersistentSessionsManager.storageTypeLocal);
|
|
21
|
-
}
|
|
22
|
-
|
|
20
|
+
}
|
|
21
|
+
static storeUserSession(session) {
|
|
23
22
|
(0, webStorage_1.setItem)(sessionConstants_1.STORAGE_KEY, (0, faro_core_1.stringifyExternalJson)(session), PersistentSessionsManager.storageTypeLocal);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
}
|
|
24
|
+
static fetchUserSession() {
|
|
25
|
+
const storedSession = (0, webStorage_1.getItem)(sessionConstants_1.STORAGE_KEY, PersistentSessionsManager.storageTypeLocal);
|
|
27
26
|
if (storedSession) {
|
|
28
27
|
return JSON.parse(storedSession);
|
|
29
28
|
}
|
|
30
29
|
return null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
document.addEventListener('visibilitychange', function () {
|
|
30
|
+
}
|
|
31
|
+
init() {
|
|
32
|
+
document.addEventListener('visibilitychange', () => {
|
|
35
33
|
if (document.visibilityState === 'visible') {
|
|
36
|
-
|
|
34
|
+
this.updateSession();
|
|
37
35
|
}
|
|
38
36
|
});
|
|
39
37
|
// Users can call the setSession() method, so we need to sync this with the local storage session
|
|
@@ -41,9 +39,8 @@ var PersistentSessionsManager = /** @class */ (function () {
|
|
|
41
39
|
fetchUserSession: PersistentSessionsManager.fetchUserSession,
|
|
42
40
|
storeUserSession: PersistentSessionsManager.storeUserSession,
|
|
43
41
|
}));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return PersistentSessionsManager;
|
|
47
|
-
}());
|
|
42
|
+
}
|
|
43
|
+
}
|
|
48
44
|
exports.PersistentSessionsManager = PersistentSessionsManager;
|
|
45
|
+
PersistentSessionsManager.storageTypeLocal = webStorage_1.webStorageType.local;
|
|
49
46
|
//# sourceMappingURL=PersistentSessionsManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersistentSessionsManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/PersistentSessionsManager.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"PersistentSessionsManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/PersistentSessionsManager.ts"],"names":[],"mappings":";;;AAAA,kDAAiE;AAEjE,0CAA0C;AAC1C,0DAAyF;AAEzF,yDAAuE;AACvE,+DAA2F;AAG3F,MAAa,yBAAyB;IAIpC;QA2BA,kBAAa,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,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;IAED,MAAM,CAAC,iBAAiB;QACtB,IAAA,uBAAU,EAAC,8BAAW,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAwB;QAC9C,IAAA,oBAAO,EAAC,8BAAW,EAAE,IAAA,iCAAqB,EAAC,OAAO,CAAC,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,MAAM,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,IAAI;QACV,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;YACjD,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBAC3C,IAAI,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;;AA/CH,8DAgDC;AA/CgB,0CAAgB,GAAG,2BAAc,CAAC,KAAK,AAAvB,CAAwB","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,39 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VolatileSessionsManager = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
this.updateSession = (0, utils_1.throttle)(function () { return _this.updateUserSession(); }, sessionConstants_1.STORAGE_UPDATE_DELAY);
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
const utils_1 = require("../../../utils");
|
|
6
|
+
const webStorage_1 = require("../../../utils/webStorage");
|
|
7
|
+
const sessionConstants_1 = require("./sessionConstants");
|
|
8
|
+
const sessionManagerUtils_1 = require("./sessionManagerUtils");
|
|
9
|
+
class VolatileSessionsManager {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.updateSession = (0, utils_1.throttle)(() => this.updateUserSession(), sessionConstants_1.STORAGE_UPDATE_DELAY);
|
|
13
12
|
this.updateUserSession = (0, sessionManagerUtils_1.getUserSessionUpdater)({
|
|
14
13
|
fetchUserSession: VolatileSessionsManager.fetchUserSession,
|
|
15
14
|
storeUserSession: VolatileSessionsManager.storeUserSession,
|
|
16
15
|
});
|
|
17
16
|
this.init();
|
|
18
17
|
}
|
|
19
|
-
|
|
18
|
+
static removeUserSession() {
|
|
20
19
|
(0, webStorage_1.removeItem)(sessionConstants_1.STORAGE_KEY, VolatileSessionsManager.storageTypeSession);
|
|
21
|
-
}
|
|
22
|
-
|
|
20
|
+
}
|
|
21
|
+
static storeUserSession(session) {
|
|
23
22
|
(0, webStorage_1.setItem)(sessionConstants_1.STORAGE_KEY, (0, faro_core_1.stringifyExternalJson)(session), VolatileSessionsManager.storageTypeSession);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
}
|
|
24
|
+
static fetchUserSession() {
|
|
25
|
+
const storedSession = (0, webStorage_1.getItem)(sessionConstants_1.STORAGE_KEY, VolatileSessionsManager.storageTypeSession);
|
|
27
26
|
if (storedSession) {
|
|
28
27
|
return JSON.parse(storedSession);
|
|
29
28
|
}
|
|
30
29
|
return null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
document.addEventListener('visibilitychange', function () {
|
|
30
|
+
}
|
|
31
|
+
init() {
|
|
32
|
+
document.addEventListener('visibilitychange', () => {
|
|
35
33
|
if (document.visibilityState === 'visible') {
|
|
36
|
-
|
|
34
|
+
this.updateSession();
|
|
37
35
|
}
|
|
38
36
|
});
|
|
39
37
|
// Users can call the setSession() method, so we need to sync this with the local storage session
|
|
@@ -41,9 +39,8 @@ var VolatileSessionsManager = /** @class */ (function () {
|
|
|
41
39
|
fetchUserSession: VolatileSessionsManager.fetchUserSession,
|
|
42
40
|
storeUserSession: VolatileSessionsManager.storeUserSession,
|
|
43
41
|
}));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return VolatileSessionsManager;
|
|
47
|
-
}());
|
|
42
|
+
}
|
|
43
|
+
}
|
|
48
44
|
exports.VolatileSessionsManager = VolatileSessionsManager;
|
|
45
|
+
VolatileSessionsManager.storageTypeSession = webStorage_1.webStorageType.session;
|
|
49
46
|
//# sourceMappingURL=VolatileSessionManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VolatileSessionManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/VolatileSessionManager.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"VolatileSessionManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/VolatileSessionManager.ts"],"names":[],"mappings":";;;AAAA,kDAAiE;AAEjE,0CAA0C;AAC1C,0DAAyF;AAEzF,yDAAuE;AACvE,+DAA2F;AAG3F,MAAa,uBAAuB;IAIlC;QA2BA,kBAAa,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,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;IAED,MAAM,CAAC,iBAAiB;QACtB,IAAA,uBAAU,EAAC,8BAAW,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAwB;QAC9C,IAAA,oBAAO,EAAC,8BAAW,EAAE,IAAA,iCAAqB,EAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,MAAM,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,IAAI;QACV,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;YACjD,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBAC3C,IAAI,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;;AA/CH,0DAgDC;AA/CgB,0CAAkB,GAAG,2BAAc,CAAC,OAAO,AAAzB,CAA0B","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,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getSessionManagerByConfig = getSessionManagerByConfig;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const PersistentSessionsManager_1 = require("./PersistentSessionsManager");
|
|
5
|
+
const 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
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSessionManagerByConfig.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/getSessionManagerByConfig.ts"],"names":[],"mappings":";;AAMA,8DAEC;AAND,
|
|
1
|
+
{"version":3,"file":"getSessionManagerByConfig.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/getSessionManagerByConfig.ts"],"names":[],"mappings":";;AAMA,8DAEC;AAND,2EAAwE;AAExE,qEAAmE;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,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isSampled = isSampled;
|
|
4
|
-
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
5
|
function isSampled() {
|
|
6
6
|
var _a, _b, _c;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
const sendAllSignals = 1;
|
|
8
|
+
const sessionTracking = faro_core_1.faro.config.sessionTracking;
|
|
9
|
+
const rawSamplingRate = (_c = (_b = (_a = sessionTracking === null || sessionTracking === void 0 ? void 0 : sessionTracking.sampler) === null || _a === void 0 ? void 0 : _a.call(sessionTracking, { metas: faro_core_1.faro.metas.value })) !== null && _b !== void 0 ? _b : sessionTracking === null || sessionTracking === void 0 ? void 0 : sessionTracking.samplingRate) !== null && _c !== void 0 ? _c : sendAllSignals;
|
|
10
|
+
const samplingRate = typeof rawSamplingRate === 'number' ? (0, faro_core_1.clampSamplingRate)(rawSamplingRate) : 0;
|
|
11
11
|
return Math.random() < samplingRate;
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=sampling.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sampling.ts"],"names":[],"mappings":";;AAEA,8BAQC;AAVD,
|
|
1
|
+
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sampling.ts"],"names":[],"mappings":";;AAEA,8BAQC;AAVD,kDAA6D;AAE7D,SAAgB,SAAS;;IACvB,MAAM,cAAc,GAAG,CAAC,CAAC;IACzB,MAAM,eAAe,GAAG,gBAAI,CAAC,MAAM,CAAC,eAAe,CAAC;IACpD,MAAM,eAAe,GACnB,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;IAC7G,MAAM,YAAY,GAAG,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,6BAAiB,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElG,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC;AACtC,CAAC","sourcesContent":["import { clampSamplingRate, faro } from '@grafana/faro-core';\n\nexport function isSampled(): boolean {\n const sendAllSignals = 1;\n const sessionTracking = faro.config.sessionTracking;\n const rawSamplingRate =\n sessionTracking?.sampler?.({ metas: faro.metas.value }) ?? sessionTracking?.samplingRate ?? sendAllSignals;\n const samplingRate = typeof rawSamplingRate === 'number' ? clampSamplingRate(rawSamplingRate) : 0;\n\n return Math.random() < samplingRate;\n}\n"]}
|