diff --git a/.changeset/grumpy-pens-compare.md b/.changeset/grumpy-pens-compare.md new file mode 100644 index 0000000000..957cb61920 --- /dev/null +++ b/.changeset/grumpy-pens-compare.md @@ -0,0 +1,21 @@ +--- +"@effect/platform": minor +--- + +make Http.middleware.withTracerDisabledWhen a Layer api + +And add Http.middleware.withTracerDisabledWhenEffect to operate on Effect's. + +Usage is now: + +```ts +import * as Http from "@effect/platform/HttpServer"; + +Http.router.empty.pipe( + Http.router.get("/health"), + Http.server.serve(), + Http.middleware.withTracerDisabledWhen( + (request) => request.url === "/no-tracing", + ), +); +``` diff --git a/.changeset/healthy-trees-crash.md b/.changeset/healthy-trees-crash.md new file mode 100644 index 0000000000..26a2b6464c --- /dev/null +++ b/.changeset/healthy-trees-crash.md @@ -0,0 +1,17 @@ +--- +"@effect/platform": patch +--- + +add Http.middleware.withTracerDisabledForUrls + +Allows you to disable the http server tracer for the given urls: + +```ts +import * as Http from "@effect/platform/HttpServer"; + +Http.router.empty.pipe( + Http.router.get("/health"), + Http.server.serve(), + Http.middleware.withTracerDisabledForUrls(["/health"]) +); +``` diff --git a/packages/platform/src/Http/Middleware.ts b/packages/platform/src/Http/Middleware.ts index ed2c56d2e8..a8910e3513 100644 --- a/packages/platform/src/Http/Middleware.ts +++ b/packages/platform/src/Http/Middleware.ts @@ -3,6 +3,7 @@ */ import type * as Effect from "effect/Effect" import type * as FiberRef from "effect/FiberRef" +import type * as Layer from "effect/Layer" import type * as Predicate from "effect/Predicate" import * as internal from "../internal/http/middleware.js" import type * as App from "./App.js" @@ -65,6 +66,20 @@ export const currentTracerDisabledWhen: FiberRef.FiberRef + ): (layer: Layer.Layer) => Layer.Layer + ( + layer: Layer.Layer, + predicate: Predicate.Predicate + ): Layer.Layer +} = internal.withTracerDisabledWhen + +/** + * @since 1.0.0 + * @category fiber refs + */ +export const withTracerDisabledWhenEffect: { ( predicate: Predicate.Predicate ): (effect: Effect.Effect) => Effect.Effect @@ -72,7 +87,16 @@ export const withTracerDisabledWhen: { effect: Effect.Effect, predicate: Predicate.Predicate ): Effect.Effect -} = internal.withTracerDisabledWhen +} = internal.withTracerDisabledWhenEffect + +/** + * @since 1.0.0 + * @category fiber refs + */ +export const withTracerDisabledForUrls: { + (urls: ReadonlyArray): (layer: Layer.Layer) => Layer.Layer + (layer: Layer.Layer, urls: ReadonlyArray): Layer.Layer +} = internal.withTracerDisabledForUrls /** * @since 1.0.0 diff --git a/packages/platform/src/internal/http/middleware.ts b/packages/platform/src/internal/http/middleware.ts index 7c11d2dd89..78ec8f8de9 100644 --- a/packages/platform/src/internal/http/middleware.ts +++ b/packages/platform/src/internal/http/middleware.ts @@ -4,6 +4,7 @@ import * as Effect from "effect/Effect" import * as FiberRef from "effect/FiberRef" import { constFalse, dual } from "effect/Function" import { globalValue } from "effect/GlobalValue" +import * as Layer from "effect/Layer" import * as Option from "effect/Option" import type * as Predicate from "effect/Predicate" import * as Headers from "../../Http/Headers.js" @@ -36,6 +37,17 @@ export const currentTracerDisabledWhen = globalValue( /** @internal */ export const withTracerDisabledWhen = dual< + ( + predicate: Predicate.Predicate + ) => (layer: Layer.Layer) => Layer.Layer, + ( + layer: Layer.Layer, + predicate: Predicate.Predicate + ) => Layer.Layer +>(2, (self, pred) => Layer.locally(self, currentTracerDisabledWhen, pred)) + +/** @internal */ +export const withTracerDisabledWhenEffect = dual< ( predicate: Predicate.Predicate ) => (effect: Effect.Effect) => Effect.Effect, @@ -45,6 +57,17 @@ export const withTracerDisabledWhen = dual< ) => Effect.Effect >(2, (self, pred) => Effect.locally(self, currentTracerDisabledWhen, pred)) +/** @internal */ +export const withTracerDisabledForUrls = dual< + ( + urls: ReadonlyArray + ) => (layer: Layer.Layer) => Layer.Layer, + ( + layer: Layer.Layer, + urls: ReadonlyArray + ) => Layer.Layer +>(2, (self, urls) => Layer.locally(self, currentTracerDisabledWhen, (req) => urls.includes(req.url))) + /** @internal */ export const logger = make((httpApp) => { let counter = 0