From f78986328738114f3593091fd0c7eeeb7e602b4f Mon Sep 17 00:00:00 2001 From: trivernis Date: Mon, 6 Dec 2021 20:55:17 +0100 Subject: [PATCH] Update rmp-ipc to bromine and reexport it Signed-off-by: trivernis --- mediarepo-api/.idea/discord.xml | 2 +- mediarepo-api/Cargo.toml | 12 ++-- mediarepo-api/src/client_api/error.rs | 2 +- mediarepo-api/src/client_api/file.rs | 35 +++++------- mediarepo-api/src/client_api/mod.rs | 56 +++++++------------ mediarepo-api/src/client_api/protocol.rs | 6 +- mediarepo-api/src/client_api/tag.rs | 28 +++------- mediarepo-api/src/lib.rs | 2 + .../src/tauri_plugin/commands/daemon.rs | 10 +--- .../src/tauri_plugin/commands/repo.rs | 3 +- mediarepo-api/src/tauri_plugin/error.rs | 2 +- mediarepo-api/src/tauri_plugin/state.rs | 7 +-- 12 files changed, 66 insertions(+), 99 deletions(-) diff --git a/mediarepo-api/.idea/discord.xml b/mediarepo-api/.idea/discord.xml index 30bab2a..d8e9561 100644 --- a/mediarepo-api/.idea/discord.xml +++ b/mediarepo-api/.idea/discord.xml @@ -1,7 +1,7 @@ - \ No newline at end of file diff --git a/mediarepo-api/Cargo.toml b/mediarepo-api/Cargo.toml index 86f77d5..8e684e1 100644 --- a/mediarepo-api/Cargo.toml +++ b/mediarepo-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mediarepo-api" -version = "0.12.0" +version = "0.13.0" edition = "2018" license = "gpl-3" @@ -10,7 +10,6 @@ license = "gpl-3" tracing = "0.1.29" thiserror = "1.0.30" async-trait = {version = "0.1.51", optional=true} -rmp-ipc = {version = "0.11.0", optional=true} parking_lot = {version="0.11.2", optional=true} serde_json = {version="1.0.68", optional=true} directories = {version="4.0.1", optional=true} @@ -19,6 +18,11 @@ serde_piecewise_default = "0.2.0" futures = {version = "0.3.17", optional=true} url = {version = "2.2.2", optional=true } +[dependencies.bromine] +version = "0.16.1" +optional = true +features = ["serialize_bincode"] + [dependencies.serde] version = "1.0.130" features = ["serde_derive"] @@ -43,5 +47,5 @@ version = "0.5.8" optional = true [features] -tauri-plugin = ["client-api","tauri", "rmp-ipc", "parking_lot", "serde_json", "tokio", "toml", "directories", "mime_guess", "futures", "url"] -client-api = ["rmp-ipc", "async-trait", "tokio"] \ No newline at end of file +tauri-plugin = ["client-api","tauri", "parking_lot", "serde_json", "tokio", "toml", "directories", "mime_guess", "futures", "url"] +client-api = ["bromine", "async-trait", "tokio"] \ No newline at end of file diff --git a/mediarepo-api/src/client_api/error.rs b/mediarepo-api/src/client_api/error.rs index 8634385..f5e9e05 100644 --- a/mediarepo-api/src/client_api/error.rs +++ b/mediarepo-api/src/client_api/error.rs @@ -5,7 +5,7 @@ pub type ApiResult = Result; #[derive(Debug, Error)] pub enum ApiError { #[error(transparent)] - IPC(#[from] rmp_ipc::error::Error), + IPC(#[from] bromine::error::Error), #[error("The servers api version (version {server:?}) is incompatible with the api client {client:?}")] VersionMismatch { server: String, client: String }, diff --git a/mediarepo-api/src/client_api/file.rs b/mediarepo-api/src/client_api/file.rs index 624ffe9..419289f 100644 --- a/mediarepo-api/src/client_api/file.rs +++ b/mediarepo-api/src/client_api/file.rs @@ -7,18 +7,15 @@ use crate::types::files::{ }; use crate::types::identifier::FileIdentifier; use async_trait::async_trait; -use rmp_ipc::context::{PoolGuard, PooledContext}; -use rmp_ipc::payload::{BytePayload, EventSendPayload}; -use rmp_ipc::prelude::*; +use bromine::context::{PoolGuard, PooledContext}; +use bromine::payload::BytePayload; +use bromine::prelude::*; -pub struct FileApi { - ctx: PooledContext, +pub struct FileApi { + ctx: PooledContext, } -impl Clone for FileApi -where - S: AsyncProtocolStream, -{ +impl Clone for FileApi { fn clone(&self) -> Self { Self { ctx: self.ctx.clone(), @@ -27,25 +24,19 @@ where } #[async_trait] -impl IPCApi for FileApi -where - S: AsyncProtocolStream, -{ +impl IPCApi for FileApi { fn namespace() -> &'static str { "files" } - fn ctx(&self) -> PoolGuard> { + fn ctx(&self) -> PoolGuard { self.ctx.acquire() } } -impl FileApi -where - S: AsyncProtocolStream, -{ +impl FileApi { /// Creates a new file api client - pub fn new(ctx: PooledContext) -> Self { + pub fn new(ctx: PooledContext) -> Self { Self { ctx } } @@ -84,7 +75,7 @@ where .emit_and_get("read_file", ReadFileRequest { id }) .await?; - Ok(payload.to_payload_bytes()?) + Ok(payload.into_inner()) } /// Returns a list of all thumbnails of the file @@ -105,7 +96,7 @@ where min_size: (u32, u32), max_size: (u32, u32), ) -> ApiResult<(ThumbnailMetadataResponse, Vec)> { - let payload: TandemPayload = self + let payload: TandemPayload, BytePayload> = self .emit_and_get( "get_thumbnail_of_size", GetFileThumbnailOfSizeRequest { @@ -117,7 +108,7 @@ where .await?; let (metadata, bytes) = payload.into_inner(); - Ok((metadata, bytes.into_inner())) + Ok((metadata.data(), bytes.into_inner())) } /// Updates a files name diff --git a/mediarepo-api/src/client_api/mod.rs b/mediarepo-api/src/client_api/mod.rs index 13de291..43b577b 100644 --- a/mediarepo-api/src/client_api/mod.rs +++ b/mediarepo-api/src/client_api/mod.rs @@ -8,34 +8,27 @@ use crate::client_api::file::FileApi; use crate::client_api::tag::TagApi; use crate::types::misc::{check_apis_compatible, get_api_version, InfoResponse}; use async_trait::async_trait; -use rmp_ipc::context::{PoolGuard, PooledContext}; -use rmp_ipc::ipc::context::Context; -use rmp_ipc::ipc::stream_emitter::EmitMetadata; -use rmp_ipc::payload::{EventReceivePayload, EventSendPayload}; -use rmp_ipc::prelude::{AsyncProtocolStream, AsyncStreamProtocolListener}; -use rmp_ipc::IPCBuilder; +use bromine::ipc::stream_emitter::EmitMetadata; +use bromine::prelude::*; use std::time::Duration; #[async_trait] -pub trait IPCApi { +pub trait IPCApi { fn namespace() -> &'static str; - fn ctx(&self) -> PoolGuard>; + fn ctx(&self) -> PoolGuard; - async fn emit( + async fn emit( &self, event_name: &str, data: T, ) -> ApiResult { let ctx = self.ctx(); - let meta = ctx - .emitter - .emit_to(Self::namespace(), event_name, data) - .await?; + let meta = ctx.emit_to(Self::namespace(), event_name, data).await?; Ok(meta) } - async fn emit_and_get( + async fn emit_and_get( &self, event_name: &str, data: T, @@ -43,19 +36,16 @@ pub trait IPCApi { let meta = self.emit(event_name, data).await?; let response = meta.await_reply(&self.ctx()).await?; - Ok(response.data()?) + Ok(response.payload()?) } } -pub struct ApiClient { - ctx: PooledContext, - pub file: FileApi, - pub tag: TagApi, +pub struct ApiClient { + ctx: PooledContext, + pub file: FileApi, + pub tag: TagApi, } -impl Clone for ApiClient -where - L: AsyncStreamProtocolListener, -{ +impl Clone for ApiClient { fn clone(&self) -> Self { Self { ctx: self.ctx.clone(), @@ -65,12 +55,9 @@ where } } -impl ApiClient -where - L: AsyncStreamProtocolListener, -{ +impl ApiClient { /// Creates a new client from an existing ipc context - pub fn new(ctx: PooledContext) -> Self { + pub fn new(ctx: PooledContext) -> Self { Self { file: FileApi::new(ctx.clone()), tag: TagApi::new(ctx.clone()), @@ -80,7 +67,9 @@ where /// Connects to the ipc Socket #[tracing::instrument(level = "debug")] - pub async fn connect(address: L::AddressType) -> ApiResult { + pub async fn connect( + address: L::AddressType, + ) -> ApiResult { let ctx = IPCBuilder::::new() .address(address) .timeout(Duration::from_secs(10)) @@ -109,13 +98,8 @@ where #[tracing::instrument(level = "debug", skip(self))] pub async fn info(&self) -> ApiResult { let ctx = self.ctx.acquire(); - let res = ctx - .emitter - .emit("info", ()) - .await? - .await_reply(&ctx) - .await?; - Ok(res.data::()?) + let res = ctx.emit("info", ()).await?.await_reply(&ctx).await?; + Ok(res.payload::()?) } #[tracing::instrument(level = "debug", skip(self))] diff --git a/mediarepo-api/src/client_api/protocol.rs b/mediarepo-api/src/client_api/protocol.rs index 924ee65..d51370e 100644 --- a/mediarepo-api/src/client_api/protocol.rs +++ b/mediarepo-api/src/client_api/protocol.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; -use rmp_ipc::error::Result; -use rmp_ipc::prelude::IPCResult; -use rmp_ipc::protocol::*; +use bromine::error::Result; +use bromine::prelude::IPCResult; +use bromine::protocol::*; use std::io::Error; use std::net::ToSocketAddrs; use std::pin::Pin; diff --git a/mediarepo-api/src/client_api/tag.rs b/mediarepo-api/src/client_api/tag.rs index 0a77859..6541b6a 100644 --- a/mediarepo-api/src/client_api/tag.rs +++ b/mediarepo-api/src/client_api/tag.rs @@ -4,18 +4,14 @@ use crate::types::files::{GetFileTagsRequest, GetFilesTagsRequest}; use crate::types::identifier::FileIdentifier; use crate::types::tags::{ChangeFileTagsRequest, TagResponse}; use async_trait::async_trait; -use rmp_ipc::context::{PoolGuard, PooledContext}; -use rmp_ipc::ipc::context::Context; -use rmp_ipc::protocol::AsyncProtocolStream; +use bromine::context::{PoolGuard, PooledContext}; +use bromine::ipc::context::Context; -pub struct TagApi { - ctx: PooledContext, +pub struct TagApi { + ctx: PooledContext, } -impl Clone for TagApi -where - S: AsyncProtocolStream, -{ +impl Clone for TagApi { fn clone(&self) -> Self { Self { ctx: self.ctx.clone(), @@ -24,24 +20,18 @@ where } #[async_trait] -impl IPCApi for TagApi -where - S: AsyncProtocolStream, -{ +impl IPCApi for TagApi { fn namespace() -> &'static str { "tags" } - fn ctx(&self) -> PoolGuard> { + fn ctx(&self) -> PoolGuard { self.ctx.acquire() } } -impl TagApi -where - S: AsyncProtocolStream, -{ - pub fn new(ctx: PooledContext) -> Self { +impl TagApi { + pub fn new(ctx: PooledContext) -> Self { Self { ctx } } diff --git a/mediarepo-api/src/lib.rs b/mediarepo-api/src/lib.rs index 0d2a12b..aa1587a 100644 --- a/mediarepo-api/src/lib.rs +++ b/mediarepo-api/src/lib.rs @@ -8,3 +8,5 @@ pub mod daemon_management; #[cfg(feature = "tauri-plugin")] pub mod tauri_plugin; + +pub use bromine; diff --git a/mediarepo-api/src/tauri_plugin/commands/daemon.rs b/mediarepo-api/src/tauri_plugin/commands/daemon.rs index 5dc67f7..3a539bf 100644 --- a/mediarepo-api/src/tauri_plugin/commands/daemon.rs +++ b/mediarepo-api/src/tauri_plugin/commands/daemon.rs @@ -1,7 +1,7 @@ use crate::tauri_plugin::commands::AppAccess; use crate::tauri_plugin::error::PluginResult; -use rmp_ipc::prelude::{IPCError, IPCResult}; -use rmp_ipc::IPCBuilder; +use bromine::prelude::{IPCError, IPCResult}; +use bromine::IPCBuilder; use std::io::ErrorKind; use std::net::{SocketAddr, ToSocketAddrs}; use tokio::net::TcpListener; @@ -43,11 +43,7 @@ async fn try_connect_daemon(address: String) -> IPCResult<()> { .address(address) .build_client() .await?; - ctx.emitter - .emit("info", ()) - .await? - .await_reply(&ctx) - .await?; + ctx.emit("info", ()).await?.await_reply(&ctx).await?; ctx.stop().await?; Ok(()) } diff --git a/mediarepo-api/src/tauri_plugin/commands/repo.rs b/mediarepo-api/src/tauri_plugin/commands/repo.rs index b17f625..d54af95 100644 --- a/mediarepo-api/src/tauri_plugin/commands/repo.rs +++ b/mediarepo-api/src/tauri_plugin/commands/repo.rs @@ -1,3 +1,4 @@ +use crate::client_api::protocol::ApiProtocolListener; use crate::client_api::ApiClient; use crate::tauri_plugin::commands::{ApiAccess, AppAccess}; use crate::tauri_plugin::error::{PluginError, PluginResult}; @@ -165,7 +166,7 @@ pub async fn select_repository( .ok_or_else(|| PluginError::from("Missing repo path or address in config."))?; get_repo_address(path).await? }; - let client = ApiClient::connect(address).await?; + let client = ApiClient::connect::(address).await?; api_state.set_api(client).await; let mut active_repo = app_state.active_repo.write().await; diff --git a/mediarepo-api/src/tauri_plugin/error.rs b/mediarepo-api/src/tauri_plugin/error.rs index 5547863..01b21c7 100644 --- a/mediarepo-api/src/tauri_plugin/error.rs +++ b/mediarepo-api/src/tauri_plugin/error.rs @@ -1,6 +1,6 @@ use crate::client_api::error::ApiError; use crate::daemon_management::error::DaemonError; -use rmp_ipc::error::Error; +use bromine::error::Error; use serde::Serialize; use std::fmt::{Display, Formatter}; diff --git a/mediarepo-api/src/tauri_plugin/state.rs b/mediarepo-api/src/tauri_plugin/state.rs index 890437a..e59bb01 100644 --- a/mediarepo-api/src/tauri_plugin/state.rs +++ b/mediarepo-api/src/tauri_plugin/state.rs @@ -9,14 +9,13 @@ use parking_lot::RwLock as ParkingRwLock; use tauri::async_runtime::RwLock; use tokio::time::Instant; -use crate::client_api::protocol::ApiProtocolListener; use crate::client_api::ApiClient; use crate::daemon_management::cli::DaemonCli; use crate::tauri_plugin::error::{PluginError, PluginResult}; use crate::tauri_plugin::settings::{load_settings, Repository, Settings}; pub struct ApiState { - inner: Arc>>>, + inner: Arc>>, } unsafe impl Send for ApiState {} @@ -30,7 +29,7 @@ impl ApiState { } /// Sets the active api client and disconnects the old one - pub async fn set_api(&self, client: ApiClient) { + pub async fn set_api(&self, client: ApiClient) { let mut inner = self.inner.write().await; let old_client = mem::replace(&mut *inner, Some(client)); @@ -49,7 +48,7 @@ impl ApiState { } } - pub async fn api(&self) -> PluginResult> { + pub async fn api(&self) -> PluginResult { let inner = self.inner.read().await; inner .clone()