From 1b0973fbc12ab1442b6deb75b745c4ced7edf6fb Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Thu, 3 Aug 2023 16:02:16 +0100 Subject: [PATCH] Fixed error when configuring a new endpoint failed and fixed ping to now throw an error when parsing JSON --- ...environments.$environmentParam.endpoint.ts | 8 +++++- .../webapp/app/services/endpointApi.server.ts | 28 +++++++++++-------- apps/webapp/app/utils/json.ts | 17 +++++++++++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/apps/webapp/app/routes/resources.environments.$environmentParam.endpoint.ts b/apps/webapp/app/routes/resources.environments.$environmentParam.endpoint.ts index 91c33f854..5acb60120 100644 --- a/apps/webapp/app/routes/resources.environments.$environmentParam.endpoint.ts +++ b/apps/webapp/app/routes/resources.environments.$environmentParam.endpoint.ts @@ -57,6 +57,12 @@ export async function action({ request, params }: ActionArgs) { return json(submission); } - return json(e, { status: 400 }); + if (e instanceof Error) { + submission.error.url = `${e.name}: ${e.message}`; + } else { + submission.error.url = "Unknown error"; + } + + return json(submission, { status: 400 }); } } diff --git a/apps/webapp/app/services/endpointApi.server.ts b/apps/webapp/app/services/endpointApi.server.ts index f0af6bf68..6ff444ddf 100644 --- a/apps/webapp/app/services/endpointApi.server.ts +++ b/apps/webapp/app/services/endpointApi.server.ts @@ -14,7 +14,7 @@ import { RunJobBody, RunJobResponseSchema, } from "@trigger.dev/core"; -import { safeBodyFromResponse } from "~/utils/json"; +import { safeBodyFromResponse, safeParseBodyFromResponse } from "~/utils/json"; import { logger } from "./logger.server"; export class EndpointApiError extends Error { @@ -27,11 +27,7 @@ export class EndpointApiError extends Error { // TODO: this should work with tunnelling export class EndpointApi { - constructor( - private apiKey: string, - private url: string, - private id: string - ) {} + constructor(private apiKey: string, private url: string, private id: string) {} async ping(): Promise { const response = await safeFetch(this.url, { @@ -73,13 +69,23 @@ export class EndpointApi { }; } - const anyBody = await response.json(); + const pongResponse = await safeParseBodyFromResponse(response, PongResponseSchema); - logger.debug("ping() response from endpoint", { - body: anyBody, - }); + if (!pongResponse) { + return { + ok: false, + error: `Could not parse response from endpoint. Make sure it points to the correct URL (you might be missing /api/trigger)`, + }; + } - return PongResponseSchema.parse(anyBody); + if (!pongResponse.success) { + return { + ok: false, + error: `Endpoint ${this.url} responded with error: ${pongResponse.error.message}`, + }; + } + + return pongResponse.data; } async indexEndpoint() { diff --git a/apps/webapp/app/utils/json.ts b/apps/webapp/app/utils/json.ts index 61de6de4b..3e3313f9d 100644 --- a/apps/webapp/app/utils/json.ts +++ b/apps/webapp/app/utils/json.ts @@ -43,3 +43,20 @@ export async function safeBodyFromResponse( return parsedJson.data; } } + +export async function safeParseBodyFromResponse( + response: Response, + schema: z.Schema +): Promise | undefined> { + try { + const unknownJson = await response.json(); + + if (!unknownJson) { + return; + } + + const parsedJson = schema.safeParse(unknownJson); + + return parsedJson; + } catch (error) {} +}