Skip to content

Commit ed743ea

Browse files
author
Luca Forstner
committed
ref: Add back client reporting to BrowserClient
1 parent b421219 commit ed743ea

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

packages/browser/src/client.ts

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
import { BaseClient, Scope, SDK_VERSION } from '@sentry/core';
1+
import { BaseClient, getEnvelopeEndpointWithUrlEncodedAuth, Scope, SDK_VERSION } from '@sentry/core';
22
import { ClientOptions, Event, EventHint, Options, Severity, SeverityLevel } from '@sentry/types';
3-
import { getGlobalObject, logger } from '@sentry/utils';
3+
import { createClientReportEnvelope, dsnToString, getGlobalObject, logger, serializeEnvelope } from '@sentry/utils';
44

55
import { eventFromException, eventFromMessage } from './eventbuilder';
66
import { IS_DEBUG_BUILD } from './flags';
77
import { injectReportDialog, ReportDialogOptions } from './helpers';
88
import { Breadcrumbs } from './integrations';
9+
import { sendReport } from './transports/utils';
10+
11+
const globalObject = getGlobalObject<Window>();
912

1013
export interface BaseBrowserOptions {
1114
/**
@@ -59,7 +62,16 @@ export class BrowserClient extends BaseClient<BrowserClientOptions> {
5962
],
6063
version: SDK_VERSION,
6164
};
65+
6266
super(options);
67+
68+
if (options.sendClientReports && globalObject.document) {
69+
globalObject.document.addEventListener('visibilitychange', () => {
70+
if (globalObject.document.visibilityState === 'hidden') {
71+
this._flushOutcomes();
72+
}
73+
});
74+
}
6375
}
6476

6577
/**
@@ -122,4 +134,32 @@ export class BrowserClient extends BaseClient<BrowserClientOptions> {
122134
}
123135
super._sendEvent(event);
124136
}
137+
138+
/**
139+
* Sends client reports as an envelope.
140+
*/
141+
private _flushOutcomes(): void {
142+
const outcomes = this._clearOutcomes();
143+
144+
if (outcomes.length === 0) {
145+
IS_DEBUG_BUILD && logger.log('No outcomes to send');
146+
return;
147+
}
148+
149+
if (!this._dsn) {
150+
IS_DEBUG_BUILD && logger.log('No dsn provided, will not send outcomes');
151+
return;
152+
}
153+
154+
IS_DEBUG_BUILD && logger.log(`Sending outcomes:\n${JSON.stringify(outcomes, null, 2)}`);
155+
156+
const url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, this._options.tunnel);
157+
const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));
158+
159+
try {
160+
sendReport(url, serializeEnvelope(envelope));
161+
} catch (e) {
162+
IS_DEBUG_BUILD && logger.error(e);
163+
}
164+
}
125165
}

0 commit comments

Comments
 (0)