| 652 | ...options, |
| 653 | supportsAck, |
| 654 | onFromClient({ message }) { |
| 655 | switch (message._tag) { |
| 656 | case "Request": { |
| 657 | const rpc = group.requests.get(message.tag)! as any as Rpc.AnyWithProps |
| 658 | const schemas = RpcSchema.getStreamSchemas(rpc.successSchema.ast) |
| 659 | const collector = supportsTransferables ? Transferable.unsafeMakeCollector() : undefined |
| 660 | |
| 661 | const fiber = Option.getOrThrow(Fiber.getCurrentFiber()) |
| 662 | |
| 663 | const entry: ClientEntry = { |
| 664 | rpc, |
| 665 | context: collector |
| 666 | ? Context.add(fiber.currentContext, Transferable.Collector, collector) |
| 667 | : fiber.currentContext, |
| 668 | decodeChunk: Option.isSome(schemas) |
| 669 | ? Schema.decodeUnknown(Schema.NonEmptyArray(schemas.value.success)) |
| 670 | : undefined |
| 671 | } |
| 672 | entries.set(message.id, entry) |
| 673 | |
| 674 | return Schema.encode(rpc.payloadSchema)(message.payload).pipe( |
| 675 | Effect.locally(FiberRef.currentContext, entry.context), |
| 676 | Effect.orDie, |
| 677 | Effect.flatMap((payload) => |
| 678 | send({ |
| 679 | ...message, |
| 680 | id: String(message.id), |
| 681 | payload, |
| 682 | headers: Object.entries(message.headers) |
| 683 | }, collector && collector.unsafeClear()) |
| 684 | ) |
| 685 | ) as Effect.Effect<void, RpcClientError> |
| 686 | } |
| 687 | case "Ack": { |
| 688 | const entry = entries.get(message.requestId) |
| 689 | if (!entry) return Effect.void |
| 690 | return send({ |
| 691 | _tag: "Ack", |
| 692 | requestId: String(message.requestId) |
| 693 | }) as Effect.Effect<void, RpcClientError> |
| 694 | } |
| 695 | case "Interrupt": { |
| 696 | const entry = entries.get(message.requestId) |
| 697 | if (!entry) return Effect.void |
| 698 | entries.delete(message.requestId) |
| 699 | return send({ |
| 700 | _tag: "Interrupt", |
| 701 | requestId: String(message.requestId) |
| 702 | }) as Effect.Effect<void, RpcClientError> |
| 703 | } |
| 704 | case "Eof": { |
| 705 | return Effect.void |
| 706 | } |
| 707 | } |
| 708 | } |
| 709 | }) |
| 710 | |
| 711 | yield* run((message) => { |