mirror of
https://github.com/neosubhamoy/pytubepp-helper.git
synced 2026-02-04 11:22:22 +05:30
(first): initial commit
This commit is contained in:
7
src-tauri/msghost/Cargo.lock
generated
Normal file
7
src-tauri/msghost/Cargo.lock
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "pytubepp-helper-msghost"
|
||||
version = "0.1.0"
|
||||
16
src-tauri/msghost/Cargo.toml
Normal file
16
src-tauri/msghost/Cargo.toml
Normal file
@@ -0,0 +1,16 @@
|
||||
[package]
|
||||
name = "pytubepp-helper-msghost"
|
||||
version = "0.1.0"
|
||||
description = "PytubePP Helper Native Messaging Host"
|
||||
authors = ["neosubhamoy"]
|
||||
edition = "2021"
|
||||
build = "build.rs"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
websocket = "0.27.1"
|
||||
serde_json = "1.0"
|
||||
|
||||
[build-dependencies]
|
||||
winresource = "0.1.17"
|
||||
8
src-tauri/msghost/build.rs
Normal file
8
src-tauri/msghost/build.rs
Normal file
@@ -0,0 +1,8 @@
|
||||
extern crate winresource;
|
||||
|
||||
fn main() {
|
||||
if std::env::var("CARGO_CFG_TARGET_OS").unwrap() == "windows" {
|
||||
let res = winresource::WindowsResource::new();
|
||||
res.compile().unwrap();
|
||||
}
|
||||
}
|
||||
103
src-tauri/msghost/src/main.rs
Normal file
103
src-tauri/msghost/src/main.rs
Normal file
@@ -0,0 +1,103 @@
|
||||
use std::io::{self, Read, Write};
|
||||
use websocket::client::ClientBuilder;
|
||||
use websocket::OwnedMessage;
|
||||
use std::thread::sleep;
|
||||
use std::time::Duration;
|
||||
use serde_json::Value;
|
||||
|
||||
fn connect_with_retry(url: &str, max_attempts: u32) -> Result<websocket::sync::Client<std::net::TcpStream>, Box<dyn std::error::Error>> {
|
||||
let mut attempts = 0;
|
||||
loop {
|
||||
match ClientBuilder::new(url).unwrap().connect_insecure() {
|
||||
Ok(client) => {
|
||||
eprintln!("Successfully connected to Tauri app :)");
|
||||
return Ok(client);
|
||||
}
|
||||
Err(e) => {
|
||||
attempts += 1;
|
||||
if attempts >= max_attempts {
|
||||
return Err(Box::new(e));
|
||||
}
|
||||
let wait_time = Duration::from_secs(2u64.pow(attempts));
|
||||
eprintln!("Connection attempt {} failed. Retrying in {:?}...", attempts, wait_time);
|
||||
sleep(wait_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn read_stdin_message() -> Result<String, Box<dyn std::error::Error>> {
|
||||
let mut stdin = io::stdin();
|
||||
let mut length_bytes = [0u8; 4];
|
||||
stdin.read_exact(&mut length_bytes)?;
|
||||
let length = u32::from_ne_bytes(length_bytes) as usize;
|
||||
|
||||
let mut buffer = vec![0u8; length];
|
||||
stdin.read_exact(&mut buffer)?;
|
||||
|
||||
let message = String::from_utf8(buffer)?;
|
||||
Ok(message)
|
||||
}
|
||||
|
||||
fn write_stdout_message(message: &str) -> Result<(), Box<dyn std::error::Error>> {
|
||||
let message_bytes = message.as_bytes();
|
||||
let message_size = message_bytes.len();
|
||||
io::stdout().write_all(&(message_size as u32).to_ne_bytes())?;
|
||||
io::stdout().write_all(message_bytes)?;
|
||||
io::stdout().flush()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
eprintln!("Waiting for message from extension...");
|
||||
|
||||
let input = match read_stdin_message() {
|
||||
Ok(msg) => {
|
||||
eprintln!("Received message: {}", msg);
|
||||
msg
|
||||
},
|
||||
Err(e) => {
|
||||
eprintln!("Error reading message: {:?}", e);
|
||||
return Err(e);
|
||||
}
|
||||
};
|
||||
|
||||
// Send immediate response to the extension
|
||||
write_stdout_message(&serde_json::json!({
|
||||
"status": "received",
|
||||
"message": "Message received by native host"
|
||||
}).to_string())?;
|
||||
|
||||
let parsed: Value = serde_json::from_str(&input)?;
|
||||
|
||||
let websocket_url = "ws://localhost:3030";
|
||||
eprintln!("Attempting to connect to {}", websocket_url);
|
||||
|
||||
let mut client = match connect_with_retry(websocket_url, 2) {
|
||||
Ok(client) => client,
|
||||
Err(e) => {
|
||||
eprintln!("Failed to connect after multiple attempts: {:?}", e);
|
||||
write_stdout_message(&serde_json::json!({
|
||||
"status": "error",
|
||||
"message": "Failed to connect to Tauri app"
|
||||
}).to_string())?;
|
||||
return Err(e);
|
||||
}
|
||||
};
|
||||
|
||||
// Send message to Tauri app
|
||||
client.send_message(&OwnedMessage::Text(parsed.to_string()))?;
|
||||
|
||||
// Receive response from Tauri app
|
||||
let message = client.recv_message()?;
|
||||
|
||||
// Send Tauri app's response back to browser extension
|
||||
if let OwnedMessage::Text(text) = message {
|
||||
write_stdout_message(&serde_json::json!({
|
||||
"status": "success",
|
||||
"response": text
|
||||
}).to_string())?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user