@effect-app/infra 2.93.0 → 3.0.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 +22 -0
- package/dist/Emailer/service.d.ts +1 -1
- package/dist/MainFiberSet.d.ts +1 -1
- package/dist/Operations.d.ts +1 -1
- package/dist/RequestFiberSet.d.ts +1 -1
- package/dist/Store/service.d.ts +2 -2
- package/dist/adapters/SQL/Model.d.ts +6 -6
- package/dist/adapters/ServiceBus.d.ts +2 -2
- package/dist/adapters/ServiceBus.d.ts.map +1 -1
- package/dist/adapters/ServiceBus.js +13 -10
- package/dist/adapters/memQueue.d.ts +1 -1
- package/dist/api/ContextProvider.d.ts +3 -3
- package/dist/api/ContextProvider.d.ts.map +1 -1
- package/dist/api/ContextProvider.js +1 -1
- package/dist/api/routing/middleware/RouterMiddleware.d.ts +6 -6
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/RpcMiddleware.d.ts +4 -15
- package/dist/api/routing/middleware/RpcMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/RpcMiddleware.js +3 -4
- package/dist/api/routing/middleware/RpcMiddlewareX.d.ts +18 -0
- package/dist/api/routing/middleware/RpcMiddlewareX.d.ts.map +1 -0
- package/dist/api/routing/middleware/RpcMiddlewareX.js +16 -0
- package/dist/api/routing/middleware/generic-middleware.d.ts +22 -8
- package/dist/api/routing/middleware/generic-middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/generic-middleware.js +59 -62
- package/dist/api/routing/middleware/middleware-api.d.ts +51 -32
- package/dist/api/routing/middleware/middleware-api.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware-api.js +54 -24
- package/dist/api/routing/middleware/middleware-native.d.ts +23 -0
- package/dist/api/routing/middleware/middleware-native.d.ts.map +1 -0
- package/dist/api/routing/middleware/middleware-native.js +19 -0
- package/dist/api/routing/middleware/middleware.d.ts +7 -27
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +73 -88
- package/dist/api/routing/middleware.d.ts +1 -0
- package/dist/api/routing/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware.js +2 -1
- package/dist/api/routing.d.ts +1 -4
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +8 -8
- package/package.json +11 -3
- package/src/adapters/ServiceBus.ts +7 -5
- package/src/api/ContextProvider.ts +9 -7
- package/src/api/routing/middleware/RouterMiddleware.ts +9 -8
- package/src/api/routing/middleware/RpcMiddleware.ts +4 -51
- package/src/api/routing/middleware/RpcMiddlewareX.ts +70 -0
- package/src/api/routing/middleware/generic-middleware.ts +142 -107
- package/src/api/routing/middleware/middleware-api.ts +239 -61
- package/src/api/routing/middleware/middleware-native.ts +23 -0
- package/src/api/routing/middleware/middleware.ts +37 -40
- package/src/api/routing/middleware.ts +1 -0
- package/src/api/routing.ts +7 -13
- package/test/contextProvider.test.ts +4 -4
- package/test/controller.test.ts +41 -16
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/fixtures.d.ts +48 -32
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +76 -47
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -0
- package/test/fixtures.ts +71 -17
- package/test/requires.test.ts +15 -50
- package/test/rpc-multi-middleware.test.ts +134 -0
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
4
|
import { type Rpc, RpcMiddleware } from "@effect/rpc"
|
|
5
5
|
import { type SuccessValue, type TypeId } from "@effect/rpc/RpcMiddleware"
|
|
6
|
-
import { type Context, type Effect,
|
|
6
|
+
import { type Context, type Effect, type NonEmptyReadonlyArray, type Option, type S, type Schema, type Scope, Unify } from "effect-app"
|
|
7
7
|
import type { AnyService, ContextTagArray, RPCContextMap } from "effect-app/client/req"
|
|
8
8
|
import { type HttpHeaders } from "effect-app/http"
|
|
9
9
|
import { type TagUnify, type TagUnifyIgnore } from "effect/Context"
|
|
10
|
-
import { type Service } from "effect/Effect"
|
|
11
10
|
|
|
12
11
|
// updated to support Scope.Scope and Requires
|
|
13
12
|
export interface RpcMiddleware<Provides, E, Requires> {
|
|
@@ -28,7 +27,7 @@ export interface RpcMiddlewareWrap<Provides, E, Requires> {
|
|
|
28
27
|
}): Effect.Effect<SuccessValue, E, Scope.Scope | Requires>
|
|
29
28
|
}
|
|
30
29
|
|
|
31
|
-
type RpcOptionsOriginal = {
|
|
30
|
+
export type RpcOptionsOriginal = {
|
|
32
31
|
readonly wrap?: boolean
|
|
33
32
|
readonly optional?: boolean
|
|
34
33
|
readonly failure?: Schema.Schema.All
|
|
@@ -47,7 +46,7 @@ export type DependsOn = {
|
|
|
47
46
|
readonly dependsOn: NonEmptyReadonlyArray<AnyDynamic> | undefined
|
|
48
47
|
}
|
|
49
48
|
|
|
50
|
-
interface RpcOptionsDynamic<Key extends string, A extends RPCContextMap.Any> extends RpcOptionsOriginal {
|
|
49
|
+
export interface RpcOptionsDynamic<Key extends string, A extends RPCContextMap.Any> extends RpcOptionsOriginal {
|
|
51
50
|
readonly dynamic: RpcDynamic<Key, A>
|
|
52
51
|
readonly dependsOn?: NonEmptyReadonlyArray<AnyDynamic> | undefined
|
|
53
52
|
}
|
|
@@ -245,56 +244,10 @@ export const Tag = <Self>() =>
|
|
|
245
244
|
>(
|
|
246
245
|
id: Name,
|
|
247
246
|
options?: Options | undefined
|
|
248
|
-
) =>
|
|
249
|
-
<
|
|
250
|
-
LayerOpts extends {
|
|
251
|
-
effect: Effect.Effect<
|
|
252
|
-
Options extends RpcOptionsDynamic<any, any> ? TagClass.Wrap<Options> extends true ? RpcMiddlewareDynamicWrap<
|
|
253
|
-
TagClass.FailureService<Options>,
|
|
254
|
-
TagClass.Requires<Options>,
|
|
255
|
-
{ [K in Options["dynamic"]["key"]]?: Options["dynamic"]["settings"]["contextActivation"] }
|
|
256
|
-
>
|
|
257
|
-
: RpcMiddlewareDynamicNormal<
|
|
258
|
-
TagClass.Service<Options>,
|
|
259
|
-
TagClass.FailureService<Options>,
|
|
260
|
-
TagClass.Requires<Options>,
|
|
261
|
-
{ [K in Options["dynamic"]["key"]]?: Options["dynamic"]["settings"]["contextActivation"] }
|
|
262
|
-
>
|
|
263
|
-
: TagClass.Wrap<Options> extends true ? RpcMiddlewareWrap<
|
|
264
|
-
TagClass.Provides<Options>,
|
|
265
|
-
TagClass.Failure<Options>,
|
|
266
|
-
TagClass.Requires<Options>
|
|
267
|
-
>
|
|
268
|
-
: RpcMiddleware<
|
|
269
|
-
TagClass.Service<Options>,
|
|
270
|
-
TagClass.FailureService<Options>,
|
|
271
|
-
TagClass.Requires<Options>
|
|
272
|
-
>,
|
|
273
|
-
any,
|
|
274
|
-
any
|
|
275
|
-
>
|
|
276
|
-
// TODO: we really should only support NonEmtyReadonlyArray because ReadonlyArray fucks up once you have a Layer.empty in the list, as the whole thing resolves to never
|
|
277
|
-
dependencies?: NonEmptyReadonlyArray<Layer.Layer.Any> | ReadonlyArray<Layer.Layer.Any>
|
|
278
|
-
}
|
|
279
|
-
>(opts: LayerOpts): TagClass<Self, Name, Options> & {
|
|
280
|
-
Default: Layer.Layer<
|
|
281
|
-
Self,
|
|
282
|
-
| (LayerOpts extends { effect: Effect<infer _A, infer _E, infer _R> } ? _E
|
|
283
|
-
: never)
|
|
284
|
-
| Service.MakeDepsE<LayerOpts>,
|
|
285
|
-
| Exclude<
|
|
286
|
-
LayerOpts extends { effect: Effect<infer _A, infer _E, infer _R> } ? _R : never,
|
|
287
|
-
Service.MakeDepsOut<LayerOpts>
|
|
288
|
-
>
|
|
289
|
-
| Service.MakeDepsIn<LayerOpts>
|
|
290
|
-
>
|
|
291
|
-
} =>
|
|
247
|
+
): TagClass<Self, Name, Options> =>
|
|
292
248
|
class extends RpcMiddleware.Tag<Self>()(id, options as any) {
|
|
293
249
|
static readonly dynamic = options && "dynamic" in options ? options.dynamic : undefined
|
|
294
250
|
static readonly dependsOn = options && "dependsOn" in options ? options.dependsOn : undefined
|
|
295
|
-
static readonly Default = Layer.scoped(this, opts.effect as any).pipe(
|
|
296
|
-
Layer.provide([Layer.empty, ...opts.dependencies ?? []])
|
|
297
|
-
)
|
|
298
251
|
static override [Unify.typeSymbol]?: unknown
|
|
299
252
|
static override [Unify.unifySymbol]?: TagUnify<typeof this>
|
|
300
253
|
static override [Unify.ignoreSymbol]?: TagUnifyIgnore
|
|
@@ -0,0 +1,70 @@
|
|
|
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 { type Effect, Layer, type NonEmptyReadonlyArray, Unify } from "effect-app"
|
|
5
|
+
import { type TagUnify, type TagUnifyIgnore } from "effect/Context"
|
|
6
|
+
import { type Service } from "effect/Effect"
|
|
7
|
+
import { type RpcMiddleware, type RpcMiddlewareDynamicNormal, type RpcMiddlewareDynamicWrap, type RpcMiddlewareWrap, type RpcOptionsDynamic, type RpcOptionsOriginal, Tag, type TagClass } from "./RpcMiddleware.js"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated - RPC groups are defined centrally and re-used between server and client,
|
|
11
|
+
* so layer implementation details should not be mixed.
|
|
12
|
+
*/
|
|
13
|
+
export const TagService = <Self>() =>
|
|
14
|
+
<
|
|
15
|
+
const Name extends string,
|
|
16
|
+
const Options extends RpcOptionsOriginal | RpcOptionsDynamic<any, any>
|
|
17
|
+
>(
|
|
18
|
+
id: Name,
|
|
19
|
+
options?: Options | undefined
|
|
20
|
+
) =>
|
|
21
|
+
<
|
|
22
|
+
LayerOpts extends {
|
|
23
|
+
effect: Effect.Effect<
|
|
24
|
+
Options extends RpcOptionsDynamic<any, any> ? TagClass.Wrap<Options> extends true ? RpcMiddlewareDynamicWrap<
|
|
25
|
+
TagClass.FailureService<Options>,
|
|
26
|
+
TagClass.Requires<Options>,
|
|
27
|
+
{ [K in Options["dynamic"]["key"]]?: Options["dynamic"]["settings"]["contextActivation"] }
|
|
28
|
+
>
|
|
29
|
+
: RpcMiddlewareDynamicNormal<
|
|
30
|
+
TagClass.Service<Options>,
|
|
31
|
+
TagClass.FailureService<Options>,
|
|
32
|
+
TagClass.Requires<Options>,
|
|
33
|
+
{ [K in Options["dynamic"]["key"]]?: Options["dynamic"]["settings"]["contextActivation"] }
|
|
34
|
+
>
|
|
35
|
+
: TagClass.Wrap<Options> extends true ? RpcMiddlewareWrap<
|
|
36
|
+
TagClass.Provides<Options>,
|
|
37
|
+
TagClass.Failure<Options>,
|
|
38
|
+
TagClass.Requires<Options>
|
|
39
|
+
>
|
|
40
|
+
: RpcMiddleware<
|
|
41
|
+
TagClass.Service<Options>,
|
|
42
|
+
TagClass.FailureService<Options>,
|
|
43
|
+
TagClass.Requires<Options>
|
|
44
|
+
>,
|
|
45
|
+
any,
|
|
46
|
+
any
|
|
47
|
+
>
|
|
48
|
+
dependencies?: NonEmptyReadonlyArray<Layer.Layer.Any>
|
|
49
|
+
}
|
|
50
|
+
>(opts: LayerOpts): TagClass<Self, Name, Options> & {
|
|
51
|
+
Default: Layer.Layer<
|
|
52
|
+
Self,
|
|
53
|
+
| (LayerOpts extends { effect: Effect<infer _A, infer _E, infer _R> } ? _E
|
|
54
|
+
: never)
|
|
55
|
+
| Service.MakeDepsE<LayerOpts>,
|
|
56
|
+
| Exclude<
|
|
57
|
+
LayerOpts extends { effect: Effect<infer _A, infer _E, infer _R> } ? _R : never,
|
|
58
|
+
Service.MakeDepsOut<LayerOpts>
|
|
59
|
+
>
|
|
60
|
+
| Service.MakeDepsIn<LayerOpts>
|
|
61
|
+
>
|
|
62
|
+
} =>
|
|
63
|
+
class extends Tag<Self>()(id, options as any) {
|
|
64
|
+
static readonly Default = Layer.scoped(this, opts.effect as any).pipe(
|
|
65
|
+
Layer.provide([Layer.empty, ...opts.dependencies ?? []])
|
|
66
|
+
)
|
|
67
|
+
static override [Unify.typeSymbol]?: unknown
|
|
68
|
+
static override [Unify.unifySymbol]?: TagUnify<typeof this>
|
|
69
|
+
static override [Unify.ignoreSymbol]?: TagUnifyIgnore
|
|
70
|
+
} as any
|
|
@@ -1,15 +1,56 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { type RpcMiddleware } from "@effect/rpc"
|
|
3
3
|
import { Context, Effect, type Layer, type NonEmptyReadonlyArray, Option, type S, type Scope } from "effect-app"
|
|
4
|
-
import { type ContextTagArray } from "effect-app/client"
|
|
4
|
+
import { type ContextTagArray, type GetContextConfig, type RPCContextMap } from "effect-app/client"
|
|
5
|
+
import { type Tag } from "effect/Context"
|
|
6
|
+
import { type Simplify } from "effect/Types"
|
|
5
7
|
import { InfraLogger } from "../../../logger.js"
|
|
8
|
+
import { type MakeTags, type MiddlewareMakerId } from "./middleware-api.js"
|
|
6
9
|
import { type RpcMiddlewareWrap, type TagClassAny } from "./RpcMiddleware.js"
|
|
7
10
|
|
|
8
11
|
// Effect rpc middleware does not support changing payload or headers, but we do..
|
|
9
12
|
|
|
10
|
-
export
|
|
13
|
+
export interface MiddlewareMaker<
|
|
14
|
+
RequestContextMap extends Record<string, RPCContextMap.Any>,
|
|
15
|
+
MiddlewareProviders extends ReadonlyArray<MiddlewareMaker.Any>
|
|
16
|
+
> extends
|
|
17
|
+
RpcMiddleware.TagClass<
|
|
18
|
+
MiddlewareMakerId,
|
|
19
|
+
"MiddlewareMaker",
|
|
20
|
+
Simplify<
|
|
21
|
+
& { readonly wrap: true }
|
|
22
|
+
& (Exclude<
|
|
23
|
+
MiddlewareMaker.ManyRequired<MiddlewareProviders>,
|
|
24
|
+
MiddlewareMaker.ManyProvided<MiddlewareProviders>
|
|
25
|
+
> extends never ? {} : {
|
|
26
|
+
readonly requires: MakeTags<
|
|
27
|
+
Exclude<
|
|
28
|
+
MiddlewareMaker.ManyRequired<MiddlewareProviders>,
|
|
29
|
+
MiddlewareMaker.ManyProvided<MiddlewareProviders>
|
|
30
|
+
>
|
|
31
|
+
>
|
|
32
|
+
})
|
|
33
|
+
& (MiddlewareMaker.ManyErrors<MiddlewareProviders> extends never ? {}
|
|
34
|
+
: {
|
|
35
|
+
readonly failure: S.Schema<MiddlewareMaker.ManyErrors<MiddlewareProviders>>
|
|
36
|
+
})
|
|
37
|
+
& (MiddlewareMaker.ManyProvided<MiddlewareProviders> extends never ? {}
|
|
38
|
+
: { readonly provides: MakeTags<MiddlewareMaker.ManyProvided<MiddlewareProviders>> })
|
|
39
|
+
>
|
|
40
|
+
>
|
|
41
|
+
{
|
|
42
|
+
readonly layer: Layer.Layer<MiddlewareMakerId, never, Tag.Identifier<MiddlewareProviders[number]>>
|
|
43
|
+
readonly requestContext: RequestContextTag<RequestContextMap>
|
|
44
|
+
readonly requestContextMap: RequestContextMap
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface RequestContextTag<RequestContextMap extends Record<string, RPCContextMap.Any>>
|
|
48
|
+
extends Context.Tag<"RequestContextConfig", GetContextConfig<RequestContextMap>>
|
|
49
|
+
{}
|
|
11
50
|
|
|
12
51
|
export namespace MiddlewareMaker {
|
|
52
|
+
export type Any = TagClassAny
|
|
53
|
+
|
|
13
54
|
export type ApplyServices<A extends TagClassAny, R> = Exclude<R, Provided<A>> | Required<A>
|
|
14
55
|
|
|
15
56
|
export type ApplyManyServices<A extends NonEmptyReadonlyArray<TagClassAny>, R> =
|
|
@@ -44,120 +85,114 @@ export namespace MiddlewareMaker {
|
|
|
44
85
|
}
|
|
45
86
|
|
|
46
87
|
export const middlewareMaker = <
|
|
47
|
-
MiddlewareProviders extends ReadonlyArray<MiddlewareMaker>
|
|
48
|
-
>(middlewares: MiddlewareProviders):
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
MiddlewareMaker.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
> extends never ? never
|
|
58
|
-
: Exclude<MiddlewareMaker.ManyRequired<MiddlewareProviders>, MiddlewareMaker.ManyProvided<MiddlewareProviders>>
|
|
59
|
-
>
|
|
88
|
+
MiddlewareProviders extends ReadonlyArray<MiddlewareMaker.Any>
|
|
89
|
+
>(middlewares: MiddlewareProviders): Effect.Effect<
|
|
90
|
+
RpcMiddlewareWrap<
|
|
91
|
+
MiddlewareMaker.ManyProvided<MiddlewareProviders>,
|
|
92
|
+
MiddlewareMaker.ManyErrors<MiddlewareProviders>,
|
|
93
|
+
Exclude<
|
|
94
|
+
MiddlewareMaker.ManyRequired<MiddlewareProviders>,
|
|
95
|
+
MiddlewareMaker.ManyProvided<MiddlewareProviders>
|
|
96
|
+
> extends never ? never
|
|
97
|
+
: Exclude<MiddlewareMaker.ManyRequired<MiddlewareProviders>, MiddlewareMaker.ManyProvided<MiddlewareProviders>>
|
|
60
98
|
>
|
|
61
|
-
|
|
99
|
+
> => {
|
|
62
100
|
// we want to run them in reverse order because latter middlewares will provide context to former ones
|
|
63
101
|
middlewares = middlewares.toReversed() as any
|
|
64
102
|
|
|
65
|
-
return {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
103
|
+
return Effect.gen(function*() {
|
|
104
|
+
const context = yield* Effect.context()
|
|
105
|
+
|
|
106
|
+
// returns a Effect/RpcMiddlewareWrap with Scope in requirements
|
|
107
|
+
return (
|
|
108
|
+
options: Parameters<
|
|
109
|
+
RpcMiddlewareWrap<
|
|
110
|
+
MiddlewareMaker.ManyProvided<MiddlewareProviders>,
|
|
111
|
+
never,
|
|
112
|
+
Scope.Scope
|
|
113
|
+
>
|
|
114
|
+
>[0]
|
|
115
|
+
) => {
|
|
116
|
+
// we start with the actual handler
|
|
117
|
+
let handler = options.next
|
|
118
|
+
|
|
119
|
+
// inspired from Effect/RpcMiddleware
|
|
120
|
+
for (const tag of middlewares) {
|
|
121
|
+
if (tag.wrap) {
|
|
122
|
+
// use the tag to get the middleware from context
|
|
123
|
+
const middleware = Context.unsafeGet(context, tag)
|
|
124
|
+
|
|
125
|
+
// wrap the current handler, allowing the middleware to run before and after it
|
|
126
|
+
handler = InfraLogger.logDebug("Applying middleware wrap " + tag.key).pipe(
|
|
127
|
+
Effect.zipRight(middleware({ ...options, next: handler }))
|
|
128
|
+
) as any
|
|
129
|
+
} else if (tag.optional) {
|
|
130
|
+
// use the tag to get the middleware from context
|
|
131
|
+
// if the middleware fails to run, we will ignore the error
|
|
132
|
+
const middleware = Context.unsafeGet(context, tag) as RpcMiddleware.RpcMiddleware<any, any>
|
|
133
|
+
|
|
134
|
+
const previous = handler
|
|
135
|
+
|
|
136
|
+
// set the previous handler to run after the middleware
|
|
137
|
+
// if the middleware is not present, we just return the previous handler
|
|
138
|
+
// otherwise the middleware will provide some context to be provided to the previous handler
|
|
139
|
+
handler = InfraLogger.logDebug("Applying middleware optional " + tag.key).pipe(
|
|
140
|
+
Effect.zipRight(Effect.matchEffect(middleware(options), {
|
|
141
|
+
onFailure: () => previous,
|
|
142
|
+
onSuccess: tag.provides !== undefined
|
|
143
|
+
? (value) =>
|
|
144
|
+
Context.isContext(value)
|
|
145
|
+
? Effect.provide(previous, value)
|
|
146
|
+
: Effect.provideService(previous, tag.provides as any, value)
|
|
147
|
+
: (_) => previous
|
|
148
|
+
}))
|
|
149
|
+
)
|
|
150
|
+
} else if (tag.dynamic) {
|
|
151
|
+
// use the tag to get the middleware from context
|
|
152
|
+
const middleware = Context.unsafeGet(context, tag) as RpcMiddleware.RpcMiddleware<any, any>
|
|
153
|
+
|
|
154
|
+
const previous = handler
|
|
155
|
+
|
|
156
|
+
// set the previous handler to run after the middleware
|
|
157
|
+
// we do expect the middleware to be present, but the context might not be available
|
|
158
|
+
// if it is, we provide it to the previous handler
|
|
159
|
+
handler = InfraLogger.logDebug("Applying middleware dynamic " + tag.key, tag.dynamic).pipe(
|
|
160
|
+
Effect.zipRight(
|
|
161
|
+
middleware(options).pipe(
|
|
162
|
+
Effect.flatMap((o) =>
|
|
163
|
+
Option.isSome(o)
|
|
164
|
+
? Context.isContext(o.value)
|
|
165
|
+
? Effect.provide(previous, o.value)
|
|
166
|
+
: Effect.provideService(previous, tag.dynamic!.settings.service!, /* TODO */ o.value)
|
|
167
|
+
: previous
|
|
168
|
+
)
|
|
169
|
+
)
|
|
170
|
+
)
|
|
171
|
+
) as any
|
|
172
|
+
} else {
|
|
173
|
+
// use the tag to get the middleware from context
|
|
174
|
+
const middleware = Context.unsafeGet(context, tag) as RpcMiddleware.RpcMiddleware<any, any>
|
|
175
|
+
|
|
176
|
+
const previous = handler
|
|
177
|
+
|
|
178
|
+
// set the previous handler to run after the middleware
|
|
179
|
+
// we do expect both the middleware and the context to be present
|
|
180
|
+
handler = InfraLogger.logDebug("Applying middleware " + tag.key).pipe(
|
|
181
|
+
Effect.zipRight(
|
|
182
|
+
tag.provides !== undefined
|
|
183
|
+
? middleware(options).pipe(
|
|
184
|
+
Effect.flatMap((value) =>
|
|
108
185
|
Context.isContext(value)
|
|
109
186
|
? Effect.provide(previous, value)
|
|
110
187
|
: Effect.provideService(previous, tag.provides as any, value)
|
|
111
|
-
: (_) => previous
|
|
112
|
-
}))
|
|
113
|
-
)
|
|
114
|
-
} else if (tag.dynamic) {
|
|
115
|
-
// use the tag to get the middleware from context
|
|
116
|
-
const middleware = Context.unsafeGet(context, tag) as RpcMiddleware.RpcMiddleware<any, any>
|
|
117
|
-
|
|
118
|
-
const previous = handler
|
|
119
|
-
|
|
120
|
-
// set the previous handler to run after the middleware
|
|
121
|
-
// we do expect the middleware to be present, but the context might not be available
|
|
122
|
-
// if it is, we provide it to the previous handler
|
|
123
|
-
handler = InfraLogger.logDebug("Applying middleware dynamic " + tag.key, tag.dynamic).pipe(
|
|
124
|
-
Effect.zipRight(
|
|
125
|
-
middleware(options).pipe(
|
|
126
|
-
Effect.flatMap((o) =>
|
|
127
|
-
Option.isSome(o)
|
|
128
|
-
? Context.isContext(o.value)
|
|
129
|
-
? Effect.provide(previous, o.value)
|
|
130
|
-
: Effect.provideService(previous, tag.dynamic!.settings.service!, /* TODO */ o.value)
|
|
131
|
-
: previous
|
|
132
188
|
)
|
|
133
189
|
)
|
|
134
|
-
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
// use the tag to get the middleware from context
|
|
138
|
-
const middleware = Context.unsafeGet(context, tag) as RpcMiddleware.RpcMiddleware<any, any>
|
|
139
|
-
|
|
140
|
-
const previous = handler
|
|
141
|
-
|
|
142
|
-
// set the previous handler to run after the middleware
|
|
143
|
-
// we do expect both the middleware and the context to be present
|
|
144
|
-
handler = InfraLogger.logDebug("Applying middleware " + tag.key).pipe(
|
|
145
|
-
Effect.zipRight(
|
|
146
|
-
tag.provides !== undefined
|
|
147
|
-
? middleware(options).pipe(
|
|
148
|
-
Effect.flatMap((value) =>
|
|
149
|
-
Context.isContext(value)
|
|
150
|
-
? Effect.provide(previous, value)
|
|
151
|
-
: Effect.provideService(previous, tag.provides as any, value)
|
|
152
|
-
)
|
|
153
|
-
)
|
|
154
|
-
: Effect.zipRight(middleware(options), previous)
|
|
155
|
-
)
|
|
156
|
-
) as any
|
|
157
|
-
}
|
|
190
|
+
: Effect.zipRight(middleware(options), previous)
|
|
191
|
+
)
|
|
192
|
+
) as any
|
|
158
193
|
}
|
|
159
|
-
return handler
|
|
160
194
|
}
|
|
161
|
-
|
|
162
|
-
|
|
195
|
+
return handler
|
|
196
|
+
}
|
|
197
|
+
}) as any
|
|
163
198
|
}
|