diff --git a/packages/core-internal/src/errors/sdkErrors.ts b/packages/core-internal/src/errors/sdkErrors.ts index 0bc8f9a1ad..f869097687 100644 --- a/packages/core-internal/src/errors/sdkErrors.ts +++ b/packages/core-internal/src/errors/sdkErrors.ts @@ -147,9 +147,15 @@ export class SdkError extends Error { constructor( public readonly code: SdkErrorCode, message: string, - public readonly data?: unknown + public readonly data?: unknown, + options?: ErrorOptions ) { - super(message); + const errorOptions = + options ?? + (data && typeof data === 'object' && 'cause' in data && (data as { cause: unknown }).cause !== undefined + ? { cause: (data as { cause: unknown }).cause } + : undefined); + super(message, errorOptions); this.name = 'SdkError'; stampErrorBrands(this, new.target); } diff --git a/packages/core-internal/test/types/errorSurfacePins.test.ts b/packages/core-internal/test/types/errorSurfacePins.test.ts index cc01cf4c57..a18b864013 100644 --- a/packages/core-internal/test/types/errorSurfacePins.test.ts +++ b/packages/core-internal/test/types/errorSurfacePins.test.ts @@ -196,6 +196,23 @@ describe('SdkError', () => { expect(error.message).toBe('Request timed out'); }); + test('preserves error cause in Error.cause when passed via data.cause or options', () => { + const underlyingError = new TypeError('fetch failed: getaddrinfo ENOTFOUND host.invalid'); + + // When cause is passed via data object (as in classifyNetworkError) + const errorFromData = new SdkError(SdkErrorCode.EraNegotiationFailed, 'Version negotiation probe failed', { + cause: underlyingError + }); + expect(errorFromData.cause).toBe(underlyingError); + expect(errorFromData.data).toEqual({ cause: underlyingError }); + + // When cause is passed via standard ErrorOptions + const errorFromOptions = new SdkError(SdkErrorCode.EraNegotiationFailed, 'Version negotiation probe failed', undefined, { + cause: underlyingError + }); + expect(errorFromOptions.cause).toBe(underlyingError); + }); + test('SdkHttpError carries the HTTP status in data', () => { const error = new SdkHttpError(SdkErrorCode.ClientHttpFailedToOpenStream, 'Failed to open SSE stream: Not Found', { status: 404,