165 lines
5.1 KiB
JavaScript
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
|