From 6eb01d9eea527fad182c8afda116ced58f11171d Mon Sep 17 00:00:00 2001 From: petersirka Date: Wed, 3 Jul 2024 10:06:55 +0200 Subject: [PATCH] Added `FILESTORAGE().copy(id, path, [callback])`. --- filestorage.js | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/filestorage.js b/filestorage.js index a7b9a27..0be9f54 100644 --- a/filestorage.js +++ b/filestorage.js @@ -373,6 +373,84 @@ FP._read = function(id, callback, nostream) { return self; }; +FP.copy = function(id, path, callback) { + var self = this; + if (callback) + return self._copy(id, path, callback); + else + return new Promise((resolve, reject) => self._copy(id, path, (err, res) => err ? reject(err) : resolve(res))); +}; + +FP._copy = function(id, path, callback) { + + var self = this; + + if (self.pause) { + setTimeout(self._copy, 500, id, path, callback); + return self; + } + + var filename = Path.join(self.makedirectory(id), id + '.file'); + + F.stats.performance.open++; + Fs.open(filename, 'r', function(err, fd) { + + if (err) { + callback(err); + return; + } + + var buffer = Buffer.alloc(HEADERSIZE); + Fs.read(fd, buffer, 0, HEADERSIZE, 0, function(err) { + + if (err) { + Fs.close(fd, NOOP); + callback(err); + return; + } + + var str = buffer.toString('utf8').replace(REGCLEAN, ''); + if (!str) { + // Invalid file + Fs.close(fd, function() { + if (buffer.length === HEADERSIZE) + Fs.unlink(filename, NOOP); + }); + callback('File not found'); + return; + } + + var meta = str.parseJSON(true); + if (!meta) { + Fs.close(fd, NOOP); + callback('Invalid file'); + return; + } + + meta.id = id; + + if (meta.expire && meta.expire < NOW) { + Fs.close(fd, NOOP); + callback('File is expired'); + return; + } + + F.stats.performance.open++; + + var reader = Fs.createReadStream(filename, { fd: fd, start: HEADERSIZE }); + var writer = Fs.createWriteStream(path.includes('.') ? path : Path.join(path, meta.name)); + + reader.pipe(writer); + + CLEANUP(reader, function() { + callback(err, meta); + Fs.close(fd, NOOP); + }); + + }); + }); +}; + FP.readbuffer = function(id, callback) { var self = this; if (callback)