@neutralauth/internal-auth 0.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +39 -0
- package/dist/auth-config.d.ts +43 -0
- package/dist/auth-config.d.ts.map +1 -0
- package/dist/auth-config.js +43 -0
- package/dist/auth-config.js.map +1 -0
- package/dist/auth-options.d.ts +3 -0
- package/dist/auth-options.d.ts.map +1 -0
- package/dist/auth-options.js +40 -0
- package/dist/auth-options.js.map +1 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +4 -0
- package/dist/auth.js.map +1 -0
- package/dist/client/adapter-utils.d.ts +66 -0
- package/dist/client/adapter-utils.d.ts.map +1 -0
- package/dist/client/adapter-utils.js +437 -0
- package/dist/client/adapter-utils.js.map +1 -0
- package/dist/client/adapter.d.ts +14 -0
- package/dist/client/adapter.d.ts.map +1 -0
- package/dist/client/adapter.js +274 -0
- package/dist/client/adapter.js.map +1 -0
- package/dist/client/create-api.d.ts +141 -0
- package/dist/client/create-api.d.ts.map +1 -0
- package/dist/client/create-api.js +205 -0
- package/dist/client/create-api.js.map +1 -0
- package/dist/client/create-client.d.ts +183 -0
- package/dist/client/create-client.d.ts.map +1 -0
- package/dist/client/create-client.js +311 -0
- package/dist/client/create-client.js.map +1 -0
- package/dist/client/create-schema.d.ts +19 -0
- package/dist/client/create-schema.d.ts.map +1 -0
- package/dist/client/create-schema.js +114 -0
- package/dist/client/create-schema.js.map +1 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +10 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/plugins/index.d.ts +3 -0
- package/dist/client/plugins/index.d.ts.map +1 -0
- package/dist/client/plugins/index.js +3 -0
- package/dist/client/plugins/index.js.map +1 -0
- package/dist/component/_generated/api.d.ts +36 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +787 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/adapter.d.ts +130 -0
- package/dist/component/adapter.d.ts.map +1 -0
- package/dist/component/adapter.js +5 -0
- package/dist/component/adapter.js.map +1 -0
- package/dist/component/adapterTest.d.ts +10 -0
- package/dist/component/adapterTest.d.ts.map +1 -0
- package/dist/component/adapterTest.js +409 -0
- package/dist/component/adapterTest.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +4 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/schema.d.ts +474 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +139 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/nextjs/client.d.ts +4 -0
- package/dist/nextjs/client.d.ts.map +1 -0
- package/dist/nextjs/client.js +37 -0
- package/dist/nextjs/client.js.map +1 -0
- package/dist/nextjs/index.d.ts +22 -0
- package/dist/nextjs/index.d.ts.map +1 -0
- package/dist/nextjs/index.js +98 -0
- package/dist/nextjs/index.js.map +1 -0
- package/dist/plugins/convex/client.d.ts +6 -0
- package/dist/plugins/convex/client.d.ts.map +1 -0
- package/dist/plugins/convex/client.js +7 -0
- package/dist/plugins/convex/client.js.map +1 -0
- package/dist/plugins/convex/index.d.ts +322 -0
- package/dist/plugins/convex/index.d.ts.map +1 -0
- package/dist/plugins/convex/index.js +422 -0
- package/dist/plugins/convex/index.js.map +1 -0
- package/dist/plugins/cross-domain/client.d.ts +132 -0
- package/dist/plugins/cross-domain/client.d.ts.map +1 -0
- package/dist/plugins/cross-domain/client.js +192 -0
- package/dist/plugins/cross-domain/client.js.map +1 -0
- package/dist/plugins/cross-domain/index.d.ts +51 -0
- package/dist/plugins/cross-domain/index.d.ts.map +1 -0
- package/dist/plugins/cross-domain/index.js +173 -0
- package/dist/plugins/cross-domain/index.js.map +1 -0
- package/dist/plugins/index.d.ts +3 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/react/index.d.ts +80 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +190 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react-start/index.d.ts +13 -0
- package/dist/react-start/index.d.ts.map +1 -0
- package/dist/react-start/index.js +101 -0
- package/dist/react-start/index.js.map +1 -0
- package/dist/utils/index.d.ts +33 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +91 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +208 -0
- package/src/auth-config.ts +80 -0
- package/src/auth-options.ts +54 -0
- package/src/auth.ts +4 -0
- package/src/client/adapter-utils.ts +639 -0
- package/src/client/adapter.test.ts +83 -0
- package/src/client/adapter.ts +363 -0
- package/src/client/create-api.ts +339 -0
- package/src/client/create-client.ts +452 -0
- package/src/client/create-schema.ts +166 -0
- package/src/client/index.ts +22 -0
- package/src/client/plugins/index.ts +2 -0
- package/src/component/_generated/api.ts +52 -0
- package/src/component/_generated/component.ts +2008 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +161 -0
- package/src/component/adapter.ts +13 -0
- package/src/component/adapterTest.ts +505 -0
- package/src/component/convex.config.ts +5 -0
- package/src/component/schema.ts +142 -0
- package/src/nextjs/client.tsx +54 -0
- package/src/nextjs/index.ts +152 -0
- package/src/plugins/convex/client.ts +9 -0
- package/src/plugins/convex/index.ts +596 -0
- package/src/plugins/cross-domain/client.test.ts +217 -0
- package/src/plugins/cross-domain/client.ts +234 -0
- package/src/plugins/cross-domain/index.ts +199 -0
- package/src/plugins/index.ts +2 -0
- package/src/react/index.tsx +304 -0
- package/src/react-start/index.ts +153 -0
- package/src/react-start/vite-env.d.ts +2 -0
- package/src/test.ts +18 -0
- package/src/utils/index.ts +171 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Component, useCallback, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { Authenticated, ConvexProviderWithAuth, useConvexAuth, useQuery, } from "convex/react";
|
|
4
|
+
/**
|
|
5
|
+
* A wrapper React component which provides a {@link react.ConvexReactClient}
|
|
6
|
+
* authenticated with Better Auth.
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
export function ConvexBetterAuthProvider({ children, client, authClient, initialToken, }) {
|
|
11
|
+
const useBetterAuth = useUseAuthFromBetterAuth(authClient, initialToken);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
(async () => {
|
|
14
|
+
const url = new URL(window.location?.href);
|
|
15
|
+
const token = url.searchParams.get("ott");
|
|
16
|
+
if (token) {
|
|
17
|
+
const authClientWithCrossDomain = authClient;
|
|
18
|
+
url.searchParams.delete("ott");
|
|
19
|
+
const result = await authClientWithCrossDomain.crossDomain.oneTimeToken.verify({
|
|
20
|
+
token,
|
|
21
|
+
});
|
|
22
|
+
const session = result.data?.session;
|
|
23
|
+
if (session) {
|
|
24
|
+
await authClient.getSession({
|
|
25
|
+
fetchOptions: {
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: `Bearer ${session.token}`,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
authClientWithCrossDomain.updateSession();
|
|
32
|
+
}
|
|
33
|
+
window.history.replaceState({}, "", url);
|
|
34
|
+
}
|
|
35
|
+
})();
|
|
36
|
+
}, [authClient]);
|
|
37
|
+
return (_jsx(ConvexProviderWithAuth, { client: client, useAuth: useBetterAuth, children: _jsx(_Fragment, { children: children }) }));
|
|
38
|
+
}
|
|
39
|
+
let initialTokenUsed = false;
|
|
40
|
+
function useUseAuthFromBetterAuth(authClient, initialToken) {
|
|
41
|
+
const [cachedToken, setCachedToken] = useState(initialTokenUsed ? null : (initialToken ?? null));
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (!initialTokenUsed) {
|
|
44
|
+
initialTokenUsed = true;
|
|
45
|
+
}
|
|
46
|
+
}, []);
|
|
47
|
+
return useMemo(() => function useAuthFromBetterAuth() {
|
|
48
|
+
const { data: session, isPending: isSessionPending } = authClient.useSession();
|
|
49
|
+
const sessionId = session?.session?.id;
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!session && !isSessionPending && cachedToken) {
|
|
52
|
+
setCachedToken(null);
|
|
53
|
+
}
|
|
54
|
+
}, [session, isSessionPending]);
|
|
55
|
+
const fetchAccessToken = useCallback(async ({ forceRefreshToken = false, } = {}) => {
|
|
56
|
+
if (cachedToken && !forceRefreshToken) {
|
|
57
|
+
return cachedToken;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const { data } = await authClient.convex.token();
|
|
61
|
+
const token = data?.token || null;
|
|
62
|
+
setCachedToken(token);
|
|
63
|
+
return token;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
setCachedToken(null);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
// Build a new fetchAccessToken to trigger setAuth() whenever the
|
|
71
|
+
// session changes.
|
|
72
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
73
|
+
[sessionId]);
|
|
74
|
+
return useMemo(() => ({
|
|
75
|
+
isLoading: isSessionPending && !cachedToken,
|
|
76
|
+
isAuthenticated: Boolean(session?.session) || cachedToken !== null,
|
|
77
|
+
fetchAccessToken,
|
|
78
|
+
}),
|
|
79
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
80
|
+
[isSessionPending, sessionId, fetchAccessToken, cachedToken]);
|
|
81
|
+
}, [authClient]);
|
|
82
|
+
}
|
|
83
|
+
class ErrorBoundary extends Component {
|
|
84
|
+
constructor(props) {
|
|
85
|
+
super(props);
|
|
86
|
+
this.state = {};
|
|
87
|
+
}
|
|
88
|
+
static defaultProps = {
|
|
89
|
+
renderFallback: () => null,
|
|
90
|
+
};
|
|
91
|
+
static getDerivedStateFromError(error) {
|
|
92
|
+
return { error };
|
|
93
|
+
}
|
|
94
|
+
async componentDidCatch(error) {
|
|
95
|
+
if (this.props.isAuthError(error)) {
|
|
96
|
+
await this.props.onUnauth();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
render() {
|
|
100
|
+
if (this.state.error && this.props.isAuthError(this.state.error)) {
|
|
101
|
+
return this.props.renderFallback?.();
|
|
102
|
+
}
|
|
103
|
+
return this.props.children;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Subscribe to the session validated user to keep this check reactive to
|
|
107
|
+
// actual user auth state at the provider level (rather than just jwt validity state).
|
|
108
|
+
const UserSubscription = ({ getAuthUserFn, }) => {
|
|
109
|
+
useQuery(getAuthUserFn);
|
|
110
|
+
return null;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* _Experimental_
|
|
114
|
+
*
|
|
115
|
+
* A wrapper React component which provides error handling for auth related errors.
|
|
116
|
+
* This is typically used to redirect the user to the login page when they are
|
|
117
|
+
* unauthenticated, and does so reactively based on the getAuthUserFn query.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```ts
|
|
121
|
+
* // convex/auth.ts
|
|
122
|
+
* export const { getAuthUser } = authComponent.clientApi();
|
|
123
|
+
*
|
|
124
|
+
* // auth-client.tsx
|
|
125
|
+
* import { AuthBoundary } from "@convex-dev/react";
|
|
126
|
+
* import { api } from '../../convex/_generated/api'
|
|
127
|
+
* import { isAuthError } from '../lib/utils'
|
|
128
|
+
*
|
|
129
|
+
* export const ClientAuthBoundary = ({ children }: PropsWithChildren) => {
|
|
130
|
+
* return (
|
|
131
|
+
* <AuthBoundary
|
|
132
|
+
* onUnauth={() => redirect("/sign-in")}
|
|
133
|
+
* authClient={authClient}
|
|
134
|
+
* getAuthUserFn={api.auth.getAuthUser}
|
|
135
|
+
* isAuthError={isAuthError}
|
|
136
|
+
* >
|
|
137
|
+
* <>{children}</>
|
|
138
|
+
* </AuthBoundary>
|
|
139
|
+
* )
|
|
140
|
+
* ```
|
|
141
|
+
* @param props.children - Children to render.
|
|
142
|
+
* @param props.onUnauth - Function to call when the user is
|
|
143
|
+
* unauthenticated. Typically a redirect to the login page.
|
|
144
|
+
* @param props.authClient - Better Auth authClient to use.
|
|
145
|
+
* @param props.renderFallback - Fallback component to render when the user is
|
|
146
|
+
* unauthenticated. Defaults to null. Generally not rendered as error handling
|
|
147
|
+
* is typically a redirect.
|
|
148
|
+
* @param props.getAuthUserFn - Reference to a Convex query that returns user.
|
|
149
|
+
* The component provides a query for this via `export const { getAuthUser } = authComponent.clientApi()`.
|
|
150
|
+
* @param props.isAuthError - Function to check if the error is auth related.
|
|
151
|
+
*/
|
|
152
|
+
export const AuthBoundary = ({ children,
|
|
153
|
+
/**
|
|
154
|
+
* The function to call when the user is unauthenticated. Typically a redirect
|
|
155
|
+
* to the login page.
|
|
156
|
+
*/
|
|
157
|
+
onUnauth,
|
|
158
|
+
/**
|
|
159
|
+
* The Better Auth authClient to use.
|
|
160
|
+
*/
|
|
161
|
+
authClient,
|
|
162
|
+
/**
|
|
163
|
+
* The fallback to render when the user is unauthenticated. Defaults to null.
|
|
164
|
+
* Generally not rendered as error handling is typically a redirect.
|
|
165
|
+
*/
|
|
166
|
+
renderFallback,
|
|
167
|
+
/**
|
|
168
|
+
* The function to call to get the auth user.
|
|
169
|
+
*/
|
|
170
|
+
getAuthUserFn,
|
|
171
|
+
/**
|
|
172
|
+
* The function to call to check if the error is auth related.
|
|
173
|
+
*/
|
|
174
|
+
isAuthError, }) => {
|
|
175
|
+
const { isAuthenticated, isLoading } = useConvexAuth();
|
|
176
|
+
const handleUnauth = useCallback(async () => {
|
|
177
|
+
// Auth request that will clear cookies if session is invalid
|
|
178
|
+
await authClient.getSession();
|
|
179
|
+
await onUnauth();
|
|
180
|
+
}, [onUnauth]);
|
|
181
|
+
useEffect(() => {
|
|
182
|
+
void (async () => {
|
|
183
|
+
if (!isLoading && !isAuthenticated) {
|
|
184
|
+
await handleUnauth();
|
|
185
|
+
}
|
|
186
|
+
})();
|
|
187
|
+
}, [isLoading, isAuthenticated]);
|
|
188
|
+
return (_jsxs(ErrorBoundary, { onUnauth: handleUnauth, isAuthError: isAuthError, renderFallback: renderFallback, children: [_jsx(Authenticated, { children: _jsx(UserSubscription, { getAuthUserFn: getAuthUserFn }) }), children] }));
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FunctionReference, FunctionReturnType, OptionalRestArgs } from "convex/server";
|
|
2
|
+
import type { GetTokenOptions } from "../utils/index.js";
|
|
3
|
+
export declare const convexBetterAuthReactStart: (opts: Omit<GetTokenOptions, "forceRefresh"> & {
|
|
4
|
+
convexUrl: string;
|
|
5
|
+
convexSiteUrl: string;
|
|
6
|
+
}) => {
|
|
7
|
+
getToken: () => Promise<string | undefined>;
|
|
8
|
+
handler: (request: Request) => Promise<Response>;
|
|
9
|
+
fetchAuthQuery: <Query extends FunctionReference<"query">>(query: Query, ...args: OptionalRestArgs<Query>) => Promise<FunctionReturnType<Query>>;
|
|
10
|
+
fetchAuthMutation: <Mutation extends FunctionReference<"mutation">>(mutation: Mutation, ...args: OptionalRestArgs<Mutation>) => Promise<FunctionReturnType<Mutation>>;
|
|
11
|
+
fetchAuthAction: <Action extends FunctionReference<"action">>(action: Action, ...args: OptionalRestArgs<Action>) => Promise<FunctionReturnType<Action>>;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react-start/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAuEzD,eAAO,MAAM,0BAA0B,GACrC,MAAM,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,GAAG;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;;uBAwCoB,OAAO;qBACH,KAAK,SAAS,iBAAiB,CAAC,OAAO,CAAC,SACtD,KAAK,WACH,gBAAgB,CAAC,KAAK,CAAC,KAC/B,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;wBAMX,QAAQ,SAAS,iBAAiB,CAAC,UAAU,CAAC,YAC5D,QAAQ,WACT,gBAAgB,CAAC,QAAQ,CAAC,KAClC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;sBAMhB,MAAM,SAAS,iBAAiB,CAAC,QAAQ,CAAC,UACxD,MAAM,WACL,gBAAgB,CAAC,MAAM,CAAC,KAChC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;CAOzC,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { stripIndent } from "common-tags";
|
|
2
|
+
import { ConvexHttpClient } from "convex/browser";
|
|
3
|
+
import { getToken } from "../utils/index.js";
|
|
4
|
+
import React from "react";
|
|
5
|
+
// Caching supported for React 19+ only
|
|
6
|
+
const cache = React.cache ||
|
|
7
|
+
((fn) => {
|
|
8
|
+
return (...args) => fn(...args);
|
|
9
|
+
});
|
|
10
|
+
function setupClient(options) {
|
|
11
|
+
const client = new ConvexHttpClient(options.convexUrl);
|
|
12
|
+
if (options.token !== undefined) {
|
|
13
|
+
client.setAuth(options.token);
|
|
14
|
+
}
|
|
15
|
+
// @ts-expect-error - setFetchOptions is internal
|
|
16
|
+
client.setFetchOptions({ cache: "no-store" });
|
|
17
|
+
return client;
|
|
18
|
+
}
|
|
19
|
+
const parseConvexSiteUrl = (url) => {
|
|
20
|
+
if (!url) {
|
|
21
|
+
throw new Error(stripIndent `
|
|
22
|
+
CONVEX_SITE_URL is not set.
|
|
23
|
+
This is automatically set in the Convex backend, but must be set in the TanStack Start environment.
|
|
24
|
+
For local development, this can be set in the .env.local file.
|
|
25
|
+
`);
|
|
26
|
+
}
|
|
27
|
+
if (url.endsWith(".convex.cloud")) {
|
|
28
|
+
throw new Error(stripIndent `
|
|
29
|
+
CONVEX_SITE_URL should be set to your Convex Site URL, which ends in .convex.site.
|
|
30
|
+
Currently set to ${url}.
|
|
31
|
+
`);
|
|
32
|
+
}
|
|
33
|
+
return url;
|
|
34
|
+
};
|
|
35
|
+
const handler = (request, opts) => {
|
|
36
|
+
const requestUrl = new URL(request.url);
|
|
37
|
+
const nextUrl = `${opts.convexSiteUrl}${requestUrl.pathname}${requestUrl.search}`;
|
|
38
|
+
const headers = new Headers(request.headers);
|
|
39
|
+
headers.set("accept-encoding", "application/json");
|
|
40
|
+
headers.set("host", new URL(opts.convexSiteUrl).host);
|
|
41
|
+
return fetch(nextUrl, {
|
|
42
|
+
method: request.method,
|
|
43
|
+
headers,
|
|
44
|
+
redirect: "manual",
|
|
45
|
+
body: request.body,
|
|
46
|
+
// @ts-expect-error - duplex is required for streaming request bodies in modern fetch
|
|
47
|
+
duplex: "half",
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
export const convexBetterAuthReactStart = (opts) => {
|
|
51
|
+
const siteUrl = parseConvexSiteUrl(opts.convexSiteUrl);
|
|
52
|
+
const cachedGetToken = cache(async (opts) => {
|
|
53
|
+
const { getRequestHeaders } = await import("@tanstack/react-start/server");
|
|
54
|
+
const headers = getRequestHeaders();
|
|
55
|
+
return getToken(siteUrl, headers, opts);
|
|
56
|
+
});
|
|
57
|
+
const callWithToken = async (fn) => {
|
|
58
|
+
const token = (await cachedGetToken(opts)) ?? {};
|
|
59
|
+
try {
|
|
60
|
+
return await fn(token?.token);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (!opts?.jwtCache?.enabled ||
|
|
64
|
+
token.isFresh ||
|
|
65
|
+
opts.jwtCache?.isAuthError(error)) {
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
const newToken = await cachedGetToken({
|
|
69
|
+
...opts,
|
|
70
|
+
forceRefresh: true,
|
|
71
|
+
});
|
|
72
|
+
return await fn(newToken.token);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
getToken: async () => {
|
|
77
|
+
const token = await cachedGetToken(opts);
|
|
78
|
+
return token.token;
|
|
79
|
+
},
|
|
80
|
+
handler: (request) => handler(request, opts),
|
|
81
|
+
fetchAuthQuery: async (query, ...args) => {
|
|
82
|
+
return callWithToken((token) => {
|
|
83
|
+
const client = setupClient({ ...opts, token });
|
|
84
|
+
return client.query(query, ...args);
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
fetchAuthMutation: async (mutation, ...args) => {
|
|
88
|
+
return callWithToken((token) => {
|
|
89
|
+
const client = setupClient({ ...opts, token });
|
|
90
|
+
return client.mutation(mutation, ...args);
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
fetchAuthAction: async (action, ...args) => {
|
|
94
|
+
return callWithToken((token) => {
|
|
95
|
+
const client = setupClient({ ...opts, token });
|
|
96
|
+
return client.action(action, ...args);
|
|
97
|
+
});
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react-start/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Auth } from "better-auth";
|
|
2
|
+
import type { betterAuth } from "better-auth/minimal";
|
|
3
|
+
import type { AuthProvider, DefaultFunctionArgs, FunctionReference, GenericActionCtx, GenericDataModel, GenericMutationCtx, GenericQueryCtx } from "convex/server";
|
|
4
|
+
import type { Jwk } from "better-auth/plugins/jwt";
|
|
5
|
+
export type CreateAuth<DataModel extends GenericDataModel, A extends ReturnType<typeof betterAuth> = Auth> = (ctx: GenericCtx<DataModel>) => A;
|
|
6
|
+
export type EventFunction<T extends DefaultFunctionArgs> = FunctionReference<"mutation", "internal" | "public", T>;
|
|
7
|
+
export type GenericCtx<DataModel extends GenericDataModel = GenericDataModel> = GenericQueryCtx<DataModel> | GenericMutationCtx<DataModel> | GenericActionCtx<DataModel>;
|
|
8
|
+
export type RunMutationCtx<DataModel extends GenericDataModel> = (GenericMutationCtx<DataModel> | GenericActionCtx<DataModel>) & {
|
|
9
|
+
runMutation: GenericMutationCtx<DataModel>["runMutation"];
|
|
10
|
+
};
|
|
11
|
+
export declare const isQueryCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => ctx is GenericQueryCtx<DataModel>;
|
|
12
|
+
export declare const isMutationCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => ctx is GenericMutationCtx<DataModel>;
|
|
13
|
+
export declare const isActionCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => ctx is GenericActionCtx<DataModel>;
|
|
14
|
+
export declare const isRunMutationCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => ctx is RunMutationCtx<DataModel>;
|
|
15
|
+
export declare const requireQueryCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => GenericQueryCtx<DataModel>;
|
|
16
|
+
export declare const requireMutationCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => GenericMutationCtx<DataModel>;
|
|
17
|
+
export declare const requireActionCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => GenericActionCtx<DataModel>;
|
|
18
|
+
export declare const requireRunMutationCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => RunMutationCtx<DataModel>;
|
|
19
|
+
export type GetTokenOptions = {
|
|
20
|
+
forceRefresh?: boolean;
|
|
21
|
+
cookiePrefix?: string;
|
|
22
|
+
jwtCache?: {
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
expirationToleranceSeconds?: number;
|
|
25
|
+
isAuthError: (error: unknown) => boolean;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export declare const getToken: (siteUrl: string, headers: Headers, opts?: GetTokenOptions) => Promise<{
|
|
29
|
+
isFresh: boolean;
|
|
30
|
+
token: string | undefined;
|
|
31
|
+
}>;
|
|
32
|
+
export declare const parseJwks: (providerConfig: AuthProvider) => Jwk | undefined;
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { betterFetch } from "@better-fetch/fetch";
|
|
2
|
+
import { getSessionCookie } from "better-auth/cookies";
|
|
3
|
+
import { JWT_COOKIE_NAME } from "../plugins/convex/index.js";
|
|
4
|
+
import * as jose from "jose";
|
|
5
|
+
export const isQueryCtx = (ctx) => {
|
|
6
|
+
return "db" in ctx;
|
|
7
|
+
};
|
|
8
|
+
export const isMutationCtx = (ctx) => {
|
|
9
|
+
return "db" in ctx && "scheduler" in ctx;
|
|
10
|
+
};
|
|
11
|
+
export const isActionCtx = (ctx) => {
|
|
12
|
+
return "runAction" in ctx;
|
|
13
|
+
};
|
|
14
|
+
export const isRunMutationCtx = (ctx) => {
|
|
15
|
+
return "runMutation" in ctx;
|
|
16
|
+
};
|
|
17
|
+
export const requireQueryCtx = (ctx) => {
|
|
18
|
+
if (!isQueryCtx(ctx)) {
|
|
19
|
+
throw new Error("Query context required");
|
|
20
|
+
}
|
|
21
|
+
return ctx;
|
|
22
|
+
};
|
|
23
|
+
export const requireMutationCtx = (ctx) => {
|
|
24
|
+
if (!isMutationCtx(ctx)) {
|
|
25
|
+
throw new Error("Mutation context required");
|
|
26
|
+
}
|
|
27
|
+
return ctx;
|
|
28
|
+
};
|
|
29
|
+
export const requireActionCtx = (ctx) => {
|
|
30
|
+
if (!isActionCtx(ctx)) {
|
|
31
|
+
throw new Error("Action context required");
|
|
32
|
+
}
|
|
33
|
+
return ctx;
|
|
34
|
+
};
|
|
35
|
+
export const requireRunMutationCtx = (ctx) => {
|
|
36
|
+
if (!isRunMutationCtx(ctx)) {
|
|
37
|
+
throw new Error("Mutation or action context required");
|
|
38
|
+
}
|
|
39
|
+
return ctx;
|
|
40
|
+
};
|
|
41
|
+
export const getToken = async (siteUrl, headers, opts) => {
|
|
42
|
+
const fetchToken = async () => {
|
|
43
|
+
const { data } = await betterFetch("/api/auth/convex/token", {
|
|
44
|
+
baseURL: siteUrl,
|
|
45
|
+
headers,
|
|
46
|
+
});
|
|
47
|
+
return { isFresh: true, token: data?.token };
|
|
48
|
+
};
|
|
49
|
+
if (!opts?.jwtCache?.enabled || opts.forceRefresh) {
|
|
50
|
+
return await fetchToken();
|
|
51
|
+
}
|
|
52
|
+
const token = getSessionCookie(new Headers(headers), {
|
|
53
|
+
cookieName: JWT_COOKIE_NAME,
|
|
54
|
+
cookiePrefix: opts?.cookiePrefix,
|
|
55
|
+
});
|
|
56
|
+
if (!token) {
|
|
57
|
+
return await fetchToken();
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const claims = jose.decodeJwt(token);
|
|
61
|
+
const exp = claims?.exp;
|
|
62
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
63
|
+
const isExpired = exp
|
|
64
|
+
? now > exp + (opts?.jwtCache?.expirationToleranceSeconds ?? 60)
|
|
65
|
+
: true;
|
|
66
|
+
if (!isExpired) {
|
|
67
|
+
return { isFresh: false, token };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// eslint-disable-next-line no-console
|
|
72
|
+
console.error("Error decoding JWT", error);
|
|
73
|
+
}
|
|
74
|
+
return await fetchToken();
|
|
75
|
+
};
|
|
76
|
+
export const parseJwks = (providerConfig) => {
|
|
77
|
+
const staticJwksString = "jwks" in providerConfig && providerConfig.jwks?.startsWith("data:text/")
|
|
78
|
+
? atob(providerConfig.jwks.split("base64,")[1])
|
|
79
|
+
: undefined;
|
|
80
|
+
if (!staticJwksString) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const parsed = JSON.parse(staticJwksString?.slice(1, -1).replaceAll(/[\s\\]/g, "") || "{}");
|
|
84
|
+
const staticJwks = {
|
|
85
|
+
...parsed,
|
|
86
|
+
privateKey: `"${parsed.privateKey}"`,
|
|
87
|
+
publicKey: `"${parsed.publicKey}"`,
|
|
88
|
+
};
|
|
89
|
+
return staticJwks;
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|