From ed384a62a870fbd623d4e98a8378813bc40846d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Mar 2025 03:26:28 +0100 Subject: [PATCH] QueryClient work --- packages/extension-query/src/ErrorHandler.ts | 26 +++++++++++++++++++ .../extension-query/src/FailureHandler.ts | 20 -------------- packages/extension-query/src/QueryClient.ts | 25 +++++++++--------- 3 files changed, 38 insertions(+), 33 deletions(-) create mode 100644 packages/extension-query/src/ErrorHandler.ts delete mode 100644 packages/extension-query/src/FailureHandler.ts diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts new file mode 100644 index 0000000..bc10c75 --- /dev/null +++ b/packages/extension-query/src/ErrorHandler.ts @@ -0,0 +1,26 @@ +import { type Cause, type Context, Effect, Layer, Queue, Stream } from "effect" + + +export interface ErrorHandler { + readonly errors: Stream.Stream> + handle(self: Effect.Effect): Effect.Effect +} + +export const Tag = (id: Id) => < + Self, E = never, +>() => Effect.Tag(id)>() + +export const layer = ( + tag: Context.TagClass> +): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { + const queue = yield* Queue.unbounded>() + const errors = Stream.fromQueue(queue) + + const handle = ( + self: Effect.Effect + ) => Effect.tapErrorCause(self, cause => + Queue.offer(queue, cause as Cause.Cause) + ) as Effect.Effect + + return { errors, handle } +})) diff --git a/packages/extension-query/src/FailureHandler.ts b/packages/extension-query/src/FailureHandler.ts deleted file mode 100644 index e1f33ad..0000000 --- a/packages/extension-query/src/FailureHandler.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type Context, Effect, Layer, Queue, Stream } from "effect" - - -export interface FailureHandler { - readonly failures: Stream.Stream - readonly queue: Queue.Queue -} - -export const Tag = (id: Id) => < - Self, E = never, ->() => Effect.Tag(id)>() - -export const layer = ( - tag: Context.TagClass> -): Layer.Layer => Layer.effect(tag, Queue.unbounded().pipe( - Effect.map(queue => ({ - failures: Stream.fromQueue(queue), - queue, - })) -)) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index bf33a5a..fdbe679 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -1,20 +1,19 @@ import { Context, Effect, Layer } from "effect" +import * as ErrorHandler from "./ErrorHandler.js" -interface MyService { - readonly value: T +export interface QueryClient { + readonly ErrorHandler: Context.Tag> } -const MyServiceAnyTag = Context.GenericTag>("MyService") -const MyServiceStringTag = Context.GenericTag>("MyService") -declare const MyServiceAnyLayer: Layer.Layer> -declare const MyServiceStringLayer: Layer.Layer> +export interface LayerProps { + readonly ErrorHandler?: Context.Tag> +} - -const prg = Effect.gen(function*() { - yield* MyServiceAnyTag - yield* MyServiceStringTag -}).pipe( - Effect.provide(MyServiceStringLayer) -) +export const layer = ( + props: LayerProps +): Layer.Layer> => + Layer.effect(Context.GenericTag>("@reffuse/extension-query/QueryClient"), Effect.succeed({ + ErrorHandler: props.ErrorHandler + }))