import { Observable, Subject } from 'rxjs'; import { share } from 'rxjs/operators'; export class FileUploadItem { file: File; uploadTime: number; uploadingProgress$: Observable; private uploadingProgress: Subject; private uploadStartTime: number; private constructor(file: File) { this.file = file; } static fromFiles(files: File[]): FileUploadItem[] { const fileItems: FileUploadItem[] = []; for (const file of files) { fileItems.push(new FileUploadItem(file)); } return fileItems; } uploadStart(): Subject { this.uploadStartTime = new Date().getTime(); this.uploadingProgress = new Subject(); this.uploadingProgress$ = this.uploadingProgress .asObservable() .pipe(share()); return this.uploadingProgress; } uploadComplete() { const endTime = new Date().getTime(); this.uploadTime = endTime - this.uploadStartTime; this.uploadingProgress.complete(); } }