new experimental state-machine language
I think I want to express actions as transient states. _c2.py matches w4.dot
This commit is contained in:
parent
a9a0bc43c7
commit
0b05c9ca5a
103
src/wormhole/_c2.py
Normal file
103
src/wormhole/_c2.py
Normal file
|
@ -0,0 +1,103 @@
|
|||
|
||||
class ConnectionMachine:
|
||||
def __init__(self):
|
||||
self._f = f = WSFactory(self._ws_url)
|
||||
f.setProtocolOptions(autoPingInterval=60, autoPingTimeout=600)
|
||||
f.connection_machine = self # calls onOpen and onClose
|
||||
p = urlparse(self._ws_url)
|
||||
self._ep = self._make_endpoint(p.hostname, p.port or 80)
|
||||
self._connector = None
|
||||
self._done_d = defer.Deferred()
|
||||
|
||||
# "@action" marks a method as doing something, then moving to a state or
|
||||
# another action. "=State()" marks a state, where we want for an event.
|
||||
# "=Event()" marks an event, which causes us to move out of a state,
|
||||
# through zero or more actions, and eventually landing in some other
|
||||
# state.
|
||||
|
||||
starting = State(initial=True)
|
||||
connecting = State()
|
||||
negotiating = State()
|
||||
open = State()
|
||||
waiting = State()
|
||||
reconnecting = State()
|
||||
disconnecting = State()
|
||||
cancelling = State()
|
||||
stopped = State()
|
||||
|
||||
CM_start = Event()
|
||||
d_callback = Event()
|
||||
d_errback = Event()
|
||||
onOpen = Event()
|
||||
onClose = Event()
|
||||
stop = Event()
|
||||
expire = Event()
|
||||
|
||||
@action(goto=connecting)
|
||||
def connect1(self):
|
||||
d = self._ep.connect()
|
||||
d.addCallbacks(self.c1_d_callback, self.c1_d_errback)
|
||||
@action(goto=failed)
|
||||
def notify_fail(self, ARGS?):
|
||||
stuff()
|
||||
@action(goto=open)
|
||||
def opened(self):
|
||||
tx_bind()
|
||||
M_connected()
|
||||
@action(goto=disconnecting)
|
||||
def dropConnectionWhileNegotiating(self):
|
||||
p.dropConnection()
|
||||
@action(goto=disconnecting)
|
||||
def dropOpenConnection(self):
|
||||
p.dropOpenConnection()
|
||||
M_lost()
|
||||
@action(goto=start_timer)
|
||||
def lostConnection(self):
|
||||
M_lost()
|
||||
@action(goto=waiting):
|
||||
def start_timer(self):
|
||||
self._timer = reactor.callLater(self._timeout, self.expire)
|
||||
@action(goto=reconnecting)
|
||||
def reconnect(self):
|
||||
d = self._ep.connect()
|
||||
d.addCallbacks(self.c1_d_callback, self.c1_d_errback)
|
||||
@action(goto=negotiating)
|
||||
def reset_timer(self):
|
||||
self._timeout = self.INITIAL_TIMEOUT
|
||||
@action(goto=MC_stopped)
|
||||
def cancel_timer(self):
|
||||
self._timer.cancel()
|
||||
@action(goto=cancelling)
|
||||
def d_cancel(self):
|
||||
self._d.cancel()
|
||||
@action(goto=stopped)
|
||||
def MC_stopped(self):
|
||||
self.MC.stopped()
|
||||
|
||||
def c1_d_callback(self, p):
|
||||
self.d_callback()
|
||||
def c1_d_errback(self, f):
|
||||
self.d_errback()
|
||||
def p_onClose(self, why):
|
||||
self.onClose()
|
||||
def p_onOpen(self):
|
||||
self.onOpen()
|
||||
|
||||
starting.upon(CM_start, goto=connect1)
|
||||
connecting.upon(d_callback, goto=negotiating)
|
||||
connecting.upon(d_errback, goto=notify_fail)
|
||||
connecting.upon(onClose, goto=notify_fail)
|
||||
negotiating.upon(onOpen, goto=opened)
|
||||
negotiating.upon(onClose, goto=notify_fail)
|
||||
negotiating.upon(stop, goto=dropConnectionWhileNegotiating)
|
||||
open.upon(onClose, goto=lostConnection)
|
||||
open.upon(stop, goto=dropOpenConnection)
|
||||
waiting.upon(expire, goto=reconnect)
|
||||
waiting.upon(stop, goto=cancel_timer)
|
||||
reconnecting.upon(d_callback, goto=reset_timer)
|
||||
reconnecting.upon(stop, goto=d_cancel)
|
||||
disconnecting.upon(onClose, goto=MC_stopped)
|
||||
cancelling.upon(d_errback, goto=MC_stopped)
|
||||
|
||||
CM = ConnectionMachine()
|
||||
CM.CM_start()
|
Loading…
Reference in New Issue
Block a user