angular-material-datatransfer-lib
Version:
A HTML5 datatransfer UI for handling upload and download of multiple simultaneous files.
156 lines • 15.8 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';
var CryptoService = /** @class */ (function () {
function CryptoService(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 {?}
*/
CryptoService.prototype.createHashContainer = /**
* @param {?} file
* @param {?} hashType
* @param {?} encodingType
* @param {?} inputEncodingType
* @return {?}
*/
function (file, hashType, encodingType, inputEncodingType) {
/** @type {?} */
var 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 {?}
*/
CryptoService.prototype.createStreamHashContainer = /**
* @param {?} file
* @param {?} hashType
* @param {?} encodingType
* @param {?} inputEncodingType
* @param {?} successCallback
* @param {?} errorCallback
* @return {?}
*/
function (file, hashType, encodingType, inputEncodingType, successCallback, errorCallback) {
/** @type {?} */
var 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 {?} */
var 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 {?} */
var 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 = function () { return [
{ type: NgZone }
]; };
return CryptoService;
}());
export { CryptoService };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLW1hdGVyaWFsLWRhdGF0cmFuc2Zlci1saWIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvY3J5cHRvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFZLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFnQixNQUFNLDZCQUE2QixDQUFDO0FBQ3ZGLE9BQU8sRUFBa0IsYUFBYSxFQUF3QixtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRzFIO0lBUUksdUJBQW9CLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFROztRQUpmLDJCQUFzQixHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLDZCQUF3QixHQUFHLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDO1FBQ25FLGlDQUE0QixHQUFHLDBCQUEwQixDQUFDLGdCQUFnQixDQUFDO1FBR3hGLGlGQUFpRjtRQUNqRix3Q0FBd0M7SUFDNUMsQ0FBQzs7Ozs7Ozs7SUFFTSwyQ0FBbUI7Ozs7Ozs7SUFBMUIsVUFBMkIsSUFBVSxFQUFFLFFBQWtCLEVBQUUsWUFBMEIsRUFDMUQsaUJBQStCOztZQUVoRCxTQUFTLEdBQUcsSUFBSSxhQUFhLENBQy9CLElBQUksRUFDSixJQUFJLENBQUMsd0JBQXdCLEVBQzdCLElBQUksQ0FBQyw0QkFBNEIsRUFDakMsUUFBUSxFQUNSLFlBQVksRUFDWixpQkFBaUIsQ0FBQztRQUV0QixTQUFTLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdkUs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QixPQUFPO2lCQUNWOztvQkFFSyxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7Z0JBQzVGLFNBQVMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDdEU7UUFDTCxDQUFDLENBQUEsQ0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7O2dCQTFGSixVQUFVOzs7O2dCQVBVLE1BQU07O0lBbUczQixvQkFBQztDQUFBLEFBNUZELElBNEZDO1NBM0ZZLGFBQWE7Ozs7OztJQUd0QiwrQ0FBMEQ7Ozs7O0lBQzFELGlEQUFvRjs7Ozs7SUFDcEYscURBQTRGOzs7OztJQUVoRiw2QkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgY3J5cHRvQnJvd3NlcmlmeSBmcm9tICdjcnlwdG8tYnJvd3NlcmlmeSc7XHJcbmltcG9ydCB7IEhhc2hUeXBlSW1wbGVtZW50YXRpb24sIEhhc2hUeXBlIH0gZnJvbSAnLi4vZW51bXMvaGFzaC10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBFbmNvZGluZ1R5cGVJbXBsZW1lbnRhdGlvbiwgRW5jb2RpbmdUeXBlIH0gZnJvbSAnLi4vZW51bXMvZW5jb2RpbmctdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgSUhhc2hDb250YWluZXIsIEhhc2hDb250YWluZXIsIElTdHJlYW1IYXNoQ29udGFpbmVyLCBTdHJlYW1IYXNoQ29udGFpbmVyIH0gZnJvbSAnLi4vbW9kZWxzL2hhc2gtY29udGFpbmVyLm1vZGVsJztcclxuaW1wb3J0IHsgRmlsZVJlYWRlckV2ZW50IH0gZnJvbSAnLi4vZXh0ZW5zaW9ucy9maWxlLXJlYWRlci5leHRlbnNpb24nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ3J5cHRvU2VydmljZSB7XHJcblxyXG4gICAgLy8gaGFzaCA0TUIgYXQgYSB0aW1lXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IFNUUkVBTV9IQVNIX0NIVU5LX1NJWkUgPSAxMDI0ICogMTAwMCAqIDQ7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IEhBU0hfVFlQRV9JTVBMRU1FTlRBVElPTiA9IEhhc2hUeXBlSW1wbGVtZW50YXRpb24uQ3J5cHRvQnJvd3NlcmlmeTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgRU5DT0RJTkdfVFlQRV9JTVBMRU1FTlRBVElPTiA9IEVuY29kaW5nVHlwZUltcGxlbWVudGF0aW9uLkNyeXB0b0Jyb3dzZXJpZnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHtcclxuICAgICAgICAvLyBQZXJmb3JtYW5jZSByZW1haW5zIHVuY2hhbmdlZCBieSBydW5uaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIG91dHNpZGUgb2YgQW5ndWxhci5cclxuICAgICAgICAvLyB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4geyB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNyZWF0ZUhhc2hDb250YWluZXIoZmlsZTogRmlsZSwgaGFzaFR5cGU6IEhhc2hUeXBlLCBlbmNvZGluZ1R5cGU6IEVuY29kaW5nVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RW5jb2RpbmdUeXBlOiBFbmNvZGluZ1R5cGUpOiBJSGFzaENvbnRhaW5lciB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBIYXNoQ29udGFpbmVyKFxyXG4gICAgICAgICAgICBmaWxlLFxyXG4gICAgICAgICAgICB0aGlzLkhBU0hfVFlQRV9JTVBMRU1FTlRBVElPTixcclxuICAgICAgICAgICAgdGhpcy5FTkNPRElOR19UWVBFX0lNUExFTUVOVEFUSU9OLFxyXG4gICAgICAgICAgICBoYXNoVHlwZSxcclxuICAgICAgICAgICAgZW5jb2RpbmdUeXBlLFxyXG4gICAgICAgICAgICBpbnB1dEVuY29kaW5nVHlwZSk7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5oYXNoID0gY3J5cHRvQnJvd3NlcmlmeS5jcmVhdGVIYXNoKGNvbnRhaW5lci5oYXNoVHlwZVN0cmluZyk7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5yZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZXZlbnQ6IEZpbGVSZWFkZXJFdmVudCkge1xyXG4gICAgICAgICAgICBjb250YWluZXIuaGFzaFN0cmluZyA9IGNvbnRhaW5lci5oYXNoLnVwZGF0ZShldmVudC50YXJnZXQucmVzdWx0LCBjb250YWluZXIuaW5wdXRFbmNvZGluZ1R5cGVTdHJpbmcpXHJcbiAgICAgICAgICAgICAgICAuZGlnZXN0KGNvbnRhaW5lci5lbmNvZGluZ1R5cGVTdHJpbmcpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuZW5kRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5wZXJjZW50ID0gMTAwO1xyXG4gICAgICAgIH0uYmluZChjb250YWluZXIpO1xyXG5cclxuICAgICAgICBjb250YWluZXIuZG9Xb3JrID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGNvbnRhaW5lci5maWxlKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjcmVhdGVTdHJlYW1IYXNoQ29udGFpbmVyKGZpbGU6IEZpbGUsIGhhc2hUeXBlOiBIYXNoVHlwZSwgZW5jb2RpbmdUeXBlOiBFbmNvZGluZ1R5cGUsIGlucHV0RW5jb2RpbmdUeXBlOiBFbmNvZGluZ1R5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2s6IEZ1bmN0aW9uLCBlcnJvckNhbGxiYWNrOiBGdW5jdGlvbik6IElTdHJlYW1IYXNoQ29udGFpbmVyIHtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gbmV3IFN0cmVhbUhhc2hDb250YWluZXIoXHJcbiAgICAgICAgICAgIGZpbGUsXHJcbiAgICAgICAgICAgIHRoaXMuSEFTSF9UWVBFX0lNUExFTUVOVEFUSU9OLFxyXG4gICAgICAgICAgICB0aGlzLkVOQ09ESU5HX1RZUEVfSU1QTEVNRU5UQVRJT04sXHJcbiAgICAgICAgICAgIGhhc2hUeXBlLFxyXG4gICAgICAgICAgICBlbmNvZGluZ1R5cGUsXHJcbiAgICAgICAgICAgIGlucHV0RW5jb2RpbmdUeXBlKTtcclxuXHJcbiAgICAgICAgY29udGFpbmVyLmNodW5rU2l6ZSA9IHRoaXMuU1RSRUFNX0hBU0hfQ0hVTktfU0laRTtcclxuICAgICAgICBjb250YWluZXIub2Zmc2V0ID0gMDtcclxuICAgICAgICBjb250YWluZXIuaGFzaCA9IGNyeXB0b0Jyb3dzZXJpZnkuY3JlYXRlSGFzaChjb250YWluZXIuaGFzaFR5cGVTdHJpbmcpO1xyXG5cclxuICAgICAgICBjb250YWluZXIucmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGV2ZW50OiBGaWxlUmVhZGVyRXZlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgYmluYXJ5ID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXIub2Zmc2V0ICsgY29udGFpbmVyLmNodW5rU2l6ZSA+PSBjb250YWluZXIuZmlsZS5zaXplKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaGFzaC5lbmQoYmluYXJ5LCBjb250YWluZXIuaW5wdXRFbmNvZGluZ1R5cGVTdHJpbmcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmhhc2gud3JpdGUoYmluYXJ5LCBjb250YWluZXIuaW5wdXRFbmNvZGluZ1R5cGVTdHJpbmcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIub2Zmc2V0ICs9IGNvbnRhaW5lci5jaHVua1NpemU7XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIuZG9Xb3JrKCk7XHJcbiAgICAgICAgfS5iaW5kKGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5yZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXZlbnQsIGNvbnRhaW5lcik7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29udGFpbmVyLmRvV29yayA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5pc0NhbmNlbGxlZCgpICYmICFjb250YWluZXIuaXNQYXVzZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5vZmZzZXQgPiBjb250YWluZXIuZmlsZS5zaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmhhc2hTdHJpbmcgPSBjb250YWluZXIuaGFzaC5yZWFkKCkudG9TdHJpbmcoY29udGFpbmVyLmVuY29kaW5nVHlwZVN0cmluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmVuZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5wZXJjZW50ID0gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhjb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzbGljZSA9IGNvbnRhaW5lci5maWxlLnNsaWNlKGNvbnRhaW5lci5vZmZzZXQsIGNvbnRhaW5lci5vZmZzZXQgKyBjb250YWluZXIuY2h1bmtTaXplKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5yZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKHNsaWNlKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5wZXJjZW50ID0gTWF0aC5yb3VuZChjb250YWluZXIub2Zmc2V0IC8gZmlsZS5zaXplICogMTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==