UNPKG

@jsforce/jsforce-node

Version:

Salesforce API Library for JavaScript

103 lines (102 loc) 3.04 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeWithTimeout = exports.performRedirectRequest = exports.isRedirect = exports.createHttpRequestHandlerStreams = void 0; const stream_1 = require("stream"); const stream_2 = require("./util/stream"); const form_data_1 = __importDefault(require("form-data")); /** * */ function createHttpRequestHandlerStreams(req, options = {}) { const { body: reqBody } = req; const input = new stream_1.PassThrough(); const output = new stream_1.PassThrough(); const duplex = (0, stream_2.concatStreamsAsDuplex)(input, output); if (typeof reqBody !== 'undefined') { setTimeout(() => { if (reqBody instanceof form_data_1.default) { duplex.end(reqBody.getBuffer()); } else { duplex.end(reqBody, 'utf8'); } }, 0); } duplex.on('response', async (res) => { if (duplex.listenerCount('complete') > 0) { const resBody = await (0, stream_2.readAll)(duplex, options.encoding); duplex.emit('complete', { ...res, body: resBody, }); } }); return { input, output, stream: duplex }; } exports.createHttpRequestHandlerStreams = createHttpRequestHandlerStreams; const redirectStatuses = new Set([301, 302, 303, 307, 308]); /** * */ function isRedirect(status) { return redirectStatuses.has(status); } exports.isRedirect = isRedirect; /** * */ const MAX_REDIRECT_COUNT = 10; /** * */ function performRedirectRequest(req, res, followRedirect, counter, redirectCallback) { if (counter >= MAX_REDIRECT_COUNT) { throw new Error('Reached to maximum redirect count'); } const redirectUrl = res.headers['location']; if (!redirectUrl) { throw new Error('No redirect URI found'); } const getRedirectRequest = typeof followRedirect === 'function' ? followRedirect : () => ({ method: 'GET', url: redirectUrl, headers: req.headers, }); const nextReqParams = getRedirectRequest(redirectUrl); if (!nextReqParams) { throw new Error('Cannot handle redirect for ' + redirectUrl); } redirectCallback(nextReqParams); } exports.performRedirectRequest = performRedirectRequest; /** * */ async function executeWithTimeout(execFn, msec, cancelCallback) { let timeout = false; const pid = msec != null ? setTimeout(() => { timeout = true; cancelCallback?.(); }, msec) : undefined; let res; try { res = await execFn(); } finally { if (pid) { clearTimeout(pid); } } if (timeout) { throw new Error('Request Timeout'); } return res; } exports.executeWithTimeout = executeWithTimeout;