UNPKG

cdp-wallet-onramp-kit

Version:

Complete toolkit for Coinbase Developer Platform (CDP) Embedded Wallets and Onramp integration with reusable components, utilities, and documentation

127 lines (112 loc) 3.76 kB
import { NextRequest, NextResponse } from 'next/server'; import { generateJWT, createSessionToken } from 'cdp-wallet-onramp-kit/lib/cdp-auth'; import { sessionTokenSchema, validateRequest, createErrorResponse, validateEnvironment } from 'cdp-wallet-onramp-kit/lib/validation'; /** * API route for creating onramp session tokens * * POST /api/onramp/session * * Request Body: * - For wallet users: { userAddress: string, assets?: string[] } * - For guest checkout: { guestCheckout: true, assets?: string[] } * * Response: * - Success: { sessionToken: string, expiresIn: number } * - Error: { error: string, details?: Record<string, unknown> } * * Copy this file to: app/api/onramp/session/route.ts */ export async function POST(request: NextRequest) { try { // Validate environment variables const envCheck = validateEnvironment(); if (!envCheck.isValid) { console.error('Missing environment variables:', envCheck.missing); return NextResponse.json( createErrorResponse( 'Server configuration error. Please check your CDP API credentials.', { missing: envCheck.missing } ), { status: 500 } ); } // Parse and validate request body const body = await request.json(); const validatedData = validateRequest(sessionTokenSchema, body); // Generate CDP JWT const jwt = await generateJWT(); // Create session token with CDP API const requestBody = 'guestCheckout' in validatedData && validatedData.guestCheckout ? { // Guest checkout doesn't require specific addresses addresses: [], assets: validatedData.assets || ['ETH', 'USDC'] } : { addresses: [ { address: (validatedData as { userAddress: string }).userAddress, blockchains: ['base'] } ], assets: validatedData.assets || ['ETH', 'USDC'] }; const sessionToken = await createSessionToken(jwt, requestBody); return NextResponse.json({ sessionToken, expiresIn: 300 // 5 minutes }); } catch (error) { console.error('Session token creation error:', error); // Handle validation errors if (error instanceof Error && error.message.startsWith('Validation failed')) { return NextResponse.json( createErrorResponse('Invalid request parameters', error.message), { status: 400 } ); } // Handle CDP API key errors if (error instanceof Error && error.message.includes('CDP_API_KEY')) { return NextResponse.json( createErrorResponse('Server configuration error. Please check your CDP API credentials.'), { status: 500 } ); } // Handle CDP API errors if (error instanceof Error && error.message.includes('Failed to create session token')) { return NextResponse.json( createErrorResponse('Failed to create session token', error.message), { status: 502 } ); } // Generic error return NextResponse.json( createErrorResponse('Failed to create session token. Please try again.'), { status: 500 } ); } } // Handle unsupported methods export async function GET() { return NextResponse.json( createErrorResponse('Method not allowed. Use POST to create session tokens.'), { status: 405 } ); } export async function PUT() { return NextResponse.json( createErrorResponse('Method not allowed. Use POST to create session tokens.'), { status: 405 } ); } export async function DELETE() { return NextResponse.json( createErrorResponse('Method not allowed. Use POST to create session tokens.'), { status: 405 } ); }