From e676c960f86422a7b588c65a6870a735d0b4627f Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 12 Dec 2023 20:22:11 +0100 Subject: [PATCH] feat: error handling (#3) --- package-lock.json | 18 +++++++++++++++++- package.json | 4 +++- src/app.controller.ts | 29 +++++++++++++++++++++++++---- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a03edc..02714d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,8 @@ "@sentry/node": "^7.38.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", - "rxjs": "^7.8.0" + "rxjs": "^7.8.0", + "tail": "^2.2.6" }, "devDependencies": { "@nestjs/cli": "^9.2.0", @@ -29,6 +30,7 @@ "@types/jest": "^29.4.0", "@types/node": "^18.13.0", "@types/supertest": "^2.0.12", + "@types/tail": "^2.2.3", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", "eslint": "^8.34.0", @@ -2304,6 +2306,12 @@ "@types/superagent": "*" } }, + "node_modules/@types/tail": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/tail/-/tail-2.2.3.tgz", + "integrity": "sha512-Hnf352egOlDR4nVTaGX0t/kmTNXHMdovF2C7PVDFtHTHJPFmIspOI1b86vEOxU7SfCq/dADS7ptbqgG/WGGxnA==", + "dev": true + }, "node_modules/@types/yargs": { "version": "17.0.29", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", @@ -7728,6 +7736,14 @@ "node": ">=0.10" } }, + "node_modules/tail": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/tail/-/tail-2.2.6.tgz", + "integrity": "sha512-IQ6G4wK/t8VBauYiGPLx+d3fA5XjSVagjWV5SIYzvEvglbQjwEcukeYI68JOPpdydjxhZ9sIgzRlSmwSpphHyw==", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", diff --git a/package.json b/package.json index f593a95..6e012c4 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "@sentry/node": "^7.38.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", - "rxjs": "^7.8.0" + "rxjs": "^7.8.0", + "tail": "^2.2.6" }, "devDependencies": { "@nestjs/cli": "^9.2.0", @@ -41,6 +42,7 @@ "@types/jest": "^29.4.0", "@types/node": "^18.13.0", "@types/supertest": "^2.0.12", + "@types/tail": "^2.2.3", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", "eslint": "^8.34.0", diff --git a/src/app.controller.ts b/src/app.controller.ts index 7be9eab..5b5392a 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -10,7 +10,8 @@ import { DeploymentInfo } from './deployment-info.dto'; import * as fs from 'fs'; import { HttpService } from '@nestjs/axios'; import { ConfigService } from '@nestjs/config'; -import { catchError, map } from 'rxjs'; +import { catchError, mergeMap, Observable, Subject } from 'rxjs'; +import { Tail } from 'tail'; @Controller() export class AppController { @@ -37,11 +38,11 @@ export class AppController { } throw err; }), - map(() => this.writeCommandsToPipe(deploymentInfo)), + mergeMap(() => this.writeCommandsToPipe(deploymentInfo)), ); } - private writeCommandsToPipe(deploymentInfo: DeploymentInfo) { + private writeCommandsToPipe(deploymentInfo: DeploymentInfo): Observable { console.log('info', deploymentInfo); if ( @@ -59,6 +60,26 @@ export class AppController { const ws = fs.createWriteStream('dist/assets/arg-pipe'); ws.write(args); ws.close(); - return { ok: true }; + return this.getResult(); + } + + private getResult() { + const result = new Subject(); + const tail = new Tail('dist/assets/log.txt'); + tail.on('line', (line: string) => { + console.log('processing line', line); + if (line.startsWith('ERROR')) { + const message = line.replace('ERROR ', ''); + result.error(new BadRequestException(message)); + result.complete(); + tail.unwatch(); + } else if (line.startsWith('DONE')) { + result.next({ ok: true }); + result.complete(); + tail.unwatch(); + } + }); + + return result.asObservable(); } }