use super::OneTimeTokenPlugin;
use crate::plugins::endpoint_context::{EndpointContext, WithCallbacks};
use better_auth_core::{AuthPlugin, AuthResult, AuthSchema, session::NativeSessionData};
use std::{future::Future, pin::Pin, sync::Arc};
pub type OneTimeTokenGeneratorFuture<'a> =
Pin<Box<dyn Future<Output = AuthResult<String>> + Send + 'a>>;
type Generator<S> = dyn for<'a> Fn(&'a NativeSessionData, &'a EndpointContext<'_, S>) -> OneTimeTokenGeneratorFuture<'a>
+ Send
+ Sync;
pub struct OneTimeTokenCallbacks<S: AuthSchema> {
pub(super) generator: Arc<Generator<S>>,
}
impl<S: AuthSchema> OneTimeTokenCallbacks<S> {
pub fn generate<F>(callback: F) -> Self
where
F: for<'a> Fn(
&'a NativeSessionData,
&'a EndpointContext<'_, S>,
) -> OneTimeTokenGeneratorFuture<'a>
+ Send
+ Sync
+ 'static,
{
Self {
generator: Arc::new(callback),
}
}
}
impl OneTimeTokenPlugin {
pub fn callbacks<S: AuthSchema>(
self,
callbacks: OneTimeTokenCallbacks<S>,
) -> impl AuthPlugin<S> {
WithCallbacks {
plugin: self,
callbacks: Arc::new(callbacks),
}
}
}