feat(errors): add centralized exception handling

This commit is contained in:
2026-07-03 12:55:45 +08:00
parent e852fb62e9
commit 65d972fbb4
20 changed files with 492 additions and 70 deletions
+12 -16
View File
@@ -3,6 +3,7 @@
*/
import { setup, assign } from "xstate";
import { ExceptionHandler } from "@/core/errors";
import type { AuthProvider } from "@/lib/auth/auth_platform";
import { AuthState, initialState } from "./auth-state";
@@ -23,6 +24,9 @@ export type { AuthState } from "./auth-state";
export { initialState } from "./auth-state";
export type { AuthEvent } from "./auth-events";
const toAuthErrorMessage = (error: unknown): string =>
ExceptionHandler.message(error);
// ============================================================
// Machine
//
@@ -119,8 +123,7 @@ export const authMachine = setup({
onError: {
target: "idle",
actions: assign({
errorMessage: ({ event }) =>
event.error instanceof Error ? event.error.message : String(event.error),
errorMessage: ({ event }) => toAuthErrorMessage(event.error),
hasInitialized: true,
}),
},
@@ -145,8 +148,7 @@ export const authMachine = setup({
onError: {
target: "idle",
actions: assign({
errorMessage: ({ event }) =>
event.error instanceof Error ? event.error.message : String(event.error),
errorMessage: ({ event }) => toAuthErrorMessage(event.error),
hasInitialized: true,
}),
},
@@ -174,8 +176,7 @@ export const authMachine = setup({
onError: {
target: "idle",
actions: assign({
errorMessage: ({ event }) =>
event.error instanceof Error ? event.error.message : String(event.error),
errorMessage: ({ event }) => toAuthErrorMessage(event.error),
hasInitialized: true,
}),
},
@@ -208,8 +209,7 @@ export const authMachine = setup({
onError: {
target: "idle",
actions: assign({
errorMessage: ({ event }) =>
event.error instanceof Error ? event.error.message : String(event.error),
errorMessage: ({ event }) => toAuthErrorMessage(event.error),
hasInitialized: true,
}),
},
@@ -231,8 +231,7 @@ export const authMachine = setup({
onError: {
target: "idle",
actions: assign({
errorMessage: ({ event }) =>
event.error instanceof Error ? event.error.message : String(event.error),
errorMessage: ({ event }) => toAuthErrorMessage(event.error),
}),
},
},
@@ -254,8 +253,7 @@ export const authMachine = setup({
actions: assign(({ event }) => ({
...initialState,
hasInitialized: true,
errorMessage:
event.error instanceof Error ? event.error.message : String(event.error),
errorMessage: toAuthErrorMessage(event.error),
})),
},
},
@@ -281,8 +279,7 @@ export const authMachine = setup({
onError: {
target: "idle",
actions: assign({
errorMessage: ({ event }) =>
event.error instanceof Error ? event.error.message : String(event.error),
errorMessage: ({ event }) => toAuthErrorMessage(event.error),
hasInitialized: true,
}),
},
@@ -309,8 +306,7 @@ export const authMachine = setup({
onError: {
target: "idle",
actions: assign({
errorMessage: ({ event }) =>
event.error instanceof Error ? event.error.message : String(event.error),
errorMessage: ({ event }) => toAuthErrorMessage(event.error),
hasInitialized: true,
}),
},
+2 -2
View File
@@ -1,5 +1,6 @@
import { fromCallback, fromPromise } from "xstate";
import { ExceptionHandler } from "@/core/errors";
import { MessageQueue } from "@/core/net/message-queue";
import type { ChatSendResponse } from "@/data/dto/chat";
import { getChatRepository } from "@/data/repositories/chat_repository";
@@ -131,8 +132,7 @@ function createMessageQueueActor(
const output = await sendMessageViaHttp(content);
sendBack({ type: "ChatQueuedHttpDone", output });
} catch (error) {
const errorMessage =
error instanceof Error ? error.message : "Message send failed";
const errorMessage = ExceptionHandler.message(error);
log.error("[chat-machine] message queue send failed", {
error,
});
@@ -1,3 +1,4 @@
import { ExceptionHandler } from "@/core/errors";
import { PaymentPlan, type PaymentPlansResponse } from "@/data/dto/payment";
import type { PaymentState } from "./payment-state";
@@ -7,7 +8,7 @@ export const PAYMENT_TIMEOUT_ERROR_MESSAGE =
"Payment timed out. Please try again.";
export function toPaymentErrorMessage(error: unknown): string {
return error instanceof Error ? error.message : String(error);
return ExceptionHandler.message(error);
}
export function hasOrderPollingTimedOut(