@verdaccio/proxy 6.0.0-6-next.16 → 6.0.0-6-next.19
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/CHANGELOG.md +61 -0
- package/build/up-storage.d.ts +1 -1
- package/build/up-storage.js +5 -7
- package/build/up-storage.js.map +1 -1
- package/package.json +13 -14
- package/src/up-storage.ts +8 -7
- package/test/conf/proxy1.yaml +1 -1
- package/test/proxy.search.spec.ts +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,66 @@
|
|
|
1
1
|
# @verdaccio/proxy
|
|
2
2
|
|
|
3
|
+
## 6.0.0-6-next.19
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 82cb0f2b: feat!: config.logs throw an error, logging config not longer accept array or logs property
|
|
8
|
+
|
|
9
|
+
### 💥 Breaking change
|
|
10
|
+
|
|
11
|
+
This is valid
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
log: { type: stdout, format: pretty, level: http }
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This is invalid
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
logs: { type: stdout, format: pretty, level: http }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
or
|
|
24
|
+
|
|
25
|
+
```yaml
|
|
26
|
+
logs:
|
|
27
|
+
- [{ type: stdout, format: pretty, level: http }]
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Minor Changes
|
|
31
|
+
|
|
32
|
+
- 5167bb52: feat: ui search support for remote, local and private packages
|
|
33
|
+
|
|
34
|
+
The command `npm search` search globally and return all matches, with this improvement the user interface
|
|
35
|
+
is powered with the same capabilities.
|
|
36
|
+
|
|
37
|
+
The UI also tag where is the origin the package with a tag, also provide the latest version and description of the package.
|
|
38
|
+
|
|
39
|
+
### Patch Changes
|
|
40
|
+
|
|
41
|
+
- Updated dependencies [82cb0f2b]
|
|
42
|
+
- Updated dependencies [5167bb52]
|
|
43
|
+
- @verdaccio/config@6.0.0-6-next.13
|
|
44
|
+
- @verdaccio/core@6.0.0-6-next.5
|
|
45
|
+
- @verdaccio/logger@6.0.0-6-next.11
|
|
46
|
+
- @verdaccio/local-storage@11.0.0-6-next.12
|
|
47
|
+
- @verdaccio/utils@6.0.0-6-next.11
|
|
48
|
+
- @verdaccio/streams@11.0.0-6-next.5
|
|
49
|
+
|
|
50
|
+
## 6.0.0-6-next.18
|
|
51
|
+
|
|
52
|
+
### Patch Changes
|
|
53
|
+
|
|
54
|
+
- Updated dependencies [b78f3525]
|
|
55
|
+
- @verdaccio/logger@6.0.0-6-next.10
|
|
56
|
+
|
|
57
|
+
## 6.0.0-6-next.17
|
|
58
|
+
|
|
59
|
+
### Patch Changes
|
|
60
|
+
|
|
61
|
+
- Updated dependencies [730b5d8c]
|
|
62
|
+
- @verdaccio/logger@6.0.0-6-next.9
|
|
63
|
+
|
|
3
64
|
## 6.0.0-6-next.16
|
|
4
65
|
|
|
5
66
|
### Patch Changes
|
package/build/up-storage.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import Stream from 'stream';
|
|
3
|
-
import { Headers } from 'undici
|
|
3
|
+
import { Headers } from 'undici';
|
|
4
4
|
import { URL } from 'url';
|
|
5
5
|
import { searchUtils } from '@verdaccio/core';
|
|
6
6
|
import { ReadTarball } from '@verdaccio/streams';
|
package/build/up-storage.js
CHANGED
|
@@ -15,7 +15,7 @@ var _request = _interopRequireDefault(require("request"));
|
|
|
15
15
|
|
|
16
16
|
var _stream = _interopRequireWildcard(require("stream"));
|
|
17
17
|
|
|
18
|
-
var
|
|
18
|
+
var _undici = require("undici");
|
|
19
19
|
|
|
20
20
|
var _url = require("url");
|
|
21
21
|
|
|
@@ -36,8 +36,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
36
36
|
/* global AbortController */
|
|
37
37
|
const LoggerApi = require('@verdaccio/logger');
|
|
38
38
|
|
|
39
|
-
const fetch = require('undici-fetch');
|
|
40
|
-
|
|
41
39
|
const debug = (0, _debug.default)('verdaccio:proxy');
|
|
42
40
|
|
|
43
41
|
const encode = function (thing) {
|
|
@@ -517,7 +515,7 @@ class ProxyStorage {
|
|
|
517
515
|
uri,
|
|
518
516
|
uplink: this.upname
|
|
519
517
|
}, 'search request to uplink @{uplink} - @{uri}');
|
|
520
|
-
|
|
518
|
+
response = await (0, _undici.fetch)(uri, {
|
|
521
519
|
method: 'GET',
|
|
522
520
|
// FUTURE: whitelist domains what we are sending not need it headers, security check
|
|
523
521
|
// headers: new Headers({
|
|
@@ -526,7 +524,6 @@ class ProxyStorage {
|
|
|
526
524
|
// }),
|
|
527
525
|
signal: abort === null || abort === void 0 ? void 0 : abort.signal
|
|
528
526
|
});
|
|
529
|
-
response = await fetch(request);
|
|
530
527
|
debug('response.status %o', response.status);
|
|
531
528
|
|
|
532
529
|
if (response.status >= _core.HTTP_STATUS.BAD_REQUEST) {
|
|
@@ -547,8 +544,9 @@ class ProxyStorage {
|
|
|
547
544
|
return streamSearch;
|
|
548
545
|
} catch (err) {
|
|
549
546
|
this.logger.error({
|
|
550
|
-
errorMessage: err === null || err === void 0 ? void 0 : err.message
|
|
551
|
-
|
|
547
|
+
errorMessage: err === null || err === void 0 ? void 0 : err.message,
|
|
548
|
+
name: this.upname
|
|
549
|
+
}, 'proxy uplink @{name} search error: @{errorMessage}');
|
|
552
550
|
throw err;
|
|
553
551
|
}
|
|
554
552
|
}
|
package/build/up-storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/up-storage.ts"],"names":["LoggerApi","require","fetch","debug","encode","thing","encodeURIComponent","replace","jsonContentType","HEADERS","JSON","contentTypeAccept","setConfig","config","key","def","_","isNil","ProxyStorage","constructor","mainConfig","failed_requests","userAgent","user_agent","ca","logger","child","sub","server_id","url","URL","_setupProxy","hostname","protocol","timeout","Number","warn","join","maxage","max_fails","fail_timeout","strict_ssl","Boolean","agent_options","keepAlive","maxSockets","maxFreeSockets","request","options","cb","json","_statusCheck","streamRead","Stream","Readable","process","nextTick","errorUtils","getInternalError","API_ERROR","UPLINK_OFFLINE","emit","_read","on","self","headers","_setHeaders","_addProxyHeaders","req","_overrideWithUpLinkConfLocaligHeaders","method","uri","uri_full","info","validatioUtils","isObject","stringify","requestCallback","err","res","body","error","responseLength","length","processBody","logActivity","message","statusCode","parse","toString","CHARACTER_ENCODING","UTF8","_err","isString","http","undefined","status","bytes","in","out","requestOptions","proxy","encoding","gzip","strictSSL","agentOptions","Object","assign","statusCalled","_verdaccio_aborted","do_log","isNull","accept","ACCEPT","acceptEncoding","ACCEPT_ENCODING","USER_AGENT","_setAuth","auth","AUTHORIZATION","token","_throwErrorAuth","tokenConf","token_env","env","isBoolean","NPM_TOKEN","constants","ERROR_CODE","token_required","type","TOKEN_BASIC","_setHeaderAuthorization","Error","_type","toLowerCase","TOKEN_BEARER","upperFirst","getRemoteMetadata","name","callback","etag","HTTP_STATUS","NOT_FOUND","getNotFound","NOT_PACKAGE_UPLINK","OK","MULTIPLE_CHOICES","BAD_STATUS_CODE","remoteStatus","fetchTarball","stream","ReadTarball","current_length","expected_length","abort","readStream","Accept","NOT_FILE_UPLINK","HEADER_TYPE","CONTENT_LENGTH","pipe","data","CONTENT_MISMATCH","search","response","fullURL","href","uplink","upname","Request","signal","BAD_REQUEST","streamSearch","PassThrough","objectMode","text","streamResponse","from","JSONStream","end","errorMessage","FORWARDED_FOR","connection","remoteAddress","alive","arguments","_ifRequestFailure","host","last_request_time","Date","now","Math","abs","mainconfig","isHTTPS","noProxyList","proxy_key","no_proxy","split","isArray","i","noProxyItem","lastIndexOf","rule"],"mappings":"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","sourcesContent":["/* global AbortController */\nimport JSONStream from 'JSONStream';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport request from 'request';\nimport Stream, { PassThrough, Readable } from 'stream';\nimport { Headers, Request } from 'undici-fetch';\nimport { URL } from 'url';\n\nimport {\n CHARACTER_ENCODING,\n HEADERS,\n HEADER_TYPE,\n HTTP_STATUS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n constants,\n errorUtils,\n searchUtils,\n validatioUtils,\n} from '@verdaccio/core';\nimport { ReadTarball } from '@verdaccio/streams';\nimport { Callback, Config, IReadTarball, Logger, UpLinkConf } from '@verdaccio/types';\nimport { buildToken } from '@verdaccio/utils';\n\nimport { parseInterval } from './proxy-utils';\n\nconst LoggerApi = require('@verdaccio/logger');\n\nconst fetch = require('undici-fetch');\nconst debug = buildDebug('verdaccio:proxy');\n\nconst encode = function (thing): string {\n return encodeURIComponent(thing).replace(/^%40/, '@');\n};\n\nconst jsonContentType = HEADERS.JSON;\nconst contentTypeAccept = `${jsonContentType};`;\n\n/**\n * Just a helper (`config[key] || default` doesn't work because of zeroes)\n */\nconst setConfig = (config, key, def): string => {\n return _.isNil(config[key]) === false ? config[key] : def;\n};\n\nexport type UpLinkConfLocal = UpLinkConf & {\n no_proxy?: string;\n};\n\nexport interface ProxyList {\n [key: string]: IProxy;\n}\n\nexport type ProxySearchParams = {\n headers?: Headers;\n url: string;\n query?: searchUtils.SearchQuery;\n abort: AbortController;\n};\nexport interface IProxy {\n config: UpLinkConfLocal;\n failed_requests: number;\n userAgent: string;\n ca?: string | void;\n logger: Logger;\n server_id: string;\n url: URL;\n maxage: number;\n timeout: number;\n max_fails: number;\n fail_timeout: number;\n upname: string;\n fetchTarball(url: string): IReadTarball;\n search(options: ProxySearchParams): Promise<Stream.Readable>;\n getRemoteMetadata(name: string, options: any, callback: Callback): void;\n}\n\n/**\n * Implements Storage interface\n * (same for storage.js, local-storage.js, up-storage.js)\n */\nclass ProxyStorage implements IProxy {\n public config: UpLinkConfLocal;\n public failed_requests: number;\n public userAgent: string;\n public ca: string | void;\n public logger: Logger;\n public server_id: string;\n public url: URL;\n public maxage: number;\n public timeout: number;\n public max_fails: number;\n public fail_timeout: number;\n public agent_options: any;\n // FIXME: upname is assigned to each instance\n // @ts-ignore\n public upname: string;\n // FIXME: proxy can be boolean or object, something smells here\n // @ts-ignore\n public proxy: any;\n // @ts-ignore\n public last_request_time: number | null;\n public strict_ssl: boolean;\n\n /**\n * Constructor\n * @param {*} config\n * @param {*} mainConfig\n */\n public constructor(config: UpLinkConfLocal, mainConfig: Config) {\n this.config = config;\n this.failed_requests = 0;\n this.userAgent = mainConfig.user_agent;\n this.ca = config.ca;\n this.logger = LoggerApi.logger.child({ sub: 'out' });\n this.server_id = mainConfig.server_id;\n\n this.url = new URL(this.config.url);\n this._setupProxy(this.url.hostname, config, mainConfig, this.url.protocol === 'https:');\n\n this.config.url = this.config.url.replace(/\\/$/, '');\n\n if (this.config.timeout && Number(this.config.timeout) >= 1000) {\n this.logger.warn(\n [\n 'Too big timeout value: ' + this.config.timeout,\n 'We changed time format to nginx-like one',\n '(see http://nginx.org/en/docs/syntax.html)',\n 'so please update your config accordingly',\n ].join('\\n')\n );\n }\n\n // a bunch of different configurable timers\n this.maxage = parseInterval(setConfig(this.config, 'maxage', '2m'));\n this.timeout = parseInterval(setConfig(this.config, 'timeout', '30s'));\n this.max_fails = Number(setConfig(this.config, 'max_fails', 2));\n this.fail_timeout = parseInterval(setConfig(this.config, 'fail_timeout', '5m'));\n this.strict_ssl = Boolean(setConfig(this.config, 'strict_ssl', true));\n this.agent_options = setConfig(this.config, 'agent_options', {\n keepAlive: true,\n maxSockets: 40,\n maxFreeSockets: 10,\n });\n }\n\n /**\n * Fetch an asset.\n * @param {*} options\n * @param {*} cb\n * @return {Request}\n */\n private request(options: any, cb?: Callback): Stream.Readable {\n let json;\n\n if (this._statusCheck() === false) {\n const streamRead = new Stream.Readable();\n\n process.nextTick(function (): void {\n if (cb) {\n cb(errorUtils.getInternalError(errorUtils.API_ERROR.UPLINK_OFFLINE));\n }\n streamRead.emit('error', errorUtils.getInternalError(errorUtils.API_ERROR.UPLINK_OFFLINE));\n });\n streamRead._read = function (): void {};\n // preventing 'Uncaught, unspecified \"error\" event'\n streamRead.on('error', function (): void {});\n return streamRead;\n }\n\n const self = this;\n const headers: Headers = this._setHeaders(options);\n\n this._addProxyHeaders(options.req, headers);\n this._overrideWithUpLinkConfLocaligHeaders(headers);\n\n const method = options.method || 'GET';\n const uri = options.uri_full || this.config.url + options.uri;\n\n self.logger.info(\n {\n method: method,\n headers: headers,\n uri: uri,\n },\n \"making request: '@{method} @{uri}'\"\n );\n\n if (validatioUtils.isObject(options.json)) {\n json = JSON.stringify(options.json);\n headers['Content-Type'] = headers['Content-Type'] || HEADERS.JSON;\n }\n\n const requestCallback = cb\n ? function (err, res, body): void {\n let error;\n const responseLength = err ? 0 : body.length;\n // $FlowFixMe\n processBody();\n logActivity();\n // $FlowFixMe\n cb(err, res, body);\n\n /**\n * Perform a decode.\n */\n function processBody(): void {\n if (err) {\n error = err.message;\n return;\n }\n\n if (options.json && res.statusCode < 300) {\n try {\n // $FlowFixMe\n body = JSON.parse(body.toString(CHARACTER_ENCODING.UTF8));\n } catch (_err: any) {\n body = {};\n err = _err;\n error = err.message;\n }\n }\n\n if (!err && validatioUtils.isObject(body)) {\n if (_.isString(body.error)) {\n error = body.error;\n }\n }\n }\n /**\n * Perform a log.\n */\n function logActivity(): void {\n let message = \"@{!status}, req: '@{request.method} @{request.url}'\";\n // FIXME: use LOG_VERDACCIO_BYTES\n message += error ? ', error: @{!error}' : ', bytes: @{bytes.in}/@{bytes.out}';\n self.logger.http(\n {\n // if error is null/false change this to undefined so it wont log\n err: err || undefined,\n request: { method: method, url: uri },\n status: res != null ? res.statusCode : 'ERR',\n error: error,\n bytes: {\n in: json ? json.length : 0,\n out: responseLength || 0,\n },\n },\n message\n );\n }\n }\n : undefined;\n\n let requestOptions = {\n url: uri,\n method: method,\n headers: headers,\n body: json,\n proxy: this.proxy,\n encoding: null,\n gzip: true,\n timeout: this.timeout,\n strictSSL: this.strict_ssl,\n agentOptions: this.agent_options,\n };\n\n if (this.ca) {\n requestOptions = Object.assign({}, requestOptions, {\n ca: this.ca,\n });\n }\n\n const req = request(requestOptions, requestCallback);\n\n let statusCalled = false;\n req.on('response', function (res): void {\n // FIXME: _verdaccio_aborted seems not used\n // @ts-ignore\n if (!req._verdaccio_aborted && !statusCalled) {\n statusCalled = true;\n self._statusCheck(true);\n }\n\n if (_.isNil(requestCallback) === false) {\n (function do_log(): void {\n const message = \"@{!status}, req: '@{request.method} @{request.url}' (streaming)\";\n self.logger.http(\n {\n request: {\n method: method,\n url: uri,\n },\n status: _.isNull(res) === false ? res.statusCode : 'ERR',\n },\n message\n );\n })();\n }\n });\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n req.on('error', function (_err): void {\n // FIXME: _verdaccio_aborted seems not used\n // @ts-ignore\n if (!req._verdaccio_aborted && !statusCalled) {\n statusCalled = true;\n self._statusCheck(false);\n }\n });\n // @ts-ignore\n return req;\n }\n\n /**\n * Set default headers.\n * @param {Object} options\n * @return {Object}\n * @private\n */\n private _setHeaders(options: any): Headers {\n const headers = options.headers || {};\n const accept = HEADERS.ACCEPT;\n const acceptEncoding = HEADERS.ACCEPT_ENCODING;\n const userAgent = HEADERS.USER_AGENT;\n\n headers[accept] = headers[accept] || contentTypeAccept;\n headers[acceptEncoding] = headers[acceptEncoding] || 'gzip';\n // registry.npmjs.org will only return search result if user-agent include string 'npm'\n headers[userAgent] = headers[userAgent] || `npm (${this.userAgent})`;\n\n return this._setAuth(headers);\n }\n\n /**\n * Validate configuration auth and assign Header authorization\n * @param {Object} headers\n * @return {Object}\n * @private\n */\n private _setAuth(headers: any): Headers {\n const { auth } = this.config;\n\n if (_.isNil(auth) || headers[HEADERS.AUTHORIZATION]) {\n return headers;\n }\n\n if (_.isObject(auth) === false && _.isObject(auth.token) === false) {\n this._throwErrorAuth('Auth invalid');\n }\n\n // get NPM_TOKEN http://blog.npmjs.org/post/118393368555/deploying-with-npm-private-modules\n // or get other variable export in env\n // https://github.com/verdaccio/verdaccio/releases/tag/v2.5.0\n let token: any;\n const tokenConf: any = auth;\n\n if (_.isNil(tokenConf.token) === false && _.isString(tokenConf.token)) {\n token = tokenConf.token;\n } else if (_.isNil(tokenConf.token_env) === false) {\n if (_.isString(tokenConf.token_env)) {\n token = process.env[tokenConf.token_env];\n } else if (_.isBoolean(tokenConf.token_env) && tokenConf.token_env) {\n token = process.env.NPM_TOKEN;\n } else {\n this.logger.error(constants.ERROR_CODE.token_required);\n this._throwErrorAuth(constants.ERROR_CODE.token_required);\n }\n } else {\n token = process.env.NPM_TOKEN;\n }\n\n if (_.isNil(token)) {\n this._throwErrorAuth(constants.ERROR_CODE.token_required);\n }\n\n // define type Auth allow basic and bearer\n const type = tokenConf.type || TOKEN_BASIC;\n this._setHeaderAuthorization(headers, type, token);\n\n return headers;\n }\n\n /**\n * @param {string} message\n * @throws {Error}\n * @private\n */\n private _throwErrorAuth(message: string): Error {\n this.logger.error(message);\n throw new Error(message);\n }\n\n /**\n * Assign Header authorization with type authentication\n * @param {Object} headers\n * @param {string} type\n * @param {string} token\n * @private\n */\n private _setHeaderAuthorization(headers: any, type: string, token: any): void {\n const _type: string = type.toLowerCase();\n\n if (_type !== TOKEN_BEARER.toLowerCase() && _type !== TOKEN_BASIC.toLowerCase()) {\n this._throwErrorAuth(`Auth type '${_type}' not allowed`);\n }\n\n type = _.upperFirst(type);\n headers[HEADERS.AUTHORIZATION] = buildToken(type, token);\n }\n\n /**\n * It will add or override specified headers from config file.\n *\n * Eg:\n *\n * uplinks:\n npmjs:\n url: https://registry.npmjs.org/\n headers:\n Accept: \"application/vnd.npm.install-v2+json; q=1.0\"\n verdaccio-staging:\n url: https://mycompany.com/npm\n headers:\n Accept: \"application/json\"\n authorization: \"Basic YourBase64EncodedCredentials==\"\n\n * @param {Object} headers\n * @private\n */\n private _overrideWithUpLinkConfLocaligHeaders(headers: Headers): any {\n if (!this.config.headers) {\n return headers;\n }\n\n // add/override headers specified in the config\n /* eslint guard-for-in: 0 */\n for (const key in this.config.headers) {\n headers[key] = this.config.headers[key];\n }\n }\n\n /**\n * Get a remote package metadata\n * @param {*} name package name\n * @param {*} options request options, eg: eTag.\n * @param {*} callback\n */\n public getRemoteMetadata(name: string, options: any, callback: Callback): void {\n const headers = {};\n if (_.isNil(options.etag) === false) {\n headers['If-None-Match'] = options.etag;\n headers[HEADERS.ACCEPT] = contentTypeAccept;\n }\n\n this.request(\n {\n uri: `/${encode(name)}`,\n json: true,\n headers: headers,\n req: options.req,\n },\n (err, res, body): void => {\n if (err) {\n return callback(err);\n }\n if (res.statusCode === HTTP_STATUS.NOT_FOUND) {\n return callback(errorUtils.getNotFound(errorUtils.API_ERROR.NOT_PACKAGE_UPLINK));\n }\n if (!(res.statusCode >= HTTP_STATUS.OK && res.statusCode < HTTP_STATUS.MULTIPLE_CHOICES)) {\n const error = errorUtils.getInternalError(\n `${errorUtils.API_ERROR.BAD_STATUS_CODE}: ${res.statusCode}`\n );\n\n error.remoteStatus = res.statusCode;\n return callback(error);\n }\n callback(null, body, res.headers.etag);\n }\n );\n }\n\n /**\n * Fetch a tarball from the uplink.\n * @param {String} url\n * @return {Stream}\n */\n public fetchTarball(url: string) {\n const stream = new ReadTarball({});\n let current_length = 0;\n let expected_length;\n\n stream.abort = () => {};\n const readStream = this.request({\n uri_full: url,\n encoding: null,\n headers: {\n Accept: contentTypeAccept,\n },\n });\n\n readStream.on('response', function (res: any) {\n if (res.statusCode === HTTP_STATUS.NOT_FOUND) {\n return stream.emit('error', errorUtils.getNotFound(errorUtils.API_ERROR.NOT_FILE_UPLINK));\n }\n if (!(res.statusCode >= HTTP_STATUS.OK && res.statusCode < HTTP_STATUS.MULTIPLE_CHOICES)) {\n return stream.emit(\n 'error',\n errorUtils.getInternalError(`bad uplink status code: ${res.statusCode}`)\n );\n }\n if (res.headers[HEADER_TYPE.CONTENT_LENGTH]) {\n expected_length = res.headers[HEADER_TYPE.CONTENT_LENGTH];\n stream.emit(HEADER_TYPE.CONTENT_LENGTH, res.headers[HEADER_TYPE.CONTENT_LENGTH]);\n }\n\n readStream.pipe(stream);\n });\n\n readStream.on('error', function (err) {\n stream.emit('error', err);\n });\n readStream.on('data', function (data) {\n current_length += data.length;\n });\n readStream.on('end', function (data) {\n if (data) {\n current_length += data.length;\n }\n if (expected_length && current_length != expected_length) {\n stream.emit('error', errorUtils.getInternalError(errorUtils.API_ERROR.CONTENT_MISMATCH));\n }\n });\n return stream;\n }\n\n /**\n * Perform a stream search.\n * @param {*} options request options\n * @return {Stream}\n */\n public async search({ url, abort }: ProxySearchParams): Promise<Stream.Readable> {\n debug('search url %o', url);\n\n let response;\n try {\n const fullURL = new URL(`${this.url}${url}`);\n // FIXME: a better way to remove duplicate slashes?\n const uri = fullURL.href.replace(/([^:]\\/)\\/+/g, '$1');\n this.logger.http({ uri, uplink: this.upname }, 'search request to uplink @{uplink} - @{uri}');\n const request = new Request(uri, {\n method: 'GET',\n // FUTURE: whitelist domains what we are sending not need it headers, security check\n // headers: new Headers({\n // ...headers,\n // connection: 'keep-alive',\n // }),\n signal: abort?.signal,\n });\n response = await fetch(request);\n debug('response.status %o', response.status);\n\n if (response.status >= HTTP_STATUS.BAD_REQUEST) {\n throw errorUtils.getInternalError(`bad status code ${response.status} from uplink`);\n }\n\n const streamSearch = new PassThrough({ objectMode: true });\n const res = await response.text();\n const streamResponse = Readable.from(res);\n // objects is one of the properties on the body, it ignores date and total\n streamResponse.pipe(JSONStream.parse('objects')).pipe(streamSearch, { end: true });\n return streamSearch;\n } catch (err: any) {\n this.logger.error({ errorMessage: err?.message }, 'proxy search error: @{errorMessage}');\n throw err;\n }\n }\n\n /**\n * Add proxy headers.\n * FIXME: object mutations, it should return an new object\n * @param {*} req the http request\n * @param {*} headers the request headers\n */\n private _addProxyHeaders(req: any, headers: any): void {\n if (req) {\n // Only submit X-Forwarded-For field if we don't have a proxy selected\n // in the config file.\n //\n // Otherwise misconfigured proxy could return 407:\n // https://github.com/rlidwka/sinopia/issues/254\n // @ts-ignore\n if (!this.proxy) {\n headers[HEADERS.FORWARDED_FOR] =\n (req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] + ', ' : '') +\n req.connection.remoteAddress;\n }\n }\n\n // always attach Via header to avoid loops, even if we're not proxying\n headers['Via'] = req?.headers['via'] ? req.headers['via'] + ', ' : '';\n\n headers['Via'] += '1.1 ' + this.server_id + ' (Verdaccio)';\n }\n\n /**\n * Check whether the remote host is available.\n * @param {*} alive\n * @return {Boolean}\n */\n private _statusCheck(alive?: boolean): boolean | void {\n if (arguments.length === 0) {\n return this._ifRequestFailure() === false;\n }\n if (alive) {\n if (this.failed_requests >= this.max_fails) {\n this.logger.warn(\n {\n host: this.url.host,\n },\n 'host @{host} is back online'\n );\n }\n this.failed_requests = 0;\n } else {\n this.failed_requests++;\n if (this.failed_requests === this.max_fails) {\n this.logger.warn(\n {\n host: this.url.host,\n },\n 'host @{host} is now offline'\n );\n }\n }\n\n this.last_request_time = Date.now();\n }\n\n /**\n * If the request failure.\n * @return {boolean}\n * @private\n */\n private _ifRequestFailure(): boolean {\n return (\n this.failed_requests >= this.max_fails &&\n Math.abs(Date.now() - (this.last_request_time as number)) < this.fail_timeout\n );\n }\n\n /**\n * Set up a proxy.\n * @param {*} hostname\n * @param {*} config\n * @param {*} mainconfig\n * @param {*} isHTTPS\n */\n private _setupProxy(\n hostname: string,\n config: UpLinkConfLocal,\n mainconfig: Config,\n isHTTPS: boolean\n ): void {\n let noProxyList;\n const proxy_key: string = isHTTPS ? 'https_proxy' : 'http_proxy';\n\n // get http_proxy and no_proxy configs\n if (proxy_key in config) {\n this.proxy = config[proxy_key];\n } else if (proxy_key in mainconfig) {\n this.proxy = mainconfig[proxy_key];\n }\n if ('no_proxy' in config) {\n noProxyList = config.no_proxy;\n } else if ('no_proxy' in mainconfig) {\n noProxyList = mainconfig.no_proxy;\n }\n\n // use wget-like algorithm to determine if proxy shouldn't be used\n if (hostname[0] !== '.') {\n hostname = '.' + hostname;\n }\n\n if (_.isString(noProxyList) && noProxyList.length) {\n noProxyList = noProxyList.split(',');\n }\n\n if (_.isArray(noProxyList)) {\n for (let i = 0; i < noProxyList.length; i++) {\n let noProxyItem = noProxyList[i];\n if (noProxyItem[0] !== '.') {\n noProxyItem = '.' + noProxyItem;\n }\n if (hostname.lastIndexOf(noProxyItem) === hostname.length - noProxyItem.length) {\n if (this.proxy) {\n this.logger.debug(\n { url: this.url.href, rule: noProxyItem },\n 'not using proxy for @{url}, excluded by @{rule} rule'\n );\n // @ts-ignore\n this.proxy = false;\n }\n break;\n }\n }\n }\n\n // if it's non-string (i.e. \"false\"), don't use it\n if (_.isString(this.proxy) === false) {\n delete this.proxy;\n } else {\n this.logger.debug(\n { url: this.url.href, proxy: this.proxy },\n 'using proxy @{proxy} for @{url}'\n );\n }\n }\n}\n\nexport { ProxyStorage };\n"],"file":"up-storage.js"}
|
|
1
|
+
{"version":3,"sources":["../src/up-storage.ts"],"names":["LoggerApi","require","debug","encode","thing","encodeURIComponent","replace","jsonContentType","HEADERS","JSON","contentTypeAccept","setConfig","config","key","def","_","isNil","ProxyStorage","constructor","mainConfig","failed_requests","userAgent","user_agent","ca","logger","child","sub","server_id","url","URL","_setupProxy","hostname","protocol","timeout","Number","warn","join","maxage","max_fails","fail_timeout","strict_ssl","Boolean","agent_options","keepAlive","maxSockets","maxFreeSockets","request","options","cb","json","_statusCheck","streamRead","Stream","Readable","process","nextTick","errorUtils","getInternalError","API_ERROR","UPLINK_OFFLINE","emit","_read","on","self","headers","_setHeaders","_addProxyHeaders","req","_overrideWithUpLinkConfLocaligHeaders","method","uri","uri_full","info","validatioUtils","isObject","stringify","requestCallback","err","res","body","error","responseLength","length","processBody","logActivity","message","statusCode","parse","toString","CHARACTER_ENCODING","UTF8","_err","isString","http","undefined","status","bytes","in","out","requestOptions","proxy","encoding","gzip","strictSSL","agentOptions","Object","assign","statusCalled","_verdaccio_aborted","do_log","isNull","accept","ACCEPT","acceptEncoding","ACCEPT_ENCODING","USER_AGENT","_setAuth","auth","AUTHORIZATION","token","_throwErrorAuth","tokenConf","token_env","env","isBoolean","NPM_TOKEN","constants","ERROR_CODE","token_required","type","TOKEN_BASIC","_setHeaderAuthorization","Error","_type","toLowerCase","TOKEN_BEARER","upperFirst","getRemoteMetadata","name","callback","etag","HTTP_STATUS","NOT_FOUND","getNotFound","NOT_PACKAGE_UPLINK","OK","MULTIPLE_CHOICES","BAD_STATUS_CODE","remoteStatus","fetchTarball","stream","ReadTarball","current_length","expected_length","abort","readStream","Accept","NOT_FILE_UPLINK","HEADER_TYPE","CONTENT_LENGTH","pipe","data","CONTENT_MISMATCH","search","response","fullURL","href","uplink","upname","signal","BAD_REQUEST","streamSearch","PassThrough","objectMode","text","streamResponse","from","JSONStream","end","errorMessage","FORWARDED_FOR","connection","remoteAddress","alive","arguments","_ifRequestFailure","host","last_request_time","Date","now","Math","abs","mainconfig","isHTTPS","noProxyList","proxy_key","no_proxy","split","isArray","i","noProxyItem","lastIndexOf","rule"],"mappings":"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","sourcesContent":["/* global AbortController */\nimport JSONStream from 'JSONStream';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport requestDeprecated from 'request';\nimport Stream, { PassThrough, Readable } from 'stream';\nimport { Headers, fetch as undiciFetch } from 'undici';\nimport { URL } from 'url';\n\nimport {\n CHARACTER_ENCODING,\n HEADERS,\n HEADER_TYPE,\n HTTP_STATUS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n constants,\n errorUtils,\n searchUtils,\n validatioUtils,\n} from '@verdaccio/core';\nimport { ReadTarball } from '@verdaccio/streams';\nimport { Callback, Config, IReadTarball, Logger, UpLinkConf } from '@verdaccio/types';\nimport { buildToken } from '@verdaccio/utils';\n\nimport { parseInterval } from './proxy-utils';\n\nconst LoggerApi = require('@verdaccio/logger');\n\nconst debug = buildDebug('verdaccio:proxy');\n\nconst encode = function (thing): string {\n return encodeURIComponent(thing).replace(/^%40/, '@');\n};\n\nconst jsonContentType = HEADERS.JSON;\nconst contentTypeAccept = `${jsonContentType};`;\n\n/**\n * Just a helper (`config[key] || default` doesn't work because of zeroes)\n */\nconst setConfig = (config, key, def): string => {\n return _.isNil(config[key]) === false ? config[key] : def;\n};\n\nexport type UpLinkConfLocal = UpLinkConf & {\n no_proxy?: string;\n};\n\nexport interface ProxyList {\n [key: string]: IProxy;\n}\n\nexport type ProxySearchParams = {\n headers?: Headers;\n url: string;\n query?: searchUtils.SearchQuery;\n abort: AbortController;\n};\nexport interface IProxy {\n config: UpLinkConfLocal;\n failed_requests: number;\n userAgent: string;\n ca?: string | void;\n logger: Logger;\n server_id: string;\n url: URL;\n maxage: number;\n timeout: number;\n max_fails: number;\n fail_timeout: number;\n upname: string;\n fetchTarball(url: string): IReadTarball;\n search(options: ProxySearchParams): Promise<Stream.Readable>;\n getRemoteMetadata(name: string, options: any, callback: Callback): void;\n}\n\n/**\n * Implements Storage interface\n * (same for storage.js, local-storage.js, up-storage.js)\n */\nclass ProxyStorage implements IProxy {\n public config: UpLinkConfLocal;\n public failed_requests: number;\n public userAgent: string;\n public ca: string | void;\n public logger: Logger;\n public server_id: string;\n public url: URL;\n public maxage: number;\n public timeout: number;\n public max_fails: number;\n public fail_timeout: number;\n public agent_options: any;\n // FIXME: upname is assigned to each instance\n // @ts-ignore\n public upname: string;\n // FIXME: proxy can be boolean or object, something smells here\n // @ts-ignore\n public proxy: any;\n // @ts-ignore\n public last_request_time: number | null;\n public strict_ssl: boolean;\n\n /**\n * Constructor\n * @param {*} config\n * @param {*} mainConfig\n */\n public constructor(config: UpLinkConfLocal, mainConfig: Config) {\n this.config = config;\n this.failed_requests = 0;\n this.userAgent = mainConfig.user_agent;\n this.ca = config.ca;\n this.logger = LoggerApi.logger.child({ sub: 'out' });\n this.server_id = mainConfig.server_id;\n\n this.url = new URL(this.config.url);\n this._setupProxy(this.url.hostname, config, mainConfig, this.url.protocol === 'https:');\n\n this.config.url = this.config.url.replace(/\\/$/, '');\n\n if (this.config.timeout && Number(this.config.timeout) >= 1000) {\n this.logger.warn(\n [\n 'Too big timeout value: ' + this.config.timeout,\n 'We changed time format to nginx-like one',\n '(see http://nginx.org/en/docs/syntax.html)',\n 'so please update your config accordingly',\n ].join('\\n')\n );\n }\n\n // a bunch of different configurable timers\n this.maxage = parseInterval(setConfig(this.config, 'maxage', '2m'));\n this.timeout = parseInterval(setConfig(this.config, 'timeout', '30s'));\n this.max_fails = Number(setConfig(this.config, 'max_fails', 2));\n this.fail_timeout = parseInterval(setConfig(this.config, 'fail_timeout', '5m'));\n this.strict_ssl = Boolean(setConfig(this.config, 'strict_ssl', true));\n this.agent_options = setConfig(this.config, 'agent_options', {\n keepAlive: true,\n maxSockets: 40,\n maxFreeSockets: 10,\n });\n }\n\n /**\n * Fetch an asset.\n * @param {*} options\n * @param {*} cb\n * @return {Request}\n */\n private request(options: any, cb?: Callback): Stream.Readable {\n let json;\n\n if (this._statusCheck() === false) {\n const streamRead = new Stream.Readable();\n\n process.nextTick(function (): void {\n if (cb) {\n cb(errorUtils.getInternalError(errorUtils.API_ERROR.UPLINK_OFFLINE));\n }\n streamRead.emit('error', errorUtils.getInternalError(errorUtils.API_ERROR.UPLINK_OFFLINE));\n });\n streamRead._read = function (): void {};\n // preventing 'Uncaught, unspecified \"error\" event'\n streamRead.on('error', function (): void {});\n return streamRead;\n }\n\n const self = this;\n const headers: Headers = this._setHeaders(options);\n\n this._addProxyHeaders(options.req, headers);\n this._overrideWithUpLinkConfLocaligHeaders(headers);\n\n const method = options.method || 'GET';\n const uri = options.uri_full || this.config.url + options.uri;\n\n self.logger.info(\n {\n method: method,\n headers: headers,\n uri: uri,\n },\n \"making request: '@{method} @{uri}'\"\n );\n\n if (validatioUtils.isObject(options.json)) {\n json = JSON.stringify(options.json);\n headers['Content-Type'] = headers['Content-Type'] || HEADERS.JSON;\n }\n\n const requestCallback = cb\n ? function (err, res, body): void {\n let error;\n const responseLength = err ? 0 : body.length;\n // $FlowFixMe\n processBody();\n logActivity();\n // $FlowFixMe\n cb(err, res, body);\n\n /**\n * Perform a decode.\n */\n function processBody(): void {\n if (err) {\n error = err.message;\n return;\n }\n\n if (options.json && res.statusCode < 300) {\n try {\n // $FlowFixMe\n body = JSON.parse(body.toString(CHARACTER_ENCODING.UTF8));\n } catch (_err: any) {\n body = {};\n err = _err;\n error = err.message;\n }\n }\n\n if (!err && validatioUtils.isObject(body)) {\n if (_.isString(body.error)) {\n error = body.error;\n }\n }\n }\n /**\n * Perform a log.\n */\n function logActivity(): void {\n let message = \"@{!status}, req: '@{request.method} @{request.url}'\";\n // FIXME: use LOG_VERDACCIO_BYTES\n message += error ? ', error: @{!error}' : ', bytes: @{bytes.in}/@{bytes.out}';\n self.logger.http(\n {\n // if error is null/false change this to undefined so it wont log\n err: err || undefined,\n request: { method: method, url: uri },\n status: res != null ? res.statusCode : 'ERR',\n error: error,\n bytes: {\n in: json ? json.length : 0,\n out: responseLength || 0,\n },\n },\n message\n );\n }\n }\n : undefined;\n\n let requestOptions = {\n url: uri,\n method: method,\n headers: headers,\n body: json,\n proxy: this.proxy,\n encoding: null,\n gzip: true,\n timeout: this.timeout,\n strictSSL: this.strict_ssl,\n agentOptions: this.agent_options,\n };\n\n if (this.ca) {\n requestOptions = Object.assign({}, requestOptions, {\n ca: this.ca,\n });\n }\n\n const req = requestDeprecated(requestOptions, requestCallback);\n\n let statusCalled = false;\n req.on('response', function (res): void {\n // FIXME: _verdaccio_aborted seems not used\n // @ts-ignore\n if (!req._verdaccio_aborted && !statusCalled) {\n statusCalled = true;\n self._statusCheck(true);\n }\n\n if (_.isNil(requestCallback) === false) {\n (function do_log(): void {\n const message = \"@{!status}, req: '@{request.method} @{request.url}' (streaming)\";\n self.logger.http(\n {\n request: {\n method: method,\n url: uri,\n },\n status: _.isNull(res) === false ? res.statusCode : 'ERR',\n },\n message\n );\n })();\n }\n });\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n req.on('error', function (_err): void {\n // FIXME: _verdaccio_aborted seems not used\n // @ts-ignore\n if (!req._verdaccio_aborted && !statusCalled) {\n statusCalled = true;\n self._statusCheck(false);\n }\n });\n // @ts-ignore\n return req;\n }\n\n /**\n * Set default headers.\n * @param {Object} options\n * @return {Object}\n * @private\n */\n private _setHeaders(options: any): Headers {\n const headers = options.headers || {};\n const accept = HEADERS.ACCEPT;\n const acceptEncoding = HEADERS.ACCEPT_ENCODING;\n const userAgent = HEADERS.USER_AGENT;\n\n headers[accept] = headers[accept] || contentTypeAccept;\n headers[acceptEncoding] = headers[acceptEncoding] || 'gzip';\n // registry.npmjs.org will only return search result if user-agent include string 'npm'\n headers[userAgent] = headers[userAgent] || `npm (${this.userAgent})`;\n\n return this._setAuth(headers);\n }\n\n /**\n * Validate configuration auth and assign Header authorization\n * @param {Object} headers\n * @return {Object}\n * @private\n */\n private _setAuth(headers: any): Headers {\n const { auth } = this.config;\n\n if (_.isNil(auth) || headers[HEADERS.AUTHORIZATION]) {\n return headers;\n }\n\n if (_.isObject(auth) === false && _.isObject(auth.token) === false) {\n this._throwErrorAuth('Auth invalid');\n }\n\n // get NPM_TOKEN http://blog.npmjs.org/post/118393368555/deploying-with-npm-private-modules\n // or get other variable export in env\n // https://github.com/verdaccio/verdaccio/releases/tag/v2.5.0\n let token: any;\n const tokenConf: any = auth;\n\n if (_.isNil(tokenConf.token) === false && _.isString(tokenConf.token)) {\n token = tokenConf.token;\n } else if (_.isNil(tokenConf.token_env) === false) {\n if (_.isString(tokenConf.token_env)) {\n token = process.env[tokenConf.token_env];\n } else if (_.isBoolean(tokenConf.token_env) && tokenConf.token_env) {\n token = process.env.NPM_TOKEN;\n } else {\n this.logger.error(constants.ERROR_CODE.token_required);\n this._throwErrorAuth(constants.ERROR_CODE.token_required);\n }\n } else {\n token = process.env.NPM_TOKEN;\n }\n\n if (_.isNil(token)) {\n this._throwErrorAuth(constants.ERROR_CODE.token_required);\n }\n\n // define type Auth allow basic and bearer\n const type = tokenConf.type || TOKEN_BASIC;\n this._setHeaderAuthorization(headers, type, token);\n\n return headers;\n }\n\n /**\n * @param {string} message\n * @throws {Error}\n * @private\n */\n private _throwErrorAuth(message: string): Error {\n this.logger.error(message);\n throw new Error(message);\n }\n\n /**\n * Assign Header authorization with type authentication\n * @param {Object} headers\n * @param {string} type\n * @param {string} token\n * @private\n */\n private _setHeaderAuthorization(headers: any, type: string, token: any): void {\n const _type: string = type.toLowerCase();\n\n if (_type !== TOKEN_BEARER.toLowerCase() && _type !== TOKEN_BASIC.toLowerCase()) {\n this._throwErrorAuth(`Auth type '${_type}' not allowed`);\n }\n\n type = _.upperFirst(type);\n headers[HEADERS.AUTHORIZATION] = buildToken(type, token);\n }\n\n /**\n * It will add or override specified headers from config file.\n *\n * Eg:\n *\n * uplinks:\n npmjs:\n url: https://registry.npmjs.org/\n headers:\n Accept: \"application/vnd.npm.install-v2+json; q=1.0\"\n verdaccio-staging:\n url: https://mycompany.com/npm\n headers:\n Accept: \"application/json\"\n authorization: \"Basic YourBase64EncodedCredentials==\"\n\n * @param {Object} headers\n * @private\n */\n private _overrideWithUpLinkConfLocaligHeaders(headers: Headers): any {\n if (!this.config.headers) {\n return headers;\n }\n\n // add/override headers specified in the config\n /* eslint guard-for-in: 0 */\n for (const key in this.config.headers) {\n headers[key] = this.config.headers[key];\n }\n }\n\n /**\n * Get a remote package metadata\n * @param {*} name package name\n * @param {*} options request options, eg: eTag.\n * @param {*} callback\n */\n public getRemoteMetadata(name: string, options: any, callback: Callback): void {\n const headers = {};\n if (_.isNil(options.etag) === false) {\n headers['If-None-Match'] = options.etag;\n headers[HEADERS.ACCEPT] = contentTypeAccept;\n }\n\n this.request(\n {\n uri: `/${encode(name)}`,\n json: true,\n headers: headers,\n req: options.req,\n },\n (err, res, body): void => {\n if (err) {\n return callback(err);\n }\n if (res.statusCode === HTTP_STATUS.NOT_FOUND) {\n return callback(errorUtils.getNotFound(errorUtils.API_ERROR.NOT_PACKAGE_UPLINK));\n }\n if (!(res.statusCode >= HTTP_STATUS.OK && res.statusCode < HTTP_STATUS.MULTIPLE_CHOICES)) {\n const error = errorUtils.getInternalError(\n `${errorUtils.API_ERROR.BAD_STATUS_CODE}: ${res.statusCode}`\n );\n\n error.remoteStatus = res.statusCode;\n return callback(error);\n }\n callback(null, body, res.headers.etag);\n }\n );\n }\n\n /**\n * Fetch a tarball from the uplink.\n * @param {String} url\n * @return {Stream}\n */\n public fetchTarball(url: string) {\n const stream = new ReadTarball({});\n let current_length = 0;\n let expected_length;\n\n stream.abort = () => {};\n const readStream = this.request({\n uri_full: url,\n encoding: null,\n headers: {\n Accept: contentTypeAccept,\n },\n });\n\n readStream.on('response', function (res: any) {\n if (res.statusCode === HTTP_STATUS.NOT_FOUND) {\n return stream.emit('error', errorUtils.getNotFound(errorUtils.API_ERROR.NOT_FILE_UPLINK));\n }\n if (!(res.statusCode >= HTTP_STATUS.OK && res.statusCode < HTTP_STATUS.MULTIPLE_CHOICES)) {\n return stream.emit(\n 'error',\n errorUtils.getInternalError(`bad uplink status code: ${res.statusCode}`)\n );\n }\n if (res.headers[HEADER_TYPE.CONTENT_LENGTH]) {\n expected_length = res.headers[HEADER_TYPE.CONTENT_LENGTH];\n stream.emit(HEADER_TYPE.CONTENT_LENGTH, res.headers[HEADER_TYPE.CONTENT_LENGTH]);\n }\n\n readStream.pipe(stream);\n });\n\n readStream.on('error', function (err) {\n stream.emit('error', err);\n });\n readStream.on('data', function (data) {\n current_length += data.length;\n });\n readStream.on('end', function (data) {\n if (data) {\n current_length += data.length;\n }\n if (expected_length && current_length != expected_length) {\n stream.emit('error', errorUtils.getInternalError(errorUtils.API_ERROR.CONTENT_MISMATCH));\n }\n });\n return stream;\n }\n\n /**\n * Perform a stream search.\n * @param {*} options request options\n * @return {Stream}\n */\n public async search({ url, abort }: ProxySearchParams): Promise<Stream.Readable> {\n debug('search url %o', url);\n\n let response;\n try {\n const fullURL = new URL(`${this.url}${url}`);\n // FIXME: a better way to remove duplicate slashes?\n const uri = fullURL.href.replace(/([^:]\\/)\\/+/g, '$1');\n this.logger.http({ uri, uplink: this.upname }, 'search request to uplink @{uplink} - @{uri}');\n response = await undiciFetch(uri, {\n method: 'GET',\n // FUTURE: whitelist domains what we are sending not need it headers, security check\n // headers: new Headers({\n // ...headers,\n // connection: 'keep-alive',\n // }),\n signal: abort?.signal,\n });\n debug('response.status %o', response.status);\n\n if (response.status >= HTTP_STATUS.BAD_REQUEST) {\n throw errorUtils.getInternalError(`bad status code ${response.status} from uplink`);\n }\n\n const streamSearch = new PassThrough({ objectMode: true });\n const res = await response.text();\n const streamResponse = Readable.from(res);\n // objects is one of the properties on the body, it ignores date and total\n streamResponse.pipe(JSONStream.parse('objects')).pipe(streamSearch, { end: true });\n return streamSearch;\n } catch (err: any) {\n this.logger.error(\n { errorMessage: err?.message, name: this.upname },\n 'proxy uplink @{name} search error: @{errorMessage}'\n );\n throw err;\n }\n }\n\n /**\n * Add proxy headers.\n * FIXME: object mutations, it should return an new object\n * @param {*} req the http request\n * @param {*} headers the request headers\n */\n private _addProxyHeaders(req: any, headers: any): void {\n if (req) {\n // Only submit X-Forwarded-For field if we don't have a proxy selected\n // in the config file.\n //\n // Otherwise misconfigured proxy could return 407:\n // https://github.com/rlidwka/sinopia/issues/254\n // @ts-ignore\n if (!this.proxy) {\n headers[HEADERS.FORWARDED_FOR] =\n (req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] + ', ' : '') +\n req.connection.remoteAddress;\n }\n }\n\n // always attach Via header to avoid loops, even if we're not proxying\n headers['Via'] = req?.headers['via'] ? req.headers['via'] + ', ' : '';\n\n headers['Via'] += '1.1 ' + this.server_id + ' (Verdaccio)';\n }\n\n /**\n * Check whether the remote host is available.\n * @param {*} alive\n * @return {Boolean}\n */\n private _statusCheck(alive?: boolean): boolean | void {\n if (arguments.length === 0) {\n return this._ifRequestFailure() === false;\n }\n if (alive) {\n if (this.failed_requests >= this.max_fails) {\n this.logger.warn(\n {\n host: this.url.host,\n },\n 'host @{host} is back online'\n );\n }\n this.failed_requests = 0;\n } else {\n this.failed_requests++;\n if (this.failed_requests === this.max_fails) {\n this.logger.warn(\n {\n host: this.url.host,\n },\n 'host @{host} is now offline'\n );\n }\n }\n\n this.last_request_time = Date.now();\n }\n\n /**\n * If the request failure.\n * @return {boolean}\n * @private\n */\n private _ifRequestFailure(): boolean {\n return (\n this.failed_requests >= this.max_fails &&\n Math.abs(Date.now() - (this.last_request_time as number)) < this.fail_timeout\n );\n }\n\n /**\n * Set up a proxy.\n * @param {*} hostname\n * @param {*} config\n * @param {*} mainconfig\n * @param {*} isHTTPS\n */\n private _setupProxy(\n hostname: string,\n config: UpLinkConfLocal,\n mainconfig: Config,\n isHTTPS: boolean\n ): void {\n let noProxyList;\n const proxy_key: string = isHTTPS ? 'https_proxy' : 'http_proxy';\n\n // get http_proxy and no_proxy configs\n if (proxy_key in config) {\n this.proxy = config[proxy_key];\n } else if (proxy_key in mainconfig) {\n this.proxy = mainconfig[proxy_key];\n }\n if ('no_proxy' in config) {\n noProxyList = config.no_proxy;\n } else if ('no_proxy' in mainconfig) {\n noProxyList = mainconfig.no_proxy;\n }\n\n // use wget-like algorithm to determine if proxy shouldn't be used\n if (hostname[0] !== '.') {\n hostname = '.' + hostname;\n }\n\n if (_.isString(noProxyList) && noProxyList.length) {\n noProxyList = noProxyList.split(',');\n }\n\n if (_.isArray(noProxyList)) {\n for (let i = 0; i < noProxyList.length; i++) {\n let noProxyItem = noProxyList[i];\n if (noProxyItem[0] !== '.') {\n noProxyItem = '.' + noProxyItem;\n }\n if (hostname.lastIndexOf(noProxyItem) === hostname.length - noProxyItem.length) {\n if (this.proxy) {\n this.logger.debug(\n { url: this.url.href, rule: noProxyItem },\n 'not using proxy for @{url}, excluded by @{rule} rule'\n );\n // @ts-ignore\n this.proxy = false;\n }\n break;\n }\n }\n }\n\n // if it's non-string (i.e. \"false\"), don't use it\n if (_.isString(this.proxy) === false) {\n delete this.proxy;\n } else {\n this.logger.debug(\n { url: this.url.href, proxy: this.proxy },\n 'using proxy @{proxy} for @{url}'\n );\n }\n }\n}\n\nexport { ProxyStorage };\n"],"file":"up-storage.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdaccio/proxy",
|
|
3
|
-
"version": "6.0.0-6-next.
|
|
3
|
+
"version": "6.0.0-6-next.19",
|
|
4
4
|
"description": "verdaccio proxy fetcher",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -30,27 +30,26 @@
|
|
|
30
30
|
"npm": ">=6"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@verdaccio/config": "6.0.0-6-next.
|
|
34
|
-
"@verdaccio/core": "6.0.0-6-next.
|
|
35
|
-
"@verdaccio/local-storage": "11.0.0-6-next.
|
|
36
|
-
"@verdaccio/logger": "6.0.0-6-next.
|
|
33
|
+
"@verdaccio/config": "6.0.0-6-next.13",
|
|
34
|
+
"@verdaccio/core": "6.0.0-6-next.5",
|
|
35
|
+
"@verdaccio/local-storage": "11.0.0-6-next.12",
|
|
36
|
+
"@verdaccio/logger": "6.0.0-6-next.11",
|
|
37
37
|
"@verdaccio/streams": "11.0.0-6-next.5",
|
|
38
|
-
"@verdaccio/utils": "6.0.0-6-next.
|
|
38
|
+
"@verdaccio/utils": "6.0.0-6-next.11",
|
|
39
39
|
"JSONStream": "1.3.5",
|
|
40
40
|
"abortcontroller-polyfill": "1.7.3",
|
|
41
41
|
"debug": "4.3.3",
|
|
42
42
|
"lodash": "4.17.21",
|
|
43
|
-
"node-fetch": "2.6.
|
|
44
|
-
"request": "2.
|
|
45
|
-
"undici": "4.
|
|
46
|
-
"undici-fetch": "1.0.0-rc.4"
|
|
43
|
+
"node-fetch": "2.6.7",
|
|
44
|
+
"request": "2.88.0",
|
|
45
|
+
"undici": "4.15.0"
|
|
47
46
|
},
|
|
48
47
|
"devDependencies": {
|
|
49
|
-
"@types/node": "16.11.
|
|
50
|
-
"@verdaccio/types": "11.0.0-6-next.
|
|
48
|
+
"@types/node": "16.11.21",
|
|
49
|
+
"@verdaccio/types": "11.0.0-6-next.11",
|
|
51
50
|
"get-stream": "^6.0.1",
|
|
52
|
-
"nock": "13.
|
|
53
|
-
"node-mocks-http": "1.
|
|
51
|
+
"nock": "13.2.2",
|
|
52
|
+
"node-mocks-http": "1.11.0",
|
|
54
53
|
"semver": "7.3.5"
|
|
55
54
|
},
|
|
56
55
|
"funding": {
|
package/src/up-storage.ts
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import JSONStream from 'JSONStream';
|
|
3
3
|
import buildDebug from 'debug';
|
|
4
4
|
import _ from 'lodash';
|
|
5
|
-
import
|
|
5
|
+
import requestDeprecated from 'request';
|
|
6
6
|
import Stream, { PassThrough, Readable } from 'stream';
|
|
7
|
-
import { Headers,
|
|
7
|
+
import { Headers, fetch as undiciFetch } from 'undici';
|
|
8
8
|
import { URL } from 'url';
|
|
9
9
|
|
|
10
10
|
import {
|
|
@@ -27,7 +27,6 @@ import { parseInterval } from './proxy-utils';
|
|
|
27
27
|
|
|
28
28
|
const LoggerApi = require('@verdaccio/logger');
|
|
29
29
|
|
|
30
|
-
const fetch = require('undici-fetch');
|
|
31
30
|
const debug = buildDebug('verdaccio:proxy');
|
|
32
31
|
|
|
33
32
|
const encode = function (thing): string {
|
|
@@ -272,7 +271,7 @@ class ProxyStorage implements IProxy {
|
|
|
272
271
|
});
|
|
273
272
|
}
|
|
274
273
|
|
|
275
|
-
const req =
|
|
274
|
+
const req = requestDeprecated(requestOptions, requestCallback);
|
|
276
275
|
|
|
277
276
|
let statusCalled = false;
|
|
278
277
|
req.on('response', function (res): void {
|
|
@@ -548,7 +547,7 @@ class ProxyStorage implements IProxy {
|
|
|
548
547
|
// FIXME: a better way to remove duplicate slashes?
|
|
549
548
|
const uri = fullURL.href.replace(/([^:]\/)\/+/g, '$1');
|
|
550
549
|
this.logger.http({ uri, uplink: this.upname }, 'search request to uplink @{uplink} - @{uri}');
|
|
551
|
-
|
|
550
|
+
response = await undiciFetch(uri, {
|
|
552
551
|
method: 'GET',
|
|
553
552
|
// FUTURE: whitelist domains what we are sending not need it headers, security check
|
|
554
553
|
// headers: new Headers({
|
|
@@ -557,7 +556,6 @@ class ProxyStorage implements IProxy {
|
|
|
557
556
|
// }),
|
|
558
557
|
signal: abort?.signal,
|
|
559
558
|
});
|
|
560
|
-
response = await fetch(request);
|
|
561
559
|
debug('response.status %o', response.status);
|
|
562
560
|
|
|
563
561
|
if (response.status >= HTTP_STATUS.BAD_REQUEST) {
|
|
@@ -571,7 +569,10 @@ class ProxyStorage implements IProxy {
|
|
|
571
569
|
streamResponse.pipe(JSONStream.parse('objects')).pipe(streamSearch, { end: true });
|
|
572
570
|
return streamSearch;
|
|
573
571
|
} catch (err: any) {
|
|
574
|
-
this.logger.error(
|
|
572
|
+
this.logger.error(
|
|
573
|
+
{ errorMessage: err?.message, name: this.upname },
|
|
574
|
+
'proxy uplink @{name} search error: @{errorMessage}'
|
|
575
|
+
);
|
|
575
576
|
throw err;
|
|
576
577
|
}
|
|
577
578
|
}
|
package/test/conf/proxy1.yaml
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import getStream from 'get-stream';
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import semver from 'semver';
|
|
7
|
+
import { MockAgent, setGlobalDispatcher } from 'undici';
|
|
7
8
|
|
|
8
9
|
import { Config, parseConfigFile } from '@verdaccio/config';
|
|
9
10
|
import { streamUtils } from '@verdaccio/core';
|
|
@@ -17,6 +18,7 @@ if (semver.lte(process.version, 'v15.0.0')) {
|
|
|
17
18
|
|
|
18
19
|
const getConf = (name) => path.join(__dirname, '/conf', name);
|
|
19
20
|
|
|
21
|
+
// TODO: we can mock this globally maybe
|
|
20
22
|
const mockDebug = jest.fn();
|
|
21
23
|
const mockInfo = jest.fn();
|
|
22
24
|
const mockHttp = jest.fn();
|
|
@@ -38,8 +40,6 @@ jest.mock('@verdaccio/logger', () => {
|
|
|
38
40
|
};
|
|
39
41
|
});
|
|
40
42
|
|
|
41
|
-
const { MockAgent } = require('undici');
|
|
42
|
-
const { setGlobalDispatcher } = require('undici-fetch');
|
|
43
43
|
const domain = 'https://registry.npmjs.org';
|
|
44
44
|
|
|
45
45
|
describe('proxy', () => {
|
|
@@ -56,7 +56,7 @@ describe('proxy', () => {
|
|
|
56
56
|
};
|
|
57
57
|
|
|
58
58
|
describe('search', () => {
|
|
59
|
-
test('get response from
|
|
59
|
+
test('get response from endpoint', async () => {
|
|
60
60
|
const response = require('./partials/search-v1.json');
|
|
61
61
|
const mockAgent = new MockAgent({ connections: 1 });
|
|
62
62
|
mockAgent.disableNetConnect();
|
|
@@ -90,13 +90,13 @@ describe('proxy', () => {
|
|
|
90
90
|
).rejects.toThrow('bad status code 409 from uplink');
|
|
91
91
|
});
|
|
92
92
|
|
|
93
|
-
test.todo('abort search from
|
|
93
|
+
test.todo('abort search from endpoint');
|
|
94
94
|
|
|
95
95
|
// TODO: we should test the gzip deflate here, but is hard to test
|
|
96
96
|
// fix me if you can deal with Incorrect Header Check issue
|
|
97
|
-
test.todo('get file from
|
|
97
|
+
test.todo('get file from endpoint with gzip headers');
|
|
98
98
|
|
|
99
|
-
test('search
|
|
99
|
+
test('search endpoint fails', async () => {
|
|
100
100
|
const mockAgent = new MockAgent({ connections: 1 });
|
|
101
101
|
mockAgent.disableNetConnect();
|
|
102
102
|
setGlobalDispatcher(mockAgent);
|