@verdaccio/proxy 6.0.0-6-next.52 → 6.0.0-6-next.54

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/.babelrc CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "extends": "../../.babelrc"
2
+ "extends": "../../.babelrc"
3
3
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @verdaccio/proxy
2
2
 
3
+ ## 6.0.0-6-next.54
4
+
5
+ ### Patch Changes
6
+
7
+ - e381e4845: fix: improve legacy nodejs support
8
+ - @verdaccio/core@6.0.0-6-next.76
9
+ - @verdaccio/config@6.0.0-6-next.76
10
+ - @verdaccio/utils@6.0.0-6-next.44
11
+
12
+ ## 6.0.0-6-next.53
13
+
14
+ ### Minor Changes
15
+
16
+ - 0a6412ca9: feat: refactor proxy with got v12
17
+
18
+ ### Patch Changes
19
+
20
+ - 0a6412ca9: refactor: got instead undici
21
+ - Updated dependencies [0a6412ca9]
22
+ - @verdaccio/core@6.0.0-6-next.75
23
+ - @verdaccio/config@6.0.0-6-next.75
24
+ - @verdaccio/utils@6.0.0-6-next.43
25
+
3
26
  ## 6.0.0-6-next.52
4
27
 
5
28
  ### Patch Changes
package/build/agent.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
- import { Agents } from 'got';
3
+ import { Agents } from 'got-cjs';
4
4
  import { AgentOptions as HttpAgentOptions } from 'http';
5
5
  import { AgentOptions as HttpsAgentOptions } from 'https';
6
6
  export type AgentOptionsConf = HttpAgentOptions | HttpsAgentOptions;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","names":["_hpagent","require","_http","_https","_url","CustomAgents","constructor","url","proxy","agentOptions","protocol","getParsedUrl","agent","getAgent","get","isHTTPS","options","https","HttpsProxyAgent","http","HttpProxyAgent","HttpsAgent","HttpAgent","URL","_default","exports","default"],"sources":["../src/agent.ts"],"sourcesContent":["import { Agents } from 'got';\nimport { HttpProxyAgent, HttpsProxyAgent } from 'hpagent';\nimport { Agent as HttpAgent, AgentOptions as HttpAgentOptions } from 'http';\nimport { Agent as HttpsAgent, AgentOptions as HttpsAgentOptions } from 'https';\nimport { URL } from 'url';\n\nexport type AgentOptionsConf = HttpAgentOptions | HttpsAgentOptions;\n\nclass CustomAgents {\n private url: string;\n private proxy: string | undefined;\n private agentOptions: HttpAgentOptions | HttpsAgentOptions;\n private agent: Agents;\n public constructor(\n url: string,\n proxy: string | undefined,\n agentOptions: HttpAgentOptions | HttpsAgentOptions\n ) {\n this.proxy = proxy;\n this.url = url;\n this.agentOptions = agentOptions;\n const { protocol } = this.getParsedUrl();\n this.agent = this.getAgent(protocol);\n }\n\n public get() {\n return this.agent;\n }\n\n private getAgent(protocol: string): Agents {\n const isHTTPS = protocol === 'https:';\n if (this.proxy) {\n const options = {\n proxy: this.proxy,\n ...this.agentOptions,\n };\n // use hpagent\n return isHTTPS\n ? { https: new HttpsProxyAgent(options) }\n : { http: new HttpProxyAgent(options) };\n } else {\n // use native http/https agent\n return isHTTPS\n ? { https: new HttpsAgent(this.agentOptions) }\n : { http: new HttpAgent(this.agentOptions) };\n }\n }\n\n private getParsedUrl() {\n return this.proxy ? new URL(this.proxy) : new URL(this.url);\n }\n}\n\nexport default CustomAgents;\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,IAAA,GAAAH,OAAA;AAIA,MAAMI,YAAY,CAAC;EAKVC,WAAWA,CAChBC,GAAW,EACXC,KAAyB,EACzBC,YAAkD,EAClD;IACA,IAAI,CAACD,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACD,GAAG,GAAGA,GAAG;IACd,IAAI,CAACE,YAAY,GAAGA,YAAY;IAChC,MAAM;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACC,YAAY,CAAC,CAAC;IACxC,IAAI,CAACC,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACH,QAAQ,CAAC;EACtC;EAEOI,GAAGA,CAAA,EAAG;IACX,OAAO,IAAI,CAACF,KAAK;EACnB;EAEQC,QAAQA,CAACH,QAAgB,EAAU;IACzC,MAAMK,OAAO,GAAGL,QAAQ,KAAK,QAAQ;IACrC,IAAI,IAAI,CAACF,KAAK,EAAE;MACd,MAAMQ,OAAO,GAAG;QACdR,KAAK,EAAE,IAAI,CAACA,KAAK;QACjB,GAAG,IAAI,CAACC;MACV,CAAC;MACD;MACA,OAAOM,OAAO,GACV;QAAEE,KAAK,EAAE,IAAIC,wBAAe,CAACF,OAAO;MAAE,CAAC,GACvC;QAAEG,IAAI,EAAE,IAAIC,uBAAc,CAACJ,OAAO;MAAE,CAAC;IAC3C,CAAC,MAAM;MACL;MACA,OAAOD,OAAO,GACV;QAAEE,KAAK,EAAE,IAAII,YAAU,CAAC,IAAI,CAACZ,YAAY;MAAE,CAAC,GAC5C;QAAEU,IAAI,EAAE,IAAIG,WAAS,CAAC,IAAI,CAACb,YAAY;MAAE,CAAC;IAChD;EACF;EAEQE,YAAYA,CAAA,EAAG;IACrB,OAAO,IAAI,CAACH,KAAK,GAAG,IAAIe,QAAG,CAAC,IAAI,CAACf,KAAK,CAAC,GAAG,IAAIe,QAAG,CAAC,IAAI,CAAChB,GAAG,CAAC;EAC7D;AACF;AAAC,IAAAiB,QAAA,GAEcnB,YAAY;AAAAoB,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
1
+ {"version":3,"file":"agent.js","names":["_hpagent","require","_http","_https","_url","CustomAgents","constructor","url","proxy","agentOptions","protocol","getParsedUrl","agent","getAgent","get","isHTTPS","options","https","HttpsProxyAgent","http","HttpProxyAgent","HttpsAgent","HttpAgent","URL","_default","exports","default"],"sources":["../src/agent.ts"],"sourcesContent":["import { Agents } from 'got-cjs';\nimport { HttpProxyAgent, HttpsProxyAgent } from 'hpagent';\nimport { Agent as HttpAgent, AgentOptions as HttpAgentOptions } from 'http';\nimport { Agent as HttpsAgent, AgentOptions as HttpsAgentOptions } from 'https';\nimport { URL } from 'url';\n\nexport type AgentOptionsConf = HttpAgentOptions | HttpsAgentOptions;\n\nclass CustomAgents {\n private url: string;\n private proxy: string | undefined;\n private agentOptions: HttpAgentOptions | HttpsAgentOptions;\n private agent: Agents;\n public constructor(\n url: string,\n proxy: string | undefined,\n agentOptions: HttpAgentOptions | HttpsAgentOptions\n ) {\n this.proxy = proxy;\n this.url = url;\n this.agentOptions = agentOptions;\n const { protocol } = this.getParsedUrl();\n this.agent = this.getAgent(protocol);\n }\n\n public get() {\n return this.agent;\n }\n\n private getAgent(protocol: string): Agents {\n const isHTTPS = protocol === 'https:';\n if (this.proxy) {\n const options = {\n proxy: this.proxy,\n ...this.agentOptions,\n };\n // use hpagent\n return isHTTPS\n ? { https: new HttpsProxyAgent(options) }\n : { http: new HttpProxyAgent(options) };\n } else {\n // use native http/https agent\n return isHTTPS\n ? { https: new HttpsAgent(this.agentOptions) }\n : { http: new HttpAgent(this.agentOptions) };\n }\n }\n\n private getParsedUrl() {\n return this.proxy ? new URL(this.proxy) : new URL(this.url);\n }\n}\n\nexport default CustomAgents;\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,IAAA,GAAAH,OAAA;AAIA,MAAMI,YAAY,CAAC;EAKVC,WAAWA,CAChBC,GAAW,EACXC,KAAyB,EACzBC,YAAkD,EAClD;IACA,IAAI,CAACD,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACD,GAAG,GAAGA,GAAG;IACd,IAAI,CAACE,YAAY,GAAGA,YAAY;IAChC,MAAM;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACC,YAAY,CAAC,CAAC;IACxC,IAAI,CAACC,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACH,QAAQ,CAAC;EACtC;EAEOI,GAAGA,CAAA,EAAG;IACX,OAAO,IAAI,CAACF,KAAK;EACnB;EAEQC,QAAQA,CAACH,QAAgB,EAAU;IACzC,MAAMK,OAAO,GAAGL,QAAQ,KAAK,QAAQ;IACrC,IAAI,IAAI,CAACF,KAAK,EAAE;MACd,MAAMQ,OAAO,GAAG;QACdR,KAAK,EAAE,IAAI,CAACA,KAAK;QACjB,GAAG,IAAI,CAACC;MACV,CAAC;MACD;MACA,OAAOM,OAAO,GACV;QAAEE,KAAK,EAAE,IAAIC,wBAAe,CAACF,OAAO;MAAE,CAAC,GACvC;QAAEG,IAAI,EAAE,IAAIC,uBAAc,CAACJ,OAAO;MAAE,CAAC;IAC3C,CAAC,MAAM;MACL;MACA,OAAOD,OAAO,GACV;QAAEE,KAAK,EAAE,IAAII,YAAU,CAAC,IAAI,CAACZ,YAAY;MAAE,CAAC,GAC5C;QAAEU,IAAI,EAAE,IAAIG,WAAS,CAAC,IAAI,CAACb,YAAY;MAAE,CAAC;IAChD;EACF;EAEQE,YAAYA,CAAA,EAAG;IACrB,OAAO,IAAI,CAACH,KAAK,GAAG,IAAIe,QAAG,CAAC,IAAI,CAACf,KAAK,CAAC,GAAG,IAAIe,QAAG,CAAC,IAAI,CAAChB,GAAG,CAAC;EAC7D;AACF;AAAC,IAAAiB,QAAA,GAEcnB,YAAY;AAAAoB,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
package/build/proxy.d.ts CHANGED
@@ -1,9 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
- import { Headers as gotHeaders } from 'got';
4
- import type { Agents, Options } from 'got';
3
+ import { Agents, Delays, Options, RetryOptions, Headers as gotHeaders } from 'got-cjs';
5
4
  import Stream, { PassThrough } from 'stream';
6
- import { Headers } from 'undici';
7
5
  import { URL } from 'url';
8
6
  import { searchUtils } from '@verdaccio/core';
9
7
  import { Manifest } from '@verdaccio/types';
@@ -16,10 +14,11 @@ export interface ProxyList {
16
14
  [key: string]: IProxy;
17
15
  }
18
16
  export type ProxySearchParams = {
19
- headers?: Headers;
20
17
  url: string;
21
- query?: searchUtils.SearchQuery;
22
18
  abort: AbortController;
19
+ query?: searchUtils.SearchQuery;
20
+ headers?: Headers;
21
+ retry?: Partial<RetryOptions>;
23
22
  };
24
23
  export interface IProxy {
25
24
  config: UpLinkConfLocal;
@@ -30,13 +29,13 @@ export interface IProxy {
30
29
  server_id: string;
31
30
  url: URL;
32
31
  maxage: number;
33
- timeout: number;
32
+ timeout: Delays;
34
33
  max_fails: number;
35
34
  fail_timeout: number;
36
35
  upname: string;
37
36
  search(options: ProxySearchParams): Promise<Stream.Readable>;
38
- getRemoteMetadata(name: string, options: ISyncUplinksOptions): Promise<[Manifest, string]>;
39
- fetchTarball(url: string, options: Pick<ISyncUplinksOptions, 'remoteAddress' | 'etag' | 'retry'>): PassThrough;
37
+ getRemoteMetadata(name: string, options: Partial<ISyncUplinksOptions>): Promise<[Manifest, string]>;
38
+ fetchTarball(url: string, options: Partial<Pick<ISyncUplinksOptions, 'remoteAddress' | 'etag' | 'retry'>>): PassThrough;
40
39
  }
41
40
  export { Options as FetchOptions };
42
41
  export interface ISyncUplinksOptions extends Options {
@@ -57,7 +56,7 @@ declare class ProxyStorage implements IProxy {
57
56
  server_id: string;
58
57
  url: URL;
59
58
  maxage: number;
60
- timeout: number;
59
+ timeout: Delays;
61
60
  max_fails: number;
62
61
  fail_timeout: number;
63
62
  agent_options: AgentOptionsConf;
@@ -67,9 +66,9 @@ declare class ProxyStorage implements IProxy {
67
66
  last_request_time: number | null;
68
67
  strict_ssl: boolean;
69
68
  private retry;
70
- constructor(config: UpLinkConfLocal, mainConfig: Config, agent?: Agents);
69
+ constructor(config: UpLinkConfLocal, mainConfig: Config, logger: Logger, agent?: Agents);
71
70
  private getAgent;
72
- getHeadersNext(headers?: {}): gotHeaders;
71
+ getHeaders(headers?: {}): gotHeaders;
73
72
  /**
74
73
  * Validate configuration auth and assign Header authorization
75
74
  * @param {Object} headers
@@ -113,14 +112,14 @@ declare class ProxyStorage implements IProxy {
113
112
  */
114
113
  private _overrideWithUpLinkConfLocaligHeaders;
115
114
  private applyUplinkHeaders;
116
- getRemoteMetadata(name: string, options: ISyncUplinksOptions): Promise<[Manifest, string]>;
115
+ getRemoteMetadata(name: string, options: Partial<ISyncUplinksOptions>): Promise<[Manifest, string]>;
117
116
  fetchTarball(url: string, overrideOptions: Pick<ISyncUplinksOptions, 'remoteAddress' | 'etag' | 'retry'>): any;
118
117
  /**
119
118
  * Perform a stream search.
120
119
  * @param {*} options request options
121
120
  * @return {Stream}
122
121
  */
123
- search({ url, abort }: ProxySearchParams): Promise<Stream.Readable>;
122
+ search({ url, abort, retry }: ProxySearchParams): Promise<Stream.Readable>;
124
123
  private addProxyHeaders;
125
124
  /**
126
125
  * If the request failure.
package/build/proxy.js CHANGED
@@ -3,20 +3,26 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "FetchOptions", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _gotCjs.Options;
10
+ }
11
+ });
6
12
  exports.ProxyStorage = void 0;
7
13
  var _JSONStream = _interopRequireDefault(require("JSONStream"));
8
14
  var _debug = _interopRequireDefault(require("debug"));
9
- var _got = _interopRequireDefault(require("got"));
15
+ var _gotCjs = _interopRequireWildcard(require("got-cjs"));
10
16
  var _lodash = _interopRequireDefault(require("lodash"));
11
17
  var _stream = require("stream");
12
- var _undici = require("undici");
13
18
  var _url = require("url");
14
19
  var _core = require("@verdaccio/core");
15
20
  var _utils = require("@verdaccio/utils");
16
21
  var _agent = _interopRequireDefault(require("./agent"));
17
22
  var _proxyUtils = require("./proxy-utils");
23
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
24
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
- const LoggerApi = require('@verdaccio/logger');
20
26
  const debug = (0, _debug.default)('verdaccio:proxy');
21
27
  const encode = function (thing) {
22
28
  return encodeURIComponent(thing).replace(/^%40/, '@');
@@ -41,14 +47,13 @@ class ProxyStorage {
41
47
  // FIXME: upname is assigned to each instance
42
48
  // @ts-ignore
43
49
  // @ts-ignore
44
- constructor(config, mainConfig, agent) {
50
+ constructor(config, mainConfig, logger, agent) {
51
+ var _mainConfig$user_agen, _this$config$max_fail, _this$max_fails;
45
52
  this.config = config;
46
53
  this.failed_requests = 0;
47
- this.userAgent = mainConfig.user_agent ?? 'hidden';
54
+ this.userAgent = (_mainConfig$user_agen = mainConfig.user_agent) !== null && _mainConfig$user_agen !== void 0 ? _mainConfig$user_agen : 'hidden';
48
55
  this.ca = config.ca;
49
- this.logger = LoggerApi.logger.child({
50
- sub: 'out'
51
- });
56
+ this.logger = logger;
52
57
  this.server_id = mainConfig.server_id;
53
58
  this.agent_options = setConfig(this.config, 'agent_options', {
54
59
  keepAlive: true,
@@ -58,7 +63,7 @@ class ProxyStorage {
58
63
  this.url = new _url.URL(this.config.url);
59
64
  const isHTTPS = this.url.protocol === 'https:';
60
65
  this._setupProxy(this.url.hostname, config, mainConfig, isHTTPS);
61
- this.agent = agent ?? this.getAgent();
66
+ this.agent = agent !== null && agent !== void 0 ? agent : this.getAgent();
62
67
  this.config.url = this.config.url.replace(/\/$/, '');
63
68
  if (this.config.timeout && Number(this.config.timeout) >= 1000) {
64
69
  this.logger.warn(['Too big timeout value: ' + this.config.timeout, 'We changed time format to nginx-like one', '(see http://nginx.org/en/docs/syntax.html)', 'so please update your config accordingly'].join('\n'));
@@ -67,12 +72,15 @@ class ProxyStorage {
67
72
  // a bunch of different configurable timers
68
73
  this.maxage = (0, _proxyUtils.parseInterval)(setConfig(this.config, 'maxage', '2m'));
69
74
  // https://github.com/sindresorhus/got/blob/main/documentation/6-timeout.md
70
- this.timeout = (0, _proxyUtils.parseInterval)(setConfig(this.config, 'timeout', '30s'));
71
- this.max_fails = Number(setConfig(this.config, 'max_fails', this.config.max_fails ?? 2));
75
+ this.timeout = {
76
+ request: (0, _proxyUtils.parseInterval)(setConfig(this.config, 'timeout', '30s'))
77
+ };
78
+ debug('set timeout %s', this.timeout);
79
+ this.max_fails = Number(setConfig(this.config, 'max_fails', (_this$config$max_fail = this.config.max_fails) !== null && _this$config$max_fail !== void 0 ? _this$config$max_fail : 2));
72
80
  this.fail_timeout = (0, _proxyUtils.parseInterval)(setConfig(this.config, 'fail_timeout', '5m'));
73
81
  this.strict_ssl = Boolean(setConfig(this.config, 'strict_ssl', true));
74
82
  this.retry = {
75
- limit: this.max_fails ?? 2
83
+ limit: (_this$max_fails = this.max_fails) !== null && _this$max_fails !== void 0 ? _this$max_fails : 2
76
84
  };
77
85
  }
78
86
  getAgent() {
@@ -84,7 +92,7 @@ class ProxyStorage {
84
92
  return this.agent;
85
93
  }
86
94
  }
87
- getHeadersNext(headers = {}) {
95
+ getHeaders(headers = {}) {
88
96
  const accept = _core.HEADERS.ACCEPT;
89
97
  const acceptEncoding = _core.HEADERS.ACCEPT_ENCODING;
90
98
  const userAgent = _core.HEADERS.USER_AGENT;
@@ -215,8 +223,8 @@ class ProxyStorage {
215
223
  }
216
224
 
217
225
  // FUTURE: allow mix headers that comes from the client
218
- debug('get metadata for %s', name);
219
- let headers = this.getHeadersNext(options === null || options === void 0 ? void 0 : options.headers);
226
+ debug('getting metadata for package %s', name);
227
+ let headers = this.getHeaders(options === null || options === void 0 ? void 0 : options.headers);
220
228
  headers = this.addProxyHeaders(headers, options.remoteAddress);
221
229
  headers = this.applyUplinkHeaders(headers);
222
230
  // the following headers cannot be overwritten
@@ -226,27 +234,24 @@ class ProxyStorage {
226
234
  }
227
235
  const method = options.method || 'GET';
228
236
  const uri = this.config.url + `/${encode(name)}`;
229
- debug('request uri for %s retry %s', uri);
237
+ debug('set retry limit is %s', this.retry.limit);
230
238
  let response;
231
239
  let responseLength = 0;
232
240
  try {
233
- var _response;
234
- const retry = (options === null || options === void 0 ? void 0 : options.retry) ?? this.retry;
235
- debug('retry times %s for %s', retry, uri);
236
- response = await (0, _got.default)(uri, {
241
+ var _options$retry, _response;
242
+ const retry = (_options$retry = options === null || options === void 0 ? void 0 : options.retry) !== null && _options$retry !== void 0 ? _options$retry : this.retry;
243
+ debug('retry initial count %s', retry);
244
+ response = await (0, _gotCjs.default)(uri, {
237
245
  headers,
238
246
  responseType: 'json',
239
247
  method,
240
248
  agent: this.agent,
241
249
  retry,
242
- // @ts-ignore
243
- timeout: {
244
- request: (options === null || options === void 0 ? void 0 : options.timeout) ?? this.timeout
245
- },
250
+ timeout: this.timeout,
246
251
  hooks: {
247
252
  afterResponse: [afterResponse => {
248
253
  const code = afterResponse.statusCode;
249
- debug('code response %s', code);
254
+ debug('after response code is %s', code);
250
255
  if (code >= _core.HTTP_STATUS.OK && code < _core.HTTP_STATUS.MULTIPLE_CHOICES) {
251
256
  if (this.failed_requests >= this.max_fails) {
252
257
  this.failed_requests = 0;
@@ -257,10 +262,9 @@ class ProxyStorage {
257
262
  }
258
263
  return afterResponse;
259
264
  }],
260
- beforeRetry: [
261
- // FUTURE: got 12.0.0, the option arg should be removed
262
- (_options, error, count) => {
263
- this.failed_requests = count ?? 0;
265
+ beforeRetry: [(error, count) => {
266
+ debug('retry %s count: %s', uri, count);
267
+ this.failed_requests = count !== null && count !== void 0 ? count : 0;
264
268
  this.logger.info({
265
269
  request: {
266
270
  method: method,
@@ -317,9 +321,10 @@ class ProxyStorage {
317
321
  }, message);
318
322
  return [data, etag];
319
323
  } catch (err) {
320
- debug('uri %s fail', uri);
324
+ debug('error %s on uri %s', err.code, uri);
321
325
  if (err.code === 'ERR_NON_2XX_3XX_RESPONSE') {
322
326
  const code = err.response.statusCode;
327
+ debug('error code %s', code);
323
328
  if (code === _core.HTTP_STATUS.NOT_FOUND) {
324
329
  throw _core.errorUtils.getNotFound(_core.errorUtils.API_ERROR.NOT_PACKAGE_UPLINK);
325
330
  }
@@ -329,6 +334,13 @@ class ProxyStorage {
329
334
  error.remoteStatus = code;
330
335
  throw error;
331
336
  }
337
+ } else if (err.code === 'ETIMEDOUT') {
338
+ debug('error code timeout');
339
+ const code = err.code;
340
+ const error = _core.errorUtils.getInternalError(`${_core.errorUtils.API_ERROR.SERVER_TIME_OUT}: ${code}`);
341
+ // we need this code to identify outside which status code triggered the error
342
+ error.remoteStatus = code;
343
+ throw error;
332
344
  }
333
345
  throw err;
334
346
  }
@@ -336,12 +348,13 @@ class ProxyStorage {
336
348
 
337
349
  // FIXME: handle stream and retry
338
350
  fetchTarball(url, overrideOptions) {
351
+ var _this$retry;
339
352
  debug('fetching url for %s', url);
340
353
  const options = {
341
354
  ...this.config,
342
355
  ...overrideOptions
343
356
  };
344
- let headers = this.getHeadersNext(options === null || options === void 0 ? void 0 : options.headers);
357
+ let headers = this.getHeaders(options === null || options === void 0 ? void 0 : options.headers);
345
358
  headers = this.addProxyHeaders(headers, options.remoteAddress);
346
359
  headers = this.applyUplinkHeaders(headers);
347
360
  // the following headers cannot be overwritten
@@ -352,12 +365,12 @@ class ProxyStorage {
352
365
  const method = 'GET';
353
366
  // const uri = this.config.url + `/${encode(name)}`;
354
367
  debug('request uri for %s', url);
355
- const readStream = _got.default.stream(url, {
368
+ const readStream = _gotCjs.default.stream(url, {
356
369
  headers,
357
370
  method,
358
371
  agent: this.agent,
359
372
  // FIXME: this should be taken from construtor as priority
360
- retry: this.retry ?? (options === null || options === void 0 ? void 0 : options.retry),
373
+ retry: (_this$retry = this.retry) !== null && _this$retry !== void 0 ? _this$retry : options === null || options === void 0 ? void 0 : options.retry,
361
374
  timeout: this.timeout
362
375
  }).on('request', () => {
363
376
  this.last_request_time = Date.now();
@@ -372,10 +385,9 @@ class ProxyStorage {
372
385
  */
373
386
  async search({
374
387
  url,
375
- abort
388
+ abort,
389
+ retry
376
390
  }) {
377
- debug('search url %o', url);
378
- let response;
379
391
  try {
380
392
  const fullURL = new _url.URL(`${this.url}${url}`);
381
393
  // FIXME: a better way to remove duplicate slashes?
@@ -384,23 +396,17 @@ class ProxyStorage {
384
396
  uri,
385
397
  uplink: this.upname
386
398
  }, 'search request to uplink @{uplink} - @{uri}');
387
- response = await (0, _undici.fetch)(uri, {
388
- method: 'GET',
389
- // FUTURE: whitelist domains what we are sending not need it headers, security check
390
- // headers: new Headers({
391
- // ...headers,
392
- // connection: 'keep-alive',
393
- // }),
394
- signal: abort === null || abort === void 0 ? void 0 : abort.signal
399
+ debug('searching on %s', uri);
400
+ const response = (0, _gotCjs.default)(uri, {
401
+ signal: abort ? abort.signal : {},
402
+ agent: this.agent,
403
+ timeout: this.timeout,
404
+ retry: retry !== null && retry !== void 0 ? retry : this.retry
395
405
  });
396
- debug('response.status %o', response.status);
397
- if (response.status >= _core.HTTP_STATUS.BAD_REQUEST) {
398
- throw _core.errorUtils.getInternalError(`bad status code ${response.status} from uplink`);
399
- }
406
+ const res = await response.text();
400
407
  const streamSearch = new _stream.PassThrough({
401
408
  objectMode: true
402
409
  });
403
- const res = await response.text();
404
410
  const streamResponse = _stream.Readable.from(res);
405
411
  // objects is one of the properties on the body, it ignores date and total
406
412
  streamResponse.pipe(_JSONStream.default.parse('objects')).pipe(streamSearch, {
@@ -408,6 +414,10 @@ class ProxyStorage {
408
414
  });
409
415
  return streamSearch;
410
416
  } catch (err) {
417
+ debug('search error %s', err);
418
+ if (err.response.statusCode === 409) {
419
+ throw _core.errorUtils.getInternalError(`bad status code ${err.response.statusCode} from uplink`);
420
+ }
411
421
  this.logger.error({
412
422
  errorMessage: err === null || err === void 0 ? void 0 : err.message,
413
423
  name: this.upname
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","names":["_JSONStream","_interopRequireDefault","require","_debug","_got","_lodash","_stream","_undici","_url","_core","_utils","_agent","_proxyUtils","obj","__esModule","default","LoggerApi","debug","buildDebug","encode","thing","encodeURIComponent","replace","jsonContentType","HEADERS","JSON","contentTypeAccept","setConfig","config","key","def","_","isNil","ProxyStorage","constructor","mainConfig","agent","failed_requests","userAgent","user_agent","ca","logger","child","sub","server_id","agent_options","keepAlive","maxSockets","maxFreeSockets","url","URL","isHTTPS","protocol","_setupProxy","hostname","getAgent","timeout","Number","warn","join","maxage","parseInterval","max_fails","fail_timeout","strict_ssl","Boolean","retry","limit","agentInstance","CustomAgents","proxy","get","getHeadersNext","headers","accept","ACCEPT","acceptEncoding","ACCEPT_ENCODING","USER_AGENT","setAuthNext","auth","AUTHORIZATION","isObject","token","_throwErrorAuth","tokenConf","isString","token_env","process","env","NPM_TOKEN","error","constants","ERROR_CODE","token_required","type","TOKEN_BASIC","_setHeaderAuthorization","message","Error","_type","toLowerCase","TOKEN_BEARER","upperFirst","buildToken","_overrideWithUpLinkConfLocaligHeaders","applyUplinkHeaders","getRemoteMetadata","name","options","_ifRequestFailure","errorUtils","getInternalError","API_ERROR","UPLINK_OFFLINE","addProxyHeaders","remoteAddress","etag","NONE_MATCH","method","uri","response","responseLength","_response","got","responseType","request","hooks","afterResponse","code","statusCode","HTTP_STATUS","OK","MULTIPLE_CHOICES","host","beforeRetry","_options","count","info","retryCount","on","last_request_time","Date","now","eventResponse","http","status","isNull","progress","total","data","body","NOT_MODIFIED","getCode","NOT_MODIFIED_NO_DATA","bytes","in","json","stringify","length","out","err","NOT_FOUND","getNotFound","NOT_PACKAGE_UPLINK","BAD_STATUS_CODE","remoteStatus","fetchTarball","overrideOptions","readStream","stream","search","abort","fullURL","href","uplink","upname","undiciFetch","signal","BAD_REQUEST","streamSearch","PassThrough","objectMode","res","text","streamResponse","Readable","from","pipe","JSONStream","parse","end","errorMessage","FORWARDED_FOR","Math","abs","mainconfig","noProxyList","proxy_key","no_proxy","split","isArray","i","noProxyItem","endsWith","rule","undefined","exports"],"sources":["../src/proxy.ts"],"sourcesContent":["import JSONStream from 'JSONStream';\nimport buildDebug from 'debug';\nimport got, { RequiredRetryOptions, Headers as gotHeaders } from 'got';\nimport type { Agents, Options } from 'got';\nimport _ from 'lodash';\nimport Stream, { PassThrough, Readable } from 'stream';\nimport { Headers, fetch as undiciFetch } from 'undici';\nimport { URL } from 'url';\n\nimport {\n API_ERROR,\n HEADERS,\n HTTP_STATUS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n constants,\n errorUtils,\n searchUtils,\n} from '@verdaccio/core';\nimport { Manifest } from '@verdaccio/types';\nimport { Config, Logger, UpLinkConf } from '@verdaccio/types';\nimport { buildToken } from '@verdaccio/utils';\n\nimport CustomAgents, { AgentOptionsConf } from './agent';\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: UpLinkConfLocal, key: string, 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 search(options: ProxySearchParams): Promise<Stream.Readable>;\n getRemoteMetadata(name: string, options: ISyncUplinksOptions): Promise<[Manifest, string]>;\n fetchTarball(\n url: string,\n options: Pick<ISyncUplinksOptions, 'remoteAddress' | 'etag' | 'retry'>\n ): PassThrough;\n}\n\n// this type is need it by storage\nexport { Options as FetchOptions };\n\nexport interface ISyncUplinksOptions extends Options {\n uplinksLook?: boolean;\n etag?: string;\n remoteAddress?: string;\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: AgentOptionsConf;\n // FIXME: upname is assigned to each instance\n // @ts-ignore\n public upname: string;\n public proxy: string | undefined;\n private agent: Agents;\n // @ts-ignore\n public last_request_time: number | null;\n public strict_ssl: boolean;\n private retry: Partial<RequiredRetryOptions> | number;\n\n public constructor(config: UpLinkConfLocal, mainConfig: Config, agent?: Agents) {\n this.config = config;\n this.failed_requests = 0;\n this.userAgent = mainConfig.user_agent ?? 'hidden';\n this.ca = config.ca;\n this.logger = LoggerApi.logger.child({ sub: 'out' });\n this.server_id = mainConfig.server_id;\n this.agent_options = setConfig(this.config, 'agent_options', {\n keepAlive: true,\n maxSockets: 40,\n maxFreeSockets: 10,\n }) as AgentOptionsConf;\n this.url = new URL(this.config.url);\n const isHTTPS = this.url.protocol === 'https:';\n this._setupProxy(this.url.hostname, config, mainConfig, isHTTPS);\n this.agent = agent ?? this.getAgent();\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 // https://github.com/sindresorhus/got/blob/main/documentation/6-timeout.md\n this.timeout = parseInterval(setConfig(this.config, 'timeout', '30s'));\n this.max_fails = Number(setConfig(this.config, 'max_fails', 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.retry = { limit: this.max_fails ?? 2 };\n }\n\n private getAgent() {\n if (!this.agent) {\n // TODO: the config.ca (certificates) is not yet injected here\n const agentInstance = new CustomAgents(this.config.url, this.proxy, this.agent_options);\n return agentInstance.get();\n } else {\n return this.agent;\n }\n }\n\n public getHeadersNext(headers = {}): gotHeaders {\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 return this.setAuthNext(headers);\n }\n\n /**\n * Validate configuration auth and assign Header authorization\n * @param {Object} headers\n * @return {Object}\n * @private\n */\n private setAuthNext(headers: gotHeaders): gotHeaders {\n const { auth } = this.config;\n if (typeof auth === 'undefined' || typeof headers[HEADERS.AUTHORIZATION] === 'string') {\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 if (_.isNil(tokenConf.token) === false && _.isString(tokenConf.token)) {\n token = tokenConf.token;\n } else if (_.isNil(tokenConf.token_env) === false) {\n if (typeof tokenConf.token_env === 'string') {\n token = process.env[tokenConf.token_env];\n } else if (typeof tokenConf.token_env === 'boolean' && 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 (typeof token === 'undefined') {\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 * @deprecated use applyUplinkHeaders\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 private applyUplinkHeaders(headers: gotHeaders): gotHeaders {\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 return headers;\n }\n\n public async getRemoteMetadata(\n name: string,\n options: ISyncUplinksOptions\n ): Promise<[Manifest, string]> {\n if (this._ifRequestFailure()) {\n throw errorUtils.getInternalError(API_ERROR.UPLINK_OFFLINE);\n }\n\n // FUTURE: allow mix headers that comes from the client\n debug('get metadata for %s', name);\n let headers = this.getHeadersNext(options?.headers);\n headers = this.addProxyHeaders(headers, options.remoteAddress);\n headers = this.applyUplinkHeaders(headers);\n // the following headers cannot be overwritten\n if (_.isNil(options.etag) === false) {\n headers[HEADERS.NONE_MATCH] = options.etag;\n headers[HEADERS.ACCEPT] = contentTypeAccept;\n }\n const method = options.method || 'GET';\n const uri = this.config.url + `/${encode(name)}`;\n debug('request uri for %s retry %s', uri);\n let response;\n let responseLength = 0;\n try {\n const retry = options?.retry ?? this.retry;\n debug('retry times %s for %s', retry, uri);\n response = await got(uri, {\n headers,\n responseType: 'json',\n method,\n agent: this.agent,\n retry,\n // @ts-ignore\n timeout: { request: options?.timeout ?? this.timeout },\n hooks: {\n afterResponse: [\n (afterResponse) => {\n const code = afterResponse.statusCode;\n debug('code response %s', code);\n if (code >= HTTP_STATUS.OK && code < HTTP_STATUS.MULTIPLE_CHOICES) {\n if (this.failed_requests >= this.max_fails) {\n this.failed_requests = 0;\n this.logger.warn(\n {\n host: this.url.host,\n },\n 'host @{host} is now online'\n );\n }\n }\n\n return afterResponse;\n },\n ],\n beforeRetry: [\n // FUTURE: got 12.0.0, the option arg should be removed\n (_options, error: any, count) => {\n this.failed_requests = count ?? 0;\n this.logger.info(\n {\n request: {\n method: method,\n url: uri,\n },\n error: error.message,\n retryCount: this.failed_requests,\n },\n \"retry @{retryCount} req: '@{request.method} @{request.url}'\"\n );\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 },\n })\n .on('request', () => {\n this.last_request_time = Date.now();\n })\n .on('response', (eventResponse) => {\n const message = \"@{!status}, req: '@{request.method} @{request.url}' (streaming)\";\n this.logger.http(\n {\n request: {\n method: method,\n url: uri,\n },\n status: _.isNull(eventResponse) === false ? eventResponse.statusCode : 'ERR',\n },\n message\n );\n })\n .on('downloadProgress', (progress) => {\n if (progress.total) {\n debug('responseLength %s', progress.total);\n responseLength = progress.total;\n }\n });\n const etag = response.headers.etag as string;\n const data = response.body;\n\n // not modified status (304) registry does not return any payload\n // it is handled as an error\n if (response?.statusCode === HTTP_STATUS.NOT_MODIFIED) {\n throw errorUtils.getCode(HTTP_STATUS.NOT_MODIFIED, API_ERROR.NOT_MODIFIED_NO_DATA);\n }\n\n debug('uri %s success', uri);\n const message = \"@{!status}, req: '@{request.method} @{request.url}'\";\n this.logger.http(\n {\n // if error is null/false change this to undefined so it wont log\n request: { method: method, url: uri },\n status: response.statusCode,\n bytes: {\n in: options?.json ? JSON.stringify(options?.json).length : 0,\n out: responseLength || 0,\n },\n },\n message\n );\n return [data, etag];\n } catch (err: any) {\n debug('uri %s fail', uri);\n if (err.code === 'ERR_NON_2XX_3XX_RESPONSE') {\n const code = err.response.statusCode;\n if (code === HTTP_STATUS.NOT_FOUND) {\n throw errorUtils.getNotFound(errorUtils.API_ERROR.NOT_PACKAGE_UPLINK);\n }\n\n if (!(code >= HTTP_STATUS.OK && code < HTTP_STATUS.MULTIPLE_CHOICES)) {\n const error = errorUtils.getInternalError(\n `${errorUtils.API_ERROR.BAD_STATUS_CODE}: ${code}`\n );\n // we need this code to identify outside which status code triggered the error\n error.remoteStatus = code;\n throw error;\n }\n }\n throw err;\n }\n }\n\n // FIXME: handle stream and retry\n public fetchTarball(\n url: string,\n overrideOptions: Pick<ISyncUplinksOptions, 'remoteAddress' | 'etag' | 'retry'>\n ): any {\n debug('fetching url for %s', url);\n const options = { ...this.config, ...overrideOptions };\n let headers = this.getHeadersNext(options?.headers);\n headers = this.addProxyHeaders(headers, options.remoteAddress);\n headers = this.applyUplinkHeaders(headers);\n // the following headers cannot be overwritten\n if (_.isNil(options.etag) === false) {\n headers[HEADERS.NONE_MATCH] = options.etag;\n headers[HEADERS.ACCEPT] = contentTypeAccept;\n }\n const method = 'GET';\n // const uri = this.config.url + `/${encode(name)}`;\n debug('request uri for %s', url);\n\n const readStream = got\n .stream(url, {\n headers,\n method,\n agent: this.agent,\n // FIXME: this should be taken from construtor as priority\n retry: this.retry ?? options?.retry,\n timeout: this.timeout,\n })\n .on('request', () => {\n this.last_request_time = Date.now();\n });\n\n return readStream;\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 private addProxyHeaders(headers: gotHeaders, remoteAddress?: string): gotHeaders {\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 if (!this.proxy) {\n headers[HEADERS.FORWARDED_FOR] =\n (headers['x-forwarded-for'] ? headers['x-forwarded-for'] + ', ' : '') + remoteAddress;\n }\n\n // always attach Via header to avoid loops, even if we're not proxying\n headers['via'] = headers['via'] ? headers['via'] + ', ' : '';\n headers['via'] += '1.1 ' + this.server_id + ' (Verdaccio)';\n\n return headers;\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.endsWith(noProxyItem)) {\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 this.proxy = undefined;\n }\n break;\n }\n }\n }\n\n if (typeof this.proxy === 'string') {\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"],"mappings":"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"}
1
+ {"version":3,"file":"proxy.js","names":["_JSONStream","_interopRequireDefault","require","_debug","_gotCjs","_interopRequireWildcard","_lodash","_stream","_url","_core","_utils","_agent","_proxyUtils","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","debug","buildDebug","encode","thing","encodeURIComponent","replace","jsonContentType","HEADERS","JSON","contentTypeAccept","setConfig","config","def","_","isNil","ProxyStorage","constructor","mainConfig","logger","agent","_mainConfig$user_agen","_this$config$max_fail","_this$max_fails","failed_requests","userAgent","user_agent","ca","server_id","agent_options","keepAlive","maxSockets","maxFreeSockets","url","URL","isHTTPS","protocol","_setupProxy","hostname","getAgent","timeout","Number","warn","join","maxage","parseInterval","request","max_fails","fail_timeout","strict_ssl","Boolean","retry","limit","agentInstance","CustomAgents","proxy","getHeaders","headers","accept","ACCEPT","acceptEncoding","ACCEPT_ENCODING","USER_AGENT","setAuthNext","auth","AUTHORIZATION","isObject","token","_throwErrorAuth","tokenConf","isString","token_env","process","env","NPM_TOKEN","error","constants","ERROR_CODE","token_required","type","TOKEN_BASIC","_setHeaderAuthorization","message","Error","_type","toLowerCase","TOKEN_BEARER","upperFirst","buildToken","_overrideWithUpLinkConfLocaligHeaders","applyUplinkHeaders","getRemoteMetadata","name","options","_ifRequestFailure","errorUtils","getInternalError","API_ERROR","UPLINK_OFFLINE","addProxyHeaders","remoteAddress","etag","NONE_MATCH","method","uri","response","responseLength","_options$retry","_response","got","responseType","hooks","afterResponse","code","statusCode","HTTP_STATUS","OK","MULTIPLE_CHOICES","host","beforeRetry","count","info","retryCount","on","last_request_time","Date","now","eventResponse","http","status","isNull","progress","total","data","body","NOT_MODIFIED","getCode","NOT_MODIFIED_NO_DATA","bytes","in","json","stringify","length","out","err","NOT_FOUND","getNotFound","NOT_PACKAGE_UPLINK","BAD_STATUS_CODE","remoteStatus","SERVER_TIME_OUT","fetchTarball","overrideOptions","_this$retry","readStream","stream","search","abort","fullURL","href","uplink","upname","signal","res","text","streamSearch","PassThrough","objectMode","streamResponse","Readable","from","pipe","JSONStream","parse","end","errorMessage","FORWARDED_FOR","Math","abs","mainconfig","noProxyList","proxy_key","no_proxy","split","isArray","i","noProxyItem","endsWith","rule","undefined","exports"],"sources":["../src/proxy.ts"],"sourcesContent":["import JSONStream from 'JSONStream';\nimport buildDebug from 'debug';\nimport got, {\n Agents,\n Delays,\n Options,\n RequestError,\n RetryOptions,\n Headers as gotHeaders,\n} from 'got-cjs';\nimport _ from 'lodash';\nimport Stream, { PassThrough, Readable } from 'stream';\nimport { URL } from 'url';\n\nimport {\n API_ERROR,\n HEADERS,\n HTTP_STATUS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n constants,\n errorUtils,\n searchUtils,\n} from '@verdaccio/core';\nimport { Manifest } from '@verdaccio/types';\nimport { Config, Logger, UpLinkConf } from '@verdaccio/types';\nimport { buildToken } from '@verdaccio/utils';\n\nimport CustomAgents, { AgentOptionsConf } from './agent';\nimport { parseInterval } from './proxy-utils';\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: UpLinkConfLocal, key: string, 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 url: string;\n abort: AbortController;\n query?: searchUtils.SearchQuery;\n headers?: Headers;\n retry?: Partial<RetryOptions>;\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: Delays;\n max_fails: number;\n fail_timeout: number;\n upname: string;\n search(options: ProxySearchParams): Promise<Stream.Readable>;\n getRemoteMetadata(\n name: string,\n options: Partial<ISyncUplinksOptions>\n ): Promise<[Manifest, string]>;\n fetchTarball(\n url: string,\n options: Partial<Pick<ISyncUplinksOptions, 'remoteAddress' | 'etag' | 'retry'>>\n ): PassThrough;\n}\n\n// this type is need it by storage\nexport { Options as FetchOptions };\n\nexport interface ISyncUplinksOptions extends Options {\n uplinksLook?: boolean;\n etag?: string;\n remoteAddress?: string;\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: Delays;\n public max_fails: number;\n public fail_timeout: number;\n public agent_options: AgentOptionsConf;\n // FIXME: upname is assigned to each instance\n // @ts-ignore\n public upname: string;\n public proxy: string | undefined;\n private agent: Agents;\n // @ts-ignore\n public last_request_time: number | null;\n public strict_ssl: boolean;\n private retry: Partial<RetryOptions>;\n\n public constructor(config: UpLinkConfLocal, mainConfig: Config, logger: Logger, agent?: Agents) {\n this.config = config;\n this.failed_requests = 0;\n this.userAgent = mainConfig.user_agent ?? 'hidden';\n this.ca = config.ca;\n this.logger = logger;\n this.server_id = mainConfig.server_id;\n this.agent_options = setConfig(this.config, 'agent_options', {\n keepAlive: true,\n maxSockets: 40,\n maxFreeSockets: 10,\n }) as AgentOptionsConf;\n this.url = new URL(this.config.url);\n const isHTTPS = this.url.protocol === 'https:';\n this._setupProxy(this.url.hostname, config, mainConfig, isHTTPS);\n this.agent = agent ?? this.getAgent();\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 // https://github.com/sindresorhus/got/blob/main/documentation/6-timeout.md\n this.timeout = {\n request: parseInterval(setConfig(this.config, 'timeout', '30s')),\n };\n debug('set timeout %s', this.timeout);\n this.max_fails = Number(setConfig(this.config, 'max_fails', 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.retry = { limit: this.max_fails ?? 2 };\n }\n\n private getAgent() {\n if (!this.agent) {\n // TODO: the config.ca (certificates) is not yet injected here\n const agentInstance = new CustomAgents(this.config.url, this.proxy, this.agent_options);\n return agentInstance.get();\n } else {\n return this.agent;\n }\n }\n\n public getHeaders(headers = {}): gotHeaders {\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 return this.setAuthNext(headers);\n }\n\n /**\n * Validate configuration auth and assign Header authorization\n * @param {Object} headers\n * @return {Object}\n * @private\n */\n private setAuthNext(headers: gotHeaders): gotHeaders {\n const { auth } = this.config;\n if (typeof auth === 'undefined' || typeof headers[HEADERS.AUTHORIZATION] === 'string') {\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 if (_.isNil(tokenConf.token) === false && _.isString(tokenConf.token)) {\n token = tokenConf.token;\n } else if (_.isNil(tokenConf.token_env) === false) {\n if (typeof tokenConf.token_env === 'string') {\n token = process.env[tokenConf.token_env];\n } else if (typeof tokenConf.token_env === 'boolean' && 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 (typeof token === 'undefined') {\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 * @deprecated use applyUplinkHeaders\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 private applyUplinkHeaders(headers: gotHeaders): gotHeaders {\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 return headers;\n }\n\n public async getRemoteMetadata(\n name: string,\n options: Partial<ISyncUplinksOptions>\n ): Promise<[Manifest, string]> {\n if (this._ifRequestFailure()) {\n throw errorUtils.getInternalError(API_ERROR.UPLINK_OFFLINE);\n }\n\n // FUTURE: allow mix headers that comes from the client\n debug('getting metadata for package %s', name);\n let headers = this.getHeaders(options?.headers);\n headers = this.addProxyHeaders(headers, options.remoteAddress);\n headers = this.applyUplinkHeaders(headers);\n // the following headers cannot be overwritten\n if (_.isNil(options.etag) === false) {\n headers[HEADERS.NONE_MATCH] = options.etag;\n headers[HEADERS.ACCEPT] = contentTypeAccept;\n }\n const method = options.method || 'GET';\n const uri = this.config.url + `/${encode(name)}`;\n debug('set retry limit is %s', this.retry.limit);\n let response;\n let responseLength = 0;\n try {\n const retry = options?.retry ?? this.retry;\n debug('retry initial count %s', retry);\n response = await got(uri, {\n headers,\n responseType: 'json',\n method,\n agent: this.agent,\n retry,\n timeout: this.timeout,\n hooks: {\n afterResponse: [\n (afterResponse) => {\n const code = afterResponse.statusCode;\n debug('after response code is %s', code);\n if (code >= HTTP_STATUS.OK && code < HTTP_STATUS.MULTIPLE_CHOICES) {\n if (this.failed_requests >= this.max_fails) {\n this.failed_requests = 0;\n this.logger.warn(\n {\n host: this.url.host,\n },\n 'host @{host} is now online'\n );\n }\n }\n\n return afterResponse;\n },\n ],\n beforeRetry: [\n (error: RequestError, count: number) => {\n debug('retry %s count: %s', uri, count);\n this.failed_requests = count ?? 0;\n this.logger.info(\n {\n request: {\n method: method,\n url: uri,\n },\n error: error.message,\n retryCount: this.failed_requests,\n },\n \"retry @{retryCount} req: '@{request.method} @{request.url}'\"\n );\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 },\n })\n .on('request', () => {\n this.last_request_time = Date.now();\n })\n .on<any>('response', (eventResponse) => {\n const message = \"@{!status}, req: '@{request.method} @{request.url}' (streaming)\";\n this.logger.http(\n {\n request: {\n method: method,\n url: uri,\n },\n status: _.isNull(eventResponse) === false ? eventResponse.statusCode : 'ERR',\n },\n message\n );\n })\n .on('downloadProgress', (progress) => {\n if (progress.total) {\n debug('responseLength %s', progress.total);\n responseLength = progress.total;\n }\n });\n const etag = response.headers.etag as string;\n const data = response.body;\n\n // not modified status (304) registry does not return any payload\n // it is handled as an error\n if (response?.statusCode === HTTP_STATUS.NOT_MODIFIED) {\n throw errorUtils.getCode(HTTP_STATUS.NOT_MODIFIED, API_ERROR.NOT_MODIFIED_NO_DATA);\n }\n\n debug('uri %s success', uri);\n const message = \"@{!status}, req: '@{request.method} @{request.url}'\";\n this.logger.http(\n {\n // if error is null/false change this to undefined so it wont log\n request: { method: method, url: uri },\n status: response.statusCode,\n bytes: {\n in: options?.json ? JSON.stringify(options?.json).length : 0,\n out: responseLength || 0,\n },\n },\n message\n );\n return [data, etag];\n } catch (err: any) {\n debug('error %s on uri %s', err.code, uri);\n if (err.code === 'ERR_NON_2XX_3XX_RESPONSE') {\n const code = err.response.statusCode;\n debug('error code %s', code);\n if (code === HTTP_STATUS.NOT_FOUND) {\n throw errorUtils.getNotFound(errorUtils.API_ERROR.NOT_PACKAGE_UPLINK);\n }\n\n if (!(code >= HTTP_STATUS.OK && code < HTTP_STATUS.MULTIPLE_CHOICES)) {\n const error = errorUtils.getInternalError(\n `${errorUtils.API_ERROR.BAD_STATUS_CODE}: ${code}`\n );\n // we need this code to identify outside which status code triggered the error\n error.remoteStatus = code;\n throw error;\n }\n } else if (err.code === 'ETIMEDOUT') {\n debug('error code timeout');\n const code = err.code;\n const error = errorUtils.getInternalError(\n `${errorUtils.API_ERROR.SERVER_TIME_OUT}: ${code}`\n );\n // we need this code to identify outside which status code triggered the error\n error.remoteStatus = code;\n throw error;\n }\n throw err;\n }\n }\n\n // FIXME: handle stream and retry\n public fetchTarball(\n url: string,\n overrideOptions: Pick<ISyncUplinksOptions, 'remoteAddress' | 'etag' | 'retry'>\n ): any {\n debug('fetching url for %s', url);\n const options = { ...this.config, ...overrideOptions };\n let headers = this.getHeaders(options?.headers);\n headers = this.addProxyHeaders(headers, options.remoteAddress);\n headers = this.applyUplinkHeaders(headers);\n // the following headers cannot be overwritten\n if (_.isNil(options.etag) === false) {\n headers[HEADERS.NONE_MATCH] = options.etag;\n headers[HEADERS.ACCEPT] = contentTypeAccept;\n }\n const method = 'GET';\n // const uri = this.config.url + `/${encode(name)}`;\n debug('request uri for %s', url);\n\n const readStream = got\n .stream(url, {\n headers,\n method,\n agent: this.agent,\n // FIXME: this should be taken from construtor as priority\n retry: this.retry ?? options?.retry,\n timeout: this.timeout,\n })\n .on('request', () => {\n this.last_request_time = Date.now();\n });\n\n return readStream;\n }\n\n /**\n * Perform a stream search.\n * @param {*} options request options\n * @return {Stream}\n */\n public async search({ url, abort, retry }: ProxySearchParams): Promise<Stream.Readable> {\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 debug('searching on %s', uri);\n const response = got(uri, {\n signal: abort ? abort.signal : {},\n agent: this.agent,\n timeout: this.timeout,\n retry: retry ?? this.retry,\n });\n\n const res = await response.text();\n const streamSearch = new PassThrough({ objectMode: true });\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 debug('search error %s', err);\n if (err.response.statusCode === 409) {\n throw errorUtils.getInternalError(`bad status code ${err.response.statusCode} from uplink`);\n }\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 private addProxyHeaders(headers: gotHeaders, remoteAddress?: string): gotHeaders {\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 if (!this.proxy) {\n headers[HEADERS.FORWARDED_FOR] =\n (headers['x-forwarded-for'] ? headers['x-forwarded-for'] + ', ' : '') + remoteAddress;\n }\n\n // always attach Via header to avoid loops, even if we're not proxying\n headers['via'] = headers['via'] ? headers['via'] + ', ' : '';\n headers['via'] += '1.1 ' + this.server_id + ' (Verdaccio)';\n\n return headers;\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.endsWith(noProxyItem)) {\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 this.proxy = undefined;\n }\n break;\n }\n }\n }\n\n if (typeof this.proxy === 'string') {\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"],"mappings":"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"}