This commit refactors epic-games.js to use the GraphQL API instead of the legacy promotions endpoint for retrieving free games. Key architectural improvements include: - Added modular authentication module (device-auths.ts) supporting persistent device auth tokens - Introduces cookie management module (cookie.ts) for persistent session handling - Extracts GraphQL query structures and API endpoints into constants.ts - Implements multiple fallback strategies: device auth login, token exchange, and fallback to standard login - Adds support for both GraphQL and promotions-based game discovery - Streamlines claim process with improved tracking and error handling - Removes legacy selectors and redundant logic Additionally, updates package.json to include TypeScript and reorganizes dependency order for better maintainability.
38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
// Device authentication management for Epic Games
|
|
// Based on https://github.com/claabs/epicgames-freegames-node
|
|
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { dataDir } from './util.js';
|
|
|
|
const CONFIG_DIR = dataDir('config');
|
|
const deviceAuthsFilename = path.join(CONFIG_DIR, 'device-auths.json');
|
|
|
|
// Ensure config directory exists
|
|
if (!fs.existsSync(CONFIG_DIR)) {
|
|
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
}
|
|
|
|
export async function getDeviceAuths() {
|
|
try {
|
|
const deviceAuths = JSON.parse(fs.readFileSync(deviceAuthsFilename, 'utf-8'));
|
|
return deviceAuths;
|
|
} catch {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
export async function getAccountAuth(account) {
|
|
const deviceAuths = await getDeviceAuths();
|
|
return deviceAuths?.[account];
|
|
}
|
|
|
|
export async function writeDeviceAuths(deviceAuths) {
|
|
fs.writeFileSync(deviceAuthsFilename, JSON.stringify(deviceAuths, null, 2));
|
|
}
|
|
|
|
export async function setAccountAuth(account, accountAuth) {
|
|
const existingDeviceAuths = (await getDeviceAuths()) ?? {};
|
|
existingDeviceAuths[account] = accountAuth;
|
|
await writeDeviceAuths(existingDeviceAuths);
|
|
}
|