import {Rivendell} from './Rivendell'; import BuildState = Rivendell.BuildState; import BuildStatus = Rivendell.BuildStatus; export type ProgressCallback = (state: BuildState) => any; export type ErrorList = string[]; const STATUS_CHECK_ERROR_THRESHOLD = 5; export async function watchBuild( id: number, progressCallback: ProgressCallback, pollInterval: number = 2000 ): Promise { return new Promise((resolve, reject) => { let errorCount = 0; const interval = setInterval(() => { Rivendell.fetchBuild(id) .then((build) => { const state = build.state as BuildState; if (state === BuildState.FINISHED) { clearInterval(interval); if (build.status as BuildStatus === BuildStatus.SUCCESS) { resolve([]); } else { const errors = build.errors || []; resolve(errors); } } else { progressCallback(state); } errorCount = 0; }) .catch((error) => { errorCount++; if (errorCount >= STATUS_CHECK_ERROR_THRESHOLD) { clearInterval(interval); reject(error); } }); }, pollInterval); }); }