UNPKG

@csermet/multiprovider

Version:

cloud-graph provider plugin for AWS used to fetch AWS cloud data.

49 lines (48 loc) 2.33 kB
"use strict"; 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;