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_platform::{*, cx_stdin::aux_chan},
9 build_manager::{
10 build_protocol::{BuildCmd, BuildCmdWrap, LogItemWrap, BuildCmdId},
11 build_server::{BuildConnection, BuildServer},
12 }
13 },
14 std::{
15 io::{Read, Write},
16 net::{TcpListener, TcpStream},
17 sync::mpsc::{self, Receiver, Sender, TryRecvError},
18 thread,
19 env,
20 path::PathBuf
21 },
22};
23
24pub struct BuildClient{
25 pub cmd_sender: Sender<BuildCmdWrap>,
26 pub log_signal: Signal,
27 pub log_receiver: Receiver<LogItemWrap>,
28}
29
30impl BuildClient {
31
32 #[cfg(not(target_arch = "wasm32"))]
33 pub fn send_cmd(&self, cmd: BuildCmd)->BuildCmdId{
34 let cmd_id = BuildCmdId(LiveId::unique().0);
35 self.cmd_sender.send(BuildCmdWrap{
36 cmd_id,
37 cmd
38 }).unwrap();
39 cmd_id
40 }
41
42 #[cfg(not(target_arch = "wasm32"))]
43 pub fn send_cmd_with_id(&self, cmd_id: BuildCmdId, cmd: BuildCmd){
44 self.cmd_sender.send(BuildCmdWrap{
45 cmd_id,
46 cmd
47 }).unwrap();
48 }
49
50 #[cfg(target_arch = "wasm32")]
51 pub fn send_cmd(&self, _cmd: BuildCmd) ->BuildCmdId{
52 BuildCmdId(LiveId::unique().0)
53 }
54
55 #[cfg(target_arch = "wasm32")]
56 pub fn send_cmd_with_id(&self, cmd_id: BuildCmdId, cmd: BuildCmd){}
57
58 pub fn handle_event(&mut self, cx: &mut Cx, event: &Event) -> Vec<LogItemWrap> {
59 let mut a = Vec::new();
60 self.handle_event_with(cx, event, &mut | _, v | a.push(v));
61 a
62 }
63
64 pub fn handle_event_with(&mut self, cx: &mut Cx, event: &Event, dispatch_msg: &mut dyn FnMut(&mut Cx, LogItemWrap)) {
65 match event {
66 Event::Signal=>{
67 loop {
68 match self.log_receiver.try_recv() {
69 Ok(msg) => dispatch_msg(cx, msg),
70 Err(TryRecvError::Empty) => break,
71 _ => panic!(),
72 }
73 }
74 }
75 _ => {}
76 }
77 }
78
79 #[cfg(target_arch = "wasm32")]
80 pub fn new_with_local_server(_ubdir:&str) -> Self {
81 let (cmd_sender, _cmd_receiver) = mpsc::channel();
82 let msg_signal = LiveId::unique().into();
83 let (_msg_sender, msg_receiver) = mpsc::channel();
84 Self {
85 cmd_sender,
86 msg_signal,
87 msg_receiver,
88 }
89 }
90
91 #[cfg(not(target_arch = "wasm32"))]
92 pub fn new_with_local_server(subdir:&str) -> Self {
93 let (cmd_sender, cmd_receiver) = mpsc::channel();
94 let log_signal = Signal::new();
95 let (log_sender, log_receiver) = mpsc::channel();
96
97 let base_path = env::current_dir().unwrap();
98 let final_path = base_path.join(subdir.split('/').collect::<PathBuf>());
99
100 let mut server = BuildServer::new(final_path);
101 spawn_local_cmd_handler(
102 cmd_receiver,
103 server.connect(Box::new({
104 let log_sender = log_sender.clone();
105 let log_signal = log_signal.clone();
106 move | log_item | {
107 log_sender.send(log_item).unwrap();
108 log_signal.set()
109 }
110 })),
111 );
112 /*spawn_connection_listener(TcpListener::bind("127.0.0.1:0").unwrap(), server);*/
113
114 Self {
115 cmd_sender,
116 log_signal,
117 log_receiver,
118 }
119 }
120
121}
122/*
123fn spawn_connection_listener(listener: TcpListener, mut server: BuildServer) {
124 thread::spawn(move || {
125 log!("Builder Server listening on {}", listener.local_addr().unwrap());
126 for stream in listener.incoming() {
127 let stream = stream.unwrap();
128 log!("Builder Incoming connection from {}", stream.peer_addr().unwrap());
129 let (msg_sender, msg_receiver) = mpsc::channel();
130 let connection = server.connect(Box::new({
131 let msg_sender = msg_sender.clone();
132 move | msg | {
133 msg_sender.send(msg).unwrap();
134 }
135 }));
136 spawn_remote_cmd_handler(
137 connection,
138 stream.try_clone().unwrap(),
139 );
140 spawn_msg_sender(msg_receiver, stream);
141 }
142 });
143}*/
144/*
145fn spawn_remote_cmd_handler(
146 connection: BuildConnection,
147 mut stream: TcpStream,
148) {
149 thread::spawn(move || loop {
150 let mut len_bytes = [0; 4];
151 stream.read_exact(&mut len_bytes).unwrap();
152 let len = u32::from_be_bytes(len_bytes);
153 let mut request_bytes = vec![0; len as usize];
154 stream.read_exact(&mut request_bytes).unwrap();
155
156 let cmd = DeBin::deserialize_bin(request_bytes.as_slice()).unwrap();
157
158 connection.handle_cmd(cmd);
159 });
160}*/
161/*
162fn spawn_msg_sender(
163 msg_receiver: Receiver<BuildMsgWrap>,
164 mut stream: TcpStream,
165) {
166 thread::spawn(move || loop {
167 let msg = msg_receiver.recv().unwrap();
168 let mut msg_bytes = Vec::new();
169
170 msg.ser_bin(&mut msg_bytes);
171
172 let len_bytes = msg_bytes.len().to_be_bytes();
173 stream.write_all(&len_bytes).unwrap();
174 stream.write_all(&msg_bytes).unwrap();
175 });
176}
177
178fn _spawn_cmd_sender(cmd_receiver: Receiver<BuildCmdWrap>, mut stream: TcpStream) {
179 thread::spawn(move || loop {
180 let cmd = cmd_receiver.recv().unwrap();
181 let mut cmd_bytes = Vec::new();
182 cmd.ser_bin(&mut cmd_bytes);
183 let len_bytes = cmd_bytes.len().to_be_bytes();
184 stream.write_all(&len_bytes).unwrap();
185 stream.write_all(&cmd_bytes).unwrap();
186 });
187}
188
189fn _spawn_msg_receiver(
190 mut stream: TcpStream,
191 msg_signal: Signal,
192 msg_sender: Sender<BuildMsgWrap>,
193) {
194 thread::spawn(move || loop {
195 let mut len_bytes = [0; 4];
196 stream.read_exact(&mut len_bytes).unwrap();
197
198 let len = u32::from_be_bytes(len_bytes);
199 let mut msg_bytes = vec![0; len as usize];
200 stream.read_exact(&mut msg_bytes).unwrap();
201
202 let msg = DeBin::deserialize_bin(msg_bytes.as_slice()).unwrap();
203
204 msg_sender.send(msg).unwrap();
205 msg_signal.set()
206 });
207}
208*/
209fn spawn_local_cmd_handler(
210 cmd_receiver: Receiver<BuildCmdWrap>,
211 connection: BuildConnection,
212) {
213 thread::spawn(move || while let Ok(cmd) = cmd_receiver.recv() {
214 connection.handle_cmd(cmd);
215 });
216}