Update rmp-ipc

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/4/head
trivernis 3 years ago
parent d3ba1152ac
commit 19efd2f7d7

@ -873,7 +873,6 @@ dependencies = [
"chrono", "chrono",
"mediarepo-core", "mediarepo-core",
"mediarepo-model", "mediarepo-model",
"rmp-ipc",
"serde", "serde",
"tokio", "tokio",
] ]
@ -1412,9 +1411,9 @@ dependencies = [
[[package]] [[package]]
name = "rmp-ipc" name = "rmp-ipc"
version = "0.4.3" version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2ada2c7329ea55e1e80f2a1ae9ddb123f93ae4b349d493273138118feadfecb" checksum = "20fd9347d94995cc197ef2267a8c6b82f4519d3cb5c333caf57edb1376077dd1"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"log", "log",

@ -1034,9 +1034,9 @@ dependencies = [
[[package]] [[package]]
name = "rmp-ipc" name = "rmp-ipc"
version = "0.4.0" version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af495ca346adde10163eb920b52b5a3992fb209b31df58ece4ed0f855661978c" checksum = "20fd9347d94995cc197ef2267a8c6b82f4519d3cb5c333caf57edb1376077dd1"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"log", "log",

@ -12,7 +12,7 @@ multibase = "0.9.1"
base64 = "0.13.0" base64 = "0.13.0"
toml = "0.5.8" toml = "0.5.8"
serde = "1.0.130" serde = "1.0.130"
rmp-ipc = "0.4.0" rmp-ipc = "0.5.0"
typemap_rev = "0.1.5" typemap_rev = "0.1.5"
image = "0.23.14" image = "0.23.14"
futures = "0.3.17" futures = "0.3.17"

@ -7,3 +7,4 @@ pub mod type_keys;
pub use futures; pub use futures;
pub use image; pub use image;
pub use rmp_ipc;

@ -1267,9 +1267,9 @@ dependencies = [
[[package]] [[package]]
name = "rmp-ipc" name = "rmp-ipc"
version = "0.4.0" version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af495ca346adde10163eb920b52b5a3992fb209b31df58ece4ed0f855661978c" checksum = "20fd9347d94995cc197ef2267a8c6b82f4519d3cb5c333caf57edb1376077dd1"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"log", "log",

@ -1298,9 +1298,9 @@ dependencies = [
[[package]] [[package]]
name = "rmp-ipc" name = "rmp-ipc"
version = "0.4.0" version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af495ca346adde10163eb920b52b5a3992fb209b31df58ece4ed0f855661978c" checksum = "20fd9347d94995cc197ef2267a8c6b82f4519d3cb5c333caf57edb1376077dd1"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"log", "log",

@ -789,7 +789,6 @@ dependencies = [
"chrono", "chrono",
"mediarepo-core", "mediarepo-core",
"mediarepo-model", "mediarepo-model",
"rmp-ipc",
"serde", "serde",
"tokio", "tokio",
] ]
@ -1311,9 +1310,9 @@ dependencies = [
[[package]] [[package]]
name = "rmp-ipc" name = "rmp-ipc"
version = "0.4.3" version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2ada2c7329ea55e1e80f2a1ae9ddb123f93ae4b349d493273138118feadfecb" checksum = "20fd9347d94995cc197ef2267a8c6b82f4519d3cb5c333caf57edb1376077dd1"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"log", "log",

@ -6,7 +6,6 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
rmp-ipc = "0.4.3"
serde = "1.0.130" serde = "1.0.130"
[dependencies.mediarepo-core] [dependencies.mediarepo-core]

@ -1,17 +1,14 @@
use crate::types::responses::InfoResponse; use crate::types::responses::InfoResponse;
use rmp_ipc::context::Context; use mediarepo_core::rmp_ipc::prelude::*;
use rmp_ipc::error::Result;
use rmp_ipc::{Event, IPCBuilder};
mod namespaces; mod namespaces;
pub mod types; pub mod types;
pub fn get_builder(address: &str) -> IPCBuilder { pub fn get_builder(address: &str) -> IPCBuilder {
namespaces::build_namespaces(IPCBuilder::new().address(address)) namespaces::build_namespaces(IPCBuilder::new().address(address)).on("info", callback!(info))
.on("info", |c, e| Box::pin(info(c, e)))
} }
async fn info(ctx: &Context, event: Event) -> Result<()> { async fn info(ctx: &Context, event: Event) -> IPCResult<()> {
let response = InfoResponse { let response = InfoResponse {
name: env!("CARGO_PKG_NAME").to_string(), name: env!("CARGO_PKG_NAME").to_string(),
version: env!("CARGO_PKG_VERSION").to_string(), version: env!("CARGO_PKG_VERSION").to_string(),

@ -3,126 +3,126 @@ use crate::types::requests::{
}; };
use crate::types::responses::{FileResponse, ThumbnailResponse}; use crate::types::responses::{FileResponse, ThumbnailResponse};
use mediarepo_core::error::{RepoError, RepoResult}; use mediarepo_core::error::{RepoError, RepoResult};
use mediarepo_core::rmp_ipc::prelude::*;
use mediarepo_model::file::File; use mediarepo_model::file::File;
use mediarepo_model::repo::Repo; use mediarepo_model::repo::Repo;
use mediarepo_model::type_keys::RepoKey; use mediarepo_model::type_keys::RepoKey;
use rmp_ipc::context::Context;
use rmp_ipc::error::Result;
use rmp_ipc::{Event, NamespaceBuilder};
use std::path::PathBuf; use std::path::PathBuf;
use tokio::io::AsyncReadExt; use tokio::io::AsyncReadExt;
pub const FILES_NAMESPACE: &str = "files"; pub struct FilesNamespace;
pub fn build(builder: NamespaceBuilder) -> NamespaceBuilder { impl NamespaceProvider for FilesNamespace {
builder fn name() -> String {
.on("all_files", |c, e| Box::pin(all_files(c, e))) String::from("files")
.on("add_file", |c, e| Box::pin(add_file(c, e))) }
.on("read_file", |c, e| Box::pin(read_file(c, e)))
.on("get_thumbnails", |c, e| Box::pin(get_file_thumbnails(c, e)))
.on("read_thumbnail", |c, e| Box::pin(read_thumbnail(c, e)))
}
/// Returns a list of all files
async fn all_files(ctx: &Context, event: Event) -> Result<()> {
let files = {
let data = ctx.data.read().await;
let repo = data.get::<RepoKey>().unwrap();
repo.files().await?
};
let responses: Vec<FileResponse> = files.into_iter().map(FileResponse::from).collect();
ctx.emitter
.emit_response_to(event.id(), FILES_NAMESPACE, "all_files", responses)
.await?;
Ok(()) fn register(handler: &mut EventHandler) {
handler.on("all_files", callback!(Self::all_files));
handler.on("add_file", callback!(Self::add_file));
handler.on("read_file", callback!(Self::read_file));
handler.on("get_thumbnails", callback!(Self::thumbnails));
handler.on("read_thumbnail", callback!(Self::read_thumbnail));
}
} }
/// Adds a file to the repository impl FilesNamespace {
async fn add_file(ctx: &Context, event: Event) -> Result<()> { /// Returns a list of all files
let request = event.data::<AddFileRequest>()?; async fn all_files(ctx: &Context, event: Event) -> IPCResult<()> {
let path = PathBuf::from(request.path); let files = {
let file = { let data = ctx.data.read().await;
let data = ctx.data.read().await; let repo = data.get::<RepoKey>().unwrap();
let repo = data.get::<RepoKey>().unwrap(); repo.files().await?
repo.add_file_by_path(path).await? };
}; let responses: Vec<FileResponse> = files.into_iter().map(FileResponse::from).collect();
ctx.emitter ctx.emitter
.emit_response_to( .emit_response_to(event.id(), Self::name(), "all_files", responses)
event.id(), .await?;
FILES_NAMESPACE,
"add_file",
FileResponse::from(file),
)
.await?;
Ok(()) Ok(())
} }
/// Reads the binary contents of a file /// Adds a file to the repository
async fn read_file(ctx: &Context, event: Event) -> Result<()> { async fn add_file(ctx: &Context, event: Event) -> IPCResult<()> {
let request = event.data::<ReadFileRequest>()?; let request = event.data::<AddFileRequest>()?;
let mut reader = { let path = PathBuf::from(request.path);
let data = ctx.data.read().await; let file = {
let repo = data.get::<RepoKey>().unwrap(); let data = ctx.data.read().await;
let file = file_by_identifier(request, repo) let repo = data.get::<RepoKey>().unwrap();
.await? repo.add_file_by_path(path).await?
.ok_or_else(|| RepoError::from("File not found")); };
file?.get_reader().await? ctx.emitter
}; .emit_response_to(
let mut buf = Vec::new(); event.id(),
reader.read_to_end(&mut buf).await?; Self::name(),
ctx.emitter "add_file",
.emit_response_to(event.id(), FILES_NAMESPACE, "read_file", buf) FileResponse::from(file),
.await?; )
.await?;
Ok(()) Ok(())
} }
/// Returns a list of available thumbnails of a file /// Reads the binary contents of a file
async fn get_file_thumbnails(ctx: &Context, event: Event) -> Result<()> { async fn read_file(ctx: &Context, event: Event) -> IPCResult<()> {
let request = event.data::<GetFileThumbnailsRequest>()?; let request = event.data::<ReadFileRequest>()?;
let data = ctx.data.read().await; let mut reader = {
let repo = data.get::<RepoKey>().unwrap(); let data = ctx.data.read().await;
let file = file_by_identifier(request, repo) let repo = data.get::<RepoKey>().unwrap();
.await? let file = file_by_identifier(request, repo)
.ok_or_else(|| RepoError::from("File not found"))?; .await?
let thumbnails = file.thumbnails().await?; .ok_or_else(|| RepoError::from("File not found"));
let thumb_responses: Vec<ThumbnailResponse> = thumbnails file?.get_reader().await?
.into_iter() };
.map(ThumbnailResponse::from) let mut buf = Vec::new();
.collect(); reader.read_to_end(&mut buf).await?;
ctx.emitter ctx.emitter
.emit_response_to( .emit_response_to(event.id(), Self::name(), "read_file", buf)
event.id(), .await?;
FILES_NAMESPACE,
"get_thumbnails",
thumb_responses,
)
.await?;
Ok(()) Ok(())
} }
/// Reads a thumbnail for the given thumbnail hash /// Returns a list of available thumbnails of a file
async fn read_thumbnail(ctx: &Context, event: Event) -> Result<()> { async fn thumbnails(ctx: &Context, event: Event) -> IPCResult<()> {
let hash = event.data::<String>()?; let request = event.data::<GetFileThumbnailsRequest>()?;
let mut reader = {
let data = ctx.data.read().await; let data = ctx.data.read().await;
let repo = data.get::<RepoKey>().unwrap(); let repo = data.get::<RepoKey>().unwrap();
let thumbnail = repo let file = file_by_identifier(request, repo)
.thumbnail_by_hash(&hash)
.await? .await?
.ok_or_else(|| RepoError::from("Thumbnail not found"))?; .ok_or_else(|| RepoError::from("File not found"))?;
thumbnail.get_reader().await? let thumbnails = file.thumbnails().await?;
}; let thumb_responses: Vec<ThumbnailResponse> = thumbnails
let mut buf = Vec::new(); .into_iter()
reader.read_to_end(&mut buf).await?; .map(ThumbnailResponse::from)
ctx.emitter .collect();
.emit_response_to(event.id(), FILES_NAMESPACE, "read_thumbnail", buf) ctx.emitter
.await?; .emit_response_to(event.id(), Self::name(), "get_thumbnails", thumb_responses)
.await?;
Ok(())
}
Ok(()) /// Reads a thumbnail for the given thumbnail hash
async fn read_thumbnail(ctx: &Context, event: Event) -> IPCResult<()> {
let hash = event.data::<String>()?;
let mut reader = {
let data = ctx.data.read().await;
let repo = data.get::<RepoKey>().unwrap();
let thumbnail = repo
.thumbnail_by_hash(&hash)
.await?
.ok_or_else(|| RepoError::from("Thumbnail not found"))?;
thumbnail.get_reader().await?
};
let mut buf = Vec::new();
reader.read_to_end(&mut buf).await?;
ctx.emitter
.emit_response_to(event.id(), Self::name(), "read_thumbnail", buf)
.await?;
Ok(())
}
} }
async fn file_by_identifier(identifier: FileIdentifier, repo: &Repo) -> RepoResult<Option<File>> { async fn file_by_identifier(identifier: FileIdentifier, repo: &Repo) -> RepoResult<Option<File>> {

@ -1,10 +1,7 @@
use crate::namespaces::files::FILES_NAMESPACE; use mediarepo_core::rmp_ipc::{namespace, namespace::Namespace, IPCBuilder};
use rmp_ipc::IPCBuilder;
pub mod files; pub mod files;
pub fn build_namespaces(builder: IPCBuilder) -> IPCBuilder { pub fn build_namespaces(builder: IPCBuilder) -> IPCBuilder {
let builder = files::build(builder.namespace(FILES_NAMESPACE)).build(); builder.add_namespace(namespace!(files::FilesNamespace))
builder
} }

Loading…
Cancel
Save