2024-01-31 17:12:01 +01:00
|
|
|
import { Injectable } from '@angular/core';
|
|
|
|
|
import { ok, err, Result } from 'neverthrow';
|
|
|
|
|
import { ObjectMergeNotification } from 'src/app/services/socket-connection-mcr.service';
|
|
|
|
|
import { CMAPIService } from "src/app/shared/repository/CMAPI/cmapi.service"
|
2024-02-09 09:10:50 +01:00
|
|
|
import { DomSanitizer } from '@angular/platform-browser';
|
2024-02-07 16:45:53 +01:00
|
|
|
|
2024-02-09 10:33:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
|
|
|
|
|
export enum UploadError {
|
|
|
|
|
noConnection = 'noConnection',
|
|
|
|
|
slow = 'slow'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export type IOUploadError = "noConnection" | "slow"
|
|
|
|
|
|
2024-01-31 17:12:01 +01:00
|
|
|
@Injectable({
|
|
|
|
|
providedIn: 'root'
|
|
|
|
|
})
|
|
|
|
|
export class UploadStreamingService {
|
2024-02-09 09:10:50 +01:00
|
|
|
constructor(
|
|
|
|
|
private CMAPIService: CMAPIService,
|
|
|
|
|
private sanitizer: DomSanitizer
|
|
|
|
|
) {
|
|
|
|
|
window["sanitizer"] = this.sanitizer
|
|
|
|
|
}
|
2024-01-31 17:12:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class UploadFileUseCase {
|
|
|
|
|
CMAPIService: CMAPIService = window["CMAPIAPIRepository"]
|
|
|
|
|
constructor() {}
|
2024-02-07 16:45:53 +01:00
|
|
|
async execute(PublicationAttachmentEntity: PublicationAttachmentEntity): Promise<Result<true, IOUploadError >> {
|
2024-01-31 17:12:01 +01:00
|
|
|
return new Promise(async (resolve, reject) => {
|
|
|
|
|
|
|
|
|
|
let path: string;
|
|
|
|
|
const length = PublicationAttachmentEntity.chucksManager.chunks.totalChunks.toString()
|
|
|
|
|
|
|
|
|
|
const readAndUploadChunk = async(index: number) => {
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
const base64 = await PublicationAttachmentEntity.chucksManager.chunks.getChunks(index)
|
2024-01-31 17:12:01 +01:00
|
|
|
|
|
|
|
|
|
2024-02-08 10:14:21 +01:00
|
|
|
const uploadRequest = this.CMAPIService.FileContent({length, path: PublicationAttachmentEntity.chucksManager.path, index, base64})
|
2024-02-07 16:45:53 +01:00
|
|
|
|
|
|
|
|
uploadRequest.then((uploadRequest) => {
|
|
|
|
|
if(uploadRequest.isOk()) {
|
|
|
|
|
PublicationAttachmentEntity.chucksManager.setResponse(index, uploadRequest)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return uploadRequest;
|
2024-01-31 17:12:01 +01:00
|
|
|
}
|
|
|
|
|
|
2024-02-08 10:14:21 +01:00
|
|
|
if(!PublicationAttachmentEntity.chucksManager.hasPath()) {
|
|
|
|
|
const guidRequest = await this.CMAPIService.RequestUpload()
|
|
|
|
|
|
|
|
|
|
if(guidRequest.isOk()) {
|
|
|
|
|
path = guidRequest.value+".mp4"
|
|
|
|
|
PublicationAttachmentEntity.chucksManager.setPath(path)
|
|
|
|
|
} else {
|
|
|
|
|
const pingRequest = await this.CMAPIService.ping()
|
|
|
|
|
if( pingRequest.isErr()) {
|
|
|
|
|
return resolve(err(UploadError.noConnection))
|
|
|
|
|
} else {
|
|
|
|
|
return resolve(err(UploadError.slow))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-02-07 16:45:53 +01:00
|
|
|
|
2024-01-31 17:12:01 +01:00
|
|
|
const allRequest: Promise<any>[] = []
|
|
|
|
|
let connection = true
|
2024-02-07 16:45:53 +01:00
|
|
|
let errorMessage: UploadError.noConnection | UploadError.slow
|
2024-01-31 17:12:01 +01:00
|
|
|
|
2024-02-15 23:18:51 +01:00
|
|
|
for (let index = 1; ( (index <= PublicationAttachmentEntity.chucksManager.chunks.totalChunks) && connection ); index++) {
|
2024-01-31 17:12:01 +01:00
|
|
|
const needUpload = PublicationAttachmentEntity.chucksManager.needToUploadChunkIndex(index)
|
|
|
|
|
|
|
|
|
|
if(needUpload) {
|
|
|
|
|
|
|
|
|
|
const request = readAndUploadChunk(index).then(async(uploadRequest) => {
|
2024-02-07 16:45:53 +01:00
|
|
|
|
2024-02-15 23:18:51 +01:00
|
|
|
if(uploadRequest.isErr()) {
|
|
|
|
|
connection = false
|
|
|
|
|
const pingRequest = await this.CMAPIService.ping()
|
|
|
|
|
if( pingRequest.isErr()) {
|
|
|
|
|
errorMessage = UploadError.noConnection
|
|
|
|
|
} else {
|
|
|
|
|
errorMessage = UploadError.slow
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-31 17:12:01 +01:00
|
|
|
})
|
|
|
|
|
allRequest.push(request)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
await Promise.all(allRequest)
|
2024-01-31 17:12:01 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
if(!connection) {
|
|
|
|
|
return resolve(err(errorMessage))
|
2024-02-02 10:50:20 +01:00
|
|
|
} else {
|
2024-02-07 16:45:53 +01:00
|
|
|
return resolve(ok(true))
|
2024-01-31 17:12:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class PublicationAttachmentEntity {
|
|
|
|
|
url: string
|
|
|
|
|
FileExtension: string
|
|
|
|
|
FileType: 'image' | 'video'
|
|
|
|
|
OriginalFileName: string
|
|
|
|
|
blobFile?: File
|
|
|
|
|
toUpload = false;
|
|
|
|
|
chucksManager : ChucksManager
|
|
|
|
|
Base64: string
|
|
|
|
|
|
|
|
|
|
constructor({base64, extension, blobFile, OriginalFileName, FileType}:PublicationAttachmentEntityParams) {
|
|
|
|
|
this.Base64 = base64;
|
|
|
|
|
this.FileExtension = extension;
|
|
|
|
|
this.blobFile = blobFile
|
|
|
|
|
this.OriginalFileName = OriginalFileName
|
|
|
|
|
this.FileType = FileType
|
|
|
|
|
|
|
|
|
|
this.fixFileBase64();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fixFileBase64() {
|
2024-02-09 10:57:41 +01:00
|
|
|
const sanitizer : DomSanitizer = window["sanitizer"]
|
2024-02-09 09:10:50 +01:00
|
|
|
|
2024-01-31 17:12:01 +01:00
|
|
|
if(this.FileType == 'image' ) {
|
|
|
|
|
if(!this.Base64.startsWith('data:')) {
|
|
|
|
|
this.url = 'data:image/jpg;base64,' + this.Base64
|
2024-02-09 10:57:41 +01:00
|
|
|
// this.url = sanitizer.bypassSecurityTrustUrl('data:image/jpg;base64,' + this.Base64) as any
|
2024-01-31 17:12:01 +01:00
|
|
|
} else {
|
|
|
|
|
this.url = this.Base64
|
|
|
|
|
}
|
|
|
|
|
} else if (this.FileType == 'video' ) {
|
|
|
|
|
if(!this.Base64.startsWith('data:') && !this.Base64.startsWith('http')) {
|
|
|
|
|
this.url = 'data:video/mp4;base64,' + this.Base64
|
2024-02-09 10:57:41 +01:00
|
|
|
// this.url = sanitizer.bypassSecurityTrustUrl('data:video/mp4;base64,' + this.Base64) as any
|
2024-01-31 17:12:01 +01:00
|
|
|
} else {
|
|
|
|
|
this.url = this.Base64
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
needUpload() {
|
|
|
|
|
this.toUpload = true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setChunkManger (chunks: Chunks) {
|
|
|
|
|
this.chucksManager = new ChucksManager({chunks})
|
|
|
|
|
}
|
|
|
|
|
get hasChunkManger() {
|
|
|
|
|
return this.chucksManager?.chunks
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get hasChunkManager() {
|
|
|
|
|
return this.chucksManager != null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface IPublicationFormModelEntity {
|
|
|
|
|
DateIndex: any
|
|
|
|
|
DocumentId: any
|
|
|
|
|
ProcessId: any
|
|
|
|
|
Title: any
|
|
|
|
|
Message: any
|
|
|
|
|
DatePublication: any
|
|
|
|
|
Files: PublicationAttachmentEntity[]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface PublicationAttachmentEntityParams {
|
|
|
|
|
base64: string,
|
|
|
|
|
blobFile?: File
|
|
|
|
|
extension: string,
|
|
|
|
|
OriginalFileName: string,
|
|
|
|
|
FileType: 'image' | 'video'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class PublicationFormModel implements IPublicationFormModelEntity {
|
|
|
|
|
constructor() {}
|
|
|
|
|
DateIndex: any;
|
|
|
|
|
DocumentId: any;
|
|
|
|
|
ProcessId: any;
|
|
|
|
|
Title: any;
|
|
|
|
|
Message: any;
|
|
|
|
|
DatePublication: any;
|
|
|
|
|
OriginalFileName: string;
|
|
|
|
|
Files: PublicationAttachmentEntity[];
|
|
|
|
|
|
|
|
|
|
hasSet = false
|
|
|
|
|
|
|
|
|
|
setData(data: IPublicationFormModelEntity) {
|
|
|
|
|
if(!this.hasSet) {
|
|
|
|
|
Object.assign(this, data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.hasSet = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class PublicationFormMV {
|
|
|
|
|
|
|
|
|
|
private UploadFileUseCase = new UploadFileUseCase()
|
|
|
|
|
private form = new PublicationFormModel()
|
2024-02-09 10:33:53 +01:00
|
|
|
ObjectMergeNotification = new ObjectMergeNotification()
|
2024-02-07 16:45:53 +01:00
|
|
|
|
|
|
|
|
constructor() {
|
2024-02-09 10:33:53 +01:00
|
|
|
// this.ObjectMergeNotification.connect();
|
2024-02-07 16:45:53 +01:00
|
|
|
}
|
2024-01-31 17:12:01 +01:00
|
|
|
|
|
|
|
|
setDataToFrom(data: IPublicationFormModelEntity) {
|
|
|
|
|
this.form.setData(data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private getVideoFiles() {
|
|
|
|
|
return this.form.Files.filter( x => x.FileType == 'video')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private upload(PublicationAttachmentEntity: PublicationAttachmentEntity) {
|
|
|
|
|
|
|
|
|
|
return new Promise(async (resolve, reject)=> {
|
|
|
|
|
|
|
|
|
|
if(!PublicationAttachmentEntity.hasChunkManger) {
|
|
|
|
|
const fileBlob = PublicationAttachmentEntity.blobFile;
|
2024-02-09 11:26:33 +01:00
|
|
|
const fileChunks = new Chunks({chunkSize: 40 })
|
2024-01-31 17:12:01 +01:00
|
|
|
fileChunks.setFile(fileBlob)
|
|
|
|
|
|
|
|
|
|
PublicationAttachmentEntity.setChunkManger(fileChunks)
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
} else if(PublicationAttachmentEntity.chucksManager.doneUpload) {
|
|
|
|
|
return resolve(true)
|
2024-01-31 17:12:01 +01:00
|
|
|
}
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
let attemp = 0;
|
|
|
|
|
let result: Result<true, IOUploadError>
|
|
|
|
|
|
2024-01-31 17:12:01 +01:00
|
|
|
if( PublicationAttachmentEntity.chucksManager.isUploading == false) {
|
2024-02-02 10:50:20 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
do {
|
|
|
|
|
attemp++
|
|
|
|
|
|
|
|
|
|
PublicationAttachmentEntity.chucksManager.clearManualRetry()
|
|
|
|
|
PublicationAttachmentEntity.chucksManager.setUploading()
|
|
|
|
|
result = await this.UploadFileUseCase.execute(PublicationAttachmentEntity)
|
|
|
|
|
PublicationAttachmentEntity.chucksManager.clearUploading()
|
|
|
|
|
|
|
|
|
|
} while (attemp<3 && result.isErr() && result?.error == 'slow')
|
|
|
|
|
|
2024-01-31 17:12:01 +01:00
|
|
|
|
|
|
|
|
if(result.isErr()) {
|
2024-02-15 23:35:12 +01:00
|
|
|
PublicationAttachmentEntity.chucksManager.setManualRetry()
|
2024-02-07 16:45:53 +01:00
|
|
|
resolve(false)
|
2024-02-02 10:50:20 +01:00
|
|
|
} else {
|
2024-02-09 11:26:33 +01:00
|
|
|
const guid = PublicationAttachmentEntity.chucksManager.path
|
|
|
|
|
this.ObjectMergeNotification.subscribe(guid, (data) => {
|
|
|
|
|
PublicationAttachmentEntity
|
|
|
|
|
resolve(true)
|
|
|
|
|
})
|
|
|
|
|
PublicationAttachmentEntity.chucksManager.doneChunkUpload()
|
|
|
|
|
this.ObjectMergeNotification.socket.commit(PublicationAttachmentEntity.chucksManager.path)
|
2024-02-07 16:45:53 +01:00
|
|
|
resolve(true)
|
2024-01-31 17:12:01 +01:00
|
|
|
}
|
2024-02-07 16:45:53 +01:00
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
} else {
|
2024-02-07 16:45:53 +01:00
|
|
|
|
2024-01-31 17:12:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uploadVideosFiles(): Promise<Boolean> {
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
return new Promise((resolve, reject) => {
|
2024-01-31 17:12:01 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// this.ObjectMergeNotification.socket.registerWhenConnected(() => {
|
|
|
|
|
const videosFiles = this.getVideoFiles()
|
2024-01-31 17:12:01 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
const videosFilesToUploads = videosFiles.filter( e => e.FileType == "video")
|
2024-01-31 17:12:01 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
const Promises: Promise<any>[] = []
|
2024-01-31 17:12:01 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
for(const file of videosFilesToUploads) {
|
|
|
|
|
const promise = this.upload(file)
|
|
|
|
|
Promises.push(promise)
|
2024-01-31 17:12:01 +01:00
|
|
|
}
|
2024-02-07 16:45:53 +01:00
|
|
|
|
|
|
|
|
// Use Promise.all to wait for all promises to resolve
|
|
|
|
|
Promise.all(Promises)
|
|
|
|
|
.then((results) => {
|
|
|
|
|
// Check if every promise resolved successfully
|
|
|
|
|
const allPromisesResolvedSuccessfully = results.every((result) => result == true);
|
|
|
|
|
|
|
|
|
|
if (allPromisesResolvedSuccessfully) {
|
|
|
|
|
console.log('All promises resolved successfully.');
|
|
|
|
|
resolve(true)
|
|
|
|
|
} else {
|
|
|
|
|
resolve(false)
|
|
|
|
|
console.log('Some promises failed to resolve successfully.');
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch((error) => {
|
|
|
|
|
resolve(false)
|
|
|
|
|
console.error('An error occurred while resolving promises:', error);
|
|
|
|
|
});
|
|
|
|
|
//})
|
|
|
|
|
|
2024-01-31 17:12:01 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export class Chunks {
|
|
|
|
|
|
|
|
|
|
chunkSize: number
|
|
|
|
|
private file: File
|
|
|
|
|
|
|
|
|
|
constructor({chunkSize}) {
|
|
|
|
|
this.chunkSize = chunkSize * 1024
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get totalChunks () {
|
|
|
|
|
return Math.ceil(this.file.size / this.chunkSize);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
setFile(file: File) {
|
|
|
|
|
this.file = file
|
|
|
|
|
}
|
2024-01-31 17:12:01 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// Function to read a chunk of the file
|
|
|
|
|
readChunk(start: number, end: number): any {
|
2024-01-31 17:12:01 +01:00
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
const reader = new FileReader();
|
2024-02-07 16:45:53 +01:00
|
|
|
reader.onload = (event: any) => resolve(event.target.result.split(',')[1]);
|
|
|
|
|
reader.onerror = (error) => reject(error);
|
|
|
|
|
reader.readAsDataURL(this.file.slice(start, end));
|
2024-01-31 17:12:01 +01:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
async getChunks(i: number): Promise<string> {
|
2024-01-31 17:12:01 +01:00
|
|
|
i--
|
|
|
|
|
if(i < this.totalChunks) {
|
|
|
|
|
const start = i * this.chunkSize;
|
|
|
|
|
const end = Math.min(start + this.chunkSize, this.file.size);
|
|
|
|
|
const chunk = await this.readChunk(start, end);
|
|
|
|
|
|
|
|
|
|
return chunk
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface IUploadResponse {
|
|
|
|
|
result: Result<any, Error>
|
|
|
|
|
attemp: number
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class ChucksManager {
|
|
|
|
|
chunks: Chunks
|
|
|
|
|
uploads: {[key: string]: IUploadResponse } = {}
|
|
|
|
|
path: string = undefined
|
2024-02-01 11:44:56 +01:00
|
|
|
uploadPercentage: string = "1%"
|
2024-01-31 17:12:01 +01:00
|
|
|
merging = false
|
|
|
|
|
onSetPath: Function[] = []
|
|
|
|
|
onSetLastChunk: Function[] = []
|
|
|
|
|
contentReady = false
|
|
|
|
|
manualRetry = false
|
|
|
|
|
isUploading = false
|
|
|
|
|
subscribeToUseCaseResponse: Function[] = []
|
|
|
|
|
|
|
|
|
|
getUploadPercentage() {
|
|
|
|
|
return this.uploadPercentage
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get uploadsCount() {
|
|
|
|
|
return Object.entries(this.uploads).length
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get uploadWithSuccessCount() {
|
|
|
|
|
const uploadWithSuccess = Object.entries(this.uploads).filter(([index, data])=> data.result.isOk())
|
|
|
|
|
return uploadWithSuccess.length
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get doneUpload() {
|
|
|
|
|
return this.chunks.totalChunks == this.uploadWithSuccessCount
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uploadFunc: Function
|
|
|
|
|
constructor({chunks}) {
|
|
|
|
|
this.chunks = chunks
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
calculatePercentage(): number {
|
|
|
|
|
/**
|
|
|
|
|
* Calculate the percentage based on the total and current values.
|
|
|
|
|
*
|
|
|
|
|
* @param total - The total value.
|
|
|
|
|
* @param current - The current value.
|
|
|
|
|
* @returns The percentage calculated as (current / total) * 100.
|
|
|
|
|
*/
|
|
|
|
|
const total = this.chunks.totalChunks
|
|
|
|
|
const current = this.uploadWithSuccessCount
|
|
|
|
|
|
|
|
|
|
if (total === 0) {
|
|
|
|
|
return 0; // To avoid division by zero error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const percentage: number = (current / total) * 100;
|
|
|
|
|
return percentage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setManualRetry() {
|
|
|
|
|
this.manualRetry = true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clearManualRetry() {
|
|
|
|
|
this.manualRetry = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setUploading() {
|
|
|
|
|
this.isUploading = true
|
|
|
|
|
}
|
|
|
|
|
clearUploading() {
|
|
|
|
|
this.isUploading = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setPercentage() {
|
|
|
|
|
const percentage: number = this.calculatePercentage()
|
|
|
|
|
console.log({percentage})
|
|
|
|
|
this.uploadPercentage = percentage.toString()+"%"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setPath(path: string) {
|
|
|
|
|
this.path = path
|
|
|
|
|
this.onSetPath.forEach(callback => callback());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
registerOnSetPath(a: Function) {
|
|
|
|
|
this.onSetPath.push(a)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
registerOnLastChunk(a: Function) {
|
2024-02-09 10:33:53 +01:00
|
|
|
this.onSetLastChunk.push(a)
|
2024-01-31 17:12:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
registerToUseCaseResponse(a: Function) {
|
|
|
|
|
this.subscribeToUseCaseResponse.push(a)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hasPath() {
|
|
|
|
|
return this.path != undefined
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
isIndexRegistered(index) {
|
|
|
|
|
if(!this.uploads[index]) {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
needToUploadChunkIndex(index) {
|
|
|
|
|
return !this.uploads?.[index]?.result?.isOk()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setResponse(index, UploadResponse) {
|
|
|
|
|
|
|
|
|
|
if(!this.isIndexRegistered(index)) {
|
|
|
|
|
this.uploads[index] = {
|
|
|
|
|
attemp: 1,
|
|
|
|
|
result: UploadResponse
|
|
|
|
|
}
|
|
|
|
|
console.log({UploadResponse})
|
|
|
|
|
} else {
|
|
|
|
|
this.uploads[index].attemp++;
|
|
|
|
|
this.uploads[index].result = UploadResponse
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.setPercentage()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
doneChunkUpload() {
|
|
|
|
|
this.merging = true
|
|
|
|
|
this.onSetLastChunk.forEach(callback => callback());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
contentSetReady() {
|
|
|
|
|
this.merging = false
|
|
|
|
|
this.contentReady = true
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-02-07 16:45:53 +01:00
|
|
|
|