@verdaccio/local-storage 10.3.0 → 10.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/local-fs.js CHANGED
@@ -4,26 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.resourceNotAvailable = exports.pkgFileName = exports.noSuchFile = exports.fileExist = exports.fSError = exports.default = void 0;
7
-
8
7
  var _fs = _interopRequireDefault(require("fs"));
9
-
10
8
  var _path = _interopRequireDefault(require("path"));
11
-
12
9
  var _debug = _interopRequireDefault(require("debug"));
13
-
14
10
  var _lodash = _interopRequireDefault(require("lodash"));
15
-
16
11
  var _mkdirp = _interopRequireDefault(require("mkdirp"));
17
-
18
12
  var _streams = require("@verdaccio/streams");
19
-
20
13
  var _fileLocking = require("@verdaccio/file-locking");
21
-
22
14
  var _commonsApi = require("@verdaccio/commons-api");
23
-
24
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
16
+ /* eslint-disable no-undef */
27
17
 
28
18
  const fileExist = 'EEXISTS';
29
19
  exports.fileExist = fileExist;
@@ -34,56 +24,44 @@ exports.resourceNotAvailable = resourceNotAvailable;
34
24
  const pkgFileName = 'package.json';
35
25
  exports.pkgFileName = pkgFileName;
36
26
  const debug = (0, _debug.default)('verdaccio:plugin:local-storage:fs');
37
-
38
27
  const fSError = function (message, code = 409) {
39
- const err = (0, _commonsApi.getCode)(code, message); // FIXME: we should return http-status codes here instead, future improvement
28
+ const err = (0, _commonsApi.getCode)(code, message);
29
+ // FIXME: we should return http-status codes here instead, future improvement
40
30
  // @ts-ignore
41
-
42
31
  err.code = message;
43
32
  return err;
44
33
  };
45
-
46
34
  exports.fSError = fSError;
47
-
48
35
  const tempFile = function (str) {
49
36
  return `${str}.tmp${String(Math.random()).substr(2)}`;
50
37
  };
51
-
52
38
  const renameTmp = function (src, dst, _cb) {
53
39
  const cb = err => {
54
40
  if (err) {
55
41
  _fs.default.unlink(src, () => {});
56
42
  }
57
-
58
43
  _cb(err);
59
44
  };
60
-
61
45
  if (process.platform !== 'win32') {
62
46
  return _fs.default.rename(src, dst, cb);
63
- } // windows can't remove opened file,
64
- // but it seem to be able to rename it
65
-
47
+ }
66
48
 
49
+ // windows can't remove opened file,
50
+ // but it seem to be able to rename it
67
51
  const tmp = tempFile(dst);
68
-
69
52
  _fs.default.rename(dst, tmp, function (err) {
70
53
  _fs.default.rename(src, dst, cb);
71
-
72
54
  if (!err) {
73
55
  _fs.default.unlink(tmp, () => {});
74
56
  }
75
57
  });
76
58
  };
77
-
78
59
  class LocalFS {
79
60
  constructor(path, logger) {
80
- _defineProperty(this, "path", void 0);
81
-
82
- _defineProperty(this, "logger", void 0);
83
-
84
61
  this.path = path;
85
62
  this.logger = logger;
86
63
  }
64
+
87
65
  /**
88
66
  * This function allows to update the package thread-safely
89
67
  Algorithm:
@@ -99,24 +77,20 @@ class LocalFS {
99
77
  * @param {*} transformPackage
100
78
  * @param {*} onEnd
101
79
  */
102
-
103
-
104
80
  updatePackage(name, updateHandler, onWrite, transformPackage, onEnd) {
105
81
  this._lockAndReadJSON(pkgFileName, (err, json) => {
106
82
  let locked = false;
107
- const self = this; // callback that cleans up lock first
108
-
83
+ const self = this;
84
+ // callback that cleans up lock first
109
85
  const unLockCallback = function (lockError) {
110
86
  // eslint-disable-next-line prefer-rest-params
111
87
  const _args = arguments;
112
-
113
88
  if (locked) {
114
89
  self._unlockJSON(pkgFileName, () => {
115
90
  // ignore any error from the unlock
116
91
  if (lockError !== null) {
117
92
  debug('lock file: %o has failed with error %o', name, lockError);
118
93
  }
119
-
120
94
  onEnd.apply(lockError, _args);
121
95
  });
122
96
  } else {
@@ -124,12 +98,10 @@ class LocalFS {
124
98
  onEnd(..._args);
125
99
  }
126
100
  };
127
-
128
101
  if (!err) {
129
102
  locked = true;
130
103
  debug('file: %o has been locked', name);
131
104
  }
132
-
133
105
  if (_lodash.default.isNil(err) === false) {
134
106
  if (err.code === resourceNotAvailable) {
135
107
  return unLockCallback((0, _commonsApi.getInternalError)('resource temporarily unavailable'));
@@ -139,43 +111,32 @@ class LocalFS {
139
111
  return unLockCallback(err);
140
112
  }
141
113
  }
142
-
143
114
  updateHandler(json, err => {
144
115
  if (err) {
145
116
  return unLockCallback(err);
146
117
  }
147
-
148
118
  onWrite(name, transformPackage(json), unLockCallback);
149
119
  });
150
120
  });
151
121
  }
152
-
153
122
  deletePackage(packageName, callback) {
154
123
  debug('delete a package %o', packageName);
155
124
  return _fs.default.unlink(this._getStorage(packageName), callback);
156
125
  }
157
-
158
126
  removePackage(callback) {
159
127
  debug('remove a package %o', this.path);
160
-
161
128
  _fs.default.rmdir(this._getStorage('.'), callback);
162
129
  }
163
-
164
130
  createPackage(name, value, cb) {
165
131
  debug('create a package %o', name);
166
-
167
132
  this._createFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
168
133
  }
169
-
170
134
  savePackage(name, value, cb) {
171
135
  debug('save a package %o', name);
172
-
173
136
  this._writeFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
174
137
  }
175
-
176
138
  readPackage(name, cb) {
177
139
  debug('read a package %o', name);
178
-
179
140
  this._readStorageFile(this._getStorage(pkgFileName)).then(res => {
180
141
  try {
181
142
  const data = JSON.parse(res.toString('utf8'));
@@ -190,7 +151,6 @@ class LocalFS {
190
151
  return cb(err);
191
152
  });
192
153
  }
193
-
194
154
  writeTarball(name) {
195
155
  const uploadStream = new _streams.UploadTarball({});
196
156
  debug('write a tarball for a package %o', name);
@@ -198,26 +158,18 @@ class LocalFS {
198
158
  uploadStream.on('end', function () {
199
159
  _ended = 1;
200
160
  });
201
-
202
161
  const pathName = this._getStorage(name);
203
-
204
162
  _fs.default.access(pathName, fileNotFound => {
205
163
  const exists = !fileNotFound;
206
-
207
164
  if (exists) {
208
165
  uploadStream.emit('error', fSError(fileExist));
209
166
  } else {
210
167
  const temporalName = _path.default.join(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\./, '')}`);
211
-
212
168
  debug('write a temporal name %o', temporalName);
213
-
214
169
  const file = _fs.default.createWriteStream(temporalName);
215
-
216
170
  const removeTempFile = () => _fs.default.unlink(temporalName, () => {});
217
-
218
171
  let opened = false;
219
172
  uploadStream.pipe(file);
220
-
221
173
  uploadStream.done = function () {
222
174
  const onend = function () {
223
175
  file.on('close', function () {
@@ -231,14 +183,12 @@ class LocalFS {
231
183
  });
232
184
  file.end();
233
185
  };
234
-
235
186
  if (_ended) {
236
187
  onend();
237
188
  } else {
238
189
  uploadStream.on('end', onend);
239
190
  }
240
191
  };
241
-
242
192
  uploadStream.abort = function () {
243
193
  if (opened) {
244
194
  opened = false;
@@ -249,13 +199,11 @@ class LocalFS {
249
199
  // if the file does not recieve any byte never is opened and has to be removed anyway.
250
200
  removeTempFile();
251
201
  }
252
-
253
202
  file.end();
254
203
  };
255
-
256
204
  file.on('open', function () {
257
- opened = true; // re-emitting open because it's handled in storage.js
258
-
205
+ opened = true;
206
+ // re-emitting open because it's handled in storage.js
259
207
  uploadStream.emit('open');
260
208
  });
261
209
  file.on('error', function (err) {
@@ -263,18 +211,13 @@ class LocalFS {
263
211
  });
264
212
  }
265
213
  });
266
-
267
214
  return uploadStream;
268
215
  }
269
-
270
216
  readTarball(name) {
271
217
  const pathName = this._getStorage(name);
272
-
273
218
  debug('read a a tarball %o on path %o', name, pathName);
274
219
  const readTarballStream = new _streams.ReadTarball({});
275
-
276
220
  const readStream = _fs.default.createReadStream(pathName);
277
-
278
221
  readStream.on('error', function (err) {
279
222
  debug('error on read a tarball %o with error %o', name, err);
280
223
  readTarballStream.emit('error', err);
@@ -285,25 +228,20 @@ class LocalFS {
285
228
  debug('error on read a tarball %o with error %o', name, err);
286
229
  return readTarballStream.emit('error', err);
287
230
  }
288
-
289
231
  readTarballStream.emit('content-length', stats.size);
290
232
  readTarballStream.emit('open');
291
233
  debug('open on read a tarball %o', name);
292
234
  readStream.pipe(readTarballStream);
293
235
  });
294
236
  });
295
-
296
237
  readTarballStream.abort = function () {
297
238
  debug('abort on read a tarball %o', name);
298
239
  readStream.close();
299
240
  };
300
-
301
241
  return readTarballStream;
302
242
  }
303
-
304
243
  _createFile(name, contents, callback) {
305
244
  debug(' create a new file: %o', name);
306
-
307
245
  _fs.default.open(name, 'wx', err => {
308
246
  if (err) {
309
247
  // native EEXIST used here to check exception on fs.open
@@ -312,15 +250,12 @@ class LocalFS {
312
250
  return callback(fSError(fileExist));
313
251
  }
314
252
  }
315
-
316
253
  this._writeFile(name, contents, callback);
317
254
  });
318
255
  }
319
-
320
256
  _readStorageFile(name) {
321
257
  return new Promise((resolve, reject) => {
322
258
  debug('reading the file: %o', name);
323
-
324
259
  _fs.default.readFile(name, (err, data) => {
325
260
  if (err) {
326
261
  debug('error reading the file: %o with error %o', name, err);
@@ -332,32 +267,25 @@ class LocalFS {
332
267
  });
333
268
  });
334
269
  }
335
-
336
270
  _convertToString(value) {
337
271
  return JSON.stringify(value, null, '\t');
338
272
  }
339
-
340
273
  _getStorage(fileName = '') {
341
274
  const storagePath = _path.default.join(this.path, fileName);
342
-
343
275
  return storagePath;
344
276
  }
345
-
346
277
  _writeFile(dest, data, cb) {
347
278
  const createTempFile = cb => {
348
279
  const tempFilePath = tempFile(dest);
349
-
350
280
  _fs.default.writeFile(tempFilePath, data, err => {
351
281
  if (err) {
352
282
  debug('error on write the file: %o', dest);
353
283
  return cb(err);
354
284
  }
355
-
356
285
  debug('creating a new file:: %o', dest);
357
286
  renameTmp(tempFilePath, dest, cb);
358
287
  });
359
288
  };
360
-
361
289
  createTempFile(err => {
362
290
  if (err && err.code === noSuchFile) {
363
291
  (0, _mkdirp.default)(_path.default.dirname(dest)).then(() => {
@@ -370,10 +298,8 @@ class LocalFS {
370
298
  }
371
299
  });
372
300
  }
373
-
374
301
  _lockAndReadJSON(name, cb) {
375
302
  const fileName = this._getStorage(name);
376
-
377
303
  (0, _fileLocking.readFile)(fileName, {
378
304
  lock: true,
379
305
  parse: true
@@ -382,17 +308,13 @@ class LocalFS {
382
308
  debug('error on lock and read json for file: %o', name);
383
309
  return cb(err);
384
310
  }
385
-
386
311
  debug('lock and read json for file: %o', name);
387
312
  return cb(null, res);
388
313
  });
389
314
  }
390
-
391
315
  _unlockJSON(name, cb) {
392
316
  (0, _fileLocking.unlockFile)(this._getStorage(name), cb);
393
317
  }
394
-
395
318
  }
396
-
397
319
  exports.default = LocalFS;
398
320
  //# sourceMappingURL=local-fs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-fs.js","names":["fileExist","noSuchFile","resourceNotAvailable","pkgFileName","debug","buildDebug","fSError","message","code","err","getCode","tempFile","str","String","Math","random","substr","renameTmp","src","dst","_cb","cb","fs","unlink","process","platform","rename","tmp","LocalFS","constructor","path","logger","updatePackage","name","updateHandler","onWrite","transformPackage","onEnd","_lockAndReadJSON","json","locked","self","unLockCallback","lockError","_args","arguments","_unlockJSON","apply","_","isNil","getInternalError","getNotFound","deletePackage","packageName","callback","_getStorage","removePackage","rmdir","createPackage","value","_createFile","_convertToString","savePackage","_writeFile","readPackage","_readStorageFile","then","res","data","JSON","parse","toString","writeTarball","uploadStream","UploadTarball","_ended","on","pathName","access","fileNotFound","exists","emit","temporalName","join","replace","file","createWriteStream","removeTempFile","opened","pipe","done","onend","end","abort","readTarball","readTarballStream","ReadTarball","readStream","createReadStream","fd","fstat","stats","size","close","contents","open","Promise","resolve","reject","readFile","stringify","fileName","storagePath","dest","createTempFile","tempFilePath","writeFile","mkdirp","dirname","catch","lock","unlockFile"],"sources":["../src/local-fs.ts"],"sourcesContent":["/* eslint-disable no-undef */\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport mkdirp from 'mkdirp';\nimport { UploadTarball, ReadTarball } from '@verdaccio/streams';\nimport { unlockFile, readFile } from '@verdaccio/file-locking';\nimport { Callback, Logger, Package, ILocalPackageManager, IUploadTarball } from '@verdaccio/types';\nimport { getCode, getInternalError, getNotFound, VerdaccioError } from '@verdaccio/commons-api';\n\nexport const fileExist = 'EEXISTS';\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport const pkgFileName = 'package.json';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:fs');\n\nexport const fSError = function(message: string, code = 409): VerdaccioError {\n const err: VerdaccioError = getCode(code, message);\n // FIXME: we should return http-status codes here instead, future improvement\n // @ts-ignore\n err.code = message;\n\n return err;\n};\n\nconst tempFile = function(str): string {\n return `${str}.tmp${String(Math.random()).substr(2)}`;\n};\n\nconst renameTmp = function(src, dst, _cb): void {\n const cb = (err): void => {\n if (err) {\n fs.unlink(src, () => {});\n }\n _cb(err);\n };\n\n if (process.platform !== 'win32') {\n return fs.rename(src, dst, cb);\n }\n\n // windows can't remove opened file,\n // but it seem to be able to rename it\n const tmp = tempFile(dst);\n fs.rename(dst, tmp, function(err) {\n fs.rename(src, dst, cb);\n if (!err) {\n fs.unlink(tmp, () => {});\n }\n });\n};\n\nexport type ILocalFSPackageManager = ILocalPackageManager & { path: string };\n\nexport default class LocalFS implements ILocalFSPackageManager {\n public path: string;\n public logger: Logger;\n\n public constructor(path: string, logger: Logger) {\n this.path = path;\n this.logger = logger;\n }\n\n /**\n * This function allows to update the package thread-safely\n Algorithm:\n 1. lock package.json for writing\n 2. read package.json\n 3. updateFn(pkg, cb), and wait for cb\n 4. write package.json.tmp\n 5. move package.json.tmp package.json\n 6. callback(err?)\n * @param {*} name\n * @param {*} updateHandler\n * @param {*} onWrite\n * @param {*} transformPackage\n * @param {*} onEnd\n */\n public updatePackage(\n name: string,\n updateHandler: Callback,\n onWrite: Callback,\n transformPackage: Function,\n onEnd: Callback\n ): void {\n this._lockAndReadJSON(pkgFileName, (err, json) => {\n let locked = false;\n const self = this;\n // callback that cleans up lock first\n const unLockCallback = function(lockError: Error): void {\n // eslint-disable-next-line prefer-rest-params\n const _args = arguments;\n\n if (locked) {\n self._unlockJSON(pkgFileName, () => {\n // ignore any error from the unlock\n if (lockError !== null) {\n debug('lock file: %o has failed with error %o', name, lockError);\n }\n\n onEnd.apply(lockError, _args);\n });\n } else {\n debug('file: %o has been updated', name);\n onEnd(..._args);\n }\n };\n\n if (!err) {\n locked = true;\n debug('file: %o has been locked', name);\n }\n\n if (_.isNil(err) === false) {\n if (err.code === resourceNotAvailable) {\n return unLockCallback(getInternalError('resource temporarily unavailable'));\n } else if (err.code === noSuchFile) {\n return unLockCallback(getNotFound());\n } else {\n return unLockCallback(err);\n }\n }\n\n updateHandler(json, err => {\n if (err) {\n return unLockCallback(err);\n }\n\n onWrite(name, transformPackage(json), unLockCallback);\n });\n });\n }\n\n public deletePackage(packageName: string, callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('delete a package %o', packageName);\n\n return fs.unlink(this._getStorage(packageName), callback);\n }\n\n public removePackage(callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('remove a package %o', this.path);\n\n fs.rmdir(this._getStorage('.'), callback);\n }\n\n public createPackage(name: string, value: Package, cb: Callback): void {\n debug('create a package %o', name);\n\n this._createFile(this._getStorage(pkgFileName), this._convertToString(value), cb);\n }\n\n public savePackage(name: string, value: Package, cb: Callback): void {\n debug('save a package %o', name);\n\n this._writeFile(this._getStorage(pkgFileName), this._convertToString(value), cb);\n }\n\n public readPackage(name: string, cb: Callback): void {\n debug('read a package %o', name);\n\n this._readStorageFile(this._getStorage(pkgFileName)).then(\n res => {\n try {\n const data: any = JSON.parse(res.toString('utf8'));\n\n debug('read storage file %o has succeed', name);\n cb(null, data);\n } catch (err) {\n debug('parse storage file %o has failed with error %o', name, err);\n cb(err);\n }\n },\n err => {\n debug('read storage file %o has failed with error %o', name, err);\n\n return cb(err);\n }\n );\n }\n\n public writeTarball(name: string): IUploadTarball {\n const uploadStream = new UploadTarball({});\n debug('write a tarball for a package %o', name);\n\n let _ended = 0;\n uploadStream.on('end', function() {\n _ended = 1;\n });\n\n const pathName: string = this._getStorage(name);\n\n fs.access(pathName, fileNotFound => {\n const exists = !fileNotFound;\n if (exists) {\n uploadStream.emit('error', fSError(fileExist));\n } else {\n const temporalName = path.join(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\\./, '')}`);\n debug('write a temporal name %o', temporalName);\n const file = fs.createWriteStream(temporalName);\n const removeTempFile = (): void => fs.unlink(temporalName, () => {});\n let opened = false;\n uploadStream.pipe(file);\n\n uploadStream.done = function(): void {\n const onend = function(): void {\n file.on('close', function() {\n renameTmp(temporalName, pathName, function(err) {\n if (err) {\n uploadStream.emit('error', err);\n } else {\n uploadStream.emit('success');\n }\n });\n });\n file.end();\n };\n if (_ended) {\n onend();\n } else {\n uploadStream.on('end', onend);\n }\n };\n\n uploadStream.abort = function(): void {\n if (opened) {\n opened = false;\n file.on('close', function() {\n removeTempFile();\n });\n } else {\n // if the file does not recieve any byte never is opened and has to be removed anyway.\n removeTempFile();\n }\n file.end();\n };\n\n file.on('open', function() {\n opened = true;\n // re-emitting open because it's handled in storage.js\n uploadStream.emit('open');\n });\n\n file.on('error', function(err) {\n uploadStream.emit('error', err);\n });\n }\n });\n\n return uploadStream;\n }\n\n public readTarball(name: string): ReadTarball {\n const pathName: string = this._getStorage(name);\n debug('read a a tarball %o on path %o', name, pathName);\n\n const readTarballStream = new ReadTarball({});\n\n const readStream = fs.createReadStream(pathName);\n\n readStream.on('error', function(err) {\n debug('error on read a tarball %o with error %o', name, err);\n readTarballStream.emit('error', err);\n });\n\n readStream.on('open', function(fd) {\n fs.fstat(fd, function(err, stats) {\n if (_.isNil(err) === false) {\n debug('error on read a tarball %o with error %o', name, err);\n return readTarballStream.emit('error', err);\n }\n readTarballStream.emit('content-length', stats.size);\n readTarballStream.emit('open');\n debug('open on read a tarball %o', name);\n readStream.pipe(readTarballStream);\n });\n });\n\n readTarballStream.abort = function(): void {\n debug('abort on read a tarball %o', name);\n readStream.close();\n };\n\n return readTarballStream;\n }\n\n private _createFile(name: string, contents: any, callback: Function): void {\n debug(' create a new file: %o', name);\n\n fs.open(name, 'wx', err => {\n if (err) {\n // native EEXIST used here to check exception on fs.open\n if (err.code === 'EEXIST') {\n debug('file %o cannot be created, it already exists: %o', name);\n return callback(fSError(fileExist));\n }\n }\n\n this._writeFile(name, contents, callback);\n });\n }\n\n private _readStorageFile(name: string): Promise<any> {\n return new Promise((resolve, reject): void => {\n debug('reading the file: %o', name);\n\n fs.readFile(name, (err, data) => {\n if (err) {\n debug('error reading the file: %o with error %o', name, err);\n reject(err);\n } else {\n debug('read file %o succeed', name);\n\n resolve(data);\n }\n });\n });\n }\n\n private _convertToString(value: Package): string {\n return JSON.stringify(value, null, '\\t');\n }\n\n private _getStorage(fileName = ''): string {\n const storagePath: string = path.join(this.path, fileName);\n\n return storagePath;\n }\n\n private _writeFile(dest: string, data: string, cb: Callback): void {\n const createTempFile = (cb): void => {\n const tempFilePath = tempFile(dest);\n\n fs.writeFile(tempFilePath, data, err => {\n if (err) {\n debug('error on write the file: %o', dest);\n return cb(err);\n }\n\n debug('creating a new file:: %o', dest);\n renameTmp(tempFilePath, dest, cb);\n });\n };\n\n createTempFile(err => {\n if (err && err.code === noSuchFile) {\n mkdirp(path.dirname(dest))\n .then(() => {\n createTempFile(cb);\n })\n .catch(err => {\n return cb(err);\n });\n } else {\n cb(err);\n }\n });\n }\n\n private _lockAndReadJSON(name: string, cb: Function): void {\n const fileName: string = this._getStorage(name);\n\n readFile(\n fileName,\n {\n lock: true,\n parse: true,\n },\n (err, res) => {\n if (err) {\n debug('error on lock and read json for file: %o', name);\n\n return cb(err);\n }\n debug('lock and read json for file: %o', name);\n\n return cb(null, res);\n }\n );\n }\n\n private _unlockJSON(name: string, cb: Function): void {\n unlockFile(this._getStorage(name), cb);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"local-fs.js","names":["_fs","_interopRequireDefault","require","_path","_debug","_lodash","_mkdirp","_streams","_fileLocking","_commonsApi","obj","__esModule","default","fileExist","exports","noSuchFile","resourceNotAvailable","pkgFileName","debug","buildDebug","fSError","message","code","err","getCode","tempFile","str","String","Math","random","substr","renameTmp","src","dst","_cb","cb","fs","unlink","process","platform","rename","tmp","LocalFS","constructor","path","logger","updatePackage","name","updateHandler","onWrite","transformPackage","onEnd","_lockAndReadJSON","json","locked","self","unLockCallback","lockError","_args","arguments","_unlockJSON","apply","_","isNil","getInternalError","getNotFound","deletePackage","packageName","callback","_getStorage","removePackage","rmdir","createPackage","value","_createFile","_convertToString","savePackage","_writeFile","readPackage","_readStorageFile","then","res","data","JSON","parse","toString","writeTarball","uploadStream","UploadTarball","_ended","on","pathName","access","fileNotFound","exists","emit","temporalName","join","replace","file","createWriteStream","removeTempFile","opened","pipe","done","onend","end","abort","readTarball","readTarballStream","ReadTarball","readStream","createReadStream","fd","fstat","stats","size","close","contents","open","Promise","resolve","reject","readFile","stringify","fileName","storagePath","dest","createTempFile","tempFilePath","writeFile","mkdirp","dirname","catch","lock","unlockFile"],"sources":["../src/local-fs.ts"],"sourcesContent":["/* eslint-disable no-undef */\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport mkdirp from 'mkdirp';\nimport { UploadTarball, ReadTarball } from '@verdaccio/streams';\nimport { unlockFile, readFile } from '@verdaccio/file-locking';\nimport { Callback, Logger, Package, ILocalPackageManager, IUploadTarball } from '@verdaccio/legacy-types';\nimport { getCode, getInternalError, getNotFound, VerdaccioError } from '@verdaccio/commons-api';\n\nexport const fileExist = 'EEXISTS';\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport const pkgFileName = 'package.json';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:fs');\n\nexport const fSError = function(message: string, code = 409): VerdaccioError {\n const err: VerdaccioError = getCode(code, message);\n // FIXME: we should return http-status codes here instead, future improvement\n // @ts-ignore\n err.code = message;\n\n return err;\n};\n\nconst tempFile = function(str): string {\n return `${str}.tmp${String(Math.random()).substr(2)}`;\n};\n\nconst renameTmp = function(src, dst, _cb): void {\n const cb = (err): void => {\n if (err) {\n fs.unlink(src, () => {});\n }\n _cb(err);\n };\n\n if (process.platform !== 'win32') {\n return fs.rename(src, dst, cb);\n }\n\n // windows can't remove opened file,\n // but it seem to be able to rename it\n const tmp = tempFile(dst);\n fs.rename(dst, tmp, function(err) {\n fs.rename(src, dst, cb);\n if (!err) {\n fs.unlink(tmp, () => {});\n }\n });\n};\n\nexport type ILocalFSPackageManager = ILocalPackageManager & { path: string };\n\nexport default class LocalFS implements ILocalFSPackageManager {\n public path: string;\n public logger: Logger;\n\n public constructor(path: string, logger: Logger) {\n this.path = path;\n this.logger = logger;\n }\n\n /**\n * This function allows to update the package thread-safely\n Algorithm:\n 1. lock package.json for writing\n 2. read package.json\n 3. updateFn(pkg, cb), and wait for cb\n 4. write package.json.tmp\n 5. move package.json.tmp package.json\n 6. callback(err?)\n * @param {*} name\n * @param {*} updateHandler\n * @param {*} onWrite\n * @param {*} transformPackage\n * @param {*} onEnd\n */\n public updatePackage(\n name: string,\n updateHandler: Callback,\n onWrite: Callback,\n transformPackage: Function,\n onEnd: Callback\n ): void {\n this._lockAndReadJSON(pkgFileName, (err, json) => {\n let locked = false;\n const self = this;\n // callback that cleans up lock first\n const unLockCallback = function(lockError: Error): void {\n // eslint-disable-next-line prefer-rest-params\n const _args = arguments;\n\n if (locked) {\n self._unlockJSON(pkgFileName, () => {\n // ignore any error from the unlock\n if (lockError !== null) {\n debug('lock file: %o has failed with error %o', name, lockError);\n }\n\n onEnd.apply(lockError, _args);\n });\n } else {\n debug('file: %o has been updated', name);\n onEnd(..._args);\n }\n };\n\n if (!err) {\n locked = true;\n debug('file: %o has been locked', name);\n }\n\n if (_.isNil(err) === false) {\n if (err.code === resourceNotAvailable) {\n return unLockCallback(getInternalError('resource temporarily unavailable'));\n } else if (err.code === noSuchFile) {\n return unLockCallback(getNotFound());\n } else {\n return unLockCallback(err);\n }\n }\n\n updateHandler(json, err => {\n if (err) {\n return unLockCallback(err);\n }\n\n onWrite(name, transformPackage(json), unLockCallback);\n });\n });\n }\n\n public deletePackage(packageName: string, callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('delete a package %o', packageName);\n\n return fs.unlink(this._getStorage(packageName), callback);\n }\n\n public removePackage(callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('remove a package %o', this.path);\n\n fs.rmdir(this._getStorage('.'), callback);\n }\n\n public createPackage(name: string, value: Package, cb: Callback): void {\n debug('create a package %o', name);\n\n this._createFile(this._getStorage(pkgFileName), this._convertToString(value), cb);\n }\n\n public savePackage(name: string, value: Package, cb: Callback): void {\n debug('save a package %o', name);\n\n this._writeFile(this._getStorage(pkgFileName), this._convertToString(value), cb);\n }\n\n public readPackage(name: string, cb: Callback): void {\n debug('read a package %o', name);\n\n this._readStorageFile(this._getStorage(pkgFileName)).then(\n res => {\n try {\n const data: any = JSON.parse(res.toString('utf8'));\n\n debug('read storage file %o has succeed', name);\n cb(null, data);\n } catch (err) {\n debug('parse storage file %o has failed with error %o', name, err);\n cb(err);\n }\n },\n err => {\n debug('read storage file %o has failed with error %o', name, err);\n\n return cb(err);\n }\n );\n }\n\n public writeTarball(name: string): IUploadTarball {\n const uploadStream = new UploadTarball({});\n debug('write a tarball for a package %o', name);\n\n let _ended = 0;\n uploadStream.on('end', function() {\n _ended = 1;\n });\n\n const pathName: string = this._getStorage(name);\n\n fs.access(pathName, fileNotFound => {\n const exists = !fileNotFound;\n if (exists) {\n uploadStream.emit('error', fSError(fileExist));\n } else {\n const temporalName = path.join(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\\./, '')}`);\n debug('write a temporal name %o', temporalName);\n const file = fs.createWriteStream(temporalName);\n const removeTempFile = (): void => fs.unlink(temporalName, () => {});\n let opened = false;\n uploadStream.pipe(file);\n\n uploadStream.done = function(): void {\n const onend = function(): void {\n file.on('close', function() {\n renameTmp(temporalName, pathName, function(err) {\n if (err) {\n uploadStream.emit('error', err);\n } else {\n uploadStream.emit('success');\n }\n });\n });\n file.end();\n };\n if (_ended) {\n onend();\n } else {\n uploadStream.on('end', onend);\n }\n };\n\n uploadStream.abort = function(): void {\n if (opened) {\n opened = false;\n file.on('close', function() {\n removeTempFile();\n });\n } else {\n // if the file does not recieve any byte never is opened and has to be removed anyway.\n removeTempFile();\n }\n file.end();\n };\n\n file.on('open', function() {\n opened = true;\n // re-emitting open because it's handled in storage.js\n uploadStream.emit('open');\n });\n\n file.on('error', function(err) {\n uploadStream.emit('error', err);\n });\n }\n });\n\n return uploadStream;\n }\n\n public readTarball(name: string): ReadTarball {\n const pathName: string = this._getStorage(name);\n debug('read a a tarball %o on path %o', name, pathName);\n\n const readTarballStream = new ReadTarball({});\n\n const readStream = fs.createReadStream(pathName);\n\n readStream.on('error', function(err) {\n debug('error on read a tarball %o with error %o', name, err);\n readTarballStream.emit('error', err);\n });\n\n readStream.on('open', function(fd) {\n fs.fstat(fd, function(err, stats) {\n if (_.isNil(err) === false) {\n debug('error on read a tarball %o with error %o', name, err);\n return readTarballStream.emit('error', err);\n }\n readTarballStream.emit('content-length', stats.size);\n readTarballStream.emit('open');\n debug('open on read a tarball %o', name);\n readStream.pipe(readTarballStream);\n });\n });\n\n readTarballStream.abort = function(): void {\n debug('abort on read a tarball %o', name);\n readStream.close();\n };\n\n return readTarballStream;\n }\n\n private _createFile(name: string, contents: any, callback: Function): void {\n debug(' create a new file: %o', name);\n\n fs.open(name, 'wx', err => {\n if (err) {\n // native EEXIST used here to check exception on fs.open\n if (err.code === 'EEXIST') {\n debug('file %o cannot be created, it already exists: %o', name);\n return callback(fSError(fileExist));\n }\n }\n\n this._writeFile(name, contents, callback);\n });\n }\n\n private _readStorageFile(name: string): Promise<any> {\n return new Promise((resolve, reject): void => {\n debug('reading the file: %o', name);\n\n fs.readFile(name, (err, data) => {\n if (err) {\n debug('error reading the file: %o with error %o', name, err);\n reject(err);\n } else {\n debug('read file %o succeed', name);\n\n resolve(data);\n }\n });\n });\n }\n\n private _convertToString(value: Package): string {\n return JSON.stringify(value, null, '\\t');\n }\n\n private _getStorage(fileName = ''): string {\n const storagePath: string = path.join(this.path, fileName);\n\n return storagePath;\n }\n\n private _writeFile(dest: string, data: string, cb: Callback): void {\n const createTempFile = (cb): void => {\n const tempFilePath = tempFile(dest);\n\n fs.writeFile(tempFilePath, data, err => {\n if (err) {\n debug('error on write the file: %o', dest);\n return cb(err);\n }\n\n debug('creating a new file:: %o', dest);\n renameTmp(tempFilePath, dest, cb);\n });\n };\n\n createTempFile(err => {\n if (err && err.code === noSuchFile) {\n mkdirp(path.dirname(dest))\n .then(() => {\n createTempFile(cb);\n })\n .catch(err => {\n return cb(err);\n });\n } else {\n cb(err);\n }\n });\n }\n\n private _lockAndReadJSON(name: string, cb: Function): void {\n const fileName: string = this._getStorage(name);\n\n readFile(\n fileName,\n {\n lock: true,\n parse: true,\n },\n (err, res) => {\n if (err) {\n debug('error on lock and read json for file: %o', name);\n\n return cb(err);\n }\n debug('lock and read json for file: %o', name);\n\n return cb(null, res);\n }\n );\n }\n\n private _unlockJSON(name: string, cb: Function): void {\n unlockFile(this._getStorage(name), cb);\n }\n}\n"],"mappings":"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"}
package/lib/pkg-utils.js CHANGED
@@ -4,44 +4,35 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.loadPrivatePackages = loadPrivatePackages;
7
-
8
7
  var _fs = _interopRequireDefault(require("fs"));
9
-
10
8
  var _lodash = _interopRequireDefault(require("lodash"));
11
-
12
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
10
  function loadPrivatePackages(path, logger) {
15
11
  const list = [];
16
12
  const emptyDatabase = {
17
13
  list,
18
14
  secret: ''
19
15
  };
20
-
21
16
  const data = _fs.default.readFileSync(path, 'utf8');
22
-
23
17
  if (_lodash.default.isNil(data)) {
24
18
  // readFileSync is platform specific, FreeBSD might return null
25
19
  return emptyDatabase;
26
20
  }
27
-
28
21
  let db;
29
-
30
22
  try {
31
23
  db = JSON.parse(data);
32
24
  } catch (err) {
33
25
  logger.error({
34
26
  err: err.mesage,
35
27
  path
36
- }, // eslint-disable-next-line max-len
28
+ },
29
+ // eslint-disable-next-line max-len
37
30
  `Package database file corrupted (invalid JSON), please check the error @{err}.\nFile Path: @{path}`);
38
31
  throw Error('Package database file corrupted (invalid JSON)');
39
32
  }
40
-
41
33
  if (_lodash.default.isEmpty(db)) {
42
34
  return emptyDatabase;
43
35
  }
44
-
45
36
  return db;
46
37
  }
47
38
  //# sourceMappingURL=pkg-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pkg-utils.js","names":["loadPrivatePackages","path","logger","list","emptyDatabase","secret","data","fs","readFileSync","_","isNil","db","JSON","parse","err","error","mesage","Error","isEmpty"],"sources":["../src/pkg-utils.ts"],"sourcesContent":["import fs from 'fs';\n\nimport _ from 'lodash';\nimport { LocalStorage, StorageList, Logger } from '@verdaccio/types';\n\nexport function loadPrivatePackages(path: string, logger: Logger): LocalStorage {\n const list: StorageList = [];\n const emptyDatabase = { list, secret: '' };\n const data = fs.readFileSync(path, 'utf8');\n\n if (_.isNil(data)) {\n // readFileSync is platform specific, FreeBSD might return null\n return emptyDatabase;\n }\n\n let db;\n try {\n db = JSON.parse(data);\n } catch (err: any) {\n logger.error(\n {\n err: err.mesage,\n path,\n }, // eslint-disable-next-line max-len\n `Package database file corrupted (invalid JSON), please check the error @{err}.\\nFile Path: @{path}`\n );\n throw Error('Package database file corrupted (invalid JSON)');\n }\n\n if (_.isEmpty(db)) {\n return emptyDatabase;\n }\n\n return db;\n}\n"],"mappings":";;;;;;;AAAA;;AAEA;;;;AAGO,SAASA,mBAAT,CAA6BC,IAA7B,EAA2CC,MAA3C,EAAyE;EAC9E,MAAMC,IAAiB,GAAG,EAA1B;EACA,MAAMC,aAAa,GAAG;IAAED,IAAF;IAAQE,MAAM,EAAE;EAAhB,CAAtB;;EACA,MAAMC,IAAI,GAAGC,WAAA,CAAGC,YAAH,CAAgBP,IAAhB,EAAsB,MAAtB,CAAb;;EAEA,IAAIQ,eAAA,CAAEC,KAAF,CAAQJ,IAAR,CAAJ,EAAmB;IACjB;IACA,OAAOF,aAAP;EACD;;EAED,IAAIO,EAAJ;;EACA,IAAI;IACFA,EAAE,GAAGC,IAAI,CAACC,KAAL,CAAWP,IAAX,CAAL;EACD,CAFD,CAEE,OAAOQ,GAAP,EAAiB;IACjBZ,MAAM,CAACa,KAAP,CACE;MACED,GAAG,EAAEA,GAAG,CAACE,MADX;MAEEf;IAFF,CADF,EAIK;IACF,oGALH;IAOA,MAAMgB,KAAK,CAAC,gDAAD,CAAX;EACD;;EAED,IAAIR,eAAA,CAAES,OAAF,CAAUP,EAAV,CAAJ,EAAmB;IACjB,OAAOP,aAAP;EACD;;EAED,OAAOO,EAAP;AACD"}
1
+ {"version":3,"file":"pkg-utils.js","names":["_fs","_interopRequireDefault","require","_lodash","obj","__esModule","default","loadPrivatePackages","path","logger","list","emptyDatabase","secret","data","fs","readFileSync","_","isNil","db","JSON","parse","err","error","mesage","Error","isEmpty"],"sources":["../src/pkg-utils.ts"],"sourcesContent":["import fs from 'fs';\n\nimport _ from 'lodash';\nimport { LocalStorage, StorageList, Logger } from '@verdaccio/legacy-types';\n\nexport function loadPrivatePackages(path: string, logger: Logger): LocalStorage {\n const list: StorageList = [];\n const emptyDatabase = { list, secret: '' };\n const data = fs.readFileSync(path, 'utf8');\n\n if (_.isNil(data)) {\n // readFileSync is platform specific, FreeBSD might return null\n return emptyDatabase;\n }\n\n let db;\n try {\n db = JSON.parse(data);\n } catch (err: any) {\n logger.error(\n {\n err: err.mesage,\n path,\n }, // eslint-disable-next-line max-len\n `Package database file corrupted (invalid JSON), please check the error @{err}.\\nFile Path: @{path}`\n );\n throw Error('Package database file corrupted (invalid JSON)');\n }\n\n if (_.isEmpty(db)) {\n return emptyDatabase;\n }\n\n return db;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAuB,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAGhB,SAASG,mBAAmBA,CAACC,IAAY,EAAEC,MAAc,EAAgB;EAC9E,MAAMC,IAAiB,GAAG,EAAE;EAC5B,MAAMC,aAAa,GAAG;IAAED,IAAI;IAAEE,MAAM,EAAE;EAAG,CAAC;EAC1C,MAAMC,IAAI,GAAGC,WAAE,CAACC,YAAY,CAACP,IAAI,EAAE,MAAM,CAAC;EAE1C,IAAIQ,eAAC,CAACC,KAAK,CAACJ,IAAI,CAAC,EAAE;IACjB;IACA,OAAOF,aAAa;EACtB;EAEA,IAAIO,EAAE;EACN,IAAI;IACFA,EAAE,GAAGC,IAAI,CAACC,KAAK,CAACP,IAAI,CAAC;EACvB,CAAC,CAAC,OAAOQ,GAAQ,EAAE;IACjBZ,MAAM,CAACa,KAAK,CACV;MACED,GAAG,EAAEA,GAAG,CAACE,MAAM;MACff;IACF,CAAC;IAAE;IACF,oGAAmG,CACrG;IACD,MAAMgB,KAAK,CAAC,gDAAgD,CAAC;EAC/D;EAEA,IAAIR,eAAC,CAACS,OAAO,CAACP,EAAE,CAAC,EAAE;IACjB,OAAOP,aAAa;EACtB;EAEA,OAAOO,EAAE;AACX"}
package/lib/token.js CHANGED
@@ -4,91 +4,64 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _path = _interopRequireDefault(require("path"));
9
-
10
8
  var _lodash = _interopRequireDefault(require("lodash"));
11
-
12
9
  var _lowdb = _interopRequireDefault(require("lowdb"));
13
-
14
10
  var _FileAsync = _interopRequireDefault(require("lowdb/adapters/FileAsync"));
15
-
16
11
  var _Memory = _interopRequireDefault(require("lowdb/adapters/Memory"));
17
-
18
12
  var _debug = _interopRequireDefault(require("debug"));
19
-
20
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
22
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
23
-
24
14
  const debug = (0, _debug.default)('verdaccio:plugin:local-storage:token');
25
15
  const TOKEN_DB_NAME = '.token-db.json';
26
-
27
16
  class TokenActions {
28
17
  constructor(config) {
29
- _defineProperty(this, "config", void 0);
30
-
31
- _defineProperty(this, "tokenDb", void 0);
32
-
33
18
  this.config = config;
34
19
  this.tokenDb = null;
35
20
  }
36
-
37
21
  _dbGenPath(dbName, config) {
38
- return _path.default.join(_path.default.resolve(_path.default.dirname(config.config_path || ''), config.storage, dbName));
22
+ return _path.default.join(_path.default.resolve(_path.default.dirname(config.self_path || ''), config.storage, dbName));
39
23
  }
40
-
41
24
  async getTokenDb() {
42
25
  if (!this.tokenDb) {
43
26
  debug('token database is not defined');
44
27
  let adapter;
45
-
46
28
  if (process.env.NODE_ENV === 'test') {
47
29
  debug('token memory adapter');
48
30
  adapter = new _Memory.default('');
49
31
  } else {
50
32
  debug('token async adapter');
51
-
52
33
  const pathDb = this._dbGenPath(TOKEN_DB_NAME, this.config);
53
-
54
34
  adapter = new _FileAsync.default(pathDb);
55
35
  }
56
-
57
36
  debug('token bd generated');
58
37
  this.tokenDb = await (0, _lowdb.default)(adapter);
59
38
  }
60
-
61
39
  return this.tokenDb;
62
40
  }
63
-
64
41
  async saveToken(token) {
65
42
  debug('token key %o', token.key);
66
43
  const db = await this.getTokenDb();
67
44
  const userData = await db.get(token.user).value();
68
45
  debug('user data %o', userData);
69
-
70
46
  if (_lodash.default.isNil(userData)) {
71
47
  await db.set(token.user, [token]).write();
72
48
  debug('token user %o new database', token.user);
73
49
  } else {
74
50
  // types does not match with valid implementation
75
51
  // @ts-ignore
76
- await db.get(token.user) // @ts-ignore
52
+ await db.get(token.user)
53
+ // @ts-ignore
77
54
  .push(token).write();
78
55
  }
79
-
80
56
  debug('data %o', await db.getState());
81
57
  debug('token saved %o', token.user);
82
58
  }
83
-
84
59
  async deleteToken(user, tokenKey) {
85
60
  const db = await this.getTokenDb();
86
61
  const userTokens = await db.get(user).value();
87
-
88
62
  if (_lodash.default.isNil(userTokens)) {
89
63
  throw new Error('user not found');
90
64
  }
91
-
92
65
  debug('tokens %o - %o', userTokens, userTokens.length);
93
66
  const remainingTokens = userTokens.filter(({
94
67
  key
@@ -99,7 +72,6 @@ class TokenActions {
99
72
  await db.set(user, remainingTokens).write();
100
73
  debug('removed tokens key %o', tokenKey);
101
74
  }
102
-
103
75
  async readTokens(filter) {
104
76
  const {
105
77
  user
@@ -109,8 +81,6 @@ class TokenActions {
109
81
  const tokens = await db.get(user).value();
110
82
  return tokens || [];
111
83
  }
112
-
113
84
  }
114
-
115
85
  exports.default = TokenActions;
116
86
  //# sourceMappingURL=token.js.map