Skip to content

Commit 58a4019

Browse files
committed
feat: Delete store endpoint code
1 parent f0b6291 commit 58a4019

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed

packages/core/src/request.ts

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import {
2+
DsnComponents,
3+
Event,
4+
EventEnvelope,
5+
EventItem,
6+
SdkInfo,
7+
SdkMetadata,
8+
SentryRequestType,
9+
Session,
10+
SessionAggregates,
11+
SessionEnvelope,
12+
SessionItem,
13+
} from '@sentry/types';
14+
import { createEnvelope, dsnToString } from '@sentry/utils';
15+
16+
/** Extract sdk info from from the API metadata */
17+
function getSdkMetadataForEnvelopeHeader(metadata?: SdkMetadata): SdkInfo | undefined {
18+
if (!metadata || !metadata.sdk) {
19+
return;
20+
}
21+
const { name, version } = metadata.sdk;
22+
return { name, version };
23+
}
24+
25+
/**
26+
* Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.
27+
* Merge with existing data if any.
28+
**/
29+
function enhanceEventWithSdkInfo(event: Event, sdkInfo?: SdkInfo): Event {
30+
if (!sdkInfo) {
31+
return event;
32+
}
33+
event.sdk = event.sdk || {};
34+
event.sdk.name = event.sdk.name || sdkInfo.name;
35+
event.sdk.version = event.sdk.version || sdkInfo.version;
36+
event.sdk.integrations = [...(event.sdk.integrations || []), ...(sdkInfo.integrations || [])];
37+
event.sdk.packages = [...(event.sdk.packages || []), ...(sdkInfo.packages || [])];
38+
return event;
39+
}
40+
41+
/** Creates an envelope from a Session */
42+
export function createSessionEnvelope(
43+
session: Session | SessionAggregates,
44+
dsn: DsnComponents,
45+
metadata?: SdkMetadata,
46+
tunnel?: string,
47+
): SessionEnvelope {
48+
const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);
49+
const envelopeHeaders = {
50+
sent_at: new Date().toISOString(),
51+
...(sdkInfo && { sdk: sdkInfo }),
52+
...(!!tunnel && { dsn: dsnToString(dsn) }),
53+
};
54+
55+
// I know this is hacky but we don't want to add `sessions` to request type since it's never rate limited
56+
const type = 'aggregates' in session ? ('sessions' as SentryRequestType) : 'session';
57+
58+
// TODO (v7) Have to cast type because envelope items do not accept a `SentryRequestType`
59+
const envelopeItem = [{ type } as { type: 'session' | 'sessions' }, session] as SessionItem;
60+
const envelope = createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);
61+
62+
return envelope;
63+
}
64+
65+
/**
66+
* Create an Envelope from an event.
67+
*/
68+
export function createEventEnvelope(
69+
event: Event,
70+
dsn: DsnComponents,
71+
metadata?: SdkMetadata,
72+
tunnel?: string,
73+
): EventEnvelope {
74+
const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);
75+
const eventType = event.type || 'event';
76+
77+
const { transactionSampling } = event.sdkProcessingMetadata || {};
78+
const { method: samplingMethod, rate: sampleRate } = transactionSampling || {};
79+
80+
// TODO: Below is a temporary hack in order to debug a serialization error - see
81+
// https://github.com/getsentry/sentry-javascript/issues/2809,
82+
// https://github.com/getsentry/sentry-javascript/pull/4425, and
83+
// https://github.com/getsentry/sentry-javascript/pull/4574.
84+
//
85+
// TL; DR: even though we normalize all events (which should prevent this), something is causing `JSON.stringify` to
86+
// throw a circular reference error.
87+
//
88+
// When it's time to remove it:
89+
// 1. Delete everything between here and where the request object `req` is created, EXCEPT the line deleting
90+
// `sdkProcessingMetadata`
91+
// 2. Restore the original version of the request body, which is commented out
92+
// 3. Search for either of the PR URLs above and pull out the companion hacks in the browser playwright tests and the
93+
// baseClient tests in this package
94+
enhanceEventWithSdkInfo(event, metadata && metadata.sdk);
95+
event.tags = event.tags || {};
96+
event.extra = event.extra || {};
97+
98+
// In theory, all events should be marked as having gone through normalization and so
99+
// we should never set this tag/extra data
100+
if (!(event.sdkProcessingMetadata && event.sdkProcessingMetadata.baseClientNormalized)) {
101+
event.tags.skippedNormalization = true;
102+
event.extra.normalizeDepth = event.sdkProcessingMetadata ? event.sdkProcessingMetadata.normalizeDepth : 'unset';
103+
}
104+
105+
// prevent this data from being sent to sentry
106+
// TODO: This is NOT part of the hack - DO NOT DELETE
107+
delete event.sdkProcessingMetadata;
108+
109+
const envelopeHeaders = {
110+
event_id: event.event_id as string,
111+
sent_at: new Date().toISOString(),
112+
...(sdkInfo && { sdk: sdkInfo }),
113+
...(!!tunnel && { dsn: dsnToString(dsn) }),
114+
};
115+
const eventItem: EventItem = [
116+
{
117+
type: eventType,
118+
sample_rates: [{ id: samplingMethod, rate: sampleRate }],
119+
},
120+
event,
121+
];
122+
return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);
123+
}

0 commit comments

Comments
 (0)