1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2020 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerinterface PromiseInfo { 16*6dbdd20aSAndroid Build Coastguard Worker startTimeMs: number; 17*6dbdd20aSAndroid Build Coastguard Worker message: string; 18*6dbdd20aSAndroid Build Coastguard Worker} 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Workerexport class TaskTracker { 21*6dbdd20aSAndroid Build Coastguard Worker private promisesSeen: number; 22*6dbdd20aSAndroid Build Coastguard Worker private promisesRejected: number; 23*6dbdd20aSAndroid Build Coastguard Worker private promisesFulfilled: number; 24*6dbdd20aSAndroid Build Coastguard Worker private promiseInfo: Map<Promise<unknown>, PromiseInfo>; 25*6dbdd20aSAndroid Build Coastguard Worker 26*6dbdd20aSAndroid Build Coastguard Worker constructor() { 27*6dbdd20aSAndroid Build Coastguard Worker this.promisesSeen = 0; 28*6dbdd20aSAndroid Build Coastguard Worker this.promisesRejected = 0; 29*6dbdd20aSAndroid Build Coastguard Worker this.promisesFulfilled = 0; 30*6dbdd20aSAndroid Build Coastguard Worker this.promiseInfo = new Map(); 31*6dbdd20aSAndroid Build Coastguard Worker } 32*6dbdd20aSAndroid Build Coastguard Worker 33*6dbdd20aSAndroid Build Coastguard Worker trackPromise(promise: Promise<unknown>, message: string): void { 34*6dbdd20aSAndroid Build Coastguard Worker this.promiseInfo.set(promise, { 35*6dbdd20aSAndroid Build Coastguard Worker startTimeMs: new Date().getMilliseconds(), 36*6dbdd20aSAndroid Build Coastguard Worker message, 37*6dbdd20aSAndroid Build Coastguard Worker }); 38*6dbdd20aSAndroid Build Coastguard Worker this.promisesSeen += 1; 39*6dbdd20aSAndroid Build Coastguard Worker promise 40*6dbdd20aSAndroid Build Coastguard Worker .then(() => { 41*6dbdd20aSAndroid Build Coastguard Worker this.promisesFulfilled += 1; 42*6dbdd20aSAndroid Build Coastguard Worker }) 43*6dbdd20aSAndroid Build Coastguard Worker .catch(() => { 44*6dbdd20aSAndroid Build Coastguard Worker this.promisesRejected += 1; 45*6dbdd20aSAndroid Build Coastguard Worker }) 46*6dbdd20aSAndroid Build Coastguard Worker .finally(() => { 47*6dbdd20aSAndroid Build Coastguard Worker this.promiseInfo.delete(promise); 48*6dbdd20aSAndroid Build Coastguard Worker }); 49*6dbdd20aSAndroid Build Coastguard Worker } 50*6dbdd20aSAndroid Build Coastguard Worker 51*6dbdd20aSAndroid Build Coastguard Worker hasPendingTasks(): boolean { 52*6dbdd20aSAndroid Build Coastguard Worker return this.promisesSeen > this.promisesFulfilled + this.promisesRejected; 53*6dbdd20aSAndroid Build Coastguard Worker } 54*6dbdd20aSAndroid Build Coastguard Worker 55*6dbdd20aSAndroid Build Coastguard Worker progressMessage(): string | undefined { 56*6dbdd20aSAndroid Build Coastguard Worker const {value} = this.promiseInfo.values().next(); 57*6dbdd20aSAndroid Build Coastguard Worker if (value === undefined) { 58*6dbdd20aSAndroid Build Coastguard Worker return value; 59*6dbdd20aSAndroid Build Coastguard Worker } else { 60*6dbdd20aSAndroid Build Coastguard Worker const nowMs = new Date().getMilliseconds(); 61*6dbdd20aSAndroid Build Coastguard Worker const runtimeSeconds = Math.round((nowMs - value.startTimeMs) / 1000); 62*6dbdd20aSAndroid Build Coastguard Worker return `${value.message} (${runtimeSeconds}s)`; 63*6dbdd20aSAndroid Build Coastguard Worker } 64*6dbdd20aSAndroid Build Coastguard Worker } 65*6dbdd20aSAndroid Build Coastguard Worker} 66*6dbdd20aSAndroid Build Coastguard Worker 67*6dbdd20aSAndroid Build Coastguard Workerexport const taskTracker = new TaskTracker(); 68