UNPKG

28.9 kBSource Map (JSON)View Raw
1{"version":3,"file":"scope.js","sources":["../../src/scope.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type {\n Attachment,\n Breadcrumb,\n CaptureContext,\n Context,\n Contexts,\n Event,\n EventHint,\n EventProcessor,\n Extra,\n Extras,\n Primitive,\n RequestSession,\n Scope as ScopeInterface,\n ScopeContext,\n Session,\n Severity,\n SeverityLevel,\n Span,\n Transaction,\n User,\n} from '@sentry/types';\nimport {\n arrayify,\n dateTimestampInSeconds,\n getGlobalSingleton,\n isPlainObject,\n isThenable,\n logger,\n SyncPromise,\n} from '@sentry/utils';\n\nimport { updateSession } from './session';\n\n/**\n * Default value for maximum number of breadcrumbs added to an event.\n */\nconst DEFAULT_MAX_BREADCRUMBS = 100;\n\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nexport class Scope implements ScopeInterface {\n /** Flag if notifying is happening. */\n protected _notifyingListeners: boolean;\n\n /** Callback for client to receive scope changes. */\n protected _scopeListeners: Array<(scope: Scope) => void>;\n\n /** Callback list that will be called after {@link applyToEvent}. */\n protected _eventProcessors: EventProcessor[];\n\n /** Array of breadcrumbs. */\n protected _breadcrumbs: Breadcrumb[];\n\n /** User */\n protected _user: User;\n\n /** Tags */\n protected _tags: { [key: string]: Primitive };\n\n /** Extra */\n protected _extra: Extras;\n\n /** Contexts */\n protected _contexts: Contexts;\n\n /** Attachments */\n protected _attachments: Attachment[];\n\n /**\n * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n * sent to Sentry\n */\n protected _sdkProcessingMetadata: { [key: string]: unknown };\n\n /** Fingerprint */\n protected _fingerprint?: string[];\n\n /** Severity */\n // eslint-disable-next-line deprecation/deprecation\n protected _level?: Severity | SeverityLevel;\n\n /** Transaction Name */\n protected _transactionName?: string;\n\n /** Span */\n protected _span?: Span;\n\n /** Session */\n protected _session?: Session;\n\n /** Request Mode Session Status */\n protected _requestSession?: RequestSession;\n\n // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n\n public constructor() {\n this._notifyingListeners = false;\n this._scopeListeners = [];\n this._eventProcessors = [];\n this._breadcrumbs = [];\n this._attachments = [];\n this._user = {};\n this._tags = {};\n this._extra = {};\n this._contexts = {};\n this._sdkProcessingMetadata = {};\n }\n\n /**\n * Inherit values from the parent scope.\n * @param scope to clone.\n */\n public static clone(scope?: Scope): Scope {\n const newScope = new Scope();\n if (scope) {\n newScope._breadcrumbs = [...scope._breadcrumbs];\n newScope._tags = { ...scope._tags };\n newScope._extra = { ...scope._extra };\n newScope._contexts = { ...scope._contexts };\n newScope._user = scope._user;\n newScope._level = scope._level;\n newScope._span = scope._span;\n newScope._session = scope._session;\n newScope._transactionName = scope._transactionName;\n newScope._fingerprint = scope._fingerprint;\n newScope._eventProcessors = [...scope._eventProcessors];\n newScope._requestSession = scope._requestSession;\n newScope._attachments = [...scope._attachments];\n newScope._sdkProcessingMetadata = { ...scope._sdkProcessingMetadata };\n }\n return newScope;\n }\n\n /**\n * Add internal on change listener. Used for sub SDKs that need to store the scope.\n * @hidden\n */\n public addScopeListener(callback: (scope: Scope) => void): void {\n this._scopeListeners.push(callback);\n }\n\n /**\n * @inheritDoc\n */\n public addEventProcessor(callback: EventProcessor): this {\n this._eventProcessors.push(callback);\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setUser(user: User | null): this {\n this._user = user || {};\n if (this._session) {\n updateSession(this._session, { user });\n }\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public getUser(): User | undefined {\n return this._user;\n }\n\n /**\n * @inheritDoc\n */\n public getRequestSession(): RequestSession | undefined {\n return this._requestSession;\n }\n\n /**\n * @inheritDoc\n */\n public setRequestSession(requestSession?: RequestSession): this {\n this._requestSession = requestSession;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setTags(tags: { [key: string]: Primitive }): this {\n this._tags = {\n ...this._tags,\n ...tags,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setTag(key: string, value: Primitive): this {\n this._tags = { ...this._tags, [key]: value };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setExtras(extras: Extras): this {\n this._extra = {\n ...this._extra,\n ...extras,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setExtra(key: string, extra: Extra): this {\n this._extra = { ...this._extra, [key]: extra };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setFingerprint(fingerprint: string[]): this {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setLevel(\n // eslint-disable-next-line deprecation/deprecation\n level: Severity | SeverityLevel,\n ): this {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setTransactionName(name?: string): this {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setContext(key: string, context: Context | null): this {\n if (context === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._contexts[key];\n } else {\n this._contexts[key] = context;\n }\n\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setSpan(span?: Span): this {\n this._span = span;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public getSpan(): Span | undefined {\n return this._span;\n }\n\n /**\n * @inheritDoc\n */\n public getTransaction(): Transaction | undefined {\n // Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will\n // have a pointer to the currently-active transaction.\n const span = this.getSpan();\n return span && span.transaction;\n }\n\n /**\n * @inheritDoc\n */\n public setSession(session?: Session): this {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public getSession(): Session | undefined {\n return this._session;\n }\n\n /**\n * @inheritDoc\n */\n public update(captureContext?: CaptureContext): this {\n if (!captureContext) {\n return this;\n }\n\n if (typeof captureContext === 'function') {\n const updatedScope = (captureContext as <T>(scope: T) => T)(this);\n return updatedScope instanceof Scope ? updatedScope : this;\n }\n\n if (captureContext instanceof Scope) {\n this._tags = { ...this._tags, ...captureContext._tags };\n this._extra = { ...this._extra, ...captureContext._extra };\n this._contexts = { ...this._contexts, ...captureContext._contexts };\n if (captureContext._user && Object.keys(captureContext._user).length) {\n this._user = captureContext._user;\n }\n if (captureContext._level) {\n this._level = captureContext._level;\n }\n if (captureContext._fingerprint) {\n this._fingerprint = captureContext._fingerprint;\n }\n if (captureContext._requestSession) {\n this._requestSession = captureContext._requestSession;\n }\n } else if (isPlainObject(captureContext)) {\n // eslint-disable-next-line no-param-reassign\n captureContext = captureContext as ScopeContext;\n this._tags = { ...this._tags, ...captureContext.tags };\n this._extra = { ...this._extra, ...captureContext.extra };\n this._contexts = { ...this._contexts, ...captureContext.contexts };\n if (captureContext.user) {\n this._user = captureContext.user;\n }\n if (captureContext.level) {\n this._level = captureContext.level;\n }\n if (captureContext.fingerprint) {\n this._fingerprint = captureContext.fingerprint;\n }\n if (captureContext.requestSession) {\n this._requestSession = captureContext.requestSession;\n }\n }\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public clear(): this {\n this._breadcrumbs = [];\n this._tags = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = undefined;\n this._transactionName = undefined;\n this._fingerprint = undefined;\n this._requestSession = undefined;\n this._span = undefined;\n this._session = undefined;\n this._notifyScopeListeners();\n this._attachments = [];\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): this {\n const maxCrumbs = typeof maxBreadcrumbs === 'number' ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n\n // No data has been changed, so don't notify scope listeners\n if (maxCrumbs <= 0) {\n return this;\n }\n\n const mergedBreadcrumb = {\n timestamp: dateTimestampInSeconds(),\n ...breadcrumb,\n };\n this._breadcrumbs = [...this._breadcrumbs, mergedBreadcrumb].slice(-maxCrumbs);\n this._notifyScopeListeners();\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public getLastBreadcrumb(): Breadcrumb | undefined {\n return this._breadcrumbs[this._breadcrumbs.length - 1];\n }\n\n /**\n * @inheritDoc\n */\n public clearBreadcrumbs(): this {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public addAttachment(attachment: Attachment): this {\n this._attachments.push(attachment);\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public getAttachments(): Attachment[] {\n return this._attachments;\n }\n\n /**\n * @inheritDoc\n */\n public clearAttachments(): this {\n this._attachments = [];\n return this;\n }\n\n /**\n * Applies data from the scope to the event and runs all event processors on it.\n *\n * @param event Event\n * @param hint Object containing additional information about the original exception, for use by the event processors.\n * @hidden\n */\n public applyToEvent(event: Event, hint: EventHint = {}): PromiseLike<Event | null> {\n if (this._extra && Object.keys(this._extra).length) {\n event.extra = { ...this._extra, ...event.extra };\n }\n if (this._tags && Object.keys(this._tags).length) {\n event.tags = { ...this._tags, ...event.tags };\n }\n if (this._user && Object.keys(this._user).length) {\n event.user = { ...this._user, ...event.user };\n }\n if (this._contexts && Object.keys(this._contexts).length) {\n event.contexts = { ...this._contexts, ...event.contexts };\n }\n if (this._level) {\n event.level = this._level;\n }\n if (this._transactionName) {\n event.transaction = this._transactionName;\n }\n\n // We want to set the trace context for normal events only if there isn't already\n // a trace context on the event. There is a product feature in place where we link\n // errors with transaction and it relies on that.\n if (this._span) {\n event.contexts = { trace: this._span.getTraceContext(), ...event.contexts };\n const transactionName = this._span.transaction && this._span.transaction.name;\n if (transactionName) {\n event.tags = { transaction: transactionName, ...event.tags };\n }\n }\n\n this._applyFingerprint(event);\n\n event.breadcrumbs = [...(event.breadcrumbs || []), ...this._breadcrumbs];\n event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n\n event.sdkProcessingMetadata = { ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata };\n\n return this._notifyEventProcessors([...getGlobalEventProcessors(), ...this._eventProcessors], event, hint);\n }\n\n /**\n * Add data which will be accessible during event processing but won't get sent to Sentry\n */\n public setSDKProcessingMetadata(newData: { [key: string]: unknown }): this {\n this._sdkProcessingMetadata = { ...this._sdkProcessingMetadata, ...newData };\n\n return this;\n }\n\n /**\n * This will be called after {@link applyToEvent} is finished.\n */\n protected _notifyEventProcessors(\n processors: EventProcessor[],\n event: Event | null,\n hint: EventHint,\n index: number = 0,\n ): PromiseLike<Event | null> {\n return new SyncPromise<Event | null>((resolve, reject) => {\n const processor = processors[index];\n if (event === null || typeof processor !== 'function') {\n resolve(event);\n } else {\n const result = processor({ ...event }, hint) as Event | null;\n\n __DEBUG_BUILD__ &&\n processor.id &&\n result === null &&\n logger.log(`Event processor \"${processor.id}\" dropped event`);\n\n if (isThenable(result)) {\n void result\n .then(final => this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve))\n .then(null, reject);\n } else {\n void this._notifyEventProcessors(processors, result, hint, index + 1)\n .then(resolve)\n .then(null, reject);\n }\n }\n });\n }\n\n /**\n * This will be called on every set call.\n */\n protected _notifyScopeListeners(): void {\n // We need this check for this._notifyingListeners to be able to work on scope during updates\n // If this check is not here we'll produce endless recursion when something is done with the scope\n // during the callback.\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n this._scopeListeners.forEach(callback => {\n callback(this);\n });\n this._notifyingListeners = false;\n }\n }\n\n /**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\n private _applyFingerprint(event: Event): void {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint ? arrayify(event.fingerprint) : [];\n\n // If we have something on the scope, then merge it with event\n if (this._fingerprint) {\n event.fingerprint = event.fingerprint.concat(this._fingerprint);\n }\n\n // If we have no data at all, remove empty array default\n if (event.fingerprint && !event.fingerprint.length) {\n delete event.fingerprint;\n }\n }\n}\n\n/**\n * Returns the global event processors.\n */\nfunction getGlobalEventProcessors(): EventProcessor[] {\n return getGlobalSingleton<EventProcessor[]>('globalEventProcessors', () => []);\n}\n\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\nexport function addGlobalEventProcessor(callback: EventProcessor): void {\n getGlobalEventProcessors().push(callback);\n}\n"],"names":["updateSession","isPlainObject","dateTimestampInSeconds","SyncPromise","logger","isThenable","arrayify","getGlobalSingleton"],"mappings":"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"}
\No newline at end of file