bdee12f4e9
Replace ASCII-art diagrams across the README and docs/ with editable .drawio sources plus exported PNGs, so the diagrams render clearly in rendered markdown and can be maintained/regenerated instead of being hand-edited as fragile text art. Non-diagram blocks (code, folder trees, UI wireframes) were left as text.
84 lines
5.5 KiB
Plaintext
84 lines
5.5 KiB
Plaintext
<mxfile host="app.diagrams.net">
|
||
<diagram id="outboxflow" name="End-to-End Flow">
|
||
<mxGraphModel dx="1000" dy="1400" grid="1" gridSize="10" guides="1" arrows="1"
|
||
fold="1" page="1" pageScale="1" pageWidth="950" pageHeight="1400" math="0" shadow="0">
|
||
<root>
|
||
<mxCell id="0" />
|
||
<mxCell id="1" parent="0" />
|
||
|
||
<!-- Site script -->
|
||
<mxCell id="script" value="Site script: Notify.To("list").Send(subject, body) generate NotificationId (GUID) locally; return it to the script immediately" style="rounded=1;arcSize=20;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=12;" vertex="1" parent="1">
|
||
<mxGeometry x="280" y="40" width="380" height="70" as="geometry" />
|
||
</mxCell>
|
||
|
||
<!-- Site S&F Engine -->
|
||
<mxCell id="snf" value="Site Store-and-Forward Engine (notification category, target = central) durably forwards to central via Central–Site Communication (ClusterClient); buffers/retries if central is unreachable" style="whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontSize=12;" vertex="1" parent="1">
|
||
<mxGeometry x="240" y="170" width="460" height="80" as="geometry" />
|
||
</mxCell>
|
||
|
||
<!-- Central ingest -->
|
||
<mxCell id="ingest" value="Central ingest: insert-if-not-exists on NotificationId → Notifications table (Pending) ack the site → site S&F clears the message" style="shape=cylinder3;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=12;" vertex="1" parent="1">
|
||
<mxGeometry x="270" y="310" width="400" height="90" as="geometry" />
|
||
</mxCell>
|
||
|
||
<!-- Central Notification Outbox actor -->
|
||
<mxCell id="outbox" value="Central Notification Outbox actor (singleton, active central node) polls due rows; resolves the list; delivers via the matching adapter" style="whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=12;" vertex="1" parent="1">
|
||
<mxGeometry x="280" y="460" width="380" height="80" as="geometry" />
|
||
</mxCell>
|
||
|
||
<!-- Delivery decision -->
|
||
<mxCell id="d1" value="Delivery outcome" style="rhombus;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=12;" vertex="1" parent="1">
|
||
<mxGeometry x="400" y="610" width="140" height="100" as="geometry" />
|
||
</mxCell>
|
||
|
||
<!-- Delivered -->
|
||
<mxCell id="delivered" value="Delivered" style="rounded=1;arcSize=50;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=12;" vertex="1" parent="1">
|
||
<mxGeometry x="120" y="630" width="180" height="60" as="geometry" />
|
||
</mxCell>
|
||
|
||
<!-- Retrying -->
|
||
<mxCell id="retrying" value="Retrying (schedule NextAttemptAt)" style="rounded=1;arcSize=20;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=12;" vertex="1" parent="1">
|
||
<mxGeometry x="380" y="790" width="180" height="60" as="geometry" />
|
||
</mxCell>
|
||
|
||
<!-- Parked -->
|
||
<mxCell id="parked" value="Parked" style="rounded=1;arcSize=50;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=12;" vertex="1" parent="1">
|
||
<mxGeometry x="650" y="630" width="180" height="60" as="geometry" />
|
||
</mxCell>
|
||
|
||
<!-- Edges -->
|
||
<mxCell id="e1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=block;" edge="1" parent="1" source="script" target="snf">
|
||
<mxGeometry relative="1" as="geometry" />
|
||
</mxCell>
|
||
<mxCell id="e2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=block;" edge="1" parent="1" source="snf" target="ingest">
|
||
<mxGeometry relative="1" as="geometry" />
|
||
</mxCell>
|
||
<mxCell id="e3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=block;" edge="1" parent="1" source="ingest" target="outbox">
|
||
<mxGeometry relative="1" as="geometry" />
|
||
</mxCell>
|
||
<mxCell id="e4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=block;" edge="1" parent="1" source="outbox" target="d1">
|
||
<mxGeometry relative="1" as="geometry" />
|
||
</mxCell>
|
||
<mxCell id="e5" value="success" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=block;fontSize=12;" edge="1" parent="1" source="d1" target="delivered">
|
||
<mxGeometry relative="1" as="geometry" />
|
||
</mxCell>
|
||
<mxCell id="e6" value="transient failure" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=block;fontSize=12;" edge="1" parent="1" source="d1" target="retrying">
|
||
<mxGeometry relative="1" as="geometry" />
|
||
</mxCell>
|
||
<mxCell id="e7" value="permanent failure / retries exhausted" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=block;fontSize=12;" edge="1" parent="1" source="d1" target="parked">
|
||
<mxGeometry relative="1" as="geometry" />
|
||
</mxCell>
|
||
<!-- Retrying loops back to outbox poll -->
|
||
<mxCell id="e8" value="retry due" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=block;fontSize=11;dashed=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="retrying" target="outbox">
|
||
<mxGeometry relative="1" as="geometry">
|
||
<Array as="points">
|
||
<mxPoint x="780" y="820" />
|
||
<mxPoint x="780" y="500" />
|
||
</Array>
|
||
</mxGeometry>
|
||
</mxCell>
|
||
</root>
|
||
</mxGraphModel>
|
||
</diagram>
|
||
</mxfile>
|