@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.
Files changed (63) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/Emailer/service.d.ts +1 -1
  3. package/dist/MainFiberSet.d.ts +1 -1
  4. package/dist/Operations.d.ts +1 -1
  5. package/dist/RequestFiberSet.d.ts +1 -1
  6. package/dist/Store/service.d.ts +2 -2
  7. package/dist/adapters/SQL/Model.d.ts +6 -6
  8. package/dist/adapters/ServiceBus.d.ts +2 -2
  9. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  10. package/dist/adapters/ServiceBus.js +13 -10
  11. package/dist/adapters/memQueue.d.ts +1 -1
  12. package/dist/api/ContextProvider.d.ts +3 -3
  13. package/dist/api/ContextProvider.d.ts.map +1 -1
  14. package/dist/api/ContextProvider.js +1 -1
  15. package/dist/api/routing/middleware/RouterMiddleware.d.ts +6 -6
  16. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  17. package/dist/api/routing/middleware/RpcMiddleware.d.ts +4 -15
  18. package/dist/api/routing/middleware/RpcMiddleware.d.ts.map +1 -1
  19. package/dist/api/routing/middleware/RpcMiddleware.js +3 -4
  20. package/dist/api/routing/middleware/RpcMiddlewareX.d.ts +18 -0
  21. package/dist/api/routing/middleware/RpcMiddlewareX.d.ts.map +1 -0
  22. package/dist/api/routing/middleware/RpcMiddlewareX.js +16 -0
  23. package/dist/api/routing/middleware/generic-middleware.d.ts +22 -8
  24. package/dist/api/routing/middleware/generic-middleware.d.ts.map +1 -1
  25. package/dist/api/routing/middleware/generic-middleware.js +59 -62
  26. package/dist/api/routing/middleware/middleware-api.d.ts +51 -32
  27. package/dist/api/routing/middleware/middleware-api.d.ts.map +1 -1
  28. package/dist/api/routing/middleware/middleware-api.js +54 -24
  29. package/dist/api/routing/middleware/middleware-native.d.ts +23 -0
  30. package/dist/api/routing/middleware/middleware-native.d.ts.map +1 -0
  31. package/dist/api/routing/middleware/middleware-native.js +19 -0
  32. package/dist/api/routing/middleware/middleware.d.ts +7 -27
  33. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  34. package/dist/api/routing/middleware/middleware.js +73 -88
  35. package/dist/api/routing/middleware.d.ts +1 -0
  36. package/dist/api/routing/middleware.d.ts.map +1 -1
  37. package/dist/api/routing/middleware.js +2 -1
  38. package/dist/api/routing.d.ts +1 -4
  39. package/dist/api/routing.d.ts.map +1 -1
  40. package/dist/api/routing.js +8 -8
  41. package/package.json +11 -3
  42. package/src/adapters/ServiceBus.ts +7 -5
  43. package/src/api/ContextProvider.ts +9 -7
  44. package/src/api/routing/middleware/RouterMiddleware.ts +9 -8
  45. package/src/api/routing/middleware/RpcMiddleware.ts +4 -51
  46. package/src/api/routing/middleware/RpcMiddlewareX.ts +70 -0
  47. package/src/api/routing/middleware/generic-middleware.ts +142 -107
  48. package/src/api/routing/middleware/middleware-api.ts +239 -61
  49. package/src/api/routing/middleware/middleware-native.ts +23 -0
  50. package/src/api/routing/middleware/middleware.ts +37 -40
  51. package/src/api/routing/middleware.ts +1 -0
  52. package/src/api/routing.ts +7 -13
  53. package/test/contextProvider.test.ts +4 -4
  54. package/test/controller.test.ts +41 -16
  55. package/test/dist/controller.test.d.ts.map +1 -1
  56. package/test/dist/fixtures.d.ts +48 -32
  57. package/test/dist/fixtures.d.ts.map +1 -1
  58. package/test/dist/fixtures.js +76 -47
  59. package/test/dist/requires.test.d.ts.map +1 -1
  60. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -0
  61. package/test/fixtures.ts +71 -17
  62. package/test/requires.test.ts +15 -50
  63. 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, Layer, type NonEmptyReadonlyArray, type Option, type S, type Schema, type Scope, Unify } from "effect-app"
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 type MiddlewareMaker = TagClassAny & { Default: Layer.Layer.Any } // todo; and Layer..
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
- dependencies: { [K in keyof MiddlewareProviders]: MiddlewareProviders[K]["Default"] }
50
- effect: Effect.Effect<
51
- RpcMiddlewareWrap<
52
- MiddlewareMaker.ManyProvided<MiddlewareProviders>,
53
- MiddlewareMaker.ManyErrors<MiddlewareProviders>,
54
- Exclude<
55
- MiddlewareMaker.ManyRequired<MiddlewareProviders>,
56
- MiddlewareMaker.ManyProvided<MiddlewareProviders>
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
- dependencies: middlewares.map((_) => _.Default),
67
- effect: Effect.gen(function*() {
68
- const context = yield* Effect.context()
69
-
70
- // returns a Effect/RpcMiddlewareWrap with Scope in requirements
71
- return (
72
- options: Parameters<
73
- RpcMiddlewareWrap<
74
- MiddlewareMaker.ManyProvided<MiddlewareProviders>,
75
- never,
76
- Scope.Scope
77
- >
78
- >[0]
79
- ) => {
80
- // we start with the actual handler
81
- let handler = options.next
82
-
83
- // inspired from Effect/RpcMiddleware
84
- for (const tag of middlewares) {
85
- if (tag.wrap) {
86
- // use the tag to get the middleware from context
87
- const middleware = Context.unsafeGet(context, tag)
88
-
89
- // wrap the current handler, allowing the middleware to run before and after it
90
- handler = InfraLogger.logDebug("Applying middleware wrap " + tag.key).pipe(
91
- Effect.zipRight(middleware({ ...options, next: handler }))
92
- ) as any
93
- } else if (tag.optional) {
94
- // use the tag to get the middleware from context
95
- // if the middleware fails to run, we will ignore the error
96
- const middleware = Context.unsafeGet(context, tag) as RpcMiddleware.RpcMiddleware<any, any>
97
-
98
- const previous = handler
99
-
100
- // set the previous handler to run after the middleware
101
- // if the middleware is not present, we just return the previous handler
102
- // otherwise the middleware will provide some context to be provided to the previous handler
103
- handler = InfraLogger.logDebug("Applying middleware optional " + tag.key).pipe(
104
- Effect.zipRight(Effect.matchEffect(middleware(options), {
105
- onFailure: () => previous,
106
- onSuccess: tag.provides !== undefined
107
- ? (value) =>
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
- ) as any
136
- } else {
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
- } as any
195
+ return handler
196
+ }
197
+ }) as any
163
198
  }