UNPKG

@redocly/cli

Version:

[@Redocly](https://redocly.com) CLI is your all-in-one OpenAPI utility. It builds, manages, improves, and quality-checks your OpenAPI descriptions, all of which comes in handy for various phases of the API Lifecycle. Create your own rulesets to make API g

89 lines 3.01 kB
import * as http from 'http'; import * as https from 'https'; import { Dispatcher } from 'undici'; import { getInputUrl } from './get-input-url.js'; import { handleRequest } from './handle-request.js'; const HarHttpAgent = createAgentClass(http.Agent); const HarHttpsAgent = createAgentClass(https.Agent); let globalHttpAgent; let globalHttpsAgent; // Add new Undici dispatcher class HarDispatcher extends Dispatcher { constructor(opts) { super(opts); } dispatch(options, handler) { // Handle HAR logging here similar to handleRequest handleRequest({ input: options, handler, harLog: new Map(), isUndici: true }); return super.dispatch(options, handler); } } export function getAgent(input, options) { // Add Undici dispatcher support if (options.dispatcher) { if (options.dispatcher instanceof Dispatcher) { return new HarDispatcher(options.dispatcher); } return options.dispatcher; } if (options.agent) { if (typeof options.agent === 'function') { return function (...args) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore const agent = options.agent.call(this, ...args); if (agent) { instrumentAgentInstance(agent); return agent; } return getGlobalAgent(input); }; } instrumentAgentInstance(options.agent); return options.agent; } return getGlobalAgent(input); } function getGlobalAgent(input) { const url = getInputUrl(input); if (url.protocol === 'http:') { if (!globalHttpAgent) { globalHttpAgent = new HarHttpAgent(); } return globalHttpAgent; } if (!globalHttpsAgent) { globalHttpsAgent = new HarHttpsAgent(); } return globalHttpsAgent; } /** * Instrument an existing Agent instance. This overrides the instance's * `addRequest` method. It should be fine to continue using for requests made * without `withHar` - if the request doesn't have our `x-har-request-id` * header, it won't do anything extra. */ function instrumentAgentInstance(agent) { const { addRequest: originalAddRequest } = agent; if (!originalAddRequest.isHarEnabled) { agent.addRequest = function addRequest(request, ...args) { handleRequest(request, ...args); return originalAddRequest.call(this, request, ...args); }; agent.addRequest.isHarEnabled = true; } } function createAgentClass(BaseAgent) { class HarAgent extends BaseAgent { constructor(...args) { super(...args); this.addRequest.isHarEnabled = true; } addRequest(request, ...args) { handleRequest(request, ...args); return super.addRequest(request, ...args); } } return HarAgent; } //# sourceMappingURL=get-agent.js.map