@redocly/cli
Version:
[@Redocly](https://redocly.com) CLI is your all-in-one API documentation utility. It builds, manages, improves, and quality-checks your API descriptions, all of which comes in handy for various phases of the API Lifecycle. Create your own rulesets to make
89 lines • 3.01 kB
JavaScript
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