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 { if (apiKeys === undefined) { 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 { if (apiKeys === undefined) { 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[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 = {} } } async function saveApiKeys(): Promise { try { await fs.writeFile(apiKeyPath, JSON.stringify(apiKeys), 'utf8') } catch (error) { debug(error) } }