( entity: Entity<Type, Rpcs>, entityRpcs: Map<string, Rpcs> )
| 576 | ) |
| 577 | |
| 578 | const makeMessageDecode = <Type extends string, Rpcs extends Rpc.Any>( |
| 579 | entity: Entity<Type, Rpcs>, |
| 580 | entityRpcs: Map<string, Rpcs> |
| 581 | ) => { |
| 582 | const decodeRequest = ( |
| 583 | message: Message.IncomingRequest<Rpcs>, |
| 584 | rpc: Rpc.AnyWithProps |
| 585 | ) => { |
| 586 | const payload = Schema.decode(rpc.payloadSchema)(message.envelope.payload) |
| 587 | const lastSentReply = Option.isSome(message.lastSentReply) |
| 588 | ? Effect.asSome(Schema.decode(Reply.Reply(rpc as any))(message.lastSentReply.value)) |
| 589 | : Effect.succeedNone |
| 590 | return Effect.flatMap(payload, (payload) => |
| 591 | Effect.map(lastSentReply, (lastSentReply) => ({ |
| 592 | _tag: "IncomingRequest" as const, |
| 593 | envelope: { |
| 594 | ...message.envelope, |
| 595 | payload |
| 596 | } as Envelope.Request.Any, |
| 597 | lastSentReply |
| 598 | }))) |
| 599 | } |
| 600 | |
| 601 | return (message: Message.Incoming<Rpcs>): Effect.Effect< |
| 602 | { |
| 603 | readonly _tag: "IncomingRequest" |
| 604 | readonly envelope: Envelope.Request.Any |
| 605 | readonly lastSentReply: Option.Option<Reply.Reply<Rpcs>> |
| 606 | } | { |
| 607 | readonly _tag: "IncomingEnvelope" |
| 608 | readonly envelope: Envelope.AckChunk | Envelope.Interrupt |
| 609 | }, |
| 610 | ParseResult.ParseError, |
| 611 | Rpc.Context<Rpcs> |
| 612 | > => { |
| 613 | if (message._tag === "IncomingEnvelope") { |
| 614 | return Effect.succeed(message) |
| 615 | } |
| 616 | const rpc = entityRpcs.get(message.envelope.tag) as any as Rpc.AnyWithProps |
| 617 | if (!rpc) { |
| 618 | return Effect.fail( |
| 619 | new ParseResult.ParseError({ |
| 620 | issue: new ParseResult.Unexpected( |
| 621 | message, |
| 622 | `Unknown tag ${message.envelope.tag} for entity type ${entity.type}` |
| 623 | ) |
| 624 | }) |
| 625 | ) |
| 626 | } |
| 627 | return decodeRequest(message, rpc) as Effect.Effect< |
| 628 | { |
| 629 | readonly _tag: "IncomingRequest" |
| 630 | readonly envelope: Envelope.Request.Any |
| 631 | readonly lastSentReply: Option.Option<Reply.Reply<Rpcs>> |
| 632 | }, |
| 633 | ParseResult.ParseError, |
| 634 | Rpc.Context<Rpcs> |
| 635 | > |
no test coverage detected