import { GITHUB_CONFIG } from "../constants/oauth"; export const github = { config: GITHUB_CONFIG, flowType: "device_code", requestDeviceCode: async (config) => { const response = await fetch(config.deviceCodeUrl, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", Accept: "application/json", }, body: new URLSearchParams({ client_id: config.clientId, scope: config.scopes, }), }); if (!response.ok) { const error = await response.text(); throw new Error(`Device code request failed: ${error}`); } return await response.json(); }, pollToken: async (config, deviceCode) => { const response = await fetch(config.tokenUrl, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", Accept: "application/json", }, body: new URLSearchParams({ client_id: config.clientId, device_code: deviceCode, grant_type: "urn:ietf:params:oauth:grant-type:device_code", }), }); let data; try { data = await response.json(); } catch (e) { const text = await response.text(); data = { error: "invalid_response", error_description: text }; } return { ok: response.ok, data: data, }; }, postExchange: async (tokens) => { const copilotRes = await fetch(GITHUB_CONFIG.copilotTokenUrl, { headers: { Authorization: `Bearer ${tokens.access_token}`, Accept: "application/json", "X-GitHub-Api-Version": GITHUB_CONFIG.apiVersion, "User-Agent": GITHUB_CONFIG.userAgent, }, }); const copilotToken = copilotRes.ok ? await copilotRes.json() : {}; const userRes = await fetch(GITHUB_CONFIG.userInfoUrl, { headers: { Authorization: `Bearer ${tokens.access_token}`, Accept: "application/json", "X-GitHub-Api-Version": GITHUB_CONFIG.apiVersion, "User-Agent": GITHUB_CONFIG.userAgent, }, }); const userInfo = userRes.ok ? await userRes.json() : {}; return { copilotToken, userInfo }; }, mapTokens: (tokens, extra) => ({ accessToken: tokens.access_token, refreshToken: tokens.refresh_token, expiresIn: tokens.expires_in, providerSpecificData: { copilotToken: extra?.copilotToken?.token, copilotTokenExpiresAt: extra?.copilotToken?.expires_at, githubUserId: extra?.userInfo?.id, githubLogin: extra?.userInfo?.login, githubName: extra?.userInfo?.name, githubEmail: extra?.userInfo?.email, }, }), };