From dd2d8b79ca83e7f8e375ad5fa2632b1b7ed30906 Mon Sep 17 00:00:00 2001 From: Pandipipas <62224708+Pandipipas@users.noreply.github.com> Date: Tue, 17 Feb 2026 18:50:56 +0100 Subject: [PATCH] fix(challonge): send Authorization-Type headers for v2 oauth tokens --- src/extension/challonge.ts | 55 ++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/src/extension/challonge.ts b/src/extension/challonge.ts index 30f8b9d..9ca4d6a 100644 --- a/src/extension/challonge.ts +++ b/src/extension/challonge.ts @@ -202,35 +202,62 @@ const exchangeOAuthCodeForToken = async ( return token; }; +const parseJsonResponse = async (response: Response): Promise => { + const rawBody = await response.text(); + if (!rawBody) { + return null; + } + + try { + return JSON.parse(rawBody) as unknown; + } catch { + return null; + } +}; + const requestChallonge = async (path: string, token: string): Promise => { - const response = await fetch(`${CHALLONGE_API_BASE}${path}`, { + const requestUrl = `${CHALLONGE_API_BASE}${path}`; + + const v2Response = await fetch(requestUrl, { headers: { Accept: 'application/json', 'Content-Type': 'application/vnd.api+json', + 'Authorization-Type': 'v2', Authorization: `Bearer ${token}`, }, }); - const rawBody = await response.text(); - let payload: unknown = null; - if (rawBody) { - try { - payload = JSON.parse(rawBody) as unknown; - } catch { - if (!response.ok) { - throw new Error(`Challonge responded with ${response.status} ${response.statusText}`.trim()); - } + const v2Payload = await parseJsonResponse(v2Response); + + if (v2Response.ok) { + return v2Payload; + } + + // Fallback for personal API keys pasted manually (v1 auth style). + if (v2Response.status === 401) { + const v1Response = await fetch(requestUrl, { + headers: { + Accept: 'application/json', + 'Content-Type': 'application/vnd.api+json', + 'Authorization-Type': 'v1', + Authorization: token, + }, + }); + + const v1Payload = await parseJsonResponse(v1Response); + if (v1Response.ok) { + return v1Payload; } } - if (!response.ok) { - const maybeError = payload as { errors?: { detail?: string }; error?: string } | null; + const maybeError = v2Payload as { errors?: { detail?: string }; error?: string } | null; + if (!v2Response.ok) { throw new Error( - maybeError?.errors?.detail || maybeError?.error || `Challonge responded with ${response.status} ${response.statusText}`.trim(), + maybeError?.errors?.detail || maybeError?.error || `Challonge responded with ${v2Response.status} ${v2Response.statusText}`.trim(), ); } - return payload; + return v2Payload; }; const normalizeTournamentSlug = (value: string): string => {