From 6452132c976d0f02574855953a2f1b3431a5c28d Mon Sep 17 00:00:00 2001 From: Martichou Date: Sun, 25 Feb 2024 23:06:48 +0100 Subject: [PATCH] feat: somewhat working UI channel with Rust Signed-off-by: Martichou --- core_lib/bindings/DeviceType.ts | 3 + core_lib/bindings/RemoteDeviceInfo.ts | 4 + core_lib/bindings/TransferMetadata.ts | 3 +- core_lib/bindings/index.ts | 2 + core_lib/src/hdl/inbound.rs | 3 + core_lib/src/hdl/info.rs | 3 +- core_lib/src/manager.rs | 12 +- core_lib/src/utils.rs | 8 +- frontend/package.json | 5 +- frontend/pnpm-lock.yaml | 3 + frontend/src-tauri/src/main.rs | 23 ++-- frontend/src/components/HomePage.vue | 158 +++++++++++++++----------- 12 files changed, 142 insertions(+), 85 deletions(-) create mode 100644 core_lib/bindings/DeviceType.ts create mode 100644 core_lib/bindings/RemoteDeviceInfo.ts diff --git a/core_lib/bindings/DeviceType.ts b/core_lib/bindings/DeviceType.ts new file mode 100644 index 0000000..ae35085 --- /dev/null +++ b/core_lib/bindings/DeviceType.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type DeviceType = "Unknown" | "Phone" | "Tablet" | "Laptop"; diff --git a/core_lib/bindings/RemoteDeviceInfo.ts b/core_lib/bindings/RemoteDeviceInfo.ts new file mode 100644 index 0000000..92927a9 --- /dev/null +++ b/core_lib/bindings/RemoteDeviceInfo.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { DeviceType } from "./DeviceType"; + +export interface RemoteDeviceInfo { name: string, device_type: DeviceType, } diff --git a/core_lib/bindings/TransferMetadata.ts b/core_lib/bindings/TransferMetadata.ts index bbe0ae7..57a1692 100644 --- a/core_lib/bindings/TransferMetadata.ts +++ b/core_lib/bindings/TransferMetadata.ts @@ -1,3 +1,4 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { RemoteDeviceInfo } from "./RemoteDeviceInfo"; -export interface TransferMetadata { id: string, files: Array, pin_code: string | null, text_description: string | null, } +export interface TransferMetadata { id: string, source: RemoteDeviceInfo | null, files: Array, pin_code: string | null, text_description: string | null, } diff --git a/core_lib/bindings/index.ts b/core_lib/bindings/index.ts index 6ae6f92..c4b766e 100644 --- a/core_lib/bindings/index.ts +++ b/core_lib/bindings/index.ts @@ -1,5 +1,7 @@ export * from "./ChannelDirection" +export * from "./DeviceType" export * from "./ChannelMessage" export * from "./TransferMetadata" export * from "./ChannelAction" +export * from "./RemoteDeviceInfo" export * from "./State" diff --git a/core_lib/src/hdl/inbound.rs b/core_lib/src/hdl/inbound.rs index 97d323a..ca5754e 100644 --- a/core_lib/src/hdl/inbound.rs +++ b/core_lib/src/hdl/inbound.rs @@ -712,6 +712,7 @@ impl InboundRequest { if !dest.exists() { break; } + dest.pop(); counter += 1; } @@ -731,6 +732,7 @@ impl InboundRequest { let metadata = TransferMetadata { id: self.state.id.clone(), + source: self.state.remote_device_info.clone(), files: files_name, pin_code: self.state.pin_code.clone(), text_description: None, @@ -757,6 +759,7 @@ impl InboundRequest { if meta.r#type() == text_metadata::Type::Url { let metadata = TransferMetadata { id: self.state.id.clone(), + source: self.state.remote_device_info.clone(), files: vec![], pin_code: self.state.pin_code.clone(), text_description: meta.text_title.clone(), diff --git a/core_lib/src/hdl/info.rs b/core_lib/src/hdl/info.rs index 7ea7dda..712134d 100644 --- a/core_lib/src/hdl/info.rs +++ b/core_lib/src/hdl/info.rs @@ -4,7 +4,7 @@ use std::path::PathBuf; use serde::{Deserialize, Serialize}; use ts_rs::TS; -use crate::sharing_nearby::FileMetadata; +use crate::{sharing_nearby::FileMetadata, utils::RemoteDeviceInfo}; #[derive(Debug)] pub struct InternalFileInfo { @@ -19,6 +19,7 @@ pub struct InternalFileInfo { #[ts(export)] pub struct TransferMetadata { pub id: String, + pub source: Option, pub files: Vec, pub pin_code: Option, pub text_description: Option, diff --git a/core_lib/src/manager.rs b/core_lib/src/manager.rs index ec1e2f6..5ae5e94 100644 --- a/core_lib/src/manager.rs +++ b/core_lib/src/manager.rs @@ -2,9 +2,9 @@ use tokio::net::TcpListener; use tokio::sync::broadcast::Sender; use tokio_util::sync::CancellationToken; -use crate::channel::ChannelMessage; +use crate::channel::{ChannelDirection, ChannelMessage}; use crate::errors::AppError; -use crate::hdl::InboundRequest; +use crate::hdl::{InboundRequest, State}; const INNER_NAME: &str = "TcpServer"; @@ -39,6 +39,7 @@ impl TcpServer { match r { Ok((socket, remote_addr)) => { trace!("{INNER_NAME}: new client: {remote_addr}"); + let esender = self.sender.clone(); let csender = self.sender.clone(); tokio::spawn(async move { @@ -50,6 +51,13 @@ impl TcpServer { Err(e) => match e.downcast_ref() { Some(AppError::NotAnError) => break, None => { + let _ = esender.send(ChannelMessage { + id: remote_addr.to_string(), + direction: ChannelDirection::LibToFront, + action: None, + state: Some(State::Disconnected), + meta: None, + }); error!("{INNER_NAME}: error while handling client: {e}"); break; } diff --git a/core_lib/src/utils.rs b/core_lib/src/utils.rs index 194c5fe..d979926 100644 --- a/core_lib/src/utils.rs +++ b/core_lib/src/utils.rs @@ -6,12 +6,15 @@ use base64::Engine; use hkdf::Hkdf; use p256::{PublicKey, SecretKey}; use rand::{Rng, RngCore}; +use serde::{Deserialize, Serialize}; use sha2::digest::generic_array::GenericArray; use sha2::Sha256; use tokio::io::AsyncReadExt; use tokio::net::TcpStream; +use ts_rs::TS; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Serialize, TS)] +#[ts(export)] #[allow(dead_code)] pub enum DeviceType { Unknown = 0, @@ -33,7 +36,8 @@ impl DeviceType { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Serialize, TS)] +#[ts(export)] pub struct RemoteDeviceInfo { pub name: String, pub device_type: DeviceType, diff --git a/frontend/package.json b/frontend/package.json index be016f3..fcf701c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -4,7 +4,7 @@ "version": "0.1.0", "type": "module", "scripts": { - "dev": "cross-env RUST_BACKTRACE=1 concurrently -k \"tauri dev\" \"pnpm devtools\"", + "dev": "cross-env RUST_BACKTRACE=1 concurrently -k \"tauri dev\"", "build": "tauri build", "vite:dev": "vite dev", "vite:build": "vite build", @@ -17,6 +17,7 @@ }, "dependencies": { "@tauri-apps/api": "1.5.1", + "@martichou/core_lib": "../core_lib", "vue": "3.3.11" }, "devDependencies": { @@ -45,4 +46,4 @@ "vitest": "1.1.0", "vue-tsc": "1.8.25" } -} \ No newline at end of file +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 3826c39..c05e450 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@martichou/core_lib': + specifier: ../core_lib + version: link:../core_lib '@tauri-apps/api': specifier: 1.5.1 version: 1.5.1 diff --git a/frontend/src-tauri/src/main.rs b/frontend/src-tauri/src/main.rs index 4d36860..ba7044d 100644 --- a/frontend/src-tauri/src/main.rs +++ b/frontend/src-tauri/src/main.rs @@ -6,7 +6,7 @@ #[macro_use] extern crate log; -use rquickshare::channel::ChannelMessage; +use rquickshare::channel::{ChannelDirection, ChannelMessage}; use rquickshare::RQS; use tauri::{CustomMenuItem, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu}; use tokio::sync::broadcast::Sender; @@ -83,21 +83,20 @@ async fn main() -> Result<(), anyhow::Error> { } fn rs2js(message: ChannelMessage, manager: &impl Manager) { - info!("rs2js: {:?}", &message); + if message.direction == ChannelDirection::FrontToLib { + return; + } + + info!("rs2js: {:?}", &message); manager.emit_all("rs2js", &message).unwrap(); } #[tauri::command] -async fn js2rs(message: String, state: tauri::State<'_, AppState>) -> Result<(), String> { +fn js2rs(message: ChannelMessage, state: tauri::State<'_, AppState>) -> Result<(), String> { info!("js2rs: {:?}", &message); - let _ = match serde_json::from_str::(&message) { - Ok(m) => state.sender.send(m), - Err(e) => { - error!("Cannot serialize message: {} due to: {}", message, e); - return Err(String::from("Cannot serialize message")); - } - }; - - Ok(()) + match state.sender.send(message) { + Ok(_) => Ok(()), + Err(e) => return Err(format!("Coudln't perform: {}", e)) + } } diff --git a/frontend/src/components/HomePage.vue b/frontend/src/components/HomePage.vue index 50f475f..8b3a65c 100644 --- a/frontend/src/components/HomePage.vue +++ b/frontend/src/components/HomePage.vue @@ -1,66 +1,90 @@