UNPKG

@civic/nexus-bridge

Version:

Stdio <-> HTTP/SSE MCP bridge with Civic auth handling

71 lines 1.99 kB
/** * tokenStore.ts * * Handles token persistence, storing and retrieving OAuth tokens * securely on the local filesystem. */ import fs from 'fs/promises'; import path from 'path'; import os from 'os'; import * as config from './config.js'; // Path to store tokens const configDir = path.join(os.homedir(), config.TOKEN_DIR); const configPath = path.join(configDir, config.TOKEN_FILE); // Default empty token state const emptyTokenState = { id_token: undefined, access_token: undefined, refresh_token: undefined }; /** * Ensures the token directory exists */ async function ensureDirExists() { try { await fs.mkdir(configDir, { recursive: true }); } catch (error) { const err = error; if (err.code !== 'EEXIST') { console.error(`Error creating token directory ${configDir}:`, error); throw error; } } } /** * Get all stored tokens * @returns An object containing all token types */ export async function getTokens() { try { await ensureDirExists(); const raw = await fs.readFile(configPath, 'utf-8'); return JSON.parse(raw); } catch (error) { const err = error; if (err.code === 'ENOENT') { // File doesn't exist, return empty state return { ...emptyTokenState }; } console.error(`Error reading tokens from ${configPath}:`, error); return { ...emptyTokenState }; } } /** * Store all token types * @param idToken ID token to store * @param accessToken Access token to store * @param refreshToken Refresh token to store */ export async function setTokens(tokens) { try { await ensureDirExists(); await fs.writeFile(configPath, JSON.stringify(tokens, null, 2), 'utf-8'); console.log("Tokens stored successfully."); } catch (error) { console.error(`Error writing tokens to ${configPath}:`, error); } } //# sourceMappingURL=tokenStore.js.map