Skip to main content

orinium_browser/
process.rs

1use 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}