UNPKG

9.27 kBSource Map (JSON)View Raw
1{"version":3,"file":"session.js","sources":["../../src/session.ts"],"sourcesContent":["import type { SerializedSession, Session, SessionContext, SessionStatus } from '@sentry/types';\nimport { dropUndefinedKeys, timestampInSeconds, uuid4 } from '@sentry/utils';\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<SessionContext, 'started' | 'status'>): 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 BaseClient.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.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<SessionStatus, 'ok'>): 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 dropUndefinedKeys({\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 attrs: {\n release: session.release,\n environment: session.environment,\n ip_address: session.ipAddress,\n user_agent: session.userAgent,\n },\n });\n}\n"],"names":[],"mappings":"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"}
\No newline at end of file