@verdaccio/local-storage
Advanced tools
Comparing version 0.0.14 to 0.1.0
@@ -36,2 +36,4 @@ 'use strict'; | ||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
@@ -42,4 +44,8 @@ | ||
var resourceNotAvailable = 'EAGAIN'; | ||
var pkgFileName = 'package.json'; | ||
var fSError = function fSError(message) { | ||
var err = (0, _httpErrors2.default)(409, message); | ||
var code = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 409; | ||
var err = (0, _httpErrors2.default)(code, message); | ||
// $FlowFixMe | ||
@@ -51,2 +57,11 @@ err.code = message; | ||
var ErrorCode = { | ||
get503: function get503() { | ||
return fSError('resource temporarily unavailable', 500); | ||
}, | ||
get404: function get404(customMessage) { | ||
return fSError('no such package available', 404); | ||
} | ||
}; | ||
var tempFile = function tempFile(str) { | ||
@@ -87,5 +102,65 @@ return `${str}.tmp${String(Math.random()).substr(2)}`; | ||
/** | ||
* This function allows to update the package thread-safely | ||
Algorithm: | ||
1. lock package.json for writing | ||
2. read package.json | ||
3. updateFn(pkg, cb), and wait for cb | ||
4. write package.json.tmp | ||
5. move package.json.tmp package.json | ||
6. callback(err?) | ||
* @param {*} name | ||
* @param {*} updateHandler | ||
* @param {*} onWrite | ||
* @param {*} transformPackage | ||
* @param {*} onEnd | ||
*/ | ||
_createClass(LocalFS, [{ | ||
key: 'deleteJSON', | ||
value: function deleteJSON(fileName, callback) { | ||
key: 'updatePackage', | ||
value: function updatePackage(name, updateHandler, onWrite, transformPackage, onEnd) { | ||
var _this = this; | ||
this._lockAndReadJSON(pkgFileName, function (err, json) { | ||
var locked = false; | ||
var self = _this; | ||
// callback that cleans up lock first | ||
var unLockCallback = function unLockCallback(lockError) { | ||
var _args = arguments; | ||
if (locked) { | ||
self._unlockJSON(pkgFileName, function () { | ||
// ignore any error from the unlock | ||
onEnd.apply(lockError, _args); | ||
}); | ||
} else { | ||
onEnd.apply(undefined, _toConsumableArray(_args)); | ||
} | ||
}; | ||
if (!err) { | ||
locked = true; | ||
} | ||
if (_lodash2.default.isNil(err) === false) { | ||
if (err.code === resourceNotAvailable) { | ||
return unLockCallback(ErrorCode.get503()); | ||
} else if (err.code === noSuchFile) { | ||
return unLockCallback(ErrorCode.get404()); | ||
} else { | ||
return unLockCallback(err); | ||
} | ||
} | ||
updateHandler(json, function (err) { | ||
if (err) { | ||
return unLockCallback(err); | ||
} | ||
onWrite(name, transformPackage(json), unLockCallback); | ||
}); | ||
}); | ||
} | ||
}, { | ||
key: 'deletePackage', | ||
value: function deletePackage(fileName, callback) { | ||
return _fs2.default.unlink(this._getStorage(fileName), callback); | ||
@@ -99,34 +174,14 @@ } | ||
}, { | ||
key: 'createJSON', | ||
value: function createJSON(name, value, cb) { | ||
key: 'createPackage', | ||
value: function createPackage(name, value, cb) { | ||
this._createFile(this._getStorage(name), this._convertToString(value), cb); | ||
} | ||
}, { | ||
key: 'writeJSON', | ||
value: function writeJSON(name, value, cb) { | ||
key: 'savePackage', | ||
value: function savePackage(name, value, cb) { | ||
this._writeFile(this._getStorage(name), this._convertToString(value), cb); | ||
} | ||
}, { | ||
key: 'lockAndReadJSON', | ||
value: function lockAndReadJSON(name, cb) { | ||
var fileName = this._getStorage(name); | ||
(0, _fileLocking.readFile)(fileName, { | ||
lock: true, | ||
parse: true | ||
}, function (err, res) { | ||
if (err) { | ||
return cb(err); | ||
} | ||
return cb(null, res); | ||
}); | ||
} | ||
}, { | ||
key: 'unlockJSON', | ||
value: function unlockJSON(name, cb) { | ||
(0, _fileLocking.unlockFile)(this._getStorage(name), cb); | ||
} | ||
}, { | ||
key: 'readJSON', | ||
value: function readJSON(name, cb) { | ||
key: 'readPackage', | ||
value: function readPackage(name, cb) { | ||
this._readStorageFile(this._getStorage(name)).then(function (res) { | ||
@@ -145,4 +200,4 @@ try { | ||
}, { | ||
key: 'createWriteStream', | ||
value: function createWriteStream(name) { | ||
key: 'writeTarball', | ||
value: function writeTarball(name) { | ||
var uploadStream = new _streams.UploadTarball(); | ||
@@ -207,4 +262,4 @@ | ||
}, { | ||
key: 'createReadStream', | ||
value: function createReadStream(name, readTarballStream) { | ||
key: 'readTarball', | ||
value: function readTarball(name, readTarballStream) { | ||
var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {}; | ||
@@ -242,3 +297,3 @@ | ||
value: function _createFile(name, contents, callback) { | ||
var _this = this; | ||
var _this2 = this; | ||
@@ -249,3 +304,3 @@ _fs2.default.exists(name, function (exists) { | ||
} | ||
_this._writeFile(name, contents, callback); | ||
_this2._writeFile(name, contents, callback); | ||
}); | ||
@@ -307,2 +362,22 @@ } | ||
} | ||
}, { | ||
key: '_lockAndReadJSON', | ||
value: function _lockAndReadJSON(name, cb) { | ||
var fileName = this._getStorage(name); | ||
(0, _fileLocking.readFile)(fileName, { | ||
lock: true, | ||
parse: true | ||
}, function (err, res) { | ||
if (err) { | ||
return cb(err); | ||
} | ||
return cb(null, res); | ||
}); | ||
} | ||
}, { | ||
key: '_unlockJSON', | ||
value: function _unlockJSON(name, cb) { | ||
(0, _fileLocking.unlockFile)(this._getStorage(name), cb); | ||
} | ||
}]); | ||
@@ -309,0 +384,0 @@ |
{ | ||
"name": "@verdaccio/local-storage", | ||
"version": "0.0.14", | ||
"version": "0.1.0", | ||
"description": "local storage implementation", | ||
@@ -23,3 +23,3 @@ "main": "lib/index.js", | ||
"devDependencies": { | ||
"@verdaccio/types": "^0.0.7", | ||
"@verdaccio/types": "^0.1.0", | ||
"babel-cli": "6.24.1", | ||
@@ -26,0 +26,0 @@ "babel-core": "6.25.0", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
20023
496