bifocal/node_modules/@sentry/core/cjs/session.js

165 lines
5.1 KiB
JavaScript

Object.defineProperty(exports, '__esModule', { value: true });
const utils = require('@sentry/utils');
/**
* Creates a new `Session` object by setting certain default parameters. If optional @param context
* is passed, the passed properties are applied to the session object.
*
* @param context (optional) additional properties to be applied to the returned session object
*
* @returns a new `Session` object
*/
function makeSession(context) {
// Both timestamp and started are in seconds since the UNIX epoch.
const startingTime = utils.timestampInSeconds();
const session = {
sid: utils.uuid4(),
init: true,
timestamp: startingTime,
started: startingTime,
duration: 0,
status: 'ok',
errors: 0,
ignoreDuration: false,
toJSON: () => sessionToJSON(session),
};
if (context) {
updateSession(session, context);
}
return session;
}
/**
* Updates a session object with the properties passed in the context.
*
* Note that this function mutates the passed object and returns void.
* (Had to do this instead of returning a new and updated session because closing and sending a session
* makes an update to the session after it was passed to the sending logic.
* @see BaseClient.captureSession )
*
* @param session the `Session` to update
* @param context the `SessionContext` holding the properties that should be updated in @param session
*/
// eslint-disable-next-line complexity
function updateSession(session, context = {}) {
if (context.user) {
if (!session.ipAddress && context.user.ip_address) {
session.ipAddress = context.user.ip_address;
}
if (!session.did && !context.did) {
session.did = context.user.id || context.user.email || context.user.username;
}
}
session.timestamp = context.timestamp || utils.timestampInSeconds();
if (context.abnormal_mechanism) {
session.abnormal_mechanism = context.abnormal_mechanism;
}
if (context.ignoreDuration) {
session.ignoreDuration = context.ignoreDuration;
}
if (context.sid) {
// Good enough uuid validation. — Kamil
session.sid = context.sid.length === 32 ? context.sid : utils.uuid4();
}
if (context.init !== undefined) {
session.init = context.init;
}
if (!session.did && context.did) {
session.did = `${context.did}`;
}
if (typeof context.started === 'number') {
session.started = context.started;
}
if (session.ignoreDuration) {
session.duration = undefined;
} else if (typeof context.duration === 'number') {
session.duration = context.duration;
} else {
const duration = session.timestamp - session.started;
session.duration = duration >= 0 ? duration : 0;
}
if (context.release) {
session.release = context.release;
}
if (context.environment) {
session.environment = context.environment;
}
if (!session.ipAddress && context.ipAddress) {
session.ipAddress = context.ipAddress;
}
if (!session.userAgent && context.userAgent) {
session.userAgent = context.userAgent;
}
if (typeof context.errors === 'number') {
session.errors = context.errors;
}
if (context.status) {
session.status = context.status;
}
}
/**
* Closes a session by setting its status and updating the session object with it.
* Internally calls `updateSession` to update the passed session object.
*
* Note that this function mutates the passed session (@see updateSession for explanation).
*
* @param session the `Session` object to be closed
* @param status the `SessionStatus` with which the session was closed. If you don't pass a status,
* this function will keep the previously set status, unless it was `'ok'` in which case
* it is changed to `'exited'`.
*/
function closeSession(session, status) {
let context = {};
if (status) {
context = { status };
} else if (session.status === 'ok') {
context = { status: 'exited' };
}
updateSession(session, context);
}
/**
* Serializes a passed session object to a JSON object with a slightly different structure.
* This is necessary because the Sentry backend requires a slightly different schema of a session
* than the one the JS SDKs use internally.
*
* @param session the session to be converted
*
* @returns a JSON object of the passed session
*/
function sessionToJSON(session) {
return utils.dropUndefinedKeys({
sid: `${session.sid}`,
init: session.init,
// Make sure that sec is converted to ms for date constructor
started: new Date(session.started * 1000).toISOString(),
timestamp: new Date(session.timestamp * 1000).toISOString(),
status: session.status,
errors: session.errors,
did: typeof session.did === 'number' || typeof session.did === 'string' ? `${session.did}` : undefined,
duration: session.duration,
abnormal_mechanism: session.abnormal_mechanism,
attrs: {
release: session.release,
environment: session.environment,
ip_address: session.ipAddress,
user_agent: session.userAgent,
},
});
}
exports.closeSession = closeSession;
exports.makeSession = makeSession;
exports.updateSession = updateSession;
//# sourceMappingURL=session.js.map