0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2024-12-16 21:56:25 -05:00
verdaccio/lib/local-fs.js

157 lines
3.6 KiB
JavaScript
Raw Normal View History

2013-05-31 17:57:28 -05:00
var fs = require('fs');
var Path = require('path');
2013-06-20 08:07:34 -05:00
var through = require('through');
var FSError = require('./error').FSError;
2013-05-31 17:57:28 -05:00
function make_directories(dest, cb) {
var dir = Path.dirname(dest);
if (dir === '.' || dir === '..') return cb();
fs.mkdir(dir, function(err) {
if (err && err.code === 'ENOENT') {
make_directories(dir, function() {
fs.mkdir(dir, cb);
})
} else {
cb();
}
});
}
2013-06-18 13:14:55 -05:00
function write(dest, data, cb) {
2013-05-31 17:57:28 -05:00
var safe_write = function(cb) {
2013-06-21 19:19:46 -05:00
var tmpname = dest + '.tmp' + String(Math.random()).substr(2);
fs.writeFile(tmpname, data, function(err) {
if (err) return cb(err);
return fs.rename(tmpname, dest, cb);
});
2013-05-31 17:57:28 -05:00
}
safe_write(function(err) {
if (err && err.code === 'ENOENT') {
make_directories(dest, function() {
safe_write(cb);
})
} else {
cb(err);
}
});
}
2013-06-20 08:07:34 -05:00
function write_stream(name) {
var stream = through(function(data) {
this.queue(data);
}, function() {
this.queue(null);
2013-07-12 14:51:04 -05:00
}, {autoDestroy: false});
2013-06-20 08:07:34 -05:00
stream.pause();
fs.exists(name, function(exists) {
if (exists) return stream.emit('error', new FSError('EEXISTS'));
var tmpname = name + '.tmp-'+String(Math.random()).replace(/^0\./, '');
var file = fs.createWriteStream(tmpname);
stream.on('data', function(data) {
file.write(data);
});
stream.on('end', function() {
2013-07-12 14:51:04 -05:00
file.on('close', function() {
fs.rename(tmpname, name, function(err) {
if (err) stream.emit('error', err);
stream.emit('close');
});
2013-06-20 08:07:34 -05:00
});
2013-07-12 14:51:04 -05:00
file.destroySoon();
2013-06-20 08:07:34 -05:00
});
file.on('open', function() {
// re-emitting open because it's handled in storage.js
stream.emit('open');
});
2013-09-24 01:28:26 -05:00
stream.on('abort', function() {
file.on('close', function() {
fs.unlink(tmpname);
});
file.destroy();
});
2013-06-20 08:07:34 -05:00
stream.resume();
});
return stream;
}
function read_stream(name, stream, callback) {
return fs.createReadStream(name);
}
2013-05-31 17:57:28 -05:00
function create(name, contents, callback) {
fs.exists(name, function(exists) {
2013-06-20 08:07:34 -05:00
if (exists) return callback(new FSError('EEXISTS'));
2013-06-18 13:14:55 -05:00
write(name, contents, callback);
2013-05-31 17:57:28 -05:00
});
}
function update(name, contents, callback) {
fs.exists(name, function(exists) {
2013-06-20 08:07:34 -05:00
if (!exists) return callback(new FSError('ENOENT'));
2013-06-18 13:14:55 -05:00
write(name, contents, callback);
2013-05-31 17:57:28 -05:00
});
}
function read(name, callback) {
fs.readFile(name, callback);
}
2013-06-14 03:34:29 -05:00
function Storage(path) {
this.path = path;
try {
fs.mkdirSync(path);
console.log('created new packages directory: ', path);
} catch(err) {
if (err.code !== 'EEXIST') throw new Error(err);
}
}
Storage.prototype.read = function(name, cb) {
read(this.path + '/' + name, cb);
}
Storage.prototype.read_json = function(name, cb) {
read(this.path + '/' + name, function(err, res) {
if (err) return cb(err);
2013-06-21 19:19:46 -05:00
cb(null, JSON.parse(res.toString('utf8')));
2013-06-14 03:34:29 -05:00
});
}
Storage.prototype.create = function(name, value, cb) {
create(this.path + '/' + name, value, cb);
}
Storage.prototype.create_json = function(name, value, cb) {
2013-06-20 08:07:34 -05:00
create(this.path + '/' + name, JSON.stringify(value, null, '\t'), cb);
2013-06-14 03:34:29 -05:00
}
Storage.prototype.update = function(name, value, cb) {
update(this.path + '/' + name, value, cb);
}
Storage.prototype.update_json = function(name, value, cb) {
2013-06-20 08:07:34 -05:00
update(this.path + '/' + name, JSON.stringify(value, null, '\t'), cb);
2013-06-14 03:34:29 -05:00
}
2013-06-18 13:14:55 -05:00
Storage.prototype.write = function(name, value, cb) {
write(this.path + '/' + name, value, cb);
}
Storage.prototype.write_json = function(name, value, cb) {
2013-06-19 11:58:16 -05:00
write(this.path + '/' + name, JSON.stringify(value, null, '\t'), cb);
2013-06-18 13:14:55 -05:00
}
2013-06-20 08:07:34 -05:00
Storage.prototype.write_stream = function(name, value, cb) {
return write_stream(this.path + '/' + name, value, cb);
}
Storage.prototype.read_stream = function(name, cb) {
return read_stream(this.path + '/' + name, cb);
}
2013-06-14 03:34:29 -05:00
module.exports = Storage;
2013-05-31 17:57:28 -05:00