Send Path

QoS 0

Client -> Haka: publish call (QoS=0)
note right: publish packet enqueued.
Client <- Haka: publish return
Client -> Haka: write call
          Haka -> Socket: send publish
note right: publish packet transferred to socket write buffer and dequeued.
Client <- Haka: write return

QoS 1

Client -> Haka: publish call (QoS=1)
note right: publish packet enqueued.
Client <- Haka: publish return
== ... ==
Client -> Haka: write call
          Haka -> Socket: send publish
note right: publish packet transferred to socket write buffer.
Client <- Haka: write return
== ... ==
Client -> Haka: read call
          Haka <- Socket: recv puback
note right: publish packet dequeued.
Client <- Haka: read return

QoS 1 w/Disconnect

Client -> Haka: publish call (QoS=1)
note right: publish packet enqueued.
Client <- Haka: publish return
Client -> Haka: write call
          Haka -> Socket: send publish
note right: publish packet transferred to socket write buffer.
Client <- Haka: write return
== socket disconnect, reactor start ==
Client -> Haka: write call
          Haka -> Socket: send publish(dupe=True)
note right: publish packet transferred to socket write buffer.
Client <- Haka: write return
== ... ==
Client -> Haka: read call
          Haka <- Socket: recv puback
note right: publish packet dequeued.
Client <- Haka: read return

QoS 2

Client -> Haka: publish call (QoS=2)
note right: publish packet enqueued.
Client <- Haka: publish return
Client -> Haka: write call
          Haka -> Socket: send publish
note right: publish packet transferred to socket write buffer.
Client <- Haka: write return
== ... ==
Client -> Haka: read call
          Haka <- Socket: recv pubrec
Client <- Haka: on_pubrec call
Client -> Haka: on_pubrec return
note right: pubrel packet queued.
Client <- Haka: read return
== ... ==
Client -> Haka: write call
          Haka -> Socket: send pubrel
Client <- Haka: write return
== ... ==
Client -> Haka: read call
          Haka <- Socket: recv pubcomp
note right: publish packet dequeued.
Client <- Haka: on_pubcomp call
Client -> Haka: on_pubcomp return
Client <- Haka: read return

QoS 2 w/Publish Disconnect

Client -> Haka: publish call (QoS=2)
note right: publish packet enqueued.
Client <- Haka: publish return
Client -> Haka: write call
          Haka -> Socket: send publish
note right: publish packet transferred to socket write buffer.
Client <- Haka: write return
== socket disconnect, reactor start ==
Client -> Haka: write call
          Haka -> Socket: send publish(dupe=True)
note right: publish packet transferred to socket write buffer.
Client <- Haka: write return
== ... ==
Client -> Haka: read call
          Haka <- Socket: recv pubrec
Client <- Haka: on_pubrec call
Client -> Haka: on_pubrec return
note right: pubrel packet queued.
Client <- Haka: read return
== ... ==
Client -> Haka: write call
          Haka -> Socket: send pubrel
Client <- Haka: write return
== ... ==
Client -> Haka: read call
          Haka <- Socket: recv pubcomp
note right: publish packet dequeued.
Client <- Haka: on_pubcomp call
Client -> Haka: on_pubcomp return
Client <- Haka: read return

QoS 2 w/Pubrel Disconnect

Client -> Haka: publish call (QoS=2)
note right: publish packet enqueued.
Client <- Haka: publish return
Client -> Haka: write call
          Haka -> Socket: send publish
note right: publish packet transferred to socket write buffer.
Client <- Haka: write return
== ... ==
Client -> Haka: read call
          Haka <- Socket: recv pubrec
Client <- Haka: on_pubrec call
Client -> Haka: on_pubrec return
note right: pubrel packet queued.
Client <- Haka: read return
== ... ==
Client -> Haka: write call
          Haka -> Socket: send pubrel
Client <- Haka: write return
== socket disconnect, reactor start ==
Client -> Haka: write call
          Haka -> Socket: send pubrel
note right: pubrel packet transferred to socket write buffer.
Client <- Haka: write return
== ... ==
Client -> Haka: read call
          Haka <- Socket: recv pubcomp
note right: publish packet dequeued.
Client <- Haka: on_pubcomp call
Client -> Haka: on_pubcomp return
Client <- Haka: read return