11use crate :: js_worker:: { MainWorker , UserWorker } ;
22
3- use anyhow:: Error ;
3+ use anyhow:: { bail , Error } ;
44use hyper:: { Body , Request , Response } ;
55use log:: { debug, error} ;
66use std:: collections:: HashMap ;
@@ -11,7 +11,9 @@ use std::thread;
1111use tokio:: net:: UnixStream ;
1212use tokio:: sync:: RwLock ;
1313use tokio:: sync:: { mpsc, oneshot} ;
14+ use uuid:: Uuid ;
1415
16+ #[ derive( Debug ) ]
1517pub struct WorkerContext {
1618 handle : thread:: JoinHandle < Result < ( ) , Error > > ,
1719 request_sender : hyper:: client:: conn:: SendRequest < Body > ,
@@ -41,6 +43,10 @@ impl WorkerContext {
4143 let import_map_path = options. import_map_path ;
4244 let user_worker_msgs_tx = options. user_worker_msgs_tx ;
4345
46+ if ( !service_path. exists ( ) ) {
47+ return bail ! ( "main function does not exist {:?}" , & service_path) ;
48+ }
49+
4450 // create a unix socket pair
4551 let ( sender_stream, recv_stream) = UnixStream :: pair ( ) ?;
4652
@@ -90,6 +96,10 @@ impl WorkerContext {
9096 let import_map_path = options. import_map_path ;
9197 let env_vars = options. env_vars ;
9298
99+ if ( !service_path. exists ( ) ) {
100+ return bail ! ( "user function does not exist {:?}" , & service_path) ;
101+ }
102+
93103 // create a unix socket pair
94104 let ( sender_stream, recv_stream) = UnixStream :: pair ( ) ?;
95105
@@ -141,13 +151,16 @@ impl WorkerContext {
141151
142152#[ derive( Debug ) ]
143153pub struct CreateUserWorkerResult {
144- pub key : String ,
154+ pub key : Uuid ,
145155}
146156
147157#[ derive( Debug ) ]
148158pub enum UserWorkerMsgs {
149- Create ( UserWorkerOptions , oneshot:: Sender < CreateUserWorkerResult > ) ,
150- SendRequest ( String , Request < Body > , oneshot:: Sender < Response < Body > > ) ,
159+ Create (
160+ UserWorkerOptions ,
161+ oneshot:: Sender < Result < CreateUserWorkerResult , Error > > ,
162+ ) ,
163+ SendRequest ( Uuid , Request < Body > , oneshot:: Sender < Response < Body > > ) ,
151164}
152165
153166pub struct WorkerPool {
@@ -174,23 +187,24 @@ impl WorkerPool {
174187 let main_worker = Arc :: new ( RwLock :: new ( main_worker_ctx) ) ;
175188
176189 tokio:: spawn ( async move {
177- let mut user_workers: HashMap < String , Arc < RwLock < WorkerContext > > > = HashMap :: new ( ) ;
190+ let mut user_workers: HashMap < Uuid , Arc < RwLock < WorkerContext > > > = HashMap :: new ( ) ;
178191
179192 loop {
180193 match user_worker_msgs_rx. recv ( ) . await {
181194 None => break ,
182195 Some ( UserWorkerMsgs :: Create ( worker_options, tx) ) => {
183- let key = worker_options. service_path . display ( ) . to_string ( ) ;
184- if !user_workers. contains_key ( & key) {
185- // TODO: handle errors
186- let user_worker_ctx = WorkerContext :: new_user_worker ( worker_options)
187- . await
188- . unwrap ( ) ;
189- user_workers
190- . insert ( key. clone ( ) , Arc :: new ( RwLock :: new ( user_worker_ctx) ) ) ;
196+ let key = Uuid :: new_v4 ( ) ;
197+ let user_worker_ctx = WorkerContext :: new_user_worker ( worker_options) . await ;
198+ if !user_worker_ctx. is_err ( ) {
199+ user_workers. insert (
200+ key. clone ( ) ,
201+ Arc :: new ( RwLock :: new ( user_worker_ctx. unwrap ( ) ) ) ,
202+ ) ;
203+
204+ tx. send ( Ok ( CreateUserWorkerResult { key } ) ) ;
205+ } else {
206+ tx. send ( Err ( user_worker_ctx. unwrap_err ( ) ) ) ;
191207 }
192-
193- tx. send ( CreateUserWorkerResult { key } ) ;
194208 }
195209 Some ( UserWorkerMsgs :: SendRequest ( key, req, tx) ) => {
196210 // TODO: handle errors
0 commit comments