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    let (cmd_tx, cmd_rx) = ipc::channel::<NetworkCommand>()
58        .inspect_err(|err| {
59            log::error!(target: "NetworkProcess", "Failed to create IPC channel: {err}");
60        })
61        .expect("failed to create network IPC channel");
62    let (msg_tx, msg_rx) = ipc::channel::<NetworkMessage>()
63        .inspect_err(|err| {
64            log::error!(target: "NetworkProcess", "Failed to create IPC channel: {err}");
65        })
66        .expect("failed to create network IPC channel");
67
68    let tx: IpcSender<ParentChannels<NetworkCommand, NetworkMessage>> = IpcSender::connect(name)
69        .inspect_err(|err| {
70            log::error!(
71                target: "NetworkProcess",
72                "Failed to connect to parent IPC channel: {err}"
73            );
74        })
75        .expect("failed to connect to parent IPC channel");
76    tx.send(ParentChannels { cmd_tx, msg_rx })
77        .inspect_err(|err| {
78            log::error!(
79                target: "NetworkProcess",
80                "Failed to send IPC channels to parent process: {err}"
81            );
82        })
83        .expect("failed to send IPC channels to parent process");
84
85    loop {
86        crate::platform::network::network_main(cmd_rx, msg_tx);
87    }
88}