| import { markCommandCodeAuthSessionReceived } from "@/lib/db/commandCodeAuth"; | |
| import { | |
| callbackCorsHeaders, | |
| commandCodeCallbackSchema, | |
| MAX_CALLBACK_BODY_BYTES, | |
| noStoreJson, | |
| readJsonBodyWithLimit, | |
| rejectDisallowedCallbackOrigin, | |
| stateHashFromState, | |
| } from "../shared"; | |
| export async function OPTIONS(request: Request) { | |
| return new Response(null, { status: 204, headers: callbackCorsHeaders(request) }); | |
| } | |
| export async function POST(request: Request) { | |
| const originError = rejectDisallowedCallbackOrigin(request); | |
| if (originError) return originError; | |
| let body: unknown; | |
| try { | |
| body = await readJsonBodyWithLimit(request, MAX_CALLBACK_BODY_BYTES); | |
| } catch (error) { | |
| const isTooLarge = error instanceof Error && error.message === "BODY_TOO_LARGE"; | |
| return noStoreJson( | |
| { success: false, error: isTooLarge ? "Request body too large" : "Invalid JSON body" }, | |
| { status: isTooLarge ? 413 : 400, headers: callbackCorsHeaders(request) } | |
| ); | |
| } | |
| const parsed = commandCodeCallbackSchema.safeParse(body); | |
| if (!parsed.success) { | |
| return noStoreJson( | |
| { success: false, error: "Invalid callback payload" }, | |
| { status: 400, headers: callbackCorsHeaders(request) } | |
| ); | |
| } | |
| const session = markCommandCodeAuthSessionReceived({ | |
| stateHash: stateHashFromState(parsed.data.state), | |
| apiKey: parsed.data.apiKey, | |
| metadata: { | |
| userId: parsed.data.userId, | |
| userName: parsed.data.userName, | |
| keyName: parsed.data.keyName, | |
| }, | |
| }); | |
| if (!session || session.status !== "received") { | |
| return noStoreJson( | |
| { success: false, error: "Invalid or expired state" }, | |
| { status: 400, headers: callbackCorsHeaders(request) } | |
| ); | |
| } | |
| return noStoreJson( | |
| { | |
| success: true, | |
| ok: true, | |
| status: session.status, | |
| expiresAt: session.expiresAt, | |
| metadata: session.metadata, | |
| }, | |
| { headers: callbackCorsHeaders(request) } | |
| ); | |
| } | |