0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2025-02-17 23:45:29 -05:00

Fix eslint, add jsdoc on storage lib

This commit is contained in:
Juan Picado 2017-05-09 09:56:54 +02:00
parent 57692cd8b1
commit 445df5b30e
No known key found for this signature in database
GPG key ID: 18AC54485952D158

View file

@ -67,24 +67,36 @@ class Storage {
}); });
}); });
/**
* Check whether a package it is already a local package
* @param {*} cb the callback method
*/
function check_package_local(cb) { function check_package_local(cb) {
self.local.get_package(name, {}, function(err, results) { self.local.get_package(name, {}, function(err, results) {
if (err && err.status !== 404) return cb(err); if (err && err.status !== 404) {
return cb(err);
if (results) return cb( Error[409]('this package is already present') ); }
if (results) {
return cb( Error[409]('this package is already present') );
}
cb(); cb();
}); });
} }
/**
* Check whether a package exist in any of the uplinks.
* @param {*} cb the callback method
*/
function check_package_remote(cb) { function check_package_remote(cb) {
self._sync_package_with_uplinks(name, null, {}, function(err, results, err_results) { self._sync_package_with_uplinks(name, null, {}, function(err, results, err_results) {
// something weird // something weird
if (err && err.status !== 404) return cb(err); if (err && err.status !== 404) {
return cb(err);
}
// checking package // checking package
if (results) return cb( Error[409]('this package is already present') ); if (results) {
return cb( Error[409]('this package is already present') );
}
for (let i=0; i<err_results.length; i++) { for (let i=0; i<err_results.length; i++) {
// checking error // checking error
// if uplink fails with a status other than 404, we report failure // if uplink fails with a status other than 404, we report failure
@ -99,6 +111,10 @@ class Storage {
}); });
} }
/**
* Add a package to the local database
* @param {*} cb callback method
*/
function publish_package(cb) { function publish_package(cb) {
self.local.add_package(name, metadata, callback); self.local.add_package(name, metadata, callback);
} }
@ -114,7 +130,7 @@ class Storage {
* @param {*} callback * @param {*} callback
*/ */
add_version(name, version, metadata, tag, callback) { add_version(name, version, metadata, tag, callback) {
return this.local.add_version(name, version, metadata, tag, callback); this.local.add_version(name, version, metadata, tag, callback);
} }
/** /**
@ -125,7 +141,7 @@ class Storage {
* @param {*} callback * @param {*} callback
*/ */
merge_tags(name, tag_hash, callback) { merge_tags(name, tag_hash, callback) {
return this.local.merge_tags(name, tag_hash, callback); this.local.merge_tags(name, tag_hash, callback);
} }
/** /**
@ -136,7 +152,7 @@ class Storage {
* @param {*} callback * @param {*} callback
*/ */
replace_tags(name, tag_hash, callback) { replace_tags(name, tag_hash, callback) {
return this.local.replace_tags(name, tag_hash, callback); this.local.replace_tags(name, tag_hash, callback);
} }
/** /**
@ -149,7 +165,7 @@ class Storage {
* @param {*} callback * @param {*} callback
*/ */
change_package(name, metadata, revision, callback) { change_package(name, metadata, revision, callback) {
return this.local.change_package(name, metadata, revision, callback); this.local.change_package(name, metadata, revision, callback);
} }
/** /**
@ -160,7 +176,7 @@ class Storage {
* @param {*} callback * @param {*} callback
*/ */
remove_package(name, callback) { remove_package(name, callback) {
return this.local.remove_package(name, callback); this.local.remove_package(name, callback);
} }
/** /**
@ -175,7 +191,7 @@ class Storage {
* @param {*} callback * @param {*} callback
*/ */
remove_tarball(name, filename, revision, callback) { remove_tarball(name, filename, revision, callback) {
return this.local.remove_tarball(name, filename, revision, callback); this.local.remove_tarball(name, filename, revision, callback);
} }
/** /**
@ -184,6 +200,7 @@ class Storage {
Used storages: local (write) Used storages: local (write)
* @param {*} name * @param {*} name
* @param {*} filename * @param {*} filename
* @return {Stream}
*/ */
add_tarball(name, filename) { add_tarball(name, filename) {
return this.local.add_tarball(name, filename); return this.local.add_tarball(name, filename);
@ -197,6 +214,7 @@ class Storage {
Used storages: local || uplink (just one) Used storages: local || uplink (just one)
* @param {*} name * @param {*} name
* @param {*} filename * @param {*} filename
* @return {Stream}
*/ */
get_tarball(name, filename) { get_tarball(name, filename) {
let stream = MyStreams.ReadTarballStream(); let stream = MyStreams.ReadTarballStream();
@ -219,21 +237,19 @@ class Storage {
let err404 = err; let err404 = err;
rstream.abort(); rstream.abort();
rstream = null; // gc rstream = null; // gc
self.local.get_package(name, function(err, info) { self.local.get_package(name, function(err, info) {
if (!err && info._distfiles && info._distfiles[filename] != null) { if (!err && info._distfiles && info._distfiles[filename] != null) {
// information about this file exists locally // information about this file exists locally
serve_file(info._distfiles[filename]); serve_file(info._distfiles[filename]);
} else { } else {
// we know nothing about this file, trying to get information elsewhere // we know nothing about this file, trying to get information elsewhere
self._sync_package_with_uplinks(name, info, {}, function(err, info) { self._sync_package_with_uplinks(name, info, {}, function(err, info) {
if (err) return stream.emit('error', err); if (err) {
return stream.emit('error', err);
}
if (!info._distfiles || info._distfiles[filename] == null) { if (!info._distfiles || info._distfiles[filename] == null) {
return stream.emit('error', err404); return stream.emit('error', err404);
} }
serve_file(info._distfiles[filename]); serve_file(info._distfiles[filename]);
}); });
} }
@ -248,6 +264,10 @@ class Storage {
}); });
return stream; return stream;
/**
* Fetch and cache local/remote packages.
* @param {Object} file define the package shape
*/
function serve_file(file) { function serve_file(file) {
let uplink = null; let uplink = null;
for (let p in self.uplinks) { for (let p in self.uplinks) {
@ -261,35 +281,46 @@ class Storage {
_autogenerated: true, _autogenerated: true,
}, self.config); }, self.config);
} }
let savestream = self.local.add_tarball(name, filename); let savestream = self.local.add_tarball(name, filename);
let on_open = function() { let on_open = function() {
on_open = function() {}; // prevent it from being called twice // prevent it from being called twice
on_open = function() {};
let rstream2 = uplink.get_url(file.url); let rstream2 = uplink.get_url(file.url);
rstream2.on('error', function(err) { rstream2.on('error', function(err) {
if (savestream) savestream.abort(); if (savestream) {
savestream.abort();
}
savestream = null; savestream = null;
stream.emit('error', err); stream.emit('error', err);
}); });
rstream2.on('end', function() { rstream2.on('end', function() {
if (savestream) savestream.done(); if (savestream) {
savestream.done();
}
}); });
rstream2.on('content-length', function(v) { rstream2.on('content-length', function(v) {
stream.emit('content-length', v); stream.emit('content-length', v);
if (savestream) savestream.emit('content-length', v); if (savestream) {
savestream.emit('content-length', v);
}
}); });
rstream2.pipe(stream); rstream2.pipe(stream);
if (savestream) rstream2.pipe(savestream); if (savestream) {
rstream2.pipe(savestream);
}
}; };
savestream.on('open', function() { savestream.on('open', function() {
on_open(); on_open();
}); });
savestream.on('error', function(err) { savestream.on('error', function(err) {
self.logger.warn( {err: err} self.logger.warn( {err: err}
, 'error saving file: @{err.message}\n@{err.stack}' ); , 'error saving file: @{err.message}\n@{err.stack}' );
if (savestream) savestream.abort(); if (savestream) {
savestream.abort();
}
savestream = null; savestream = null;
on_open(); on_open();
}); });
@ -344,17 +375,21 @@ class Storage {
Used storages: local && uplink (proxy_access) Used storages: local && uplink (proxy_access)
* @param {*} startkey * @param {*} startkey
* @param {*} options * @param {*} options
* @return {Stream}
*/ */
search(startkey, options) { search(startkey, options) {
let self = this; let self = this;
// stream to write a tarball
let stream = new Stream.PassThrough({objectMode: true}); let stream = new Stream.PassThrough({objectMode: true});
async.eachSeries(Object.keys(this.uplinks), function(up_name, cb) { async.eachSeries(Object.keys(this.uplinks), function(up_name, cb) {
// shortcut: if `local=1` is supplied, don't call uplinks // shortcut: if `local=1` is supplied, don't call uplinks
if (options.req.query.local !== undefined) return cb(); if (options.req.query.local !== undefined) {
return cb();
}
// search by keyword for each uplink
let lstream = self.uplinks[up_name].search(startkey, options); let lstream = self.uplinks[up_name].search(startkey, options);
// join streams
lstream.pipe(stream, {end: false}); lstream.pipe(stream, {end: false});
lstream.on('error', function(err) { lstream.on('error', function(err) {
self.logger.error({err: err}, 'uplink error: @{err.message}'); self.logger.error({err: err}, 'uplink error: @{err.message}');
@ -365,10 +400,15 @@ class Storage {
}); });
stream.abort = function() { stream.abort = function() {
if (lstream.abort) lstream.abort(); if (lstream.abort) {
lstream.abort();
}
cb(), cb = function() {}; cb(), cb = function() {};
}; };
}, function() { },
// executed after all series
function() {
// attach a local search results
let lstream = self.local.search(startkey, options); let lstream = self.local.search(startkey, options);
stream.abort = function() { stream.abort = function() {
lstream.abort(); lstream.abort();
@ -392,7 +432,7 @@ class Storage {
let locals = this.config.localList.get(); let locals = this.config.localList.get();
let packages = []; let packages = [];
var getPackage = function(i) { const getPackage = function(i) {
self.local.get_package(locals[i], function(err, info) { self.local.get_package(locals[i], function(err, info) {
if (!err) { if (!err) {
let latest = info['dist-tags'].latest; let latest = info['dist-tags'].latest;
@ -463,10 +503,13 @@ class Storage {
} }
up.get_package(name, _options, function(err, up_res, etag) { up.get_package(name, _options, function(err, up_res, etag) {
if (err && err.status === 304) if (err && err.status === 304) {
pkginfo._uplinks[up.upname].fetched = Date.now(); pkginfo._uplinks[up.upname].fetched = Date.now();
}
if (err || !up_res) return cb(null, [err || Error('no data')]); if (err || !up_res) {
return cb(null, [err || Error('no data')]);
}
try { try {
Utils.validate_metadata(up_res, name); Utils.validate_metadata(up_res, name);
@ -483,15 +526,17 @@ class Storage {
fetched: Date.now(), fetched: Date.now(),
}; };
for (let i in up_res.versions) { for (let i in up_res.versions) {
// this won't be serialized to json, if (Object.prototype.hasOwnProperty.call(up_res.versions, i)) {
// kinda like an ES6 Symbol // this won't be serialized to json,
// FIXME: perhaps Symbol('_verdaccio_uplink') here? // kinda like an ES6 Symbol
Object.defineProperty(up_res.versions[i], '_verdaccio_uplink', { // FIXME: perhaps Symbol('_verdaccio_uplink') here?
value: up.upname, Object.defineProperty(up_res.versions[i], '_verdaccio_uplink', {
enumerable: false, value: up.upname,
configurable: false, enumerable: false,
writable: true, configurable: false,
}); writable: true,
});
}
} }
try { try {