@@ -10,6 +10,11 @@ use tide::{
10
10
} ;
11
11
use wasmtime:: { component:: * , Config , Engine , Store } ;
12
12
13
+ wasmtime_component_macro:: bindgen!( {
14
+ path: "../service.wit" ,
15
+ world: "service"
16
+ } ) ;
17
+
13
18
/// Represents state stored in the tide application context.
14
19
///
15
20
/// This is so that a component is only parsed and compiled once.
@@ -33,42 +38,10 @@ impl State {
33
38
}
34
39
}
35
40
36
- #[ derive( ComponentType , Lower ) ]
37
- #[ component( record) ]
38
- struct ServiceRequest {
39
- headers : Vec < ( Vec < u8 > , Vec < u8 > ) > ,
40
- body : Vec < u8 > ,
41
- }
42
-
43
- impl ServiceRequest {
44
- async fn new ( mut req : Request < State > ) -> tide:: Result < Self > {
45
- // Convert the tide request to a service request.
46
- let headers = req
47
- . iter ( )
48
- . map ( |( n, v) | {
49
- (
50
- n. as_str ( ) . as_bytes ( ) . to_vec ( ) ,
51
- v. as_str ( ) . as_bytes ( ) . to_vec ( ) ,
52
- )
53
- } )
54
- . collect ( ) ;
55
- let body = req. take_body ( ) . into_bytes ( ) . await ?;
56
-
57
- Ok ( Self { headers, body } )
58
- }
59
- }
60
-
61
- #[ derive( ComponentType , Lift ) ]
62
- #[ component( record) ]
63
- struct ServiceResponse {
64
- headers : Vec < ( Vec < u8 > , Vec < u8 > ) > ,
65
- body : Vec < u8 > ,
66
- }
67
-
68
- impl TryFrom < ServiceResponse > for tide:: Response {
41
+ impl TryFrom < handler:: Response > for tide:: Response {
69
42
type Error = tide:: Error ;
70
43
71
- fn try_from ( r : ServiceResponse ) -> Result < Self , Self :: Error > {
44
+ fn try_from ( r : handler :: Response ) -> Result < Self , Self :: Error > {
72
45
// Convert the service response to a tide response
73
46
let mut builder = tide:: Response :: builder ( StatusCode :: Ok ) ;
74
47
for ( name, value) in r. headers {
@@ -82,25 +55,16 @@ impl TryFrom<ServiceResponse> for tide::Response {
82
55
}
83
56
}
84
57
85
- #[ derive( ComponentType , Lift ) ]
86
- #[ component( enum ) ]
87
- enum ServiceError {
88
- #[ component( name = "bad-request" ) ]
89
- BadRequest ,
90
- }
91
-
92
- impl From < ServiceError > for tide:: Error {
93
- fn from ( e : ServiceError ) -> Self {
94
- match e {
95
- ServiceError :: BadRequest => {
58
+ impl handler:: Error {
59
+ fn into_tide ( self ) -> tide:: Error {
60
+ match self {
61
+ Self :: BadRequest => {
96
62
tide:: Error :: from_str ( StatusCode :: BadRequest , "bad service request" )
97
63
}
98
64
}
99
65
}
100
66
}
101
67
102
- type ServiceResult = Result < ServiceResponse , ServiceError > ;
103
-
104
68
/// WebAssembly component server.
105
69
///
106
70
/// A demonstration server that executes WebAssembly components.
@@ -144,24 +108,29 @@ impl ServerApp {
144
108
app. listen ( address) . await . map_err ( Into :: into)
145
109
}
146
110
147
- async fn process_request ( req : Request < State > ) -> tide:: Result {
148
- let state = req. state ( ) ;
111
+ async fn process_request ( mut req : Request < State > ) -> tide:: Result {
112
+ let body = req. body_bytes ( ) . await ?;
113
+ let headers = req
114
+ . iter ( )
115
+ . map ( |( n, v) | ( n. as_str ( ) . as_bytes ( ) , v. as_str ( ) . as_bytes ( ) ) )
116
+ . collect :: < Vec < _ > > ( ) ;
149
117
150
118
// Create a new store for the request
151
- let mut store = Store :: new ( & state . engine , ( ) ) ;
119
+ let state = req . state ( ) ;
152
120
let linker: Linker < ( ) > = Linker :: new ( & state. engine ) ;
153
-
154
- // Instantiate the service component and get its `execute` export
155
- let instance = linker. instantiate ( & mut store, & state. component ) ?;
156
- let execute = instance
157
- . get_typed_func :: < ( ServiceRequest , ) , ( ServiceResult , ) , _ > ( & mut store, "execute" ) ?;
158
-
159
- // Call the `execute` export with the request and translate the response
160
- execute
161
- . call ( & mut store, ( ServiceRequest :: new ( req) . await ?, ) ) ?
162
- . 0
163
- . map_err ( Into :: into)
164
- . and_then ( TryInto :: try_into)
121
+ let mut store = Store :: new ( & state. engine , ( ) ) ;
122
+ let ( service, _) = Service :: instantiate ( & mut store, & state. component , & linker) ?;
123
+ service
124
+ . handler
125
+ . call_execute (
126
+ & mut store,
127
+ handler:: Request {
128
+ headers : & headers,
129
+ body : & body,
130
+ } ,
131
+ ) ?
132
+ . map ( TryInto :: try_into)
133
+ . map_err ( handler:: Error :: into_tide) ?
165
134
}
166
135
}
167
136
0 commit comments