summaryrefslogtreecommitdiff
path: root/shared/logger/node_modules/@sentry/browser/esm/transports/fetch.js
diff options
context:
space:
mode:
authorrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
committerrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
commitbce557cc2dc767628bed6aac87301a1be7c5431b (patch)
treeb51a051228d01fe3306cd7626d4a96768aadb944 /shared/logger/node_modules/@sentry/browser/esm/transports/fetch.js
init commit
Diffstat (limited to 'shared/logger/node_modules/@sentry/browser/esm/transports/fetch.js')
-rw-r--r--shared/logger/node_modules/@sentry/browser/esm/transports/fetch.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/shared/logger/node_modules/@sentry/browser/esm/transports/fetch.js b/shared/logger/node_modules/@sentry/browser/esm/transports/fetch.js
new file mode 100644
index 0000000..bb836e3
--- /dev/null
+++ b/shared/logger/node_modules/@sentry/browser/esm/transports/fetch.js
@@ -0,0 +1,64 @@
+import { createTransport } from '@sentry/core';
+import { rejectedSyncPromise } from '@sentry/utils';
+import { getNativeFetchImplementation, clearCachedFetchImplementation } from './utils.js';
+
+/**
+ * Creates a Transport that uses the Fetch API to send events to Sentry.
+ */
+function makeFetchTransport(
+ options,
+ nativeFetch = getNativeFetchImplementation(),
+) {
+ let pendingBodySize = 0;
+ let pendingCount = 0;
+
+ function makeRequest(request) {
+ const requestSize = request.body.length;
+ pendingBodySize += requestSize;
+ pendingCount++;
+
+ const requestOptions = {
+ body: request.body,
+ method: 'POST',
+ referrerPolicy: 'origin',
+ headers: options.headers,
+ // Outgoing requests are usually cancelled when navigating to a different page, causing a "TypeError: Failed to
+ // fetch" error and sending a "network_error" client-outcome - in Chrome, the request status shows "(cancelled)".
+ // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're
+ // frequently sending events right before the user is switching pages (eg. whenfinishing navigation transactions).
+ // Gotchas:
+ // - `keepalive` isn't supported by Firefox
+ // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch):
+ // If the sum of contentLength and inflightKeepaliveBytes is greater than 64 kibibytes, then return a network error.
+ // We will therefore only activate the flag when we're below that limit.
+ // There is also a limit of requests that can be open at the same time, so we also limit this to 15
+ // See https://github.com/getsentry/sentry-javascript/pull/7553 for details
+ keepalive: pendingBodySize <= 60000 && pendingCount < 15,
+ ...options.fetchOptions,
+ };
+
+ try {
+ return nativeFetch(options.url, requestOptions).then(response => {
+ pendingBodySize -= requestSize;
+ pendingCount--;
+ return {
+ statusCode: response.status,
+ headers: {
+ 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
+ 'retry-after': response.headers.get('Retry-After'),
+ },
+ };
+ });
+ } catch (e) {
+ clearCachedFetchImplementation();
+ pendingBodySize -= requestSize;
+ pendingCount--;
+ return rejectedSyncPromise(e);
+ }
+ }
+
+ return createTransport(options, makeRequest);
+}
+
+export { makeFetchTransport };
+//# sourceMappingURL=fetch.js.map