From 21d011dd12d57ea780440838d420dff09c8cf559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 30 May 2025 01:11:10 +0200 Subject: [PATCH] QueryErrorHandler refactoring --- .../extension-query/src/QueryErrorHandler.ts | 68 +++++++------------ 1 file changed, 23 insertions(+), 45 deletions(-) diff --git a/packages/extension-query/src/QueryErrorHandler.ts b/packages/extension-query/src/QueryErrorHandler.ts index ebfa750..1c0e04b 100644 --- a/packages/extension-query/src/QueryErrorHandler.ts +++ b/packages/extension-query/src/QueryErrorHandler.ts @@ -1,5 +1,4 @@ -import { Cause, Context, Effect, identity, Layer, PubSub, Stream } from "effect" -import type { Mutable } from "effect/Types" +import { Cause, Effect, identity, PubSub, Stream } from "effect" export interface QueryErrorHandler { @@ -11,55 +10,34 @@ export type Fallback = T extends QueryErrorHandler ? A : never export type Error = T extends QueryErrorHandler ? E : never -export interface ServiceResult< - Self, - Id extends string, - FallbackA, - HandledE, -> extends Context.TagClass< - Self, - Id, - QueryErrorHandler -> { - readonly Default: Layer.Layer -} - -export const Service = () => ( - ( - id: Id, +export const make = () => ( + ( f: ( self: Effect.Effect, failure: (failure: HandledE) => Effect.Effect, defect: (defect: unknown) => Effect.Effect, - ) => Effect.Effect, - ): ServiceResult => { - const TagClass = Context.Tag(id)() as ServiceResult + ) => Effect.Effect + ): Effect.Effect> => Effect.gen(function*() { + const pubsub = yield* PubSub.unbounded>() + const errors = Stream.fromPubSub(pubsub) - (TagClass as Mutable).Default = Layer.effect(TagClass, Effect.gen(function*() { - const pubsub = yield* PubSub.unbounded>() - const errors = Stream.fromPubSub(pubsub) + const handle = ( + self: Effect.Effect + ): Effect.Effect, R> => f( + self as unknown as Effect.Effect, + (failure: HandledE) => PubSub.publish(pubsub, Cause.fail(failure)).pipe( + Effect.andThen(Effect.failCause(Cause.empty)) + ), + (defect: unknown) => PubSub.publish(pubsub, Cause.die(defect)).pipe( + Effect.andThen(Effect.failCause(Cause.empty)) + ), + ) - const handle = ( - self: Effect.Effect - ): Effect.Effect, R> => f( - self as unknown as Effect.Effect, - (failure: HandledE) => PubSub.publish(pubsub, Cause.fail(failure)).pipe( - Effect.andThen(Effect.failCause(Cause.empty)) - ), - (defect: unknown) => PubSub.publish(pubsub, Cause.die(defect)).pipe( - Effect.andThen(Effect.failCause(Cause.empty)) - ), - ) - - return { errors, handle } - })) - - return TagClass - } + return { errors, handle } + }) ) -export class DefaultQueryErrorHandler extends Service()( - "@reffuse/extension-query/DefaultQueryErrorHandler", - identity, -) {} +export class DefaultQueryErrorHandler extends Effect.Service()("@reffuse/extension-query/DefaultQueryErrorHandler", { + effect: make()(identity) +}) {}