@@ -5,12 +5,14 @@ use std::sync::Arc;
55use tokio_util:: sync:: CancellationToken ;
66
77use poem:: {
8- Endpoint , Route , Server ,
8+ Endpoint , EndpointExt , Route , Server ,
99 endpoint:: make_sync,
10+ http:: Method ,
1011 listener:: {
1112 Listener , TcpListener ,
1213 acme:: { AutoCert , LETS_ENCRYPT_PRODUCTION } ,
1314 } ,
15+ middleware:: { Cors , Tracing } ,
1416} ;
1517use poem_openapi:: {
1618 ApiResponse , Object , OpenApi , OpenApiService , param:: Query , payload:: Json , types:: Example ,
@@ -242,7 +244,7 @@ pub async fn serve(
242244 . server ( "http://localhost:3000" )
243245 . url_prefix ( "/xrpc" ) ;
244246
245- let app = Route :: new ( )
247+ let mut app = Route :: new ( )
246248 . nest ( "/" , api_service. scalar ( ) )
247249 . nest ( "/openapi.json" , api_service. spec_endpoint ( ) )
248250 . nest ( "/xrpc/" , api_service) ;
@@ -252,24 +254,33 @@ pub async fn serve(
252254 . install_default ( )
253255 . expect ( "alskfjalksdjf" ) ;
254256
255- let app = app. at ( "/.well-known/did.json" , get_did_doc ( & host) ) ;
257+ app = app
258+ . at ( "/.well-known/did.json" , get_did_doc ( & host) ) ;
256259
257260 let auto_cert = AutoCert :: builder ( )
258261 . directory_url ( LETS_ENCRYPT_PRODUCTION )
259262 . domain ( & host)
260263 . build ( )
261264 . map_err ( ServerError :: AcmeBuildError ) ?;
262265
263- Server :: new ( TcpListener :: bind ( "0.0.0.0:443" ) . acme ( auto_cert) )
264- . name ( "slingshot" )
265- . run ( app)
266- . await
267- . map_err ( ServerError :: ServerExited )
266+ run ( TcpListener :: bind ( "0.0.0.0:443" ) . acme ( auto_cert) , app) . await
268267 } else {
269- Server :: new ( TcpListener :: bind ( "127.0.0.1:3000" ) )
270- . name ( "slingshot" )
271- . run ( app)
272- . await
273- . map_err ( ServerError :: ServerExited )
268+ run ( TcpListener :: bind ( "127.0.0.1:3000" ) , app) . await
274269 }
275270}
271+
272+ async fn run < L > ( listener : L , app : Route ) -> Result < ( ) , ServerError >
273+ where
274+ L : Listener + ' static
275+ {
276+ let app = app
277+ . with ( Cors :: new ( )
278+ . allow_method ( Method :: GET )
279+ . allow_credentials ( false ) )
280+ . with ( Tracing ) ;
281+ Server :: new ( listener)
282+ . name ( "slingshot" )
283+ . run ( app)
284+ . await
285+ . map_err ( ServerError :: ServerExited )
286+ }
0 commit comments