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