@@ -4,7 +4,7 @@ use bevy_app::{App, Plugin, Update};
44use  bevy_derive:: Deref ; 
55use  bevy_ecs:: { prelude:: * ,  world:: CommandQueue } ; 
66use  bevy_tasks:: IoTaskPool ; 
7- use  crossbeam_channel:: Receiver ; 
7+ use  crossbeam_channel:: { Receiver ,   Sender } ; 
88use  ehttp:: { Headers ,  Request ,  Response } ; 
99
1010use  crate :: prelude:: TypedRequest ; 
@@ -130,6 +130,27 @@ impl HttpClient {
130130        Self :: default ( ) 
131131    } 
132132
133+     /// his method is used to create a new `HttpClient` instance with `Entity`. 
134+      /// 
135+      /// # Arguments 
136+      /// 
137+      /// * `entity`: Target Entity 
138+      /// 
139+      /// returns: HttpClient 
140+      /// 
141+      /// # Examples 
142+      /// 
143+      /// ``` 
144+      /// let e = commands.spawn().id(); 
145+      /// let http_client = HttpClient::new_with_entity(e) 
146+      /// ``` 
147+      pub  fn  new_with_entity ( entity :  Entity )  -> Self  { 
148+         Self  { 
149+             from_entity :  Some ( entity) , 
150+             ..Default :: default ( ) 
151+         } 
152+     } 
153+ 
133154    /// This method is used to create a `GET` HTTP request. 
134155     /// 
135156     /// # Arguments 
@@ -489,12 +510,16 @@ impl HttpResponseError {
489510
490511/// task for ehttp response result 
491512#[ derive( Component ,  Debug ) ]  
492- pub  struct  RequestTask ( pub  Receiver < CommandQueue > ) ; 
513+ pub  struct  RequestTask  { 
514+     tx :  Sender < CommandQueue > , 
515+     rx :  Receiver < CommandQueue > , 
516+ } 
493517
494518fn  handle_request ( 
495519    mut  commands :  Commands , 
496520    mut  req_res :  ResMut < HttpClientSetting > , 
497521    mut  requests :  EventReader < HttpRequest > , 
522+     q_tasks :  Query < & RequestTask > , 
498523)  { 
499524    let  thread_pool = IoTaskPool :: get ( ) ; 
500525    for  request in  requests. read ( )  { 
@@ -505,7 +530,8 @@ fn handle_request(
505530            }  else  { 
506531                ( commands. spawn_empty ( ) . id ( ) ,  false ) 
507532            } ; 
508-             let  ( tx,  rx)  = crossbeam_channel:: bounded ( 1 ) ; 
533+ 
534+             let  tx = get_channel ( & mut  commands,  q_tasks,  entity) ; 
509535
510536            thread_pool
511537                . spawn ( async  move  { 
@@ -518,19 +544,20 @@ fn handle_request(
518544                                world
519545                                    . get_resource_mut :: < Events < HttpResponse > > ( ) 
520546                                    . unwrap ( ) 
521-                                     . send ( HttpResponse ( res) ) ; 
547+                                     . send ( HttpResponse ( res. clone ( ) ) ) ; 
548+                                 world. trigger_targets ( HttpResponse ( res) ,  entity) ; 
522549                            } 
523550                            Err ( e)  => { 
524551                                world
525552                                    . get_resource_mut :: < Events < HttpResponseError > > ( ) 
526553                                    . unwrap ( ) 
527554                                    . send ( HttpResponseError :: new ( e. to_string ( ) ) ) ; 
555+                                 world
556+                                     . trigger_targets ( HttpResponseError :: new ( e. to_string ( ) ) ,  entity) ; 
528557                            } 
529558                        } 
530559
531-                         if  has_from_entity { 
532-                             world. entity_mut ( entity) . remove :: < RequestTask > ( ) ; 
533-                         }  else  { 
560+                         if  !has_from_entity { 
534561                            world. entity_mut ( entity) . despawn ( ) ; 
535562                        } 
536563                    } ) ; 
@@ -539,19 +566,37 @@ fn handle_request(
539566                } ) 
540567                . detach ( ) ; 
541568
542-             commands. entity ( entity) . insert ( RequestTask ( rx) ) ; 
543569            req_res. current_clients  += 1 ; 
544570        } 
545571    } 
546572} 
547573
574+ fn  get_channel ( 
575+     commands :  & mut  Commands , 
576+     q_tasks :  Query < & RequestTask > , 
577+     entity :  Entity , 
578+ )  -> Sender < CommandQueue >  { 
579+     if  let  Ok ( task)  = q_tasks. get ( entity)  { 
580+         task. tx . clone ( ) 
581+     }  else  { 
582+         let  ( tx,  rx)  = crossbeam_channel:: bounded ( 5 ) ; 
583+ 
584+         commands. entity ( entity) . insert ( RequestTask  { 
585+             tx :  tx. clone ( ) , 
586+             rx :  rx. clone ( ) , 
587+         } ) ; 
588+ 
589+         tx
590+     } 
591+ } 
592+ 
548593fn  handle_tasks ( 
549594    mut  commands :  Commands , 
550595    mut  req_res :  ResMut < HttpClientSetting > , 
551596    mut  request_tasks :  Query < & RequestTask > , 
552597)  { 
553598    for  task in  request_tasks. iter_mut ( )  { 
554-         if  let  Ok ( mut  command_queue)  = task. 0 . try_recv ( )  { 
599+         if  let  Ok ( mut  command_queue)  = task. rx . try_recv ( )  { 
555600            commands. append ( & mut  command_queue) ; 
556601            req_res. current_clients  -= 1 ; 
557602        } 
0 commit comments