UNPKG

kibana-123

Version:

Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic

82 lines (72 loc) 2.58 kB
import NotifierProvider from './notifier'; import ForEachStrategyProvider from './for_each_strategy'; import CallClientProvider from './call_client'; import CallResponseHandlersProvider from './call_response_handlers'; import ContinueIncompleteProvider from './continue_incomplete'; import ReqStatusProvider from './req_status'; export default function FetchTheseProvider(Private, Promise) { const notify = Private(NotifierProvider); const forEachStrategy = Private(ForEachStrategyProvider); // core tasks const callClient = Private(CallClientProvider); const callResponseHandlers = Private(CallResponseHandlersProvider); const continueIncomplete = Private(ContinueIncompleteProvider); const ABORTED = Private(ReqStatusProvider).ABORTED; const DUPLICATE = Private(ReqStatusProvider).DUPLICATE; const INCOMPLETE = Private(ReqStatusProvider).INCOMPLETE; function fetchThese(requests) { return forEachStrategy(requests, function (strategy, reqsForStrategy) { return fetchWithStrategy(strategy, reqsForStrategy.map(function (req) { if (!req.started) return req; return req.retry(); })); }) .catch(notify.fatal); } function fetchWithStrategy(strategy, requests) { function replaceAbortedRequests() { requests = requests.map(r => r.aborted ? ABORTED : r); } replaceAbortedRequests(); return startRequests(requests) .then(function () { replaceAbortedRequests(); return callClient(strategy, requests); }) .then(function (responses) { replaceAbortedRequests(); return callResponseHandlers(requests, responses); }) .then(function (responses) { replaceAbortedRequests(); return continueIncomplete(strategy, requests, responses, fetchWithStrategy); }) .then(function (responses) { replaceAbortedRequests(); return responses.map(function (resp) { switch (resp) { case ABORTED: return null; case DUPLICATE: case INCOMPLETE: throw new Error('Failed to clear incomplete or duplicate request from responses.'); default: return resp; } }); }); } function startRequests(requests) { return Promise.map(requests, function (req) { if (req === ABORTED) { return req; } return new Promise(function (resolve) { const action = req.started ? req.continue : req.start; resolve(action.call(req)); }) .catch(err => req.handleFailure(err)); }); } return fetchThese; };