UNPKG

dynamic-display-shared

Version:

A library for dynamic view

137 lines 19.4 kB
import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; export class AzurestorageService { constructor(http) { this.http = http; } generateBlobUrl(params, filename, useAzureStorageEmulator = false, azureStorageEmulatorBaseUrl = '') { const url = useAzureStorageEmulator ? azureStorageEmulatorBaseUrl : `https://${params.storageAccount}.blob.core.windows.net`; return `${url}/${params.containerName}/${filename}`; } uploadFileInBlocks(reader, state) { if (!state.cancelled) { if (state.totalBytesRemaining > 0) { const fileContent = state.file.slice(state.currentFilePointer, state.currentFilePointer + state.maxBlockSize); const blockId = state.blockIdPrefix + this.prependZeros(state.blockIds.length, 6); state.blockIds.push(btoa(blockId)); reader.readAsArrayBuffer(fileContent); state.currentFilePointer += state.maxBlockSize; state.totalBytesRemaining -= state.maxBlockSize; if (state.totalBytesRemaining < state.maxBlockSize) { state.maxBlockSize = state.totalBytesRemaining; } } else { this.commitBlockList(state); } } } commitBlockList(state) { const uri = state.fileUrl + '&comp=blocklist'; const headers = new HttpHeaders({ 'x-ms-blob-content-type': state.file.type }); let requestBody = '<?xml version=\'1.0\' encoding=\'utf-8\'?><BlockList>'; for (let i = 0; i < state.blockIds.length; i++) { requestBody += '<Latest>' + state.blockIds[i] + '</Latest>'; } requestBody += '</BlockList>'; this.http.put(uri, requestBody, { headers, responseType: 'text' }) .subscribe(elem => { if (state.complete) { state.complete(); } }, err => { console.log({ error: err }); if (state.error) { state.error(err); } }); } initializeState(config) { let blockSize = AzurestorageService.DefaultBlockSize; if (config.blockSize) { blockSize = config.blockSize; } let maxBlockSize = blockSize; let numberOfBlocks = 1; const file = config.file; const fileSize = file.size; if (fileSize < blockSize) { maxBlockSize = fileSize; } if (fileSize % maxBlockSize === 0) { numberOfBlocks = fileSize / maxBlockSize; } else { numberOfBlocks = fileSize / maxBlockSize + 1; } return { maxBlockSize, numberOfBlocks, totalBytesRemaining: fileSize, currentFilePointer: 0, blockIds: new Array(), blockIdPrefix: 'block-', bytesUploaded: 0, submitUri: null, file, baseUrl: config.baseUrl, sasToken: config.sasToken, fileUrl: `${config.baseUrl}?${config.sasToken}`, progress: config.progress, complete: config.complete, error: config.error, cancelled: false }; } upload(config) { const state = this.initializeState(config); const reader = new FileReader(); reader.onloadend = (evt) => { if (evt.target.readyState === 2 && !state.cancelled) { const uri = state.fileUrl + '&comp=block&blockid=' + state.blockIds[state.blockIds.length - 1]; const requestData = evt.target.result; const requestData2 = new Uint8Array(evt.target.result); const headers = new HttpHeaders({ 'x-ms-blob-type': 'BlockBlob', 'Content-Type': 'application/octet-stream' }); this.http.put(uri, requestData, { headers, responseType: 'text' }) .subscribe(elem => { state.bytesUploaded += requestData2.length; const percentComplete = Math.round((state.bytesUploaded / state.file.size) * 1000) / 10; if (state.progress) { state.progress(percentComplete); } this.uploadFileInBlocks(reader, state); }, err => { console.log({ error: err }); if (state.error) { state.error(err); } }); } }; this.uploadFileInBlocks(reader, state); return { cancel: () => { state.cancelled = true; } }; } prependZeros(num, length) { let str = '' + num; while (str.length < length) { str = '0' + str; } return str; } } AzurestorageService.DefaultBlockSize = 1024 * 500; AzurestorageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: AzurestorageService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); AzurestorageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: AzurestorageService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: AzurestorageService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp1cmUtc3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHluYW1pYy1kaXNwbGF5LXNoYXJlZC9zcmMvbGliL3NoYXJlZC9kb2N1bWVudHMvYXp1cmUtc3RvcmFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBTy9ELE1BQU0sT0FBTyxtQkFBbUI7SUFFOUIsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUFJLENBQUM7SUFDekMsZUFBZSxDQUNiLE1BQW9CLEVBQ3BCLFFBQWdCLEVBQ2hCLHVCQUF1QixHQUFHLEtBQUssRUFDL0IsMkJBQTJCLEdBQUcsRUFBRTtRQUNoQyxNQUFNLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLFdBQVcsTUFBTSxDQUFDLGNBQWMsd0JBQXdCLENBQUM7UUFDN0gsT0FBTyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFDTyxrQkFBa0IsQ0FBQyxNQUFrQixFQUFFLEtBQVU7UUFDdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDcEIsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDOUcsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJ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R0FBRyxHQUFHLENBQUM7UUFDbkIsT0FBTyxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRTtZQUMxQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztTQUNqQjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUFqSU0sb0NBQWdCLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztnSEFEMUIsbUJBQW1CO29IQUFuQixtQkFBbUIsY0FGbEIsTUFBTTsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgVXBsb2FkQ29uZmlnLCBVcGxvYWRQYXJhbXMgfSBmcm9tICcuL2F6dXJlLWZpbGUtdXBsb2FkLWJsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBenVyZXN0b3JhZ2VTZXJ2aWNlIHtcclxuICBzdGF0aWMgRGVmYXVsdEJsb2NrU2l6ZSA9IDEwMjQgKiA1MDA7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7IH1cclxuICBnZW5lcmF0ZUJsb2JVcmwoXHJcbiAgICBwYXJhbXM6IFVwbG9hZFBhcmFtcyxcclxuICAgIGZpbGVuYW1lOiBzdHJpbmcsXHJcbiAgICB1c2VBenVyZVN0b3JhZ2VFbXVsYXRvciA9IGZhbHNlLFxyXG4gICAgYXp1cmVTdG9yYWdlRW11bGF0b3JCYXNlVXJsID0gJycpIHtcclxuICAgIGNvbnN0IHVybCA9IHVzZUF6dXJlU3RvcmFnZUVtdWxhdG9yID8gYXp1cmVTdG9yYWdlRW11bGF0b3JCYXNlVXJsIDogYGh0dHBzOi8vJHtwYXJhbXMuc3RvcmFnZUFjY291bnR9LmJsb2IuY29yZS53aW5kb3dzLm5ldGA7XHJcbiAgICByZXR1cm4gYCR7dXJsfS8ke3BhcmFtcy5jb250YWluZXJOYW1lfS8ke2ZpbGVuYW1lfWA7XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBsb2FkRmlsZUluQmxvY2tzKHJlYWRlcjogRmlsZVJlYWRlciwgc3RhdGU6IGFueSkge1xyXG4gICAgaWYgKCFzdGF0ZS5jYW5jZWxsZWQpIHtcclxuICAgICAgaWYgKHN0YXRlLnRvdGFsQnl0ZXNSZW1haW5pbmcgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBzdGF0ZS5maWxlLnNsaWNlKHN0YXRlLmN1cnJlbnRGaWxlUG9pbnRlciwgc3RhdGUuY3VycmVudEZpbGVQb2ludGVyICsgc3RhdGUubWF4QmxvY2tTaXplKTtcclxuICAgICAgICBjb25zdCBibG9ja0lkID0gc3RhdGUuYmxvY2tJZFByZWZpeCArIHRoaXMucHJlcGVuZFplcm9zKHN0YXRlLmJsb2NrSWRzLmxlbmd0aCwgNik7XHJcbiAgICAgICAgc3RhdGUuYmxvY2tJZHMucHVzaChidG9hKGJsb2NrSWQpKTtcclxuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZUNvbnRlbnQpO1xyXG4gICAgICAgIHN0YXRlLmN1cnJlbnRGaWxlUG9pbnRlciArPSBzdGF0ZS5tYXhCbG9ja1NpemU7XHJcbiAgICAgICAgc3RhdGUudG90YWxCeXRlc1JlbWFpbmluZyAtPSBzdGF0ZS5tYXhCbG9ja1NpemU7XHJcbiAgICAgICAgaWYgKHN0YXRlLnRvdGFsQnl0ZXNSZW1haW5pbmcgPCBzdGF0ZS5tYXhCbG9ja1NpemUpIHtcclxuICAgICAgICAgIHN0YXRlLm1heEJsb2NrU2l6ZSA9IHN0YXRlLnRvdGFsQnl0ZXNSZW1haW5pbmc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29tbWl0QmxvY2tMaXN0KHN0YXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGNvbW1pdEJsb2NrTGlzdChzdGF0ZTogeyBmaWxlVXJsOiBzdHJpbmc7IGZpbGU6IHsgdHlwZTogYW55OyB9OyBibG9ja0lkczogc3RyaW5nIHwgYW55W107IGNvbXBsZXRlOiAoKSA9PiB2b2lkOyBlcnJvcjogKGFyZzA6IGFueSkgPT4gdm9pZDsgfSkge1xyXG4gICAgY29uc3QgdXJpID0gc3RhdGUuZmlsZVVybCArICcmY29tcD1ibG9ja2xpc3QnO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7ICd4LW1zLWJsb2ItY29udGVudC10eXBlJzogc3RhdGUuZmlsZS50eXBlIH0pO1xyXG4gICAgbGV0IHJlcXVlc3RCb2R5ID0gJzw/eG1sIHZlcnNpb249XFwnMS4wXFwnIGVuY29kaW5nPVxcJ3V0Zi04XFwnPz48QmxvY2tMaXN0Pic7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLmJsb2NrSWRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlcXVlc3RCb2R5ICs9ICc8TGF0ZXN0PicgKyBzdGF0ZS5ibG9ja0lkc1tpXSArICc8L0xhdGVzdD4nO1xyXG4gICAgfVxyXG4gICAgcmVxdWVzdEJvZHkgKz0gJzwvQmxvY2tMaXN0Pic7XHJcblxyXG4gICAgdGhpcy5odHRwLnB1dCh1cmksIHJlcXVlc3RCb2R5LCB7IGhlYWRlcnMsIHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pXHJcbiAgICAgIC5zdWJzY3JpYmUoZWxlbSA9PiB7XHJcbiAgICAgICAgaWYgKHN0YXRlLmNvbXBsZXRlKSB7XHJcbiAgICAgICAgICBzdGF0ZS5jb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyh7IGVycm9yOiBlcnIgfSk7XHJcbiAgICAgICAgaWYgKHN0YXRlLmVycm9yKSB7XHJcbiAgICAgICAgICBzdGF0ZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVN0YXRlKGNvbmZpZzogVXBsb2FkQ29uZmlnKSB7XHJcbiAgICBsZXQgYmxvY2tTaXplID0gQXp1cmVzdG9yYWdlU2VydmljZS5EZWZhdWx0QmxvY2tTaXplO1xyXG4gICAgaWYgKGNvbmZpZy5ibG9ja1NpemUpIHtcclxuICAgICAgYmxvY2tTaXplID0gY29uZmlnLmJsb2NrU2l6ZTtcclxuICAgIH1cclxuICAgIGxldCBtYXhCbG9ja1NpemUgPSBibG9ja1NpemU7XHJcbiAgICBsZXQgbnVtYmVyT2ZCbG9ja3MgPSAxO1xyXG4gICAgY29uc3QgZmlsZSA9IGNvbmZpZy5maWxlO1xyXG4gICAgY29uc3QgZmlsZVNpemUgPSBmaWxlLnNpemU7XHJcbiAgICBpZiAoZmlsZVNpemUgPCBibG9ja1NpemUpIHtcclxuICAgICAgbWF4QmxvY2tTaXplID0gZmlsZVNpemU7XHJcbiAgICB9XHJcbiAgICBpZiAoZmlsZVNpemUgJSBtYXhCbG9ja1NpemUgPT09IDApIHtcclxuICAgICAgbnVtYmVyT2ZCbG9ja3MgPSBmaWxlU2l6ZSAvIG1heEJsb2NrU2l6ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG51bWJlck9mQmxvY2tzID0gZmlsZVNpemUgLyBtYXhCbG9ja1NpemUgKyAxO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbWF4QmxvY2tTaXplLCAvLyBFYWNoIGZpbGUgd2lsbCBiZSBzcGxpdCBpbiAyNTYgS0IuXHJcbiAgICAgIG51bWJlck9mQmxvY2tzLFxyXG4gICAgICB0b3RhbEJ5dGVzUmVtYWluaW5nOiBmaWxlU2l6ZSxcclxuICAgICAgY3VycmVudEZpbGVQb2ludGVyOiAwLFxyXG4gICAgICBibG9ja0lkczogbmV3IEFycmF5KCksXHJcbiAgICAgIGJsb2NrSWRQcmVmaXg6ICdibG9jay0nLFxyXG4gICAgICBieXRlc1VwbG9hZGVkOiAwLFxyXG4gICAgICBzdWJtaXRVcmk6IG51bGwsXHJcbiAgICAgIGZpbGUsXHJcbiAgICAgIGJhc2VVcmw6IGNvbmZpZy5iYXNlVXJsLFxyXG4gICAgICBzYXNUb2tlbjogY29uZmlnLnNhc1Rva2VuLFxyXG4gICAgICBmaWxlVXJsOiBgJHtjb25maWcuYmFzZVVybH0/JHtjb25maWcuc2FzVG9rZW59YCxcclxuICAgICAgcHJvZ3Jlc3M6IGNvbmZpZy5wcm9ncmVzcyxcclxuICAgICAgY29tcGxldGU6IGNvbmZpZy5jb21wbGV0ZSxcclxuICAgICAgZXJyb3I6IGNvbmZpZy5lcnJvcixcclxuICAgICAgY2FuY2VsbGVkOiBmYWxzZVxyXG4gICAgfTtcclxuICB9XHJcbiAgdXBsb2FkKGNvbmZpZzogVXBsb2FkQ29uZmlnKXtcclxuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmluaXRpYWxpemVTdGF0ZShjb25maWcpO1xyXG5cclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IChldnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChldnQudGFyZ2V0LnJlYWR5U3RhdGUgPT09IDIgJiYgIXN0YXRlLmNhbmNlbGxlZCkge1xyXG4gICAgICAgICAgY29uc3QgdXJpID0gc3RhdGUuZmlsZVVybCArICcmY29tcD1ibG9jayZibG9ja2lkPScgKyBzdGF0ZS5ibG9ja0lkc1tzdGF0ZS5ibG9ja0lkcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgIGNvbnN0IHJlcXVlc3REYXRhID0gZXZ0LnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgICBjb25zdCByZXF1ZXN0RGF0YTIgPSBuZXcgVWludDhBcnJheShldnQudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHsgJ3gtbXMtYmxvYi10eXBlJzogJ0Jsb2NrQmxvYicsICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KTtcclxuICAgICAgICAgIHRoaXMuaHR0cC5wdXQodXJpLCByZXF1ZXN0RGF0YSwgeyBoZWFkZXJzLCByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGVsZW0gPT4ge1xyXG4gICAgICAgICAgICAgIHN0YXRlLmJ5dGVzVXBsb2FkZWQgKz0gcmVxdWVzdERhdGEyLmxlbmd0aDtcclxuICAgICAgICAgICAgICBjb25zdCBwZXJjZW50Q29tcGxldGUgPSBNYXRoLnJvdW5kKChzdGF0ZS5ieXRlc1VwbG9hZGVkIC8gc3RhdGUuZmlsZS5zaXplKSAqIDEwMDApIC8gMTA7XHJcbiAgICAgICAgICAgICAgaWYgKHN0YXRlLnByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZS5wcm9ncmVzcyhwZXJjZW50Q29tcGxldGUpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlSW5CbG9ja3MocmVhZGVyLCBzdGF0ZSk7XHJcbiAgICAgICAgICAgIH0sIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coeyBlcnJvcjogZXJyIH0pO1xyXG4gICAgICAgICAgICAgIGlmIChzdGF0ZS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMudXBsb2FkRmlsZUluQmxvY2tzKHJlYWRlciwgc3RhdGUpO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjYW5jZWw6ICgpID0+IHtcclxuICAgICAgICAgIHN0YXRlLmNhbmNlbGxlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gIH1cclxuICBwcml2YXRlIHByZXBlbmRaZXJvcyhudW06IHN0cmluZywgbGVuZ3RoOiBudW1iZXIpIHtcclxuICAgIGxldCBzdHIgPSAnJyArIG51bTtcclxuICAgIHdoaWxlIChzdHIubGVuZ3RoIDwgbGVuZ3RoKSB7XHJcbiAgICAgIHN0ciA9ICcwJyArIHN0cjtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG59XHJcbiJdfQ==