1. Check for existing transaction
    In this scenario, alice calls the URL /endpoint?caller=alice&callee=bob
     alice --> endpoint(caller = alice, callee = bob)
     HTTP Status = [400]
    
  2. Simulate alice offer
    In this scenario, alice has checked that no transaction was initiated
    alice calls the URL /endpoint?caller=alice&callee=bob&offer=ALICEOFFER
     alice --> endpoint(caller = alice, callee = bob, offer = ALICEOFFER)
     HTTP Status = [200], Entity = [offered]
    
  3. Check for alice offer
    In this scenario, bob checks that no transaction is initiated
    bob calls the URL /endpoint?caller=bob&callee=alice
     bob --> endpoint(caller = bob, callee = alice)
     HTTP Status = [200], Entity = [offered: ALICEOFFER]
    
  4. Simulate bob answer
    In this scenario, bob has accepted alice's offer and prepared an answer
    bob calls the URL /endpoint?caller=bob&callee=alice&answer=BOBANSWER
     bob --> endpoint(caller = bob, callee = alice, answer = BOBANSWER)
     HTTP Status = [200], Entity = [answered]
    
  5. Simulate alice handshake
    In this last step, alice awaits bob answer
    alice calls the URL /endpoint?caller=alice&callee=bob&end=true
     alice --> endpoint(caller = alice, callee = bob, end = true)
    
    When bob has not answered yet  HTTP Status = [200], Entity = []
    When bob has answered          HTTP Status = [200], Entity = [answered: BOBANSWER]
    
    This call is the last of the sequence.
    Upon completion of this call, the server removes traces of the handshake.
    As a result, this last call is not repeatable.