1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use crate::relay::{RelayMessage, WorkerRelay};
use crate::{Context, Executor, Mailbox, NodeMessage};
use ockam_core::compat::sync::Arc;
use ockam_core::Address;
use tokio::runtime::Runtime;
use tokio::sync::mpsc::{channel, Sender};
use tracing_subscriber::{filter::LevelFilter, fmt, EnvFilter};

/// A minimal worker implementation that does nothing
pub struct NullWorker;

impl NullWorker {
    /// Create and register a new NullWorker context
    pub fn new(
        rt: Arc<Runtime>,
        addr: &Address,
        tx: Sender<NodeMessage>,
    ) -> (Context, Sender<RelayMessage>) {
        // Create a new Mailbox and Context
        let (mb_tx, mb_rx) = channel(32);
        let mb = Mailbox::new(mb_rx);

        (Context::new(rt, tx, addr.into(), mb), mb_tx)
    }
}

impl ockam_core::Worker for NullWorker {
    type Context = Context;
    type Message = (); // This message type is never used
}

/// Start a node
pub fn start_node() -> (Context, Executor) {
    setup_tracing();

    info!("Initializing ockam node");

    let mut exe = Executor::new();
    let addr = "app".into();

    // The root application worker needs a mailbox and relay to accept
    // messages from workers, and to buffer incoming transcoded data.
    let (ctx, mb_tx) = NullWorker::new(exe.runtime(), &addr, exe.sender());

    // Build a mailbox worker to buffer messages
    let sender = WorkerRelay::<NullWorker, _>::build_root(&exe.runtime(), mb_tx);

    // Register this mailbox handle with the executor
    exe.initialize_system("app", sender);

    (ctx, exe)
}

/// Utility to setup tracing-subscriber from the environment
fn setup_tracing() {
    #[cfg(feature = "std")]
    {
        let filter = EnvFilter::try_from_env("OCKAM_LOG").unwrap_or_else(|_| {
            EnvFilter::default()
                .add_directive(LevelFilter::INFO.into())
                .add_directive("ockam_node=info".parse().unwrap())
        });

        if fmt().with_env_filter(filter).try_init().is_err() {
            debug!("Failed to initialise tracing_subscriber.  Is an instance already running?");
        }
    }
}