angular-material-datatransfer-lib
Version:
A HTML5 datatransfer UI for handling upload and download of multiple simultaneous files.
141 lines • 15.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/services/crypto.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable, NgZone } from '@angular/core';
import * as cryptoBrowserify from 'crypto-browserify';
import { HashTypeImplementation } from '../enums/hash-type.enum';
import { EncodingTypeImplementation } from '../enums/encoding-type.enum';
import { HashContainer, StreamHashContainer } from '../models/hash-container.model';
export class CryptoService {
/**
* @param {?} zone
*/
constructor(zone) {
this.zone = zone;
// hash 4MB at a time
this.STREAM_HASH_CHUNK_SIZE = 1024 * 1000 * 4;
this.HASH_TYPE_IMPLEMENTATION = HashTypeImplementation.CryptoBrowserify;
this.ENCODING_TYPE_IMPLEMENTATION = EncodingTypeImplementation.CryptoBrowserify;
// Performance remains unchanged by running the hash function outside of Angular.
// this.zone.runOutsideAngular(() => { }
}
/**
* @param {?} file
* @param {?} hashType
* @param {?} encodingType
* @param {?} inputEncodingType
* @return {?}
*/
createHashContainer(file, hashType, encodingType, inputEncodingType) {
/** @type {?} */
const container = new HashContainer(file, this.HASH_TYPE_IMPLEMENTATION, this.ENCODING_TYPE_IMPLEMENTATION, hashType, encodingType, inputEncodingType);
container.hash = cryptoBrowserify.createHash(container.hashTypeString);
container.reader.onload = (/**
* @param {?} event
* @return {?}
*/
function (event) {
container.hashString = container.hash.update(event.target.result, container.inputEncodingTypeString)
.digest(container.encodingTypeString);
container.endDate = new Date();
container.percent = 100;
}).bind(container);
container.doWork = (/**
* @return {?}
*/
function () {
container.reader.readAsBinaryString(container.file);
});
return container;
}
/**
* @param {?} file
* @param {?} hashType
* @param {?} encodingType
* @param {?} inputEncodingType
* @param {?} successCallback
* @param {?} errorCallback
* @return {?}
*/
createStreamHashContainer(file, hashType, encodingType, inputEncodingType, successCallback, errorCallback) {
/** @type {?} */
const container = new StreamHashContainer(file, this.HASH_TYPE_IMPLEMENTATION, this.ENCODING_TYPE_IMPLEMENTATION, hashType, encodingType, inputEncodingType);
container.chunkSize = this.STREAM_HASH_CHUNK_SIZE;
container.offset = 0;
container.hash = cryptoBrowserify.createHash(container.hashTypeString);
container.reader.onload = (/**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
const binary = event.target.result;
if (container.offset + container.chunkSize >= container.file.size) {
container.hash.end(binary, container.inputEncodingTypeString);
}
else {
container.hash.write(binary, container.inputEncodingTypeString);
}
container.offset += container.chunkSize;
container.doWork();
}).bind(container);
container.reader.onerror = (/**
* @param {?} event
* @return {?}
*/
function (event) {
errorCallback(event, container);
});
container.doWork = (/**
* @return {?}
*/
function () {
if (!container.isCancelled() && !container.isPaused()) {
if (container.offset > container.file.size) {
container.hashString = container.hash.read().toString(container.encodingTypeString);
container.endDate = new Date();
container.percent = 100;
successCallback(container);
return;
}
/** @type {?} */
const slice = container.file.slice(container.offset, container.offset + container.chunkSize);
container.reader.readAsBinaryString(slice);
container.percent = Math.round(container.offset / file.size * 100);
}
});
return container;
}
}
CryptoService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
CryptoService.ctorParameters = () => [
{ type: NgZone }
];
if (false) {
/**
* @type {?}
* @private
*/
CryptoService.prototype.STREAM_HASH_CHUNK_SIZE;
/**
* @type {?}
* @private
*/
CryptoService.prototype.HASH_TYPE_IMPLEMENTATION;
/**
* @type {?}
* @private
*/
CryptoService.prototype.ENCODING_TYPE_IMPLEMENTATION;
/**
* @type {?}
* @private
*/
CryptoService.prototype.zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLW1hdGVyaWFsLWRhdGF0cmFuc2Zlci1saWIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvY3J5cHRvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFZLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFnQixNQUFNLDZCQUE2QixDQUFDO0FBQ3ZGLE9BQU8sRUFBa0IsYUFBYSxFQUF3QixtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSTFILE1BQU0sT0FBTyxhQUFhOzs7O0lBT3RCLFlBQW9CLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFROztRQUpmLDJCQUFzQixHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLDZCQUF3QixHQUFHLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDO1FBQ25FLGlDQUE0QixHQUFHLDBCQUEwQixDQUFDLGdCQUFnQixDQUFDO1FBR3hGLGlGQUFpRjtRQUNqRix3Q0FBd0M7SUFDNUMsQ0FBQzs7Ozs7Ozs7SUFFTSxtQkFBbUIsQ0FBQyxJQUFVLEVBQUUsUUFBa0IsRUFBRSxZQUEwQixFQUMxRCxpQkFBK0I7O2NBRWhELFNBQVMsR0FBRyxJQUFJLGFBQWEsQ0FDL0IsSUFBSSxFQUNKLElBQUksQ0FBQyx3QkFBd0IsRUFDN0IsSUFBSSxDQUFDLDRCQUE0QixFQUNqQyxRQUFRLEVBQ1IsWUFBWSxFQUNaLGlCQUFpQixDQUFDO1FBRXRCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztR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Q1Y7O3NCQUVLLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztnQkFDNUYsU0FBUyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0MsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQzthQUN0RTtRQUNMLENBQUMsQ0FBQSxDQUFDO1FBRUYsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQzs7O1lBMUZKLFVBQVU7Ozs7WUFQVSxNQUFNOzs7Ozs7O0lBV3ZCLCtDQUEwRDs7Ozs7SUFDMUQsaURBQW9GOzs7OztJQUNwRixxREFBNEY7Ozs7O0lBRWhGLDZCQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBjcnlwdG9Ccm93c2VyaWZ5IGZyb20gJ2NyeXB0by1icm93c2VyaWZ5JztcclxuaW1wb3J0IHsgSGFzaFR5cGVJbXBsZW1lbnRhdGlvbiwgSGFzaFR5cGUgfSBmcm9tICcuLi9lbnVtcy9oYXNoLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IEVuY29kaW5nVHlwZUltcGxlbWVudGF0aW9uLCBFbmNvZGluZ1R5cGUgfSBmcm9tICcuLi9lbnVtcy9lbmNvZGluZy10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBJSGFzaENvbnRhaW5lciwgSGFzaENvbnRhaW5lciwgSVN0cmVhbUhhc2hDb250YWluZXIsIFN0cmVhbUhhc2hDb250YWluZXIgfSBmcm9tICcuLi9tb2RlbHMvaGFzaC1jb250YWluZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBGaWxlUmVhZGVyRXZlbnQgfSBmcm9tICcuLi9leHRlbnNpb25zL2ZpbGUtcmVhZGVyLmV4dGVuc2lvbic7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDcnlwdG9TZXJ2aWNlIHtcclxuXHJcbiAgICAvLyBoYXNoIDRNQiBhdCBhIHRpbWVcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgU1RSRUFNX0hBU0hfQ0hVTktfU0laRSA9IDEwMjQgKiAxMDAwICogNDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgSEFTSF9UWVBFX0lNUExFTUVOVEFUSU9OID0gSGFzaFR5cGVJbXBsZW1lbnRhdGlvbi5DcnlwdG9Ccm93c2VyaWZ5O1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBFTkNPRElOR19UWVBFX0lNUExFTUVOVEFUSU9OID0gRW5jb2RpbmdUeXBlSW1wbGVtZW50YXRpb24uQ3J5cHRvQnJvd3NlcmlmeTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xyXG4gICAgICAgIC8vIFBlcmZvcm1hbmNlIHJlbWFpbnMgdW5jaGFuZ2VkIGJ5IHJ1bm5pbmcgdGhlIGhhc2ggZnVuY3Rpb24gb3V0c2lkZSBvZiBBbmd1bGFyLlxyXG4gICAgICAgIC8vIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7IH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY3JlYXRlSGFzaENvbnRhaW5lcihmaWxlOiBGaWxlLCBoYXNoVHlwZTogSGFzaFR5cGUsIGVuY29kaW5nVHlwZTogRW5jb2RpbmdUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbmNvZGluZ1R5cGU6IEVuY29kaW5nVHlwZSk6IElIYXNoQ29udGFpbmVyIHtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gbmV3IEhhc2hDb250YWluZXIoXHJcbiAgICAgICAgICAgIGZpbGUsXHJcbiAgICAgICAgICAgIHRoaXMuSEFTSF9UWVBFX0lNUExFTUVOVEFUSU9OLFxyXG4gICAgICAgICAgICB0aGlzLkVOQ09ESU5HX1RZUEVfSU1QTEVNRU5UQVRJT04sXHJcbiAgICAgICAgICAgIGhhc2hUeXBlLFxyXG4gICAgICAgICAgICBlbmNvZGluZ1R5cGUsXHJcbiAgICAgICAgICAgIGlucHV0RW5jb2RpbmdUeXBlKTtcclxuXHJcbiAgICAgICAgY29udGFpbmVyLmhhc2ggPSBjcnlwdG9Ccm93c2VyaWZ5LmNyZWF0ZUhhc2goY29udGFpbmVyLmhhc2hUeXBlU3RyaW5nKTtcclxuXHJcbiAgICAgICAgY29udGFpbmVyLnJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihldmVudDogRmlsZVJlYWRlckV2ZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5oYXNoU3RyaW5nID0gY29udGFpbmVyLmhhc2gudXBkYXRlKGV2ZW50LnRhcmdldC5yZXN1bHQsIGNvbnRhaW5lci5pbnB1dEVuY29kaW5nVHlwZVN0cmluZylcclxuICAgICAgICAgICAgICAgIC5kaWdlc3QoY29udGFpbmVyLmVuY29kaW5nVHlwZVN0cmluZyk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5lbmREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgY29udGFpbmVyLnBlcmNlbnQgPSAxMDA7XHJcbiAgICAgICAgfS5iaW5kKGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5kb1dvcmsgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29udGFpbmVyLnJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoY29udGFpbmVyLmZpbGUpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNyZWF0ZVN0cmVhbUhhc2hDb250YWluZXIoZmlsZTogRmlsZSwgaGFzaFR5cGU6IEhhc2hUeXBlLCBlbmNvZGluZ1R5cGU6IEVuY29kaW5nVHlwZSwgaW5wdXRFbmNvZGluZ1R5cGU6IEVuY29kaW5nVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjazogRnVuY3Rpb24sIGVycm9yQ2FsbGJhY2s6IEZ1bmN0aW9uKTogSVN0cmVhbUhhc2hDb250YWluZXIge1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBuZXcgU3RyZWFtSGFzaENvbnRhaW5lcihcclxuICAgICAgICAgICAgZmlsZSxcclxuICAgICAgICAgICAgdGhpcy5IQVNIX1RZUEVfSU1QTEVNRU5UQVRJT04sXHJcbiAgICAgICAgICAgIHRoaXMuRU5DT0RJTkdfVFlQRV9JTVBMRU1FTlRBVElPTixcclxuICAgICAgICAgICAgaGFzaFR5cGUsXHJcbiAgICAgICAgICAgIGVuY29kaW5nVHlwZSxcclxuICAgICAgICAgICAgaW5wdXRFbmNvZGluZ1R5cGUpO1xyXG5cclxuICAgICAgICBjb250YWluZXIuY2h1bmtTaXplID0gdGhpcy5TVFJFQU1fSEFTSF9DSFVOS19TSVpFO1xyXG4gICAgICAgIGNvbnRhaW5lci5vZmZzZXQgPSAwO1xyXG4gICAgICAgIGNvbnRhaW5lci5oYXNoID0gY3J5cHRvQnJvd3NlcmlmeS5jcmVhdGVIYXNoKGNvbnRhaW5lci5oYXNoVHlwZVN0cmluZyk7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5yZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZXZlbnQ6IEZpbGVSZWFkZXJFdmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBiaW5hcnkgPSBldmVudC50YXJnZXQucmVzdWx0O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5vZmZzZXQgKyBjb250YWluZXIuY2h1bmtTaXplID49IGNvbnRhaW5lci5maWxlLnNpemUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5oYXNoLmVuZChiaW5hcnksIGNvbnRhaW5lci5pbnB1dEVuY29kaW5nVHlwZVN0cmluZyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaGFzaC53cml0ZShiaW5hcnksIGNvbnRhaW5lci5pbnB1dEVuY29kaW5nVHlwZVN0cmluZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5vZmZzZXQgKz0gY29udGFpbmVyLmNodW5rU2l6ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5kb1dvcmsoKTtcclxuICAgICAgICB9LmJpbmQoY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgY29udGFpbmVyLnJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhldmVudCwgY29udGFpbmVyKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb250YWluZXIuZG9Xb3JrID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLmlzQ2FuY2VsbGVkKCkgJiYgIWNvbnRhaW5lci5pc1BhdXNlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLm9mZnNldCA+IGNvbnRhaW5lci5maWxlLnNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuaGFzaFN0cmluZyA9IGNvbnRhaW5lci5oYXNoLnJlYWQoKS50b1N0cmluZyhjb250YWluZXIuZW5jb2RpbmdUeXBlU3RyaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZW5kRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnBlcmNlbnQgPSAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNsaWNlID0gY29udGFpbmVyLmZpbGUuc2xpY2UoY29udGFpbmVyLm9mZnNldCwgY29udGFpbmVyLm9mZnNldCArIGNvbnRhaW5lci5jaHVua1NpemUpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoc2xpY2UpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnBlcmNlbnQgPSBNYXRoLnJvdW5kKGNvbnRhaW5lci5vZmZzZXQgLyBmaWxlLnNpemUgKiAxMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgIH1cclxuXHJcbn1cclxuIl19