82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google LLC All Rights Reserved.
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| import fetch from 'node-fetch';
 | |
| 
 | |
| import {bold, info} from '../../utils/console';
 | |
| import {BaseModule} from './base';
 | |
| 
 | |
| interface ServiceConfig {
 | |
|   name: string;
 | |
|   url: string;
 | |
| }
 | |
| 
 | |
| /** The results of checking the status of a service */
 | |
| interface StatusCheckResult {
 | |
|   name: string;
 | |
|   status: 'passing'|'failing';
 | |
|   description: string;
 | |
|   lastUpdated: Date;
 | |
| }
 | |
| 
 | |
| /** List of services Angular relies on. */
 | |
| export const services: ServiceConfig[] = [
 | |
|   {
 | |
|     url: 'https://status.us-west-1.saucelabs.com/api/v2/status.json',
 | |
|     name: 'Saucelabs',
 | |
|   },
 | |
|   {
 | |
|     url: 'https://status.npmjs.org/api/v2/status.json',
 | |
|     name: 'Npm',
 | |
|   },
 | |
|   {
 | |
|     url: 'https://status.circleci.com/api/v2/status.json',
 | |
|     name: 'CircleCi',
 | |
|   },
 | |
|   {
 | |
|     url: 'https://www.githubstatus.com/api/v2/status.json',
 | |
|     name: 'Github',
 | |
|   },
 | |
| ];
 | |
| 
 | |
| export class ServicesModule extends BaseModule<StatusCheckResult[]> {
 | |
|   async retrieveData() {
 | |
|     return Promise.all(services.map(service => this.getStatusFromStandardApi(service)));
 | |
|   }
 | |
| 
 | |
|   async printToTerminal() {
 | |
|     const statuses = await this.data;
 | |
|     const serviceNameMinLength = Math.max(...statuses.map(service => service.name.length));
 | |
|     info.group(bold('Service Statuses'));
 | |
|     for (const status of statuses) {
 | |
|       const name = status.name.padEnd(serviceNameMinLength);
 | |
|       if (status.status === 'passing') {
 | |
|         info(`${name} ✅`);
 | |
|       } else {
 | |
|         info.group(`${name} ❌ (Updated: ${status.lastUpdated.toLocaleString()})`);
 | |
|         info(`  Details: ${status.description}`);
 | |
|         info.groupEnd();
 | |
|       }
 | |
|     }
 | |
|     info.groupEnd();
 | |
|     info();
 | |
|   }
 | |
| 
 | |
|   /** Retrieve the status information for a service which uses a standard API response. */
 | |
|   async getStatusFromStandardApi(service: ServiceConfig): Promise<StatusCheckResult> {
 | |
|     const result = await fetch(service.url).then(result => result.json());
 | |
|     const status = result.status.indicator === 'none' ? 'passing' : 'failing';
 | |
|     return {
 | |
|       name: service.name,
 | |
|       status,
 | |
|       description: result.status.description,
 | |
|       lastUpdated: new Date(result.page.updated_at)
 | |
|     };
 | |
|   }
 | |
| }
 |