mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-04-25 01:58:39 +02:00
plugins: have callers provide bundled plugin dir
This commit is contained in:
@@ -67,7 +67,6 @@ impl CliContext {
|
|||||||
plugin_runtime_main,
|
plugin_runtime_main,
|
||||||
&query_manager,
|
&query_manager,
|
||||||
&PluginContext::new_empty(),
|
&PluginContext::new_empty(),
|
||||||
false,
|
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use crate::error::Result;
|
|||||||
use crate::models_ext::QueryManagerExt;
|
use crate::models_ext::QueryManagerExt;
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
@@ -239,10 +240,15 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
|
|||||||
Builder::new("yaak-plugins")
|
Builder::new("yaak-plugins")
|
||||||
.setup(|app_handle, _| {
|
.setup(|app_handle, _| {
|
||||||
// Resolve paths for plugin manager
|
// Resolve paths for plugin manager
|
||||||
let vendored_plugin_dir = app_handle
|
let bundled_plugin_dir = app_handle
|
||||||
.path()
|
.path()
|
||||||
.resolve("vendored/plugins", BaseDirectory::Resource)
|
.resolve("vendored/plugins", BaseDirectory::Resource)
|
||||||
.expect("failed to resolve plugin directory resource");
|
.expect("failed to resolve plugin directory resource");
|
||||||
|
let vendored_plugin_dir = if is_dev() {
|
||||||
|
resolve_workspace_plugins_dir().unwrap_or(bundled_plugin_dir)
|
||||||
|
} else {
|
||||||
|
bundled_plugin_dir
|
||||||
|
};
|
||||||
|
|
||||||
let installed_plugin_dir = app_handle
|
let installed_plugin_dir = app_handle
|
||||||
.path()
|
.path()
|
||||||
@@ -266,7 +272,6 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
|
|||||||
.expect("failed to resolve plugin runtime")
|
.expect("failed to resolve plugin runtime")
|
||||||
.join("index.cjs");
|
.join("index.cjs");
|
||||||
|
|
||||||
let dev_mode = is_dev();
|
|
||||||
let query_manager =
|
let query_manager =
|
||||||
app_handle.state::<yaak_models::query_manager::QueryManager>().inner().clone();
|
app_handle.state::<yaak_models::query_manager::QueryManager>().inner().clone();
|
||||||
|
|
||||||
@@ -280,7 +285,6 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
|
|||||||
plugin_runtime_main,
|
plugin_runtime_main,
|
||||||
&query_manager,
|
&query_manager,
|
||||||
&PluginContext::new_empty(),
|
&PluginContext::new_empty(),
|
||||||
dev_mode,
|
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.expect("Failed to initialize plugins");
|
.expect("Failed to initialize plugins");
|
||||||
@@ -322,3 +326,11 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
|
|||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn resolve_workspace_plugins_dir() -> Option<PathBuf> {
|
||||||
|
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
||||||
|
.join("../..")
|
||||||
|
.join("plugins")
|
||||||
|
.canonicalize()
|
||||||
|
.ok()
|
||||||
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ use crate::plugin_handle::PluginHandle;
|
|||||||
use crate::server_ws::PluginRuntimeServerWebsocket;
|
use crate::server_ws::PluginRuntimeServerWebsocket;
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::env;
|
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
@@ -48,7 +47,6 @@ pub struct PluginManager {
|
|||||||
ws_service: Arc<PluginRuntimeServerWebsocket>,
|
ws_service: Arc<PluginRuntimeServerWebsocket>,
|
||||||
vendored_plugin_dir: PathBuf,
|
vendored_plugin_dir: PathBuf,
|
||||||
pub(crate) installed_plugin_dir: PathBuf,
|
pub(crate) installed_plugin_dir: PathBuf,
|
||||||
dev_mode: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Callback for plugin initialization events (e.g., toast notifications)
|
/// Callback for plugin initialization events (e.g., toast notifications)
|
||||||
@@ -64,7 +62,6 @@ impl PluginManager {
|
|||||||
/// * `plugin_runtime_main` - Path to the plugin runtime index.cjs
|
/// * `plugin_runtime_main` - Path to the plugin runtime index.cjs
|
||||||
/// * `query_manager` - Query manager for bundled plugin registration and loading
|
/// * `query_manager` - Query manager for bundled plugin registration and loading
|
||||||
/// * `plugin_context` - Context to use while initializing plugins
|
/// * `plugin_context` - Context to use while initializing plugins
|
||||||
/// * `dev_mode` - Whether the app is in dev mode (affects plugin loading)
|
|
||||||
pub async fn new(
|
pub async fn new(
|
||||||
vendored_plugin_dir: PathBuf,
|
vendored_plugin_dir: PathBuf,
|
||||||
installed_plugin_dir: PathBuf,
|
installed_plugin_dir: PathBuf,
|
||||||
@@ -72,7 +69,6 @@ impl PluginManager {
|
|||||||
plugin_runtime_main: PathBuf,
|
plugin_runtime_main: PathBuf,
|
||||||
query_manager: &QueryManager,
|
query_manager: &QueryManager,
|
||||||
plugin_context: &PluginContext,
|
plugin_context: &PluginContext,
|
||||||
dev_mode: bool,
|
|
||||||
) -> Result<PluginManager> {
|
) -> Result<PluginManager> {
|
||||||
let (events_tx, mut events_rx) = mpsc::channel(2048);
|
let (events_tx, mut events_rx) = mpsc::channel(2048);
|
||||||
let (kill_server_tx, kill_server_rx) = tokio::sync::watch::channel(false);
|
let (kill_server_tx, kill_server_rx) = tokio::sync::watch::channel(false);
|
||||||
@@ -91,7 +87,6 @@ impl PluginManager {
|
|||||||
killed_rx: Arc::new(Mutex::new(Some(killed_rx))),
|
killed_rx: Arc::new(Mutex::new(Some(killed_rx))),
|
||||||
vendored_plugin_dir,
|
vendored_plugin_dir,
|
||||||
installed_plugin_dir,
|
installed_plugin_dir,
|
||||||
dev_mode,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Forward events to subscribers
|
// Forward events to subscribers
|
||||||
@@ -192,25 +187,11 @@ impl PluginManager {
|
|||||||
Ok(plugin_manager)
|
Ok(plugin_manager)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the vendored plugin directory path (resolves dev mode path if applicable)
|
|
||||||
pub fn get_plugins_dir(&self) -> PathBuf {
|
|
||||||
if self.dev_mode {
|
|
||||||
// Use plugins directly for easy development
|
|
||||||
// Tauri runs from crates-tauri/yaak-app/, so go up two levels to reach project root
|
|
||||||
env::current_dir()
|
|
||||||
.map(|cwd| cwd.join("../../plugins").canonicalize().unwrap())
|
|
||||||
.unwrap_or_else(|_| self.vendored_plugin_dir.clone())
|
|
||||||
} else {
|
|
||||||
self.vendored_plugin_dir.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Read plugin directories from disk and return their paths.
|
/// Read plugin directories from disk and return their paths.
|
||||||
/// This is useful for discovering bundled plugins.
|
/// This is useful for discovering bundled plugins.
|
||||||
pub async fn list_bundled_plugin_dirs(&self) -> Result<Vec<String>> {
|
pub async fn list_bundled_plugin_dirs(&self) -> Result<Vec<String>> {
|
||||||
let plugins_dir = self.get_plugins_dir();
|
info!("Loading bundled plugins from {:?}", self.vendored_plugin_dir);
|
||||||
info!("Loading bundled plugins from {plugins_dir:?}");
|
read_plugins_dir(&self.vendored_plugin_dir).await
|
||||||
read_plugins_dir(&plugins_dir).await
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn uninstall(&self, plugin_context: &PluginContext, dir: &str) -> Result<()> {
|
pub async fn uninstall(&self, plugin_context: &PluginContext, dir: &str) -> Result<()> {
|
||||||
|
|||||||
Reference in New Issue
Block a user