@effect-app/infra 2.75.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 +6 -0
- package/dist/api/layerUtils.d.ts.map +1 -1
- package/dist/api/routing/middleware/ContextProvider.d.ts +14 -14
- package/dist/api/routing/middleware/ContextProvider.d.ts.map +1 -1
- package/dist/api/routing/middleware/ContextProvider.js +1 -1
- package/dist/api/routing/middleware/dynamic-middleware.d.ts +5 -6
- package/dist/api/routing/middleware/dynamic-middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/dynamic-middleware.js +1 -1
- package/dist/api/routing/middleware/middleware.d.ts +6 -1
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +11 -1
- package/package.json +1 -1
- package/src/api/layerUtils.ts +0 -1
- package/src/api/routing/middleware/ContextProvider.ts +37 -49
- package/src/api/routing/middleware/dynamic-middleware.ts +28 -66
- package/src/api/routing/middleware/middleware.ts +14 -0
- package/test/controller.test.ts +34 -12
- package/test/dist/controller.test.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1 +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;
|
|
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"}
|
|
@@ -1,23 +1,31 @@
|
|
|
1
1
|
import { type Array, Context, Effect, Layer, type NonEmptyArray, type Scope } from "effect-app";
|
|
2
2
|
import { type HttpRouter } from "effect-app/http";
|
|
3
|
+
import { type Tag } from "effect/Context";
|
|
3
4
|
import { type ContextTagWithDefault, type GetContext, type LayerUtils } from "../../layerUtils.js";
|
|
4
5
|
export type ContextProviderShape<ContextProviderA, ContextProviderR extends HttpRouter.HttpRouter.Provided> = Effect<Context.Context<ContextProviderA>, never, // no errors are allowed
|
|
5
6
|
ContextProviderR>;
|
|
6
7
|
export interface ContextProviderId {
|
|
7
8
|
_tag: "ContextProvider";
|
|
8
9
|
}
|
|
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> & {
|
|
10
15
|
_tag: any;
|
|
11
16
|
}> | Context.Tag<any, Effect<Context.Context<any>, never, never> & {
|
|
12
17
|
_tag: any;
|
|
13
18
|
}>) & {
|
|
14
|
-
new (...args: any[]): any;
|
|
15
19
|
Default: Layer.Layer<Effect<Context.Context<any>> & {
|
|
16
20
|
_tag: any;
|
|
17
21
|
}, any, any>;
|
|
18
|
-
}
|
|
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>) => {
|
|
19
27
|
dependencies: { [K in keyof TDeps]: TDeps[K]["Default"]; };
|
|
20
|
-
effect: Effect.Effect<Effect.Effect<Context.Context<GetContext<Effect.Success<
|
|
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"]; }>>;
|
|
21
29
|
};
|
|
22
30
|
export declare const ContextProvider: <ContextProviderA, MakeContextProviderE, MakeContextProviderR, ContextProviderR extends HttpRouter.HttpRouter.Provided, Dependencies extends NonEmptyArray<Layer.Layer.Any>>(input: {
|
|
23
31
|
effect: Effect<Effect<ContextProviderA, never, ContextProviderR>, MakeContextProviderE, MakeContextProviderR | Scope>;
|
|
@@ -25,17 +33,9 @@ export declare const ContextProvider: <ContextProviderA, MakeContextProviderE, M
|
|
|
25
33
|
}) => Context.Tag<ContextProviderId, Effect<ContextProviderA, never, ContextProviderR>> & {
|
|
26
34
|
Default: Layer.Layer<ContextProviderId, MakeContextProviderE | LayerUtils.GetLayersError<Dependencies>, Exclude<MakeContextProviderR, LayerUtils.GetLayersSuccess<Dependencies>> | LayerUtils.GetLayersContext<Dependencies>>;
|
|
27
35
|
};
|
|
28
|
-
export declare const MergedContextProvider: <TDeps extends
|
|
29
|
-
_tag: any;
|
|
30
|
-
}> | Context.Tag<any, Effect<Context.Context<any>, never, never> & {
|
|
31
|
-
_tag: any;
|
|
32
|
-
}>) & {
|
|
33
|
-
new (...args: any[]): any;
|
|
34
|
-
Default: Layer.Layer<Effect<Context.Context<any>> & {
|
|
35
|
-
_tag: any;
|
|
36
|
-
}, any, any>;
|
|
37
|
-
}>>(...deps: { [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`; }) => ContextTagWithDefault<ContextProviderId, Effect.Effect<Context.Context<GetContext<Effect.Success<InstanceType<TDeps[number]>>>>, never, Effect.Context<InstanceType<TDeps[number]>>>, LayerUtils.GetLayersError<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>, Exclude<InstanceType<TDeps[number]>, LayerUtils.GetLayersSuccess<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>> | LayerUtils.GetLayersContext<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>>;
|
|
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"]; }>>;
|
|
38
37
|
export declare const EmptyContextProvider: Context.Tag<ContextProviderId, Effect<Context.Context<never>, never, never>> & {
|
|
39
38
|
Default: Layer.Layer<ContextProviderId, never, never>;
|
|
40
39
|
};
|
|
40
|
+
export {};
|
|
41
41
|
//# sourceMappingURL=ContextProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextProvider.d.ts","sourceRoot":"","sources":["../../../../src/api/routing/middleware/ContextProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,aAAa,EAAQ,KAAK,KAAK,EAAE,MAAM,YAAY,CAAA;AACrG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAIlG,MAAM,MAAM,oBAAoB,CAAC,gBAAgB,EAAE,gBAAgB,SAAS,UAAU,CAAC,UAAU,CAAC,QAAQ,IAAI,MAAM,CAClH,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EACjC,KAAK,EAAE,wBAAwB;AAC/B,gBAAgB,CACjB,CAAA;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,iBAAiB,CAAA;CACxB;
|
|
1
|
+
{"version":3,"file":"ContextProvider.d.ts","sourceRoot":"","sources":["../../../../src/api/routing/middleware/ContextProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,4 +24,4 @@ export const ContextProvider = (input) => {
|
|
|
24
24
|
// Note: the type here must be aligned with mergeContextProviders
|
|
25
25
|
export const MergedContextProvider = (...deps) => pipe(deps, (_) => mergeContextProviders(..._), (_) => ContextProvider(_));
|
|
26
26
|
export const EmptyContextProvider = ContextProvider({ effect: Effect.succeed(Effect.succeed(Context.empty())) });
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dFByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9yb3V0aW5nL21pZGRsZXdhcmUvQ29udGV4dFByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBc0IsSUFBSSxFQUFjLE1BQU0sWUFBWSxDQUFBO0FBSXJHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQXNDdkQsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBR25DLEdBQUcsSUFBMEIsRUFhN0IsRUFBRSxDQUFDLENBQUM7SUFDSixZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBUTtJQUMvQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0QyxPQUFPLE1BQU07YUFDVixHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUksTUFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDbkYsOERBQThEO1lBQzlELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFlLENBQUMsQ0FBQTtZQUNyRCxPQUFPLE9BQU8sQ0FBQTtRQUNoQixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBUTtDQUNWLENBQUMsQ0FBQTtBQUVGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQU83QixLQU9DLEVBQ0QsRUFBRTtJQUNGLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBSTVCLGlCQUFpQixDQUNsQixDQUFBO0lBQ0QsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDeEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2IsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBT3pFO0tBQ0YsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBRUQsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBR25DLEdBQUcsSUFBMEIsRUFDN0IsRUFBRSxDQUNGLElBQUksQ0FDRixJQUFxRCxFQUNyRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFRLENBQUMsQ0FlakMsQ0FBQTtBQUVILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEifQ==
|
|
@@ -2,14 +2,13 @@ import { Context, Effect, Option, type S } from "effect-app";
|
|
|
2
2
|
import { type GetEffectContext, type RPCContextMap } from "effect-app/client";
|
|
3
3
|
import { type Tag } from "effect-app/Context";
|
|
4
4
|
import { type ContextTagWithDefault } from "../../layerUtils.js";
|
|
5
|
-
export type ContextWithLayer<Config,
|
|
6
|
-
handle: (...args:
|
|
7
|
-
|
|
8
|
-
}, MakeE, MakeR> & {
|
|
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 & {
|
|
9
8
|
dependsOn?: Dependencies;
|
|
10
9
|
};
|
|
11
10
|
export declare namespace ContextWithLayer {
|
|
12
|
-
type Base<Config, Service, Error> = ContextWithLayer<Config,
|
|
11
|
+
type Base<Config, Service, Error> = ContextWithLayer<Config, Service, Error, any, any>;
|
|
13
12
|
}
|
|
14
13
|
export declare const mergeContexts: <T extends readonly {
|
|
15
14
|
maker: any;
|
|
@@ -21,6 +20,6 @@ export declare const mergeOptionContexts: <T extends readonly {
|
|
|
21
20
|
}[]>(makers: T) => Effect.Effect<Context.Context<never>, never, never>;
|
|
22
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) => {
|
|
23
22
|
dependencies: { [K in keyof TI]: TI[K]["Default"]; }[keyof TI][];
|
|
24
|
-
effect: Effect
|
|
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]>>;
|
|
25
24
|
};
|
|
26
25
|
//# sourceMappingURL=dynamic-middleware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/routing/middleware/dynamic-middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC7E,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAG7C,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAGhE,MAAM,MAAM,gBAAgB,CAC1B,MAAM,EACN,
|
|
1
|
+
{"version":3,"file":"dynamic-middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/routing/middleware/dynamic-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,4 +36,4 @@ export const implementMiddleware = () => (implementations) => ({
|
|
|
36
36
|
});
|
|
37
37
|
})
|
|
38
38
|
});
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1taWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9yb3V0aW5nL21pZGRsZXdhcmUvZHluYW1pYy1taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFVLE1BQU0sWUFBWSxDQUFBO0FBR25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFaEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQWtDbEMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQzVDLFFBQVEsQ0FBQyxFQUFvRSxNQUFTO0lBQ3BGLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM3QixLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUNsRSxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUN6Qiw4QkFBOEIsRUFDOUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssRUFDdkIsV0FBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQ3ZDLENBQUE7UUFDRCxPQUFP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
|
|
@@ -3,6 +3,11 @@ import { HttpHeaders, type HttpRouter } from "effect-app/http";
|
|
|
3
3
|
declare const DevMode_base: Context.ReferenceClass<DevMode, "DevMode", boolean>;
|
|
4
4
|
export declare class DevMode extends DevMode_base {
|
|
5
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
|
+
}
|
|
6
11
|
declare const ConfigureInterruptibility_base: Effect.Service.Class<ConfigureInterruptibility, "ConfigureInterruptibility", {
|
|
7
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>;
|
|
8
13
|
}>;
|
|
@@ -18,6 +23,6 @@ declare const MiddlewareLogger_base: Effect.Service.Class<MiddlewareLogger, "Mid
|
|
|
18
23
|
}>;
|
|
19
24
|
export declare class MiddlewareLogger extends MiddlewareLogger_base {
|
|
20
25
|
}
|
|
21
|
-
export declare const DefaultGenericMiddlewares: readonly [typeof ConfigureInterruptibility, typeof CaptureHttpHeadersAsRpcHeaders, typeof MiddlewareLogger];
|
|
26
|
+
export declare const DefaultGenericMiddlewares: readonly [typeof RequestCacheMiddleware, typeof ConfigureInterruptibility, typeof CaptureHttpHeadersAsRpcHeaders, typeof MiddlewareLogger];
|
|
22
27
|
export {};
|
|
23
28
|
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -1 +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;;
|
|
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"}
|
|
@@ -3,10 +3,19 @@ import { HttpHeaders, HttpServerRequest } from "effect-app/http";
|
|
|
3
3
|
import { pretty } from "effect-app/utils";
|
|
4
4
|
import { logError, reportError } from "../../../errorReporter.js";
|
|
5
5
|
import { InfraLogger } from "../../../logger.js";
|
|
6
|
+
import { RequestCacheLayers } from "../../routing.js";
|
|
6
7
|
const logRequestError = logError("Request");
|
|
7
8
|
const reportRequestError = reportError("Request");
|
|
8
9
|
export class DevMode extends Context.Reference()("DevMode", { defaultValue: () => false }) {
|
|
9
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
|
+
}
|
|
10
19
|
export class ConfigureInterruptibility extends Effect.Service()("ConfigureInterruptibility", {
|
|
11
20
|
effect: Effect.gen(function* () {
|
|
12
21
|
return (handle, _moduleName) => Effect.fnUntraced(function* (input, headers) {
|
|
@@ -84,8 +93,9 @@ export class MiddlewareLogger extends Effect.Service()("MiddlewareLogger", {
|
|
|
84
93
|
}) {
|
|
85
94
|
}
|
|
86
95
|
export const DefaultGenericMiddlewares = [
|
|
96
|
+
RequestCacheMiddleware,
|
|
87
97
|
ConfigureInterruptibility,
|
|
88
98
|
CaptureHttpHeadersAsRpcHeaders,
|
|
89
99
|
MiddlewareLogger
|
|
90
100
|
];
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9taWRkbGV3YXJlL21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFtQixpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUVyRCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDM0MsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFakQsTUFBTSxPQUFPLE9BQVEsU0FBUSxPQUFPLENBQUMsU0FBUyxFQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQUc7QUFFdEcsTUFBTSxPQUFPLHNCQUF1QixTQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQTBCLENBQUMsd0JBQXdCLEVBQUU7SUFDN0csTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQzFCLE9BQU8sQ0FDTCxNQUF5RyxFQUN6RyxXQUFtQixFQUNuQixFQUFFLENBQ0YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxLQUFVLEVBQUUsT0FBNEI7WUFDbEUsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFN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
|
package/package.json
CHANGED
package/src/api/layerUtils.ts
CHANGED
|
@@ -24,7 +24,6 @@ export type ContextTagWithDefault<Id, A, LayerE, LayerR, Tag = unknown> =
|
|
|
24
24
|
& (Tag extends string ? Context.Tag<Id, { _tag: Tag } & A> : Context.Tag<Id, A>)
|
|
25
25
|
& {
|
|
26
26
|
Default: Layer.Layer<Id, LayerE, LayerR>
|
|
27
|
-
// new(a: A): Id
|
|
28
27
|
}
|
|
29
28
|
|
|
30
29
|
export namespace ContextTagWithDefault {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Array, Context, Effect, Layer, type NonEmptyArray, pipe, type Scope } from "effect-app"
|
|
2
2
|
import { type HttpRouter } from "effect-app/http"
|
|
3
|
+
import { type Tag } from "effect/Context"
|
|
3
4
|
import { type ContextTagWithDefault, type GetContext, type LayerUtils } from "../../layerUtils.js"
|
|
4
5
|
import { mergeContexts } from "./dynamic-middleware.js"
|
|
5
6
|
|
|
@@ -14,38 +15,44 @@ export interface ContextProviderId {
|
|
|
14
15
|
_tag: "ContextProvider"
|
|
15
16
|
}
|
|
16
17
|
|
|
18
|
+
/**
|
|
19
|
+
* TDeps is an array of services with Default implementation
|
|
20
|
+
* each service is an effect which builds some context for each request
|
|
21
|
+
*/
|
|
22
|
+
type TDepsArr = Array.NonEmptyReadonlyArray<
|
|
23
|
+
& (
|
|
24
|
+
// E = never => the context provided cannot trigger errors
|
|
25
|
+
// can't put HttpRouter.HttpRouter.Provided as R here because of variance
|
|
26
|
+
// (TDeps is an input type parameter so it's contravariant therefore Effect's R becomes contravariant too)
|
|
27
|
+
| Context.Tag<any, Effect<Context.Context<any>, never, any> & { _tag: any }>
|
|
28
|
+
| Context.Tag<any, Effect<Context.Context<any>, never, never> & { _tag: any }>
|
|
29
|
+
)
|
|
30
|
+
& {
|
|
31
|
+
Default: Layer.Layer<Effect<Context.Context<any>> & { _tag: any }, any, any>
|
|
32
|
+
}
|
|
33
|
+
>
|
|
34
|
+
|
|
35
|
+
type ConstrainDeps<TDeps extends TDepsArr> = {
|
|
36
|
+
[K in keyof TDeps]: TDeps[K]["Service"] extends Effect<Context.Context<any>, never, HttpRouter.HttpRouter.Provided>
|
|
37
|
+
? TDeps[K]
|
|
38
|
+
: `HttpRouter.HttpRouter.Provided are the only requirements ${TDeps[K]["Service"][
|
|
39
|
+
"_tag"
|
|
40
|
+
]}'s returned effect can have`
|
|
41
|
+
}
|
|
42
|
+
|
|
17
43
|
// Note: the type here must be aligned with MergedContextProvider
|
|
18
44
|
export const mergeContextProviders = <
|
|
19
|
-
|
|
20
|
-
// each service is an effect which builds some context for each request
|
|
21
|
-
TDeps extends Array.NonEmptyReadonlyArray<
|
|
22
|
-
& (
|
|
23
|
-
// E = never => the context provided cannot trigger errors
|
|
24
|
-
// can't put HttpRouter.HttpRouter.Provided as R here because of variance
|
|
25
|
-
// (TDeps is an input type parameter so it's contravariant therefore Effect's R becomes contravariant too)
|
|
26
|
-
| Context.Tag<any, Effect<Context.Context<any>, never, any> & { _tag: any }>
|
|
27
|
-
| Context.Tag<any, Effect<Context.Context<any>, never, never> & { _tag: any }>
|
|
28
|
-
)
|
|
29
|
-
& {
|
|
30
|
-
new(...args: any[]): any
|
|
31
|
-
Default: Layer.Layer<Effect<Context.Context<any>> & { _tag: any }, any, any>
|
|
32
|
-
}
|
|
33
|
-
>
|
|
45
|
+
TDeps extends TDepsArr
|
|
34
46
|
>(
|
|
35
|
-
...deps:
|
|
36
|
-
[K in keyof TDeps]: TDeps[K]["Service"] extends Effect<Context.Context<any>, never, HttpRouter.HttpRouter.Provided>
|
|
37
|
-
? TDeps[K]
|
|
38
|
-
: `HttpRouter.HttpRouter.Provided are the only requirements ${TDeps[K]["Service"][
|
|
39
|
-
"_tag"
|
|
40
|
-
]}'s returned effect can have`
|
|
41
|
-
}
|
|
47
|
+
...deps: ConstrainDeps<TDeps>
|
|
42
48
|
): {
|
|
43
49
|
dependencies: { [K in keyof TDeps]: TDeps[K]["Default"] }
|
|
44
50
|
effect: Effect.Effect<
|
|
45
51
|
Effect.Effect<
|
|
46
|
-
|
|
52
|
+
// we need to merge all contexts into one
|
|
53
|
+
Context.Context<GetContext<Effect.Success<Tag.Service<TDeps[number]>>>>,
|
|
47
54
|
never,
|
|
48
|
-
Effect.Context<
|
|
55
|
+
Effect.Context<Tag.Service<TDeps[number]>>
|
|
49
56
|
>,
|
|
50
57
|
LayerUtils.GetLayersError<{ [K in keyof TDeps]: TDeps[K]["Default"] }>,
|
|
51
58
|
LayerUtils.GetLayersSuccess<{ [K in keyof TDeps]: TDeps[K]["Default"] }>
|
|
@@ -102,29 +109,9 @@ export const ContextProvider = <
|
|
|
102
109
|
|
|
103
110
|
// Note: the type here must be aligned with mergeContextProviders
|
|
104
111
|
export const MergedContextProvider = <
|
|
105
|
-
|
|
106
|
-
// each service is an effect which builds some context for each request
|
|
107
|
-
TDeps extends Array.NonEmptyReadonlyArray<
|
|
108
|
-
& (
|
|
109
|
-
// E = never => the context provided cannot trigger errors
|
|
110
|
-
// can't put HttpRouter.HttpRouter.Provided as R here because of variance
|
|
111
|
-
// (TDeps is an input type parameter so it's contravariant therefore Effect's R becomes contravariant too)
|
|
112
|
-
| Context.Tag<any, Effect<Context.Context<any>, never, any> & { _tag: any }>
|
|
113
|
-
| Context.Tag<any, Effect<Context.Context<any>, never, never> & { _tag: any }>
|
|
114
|
-
)
|
|
115
|
-
& {
|
|
116
|
-
new(...args: any[]): any
|
|
117
|
-
Default: Layer.Layer<Effect<Context.Context<any>> & { _tag: any }, any, any>
|
|
118
|
-
}
|
|
119
|
-
>
|
|
112
|
+
TDeps extends TDepsArr
|
|
120
113
|
>(
|
|
121
|
-
...deps:
|
|
122
|
-
[K in keyof TDeps]: TDeps[K]["Service"] extends Effect<Context.Context<any>, never, HttpRouter.HttpRouter.Provided>
|
|
123
|
-
? TDeps[K]
|
|
124
|
-
: `HttpRouter.HttpRouter.Provided are the only requirements ${TDeps[K]["Service"][
|
|
125
|
-
"_tag"
|
|
126
|
-
]}'s returned effect can have`
|
|
127
|
-
}
|
|
114
|
+
...deps: ConstrainDeps<TDeps>
|
|
128
115
|
) =>
|
|
129
116
|
pipe(
|
|
130
117
|
deps as [Parameters<typeof mergeContextProviders>[0]],
|
|
@@ -133,13 +120,14 @@ export const MergedContextProvider = <
|
|
|
133
120
|
) as unknown as ContextTagWithDefault<
|
|
134
121
|
ContextProviderId,
|
|
135
122
|
Effect.Effect<
|
|
136
|
-
|
|
123
|
+
// we need to merge all contexts into one
|
|
124
|
+
Context.Context<GetContext<Effect.Success<Tag.Service<TDeps[number]>>>>,
|
|
137
125
|
never,
|
|
138
|
-
Effect.Context<
|
|
126
|
+
Effect.Context<Tag.Service<TDeps[number]>>
|
|
139
127
|
>,
|
|
140
128
|
LayerUtils.GetLayersError<{ [K in keyof TDeps]: TDeps[K]["Default"] }>,
|
|
141
129
|
| Exclude<
|
|
142
|
-
|
|
130
|
+
Tag.Service<TDeps[number]>,
|
|
143
131
|
LayerUtils.GetLayersSuccess<{ [K in keyof TDeps]: TDeps[K]["Default"] }>
|
|
144
132
|
>
|
|
145
133
|
| LayerUtils.GetLayersContext<{ [K in keyof TDeps]: TDeps[K]["Default"] }>
|
|
@@ -9,76 +9,34 @@ import { sort } from "../tsort.js"
|
|
|
9
9
|
|
|
10
10
|
export type ContextWithLayer<
|
|
11
11
|
Config,
|
|
12
|
-
Id,
|
|
13
12
|
Service,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
MakeR
|
|
13
|
+
Error,
|
|
14
|
+
Dependencies,
|
|
15
|
+
Thing extends ContextTagWithDefault<
|
|
16
|
+
any,
|
|
17
|
+
{
|
|
18
|
+
handle: (
|
|
19
|
+
...args: [config: Config, headers: Record<string, string>]
|
|
20
|
+
) => Effect<Option<Context<Service>>, Error, unknown>
|
|
21
|
+
},
|
|
22
|
+
any,
|
|
23
|
+
unknown,
|
|
24
|
+
any
|
|
27
25
|
>
|
|
26
|
+
> =
|
|
27
|
+
& Thing
|
|
28
28
|
& {
|
|
29
29
|
dependsOn?: Dependencies
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
export namespace ContextWithLayer {
|
|
33
|
-
export type Base<Config, Service, Error> =
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
any,
|
|
41
|
-
any,
|
|
42
|
-
string,
|
|
43
|
-
any,
|
|
44
|
-
any
|
|
45
|
-
>
|
|
46
|
-
| ContextWithLayer<
|
|
47
|
-
Config,
|
|
48
|
-
any,
|
|
49
|
-
Service,
|
|
50
|
-
Error,
|
|
51
|
-
never,
|
|
52
|
-
any,
|
|
53
|
-
never,
|
|
54
|
-
any,
|
|
55
|
-
any,
|
|
56
|
-
any
|
|
57
|
-
>
|
|
58
|
-
| ContextWithLayer<
|
|
59
|
-
Config,
|
|
60
|
-
any,
|
|
61
|
-
Service,
|
|
62
|
-
Error,
|
|
63
|
-
any,
|
|
64
|
-
any,
|
|
65
|
-
never,
|
|
66
|
-
any,
|
|
67
|
-
any,
|
|
68
|
-
any
|
|
69
|
-
>
|
|
70
|
-
| ContextWithLayer<
|
|
71
|
-
Config,
|
|
72
|
-
any,
|
|
73
|
-
Service,
|
|
74
|
-
Error,
|
|
75
|
-
never,
|
|
76
|
-
any,
|
|
77
|
-
any,
|
|
78
|
-
any,
|
|
79
|
-
any,
|
|
80
|
-
any
|
|
81
|
-
>
|
|
33
|
+
export type Base<Config, Service, Error> = ContextWithLayer<
|
|
34
|
+
Config,
|
|
35
|
+
Service,
|
|
36
|
+
Error,
|
|
37
|
+
any,
|
|
38
|
+
any
|
|
39
|
+
>
|
|
82
40
|
}
|
|
83
41
|
|
|
84
42
|
export const mergeContexts = Effect.fnUntraced(
|
|
@@ -146,13 +104,17 @@ export const implementMiddleware = <T extends Record<string, RPCContextMap.Any>>
|
|
|
146
104
|
GetEffectContext<T, typeof config>
|
|
147
105
|
>
|
|
148
106
|
}
|
|
149
|
-
)
|
|
107
|
+
)
|
|
108
|
+
}) as unknown as Effect<
|
|
109
|
+
(
|
|
150
110
|
config: { [K in keyof T]?: T[K]["contextActivation"] },
|
|
151
111
|
headers: Record<string, string>
|
|
152
112
|
) => Effect.Effect<
|
|
153
113
|
Context.Context<GetEffectContext<T, typeof config>>,
|
|
154
114
|
Effect.Error<ReturnType<Tag.Service<TI[keyof TI]>["handle"]>>,
|
|
155
115
|
Effect.Context<ReturnType<Tag.Service<TI[keyof TI]>["handle"]>>
|
|
156
|
-
|
|
157
|
-
|
|
116
|
+
>,
|
|
117
|
+
never,
|
|
118
|
+
Tag.Identifier<{ [K in keyof TI]: TI[K] }[keyof TI]>
|
|
119
|
+
>
|
|
158
120
|
})
|
|
@@ -3,12 +3,25 @@ import { HttpHeaders, type HttpRouter, HttpServerRequest } from "effect-app/http
|
|
|
3
3
|
import { pretty } from "effect-app/utils"
|
|
4
4
|
import { logError, reportError } from "../../../errorReporter.js"
|
|
5
5
|
import { InfraLogger } from "../../../logger.js"
|
|
6
|
+
import { RequestCacheLayers } from "../../routing.js"
|
|
6
7
|
|
|
7
8
|
const logRequestError = logError("Request")
|
|
8
9
|
const reportRequestError = reportError("Request")
|
|
9
10
|
|
|
10
11
|
export class DevMode extends Context.Reference<DevMode>()("DevMode", { defaultValue: () => false }) {}
|
|
11
12
|
|
|
13
|
+
export class RequestCacheMiddleware extends Effect.Service<RequestCacheMiddleware>()("RequestCacheMiddleware", {
|
|
14
|
+
effect: Effect.gen(function*() {
|
|
15
|
+
return <A, E>(
|
|
16
|
+
handle: (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>,
|
|
17
|
+
_moduleName: string
|
|
18
|
+
) =>
|
|
19
|
+
Effect.fnUntraced(function*(input: any, headers: HttpHeaders.Headers) {
|
|
20
|
+
return yield* handle(input, headers).pipe(Effect.provide(RequestCacheLayers))
|
|
21
|
+
})
|
|
22
|
+
})
|
|
23
|
+
}) {}
|
|
24
|
+
|
|
12
25
|
export class ConfigureInterruptibility extends Effect.Service<ConfigureInterruptibility>()(
|
|
13
26
|
"ConfigureInterruptibility",
|
|
14
27
|
{
|
|
@@ -114,6 +127,7 @@ export class MiddlewareLogger extends Effect.Service<MiddlewareLogger>()("Middle
|
|
|
114
127
|
}) {}
|
|
115
128
|
|
|
116
129
|
export const DefaultGenericMiddlewares = [
|
|
130
|
+
RequestCacheMiddleware,
|
|
117
131
|
ConfigureInterruptibility,
|
|
118
132
|
CaptureHttpHeadersAsRpcHeaders,
|
|
119
133
|
MiddlewareLogger
|
package/test/controller.test.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
3
|
-
import { type MakeContext, type MakeErrors, makeRouter
|
|
3
|
+
import { type MakeContext, type MakeErrors, makeRouter } from "@effect-app/infra/api/routing"
|
|
4
4
|
import type { RequestContext } from "@effect-app/infra/RequestContext"
|
|
5
5
|
import { expect, expectTypeOf, it } from "@effect/vitest"
|
|
6
6
|
import { type Array, Context, Effect, Layer, Option, S } from "effect-app"
|
|
7
7
|
import { InvalidStateError, makeRpcClient, type RPCContextMap, UnauthorizedError } from "effect-app/client"
|
|
8
8
|
import { type HttpHeaders, type HttpRouter, HttpServerRequest } from "effect-app/http"
|
|
9
9
|
import { Class, TaggedError } from "effect-app/Schema"
|
|
10
|
-
import { ContextProvider, DefaultGenericMiddlewares, makeMiddleware, mergeContextProviders, MergedContextProvider } from "../src/api/routing/middleware.js"
|
|
10
|
+
import { ContextProvider, DefaultGenericMiddlewares, implementMiddleware, makeMiddleware, mergeContextProviders, MergedContextProvider } from "../src/api/routing/middleware.js"
|
|
11
11
|
import { sort } from "../src/api/routing/tsort.js"
|
|
12
12
|
import { SomeService } from "./query.test.js"
|
|
13
13
|
|
|
@@ -76,11 +76,24 @@ class MyContextProvider extends Effect.Service<MyContextProvider>()("MyContextPr
|
|
|
76
76
|
})
|
|
77
77
|
}) {}
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
80
|
+
class MyContextProvider2 extends Effect.Service<MyContextProvider2>()("MyContextProvider2", {
|
|
80
81
|
effect: Effect.gen(function*() {
|
|
82
|
+
yield* SomeService
|
|
83
|
+
if (Math.random() > 0.5) return yield* new CustomError1()
|
|
84
|
+
|
|
81
85
|
return Effect.gen(function*() {
|
|
82
|
-
|
|
83
|
-
|
|
86
|
+
// the only requiremeno you can have are the one provided by HttpRouter.HttpRouter.Provided
|
|
87
|
+
yield* HttpServerRequest.HttpServerRequest
|
|
88
|
+
|
|
89
|
+
// this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
|
|
90
|
+
// yield* SomeElse
|
|
91
|
+
|
|
92
|
+
// currently the effectful context provider cannot trigger an error when building the per request context
|
|
93
|
+
// this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
|
|
94
|
+
// if (Math.random() > 0.5) return yield* new CustomError2()
|
|
95
|
+
|
|
96
|
+
return Context.make(SomeElse, new SomeElse({ b: 2 }))
|
|
84
97
|
})
|
|
85
98
|
})
|
|
86
99
|
}) {}
|
|
@@ -90,9 +103,9 @@ export const contextProvider2 = ContextProvider(merged)
|
|
|
90
103
|
export const contextProvider3 = MergedContextProvider(MyContextProvider)
|
|
91
104
|
expectTypeOf(contextProvider2).toEqualTypeOf<typeof someContextProvider>()
|
|
92
105
|
expectTypeOf(contextProvider3).toEqualTypeOf<typeof contextProvider2>()
|
|
93
|
-
const merged2 = mergeContextProviders(MyContextProvider,
|
|
106
|
+
const merged2 = mergeContextProviders(MyContextProvider, MyContextProvider2)
|
|
94
107
|
export const contextProvider22 = ContextProvider(merged2)
|
|
95
|
-
export const contextProvider23 = MergedContextProvider(MyContextProvider,
|
|
108
|
+
export const contextProvider23 = MergedContextProvider(MyContextProvider, MyContextProvider2)
|
|
96
109
|
expectTypeOf(contextProvider23).toEqualTypeOf<typeof contextProvider22>()
|
|
97
110
|
|
|
98
111
|
export type RequestContextMap = {
|
|
@@ -124,8 +137,10 @@ class AllowAnonymous extends Effect.Service<AllowAnonymous>()("AllowAnonymous",
|
|
|
124
137
|
})
|
|
125
138
|
}) {}
|
|
126
139
|
|
|
140
|
+
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
127
141
|
class RequireRoles extends Effect.Service<RequireRoles>()("RequireRoles", {
|
|
128
142
|
effect: Effect.gen(function*() {
|
|
143
|
+
yield* Some
|
|
129
144
|
return {
|
|
130
145
|
handle: Effect.fn(
|
|
131
146
|
function*(cfg: { requireRoles?: readonly string[] }) {
|
|
@@ -154,7 +169,7 @@ class Test extends Effect.Service<Test>()("Test", {
|
|
|
154
169
|
})
|
|
155
170
|
}) {}
|
|
156
171
|
|
|
157
|
-
export class
|
|
172
|
+
export class BogusMiddleware extends Effect.Service<BogusMiddleware>()("BogusMiddleware", {
|
|
158
173
|
effect: Effect.gen(function*() {
|
|
159
174
|
return <A, E>(
|
|
160
175
|
handle: (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, HttpRouter.HttpRouter.Provided>,
|
|
@@ -166,12 +181,13 @@ export class MiddlewareLogger2 extends Effect.Service<MiddlewareLogger2>()("Midd
|
|
|
166
181
|
})
|
|
167
182
|
}) {}
|
|
168
183
|
|
|
184
|
+
const contextProvider = MergedContextProvider(MyContextProvider2, MyContextProvider)
|
|
169
185
|
// TODO: eventually it might be nice if we have total control over order somehow..
|
|
170
186
|
// [ AddRequestNameToSpanContext, RequestCacheContext, UninterruptibleMiddleware, Dynamic(or individual, AllowAnonymous, RequireRoles, Test - or whichever order) ]
|
|
171
187
|
const middleware = makeMiddleware<RequestContextMap>()({
|
|
172
188
|
// TODO: I guess it makes sense to support just passing array of context providers too, like dynamicMiddlewares?
|
|
173
|
-
contextProvider
|
|
174
|
-
genericMiddlewares: [...DefaultGenericMiddlewares,
|
|
189
|
+
contextProvider,
|
|
190
|
+
genericMiddlewares: [...DefaultGenericMiddlewares, BogusMiddleware],
|
|
175
191
|
// or is the better api to use constructors outside, like how contextProvider is used now?
|
|
176
192
|
dynamicMiddlewares: {
|
|
177
193
|
requireRoles: RequireRoles,
|
|
@@ -202,8 +218,8 @@ const middleware = makeMiddleware<RequestContextMap>()({
|
|
|
202
218
|
|
|
203
219
|
const middleware2 = makeMiddleware<RequestContextMap>()({
|
|
204
220
|
// TODO: I guess it makes sense to support just passing array of context providers too, like dynamicMiddlewares?
|
|
205
|
-
contextProvider
|
|
206
|
-
genericMiddlewares: [...DefaultGenericMiddlewares,
|
|
221
|
+
contextProvider,
|
|
222
|
+
genericMiddlewares: [...DefaultGenericMiddlewares, BogusMiddleware],
|
|
207
223
|
// or is the better api to use constructors outside, like how contextProvider is used now?
|
|
208
224
|
dynamicMiddlewares: {
|
|
209
225
|
requireRoles: RequireRoles,
|
|
@@ -439,3 +455,9 @@ expectTypeOf({} as MakeErrors<typeof router2.make>).toEqualTypeOf<InvalidStateEr
|
|
|
439
455
|
expectTypeOf({} as makeContext2).toEqualTypeOf<
|
|
440
456
|
SomethingService | SomethingRepo | SomethingService2
|
|
441
457
|
>()
|
|
458
|
+
|
|
459
|
+
export const dynamicMiddlewares = implementMiddleware<RequestContextMap>()({
|
|
460
|
+
requireRoles: RequireRoles,
|
|
461
|
+
allowAnonymous: AllowAnonymous,
|
|
462
|
+
test: Test
|
|
463
|
+
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../controller.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../controller.test.ts"],"names":[],"mappings":"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"}
|