Skip to content

Commit 11479da

Browse files
committed
fix: improve error mapping for leader failover reconnection
- Map gRPC INTERNAL and DATA_LOSS status codes to UnavailableError so the client retries on these transient failures during leader failover - Add UnavailableError, DeadlineExceededError, and UnknownError handling to bridge error conversion - Use string literals for error name matching instead of class .name references for reliability - Remove stale commented-out code in convertBridgeError - Default unrecognized bridge errors to UnknownError instead of passing through the raw error
1 parent d2bc854 commit 11479da

File tree

2 files changed

+16
-25
lines changed

2 files changed

+16
-25
lines changed

packages/db-client/src/utils/CommandError.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,8 @@ export const convertToCommandError = (error: Error): CommandError | Error => {
640640
case StatusCode.DEADLINE_EXCEEDED:
641641
return new DeadlineExceededError(error);
642642
case StatusCode.UNAVAILABLE:
643+
case StatusCode.INTERNAL:
644+
case StatusCode.DATA_LOSS:
643645
return new UnavailableError(error);
644646
case StatusCode.UNAUTHENTICATED:
645647
return new AccessDeniedError(error);

packages/db-client/src/utils/convertBridgeError.ts

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,32 @@ import {
33
StreamNotFoundError,
44
StreamDeletedError,
55
AccessDeniedError,
6+
UnavailableError,
7+
DeadlineExceededError,
8+
UnknownError,
69
} from "./CommandError";
710
import { ServiceError } from "@grpc/grpc-js";
811

9-
// export const convertBridgeError = (
10-
// error: ServiceError,
11-
// streamName?: string
12-
// ) => {
13-
// const stream = streamName ?? "unknown stream";
14-
//
15-
// switch (error.name) {
16-
// case StreamNotFoundError.name:
17-
// throw new StreamNotFoundError(error, stream);
18-
// case StreamDeletedError.name:
19-
// throw StreamDeletedError.fromStreamName(stream);
20-
// case NotLeaderError.name:
21-
// throw new NotLeaderError(error);
22-
// case AccessDeniedError.name:
23-
// throw new AccessDeniedError(error);
24-
// default:
25-
// throw error;
26-
// }
27-
// };
28-
2912
export const convertBridgeError = (error: Error, streamName?: string) => {
3013
const stream = streamName ?? "unknown stream";
3114
const serviceError = error as ServiceError;
3215

3316
switch (error.name) {
34-
case StreamNotFoundError.name:
17+
case "StreamNotFoundError":
3518
return new StreamNotFoundError(serviceError, stream);
36-
case StreamDeletedError.name:
19+
case "StreamDeletedError":
3720
return StreamDeletedError.fromStreamName(stream);
38-
case NotLeaderError.name:
21+
case "NotLeaderError":
3922
return new NotLeaderError(serviceError);
40-
case AccessDeniedError.name:
23+
case "AccessDeniedError":
4124
return new AccessDeniedError(serviceError);
25+
case "UnavailableError":
26+
return new UnavailableError(serviceError);
27+
case "DeadlineExceededError":
28+
return new DeadlineExceededError(serviceError);
29+
case "UnknownError":
30+
return new UnknownError(serviceError);
4231
default:
43-
return error;
32+
return new UnknownError(serviceError);
4433
}
4534
};

0 commit comments

Comments
 (0)