@civic/nexus-bridge
Version:
Stdio <-> HTTP/SSE MCP bridge with Civic auth handling
71 lines • 1.99 kB
JavaScript
/**
* 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