@convex-dev/better-auth 0.9.11 → 0.10.0

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.
Files changed (102) hide show
  1. package/dist/auth-config.d.ts +43 -0
  2. package/dist/auth-config.d.ts.map +1 -0
  3. package/dist/auth-config.js +45 -0
  4. package/dist/auth-config.js.map +1 -0
  5. package/dist/auth-options.d.ts +3 -0
  6. package/dist/auth-options.d.ts.map +1 -0
  7. package/dist/auth-options.js +41 -0
  8. package/dist/auth-options.js.map +1 -0
  9. package/dist/auth.d.ts +1 -3
  10. package/dist/auth.d.ts.map +1 -1
  11. package/dist/auth.js +2 -42
  12. package/dist/auth.js.map +1 -1
  13. package/dist/client/{adapterUtils.d.ts → adapter-utils.d.ts} +15 -15
  14. package/dist/client/adapter-utils.d.ts.map +1 -0
  15. package/dist/client/{adapterUtils.js → adapter-utils.js} +1 -1
  16. package/dist/client/adapter-utils.js.map +1 -0
  17. package/dist/client/adapter.d.ts +1 -2
  18. package/dist/client/adapter.d.ts.map +1 -1
  19. package/dist/client/adapter.js +4 -4
  20. package/dist/client/adapter.js.map +1 -1
  21. package/dist/client/create-api.d.ts +139 -0
  22. package/dist/client/create-api.d.ts.map +1 -0
  23. package/dist/client/create-api.js +204 -0
  24. package/dist/client/create-api.js.map +1 -0
  25. package/dist/client/create-client.d.ts +183 -0
  26. package/dist/client/create-client.d.ts.map +1 -0
  27. package/dist/client/create-client.js +311 -0
  28. package/dist/client/create-client.js.map +1 -0
  29. package/dist/client/{createSchema.d.ts → create-schema.d.ts} +1 -1
  30. package/dist/client/create-schema.d.ts.map +1 -0
  31. package/dist/client/{createSchema.js → create-schema.js} +11 -5
  32. package/dist/client/create-schema.js.map +1 -0
  33. package/dist/client/index.d.ts +4 -279
  34. package/dist/client/index.d.ts.map +1 -1
  35. package/dist/client/index.js +6 -463
  36. package/dist/client/index.js.map +1 -1
  37. package/dist/component/_generated/component.d.ts +0 -3
  38. package/dist/component/_generated/component.d.ts.map +1 -1
  39. package/dist/component/adapter.d.ts +19 -21
  40. package/dist/component/adapter.d.ts.map +1 -1
  41. package/dist/component/adapter.js +2 -2
  42. package/dist/component/adapter.js.map +1 -1
  43. package/dist/component/schema.d.ts +50 -50
  44. package/dist/nextjs/client.d.ts +4 -0
  45. package/dist/nextjs/client.d.ts.map +1 -0
  46. package/dist/nextjs/client.js +37 -0
  47. package/dist/nextjs/client.js.map +1 -0
  48. package/dist/nextjs/index.d.ts +19 -7
  49. package/dist/nextjs/index.d.ts.map +1 -1
  50. package/dist/nextjs/index.js +90 -36
  51. package/dist/nextjs/index.js.map +1 -1
  52. package/dist/plugins/convex/client.d.ts +1 -1
  53. package/dist/plugins/convex/client.d.ts.map +1 -1
  54. package/dist/plugins/convex/client.js +0 -1
  55. package/dist/plugins/convex/client.js.map +1 -1
  56. package/dist/plugins/convex/index.d.ts +239 -227
  57. package/dist/plugins/convex/index.d.ts.map +1 -1
  58. package/dist/plugins/convex/index.js +191 -37
  59. package/dist/plugins/convex/index.js.map +1 -1
  60. package/dist/plugins/cross-domain/client.d.ts +3 -3
  61. package/dist/plugins/cross-domain/client.d.ts.map +1 -1
  62. package/dist/plugins/cross-domain/index.d.ts +15 -70
  63. package/dist/plugins/cross-domain/index.d.ts.map +1 -1
  64. package/dist/plugins/cross-domain/index.js +8 -0
  65. package/dist/plugins/cross-domain/index.js.map +1 -1
  66. package/dist/react/index.d.ts +52 -2
  67. package/dist/react/index.d.ts.map +1 -1
  68. package/dist/react/index.js +133 -9
  69. package/dist/react/index.js.map +1 -1
  70. package/dist/react-start/index.d.ts +11 -41
  71. package/dist/react-start/index.d.ts.map +1 -1
  72. package/dist/react-start/index.js +82 -106
  73. package/dist/react-start/index.js.map +1 -1
  74. package/dist/utils/index.d.ts +20 -2
  75. package/dist/utils/index.d.ts.map +1 -1
  76. package/dist/utils/index.js +54 -1
  77. package/dist/utils/index.js.map +1 -1
  78. package/package.json +19 -12
  79. package/src/auth-config.ts +82 -0
  80. package/src/auth-options.ts +54 -0
  81. package/src/auth.ts +3 -56
  82. package/src/client/adapter.ts +5 -5
  83. package/src/client/create-api.ts +337 -0
  84. package/src/client/create-client.ts +446 -0
  85. package/src/client/{createSchema.ts → create-schema.ts} +10 -4
  86. package/src/client/index.ts +22 -771
  87. package/src/component/_generated/component.ts +0 -7
  88. package/src/component/adapter.ts +2 -3
  89. package/src/nextjs/client.tsx +52 -0
  90. package/src/nextjs/index.ts +138 -45
  91. package/src/plugins/convex/client.ts +1 -1
  92. package/src/plugins/convex/index.ts +337 -51
  93. package/src/plugins/cross-domain/index.ts +10 -2
  94. package/src/react/index.tsx +195 -9
  95. package/src/react-start/index.ts +126 -171
  96. package/src/test.ts +1 -1
  97. package/src/utils/index.ts +96 -1
  98. package/dist/client/adapterUtils.d.ts.map +0 -1
  99. package/dist/client/adapterUtils.js.map +0 -1
  100. package/dist/client/createSchema.d.ts.map +0 -1
  101. package/dist/client/createSchema.js.map +0 -1
  102. /package/src/client/{adapterUtils.ts → adapter-utils.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE7E,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,KAAK,sBAAsB,GAAG,CAC1B,iBAAiB,GACjB,YAAY,GACZ,sBAAsB,CACzB,EAAE,CAAC;AACJ,KAAK,yBAAyB,GAAG,CAAC,YAAY,GAAG,sBAAsB,CAAC,EAAE,CAAC;AAC3E,KAAK,qBAAqB,CACxB,OAAO,SAAS,sBAAsB,GAAG,yBAAyB,IAChE,UAAU,CACZ,OAAO,gBAAgB,CACrB,sBAAsB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB,CACF,CACF,CAAC;AACF,MAAM,MAAM,UAAU,GAClB,qBAAqB,CAAC,sBAAsB,CAAC,GAC7C,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;AAIrD,KAAK,kBAAkB,GAAG;IACxB,OAAO,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC5C,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,QAAQ,EACR,MAAM,EACN,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;CACxB,2CAmCA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAOvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,KAAK,sBAAsB,GAAG,CAC1B,iBAAiB,GACjB,YAAY,GACZ,sBAAsB,CACzB,EAAE,CAAC;AACJ,KAAK,yBAAyB,GAAG,CAAC,YAAY,GAAG,sBAAsB,CAAC,EAAE,CAAC;AAC3E,KAAK,qBAAqB,CACxB,OAAO,SAAS,sBAAsB,GAAG,yBAAyB,IAChE,UAAU,CACZ,OAAO,gBAAgB,CACrB,sBAAsB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB,CACF,CACF,CAAC;AACF,MAAM,MAAM,UAAU,GAClB,qBAAqB,CAAC,sBAAsB,CAAC,GAC7C,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;AAIrD,KAAK,kBAAkB,GAAG;IACxB,OAAO,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC5C,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,QAAQ,EACR,MAAM,EACN,UAAU,EACV,YAAY,GACb,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,2CAkCA;AA6GD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,eAAO,MAAM,YAAY,GAAI,iFAwB1B,iBAAiB,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACvC,aAAa,EAAE,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjE,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC1C,CAAC,4CA4BD,CAAC"}
@@ -1,8 +1,7 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect } from "react";
3
- import { useCallback, useMemo } from "react";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Component, useCallback, useEffect, useMemo, useState, } from "react";
4
3
  import {} from "convex/browser";
5
- import { ConvexProviderWithAuth } from "convex/react";
4
+ import { Authenticated, ConvexProviderWithAuth, useConvexAuth, useQuery, } from "convex/react";
6
5
  import {} from "better-auth";
7
6
  import { createAuthClient } from "better-auth/react";
8
7
  import { convexClient, crossDomainClient } from "../client/plugins/index.js";
@@ -12,8 +11,8 @@ import { convexClient, crossDomainClient } from "../client/plugins/index.js";
12
11
  *
13
12
  * @public
14
13
  */
15
- export function ConvexBetterAuthProvider({ children, client, authClient, }) {
16
- const useBetterAuth = useUseAuthFromBetterAuth(authClient);
14
+ export function ConvexBetterAuthProvider({ children, client, authClient, initialToken, }) {
15
+ const useBetterAuth = useUseAuthFromBetterAuth(authClient, initialToken);
17
16
  useEffect(() => {
18
17
  (async () => {
19
18
  const url = new URL(window.location?.href);
@@ -41,16 +40,34 @@ export function ConvexBetterAuthProvider({ children, client, authClient, }) {
41
40
  }, [authClient]);
42
41
  return (_jsx(ConvexProviderWithAuth, { client: client, useAuth: useBetterAuth, children: children }));
43
42
  }
44
- function useUseAuthFromBetterAuth(authClient) {
43
+ let initialTokenUsed = false;
44
+ function useUseAuthFromBetterAuth(authClient, initialToken) {
45
+ const [cachedToken, setCachedToken] = useState(initialTokenUsed ? (initialToken ?? null) : null);
46
+ useEffect(() => {
47
+ if (!initialTokenUsed) {
48
+ initialTokenUsed = true;
49
+ }
50
+ }, []);
45
51
  return useMemo(() => function useAuthFromBetterAuth() {
46
52
  const { data: session, isPending: isSessionPending } = authClient.useSession();
47
53
  const sessionId = session?.session?.id;
48
- const fetchAccessToken = useCallback(async () => {
54
+ useEffect(() => {
55
+ if (!session && !isSessionPending && cachedToken) {
56
+ setCachedToken(null);
57
+ }
58
+ }, [session, isSessionPending]);
59
+ const fetchAccessToken = useCallback(async ({ forceRefreshToken = false, } = {}) => {
60
+ if (cachedToken && !forceRefreshToken) {
61
+ return cachedToken;
62
+ }
49
63
  try {
50
64
  const { data } = await authClient.convex.token();
51
- return data?.token || null;
65
+ const token = data?.token || null;
66
+ setCachedToken(token);
67
+ return token;
52
68
  }
53
69
  catch {
70
+ setCachedToken(null);
54
71
  return null;
55
72
  }
56
73
  },
@@ -67,4 +84,111 @@ function useUseAuthFromBetterAuth(authClient) {
67
84
  [isSessionPending, sessionId, fetchAccessToken]);
68
85
  }, [authClient]);
69
86
  }
87
+ class ErrorBoundary extends Component {
88
+ constructor(props) {
89
+ super(props);
90
+ this.state = {};
91
+ }
92
+ static defaultProps = {
93
+ renderFallback: () => null,
94
+ };
95
+ static getDerivedStateFromError(error) {
96
+ return { error };
97
+ }
98
+ async componentDidCatch(error) {
99
+ if (this.props.isAuthError(error)) {
100
+ await this.props.onUnauth();
101
+ }
102
+ }
103
+ render() {
104
+ if (this.state.error && this.props.isAuthError(this.state.error)) {
105
+ return this.props.renderFallback?.();
106
+ }
107
+ return this.props.children;
108
+ }
109
+ }
110
+ // Subscribe to the session validated user to keep this check reactive to
111
+ // actual user auth state at the provider level (rather than just jwt validity state).
112
+ const UserSubscription = ({ getAuthUserFn, }) => {
113
+ useQuery(getAuthUserFn);
114
+ return null;
115
+ };
116
+ /**
117
+ * _Experimental_
118
+ *
119
+ * A wrapper React component which provides error handling for auth related errors.
120
+ * This is typically used to redirect the user to the login page when they are
121
+ * unauthenticated, and does so reactively based on the getAuthUserFn query.
122
+ *
123
+ * @example
124
+ * ```ts
125
+ * // convex/auth.ts
126
+ * export const { getAuthUser } = authComponent.clientApi();
127
+ *
128
+ * // auth-client.tsx
129
+ * import { AuthBoundary } from "@convex-dev/react";
130
+ * import { api } from '../../convex/_generated/api'
131
+ * import { isAuthError } from '../lib/utils'
132
+ *
133
+ * export const ClientAuthBoundary = ({ children }: PropsWithChildren) => {
134
+ * return (
135
+ * <AuthBoundary
136
+ * onUnauth={() => redirect("/sign-in")}
137
+ * authClient={authClient}
138
+ * getAuthUserFn={api.auth.getAuthUser}
139
+ * isAuthError={isAuthError}
140
+ * >
141
+ * <>{children}</>
142
+ * </AuthBoundary>
143
+ * )
144
+ * ```
145
+ * @param props.children - Children to render.
146
+ * @param props.onUnauth - Function to call when the user is
147
+ * unauthenticated. Typically a redirect to the login page.
148
+ * @param props.authClient - Better Auth authClient to use.
149
+ * @param props.renderFallback - Fallback component to render when the user is
150
+ * unauthenticated. Defaults to null. Generally not rendered as error handling
151
+ * is typically a redirect.
152
+ * @param props.getAuthUserFn - Reference to a Convex query that returns user.
153
+ * The component provides a query for this via `export const { getAuthUser } = authComponent.clientApi()`.
154
+ * @param props.isAuthError - Function to check if the error is auth related.
155
+ */
156
+ export const AuthBoundary = ({ children,
157
+ /**
158
+ * The function to call when the user is unauthenticated. Typically a redirect
159
+ * to the login page.
160
+ */
161
+ onUnauth,
162
+ /**
163
+ * The Better Auth authClient to use.
164
+ */
165
+ authClient,
166
+ /**
167
+ * The fallback to render when the user is unauthenticated. Defaults to null.
168
+ * Generally not rendered as error handling is typically a redirect.
169
+ */
170
+ renderFallback,
171
+ /**
172
+ * The function to call to get the auth user.
173
+ */
174
+ getAuthUserFn,
175
+ /**
176
+ * The function to call to check if the error is auth related.
177
+ */
178
+ isAuthError, }) => {
179
+ const { isAuthenticated, isLoading } = useConvexAuth();
180
+ const handleUnauth = useCallback(async () => {
181
+ // Auth request that will clear cookies if session is invalid
182
+ await authClient.getSession();
183
+ await onUnauth();
184
+ }, [onUnauth]);
185
+ useEffect(() => {
186
+ void (async () => {
187
+ if (!isLoading && !isAuthenticated) {
188
+ await handleUnauth();
189
+ }
190
+ })();
191
+ }, [isLoading, isAuthenticated]);
192
+ return (_jsxs(ErrorBoundary, { onUnauth: handleUnauth, isAuthError: isAuthError, renderFallback: renderFallback, children: [_jsx(Authenticated, { children: _jsx(UserSubscription, { getAuthUserFn: getAuthUserFn }) }), children] }));
193
+ };
70
194
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAkB,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAyB,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAA+B,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AA8B7E;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,QAAQ,EACR,MAAM,EACN,UAAU,GAKX;IACC,MAAM,aAAa,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,yBAAyB,GAC7B,UAA2D,CAAC;gBAC9D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM,MAAM,GACV,MAAM,yBAAyB,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC;oBAC9D,KAAK;iBACN,CAAC,CAAC;gBACL,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;gBACrC,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,UAAU,CAAC,UAAU,CAAC;wBAC1B,YAAY,EAAE;4BACZ,OAAO,EAAE;gCACP,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;6BACzC;yBACF;qBACF,CAAC,CAAC;oBACH,yBAAyB,CAAC,aAAa,EAAE,CAAC;gBAC5C,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IACjB,OAAO,CACL,KAAC,sBAAsB,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,YAC3D,QAAQ,GACc,CAC1B,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAsB;IACtD,OAAO,OAAO,CACZ,GAAG,EAAE,CACH,SAAS,qBAAqB;QAC5B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAClD,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACvC,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,IAAI,EAAE;YACT,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjD,OAAO,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,iEAAiE;QACjE,mBAAmB;QACnB,uDAAuD;QACvD,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;YACL,SAAS,EAAE,gBAAgB;YAC3B,eAAe,EAAE,OAAO,KAAK,IAAI;YACjC,gBAAgB;SACjB,CAAC;QACF,uDAAuD;QACvD,CAAC,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAChD,CAAC;IACJ,CAAC,EACH,CAAC,UAAU,CAAC,CACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.tsx"],"names":[],"mappings":"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"}
@@ -1,43 +1,13 @@
1
- import { betterAuth } from "better-auth";
2
- import { type FunctionReference, type FunctionReturnType, type GenericActionCtx, type GenericDataModel } from "convex/server";
3
- import { type CreateAuth } from "../client/index.js";
4
- export declare const getCookieName: <DataModel extends GenericDataModel>(createAuth: CreateAuth<DataModel>) => string;
5
- export declare const getCookieNames: <DataModel extends GenericDataModel>(createAuth: CreateAuth<DataModel>) => {
6
- convexJwt: string;
7
- sessionToken: string;
8
- };
9
- export declare const setupFetchClient: <DataModel extends GenericDataModel>(createAuth: CreateAuth<DataModel>, getCookie: (name: string) => string | undefined) => Promise<{
10
- fetchQuery<Query extends FunctionReference<"query">, FuncRef extends FunctionReference<any, any>>(query: Query, args: FuncRef["_args"]): Promise<FunctionReturnType<Query>>;
11
- fetchMutation<Mutation extends FunctionReference<"mutation">, FuncRef_1 extends FunctionReference<any, any>>(mutation: Mutation, args: FuncRef_1["_args"]): Promise<FunctionReturnType<Mutation>>;
12
- fetchAction<Action extends FunctionReference<"action">, FuncRef_2 extends FunctionReference<any, any>>(action: Action, args: FuncRef_2["_args"]): Promise<FunctionReturnType<Action>>;
13
- }>;
14
- export declare const fetchSession: <T extends (ctx: GenericActionCtx<any>) => ReturnType<typeof betterAuth>>(request: Request, opts?: {
15
- convexSiteUrl?: string;
16
- verbose?: boolean;
17
- }) => Promise<{
18
- session: ReturnType<T>["$Infer"]["Session"] | null;
19
- }>;
20
- export declare const fetchAuth: (request: Request, opts?: {
21
- convexSiteUrl?: string;
22
- verbose?: boolean;
23
- }) => Promise<{
24
- token: string;
25
- userId: string | undefined;
26
- } | undefined>;
27
- export declare const getAuthFromCookie: (cookie?: string, { tolerance }?: {
28
- tolerance?: number;
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;
29
6
  }) => {
30
- userId: string | undefined;
31
- token: string;
32
- } | undefined;
33
- export declare const getAuth: <DataModel extends GenericDataModel>(request: Request, getCookie: (name: string) => string | undefined, createAuth: CreateAuth<DataModel>, opts?: {
34
- convexSiteUrl?: string;
35
- }) => Promise<{
36
- userId: string | undefined;
37
- token: string | undefined;
38
- }>;
39
- export declare const reactStartHandler: (request: Request, opts?: {
40
- convexSiteUrl?: string;
41
- verbose?: boolean;
42
- }) => Promise<Response>;
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
+ };
43
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react-start/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAEpE,eAAO,MAAM,aAAa,GAAI,SAAS,SAAS,gBAAgB,EAC9D,YAAY,UAAU,CAAC,SAAS,CAAC,WAKlC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,SAAS,gBAAgB,EAC/D,YAAY,UAAU,CAAC,SAAS,CAAC;;;CAOlC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,SAAS,SAAS,gBAAgB,EACvE,YAAY,UAAU,CAAC,SAAS,CAAC,EACjC,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS;eAa3C,KAAK,SAAS,iBAAiB,CAAC,OAAO,CAAC,EACxC,OAAO,SAAS,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,SAEpC,KAAK,QACN,OAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;kBAInC,QAAQ,SAAS,iBAAiB,CAAC,UAAU,CAAC,oBAC9B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,YAEjC,QAAQ,QACZ,SAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAItC,MAAM,SAAS,iBAAiB,CAAC,QAAQ,CAAC,oBAC1B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,UAEnC,MAAM,QACR,SAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;EAIzC,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,CAAC,SAAS,CAAC,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,OAAO,UAAU,CAAC,EAEvE,SAAS,OAAO,EAChB,OAAO;IACL,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;;EAuBF,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,SAAS,OAAO,EAChB,OAAO;IACL,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;;;cA0BF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,gBAAoB;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO;;;aAahD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,SAAS,SAAS,gBAAgB,EAC9D,SAAS,OAAO,EAChB,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC/C,YAAY,UAAU,CAAC,SAAS,CAAC,EACjC,OAAO;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE;;;EASlC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,SAAS,OAAO,EAChB,OAAO;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,sBAmBrD,CAAC"}
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;AAEvB,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAqEnE,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"}
@@ -1,118 +1,43 @@
1
- import { betterAuth } from "better-auth";
2
- import { createCookieGetter } from "better-auth/cookies";
3
- import { betterFetch } from "@better-fetch/fetch";
4
- import * as jose from "jose";
5
- import {} from "convex/server";
6
- import { JWT_COOKIE_NAME } from "../plugins/convex/index.js";
1
+ import { stripIndent } from "common-tags";
7
2
  import { ConvexHttpClient } from "convex/browser";
8
- import { getStaticAuth } from "../client/index.js";
9
- export const getCookieName = (createAuth) => {
10
- const createCookie = createCookieGetter(getStaticAuth(createAuth).options);
11
- const cookie = createCookie(JWT_COOKIE_NAME);
12
- return cookie.name;
13
- };
14
- export const getCookieNames = (createAuth) => {
15
- const createCookie = createCookieGetter(getStaticAuth(createAuth).options);
16
- return {
17
- convexJwt: createCookie(JWT_COOKIE_NAME).name,
18
- sessionToken: createCookie("session_token").name,
19
- };
20
- };
21
- export const setupFetchClient = async (createAuth, getCookie) => {
22
- const createClient = () => {
23
- const sessionCookieName = getCookieName(createAuth);
24
- const token = getCookie(sessionCookieName);
25
- const client = new ConvexHttpClient(process.env.VITE_CONVEX_URL);
26
- if (token) {
27
- client.setAuth(token);
28
- }
29
- return client;
30
- };
31
- return {
32
- fetchQuery(query, args) {
33
- return createClient().query(query, args);
34
- },
35
- fetchMutation(mutation, args) {
36
- return createClient().mutation(mutation, args);
37
- },
38
- fetchAction(action, args) {
39
- return createClient().action(action, args);
40
- },
41
- };
42
- };
43
- export const fetchSession = async (request, opts) => {
44
- if (!request) {
45
- throw new Error("No request found");
46
- }
47
- const convexSiteUrl = opts?.convexSiteUrl ?? process.env.VITE_CONVEX_SITE_URL;
48
- if (!convexSiteUrl) {
49
- throw new Error("VITE_CONVEX_SITE_URL is not set");
50
- }
51
- const { data: session } = await betterFetch("/api/auth/get-session", {
52
- baseURL: convexSiteUrl,
53
- headers: {
54
- cookie: request.headers.get("cookie") ?? "",
55
- },
56
- });
57
- return {
58
- session,
59
- };
60
- };
61
- export const fetchAuth = async (request, opts) => {
62
- if (!request) {
63
- throw new Error("No request found");
64
- }
65
- const convexSiteUrl = opts?.convexSiteUrl ?? process.env.VITE_CONVEX_SITE_URL;
66
- if (!convexSiteUrl) {
67
- throw new Error("VITE_CONVEX_SITE_URL is not set");
68
- }
69
- const { data } = await betterFetch("/api/auth/convex/token", {
70
- baseURL: convexSiteUrl,
71
- headers: {
72
- cookie: request.headers.get("cookie") ?? "",
73
- },
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);
74
9
  });
75
- if (!data?.token) {
76
- return;
10
+ function setupClient(options) {
11
+ const client = new ConvexHttpClient(options.convexUrl);
12
+ if (options.token !== undefined) {
13
+ client.setAuth(options.token);
77
14
  }
78
- const claims = jose.decodeJwt(data.token);
79
- return {
80
- token: data.token,
81
- userId: claims.sub,
82
- };
83
- };
84
- export const getAuthFromCookie = (cookie, { tolerance = 10 } = {}) => {
85
- if (!cookie) {
86
- return;
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
+ `);
87
26
  }
88
- const claims = jose.decodeJwt(cookie);
89
- const exp = claims?.exp;
90
- const now = Math.floor(new Date().getTime() / 1000);
91
- const isExpired = exp ? now > exp + tolerance : true;
92
- if (isExpired) {
93
- return;
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
+ `);
94
32
  }
95
- return { userId: claims?.sub, token: cookie };
33
+ return url;
96
34
  };
97
- export const getAuth = async (request, getCookie, createAuth, opts) => {
98
- const sessionCookieName = getCookieName(createAuth);
99
- const token = getCookie(sessionCookieName);
100
- const { session } = await fetchSession(request, opts);
101
- return {
102
- userId: session?.user.id,
103
- token,
104
- };
105
- };
106
- export const reactStartHandler = (request, opts) => {
35
+ const handler = (request, opts) => {
107
36
  const requestUrl = new URL(request.url);
108
- const convexSiteUrl = opts?.convexSiteUrl ?? process.env.VITE_CONVEX_SITE_URL;
109
- if (!convexSiteUrl) {
110
- throw new Error("VITE_CONVEX_SITE_URL is not set");
111
- }
112
- const nextUrl = `${convexSiteUrl}${requestUrl.pathname}${requestUrl.search}`;
37
+ const nextUrl = `${opts.convexSiteUrl}${requestUrl.pathname}${requestUrl.search}`;
113
38
  const headers = new Headers(request.headers);
114
39
  headers.set("accept-encoding", "application/json");
115
- headers.set("host", convexSiteUrl);
40
+ headers.set("host", opts.convexSiteUrl);
116
41
  return fetch(nextUrl, {
117
42
  method: request.method,
118
43
  headers,
@@ -122,4 +47,55 @@ export const reactStartHandler = (request, opts) => {
122
47
  duplex: "half",
123
48
  });
124
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
+ };
125
101
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react-start/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react-start/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
- import { type GenericActionCtx, type GenericDataModel, type GenericMutationCtx, type GenericQueryCtx } from "convex/server";
2
- import { type GenericCtx } from "../client/index.js";
1
+ import { type Auth, betterAuth } from "better-auth";
2
+ import { type AuthProvider, type DefaultFunctionArgs, type FunctionReference, type GenericActionCtx, type GenericDataModel, type GenericMutationCtx, type GenericQueryCtx } from "convex/server";
3
+ import type { Jwk } from "better-auth/plugins/jwt";
4
+ export type CreateAuth<DataModel extends GenericDataModel, A extends ReturnType<typeof betterAuth> = Auth> = (ctx: GenericCtx<DataModel>) => A;
5
+ export type EventFunction<T extends DefaultFunctionArgs> = FunctionReference<"mutation", "internal" | "public", T>;
6
+ export type GenericCtx<DataModel extends GenericDataModel = GenericDataModel> = GenericQueryCtx<DataModel> | GenericMutationCtx<DataModel> | GenericActionCtx<DataModel>;
3
7
  export type RunMutationCtx<DataModel extends GenericDataModel> = (GenericMutationCtx<DataModel> | GenericActionCtx<DataModel>) & {
4
8
  runMutation: GenericMutationCtx<DataModel>["runMutation"];
5
9
  };
@@ -11,4 +15,18 @@ export declare const requireQueryCtx: <DataModel extends GenericDataModel>(ctx:
11
15
  export declare const requireMutationCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => GenericMutationCtx<DataModel>;
12
16
  export declare const requireActionCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => GenericActionCtx<DataModel>;
13
17
  export declare const requireRunMutationCtx: <DataModel extends GenericDataModel>(ctx: GenericCtx<DataModel>) => RunMutationCtx<DataModel>;
18
+ export type GetTokenOptions = {
19
+ forceRefresh?: boolean;
20
+ cookiePrefix?: string;
21
+ jwtCache?: {
22
+ enabled: boolean;
23
+ expirationToleranceSeconds?: number;
24
+ isAuthError: (error: unknown) => boolean;
25
+ };
26
+ };
27
+ export declare const getToken: (siteUrl: string, headers: Headers, opts?: GetTokenOptions) => Promise<{
28
+ isFresh: boolean;
29
+ token: string | undefined;
30
+ }>;
31
+ export declare const parseJwks: (providerConfig: AuthProvider) => Jwk | undefined;
14
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,MAAM,cAAc,CAAC,SAAS,SAAS,gBAAgB,IAAI,CAC7D,kBAAkB,CAAC,SAAS,CAAC,GAC7B,gBAAgB,CAAC,SAAS,CAAC,CAC9B,GAAG;IACF,WAAW,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC;CAC3D,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,SAAS,SAAS,gBAAgB,EAC3D,KAAK,UAAU,CAAC,SAAS,CAAC,KACzB,GAAG,IAAI,eAAe,CAAC,SAAS,CAElC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,SAAS,SAAS,gBAAgB,EAC9D,KAAK,UAAU,CAAC,SAAS,CAAC,KACzB,GAAG,IAAI,kBAAkB,CAAC,SAAS,CAErC,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,SAAS,SAAS,gBAAgB,EAC5D,KAAK,UAAU,CAAC,SAAS,CAAC,KACzB,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAEnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,SAAS,gBAAgB,EACjE,KAAK,UAAU,CAAC,SAAS,CAAC,KACzB,GAAG,IAAI,cAAc,CAAC,SAAS,CAEjC,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,SAAS,gBAAgB,EAChE,KAAK,UAAU,CAAC,SAAS,CAAC,KACzB,eAAe,CAAC,SAAS,CAK3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,SAAS,gBAAgB,EACnE,KAAK,UAAU,CAAC,SAAS,CAAC,KACzB,kBAAkB,CAAC,SAAS,CAK9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,SAAS,gBAAgB,EACjE,KAAK,UAAU,CAAC,SAAS,CAAC,KACzB,gBAAgB,CAAC,SAAS,CAK5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,SAAS,SAAS,gBAAgB,EACtE,KAAK,UAAU,CAAC,SAAS,CAAC,KACzB,cAAc,CAAC,SAAS,CAK1B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
+ import { betterFetch } from "@better-fetch/fetch";
2
+ import { betterAuth } from "better-auth";
3
+ import { getSessionCookie } from "better-auth/cookies";
1
4
  import {} from "convex/server";
2
- import {} from "../client/index.js";
5
+ import { JWT_COOKIE_NAME } from "../plugins/convex/index.js";
6
+ import * as jose from "jose";
3
7
  export const isQueryCtx = (ctx) => {
4
8
  return "db" in ctx;
5
9
  };
@@ -36,4 +40,53 @@ export const requireRunMutationCtx = (ctx) => {
36
40
  }
37
41
  return ctx;
38
42
  };
43
+ export const getToken = async (siteUrl, headers, opts) => {
44
+ const fetchToken = async () => {
45
+ const { data } = await betterFetch("/api/auth/convex/token", {
46
+ baseURL: siteUrl,
47
+ headers,
48
+ });
49
+ return { isFresh: true, token: data?.token };
50
+ };
51
+ if (!opts?.jwtCache?.enabled || opts.forceRefresh) {
52
+ return await fetchToken();
53
+ }
54
+ const token = getSessionCookie(new Headers(headers), {
55
+ cookieName: JWT_COOKIE_NAME,
56
+ cookiePrefix: opts?.cookiePrefix,
57
+ });
58
+ if (!token) {
59
+ return await fetchToken();
60
+ }
61
+ try {
62
+ const claims = jose.decodeJwt(token);
63
+ const exp = claims?.exp;
64
+ const now = Math.floor(new Date().getTime() / 1000);
65
+ const isExpired = exp
66
+ ? now > exp + (opts?.jwtCache?.expirationToleranceSeconds ?? 60)
67
+ : true;
68
+ if (!isExpired) {
69
+ return { isFresh: false, token };
70
+ }
71
+ }
72
+ catch (error) {
73
+ console.error("Error decoding JWT", error);
74
+ }
75
+ return await fetchToken();
76
+ };
77
+ export const parseJwks = (providerConfig) => {
78
+ const staticJwksString = "jwks" in providerConfig && providerConfig.jwks?.startsWith("data:text/")
79
+ ? atob(providerConfig.jwks.split("base64,")[1])
80
+ : undefined;
81
+ if (!staticJwksString) {
82
+ return;
83
+ }
84
+ const parsed = JSON.parse(staticJwksString?.slice(1, -1).replaceAll(/[\s\\]/g, "") || "{}");
85
+ const staticJwks = {
86
+ ...parsed,
87
+ privateKey: `"${parsed.privateKey}"`,
88
+ publicKey: `"${parsed.publicKey}"`,
89
+ };
90
+ return staticJwks;
91
+ };
39
92
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,MAAM,eAAe,CAAC;AACvB,OAAO,EAAmB,MAAM,oBAAoB,CAAC;AASrD,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,GAA0B,EACS,EAAE;IACrC,OAAO,IAAI,IAAI,GAAG,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,GAA0B,EACY,EAAE;IACxC,OAAO,IAAI,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,GAA0B,EACU,EAAE;IACtC,OAAO,WAAW,IAAI,GAAG,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAA0B,EACQ,EAAE;IACpC,OAAO,aAAa,IAAI,GAAG,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,GAA0B,EACE,EAAE;IAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,GAA0B,EACK,EAAE;IACjC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAA0B,EACG,EAAE;IAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,GAA0B,EACC,EAAE;IAC7B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}