diff --git a/toolshed/routes/integrations/google-oauth/google-oauth.handlers.ts b/toolshed/routes/integrations/google-oauth/google-oauth.handlers.ts index b65c6e2d0..18b81a2fa 100644 --- a/toolshed/routes/integrations/google-oauth/google-oauth.handlers.ts +++ b/toolshed/routes/integrations/google-oauth/google-oauth.handlers.ts @@ -23,9 +23,11 @@ import { fetchUserInfo, getBaseUrl, persistTokens, + tokenToAuthData, } from "./google-oauth.utils.ts"; import { setBGCharm } from "@commontools/background-charm"; import { type CellLink, storage } from "@commontools/runner"; +import { Tokens } from "@cmd-johnson/oauth2-client"; /** * Google OAuth Login Handler @@ -263,7 +265,7 @@ export const refresh: AppRouteHandler = async (c) => { // Create OAuth client const client = createOAuthClient(redirectUri); - let newToken; + let newToken: Tokens | undefined; try { newToken = await client.refreshToken.refresh(refreshToken); } catch (error) { @@ -282,19 +284,13 @@ export const refresh: AppRouteHandler = async (c) => { "Refreshed OAuth tokens", ); + const authData = tokenToAuthData(newToken); // Keep existing refresh token if a new one wasn't provided - if (!newToken.refreshToken) { - newToken.refreshToken = refreshToken; + if (!authData.refreshToken) { + authData.refreshToken = refreshToken; } - const resp: AuthData = { - ...newToken, - expiresAt: newToken.expiresIn - ? Date.now() + newToken.expiresIn * 1000 - : undefined, - }; - - return createRefreshSuccessResponse(c, "success", resp); + return createRefreshSuccessResponse(c, "success", authData); } catch (error) { logger.error({ error }, "Failed to process refresh request"); return createRefreshErrorResponse(c, "Failed to process refresh request"); diff --git a/toolshed/routes/integrations/google-oauth/google-oauth.utils.ts b/toolshed/routes/integrations/google-oauth/google-oauth.utils.ts index 21a92d92b..f8a251886 100644 --- a/toolshed/routes/integrations/google-oauth/google-oauth.utils.ts +++ b/toolshed/routes/integrations/google-oauth/google-oauth.utils.ts @@ -1,8 +1,7 @@ -import { OAuth2Client } from "@cmd-johnson/oauth2-client"; +import { OAuth2Client, Tokens } from "@cmd-johnson/oauth2-client"; import env from "@/env.ts"; import { type CellLink, getCellFromLink, storage } from "@commontools/runner"; import { Context } from "@hono/hono"; -import { Identity, Signer } from "@commontools/identity"; // Types export interface AuthData { token?: string; @@ -189,20 +188,11 @@ export async function persistTokens( } // Prepare token data to store - const tokenData: AuthData = { - token: oauthToken.accessToken, - tokenType: oauthToken.tokenType, - scope: oauthToken.scope, - expiresIn: oauthToken.expiresIn, - refreshToken: oauthToken.refreshToken, - expiresAt: oauthToken.expiresIn - ? Date.now() + oauthToken.expiresIn * 1000 - : undefined, - user: { - email: userInfo.email || "", - name: userInfo.name || "", - picture: userInfo.picture || "", - }, + const tokenData = tokenToAuthData(oauthToken); + tokenData.user = { + email: userInfo.email || "", + name: userInfo.name || "", + picture: userInfo.picture || "", }; // Set the new tokens to the auth cell @@ -366,3 +356,17 @@ export function createBackgroundIntegrationErrorResponse( ) { return c.json({ success: false, error: errorMessage }, status) as any; } + +export function tokenToAuthData(token: Tokens | OAuth2Tokens): AuthData { + return { + token: token.accessToken, + tokenType: token.tokenType, + scope: token.scope, + expiresIn: token.expiresIn, + refreshToken: token.refreshToken, + // `Tokens` does not have `expiresAt`, and is optional for `OAuth2Tokens`. + expiresAt: token.expiresIn + ? Date.now() + token.expiresIn * 1000 + : undefined, + }; +}