@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
|
@@ -1,122 +0,0 @@
|
|
|
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 { Array, Cause, Context, Effect, Layer, ParseResult, pipe } from "effect-app";
|
|
5
|
-
import { HttpHeaders, HttpServerRequest } from "effect-app/http";
|
|
6
|
-
import { pretty } from "effect-app/utils";
|
|
7
|
-
import { logError, reportError } from "../../errorReporter.js";
|
|
8
|
-
import { InfraLogger } from "../../logger.js";
|
|
9
|
-
import { implementMiddleware, mergeContexts } from "./dynamic-middleware.js";
|
|
10
|
-
// Note: the type here must be aligned with MergedContextProvider
|
|
11
|
-
export const mergeContextProviders = (...deps) => ({
|
|
12
|
-
dependencies: deps.map((_) => _.Default),
|
|
13
|
-
effect: Effect.gen(function* () {
|
|
14
|
-
const makers = yield* Effect.all(deps);
|
|
15
|
-
return Effect
|
|
16
|
-
.gen(function* () {
|
|
17
|
-
const services = makers.map((handle, i) => ({ maker: deps[i], handle }));
|
|
18
|
-
// services are effects which return some Context.Context<...>
|
|
19
|
-
const context = yield* mergeContexts(services);
|
|
20
|
-
return context;
|
|
21
|
-
});
|
|
22
|
-
})
|
|
23
|
-
});
|
|
24
|
-
export const ContextProvider = (input) => {
|
|
25
|
-
const ctx = Context.GenericTag("ContextProvider");
|
|
26
|
-
const l = Layer.scoped(ctx, input.effect);
|
|
27
|
-
return Object.assign(ctx, {
|
|
28
|
-
Default: l.pipe(input.dependencies ? Layer.provide(input.dependencies) : (_) => _)
|
|
29
|
-
});
|
|
30
|
-
};
|
|
31
|
-
// Note: the type here must be aligned with mergeContextProviders
|
|
32
|
-
export const MergedContextProvider = (...deps) => pipe(deps, (_) => mergeContextProviders(..._), (_) => ContextProvider(_));
|
|
33
|
-
export const EmptyContextProvider = ContextProvider({ effect: Effect.succeed(Effect.succeed(Context.empty())) });
|
|
34
|
-
const logRequestError = logError("Request");
|
|
35
|
-
const reportRequestError = reportError("Request");
|
|
36
|
-
export class DevMode extends Context.Reference()("DevMode", { defaultValue: () => false }) {
|
|
37
|
-
}
|
|
38
|
-
// TODO: pull out to a generic middleware system..
|
|
39
|
-
export const requestMiddleware = (handle, moduleName) => Effect.fnUntraced(function* (input, rpcHeaders) {
|
|
40
|
-
const devMode = yield* DevMode;
|
|
41
|
-
// merge in the request headers
|
|
42
|
-
// we should consider if we should merge them into rpc headers on the Protocol layer instead.
|
|
43
|
-
const httpReq = yield* HttpServerRequest.HttpServerRequest;
|
|
44
|
-
const headers = HttpHeaders.merge(httpReq.headers, rpcHeaders);
|
|
45
|
-
return yield* Effect
|
|
46
|
-
.annotateCurrentSpan("requestInput", Object.entries(input).reduce((prev, [key, value]) => {
|
|
47
|
-
prev[key] = key === "password"
|
|
48
|
-
? "<redacted>"
|
|
49
|
-
: typeof value === "string" || typeof value === "number" || typeof value === "boolean"
|
|
50
|
-
? typeof value === "string" && value.length > 256
|
|
51
|
-
? (value.substring(0, 253) + "...")
|
|
52
|
-
: value
|
|
53
|
-
: Array.isArray(value)
|
|
54
|
-
? `Array[${value.length}]`
|
|
55
|
-
: value === null || value === undefined
|
|
56
|
-
? `${value}`
|
|
57
|
-
: typeof value === "object" && value
|
|
58
|
-
? `Object[${Object.keys(value).length}]`
|
|
59
|
-
: typeof value;
|
|
60
|
-
return prev;
|
|
61
|
-
}, {}))
|
|
62
|
-
.pipe(
|
|
63
|
-
// can't use andThen due to some being a function and effect
|
|
64
|
-
Effect.zipRight(handle(input, headers)),
|
|
65
|
-
// TODO: support ParseResult if the error channel of the request allows it.. but who would want that?
|
|
66
|
-
Effect.catchAll((_) => ParseResult.isParseError(_) ? Effect.die(_) : Effect.fail(_)), Effect.tapErrorCause((cause) => Cause.isFailure(cause) ? logRequestError(cause) : Effect.void), Effect.tapDefect((cause) => Effect
|
|
67
|
-
.all([
|
|
68
|
-
reportRequestError(cause, {
|
|
69
|
-
action: `${moduleName}.${input._tag}`
|
|
70
|
-
}),
|
|
71
|
-
InfraLogger
|
|
72
|
-
.logError("Finished request", cause)
|
|
73
|
-
.pipe(Effect.annotateLogs({
|
|
74
|
-
action: `${moduleName}.${input._tag}`,
|
|
75
|
-
req: pretty(input),
|
|
76
|
-
headers: pretty(headers)
|
|
77
|
-
// resHeaders: pretty(
|
|
78
|
-
// Object
|
|
79
|
-
// .entries(headers)
|
|
80
|
-
// .reduce((prev, [key, value]) => {
|
|
81
|
-
// prev[key] = value && typeof value === "string" ? snipString(value) : value
|
|
82
|
-
// return prev
|
|
83
|
-
// }, {} as Record<string, any>)
|
|
84
|
-
// )
|
|
85
|
-
}))
|
|
86
|
-
])), devMode ? (_) => _ : Effect.catchAllDefect(() => Effect.die("Internal Server Error")));
|
|
87
|
-
});
|
|
88
|
-
// factory for middlewares
|
|
89
|
-
export const makeMiddleware =
|
|
90
|
-
// by setting RequestContextMap beforehand, execute contextual typing does not fuck up itself to anys
|
|
91
|
-
() => (make) => {
|
|
92
|
-
// type Id = MiddlewareMakerId &
|
|
93
|
-
const MiddlewareMaker = Context.GenericTag("MiddlewareMaker");
|
|
94
|
-
const dynamicMiddlewares = implementMiddleware()(make.dynamicMiddlewares);
|
|
95
|
-
const l = Layer.scoped(MiddlewareMaker, Effect
|
|
96
|
-
.all({
|
|
97
|
-
dynamicMiddlewares: dynamicMiddlewares.effect,
|
|
98
|
-
middleware: make.execute((cb) => cb),
|
|
99
|
-
contextProvider: make.contextProvider // uses the middleware.contextProvider tag to get the context provider service
|
|
100
|
-
})
|
|
101
|
-
.pipe(Effect.map(({ contextProvider, dynamicMiddlewares, middleware }) => ({
|
|
102
|
-
_tag: "MiddlewareMaker",
|
|
103
|
-
effect: makeRpcEffect()((schema, handler, moduleName) => {
|
|
104
|
-
const h = middleware(schema, handler, moduleName);
|
|
105
|
-
return requestMiddleware(Effect.fnUntraced(function* (req, headers) {
|
|
106
|
-
yield* Effect.annotateCurrentSpan("request.name", moduleName ? `${moduleName}.${req._tag}` : req._tag);
|
|
107
|
-
// the contextProvider is an Effect that builds the context for the request
|
|
108
|
-
return yield* contextProvider.pipe(Effect.flatMap((contextProviderContext) =>
|
|
109
|
-
// the dynamicMiddlewares is an Effect that builds the dynamiuc context for the request
|
|
110
|
-
dynamicMiddlewares(schema.config ?? {}, headers).pipe(Effect.flatMap((dynamicContext) => h(req, headers).pipe(Effect.provide(dynamicContext))), Effect.provide(contextProviderContext))));
|
|
111
|
-
}), moduleName);
|
|
112
|
-
})
|
|
113
|
-
}))));
|
|
114
|
-
const middlewareLayer = l
|
|
115
|
-
.pipe(Layer.provide(Layer.mergeAll(make.dependencies ? make.dependencies : Layer.empty, ...dynamicMiddlewares.dependencies, make.contextProvider.Default)));
|
|
116
|
-
return Object.assign(MiddlewareMaker, { Default: middlewareLayer });
|
|
117
|
-
};
|
|
118
|
-
// it just provides the right types without cluttering the implementation with them
|
|
119
|
-
function makeRpcEffect() {
|
|
120
|
-
return (cb) => cb;
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY01pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JvdXRpbmcvRHluYW1pY01pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNERBQTREO0FBQzVELHdEQUF3RDtBQUN4RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXNCLFdBQVcsRUFBRSxJQUFJLEVBQW9DLE1BQU0sWUFBWSxDQUFBO0FBRTFJLE9BQU8sRUFBRSxXQUFXLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFakYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRXpDLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRTdDLE9BQU8sRUFBNEIsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFxSXRHLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQWlCbkMsR0FBRyxJQU1GLEVBWUQsRUFBRSxDQUFDLENBQUM7SUFDSixZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBUTtJQUMvQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0QyxPQUFPLE1BQU07YUFDVixHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUksTUFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FB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
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Context, Effect, type Layer, 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
|
-
export type ContextWithLayer<Config, Id, Service, E, R, MakeE, MakeR, Tag extends string, Args extends [config: Config, headers: Record<string, string>], Dependencies extends any[]> = Context.Tag<Id, {
|
|
5
|
-
handle: (...args: Args) => Effect<Option<Context<Service>>, E, R>;
|
|
6
|
-
_tag: Tag;
|
|
7
|
-
}> & {
|
|
8
|
-
Default: Layer.Layer<Id, MakeE, MakeR>;
|
|
9
|
-
dependsOn?: Dependencies;
|
|
10
|
-
};
|
|
11
|
-
export type AnyContextWithLayer<Config, Service, Error> = ContextWithLayer<Config, any, Service, Error, any, any, any, string, any, any> | ContextWithLayer<Config, any, Service, Error, never, any, never, any, any, any> | ContextWithLayer<Config, any, Service, Error, any, any, never, any, any, any> | ContextWithLayer<Config, any, Service, Error, never, any, any, any, any, any>;
|
|
12
|
-
export declare const mergeContexts: <T extends readonly {
|
|
13
|
-
maker: any;
|
|
14
|
-
handle: Effect<Context<any>>;
|
|
15
|
-
}[]>(makers: T) => Effect.Effect<Context.Context<Effect.Effect.Success<T[number]["handle"]>>, never, never>;
|
|
16
|
-
export declare const mergeOptionContexts: <T extends readonly {
|
|
17
|
-
maker: any;
|
|
18
|
-
handle: Effect<Option<Context<any>>>;
|
|
19
|
-
}[]>(makers: T) => Effect.Effect<Context.Context<never>, never, never>;
|
|
20
|
-
export declare const implementMiddleware: <T extends Record<string, RPCContextMap.Any>>() => <TI extends { [K in keyof T]: AnyContextWithLayer<{ [K_1 in keyof T]?: T[K_1]["contextActivation"]; }, T[K]["service"], S.Schema.Type<T[K]["error"]>>; }>(implementations: TI) => {
|
|
21
|
-
dependencies: { [K in keyof TI]: TI[K]["Default"]; }[keyof TI][];
|
|
22
|
-
effect: 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"]>>>, unknown, unknown>;
|
|
23
|
-
};
|
|
24
|
-
//# sourceMappingURL=dynamic-middleware.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-middleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing/dynamic-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1taWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9yb3V0aW5nL2R5bmFtaWMtbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBVSxNQUFNLFlBQVksQ0FBQTtBQUcvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUE7QUF5RWpDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUM1QyxRQUFRLENBQUMsRUFBb0UsTUFBUztJQUNwRixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDN0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN4RixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDbEUsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FDekIsOEJBQThCLEVBQzlCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQ3ZCLFdBQW1CLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUN2QyxDQUFBO1FBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FB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
|