From 57c98fdcda9cde2ac03a5c162f975e719ea43948 Mon Sep 17 00:00:00 2001 From: teddiesloco Date: Sat, 15 Aug 2026 13:32:07 +0700 Subject: [PATCH 1/2] fix(core-internal): preserve error cause and support ErrorOptions in SdkError --- packages/core-internal/src/errors/sdkErrors.ts | 10 ++++++++-- .../test/types/errorSurfacePins.test.ts | 13 +++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) 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..8cdfc9a8d6 100644 --- a/packages/core-internal/test/types/errorSurfacePins.test.ts +++ b/packages/core-internal/test/types/errorSurfacePins.test.ts @@ -196,6 +196,19 @@ 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, From 68b1e17036fff89c0eedc8ce72575c1b53fc2175 Mon Sep 17 00:00:00 2001 From: teddiesloco Date: Sat, 15 Aug 2026 18:08:04 +0700 Subject: [PATCH 2/2] style: fix prettier formatting in errorSurfacePins.test.ts --- .../core-internal/test/types/errorSurfacePins.test.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/core-internal/test/types/errorSurfacePins.test.ts b/packages/core-internal/test/types/errorSurfacePins.test.ts index 8cdfc9a8d6..a18b864013 100644 --- a/packages/core-internal/test/types/errorSurfacePins.test.ts +++ b/packages/core-internal/test/types/errorSurfacePins.test.ts @@ -198,14 +198,18 @@ describe('SdkError', () => { 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 }); + 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 }); + const errorFromOptions = new SdkError(SdkErrorCode.EraNegotiationFailed, 'Version negotiation probe failed', undefined, { + cause: underlyingError + }); expect(errorFromOptions.cause).toBe(underlyingError); });