53 lines
1.6 KiB
TypeScript
53 lines
1.6 KiB
TypeScript
import * as plugins from '../plugins.js';
|
|
import type { ICertManager } from '../interfaces/certmanager.js';
|
|
import { SmartacmeCert } from '../smartacme.classes.cert.js';
|
|
|
|
/**
|
|
* MongoDB-backed certificate manager using EasyStore from smartdata.
|
|
*/
|
|
export class MongoCertManager implements ICertManager {
|
|
private db: plugins.smartdata.SmartdataDb;
|
|
private store: plugins.smartdata.EasyStore<Record<string, any>>;
|
|
|
|
/**
|
|
* @param mongoDescriptor MongoDB connection settings
|
|
*/
|
|
constructor(mongoDescriptor: plugins.smartdata.IMongoDescriptor) {
|
|
this.db = new plugins.smartdata.SmartdataDb(mongoDescriptor);
|
|
// Use a single EasyStore document to hold all certs keyed by domainName
|
|
this.store = new plugins.smartdata.EasyStore<Record<string, any>>(
|
|
'smartacme-certs',
|
|
this.db,
|
|
);
|
|
}
|
|
|
|
public async init(): Promise<void> {
|
|
await this.db.init();
|
|
}
|
|
|
|
public async retrieveCertificate(domainName: string): Promise<SmartacmeCert | null> {
|
|
const data = await this.store.readKey(domainName);
|
|
return data ? new SmartacmeCert(data) : null;
|
|
}
|
|
|
|
public async storeCertificate(cert: SmartacmeCert): Promise<void> {
|
|
// write plain object for persistence
|
|
await this.store.writeKey(cert.domainName, { ...cert });
|
|
}
|
|
|
|
public async deleteCertificate(domainName: string): Promise<void> {
|
|
await this.store.deleteKey(domainName);
|
|
}
|
|
|
|
public async close(): Promise<void> {
|
|
await this.db.close();
|
|
}
|
|
/**
|
|
* Wipe all certificates from the persistent store (for integration testing)
|
|
*/
|
|
public async wipe(): Promise<void> {
|
|
// clear all keys in the easy store
|
|
await this.store.wipe();
|
|
}
|
|
}
|