Files
patchy631--ai-engineering-hub/open-agent-builder/lib/convex/client.ts
T
2026-07-13 12:37:47 +08:00

85 lines
2.2 KiB
TypeScript

/**
* Convex Client for Server-Side Operations
*
* This replaces Upstash Redis for workflow storage
*/
import { ConvexHttpClient } from "convex/browser";
import { api } from "../../convex/_generated/api";
import { auth } from "@clerk/nextjs/server";
let convexClient: ConvexHttpClient | null = null;
/**
* Get an unauthenticated Convex client
* Use getAuthenticatedConvexClient() when user auth is needed
*/
export function getConvexClient(): ConvexHttpClient {
if (!convexClient) {
const url = process.env.NEXT_PUBLIC_CONVEX_URL;
if (!url) {
throw new Error(
'Convex URL not configured. ' +
'Please add NEXT_PUBLIC_CONVEX_URL to .env.local'
);
}
try {
convexClient = new ConvexHttpClient(url);
} catch (error) {
console.error('Failed to initialize Convex client:', error);
throw new Error(`Convex client initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
return convexClient;
}
/**
* Get an authenticated Convex client with Clerk token
* This ensures userId is properly set in Convex context
*/
export async function getAuthenticatedConvexClient(): Promise<ConvexHttpClient> {
const url = process.env.NEXT_PUBLIC_CONVEX_URL;
if (!url) {
throw new Error(
'Convex URL not configured. ' +
'Please add NEXT_PUBLIC_CONVEX_URL to .env.local'
);
}
const client = new ConvexHttpClient(url);
try {
// Get Clerk auth token
const { getToken } = await auth();
const token = await getToken({ template: "convex" });
// Set the authentication token
if (token) {
client.setAuth(token);
} else {
console.warn('No Clerk token available - using unauthenticated client');
}
} catch (error) {
console.error('Failed to get Clerk token:', error);
// Continue with unauthenticated client instead of throwing
// This allows the app to function even if Clerk auth fails
}
return client;
}
/**
* Check if Convex is configured
*/
export function isConvexConfigured(): boolean {
return !!process.env.NEXT_PUBLIC_CONVEX_URL;
}
// Export API for convenience
export { api };
export type { ConvexHttpClient };