Initial commit: Proxmox Desktop client with VNC console, WebSocket proxy, and Tauri shell
This commit is contained in:
@@ -12,6 +12,9 @@ dist
|
|||||||
dist-ssr
|
dist-ssr
|
||||||
*.local
|
*.local
|
||||||
|
|
||||||
|
# Rust/Tauri
|
||||||
|
src-tauri/target/
|
||||||
|
|
||||||
# Editor directories and files
|
# Editor directories and files
|
||||||
.vscode/*
|
.vscode/*
|
||||||
!.vscode/extensions.json
|
!.vscode/extensions.json
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 761 B |
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 181 B |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 203 B |
@@ -32,6 +32,9 @@ pub enum Error {
|
|||||||
|
|
||||||
#[error("WebSocket error: {0}")]
|
#[error("WebSocket error: {0}")]
|
||||||
WebSocketError(String),
|
WebSocketError(String),
|
||||||
|
|
||||||
|
#[error("Tauri error: {0}")]
|
||||||
|
TauriError(#[from] tauri::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Serialize for Error {
|
impl Serialize for Error {
|
||||||
|
|||||||
@@ -603,7 +603,7 @@ async fn update_tray_menu(
|
|||||||
if connections.is_empty() {
|
if connections.is_empty() {
|
||||||
let no_conn = MenuItemBuilder::new("No connections")
|
let no_conn = MenuItemBuilder::new("No connections")
|
||||||
.id("no_connections")
|
.id("no_connections")
|
||||||
.disabled(true)
|
.enabled(false)
|
||||||
.build(&app)?;
|
.build(&app)?;
|
||||||
menu_builder = menu_builder.item(&no_conn);
|
menu_builder = menu_builder.item(&no_conn);
|
||||||
}
|
}
|
||||||
@@ -695,8 +695,7 @@ pub fn run() {
|
|||||||
.item(&quit)
|
.item(&quit)
|
||||||
.build()?;
|
.build()?;
|
||||||
|
|
||||||
let _tray = TrayIconBuilder::new()
|
let _tray = TrayIconBuilder::with_id("main-tray")
|
||||||
.id("main-tray")
|
|
||||||
.tooltip("ProxmoxDesktop")
|
.tooltip("ProxmoxDesktop")
|
||||||
.icon(app.default_window_icon().cloned().expect("no default icon"))
|
.icon(app.default_window_icon().cloned().expect("no default icon"))
|
||||||
.menu(&menu)
|
.menu(&menu)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
use futures_util::{SinkExt, StreamExt};
|
use futures_util::{SinkExt, StreamExt};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use tauri::Emitter;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tokio::time::{sleep, Duration};
|
use tokio::time::{sleep, Duration};
|
||||||
use tokio_tungstenite::tungstenite::Message;
|
use tokio_tungstenite::tungstenite::Message;
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"rustc_fingerprint":9200552825474144316,"outputs":{"7752308220390268658":{"success":true,"status":"","code":0,"stdout":"rustc 1.97.1 (8bab26f4f 2026-07-14)\nbinary: rustc\ncommit-hash: 8bab26f4f68e0e26f0bb7960be334d5b520ea452\ncommit-date: 2026-07-14\nhost: x86_64-unknown-linux-gnu\nrelease: 1.97.1\nLLVM version: 22.1.6\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_primitive_alignment=\"16\"\ntarget_has_atomic_primitive_alignment=\"32\"\ntarget_has_atomic_primitive_alignment=\"64\"\ntarget_has_atomic_primitive_alignment=\"8\"\ntarget_has_atomic_primitive_alignment=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}}
|
{"rustc_fingerprint":6524788087311550793,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.95.0 (59807616e 2026-04-14)\nbinary: rustc\ncommit-hash: 59807616e1fa2540724bfbac14d7976d7e4a3860\ncommit-date: 2026-04-14\nhost: aarch64-apple-darwin\nrelease: 1.95.0\nLLVM version: 22.1.2\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/matt/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"aes\"\ntarget_feature=\"crc\"\ntarget_feature=\"dit\"\ntarget_feature=\"dotprod\"\ntarget_feature=\"dpb\"\ntarget_feature=\"dpb2\"\ntarget_feature=\"fcma\"\ntarget_feature=\"fhm\"\ntarget_feature=\"flagm\"\ntarget_feature=\"fp16\"\ntarget_feature=\"frintts\"\ntarget_feature=\"jsconv\"\ntarget_feature=\"lor\"\ntarget_feature=\"lse\"\ntarget_feature=\"neon\"\ntarget_feature=\"paca\"\ntarget_feature=\"pacg\"\ntarget_feature=\"pan\"\ntarget_feature=\"pmuv3\"\ntarget_feature=\"ras\"\ntarget_feature=\"rcpc\"\ntarget_feature=\"rcpc2\"\ntarget_feature=\"rdm\"\ntarget_feature=\"sb\"\ntarget_feature=\"sha2\"\ntarget_feature=\"sha3\"\ntarget_feature=\"ssbs\"\ntarget_feature=\"vh\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"apple\"\nunix\n","stderr":""}},"successes":{}}
|
||||||
@@ -10,7 +10,6 @@
|
|||||||
"frontendDist": "../dist"
|
"frontendDist": "../dist"
|
||||||
},
|
},
|
||||||
"app": {
|
"app": {
|
||||||
"title": "ProxmoxDesktop",
|
|
||||||
"windows": [
|
"windows": [
|
||||||
{
|
{
|
||||||
"title": "ProxmoxDesktop",
|
"title": "ProxmoxDesktop",
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ export function VNCConsole({ connectionId, node, vmid, onError }: VNCConsoleProp
|
|||||||
if (cancelled) return
|
if (cancelled) return
|
||||||
|
|
||||||
// Dynamically import noVNC RFB class
|
// Dynamically import noVNC RFB class
|
||||||
const { default: RFB } = await import('@novnc/novnc/core/rfb.js')
|
const { default: RFB } = await import('@novnc/novnc')
|
||||||
|
|
||||||
if (cancelled || !containerRef.current) return
|
if (cancelled || !containerRef.current) return
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
// Custom type declarations for @novnc/novnc v1.7.0
|
// Custom type declarations for @novnc/novnc v1.7.0
|
||||||
// The @types/novnc package is outdated and doesn't match the modern API
|
// The @types/novnc package is outdated and doesn't match the modern API
|
||||||
|
|
||||||
declare module '@novnc/novnc/core/rfb.js' {
|
declare module '@novnc/novnc' {
|
||||||
export default class RFB extends EventTarget {
|
export default class RFB extends EventTarget {
|
||||||
constructor(target: HTMLElement, url: string, options?: RFBOptions);
|
constructor(target: HTMLElement, url: string, options?: RFBOptions);
|
||||||
disconnect(): void;
|
disconnect(): void;
|
||||||
|
|||||||
Reference in New Issue
Block a user