Skip to content

Event and FSM

Event

Create, sign, verify, and marshal events with stable JSON canonical bytes.

from pypepper.common.security.crypto.elliptic.ecdsa import ecdsa
from pypepper.event import event as event_mod

private_key = ecdsa.new_key_pair()
private_pem = ecdsa.get_private_key_pem(private_key)
public_pem = ecdsa.get_public_key_pem(private_key)

evt = event_mod.new(name="order.created", src="checkout")
evt.add_payload(payload_id="p1", category="json", raw=b'{"id":1}', hash_alg="sha256")
evt.sign(private_pem, "sha256")
assert evt.verify(public_pem, "sha256")
print(evt.marshal())

Note

Signatures use canonical JSON. Older pickle-based signatures will not verify.

FSM

Build a machine with Options + Transition, then trigger events with on().

from pypepper.event import event as event_mod
from pypepper.fsm import fsm

idle = fsm.State("idle")
running = fsm.State("running")
done = fsm.State("done")

start = event_mod.new(name="start")
finish = event_mod.new(name="finish")

machine = fsm.new(
    fsm.Options(
        fsm_id="demo",
        initial=idle,
        transitions=[
            fsm.Transition(event=start, from_state=[idle], to_state=running),
            fsm.Transition(event=finish, from_state=[running], to_state=done),
        ],
    )
)

assert machine.current().value == "idle"
machine.on(start)
assert machine.current().value == "running"
machine.on(finish)
assert machine.current().value == "done"

Rollback

If a transition handler or caller handler raises, the previous state is restored and the error is returned on Response.error.

def boom():
    raise RuntimeError("handler failed")

resp = machine.on(start, handler=boom)
assert resp.error is not None
# state rolled back to the previous value

Unknown transitions return Response.error without raising.

See also: API Reference / Event and FSM.