| 542 | }) |
| 543 | |
| 544 | const write = (message: FromServer<Rpcs>): Effect.Effect<void> => { |
| 545 | switch (message._tag) { |
| 546 | case "Chunk": { |
| 547 | const requestId = message.requestId |
| 548 | const entry = entries.get(requestId) |
| 549 | if (!entry || entry._tag !== "Mailbox") return Effect.void |
| 550 | return entry.mailbox.offerAll(message.values).pipe( |
| 551 | supportsAck |
| 552 | ? Effect.zipRight( |
| 553 | options.onFromClient({ |
| 554 | message: { _tag: "Ack", requestId: message.requestId }, |
| 555 | context: entry.context, |
| 556 | discard: false |
| 557 | }) |
| 558 | ) |
| 559 | : identity, |
| 560 | Effect.catchAllCause((cause) => entry.mailbox.done(Exit.failCause(cause))) |
| 561 | ) |
| 562 | } |
| 563 | case "Exit": { |
| 564 | const requestId = message.requestId |
| 565 | const entry = entries.get(requestId) |
| 566 | if (!entry) return Effect.void |
| 567 | entries.delete(requestId) |
| 568 | if (entry._tag === "Effect") { |
| 569 | entry.resume(message.exit) |
| 570 | return Effect.void |
| 571 | } |
| 572 | return entry.mailbox.done(Exit.asVoid(message.exit)) |
| 573 | } |
| 574 | case "Defect": { |
| 575 | return clearEntries(Exit.die(message.defect)) |
| 576 | } |
| 577 | case "ClientEnd": { |
| 578 | return Effect.void |
| 579 | } |
| 580 | } |
| 581 | } |
| 582 | |
| 583 | let client: any |
| 584 | if (options.flatten) { |