11/* eslint-disable max-lines */ // TODO: We might want to split this file up
2- import { addGlobalEventProcessor , captureException , getCurrentHub , Scope , setContext } from '@sentry/core' ;
3- import { Breadcrumb , Client , Event } from '@sentry/types' ;
4- import { addInstrumentationHandler , createEnvelope , logger } from '@sentry/utils' ;
2+ import { addGlobalEventProcessor , captureException , getCurrentHub , setContext } from '@sentry/core' ;
3+ import { Breadcrumb , Event } from '@sentry/types' ;
4+ import { addInstrumentationHandler , logger } from '@sentry/utils' ;
55import debounce from 'lodash.debounce' ;
66import { EventType , record } from 'rrweb' ;
77
@@ -44,6 +44,8 @@ import { addMemoryEntry } from './util/addMemoryEntry';
4444import { createBreadcrumb } from './util/createBreadcrumb' ;
4545import { createPayload } from './util/createPayload' ;
4646import { createPerformanceSpans } from './util/createPerformanceSpans' ;
47+ import { createReplayEnvelope } from './util/createReplayEnvelope' ;
48+ import { getReplayEvent } from './util/getReplayEvent' ;
4749import { isExpired } from './util/isExpired' ;
4850import { isSessionExpired } from './util/isSessionExpired' ;
4951import { overwriteRecordDroppedEvent , restoreRecordDroppedEvent } from './util/monkeyPatchRecordDroppedEvent' ;
@@ -906,7 +908,7 @@ export class ReplayContainer implements ReplayContainerInterface {
906908 */
907909 async sendReplayRequest ( {
908910 events,
909- replayId : event_id ,
911+ replayId,
910912 segmentId : segment_id ,
911913 includeReplayStartTimestamp,
912914 eventContext,
@@ -922,77 +924,76 @@ export class ReplayContainer implements ReplayContainerInterface {
922924
923925 const currentTimestamp = new Date ( ) . getTime ( ) ;
924926
925- const sdkInfo = {
926- name : 'sentry.javascript.integration.replay' ,
927- version : __SENTRY_REPLAY_VERSION__ ,
928- } ;
927+ const hub = getCurrentHub ( ) ;
928+ const client = hub . getClient ( ) ;
929+ const scope = hub . getScope ( ) ;
930+ const transport = client && client . getTransport ( ) ;
929931
930- const replayEvent = await new Promise ( resolve => {
931- getCurrentHub ( )
932- // @ts -ignore private api
933- ?. _withClient ( async ( client : Client , scope : Scope ) => {
934- // XXX: This event does not trigger `beforeSend` in SDK
935- // @ts -ignore private api
936- const preparedEvent : Event = await client . _prepareEvent (
937- {
938- type : REPLAY_EVENT_NAME ,
939- ...( includeReplayStartTimestamp ? { replay_start_timestamp : initialTimestamp / 1000 } : { } ) ,
940- timestamp : currentTimestamp / 1000 ,
941- error_ids : errorIds ,
942- trace_ids : traceIds ,
943- urls,
944- replay_id : event_id ,
945- segment_id,
946- } ,
947- { event_id } ,
948- scope ,
949- ) ;
950- const session = scope && scope . getSession ( ) ;
951- if ( session ) {
952- // @ts -ignore private api
953- client . _updateSessionFromEvent ( session , preparedEvent ) ;
954- }
932+ if ( ! client || ! scope || ! transport ) {
933+ return ;
934+ }
955935
956- preparedEvent . sdk = {
957- ...preparedEvent . sdk ,
958- ...sdkInfo ,
959- } ;
936+ const baseEvent : Event = {
937+ // @ts -ignore private api
938+ type : REPLAY_EVENT_NAME ,
939+ ...( includeReplayStartTimestamp ? { replay_start_timestamp : initialTimestamp / 1000 } : { } ) ,
940+ timestamp : currentTimestamp / 1000 ,
941+ error_ids : errorIds ,
942+ trace_ids : traceIds ,
943+ urls,
944+ replay_id : replayId ,
945+ segment_id,
946+ } ;
960947
961- preparedEvent . tags = {
962- ...preparedEvent . tags ,
963- sessionSampleRate : this . _options . sessionSampleRate ,
964- errorSampleRate : this . _options . errorSampleRate ,
965- replayType : this . session ?. sampled ,
966- } ;
948+ const replayEvent = await getReplayEvent ( { scope, client, replayId, event : baseEvent } ) ;
967949
968- resolve ( preparedEvent ) ;
969- } ) ;
970- } ) ;
950+ replayEvent . tags = {
951+ ...replayEvent . tags ,
952+ sessionSampleRate : this . _options . sessionSampleRate ,
953+ errorSampleRate : this . _options . errorSampleRate ,
954+ replayType : this . session ?. sampled ,
955+ } ;
971956
972- const envelope = createEnvelope (
973- {
974- event_id,
975- sent_at : new Date ( ) . toISOString ( ) ,
976- sdk : sdkInfo ,
977- } ,
978- [
979- // @ts -ignore New types
980- [ { type : 'replay_event' } , replayEvent ] ,
981- [
982- {
983- // @ts -ignore setting envelope
984- type : 'replay_recording' ,
985- length : payloadWithSequence . length ,
986- } ,
987- // @ts -ignore: Type 'string' is not assignable to type 'ClientReport'.ts(2322)
988- payloadWithSequence ,
957+ /*
958+ For reference, the fully built event looks something like this:
959+ {
960+ "type": "replay_event",
961+ "timestamp": 1670837008.634,
962+ "error_ids": [
963+ "errorId"
964+ ],
965+ "trace_ids": [
966+ "traceId"
989967 ],
990- ] ,
991- ) ;
968+ "urls": [
969+ "https://example.com"
970+ ],
971+ "replay_id": "eventId",
972+ "segment_id": 3,
973+ "platform": "javascript",
974+ "event_id": "eventId",
975+ "environment": "production",
976+ "sdk": {
977+ "integrations": [
978+ "BrowserTracing",
979+ "Replay"
980+ ],
981+ "name": "sentry.javascript.integration.replay",
982+ "version": "7.24.2"
983+ },
984+ "sdkProcessingMetadata": {},
985+ "tags": {
986+ "sessionSampleRate": 1,
987+ "errorSampleRate": 0,
988+ "replayType": "error"
989+ }
990+ }
991+ */
992+
993+ const envelope = createReplayEnvelope ( replayId , replayEvent , payloadWithSequence ) ;
992994
993- const client = getCurrentHub ( ) . getClient ( ) ;
994995 try {
995- return client ?. getTransport ( ) ? .send ( envelope ) ;
996+ return transport . send ( envelope ) ;
996997 } catch {
997998 throw new Error ( UNABLE_TO_SEND_REPLAY ) ;
998999 }
0 commit comments