@csermet/multiprovider
Version:
cloud-graph provider plugin for AWS used to fetch AWS cloud data.
49 lines (48 loc) • 2.33 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fetchAllPaginatedData = exports.convertToPromise = void 0;
const util_1 = require("util");
const get_1 = __importDefault(require("lodash/get"));
const head_1 = __importDefault(require("lodash/head"));
// import { GetterData } from '../types'
function convertToPromise({ sdkContext, fnName, }) {
return util_1.promisify((params, cb) => {
sdkContext[fnName](params, (err, data) => cb(err, data));
});
}
exports.convertToPromise = convertToPromise;
async function fetchAllPaginatedData({ accessor, initialParams, getResourcesFn, returnFirst = false, }) {
function getValidResource(payloadData) {
const { ResponseMetadata, ...usefulResourceData } = payloadData;
const key = Object.keys(usefulResourceData).find(prop => typeof usefulResourceData[prop] !== 'undefined');
return usefulResourceData[key];
}
let resourcesList = [];
const params = initialParams || {};
const { Marker, NextToken, ...relevantPayloadData } = await getResourcesFn(params);
let resources = getValidResource(relevantPayloadData);
resourcesList = resourcesList.concat(...resources);
let markerController = Marker ?? NextToken;
let markerVar;
// Some aws sdk services use 'Marker' while others use 'NextToken' we need to handle both
if (markerController) {
markerVar = Marker ? 'Marker' : 'NextToken';
}
while (markerController) {
const nextPageParams = markerVar === 'Marker'
? { ...params, Marker: markerController }
: { ...params, NextToken: markerController };
const { Marker: innerMarker, NextToken: innerNextToken, ...relevantPayloadData } = await getResourcesFn(nextPageParams);
resources = getValidResource(relevantPayloadData);
resourcesList = resourcesList.concat(...resources);
markerController = innerMarker ?? innerNextToken;
}
const result = accessor
? resourcesList.flatMap(r => get_1.default(r, accessor))
: resourcesList;
return returnFirst ? head_1.default(result) : result;
}
exports.fetchAllPaginatedData = fetchAllPaginatedData;