makepad_studio/build_manager/
build_client.rs

1#![allow(unused_imports)]
2#![allow(unused_variables)]
3#![allow(dead_code)]
4
5use {
6    crate::{
7        makepad_micro_serde::*,
8        makepad_file_server::FileSystemRoots,
9        makepad_platform::{*, cx_stdin::aux_chan},
10        build_manager::{
11            build_protocol::{BuildCmd, BuildCmdWrap, BuildClientMessageWrap, LogItem},
12            build_server::{BuildConnection, BuildServer},
13        }
14    },
15    std::{
16        path::Path,
17        io::{Read, Write},
18        net::{TcpListener, TcpStream},
19        sync::mpsc::{self, Receiver, Sender, TryRecvError},
20        thread,
21        env,
22        path::PathBuf
23    },
24};
25
26pub struct BuildClient{
27    pub cmd_sender: Sender<BuildCmdWrap>,
28    pub msg_signal: SignalToUI,
29    pub msg_receiver: Receiver<BuildClientMessageWrap>,
30}
31 
32impl BuildClient {
33
34    #[cfg(not(target_arch = "wasm32"))]
35    pub fn send_cmd_with_id(&self, cmd_id: LiveId, cmd: BuildCmd){
36        self.cmd_sender.send(BuildCmdWrap{
37            cmd_id,
38            cmd
39        }).unwrap();
40    }
41    
42    #[cfg(target_arch = "wasm32")]
43    pub fn send_cmd_with_id(&self, cmd_id: BuildCmdId, cmd: BuildCmd){}
44     
45    #[cfg(target_arch = "wasm32")]
46    pub fn new_with_local_server(_ubdir:&str) -> Self {
47        let (cmd_sender, _cmd_receiver) = mpsc::channel();
48        let msg_signal = LiveId::unique().into();
49        let (_msg_sender, msg_receiver) = mpsc::channel();
50        Self {
51            cmd_sender,
52            msg_signal,
53            msg_receiver,
54        }
55    }
56    
57    #[cfg(not(target_arch = "wasm32"))]
58    pub fn new_with_local_server(roots:FileSystemRoots) -> Self {
59        let (cmd_sender, cmd_receiver) = mpsc::channel();
60        let msg_signal = SignalToUI::new();
61        let (msg_sender, msg_receiver) = mpsc::channel();
62        /*
63        let mut root = "./".to_string();
64        for arg in std::env::args(){
65            if let Some(prefix) = arg.strip_prefix("--root="){
66                root = prefix.to_string();
67                break;
68            }
69        }
70        let base_path = env::current_dir().unwrap().join(root);
71        let final_path = base_path.join(subdir.split('/').collect::<PathBuf>());
72        */
73        let mut server = BuildServer::new(roots);
74        spawn_local_cmd_handler(
75            cmd_receiver,
76            server.connect(Box::new({
77                let msg_sender = msg_sender.clone();
78                let msg_signal = msg_signal.clone();
79                move | msg_item:BuildClientMessageWrap | {
80                    msg_sender.send(msg_item).unwrap();
81                    msg_signal.set()
82                }
83            })),
84        );
85        /*spawn_connection_listener(TcpListener::bind("127.0.0.1:0").unwrap(), server);*/
86        
87        Self {
88            cmd_sender,
89            msg_signal,
90            msg_receiver,
91        }
92    }
93    
94}
95/*
96fn spawn_connection_listener(listener: TcpListener, mut server: BuildServer) {
97    thread::spawn(move || {
98        log!("Builder Server listening on {}", listener.local_addr().unwrap());
99        for stream in listener.incoming() {
100            let stream = stream.unwrap();
101            log!("Builder Incoming connection from {}", stream.peer_addr().unwrap());
102            let (msg_sender, msg_receiver) = mpsc::channel();
103            let connection = server.connect(Box::new({
104                let msg_sender = msg_sender.clone();
105                move | msg | {
106                    msg_sender.send(msg).unwrap();
107                }
108            }));
109            spawn_remote_cmd_handler(
110                connection,
111                stream.try_clone().unwrap(),
112            );
113            spawn_msg_sender(msg_receiver, stream);
114        }
115    });
116}*/
117/*
118fn spawn_remote_cmd_handler(
119    connection: BuildConnection,
120    mut stream: TcpStream,
121) {
122    thread::spawn(move || loop {
123        let mut len_bytes = [0; 4];
124        stream.read_exact(&mut len_bytes).unwrap();
125        let len = u32::from_be_bytes(len_bytes);
126        let mut request_bytes = vec![0; len as usize];
127        stream.read_exact(&mut request_bytes).unwrap();
128        
129        let cmd = DeBin::deserialize_bin(request_bytes.as_slice()).unwrap();
130        
131        connection.handle_cmd(cmd);
132    });
133}*/
134/*
135fn spawn_msg_sender(
136    msg_receiver: Receiver<BuildMsgWrap>,
137    mut stream: TcpStream,
138) {
139    thread::spawn(move || loop {
140        let msg = msg_receiver.recv().unwrap();
141        let mut msg_bytes = Vec::new();
142        
143        msg.ser_bin(&mut msg_bytes);
144        
145        let len_bytes = msg_bytes.len().to_be_bytes();
146        stream.write_all(&len_bytes).unwrap();
147        stream.write_all(&msg_bytes).unwrap();
148    });
149}
150
151fn _spawn_cmd_sender(cmd_receiver: Receiver<BuildCmdWrap>, mut stream: TcpStream) {
152    thread::spawn(move || loop {
153        let cmd = cmd_receiver.recv().unwrap();
154        let mut cmd_bytes = Vec::new();
155        cmd.ser_bin(&mut cmd_bytes);
156        let len_bytes = cmd_bytes.len().to_be_bytes();
157        stream.write_all(&len_bytes).unwrap();
158        stream.write_all(&cmd_bytes).unwrap();
159    });
160}
161
162fn _spawn_msg_receiver(
163    mut stream: TcpStream,
164    msg_signal: Signal,
165    msg_sender: Sender<BuildMsgWrap>,
166) {
167    thread::spawn(move || loop {
168        let mut len_bytes = [0; 4];
169        stream.read_exact(&mut len_bytes).unwrap();
170        
171        let len = u32::from_be_bytes(len_bytes);
172        let mut msg_bytes = vec![0; len as usize];
173        stream.read_exact(&mut msg_bytes).unwrap();
174        
175        let msg = DeBin::deserialize_bin(msg_bytes.as_slice()).unwrap();
176        
177        msg_sender.send(msg).unwrap();
178        msg_signal.set()
179    });
180}
181*/
182fn spawn_local_cmd_handler(
183    cmd_receiver: Receiver<BuildCmdWrap>,
184    connection: BuildConnection,
185) {
186    thread::spawn(move || while let Ok(cmd) = cmd_receiver.recv() {
187        connection.handle_cmd(cmd);
188    });
189}