Skip to main content

better_auth_api/plugins/endpoint_context/
owned.rs

1use super::EndpointContext;
2use better_auth_core::{AuthContext, AuthRequest, AuthResponse, AuthSchema};
3use std::{collections::HashMap, sync::Arc};
4
5/// Retained endpoint input and the same transaction adapter used by the original callback.
6/// SQL transactions reject database operations after finalization. Memory transactions
7/// retain their isolated rows, including row identities installed during commit.
8pub struct OwnedEndpointContext<S: AuthSchema> {
9    input_request: Option<AuthRequest>,
10    request: Option<AuthRequest>,
11    path: Option<String>,
12    params: HashMap<String, String>,
13    body: better_auth_core::FieldValue,
14    auth: AuthContext<S>,
15    transaction: Option<Arc<dyn better_auth_core::store::AuthTransaction<S>>>,
16    session: Option<(
17        better_auth_core::wire::UserView,
18        better_auth_core::wire::SessionView,
19    )>,
20    response: Option<AuthResponse>,
21}
22impl<S: AuthSchema> OwnedEndpointContext<S> {
23    /// Borrow the retained endpoint without resolving a new request or transaction.
24    pub fn as_endpoint(&self) -> EndpointContext<'_, S> {
25        EndpointContext {
26            input_request: self.input_request.as_ref(),
27            request: self.request.as_ref(),
28            path: self.path.as_deref(),
29            params: self.params.clone(),
30            body: self.body.clone(),
31            auth: &self.auth,
32            transaction: self.transaction.as_deref(),
33            session: self.session.clone(),
34            response: self.response.as_ref(),
35        }
36    }
37}
38impl<S: AuthSchema> EndpointContext<'_, S> {
39    /// Retain this endpoint for asynchronous work that may outlive its response.
40    pub fn to_owned(&self) -> OwnedEndpointContext<S> {
41        OwnedEndpointContext {
42            input_request: self.input_request.cloned(),
43            request: self.request.cloned(),
44            path: self.path.map(str::to_owned),
45            params: self.params.clone(),
46            body: self.body.clone(),
47            auth: self.auth.clone(),
48            transaction: self.transaction.map(|tx| tx.clone_handle()),
49            session: self.session.clone(),
50            response: self.response.cloned(),
51        }
52    }
53}