From 231c971a92091e63155dcb0f0d67485f0a42de23 Mon Sep 17 00:00:00 2001 From: marknguyen1302 Date: Mon, 29 Jul 2024 15:04:53 +0700 Subject: [PATCH 1/3] fix: correct progress multi download --- .../download-manager.service.ts | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/cortex-js/src/infrastructure/services/download-manager/download-manager.service.ts b/cortex-js/src/infrastructure/services/download-manager/download-manager.service.ts index 64af5627e..7e84d6b7b 100644 --- a/cortex-js/src/infrastructure/services/download-manager/download-manager.service.ts +++ b/cortex-js/src/infrastructure/services/download-manager/download-manager.service.ts @@ -5,18 +5,20 @@ import { DownloadType, } from '@/domain/models/download.interface'; import { HttpService } from '@nestjs/axios'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Scope } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { Presets, SingleBar } from 'cli-progress'; import { createWriteStream } from 'node:fs'; import { basename } from 'node:path'; import { firstValueFrom } from 'rxjs'; -@Injectable() +const abortControllers: Record> = {}; + +@Injectable({ + scope: Scope.REQUEST, +}) export class DownloadManagerService { private allDownloadStates: DownloadState[] = []; - private abortControllers: Record> = - {}; constructor( private readonly httpService: HttpService, @@ -24,13 +26,13 @@ export class DownloadManagerService { ) {} async abortDownload(downloadId: string) { - if (!this.abortControllers[downloadId]) { + if (!abortControllers[downloadId]) { return; } - Object.keys(this.abortControllers[downloadId]).forEach((destination) => { - this.abortControllers[downloadId][destination].abort(); + Object.keys(abortControllers[downloadId]).forEach((destination) => { + abortControllers[downloadId][destination].abort(); }); - delete this.abortControllers[downloadId]; + delete abortControllers[downloadId]; this.allDownloadStates = this.allDownloadStates.filter( (downloadState) => downloadState.id !== downloadId, ); @@ -84,14 +86,14 @@ export class DownloadManagerService { }; this.allDownloadStates.push(downloadState); - this.abortControllers[downloadId] = {}; + abortControllers[downloadId] = {}; const callBack = async () => { // Await post processing callback await finishedCallback?.(); // Finished - update the current downloading states - delete this.abortControllers[downloadId]; + delete abortControllers[downloadId]; const currentDownloadState = this.allDownloadStates.find( (downloadState) => downloadState.id === downloadId, ); @@ -130,7 +132,7 @@ export class DownloadManagerService { ) { const controller = new AbortController(); // adding to abort controllers - this.abortControllers[downloadId][destination] = controller; + abortControllers[downloadId][destination] = controller; return new Promise(async (resolve, reject) => { const response = await firstValueFrom( this.httpService.get(url, { @@ -171,7 +173,7 @@ export class DownloadManagerService { writer.on('finish', () => { try { // delete the abort controller - delete this.abortControllers[downloadId][destination]; + delete abortControllers[downloadId][destination]; const currentDownloadState = this.allDownloadStates.find( (downloadState) => downloadState.id === downloadId, ); @@ -193,7 +195,7 @@ export class DownloadManagerService { writer.on('error', (error) => { try { - delete this.abortControllers[downloadId][destination]; + delete abortControllers[downloadId][destination]; const currentDownloadState = this.allDownloadStates.find( (downloadState) => downloadState.id === downloadId, ); From da42363ed3b7f8f1ae093eead3e42d384f80e217 Mon Sep 17 00:00:00 2001 From: marknguyen1302 Date: Mon, 29 Jul 2024 15:16:22 +0700 Subject: [PATCH 2/3] Revert "fix: correct progress multi download" This reverts commit 231c971a92091e63155dcb0f0d67485f0a42de23. --- .../download-manager.service.ts | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/cortex-js/src/infrastructure/services/download-manager/download-manager.service.ts b/cortex-js/src/infrastructure/services/download-manager/download-manager.service.ts index 7e84d6b7b..64af5627e 100644 --- a/cortex-js/src/infrastructure/services/download-manager/download-manager.service.ts +++ b/cortex-js/src/infrastructure/services/download-manager/download-manager.service.ts @@ -5,20 +5,18 @@ import { DownloadType, } from '@/domain/models/download.interface'; import { HttpService } from '@nestjs/axios'; -import { Injectable, Scope } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { Presets, SingleBar } from 'cli-progress'; import { createWriteStream } from 'node:fs'; import { basename } from 'node:path'; import { firstValueFrom } from 'rxjs'; -const abortControllers: Record> = {}; - -@Injectable({ - scope: Scope.REQUEST, -}) +@Injectable() export class DownloadManagerService { private allDownloadStates: DownloadState[] = []; + private abortControllers: Record> = + {}; constructor( private readonly httpService: HttpService, @@ -26,13 +24,13 @@ export class DownloadManagerService { ) {} async abortDownload(downloadId: string) { - if (!abortControllers[downloadId]) { + if (!this.abortControllers[downloadId]) { return; } - Object.keys(abortControllers[downloadId]).forEach((destination) => { - abortControllers[downloadId][destination].abort(); + Object.keys(this.abortControllers[downloadId]).forEach((destination) => { + this.abortControllers[downloadId][destination].abort(); }); - delete abortControllers[downloadId]; + delete this.abortControllers[downloadId]; this.allDownloadStates = this.allDownloadStates.filter( (downloadState) => downloadState.id !== downloadId, ); @@ -86,14 +84,14 @@ export class DownloadManagerService { }; this.allDownloadStates.push(downloadState); - abortControllers[downloadId] = {}; + this.abortControllers[downloadId] = {}; const callBack = async () => { // Await post processing callback await finishedCallback?.(); // Finished - update the current downloading states - delete abortControllers[downloadId]; + delete this.abortControllers[downloadId]; const currentDownloadState = this.allDownloadStates.find( (downloadState) => downloadState.id === downloadId, ); @@ -132,7 +130,7 @@ export class DownloadManagerService { ) { const controller = new AbortController(); // adding to abort controllers - abortControllers[downloadId][destination] = controller; + this.abortControllers[downloadId][destination] = controller; return new Promise(async (resolve, reject) => { const response = await firstValueFrom( this.httpService.get(url, { @@ -173,7 +171,7 @@ export class DownloadManagerService { writer.on('finish', () => { try { // delete the abort controller - delete abortControllers[downloadId][destination]; + delete this.abortControllers[downloadId][destination]; const currentDownloadState = this.allDownloadStates.find( (downloadState) => downloadState.id === downloadId, ); @@ -195,7 +193,7 @@ export class DownloadManagerService { writer.on('error', (error) => { try { - delete abortControllers[downloadId][destination]; + delete this.abortControllers[downloadId][destination]; const currentDownloadState = this.allDownloadStates.find( (downloadState) => downloadState.id === downloadId, ); From 0ffb4e04ae2d0c485dd34c7cf99ede3ac06ab965 Mon Sep 17 00:00:00 2001 From: marknguyen1302 Date: Mon, 29 Jul 2024 15:22:15 +0700 Subject: [PATCH 3/3] revert change --- cortex-js/src/utils/download-progress.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cortex-js/src/utils/download-progress.ts b/cortex-js/src/utils/download-progress.ts index 494ff0997..2341ac843 100644 --- a/cortex-js/src/utils/download-progress.ts +++ b/cortex-js/src/utils/download-progress.ts @@ -1,7 +1,7 @@ import { Presets, SingleBar } from "cli-progress"; import { Cortex } from "@cortexso/cortex.js"; import { exit, stdin, stdout } from 'node:process'; -import { DownloadType } from "@/domain/models/download.interface"; +import { DownloadState, DownloadType } from "@/domain/models/download.interface"; export const downloadProgress = async (cortex: Cortex, downloadId?: string, downloadType?: DownloadType) => { const response = await cortex.events.downloadEvent(); @@ -27,8 +27,9 @@ export const downloadProgress = async (cortex: Cortex, downloadId?: string, down for await (const stream of response) { if (stream.length) { - const data = stream[0] as any; - if (downloadId && data.id !== downloadId || downloadType && data.type !== downloadType) continue; + const data = (stream.find((data: any) => data.id === downloadId || !downloadId) as DownloadState | undefined); + if (!data) continue; + if (downloadType && data.type !== downloadType) continue; if (data.status === 'downloaded') break;