( rpc: Rpc.AnyWithProps, context: Context.Context<never>, clientId: number, payload: A, headers: Headers.Headers, handler: Effect.Effect<A, E, R> )
| 421 | }) |
| 422 | |
| 423 | const applyMiddleware = <A, E, R>( |
| 424 | rpc: Rpc.AnyWithProps, |
| 425 | context: Context.Context<never>, |
| 426 | clientId: number, |
| 427 | payload: A, |
| 428 | headers: Headers.Headers, |
| 429 | handler: Effect.Effect<A, E, R> |
| 430 | ) => { |
| 431 | if (rpc.middlewares.size === 0) { |
| 432 | return handler |
| 433 | } |
| 434 | |
| 435 | const options = { |
| 436 | rpc, |
| 437 | payload, |
| 438 | headers, |
| 439 | clientId |
| 440 | } |
| 441 | |
| 442 | for (const tag of rpc.middlewares) { |
| 443 | if (tag.wrap) { |
| 444 | const middleware = Context.unsafeGet(context, tag) |
| 445 | handler = middleware({ ...options, next: handler as any }) |
| 446 | } else if (tag.optional) { |
| 447 | const middleware = Context.unsafeGet(context, tag) as RpcMiddleware<any, any> |
| 448 | const previous = handler |
| 449 | handler = Effect.matchEffect(middleware(options), { |
| 450 | onFailure: () => previous, |
| 451 | onSuccess: tag.provides !== undefined |
| 452 | ? (value) => Effect.provideService(previous, tag.provides as any, value) |
| 453 | : (_) => previous |
| 454 | }) |
| 455 | } else { |
| 456 | const middleware = Context.unsafeGet(context, tag) as RpcMiddleware<any, any> |
| 457 | handler = tag.provides !== undefined |
| 458 | ? Effect.provideServiceEffect(handler, tag.provides as any, middleware(options)) |
| 459 | : Effect.zipRight(middleware(options), handler) |
| 460 | } |
| 461 | } |
| 462 | |
| 463 | return handler |
| 464 | } |
| 465 | |
| 466 | /** |
| 467 | * @since 1.0.0 |
no test coverage detected