123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- 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
|