import { getRequiredEnv, getStdout, loggerWithPrefix } from "./mod.ts"; const logger = loggerWithPrefix(() => `[${new Date().toISOString()}] [BitwardenSession]` ); export class BitwardenSession { private readonly sessionInitializer: Promise; constructor(server = getRequiredEnv("BW_SERVER")) { ["BW_CLIENTID", "BW_CLIENTSECRET"].forEach(getRequiredEnv); this.sessionInitializer = getStdout( `bw config server ${server} --quiet`, ) .then(() => { logger.log("Logging in via API"); return getStdout(`bw login --apikey --quiet`); }) .then(() => { logger.log("Unlocking vault in session"); return getStdout(`bw unlock --passwordenv BW_PASSWORD --raw`); }) .then((session) => { logger.log(`Session ${session}`); return session.trim(); }); } public async getItem( secretName: string, ): Promise { logger.log(`Finding secret ${secretName}`); return await this.sessionInitializer.then((session) => getStdout(`bw list items`, { env: { BW_SESSION: session, }, }) ).then((items) => JSON.parse(items)).then((items) => items.find(({ name }: { name: string }) => name === secretName) ).then((item) => { if (!item) throw new Error("Could not find bitwarden item " + secretName); logger.log(`Found secret: ${secretName}`); return item; }); } async close(): Promise { return await this.sessionInitializer.then((session) => getStdout(`bw lock`, { env: { BW_SESSION: session } }) ).then(() => { logger.log("Locked session"); }); } } export type LoginItem = { login: { username: string; password: string; }; }; export type SecureNote = { notes: string; };