diff --git a/packages/integrations/src/base/errors/decorator.ts b/packages/integrations/src/base/errors/decorator.ts index f9f3a7663..c5a200162 100644 --- a/packages/integrations/src/base/errors/decorator.ts +++ b/packages/integrations/src/base/errors/decorator.ts @@ -3,8 +3,10 @@ import { logger } from "@homarr/log"; import type { Integration } from "../integration"; import type { IIntegrationErrorHandler } from "./handler"; +import { integrationFetchHttpErrorHandler } from "./http"; import { IntegrationError } from "./integration-error"; import { IntegrationUnknownError } from "./integration-unknown-error"; +import { integrationJsonParseErrorHandler, integrationZodParseErrorHandler } from "./parse"; const localLogger = logger.child({ module: "HandleIntegrationErrors", @@ -13,7 +15,14 @@ const localLogger = logger.child({ // eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-explicit-any type AbstractConstructor = abstract new (...args: any[]) => T; +const defaultErrorHandlers: IIntegrationErrorHandler[] = [ + integrationZodParseErrorHandler, + integrationJsonParseErrorHandler, + integrationFetchHttpErrorHandler, +]; + export const HandleIntegrationErrors = (errorHandlers: IIntegrationErrorHandler[]) => { + const combinedErrorHandlers = [...defaultErrorHandlers, ...errorHandlers]; return >(IntegrationBaseClass: T): T => { abstract class ErrorHandledIntegration extends IntegrationBaseClass { // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -42,7 +51,7 @@ export const HandleIntegrationErrors = (errorHandlers: IIntegrationErrorHandler[ throw error; } - for (const handler of errorHandlers) { + for (const handler of combinedErrorHandlers) { const handledError = handler.handleError(error, this.publicIntegration); if (!handledError) continue; diff --git a/packages/integrations/src/base/integration.ts b/packages/integrations/src/base/integration.ts index 5496e3e38..9ff86b662 100644 --- a/packages/integrations/src/base/integration.ts +++ b/packages/integrations/src/base/integration.ts @@ -8,8 +8,6 @@ import { removeTrailingSlash } from "@homarr/common"; import type { IntegrationSecretKind } from "@homarr/definitions"; import { HandleIntegrationErrors } from "./errors/decorator"; -import { integrationFetchHttpErrorHandler } from "./errors/http"; -import { integrationJsonParseErrorHandler, integrationZodParseErrorHandler } from "./errors/parse"; import { TestConnectionError } from "./test-connection/test-connection-error"; import type { TestingResult } from "./test-connection/test-connection-service"; import { TestConnectionService } from "./test-connection/test-connection-service"; @@ -32,11 +30,7 @@ export interface IntegrationTestingInput { }; } -@HandleIntegrationErrors([ - integrationZodParseErrorHandler, - integrationJsonParseErrorHandler, - integrationFetchHttpErrorHandler, -]) +@HandleIntegrationErrors([]) export abstract class Integration { constructor(protected integration: IntegrationInput) {} diff --git a/packages/integrations/src/opnsense/opnsense-integration.ts b/packages/integrations/src/opnsense/opnsense-integration.ts index 5c86054b1..d8f84c723 100644 --- a/packages/integrations/src/opnsense/opnsense-integration.ts +++ b/packages/integrations/src/opnsense/opnsense-integration.ts @@ -2,7 +2,6 @@ import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import { ParseError, ResponseError } from "@homarr/common/server"; import { createChannelEventHistoryOld } from "../../../redis/src/lib/channel"; -import { HandleIntegrationErrors } from "../base/errors/decorator"; import type { IntegrationTestingInput } from "../base/integration"; import { Integration } from "../base/integration"; import { TestConnectionError } from "../base/test-connection/test-connection-error"; @@ -22,7 +21,6 @@ import { opnsenseSystemSummarySchema, } from "./opnsense-types"; -@HandleIntegrationErrors([]) export class OPNsenseIntegration extends Integration implements FirewallSummaryIntegration { protected async testingAsync(input: IntegrationTestingInput): Promise { const response = await input.fetchAsync(this.url("/api/diagnostics/system/system_information"), {