{"version":3,"file":"javascripts/86229.c3462a794fed40f96e90.js","mappings":"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","sources":["webpack:///../../node_modules/evaporate/evaporate.js"],"sourcesContent":["/*Copyright (c) 2016, TT Labs, Inc.\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n Neither the name of the TT Labs, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/\n\n\n/***************************************************************************************************\n * *\n * version 2.1.4 *\n * *\n ***************************************************************************************************/\n\n(function () {\n \"use strict\";\n\n var FAR_FUTURE = new Date('2060-10-22'),\n HOURS_AGO,\n PENDING = 0, EVAPORATING = 2, COMPLETE = 3, PAUSED = 4, CANCELED = 5, ERROR = 10, ABORTED = 20, PAUSING = 30,\n PAUSED_STATUSES = [PAUSED, PAUSING],\n ACTIVE_STATUSES = [PENDING, EVAPORATING, ERROR],\n ETAG_OF_0_LENGTH_BLOB = '\"d41d8cd98f00b204e9800998ecf8427e\"',\n PARTS_MONITOR_INTERVAL_MS = 2 * 60 * 1000,\n IMMUTABLE_OPTIONS = [\n 'maxConcurrentParts',\n 'logging',\n 'cloudfront',\n 'encodeFilename',\n 'computeContentMd5',\n 'allowS3ExistenceOptimization',\n 'onlyRetryForSameFileName',\n 'timeUrl',\n 'cryptoMd5Method',\n 'cryptoHexEncodedHash256',\n 'awsRegion',\n 'awsSignatureVersion',\n 'evaporateChanged'\n ],\n S3_EXTRA_ENCODED_CHARS = {\n 33: \"%21\", // !\n 39: \"%27\", // '\n 40: \"%28\", // (\n 41: \"%29\", // )\n 42: \"%2A\" // *\n },\n l;\n\n var Evaporate = function (config) {\n this.config = extend({\n readableStreams: false,\n readableStreamPartMethod: null,\n bucket: null,\n logging: true,\n maxConcurrentParts: 5,\n partSize: 6 * 1024 * 1024,\n retryBackoffPower: 2,\n maxRetryBackoffSecs: 300,\n progressIntervalMS: 1000,\n cloudfront: false,\n s3Acceleration: false,\n mockLocalStorage: false,\n encodeFilename: true,\n computeContentMd5: false,\n allowS3ExistenceOptimization: false,\n onlyRetryForSameFileName: false,\n timeUrl: null,\n cryptoMd5Method: null,\n cryptoHexEncodedHash256: null,\n aws_key: null,\n awsRegion: 'us-east-1',\n awsSignatureVersion: '4',\n sendCanonicalRequestToSignerUrl: false,\n s3FileCacheHoursAgo: null, // Must be a whole number of hours. Will be interpreted as negative (hours in the past).\n signParams: {},\n signHeaders: {},\n customAuthMethod: undefined,\n maxFileSize: null,\n signResponseHandler: null,\n xhrWithCredentials: false,\n // undocumented, experimental\n localTimeOffset: undefined,\n evaporateChanged: function () {},\n abortCompletionThrottlingMs: 1000\n }, config);\n\n if (typeof window !== 'undefined' && window.console) {\n l = window.console;\n l.d = l.log;\n l.w = window.console.warn ? l.warn : l.d;\n l.e = window.console.error ? l.error : l.d;\n }\n\n this._instantiationError = this.validateEvaporateOptions();\n if (typeof this._instantiationError === 'string') {\n this.supported = false;\n return;\n } else {\n delete this._instantiationError;\n }\n\n if (!this.config.logging) {\n // Reset the logger to be a no_op\n l = noOpLogger();\n }\n\n var _d = new Date();\n HOURS_AGO = new Date(_d.setHours(_d.getHours() - (this.config.s3FileCacheHoursAgo || -100)));\n if (typeof config.localTimeOffset === 'number') {\n this.localTimeOffset = config.localTimeOffset;\n } else {\n var self = this;\n Evaporate.getLocalTimeOffset(this.config)\n .then(function (offset) {\n self.localTimeOffset = offset;\n });\n }\n this.pendingFiles = {};\n this.queuedFiles = [];\n this.filesInProcess = [];\n historyCache = new HistoryCache(this.config.mockLocalStorage);\n };\n Evaporate.create = function (config) {\n var evapConfig = extend({}, config);\n return Evaporate.getLocalTimeOffset(evapConfig)\n .then(function (offset) {\n evapConfig.localTimeOffset = offset;\n return new Promise(function (resolve, reject) {\n var e = new Evaporate(evapConfig);\n if (e.supported === true) {\n resolve(e);\n } else {\n reject(e._instantiationError);\n }\n });\n });\n };\n Evaporate.getLocalTimeOffset = function (config) {\n return new Promise(function (resolve, reject) {\n if (typeof config.localTimeOffset === 'number') {\n return resolve(config.localTimeOffset);\n }\n if (config.timeUrl) {\n var xhr = new XMLHttpRequest();\n\n xhr.open(\"GET\", config.timeUrl + '?requestTime=' + new Date().getTime());\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n var server_date = new Date(Date.parse(xhr.responseText)),\n offset = server_date - new Date();\n l.d('localTimeOffset is', offset, 'ms');\n resolve(offset);\n }\n }\n };\n\n xhr.onerror = function (xhr) {\n l.e('xhr error timeUrl', xhr);\n reject('Fetching offset time failed with status: ' + xhr.status);\n };\n xhr.send();\n } else {\n resolve(0);\n }\n });\n };\n Evaporate.prototype.config = {};\n Evaporate.prototype.localTimeOffset = 0;\n Evaporate.prototype.supported = false;\n Evaporate.prototype._instantiationError = undefined;\n Evaporate.prototype.evaporatingCount = 0;\n Evaporate.prototype.pendingFiles = {};\n Evaporate.prototype.filesInProcess = [];\n Evaporate.prototype.queuedFiles = [];\n Evaporate.prototype.startNextFile = function (reason) {\n if (!this.queuedFiles.length ||\n this.evaporatingCount >= this.config.maxConcurrentParts) { return; }\n var fileUpload = this.queuedFiles.shift();\n if (fileUpload.status === PENDING) {\n l.d('Starting', decodeURIComponent(fileUpload.name), 'reason:', reason);\n this.evaporatingCnt(+1);\n fileUpload.start();\n } else {\n // Add the file back to the stack, it's not ready\n l.d('Requeued', decodeURIComponent(fileUpload.name), 'status:', fileUpload.status, 'reason:', reason);\n this.queuedFiles.push(fileUpload);\n }\n };\n Evaporate.prototype.fileCleanup = function (fileUpload) {\n removeAtIndex(this.queuedFiles, fileUpload);\n if (removeAtIndex(this.filesInProcess, fileUpload)) {\n this.evaporatingCnt(-1);\n }\n fileUpload.done();\n this.consumeRemainingSlots();\n };\n Evaporate.prototype.queueFile = function (fileUpload) {\n this.filesInProcess.push(fileUpload);\n this.queuedFiles.push(fileUpload);\n if (this.filesInProcess.length === 1) {\n this.startNextFile('first file');\n }\n };\n Evaporate.prototype.add = function (file, pConfig) {\n var self = this,\n fileConfig;\n return new Promise(function (resolve, reject) {\n var c = extend(pConfig, {});\n\n IMMUTABLE_OPTIONS.forEach(function (a) { delete c[a]; });\n\n fileConfig = extend(self.config, c);\n\n if (typeof file === 'undefined' || typeof file.file === 'undefined') {\n return reject('Missing file');\n }\n if (fileConfig.maxFileSize && file.file.size > fileConfig.maxFileSize) {\n return reject('File size too large. Maximum size allowed is ' + fileConfig.maxFileSize);\n }\n if (typeof file.name === 'undefined') {\n return reject('Missing attribute: name');\n }\n\n if (fileConfig.encodeFilename) {\n // correctly encode to an S3 object name, considering '/' and ' '\n file.name = s3EncodedObjectName(file.name);\n }\n\n var fileUpload = new FileUpload(extend({\n started: function () {},\n uploadInitiated: function () {},\n progress: function () {},\n complete: function () {},\n cancelled: function () {},\n paused: function () {},\n resumed: function () {},\n pausing: function () {},\n nameChanged: function () {},\n info: function () {},\n warn: function () {},\n error: function () {},\n beforeSigner: undefined,\n xAmzHeadersAtInitiate: {},\n notSignedHeadersAtInitiate: {},\n xAmzHeadersCommon: null,\n xAmzHeadersAtUpload: {},\n xAmzHeadersAtComplete: {}\n }, file, {\n status: PENDING,\n priority: 0,\n loadedBytes: 0,\n sizeBytes: file.file.size,\n eTag: ''\n }), fileConfig, self),\n fileKey = fileUpload.id;\n\n self.pendingFiles[fileKey] = fileUpload;\n\n self.queueFile(fileUpload);\n\n // Resolve or reject the Add promise based on how the fileUpload completes\n fileUpload.deferredCompletion.promise\n .then(\n function () {\n self.fileCleanup(fileUpload);\n resolve(decodeURIComponent(fileUpload.name));\n },\n function (reason) {\n self.fileCleanup(fileUpload);\n reject(reason);\n }\n );\n })\n };\n Evaporate.prototype.cancel = function (id) {\n return typeof id === 'undefined' ? this._cancelAll() : this._cancelOne(id);\n };\n Evaporate.prototype._cancelAll = function () {\n l.d('Canceling all file uploads');\n var promises = [];\n for (var key in this.pendingFiles) {\n if (this.pendingFiles.hasOwnProperty(key)) {\n var file = this.pendingFiles[key];\n if (ACTIVE_STATUSES.indexOf(file.status) > -1) {\n promises.push(file.stop());\n }\n }\n }\n if (!promises.length) {\n promises.push(Promise.reject('No files to cancel.'));\n }\n return Promise.all(promises);\n };\n Evaporate.prototype._cancelOne = function (id) {\n var promise = [];\n if (this.pendingFiles[id]) {\n promise.push(this.pendingFiles[id].stop());\n } else {\n promise.push(Promise.reject('File does not exist'));\n }\n return Promise.all(promise);\n };\n Evaporate.prototype.pause = function (id, options) {\n options = options || {};\n var force = typeof options.force === 'undefined' ? false : options.force;\n return typeof id === 'undefined' ? this._pauseAll(force) : this._pauseOne(id, force);\n };\n Evaporate.prototype._pauseAll = function (force) {\n l.d('Pausing all file uploads');\n var promises = [];\n for (var key in this.pendingFiles) {\n if (this.pendingFiles.hasOwnProperty(key)) {\n var file = this.pendingFiles[key];\n if (ACTIVE_STATUSES.indexOf(file.status) > -1) {\n this._pause(file, force, promises);\n }\n }\n }\n return Promise.all(promises);\n };\n Evaporate.prototype._pauseOne = function (id, force) {\n var promises = [],\n file = this.pendingFiles[id];\n if (typeof file === 'undefined') {\n promises.push(Promise.reject('Cannot pause a file that has not been added.'));\n } else if (file.status === PAUSED) {\n promises.push(Promise.reject('Cannot pause a file that is already paused.'));\n }\n if (!promises.length) {\n this._pause(file, force, promises);\n }\n return Promise.all(promises);\n };\n Evaporate.prototype._pause = function(fileUpload, force, promises) {\n promises.push(fileUpload.pause(force));\n removeAtIndex(this.filesInProcess, fileUpload);\n removeAtIndex(this.queuedFiles, fileUpload);\n };\n Evaporate.prototype.resume = function (id) {\n return typeof id === 'undefined' ? this._resumeAll() : this._resumeOne(id);\n };\n Evaporate.prototype._resumeAll = function () {\n l.d('Resuming all file uploads');\n for (var key in this.pendingFiles) {\n if (this.pendingFiles.hasOwnProperty(key)) {\n var file = this.pendingFiles[key];\n if (PAUSED_STATUSES.indexOf(file.status) > -1) {\n this.resumeFile(file);\n }\n }\n }\n return Promise.resolve();\n };\n Evaporate.prototype._resumeOne = function (id) {\n var file = this.pendingFiles[id],\n promises = [];\n if (typeof file === 'undefined') {\n promises.push(Promise.reject('Cannot pause a file that does not exist.'));\n } else if (PAUSED_STATUSES.indexOf(file.status) === -1) {\n promises.push(Promise.reject('Cannot resume a file that has not been paused.'));\n } else {\n this.resumeFile(file);\n }\n return Promise.all(promises);\n };\n Evaporate.prototype.resumeFile = function (fileUpload) {\n fileUpload.resume();\n this.queueFile(fileUpload);\n };\n Evaporate.prototype.forceRetry = function () {};\n Evaporate.prototype.consumeRemainingSlots = function () {\n var avail = this.config.maxConcurrentParts - this.evaporatingCount;\n if (!avail) { return; }\n for (var i = 0; i < this.filesInProcess.length; i++) {\n var file = this.filesInProcess[i];\n var consumed = file.consumeSlots();\n if (consumed < 0) { continue; }\n avail -= consumed;\n if (!avail) { return; }\n }\n };\n Evaporate.prototype.validateEvaporateOptions = function () {\n this.supported = !(\n typeof File === 'undefined' ||\n typeof Promise === 'undefined');\n\n if (!this.supported) {\n return 'Evaporate requires support for File and Promise';\n }\n\n if (this.config.readableStreams) {\n if (typeof this.config.readableStreamPartMethod !== 'function') {\n return \"Option readableStreamPartMethod is required when readableStreams is set.\"\n }\n } else {\n if (typeof Blob === 'undefined' || typeof (\n Blob.prototype.webkitSlice ||\n Blob.prototype.mozSlice ||\n Blob.prototype.slice) === 'undefined') {\n return 'Evaporate requires support for Blob [webkitSlice || mozSlice || slice]';\n }\n }\n\n if (!this.config.signerUrl && typeof this.config.customAuthMethod !== 'function') {\n return \"Option signerUrl is required unless customAuthMethod is present.\";\n }\n\n if (!this.config.bucket) {\n return \"The AWS 'bucket' option must be present.\";\n }\n\n if (this.config.computeContentMd5) {\n this.supported = typeof FileReader.prototype.readAsArrayBuffer !== 'undefined';\n if (!this.supported) {\n return 'The browser\\'s FileReader object does not support readAsArrayBuffer';\n }\n\n if (typeof this.config.cryptoMd5Method !== 'function') {\n return 'Option computeContentMd5 has been set but cryptoMd5Method is not defined.'\n }\n\n if (this.config.awsSignatureVersion === '4') {\n if (typeof this.config.cryptoHexEncodedHash256 !== 'function') {\n return 'Option awsSignatureVersion is 4 but cryptoHexEncodedHash256 is not defined.';\n }\n }\n } else if (this.config.awsSignatureVersion === '4') {\n return 'Option awsSignatureVersion is 4 but computeContentMd5 is not enabled.';\n }\n return true;\n };\n Evaporate.prototype.evaporatingCnt = function (incr) {\n this.evaporatingCount = Math.max(0, this.evaporatingCount + incr);\n this.config.evaporateChanged(this, this.evaporatingCount);\n };\n\n\n function FileUpload(file, con, evaporate) {\n this.fileTotalBytesUploaded = 0;\n this.s3Parts = [];\n this.partsOnS3 = [];\n this.partsInProcess = [];\n this.partsToUpload = [];\n this.numParts = -1;\n this.con = extend({}, con);\n this.evaporate = evaporate;\n this.localTimeOffset = evaporate.localTimeOffset;\n this.deferredCompletion = defer();\n\n extend(this, file);\n\n this.id = decodeURIComponent(this.con.bucket + '/' + this.name);\n\n this.signParams = con.signParams;\n }\n FileUpload.prototype.con = undefined;\n FileUpload.prototype.evaporate = undefined;\n FileUpload.prototype.localTimeOffset = 0;\n FileUpload.prototype.id = undefined;\n FileUpload.prototype.status = PENDING;\n FileUpload.prototype.numParts = -1;\n FileUpload.prototype.fileTotalBytesUploaded = 0;\n FileUpload.prototype.partsInProcess = [];\n FileUpload.prototype.partsToUpload = [];\n FileUpload.prototype.s3Parts = [];\n FileUpload.prototype.partsOnS3 = [];\n FileUpload.prototype.deferredCompletion = undefined;\n FileUpload.prototype.abortedByUser = false;\n\n // Progress and Stats\n FileUpload.prototype.progressInterval = undefined;\n FileUpload.prototype.startTime = undefined;\n FileUpload.prototype.loaded = 0;\n FileUpload.prototype.totalUploaded = 0;\n FileUpload.prototype.updateLoaded = function (loadedNow) {\n this.loaded += loadedNow;\n this.fileTotalBytesUploaded += loadedNow;\n };\n FileUpload.prototype.progessStats = function () {\n // Adapted from https://github.com/fkjaekel\n // https://github.com/TTLabs/EvaporateJS/issues/13\n if (this.fileTotalBytesUploaded === 0) {\n return {\n speed: 0,\n readableSpeed: \"\",\n loaded: 0,\n totalUploaded: 0,\n remainingSize: this.sizeBytes,\n secondsLeft: -1,\n fileSize: this.sizeBytes,\n };\n }\n\n this.totalUploaded += this.loaded;\n var delta = (new Date() - this.startTime) / 1000,\n avgSpeed = this.totalUploaded / delta,\n remainingSize = this.sizeBytes - this.fileTotalBytesUploaded,\n stats = {\n speed: avgSpeed,\n readableSpeed: readableFileSize(avgSpeed),\n loaded: this.loaded,\n totalUploaded: this.fileTotalBytesUploaded,\n remainingSize: remainingSize,\n secondsLeft: -1,\n fileSize: this.sizeBytes,\n\n };\n\n if (avgSpeed > 0) {\n stats.secondsLeft = Math.round(remainingSize / avgSpeed);\n }\n\n return stats;\n };\n FileUpload.prototype.onProgress = function () {\n if ([ABORTED, PAUSED].indexOf(this.status) === -1) {\n this.progress(this.fileTotalBytesUploaded / this.sizeBytes, this.progessStats());\n this.loaded = 0;\n }\n };\n FileUpload.prototype.startMonitor = function () {\n clearInterval(this.progressInterval);\n this.startTime = new Date();\n this.loaded = 0;\n this.totalUploaded = 0;\n this.onProgress();\n this.progressInterval = setInterval(this.onProgress.bind(this), this.con.progressIntervalMS);\n };\n FileUpload.prototype.stopMonitor = function () {\n clearInterval(this.progressInterval);\n };\n\n // Evaporate proxies\n FileUpload.prototype.startNextFile = function (reason) {\n this.evaporate.startNextFile(reason);\n };\n FileUpload.prototype.evaporatingCnt = function (incr) {\n this.evaporate.evaporatingCnt(incr);\n };\n FileUpload.prototype.consumeRemainingSlots = function () {\n this.evaporate.consumeRemainingSlots();\n };\n FileUpload.prototype.getRemainingSlots = function () {\n var evapCount = this.evaporate.evaporatingCount;\n if (!this.partsInProcess.length && evapCount > 0) {\n // we can use our file slot\n evapCount -= 1;\n }\n return this.con.maxConcurrentParts - evapCount;\n };\n\n FileUpload.prototype.lastPartSatisfied = Promise.resolve('onStart');\n\n FileUpload.prototype.start = function () {\n this.status = EVAPORATING;\n this.startMonitor();\n this.started(this.id);\n\n if (this.uploadId) {\n l.d('resuming FileUpload ', this.id);\n return this.consumeSlots();\n }\n\n var awsKey = this.name;\n\n this.getUnfinishedFileUpload();\n\n var existenceOptimized = this.con.computeContentMd5 &&\n this.con.allowS3ExistenceOptimization &&\n typeof this.firstMd5Digest !== 'undefined' &&\n typeof this.eTag !== 'undefined';\n\n if (this.uploadId) {\n if (existenceOptimized) {\n return this.reuseS3Object(awsKey)\n .then(this.deferredCompletion.resolve)\n .catch(this.uploadFileFromScratch.bind(this));\n }\n\n this.resumeInterruptedUpload()\n .then(this._uploadComplete.bind(this))\n .catch(this.uploadFileFromScratch.bind(this));\n } else {\n this.uploadFileFromScratch(\"\");\n }\n };\n FileUpload.prototype.uploadFileFromScratch = function (reason) {\n if (ACTIVE_STATUSES.indexOf(this.status) === -1) { return; }\n l.d(reason);\n this.uploadId = undefined;\n return this.uploadFile(this.name)\n .then(this._uploadComplete.bind(this))\n .catch(this._abortUpload.bind(this));\n };\n FileUpload.prototype._uploadComplete = function () {\n this.completeUpload().then(this.deferredCompletion.resolve);\n };\n FileUpload.prototype.stop = function () {\n l.d('stopping FileUpload ', this.id);\n this.setStatus(CANCELED);\n this.info('Canceling uploads...');\n this.abortedByUser = true;\n var self = this;\n return this.abortUpload()\n .then(function () {\n throw(\"User aborted the upload\");\n })\n .catch(function (reason) {\n self.deferredCompletion.reject(reason);\n });\n };\n FileUpload.prototype.pause = function (force) {\n l.d('pausing FileUpload, force:', !!force, this.id);\n var promises = [];\n this.info('Pausing uploads...');\n this.status = PAUSING;\n if (force) {\n this.abortParts(true);\n } else {\n promises = this.partsInProcess.map(function (p) {\n return this.s3Parts[p].awsRequest.awsDeferred.promise\n }, this);\n this.pausing();\n }\n return Promise.all(promises)\n .then(function () {\n this.stopMonitor();\n this.status = PAUSED;\n this.startNextFile('pause');\n this.paused();\n }.bind(this));\n };\n FileUpload.prototype.resume = function () {\n this.status = PENDING;\n this.resumed();\n };\n FileUpload.prototype.done = function () {\n clearInterval(this.progressInterval);\n this.startNextFile('file done');\n this.partsOnS3 = [];\n this.s3Parts = [];\n };\n FileUpload.prototype._startCompleteUpload = function (callComplete) {\n return function () {\n var promise = callComplete ? this.completeUpload() : Promise.resolve();\n promise.then(this.deferredCompletion.resolve.bind(this));\n }\n };\n FileUpload.prototype._abortUpload = function () {\n if (!this.abortedByUser) {\n var self = this;\n this.abortUpload()\n .then(\n function () { self.deferredCompletion.reject('File upload aborted due to a part failing to upload'); },\n this.deferredCompletion.reject.bind(this));\n }\n };\n\n FileUpload.prototype.abortParts = function (pause) {\n var self = this;\n var toAbort = this.partsInProcess.slice(0);\n toAbort.forEach(function (i) {\n var s3Part = self.s3Parts[i];\n if (s3Part) {\n s3Part.awsRequest.abort();\n if (pause) { s3Part.status = PENDING; }\n removeAtIndex(self.partsInProcess, s3Part.partNumber);\n if (self.partsToUpload.length) { self.evaporatingCnt(-1); }\n }\n });\n };\n FileUpload.prototype.makeParts = function (firstPart) {\n this.numParts = Math.ceil(this.sizeBytes / this.con.partSize) || 1; // issue #58\n var partsDeferredPromises = [];\n\n var self = this;\n\n function cleanUpAfterPart(s3Part) {\n removeAtIndex(self.partsToUpload, s3Part.partNumber);\n removeAtIndex(self.partsInProcess, s3Part.partNumber);\n\n if (self.partsToUpload.length) { self.evaporatingCnt(-1); }\n }\n\n function resolve(s3Part) { return function () {\n cleanUpAfterPart(s3Part);\n if (self.partsToUpload.length) { self.consumeRemainingSlots(); }\n if (self.partsToUpload.length < self.con.maxConcurrentParts) {\n self.startNextFile('part resolve');\n }\n };\n }\n function reject(s3Part) { return function () {\n cleanUpAfterPart(s3Part);\n };\n }\n\n var limit = firstPart ? 1 : this.numParts;\n\n for (var part = 1; part <= limit; part++) {\n var s3Part = this.s3Parts[part];\n if (typeof s3Part !== \"undefined\"){\n if(s3Part.status === COMPLETE) { continue; }\n } else {\n s3Part = this.makePart(part, PENDING, this.sizeBytes);\n }\n s3Part.awsRequest = new PutPart(this, s3Part);\n s3Part.awsRequest.awsDeferred.promise\n .then(resolve(s3Part), reject(s3Part));\n\n this.partsToUpload.push(part);\n partsDeferredPromises.push(this.s3Parts[part].awsRequest.awsDeferred.promise);\n }\n\n return partsDeferredPromises;\n };\n FileUpload.prototype.makePart = function (partNumber, status, size) {\n var s3Part = {\n status: status,\n loadedBytes: 0,\n loadedBytesPrevious: null,\n isEmpty: (size === 0), // issue #58\n md5_digest: null,\n partNumber: partNumber\n };\n\n this.s3Parts[partNumber] = s3Part;\n\n return s3Part;\n };\n FileUpload.prototype.setStatus = function (s) {\n this.status = s;\n };\n\n FileUpload.prototype.createUploadFile = function () {\n if (this.status === ABORTED) { return; }\n var fileKey = uploadKey(this),\n newUpload = {\n awsKey: this.name,\n bucket: this.con.bucket,\n uploadId: this.uploadId,\n fileSize: this.sizeBytes,\n fileType: this.file.type,\n lastModifiedDate: dateISOString(this.file.lastModified),\n partSize: this.con.partSize,\n signParams: this.con.signParams,\n createdAt: new Date().toISOString()\n };\n saveUpload(fileKey, newUpload);\n };\n FileUpload.prototype.updateUploadFile = function (updates) {\n var fileKey = uploadKey(this),\n uploads = getSavedUploads(),\n upload = extend({}, uploads[fileKey], updates);\n saveUpload(fileKey, upload);\n };\n FileUpload.prototype.completeUploadFile = function (xhr) {\n var uploads = getSavedUploads(),\n upload = uploads[uploadKey(this)];\n\n if (typeof upload !== 'undefined') {\n upload.completedAt = new Date().toISOString();\n upload.eTag = this.eTag;\n upload.firstMd5Digest = this.firstMd5Digest;\n uploads[uploadKey(this)] = upload;\n historyCache.setItem('awsUploads', JSON.stringify(uploads));\n }\n\n this.complete(xhr, this.name, this.progessStats());\n this.setStatus(COMPLETE);\n this.onProgress();\n };\n FileUpload.prototype.removeUploadFile = function (){\n if (typeof this.file !== 'undefined') {\n removeUpload(uploadKey(this));\n }\n };\n FileUpload.prototype.getUnfinishedFileUpload = function () {\n var savedUploads = getSavedUploads(true),\n u = savedUploads[uploadKey(this)];\n\n if (this.canRetryUpload(u)) {\n this.uploadId = u.uploadId;\n this.name = u.awsKey;\n this.eTag = u.eTag;\n this.firstMd5Digest = u.firstMd5Digest;\n this.signParams = u.signParams;\n }\n };\n FileUpload.prototype.canRetryUpload = function (u) {\n // Must be the same file name, file size, last_modified, file type as previous upload\n if (typeof u === 'undefined') {\n return false;\n }\n var completedAt = new Date(u.completedAt || FAR_FUTURE);\n\n // check that the part sizes and bucket match, and if the file name of the upload\n // matches if onlyRetryForSameFileName is true\n return this.con.partSize === u.partSize &&\n completedAt > HOURS_AGO &&\n this.con.bucket === u.bucket &&\n (this.con.onlyRetryForSameFileName ? this.name === u.awsKey : true);\n };\n\n FileUpload.prototype.partSuccess = function (eTag, putRequest) {\n var part = putRequest.part;\n l.d(putRequest.request.step, 'ETag:', eTag);\n if (part.isEmpty || (eTag !== ETAG_OF_0_LENGTH_BLOB)) { // issue #58\n part.eTag = eTag;\n part.status = COMPLETE;\n this.partsOnS3.push(part);\n return true;\n } else {\n part.status = ERROR;\n putRequest.resetLoadedBytes();\n var msg = ['eTag matches MD5 of 0 length blob for part #', putRequest.partNumber, 'Retrying part.'].join(\" \");\n l.w(msg);\n this.warn(msg);\n }\n };\n FileUpload.prototype.listPartsSuccess = function (listPartsRequest, partsXml) {\n this.info('uploadId', this.uploadId, 'is not complete. Fetching parts from part marker', listPartsRequest.partNumberMarker);\n partsXml = partsXml.replace(/(\\r\\n|\\n|\\r)/gm, \"\"); // strip line breaks to ease the regex requirements\n var partRegex = /(.+?)<\\/Part\\>/g;\n\n while (true) {\n var cp = (partRegex.exec(partsXml) || [])[1];\n if (!cp) { break; }\n\n var partSize = parseInt(elementText(cp, \"Size\"), 10);\n this.fileTotalBytesUploaded += partSize;\n this.partsOnS3.push({\n eTag: elementText(cp, \"ETag\").replace(/"/g, '\"'),\n partNumber: parseInt(elementText(cp, \"PartNumber\"), 10),\n size: partSize,\n LastModified: elementText(cp, \"LastModified\")\n });\n }\n return elementText(partsXml, \"IsTruncated\") === 'true' ? elementText(partsXml, \"NextPartNumberMarker\") : undefined;\n };\n FileUpload.prototype.makePartsfromPartsOnS3 = function () {\n if (ACTIVE_STATUSES.indexOf(this.status) === -1) { return; }\n this.nameChanged(this.name);\n this.partsOnS3.forEach(function (cp) {\n var uploadedPart = this.makePart(cp.partNumber, COMPLETE, cp.size);\n uploadedPart.eTag = cp.eTag;\n uploadedPart.loadedBytes = cp.size;\n uploadedPart.loadedBytesPrevious = cp.size;\n uploadedPart.finishedUploadingAt = cp.LastModified;\n }.bind(this));\n };\n FileUpload.prototype.completeUpload = function () {\n var self = this;\n return new CompleteMultipartUpload(this)\n .send()\n .then(\n function (xhr) {\n self.eTag = elementText(xhr.responseText, \"ETag\").replace(/"/g, '\"');\n self.completeUploadFile(xhr);\n });\n };\n FileUpload.prototype.getCompletedPayload = function () {\n var completeDoc = [];\n completeDoc.push('');\n this.s3Parts.forEach(function (part, partNumber) {\n if (partNumber > 0) {\n ['', partNumber, '', part.eTag, '']\n .forEach(function (a) { completeDoc.push(a); });\n }\n });\n completeDoc.push('');\n\n return completeDoc.join(\"\");\n };\n FileUpload.prototype.consumeSlots = function () {\n if (this.partsToUpload.length === 0) { return -1 }\n if (this.partsToUpload.length !== this.partsInProcess.length &&\n this.status === EVAPORATING) {\n\n var partsToUpload = Math.min(this.getRemainingSlots(), this.partsToUpload.length);\n\n if (!partsToUpload) { return -1; }\n\n var satisfied = 0;\n for (var i = 0; i < this.partsToUpload.length; i++) {\n var s3Part = this.s3Parts[this.partsToUpload[i]];\n\n if (s3Part.status === EVAPORATING) { continue; }\n\n if (this.canStartPart(s3Part)) {\n if (this.partsInProcess.length && this.partsToUpload.length > 1) {\n this.evaporatingCnt(+1);\n }\n this.partsInProcess.push(s3Part.partNumber);\n var awsRequest = s3Part.awsRequest;\n this.lastPartSatisfied.then(awsRequest.delaySend.bind(awsRequest));\n this.lastPartSatisfied = awsRequest.getStartedPromise();\n } else { continue; }\n\n satisfied += 1;\n\n if (satisfied === partsToUpload) { break; }\n\n }\n var allInProcess = this.partsToUpload.length === this.partsInProcess.length,\n remainingSlots = this.getRemainingSlots();\n if (allInProcess && remainingSlots > 0) {\n // We don't need any more slots...\n this.startNextFile('consume slots');\n }\n return remainingSlots;\n }\n return 0;\n };\n FileUpload.prototype.canStartPart = function (part) {\n return this.partsInProcess.indexOf(part.partNumber) === -1 && !part.awsRequest.errorExceptionStatus();\n };\n FileUpload.prototype.uploadFile = function (awsKey) {\n this.removeUploadFile();\n var self = this;\n return new InitiateMultipartUpload(self, awsKey)\n .send()\n .then(\n function () {\n self.uploadInitiated(self.uploadId);\n self.partsToUpload = [];\n return self.uploadParts()\n .then(\n function () {},\n function (reason) {\n throw(reason);\n })\n });\n };\n FileUpload.prototype.uploadParts = function () {\n this.loaded = 0;\n this.totalUploaded = 0;\n if (ACTIVE_STATUSES.indexOf(this.status) === -1) {\n return Promise.reject('Part uploading stopped because the file was canceled');\n }\n var promises = this.makeParts();\n this.setStatus(EVAPORATING);\n this.startTime = new Date();\n this.consumeSlots();\n return Promise.all(promises);\n };\n FileUpload.prototype.abortUpload = function () {\n return new Promise(function (resolve, reject) {\n\n if(typeof this.uploadId === 'undefined') {\n resolve();\n return;\n }\n\n new DeleteMultipartUpload(this)\n .send()\n .then(resolve, reject);\n }.bind(this))\n .then(\n function () {\n this.setStatus(ABORTED);\n this.cancelled();\n this.removeUploadFile();\n }.bind(this),\n this.deferredCompletion.reject.bind(this));\n };\n FileUpload.prototype.resumeInterruptedUpload = function () {\n return new ResumeInterruptedUpload(this)\n .send()\n .then(this.uploadParts.bind(this));\n };\n FileUpload.prototype.reuseS3Object = function (awsKey) {\n var self = this;\n // Attempt to reuse entire uploaded object on S3\n this.makeParts(1);\n this.partsToUpload = [];\n var firstS3Part = this.s3Parts[1];\n function reject(reason) {\n self.name = awsKey;\n throw(reason);\n }\n return firstS3Part.awsRequest.getPartMd5Digest()\n .then(function () {\n if (self.firstMd5Digest === firstS3Part.md5_digest) {\n return new ReuseS3Object(self, awsKey)\n .send()\n .then(\n function (xhr) {\n l.d('headObject found matching object on S3.');\n self.completeUploadFile(xhr);\n self.nameChanged(self.name);\n })\n .catch(reject);\n\n } else {\n var msg = self.con.allowS3ExistenceOptimization ? 'File\\'s first part MD5 digest does not match what was stored.' : 'allowS3ExistenceOptimization is not enabled.';\n reject(msg);\n }\n });\n };\n\n\n function SignedS3AWSRequest(fileUpload, request) {\n this.fileUpload = fileUpload;\n this.con = fileUpload.con;\n this.attempts = 1;\n this.localTimeOffset = this.fileUpload.localTimeOffset;\n this.awsDeferred = defer();\n this.started = defer();\n\n this.awsUrl = awsUrl(this.con);\n this.awsHost = uri(this.awsUrl).hostname;\n\n var r = extend({}, request);\n if (fileUpload.contentType) {\n r.contentType = fileUpload.contentType;\n }\n\n this.updateRequest(r);\n }\n SignedS3AWSRequest.prototype.fileUpload = undefined;\n SignedS3AWSRequest.prototype.con = undefined;\n SignedS3AWSRequest.prototype.awsUrl = undefined;\n SignedS3AWSRequest.prototype.awsHost = undefined;\n SignedS3AWSRequest.prototype.authorize = function () {};\n SignedS3AWSRequest.prototype.localTimeOffset = 0;\n SignedS3AWSRequest.prototype.awsDeferred = undefined;\n SignedS3AWSRequest.prototype.started = undefined;\n SignedS3AWSRequest.prototype.getPath = function () {\n var path = '/' + this.con.bucket + '/' + this.fileUpload.name;\n if (this.con.cloudfront || this.awsUrl.indexOf('cloudfront') > -1) {\n path = '/' + this.fileUpload.name;\n }\n return path;\n };\n\n SignedS3AWSRequest.prototype.updateRequest = function (request) {\n this.request = request;\n var SigningClass = signingVersion(this, l);\n this.signer = new SigningClass(request);\n };\n SignedS3AWSRequest.prototype.success = function () { this.awsDeferred.resolve(this.currentXhr); };\n SignedS3AWSRequest.prototype.backOffWait = function () {\n return (this.attempts === 1) ? 0 : 1000 * Math.min(\n this.con.maxRetryBackoffSecs,\n Math.pow(this.con.retryBackoffPower, this.attempts - 2)\n );\n };\n SignedS3AWSRequest.prototype.error = function (reason) {\n if (this.errorExceptionStatus()) {\n return;\n }\n\n this.signer.error();\n l.d(this.request.step, 'error:', this.fileUpload.id, reason);\n\n if (typeof this.errorHandler(reason) !== 'undefined' ) {\n return;\n }\n\n this.fileUpload.warn('Error in ', this.request.step, reason);\n this.fileUpload.setStatus(ERROR);\n\n var self = this,\n backOffWait = this.backOffWait();\n this.attempts += 1;\n\n setTimeout(function () {\n if (!self.errorExceptionStatus()) { self.trySend(); }\n }, backOffWait);\n };\n SignedS3AWSRequest.prototype.errorHandler = function () { };\n SignedS3AWSRequest.prototype.errorExceptionStatus = function () { return false; };\n SignedS3AWSRequest.prototype.getPayload = function () { return Promise.resolve(null); };\n SignedS3AWSRequest.prototype.success_status = function (xhr) {\n return (xhr.status >= 200 && xhr.status <= 299) ||\n this.request.success404 && xhr.status === 404;\n };\n SignedS3AWSRequest.prototype.stringToSign = function () {\n return encodeURIComponent(this.signer.stringToSign());\n };\n SignedS3AWSRequest.prototype.canonicalRequest = function () {\n return this.signer.canonicalRequest();\n }\n SignedS3AWSRequest.prototype.signResponse = function(payload, stringToSign, signatureDateTime) {\n var self = this;\n return new Promise(function (resolve) {\n if (typeof self.con.signResponseHandler === 'function') {\n return self.con.signResponseHandler(payload, stringToSign, signatureDateTime)\n .then(resolve);\n }\n resolve(payload);\n });\n };\n SignedS3AWSRequest.prototype.sendRequestToAWS = function () {\n var self = this;\n return new Promise( function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n self.currentXhr = xhr;\n\n var url = [self.awsUrl, self.getPath(), self.request.path].join(\"\"),\n all_headers = {};\n\n if (self.request.query_string) {\n url += self.request.query_string;\n }\n extend(all_headers, self.request.not_signed_headers);\n extend(all_headers, self.request.x_amz_headers);\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n\n if (self.success_status(xhr)) {\n if (self.request.response_match &&\n xhr.response.match(new RegExp(self.request.response_match)) === undefined) {\n reject('AWS response does not match set pattern: ' + self.request.response_match);\n } else {\n resolve();\n }\n } else {\n var reason = xhr.responseText ? getAwsResponse(xhr) : ' ';\n reason += 'status:' + xhr.status;\n reject(reason);\n }\n }\n };\n\n xhr.open(self.request.method, url);\n xhr.setRequestHeader('Authorization', self.signer.authorizationString());\n\n for (var key in all_headers) {\n if (all_headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, all_headers[key]);\n }\n }\n\n self.signer.setHeaders(xhr);\n\n if (self.request.contentType) {\n xhr.setRequestHeader('Content-Type', self.request.contentType);\n }\n\n if (self.request.md5_digest) {\n xhr.setRequestHeader('Content-MD5', self.request.md5_digest);\n }\n xhr.onerror = function (xhr) {\n var reason = xhr.responseText ? getAwsResponse(xhr) : 'transport error';\n reject(reason);\n };\n\n if (typeof self.request.onProgress === 'function') {\n xhr.upload.onprogress = self.request.onProgress;\n }\n\n self.getPayload()\n .then(xhr.send.bind(xhr), reject);\n\n setTimeout(function () { // We have to delay here or Safari will hang\n self.started.resolve('request sent ' + self.request.step);\n }, 20);\n self.signer.payload = null;\n self.payloadPromise = undefined;\n });\n };\n //see: http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html#ConstructingTheAuthenticationHeader\n SignedS3AWSRequest.prototype.authorize = function () {\n this.request.dateString = this.signer.dateString(this.localTimeOffset);\n this.request.x_amz_headers = extend(this.request.x_amz_headers, {\n 'x-amz-date': this.request.dateString\n });\n return this.signer.getPayload()\n .then(function () {\n return authorizationMethod(this).authorize();\n }.bind(this));\n };\n SignedS3AWSRequest.prototype.authorizationSuccess = function (authorization) {\n l.d(this.request.step, 'signature:', authorization);\n this.request.auth = authorization;\n };\n SignedS3AWSRequest.prototype.trySend = function () {\n var self = this;\n return this.authorize()\n .then(\n function (value) {\n self.authorizationSuccess(value);\n if (self.fileUpload.status === ABORTED) { return; }\n self.sendRequestToAWS().then(self.success.bind(self), self.error.bind(self));\n },\n self.error.bind(self));\n };\n SignedS3AWSRequest.prototype.send = function () {\n this.trySend();\n return this.awsDeferred.promise;\n };\n\n function CancelableS3AWSRequest(fileUpload, request) {\n SignedS3AWSRequest.call(this, fileUpload, request);\n }\n CancelableS3AWSRequest.prototype = Object.create(SignedS3AWSRequest.prototype);\n CancelableS3AWSRequest.prototype.constructor = CancelableS3AWSRequest;\n CancelableS3AWSRequest.prototype.errorExceptionStatus = function () {\n return [ABORTED, CANCELED].indexOf(this.fileUpload.status) > -1;\n };\n\n function SignedS3AWSRequestWithRetryLimit(fileUpload, request, maxRetries) {\n if (maxRetries > -1) {\n this.maxRetries = maxRetries;\n }\n SignedS3AWSRequest.call(this, fileUpload, request);\n }\n SignedS3AWSRequestWithRetryLimit.prototype = Object.create(CancelableS3AWSRequest.prototype);\n SignedS3AWSRequestWithRetryLimit.prototype.constructor = SignedS3AWSRequestWithRetryLimit;\n SignedS3AWSRequestWithRetryLimit.prototype.maxRetries = 1;\n SignedS3AWSRequestWithRetryLimit.prototype.errorHandler = function (reason) {\n if (this.attempts > this.maxRetries) {\n var msg = ['MaxRetries exceeded. Will re-upload file id ', this.fileUpload.id, ', ', reason].join(\"\");\n l.w(msg);\n this.awsDeferred.reject(msg);\n return true;\n }\n };\n SignedS3AWSRequestWithRetryLimit.prototype.rejectedSuccess = function () {\n var reason = Array.prototype.slice.call(arguments, 1).join(\"\");\n this.awsDeferred.reject(reason);\n return false;\n };\n\n // see: http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadInitiate.html\n function InitiateMultipartUpload(fileUpload, awsKey) {\n var request = {\n method: 'POST',\n path: '?uploads',\n step: 'initiate',\n x_amz_headers: fileUpload.xAmzHeadersAtInitiate,\n not_signed_headers: fileUpload.notSignedHeadersAtInitiate,\n response_match: '(.+)<\\/UploadId>'\n };\n\n CancelableS3AWSRequest.call(this, fileUpload, request);\n this.awsKey = awsKey;\n }\n InitiateMultipartUpload.prototype = Object.create(CancelableS3AWSRequest.prototype);\n InitiateMultipartUpload.prototype.constructor = InitiateMultipartUpload;\n InitiateMultipartUpload.prototype.success = function () {\n var match = this.currentXhr.response.match(new RegExp(this.request.response_match));\n this.fileUpload.uploadId = match[1];\n this.fileUpload.awsKey = this.awsKey;\n l.d('InitiateMultipartUpload ID is', this.fileUpload.uploadId);\n this.fileUpload.createUploadFile();\n this.awsDeferred.resolve(this.currentXhr);\n };\n\n //http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadComplete.html\n function CompleteMultipartUpload(fileUpload) {\n fileUpload.info('will attempt to complete upload');\n var request = {\n method: 'POST',\n contentType: 'application/xml; charset=UTF-8',\n path: '?uploadId=' + fileUpload.uploadId,\n x_amz_headers: fileUpload.xAmzHeadersCommon || fileUpload.xAmzHeadersAtComplete,\n step: 'complete'\n };\n CancelableS3AWSRequest.call(this, fileUpload, request);\n }\n CompleteMultipartUpload.prototype = Object.create(CancelableS3AWSRequest.prototype);\n CompleteMultipartUpload.prototype.constructor = CompleteMultipartUpload;\n CompleteMultipartUpload.prototype.getPayload = function () {\n return Promise.resolve(this.fileUpload.getCompletedPayload());\n };\n\n //http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadComplete.html\n function ReuseS3Object(fileUpload, awsKey) {\n this.awsKey = awsKey;\n\n fileUpload.info('will attempt to verify existence of the file');\n\n var request = {\n method: 'HEAD',\n path: '',\n x_amz_headers: fileUpload.xAmzHeadersCommon,\n success404: true,\n step: 'head_object'\n };\n\n SignedS3AWSRequestWithRetryLimit.call(this, fileUpload, request);\n }\n ReuseS3Object.prototype = Object.create(SignedS3AWSRequestWithRetryLimit.prototype);\n ReuseS3Object.prototype.constructor = ReuseS3Object;\n ReuseS3Object.prototype.awsKey = undefined;\n ReuseS3Object.prototype.success = function () {\n var eTag = this.currentXhr.getResponseHeader('Etag');\n if (eTag !== this.fileUpload.eTag &&\n !this.rejectedSuccess('uploadId ', this.fileUpload.id, ' found on S3 but the Etag doesn\\'t match.')) { return; }\n this.awsDeferred.resolve(this.currentXhr);\n };\n\n //http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadListParts.html\n function ResumeInterruptedUpload(fileUpload) {\n SignedS3AWSRequestWithRetryLimit.call(this, fileUpload);\n this.updateRequest(this.setupRequest(0));\n }\n ResumeInterruptedUpload.prototype = Object.create(SignedS3AWSRequestWithRetryLimit.prototype);\n ResumeInterruptedUpload.prototype.constructor = ResumeInterruptedUpload;\n ResumeInterruptedUpload.prototype.awsKey = undefined;\n ResumeInterruptedUpload.prototype.partNumberMarker = 0;\n ResumeInterruptedUpload.prototype.setupRequest = function (partNumberMarker) {\n var msg = ['setupRequest() for uploadId:', this.fileUpload.uploadId, 'for part marker:', partNumberMarker].join(\" \");\n l.d(msg);\n\n this.fileUpload.info(msg);\n\n this.awsKey = this.fileUpload.name;\n this.partNumberMarker = partNumberMarker;\n\n var request = {\n method: 'GET',\n path: ['?uploadId=', this.fileUpload.uploadId].join(\"\"),\n query_string: \"&part-number-marker=\" + partNumberMarker,\n x_amz_headers: this.fileUpload.xAmzHeadersCommon,\n step: 'get upload parts',\n success404: true\n };\n\n this.request = request;\n return request;\n };\n ResumeInterruptedUpload.prototype.success = function () {\n if (this.currentXhr.status === 404) {\n // Success! Upload is no longer recognized, so there is nothing to fetch\n if (this.rejectedSuccess('uploadId ', this.fileUpload.id, ' not found on S3.')) { this.awsDeferred.resolve(this.currentXhr); }\n return;\n }\n\n var nextPartNumber = this.fileUpload.listPartsSuccess(this, this.currentXhr.responseText);\n if (nextPartNumber) {\n var request = this.setupRequest(nextPartNumber); // let's fetch the next set of parts\n this.updateRequest(request);\n this.trySend();\n } else {\n this.fileUpload.makePartsfromPartsOnS3();\n this.awsDeferred.resolve(this.currentXhr);\n }\n };\n\n //http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html\n function PutPart(fileUpload, part) {\n this.part = part;\n\n this.partNumber = part.partNumber;\n this.start = (this.partNumber - 1) * fileUpload.con.partSize;\n this.end = Math.min(this.partNumber * fileUpload.con.partSize, fileUpload.sizeBytes);\n\n var request = {\n method: 'PUT',\n path: '?partNumber=' + this.partNumber + '&uploadId=' + fileUpload.uploadId,\n step: 'upload #' + this.partNumber,\n x_amz_headers: fileUpload.xAmzHeadersCommon || fileUpload.xAmzHeadersAtUpload,\n contentSha256: \"UNSIGNED-PAYLOAD\",\n onProgress: this.onProgress.bind(this)\n };\n\n SignedS3AWSRequest.call(this, fileUpload, request);\n }\n PutPart.prototype = Object.create(SignedS3AWSRequest.prototype);\n PutPart.prototype.constructor = PutPart;\n PutPart.prototype.part = 1;\n PutPart.prototype.payloadPromise = undefined;\n PutPart.prototype.start = 0;\n PutPart.prototype.end = 0;\n PutPart.prototype.partNumber = undefined;\n PutPart.prototype.getPartMd5Digest = function () {\n var self = this,\n part = this.part;\n return new Promise(function (resolve, reject) {\n if (self.con.computeContentMd5 && !part.md5_digest) {\n self.getPayload()\n .then(function (data) {\n var md5_digest = self.con.cryptoMd5Method(data);\n if (self.partNumber === 1 && self.con.computeContentMd5 && typeof self.fileUpload.firstMd5Digest === \"undefined\") {\n self.fileUpload.firstMd5Digest = md5_digest;\n self.fileUpload.updateUploadFile({firstMd5Digest: md5_digest})\n }\n resolve(md5_digest);\n }, reject);\n } else {\n resolve(part.md5_digest);\n }\n }).then(function (md5_digest) {\n if (md5_digest) {\n l.d(self.request.step, 'MD5 digest:', md5_digest);\n self.request.md5_digest = md5_digest;\n self.part.md5_digest = md5_digest;\n }\n });\n };\n PutPart.prototype.sendRequestToAWS = function () {\n this.stalledInterval = setInterval(this.stalledPartMonitor(), PARTS_MONITOR_INTERVAL_MS);\n this.stalledPartMonitor();\n return SignedS3AWSRequest.prototype.sendRequestToAWS.call(this);\n };\n PutPart.prototype.send = function () {\n if (this.part.status !== COMPLETE &&\n [ABORTED, PAUSED, CANCELED].indexOf(this.fileUpload.status) === -1\n ) {\n l.d('uploadPart #', this.partNumber, this.attempts === 1 ? 'submitting' : 'retrying');\n\n this.part.status = EVAPORATING;\n this.attempts += 1;\n this.part.loadedBytesPrevious = null;\n\n var self = this;\n return this.getPartMd5Digest()\n .then(function () {\n l.d('Sending', self.request.step);\n SignedS3AWSRequest.prototype.send.call(self);\n });\n }\n };\n PutPart.prototype.success = function () {\n clearInterval(this.stalledInterval);\n var eTag = this.currentXhr.getResponseHeader('ETag');\n this.currentXhr = null;\n if (this.fileUpload.partSuccess(eTag, this)) { this.awsDeferred.resolve(this.currentXhr); }\n };\n PutPart.prototype.onProgress = function (evt) {\n if (evt.loaded > 0) {\n var loadedNow = evt.loaded - this.part.loadedBytes;\n if (loadedNow) {\n this.part.loadedBytes = evt.loaded;\n this.fileUpload.updateLoaded(loadedNow);\n }\n }\n };\n PutPart.prototype.stalledPartMonitor = function () {\n var lastLoaded = this.part.loadedBytes;\n var self = this;\n return function () {\n clearInterval(self.stalledInterval);\n if ([EVAPORATING, ERROR, PAUSING, PAUSED].indexOf(self.fileUpload.status) === -1 &&\n self.part.status !== ABORTED &&\n self.part.loadedBytes < this.size) {\n if (lastLoaded === self.part.loadedBytes) {\n l.w('Part stalled. Will abort and retry:', self.partNumber, decodeURIComponent(self.fileUpload.name));\n self.abort();\n if (!self.errorExceptionStatus()) {\n self.delaySend();\n }\n } else {\n self.stalledInterval = setInterval(self.stalledPartMonitor(), PARTS_MONITOR_INTERVAL_MS);\n }\n }\n }\n };\n PutPart.prototype.resetLoadedBytes = function () {\n this.fileUpload.updateLoaded(-this.part.loadedBytes);\n this.part.loadedBytes = 0;\n this.fileUpload.onProgress();\n };\n PutPart.prototype.errorExceptionStatus = function () {\n return [CANCELED, ABORTED, PAUSED, PAUSING].indexOf(this.fileUpload.status) > -1;\n };\n PutPart.prototype.delaySend = function () {\n var backOffWait = this.backOffWait();\n this.attempts += 1;\n setTimeout(this.send.bind(this), backOffWait);\n };\n PutPart.prototype.errorHandler = function (reason) {\n clearInterval(this.stalledInterval);\n if (reason.match(/status:404/)) {\n var errMsg = '404 error on part PUT. The part and the file will abort. ' + reason;\n l.w(errMsg);\n this.fileUpload.error(errMsg);\n this.part.status = ABORTED;\n this.awsDeferred.reject(errMsg);\n return true;\n }\n this.resetLoadedBytes();\n this.part.status = ERROR;\n\n if (!this.errorExceptionStatus()) {\n this.delaySend();\n }\n return true;\n };\n PutPart.prototype.abort = function () {\n if (this.currentXhr) {\n this.currentXhr.abort();\n }\n this.resetLoadedBytes();\n this.attempts = 1;\n };\n PutPart.size = 0;\n PutPart.prototype.streamToArrayBuffer = function (stream) {\n return new Promise(function (resolve, reject) {\n // stream is empty or ended\n if (!stream.readable) { return resolve([]); }\n\n var arr = new Uint8Array(Math.min(this.con.partSize, this.end - this.start)),\n i = 0;\n stream.on('data', onData);\n stream.on('end', onEnd);\n stream.on('error', onEnd);\n stream.on('close', onClose);\n\n function onData(data) {\n if (data.byteLength === 1) { return; }\n arr.set(data, i);\n i += data.byteLength;\n }\n\n function onEnd(err) {\n if (err) { reject(err); }\n else { resolve(arr); }\n cleanup();\n }\n\n function onClose() {\n resolve(arr);\n cleanup();\n }\n\n function cleanup() {\n arr = null;\n stream.removeListener('data', onData);\n stream.removeListener('end', onEnd);\n stream.removeListener('error', onEnd);\n stream.removeListener('close', onClose);\n }\n }.bind(this));\n };\n PutPart.prototype.getPayload = function () {\n if (typeof this.payloadPromise === 'undefined') {\n this.payloadPromise = this.con.readableStreams ? this.payloadFromStream() : this.payloadFromBlob();\n }\n return this.payloadPromise;\n };\n PutPart.prototype.payloadFromStream = function () {\n var stream = this.con.readableStreamPartMethod(this.fileUpload.file, this.start, this.end - 1);\n return new Promise(function (resolve, reject) {\n var streamPromise = this.streamToArrayBuffer(stream);\n streamPromise.then(function (data) {\n resolve(data);\n }.bind(this), reject);\n }.bind(this));\n };\n PutPart.prototype.payloadFromBlob = function () {\n // browsers' implementation of the Blob.slice function has been renamed a couple of times, and the meaning of the\n // 2nd parameter changed. For example Gecko went from slice(start,length) -> mozSlice(start, end) -> slice(start, end).\n // As of 12/12/12, it seems that the unified 'slice' is the best bet, hence it being first in the list. See\n // https://developer.mozilla.org/en-US/docs/DOM/Blob for more info.\n var file = this.fileUpload.file,\n slicerFn = (file.slice ? 'slice' : (file.mozSlice ? 'mozSlice' : 'webkitSlice')),\n blob = file[slicerFn](this.start, this.end);\n if (this.con.computeContentMd5) {\n return new Promise(function (resolve) {\n var reader = new FileReader();\n reader.onloadend = function () {\n var buffer = this.result && typeof this.result.buffer !== 'undefined',\n result = buffer ? new Uint8Array(this.result.buffer) : this.result;\n resolve(result);\n };\n reader.readAsArrayBuffer(blob);\n });\n }\n return Promise.resolve(blob);\n };\n PutPart.prototype.stalledInterval = -1;\n PutPart.prototype.getStartedPromise = function () {\n return this.started.promise;\n };\n\n\n //http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadAbort.html\n function DeleteMultipartUpload(fileUpload) {\n fileUpload.info('will attempt to abort the upload');\n\n fileUpload.abortParts();\n\n var request = {\n method: 'DELETE',\n path: '?uploadId=' + fileUpload.uploadId,\n x_amz_headers: fileUpload.xAmzHeadersCommon,\n success404: true,\n step: 'abort'\n };\n\n SignedS3AWSRequest.call(this, fileUpload, request);\n }\n DeleteMultipartUpload.prototype = Object.create(SignedS3AWSRequest.prototype);\n DeleteMultipartUpload.prototype.constructor = DeleteMultipartUpload;\n DeleteMultipartUpload.prototype.maxRetries = 1;\n DeleteMultipartUpload.prototype.success = function () {\n this.fileUpload.setStatus(ABORTED);\n this.awsDeferred.resolve(this.currentXhr);\n };\n DeleteMultipartUpload.prototype.errorHandler = function (reason) {\n if (this.attempts > this.maxRetries) {\n var msg = 'Error aborting upload, Exceeded retries deleting the file upload: ' + reason;\n l.w(msg);\n this.fileUpload.error(msg);\n this.awsDeferred.reject(msg);\n return true;\n }\n };\n\n function signingVersion(awsRequest, l) {\n var con = awsRequest.con;\n function AwsSignature(request) {\n this.request = request;\n }\n AwsSignature.prototype.request = {};\n AwsSignature.prototype.error = function () {};\n AwsSignature.prototype.authorizationString = function () {};\n AwsSignature.prototype.stringToSign = function () {};\n AwsSignature.prototype.canonicalRequest = function () {};\n AwsSignature.prototype.setHeaders = function () {};\n AwsSignature.prototype.datetime = function (timeOffset) {\n return new Date(new Date().getTime() + timeOffset);\n\n };\n AwsSignature.prototype.dateString = function (timeOffset) {\n return this.datetime(timeOffset).toISOString().slice(0, 19).replace(/-|:/g, '') + \"Z\";\n };\n\n function AwsSignatureV2(request) {\n AwsSignature.call(this, request);\n }\n AwsSignatureV2.prototype = Object.create(AwsSignature.prototype);\n AwsSignatureV2.prototype.constructor = AwsSignatureV2;\n AwsSignatureV2.prototype.authorizationString = function () {\n return ['AWS ', con.aws_key, ':', this.request.auth].join('');\n };\n AwsSignatureV2.prototype.stringToSign = function () {\n var x_amz_headers = '', result, header_key_array = [];\n\n for (var key in this.request.x_amz_headers) {\n if (this.request.x_amz_headers.hasOwnProperty(key)) {\n header_key_array.push(key);\n }\n }\n header_key_array.sort();\n\n header_key_array.forEach(function (header_key) {\n x_amz_headers += (header_key + ':' + this.request.x_amz_headers[header_key] + '\\n');\n }.bind(this));\n\n result = this.request.method + '\\n' +\n (this.request.md5_digest || '') + '\\n' +\n (this.request.contentType || '') + '\\n' +\n '\\n' +\n x_amz_headers +\n (con.cloudfront ? '/' + con.bucket : '') +\n awsRequest.getPath() + this.request.path;\n\n l.d('V2 stringToSign:', result);\n return result;\n\n };\n AwsSignatureV2.prototype.dateString = function (timeOffset) {\n return this.datetime(timeOffset).toUTCString();\n };\n AwsSignatureV2.prototype.getPayload = function () { return Promise.resolve(); };\n\n function AwsSignatureV4(request) {\n this._cr = undefined\n AwsSignature.call(this, request);\n }\n AwsSignatureV4.prototype = Object.create(AwsSignature.prototype);\n AwsSignatureV4.prototype.constructor = AwsSignatureV4;\n AwsSignatureV4.prototype._cr = undefined;\n AwsSignatureV4.prototype.payload = null;\n AwsSignatureV4.prototype.error = function () { this._cr = undefined; };\n AwsSignatureV4.prototype.getPayload = function () {\n return awsRequest.getPayload()\n .then(function (data) {\n this.payload = data;\n }.bind(this));\n };\n AwsSignatureV4.prototype.authorizationString = function () {\n var authParts = [];\n\n var credentials = this.credentialString();\n var headers = this.canonicalHeaders();\n\n authParts.push(['AWS4-HMAC-SHA256 Credential=', con.aws_key, '/', credentials].join(''));\n authParts.push('SignedHeaders=' + headers.signedHeaders);\n authParts.push('Signature=' + this.request.auth);\n\n return authParts.join(', ');\n };\n AwsSignatureV4.prototype.stringToSign = function () {\n var signParts = [];\n signParts.push('AWS4-HMAC-SHA256');\n signParts.push(this.request.dateString);\n signParts.push(this.credentialString());\n signParts.push(con.cryptoHexEncodedHash256(this.canonicalRequest()));\n var result = signParts.join('\\n');\n\n l.d('V4 stringToSign:', result);\n return result;\n };\n AwsSignatureV4.prototype.credentialString = function () {\n var credParts = [];\n\n credParts.push(this.request.dateString.slice(0, 8));\n credParts.push(con.awsRegion);\n credParts.push('s3');\n credParts.push('aws4_request');\n return credParts.join('/');\n };\n AwsSignatureV4.prototype.canonicalQueryString = function () {\n var qs = awsRequest.request.query_string || '',\n search = uri([awsRequest.awsUrl, this.request.path, qs].join(\"\")).search,\n searchParts = search.length ? search.split('&') : [],\n encoded = [],\n nameValue,\n i;\n\n for (i = 0; i < searchParts.length; i++) {\n nameValue = searchParts[i].split(\"=\");\n encoded.push({\n name: encodeURIComponent(nameValue[0]),\n value: nameValue.length > 1 ? encodeURIComponent(nameValue[1]) : null\n })\n }\n var sorted = encoded.sort(function (a, b) {\n if (a.name < b.name) {\n return -1;\n } else if (a.name > b.name) {\n return 1;\n }\n return 0;\n });\n\n var result = [];\n for (i = 0; i < sorted.length; i++) {\n nameValue = sorted[i].value ? [sorted[i].name, sorted[i].value].join(\"=\") : sorted[i].name + '=';\n result.push(nameValue);\n }\n\n return result.join('&');\n };\n AwsSignatureV4.prototype.getPayloadSha256Content = function () {\n var result = this.request.contentSha256 || con.cryptoHexEncodedHash256(this.payload || '');\n l.d(this.request.step, 'getPayloadSha256Content:', result);\n return result;\n };\n AwsSignatureV4.prototype.canonicalHeaders = function () {\n var canonicalHeaders = [],\n keys = [],\n i;\n\n function addHeader(name, value) {\n var key = name.toLowerCase();\n keys.push(key);\n canonicalHeaders[key] = value.replace(/\\s+/g, ' ');\n }\n\n if (this.request.md5_digest) {\n addHeader(\"Content-Md5\", this.request.md5_digest);\n }\n\n addHeader('Host', awsRequest.awsHost);\n\n if (this.request.contentType) {\n addHeader('Content-Type', this.request.contentType || '');\n }\n\n var amzHeaders = this.request.x_amz_headers || {};\n for (var key in amzHeaders) {\n if (amzHeaders.hasOwnProperty(key)) {\n addHeader(key, amzHeaders[key]);\n }\n }\n\n var sortedKeys = keys.sort(function (a, b) {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n return 0;\n });\n\n var result = [];\n\n var unsigned_headers = [],\n not_signed = this.request.not_signed_headers || [],\n signed_headers = [];\n for (i = 0; i < not_signed.length; i++) {\n unsigned_headers.push(not_signed[i].toLowerCase());\n }\n\n for (i = 0; i < sortedKeys.length; i++) {\n var k = sortedKeys[i];\n result.push([k, canonicalHeaders[k]].join(\":\"));\n if (unsigned_headers.indexOf(k) === -1) {\n signed_headers.push(k);\n }\n }\n\n return {\n canonicalHeaders: result.join(\"\\n\"),\n signedHeaders: signed_headers.join(\";\")\n };\n };\n AwsSignatureV4.prototype.canonicalRequest = function () {\n if (typeof this._cr !== 'undefined') { return this._cr; }\n var canonParts = [];\n\n canonParts.push(this.request.method);\n canonParts.push(uri([awsRequest.awsUrl, awsRequest.getPath(), this.request.path].join(\"\")).pathname);\n canonParts.push(this.canonicalQueryString() || '');\n\n var headers = this.canonicalHeaders();\n canonParts.push(headers.canonicalHeaders + '\\n');\n canonParts.push(headers.signedHeaders);\n canonParts.push(this.getPayloadSha256Content());\n\n this._cr = canonParts.join(\"\\n\");\n l.d(this.request.step, 'V4 CanonicalRequest:', this._cr);\n return this._cr;\n };\n AwsSignatureV4.prototype.setHeaders = function (xhr) {\n xhr.setRequestHeader(\"x-amz-content-sha256\", this.getPayloadSha256Content());\n };\n\n return con.awsSignatureVersion === '4' ? AwsSignatureV4 : AwsSignatureV2;\n }\n function authorizationMethod(awsRequest) {\n var fileUpload = awsRequest.fileUpload,\n con = fileUpload.con,\n request = awsRequest.request;\n\n function AuthorizationMethod() {\n this.request = request;\n }\n AuthorizationMethod.prototype = Object.create(AuthorizationMethod.prototype);\n AuthorizationMethod.prototype.request = {};\n AuthorizationMethod.makeSignParamsObject = function (params) {\n var out = {};\n for (var param in params) {\n if (!params.hasOwnProperty(param)) { continue; }\n if (typeof params[param] === 'function') {\n out[param] = params[param]();\n } else {\n out[param] = params[param];\n }\n }\n return out;\n };\n AuthorizationMethod.prototype.authorize = function () {\n return new Promise(function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n awsRequest.currentXhr = xhr;\n\n var stringToSign = awsRequest.stringToSign(),\n url = [con.signerUrl, '?to_sign=', stringToSign, '&datetime=', request.dateString];\n if (con.sendCanonicalRequestToSignerUrl) {\n url.push('&canonical_request=');\n url.push(encodeURIComponent(awsRequest.canonicalRequest()));\n }\n url = url.join(\"\");\n\n var signParams = AuthorizationMethod.makeSignParamsObject(fileUpload.signParams);\n for (var param in signParams) {\n if (!signParams.hasOwnProperty(param)) { continue; }\n url += ('&' + encodeURIComponent(param) + '=' + encodeURIComponent(signParams[param]));\n }\n\n if (con.xhrWithCredentials) {\n xhr.withCredentials = true;\n }\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n awsRequest.signResponse(xhr.response, stringToSign, request.dateString)\n .then(resolve);\n } else {\n if ([401, 403].indexOf(xhr.status) > -1) {\n var reason = \"status:\" + xhr.status;\n fileUpload.deferredCompletion.reject('Permission denied ' + reason);\n return reject(reason);\n }\n reject(\"Signature fetch returned status: \" + xhr.status);\n }\n }\n };\n\n xhr.onerror = function (xhr) {\n reject('authorizedSend transport error: ' + xhr.responseText);\n };\n\n xhr.open('GET', url);\n var signHeaders = AuthorizationMethod.makeSignParamsObject(con.signHeaders);\n for (var header in signHeaders) {\n if (!signHeaders.hasOwnProperty(header)) { continue; }\n xhr.setRequestHeader(header, signHeaders[header])\n }\n\n if (typeof fileUpload.beforeSigner === 'function') {\n fileUpload.beforeSigner(xhr, url);\n }\n xhr.send();\n });\n };\n\n function AuthorizationCustom() {\n AuthorizationMethod.call(this);\n }\n AuthorizationCustom.prototype = Object.create(AuthorizationMethod.prototype);\n AuthorizationCustom.prototype.authorize = function () {\n return con.customAuthMethod(\n AuthorizationMethod.makeSignParamsObject(fileUpload.signParams),\n AuthorizationMethod.makeSignParamsObject(con.signHeaders),\n awsRequest.stringToSign(),\n request.dateString,\n awsRequest.canonicalRequest())\n .catch(function (reason) {\n fileUpload.deferredCompletion.reject(reason);\n throw reason;\n });\n };\n\n if (typeof con.customAuthMethod === 'function') {\n return new AuthorizationCustom()\n }\n\n return new AuthorizationMethod();\n }\n\n function awsUrl(con) {\n var url;\n if (con.aws_url) {\n url = [con.aws_url];\n } else {\n if (con.s3Acceleration) {\n url = [\"https://\", con.bucket, \".s3-accelerate\"];\n con.cloudfront = true;\n } else {\n url = [\"https://\", (con.cloudfront ? con.bucket + \".\" : \"\"), \"s3\"];\n if (con.awsRegion !== \"us-east-1\") {\n url.push(\"-\", con.awsRegion);\n }\n }\n url.push(\".amazonaws.com\");\n }\n return url.join(\"\");\n }\n\n function s3EncodedObjectName(fileName) {\n var fileParts = fileName.split('/'),\n encodedParts = [];\n fileParts.forEach(function (p) {\n var buf = [],\n enc = encodeURIComponent(p);\n for (var i = 0; i < enc.length; i++) {\n buf.push(S3_EXTRA_ENCODED_CHARS[enc.charCodeAt(i)] || enc.charAt(i));\n }\n encodedParts.push(buf.join(\"\"));\n });\n return encodedParts.join('/');\n }\n\n function uri(url) {\n var p,\n href = url || '/';\n\n try {\n p = new URL(href);\n } catch (e) {\n p = document.createElement('a');\n p.href = href;\n }\n\n return {\n protocol: p.protocol, // => \"http:\"\n hostname: p.hostname, // => \"example.com\"\n // IE omits the leading slash, so add it if it's missing\n pathname: p.pathname.replace(/(^\\/?)/, \"/\"), // => \"/pathname/\"\n port: p.port, // => \"3000\"\n search: (p.search[0] === '?') ? p.search.substr(1) : p.search, // => \"search=test\"\n hash: p.hash, // => \"#hash\"\n host: p.host // => \"example.com:3000\"\n };\n }\n\n function dateISOString(date) {\n // Try to get the modified date as an ISO String, if the date exists\n return date ? new Date(date).toISOString() : '';\n }\n\n function getAwsResponse(xhr) {\n var code = elementText(xhr.responseText, \"Code\"),\n msg = elementText(xhr.responseText, \"Message\");\n return code.length ? ['AWS Code: ', code, ', Message:', msg].join(\"\") : '';\n }\n\n function elementText(source, element) {\n var match = source.match([\"<\", element, \">(.+)\"].join(\"\"));\n return match ? match[1] : '';\n }\n\n function defer() {\n var deferred = {}, promise;\n promise = new Promise(function(resolve, reject){\n deferred = {resolve: resolve, reject: reject};\n });\n return {\n resolve: deferred.resolve,\n reject: deferred.reject,\n promise: promise\n }\n }\n\n function extend(obj1, obj2, obj3) {\n function ext(target, source) {\n if (typeof source !== 'object') { return; }\n for (var key in source) {\n if (source.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n }\n }\n\n obj1 = obj1 || {};\n obj2 = obj2 || {};\n obj3 = obj3 || {};\n ext(obj2, obj3);\n ext(obj1, obj2);\n\n return obj1;\n }\n\n function getSavedUploads(purge) {\n var uploads = JSON.parse(historyCache.getItem('awsUploads') || '{}');\n\n if (purge) {\n for (var key in uploads) {\n if (uploads.hasOwnProperty(key)) {\n var upload = uploads[key],\n completedAt = new Date(upload.completedAt || FAR_FUTURE);\n\n if (completedAt < HOURS_AGO) {\n // The upload is recent, let's keep it\n delete uploads[key];\n }\n }\n }\n\n historyCache.setItem('awsUploads', JSON.stringify(uploads));\n }\n\n return uploads;\n }\n\n function uploadKey(fileUpload) {\n // The key tries to give a signature to a file in the absence of its path.\n // \"---\"\n return [\n fileUpload.file.name,\n fileUpload.file.type,\n dateISOString(fileUpload.file.lastModified),\n fileUpload.sizeBytes\n ].join(\"-\");\n }\n\n function saveUpload(uploadKey, upload) {\n var uploads = getSavedUploads();\n uploads[uploadKey] = upload;\n historyCache.setItem('awsUploads', JSON.stringify(uploads));\n }\n\n function removeUpload(uploadKey) {\n var uploads = getSavedUploads();\n delete uploads[uploadKey];\n historyCache.setItem('awsUploads', JSON.stringify(uploads));\n }\n\n function removeAtIndex(a, i) {\n var idx = a.indexOf(i);\n if (idx > -1) {\n a.splice(idx, 1);\n return true;\n }\n }\n\n function readableFileSize(size) {\n // Adapted from https://github.com/fkjaekel\n // https://github.com/TTLabs/EvaporateJS/issues/13\n var units = ['B', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb', 'Eb', 'Zb', 'Yb'],\n i = 0;\n while(size >= 1024) {\n size /= 1024;\n ++i;\n }\n return [size.toFixed(2).replace('.00', ''), units[i]].join(\" \");\n }\n\n var historyCache;\n function HistoryCache(mockLocalStorage) {\n var supported = HistoryCache.supported();\n this.cacheStore = mockLocalStorage ? {} : (supported ? localStorage : undefined);\n }\n HistoryCache.prototype.supported = false;\n HistoryCache.prototype.cacheStore = undefined;\n HistoryCache.prototype.getItem = function (key) { if (this.cacheStore) { return this.cacheStore[key]; }};\n HistoryCache.prototype.setItem = function (key, value) { if (this.cacheStore) { this.cacheStore[key] = value; }};\n HistoryCache.prototype.removeItem = function (key) { if (this.cacheStore) { return delete this.cacheStore[key] }};\n HistoryCache.supported = function () {\n var result = false;\n if (typeof window !== 'undefined') {\n if (!('localStorage' in window)) {\n return result;\n }\n } else {\n return result;\n }\n\n // Try to use storage (it might be disabled, e.g. user is in private mode)\n try {\n var k = '___test';\n localStorage[k] = 'OK';\n var test = localStorage[k];\n delete localStorage[k];\n return test === 'OK';\n } catch (e) {\n return result;\n }\n };\n\n function noOpLogger() { return {d: function () {}, w: function () {}, e: function () {}}; }\n\n l = noOpLogger();\n\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = Evaporate;\n } else if (typeof window !== 'undefined') {\n window.Evaporate = Evaporate;\n }\n\n}());\n"],"names":["HOURS_AGO","l","historyCache","FAR_FUTURE","Date","EVAPORATING","PAUSED","CANCELED","ERROR","ABORTED","PAUSING","PAUSED_STATUSES","ACTIVE_STATUSES","PARTS_MONITOR_INTERVAL_MS","IMMUTABLE_OPTIONS","S3_EXTRA_ENCODED_CHARS","Evaporate","config","this","extend","readableStreams","readableStreamPartMethod","bucket","logging","maxConcurrentParts","partSize","retryBackoffPower","maxRetryBackoffSecs","progressIntervalMS","cloudfront","s3Acceleration","mockLocalStorage","encodeFilename","computeContentMd5","allowS3ExistenceOptimization","onlyRetryForSameFileName","timeUrl","cryptoMd5Method","cryptoHexEncodedHash256","aws_key","awsRegion","awsSignatureVersion","sendCanonicalRequestToSignerUrl","s3FileCacheHoursAgo","signParams","signHeaders","customAuthMethod","undefined","maxFileSize","signResponseHandler","xhrWithCredentials","localTimeOffset","evaporateChanged","abortCompletionThrottlingMs","window","console","d","log","w","warn","e","error","_instantiationError","validateEvaporateOptions","_d","setHours","getHours","self","getLocalTimeOffset","then","offset","pendingFiles","queuedFiles","filesInProcess","HistoryCache","supported","FileUpload","file","con","evaporate","fileTotalBytesUploaded","s3Parts","partsOnS3","partsInProcess","partsToUpload","numParts","deferredCompletion","defer","id","decodeURIComponent","name","SignedS3AWSRequest","fileUpload","request","attempts","awsDeferred","started","awsUrl","url","aws_url","push","join","awsHost","uri","hostname","r","contentType","updateRequest","CancelableS3AWSRequest","call","SignedS3AWSRequestWithRetryLimit","maxRetries","InitiateMultipartUpload","awsKey","method","path","step","x_amz_headers","xAmzHeadersAtInitiate","not_signed_headers","notSignedHeadersAtInitiate","response_match","CompleteMultipartUpload","info","uploadId","xAmzHeadersCommon","xAmzHeadersAtComplete","ReuseS3Object","success404","ResumeInterruptedUpload","setupRequest","PutPart","part","partNumber","start","end","Math","min","sizeBytes","xAmzHeadersAtUpload","contentSha256","onProgress","bind","DeleteMultipartUpload","abortParts","p","href","URL","document","createElement","protocol","pathname","replace","port","search","substr","hash","host","dateISOString","date","toISOString","getAwsResponse","xhr","code","elementText","responseText","msg","length","source","element","match","promise","deferred","Promise","resolve","reject","obj1","obj2","obj3","ext","target","key","hasOwnProperty","getSavedUploads","purge","uploads","JSON","parse","getItem","upload","completedAt","setItem","stringify","uploadKey","type","lastModified","saveUpload","removeAtIndex","a","i","idx","indexOf","splice","readableFileSize","size","toFixed","cacheStore","localStorage","create","evapConfig","XMLHttpRequest","open","getTime","onreadystatechange","readyState","status","onerror","send","prototype","evaporatingCount","startNextFile","reason","shift","evaporatingCnt","fileCleanup","done","consumeRemainingSlots","queueFile","add","pConfig","fileConfig","fileName","fileParts","encodedParts","c","forEach","split","buf","enc","encodeURIComponent","charCodeAt","charAt","uploadInitiated","progress","complete","cancelled","paused","resumed","pausing","nameChanged","beforeSigner","priority","loadedBytes","eTag","fileKey","cancel","_cancelAll","_cancelOne","promises","stop","all","pause","options","force","_pauseAll","_pauseOne","_pause","resume","_resumeAll","_resumeOne","resumeFile","forceRetry","avail","consumed","consumeSlots","File","Blob","webkitSlice","mozSlice","slice","signerUrl","FileReader","readAsArrayBuffer","incr","max","abortedByUser","progressInterval","startTime","loaded","totalUploaded","updateLoaded","loadedNow","progessStats","speed","readableSpeed","remainingSize","secondsLeft","fileSize","delta","avgSpeed","stats","round","startMonitor","clearInterval","setInterval","stopMonitor","getRemainingSlots","evapCount","lastPartSatisfied","getUnfinishedFileUpload","existenceOptimized","firstMd5Digest","reuseS3Object","catch","uploadFileFromScratch","resumeInterruptedUpload","_uploadComplete","uploadFile","_abortUpload","completeUpload","setStatus","abortUpload","map","awsRequest","_startCompleteUpload","callComplete","s3Part","abort","makeParts","firstPart","ceil","partsDeferredPromises","cleanUpAfterPart","limit","makePart","loadedBytesPrevious","isEmpty","md5_digest","s","createUploadFile","fileType","lastModifiedDate","createdAt","updateUploadFile","updates","completeUploadFile","removeUploadFile","removeUpload","u","canRetryUpload","partSuccess","putRequest","resetLoadedBytes","listPartsSuccess","listPartsRequest","partsXml","partNumberMarker","partRegex","cp","exec","parseInt","LastModified","makePartsfromPartsOnS3","uploadedPart","finishedUploadingAt","getCompletedPayload","completeDoc","satisfied","canStartPart","delaySend","getStartedPromise","allInProcess","remainingSlots","errorExceptionStatus","uploadParts","firstS3Part","getPartMd5Digest","authorize","getPath","SigningClass","AwsSignature","AwsSignatureV2","AwsSignatureV4","_cr","authorizationString","stringToSign","canonicalRequest","setHeaders","datetime","timeOffset","dateString","Object","constructor","auth","result","header_key_array","sort","header_key","toUTCString","getPayload","payload","data","authParts","credentials","credentialString","headers","canonicalHeaders","signedHeaders","signParts","credParts","canonicalQueryString","nameValue","qs","query_string","searchParts","encoded","value","sorted","b","getPayloadSha256Content","keys","addHeader","toLowerCase","amzHeaders","sortedKeys","unsigned_headers","not_signed","signed_headers","k","canonParts","setRequestHeader","signingVersion","signer","success","currentXhr","backOffWait","pow","errorHandler","setTimeout","trySend","success_status","signResponse","signatureDateTime","sendRequestToAWS","all_headers","response","RegExp","onprogress","payloadPromise","AuthorizationMethod","AuthorizationCustom","makeSignParamsObject","params","out","param","withCredentials","header","authorizationMethod","authorizationSuccess","authorization","rejectedSuccess","Array","arguments","getResponseHeader","nextPartNumber","stalledInterval","stalledPartMonitor","evt","lastLoaded","errMsg","streamToArrayBuffer","stream","readable","arr","Uint8Array","onData","byteLength","set","onEnd","err","cleanup","onClose","removeListener","on","payloadFromStream","payloadFromBlob","blob","reader","onloadend","buffer","removeItem","test","module","exports"],"sourceRoot":""}