vtex
Version:
The platform for e-commerce apps
98 lines (97 loc) • 4.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.IOClientFactory = void 0;
const tslib_1 = require("tslib");
const Headers_1 = require("../../constants/Headers");
const traceConfig_1 = require("../../../lib/globalConfigs/traceConfig");
const user_agent_1 = tslib_1.__importDefault(require("../../../user-agent"));
const env = tslib_1.__importStar(require("../../env"));
const globalMetrics_1 = require("../../metrics/globalMetrics");
const SessionManager_1 = require("../../session/SessionManager");
// Must run before any @vtex/api client is instantiated: its HttpClient middlewares
// depend on a global `metrics` accumulator that only the IO service runtime sets up.
(0, globalMetrics_1.setupGlobalMetrics)();
const noop = () => { };
class IOClientFactory {
static createDummyLogger() {
const { account, workspace } = SessionManager_1.SessionManager.getSingleton();
return {
account,
workspace,
operationId: '',
requestId: '',
debug: noop,
info: noop,
warn: noop,
error: noop,
sendLog: noop,
};
}
/**
* Toolbelt does not participate in distributed tracing, so we provide a
* no-op tracer whose `isTraceSampled` is false. The HttpClient tracing
* middleware short-circuits in that case and never invokes the other
* tracer methods, keeping this safe at runtime.
*/
static createDummyTracer() {
return {
traceId: '',
isTraceSampled: false,
startSpan: noop,
inject: noop,
fallbackSpanContext: () => undefined,
};
}
static createIOContext(opts) {
const session = SessionManager_1.SessionManager.getSingleton();
const { account = session.account, authToken = session.token, region = env.region(), workspace = session.workspace || 'master', } = opts !== null && opts !== void 0 ? opts : {};
return {
account,
userAgent: user_agent_1.default,
workspace,
authToken,
region,
production: false,
product: '',
route: {
id: '',
params: {},
type: 'public',
},
requestId: '',
operationId: '',
platform: '',
logger: IOClientFactory.createDummyLogger(),
tracer: IOClientFactory.createDummyTracer(),
};
}
static createClient(ClientClass, customContext = {}, customOptions = {}, instantiationOpts) {
const { requireAuth } = { requireAuth: true, ...instantiationOpts };
const clientOptions = IOClientFactory.createInstanceOptions(customOptions);
const ioContext = { ...IOClientFactory.createIOContext(), ...customContext };
if (requireAuth && !ioContext.authToken) {
return new Proxy({}, {
get: () => () => {
throw new Error(`Error trying to call client before login.`);
},
});
}
return new ClientClass(ioContext, clientOptions);
}
static createInstanceOptions(customOptions = {}) {
const clusterHeader = env.cluster() ? { [Headers_1.Headers.VTEX_UPSTREAM_TARGET]: env.cluster() } : null;
const traceHeader = traceConfig_1.TraceConfig.shouldTrace() ? { [Headers_1.Headers.VTEX_TRACE]: traceConfig_1.TraceConfig.jaegerDebugID } : null;
const defaultOptions = {
timeout: (env.envTimeout || IOClientFactory.DEFAULT_TIMEOUT),
headers: {
...clusterHeader,
...traceHeader,
},
};
const mergedOptions = { ...defaultOptions, ...customOptions };
mergedOptions.headers = { ...defaultOptions.headers, ...customOptions.headers };
return mergedOptions;
}
}
exports.IOClientFactory = IOClientFactory;
IOClientFactory.DEFAULT_TIMEOUT = 15000;