selene-daemon 0.9.0-alpha.2

Official music player daemon for Selene
Documentation
use std::{io, net};

use interprocess::local_socket::{self, GenericNamespaced, ToNsName};
use thiserror::Error;

use crate::{
    ConnectionType,
    common::{HandshakeError, Stream},
    cpal_thread::PlaybackError,
};

pub type ServerHandle = Box<dyn Stream>;

pub mod audio_client;
pub mod session_client;

pub mod method_client;

#[derive(Debug, Error)]
pub enum ConnectError {
    #[error("Io: {0}")]
    Io(#[from] io::Error),

    #[error("Handshake error: {0}")]
    HandshakeError(#[from] HandshakeError),

    /// CPAL Handle failed. This can only happen to audio connections
    #[error("Playback error: {0}")]
    PlaybackError(#[from] PlaybackError),
}

impl ConnectionType {
    pub(crate) fn connect(&self) -> io::Result<ServerHandle> {
        let stream: ServerHandle = match self {
            ConnectionType::Local(socket) => {
                let name = socket.as_str().to_ns_name::<GenericNamespaced>()?;
                let stream = local_socket::ConnectOptions::new()
                    .name(name)
                    .connect_sync()?;
                Box::new(stream)
            }
            ConnectionType::Remote(socket_addr) => {
                let stream = net::TcpStream::connect(socket_addr)?;
                Box::new(stream)
            }
        };

        Ok(stream)
    }
}