in go/pkg/electron/handler.go [57:139]
func (h *handler) HandleMessagingEvent(t proton.MessagingEvent, e proton.Event) {
switch t {
case proton.MMessage:
if r, ok := h.links[e.Link()].(*receiver); ok {
r.message(e.Delivery())
} else {
h.linkError(e.Link(), "no receiver")
}
case proton.MSettled:
if sm, ok := h.sent[e.Delivery()]; ok {
d := e.Delivery().Remote()
sm.ack <- Outcome{sentStatus(d.Type()), d.Condition().Error(), sm.v}
delete(h.sent, e.Delivery())
}
case proton.MSendable:
if s, ok := h.links[e.Link()].(*sender); ok {
s.trySend()
} else {
h.linkError(e.Link(), "no sender")
}
case proton.MConnectionOpening:
h.connection.heartbeat = e.Transport().RemoteIdleTimeout()
if e.Connection().State().LocalUninit() { // Remotely opened
h.incoming(newIncomingConnection(h.connection))
}
h.connection.wakeSync()
case proton.MSessionOpening:
if e.Session().State().LocalUninit() { // Remotely opened
h.incoming(newIncomingSession(h, e.Session()))
}
h.sessions[e.Session()].wakeSync()
case proton.MSessionClosed:
h.sessionClosed(e.Session(), proton.EndpointError(e.Session()))
case proton.MLinkOpening:
l := e.Link()
if ss := h.sessions[l.Session()]; ss != nil {
if l.State().LocalUninit() { // Remotely opened.
if l.IsReceiver() {
h.incoming(newIncomingReceiver(ss, l))
} else {
h.incoming(newIncomingSender(ss, l))
}
}
if ep, ok := h.links[l]; ok {
ep.(endpointInternal).wakeSync()
} else {
h.linkError(l, "no link")
}
} else {
h.linkError(l, "no session")
}
case proton.MLinkClosing:
e.Link().Close()
case proton.MLinkClosed:
h.linkClosed(e.Link(), proton.EndpointError(e.Link()))
case proton.MConnectionClosing:
h.connection.err.Set(e.Connection().RemoteCondition().Error())
case proton.MConnectionClosed:
h.shutdown(proton.EndpointError(e.Connection()))
case proton.MDisconnected:
var err error
if err = e.Connection().RemoteCondition().Error(); err == nil {
if err = e.Connection().Condition().Error(); err == nil {
if err = e.Transport().Condition().Error(); err == nil {
err = amqp.Errorf(amqp.IllegalState, "unexpected disconnect on %s", h.connection)
}
}
}
h.shutdown(err)
}
}