wekan/packages/wekan-cfs-data-man/server/data-man-filepath.js
2021-04-29 13:26:49 +03:00

108 lines
2.7 KiB
JavaScript

var mime = Npm.require('mime');
var fs = Npm.require("fs");
/**
* @method DataMan.FilePath
* @public
* @constructor
* @param {String} filepath
* @param {String} [type] The data content (MIME) type. Will lookup from file if not passed.
*/
DataMan.FilePath = function DataManFilePath(filepath, type) {
var self = this;
self.filepath = filepath;
self._type = type || mime.lookup(filepath);
};
/**
* @method DataMan.FilePath.prototype.getBuffer
* @private
* @param {function} callback callback(err, buffer)
* @returns {Buffer|undefined}
*
* Passes a Buffer representing the data to a callback.
*/
DataMan.FilePath.prototype.getBuffer = function dataManFilePathGetBuffer(callback) {
var self = this;
// Call node readFile
fs.readFile(self.filepath, Meteor.bindEnvironment(function(err, buffer) {
callback(err, buffer);
}, function(err) {
callback(err);
}));
};
/**
* @method DataMan.FilePath.prototype.getDataUri
* @private
* @param {function} callback callback(err, dataUri)
*
* Passes a data URI representing the data to a callback.
*/
DataMan.FilePath.prototype.getDataUri = function dataManFilePathGetDataUri(callback) {
var self = this;
self.getBuffer(function (error, buffer) {
if (error) {
callback(error);
} else {
if (!self._type) {
callback(new Error("DataMan.getDataUri couldn't get a contentType"));
} else {
var dataUri = "data:" + self._type + ";base64," + buffer.toString("base64");
buffer = null;
callback(null, dataUri);
}
}
});
};
/**
* @method DataMan.FilePath.prototype.createReadStream
* @private
*
* Returns a read stream for the data.
*/
DataMan.FilePath.prototype.createReadStream = function dataManFilePathCreateReadStream() {
// Stream from filesystem
return fs.createReadStream(this.filepath);
};
/**
* @method DataMan.FilePath.prototype.size
* @param {function} callback callback(err, size)
* @private
*
* Passes the size in bytes of the data to a callback.
*/
DataMan.FilePath.prototype.size = function dataManFilePathSize(callback) {
var self = this;
if (typeof self._size === "number") {
callback(null, self._size);
return;
}
// We can get the size without buffering
fs.stat(self.filepath, Meteor.bindEnvironment(function (error, stats) {
if (stats && typeof stats.size === "number") {
self._size = stats.size;
callback(null, self._size);
} else {
callback(error);
}
}, function (error) {
callback(error);
}));
};
/**
* @method DataMan.FilePath.prototype.type
* @private
*
* Returns the type of the data.
*/
DataMan.FilePath.prototype.type = function dataManFilePathType() {
return this._type;
};