jsforce
Version:
Salesforce API Library for JavaScript
163 lines (158 loc) • 16.9 kB
JavaScript
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context3, _context4; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context3 = ownKeys(Object(t), !0)).call(_context3, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context4 = ownKeys(Object(t))).call(_context4, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
import "core-js/modules/es.error.cause.js";
import "core-js/modules/es.array.push.js";
import "core-js/modules/es.number.to-fixed.js";
import _setTimeout from "@babel/runtime-corejs3/core-js-stable/set-timeout";
import _Date$now from "@babel/runtime-corejs3/core-js-stable/date/now";
import _Set from "@babel/runtime-corejs3/core-js-stable/set";
import { PassThrough } from 'stream';
import { concatStreamsAsDuplex, readAll } from './util/stream';
import FormData from 'form-data';
import { getLogger } from './util/logger';
var logger = getLogger('request-helper');
/**
*
*/
export function createHttpRequestHandlerStreams(req) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var reqBody = req.body;
var input = new PassThrough();
var output = new PassThrough();
var duplex = concatStreamsAsDuplex(input, output);
if (typeof reqBody !== 'undefined') {
_setTimeout(function () {
if (reqBody instanceof FormData) {
duplex.end(reqBody.getBuffer());
} else {
duplex.end(reqBody, 'utf8');
}
}, 0);
}
duplex.on('response', /*#__PURE__*/function () {
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(res) {
var start, resBody;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!(duplex.listenerCount('complete') > 0)) {
_context.next = 8;
break;
}
logger.debug('Processing response');
start = _Date$now();
_context.next = 5;
return readAll(duplex, options.encoding);
case 5:
resBody = _context.sent;
logger.debug("Response body read: ".concat((resBody.length / 1024 / 1024).toFixed(1), "MB ") + "in ".concat(_Date$now() - start, "ms"));
duplex.emit('complete', _objectSpread(_objectSpread({}, res), {}, {
body: resBody
}));
case 8:
case "end":
return _context.stop();
}
}, _callee);
}));
return function (_x) {
return _ref.apply(this, arguments);
};
}());
return {
input: input,
output: output,
stream: duplex
};
}
var redirectStatuses = new _Set([301, 302, 303, 307, 308]);
/**
*
*/
export function isRedirect(status) {
return redirectStatuses.has(status);
}
/**
*
*/
var MAX_REDIRECT_COUNT = 10;
/**
*
*/
export function performRedirectRequest(req, res, followRedirect, counter, redirectCallback) {
if (counter >= MAX_REDIRECT_COUNT) {
throw new Error('Reached to maximum redirect count');
}
var redirectUrl = res.headers['location'];
if (!redirectUrl) {
throw new Error('No redirect URI found');
}
var getRedirectRequest = typeof followRedirect === 'function' ? followRedirect : function () {
return {
method: 'GET',
url: redirectUrl,
headers: req.headers
};
};
var nextReqParams = getRedirectRequest(redirectUrl);
if (!nextReqParams) {
throw new Error('Cannot handle redirect for ' + redirectUrl);
}
redirectCallback(nextReqParams);
}
/**
*
*/
export function executeWithTimeout(_x2, _x3, _x4) {
return _executeWithTimeout.apply(this, arguments);
}
function _executeWithTimeout() {
_executeWithTimeout = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(execFn, msec, cancelCallback) {
var timeout, pid, res;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
timeout = false;
pid = msec != null ? _setTimeout(function () {
timeout = true;
cancelCallback === null || cancelCallback === void 0 || cancelCallback();
}, msec) : undefined;
_context2.prev = 2;
_context2.next = 5;
return execFn();
case 5:
res = _context2.sent;
case 6:
_context2.prev = 6;
if (pid) {
clearTimeout(pid);
}
return _context2.finish(6);
case 9:
if (!timeout) {
_context2.next = 11;
break;
}
throw new Error('Request Timeout');
case 11:
return _context2.abrupt("return", res);
case 12:
case "end":
return _context2.stop();
}
}, _callee2, null, [[2,, 6, 9]]);
}));
return _executeWithTimeout.apply(this, arguments);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXNzVGhyb3VnaCIsImNvbmNhdFN0cmVhbXNBc0R1cGxleCIsInJlYWRBbGwiLCJGb3JtRGF0YSIsImdldExvZ2dlciIsImxvZ2dlciIsImNyZWF0ZUh0dHBSZXF1ZXN0SGFuZGxlclN0cmVhbXMiLCJyZXEiLCJvcHRpb25zIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwicmVxQm9keSIsImJvZHkiLCJpbnB1dCIsIm91dHB1dCIsImR1cGxleCIsIl9zZXRUaW1lb3V0IiwiZW5kIiwiZ2V0QnVmZmVyIiwib24iLCJfcmVmIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJyZXMiLCJzdGFydCIsInJlc0JvZHkiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwibGlzdGVuZXJDb3VudCIsImRlYnVnIiwiX0RhdGUkbm93IiwiZW5jb2RpbmciLCJzZW50IiwiY29uY2F0IiwidG9GaXhlZCIsImVtaXQiLCJfb2JqZWN0U3ByZWFkIiwic3RvcCIsIl94IiwiYXBwbHkiLCJzdHJlYW0iLCJyZWRpcmVjdFN0YXR1c2VzIiwiX1NldCIsImlzUmVkaXJlY3QiLCJzdGF0dXMiLCJoYXMiLCJNQVhfUkVESVJFQ1RfQ09VTlQiLCJwZXJmb3JtUmVkaXJlY3RSZXF1ZXN0IiwiZm9sbG93UmVkaXJlY3QiLCJjb3VudGVyIiwicmVkaXJlY3RDYWxsYmFjayIsIkVycm9yIiwicmVkaXJlY3RVcmwiLCJoZWFkZXJzIiwiZ2V0UmVkaXJlY3RSZXF1ZXN0IiwibWV0aG9kIiwidXJsIiwibmV4dFJlcVBhcmFtcyIsImV4ZWN1dGVXaXRoVGltZW91dCIsIl94MiIsIl94MyIsIl94NCIsIl9leGVjdXRlV2l0aFRpbWVvdXQiLCJfY2FsbGVlMiIsImV4ZWNGbiIsIm1zZWMiLCJjYW5jZWxDYWxsYmFjayIsInRpbWVvdXQiLCJwaWQiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJjbGVhclRpbWVvdXQiLCJmaW5pc2giLCJhYnJ1cHQiXSwic291cmNlcyI6WyIuLi9zcmMvcmVxdWVzdC1oZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgY29uY2F0U3RyZWFtc0FzRHVwbGV4LCByZWFkQWxsIH0gZnJvbSAnLi91dGlsL3N0cmVhbSc7XG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cFJlcXVlc3RPcHRpb25zLCBIdHRwUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi91dGlsL2xvZ2dlcic7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcigncmVxdWVzdC1oZWxwZXInKTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSHR0cFJlcXVlc3RIYW5kbGVyU3RyZWFtcyhcbiAgcmVxOiBIdHRwUmVxdWVzdCxcbiAgb3B0aW9uczogSHR0cFJlcXVlc3RPcHRpb25zID0ge30sXG4pIHtcbiAgY29uc3QgeyBib2R5OiByZXFCb2R5IH0gPSByZXE7XG4gIGNvbnN0IGlucHV0ID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gIGNvbnN0IG91dHB1dCA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICBjb25zdCBkdXBsZXggPSBjb25jYXRTdHJlYW1zQXNEdXBsZXgoaW5wdXQsIG91dHB1dCk7XG5cbiAgaWYgKHR5cGVvZiByZXFCb2R5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHJlcUJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICBkdXBsZXguZW5kKHJlcUJvZHkuZ2V0QnVmZmVyKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHVwbGV4LmVuZChyZXFCb2R5LCAndXRmOCcpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG4gIGR1cGxleC5vbigncmVzcG9uc2UnLCBhc3luYyAocmVzKSA9PiB7XG4gICAgaWYgKGR1cGxleC5saXN0ZW5lckNvdW50KCdjb21wbGV0ZScpID4gMCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdQcm9jZXNzaW5nIHJlc3BvbnNlJyk7XG4gICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAgIGNvbnN0IHJlc0JvZHkgPSBhd2FpdCByZWFkQWxsKGR1cGxleCwgb3B0aW9ucy5lbmNvZGluZyk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFJlc3BvbnNlIGJvZHkgcmVhZDogJHsocmVzQm9keS5sZW5ndGggLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgxKX1NQiBgICtcbiAgICAgICAgICBgaW4gJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgLFxuICAgICAgKTtcblxuICAgICAgZHVwbGV4LmVtaXQoJ2NvbXBsZXRlJywge1xuICAgICAgICAuLi5yZXMsXG4gICAgICAgIGJvZHk6IHJlc0JvZHksXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4geyBpbnB1dCwgb3V0cHV0LCBzdHJlYW06IGR1cGxleCB9O1xufVxuXG5jb25zdCByZWRpcmVjdFN0YXR1c2VzID0gbmV3IFNldChbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdKTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWRpcmVjdChzdGF0dXM6IG51bWJlcikge1xuICByZXR1cm4gcmVkaXJlY3RTdGF0dXNlcy5oYXMoc3RhdHVzKTtcbn1cblxuLyoqXG4gKlxuICovXG5jb25zdCBNQVhfUkVESVJFQ1RfQ09VTlQgPSAxMDtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGVyZm9ybVJlZGlyZWN0UmVxdWVzdChcbiAgcmVxOiBIdHRwUmVxdWVzdCxcbiAgcmVzOiBPbWl0PEh0dHBSZXNwb25zZSwgJ2JvZHknPixcbiAgZm9sbG93UmVkaXJlY3Q6IE5vbk51bGxhYmxlPEh0dHBSZXF1ZXN0T3B0aW9uc1snZm9sbG93UmVkaXJlY3QnXT4sXG4gIGNvdW50ZXI6IG51bWJlcixcbiAgcmVkaXJlY3RDYWxsYmFjazogKHJlcTogSHR0cFJlcXVlc3QpID0+IHZvaWQsXG4pIHtcbiAgaWYgKGNvdW50ZXIgPj0gTUFYX1JFRElSRUNUX0NPVU5UKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjaGVkIHRvIG1heGltdW0gcmVkaXJlY3QgY291bnQnKTtcbiAgfVxuICBjb25zdCByZWRpcmVjdFVybCA9IHJlcy5oZWFkZXJzWydsb2NhdGlvbiddO1xuICBpZiAoIXJlZGlyZWN0VXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWRpcmVjdCBVUkkgZm91bmQnKTtcbiAgfVxuICBjb25zdCBnZXRSZWRpcmVjdFJlcXVlc3QgPVxuICAgIHR5cGVvZiBmb2xsb3dSZWRpcmVjdCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBmb2xsb3dSZWRpcmVjdFxuICAgICAgOiAoKSA9PiAoe1xuICAgICAgICAgIG1ldGhvZDogJ0dFVCcgYXMgY29uc3QsXG4gICAgICAgICAgdXJsOiByZWRpcmVjdFVybCxcbiAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyxcbiAgICAgICAgfSk7XG4gIGNvbnN0IG5leHRSZXFQYXJhbXMgPSBnZXRSZWRpcmVjdFJlcXVlc3QocmVkaXJlY3RVcmwpO1xuICBpZiAoIW5leHRSZXFQYXJhbXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYW5kbGUgcmVkaXJlY3QgZm9yICcgKyByZWRpcmVjdFVybCk7XG4gIH1cbiAgcmVkaXJlY3RDYWxsYmFjayhuZXh0UmVxUGFyYW1zKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVdpdGhUaW1lb3V0PFQ+KFxuICBleGVjRm46ICgpID0+IFByb21pc2U8VD4sXG4gIG1zZWM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgY2FuY2VsQ2FsbGJhY2s/OiAoKSA9PiB2b2lkLFxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCB0aW1lb3V0ID0gZmFsc2U7XG4gIGNvbnN0IHBpZCA9XG4gICAgbXNlYyAhPSBudWxsXG4gICAgICA/IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXQgPSB0cnVlO1xuICAgICAgICAgIGNhbmNlbENhbGxiYWNrPy4oKTtcbiAgICAgICAgfSwgbXNlYylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBsZXQgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IGF3YWl0IGV4ZWNGbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwaWQpIHtcbiAgICAgIGNsZWFyVGltZW91dChwaWQpO1xuICAgIH1cbiAgfVxuICBpZiAodGltZW91dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdCBUaW1lb3V0Jyk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVNBLFdBQVcsUUFBUSxRQUFRO0FBQ3BDLFNBQVNDLHFCQUFxQixFQUFFQyxPQUFPLFFBQVEsZUFBZTtBQUU5RCxPQUFPQyxRQUFRLE1BQU0sV0FBVztBQUNoQyxTQUFTQyxTQUFTLFFBQVEsZUFBZTtBQUV6QyxJQUFNQyxNQUFNLEdBQUdELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTRSwrQkFBK0JBLENBQzdDQyxHQUFnQixFQUVoQjtFQUFBLElBREFDLE9BQTJCLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLENBQUMsQ0FBQztFQUVoQyxJQUFjRyxPQUFPLEdBQUtMLEdBQUcsQ0FBckJNLElBQUk7RUFDWixJQUFNQyxLQUFLLEdBQUcsSUFBSWQsV0FBVyxDQUFDLENBQUM7RUFDL0IsSUFBTWUsTUFBTSxHQUFHLElBQUlmLFdBQVcsQ0FBQyxDQUFDO0VBQ2hD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