orinium_browser/
process.rs1use crate::platform::network::{NetworkCommand, NetworkMessage};
2use ipc_channel::ipc::{self, IpcSender};
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize)]
6pub struct ChildChannels<R, S> {
7 pub cmd_rx: ipc::IpcReceiver<R>,
8 pub msg_tx: ipc::IpcSender<S>,
9}
10
11#[derive(Serialize, Deserialize)]
12pub struct ParentChannels<R, S> {
13 pub cmd_tx: ipc::IpcSender<R>,
14 pub msg_rx: ipc::IpcReceiver<S>,
15}
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq)]
18pub enum ProcessType {
19 Network,
20}
21
22#[derive(Debug, Clone, PartialEq, Eq)]
23pub struct ProcessHandler {
24 kind: ProcessType,
25 name: String,
26}
27
28impl ProcessHandler {
29 pub fn current() -> Option<Self> {
30 let kind = std::env::args().find_map(|arg| match arg.strip_prefix("--type=")? {
31 "network" => Some(ProcessType::Network),
32 _ => None,
33 })?;
34
35 let mut name = None;
36 let mut args = std::env::args();
37 while let Some(arg) = args.next() {
38 if arg == "--child" {
39 name = Some(args.next()?);
40 }
41 }
42 let name = name?;
43
44 Some(Self { kind, name })
45 }
46
47 pub fn handle(self) -> ! {
48 match self.kind {
49 ProcessType::Network => {
50 network_process_main(self.name);
51 }
52 }
53 }
54}
55
56fn network_process_main(name: String) -> ! {
57 log::info!(target: "network", "network process started (pid={})", std::process::id());
58 let (cmd_tx, cmd_rx) = ipc::channel::<NetworkCommand>()
59 .inspect_err(|err| {
60 log::error!(target: "NetworkProcess", "Failed to create IPC channel: {err}");
61 })
62 .expect("failed to create network IPC channel");
63 let (msg_tx, msg_rx) = ipc::channel::<NetworkMessage>()
64 .inspect_err(|err| {
65 log::error!(target: "NetworkProcess", "Failed to create IPC channel: {err}");
66 })
67 .expect("failed to create network IPC channel");
68
69 let tx: IpcSender<ParentChannels<NetworkCommand, NetworkMessage>> = IpcSender::connect(name)
70 .inspect_err(|err| {
71 log::error!(
72 target: "NetworkProcess",
73 "Failed to connect to parent IPC channel: {err}"
74 );
75 })
76 .expect("failed to connect to parent IPC channel");
77 tx.send(ParentChannels { cmd_tx, msg_rx })
78 .inspect_err(|err| {
79 log::error!(
80 target: "NetworkProcess",
81 "Failed to send IPC channels to parent process: {err}"
82 );
83 })
84 .expect("failed to send IPC channels to parent process");
85
86 crate::platform::network::network_main(cmd_rx, msg_tx)
87}