Spaces:
Paused
Paused
| import { buildConfigSyncEnvelope } from "@/lib/sync/bundle"; | |
| import { getSyncTokenFromRequest, markSyncTokenUsed, validateSyncToken } from "@/lib/sync/tokens"; | |
| import { createErrorResponse, createErrorResponseFromUnknown } from "@/lib/api/errorResponse"; | |
| function matchesEtag(request: Request, version: string) { | |
| const ifNoneMatch = request.headers.get("if-none-match"); | |
| if (!ifNoneMatch) return false; | |
| const candidates = ifNoneMatch | |
| .split(",") | |
| .map((part) => part.trim()) | |
| .filter(Boolean); | |
| return candidates.some((candidate) => candidate === version || candidate === `"${version}"`); | |
| } | |
| function responseHeaders(version: string) { | |
| return { | |
| etag: `"${version}"`, | |
| "x-config-version": version, | |
| "cache-control": "private, no-store", | |
| }; | |
| } | |
| export async function GET(request: Request) { | |
| try { | |
| const rawToken = getSyncTokenFromRequest(request); | |
| const syncToken = await validateSyncToken(rawToken); | |
| if (!syncToken) { | |
| return createErrorResponse({ | |
| status: 401, | |
| message: "Invalid sync token", | |
| }); | |
| } | |
| const { version, bundle } = await buildConfigSyncEnvelope(); | |
| await markSyncTokenUsed(syncToken); | |
| if (matchesEtag(request, version)) { | |
| return new Response(null, { | |
| status: 304, | |
| headers: responseHeaders(version), | |
| }); | |
| } | |
| return Response.json( | |
| { | |
| version, | |
| bundle, | |
| }, | |
| { | |
| headers: responseHeaders(version), | |
| } | |
| ); | |
| } catch (error) { | |
| return createErrorResponseFromUnknown(error, "Failed to build sync bundle"); | |
| } | |
| } | |