JezK
Edit File: request-manager.js.map
{"version":3,"file":"request-manager.js","names":["dnscache","enable","ttl","cachesize","successHosts","map","controlOffline","network","isOffline","RequestManager","reporter","offlineNoRequests","_requestCaptureHar","_requestModule","offlineQueue","captureHar","httpsProxy","ca","httpProxy","strictSSL","userAgent","running","queue","cache","max","constants","NETWORK_CONCURRENCY","maxRetryAttempts","opts","offline","length","networkConcurrency","networkTimeout","timeout","cafile","bundle","fs","readFileSync","toString","hasPemPrefix","block","startsWith","split","filter","err","error","message","cert","key","request","require","RequestCaptureHar","bind","params","Promise","reject","MessageError","lang","url","cached","method","forever","retryAttempts","headers","Object","assign","promise","resolve","push","shiftQueue","process","clear","code","hostname","possibleOfflineChange","retryReason","containsReason","queuedOpts","info","initOfflineRetry","setTimeout","execute","buildNext","fn","data","rejectNext","rejectWithoutUrl","queueForRetry","reason","attempts","toUpperCase","cleanup","calledOnError","onError","isPossibleOfflineError","parts","parse","callback","res","body","verbose","statusCode","description","http","STATUS_CODES","ResponseError","caseless","get","Error","authMethods","s","toLowerCase","indexOf","OneTimePasswordError","concat","rejectStatusCode","errMsg","buffer","encoding","proxy","String","_getRequestModule","req","on","stillActive","abort","shift","filename","invariant","saveHar"],"sourceRoot":"../../src","sources":["util/request-manager.js"],"sourcesContent":["/* @flow */\n\nimport fs from 'fs';\nimport http from 'http';\nimport url from 'url';\nimport dnscache from 'dnscache';\nimport invariant from 'invariant';\nimport RequestCaptureHar from 'request-capture-har';\n\nimport type {Reporter} from '../reporters/index.js';\nimport {MessageError, ResponseError, OneTimePasswordError} from '../errors.js';\nimport BlockingQueue from './blocking-queue.js';\nimport * as constants from '../constants.js';\nimport * as network from './network.js';\nimport map from '../util/map.js';\n\nimport typeof * as RequestModuleT from 'request';\n\n// Initialize DNS cache so we don't look up the same\n// domains like registry.yarnpkg.com over and over again\n// for each request.\ndnscache({\n enable: true,\n ttl: 300,\n cachesize: 10,\n});\nconst successHosts = map();\nconst controlOffline = network.isOffline();\n\ninterface RequestError extends Error {\n hostname?: ?string,\n code?: ?string,\n}\n\nexport type RequestMethods = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE';\n\ntype RequestParams<T> = {\n url: string,\n auth?: {\n email?: string,\n username?: string,\n password?: string,\n token?: string,\n },\n buffer?: boolean,\n method?: RequestMethods,\n queue?: BlockingQueue,\n json?: boolean,\n body?: mixed,\n proxy?: string,\n encoding?: ?string,\n ca?: Array<string>,\n cert?: string,\n networkConcurrency?: number,\n timeout?: number,\n key?: string,\n forever?: boolean,\n strictSSL?: boolean,\n headers?: {\n [name: string]: string,\n },\n process?: (req: Object, resolve: (body: T) => void, reject: (err: Error) => void) => void,\n callback?: (err: ?Error, res: any, body: any) => void,\n retryAttempts?: number,\n maxRetryAttempts?: number,\n followRedirect?: boolean,\n rejectStatusCode?: number | Array<number>,\n};\n\ntype RequestOptions = {\n retryReason: ?string,\n params: RequestParams<Object>,\n resolve: (body: any) => void,\n reject: (err: any) => void,\n};\n\nexport default class RequestManager {\n constructor(reporter: Reporter) {\n this.offlineNoRequests = false;\n this._requestCaptureHar = null;\n this._requestModule = null;\n this.offlineQueue = [];\n this.captureHar = false;\n this.httpsProxy = '';\n this.ca = null;\n this.httpProxy = '';\n this.strictSSL = true;\n this.userAgent = '';\n this.reporter = reporter;\n this.running = 0;\n this.queue = [];\n this.cache = {};\n this.max = constants.NETWORK_CONCURRENCY;\n this.maxRetryAttempts = 5;\n }\n\n offlineNoRequests: boolean;\n captureHar: boolean;\n userAgent: string;\n reporter: Reporter;\n running: number;\n httpsProxy: string | boolean;\n httpProxy: string | boolean;\n strictSSL: boolean;\n ca: ?Array<string>;\n cert: ?string;\n key: ?string;\n offlineQueue: Array<RequestOptions>;\n queue: Array<Object>;\n max: number;\n timeout: number;\n maxRetryAttempts: number;\n cache: {\n [key: string]: Promise<any>,\n };\n\n _requestCaptureHar: ?RequestCaptureHar;\n _requestModule: ?RequestModuleT;\n\n setOptions(opts: {\n userAgent?: string,\n offline?: boolean,\n captureHar?: boolean,\n httpProxy?: string | boolean,\n httpsProxy?: string | boolean,\n strictSSL?: boolean,\n ca?: Array<string>,\n cafile?: string,\n cert?: string,\n networkConcurrency?: number,\n networkTimeout?: number,\n maxRetryAttempts?: number,\n key?: string,\n }) {\n if (opts.userAgent != null) {\n this.userAgent = opts.userAgent;\n }\n\n if (opts.offline != null) {\n this.offlineNoRequests = opts.offline;\n }\n\n if (opts.captureHar != null) {\n this.captureHar = opts.captureHar;\n }\n\n if (opts.httpProxy != null) {\n this.httpProxy = opts.httpProxy || '';\n }\n\n if (opts.httpsProxy === '') {\n this.httpsProxy = opts.httpProxy || '';\n } else if (opts.httpsProxy === false) {\n this.httpsProxy = false;\n } else {\n this.httpsProxy = opts.httpsProxy || '';\n }\n\n if (opts.strictSSL !== null && typeof opts.strictSSL !== 'undefined') {\n this.strictSSL = opts.strictSSL;\n }\n\n if (opts.ca != null && opts.ca.length > 0) {\n this.ca = opts.ca;\n }\n\n if (opts.networkConcurrency != null) {\n this.max = opts.networkConcurrency;\n }\n\n if (opts.networkTimeout != null) {\n this.timeout = opts.networkTimeout;\n }\n\n if (opts.maxRetryAttempts != null) {\n this.maxRetryAttempts = opts.maxRetryAttempts;\n }\n\n if (opts.cafile != null && opts.cafile != '') {\n // The CA bundle file can contain one or more certificates with comments/text between each PEM block.\n // tls.connect wants an array of certificates without any comments/text, so we need to split the string\n // and strip out any text in between the certificates\n try {\n const bundle = fs.readFileSync(opts.cafile).toString();\n const hasPemPrefix = block => block.startsWith('-----BEGIN ');\n // opts.cafile overrides opts.ca, this matches with npm behavior\n this.ca = bundle.split(/(-----BEGIN .*\\r?\\n[^-]+\\r?\\n--.*)/).filter(hasPemPrefix);\n } catch (err) {\n this.reporter.error(`Could not open cafile: ${err.message}`);\n }\n }\n\n if (opts.cert != null) {\n this.cert = opts.cert;\n }\n\n if (opts.key != null) {\n this.key = opts.key;\n }\n }\n\n /**\n * Lazy load `request` since it is exceptionally expensive to load and is\n * often not needed at all.\n */\n\n _getRequestModule(): RequestModuleT {\n if (!this._requestModule) {\n const request = require('request');\n if (this.captureHar) {\n this._requestCaptureHar = new RequestCaptureHar(request);\n this._requestModule = this._requestCaptureHar.request.bind(this._requestCaptureHar);\n } else {\n this._requestModule = request;\n }\n }\n return this._requestModule;\n }\n\n /**\n * Queue up a request.\n */\n\n request<T>(params: RequestParams<T>): Promise<T> {\n if (this.offlineNoRequests) {\n return Promise.reject(new MessageError(this.reporter.lang('cantRequestOffline', params.url)));\n }\n\n const cached = this.cache[params.url];\n if (cached) {\n return cached;\n }\n\n params.method = params.method || 'GET';\n params.forever = true;\n params.retryAttempts = 0;\n params.strictSSL = this.strictSSL;\n params.headers = Object.assign(\n {\n 'User-Agent': this.userAgent,\n },\n params.headers,\n );\n\n const promise = new Promise((resolve, reject) => {\n this.queue.push({params, reject, resolve});\n this.shiftQueue();\n });\n\n // we can't cache a request with a processor\n if (!params.process) {\n this.cache[params.url] = promise;\n }\n\n return promise;\n }\n\n /**\n * Clear the request cache. This is important as we cache all HTTP requests so you'll\n * want to do this as soon as you can.\n */\n\n clearCache() {\n this.cache = {};\n if (this._requestCaptureHar != null) {\n this._requestCaptureHar.clear();\n }\n }\n\n /**\n * Check if an error is possibly due to lost or poor network connectivity.\n */\n\n isPossibleOfflineError(err: RequestError): boolean {\n const {code, hostname} = err;\n if (!code) {\n return false;\n }\n\n // network was previously online but now we're offline\n const possibleOfflineChange = !controlOffline && !network.isOffline();\n if (code === 'ENOTFOUND' && possibleOfflineChange) {\n // can't resolve a domain\n return true;\n }\n\n // used to be able to resolve this domain! something is wrong\n if (code === 'ENOTFOUND' && hostname && successHosts[hostname]) {\n // can't resolve this domain but we've successfully resolved it before\n return true;\n }\n\n // network was previously offline and we can't resolve the domain\n if (code === 'ENOTFOUND' && controlOffline) {\n return true;\n }\n\n // connection was reset or dropped\n if (code === 'ECONNRESET') {\n return true;\n }\n\n // TCP timeout\n if (code === 'ESOCKETTIMEDOUT' || code === 'ETIMEDOUT') {\n return true;\n }\n\n return false;\n }\n\n /**\n * Queue up request arguments to be retried. Start a network connectivity timer if there\n * isn't already one.\n */\n\n queueForRetry(opts: RequestOptions) {\n if (opts.retryReason) {\n let containsReason = false;\n\n for (const queuedOpts of this.offlineQueue) {\n if (queuedOpts.retryReason === opts.retryReason) {\n containsReason = true;\n break;\n }\n }\n\n if (!containsReason) {\n this.reporter.info(opts.retryReason);\n }\n }\n\n if (!this.offlineQueue.length) {\n this.initOfflineRetry();\n }\n\n this.offlineQueue.push(opts);\n }\n\n /**\n * Begin timers to retry failed requests when we possibly establish network connectivity\n * again.\n */\n\n initOfflineRetry() {\n setTimeout(() => {\n const queue = this.offlineQueue;\n this.offlineQueue = [];\n for (const opts of queue) {\n this.execute(opts);\n }\n }, 3000);\n }\n\n /**\n * Execute a request.\n */\n\n execute(opts: RequestOptions) {\n const {params} = opts;\n const {reporter} = this;\n\n const buildNext = fn => data => {\n fn(data);\n this.running--;\n this.shiftQueue();\n };\n\n const resolve = buildNext(opts.resolve);\n\n const rejectNext = buildNext(opts.reject);\n const reject = function(err) {\n err.message = `${params.url}: ${err.message}`;\n rejectNext(err);\n };\n\n const rejectWithoutUrl = function(err) {\n err.message = err.message;\n rejectNext(err);\n };\n\n const queueForRetry = reason => {\n const attempts = params.retryAttempts || 0;\n if (attempts >= this.maxRetryAttempts - 1) {\n return false;\n }\n if (opts.params.method && opts.params.method.toUpperCase() !== 'GET') {\n return false;\n }\n params.retryAttempts = attempts + 1;\n if (typeof params.cleanup === 'function') {\n params.cleanup();\n }\n opts.retryReason = reason;\n this.queueForRetry(opts);\n return true;\n };\n\n let calledOnError = false;\n const onError = err => {\n if (calledOnError) {\n return;\n }\n calledOnError = true;\n\n if (this.isPossibleOfflineError(err)) {\n if (!queueForRetry(this.reporter.lang('offlineRetrying'))) {\n reject(err);\n }\n } else {\n reject(err);\n }\n };\n\n if (!params.process) {\n const parts = url.parse(params.url);\n\n params.callback = (err, res, body) => {\n if (err) {\n onError(err);\n return;\n }\n\n successHosts[parts.hostname] = true;\n\n this.reporter.verbose(this.reporter.lang('verboseRequestFinish', params.url, res.statusCode));\n\n if (res.statusCode === 408 || res.statusCode >= 500) {\n const description = `${res.statusCode} ${http.STATUS_CODES[res.statusCode]}`;\n if (!queueForRetry(this.reporter.lang('internalServerErrorRetrying', description))) {\n throw new ResponseError(this.reporter.lang('requestFailed', description), res.statusCode);\n } else {\n return;\n }\n }\n\n if (res.statusCode === 401 && res.caseless && res.caseless.get('server') === 'GitHub.com') {\n const message = `${res.body.message}. If using GITHUB_TOKEN in your env, check that it is valid.`;\n rejectWithoutUrl(new Error(this.reporter.lang('unauthorizedResponse', res.caseless.get('server'), message)));\n }\n\n if (res.statusCode === 401 && res.headers['www-authenticate']) {\n const authMethods = res.headers['www-authenticate'].split(/,\\s*/).map(s => s.toLowerCase());\n if (authMethods.indexOf('otp') !== -1) {\n reject(new OneTimePasswordError(res.headers['npm-notice']));\n return;\n }\n }\n\n if (body && typeof body.error === 'string') {\n reject(new Error(body.error));\n return;\n }\n\n if ([400, 401, 404].concat(params.rejectStatusCode || []).indexOf(res.statusCode) !== -1) {\n // So this is actually a rejection ... the hosted git resolver uses this to know whether http is supported\n resolve(false);\n } else if (res.statusCode >= 400) {\n const errMsg = (body && body.message) || reporter.lang('requestError', params.url, res.statusCode);\n reject(new Error(errMsg));\n } else {\n resolve(body);\n }\n };\n }\n\n if (params.buffer) {\n params.encoding = null;\n }\n\n let proxy = this.httpProxy;\n if (params.url.startsWith('https:')) {\n proxy = this.httpsProxy;\n }\n\n if (proxy) {\n // if no proxy is set, do not pass a proxy down to request.\n // the request library will internally check the HTTP_PROXY and HTTPS_PROXY env vars.\n params.proxy = String(proxy);\n } else if (proxy === false) {\n // passing empty string prevents the underlying library from falling back to the env vars.\n // an explicit false in the yarn config should override the env var. See #4546.\n params.proxy = '';\n }\n\n if (this.ca != null) {\n params.ca = this.ca;\n }\n\n if (this.cert != null) {\n params.cert = this.cert;\n }\n\n if (this.key != null) {\n params.key = this.key;\n }\n\n if (this.timeout != null) {\n params.timeout = this.timeout;\n }\n\n const request = this._getRequestModule();\n const req = request(params);\n this.reporter.verbose(this.reporter.lang('verboseRequestStart', params.method, params.url));\n\n req.on('error', onError);\n\n const queue = params.queue;\n if (queue) {\n req.on('data', queue.stillActive.bind(queue));\n }\n\n const process = params.process;\n if (process) {\n req.on('response', res => {\n if (res.statusCode >= 200 && res.statusCode < 300) {\n return;\n }\n\n const description = `${res.statusCode} ${http.STATUS_CODES[res.statusCode]}`;\n reject(new ResponseError(this.reporter.lang('requestFailed', description), res.statusCode));\n\n req.abort();\n });\n process(req, resolve, reject);\n }\n }\n\n /**\n * Remove an item from the queue. Create it's request options and execute it.\n */\n\n shiftQueue() {\n if (this.running >= this.max || !this.queue.length) {\n return;\n }\n\n const opts = this.queue.shift();\n\n this.running++;\n this.execute(opts);\n }\n\n saveHar(filename: string) {\n if (!this.captureHar) {\n throw new Error(this.reporter.lang('requestManagerNotSetupHAR'));\n }\n // No request may have occurred at all.\n this._getRequestModule();\n invariant(this._requestCaptureHar != null, 'request-capture-har not setup');\n this._requestCaptureHar.saveHar(filename);\n }\n}\n"],"mappings":"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"}