@effect-app/infra 2.73.3 → 2.74.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/QueueMaker/errors.d.ts +1 -1
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/api/routing/DynamicMiddleware.d.ts +22 -9
- package/dist/api/routing/DynamicMiddleware.d.ts.map +1 -1
- package/dist/api/routing/DynamicMiddleware.js +83 -17
- package/dist/api/routing/dynamic-middleware.d.ts +24 -0
- package/dist/api/routing/dynamic-middleware.d.ts.map +1 -0
- package/dist/api/routing/dynamic-middleware.js +39 -0
- package/dist/api/routing/tsort.d.ts +8 -0
- package/dist/api/routing/tsort.d.ts.map +1 -0
- package/dist/api/routing/tsort.js +51 -0
- package/dist/api/routing.d.ts +19 -19
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +6 -55
- package/package.json +10 -2
- package/src/api/routing/DynamicMiddleware.ts +148 -36
- package/src/api/routing/dynamic-middleware.ts +154 -0
- package/src/api/routing/tsort.ts +56 -0
- package/src/api/routing.ts +12 -64
- package/test/controller.test.ts +115 -49
- package/test/dist/controller.legacy2.test.d.ts.map +1 -0
- package/test/dist/controller.legacy3.test.d.ts.map +1 -0
- package/test/dist/controller.test copy.d.ts +169 -0
- package/test/dist/controller.test copy.d.ts.map +1 -0
- package/test/dist/controller.test copy.js +152 -0
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/controller6.test.d.ts.map +1 -0
- package/test/dist/controller7.test.d.ts.map +1 -0
- package/test/dist/filterApi.test.d.ts.map +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 2.74.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- a36ceed: feat: composable dynamic middleware
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [a36ceed]
|
|
12
|
+
- effect-app@2.49.0
|
|
13
|
+
|
|
14
|
+
## 2.73.4
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 6996ba3: fix MergedContextProvider
|
|
19
|
+
|
|
3
20
|
## 2.73.3
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Cause, Effect, Exit } from "effect-app";
|
|
2
|
-
export declare const reportQueueError: <E>(cause: Cause<E>, extras?: Record<string, unknown>) => Effect.Effect<import("effect-app/client
|
|
2
|
+
export declare const reportQueueError: <E>(cause: Cause<E>, extras?: Record<string, unknown>) => Effect.Effect<import("effect-app/client").CauseException<unknown> | undefined, never, never>;
|
|
3
3
|
export declare function reportNonInterruptedFailure(context?: Record<string, unknown>): <A, E, R>(inp: Effect<A, E, R>) => Effect<Exit<A, E>, never, R>;
|
|
4
4
|
export declare function reportNonInterruptedFailureCause(context?: Record<string, unknown>): <E>(cause: Cause<E>) => Effect<void>;
|
|
5
5
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/QueueMaker/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAIhD,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/QueueMaker/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAIhD,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,iGACnD,CAAA;AAElC,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAEnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAUrE;AAED,wBAAgB,gCAAgC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACxE,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,IAAI,CAAC,CAM1C"}
|
|
@@ -1,20 +1,26 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Array, Context, Effect, Layer, type NonEmptyArray, type Request, type S, type Scope } from "effect-app";
|
|
2
2
|
import type { GetEffectContext, RPCContextMap } from "effect-app/client/req";
|
|
3
|
-
import { type HttpRouter } from "effect-app/http";
|
|
3
|
+
import { HttpHeaders, type HttpRouter, HttpServerRequest } from "effect-app/http";
|
|
4
4
|
import type * as EffectRequest from "effect/Request";
|
|
5
5
|
import { type LayersUtils } from "../routing.js";
|
|
6
|
+
import { type AnyContextWithLayer } from "./dynamic-middleware.js";
|
|
6
7
|
type GetContext<T> = T extends Context.Context<infer Y> ? Y : never;
|
|
7
8
|
export type MakeRPCHandlerFactory<RequestContextMap extends Record<string, RPCContextMap.Any>, MiddlewareR> = <T extends {
|
|
8
9
|
config?: Partial<Record<keyof RequestContextMap, any>>;
|
|
9
|
-
}, 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
|
|
10
|
+
}, 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"]>>>;
|
|
10
11
|
export type RPCHandlerFactory<RequestContextMap extends Record<string, RPCContextMap.Any>, ContextProviderA> = <T extends {
|
|
11
12
|
config?: Partial<Record<keyof RequestContextMap, any>>;
|
|
12
|
-
}, 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
|
|
13
|
+
}, 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>>;
|
|
13
14
|
export type ContextProviderShape<ContextProviderA, ContextProviderR extends HttpRouter.HttpRouter.Provided> = Effect<Context.Context<ContextProviderA>, never, // no errors are allowed
|
|
14
15
|
ContextProviderR>;
|
|
15
16
|
export interface ContextProviderId {
|
|
16
17
|
_tag: "ContextProvider";
|
|
17
18
|
}
|
|
19
|
+
type RequestContextMapProvider<RequestContextMap extends Record<string, RPCContextMap.Any>> = {
|
|
20
|
+
[K in keyof RequestContextMap]: AnyContextWithLayer<{
|
|
21
|
+
[K in keyof RequestContextMap]?: RequestContextMap[K]["contextActivation"];
|
|
22
|
+
}, RequestContextMap[K]["service"], S.Schema.Type<RequestContextMap[K]["error"]>>;
|
|
23
|
+
};
|
|
18
24
|
export interface MiddlewareMake<RequestContextMap extends Record<string, RPCContextMap.Any>, // what services will the middleware provide dynamically to the handler, or raise errors.
|
|
19
25
|
MakeMiddlewareE, // what the middleware construction can fail with
|
|
20
26
|
MakeMiddlewareR, // what the middleware requires to be constructed
|
|
@@ -22,12 +28,14 @@ MiddlewareDependencies extends NonEmptyArray<Layer.Layer.Any>, // layers provide
|
|
|
22
28
|
ContextProviderA, // what the context provider provides
|
|
23
29
|
ContextProviderR extends HttpRouter.HttpRouter.Provided, // what the context provider requires
|
|
24
30
|
MakeContextProviderE, // what the context provider construction can fail with
|
|
25
|
-
MakeContextProviderR
|
|
31
|
+
MakeContextProviderR, // what the context provider construction requires
|
|
32
|
+
TI extends RequestContextMapProvider<RequestContextMap>> {
|
|
26
33
|
dependencies?: MiddlewareDependencies;
|
|
34
|
+
dynamicMiddlewares: TI;
|
|
27
35
|
contextProvider: Context.Tag<ContextProviderId, ContextProviderShape<ContextProviderA, ContextProviderR>> & {
|
|
28
36
|
Default: Layer.Layer<ContextProviderId, MakeContextProviderE, MakeContextProviderR>;
|
|
29
37
|
};
|
|
30
|
-
execute: (maker: (cb: MakeRPCHandlerFactory<RequestContextMap, ContextProviderA | HttpRouter.HttpRouter.Provided>) => MakeRPCHandlerFactory<RequestContextMap, ContextProviderA | HttpRouter.HttpRouter.Provided>) => Effect<MakeRPCHandlerFactory<RequestContextMap, ContextProviderA | HttpRouter.HttpRouter.Provided>, MakeMiddlewareE, MakeMiddlewareR>;
|
|
38
|
+
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>;
|
|
31
39
|
}
|
|
32
40
|
export declare const mergeContextProviders: <TDeps extends Array.NonEmptyReadonlyArray<(Context.Tag<any, Effect<Context.Context<any>, never, any> & {
|
|
33
41
|
_tag: any;
|
|
@@ -40,13 +48,13 @@ export declare const mergeContextProviders: <TDeps extends Array.NonEmptyReadonl
|
|
|
40
48
|
}, any, any>;
|
|
41
49
|
}>>(...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`; }) => {
|
|
42
50
|
dependencies: { [K in keyof TDeps]: TDeps[K]["Default"]; };
|
|
43
|
-
effect: Effect.Effect<Effect.Effect<Context.Context<GetContext<Effect.Success<InstanceType<TDeps[number]>>>>, never, Effect.Context<InstanceType<TDeps[number]>>>, LayersUtils.GetLayersError<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>,
|
|
51
|
+
effect: Effect.Effect<Effect.Effect<Context.Context<GetContext<Effect.Success<InstanceType<TDeps[number]>>>>, never, Effect.Context<InstanceType<TDeps[number]>>>, LayersUtils.GetLayersError<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>, LayersUtils.GetLayersSuccess<{ [K in keyof TDeps]: TDeps[K]["Default"]; }>>;
|
|
44
52
|
};
|
|
45
53
|
export interface MiddlewareMakerId {
|
|
46
54
|
_tag: "MiddlewareMaker";
|
|
47
55
|
}
|
|
48
56
|
export declare const ContextProvider: <ContextProviderA, MakeContextProviderE, MakeContextProviderR, ContextProviderR extends HttpRouter.HttpRouter.Provided, Dependencies extends NonEmptyArray<Layer.Layer.Any>>(input: {
|
|
49
|
-
effect: Effect<Effect<ContextProviderA, never, ContextProviderR>, MakeContextProviderE, MakeContextProviderR>;
|
|
57
|
+
effect: Effect<Effect<ContextProviderA, never, ContextProviderR>, MakeContextProviderE, MakeContextProviderR | Scope>;
|
|
50
58
|
dependencies?: Dependencies;
|
|
51
59
|
}) => Context.Tag<ContextProviderId, Effect<ContextProviderA, never, ContextProviderR>> & {
|
|
52
60
|
Default: Layer.Layer<ContextProviderId, MakeContextProviderE | LayersUtils.GetLayersError<Dependencies>, Exclude<MakeContextProviderR, LayersUtils.GetLayersSuccess<Dependencies>> | LayersUtils.GetLayersContext<Dependencies>>;
|
|
@@ -75,13 +83,18 @@ ContextProviderA> = Context.Tag<MiddlewareMakerId, MiddlewareMakerId & {
|
|
|
75
83
|
Default: Layer.Layer<MiddlewareMakerId, MakeMiddlewareE, MakeMiddlewareR>;
|
|
76
84
|
};
|
|
77
85
|
export type RequestContextMapErrors<RequestContextMap extends Record<string, RPCContextMap.Any>> = S.Schema.Type<RequestContextMap[keyof RequestContextMap]["error"]>;
|
|
86
|
+
declare const DevMode_base: Context.ReferenceClass<DevMode, "DevMode", boolean>;
|
|
87
|
+
export declare class DevMode extends DevMode_base {
|
|
88
|
+
}
|
|
89
|
+
export declare const requestMiddleware: <A, E, R>(handle: (input: any, headers: HttpHeaders.Headers) => Effect.Effect<A, E, R>, moduleName: string) => (input: any, rpcHeaders: HttpHeaders.Headers) => Effect.Effect<A, E, HttpServerRequest.HttpServerRequest | R>;
|
|
78
90
|
export declare const makeMiddleware: <RequestContextMap extends Record<string, RPCContextMap.Any>>() => <MakeMiddlewareE, // what the middleware construction can fail with
|
|
79
91
|
MakeMiddlewareR, // what the middlware requires to be constructed
|
|
80
92
|
MiddlewareDependencies extends NonEmptyArray<Layer.Layer.Any>, // layers provided for the middlware to be constructed
|
|
81
93
|
ContextProviderA, // what the context provider provides
|
|
82
94
|
ContextProviderR extends HttpRouter.HttpRouter.Provided, // what the context provider requires
|
|
83
95
|
MakeContextProviderE, // what the context provider construction can fail with
|
|
84
|
-
MakeContextProviderR
|
|
96
|
+
MakeContextProviderR, // what the context provider construction requires
|
|
97
|
+
TI extends RequestContextMapProvider<RequestContextMap>>(make: MiddlewareMake<RequestContextMap, MakeMiddlewareE, MakeMiddlewareR, MiddlewareDependencies, ContextProviderA, ContextProviderR, MakeContextProviderE, MakeContextProviderR, TI>) => Context.Tag<MiddlewareMakerId, {
|
|
85
98
|
effect: RPCHandlerFactory<RequestContextMap, ContextProviderA>;
|
|
86
99
|
_tag: "MiddlewareMaker";
|
|
87
100
|
}> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicMiddleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing/DynamicMiddleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"DynamicMiddleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing/DynamicMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,56 +1,122 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
-
import { Context, Effect, Layer, pipe } from "effect-app";
|
|
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";
|
|
5
10
|
// Note: the type here must be aligned with MergedContextProvider
|
|
6
11
|
export const mergeContextProviders = (...deps) => ({
|
|
7
12
|
dependencies: deps.map((_) => _.Default),
|
|
8
13
|
effect: Effect.gen(function* () {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
+
});
|
|
13
22
|
})
|
|
14
23
|
});
|
|
15
24
|
export const ContextProvider = (input) => {
|
|
16
25
|
const ctx = Context.GenericTag("ContextProvider");
|
|
17
|
-
const l = Layer.
|
|
26
|
+
const l = Layer.scoped(ctx, input.effect);
|
|
18
27
|
return Object.assign(ctx, {
|
|
19
28
|
Default: l.pipe(input.dependencies ? Layer.provide(input.dependencies) : (_) => _)
|
|
20
29
|
});
|
|
21
30
|
};
|
|
22
31
|
// Note: the type here must be aligned with mergeContextProviders
|
|
23
|
-
export const MergedContextProvider = (...deps) => pipe(deps, mergeContextProviders, (_) => ContextProvider(_));
|
|
32
|
+
export const MergedContextProvider = (...deps) => pipe(deps, (_) => mergeContextProviders(..._), (_) => ContextProvider(_));
|
|
24
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
|
+
});
|
|
25
88
|
// factory for middlewares
|
|
26
89
|
export const makeMiddleware =
|
|
27
90
|
// by setting RequestContextMap beforehand, execute contextual typing does not fuck up itself to anys
|
|
28
91
|
() => (make) => {
|
|
29
92
|
// type Id = MiddlewareMakerId &
|
|
30
93
|
const MiddlewareMaker = Context.GenericTag("MiddlewareMaker");
|
|
31
|
-
const
|
|
94
|
+
const dynamicMiddlewares = implementMiddleware()(make.dynamicMiddlewares);
|
|
95
|
+
const l = Layer.scoped(MiddlewareMaker, Effect
|
|
32
96
|
.all({
|
|
97
|
+
dynamicMiddlewares: dynamicMiddlewares.effect,
|
|
33
98
|
middleware: make.execute((cb) => cb),
|
|
34
99
|
contextProvider: make.contextProvider // uses the middleware.contextProvider tag to get the context provider service
|
|
35
100
|
})
|
|
36
|
-
.pipe(Effect.map(({ contextProvider, middleware }) => ({
|
|
101
|
+
.pipe(Effect.map(({ contextProvider, dynamicMiddlewares, middleware }) => ({
|
|
37
102
|
_tag: "MiddlewareMaker",
|
|
38
103
|
effect: makeRpcEffect()((schema, handler, moduleName) => {
|
|
39
104
|
const h = middleware(schema, handler, moduleName);
|
|
40
|
-
return (req, headers)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
.pipe(Effect.
|
|
44
|
-
|
|
45
|
-
|
|
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);
|
|
46
112
|
})
|
|
47
113
|
}))));
|
|
48
114
|
const middlewareLayer = l
|
|
49
|
-
.pipe(make.dependencies ?
|
|
115
|
+
.pipe(Layer.provide(Layer.mergeAll(make.dependencies ? make.dependencies : Layer.empty, ...dynamicMiddlewares.dependencies, make.contextProvider.Default)));
|
|
50
116
|
return Object.assign(MiddlewareMaker, { Default: middlewareLayer });
|
|
51
117
|
};
|
|
52
118
|
// it just provides the right types without cluttering the implementation with them
|
|
53
119
|
function makeRpcEffect() {
|
|
54
120
|
return (cb) => cb;
|
|
55
121
|
}
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY01pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JvdXRpbmcvRHluYW1pY01pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNERBQTREO0FBQzVELHdEQUF3RDtBQUN4RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXNCLFdBQVcsRUFBRSxJQUFJLEVBQW9DLE1BQU0sWUFBWSxDQUFBO0FBRTFJLE9BQU8sRUFBRSxXQUFXLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFakYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRXpDLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRTdDLE9BQU8sRUFBNEIsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFxSXRHLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQWlCbkMsR0FBRyxJQU1GLEVBWUQsRUFBRSxDQUFDLENBQUM7SUFDSixZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBUTtJQUMvQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0QyxPQUFPLE1BQU07YUFDVixHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUksTUFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FB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
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-middleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1taWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9yb3V0aW5nL2R5bmFtaWMtbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBVSxNQUFNLFlBQVksQ0FBQTtBQUcvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUE7QUF5RWpDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUM1QyxRQUFRLENBQUMsRUFBb0UsTUFBUztJQUNwRixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDN0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN4RixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDbEUsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FDekIsOEJBQThCLEVBQzlCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQ3ZCLFdBQW1CLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUN2QyxDQUFBO1FBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FB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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function tsort(edges: any): any[];
|
|
2
|
+
export declare const createEdges: <T extends {
|
|
3
|
+
dependsOn?: any[];
|
|
4
|
+
}>(dep: readonly T[]) => any[];
|
|
5
|
+
export declare const sort: <T>(dep: readonly (T & {
|
|
6
|
+
dependsOn?: any[];
|
|
7
|
+
})[]) => readonly T[];
|
|
8
|
+
//# sourceMappingURL=tsort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsort.d.ts","sourceRoot":"","sources":["../../../src/api/routing/tsort.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,KAAK,KAAA,SAqC1B;AAED,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS;IAAE,SAAS,CAAC,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,KAAK,SAAS,CAAC,EAAE,UAQ7E,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,GAAG,EAAE,CAAA;CAAE,CAAC,EAAE,KAAG,SAAS,CAAC,EAI/E,CAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
export function tsort(edges) {
|
|
4
|
+
const nodes = new Map(), sorted = [], visited = new Map();
|
|
5
|
+
const Node = function (id) {
|
|
6
|
+
this.id = id;
|
|
7
|
+
this.afters = [];
|
|
8
|
+
};
|
|
9
|
+
edges.forEach((v) => {
|
|
10
|
+
const from = v[0], to = v[1];
|
|
11
|
+
if (!nodes.get(from))
|
|
12
|
+
nodes.set(from, new Node(from));
|
|
13
|
+
if (!nodes.get(to))
|
|
14
|
+
nodes.set(to, new Node(to));
|
|
15
|
+
nodes.get(from).afters.push(to);
|
|
16
|
+
});
|
|
17
|
+
[...nodes.keys()].forEach(function visit(idstr, ancestors) {
|
|
18
|
+
const node = nodes.get(idstr), id = node.id;
|
|
19
|
+
if (visited.get(idstr))
|
|
20
|
+
return;
|
|
21
|
+
if (!Array.isArray(ancestors))
|
|
22
|
+
ancestors = [];
|
|
23
|
+
ancestors.push(id);
|
|
24
|
+
visited.set(idstr, true);
|
|
25
|
+
node.afters.forEach(function (afterID) {
|
|
26
|
+
if (ancestors.indexOf(afterID) >= 0) {
|
|
27
|
+
throw new Error("closed chain : " + afterID + " is in " + id);
|
|
28
|
+
}
|
|
29
|
+
visit(afterID, ancestors.map(function (v) {
|
|
30
|
+
return v;
|
|
31
|
+
}));
|
|
32
|
+
});
|
|
33
|
+
sorted.unshift(id);
|
|
34
|
+
});
|
|
35
|
+
return sorted;
|
|
36
|
+
}
|
|
37
|
+
export const createEdges = (dep) => {
|
|
38
|
+
const result = [];
|
|
39
|
+
dep.forEach((key) => {
|
|
40
|
+
key.dependsOn?.forEach((n) => {
|
|
41
|
+
result.push([n, key]);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
export const sort = (dep) => {
|
|
47
|
+
const edges = createEdges(dep);
|
|
48
|
+
const result = tsort(edges);
|
|
49
|
+
return result.concat(dep.filter((v) => !result.includes(v)));
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JvdXRpbmcvdHNvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkRBQTZEO0FBQzdELGNBQWM7QUFDZCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQUs7SUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXpELE1BQU0sSUFBSSxHQUFHLFVBQVMsRUFBRTtRQUN0QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtRQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBQ2xCLENBQUMsQ0FBQTtJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNsQixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDL0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2pDLENBQUMsQ0FBQyxDQUNEO0lBQUEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUztRQUN4RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFBO1FBRTNDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFNO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUFFLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFFN0MsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFTLE9BQU87WUFDbEMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixHQUFHLE9BQU8sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFDL0QsQ0FBQztZQUNELEtBQUssQ0FDSCxPQUFPLEVBQ1AsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFTLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxDQUFBO1lBQ1YsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNwQixDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFrQyxHQUFpQixFQUFFLEVBQUU7SUFDaEYsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBQ2pCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNsQixHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN2QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBSSxHQUEyQyxFQUFnQixFQUFFO0lBQ25GLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUM5QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDM0IsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDOUQsQ0FBQyxDQUFBIn0=
|