This commit is contained in:
Timur Gordon
2025-08-01 00:01:08 +02:00
parent 32c2cbe0cc
commit 8ed40ce99c
57 changed files with 2047 additions and 4113 deletions

View File

@@ -1,5 +1,5 @@
use std::collections::HashMap;
use crate::{Server, TlsConfigError};
use crate::{Server, TlsConfigError, ServerConfig};
/// ServerBuilder for constructing Server instances with a fluent API
pub struct ServerBuilder {
@@ -12,7 +12,7 @@ pub struct ServerBuilder {
tls_port: Option<u16>,
enable_auth: bool,
enable_webhooks: bool,
circle_worker_id: String,
circles: HashMap<String, Vec<String>>,
}
@@ -28,7 +28,7 @@ impl ServerBuilder {
tls_port: None,
enable_auth: false,
enable_webhooks: false,
circle_worker_id: "default".to_string(),
circles: HashMap::new(),
}
}
@@ -48,10 +48,7 @@ impl ServerBuilder {
self
}
pub fn worker_id(mut self, worker_id: impl Into<String>) -> Self {
self.circle_worker_id = worker_id.into();
self
}
pub fn with_tls(mut self, cert_path: String, key_path: String) -> Self {
self.enable_tls = true;
@@ -79,6 +76,21 @@ impl ServerBuilder {
self.circles = circles;
self
}
/// Load configuration from a ServerConfig instance
pub fn from_config(mut self, config: ServerConfig) -> Self {
self.host = config.host;
self.port = config.port;
self.redis_url = config.redis_url;
self.enable_auth = config.auth;
self.enable_tls = config.tls;
self.cert_path = config.cert;
self.key_path = config.key;
self.tls_port = config.tls_port;
self.enable_webhooks = config.webhooks;
self.circles = config.circles;
self
}
pub fn build(self) -> Result<Server, TlsConfigError> {
Ok(Server {
@@ -91,13 +103,13 @@ impl ServerBuilder {
tls_port: self.tls_port,
enable_auth: self.enable_auth,
enable_webhooks: self.enable_webhooks,
circle_worker_id: self.circle_worker_id,
circle_name: "default".to_string(),
circle_public_key: "default".to_string(),
circles: self.circles,
nonce_store: HashMap::new(),
authenticated_pubkey: None,
dispatcher: None,
supervisor: None,
})
}
}

View File

@@ -1,7 +1,7 @@
use crate::Server;
use actix::prelude::*;
use actix_web_actors::ws;
use hero_dispatcher::{Dispatcher, ScriptType};
use hero_supervisor::{Supervisor, ScriptType};
use serde_json::{json, Value};
use std::time::Duration;
@@ -82,7 +82,7 @@ impl Server {
}
};
let dispatcher = match self.dispatcher.clone() {
let supervisor = match self.supervisor.clone() {
Some(d) => d,
None => {
let err_resp = JsonRpcResponse {
@@ -90,7 +90,7 @@ impl Server {
result: None,
error: Some(JsonRpcError {
code: -32603,
message: "Internal error: dispatcher not available".to_string(),
message: "Internal error: supervisor not available".to_string(),
data: None,
}),
id: client_rpc_id,
@@ -102,7 +102,7 @@ impl Server {
let client_rpc_id_clone = client_rpc_id.clone();
let fut = async move {
dispatcher.start_job(&job_id).await
supervisor.start_job(&job_id).await
};
ctx.spawn(
@@ -190,7 +190,7 @@ impl Server {
}
};
let dispatcher = match self.dispatcher.clone() {
let supervisor = match self.supervisor.clone() {
Some(d) => d,
None => {
let err_resp = JsonRpcResponse {
@@ -198,7 +198,7 @@ impl Server {
result: None,
error: Some(JsonRpcError {
code: -32603,
message: "Internal error: dispatcher not available".to_string(),
message: "Internal error: supervisor not available".to_string(),
data: None,
}),
id: client_rpc_id,
@@ -210,7 +210,7 @@ impl Server {
let client_rpc_id_clone = client_rpc_id.clone();
let fut = async move {
dispatcher.get_job_status(&job_id).await
supervisor.get_job_status(&job_id).await
};
ctx.spawn(
@@ -279,7 +279,7 @@ impl Server {
return;
}
let dispatcher = match self.dispatcher.clone() {
let supervisor = match self.supervisor.clone() {
Some(d) => d,
None => {
let err_resp = JsonRpcResponse {
@@ -287,7 +287,7 @@ impl Server {
result: None,
error: Some(JsonRpcError {
code: -32603,
message: "Internal error: dispatcher not available".to_string(),
message: "Internal error: supervisor not available".to_string(),
data: None,
}),
id: client_rpc_id,
@@ -299,7 +299,7 @@ impl Server {
let client_rpc_id_clone = client_rpc_id.clone();
let fut = async move {
dispatcher.list_jobs().await
supervisor.list_jobs().await
};
ctx.spawn(
@@ -403,7 +403,7 @@ impl Server {
}
};
let dispatcher = match self.dispatcher.clone() {
let supervisor = match self.supervisor.clone() {
Some(d) => d,
None => {
let err_resp = JsonRpcResponse {
@@ -411,7 +411,7 @@ impl Server {
result: None,
error: Some(JsonRpcError {
code: -32603,
message: "Internal error: dispatcher not available".to_string(),
message: "Internal error: supervisor not available".to_string(),
data: None,
}),
id: client_rpc_id,
@@ -423,7 +423,7 @@ impl Server {
let client_rpc_id_clone = client_rpc_id.clone();
let fut = async move {
dispatcher
supervisor
.new_job()
.context_id(&circle_pk)
.script_type(ScriptType::RhaiSAL)
@@ -518,7 +518,7 @@ impl Server {
}
};
let dispatcher = match self.dispatcher.clone() {
let supervisor = match self.supervisor.clone() {
Some(d) => d,
None => {
let err_resp = JsonRpcResponse {
@@ -526,7 +526,7 @@ impl Server {
result: None,
error: Some(JsonRpcError {
code: -32603,
message: "Internal error: dispatcher not available".to_string(),
message: "Internal error: supervisor not available".to_string(),
data: None,
}),
id: client_rpc_id,
@@ -538,7 +538,7 @@ impl Server {
let client_rpc_id_clone = client_rpc_id.clone();
let fut = async move {
dispatcher.get_job_output(&job_id).await
supervisor.get_job_output(&job_id).await
};
ctx.spawn(
@@ -625,7 +625,7 @@ impl Server {
}
};
let dispatcher = match self.dispatcher.clone() {
let supervisor = match self.supervisor.clone() {
Some(d) => d,
None => {
let err_resp = JsonRpcResponse {
@@ -633,7 +633,7 @@ impl Server {
result: None,
error: Some(JsonRpcError {
code: -32603,
message: "Internal error: dispatcher not available".to_string(),
message: "Internal error: supervisor not available".to_string(),
data: None,
}),
id: client_rpc_id,
@@ -645,7 +645,7 @@ impl Server {
let client_rpc_id_clone = client_rpc_id.clone();
let fut = async move {
dispatcher.get_job_logs(&job_id).await
supervisor.get_job_logs(&job_id).await
};
ctx.spawn(
@@ -733,7 +733,7 @@ impl Server {
}
};
let dispatcher = match self.dispatcher.clone() {
let supervisor = match self.supervisor.clone() {
Some(d) => d,
None => {
let err_resp = JsonRpcResponse {
@@ -741,7 +741,7 @@ impl Server {
result: None,
error: Some(JsonRpcError {
code: -32603,
message: "Internal error: dispatcher not available".to_string(),
message: "Internal error: supervisor not available".to_string(),
data: None,
}),
id: client_rpc_id,
@@ -753,7 +753,7 @@ impl Server {
let client_rpc_id_clone = client_rpc_id.clone();
let fut = async move {
dispatcher.stop_job(&job_id).await
supervisor.stop_job(&job_id).await
};
ctx.spawn(
@@ -840,7 +840,7 @@ impl Server {
}
};
let dispatcher = match self.dispatcher.clone() {
let supervisor = match self.supervisor.clone() {
Some(d) => d,
None => {
let err_resp = JsonRpcResponse {
@@ -848,7 +848,7 @@ impl Server {
result: None,
error: Some(JsonRpcError {
code: -32603,
message: "Internal error: dispatcher not available".to_string(),
message: "Internal error: supervisor not available".to_string(),
data: None,
}),
id: client_rpc_id,
@@ -860,7 +860,7 @@ impl Server {
let client_rpc_id_clone = client_rpc_id.clone();
let fut = async move {
dispatcher.delete_job(&job_id).await
supervisor.delete_job(&job_id).await
};
ctx.spawn(
@@ -929,7 +929,7 @@ impl Server {
return;
}
let dispatcher = match self.dispatcher.clone() {
let supervisor = match self.supervisor.clone() {
Some(d) => d,
None => {
let err_resp = JsonRpcResponse {
@@ -937,7 +937,7 @@ impl Server {
result: None,
error: Some(JsonRpcError {
code: -32603,
message: "Internal error: dispatcher not available".to_string(),
message: "Internal error: supervisor not available".to_string(),
data: None,
}),
id: client_rpc_id,
@@ -949,7 +949,7 @@ impl Server {
let client_rpc_id_clone = client_rpc_id.clone();
let fut = async move {
dispatcher.clear_all_jobs().await
supervisor.clear_all_jobs().await
};
ctx.spawn(

View File

@@ -3,7 +3,7 @@ use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer};
use actix_web_actors::ws;
use log::{info, error}; // Added error for better logging
use once_cell::sync::Lazy;
use hero_dispatcher::{Dispatcher, DispatcherBuilder, DispatcherError};
use hero_supervisor::{Supervisor, SupervisorBuilder, SupervisorError};
use hero_job::{Job, JobStatus};
use rustls::pki_types::PrivateKeyDer;
use rustls::ServerConfig as RustlsServerConfig;
@@ -211,7 +211,7 @@ pub struct Server {
pub circles: HashMap<String, Vec<String>>,
nonce_store: HashMap<String, NonceResponse>,
authenticated_pubkey: Option<String>,
pub dispatcher: Option<Dispatcher>,
pub supervisor: Option<Supervisor>,
}
impl Server {
@@ -552,15 +552,15 @@ impl Server {
let fut = async move {
let caller_id = public_key.unwrap_or_else(|| "anonymous".to_string());
match DispatcherBuilder::new()
match SupervisorBuilder::new()
.redis_url(&redis_url_clone)
.caller_id(&caller_id)
.build() {
Ok(hero_dispatcher) => {
hero_dispatcher
Ok(hero_supervisor) => {
hero_supervisor
.new_job()
.context_id(&circle_pk_clone)
.script_type(hero_dispatcher::ScriptType::RhaiSAL)
.script_type(hero_supervisor::ScriptType::RhaiSAL)
.script(&script_content)
.timeout(TASK_TIMEOUT_DURATION)
.await_response()
@@ -574,7 +574,7 @@ impl Server {
fut.into_actor(self)
.map(move |res, _act, ctx_inner| match res {
Ok(output) => {
// The dispatcher returns the actual string output from job execution
// The supervisor returns the actual string output from job execution
let result_value = PlayResult { output };
let resp = JsonRpcResponse {
jsonrpc: "2.0".to_string(),
@@ -586,7 +586,7 @@ impl Server {
}
Err(e) => {
let (code, message) = match e {
DispatcherError::Timeout(task_id) => (
SupervisorError::Timeout(task_id) => (
-32002,
format!(
"Timeout waiting for Rhai script (task: {})",