From b26cbbac5763df8c90a8e4e80757b32f2cb05d3a Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Wed, 24 Apr 2024 13:16:04 -0500 Subject: [PATCH] don't crash ws connection when there's an internal error --- .../src/main/scala/lucuma/graphql/routes/Connection.scala | 2 +- .../core/src/main/scala/lucuma/graphql/routes/package.scala | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/scala/lucuma/graphql/routes/Connection.scala b/modules/core/src/main/scala/lucuma/graphql/routes/Connection.scala index 13d62a8..357c098 100644 --- a/modules/core/src/main/scala/lucuma/graphql/routes/Connection.scala +++ b/modules/core/src/main/scala/lucuma/graphql/routes/Connection.scala @@ -155,7 +155,7 @@ object Connection { case Success(op) => if (service.isSubscription(op)) subscribe(id, op) else execute(id, op) case Warning(_, op) => if (service.isSubscription(op)) subscribe(id, op) else execute(id, op) // n.b. warnings on subscribe are lost case Failure(ps) => send(Error(id, ps.toNonEmptyList.map(mkGraphqlError)).some) - case InternalError(err) => err.raiseError[F, Unit] + case InternalError(err) => send(Error(id, mkGraphqlErrors(err)).some) } (this, action) } diff --git a/modules/core/src/main/scala/lucuma/graphql/routes/package.scala b/modules/core/src/main/scala/lucuma/graphql/routes/package.scala index 8e5fe96..27f00e2 100644 --- a/modules/core/src/main/scala/lucuma/graphql/routes/package.scala +++ b/modules/core/src/main/scala/lucuma/graphql/routes/package.scala @@ -29,12 +29,15 @@ package object routes { def mkGraphqlErrors(problems: NonEmptyChain[Problem]): GraphQLErrors = problems.toNonEmptyList.map(mkGraphqlError) + def mkGraphqlErrors(error: Throwable): GraphQLErrors = + NonEmptyList.one(mkGraphqlError(Problem(s"Internal Error: ${error.getMessage}"))) + def mkFromServer[F[_]: MonadThrow](r: Result[Json], id: String): F[Either[FromServer.Error, FromServer.Data]] = r match { case Success(json) => FromServer.Data(id, GraphQLResponse(json.rightIor)).asRight.pure[F] case Warning(ps, json) => FromServer.Data(id, GraphQLResponse(Ior.both(mkGraphqlErrors(ps), json))).asRight.pure[F] case Failure(ps) => FromServer.Error(id, mkGraphqlErrors(ps)).asLeft.pure[F] - case InternalError(err) => MonadThrow[F].raiseError(err) + case InternalError(err) => FromServer.Error(id, mkGraphqlErrors(err)).asLeft.pure[F] } }