use std::collections::HashMap;
use std::sync::Arc;
use super::functions;
use crate::connector::ConnectorRegistry;
pub struct HandlerDeps<'a> {
pub registry: Arc<ConnectorRegistry>,
pub client: reqwest::Client,
pub runtime: Arc<crate::runtime::RuntimeHandle>,
pub jwks: Arc<crate::jwt::jwks::JwksCache>,
pub engine_config: &'a crate::config::EngineConfig,
pub query_config: &'a crate::config::QueryConfig,
pub write_config: &'a crate::config::WriteConfig,
pub cache_pool: Arc<crate::connector::cache_backend::CachePool>,
pub sql_pool_cache: Arc<crate::connector::pool_cache::SqlPoolCache>,
pub mongo_pool_cache: Arc<crate::connector::mongo_pool::MongoPoolCache>,
pub smtp_pool_cache: Arc<crate::connector::smtp_pool::SmtpPoolCache>,
pub models: Option<Arc<crate::model::ModelsRuntime>>,
pub models_config: &'a crate::config::ModelsConfig,
}
fn register<H: functions::connector_handler::ConnectorHandler>(
fns: &mut HashMap<String, dataflow_rs::BoxedFunctionHandler>,
handler: H,
) {
fns.insert(
H::NAME.to_string(),
Box::new(functions::connector_handler::Connector(handler)),
);
}
pub fn build_custom_functions(
deps: HandlerDeps<'_>,
) -> HashMap<String, dataflow_rs::BoxedFunctionHandler> {
let HandlerDeps {
registry,
client,
runtime,
jwks,
engine_config,
query_config,
write_config,
cache_pool,
sql_pool_cache,
mongo_pool_cache,
smtp_pool_cache,
models,
models_config,
} = deps;
let mut fns: HashMap<String, dataflow_rs::BoxedFunctionHandler> = HashMap::new();
register(
&mut fns,
functions::http_call::HttpCallHandler {
registry: registry.clone(),
client: client.clone(),
},
);
fns.insert(
"channel_call".to_string(),
Box::new(functions::channel_call::ChannelCallHandler {
runtime: runtime.clone(),
max_call_depth: engine_config.max_channel_call_depth,
default_timeout_ms: engine_config.default_channel_call_timeout_ms,
}),
);
let models_config = Arc::new(models_config.clone());
fns.insert(
crate::model::handler::NAME.to_string(),
Box::new(crate::model::ModelInferHandler {
source: crate::model::ModelSource::Node(runtime),
host: models.map(|models| {
Arc::new(crate::model::InferenceHost::node(
&models,
models_config.clone(),
registry.clone(),
client.clone(),
))
}),
config: models_config,
}),
);
fns.insert(
"crypto".to_string(),
Box::new(functions::crypto::CryptoHandler),
);
fns.insert(
"jwt_sign".to_string(),
Box::new(functions::jwt_sign::JwtSignHandler),
);
fns.insert(
"jwt_verify".to_string(),
Box::new(functions::jwt_verify::JwtVerifyHandler { jwks }),
);
register(
&mut fns,
functions::send_email::SendEmailHandler {
registry: registry.clone(),
smtp_pool: smtp_pool_cache,
},
);
register(
&mut fns,
functions::storage_presign::StoragePresignHandler {
registry: registry.clone(),
},
);
register(
&mut fns,
functions::storage_head::StorageHeadHandler {
registry: registry.clone(),
client: client.clone(),
},
);
register(
&mut fns,
functions::publish_kafka::PublishKafkaHandler {
registry: registry.clone(),
producers: None,
},
);
register(
&mut fns,
functions::db_read::DbReadHandler {
pool_cache: sql_pool_cache.clone(),
registry: registry.clone(),
max_rows: query_config.max_limit as usize,
},
);
register(
&mut fns,
functions::db_write::DbWriteHandler {
pool_cache: sql_pool_cache.clone(),
registry: registry.clone(),
},
);
register(
&mut fns,
functions::data_query::DataQueryHandler {
pool_cache: sql_pool_cache.clone(),
mongo_pool_cache: mongo_pool_cache.clone(),
http_client: client.clone(),
registry: registry.clone(),
limits: query_config.clone(),
},
);
register(
&mut fns,
functions::data_write::DataWriteHandler {
pool_cache: sql_pool_cache,
mongo_pool_cache: mongo_pool_cache.clone(),
http_client: client.clone(),
registry: registry.clone(),
write_config: write_config.clone(),
max_returning: query_config.max_limit as usize,
},
);
register(
&mut fns,
functions::cache_read::CacheReadHandler {
cache_pool: cache_pool.clone(),
registry: registry.clone(),
},
);
register(
&mut fns,
functions::cache_write::CacheWriteHandler {
cache_pool,
registry: registry.clone(),
},
);
register(
&mut fns,
functions::mongo_read::MongoReadHandler {
pool_cache: mongo_pool_cache.clone(),
registry: registry.clone(),
limits: query_config.clone(),
},
);
register(
&mut fns,
functions::mongo_write::MongoWriteHandler {
pool_cache: mongo_pool_cache.clone(),
registry: registry.clone(),
write_config: write_config.clone(),
},
);
register(
&mut fns,
functions::mongo_aggregate::MongoAggregateHandler {
pool_cache: mongo_pool_cache,
registry: registry.clone(),
limits: query_config.clone(),
},
);
fns
}
pub fn register_kafka_publisher(
fns: &mut HashMap<String, dataflow_rs::BoxedFunctionHandler>,
registry: Arc<ConnectorRegistry>,
producers: Arc<crate::kafka::producer::KafkaProducerCache>,
) {
register(
fns,
functions::publish_kafka::PublishKafkaHandler {
registry,
producers: Some(producers),
},
);
}