@naturalcycles/db-lib
Version:
Lowest Common Denominator API to supported Databases
40 lines (39 loc) • 1.42 kB
JavaScript
import { Readable } from 'node:stream';
import { pMap } from '@naturalcycles/js-lib';
import { _pipeline, fs2 } from '@naturalcycles/nodejs-lib';
/**
* Persists in local filesystem as ndjson.
*/
export class LocalFilePersistencePlugin {
constructor(cfg = {}) {
this.cfg = {
storagePath: './tmp/localdb',
gzip: true,
...cfg,
};
}
cfg;
async ping() { }
async getTables() {
return (await fs2.readdirAsync(this.cfg.storagePath))
.filter(f => f.includes('.ndjson'))
.map(f => f.split('.ndjson')[0]);
}
async loadFile(table) {
await fs2.ensureDirAsync(this.cfg.storagePath);
const ext = `ndjson${this.cfg.gzip ? '.gz' : ''}`;
const filePath = `${this.cfg.storagePath}/${table}.${ext}`;
if (!(await fs2.pathExistsAsync(filePath)))
return [];
return await fs2.createReadStreamAsNDJSON(filePath).toArray();
}
async saveFiles(ops) {
await pMap(ops, async (op) => await this.saveFile(op.table, op.rows), { concurrency: 32 });
}
async saveFile(table, rows) {
await fs2.ensureDirAsync(this.cfg.storagePath);
const ext = `ndjson${this.cfg.gzip ? '.gz' : ''}`;
const filePath = `${this.cfg.storagePath}/${table}.${ext}`;
await _pipeline([Readable.from(rows), ...fs2.createWriteStreamAsNDJSON(filePath)]);
}
}