sans-io-runtime 0.3.0

An opinionated SANS-IO runtime for SDN and media servers
Documentation
use std::{
    sync::{
        atomic::{AtomicBool, Ordering},
        Arc,
    },
    time::Duration,
};

use sans_io_runtime::{backend::PollingBackend, Controller};
use sfu::{ChannelId, ExtIn, ExtOut, ICfg, OwnerType, SCfg, SfuEvent, SfuWorker};
mod http;
mod sfu;

fn main() {
    if std::env::var_os("RUST_LOG").is_none() {
        std::env::set_var("RUST_LOG", "info");
    }
    env_logger::builder().format_timestamp_millis().init();

    let mut server = http::SimpleHttpServer::new(8080);
    let mut controller = Controller::<ExtIn, ExtOut, SCfg, ChannelId, SfuEvent, 128>::default();
    controller.add_worker::<OwnerType, _, SfuWorker, PollingBackend<_, 128, 512>>(
        Duration::from_millis(100),
        ICfg {
            udp_addr: "127.0.0.1:0".parse().unwrap(),
        },
        None,
    );
    controller.add_worker::<OwnerType, _, SfuWorker, PollingBackend<_, 128, 512>>(
        Duration::from_millis(100),
        ICfg {
            udp_addr: "127.0.0.1:0".parse().unwrap(),
        },
        None,
    );

    let mut shutdown_count = 0;
    let term = Arc::new(AtomicBool::new(false));
    signal_hook::flag::register(signal_hook::consts::SIGINT, Arc::clone(&term))
        .expect("Should register hook");

    while let Ok(req) = server.recv(Duration::from_millis(100)) {
        if controller.process().is_none() {
            break;
        }
        if term.load(Ordering::Relaxed) {
            if shutdown_count == 0 {
                controller.shutdown();
            }
            shutdown_count += 1;
            if shutdown_count > 10 {
                log::warn!("Shutdown timeout => force shutdown");
                break;
            }
        }
        while let Some(ext) = controller.pop_event() {
            match ext {
                ExtOut::HttpResponse(resp) => {
                    server.send_response(resp);
                }
            }
        }
        if let Some(req) = req {
            controller.spawn(SCfg::HttpRequest(req));
        }
    }

    log::info!("Server shutdown");
}