@jsforce/jsforce-node
Version:
Salesforce API Library for JavaScript
103 lines (102 loc) • 3.04 kB
JavaScript
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;
;