@grafana/faro-web-sdk
Version:
Faro instrumentations, metas, transports for web.
131 lines • 7.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createUserSessionObject = createUserSessionObject;
exports.isUserSessionValid = isUserSessionValid;
exports.getUserSessionUpdater = getUserSessionUpdater;
exports.addSessionMetadataToNextSession = addSessionMetadataToNextSession;
exports.getSessionMetaUpdateHandler = getSessionMetaUpdateHandler;
const faro_core_1 = require("@grafana/faro-core");
const utils_1 = require("../../../utils");
const sampling_1 = require("./sampling");
const sessionConstants_1 = require("./sessionConstants");
function createUserSessionObject({ sessionId, started, lastActivity, isSampled = true, } = {}) {
var _a, _b;
const now = (0, faro_core_1.dateNow)();
const generateSessionId = (_b = (_a = faro_core_1.faro.config) === null || _a === void 0 ? void 0 : _a.sessionTracking) === null || _b === void 0 ? void 0 : _b.generateSessionId;
if (sessionId == null) {
sessionId = typeof generateSessionId === 'function' ? generateSessionId() : (0, faro_core_1.genShortID)();
}
return {
sessionId,
lastActivity: lastActivity !== null && lastActivity !== void 0 ? lastActivity : now,
started: started !== null && started !== void 0 ? started : now,
isSampled: isSampled,
};
}
function isUserSessionValid(session) {
if (session == null) {
return false;
}
const now = (0, faro_core_1.dateNow)();
const lifetimeValid = now - session.started < sessionConstants_1.SESSION_EXPIRATION_TIME;
if (!lifetimeValid) {
return false;
}
const inactivityPeriodValid = now - session.lastActivity < sessionConstants_1.SESSION_INACTIVITY_TIME;
return inactivityPeriodValid;
}
function getUserSessionUpdater({ fetchUserSession, storeUserSession, }) {
return function updateSession({ forceSessionExtend } = { forceSessionExtend: false }) {
var _a, _b, _c;
if (!fetchUserSession || !storeUserSession) {
return;
}
const sessionTrackingConfig = faro_core_1.faro.config.sessionTracking;
const isPersistentSessions = sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.persistent;
if ((isPersistentSessions && !utils_1.isLocalStorageAvailable) || (!isPersistentSessions && !utils_1.isSessionStorageAvailable)) {
return;
}
const sessionFromStorage = fetchUserSession();
if (forceSessionExtend === false && isUserSessionValid(sessionFromStorage)) {
storeUserSession(Object.assign(Object.assign({}, sessionFromStorage), { lastActivity: (0, faro_core_1.dateNow)() }));
}
else {
let newSession = addSessionMetadataToNextSession(createUserSessionObject({ isSampled: (0, sampling_1.isSampled)() }), sessionFromStorage);
storeUserSession(newSession);
(_a = faro_core_1.faro.api) === null || _a === void 0 ? void 0 : _a.setSession(newSession.sessionMeta);
(_b = sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.onSessionChange) === null || _b === void 0 ? void 0 : _b.call(sessionTrackingConfig, (_c = sessionFromStorage === null || sessionFromStorage === void 0 ? void 0 : sessionFromStorage.sessionMeta) !== null && _c !== void 0 ? _c : null, newSession.sessionMeta);
}
};
}
function addSessionMetadataToNextSession(newSession, previousSession) {
var _a, _b, _c, _d, _e, _f, _g;
const sessionWithMeta = Object.assign(Object.assign({}, newSession), { sessionMeta: {
id: newSession.sessionId,
attributes: removeUndefinedValues(Object.assign(Object.assign(Object.assign({}, (_b = (_a = faro_core_1.faro.config.sessionTracking) === null || _a === void 0 ? void 0 : _a.session) === null || _b === void 0 ? void 0 : _b.attributes), ((_d = (_c = faro_core_1.faro.metas.value.session) === null || _c === void 0 ? void 0 : _c.attributes) !== null && _d !== void 0 ? _d : {})), { isSampled: newSession.isSampled.toString() })),
} });
const overrides = (_f = (_e = faro_core_1.faro.metas.value.session) === null || _e === void 0 ? void 0 : _e.overrides) !== null && _f !== void 0 ? _f : (_g = previousSession === null || previousSession === void 0 ? void 0 : previousSession.sessionMeta) === null || _g === void 0 ? void 0 : _g.overrides;
if (!(0, faro_core_1.isEmpty)(overrides)) {
sessionWithMeta.sessionMeta.overrides = overrides;
}
const previousSessionId = previousSession === null || previousSession === void 0 ? void 0 : previousSession.sessionId;
if (previousSessionId != null) {
sessionWithMeta.sessionMeta.attributes['previousSession'] = previousSessionId;
}
return sessionWithMeta;
}
function getSessionMetaUpdateHandler({ fetchUserSession, storeUserSession, }) {
let isSyncing = false;
return function syncSessionIfChangedExternally(meta) {
if (isSyncing) {
return;
}
const session = meta.session;
const sessionFromSessionStorage = fetchUserSession();
let sessionId = session === null || session === void 0 ? void 0 : session.id;
const sessionAttributes = session === null || session === void 0 ? void 0 : session.attributes;
const sessionOverrides = session === null || session === void 0 ? void 0 : session.overrides;
const storedSessionMeta = sessionFromSessionStorage === null || sessionFromSessionStorage === void 0 ? void 0 : sessionFromSessionStorage.sessionMeta;
const storedSessionMetaOverrides = storedSessionMeta === null || storedSessionMeta === void 0 ? void 0 : storedSessionMeta.overrides;
const hasSessionOverridesChanged = !!sessionOverrides && !(0, faro_core_1.deepEqual)(sessionOverrides, storedSessionMetaOverrides);
const hasAttributesChanged = !!sessionAttributes && !(0, faro_core_1.deepEqual)(sessionAttributes, storedSessionMeta === null || storedSessionMeta === void 0 ? void 0 : storedSessionMeta.attributes);
const hasSessionIdChanged = !!session && sessionId !== (sessionFromSessionStorage === null || sessionFromSessionStorage === void 0 ? void 0 : sessionFromSessionStorage.sessionId);
if (hasSessionIdChanged || hasAttributesChanged || hasSessionOverridesChanged) {
const userSession = addSessionMetadataToNextSession(createUserSessionObject({ sessionId, isSampled: (0, sampling_1.isSampled)() }), sessionFromSessionStorage);
storeUserSession(userSession);
sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides, storedSessionMetaOverrides);
isSyncing = true;
try {
faro_core_1.faro.api.setSession(userSession.sessionMeta);
}
finally {
isSyncing = false;
}
}
};
}
function removeUndefinedValues(obj) {
const result = {};
for (const key of Object.keys(obj)) {
const value = obj[key];
if (value !== undefined) {
result[key] = value;
}
}
return result;
}
function sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides = {}, storedSessionOverrides = {}) {
var _a, _b, _c;
if (!hasSessionOverridesChanged) {
return;
}
const serviceName = sessionOverrides.serviceName;
const previousServiceName = (_c = (_a = storedSessionOverrides.serviceName) !== null && _a !== void 0 ? _a : (_b = faro_core_1.faro.metas.value.app) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '';
if (serviceName && serviceName !== previousServiceName) {
faro_core_1.faro.api.pushEvent(faro_core_1.EVENT_OVERRIDES_SERVICE_NAME, {
serviceName,
previousServiceName,
});
}
}
//# sourceMappingURL=sessionManagerUtils.js.map