forked from svrjs/svrjs
82 lines
1.7 KiB
JavaScript
82 lines
1.7 KiB
JavaScript
/* eslint-disable no-underscore-dangle */
|
|
|
|
'use strict';
|
|
|
|
const crypto = require('crypto');
|
|
const { EventEmitter } = require('events');
|
|
|
|
class VolatileFile extends EventEmitter {
|
|
constructor({ filepath, newFilename, originalFilename, mimetype, hashAlgorithm, createFileWriteStream }) {
|
|
super();
|
|
|
|
this.lastModifiedDate = null;
|
|
Object.assign(this, { filepath, newFilename, originalFilename, mimetype, hashAlgorithm, createFileWriteStream });
|
|
|
|
this.size = 0;
|
|
this._writeStream = null;
|
|
|
|
if (typeof this.hashAlgorithm === 'string') {
|
|
this.hash = crypto.createHash(this.hashAlgorithm);
|
|
} else {
|
|
this.hash = null;
|
|
}
|
|
}
|
|
|
|
open() {
|
|
this._writeStream = this.createFileWriteStream(this);
|
|
this._writeStream.on('error', (err) => {
|
|
this.emit('error', err);
|
|
});
|
|
}
|
|
|
|
destroy() {
|
|
this._writeStream.destroy();
|
|
}
|
|
|
|
toJSON() {
|
|
const json = {
|
|
size: this.size,
|
|
newFilename: this.newFilename,
|
|
length: this.length,
|
|
originalFilename: this.originalFilename,
|
|
mimetype: this.mimetype,
|
|
};
|
|
if (this.hash && this.hash !== '') {
|
|
json.hash = this.hash;
|
|
}
|
|
return json;
|
|
}
|
|
|
|
toString() {
|
|
return `VolatileFile: ${this.originalFilename}`;
|
|
}
|
|
|
|
write(buffer, cb) {
|
|
if (this.hash) {
|
|
this.hash.update(buffer);
|
|
}
|
|
|
|
if (this._writeStream.closed || this._writeStream.destroyed) {
|
|
cb();
|
|
return;
|
|
}
|
|
|
|
this._writeStream.write(buffer, () => {
|
|
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();
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = VolatileFile;
|