# Simplified Web Socket Protocol
```clafer
enum Request = open | close
abstract WebSocket
xor request -> Request ?
success
failure
xor states
initial ready
[ initially no request ]
[ request=open -[request.success]-> opened ]
[ request=open -[request.failure]-> failed ]
opened
[ initially no request ]
[ request=close -[request.success]-> closed ]
[ request=close -[request.failure]-> failed ]
closed --> closed
[ no request ]
failed --> failed
[ no request ]
```
## Example scenarios
1. Web socket successfully opened and closed
```clafer
webSocketOpenedClosed : WebSocket
[ ready --> request=open && request.success --> opened -->> request=close && request.success --> closed --> closed ]
```
| |WebSocket | |WebSocket | |WebSocket | |WebSocket | |WebSocket | |WebSocket |
| | | | request->open | | | | request->close | | | | |
| | | | success | | | | success | | | | |
| | ready | | ready | | opened | | | | closed | | closed |
2. Web socket successfully opened but failed to be closed
```clafer
webSocketOpenedFailed : WebSocket
[ ready --> request=open && request.success --> opened -->> request=close && request.failure --> failed --> failed ]
```
| |WebSocket | |WebSocket | |WebSocket | |WebSocket | |WebSocket | |WebSocket |
| | | | request->open | | | | request->close | | | | |
| | | | success | | | | failure | | | | |
| | ready | | ready | | opened | | | | failed | | failed |
3. Web socket failed to be opened
```clafer
webSocketFailed : WebSocket
[ ready --> request=open && request.failure --> failed --> failed ]
```
| |WebSocket | |WebSocket | |WebSocket | |WebSocket |
| | | | request->open | | | | |
| | | | failure | | | | |
| | ready | | ready | | failed | | failed |