/* eslint-disable no-underscore-dangle */ 'use strict'; const fs = require('fs'); const crypto = require('crypto'); const { EventEmitter } = require('events'); class PersistentFile extends EventEmitter { constructor({ filepath, newFilename, originalFilename, mimetype, hashAlgorithm }) { super(); this.lastModifiedDate = null; Object.assign(this, { filepath, newFilename, originalFilename, mimetype, hashAlgorithm }); this.size = 0; this._writeStream = null; if (typeof this.hashAlgorithm === 'string') { this.hash = crypto.createHash(this.hashAlgorithm); } else { this.hash = null; } } open() { this._writeStream = new fs.WriteStream(this.filepath); this._writeStream.on('error', (err) => { this.emit('error', err); }); } toJSON() { const json = { size: this.size, filepath: this.filepath, newFilename: this.newFilename, mimetype: this.mimetype, mtime: this.lastModifiedDate, length: this.length, originalFilename: this.originalFilename, }; if (this.hash && this.hash !== '') { json.hash = this.hash; } return json; } toString() { return `PersistentFile: ${this._file.newFilename}, Original: ${this._file.originalFilename}, Path: ${this._file.filepath}`; } write(buffer, cb) { if (this.hash) { this.hash.update(buffer); } if (this._writeStream.closed) { cb(); return; } this._writeStream.write(buffer, () => { this.lastModifiedDate = new Date(); this.size += buffer.length; this.emit('progress', this.size); cb(); }); } end(cb) { if (this.hash) { this.hash = this.hash.digest('hex'); } this._writeStream.end(() => { this.emit('end'); cb(); }); } destroy() { this._writeStream.destroy(); fs.unlink(this.filepath, () => {}); } } module.exports = PersistentFile;