digraph { /* ConnectionMachine */ C_start [label="Connection\nMachine" style="dotted"] C_start -> C_Pc1 [label="CM_start()" color="orange" fontcolor="orange"] C_Pc1 [shape="box" label="ep.connect()" color="orange"] C_Pc1 -> C_Sc1 [color="orange"] C_Sc1 [label="connecting\n(1st time)" color="orange"] C_Sc1 -> C_P_reset [label="d.callback" color="orange" fontcolor="orange"] C_P_reset [shape="box" label="reset\ntimer" color="orange"] C_P_reset -> C_S_negotiating [color="orange"] C_Sc1 -> C_P_failed [label="d.errback" color="red"] C_Sc1 -> C_P_failed [label="p.onClose" color="red"] C_Sc1 -> C_P_cancel [label="C_stop()"] C_P_cancel [shape="box" label="d.cancel()"] C_P_cancel -> C_S_cancelling C_S_cancelling [label="cancelling"] C_S_cancelling -> C_P_stopped [label="d.errback"] C_S_negotiating [label="negotiating" color="orange"] C_S_negotiating -> C_P_failed [label="p.onClose"] C_S_negotiating -> C_P_connected [label="p.onOpen" color="orange" fontcolor="orange"] C_S_negotiating -> C_P_drop2 [label="C_stop()"] C_P_drop2 [shape="box" label="p.dropConnection()"] C_P_drop2 -> C_S_disconnecting C_P_connected [shape="box" label="tx bind\nM_connected()" color="orange"] C_P_connected -> C_S_open [color="orange"] C_S_open [label="open" color="green"] C_S_open -> C_P_lost [label="p.onClose" color="blue" fontcolor="blue"] C_S_open -> C_P_drop [label="C_stop()" color="orange" fontcolor="orange"] C_P_drop [shape="box" label="p.dropConnection()\nM_lost()" color="orange"] C_P_drop -> C_S_disconnecting [color="orange"] C_S_disconnecting [label="disconnecting" color="orange"] C_S_disconnecting -> C_P_stopped [label="p.onClose" color="orange" fontcolor="orange"] C_P_lost [shape="box" label="M_lost()" color="blue"] C_P_lost -> C_P_wait [color="blue"] C_P_wait [shape="box" label="start timer" color="blue"] C_P_wait -> C_S_waiting [color="blue"] C_S_waiting [label="waiting" color="blue"] C_S_waiting -> C_Pc2 [label="expire" color="blue" fontcolor="blue"] C_S_waiting -> C_P_stop_timer [label="C_stop()"] C_P_stop_timer [shape="box" label="timer.cancel()"] C_P_stop_timer -> C_P_stopped C_Pc2 [shape="box" label="ep.connect()" color="blue"] C_Pc2 -> C_Sc2 [color="blue"] C_Sc2 [label="reconnecting" color="blue"] C_Sc2 -> C_P_reset [label="d.callback" color="blue" fontcolor="blue"] C_Sc2 -> C_P_wait [label="d.errback"] C_Sc2 -> C_P_cancel [label="C_stop()"] C_P_stopped [shape="box" label="MC_stopped()" color="orange"] C_P_stopped -> C_S_stopped [color="orange"] C_S_stopped [label="stopped" color="orange"] C_P_failed [shape="box" label="notify_fail" color="red"] C_P_failed -> C_S_failed C_S_failed [label="failed" color="red"] }