diff --git a/packages/cloudflare/src/transport.ts b/packages/cloudflare/src/transport.ts index eee54bd7a790..8881e2dd6567 100644 --- a/packages/cloudflare/src/transport.ts +++ b/packages/cloudflare/src/transport.ts @@ -2,6 +2,8 @@ import type { BaseTransportOptions, Transport, TransportMakeRequestResponse, Tra import { createTransport, SENTRY_BUFFER_FULL_ERROR, suppressTracing } from '@sentry/core'; export interface CloudflareTransportOptions extends BaseTransportOptions { + /** Custom fetch function to use. This allows usage of things like Workers VPC */ + fetch?: typeof fetch; /** Fetch API init parameters. */ fetchOptions?: RequestInit; } @@ -87,7 +89,7 @@ export function makeCloudflareTransport(options: CloudflareTransportOptions): Tr }; return suppressTracing(() => { - return fetch(options.url, requestOptions).then(response => { + return (options.fetch ?? fetch)(options.url, requestOptions).then(response => { return { statusCode: response.status, headers: { diff --git a/packages/cloudflare/test/transport.test.ts b/packages/cloudflare/test/transport.test.ts index 5de33cc7cb80..71b231f542af 100644 --- a/packages/cloudflare/test/transport.test.ts +++ b/packages/cloudflare/test/transport.test.ts @@ -161,4 +161,20 @@ describe('IsolatedPromiseBuffer', () => { expect(task1).toHaveBeenCalled(); expect(task2).toHaveBeenCalled(); }); + + it('should allow for a custom fetch function to be passed in', async () => { + const customFetch = vi.fn(async () => { + return { + headers: new Headers(), + status: 200, + text: () => Promise.resolve({}), + } as unknown as Response; + }); + + const transport = makeCloudflareTransport({ ...DEFAULT_EDGE_TRANSPORT_OPTIONS, fetch: customFetch }); + + await transport.send(ERROR_ENVELOPE); + await transport.flush(); + expect(customFetch).toHaveBeenCalledTimes(1); + }); });