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