export default async function fetchRunInfo()

in client/src/components/runs/logs/misc/fetch-run-info.js [47:180]


export default async function fetchRunInfo (
  runIdentifier,
  dataCallback,
  options
) {
  const {
    maxNestedRunsToDisplay = 10,
    preferences,
    dockerRegistries
  } = options || {};
  let stopped = false;
  const runInfo = new PipelineRunInfo(runIdentifier);
  const runTasks = new RunTasks(runIdentifier);
  const totalNestedRuns = new RunCount({
    parentId: Number(runIdentifier),
    statuses: ALL_STATUSES,
    onlyMasterJobs: false
  });
  await Promise.all([
    runInfo.fetch(),
    runTasks.fetch(),
    totalNestedRuns.fetch(),
    dockerRegistries ? dockerRegistries.fetchIfNeededOrWait() : false
  ].filter(Boolean));
  let hasNestedRuns = totalNestedRuns.runsCount > 0;
  if (runInfo.error || !runInfo.loaded) {
    throw new Error(runInfo.error || 'Error fetching run info');
  }
  const showActiveWorkersOnly = await getShowActiveWorkersOnly(runInfo.value, preferences);
  const {
    status = 'RUNNING',
    dockerImage,
    pipelineId,
    version
  } = runInfo.value;
  const commitAllowed = await checkCommitAllowedForTool(dockerImage, dockerRegistries);
  if (typeof dataCallback === 'function') {
    dataCallback({
      run: runInfo.value,
      runTasks: runTasks.value || [],
      showActiveWorkersOnly,
      language: undefined,
      commitAllowed,
      hasNestedRuns,
      totalNestedRuns: 0,
      nestedRunsPending: true
    });
  }
  const nestedRuns = new PipelineRunSingleFilter(
    {
      page: 1,
      pageSize: maxNestedRunsToDisplay,
      eagerGrouping: false,
      parentId: runIdentifier,
      statuses: showActiveWorkersOnly
        ? ['RUNNING']
        : []
    },
    false
  );
  await nestedRuns.filter();
  let pipelineLanguage;
  if (pipelineId && version) {
    pipelineLanguage = new PipelineLanguage(pipelineId, version);
  }
  let currentStatus = status;
  const isAutoUpdate = () => /^(running|pausing|resuming)$/i.test(currentStatus);
  const call = async () => {
    if (isAutoUpdate() && !stopped) {
      await Promise.all([
        runInfo.fetch(),
        nestedRuns.filter(),
        runTasks.fetch(),
        pipelineLanguage ? pipelineLanguage.fetchIfNeededOrWait() : false
      ].filter(Boolean));
      if (runInfo.networkError) {
        throw new Error(runInfo.networkError);
      }
    }
  };
  const commit = () => {
    const run = runInfo.value || {};
    const {
      status: nextStatus
    } = run;
    currentStatus = nextStatus;
    const error = runInfo.error;
    hasNestedRuns = hasNestedRuns || (nestedRuns.total || 0) > 0;
    const data = {
      run,
      nestedRuns: nestedRuns.value || [],
      hasNestedRuns,
      totalNestedRuns: nestedRuns.total || 0,
      nestedRunsPending: false,
      error,
      showActiveWorkersOnly,
      runTasks: runTasks.value || [],
      language: pipelineLanguage && pipelineLanguage.loaded ? pipelineLanguage.value : undefined,
      commitAllowed
    };
    if (typeof dataCallback === 'function' && !stopped) {
      dataCallback(data);
    }
    return data;
  };
  const result = commit();
  let stop = () => {
    stopped = true;
  };
  const reFetch = async () => new Promise((resolve) => {
    runInfo.fetch()
      .catch(() => {})
      .then(() => commit())
      .then(() => resolve());
  });
  if (isAutoUpdate()) {
    const {
      stop: stopAutoUpdate
    } = continuousFetch({
      call,
      afterInvoke: commit,
      fetchImmediate: false
    });
    stop = () => {
      stopped = true;
      stopAutoUpdate();
    };
  }
  return {
    stop,
    fetch: reFetch,
    data: result
  };
}