Unverified Commit abec1c74 authored by Nugine's avatar Nugine
Browse files

readme: how it works

parent d80a8236
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -20,7 +20,19 @@ This experimental project intends to offer an ergonomic adapter for building S3-

`s3s` implements Amazon S3 REST API in the form of a generic [hyper](https://github.com/hyperium/hyper) service. S3-compatible services can focus on the S3 API itself and don't have to care about the HTTP layer.

`s3s-fs` implements the S3 API based on file system. It is designed for integration testing. DO NOT USE IT IN PRODUCTION.
`s3s-fs` implements the S3 API based on file system, as a sample implementation. It is designed for integration testing. DO NOT USE IT IN PRODUCTION.

## How it works

![architecture diagram](docs/arch/arch.svg)

The diagram above shows how `s3s` works. 

`s3s` converts HTTP requests to operation inputs before calling the user-defined service. 

`s3s` converts operation outputs or errors to HTTP responses after calling the user-defined service.

The data types, serialization and deserialization are generated from the smithy model in [aws-sdk-rust](https://github.com/awslabs/aws-sdk-rust) repository, with some manual hacks.

## Develop

docs/arch/arch.drawio

0 → 100644
+114 −0
Original line number Diff line number Diff line
<mxfile host="65bd71144e" scale="1" border="20">
    <diagram id="U-4mjK2Da4UuaZ3eeNt7" name="第 1 页">
        <mxGraphModel dx="994" dy="650" grid="1" gridSize="20" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" background="#FFFFFF" math="0" shadow="0">
            <root>
                <mxCell id="0"/>
                <mxCell id="1" parent="0"/>
                <mxCell id="40" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;" parent="1" edge="1">
                    <mxGeometry width="50" height="50" relative="1" as="geometry">
                        <mxPoint x="80" y="479.5" as="sourcePoint"/>
                        <mxPoint x="720" y="479.5" as="targetPoint"/>
                    </mxGeometry>
                </mxCell>
                <mxCell id="36" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="2" target="35" edge="1">
                    <mxGeometry relative="1" as="geometry"/>
                </mxCell>
                <mxCell id="2" value="HTTP Request" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="200" y="140" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="3" value="HTTP Response" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="500" y="140" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="4" value="hyper" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=20;" parent="1" vertex="1">
                    <mxGeometry x="80" y="140" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="14" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fontFamily=Times New Roman;fontSize=12;" parent="1" source="6" target="12" edge="1">
                    <mxGeometry relative="1" as="geometry"/>
                </mxCell>
                <mxCell id="6" value="deserialize" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="200" y="380" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Helvetica;fontSize=12;" parent="1" source="7" target="3" edge="1">
                    <mxGeometry relative="1" as="geometry">
                        <Array as="points">
                            <mxPoint x="500" y="340"/>
                            <mxPoint x="560" y="340"/>
                        </Array>
                    </mxGeometry>
                </mxCell>
                <mxCell id="7" value="serialize" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="460" y="380" width="80" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="9" value="s3s" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=20;" parent="1" vertex="1">
                    <mxGeometry x="80" y="320" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="24" style="edgeStyle=orthogonalEdgeStyle;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontFamily=Helvetica;fontSize=12;rounded=0;" parent="1" source="12" target="21" edge="1">
                    <mxGeometry relative="1" as="geometry"/>
                </mxCell>
                <mxCell id="12" value="GetObjectRequest" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="200" y="460" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="15" style="edgeStyle=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;fontSize=12;" parent="1" source="13" target="7" edge="1">
                    <mxGeometry relative="1" as="geometry"/>
                </mxCell>
                <mxCell id="13" value="GetObjectOutput" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="440" y="460" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="17" value="MyService" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=20;" parent="1" vertex="1">
                    <mxGeometry x="80" y="540" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="25" style="edgeStyle=orthogonalEdgeStyle;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Helvetica;fontSize=12;rounded=0;" parent="1" source="21" target="13" edge="1">
                    <mxGeometry relative="1" as="geometry">
                        <Array as="points">
                            <mxPoint x="500" y="560"/>
                        </Array>
                    </mxGeometry>
                </mxCell>
                <mxCell id="27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Helvetica;fontSize=12;" parent="1" source="21" target="26" edge="1">
                    <mxGeometry relative="1" as="geometry"/>
                </mxCell>
                <mxCell id="21" value="impl S3 for MyService" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;" parent="1" vertex="1">
                    <mxGeometry x="280" y="540" width="200" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="23" value="get_object(input).await" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=12;" parent="1" vertex="1">
                    <mxGeometry x="280" y="580" width="200" height="30" as="geometry"/>
                </mxCell>
                <mxCell id="29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Helvetica;fontSize=12;" parent="1" source="26" target="28" edge="1">
                    <mxGeometry relative="1" as="geometry"/>
                </mxCell>
                <mxCell id="26" value="S3Error" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="560" y="460" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;fontFamily=Helvetica;fontSize=12;" parent="1" source="28" target="3" edge="1">
                    <mxGeometry relative="1" as="geometry">
                        <Array as="points">
                            <mxPoint x="620" y="340"/>
                            <mxPoint x="560" y="340"/>
                        </Array>
                    </mxGeometry>
                </mxCell>
                <mxCell id="28" value="serialize" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="580" y="380" width="80" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="38" style="edgeStyle=none;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="34" target="6" edge="1">
                    <mxGeometry relative="1" as="geometry"/>
                </mxCell>
                <mxCell id="34" value="routing" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="200" y="320" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="37" style="edgeStyle=none;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="35" target="34" edge="1">
                    <mxGeometry relative="1" as="geometry"/>
                </mxCell>
                <mxCell id="35" value="check signature" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
                    <mxGeometry x="200" y="260" width="120" height="40" as="geometry"/>
                </mxCell>
                <mxCell id="39" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;" parent="1" edge="1">
                    <mxGeometry width="50" height="50" relative="1" as="geometry">
                        <mxPoint x="80" y="220" as="sourcePoint"/>
                        <mxPoint x="720" y="220" as="targetPoint"/>
                    </mxGeometry>
                </mxCell>
            </root>
        </mxGraphModel>
    </diagram>
</mxfile>
 No newline at end of file

docs/arch/arch.svg

0 → 100644
+1 −0

File added.

Preview size limit exceeded, changes collapsed.