Skip to content

Commit 7f366db

Browse files
committed
ref: Enforce stackParser through options.
As stackParser will always be defined in client options, we can remove the usage of `stackParserFromOptions` outside of SDK init.
1 parent 6227c7f commit 7f366db

File tree

8 files changed

+30
-53
lines changed

8 files changed

+30
-53
lines changed

packages/browser/src/client.ts

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { BaseClient, NewTransport, Scope, SDK_VERSION } from '@sentry/core';
22
import { ClientOptions, Event, EventHint, Options, Severity, SeverityLevel, Transport } from '@sentry/types';
3-
import { getGlobalObject, logger, stackParserFromOptions } from '@sentry/utils';
3+
import { getGlobalObject, logger } from '@sentry/utils';
44

55
import { eventFromException, eventFromMessage } from './eventbuilder';
66
import { IS_DEBUG_BUILD } from './flags';
@@ -89,7 +89,7 @@ export class BrowserClient extends BaseClient<BrowserClientOptions> {
8989
* @inheritDoc
9090
*/
9191
public eventFromException(exception: unknown, hint?: EventHint): PromiseLike<Event> {
92-
return eventFromException(stackParserFromOptions(this._options), exception, hint, this._options.attachStacktrace);
92+
return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);
9393
}
9494

9595
/**
@@ -101,13 +101,7 @@ export class BrowserClient extends BaseClient<BrowserClientOptions> {
101101
level: Severity | SeverityLevel = 'info',
102102
hint?: EventHint,
103103
): PromiseLike<Event> {
104-
return eventFromMessage(
105-
stackParserFromOptions(this._options),
106-
message,
107-
level,
108-
hint,
109-
this._options.attachStacktrace,
110-
);
104+
return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);
111105
}
112106

113107
/**

packages/browser/src/integrations/globalhandlers.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
isPrimitive,
1010
isString,
1111
logger,
12-
stackParserFromOptions,
1312
} from '@sentry/utils';
1413

1514
import { BrowserClient } from '../client';
@@ -255,8 +254,9 @@ function addMechanismAndCapture(hub: Hub, error: EventHint['originalException'],
255254
function getHubAndOptions(): [Hub, StackParser, boolean | undefined] {
256255
const hub = getCurrentHub();
257256
const client = hub.getClient<BrowserClient>();
258-
const options = client?.getOptions();
259-
const parser = stackParserFromOptions(options);
260-
const attachStacktrace = options?.attachStacktrace;
261-
return [hub, parser, attachStacktrace];
257+
const options = (client && client.getOptions()) || {
258+
stackParser: () => [],
259+
attachStacktrace: false,
260+
};
261+
return [hub, options.stackParser, options.attachStacktrace];
262262
}

packages/browser/src/integrations/linkederrors.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';
22
import { Event, EventHint, Exception, ExtendedError, Integration, StackParser } from '@sentry/types';
3-
import { isInstanceOf, stackParserFromOptions } from '@sentry/utils';
3+
import { isInstanceOf } from '@sentry/utils';
44

55
import { BrowserClient } from '../client';
66
import { exceptionFromError } from '../eventbuilder';
@@ -47,12 +47,14 @@ export class LinkedErrors implements Integration {
4747
* @inheritDoc
4848
*/
4949
public setupOnce(): void {
50-
const options = getCurrentHub().getClient<BrowserClient>()?.getOptions();
51-
const parser = stackParserFromOptions(options);
52-
50+
const client = getCurrentHub().getClient<BrowserClient>();
51+
const options = client && client.getOptions();
52+
if (!options) {
53+
return;
54+
}
5355
addGlobalEventProcessor((event: Event, hint?: EventHint) => {
5456
const self = getCurrentHub().getIntegration(LinkedErrors);
55-
return self ? _handler(parser, self._key, self._limit, event, hint) : event;
57+
return self ? _handler(options.stackParser, self._key, self._limit, event, hint) : event;
5658
});
5759
}
5860
}

packages/browser/src/sdk.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,11 @@ export function init(options: BrowserOptions = {}): void {
102102
if (options.sendClientReports === undefined) {
103103
options.sendClientReports = true;
104104
}
105-
if (options.stackParser === undefined) {
106-
options.stackParser = defaultStackParsers;
107-
}
108105
const { transport, newTransport } = setupBrowserTransport(options);
109106

110107
const clientOptions: BrowserClientOptions = {
111108
...options,
112-
stackParser: stackParserFromOptions(options),
109+
stackParser: stackParserFromOptions(options.stackParser || defaultStackParsers),
113110
integrations: getIntegrationsToSetup(options),
114111
// TODO(v7): get rid of transport being passed down below
115112
transport: options.transport || (supportsFetch() ? FetchTransport : XHRTransport),

packages/node/src/client.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { BaseClient, NewTransport, Scope, SDK_VERSION } from '@sentry/core';
22
import { SessionFlusher } from '@sentry/hub';
33
import { Event, EventHint, Severity, SeverityLevel, Transport } from '@sentry/types';
4-
import { logger, resolvedSyncPromise, stackParserFromOptions } from '@sentry/utils';
4+
import { logger, resolvedSyncPromise } from '@sentry/utils';
55

66
import { eventFromMessage, eventFromUnknownInput } from './eventbuilder';
77
import { IS_DEBUG_BUILD } from './flags';
@@ -111,7 +111,7 @@ export class NodeClient extends BaseClient<NodeClientOptions> {
111111
*/
112112
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
113113
public eventFromException(exception: any, hint?: EventHint): PromiseLike<Event> {
114-
return resolvedSyncPromise(eventFromUnknownInput(stackParserFromOptions(this._options), exception, hint));
114+
return resolvedSyncPromise(eventFromUnknownInput(this._options.stackParser, exception, hint));
115115
}
116116

117117
/**
@@ -124,7 +124,7 @@ export class NodeClient extends BaseClient<NodeClientOptions> {
124124
hint?: EventHint,
125125
): PromiseLike<Event> {
126126
return resolvedSyncPromise(
127-
eventFromMessage(stackParserFromOptions(this._options), message, level, hint, this._options.attachStacktrace),
127+
eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace),
128128
);
129129
}
130130

packages/node/src/integrations/linkederrors.ts

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';
22
import { Event, EventHint, Exception, ExtendedError, Integration, StackParser } from '@sentry/types';
3-
import { isInstanceOf, resolvedSyncPromise, stackParserFromOptions, SyncPromise } from '@sentry/utils';
3+
import { isInstanceOf, resolvedSyncPromise, SyncPromise } from '@sentry/utils';
44

55
import { NodeClient } from '../client';
66
import { exceptionFromError } from '../eventbuilder';
@@ -46,12 +46,10 @@ export class LinkedErrors implements Integration {
4646
addGlobalEventProcessor(async (event: Event, hint?: EventHint) => {
4747
const hub = getCurrentHub();
4848
const self = hub.getIntegration(LinkedErrors);
49-
const stackParser = stackParserFromOptions(hub.getClient<NodeClient>()?.getOptions());
50-
51-
if (self) {
52-
await self._handler(stackParser, event, hint);
49+
const client = hub.getClient<NodeClient>();
50+
if (client && self) {
51+
await self._handler(client.getOptions().stackParser, event, hint);
5352
}
54-
5553
return event;
5654
});
5755
}

packages/node/src/sdk.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,6 @@ export function init(options: NodeOptions = {}): void {
122122
options.autoSessionTracking = true;
123123
}
124124

125-
if (options.stackParser === undefined) {
126-
options.stackParser = [nodeStackParser];
127-
}
128-
129125
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
130126
if ((domain as any).active) {
131127
setHubOnCarrier(carrier, getCurrentHub());
@@ -136,7 +132,7 @@ export function init(options: NodeOptions = {}): void {
136132
// TODO(v7): Refactor this to reduce the logic above
137133
const clientOptions: NodeClientOptions = {
138134
...options,
139-
stackParser: stackParserFromOptions(options),
135+
stackParser: stackParserFromOptions(options.stackParser || [nodeStackParser]),
140136
integrations: getIntegrationsToSetup(options),
141137
// TODO(v7): Fix me when we switch to new transports entirely.
142138
transport: options.transport || (transport instanceof HTTPTransport ? HTTPTransport : HTTPSTransport),

packages/utils/src/stacktrace.ts

+6-16
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,17 @@ export function createStackParser(...parsers: StackLineParser[]): StackParser {
3030
};
3131
}
3232

33-
interface StackParserOptions {
34-
stackParser?: StackParser | StackLineParser[];
35-
}
36-
3733
/**
38-
* Gets a stack parser implementation from options
34+
* Gets a stack parser implementation from Options.stackParser
35+
* @see Options
3936
*
4037
* If options contains an array of line parsers, it is converted into a parser
4138
*/
42-
export function stackParserFromOptions(options: StackParserOptions | undefined): StackParser {
43-
if (options) {
44-
if (Array.isArray(options.stackParser)) {
45-
options.stackParser = createStackParser(...options.stackParser);
46-
}
47-
48-
if (typeof options.stackParser === 'function') {
49-
return options.stackParser;
50-
}
39+
export function stackParserFromOptions(stackParser: StackParser | StackLineParser[]): StackParser {
40+
if (Array.isArray(stackParser)) {
41+
return createStackParser(...stackParser);
5142
}
52-
53-
return _ => [];
43+
return stackParser;
5444
}
5545

5646
/**

0 commit comments

Comments
 (0)