diff options
Diffstat (limited to 'cmd/mirum-server/web/lib/errors.ts')
| -rw-r--r-- | cmd/mirum-server/web/lib/errors.ts | 66 | +33 −33 |
1 files changed, 33 insertions, 33 deletions
diff --git a/cmd/mirum-server/web/lib/errors.ts b/cmd/mirum-server/web/lib/errors.ts index 2244d1b..c9ec786 100644 --- a/cmd/mirum-server/web/lib/errors.ts +++ b/cmd/mirum-server/web/lib/errors.ts @@ -1,84 +1,84 @@ // Copyright (c) 2026 Nikolay Govorov // SPDX-License-Identifier: AGPL-3.0-or-later -import { Code, ConnectError } from "@connectrpc/connect" -import { ErrorInfoSchema, ErrorReason } from "@/gen/api_pb" +import { Code, ConnectError } from "@connectrpc/connect"; +import { ErrorInfoSchema, ErrorReason } from "@/gen/api_pb"; // errorReason extracts the ErrorInfo.reason attached by the server. // Returns null for transport failures or non-mirum responses. export function errorReason(err: unknown): ErrorReason | null { - const info = ConnectError.from(err).findDetails(ErrorInfoSchema)[0] - return info?.reason ?? null + const info = ConnectError.from(err).findDetails(ErrorInfoSchema)[0]; + return info?.reason ?? null; } // formatError maps any thrown value to user-facing text. // All .catch() callers should route errors through this function. export function formatError(err: unknown): string { - const e = ConnectError.from(err) - const info = e.findDetails(ErrorInfoSchema)[0] + const e = ConnectError.from(err); + const info = e.findDetails(ErrorInfoSchema)[0]; if (info) { - return textForReason(info.reason) + return textForReason(info.reason); } - console.error("api error without ErrorInfo:", e) - return textForCode(e.code) + console.error("api error without ErrorInfo:", e); + return textForCode(e.code); } export function textForReason(reason: ErrorReason): string { switch (reason) { case ErrorReason.USER_NOT_FOUND: - return "User not found." + return "User not found."; case ErrorReason.ORG_NOT_FOUND: - return "Organization not found." + return "Organization not found."; case ErrorReason.WORKER_NOT_FOUND: - return "Worker not found." + return "Worker not found."; case ErrorReason.MEMBER_NOT_FOUND: - return "Member not found." + return "Member not found."; case ErrorReason.EMAIL_TAKEN: - return "This email is already in use." + return "This email is already in use."; case ErrorReason.SLUG_TAKEN: - return "This slug is already taken." + return "This slug is already taken."; case ErrorReason.ALREADY_MEMBER: - return "Already a member of this organization." + return "Already a member of this organization."; case ErrorReason.LAST_OWNER: - return "An organization must have at least one owner." + return "An organization must have at least one owner."; case ErrorReason.SOLE_OWNER: - return "This user is the sole owner of an organization. Transfer ownership first." + return "This user is the sole owner of an organization. Transfer ownership first."; case ErrorReason.INVALID_SLUG: - return "Invalid slug. Use lowercase letters, digits, and hyphens." + return "Invalid slug. Use lowercase letters, digits, and hyphens."; case ErrorReason.INVALID_ROLE: - return "Invalid role." + return "Invalid role."; case ErrorReason.RESERVED_EMAIL: - return "This email domain is reserved. Please use a different address." + return "This email domain is reserved. Please use a different address."; case ErrorReason.UNAUTHENTICATED: - return "Your session has expired. Please sign in again." + return "Your session has expired. Please sign in again."; case ErrorReason.PERMISSION_DENIED: - return "You don't have permission to do that." + return "You don't have permission to do that."; case ErrorReason.INVALID_CREDENTIALS: - return "Wrong email or password. Please try again." + return "Wrong email or password. Please try again."; case ErrorReason.INVALID_CSRF: - return "This form expired. Please try again." + return "This form expired. Please try again."; case ErrorReason.RATE_LIMITED: - return "Too many requests. Please slow down." + return "Too many requests. Please slow down."; case ErrorReason.UNAVAILABLE: - return "Service is temporarily unavailable. Please retry." + return "Service is temporarily unavailable. Please retry."; case ErrorReason.UNIMPLEMENTED: - return "This operation is not supported." + return "This operation is not supported."; case ErrorReason.INTERNAL: case ErrorReason.UNSPECIFIED: default: - return "Something went wrong. Please try again." + return "Something went wrong. Please try again."; } } function textForCode(code: Code): string { switch (code) { case Code.Canceled: - return "Request canceled." + return "Request canceled."; case Code.DeadlineExceeded: - return "Request timed out." + return "Request timed out."; case Code.Unavailable: - return "Service is temporarily unavailable. Please retry." + return "Service is temporarily unavailable. Please retry."; default: - return "Connection failed. Please retry." + return "Connection failed. Please retry."; } } |
