use liminal::protocol::{MessageEnvelope, SchemaId as ProtocolSchemaId};
use super::conversation::ConnectionConversation;
use super::services::{ConnectionServices, ConnectionSubscription, PublishOutcome};
use crate::ServerError;
use crate::config::types::ServiceProfile;
#[derive(Debug, Default, Clone, Copy)]
pub struct WorkerFrontDoorServices;
impl WorkerFrontDoorServices {
#[must_use]
pub const fn new() -> Self {
Self
}
fn unsupported(operation: &str) -> ServerError {
ServerError::UnsupportedOperation {
operation: operation.to_owned(),
profile: ServiceProfile::WORKER_FRONT_DOOR,
}
}
}
impl ConnectionServices for WorkerFrontDoorServices {
fn publish(
&self,
channel: &str,
_envelope: &MessageEnvelope,
_idempotency_key: Option<&str>,
) -> Result<PublishOutcome, ServerError> {
Err(Self::unsupported(&format!(
"publish to channel '{channel}'"
)))
}
fn subscribe(
&self,
channel: &str,
_accepted_schemas: &[ProtocolSchemaId],
_install: Option<liminal::channel::InboxInstall>,
) -> Result<ConnectionSubscription, ServerError> {
Err(Self::unsupported(&format!(
"subscribe to channel '{channel}'"
)))
}
fn unsubscribe(&self, subscription: ConnectionSubscription) -> Result<(), ServerError> {
subscription.unsubscribe()
}
fn open_conversation(
&self,
_conversation_id: u64,
subject: &str,
) -> Result<ConnectionConversation, ServerError> {
Err(Self::unsupported(&format!(
"opening conversation '{subject}'"
)))
}
fn conversation_message(
&self,
_conversation: &ConnectionConversation,
_envelope: &MessageEnvelope,
) -> Result<(), ServerError> {
Err(Self::unsupported("conversation message"))
}
fn close_conversation(&self, conversation: ConnectionConversation) -> Result<(), ServerError> {
conversation.close()
}
fn flush_durable_state(&self) -> Result<(), ServerError> {
Ok(())
}
fn supports_channel_operations(&self) -> bool {
false
}
}
#[cfg(test)]
mod tests {
use super::WorkerFrontDoorServices;
use crate::server::connection::services::ConnectionServices;
#[test]
fn construction_is_infallible_and_starts_no_scheduler() {
let services = WorkerFrontDoorServices::new();
assert!(
!services.supports_channel_operations(),
"the worker front door must report that it serves no channel operations"
);
}
}