@@ -8,9 +8,9 @@ use assign::assign;
88use async_stream:: try_stream;
99use futures_core:: stream:: Stream ;
1010use ruma:: {
11- DeviceId , UserId ,
11+ DeviceId ,
1212 api:: {
13- OutgoingRequest , SupportedVersions ,
13+ AppserviceUserIdentity , OutgoingRequest , OutgoingRequestAppserviceExt , SupportedVersions ,
1414 auth_scheme:: { AuthScheme , SendAccessToken } ,
1515 client:: {
1616 account:: register:: { self , RegistrationKind } ,
@@ -24,7 +24,7 @@ use ruma::{
2424} ;
2525
2626use crate :: {
27- Error , HttpClient , ResponseError , ResponseResult , add_user_id_to_query , send_customized_request ,
27+ Error , HttpClient , ResponseError , ResponseResult , send_customized_request , send_request_as ,
2828} ;
2929
3030mod builder;
@@ -83,6 +83,18 @@ impl<C> Client<C> {
8383 pub fn access_token ( & self ) -> Option < String > {
8484 self . 0 . access_token . lock ( ) . expect ( "session mutex was poisoned" ) . clone ( )
8585 }
86+
87+ /// Get the `SendAccessToken` according to the client's `TokenMode`.
88+ fn send_access_token < ' a > ( & self , access_token : & ' a Option < String > ) -> SendAccessToken < ' a > {
89+ let token_mode = self . 0 . token_mode ;
90+
91+ match ( token_mode, access_token. as_deref ( ) ) {
92+ ( TokenMode :: AppService , Some ( at) ) => SendAccessToken :: Appservice ( at) ,
93+ ( TokenMode :: SendIfRequired , Some ( at) ) => SendAccessToken :: IfRequired ( at) ,
94+ ( TokenMode :: SendAlways , Some ( at) ) => SendAccessToken :: Always ( at) ,
95+ ( _, None ) => SendAccessToken :: None ,
96+ }
97+ }
8698}
8799
88100impl < C : HttpClient > Client < C > {
@@ -108,20 +120,12 @@ impl<C: HttpClient> Client<C> {
108120 R :: PathBuilder : SupportedPathBuilder ,
109121 F : FnOnce ( & mut http:: Request < C :: RequestBody > ) -> Result < ( ) , ResponseError < C , R > > ,
110122 {
111- let token_mode = self . 0 . token_mode ;
112123 let access_token = self . access_token ( ) ;
113124
114- let send_access_token = match ( token_mode, access_token. as_deref ( ) ) {
115- ( TokenMode :: AppService , Some ( at) ) => SendAccessToken :: Appservice ( at) ,
116- ( TokenMode :: SendIfRequired , Some ( at) ) => SendAccessToken :: IfRequired ( at) ,
117- ( TokenMode :: SendAlways , Some ( at) ) => SendAccessToken :: Always ( at) ,
118- ( _, None ) => SendAccessToken :: None ,
119- } ;
120-
121125 send_customized_request (
122126 & self . 0 . http_client ,
123127 & self . 0 . homeserver_url ,
124- send_access_token,
128+ self . send_access_token ( & access_token ) ,
125129 R :: PathBuilder :: get_path_builder_input ( self ) ,
126130 request,
127131 customize,
@@ -133,13 +137,27 @@ impl<C: HttpClient> Client<C> {
133137 ///
134138 /// This method is meant to be used by application services when interacting with the
135139 /// client-server API.
136- pub async fn send_request_as < R > ( & self , user_id : & UserId , request : R ) -> ResponseResult < C , R >
140+ pub async fn send_request_as < R > (
141+ & self ,
142+ identity : AppserviceUserIdentity < ' _ > ,
143+ request : R ,
144+ ) -> ResponseResult < C , R >
137145 where
138- R : OutgoingRequest ,
146+ R : OutgoingRequestAppserviceExt ,
139147 for < ' a > R :: Authentication : AuthScheme < Input < ' a > = SendAccessToken < ' a > > ,
140148 R :: PathBuilder : SupportedPathBuilder ,
141149 {
142- self . send_customized_request ( request, add_user_id_to_query :: < C , R > ( user_id) ) . await
150+ let access_token = self . access_token ( ) ;
151+
152+ send_request_as (
153+ & self . 0 . http_client ,
154+ & self . 0 . homeserver_url ,
155+ self . send_access_token ( & access_token) ,
156+ R :: PathBuilder :: get_path_builder_input ( self ) ,
157+ identity,
158+ request,
159+ )
160+ . await
143161 }
144162
145163 /// Log in with a username and password.
0 commit comments