convex 1.33.0 → 1.33.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.33.1
4
+
5
+ - Fixes the ConvexProviderWithClerk to fetch the JWT template
6
+ if the (new) Convex integration is not enabled. It is safe to
7
+ both set the JWT template and enable the integration.
8
+ In 1.33.0 it broke if you only had the JWT template specified.
9
+
3
10
  ## 1.33.0
4
11
 
5
12
  - `npx convex env set` can now:
@@ -45,13 +45,27 @@ function ConvexProviderWithClerk({
45
45
  function useUseAuthFromClerk(useAuth) {
46
46
  return (0, import_react2.useMemo)(
47
47
  () => function useAuthFromClerk() {
48
- const { isLoaded, isSignedIn, getToken, orgId, orgRole } = useAuth();
48
+ const {
49
+ isLoaded,
50
+ isSignedIn,
51
+ getToken,
52
+ orgId,
53
+ orgRole,
54
+ sessionClaims
55
+ } = useAuth();
49
56
  const fetchAccessToken = (0, import_react2.useCallback)(
50
57
  async ({ forceRefreshToken }) => {
51
58
  try {
52
- return await getToken({
53
- skipCache: forceRefreshToken
54
- });
59
+ if (sessionClaims?.aud === "convex") {
60
+ return await getToken({
61
+ skipCache: forceRefreshToken
62
+ });
63
+ } else {
64
+ return await getToken({
65
+ template: "convex",
66
+ skipCache: forceRefreshToken
67
+ });
68
+ }
55
69
  } catch {
56
70
  return null;
57
71
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/react-clerk/ConvexProviderWithClerk.tsx"],
4
- "sourcesContent": ["import React from \"react\";\n\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { AuthTokenFetcher } from \"../browser/sync/client.js\";\nimport { ConvexProviderWithAuth } from \"../react/ConvexAuthState.js\";\n\n// Until we can import from our own entry points (requires TypeScript 4.7),\n// just describe the interface enough to help users pass the right type.\ntype IConvexReactClient = {\n setAuth(fetchToken: AuthTokenFetcher): void;\n clearAuth(): void;\n};\n\n// https://clerk.com/docs/reference/clerk-react/useauth\ntype UseAuth = () => {\n isLoaded: boolean;\n isSignedIn: boolean | undefined;\n getToken: (options: { skipCache?: boolean }) => Promise<string | null>;\n // We don't use these properties but they should trigger a new token fetch.\n orgId: string | undefined | null;\n orgRole: string | undefined | null;\n};\n\n/**\n * A wrapper React component which provides a {@link react.ConvexReactClient}\n * authenticated with Clerk.\n *\n * It must be wrapped by a configured `ClerkProvider`, from\n * `@clerk/clerk-react`, `@clerk/clerk-expo`, `@clerk/nextjs` or\n * another React-based Clerk client library and have the corresponding\n * `useAuth` hook passed in.\n *\n * See [Convex Clerk](https://docs.convex.dev/auth/clerk) on how to set up\n * Convex with Clerk.\n *\n * @public\n */\nexport function ConvexProviderWithClerk({\n children,\n client,\n useAuth,\n}: {\n children: ReactNode;\n client: IConvexReactClient;\n useAuth: UseAuth; // useAuth from Clerk\n}) {\n const useAuthFromClerk = useUseAuthFromClerk(useAuth);\n return (\n <ConvexProviderWithAuth client={client} useAuth={useAuthFromClerk}>\n {children}\n </ConvexProviderWithAuth>\n );\n}\n\nfunction useUseAuthFromClerk(useAuth: UseAuth) {\n return useMemo(\n () =>\n function useAuthFromClerk() {\n const { isLoaded, isSignedIn, getToken, orgId, orgRole } = useAuth();\n const fetchAccessToken = useCallback(\n async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {\n try {\n return await getToken({\n skipCache: forceRefreshToken,\n });\n } catch {\n return null;\n }\n },\n // Build a new fetchAccessToken to trigger setAuth() whenever these change.\n // Anything else from the JWT Clerk wants to be reactive goes here too.\n // Clerk's Expo useAuth hook is not memoized so we don't include getToken.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [orgId, orgRole],\n );\n return useMemo(\n () => ({\n isLoading: !isLoaded,\n isAuthenticated: isSignedIn ?? false,\n fetchAccessToken,\n }),\n [isLoaded, isSignedIn, fetchAccessToken],\n );\n },\n [useAuth],\n );\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAElB,IAAAA,gBAAgD;AAEhD,6BAAuC;AAiChC,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,mBAAmB,oBAAoB,OAAO;AACpD,SACE,6BAAAC,QAAA,cAAC,iDAAuB,QAAgB,SAAS,oBAC9C,QACH;AAEJ;AAEA,SAAS,oBAAoB,SAAkB;AAC7C,aAAO;AAAA,IACL,MACE,SAAS,mBAAmB;AAC1B,YAAM,EAAE,UAAU,YAAY,UAAU,OAAO,QAAQ,IAAI,QAAQ;AACnE,YAAM,uBAAmB;AAAA,QACvB,OAAO,EAAE,kBAAkB,MAAsC;AAC/D,cAAI;AACF,mBAAO,MAAM,SAAS;AAAA,cACpB,WAAW;AAAA,YACb,CAAC;AAAA,UACH,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA,QAKA,CAAC,OAAO,OAAO;AAAA,MACjB;AACA,iBAAO;AAAA,QACL,OAAO;AAAA,UACL,WAAW,CAAC;AAAA,UACZ,iBAAiB,cAAc;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,CAAC,UAAU,YAAY,gBAAgB;AAAA,MACzC;AAAA,IACF;AAAA,IACF,CAAC,OAAO;AAAA,EACV;AACF;",
4
+ "sourcesContent": ["import React from \"react\";\n\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { AuthTokenFetcher } from \"../browser/sync/client.js\";\nimport { ConvexProviderWithAuth } from \"../react/ConvexAuthState.js\";\n\n// Until we can import from our own entry points (requires TypeScript 4.7),\n// just describe the interface enough to help users pass the right type.\ntype IConvexReactClient = {\n setAuth(fetchToken: AuthTokenFetcher): void;\n clearAuth(): void;\n};\n\n// https://clerk.com/docs/reference/clerk-react/useauth\ntype UseAuth = () => {\n isLoaded: boolean;\n isSignedIn: boolean | undefined;\n getToken: (options: {\n template?: \"convex\";\n skipCache?: boolean;\n }) => Promise<string | null>;\n // We don't use these properties but they should trigger a new token fetch.\n orgId: string | undefined | null;\n orgRole: string | undefined | null;\n sessionClaims: Record<string, unknown> | undefined | null;\n};\n\n/**\n * A wrapper React component which provides a {@link react.ConvexReactClient}\n * authenticated with Clerk.\n *\n * It must be wrapped by a configured `ClerkProvider`, from\n * `@clerk/clerk-react`, `@clerk/clerk-expo`, `@clerk/nextjs` or\n * another React-based Clerk client library and have the corresponding\n * `useAuth` hook passed in.\n *\n * See [Convex Clerk](https://docs.convex.dev/auth/clerk) on how to set up\n * Convex with Clerk.\n *\n * @public\n */\nexport function ConvexProviderWithClerk({\n children,\n client,\n useAuth,\n}: {\n children: ReactNode;\n client: IConvexReactClient;\n useAuth: UseAuth; // useAuth from Clerk\n}) {\n const useAuthFromClerk = useUseAuthFromClerk(useAuth);\n return (\n <ConvexProviderWithAuth client={client} useAuth={useAuthFromClerk}>\n {children}\n </ConvexProviderWithAuth>\n );\n}\n\nfunction useUseAuthFromClerk(useAuth: UseAuth) {\n return useMemo(\n () =>\n function useAuthFromClerk() {\n const {\n isLoaded,\n isSignedIn,\n getToken,\n orgId,\n orgRole,\n sessionClaims,\n } = useAuth();\n const fetchAccessToken = useCallback(\n async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {\n try {\n if (sessionClaims?.aud === \"convex\") {\n // Using the Convex integration\n return await getToken({\n skipCache: forceRefreshToken,\n });\n } else {\n // Using the JWT token template\n return await getToken({\n template: \"convex\",\n skipCache: forceRefreshToken,\n });\n }\n } catch {\n return null;\n }\n },\n // Build a new fetchAccessToken to trigger setAuth() whenever these change.\n // Anything else from the JWT Clerk wants to be reactive goes here too.\n // Clerk's Expo useAuth hook is not memoized so we don't include getToken.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [orgId, orgRole],\n );\n return useMemo(\n () => ({\n isLoading: !isLoaded,\n isAuthenticated: isSignedIn ?? false,\n fetchAccessToken,\n }),\n [isLoaded, isSignedIn, fetchAccessToken],\n );\n },\n [useAuth],\n );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAElB,IAAAA,gBAAgD;AAEhD,6BAAuC;AAqChC,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,mBAAmB,oBAAoB,OAAO;AACpD,SACE,6BAAAC,QAAA,cAAC,iDAAuB,QAAgB,SAAS,oBAC9C,QACH;AAEJ;AAEA,SAAS,oBAAoB,SAAkB;AAC7C,aAAO;AAAA,IACL,MACE,SAAS,mBAAmB;AAC1B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI,QAAQ;AACZ,YAAM,uBAAmB;AAAA,QACvB,OAAO,EAAE,kBAAkB,MAAsC;AAC/D,cAAI;AACF,gBAAI,eAAe,QAAQ,UAAU;AAEnC,qBAAO,MAAM,SAAS;AAAA,gBACpB,WAAW;AAAA,cACb,CAAC;AAAA,YACH,OAAO;AAEL,qBAAO,MAAM,SAAS;AAAA,gBACpB,UAAU;AAAA,gBACV,WAAW;AAAA,cACb,CAAC;AAAA,YACH;AAAA,UACF,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA,QAKA,CAAC,OAAO,OAAO;AAAA,MACjB;AACA,iBAAO;AAAA,QACL,OAAO;AAAA,UACL,WAAW,CAAC;AAAA,UACZ,iBAAiB,cAAc;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,CAAC,UAAU,YAAY,gBAAgB;AAAA,MACzC;AAAA,IACF;AAAA,IACF,CAAC,OAAO;AAAA,EACV;AACF;",
6
6
  "names": ["import_react", "React"]
7
7
  }
@@ -9,10 +9,12 @@ type UseAuth = () => {
9
9
  isLoaded: boolean;
10
10
  isSignedIn: boolean | undefined;
11
11
  getToken: (options: {
12
+ template?: "convex";
12
13
  skipCache?: boolean;
13
14
  }) => Promise<string | null>;
14
15
  orgId: string | undefined | null;
15
16
  orgRole: string | undefined | null;
17
+ sessionClaims: Record<string, unknown> | undefined | null;
16
18
  };
17
19
  /**
18
20
  * A wrapper React component which provides a {@link react.ConvexReactClient}
@@ -1 +1 @@
1
- {"version":3,"file":"ConvexProviderWithClerk.d.ts","sourceRoot":"","sources":["../../../src/react-clerk/ConvexProviderWithClerk.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAwB,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAK7D,KAAK,kBAAkB,GAAG;IACxB,OAAO,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC5C,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAGF,KAAK,OAAO,GAAG,MAAM;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,CAAC,OAAO,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,MAAM,EACN,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB,qBAOA"}
1
+ {"version":3,"file":"ConvexProviderWithClerk.d.ts","sourceRoot":"","sources":["../../../src/react-clerk/ConvexProviderWithClerk.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAwB,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAK7D,KAAK,kBAAkB,GAAG;IACxB,OAAO,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC5C,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAGF,KAAK,OAAO,GAAG,MAAM;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,CAAC,OAAO,EAAE;QAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE7B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,MAAM,EACN,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB,qBAOA"}
@@ -13,13 +13,27 @@ export function ConvexProviderWithClerk({
13
13
  function useUseAuthFromClerk(useAuth) {
14
14
  return useMemo(
15
15
  () => function useAuthFromClerk() {
16
- const { isLoaded, isSignedIn, getToken, orgId, orgRole } = useAuth();
16
+ const {
17
+ isLoaded,
18
+ isSignedIn,
19
+ getToken,
20
+ orgId,
21
+ orgRole,
22
+ sessionClaims
23
+ } = useAuth();
17
24
  const fetchAccessToken = useCallback(
18
25
  async ({ forceRefreshToken }) => {
19
26
  try {
20
- return await getToken({
21
- skipCache: forceRefreshToken
22
- });
27
+ if (sessionClaims?.aud === "convex") {
28
+ return await getToken({
29
+ skipCache: forceRefreshToken
30
+ });
31
+ } else {
32
+ return await getToken({
33
+ template: "convex",
34
+ skipCache: forceRefreshToken
35
+ });
36
+ }
23
37
  } catch {
24
38
  return null;
25
39
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/react-clerk/ConvexProviderWithClerk.tsx"],
4
- "sourcesContent": ["import React from \"react\";\n\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { AuthTokenFetcher } from \"../browser/sync/client.js\";\nimport { ConvexProviderWithAuth } from \"../react/ConvexAuthState.js\";\n\n// Until we can import from our own entry points (requires TypeScript 4.7),\n// just describe the interface enough to help users pass the right type.\ntype IConvexReactClient = {\n setAuth(fetchToken: AuthTokenFetcher): void;\n clearAuth(): void;\n};\n\n// https://clerk.com/docs/reference/clerk-react/useauth\ntype UseAuth = () => {\n isLoaded: boolean;\n isSignedIn: boolean | undefined;\n getToken: (options: { skipCache?: boolean }) => Promise<string | null>;\n // We don't use these properties but they should trigger a new token fetch.\n orgId: string | undefined | null;\n orgRole: string | undefined | null;\n};\n\n/**\n * A wrapper React component which provides a {@link react.ConvexReactClient}\n * authenticated with Clerk.\n *\n * It must be wrapped by a configured `ClerkProvider`, from\n * `@clerk/clerk-react`, `@clerk/clerk-expo`, `@clerk/nextjs` or\n * another React-based Clerk client library and have the corresponding\n * `useAuth` hook passed in.\n *\n * See [Convex Clerk](https://docs.convex.dev/auth/clerk) on how to set up\n * Convex with Clerk.\n *\n * @public\n */\nexport function ConvexProviderWithClerk({\n children,\n client,\n useAuth,\n}: {\n children: ReactNode;\n client: IConvexReactClient;\n useAuth: UseAuth; // useAuth from Clerk\n}) {\n const useAuthFromClerk = useUseAuthFromClerk(useAuth);\n return (\n <ConvexProviderWithAuth client={client} useAuth={useAuthFromClerk}>\n {children}\n </ConvexProviderWithAuth>\n );\n}\n\nfunction useUseAuthFromClerk(useAuth: UseAuth) {\n return useMemo(\n () =>\n function useAuthFromClerk() {\n const { isLoaded, isSignedIn, getToken, orgId, orgRole } = useAuth();\n const fetchAccessToken = useCallback(\n async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {\n try {\n return await getToken({\n skipCache: forceRefreshToken,\n });\n } catch {\n return null;\n }\n },\n // Build a new fetchAccessToken to trigger setAuth() whenever these change.\n // Anything else from the JWT Clerk wants to be reactive goes here too.\n // Clerk's Expo useAuth hook is not memoized so we don't include getToken.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [orgId, orgRole],\n );\n return useMemo(\n () => ({\n isLoading: !isLoaded,\n isAuthenticated: isSignedIn ?? false,\n fetchAccessToken,\n }),\n [isLoaded, isSignedIn, fetchAccessToken],\n );\n },\n [useAuth],\n );\n}\n"],
5
- "mappings": ";AAAA,OAAO,WAAW;AAElB,SAAoB,aAAa,eAAe;AAEhD,SAAS,8BAA8B;AAiChC,gBAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,mBAAmB,oBAAoB,OAAO;AACpD,SACE,oCAAC,0BAAuB,QAAgB,SAAS,oBAC9C,QACH;AAEJ;AAEA,SAAS,oBAAoB,SAAkB;AAC7C,SAAO;AAAA,IACL,MACE,SAAS,mBAAmB;AAC1B,YAAM,EAAE,UAAU,YAAY,UAAU,OAAO,QAAQ,IAAI,QAAQ;AACnE,YAAM,mBAAmB;AAAA,QACvB,OAAO,EAAE,kBAAkB,MAAsC;AAC/D,cAAI;AACF,mBAAO,MAAM,SAAS;AAAA,cACpB,WAAW;AAAA,YACb,CAAC;AAAA,UACH,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA,QAKA,CAAC,OAAO,OAAO;AAAA,MACjB;AACA,aAAO;AAAA,QACL,OAAO;AAAA,UACL,WAAW,CAAC;AAAA,UACZ,iBAAiB,cAAc;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,CAAC,UAAU,YAAY,gBAAgB;AAAA,MACzC;AAAA,IACF;AAAA,IACF,CAAC,OAAO;AAAA,EACV;AACF;",
4
+ "sourcesContent": ["import React from \"react\";\n\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { AuthTokenFetcher } from \"../browser/sync/client.js\";\nimport { ConvexProviderWithAuth } from \"../react/ConvexAuthState.js\";\n\n// Until we can import from our own entry points (requires TypeScript 4.7),\n// just describe the interface enough to help users pass the right type.\ntype IConvexReactClient = {\n setAuth(fetchToken: AuthTokenFetcher): void;\n clearAuth(): void;\n};\n\n// https://clerk.com/docs/reference/clerk-react/useauth\ntype UseAuth = () => {\n isLoaded: boolean;\n isSignedIn: boolean | undefined;\n getToken: (options: {\n template?: \"convex\";\n skipCache?: boolean;\n }) => Promise<string | null>;\n // We don't use these properties but they should trigger a new token fetch.\n orgId: string | undefined | null;\n orgRole: string | undefined | null;\n sessionClaims: Record<string, unknown> | undefined | null;\n};\n\n/**\n * A wrapper React component which provides a {@link react.ConvexReactClient}\n * authenticated with Clerk.\n *\n * It must be wrapped by a configured `ClerkProvider`, from\n * `@clerk/clerk-react`, `@clerk/clerk-expo`, `@clerk/nextjs` or\n * another React-based Clerk client library and have the corresponding\n * `useAuth` hook passed in.\n *\n * See [Convex Clerk](https://docs.convex.dev/auth/clerk) on how to set up\n * Convex with Clerk.\n *\n * @public\n */\nexport function ConvexProviderWithClerk({\n children,\n client,\n useAuth,\n}: {\n children: ReactNode;\n client: IConvexReactClient;\n useAuth: UseAuth; // useAuth from Clerk\n}) {\n const useAuthFromClerk = useUseAuthFromClerk(useAuth);\n return (\n <ConvexProviderWithAuth client={client} useAuth={useAuthFromClerk}>\n {children}\n </ConvexProviderWithAuth>\n );\n}\n\nfunction useUseAuthFromClerk(useAuth: UseAuth) {\n return useMemo(\n () =>\n function useAuthFromClerk() {\n const {\n isLoaded,\n isSignedIn,\n getToken,\n orgId,\n orgRole,\n sessionClaims,\n } = useAuth();\n const fetchAccessToken = useCallback(\n async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {\n try {\n if (sessionClaims?.aud === \"convex\") {\n // Using the Convex integration\n return await getToken({\n skipCache: forceRefreshToken,\n });\n } else {\n // Using the JWT token template\n return await getToken({\n template: \"convex\",\n skipCache: forceRefreshToken,\n });\n }\n } catch {\n return null;\n }\n },\n // Build a new fetchAccessToken to trigger setAuth() whenever these change.\n // Anything else from the JWT Clerk wants to be reactive goes here too.\n // Clerk's Expo useAuth hook is not memoized so we don't include getToken.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [orgId, orgRole],\n );\n return useMemo(\n () => ({\n isLoading: !isLoaded,\n isAuthenticated: isSignedIn ?? false,\n fetchAccessToken,\n }),\n [isLoaded, isSignedIn, fetchAccessToken],\n );\n },\n [useAuth],\n );\n}\n"],
5
+ "mappings": ";AAAA,OAAO,WAAW;AAElB,SAAoB,aAAa,eAAe;AAEhD,SAAS,8BAA8B;AAqChC,gBAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,mBAAmB,oBAAoB,OAAO;AACpD,SACE,oCAAC,0BAAuB,QAAgB,SAAS,oBAC9C,QACH;AAEJ;AAEA,SAAS,oBAAoB,SAAkB;AAC7C,SAAO;AAAA,IACL,MACE,SAAS,mBAAmB;AAC1B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI,QAAQ;AACZ,YAAM,mBAAmB;AAAA,QACvB,OAAO,EAAE,kBAAkB,MAAsC;AAC/D,cAAI;AACF,gBAAI,eAAe,QAAQ,UAAU;AAEnC,qBAAO,MAAM,SAAS;AAAA,gBACpB,WAAW;AAAA,cACb,CAAC;AAAA,YACH,OAAO;AAEL,qBAAO,MAAM,SAAS;AAAA,gBACpB,UAAU;AAAA,gBACV,WAAW;AAAA,cACb,CAAC;AAAA,YACH;AAAA,UACF,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA,QAKA,CAAC,OAAO,OAAO;AAAA,MACjB;AACA,aAAO;AAAA,QACL,OAAO;AAAA,UACL,WAAW,CAAC;AAAA,UACZ,iBAAiB,cAAc;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,CAAC,UAAU,YAAY,gBAAgB;AAAA,MACzC;AAAA,IACF;AAAA,IACF,CAAC,OAAO;AAAA,EACV;AACF;",
6
6
  "names": []
7
7
  }
@@ -9,10 +9,12 @@ type UseAuth = () => {
9
9
  isLoaded: boolean;
10
10
  isSignedIn: boolean | undefined;
11
11
  getToken: (options: {
12
+ template?: "convex";
12
13
  skipCache?: boolean;
13
14
  }) => Promise<string | null>;
14
15
  orgId: string | undefined | null;
15
16
  orgRole: string | undefined | null;
17
+ sessionClaims: Record<string, unknown> | undefined | null;
16
18
  };
17
19
  /**
18
20
  * A wrapper React component which provides a {@link react.ConvexReactClient}
@@ -1 +1 @@
1
- {"version":3,"file":"ConvexProviderWithClerk.d.ts","sourceRoot":"","sources":["../../../src/react-clerk/ConvexProviderWithClerk.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAwB,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAK7D,KAAK,kBAAkB,GAAG;IACxB,OAAO,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC5C,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAGF,KAAK,OAAO,GAAG,MAAM;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,CAAC,OAAO,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,MAAM,EACN,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB,qBAOA"}
1
+ {"version":3,"file":"ConvexProviderWithClerk.d.ts","sourceRoot":"","sources":["../../../src/react-clerk/ConvexProviderWithClerk.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAwB,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAK7D,KAAK,kBAAkB,GAAG;IACxB,OAAO,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC5C,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAGF,KAAK,OAAO,GAAG,MAAM;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,CAAC,OAAO,EAAE;QAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE7B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,MAAM,EACN,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB,qBAOA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "convex",
3
3
  "description": "Client for the Convex Cloud",
4
- "version": "1.33.0",
4
+ "version": "1.33.1",
5
5
  "author": "Convex, Inc. <no-reply@convex.dev>",
6
6
  "homepage": "https://convex.dev",
7
7
  "repository": {
@@ -15,10 +15,14 @@ type IConvexReactClient = {
15
15
  type UseAuth = () => {
16
16
  isLoaded: boolean;
17
17
  isSignedIn: boolean | undefined;
18
- getToken: (options: { skipCache?: boolean }) => Promise<string | null>;
18
+ getToken: (options: {
19
+ template?: "convex";
20
+ skipCache?: boolean;
21
+ }) => Promise<string | null>;
19
22
  // We don't use these properties but they should trigger a new token fetch.
20
23
  orgId: string | undefined | null;
21
24
  orgRole: string | undefined | null;
25
+ sessionClaims: Record<string, unknown> | undefined | null;
22
26
  };
23
27
 
24
28
  /**
@@ -56,13 +60,29 @@ function useUseAuthFromClerk(useAuth: UseAuth) {
56
60
  return useMemo(
57
61
  () =>
58
62
  function useAuthFromClerk() {
59
- const { isLoaded, isSignedIn, getToken, orgId, orgRole } = useAuth();
63
+ const {
64
+ isLoaded,
65
+ isSignedIn,
66
+ getToken,
67
+ orgId,
68
+ orgRole,
69
+ sessionClaims,
70
+ } = useAuth();
60
71
  const fetchAccessToken = useCallback(
61
72
  async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {
62
73
  try {
63
- return await getToken({
64
- skipCache: forceRefreshToken,
65
- });
74
+ if (sessionClaims?.aud === "convex") {
75
+ // Using the Convex integration
76
+ return await getToken({
77
+ skipCache: forceRefreshToken,
78
+ });
79
+ } else {
80
+ // Using the JWT token template
81
+ return await getToken({
82
+ template: "convex",
83
+ skipCache: forceRefreshToken,
84
+ });
85
+ }
66
86
  } catch {
67
87
  return null;
68
88
  }