import { randomUUID } from 'node:crypto' import fs from 'node:fs/promises' import Debug from 'debug' import { DEBUG_NAMESPACE } from '../debug.config.js' const debug = Debug(`${DEBUG_NAMESPACE}:functions.api`) const apiKeyPath = 'data/apiKeys.json' let apiKeys: Record | undefined export async function getApiKey(userName: string): Promise { apiKeys ??= await loadApiKeys() if (!Object.hasOwn(apiKeys, userName)) { await regenerateApiKey(userName) } return apiKeys[userName] } export async function getApiKeyFromUser(user: User): Promise { return await getApiKey(user.userName) } export async function getUserNameFromApiKey( apiKey: string ): Promise { apiKeys ??= await loadApiKeys() for (const [userName, currentApiKey] of Object.entries(apiKeys)) { if (apiKey === currentApiKey) { return userName } } return undefined } export async function regenerateApiKey(userName: string): Promise { apiKeys ??= await loadApiKeys() apiKeys[userName] = generateApiKey(userName) await saveApiKeys() } function generateApiKey(apiKeyPrefix: string): string { return `${apiKeyPrefix}-${randomUUID()}-${Date.now().toString()}` } async function loadApiKeys(): Promise> { try { const fileData = await fs.readFile(apiKeyPath, 'utf8') apiKeys = JSON.parse(fileData) as Record } catch (error) { debug(error) apiKeys = {} } return apiKeys } async function saveApiKeys(): Promise { try { await fs.writeFile(apiKeyPath, JSON.stringify(apiKeys), 'utf8') } catch (error) { debug(error) } }