@effect-app/infra 2.74.0 → 2.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/api/layerUtils.d.ts +22 -0
- package/dist/api/layerUtils.d.ts.map +1 -0
- package/dist/api/layerUtils.js +2 -0
- package/dist/api/routing/middleware/ContextProvider.d.ts +41 -0
- package/dist/api/routing/middleware/ContextProvider.d.ts.map +1 -0
- package/dist/api/routing/middleware/ContextProvider.js +27 -0
- package/dist/api/routing/middleware/DynamicMiddleware.d.ts +61 -0
- package/dist/api/routing/middleware/DynamicMiddleware.d.ts.map +1 -0
- package/dist/api/routing/middleware/DynamicMiddleware.js +45 -0
- package/dist/api/routing/middleware/dynamic-middleware.d.ts +25 -0
- package/dist/api/routing/middleware/dynamic-middleware.d.ts.map +1 -0
- package/dist/api/routing/middleware/dynamic-middleware.js +39 -0
- package/dist/api/routing/middleware/generic-middleware.d.ts +9 -0
- package/dist/api/routing/middleware/generic-middleware.d.ts.map +1 -0
- package/dist/api/routing/middleware/generic-middleware.js +20 -0
- package/dist/api/routing/middleware/middleware.d.ts +28 -0
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -0
- package/dist/api/routing/middleware/middleware.js +101 -0
- package/dist/api/routing/middleware.d.ts +6 -0
- package/dist/api/routing/middleware.d.ts.map +1 -0
- package/dist/api/routing/middleware.js +8 -0
- package/dist/api/routing.d.ts +18 -28
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +3 -3
- package/package.json +27 -7
- package/src/api/layerUtils.ts +33 -0
- package/src/api/routing/middleware/ContextProvider.ts +136 -0
- package/src/api/routing/middleware/DynamicMiddleware.ts +317 -0
- package/src/api/routing/{dynamic-middleware.ts → middleware/dynamic-middleware.ts} +29 -63
- package/src/api/routing/middleware/generic-middleware.ts +38 -0
- package/src/api/routing/middleware/middleware.ts +134 -0
- package/src/api/routing/middleware.ts +7 -0
- package/src/api/routing.ts +37 -56
- package/test/controller.test.ts +132 -15
- package/test/dist/controller.test.d.ts.map +1 -1
- package/dist/api/routing/DynamicMiddleware.d.ts +0 -104
- package/dist/api/routing/DynamicMiddleware.d.ts.map +0 -1
- package/dist/api/routing/DynamicMiddleware.js +0 -122
- package/dist/api/routing/dynamic-middleware.d.ts +0 -24
- package/dist/api/routing/dynamic-middleware.d.ts.map +0 -1
- package/dist/api/routing/dynamic-middleware.js +0 -39
- package/src/api/routing/DynamicMiddleware.ts +0 -527
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 2.76.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- d3a7a32: cleanup middleware
|
|
8
|
+
|
|
9
|
+
## 2.75.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 6490adf: add "generic middleware"
|
|
14
|
+
- 0fc2abc: extract ConfigureInterruptibility
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- make execute/dependencies optional
|
|
19
|
+
|
|
3
20
|
## 2.74.0
|
|
4
21
|
|
|
5
22
|
### Minor Changes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Context, type Layer, type NonEmptyReadonlyArray } from "effect-app";
|
|
2
|
+
export declare namespace LayerUtils {
|
|
3
|
+
type GetLayersSuccess<Layers extends ReadonlyArray<Layer.Layer.Any>> = Layers extends NonEmptyReadonlyArray<Layer.Layer.Any> ? {
|
|
4
|
+
[k in keyof Layers]: Layer.Layer.Success<Layers[k]>;
|
|
5
|
+
}[number] : never;
|
|
6
|
+
type GetLayersContext<Layers extends ReadonlyArray<Layer.Layer.Any>> = Layers extends NonEmptyReadonlyArray<Layer.Layer.Any> ? {
|
|
7
|
+
[k in keyof Layers]: Layer.Layer.Context<Layers[k]>;
|
|
8
|
+
}[number] : never;
|
|
9
|
+
type GetLayersError<Layers extends ReadonlyArray<Layer.Layer.Any>> = Layers extends NonEmptyReadonlyArray<Layer.Layer.Any> ? {
|
|
10
|
+
[k in keyof Layers]: Layer.Layer.Error<Layers[k]>;
|
|
11
|
+
}[number] : never;
|
|
12
|
+
}
|
|
13
|
+
export type ContextTagWithDefault<Id, A, LayerE, LayerR, Tag = unknown> = (Tag extends string ? Context.Tag<Id, {
|
|
14
|
+
_tag: Tag;
|
|
15
|
+
} & A> : Context.Tag<Id, A>) & {
|
|
16
|
+
Default: Layer.Layer<Id, LayerE, LayerR>;
|
|
17
|
+
};
|
|
18
|
+
export declare namespace ContextTagWithDefault {
|
|
19
|
+
type Base<A> = ContextTagWithDefault<any, any, A, any, any>;
|
|
20
|
+
}
|
|
21
|
+
export type GetContext<T> = T extends Context.Context<infer Y> ? Y : never;
|
|
22
|
+
//# sourceMappingURL=layerUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layerUtils.d.ts","sourceRoot":"","sources":["../../src/api/layerUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEjF,yBAAiB,UAAU,CAAC;IAC1B,KAAY,gBAAgB,CAAC,MAAM,SAAS,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,SAClF,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;SACtC,CAAC,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KACpD,CAAC,MAAM,CAAC,GACP,KAAK,CAAA;IAET,KAAY,gBAAgB,CAAC,MAAM,SAAS,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,SAClF,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;SACtC,CAAC,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KACpD,CAAC,MAAM,CAAC,GACP,KAAK,CAAA;IAET,KAAY,cAAc,CAAC,MAAM,SAAS,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,SAChF,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;SACtC,CAAC,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KAClD,CAAC,MAAM,CAAC,GACP,KAAK,CAAA;CACV;AAED,MAAM,MAAM,qBAAqB,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,IAClE,CAAC,GAAG,SAAS,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;IAAE,IAAI,EAAE,GAAG,CAAA;CAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAC9E;IACA,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACzC,CAAA;AAEH,yBAAiB,qBAAqB,CAAC;IACrC,KAAY,IAAI,CAAC,CAAC,IAAI,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CACnE;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type Array, Context, Effect, Layer, type NonEmptyArray, type Scope } from "effect-app";
|
|
2
|
+
import { type HttpRouter } from "effect-app/http";
|
|
3
|
+
import { type Tag } from "effect/Context";
|
|
4
|
+
import { type ContextTagWithDefault, type GetContext, type LayerUtils } from "../../layerUtils.js";
|
|
5
|
+
export type ContextProviderShape<ContextProviderA, ContextProviderR extends HttpRouter.HttpRouter.Provided> = Effect<Context.Context<ContextProviderA>, never, // no errors are allowed
|
|
6
|
+
ContextProviderR>;
|
|
7
|
+
export interface ContextProviderId {
|
|
8
|
+
_tag: "ContextProvider";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* TDeps is an array of services with Default implementation
|
|
12
|
+
* each service is an effect which builds some context for each request
|
|
13
|
+
*/
|
|
14
|
+
type TDepsArr = Array.NonEmptyReadonlyArray<(Context.Tag<any, Effect<Context.Context<any>, never, any> & {
|
|
15
|
+
_tag: any;
|
|
16
|
+
}> | Context.Tag<any, Effect<Context.Context<any>, never, never> & {
|
|
17
|
+
_tag: any;
|
|
18
|
+
}>) & {
|
|
19
|
+
Default: Layer.Layer<Effect<Context.Context<any>> & {
|
|
20
|
+
_tag: any;
|
|
21
|
+
}, any, any>;
|
|
22
|
+
}>;
|
|
23
|
+
type ConstrainDeps<TDeps extends TDepsArr> = {
|
|
24
|
+
[K in keyof TDeps]: TDeps[K]["Service"] extends Effect<Context.Context<any>, never, HttpRouter.HttpRouter.Provided> ? TDeps[K] : `HttpRouter.HttpRouter.Provided are the only requirements ${TDeps[K]["Service"]["_tag"]}'s returned effect can have`;
|
|
25
|
+
};
|
|
26
|
+
export declare const mergeContextProviders: <TDeps extends TDepsArr>(...deps: ConstrainDeps<TDeps>) => {
|
|
27
|
+
dependencies: { [K in keyof TDeps]: TDeps[K]["Default"]; };
|
|
28
|
+
effect: Effect.Effect<Effect.Effect<Context.Context<GetContext<Effect.Success<Tag.Service<TDeps[number]>>>>, never, Effect.Context<Tag.Service<TDeps[number]>>>, LayerUtils.GetLayersError<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>, LayerUtils.GetLayersSuccess<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>>;
|
|
29
|
+
};
|
|
30
|
+
export declare const ContextProvider: <ContextProviderA, MakeContextProviderE, MakeContextProviderR, ContextProviderR extends HttpRouter.HttpRouter.Provided, Dependencies extends NonEmptyArray<Layer.Layer.Any>>(input: {
|
|
31
|
+
effect: Effect<Effect<ContextProviderA, never, ContextProviderR>, MakeContextProviderE, MakeContextProviderR | Scope>;
|
|
32
|
+
dependencies?: Dependencies;
|
|
33
|
+
}) => Context.Tag<ContextProviderId, Effect<ContextProviderA, never, ContextProviderR>> & {
|
|
34
|
+
Default: Layer.Layer<ContextProviderId, MakeContextProviderE | LayerUtils.GetLayersError<Dependencies>, Exclude<MakeContextProviderR, LayerUtils.GetLayersSuccess<Dependencies>> | LayerUtils.GetLayersContext<Dependencies>>;
|
|
35
|
+
};
|
|
36
|
+
export declare const MergedContextProvider: <TDeps extends TDepsArr>(...deps: ConstrainDeps<TDeps>) => ContextTagWithDefault<ContextProviderId, Effect.Effect<Context.Context<GetContext<Effect.Success<Tag.Service<TDeps[number]>>>>, never, Effect.Context<Tag.Service<TDeps[number]>>>, LayerUtils.GetLayersError<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>, Exclude<Tag.Service<TDeps[number]>, LayerUtils.GetLayersSuccess<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>> | LayerUtils.GetLayersContext<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>>;
|
|
37
|
+
export declare const EmptyContextProvider: Context.Tag<ContextProviderId, Effect<Context.Context<never>, never, never>> & {
|
|
38
|
+
Default: Layer.Layer<ContextProviderId, never, never>;
|
|
39
|
+
};
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=ContextProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextProvider.d.ts","sourceRoot":"","sources":["../../../../src/api/routing/middleware/ContextProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Context, Effect, Layer, pipe } from "effect-app";
|
|
2
|
+
import { mergeContexts } from "./dynamic-middleware.js";
|
|
3
|
+
// Note: the type here must be aligned with MergedContextProvider
|
|
4
|
+
export const mergeContextProviders = (...deps) => ({
|
|
5
|
+
dependencies: deps.map((_) => _.Default),
|
|
6
|
+
effect: Effect.gen(function* () {
|
|
7
|
+
const makers = yield* Effect.all(deps);
|
|
8
|
+
return Effect
|
|
9
|
+
.gen(function* () {
|
|
10
|
+
const services = makers.map((handle, i) => ({ maker: deps[i], handle }));
|
|
11
|
+
// services are effects which return some Context.Context<...>
|
|
12
|
+
const context = yield* mergeContexts(services);
|
|
13
|
+
return context;
|
|
14
|
+
});
|
|
15
|
+
})
|
|
16
|
+
});
|
|
17
|
+
export const ContextProvider = (input) => {
|
|
18
|
+
const ctx = Context.GenericTag("ContextProvider");
|
|
19
|
+
const l = Layer.scoped(ctx, input.effect);
|
|
20
|
+
return Object.assign(ctx, {
|
|
21
|
+
Default: l.pipe(input.dependencies ? Layer.provide(input.dependencies) : (_) => _)
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
// Note: the type here must be aligned with mergeContextProviders
|
|
25
|
+
export const MergedContextProvider = (...deps) => pipe(deps, (_) => mergeContextProviders(..._), (_) => ContextProvider(_));
|
|
26
|
+
export const EmptyContextProvider = ContextProvider({ effect: Effect.succeed(Effect.succeed(Context.empty())) });
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dFByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9yb3V0aW5nL21pZGRsZXdhcmUvQ29udGV4dFByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBc0IsSUFBSSxFQUFjLE1BQU0sWUFBWSxDQUFBO0FBSXJHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQXNDdkQsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBR25DLEdBQUcsSUFBMEIsRUFhN0IsRUFBRSxDQUFDLENBQUM7SUFDSixZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBUTtJQUMvQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0QyxPQUFPLE1BQU07YUFDVixHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUksTUFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDbkYsOERBQThEO1lBQzlELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFlLENBQUMsQ0FBQTtZQUNyRCxPQUFPLE9BQU8sQ0FBQTtRQUNoQixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBUTtDQUNWLENBQUMsQ0FBQTtBQUVGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQU83QixLQU9DLEVBQ0QsRUFBRTtJQUNGLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBSTVCLGlCQUFpQixDQUNsQixDQUFBO0lBQ0QsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDeEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2IsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBT3pFO0tBQ0YsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBRUQsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBR25DLEdBQUcsSUFBMEIsRUFDN0IsRUFBRSxDQUNGLElBQUksQ0FDRixJQUFxRCxFQUNyRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFRLENBQUMsQ0FlakMsQ0FBQTtBQUVILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Context, Effect, Layer, type NonEmptyArray, type Request, type S, type Scope } from "effect-app";
|
|
2
|
+
import type { GetEffectContext, RPCContextMap } from "effect-app/client/req";
|
|
3
|
+
import { type HttpRouter } from "effect-app/http";
|
|
4
|
+
import type * as EffectRequest from "effect/Request";
|
|
5
|
+
import { type ContextTagWithDefault, type LayerUtils } from "../../layerUtils.js";
|
|
6
|
+
import { type ContextProviderId, type ContextProviderShape } from "./ContextProvider.js";
|
|
7
|
+
import { type ContextWithLayer } from "./dynamic-middleware.js";
|
|
8
|
+
import { type GenericMiddlewareMaker } from "./generic-middleware.js";
|
|
9
|
+
export type MakeRPCHandlerFactory<RequestContextMap extends Record<string, RPCContextMap.Any>, MiddlewareR> = <T extends {
|
|
10
|
+
config?: Partial<Record<keyof RequestContextMap, any>>;
|
|
11
|
+
}, Req extends S.TaggedRequest.All, HandlerR>(schema: T & S.Schema<Req, any, never>, handler: (request: Req, headers: any) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, Exclude<HandlerR, GetEffectContext<RequestContextMap, (T & S.Schema<Req, any, never>)["config"]>>>, moduleName: string) => (req: Req, headers: any) => Effect.Effect<Request.Request.Success<Req>, Request.Request.Error<Req> | RequestContextMapErrors<RequestContextMap>, MiddlewareR | Exclude<HandlerR, GetEffectContext<RequestContextMap, (T & S.Schema<Req, any, never>)["config"]>>>;
|
|
12
|
+
export type RPCHandlerFactory<RequestContextMap extends Record<string, RPCContextMap.Any>, ContextProviderA> = <T extends {
|
|
13
|
+
config?: Partial<Record<keyof RequestContextMap, any>>;
|
|
14
|
+
}, Req extends S.TaggedRequest.All, HandlerR>(schema: T & S.Schema<Req, any, never>, handler: (request: Req, headers: any) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, HandlerR>, moduleName: string) => (req: Req, headers: any) => Effect.Effect<Request.Request.Success<Req>, Request.Request.Error<Req> | RequestContextMapErrors<RequestContextMap>, HttpRouter.HttpRouter.Provided | Exclude<Exclude<HandlerR, GetEffectContext<RequestContextMap, (T & S.Schema<Req, any, never>)["config"]>>, ContextProviderA>>;
|
|
15
|
+
type RequestContextMapProvider<RequestContextMap extends Record<string, RPCContextMap.Any>> = {
|
|
16
|
+
[K in keyof RequestContextMap]: ContextWithLayer.Base<{
|
|
17
|
+
[K in keyof RequestContextMap]?: RequestContextMap[K]["contextActivation"];
|
|
18
|
+
}, RequestContextMap[K]["service"], S.Schema.Type<RequestContextMap[K]["error"]>>;
|
|
19
|
+
};
|
|
20
|
+
export interface MiddlewareMake<RequestContextMap extends Record<string, RPCContextMap.Any>, // what services will the middleware provide dynamically to the handler, or raise errors.
|
|
21
|
+
ContextProviderA, // what the context provider provides
|
|
22
|
+
ContextProviderR extends HttpRouter.HttpRouter.Provided, // what the context provider requires
|
|
23
|
+
MakeContextProviderE, // what the context provider construction can fail with
|
|
24
|
+
MakeContextProviderR, // what the context provider construction requires
|
|
25
|
+
DynamicMiddlewareProviders extends RequestContextMapProvider<RequestContextMap>, // how to resolve the dynamic middleware
|
|
26
|
+
GenericMiddlewareProviders extends Array<ContextTagWithDefault.Base<GenericMiddlewareMaker>>, MakeMiddlewareE, // what the middleware construction can fail with
|
|
27
|
+
MakeMiddlewareR, // what the middleware requires to be constructed
|
|
28
|
+
MiddlewareDependencies extends NonEmptyArray<Layer.Layer.Any>> {
|
|
29
|
+
dynamicMiddlewares: DynamicMiddlewareProviders;
|
|
30
|
+
/** generic middlewares are those which follow the (next) => (input, headers) => pattern */
|
|
31
|
+
genericMiddlewares: GenericMiddlewareProviders;
|
|
32
|
+
/** static context providers */
|
|
33
|
+
contextProvider: ContextTagWithDefault<ContextProviderId, ContextProviderShape<ContextProviderA, ContextProviderR>, MakeContextProviderE, MakeContextProviderR>;
|
|
34
|
+
dependencies?: MiddlewareDependencies;
|
|
35
|
+
execute?: (maker: (cb: MakeRPCHandlerFactory<RequestContextMap, ContextProviderA | HttpRouter.HttpRouter.Provided>) => MakeRPCHandlerFactory<RequestContextMap, ContextProviderA | HttpRouter.HttpRouter.Provided>) => Effect<MakeRPCHandlerFactory<RequestContextMap, ContextProviderA | HttpRouter.HttpRouter.Provided>, MakeMiddlewareE, MakeMiddlewareR | Scope>;
|
|
36
|
+
}
|
|
37
|
+
export interface MiddlewareMakerId {
|
|
38
|
+
_tag: "MiddlewareMaker";
|
|
39
|
+
}
|
|
40
|
+
export type Middleware<RequestContextMap extends Record<string, RPCContextMap.Any>, // what services will the middlware provide dynamically to the handler, or raise errors.
|
|
41
|
+
MakeMiddlewareE, // what the middleware construction can fail with
|
|
42
|
+
MakeMiddlewareR, // what the middlware requires to be constructed
|
|
43
|
+
ContextProviderA> = ContextTagWithDefault<MiddlewareMakerId, {
|
|
44
|
+
effect: RPCHandlerFactory<RequestContextMap, ContextProviderA>;
|
|
45
|
+
}, MakeMiddlewareE, MakeMiddlewareR, "MiddlewareMaker">;
|
|
46
|
+
export type RequestContextMapErrors<RequestContextMap extends Record<string, RPCContextMap.Any>> = S.Schema.Type<RequestContextMap[keyof RequestContextMap]["error"]>;
|
|
47
|
+
export declare const makeMiddleware: <RequestContextMap extends Record<string, RPCContextMap.Any>>() => <ContextProviderA, // what the context provider provides
|
|
48
|
+
ContextProviderR extends HttpRouter.HttpRouter.Provided, // what the context provider requires
|
|
49
|
+
MakeContextProviderE, // what the context provider construction can fail with
|
|
50
|
+
MakeContextProviderR, // what the context provider construction requires
|
|
51
|
+
RequestContextProviders extends RequestContextMapProvider<RequestContextMap>, // how to resolve the dynamic middleware
|
|
52
|
+
GenericMiddlewareProviders extends Array<ContextTagWithDefault.Base<GenericMiddlewareMaker>>, MiddlewareDependencies extends NonEmptyArray<Layer.Layer.Any>, // layers provided for the middlware to be constructed
|
|
53
|
+
MakeMiddlewareE = never, // what the middleware construction can fail with
|
|
54
|
+
MakeMiddlewareR = never>(make: MiddlewareMake<RequestContextMap, ContextProviderA, ContextProviderR, MakeContextProviderE, MakeContextProviderR, RequestContextProviders, GenericMiddlewareProviders, MakeMiddlewareE, MakeMiddlewareR, MiddlewareDependencies>) => Context.Tag<MiddlewareMakerId, {
|
|
55
|
+
effect: RPCHandlerFactory<RequestContextMap, ContextProviderA>;
|
|
56
|
+
_tag: "MiddlewareMaker";
|
|
57
|
+
}> & {
|
|
58
|
+
Default: Layer.Layer<MiddlewareMakerId, MakeContextProviderE | MakeMiddlewareE | LayerUtils.GetLayersContext<{ [K in keyof GenericMiddlewareProviders]: GenericMiddlewareProviders[K]["Default"]; }>, MakeContextProviderR | LayerUtils.GetLayersContext<{ [K in keyof GenericMiddlewareProviders]: GenericMiddlewareProviders[K]["Default"]; }> | LayerUtils.GetLayersContext<MiddlewareDependencies> | Exclude<MakeMiddlewareR, LayerUtils.GetLayersSuccess<MiddlewareDependencies>>>;
|
|
59
|
+
};
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=DynamicMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/api/routing/middleware/DynamicMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
+
import { Context, Effect, Layer } from "effect-app";
|
|
5
|
+
import { implementMiddleware } from "./dynamic-middleware.js";
|
|
6
|
+
import { genericMiddlewareMaker } from "./generic-middleware.js";
|
|
7
|
+
// factory for middlewares
|
|
8
|
+
export const makeMiddleware =
|
|
9
|
+
// by setting RequestContextMap beforehand, execute contextual typing does not fuck up itself to anys
|
|
10
|
+
() => (make) => {
|
|
11
|
+
// type Id = MiddlewareMakerId &
|
|
12
|
+
const MiddlewareMaker = Context.GenericTag("MiddlewareMaker");
|
|
13
|
+
const dynamicMiddlewares = implementMiddleware()(make.dynamicMiddlewares);
|
|
14
|
+
const middlewares = genericMiddlewareMaker(...make.genericMiddlewares);
|
|
15
|
+
const l = Layer.scoped(MiddlewareMaker, Effect
|
|
16
|
+
.all({
|
|
17
|
+
dynamicMiddlewares: dynamicMiddlewares.effect,
|
|
18
|
+
generic: middlewares.effect,
|
|
19
|
+
middleware: make.execute
|
|
20
|
+
? make.execute((cb) => cb)
|
|
21
|
+
: Effect.succeed((_schema, handle) => (req, headers) => handle(req, headers)),
|
|
22
|
+
contextProvider: make.contextProvider // uses the middleware.contextProvider tag to get the context provider service
|
|
23
|
+
})
|
|
24
|
+
.pipe(Effect.map(({ contextProvider, dynamicMiddlewares, generic, middleware }) => ({
|
|
25
|
+
_tag: "MiddlewareMaker",
|
|
26
|
+
effect: makeRpcEffect()((schema, handler, moduleName) => {
|
|
27
|
+
const h = middleware(schema, handler, moduleName);
|
|
28
|
+
return generic(Effect.fnUntraced(function* (req, headers) {
|
|
29
|
+
yield* Effect.annotateCurrentSpan("request.name", moduleName ? `${moduleName}.${req._tag}` : req._tag);
|
|
30
|
+
// the contextProvider is an Effect that builds the context for the request
|
|
31
|
+
return yield* contextProvider.pipe(Effect.flatMap((contextProviderContext) =>
|
|
32
|
+
// the dynamicMiddlewares is an Effect that builds the dynamiuc context for the request
|
|
33
|
+
dynamicMiddlewares(schema.config ?? {}, headers).pipe(Effect.flatMap((dynamicContext) => h(req, headers).pipe(Effect.provide(dynamicContext))), Effect.provide(contextProviderContext))));
|
|
34
|
+
}), moduleName);
|
|
35
|
+
})
|
|
36
|
+
}))));
|
|
37
|
+
const middlewareLayer = l
|
|
38
|
+
.pipe(Layer.provide(Layer.mergeAll(make.dependencies ? make.dependencies : Layer.empty, ...dynamicMiddlewares.dependencies, make.contextProvider.Default, ...middlewares.dependencies)));
|
|
39
|
+
return Object.assign(MiddlewareMaker, { Default: middlewareLayer });
|
|
40
|
+
};
|
|
41
|
+
// it just provides the right types without cluttering the implementation with them
|
|
42
|
+
function makeRpcEffect() {
|
|
43
|
+
return (cb) => cb;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY01pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3JvdXRpbmcvbWlkZGxld2FyZS9EeW5hbWljTWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0REFBNEQ7QUFDNUQsd0RBQXdEO0FBQ3hELHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXdELE1BQU0sWUFBWSxDQUFBO0FBTXpHLE9BQU8sRUFBeUIsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNwRixPQUFPLEVBQStCLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFvSjdGLDBCQUEwQjtBQUMxQixNQUFNLENBQUMsTUFBTSxjQUFjO0FBQ3pCLHFHQUFxRztBQUNyRyxHQUVJLEVBQUUsQ0FDTixDQWVFLElBV0MsRUFDRCxFQUFFO0lBQ0YsZ0NBQWdDO0lBQ2hDLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBT3hDLGlCQUFpQixDQUNsQixDQUFBO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsRUFBcUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUM1RixNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0lBRXRFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQ3BCLGVBQWUsRUFDZixNQUFNO1NBQ0gsR0FBRyxDQUFDO1FBQ0gsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsTUFBTTtRQUM3QyxPQUFPLEVBQUUsV0FBVyxDQUFDLE1BQU07UUFDM0IsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQ2IsRUFBK0YsRUFDL0YsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNSLENBQUMsQ0FB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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Context, Effect, Option, type S } from "effect-app";
|
|
2
|
+
import { type GetEffectContext, type RPCContextMap } from "effect-app/client";
|
|
3
|
+
import { type Tag } from "effect-app/Context";
|
|
4
|
+
import { type ContextTagWithDefault } from "../../layerUtils.js";
|
|
5
|
+
export type ContextWithLayer<Config, Service, Error, Dependencies, Thing extends ContextTagWithDefault<any, {
|
|
6
|
+
handle: (...args: [config: Config, headers: Record<string, string>]) => Effect<Option<Context<Service>>, Error, unknown>;
|
|
7
|
+
}, any, unknown, any>> = Thing & {
|
|
8
|
+
dependsOn?: Dependencies;
|
|
9
|
+
};
|
|
10
|
+
export declare namespace ContextWithLayer {
|
|
11
|
+
type Base<Config, Service, Error> = ContextWithLayer<Config, Service, Error, any, any>;
|
|
12
|
+
}
|
|
13
|
+
export declare const mergeContexts: <T extends readonly {
|
|
14
|
+
maker: any;
|
|
15
|
+
handle: Effect<Context<any>>;
|
|
16
|
+
}[]>(makers: T) => Effect.Effect<Context.Context<Effect.Effect.Success<T[number]["handle"]>>, never, never>;
|
|
17
|
+
export declare const mergeOptionContexts: <T extends readonly {
|
|
18
|
+
maker: any;
|
|
19
|
+
handle: Effect<Option<Context<any>>>;
|
|
20
|
+
}[]>(makers: T) => Effect.Effect<Context.Context<never>, never, never>;
|
|
21
|
+
export declare const implementMiddleware: <T extends Record<string, RPCContextMap.Any>>() => <TI extends { [K in keyof T]: ContextWithLayer.Base<{ [K_1 in keyof T]?: T[K_1]["contextActivation"]; }, T[K]["service"], S.Schema.Type<T[K]["error"]>>; }>(implementations: TI) => {
|
|
22
|
+
dependencies: { [K in keyof TI]: TI[K]["Default"]; }[keyof TI][];
|
|
23
|
+
effect: Effect<(config: { [K in keyof T]?: T[K]["contextActivation"]; }, headers: Record<string, string>) => Effect.Effect<Context.Context<GetEffectContext<T, typeof config>>, Effect.Error<ReturnType<Tag.Service<TI[keyof TI]>["handle"]>>, Effect.Context<ReturnType<Tag.Service<TI[keyof TI]>["handle"]>>>, never, Tag.Identifier<{ [K in keyof TI]: TI[K]; }[keyof TI]>>;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=dynamic-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/routing/middleware/dynamic-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { Array, Context, Effect, Option } from "effect-app";
|
|
3
|
+
import { typedValuesOf } from "effect-app/utils";
|
|
4
|
+
import { InfraLogger } from "../../../logger.js";
|
|
5
|
+
import { sort } from "../tsort.js";
|
|
6
|
+
export const mergeContexts = Effect.fnUntraced(function* (makers) {
|
|
7
|
+
let context = Context.empty();
|
|
8
|
+
for (const mw of makers) {
|
|
9
|
+
yield* InfraLogger.logDebug("Building context for middleware", mw.maker.key ?? mw.maker);
|
|
10
|
+
const moreContext = yield* mw.handle.pipe(Effect.provide(context));
|
|
11
|
+
yield* InfraLogger.logDebug("Built context for middleware", mw.maker.key ?? mw.maker, moreContext.toJSON().services);
|
|
12
|
+
context = Context.merge(context, moreContext);
|
|
13
|
+
}
|
|
14
|
+
return context;
|
|
15
|
+
});
|
|
16
|
+
export const mergeOptionContexts = Effect.fnUntraced(function* (makers) {
|
|
17
|
+
let context = Context.empty();
|
|
18
|
+
for (const mw of makers) {
|
|
19
|
+
yield* InfraLogger.logDebug("Building context for middleware", mw.maker.key ?? mw.maker);
|
|
20
|
+
const moreContext = yield* mw.handle.pipe(Effect.provide(context));
|
|
21
|
+
yield* InfraLogger.logDebug("Built context for middleware", mw.maker.key ?? mw.maker, Option.map(moreContext, (c) => c.toJSON().services));
|
|
22
|
+
if (moreContext.value) {
|
|
23
|
+
context = Context.merge(context, moreContext.value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return context;
|
|
27
|
+
});
|
|
28
|
+
export const implementMiddleware = () => (implementations) => ({
|
|
29
|
+
dependencies: typedValuesOf(implementations).map((_) => _.Default),
|
|
30
|
+
effect: Effect.gen(function* () {
|
|
31
|
+
const sorted = sort(typedValuesOf(implementations));
|
|
32
|
+
const makers = yield* Effect.all(sorted);
|
|
33
|
+
return Effect.fnUntraced(function* (config, headers) {
|
|
34
|
+
const ctx = yield* mergeOptionContexts(Array.map(makers, (_, i) => ({ maker: sorted[i], handle: _.handle(config, headers) })));
|
|
35
|
+
return ctx;
|
|
36
|
+
});
|
|
37
|
+
})
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1taWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9yb3V0aW5nL21pZGRsZXdhcmUvZHluYW1pYy1taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFVLE1BQU0sWUFBWSxDQUFBO0FBR25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFaEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQWtDbEMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQzVDLFFBQVEsQ0FBQyxFQUFvRSxNQUFTO0lBQ3BGLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM3QixLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUNsRSxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUN6Qiw4QkFBOEIsRUFDOUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssRUFDdkIsV0FBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQ3ZDLENBQUE7UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUNELE9BQU8sT0FBK0QsQ0FBQTtBQUN4RSxDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQ2xELFFBQVEsQ0FBQyxFQUE0RSxNQUFTO0lBQzVGLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM3QixLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUNsRSxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUN6Qiw4QkFBOEIsRUFDOUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssRUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFFLENBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FDN0QsQ0FBQTtRQUNELElBQUksV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckQsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQWdELEVBQUUsQ0FDckYsQ0FRRSxlQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLFlBQVksRUFBRSxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUVwRDtJQUNiLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUE7UUFFbkQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN4QyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQ3RCLFFBQVEsQ0FBQyxFQUFDLE1BQXNELEVBQUUsT0FBK0I7WUFDL0YsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsbUJBQW1CLENBQ3BDLEtBQUssQ0FBQyxHQUFHLENBQ1AsTUFBTSxFQUNOLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFHLENBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBUSxFQUFFLENBQVEsQ0FDM0YsQ0FDRixDQUFBO1lBQ0QsT0FBTyxHQUVOLENBQUE7UUFDSCxDQUFDLENBQ0YsQ0FBQTtJQUNILENBQUMsQ0FXQTtDQUNGLENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Array, Effect } from "effect-app";
|
|
2
|
+
import { type HttpHeaders, type HttpRouter } from "effect-app/http";
|
|
3
|
+
import { type ContextTagWithDefault } from "../../layerUtils.js";
|
|
4
|
+
export type GenericMiddlewareMaker = <A, E>(handle: (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>, moduleName: string) => (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>;
|
|
5
|
+
export declare const genericMiddlewareMaker: <T extends Array<ContextTagWithDefault.Base<GenericMiddlewareMaker>>>(...middlewares: T) => {
|
|
6
|
+
dependencies: { [K in keyof T]: T[K]["Default"]; };
|
|
7
|
+
effect: Effect.Effect<GenericMiddlewareMaker>;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=generic-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/routing/middleware/generic-middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,EAAE,CAAC,EACxC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EACzG,UAAU,EAAE,MAAM,KACf,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;AAEtG,eAAO,MAAM,sBAAsB,GACjC,CAAC,SAAS,KAAK,CACb,qBAAqB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CACnD,EACD,GAAG,aAAa,CAAC,KAAG;IACpB,YAAY,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAE,CAAA;IACjD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAA;CAqB9C,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { Effect } from "effect-app";
|
|
3
|
+
export const genericMiddlewareMaker = (...middlewares) => {
|
|
4
|
+
return {
|
|
5
|
+
dependencies: middlewares.map((_) => _.Default),
|
|
6
|
+
effect: Effect.gen(function* () {
|
|
7
|
+
const middlewaresInstances = yield* Effect.all(middlewares);
|
|
8
|
+
return (handle, moduleName) => {
|
|
9
|
+
return (input, headers) => {
|
|
10
|
+
let effect = handle;
|
|
11
|
+
for (const middleware of middlewaresInstances.toReversed()) {
|
|
12
|
+
effect = middleware(effect, moduleName);
|
|
13
|
+
}
|
|
14
|
+
return effect(input, headers);
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
})
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1taWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9yb3V0aW5nL21pZGRsZXdhcmUvZ2VuZXJpYy1taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQWMsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBUy9DLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBSXBDLEdBQUcsV0FBYyxFQUdqQixFQUFFO0lBQ0YsT0FBTztRQUNMLFlBQVksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQy9DLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUMxQixNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFM0QsT0FBTyxDQUNMLE1BQTRFLEVBQzVFLFVBQWtCLEVBQ2xCLEVBQUU7Z0JBQ0YsT0FBTyxDQUFDLEtBQVUsRUFBRSxPQUE0QixFQUFFLEVBQUU7b0JBQ2xELElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQTtvQkFDbkIsS0FBSyxNQUFNLFVBQVUsSUFBSyxvQkFBOEIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO3dCQUN0RSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQTtvQkFDekMsQ0FBQztvQkFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7Z0JBQy9CLENBQUMsQ0FBQTtZQUNILENBQUMsQ0FBQTtRQUNILENBQUMsQ0FBQztLQUNJLENBQUE7QUFDVixDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Context, Effect } from "effect-app";
|
|
2
|
+
import { HttpHeaders, type HttpRouter } from "effect-app/http";
|
|
3
|
+
declare const DevMode_base: Context.ReferenceClass<DevMode, "DevMode", boolean>;
|
|
4
|
+
export declare class DevMode extends DevMode_base {
|
|
5
|
+
}
|
|
6
|
+
declare const RequestCacheMiddleware_base: Effect.Service.Class<RequestCacheMiddleware, "RequestCacheMiddleware", {
|
|
7
|
+
readonly effect: Effect.Effect<(<A, E>(handle: (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>, _moduleName: string) => (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>), never, never>;
|
|
8
|
+
}>;
|
|
9
|
+
export declare class RequestCacheMiddleware extends RequestCacheMiddleware_base {
|
|
10
|
+
}
|
|
11
|
+
declare const ConfigureInterruptibility_base: Effect.Service.Class<ConfigureInterruptibility, "ConfigureInterruptibility", {
|
|
12
|
+
readonly effect: Effect.Effect<(<A, E>(handle: (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>, _moduleName: string) => (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>), never, never>;
|
|
13
|
+
}>;
|
|
14
|
+
export declare class ConfigureInterruptibility extends ConfigureInterruptibility_base {
|
|
15
|
+
}
|
|
16
|
+
declare const CaptureHttpHeadersAsRpcHeaders_base: Effect.Service.Class<CaptureHttpHeadersAsRpcHeaders, "CaptureHttpHeadersAsRpcHeaders", {
|
|
17
|
+
readonly effect: Effect.Effect<(<A, E>(handle: (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>, _moduleName: string) => (input: any, rpcHeaders: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>), never, never>;
|
|
18
|
+
}>;
|
|
19
|
+
export declare class CaptureHttpHeadersAsRpcHeaders extends CaptureHttpHeadersAsRpcHeaders_base {
|
|
20
|
+
}
|
|
21
|
+
declare const MiddlewareLogger_base: Effect.Service.Class<MiddlewareLogger, "MiddlewareLogger", {
|
|
22
|
+
readonly effect: Effect.Effect<(<A, E>(handle: (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>, moduleName: string) => (input: any, rpcHeaders: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>), never, never>;
|
|
23
|
+
}>;
|
|
24
|
+
export declare class MiddlewareLogger extends MiddlewareLogger_base {
|
|
25
|
+
}
|
|
26
|
+
export declare const DefaultGenericMiddlewares: readonly [typeof RequestCacheMiddleware, typeof ConfigureInterruptibility, typeof CaptureHttpHeadersAsRpcHeaders, typeof MiddlewareLogger];
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/routing/middleware/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,OAAO,EAAE,MAAM,EAAe,MAAM,YAAY,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAqB,MAAM,iBAAiB,CAAA;;AASjF,qBAAa,OAAQ,SAAQ,YAAsE;CAAG;;qCAI1F,CAAC,EAAE,CAAC,UACF,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,eAC5F,MAAM;;AAJzB,qBAAa,sBAAuB,SAAQ,2BAU1C;CAAG;;qCAMS,CAAC,EAAE,CAAC,UACF,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,eAC5F,MAAM;;AAN3B,qBAAa,yBAA0B,SAAQ,8BAgB9C;CAAG;;qCAKU,CAAC,EAAE,CAAC,UACF,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,eAC5F,MAAM;;AAL3B,qBAAa,8BACX,SAAQ,mCAcN;CACF;;qCAIU,CAAC,EAAE,CAAC,UACF,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,cAC7F,MAAM;;AAJxB,qBAAa,gBAAiB,SAAQ,qBAkEpC;CAAG;AAEL,eAAO,MAAM,yBAAyB,4IAK5B,CAAA"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Cause, Context, Effect, ParseResult } from "effect-app";
|
|
2
|
+
import { HttpHeaders, HttpServerRequest } from "effect-app/http";
|
|
3
|
+
import { pretty } from "effect-app/utils";
|
|
4
|
+
import { logError, reportError } from "../../../errorReporter.js";
|
|
5
|
+
import { InfraLogger } from "../../../logger.js";
|
|
6
|
+
import { RequestCacheLayers } from "../../routing.js";
|
|
7
|
+
const logRequestError = logError("Request");
|
|
8
|
+
const reportRequestError = reportError("Request");
|
|
9
|
+
export class DevMode extends Context.Reference()("DevMode", { defaultValue: () => false }) {
|
|
10
|
+
}
|
|
11
|
+
export class RequestCacheMiddleware extends Effect.Service()("RequestCacheMiddleware", {
|
|
12
|
+
effect: Effect.gen(function* () {
|
|
13
|
+
return (handle, _moduleName) => Effect.fnUntraced(function* (input, headers) {
|
|
14
|
+
return yield* handle(input, headers).pipe(Effect.provide(RequestCacheLayers));
|
|
15
|
+
});
|
|
16
|
+
})
|
|
17
|
+
}) {
|
|
18
|
+
}
|
|
19
|
+
export class ConfigureInterruptibility extends Effect.Service()("ConfigureInterruptibility", {
|
|
20
|
+
effect: Effect.gen(function* () {
|
|
21
|
+
return (handle, _moduleName) => Effect.fnUntraced(function* (input, headers) {
|
|
22
|
+
return yield* handle(input, headers).pipe(
|
|
23
|
+
// TODO: make this depend on query/command, and consider if middleware also should be affected. right now it's not.
|
|
24
|
+
Effect.uninterruptible);
|
|
25
|
+
});
|
|
26
|
+
})
|
|
27
|
+
}) {
|
|
28
|
+
}
|
|
29
|
+
export class CaptureHttpHeadersAsRpcHeaders extends Effect.Service()("CaptureHttpHeadersAsRpcHeaders", {
|
|
30
|
+
effect: Effect.gen(function* () {
|
|
31
|
+
return (handle, _moduleName) => Effect.fnUntraced(function* (input, rpcHeaders) {
|
|
32
|
+
// merge in the request headers
|
|
33
|
+
// we should consider if we should merge them into rpc headers on the Protocol layer instead.
|
|
34
|
+
const httpReq = yield* HttpServerRequest.HttpServerRequest;
|
|
35
|
+
const headers = HttpHeaders.merge(httpReq.headers, rpcHeaders);
|
|
36
|
+
return yield* handle(input, headers);
|
|
37
|
+
});
|
|
38
|
+
})
|
|
39
|
+
}) {
|
|
40
|
+
}
|
|
41
|
+
export class MiddlewareLogger extends Effect.Service()("MiddlewareLogger", {
|
|
42
|
+
effect: Effect.gen(function* () {
|
|
43
|
+
return (handle, moduleName) => Effect.fnUntraced(function* (input, rpcHeaders) {
|
|
44
|
+
const devMode = yield* DevMode;
|
|
45
|
+
// merge in the request headers
|
|
46
|
+
// we should consider if we should merge them into rpc headers on the Protocol layer instead.
|
|
47
|
+
const httpReq = yield* HttpServerRequest.HttpServerRequest;
|
|
48
|
+
const headers = HttpHeaders.merge(httpReq.headers, rpcHeaders);
|
|
49
|
+
return yield* Effect
|
|
50
|
+
.annotateCurrentSpan("requestInput", Object.entries(input).reduce((prev, [key, value]) => {
|
|
51
|
+
prev[key] = key === "password"
|
|
52
|
+
? "<redacted>"
|
|
53
|
+
: typeof value === "string" || typeof value === "number" || typeof value === "boolean"
|
|
54
|
+
? typeof value === "string" && value.length > 256
|
|
55
|
+
? (value.substring(0, 253) + "...")
|
|
56
|
+
: value
|
|
57
|
+
: Array.isArray(value)
|
|
58
|
+
? `Array[${value.length}]`
|
|
59
|
+
: value === null || value === undefined
|
|
60
|
+
? `${value}`
|
|
61
|
+
: typeof value === "object" && value
|
|
62
|
+
? `Object[${Object.keys(value).length}]`
|
|
63
|
+
: typeof value;
|
|
64
|
+
return prev;
|
|
65
|
+
}, {}))
|
|
66
|
+
.pipe(
|
|
67
|
+
// can't use andThen due to some being a function and effect
|
|
68
|
+
Effect.zipRight(handle(input, headers)),
|
|
69
|
+
// TODO: support ParseResult if the error channel of the request allows it.. but who would want that?
|
|
70
|
+
Effect.catchAll((_) => ParseResult.isParseError(_) ? Effect.die(_) : Effect.fail(_)), Effect.tapErrorCause((cause) => Cause.isFailure(cause) ? logRequestError(cause) : Effect.void), Effect.tapDefect((cause) => Effect
|
|
71
|
+
.all([
|
|
72
|
+
reportRequestError(cause, {
|
|
73
|
+
action: `${moduleName}.${input._tag}`
|
|
74
|
+
}),
|
|
75
|
+
InfraLogger
|
|
76
|
+
.logError("Finished request", cause)
|
|
77
|
+
.pipe(Effect.annotateLogs({
|
|
78
|
+
action: `${moduleName}.${input._tag}`,
|
|
79
|
+
req: pretty(input),
|
|
80
|
+
headers: pretty(headers)
|
|
81
|
+
// resHeaders: pretty(
|
|
82
|
+
// Object
|
|
83
|
+
// .entries(headers)
|
|
84
|
+
// .reduce((prev, [key, value]) => {
|
|
85
|
+
// prev[key] = value && typeof value === "string" ? snipString(value) : value
|
|
86
|
+
// return prev
|
|
87
|
+
// }, {} as Record<string, any>)
|
|
88
|
+
// )
|
|
89
|
+
}))
|
|
90
|
+
])), devMode ? (_) => _ : Effect.catchAllDefect(() => Effect.die("Internal Server Error")));
|
|
91
|
+
});
|
|
92
|
+
})
|
|
93
|
+
}) {
|
|
94
|
+
}
|
|
95
|
+
export const DefaultGenericMiddlewares = [
|
|
96
|
+
RequestCacheMiddleware,
|
|
97
|
+
ConfigureInterruptibility,
|
|
98
|
+
CaptureHttpHeadersAsRpcHeaders,
|
|
99
|
+
MiddlewareLogger
|
|
100
|
+
];
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9taWRkbGV3YXJlL21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFtQixpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUVyRCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDM0MsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFakQsTUFBTSxPQUFPLE9BQVEsU0FBUSxPQUFPLENBQUMsU0FBUyxFQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQUc7QUFFdEcsTUFBTSxPQUFPLHNCQUF1QixTQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQTBCLENBQUMsd0JBQXdCLEVBQUU7SUFDN0csTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQzFCLE9BQU8sQ0FDTCxNQUF5RyxFQUN6RyxXQUFtQixFQUNuQixFQUFFLENBQ0YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxLQUFVLEVBQUUsT0FBNEI7WUFDbEUsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFN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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./middleware/ContextProvider.js";
|
|
2
|
+
export * from "./middleware/dynamic-middleware.js";
|
|
3
|
+
export * from "./middleware/DynamicMiddleware.js";
|
|
4
|
+
export * from "./middleware/generic-middleware.js";
|
|
5
|
+
export * from "./middleware/middleware.js";
|
|
6
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing/middleware.ts"],"names":[],"mappings":"AACA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,oCAAoC,CAAA;AAClD,cAAc,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// codegen:start {preset: barrel, include: ./middleware/*.ts, nodir: false }
|
|
2
|
+
export * from "./middleware/ContextProvider.js";
|
|
3
|
+
export * from "./middleware/dynamic-middleware.js";
|
|
4
|
+
export * from "./middleware/DynamicMiddleware.js";
|
|
5
|
+
export * from "./middleware/generic-middleware.js";
|
|
6
|
+
export * from "./middleware/middleware.js";
|
|
7
|
+
// codegen:end
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RSxjQUFjLGlDQUFpQyxDQUFBO0FBQy9DLGNBQWMsb0NBQW9DLENBQUE7QUFDbEQsY0FBYyxtQ0FBbUMsQ0FBQTtBQUNqRCxjQUFjLG9DQUFvQyxDQUFBO0FBQ2xELGNBQWMsNEJBQTRCLENBQUE7QUFDMUMsY0FBYyJ9
|