func (c *Conn) handleDisembargoMessage(msg rpccapnp.Message) error { d, err := msg.Disembargo() if err != nil { return err } dtarget, err := d.Target() if err != nil { return err } switch d.Context().Which() { case rpccapnp.Disembargo_context_Which_senderLoopback: id := embargoID(d.Context().SenderLoopback()) if dtarget.Which() != rpccapnp.MessageTarget_Which_promisedAnswer { return errDisembargoNonImport } dpa, err := dtarget.PromisedAnswer() if err != nil { return err } aid := answerID(dpa.QuestionId()) a := c.answers[aid] if a == nil { return errDisembargoMissingAnswer } dtrans, err := dpa.Transform() if err != nil { return err } transform := promisedAnswerOpsToTransform(dtrans) queued, err := a.queueDisembargo(transform, id, dtarget) if err != nil { return err } if !queued { // There's nothing to embargo; everything's been delivered. resp := newDisembargoMessage(nil, rpccapnp.Disembargo_context_Which_receiverLoopback, id) rd, _ := resp.Disembargo() if err := rd.SetTarget(dtarget); err != nil { return err } c.sendMessage(resp) } case rpccapnp.Disembargo_context_Which_receiverLoopback: id := embargoID(d.Context().ReceiverLoopback()) c.disembargo(id) default: um := newUnimplementedMessage(nil, msg) c.sendMessage(um) } return nil }