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