| 503 | }) |
| 504 | |
| 505 | const getRpcClientMiddleware = ( |
| 506 | rpc: Rpc.AnyWithProps |
| 507 | ): ( |
| 508 | send: (request: Request<Rpcs>) => Effect.Effect<any, E>, |
| 509 | request: Request<Rpcs> |
| 510 | ) => Effect.Effect<any, E> => { |
| 511 | const middlewares: Array<RpcMiddleware.RpcMiddlewareClient<any, any, any>> = [] |
| 512 | for (const tag of rpc.middlewares.values()) { |
| 513 | const middleware = Context.getOrUndefinedUnsafe(services, `${tag.key}/Client`) as any |
| 514 | if (!middleware) continue |
| 515 | middlewares.push(middleware) |
| 516 | } |
| 517 | |
| 518 | if (middlewares.length === 0) { |
| 519 | return (send, request) => send(request) |
| 520 | } |
| 521 | |
| 522 | return function loop( |
| 523 | send: (request: Request<Rpcs>) => Effect.Effect<any, E>, |
| 524 | request: Request<Rpcs>, |
| 525 | index = middlewares.length - 1 |
| 526 | ): Effect.Effect<any, E> { |
| 527 | if (index === -1) { |
| 528 | return send(request) |
| 529 | } |
| 530 | return middlewares[index]({ |
| 531 | rpc, |
| 532 | request, |
| 533 | next(request) { |
| 534 | return loop(send, request, index - 1) as any |
| 535 | } |
| 536 | }) as Effect.Effect<any, E> |
| 537 | } |
| 538 | } |
| 539 | |
| 540 | const sendInterrupt = ( |
| 541 | requestId: RequestId, |