Skip to content

Commit cc86a80

Browse files
authored
Merge pull request #41 from WebAssembly/async-trailers
Make reading and writing trailers properly async
2 parents 2da2a1c + dddfb84 commit cc86a80

File tree

2 files changed

+85
-5
lines changed

2 files changed

+85
-5
lines changed

proxy.md

+63-2
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,12 @@ be used.</p>
620620
#### <a name="incoming_request">`type incoming-request`</a>
621621
`u32`
622622
<p>
623+
#### <a name="future_write_trailers_result">`type future-write-trailers-result`</a>
624+
`u32`
625+
<p>
626+
#### <a name="future_trailers">`type future-trailers`</a>
627+
`u32`
628+
<p>
623629
#### <a name="future_incoming_response">`type future-incoming-response`</a>
624630
`u32`
625631
<p>
@@ -711,13 +717,68 @@ be used.</p>
711717
</ul>
712718
<h5>Return values</h5>
713719
<ul>
714-
<li><a name="finish_incoming_stream.0"></a> option&lt;<a href="#trailers"><a href="#trailers"><code>trailers</code></a></a>&gt;</li>
720+
<li><a name="finish_incoming_stream.0"></a> option&lt;<a href="#future_trailers"><a href="#future_trailers"><code>future-trailers</code></a></a>&gt;</li>
715721
</ul>
716722
<h4><a name="finish_outgoing_stream"><code>finish-outgoing-stream: func</code></a></h4>
717723
<h5>Params</h5>
718724
<ul>
719725
<li><a name="finish_outgoing_stream.s"><code>s</code></a>: <a href="#outgoing_stream"><a href="#outgoing_stream"><code>outgoing-stream</code></a></a></li>
720-
<li><a name="finish_outgoing_stream.trailers"><a href="#trailers"><code>trailers</code></a></a>: option&lt;<a href="#trailers"><a href="#trailers"><code>trailers</code></a></a>&gt;</li>
726+
</ul>
727+
<h4><a name="finish_outgoing_stream_with_trailers"><code>finish-outgoing-stream-with-trailers: func</code></a></h4>
728+
<h5>Params</h5>
729+
<ul>
730+
<li><a name="finish_outgoing_stream_with_trailers.s"><code>s</code></a>: <a href="#outgoing_stream"><a href="#outgoing_stream"><code>outgoing-stream</code></a></a></li>
731+
<li><a name="finish_outgoing_stream_with_trailers.trailers"><a href="#trailers"><code>trailers</code></a></a>: <a href="#trailers"><a href="#trailers"><code>trailers</code></a></a></li>
732+
</ul>
733+
<h5>Return values</h5>
734+
<ul>
735+
<li><a name="finish_outgoing_stream_with_trailers.0"></a> <a href="#future_write_trailers_result"><a href="#future_write_trailers_result"><code>future-write-trailers-result</code></a></a></li>
736+
</ul>
737+
<h4><a name="drop_future_trailers"><code>drop-future-trailers: func</code></a></h4>
738+
<h5>Params</h5>
739+
<ul>
740+
<li><a name="drop_future_trailers.f"><code>f</code></a>: <a href="#future_trailers"><a href="#future_trailers"><code>future-trailers</code></a></a></li>
741+
</ul>
742+
<h4><a name="future_trailers_get"><code>future-trailers-get: func</code></a></h4>
743+
<h5>Params</h5>
744+
<ul>
745+
<li><a name="future_trailers_get.f"><code>f</code></a>: <a href="#future_trailers"><a href="#future_trailers"><code>future-trailers</code></a></a></li>
746+
</ul>
747+
<h5>Return values</h5>
748+
<ul>
749+
<li><a name="future_trailers_get.0"></a> option&lt;result&lt;<a href="#trailers"><a href="#trailers"><code>trailers</code></a></a>, <a href="#error"><a href="#error"><code>error</code></a></a>&gt;&gt;</li>
750+
</ul>
751+
<h4><a name="listen_to_future_trailers"><code>listen-to-future-trailers: func</code></a></h4>
752+
<h5>Params</h5>
753+
<ul>
754+
<li><a name="listen_to_future_trailers.f"><code>f</code></a>: <a href="#future_trailers"><a href="#future_trailers"><code>future-trailers</code></a></a></li>
755+
</ul>
756+
<h5>Return values</h5>
757+
<ul>
758+
<li><a name="listen_to_future_trailers.0"></a> <a href="#pollable"><a href="#pollable"><code>pollable</code></a></a></li>
759+
</ul>
760+
<h4><a name="drop_future_write_trailers_result"><code>drop-future-write-trailers-result: func</code></a></h4>
761+
<h5>Params</h5>
762+
<ul>
763+
<li><a name="drop_future_write_trailers_result.f"><code>f</code></a>: <a href="#future_write_trailers_result"><a href="#future_write_trailers_result"><code>future-write-trailers-result</code></a></a></li>
764+
</ul>
765+
<h4><a name="future_write_trailers_result_get"><code>future-write-trailers-result-get: func</code></a></h4>
766+
<h5>Params</h5>
767+
<ul>
768+
<li><a name="future_write_trailers_result_get.f"><code>f</code></a>: <a href="#future_write_trailers_result"><a href="#future_write_trailers_result"><code>future-write-trailers-result</code></a></a></li>
769+
</ul>
770+
<h5>Return values</h5>
771+
<ul>
772+
<li><a name="future_write_trailers_result_get.0"></a> option&lt;result&lt;_, <a href="#error"><a href="#error"><code>error</code></a></a>&gt;&gt;</li>
773+
</ul>
774+
<h4><a name="listen_to_future_write_trailers_result"><code>listen-to-future-write-trailers-result: func</code></a></h4>
775+
<h5>Params</h5>
776+
<ul>
777+
<li><a name="listen_to_future_write_trailers_result.f"><code>f</code></a>: <a href="#future_write_trailers_result"><a href="#future_write_trailers_result"><code>future-write-trailers-result</code></a></a></li>
778+
</ul>
779+
<h5>Return values</h5>
780+
<ul>
781+
<li><a name="listen_to_future_write_trailers_result.0"></a> <a href="#pollable"><a href="#pollable"><code>pollable</code></a></a></li>
721782
</ul>
722783
<h4><a name="drop_incoming_request"><code>drop-incoming-request: func</code></a></h4>
723784
<h5>Params</h5>

wit/types.wit

+22-3
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,30 @@ interface types {
5959
// build on separate resource types defined by `wasi:io/streams`. The
6060
// `finish-` functions emulate the stream's result value and MUST be called
6161
// exactly once after the final read/write from/to the stream before dropping
62-
// the stream.
62+
// the stream. The optional `future-` types describe the asynchronous result of
63+
// reading/writing the optional HTTP trailers and MUST be waited on and dropped
64+
// to complete streaming the request/response.
6365
type incoming-stream = input-stream
6466
type outgoing-stream = output-stream
65-
finish-incoming-stream: func(s: incoming-stream) -> option<trailers>
66-
finish-outgoing-stream: func(s: outgoing-stream, trailers: option<trailers>)
67+
finish-incoming-stream: func(s: incoming-stream) -> option<future-trailers>
68+
finish-outgoing-stream: func(s: outgoing-stream)
69+
finish-outgoing-stream-with-trailers: func(s: outgoing-stream, trailers: trailers) -> future-write-trailers-result
70+
71+
// The following block defines the `future-trailers` resource, which is
72+
// returned when finishing an `incoming-stream` to asychronously produce the
73+
// final trailers.
74+
type future-trailers = u32
75+
drop-future-trailers: func(f: future-trailers)
76+
future-trailers-get: func(f: future-trailers) -> option<result<trailers, error>>
77+
listen-to-future-trailers: func(f: future-trailers) -> pollable
78+
79+
// The following block defines the `future-write-trailers-result` resource,
80+
// which is returned when finishing an `outgoing-stream` and asychronously
81+
// indicates the success or failure of writing the trailers.
82+
type future-write-trailers-result = u32
83+
drop-future-write-trailers-result: func(f: future-write-trailers-result)
84+
future-write-trailers-result-get: func(f: future-write-trailers-result) -> option<result<_, error>>
85+
listen-to-future-write-trailers-result: func(f: future-write-trailers-result) -> pollable
6786

6887
// The following block defines the `incoming-request` and `outgoing-request`
6988
// resource types that correspond to HTTP standard Requests. Soon, when

0 commit comments

Comments
 (0)