@@ -247,19 +247,27 @@ impl WidgetMachine {
247
247
. unwrap_or_default ( ) ,
248
248
249
249
FromWidgetRequest :: GetOpenId { } => {
250
- let ( request, request_action) = self . send_matrix_driver_request ( RequestOpenId ) ;
251
- request. then ( |res, machine| {
252
- let response = match res {
253
- Ok ( res) => OpenIdResponse :: Allowed ( OpenIdState :: new ( request_id, res) ) ,
254
- Err ( msg) => {
255
- info ! ( "OpenID request failed: {msg}" ) ;
256
- OpenIdResponse :: Blocked { original_request_id : request_id }
257
- }
258
- } ;
259
-
260
- let action = machine. send_to_widget_request ( NotifyOpenIdChanged ( response) ) . 1 ;
261
- action. map ( |a| vec ! [ a] ) . unwrap_or_default ( )
262
- } ) ;
250
+ let request_action = self . send_matrix_driver_request ( RequestOpenId ) . map (
251
+ |( request, request_action) | {
252
+ request. then ( |res, machine| {
253
+ let response = match res {
254
+ Ok ( res) => {
255
+ OpenIdResponse :: Allowed ( OpenIdState :: new ( request_id, res) )
256
+ }
257
+ Err ( msg) => {
258
+ info ! ( "OpenID request failed: {msg}" ) ;
259
+ OpenIdResponse :: Blocked { original_request_id : request_id }
260
+ }
261
+ } ;
262
+
263
+ let action =
264
+ machine. send_to_widget_request ( NotifyOpenIdChanged ( response) ) . 1 ;
265
+ action. map ( |a| vec ! [ a] ) . unwrap_or_default ( )
266
+ } ) ;
267
+
268
+ request_action
269
+ } ,
270
+ ) ;
263
271
264
272
let response =
265
273
Self :: send_from_widget_response ( raw_request, Ok ( OpenIdResponse :: Pending ) ) ;
@@ -281,23 +289,26 @@ impl WidgetMachine {
281
289
) ] ;
282
290
}
283
291
284
- let ( request, request_action) =
285
- self . send_matrix_driver_request ( UpdateDelayedEventRequest {
286
- action : req. action ,
287
- delay_id : req. delay_id ,
292
+ self . send_matrix_driver_request ( UpdateDelayedEventRequest {
293
+ action : req. action ,
294
+ delay_id : req. delay_id ,
295
+ } )
296
+ . map ( |( request, request_action) | {
297
+ request. then ( |result, _machine| {
298
+ vec ! [ Self :: send_from_widget_response(
299
+ raw_request,
300
+ // This is mapped to another type because the
301
+ // update_delay_event::Response
302
+ // does not impl Serialize
303
+ result
304
+ . map( Into :: <UpdateDelayedEventResponse >:: into)
305
+ . map_err( FromWidgetErrorResponse :: from_error) ,
306
+ ) ]
288
307
} ) ;
289
- request. then ( |result, _machine| {
290
- vec ! [ Self :: send_from_widget_response(
291
- raw_request,
292
- // This is mapped to another type because the update_delay_event::Response
293
- // does not impl Serialize
294
- result
295
- . map( Into :: <UpdateDelayedEventResponse >:: into)
296
- . map_err( FromWidgetErrorResponse :: from_error) ,
297
- ) ]
298
- } ) ;
299
308
300
- request_action. map ( |a| vec ! [ a] ) . unwrap_or_default ( )
309
+ vec ! [ request_action]
310
+ } )
311
+ . unwrap_or_default ( )
301
312
}
302
313
}
303
314
}
@@ -328,10 +339,9 @@ impl WidgetMachine {
328
339
let limit = limit. unwrap_or ( DEFAULT_EVENT_LIMIT ) ;
329
340
let request = ReadMessageLikeEventRequest { event_type, limit } ;
330
341
331
- let ( request, action) = self . send_matrix_driver_request ( request) ;
332
-
333
- request. then ( |result, machine| {
334
- let response = match & machine. capabilities {
342
+ self . send_matrix_driver_request ( request) . map ( |( request, action) | {
343
+ request. then ( |result, machine| {
344
+ let response = match & machine. capabilities {
335
345
CapabilitiesState :: Unset => Err ( FromWidgetErrorResponse :: from_string (
336
346
"Received read event request before capabilities negotiation" ,
337
347
) ) ,
@@ -348,10 +358,11 @@ impl WidgetMachine {
348
358
. map_err ( FromWidgetErrorResponse :: from_error) ,
349
359
} ;
350
360
351
- vec ! [ Self :: send_from_widget_response( raw_request, response) ]
352
- } ) ;
361
+ vec ! [ Self :: send_from_widget_response( raw_request, response) ]
362
+ } ) ;
353
363
354
- action
364
+ action
365
+ } )
355
366
}
356
367
357
368
ReadEventRequest :: ReadStateEvent { event_type, state_key } => {
@@ -375,14 +386,15 @@ impl WidgetMachine {
375
386
376
387
if allowed {
377
388
let request = ReadStateEventRequest { event_type, state_key } ;
378
- let ( request, action) = self . send_matrix_driver_request ( request) ;
379
- request. then ( |result, _machine| {
380
- let response = result
381
- . map ( |events| ReadEventResponse { events } )
382
- . map_err ( FromWidgetErrorResponse :: from_error) ;
383
- vec ! [ Self :: send_from_widget_response( raw_request, response) ]
384
- } ) ;
385
- action
389
+ self . send_matrix_driver_request ( request) . map ( |( request, action) | {
390
+ request. then ( |result, _machine| {
391
+ let response = result
392
+ . map ( |events| ReadEventResponse { events } )
393
+ . map_err ( FromWidgetErrorResponse :: from_error) ;
394
+ vec ! [ Self :: send_from_widget_response( raw_request, response) ]
395
+ } ) ;
396
+ action
397
+ } )
386
398
} else {
387
399
Some ( Self :: send_from_widget_error_string_response (
388
400
raw_request,
@@ -428,19 +440,19 @@ impl WidgetMachine {
428
440
) ) ;
429
441
}
430
442
431
- let ( request, action) = self . send_matrix_driver_request ( request) ;
432
-
433
- request. then ( |mut result, machine| {
434
- if let Ok ( r) = result. as_mut ( ) {
435
- r. set_room_id ( machine. room_id . clone ( ) ) ;
436
- }
437
- vec ! [ Self :: send_from_widget_response(
438
- raw_request,
439
- result. map_err( FromWidgetErrorResponse :: from_error) ,
440
- ) ]
441
- } ) ;
443
+ self . send_matrix_driver_request ( request) . map ( |( request, action) | {
444
+ request. then ( |mut result, machine| {
445
+ if let Ok ( r) = result. as_mut ( ) {
446
+ r. set_room_id ( machine. room_id . clone ( ) ) ;
447
+ }
448
+ vec ! [ Self :: send_from_widget_response(
449
+ raw_request,
450
+ result. map_err( FromWidgetErrorResponse :: from_error) ,
451
+ ) ]
452
+ } ) ;
442
453
443
- action
454
+ action
455
+ } )
444
456
}
445
457
446
458
#[ instrument( skip_all, fields( ?request_id) ) ]
@@ -582,17 +594,20 @@ impl WidgetMachine {
582
594
fn send_matrix_driver_request < T : MatrixDriverRequest > (
583
595
& mut self ,
584
596
request : T ,
585
- ) -> ( MatrixDriverRequestHandle < ' _ , T :: Response > , Option < Action > ) {
597
+ ) -> Option < ( MatrixDriverRequestHandle < ' _ , T :: Response > , Action ) > {
586
598
let request_id = Uuid :: new_v4 ( ) ;
587
599
let request_meta = MatrixDriverRequestMeta :: new ( ) ;
600
+
588
601
let Some ( meta) = self . pending_matrix_driver_requests . insert ( request_id, request_meta)
589
602
else {
590
603
warn ! ( "Reached limits of pending requests for matrix driver requests" ) ;
591
- return ( MatrixDriverRequestHandle :: null ( ) , None ) ;
604
+ return None ;
592
605
} ;
593
606
594
- let action = Action :: MatrixDriverRequest { request_id, data : request. into ( ) } ;
595
- ( MatrixDriverRequestHandle :: new ( meta) , Some ( action) )
607
+ Some ( (
608
+ MatrixDriverRequestHandle :: new ( meta) ,
609
+ Action :: MatrixDriverRequest { request_id, data : request. into ( ) } ,
610
+ ) )
596
611
}
597
612
598
613
fn negotiate_capabilities ( & mut self ) -> Vec < Action > {
@@ -601,28 +616,38 @@ impl WidgetMachine {
601
616
self . capabilities = CapabilitiesState :: Negotiating ;
602
617
603
618
let ( request, action) = self . send_to_widget_request ( RequestCapabilities { } ) ;
619
+
604
620
request. then ( |response, machine| {
605
621
let requested = response. capabilities ;
606
- let ( request, action) = machine. send_matrix_driver_request ( AcquireCapabilities {
607
- desired_capabilities : requested. clone ( ) ,
608
- } ) ;
609
622
610
- request. then ( |result, machine| {
611
- let approved = result. unwrap_or_else ( |e| {
612
- error ! ( "Acquiring capabilities failed: {e}" ) ;
613
- Capabilities :: default ( )
614
- } ) ;
623
+ if let Some ( ( request, action) ) =
624
+ machine. send_matrix_driver_request ( AcquireCapabilities {
625
+ desired_capabilities : requested. clone ( ) ,
626
+ } )
627
+ {
628
+ request. then ( |result, machine| {
629
+ let approved = result. unwrap_or_else ( |e| {
630
+ error ! ( "Acquiring capabilities failed: {e}" ) ;
631
+ Capabilities :: default ( )
632
+ } ) ;
615
633
616
- let subscribe_required = !approved. read . is_empty ( ) ;
617
- machine. capabilities = CapabilitiesState :: Negotiated ( approved. clone ( ) ) ;
634
+ let subscribe_required = !approved. read . is_empty ( ) ;
635
+ machine. capabilities = CapabilitiesState :: Negotiated ( approved. clone ( ) ) ;
618
636
619
- let update = NotifyCapabilitiesChanged { approved, requested } ;
620
- let ( _request, action) = machine. send_to_widget_request ( update) ;
637
+ let update = NotifyCapabilitiesChanged { approved, requested } ;
638
+ let ( _request, action) = machine. send_to_widget_request ( update) ;
621
639
622
- subscribe_required. then_some ( Action :: Subscribe ) . into_iter ( ) . chain ( action) . collect ( )
623
- } ) ;
640
+ subscribe_required
641
+ . then_some ( Action :: Subscribe )
642
+ . into_iter ( )
643
+ . chain ( action)
644
+ . collect ( )
645
+ } ) ;
624
646
625
- action. map ( |a| vec ! [ a] ) . unwrap_or_default ( )
647
+ vec ! [ action]
648
+ } else {
649
+ Vec :: new ( )
650
+ }
626
651
} ) ;
627
652
628
653
unsubscribe_required. then_some ( Action :: Unsubscribe ) . into_iter ( ) . chain ( action) . collect ( )
0 commit comments