Optimistic Concurrency on the State Endpoint — click any step to see the HTTP message
flowchart TD subgraph LaneA["Client A"] direction TB A_GET["GET /state
200 OK, ETag v1"]:::clientReq A_MOD["Modify locally
add slide 4"]:::clientLocal A_PUT["PUT, If-Match: v1
send updated doc"]:::clientReq end subgraph LaneB["Client B"] direction TB B_GET["GET /state
200 OK, ETag v1"]:::clientReq B_MOD["Modify locally
add quizScore"]:::clientLocal B_PUT1["PUT, If-Match: v1
send updated doc"]:::clientReq B_GET2["GET /state
200 OK, ETag v2"]:::clientReq B_MERGE["Merge edits
onto v2"]:::clientLocal B_PUT2["PUT, If-Match: v2
send merged doc"]:::clientReq end A_OK["LRS: 204 No Content
ETag v2"]:::lrsOk B_412["LRS: 412 Precondition Failed
current ETag v2"]:::lrsFail B_OK["LRS: 204 No Content
ETag v3"]:::lrsOk A_GET --> A_MOD --> A_PUT --> A_OK B_GET --> B_MOD --> B_PUT1 --> B_412 B_412 --> B_GET2 --> B_MERGE --> B_PUT2 --> B_OK A_OK -.->|"document now at v2"| B_GET2 click A_GET call showStep("A_GET") click A_MOD call showStep("A_MOD") click A_PUT call showStep("A_PUT") click A_OK call showStep("A_OK") click B_GET call showStep("B_GET") click B_MOD call showStep("B_MOD") click B_PUT1 call showStep("B_PUT1") click B_412 call showStep("B_412") click B_GET2 call showStep("B_GET2") click B_MERGE call showStep("B_MERGE") click B_PUT2 call showStep("B_PUT2") click B_OK call showStep("B_OK") classDef clientReq fill:#4338ca,stroke:#312e81,color:#fff,font-size:13px classDef clientLocal fill:#64748b,stroke:#334155,color:#fff,font-size:13px classDef lrsOk fill:#16a34a,stroke:#14532d,color:#fff,font-size:13px,font-weight:bold classDef lrsFail fill:#dc2626,stroke:#7f1d1d,color:#fff,font-size:13px,font-weight:bold linkStyle default stroke:#64748b,stroke-width:2px,font-size:12px

Step Details

Click any step in the diagram to see the exact HTTP message and what a robust client implementation does at that point.

Client HTTP request
Local (client-side) action
LRS success response (2xx)
LRS rejection (412)