lib/HostsManager.ts (79 lines of code) (raw):
import * as path from 'path';
import * as fs from 'fs';
import * as os from 'os';
import * as util from 'util';
import * as Nedb from 'nedb';
export interface Host {
path: string
}
const DEFAULT_HOSTS = process.env.MONGOKU_DEFAULT_HOST ? process.env.MONGOKU_DEFAULT_HOST.split(';') : ['localhost:27017'];
const DATABASE_FILE = process.env.MONGOKU_DATABASE_FILE || path.join(os.homedir(), '.mongoku.db');
export class HostsManager {
private _db: Nedb;
private promise(fn: any) {
return util.promisify(fn.bind(this._db));
}
async load() {
let first = false;
try {
await fs.promises.stat(DATABASE_FILE);
} catch (err) {
first = true;
}
this._db = new Nedb({
filename: DATABASE_FILE
});
const load = this.promise(this._db.loadDatabase);
await load();
if (first) {
await Promise.all(DEFAULT_HOSTS.map(async hostname => {
const insert: any = this.promise(this._db.insert);
return await insert({
path: hostname
});
}));
}
}
getHosts(): Promise<Host[]> {
return new Promise<Host[]>((resolve, reject) => {
this._db.find({}, (err: Error, hosts: Host[]) => {
if (err) {
return reject(err);
}
else {
return resolve(hosts);
}
});
});
}
async add(path: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
this._db.update({
path: path
}, {
$set: {
path: path
}
}, { upsert: true }, (err: Error) => {
if (err) {
return reject(err);
} else {
return resolve();
}
});
});
}
async remove(path: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
this._db.remove({
path: new RegExp(`${path}`)
}, (err: Error) => {
if (err) {
return reject(err);
} else {
return resolve();
}
});
});
}
}