@micromag/viewer-build 0.2.398 → 0.2.399
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/asset-manifest.json +36 -38
- package/build/index.html +1 -1
- package/build/static/js/0.69a41d35.chunk.js +2 -0
- package/build/static/js/0.69a41d35.chunk.js.map +1 -0
- package/build/static/js/1.8749f3d7.chunk.js +2 -0
- package/build/static/js/1.8749f3d7.chunk.js.map +1 -0
- package/build/static/js/{11.9b03ae00.chunk.js → 10.5548eab7.chunk.js} +2 -2
- package/build/static/js/{11.9b03ae00.chunk.js.map → 10.5548eab7.chunk.js.map} +1 -1
- package/build/static/js/{12.07f6dfbf.chunk.js → 11.5c58bd92.chunk.js} +2 -2
- package/build/static/js/{12.07f6dfbf.chunk.js.map → 11.5c58bd92.chunk.js.map} +1 -1
- package/build/static/js/{13.af8da627.chunk.js → 12.703b846d.chunk.js} +2 -2
- package/build/static/js/{13.af8da627.chunk.js.map → 12.703b846d.chunk.js.map} +1 -1
- package/build/static/js/{14.e42f0789.chunk.js → 13.e2bba628.chunk.js} +2 -2
- package/build/static/js/{14.e42f0789.chunk.js.map → 13.e2bba628.chunk.js.map} +1 -1
- package/build/static/js/14.95f5da64.chunk.js +2 -0
- package/build/static/js/14.95f5da64.chunk.js.map +1 -0
- package/build/static/js/{16.d2386b37.chunk.js → 15.f1290dcc.chunk.js} +2 -2
- package/build/static/js/{16.d2386b37.chunk.js.map → 15.f1290dcc.chunk.js.map} +1 -1
- package/build/static/js/4.03dcd345.chunk.js +3 -0
- package/build/static/js/{5.36556929.chunk.js.LICENSE.txt → 4.03dcd345.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/4.03dcd345.chunk.js.map +1 -0
- package/build/static/js/{7.1cc6c06d.chunk.js → 5.2ea912f0.chunk.js} +2 -2
- package/build/static/js/{7.1cc6c06d.chunk.js.map → 5.2ea912f0.chunk.js.map} +1 -1
- package/build/static/js/{2.89735343.chunk.js → 6.517fcd7a.chunk.js} +2 -2
- package/build/static/js/6.517fcd7a.chunk.js.map +1 -0
- package/build/static/js/{8.7d772a7e.chunk.js → 7.5a52b215.chunk.js} +2 -2
- package/build/static/js/{8.7d772a7e.chunk.js.map → 7.5a52b215.chunk.js.map} +1 -1
- package/build/static/js/{9.2b1ae3f1.chunk.js → 8.c57879b2.chunk.js} +2 -2
- package/build/static/js/{9.2b1ae3f1.chunk.js.map → 8.c57879b2.chunk.js.map} +1 -1
- package/build/static/js/9.8eb300f6.chunk.js +2 -0
- package/build/static/js/9.8eb300f6.chunk.js.map +1 -0
- package/build/static/js/main.33657a37.chunk.js +2 -0
- package/build/static/js/main.33657a37.chunk.js.map +1 -0
- package/build/static/js/runtime-main.35b56a39.js +2 -0
- package/build/static/js/runtime-main.35b56a39.js.map +1 -0
- package/package.json +7 -7
- package/build/static/js/0.b8a162a9.chunk.js +0 -2
- package/build/static/js/0.b8a162a9.chunk.js.map +0 -1
- package/build/static/js/1.c7a69c3d.chunk.js +0 -2
- package/build/static/js/1.c7a69c3d.chunk.js.map +0 -1
- package/build/static/js/10.11cb5892.chunk.js +0 -2
- package/build/static/js/10.11cb5892.chunk.js.map +0 -1
- package/build/static/js/15.15c6ee58.chunk.js +0 -2
- package/build/static/js/15.15c6ee58.chunk.js.map +0 -1
- package/build/static/js/2.89735343.chunk.js.map +0 -1
- package/build/static/js/5.36556929.chunk.js +0 -3
- package/build/static/js/5.36556929.chunk.js.map +0 -1
- package/build/static/js/6.9d7e4dda.chunk.js +0 -2
- package/build/static/js/6.9d7e4dda.chunk.js.map +0 -1
- package/build/static/js/main.b3b43245.chunk.js +0 -2
- package/build/static/js/main.b3b43245.chunk.js.map +0 -1
- package/build/static/js/runtime-main.82def290.js +0 -2
- package/build/static/js/runtime-main.82def290.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/tus-js-client/lib.esm/error.js","../../../node_modules/tus-js-client/lib.esm/logger.js","../../../node_modules/tus-js-client/lib.esm/upload.js","../../../node_modules/tus-js-client/lib.esm/uuid.js","../../../node_modules/tus-js-client/lib.esm/noopUrlStorage.js","../../../node_modules/tus-js-client/lib.esm/browser/urlStorage.js","../../../node_modules/tus-js-client/lib.esm/browser/httpStack.js","../../../node_modules/tus-js-client/lib.esm/browser/isReactNative.js","../../../node_modules/tus-js-client/lib.esm/browser/isCordova.js","../../../node_modules/tus-js-client/lib.esm/browser/fileReader.js","../../../node_modules/tus-js-client/lib.esm/browser/readAsByteArray.js","../../../node_modules/tus-js-client/lib.esm/browser/uriToBlob.js","../../../node_modules/tus-js-client/lib.esm/browser/index.js","../../../node_modules/tus-js-client/lib.esm/browser/fingerprint.js","../../../node_modules/@uppy/tus/lib/index.js","../../../node_modules/js-base64/base64.js","../../../node_modules/url-parse/index.js","../../../node_modules/requires-port/index.js","../../../node_modules/querystringify/index.js","../../../node_modules/@uppy/tus/lib/getFingerprint.js"],"names":["_typeof","obj","Symbol","iterator","constructor","prototype","_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","self","call","ReferenceError","_assertThisInitialized","_wrapNativeSuper","Class","_cache","Map","undefined","fn","Function","toString","indexOf","has","get","set","Wrapper","_construct","arguments","_getPrototypeOf","this","Object","create","value","enumerable","writable","configurable","_setPrototypeOf","Parent","args","_isNativeReflectConstruct","Reflect","construct","a","push","apply","bind","sham","Proxy","Date","e","o","p","setPrototypeOf","__proto__","getPrototypeOf","DetailedError","_Error","subClass","superClass","_inherits","Derived","_super","result","Super","NewTarget","message","_this","causingErr","length","req","res","originalRequest","originalResponse","causingError","concat","requestId","getHeader","method","getMethod","url","getURL","status","getStatus","body","getBody","Error","isEnabled","enableDebugLog","log","msg","console","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","_objectSpread","target","i","source","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_defineProperties","props","descriptor","defaultOptions","endpoint","uploadUrl","metadata","fingerprint","uploadSize","onProgress","onChunkComplete","onSuccess","onError","_onUploadUrlAvailable","overridePatchMethod","headers","addRequestId","onBeforeRequest","onAfterResponse","onShouldRetry","chunkSize","Infinity","retryDelays","parallelUploads","storeFingerprintForResuming","removeFingerprintOnSuccess","uploadLengthDeferred","uploadDataDuringCreation","urlStorage","fileReader","httpStack","BaseUpload","file","options","_urlStorage","_req","_fingerprint","_urlStorageKey","_offset","_aborted","_size","_source","_retryAttempt","_retryTimeout","_offsetBeforeRetry","_parallelUploads","_parallelUploadUrls","protoProps","staticProps","then","findUploadsByFingerprint","previousUpload","parallelUploadUrls","urlStorageKey","_this2","optionName","_emitError","openFile","_startParallelUpload","_startSingleUpload","err","_this3","totalSize","size","totalProgress","partCount","parts","previousUrls","partSize","Math","floor","start","end","part","index","splitSizeIntoParts","Array","uploads","map","lastPartProgress","slice","_ref","Promise","resolve","reject","newPartProgress","_emitProgress","upload","u","_saveUploadInUrlStorage","all","_openRequest","setHeader","join","encodeMetadata","_sendRequest","inStatusCategory","location","resolveUrl","_emitSuccess","_emitHttpError","isNaN","_resumeUpload","_createUpload","shouldTerminate","_this4","abort","close","clearTimeout","terminate","_removeFromUrlStorage","_this5","shouldRetry","delay","setTimeout","bytesSent","bytesTotal","bytesAccepted","_this6","promise","_addChunkToRequest","_handleUploadResponse","_performUpload","_this7","offset","parseInt","_this8","_this9","setProgressHandler","_ref2","done","_emitChunkComplete","openRequest","_this10","removeUpload","_this11","storedUpload","creationTime","addUpload","sendRequest","remainingDelays","newOptions","encoded","Base64","encode","category","createRequest","name","replace","c","r","random","send","retryAttempt","online","window","navigator","onLine","isOnline","origin","link","URL","NoopUrlStorage","hasStorage","localStorage","setItem","getItem","code","SECURITY_ERR","QUOTA_EXCEEDED_ERR","canStoreURLs","WebStorageUrlStorage","results","_findEntries","removeItem","id","round","JSON","stringify","prefix","_key","parse","_createClass","XHRHttpStack","Request","_xhr","XMLHttpRequest","open","_method","_url","_headers","header","setRequestHeader","progressHandler","onprogress","lengthComputable","loaded","onload","Response","onerror","xhr","getResponseHeader","responseText","isReactNative","product","toLowerCase","isCordova","PhoneGap","Cordova","cordova","FileSource","_file","chunk","reader","FileReader","Uint8Array","readAsArrayBuffer","StreamSource","_chunkSize","_buffer","_bufferOffset","_reader","_done","_readUntilEnoughDataOrDone","hasEnoughData","len","_getDataFromBuffer","read","b","Blob","type","hasAllDataBeenRead","cancel","blobOrArray","input","uri","responseType","blob","response","isFinite","HttpStack","exifHash","exif","str","hash","charCodeAt","hashCode","reactNativeFingerprint","lastModified","Upload","_BaseUpload","cb","_window","isSupported","_class","_temp","BasePlugin","require","tus","Provider","RequestClient","Socket","emitSocketProgress","getSocketHost","settle","EventTracker","NetworkError","isNetworkError","RateLimitedQueue","hasProperty","getFingerprint","tusDefaultOptions","module","exports","uppy","opts","title","useFastRemoteRetry","limit","withCredentials","requests","uploaders","uploaderEvents","uploaderSockets","handleResetProgress","handleUpload","files","getState","fileID","tusState","setState","uploader","remove","resetUploaderReferences","emit","uploadOptions","getUnderlyingObject","queuedRequest","bytesUploaded","onReceiveUploadUrl","uploadResp","uploadURL","copyProp","srcProp","destProp","meta","isArray","metaFields","item","data","findPreviousUploads","previousUploads","resumeFromPreviousUpload","run","isPaused","onFileRemove","targetFileID","onPause","onPauseAll","onCancelAll","onResumeAll","error","assign","remote","serverToken","connectToServerSocket","providerOptions","provider","post","protocol","setFileState","token","getFile","host","companionUrl","socket","autoOpen","onRetry","isOpen","onRetryAll","on","progressData","errData","cause","currentFile","promises","current","total","isRemote","progress","uploadStarted","isRestored","uploadRemote","fileIDs","filesToUpload","uploadFiles","capabilities","resumableUploads","addUploader","removeUploader","VERSION","global","factory","fromUint8Array","_Base64","version","b64chars","b64tab","bin","t","l","charAt","fromCharCode","String","cb_utob","cc","re_utob","utob","cb_encode","ccc","padlen","ord","btoa","match","RangeError","_encode","mkUriSafe","b64","m0","urisafe","encodeURI","a0","a1","a2","toUint8Array","re_btou","cb_btou","cccc","btou","cb_decode","n","chars","_atob","atob","_decode","_fromURI","decode","from","noConflict","fromBase64","toBase64","noEnum","v","extendString","required","qs","slashes","protocolre","windowsDriveLetter","left","RegExp","trimLeft","rules","address","isSpecial","NaN","ignore","query","lolcation","loc","finaldestination","Url","unescape","pathname","test","href","scheme","extractProtocol","rest","exec","forwardSlashes","otherSlashes","slashesCount","parser","relative","extracted","instruction","instructions","base","path","split","last","unshift","up","splice","port","hostname","username","password","auth","pop","char","ins","hasOwnProperty","decodeURIComponent","encodeURIComponent","pairs","undef","uppyFileObj","uppyFingerprint"],"mappings":"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","file":"static/js/2.89735343.chunk.js","sourcesContent":["function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\n\nfunction _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _isNativeFunction(fn) { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nvar DetailedError = /*#__PURE__*/function (_Error) {\n _inherits(DetailedError, _Error);\n\n var _super = _createSuper(DetailedError);\n\n function DetailedError(message) {\n var _this;\n\n var causingErr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var req = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var res = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n _classCallCheck(this, DetailedError);\n\n _this = _super.call(this, message);\n _this.originalRequest = req;\n _this.originalResponse = res;\n _this.causingError = causingErr;\n\n if (causingErr != null) {\n message += \", caused by \".concat(causingErr.toString());\n }\n\n if (req != null) {\n var requestId = req.getHeader('X-Request-ID') || 'n/a';\n var method = req.getMethod();\n var url = req.getURL();\n var status = res ? res.getStatus() : 'n/a';\n var body = res ? res.getBody() || '' : 'n/a';\n message += \", originated from request (method: \".concat(method, \", url: \").concat(url, \", response code: \").concat(status, \", response text: \").concat(body, \", request id: \").concat(requestId, \")\");\n }\n\n _this.message = message;\n return _this;\n }\n\n return DetailedError;\n}( /*#__PURE__*/_wrapNativeSuper(Error));\n\nexport default DetailedError;","/* eslint no-console: \"off\" */\nvar isEnabled = false;\nexport function enableDebugLog() {\n isEnabled = true;\n}\nexport function log(msg) {\n if (!isEnabled) return;\n console.log(msg);\n}","function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/* global window */\nimport { Base64 } from 'js-base64';\nimport URL from 'url-parse';\nimport DetailedError from './error';\nimport { log } from './logger';\nimport uuid from './uuid';\nvar defaultOptions = {\n endpoint: null,\n uploadUrl: null,\n metadata: {},\n fingerprint: null,\n uploadSize: null,\n onProgress: null,\n onChunkComplete: null,\n onSuccess: null,\n onError: null,\n _onUploadUrlAvailable: null,\n overridePatchMethod: false,\n headers: {},\n addRequestId: false,\n onBeforeRequest: null,\n onAfterResponse: null,\n onShouldRetry: null,\n chunkSize: Infinity,\n retryDelays: [0, 1000, 3000, 5000],\n parallelUploads: 1,\n storeFingerprintForResuming: true,\n removeFingerprintOnSuccess: false,\n uploadLengthDeferred: false,\n uploadDataDuringCreation: false,\n urlStorage: null,\n fileReader: null,\n httpStack: null\n};\n\nvar BaseUpload = /*#__PURE__*/function () {\n function BaseUpload(file, options) {\n _classCallCheck(this, BaseUpload);\n\n // Warn about removed options from previous versions\n if ('resume' in options) {\n console.log('tus: The `resume` option has been removed in tus-js-client v2. Please use the URL storage API instead.'); // eslint-disable-line no-console\n } // The default options will already be added from the wrapper classes.\n\n\n this.options = options; // The storage module used to store URLs\n\n this._urlStorage = this.options.urlStorage; // The underlying File/Blob object\n\n this.file = file; // The URL against which the file will be uploaded\n\n this.url = null; // The underlying request object for the current PATCH request\n\n this._req = null; // The fingerpinrt for the current file (set after start())\n\n this._fingerprint = null; // The key that the URL storage returned when saving an URL with a fingerprint,\n\n this._urlStorageKey = null; // The offset used in the current PATCH request\n\n this._offset = null; // True if the current PATCH request has been aborted\n\n this._aborted = false; // The file's size in bytes\n\n this._size = null; // The Source object which will wrap around the given file and provides us\n // with a unified interface for getting its size and slice chunks from its\n // content allowing us to easily handle Files, Blobs, Buffers and Streams.\n\n this._source = null; // The current count of attempts which have been made. Zero indicates none.\n\n this._retryAttempt = 0; // The timeout's ID which is used to delay the next retry\n\n this._retryTimeout = null; // The offset of the remote upload before the latest attempt was started.\n\n this._offsetBeforeRetry = 0; // An array of BaseUpload instances which are used for uploading the different\n // parts, if the parallelUploads option is used.\n\n this._parallelUploads = null; // An array of upload URLs which are used for uploading the different\n // parts, if the parallelUploads option is used.\n\n this._parallelUploadUrls = null;\n }\n /**\n * Use the Termination extension to delete an upload from the server by sending a DELETE\n * request to the specified upload URL. This is only possible if the server supports the\n * Termination extension. If the `options.retryDelays` property is set, the method will\n * also retry if an error ocurrs.\n *\n * @param {String} url The upload's URL which will be terminated.\n * @param {object} options Optional options for influencing HTTP requests.\n * @return {Promise} The Promise will be resolved/rejected when the requests finish.\n */\n\n\n _createClass(BaseUpload, [{\n key: \"findPreviousUploads\",\n value: function findPreviousUploads() {\n var _this = this;\n\n return this.options.fingerprint(this.file, this.options).then(function (fingerprint) {\n return _this._urlStorage.findUploadsByFingerprint(fingerprint);\n });\n }\n }, {\n key: \"resumeFromPreviousUpload\",\n value: function resumeFromPreviousUpload(previousUpload) {\n this.url = previousUpload.uploadUrl || null;\n this._parallelUploadUrls = previousUpload.parallelUploadUrls || null;\n this._urlStorageKey = previousUpload.urlStorageKey;\n }\n }, {\n key: \"start\",\n value: function start() {\n var _this2 = this;\n\n var file = this.file;\n\n if (!file) {\n this._emitError(new Error('tus: no file or stream to upload provided'));\n\n return;\n }\n\n if (!this.options.endpoint && !this.options.uploadUrl) {\n this._emitError(new Error('tus: neither an endpoint or an upload URL is provided'));\n\n return;\n }\n\n var retryDelays = this.options.retryDelays;\n\n if (retryDelays != null && Object.prototype.toString.call(retryDelays) !== '[object Array]') {\n this._emitError(new Error('tus: the `retryDelays` option must either be an array or null'));\n\n return;\n }\n\n if (this.options.parallelUploads > 1) {\n // Test which options are incompatible with parallel uploads.\n ['uploadUrl', 'uploadSize', 'uploadLengthDeferred'].forEach(function (optionName) {\n if (_this2.options[optionName]) {\n _this2._emitError(new Error(\"tus: cannot use the \".concat(optionName, \" option when parallelUploads is enabled\")));\n }\n });\n }\n\n this.options.fingerprint(file, this.options).then(function (fingerprint) {\n if (fingerprint == null) {\n log('No fingerprint was calculated meaning that the upload cannot be stored in the URL storage.');\n } else {\n log(\"Calculated fingerprint: \".concat(fingerprint));\n }\n\n _this2._fingerprint = fingerprint;\n\n if (_this2._source) {\n return _this2._source;\n }\n\n return _this2.options.fileReader.openFile(file, _this2.options.chunkSize);\n }).then(function (source) {\n _this2._source = source; // If the upload was configured to use multiple requests or if we resume from\n // an upload which used multiple requests, we start a parallel upload.\n\n if (_this2.options.parallelUploads > 1 || _this2._parallelUploadUrls != null) {\n _this2._startParallelUpload();\n } else {\n _this2._startSingleUpload();\n }\n })[\"catch\"](function (err) {\n _this2._emitError(err);\n });\n }\n /**\n * Initiate the uploading procedure for a parallelized upload, where one file is split into\n * multiple request which are run in parallel.\n *\n * @api private\n */\n\n }, {\n key: \"_startParallelUpload\",\n value: function _startParallelUpload() {\n var _this3 = this;\n\n var totalSize = this._size = this._source.size;\n var totalProgress = 0;\n this._parallelUploads = [];\n var partCount = this._parallelUploadUrls != null ? this._parallelUploadUrls.length : this.options.parallelUploads; // The input file will be split into multiple slices which are uploaded in separate\n // requests. Here we generate the start and end position for the slices.\n\n var parts = splitSizeIntoParts(this._source.size, partCount, this._parallelUploadUrls); // Create an empty list for storing the upload URLs\n\n this._parallelUploadUrls = new Array(parts.length); // Generate a promise for each slice that will be resolve if the respective\n // upload is completed.\n\n var uploads = parts.map(function (part, index) {\n var lastPartProgress = 0;\n return _this3._source.slice(part.start, part.end).then(function (_ref) {\n var value = _ref.value;\n return new Promise(function (resolve, reject) {\n // Merge with the user supplied options but overwrite some values.\n var options = _objectSpread({}, _this3.options, {\n // If available, the partial upload should be resumed from a previous URL.\n uploadUrl: part.uploadUrl || null,\n // We take manually care of resuming for partial uploads, so they should\n // not be stored in the URL storage.\n storeFingerprintForResuming: false,\n removeFingerprintOnSuccess: false,\n // Reset the parallelUploads option to not cause recursion.\n parallelUploads: 1,\n metadata: {},\n // Add the header to indicate the this is a partial upload.\n headers: _objectSpread({}, _this3.options.headers, {\n 'Upload-Concat': 'partial'\n }),\n // Reject or resolve the promise if the upload errors or completes.\n onSuccess: resolve,\n onError: reject,\n // Based in the progress for this partial upload, calculate the progress\n // for the entire final upload.\n onProgress: function onProgress(newPartProgress) {\n totalProgress = totalProgress - lastPartProgress + newPartProgress;\n lastPartProgress = newPartProgress;\n\n _this3._emitProgress(totalProgress, totalSize);\n },\n // Wait until every partial upload has an upload URL, so we can add\n // them to the URL storage.\n _onUploadUrlAvailable: function _onUploadUrlAvailable() {\n _this3._parallelUploadUrls[index] = upload.url; // Test if all uploads have received an URL\n\n if (_this3._parallelUploadUrls.filter(function (u) {\n return !!u;\n }).length === parts.length) {\n _this3._saveUploadInUrlStorage();\n }\n }\n });\n\n var upload = new BaseUpload(value, options);\n upload.start(); // Store the upload in an array, so we can later abort them if necessary.\n\n _this3._parallelUploads.push(upload);\n });\n });\n });\n var req; // Wait until all partial uploads are finished and we can send the POST request for\n // creating the final upload.\n\n Promise.all(uploads).then(function () {\n req = _this3._openRequest('POST', _this3.options.endpoint);\n req.setHeader('Upload-Concat', \"final;\".concat(_this3._parallelUploadUrls.join(' '))); // Add metadata if values have been added\n\n var metadata = encodeMetadata(_this3.options.metadata);\n\n if (metadata !== '') {\n req.setHeader('Upload-Metadata', metadata);\n }\n\n return _this3._sendRequest(req, null);\n }).then(function (res) {\n if (!inStatusCategory(res.getStatus(), 200)) {\n _this3._emitHttpError(req, res, 'tus: unexpected response while creating upload');\n\n return;\n }\n\n var location = res.getHeader('Location');\n\n if (location == null) {\n _this3._emitHttpError(req, res, 'tus: invalid or missing Location header');\n\n return;\n }\n\n _this3.url = resolveUrl(_this3.options.endpoint, location);\n log(\"Created upload at \".concat(_this3.url));\n\n _this3._emitSuccess();\n })[\"catch\"](function (err) {\n _this3._emitError(err);\n });\n }\n /**\n * Initiate the uploading procedure for a non-parallel upload. Here the entire file is\n * uploaded in a sequential matter.\n *\n * @api private\n */\n\n }, {\n key: \"_startSingleUpload\",\n value: function _startSingleUpload() {\n // First, we look at the uploadLengthDeferred option.\n // Next, we check if the caller has supplied a manual upload size.\n // Finally, we try to use the calculated size from the source object.\n if (this.options.uploadLengthDeferred) {\n this._size = null;\n } else if (this.options.uploadSize != null) {\n this._size = +this.options.uploadSize;\n\n if (isNaN(this._size)) {\n this._emitError(new Error('tus: cannot convert `uploadSize` option into a number'));\n\n return;\n }\n } else {\n this._size = this._source.size;\n\n if (this._size == null) {\n this._emitError(new Error(\"tus: cannot automatically derive upload's size from input and must be specified manually using the `uploadSize` option\"));\n\n return;\n }\n } // Reset the aborted flag when the upload is started or else the\n // _performUpload will stop before sending a request if the upload has been\n // aborted previously.\n\n\n this._aborted = false; // The upload had been started previously and we should reuse this URL.\n\n if (this.url != null) {\n log(\"Resuming upload from previous URL: \".concat(this.url));\n\n this._resumeUpload();\n\n return;\n } // A URL has manually been specified, so we try to resume\n\n\n if (this.options.uploadUrl != null) {\n log(\"Resuming upload from provided URL: \".concat(this.options.url));\n this.url = this.options.uploadUrl;\n\n this._resumeUpload();\n\n return;\n } // An upload has not started for the file yet, so we start a new one\n\n\n log('Creating a new upload');\n\n this._createUpload();\n }\n /**\n * Abort any running request and stop the current upload. After abort is called, no event\n * handler will be invoked anymore. You can use the `start` method to resume the upload\n * again.\n * If `shouldTerminate` is true, the `terminate` function will be called to remove the\n * current upload from the server.\n *\n * @param {boolean} shouldTerminate True if the upload should be deleted from the server.\n * @return {Promise} The Promise will be resolved/rejected when the requests finish.\n */\n\n }, {\n key: \"abort\",\n value: function abort(shouldTerminate) {\n var _this4 = this;\n\n // Count the number of arguments to see if a callback is being provided in the old style required by tus-js-client 1.x, then throw an error if it is.\n // `arguments` is a JavaScript built-in variable that contains all of the function's arguments.\n if (arguments.length > 1 && typeof arguments[1] === 'function') {\n throw new Error('tus: the abort function does not accept a callback since v2 anymore; please use the returned Promise instead');\n } // Stop any parallel partial uploads, that have been started in _startParallelUploads.\n\n\n if (this._parallelUploads != null) {\n this._parallelUploads.forEach(function (upload) {\n upload.abort(shouldTerminate);\n });\n } // Stop any current running request.\n\n\n if (this._req !== null) {\n this._req.abort();\n\n this._source.close();\n }\n\n this._aborted = true; // Stop any timeout used for initiating a retry.\n\n if (this._retryTimeout != null) {\n clearTimeout(this._retryTimeout);\n this._retryTimeout = null;\n }\n\n if (!shouldTerminate || this.url == null) {\n return Promise.resolve();\n }\n\n return BaseUpload.terminate(this.url, this.options) // Remove entry from the URL storage since the upload URL is no longer valid.\n .then(function () {\n return _this4._removeFromUrlStorage();\n });\n }\n }, {\n key: \"_emitHttpError\",\n value: function _emitHttpError(req, res, message, causingErr) {\n this._emitError(new DetailedError(message, causingErr, req, res));\n }\n }, {\n key: \"_emitError\",\n value: function _emitError(err) {\n var _this5 = this;\n\n // Do not emit errors, e.g. from aborted HTTP requests, if the upload has been stopped.\n if (this._aborted) return; // Check if we should retry, when enabled, before sending the error to the user.\n\n if (this.options.retryDelays != null) {\n // We will reset the attempt counter if\n // - we were already able to connect to the server (offset != null) and\n // - we were able to upload a small chunk of data to the server\n var shouldResetDelays = this._offset != null && this._offset > this._offsetBeforeRetry;\n\n if (shouldResetDelays) {\n this._retryAttempt = 0;\n }\n\n if (shouldRetry(err, this._retryAttempt, this.options)) {\n var delay = this.options.retryDelays[this._retryAttempt++];\n this._offsetBeforeRetry = this._offset;\n this._retryTimeout = setTimeout(function () {\n _this5.start();\n }, delay);\n return;\n }\n }\n\n if (typeof this.options.onError === 'function') {\n this.options.onError(err);\n } else {\n throw err;\n }\n }\n /**\n * Publishes notification if the upload has been successfully completed.\n *\n * @api private\n */\n\n }, {\n key: \"_emitSuccess\",\n value: function _emitSuccess() {\n if (this.options.removeFingerprintOnSuccess) {\n // Remove stored fingerprint and corresponding endpoint. This causes\n // new uploads of the same file to be treated as a different file.\n this._removeFromUrlStorage();\n }\n\n if (typeof this.options.onSuccess === 'function') {\n this.options.onSuccess();\n }\n }\n /**\n * Publishes notification when data has been sent to the server. This\n * data may not have been accepted by the server yet.\n *\n * @param {number} bytesSent Number of bytes sent to the server.\n * @param {number} bytesTotal Total number of bytes to be sent to the server.\n * @api private\n */\n\n }, {\n key: \"_emitProgress\",\n value: function _emitProgress(bytesSent, bytesTotal) {\n if (typeof this.options.onProgress === 'function') {\n this.options.onProgress(bytesSent, bytesTotal);\n }\n }\n /**\n * Publishes notification when a chunk of data has been sent to the server\n * and accepted by the server.\n * @param {number} chunkSize Size of the chunk that was accepted by the server.\n * @param {number} bytesAccepted Total number of bytes that have been\n * accepted by the server.\n * @param {number} bytesTotal Total number of bytes to be sent to the server.\n * @api private\n */\n\n }, {\n key: \"_emitChunkComplete\",\n value: function _emitChunkComplete(chunkSize, bytesAccepted, bytesTotal) {\n if (typeof this.options.onChunkComplete === 'function') {\n this.options.onChunkComplete(chunkSize, bytesAccepted, bytesTotal);\n }\n }\n /**\n * Create a new upload using the creation extension by sending a POST\n * request to the endpoint. After successful creation the file will be\n * uploaded\n *\n * @api private\n */\n\n }, {\n key: \"_createUpload\",\n value: function _createUpload() {\n var _this6 = this;\n\n if (!this.options.endpoint) {\n this._emitError(new Error('tus: unable to create upload because no endpoint is provided'));\n\n return;\n }\n\n var req = this._openRequest('POST', this.options.endpoint);\n\n if (this.options.uploadLengthDeferred) {\n req.setHeader('Upload-Defer-Length', 1);\n } else {\n req.setHeader('Upload-Length', this._size);\n } // Add metadata if values have been added\n\n\n var metadata = encodeMetadata(this.options.metadata);\n\n if (metadata !== '') {\n req.setHeader('Upload-Metadata', metadata);\n }\n\n var promise;\n\n if (this.options.uploadDataDuringCreation && !this.options.uploadLengthDeferred) {\n this._offset = 0;\n promise = this._addChunkToRequest(req);\n } else {\n promise = this._sendRequest(req, null);\n }\n\n promise.then(function (res) {\n if (!inStatusCategory(res.getStatus(), 200)) {\n _this6._emitHttpError(req, res, 'tus: unexpected response while creating upload');\n\n return;\n }\n\n var location = res.getHeader('Location');\n\n if (location == null) {\n _this6._emitHttpError(req, res, 'tus: invalid or missing Location header');\n\n return;\n }\n\n _this6.url = resolveUrl(_this6.options.endpoint, location);\n log(\"Created upload at \".concat(_this6.url));\n\n if (typeof _this6.options._onUploadUrlAvailable === 'function') {\n _this6.options._onUploadUrlAvailable();\n }\n\n if (_this6._size === 0) {\n // Nothing to upload and file was successfully created\n _this6._emitSuccess();\n\n _this6._source.close();\n\n return;\n }\n\n _this6._saveUploadInUrlStorage();\n\n if (_this6.options.uploadDataDuringCreation) {\n _this6._handleUploadResponse(req, res);\n } else {\n _this6._offset = 0;\n\n _this6._performUpload();\n }\n })[\"catch\"](function (err) {\n _this6._emitHttpError(req, null, 'tus: failed to create upload', err);\n });\n }\n /*\n * Try to resume an existing upload. First a HEAD request will be sent\n * to retrieve the offset. If the request fails a new upload will be\n * created. In the case of a successful response the file will be uploaded.\n *\n * @api private\n */\n\n }, {\n key: \"_resumeUpload\",\n value: function _resumeUpload() {\n var _this7 = this;\n\n var req = this._openRequest('HEAD', this.url);\n\n var promise = this._sendRequest(req, null);\n\n promise.then(function (res) {\n var status = res.getStatus();\n\n if (!inStatusCategory(status, 200)) {\n if (inStatusCategory(status, 400)) {\n // Remove stored fingerprint and corresponding endpoint,\n // on client errors since the file can not be found\n _this7._removeFromUrlStorage();\n } // If the upload is locked (indicated by the 423 Locked status code), we\n // emit an error instead of directly starting a new upload. This way the\n // retry logic can catch the error and will retry the upload. An upload\n // is usually locked for a short period of time and will be available\n // afterwards.\n\n\n if (status === 423) {\n _this7._emitHttpError(req, res, 'tus: upload is currently locked; retry later');\n\n return;\n }\n\n if (!_this7.options.endpoint) {\n // Don't attempt to create a new upload if no endpoint is provided.\n _this7._emitHttpError(req, res, 'tus: unable to resume upload (new upload cannot be created without an endpoint)');\n\n return;\n } // Try to create a new upload\n\n\n _this7.url = null;\n\n _this7._createUpload();\n\n return;\n }\n\n var offset = parseInt(res.getHeader('Upload-Offset'), 10);\n\n if (isNaN(offset)) {\n _this7._emitHttpError(req, res, 'tus: invalid or missing offset value');\n\n return;\n }\n\n var length = parseInt(res.getHeader('Upload-Length'), 10);\n\n if (isNaN(length) && !_this7.options.uploadLengthDeferred) {\n _this7._emitHttpError(req, res, 'tus: invalid or missing length value');\n\n return;\n }\n\n if (typeof _this7.options._onUploadUrlAvailable === 'function') {\n _this7.options._onUploadUrlAvailable();\n } // Upload has already been completed and we do not need to send additional\n // data to the server\n\n\n if (offset === length) {\n _this7._emitProgress(length, length);\n\n _this7._emitSuccess();\n\n return;\n }\n\n _this7._offset = offset;\n\n _this7._performUpload();\n })[\"catch\"](function (err) {\n _this7._emitHttpError(req, null, 'tus: failed to resume upload', err);\n });\n }\n /**\n * Start uploading the file using PATCH requests. The file will be divided\n * into chunks as specified in the chunkSize option. During the upload\n * the onProgress event handler may be invoked multiple times.\n *\n * @api private\n */\n\n }, {\n key: \"_performUpload\",\n value: function _performUpload() {\n var _this8 = this;\n\n // If the upload has been aborted, we will not send the next PATCH request.\n // This is important if the abort method was called during a callback, such\n // as onChunkComplete or onProgress.\n if (this._aborted) {\n return;\n }\n\n var req; // Some browser and servers may not support the PATCH method. For those\n // cases, you can tell tus-js-client to use a POST request with the\n // X-HTTP-Method-Override header for simulating a PATCH request.\n\n if (this.options.overridePatchMethod) {\n req = this._openRequest('POST', this.url);\n req.setHeader('X-HTTP-Method-Override', 'PATCH');\n } else {\n req = this._openRequest('PATCH', this.url);\n }\n\n req.setHeader('Upload-Offset', this._offset);\n\n var promise = this._addChunkToRequest(req);\n\n promise.then(function (res) {\n if (!inStatusCategory(res.getStatus(), 200)) {\n _this8._emitHttpError(req, res, 'tus: unexpected response while uploading chunk');\n\n return;\n }\n\n _this8._handleUploadResponse(req, res);\n })[\"catch\"](function (err) {\n // Don't emit an error if the upload was aborted manually\n if (_this8._aborted) {\n return;\n }\n\n _this8._emitHttpError(req, null, \"tus: failed to upload chunk at offset \".concat(_this8._offset), err);\n });\n }\n /**\n * _addChunktoRequest reads a chunk from the source and sends it using the\n * supplied request object. It will not handle the response.\n *\n * @api private\n */\n\n }, {\n key: \"_addChunkToRequest\",\n value: function _addChunkToRequest(req) {\n var _this9 = this;\n\n var start = this._offset;\n var end = this._offset + this.options.chunkSize;\n req.setProgressHandler(function (bytesSent) {\n _this9._emitProgress(start + bytesSent, _this9._size);\n });\n req.setHeader('Content-Type', 'application/offset+octet-stream'); // The specified chunkSize may be Infinity or the calcluated end position\n // may exceed the file's size. In both cases, we limit the end position to\n // the input's total size for simpler calculations and correctness.\n\n if ((end === Infinity || end > this._size) && !this.options.uploadLengthDeferred) {\n end = this._size;\n }\n\n return this._source.slice(start, end).then(function (_ref2) {\n var value = _ref2.value,\n done = _ref2.done;\n\n // If the upload length is deferred, the upload size was not specified during\n // upload creation. So, if the file reader is done reading, we know the total\n // upload size and can tell the tus server.\n if (_this9.options.uploadLengthDeferred && done) {\n _this9._size = _this9._offset + (value && value.size ? value.size : 0);\n req.setHeader('Upload-Length', _this9._size);\n }\n\n if (value === null) {\n return _this9._sendRequest(req);\n }\n\n _this9._emitProgress(_this9._offset, _this9._size);\n\n return _this9._sendRequest(req, value);\n });\n }\n /**\n * _handleUploadResponse is used by requests that haven been sent using _addChunkToRequest\n * and already have received a response.\n *\n * @api private\n */\n\n }, {\n key: \"_handleUploadResponse\",\n value: function _handleUploadResponse(req, res) {\n var offset = parseInt(res.getHeader('Upload-Offset'), 10);\n\n if (isNaN(offset)) {\n this._emitHttpError(req, res, 'tus: invalid or missing offset value');\n\n return;\n }\n\n this._emitProgress(offset, this._size);\n\n this._emitChunkComplete(offset - this._offset, offset, this._size);\n\n this._offset = offset;\n\n if (offset == this._size) {\n // Yay, finally done :)\n this._emitSuccess();\n\n this._source.close();\n\n return;\n }\n\n this._performUpload();\n }\n /**\n * Create a new HTTP request object with the given method and URL.\n *\n * @api private\n */\n\n }, {\n key: \"_openRequest\",\n value: function _openRequest(method, url) {\n var req = openRequest(method, url, this.options);\n this._req = req;\n return req;\n }\n /**\n * Remove the entry in the URL storage, if it has been saved before.\n *\n * @api private\n */\n\n }, {\n key: \"_removeFromUrlStorage\",\n value: function _removeFromUrlStorage() {\n var _this10 = this;\n\n if (!this._urlStorageKey) return;\n\n this._urlStorage.removeUpload(this._urlStorageKey)[\"catch\"](function (err) {\n _this10._emitError(err);\n });\n\n this._urlStorageKey = null;\n }\n /**\n * Add the upload URL to the URL storage, if possible.\n *\n * @api private\n */\n\n }, {\n key: \"_saveUploadInUrlStorage\",\n value: function _saveUploadInUrlStorage() {\n var _this11 = this;\n\n // Only if a fingerprint was calculated for the input (i.e. not a stream), we can store the upload URL.\n if (!this.options.storeFingerprintForResuming || !this._fingerprint) {\n return;\n }\n\n var storedUpload = {\n size: this._size,\n metadata: this.options.metadata,\n creationTime: new Date().toString()\n };\n\n if (this._parallelUploads) {\n // Save multiple URLs if the parallelUploads option is used ...\n storedUpload.parallelUploadUrls = this._parallelUploadUrls;\n } else {\n // ... otherwise we just save the one available URL.\n storedUpload.uploadUrl = this.url;\n }\n\n this._urlStorage.addUpload(this._fingerprint, storedUpload).then(function (urlStorageKey) {\n return _this11._urlStorageKey = urlStorageKey;\n })[\"catch\"](function (err) {\n _this11._emitError(err);\n });\n }\n /**\n * Send a request with the provided body.\n *\n * @api private\n */\n\n }, {\n key: \"_sendRequest\",\n value: function _sendRequest(req) {\n var body = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n return sendRequest(req, body, this.options);\n }\n }], [{\n key: \"terminate\",\n value: function terminate(url, options) {\n // Count the number of arguments to see if a callback is being provided as the last\n // argument in the old style required by tus-js-client 1.x, then throw an error if it is.\n // `arguments` is a JavaScript built-in variable that contains all of the function's arguments.\n if (arguments.length > 1 && typeof arguments[arguments.length - 1] === 'function') {\n throw new Error('tus: the terminate function does not accept a callback since v2 anymore; please use the returned Promise instead');\n } // Note that in order for the trick above to work, a default value cannot be set for `options`,\n // so the check below replaces the old default `{}`.\n\n\n if (options === undefined) {\n options = {};\n }\n\n var req = openRequest('DELETE', url, options);\n return sendRequest(req, null, options).then(function (res) {\n // A 204 response indicates a successfull request\n if (res.getStatus() === 204) {\n return;\n }\n\n throw new DetailedError('tus: unexpected response while terminating upload', null, req, res);\n })[\"catch\"](function (err) {\n if (!(err instanceof DetailedError)) {\n err = new DetailedError('tus: failed to terminate upload', err, req, null);\n }\n\n if (!shouldRetry(err, 0, options)) {\n throw err;\n } // Instead of keeping track of the retry attempts, we remove the first element from the delays\n // array. If the array is empty, all retry attempts are used up and we will bubble up the error.\n // We recursively call the terminate function will removing elements from the retryDelays array.\n\n\n var delay = options.retryDelays[0];\n var remainingDelays = options.retryDelays.slice(1);\n\n var newOptions = _objectSpread({}, options, {\n retryDelays: remainingDelays\n });\n\n return new Promise(function (resolve) {\n return setTimeout(resolve, delay);\n }).then(function () {\n return BaseUpload.terminate(url, newOptions);\n });\n });\n }\n }]);\n\n return BaseUpload;\n}();\n\nfunction encodeMetadata(metadata) {\n var encoded = [];\n\n for (var key in metadata) {\n encoded.push(\"\".concat(key, \" \").concat(Base64.encode(metadata[key])));\n }\n\n return encoded.join(',');\n}\n/**\n * Checks whether a given status is in the range of the expected category.\n * For example, only a status between 200 and 299 will satisfy the category 200.\n *\n * @api private\n */\n\n\nfunction inStatusCategory(status, category) {\n return status >= category && status < category + 100;\n}\n/**\n * Create a new HTTP request with the specified method and URL.\n * The necessary headers that are included in every request\n * will be added, including the request ID.\n *\n * @api private\n */\n\n\nfunction openRequest(method, url, options) {\n var req = options.httpStack.createRequest(method, url);\n req.setHeader('Tus-Resumable', '1.0.0');\n var headers = options.headers || {};\n\n for (var name in headers) {\n req.setHeader(name, headers[name]);\n }\n\n if (options.addRequestId) {\n var requestId = uuid();\n req.setHeader('X-Request-ID', requestId);\n }\n\n return req;\n}\n/**\n * Send a request with the provided body while invoking the onBeforeRequest\n * and onAfterResponse callbacks.\n *\n * @api private\n */\n\n\nfunction sendRequest(req, body, options) {\n var onBeforeRequestPromise = typeof options.onBeforeRequest === 'function' ? Promise.resolve(options.onBeforeRequest(req)) : Promise.resolve();\n return onBeforeRequestPromise.then(function () {\n return req.send(body).then(function (res) {\n var onAfterResponsePromise = typeof options.onAfterResponse === 'function' ? Promise.resolve(options.onAfterResponse(req, res)) : Promise.resolve();\n return onAfterResponsePromise.then(function () {\n return res;\n });\n });\n });\n}\n/**\n * Checks whether the browser running this code has internet access.\n * This function will always return true in the node.js environment\n *\n * @api private\n */\n\n\nfunction isOnline() {\n var online = true;\n\n if (typeof window !== 'undefined' && 'navigator' in window && window.navigator.onLine === false) {\n online = false;\n }\n\n return online;\n}\n/**\n * Checks whether or not it is ok to retry a request.\n * @param {Error} err the error returned from the last request\n * @param {number} retryAttempt the number of times the request has already been retried\n * @param {object} options tus Upload options\n *\n * @api private\n */\n\n\nfunction shouldRetry(err, retryAttempt, options) {\n // We only attempt a retry if\n // - retryDelays option is set\n // - we didn't exceed the maxium number of retries, yet, and\n // - this error was caused by a request or it's response and\n // - the error is server error (i.e. not a status 4xx except a 409 or 423) or\n // a onShouldRetry is specified and returns true\n // - the browser does not indicate that we are offline\n if (options.retryDelays == null || retryAttempt >= options.retryDelays.length || err.originalRequest == null) {\n return false;\n }\n\n if (options && typeof options.onShouldRetry === 'function') {\n return options.onShouldRetry(err, retryAttempt, options);\n }\n\n var status = err.originalResponse ? err.originalResponse.getStatus() : 0;\n return (!inStatusCategory(status, 400) || status === 409 || status === 423) && isOnline();\n}\n/**\n * Resolve a relative link given the origin as source. For example,\n * if a HTTP request to http://example.com/files/ returns a Location\n * header with the value /upload/abc, the resolved URL will be:\n * http://example.com/upload/abc\n */\n\n\nfunction resolveUrl(origin, link) {\n return new URL(link, origin).toString();\n}\n/**\n * Calculate the start and end positions for the parts if an upload\n * is split into multiple parallel requests.\n *\n * @param {number} totalSize The byte size of the upload, which will be split.\n * @param {number} partCount The number in how many parts the upload will be split.\n * @param {string[]} previousUrls The upload URLs for previous parts.\n * @return {object[]}\n * @api private\n */\n\n\nfunction splitSizeIntoParts(totalSize, partCount, previousUrls) {\n var partSize = Math.floor(totalSize / partCount);\n var parts = [];\n\n for (var i = 0; i < partCount; i++) {\n parts.push({\n start: partSize * i,\n end: partSize * (i + 1)\n });\n }\n\n parts[partCount - 1].end = totalSize; // Attach URLs from previous uploads, if available.\n\n if (previousUrls) {\n parts.forEach(function (part, index) {\n part.uploadUrl = previousUrls[index] || null;\n });\n }\n\n return parts;\n}\n\nBaseUpload.defaultOptions = defaultOptions;\nexport default BaseUpload;","/**\n * Generate a UUID v4 based on random numbers. We intentioanlly use the less\n * secure Math.random function here since the more secure crypto.getRandomNumbers\n * is not available on all platforms.\n * This is not a problem for us since we use the UUID only for generating a\n * request ID, so we can correlate server logs to client errors.\n *\n * This function is taken from following site:\n * https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript\n *\n * @return {string} The generate UUID\n */\nexport default function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0,\n v = c == 'x' ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n}","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/* eslint no-unused-vars: \"off\" */\nvar NoopUrlStorage = /*#__PURE__*/function () {\n function NoopUrlStorage() {\n _classCallCheck(this, NoopUrlStorage);\n }\n\n _createClass(NoopUrlStorage, [{\n key: \"listAllUploads\",\n value: function listAllUploads() {\n return Promise.resolve([]);\n }\n }, {\n key: \"findUploadsByFingerprint\",\n value: function findUploadsByFingerprint(fingerprint) {\n return Promise.resolve([]);\n }\n }, {\n key: \"removeUpload\",\n value: function removeUpload(urlStorageKey) {\n return Promise.resolve();\n }\n }, {\n key: \"addUpload\",\n value: function addUpload(fingerprint, upload) {\n return Promise.resolve(null);\n }\n }]);\n\n return NoopUrlStorage;\n}();\n\nexport { NoopUrlStorage as default };","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/* global window, localStorage */\nvar hasStorage = false;\n\ntry {\n hasStorage = 'localStorage' in window; // Attempt to store and read entries from the local storage to detect Private\n // Mode on Safari on iOS (see #49)\n\n var key = 'tusSupport';\n localStorage.setItem(key, localStorage.getItem(key));\n} catch (e) {\n // If we try to access localStorage inside a sandboxed iframe, a SecurityError\n // is thrown. When in private mode on iOS Safari, a QuotaExceededError is\n // thrown (see #49)\n if (e.code === e.SECURITY_ERR || e.code === e.QUOTA_EXCEEDED_ERR) {\n hasStorage = false;\n } else {\n throw e;\n }\n}\n\nexport var canStoreURLs = hasStorage;\nexport var WebStorageUrlStorage = /*#__PURE__*/function () {\n function WebStorageUrlStorage() {\n _classCallCheck(this, WebStorageUrlStorage);\n }\n\n _createClass(WebStorageUrlStorage, [{\n key: \"findAllUploads\",\n value: function findAllUploads() {\n var results = this._findEntries('tus::');\n\n return Promise.resolve(results);\n }\n }, {\n key: \"findUploadsByFingerprint\",\n value: function findUploadsByFingerprint(fingerprint) {\n var results = this._findEntries(\"tus::\".concat(fingerprint, \"::\"));\n\n return Promise.resolve(results);\n }\n }, {\n key: \"removeUpload\",\n value: function removeUpload(urlStorageKey) {\n localStorage.removeItem(urlStorageKey);\n return Promise.resolve();\n }\n }, {\n key: \"addUpload\",\n value: function addUpload(fingerprint, upload) {\n var id = Math.round(Math.random() * 1e12);\n var key = \"tus::\".concat(fingerprint, \"::\").concat(id);\n localStorage.setItem(key, JSON.stringify(upload));\n return Promise.resolve(key);\n }\n }, {\n key: \"_findEntries\",\n value: function _findEntries(prefix) {\n var results = [];\n\n for (var i = 0; i < localStorage.length; i++) {\n var _key = localStorage.key(i);\n\n if (_key.indexOf(prefix) !== 0) continue;\n\n try {\n var upload = JSON.parse(localStorage.getItem(_key));\n upload.urlStorageKey = _key;\n results.push(upload);\n } catch (e) {// The JSON parse error is intentionally ignored here, so a malformed\n // entry in the storage cannot prevent an upload.\n }\n }\n\n return results;\n }\n }]);\n\n return WebStorageUrlStorage;\n}();","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/* global window */\nvar XHRHttpStack = /*#__PURE__*/function () {\n function XHRHttpStack() {\n _classCallCheck(this, XHRHttpStack);\n }\n\n _createClass(XHRHttpStack, [{\n key: \"createRequest\",\n value: function createRequest(method, url) {\n return new Request(method, url);\n }\n }, {\n key: \"getName\",\n value: function getName() {\n return 'XHRHttpStack';\n }\n }]);\n\n return XHRHttpStack;\n}();\n\nexport { XHRHttpStack as default };\n\nvar Request = /*#__PURE__*/function () {\n function Request(method, url) {\n _classCallCheck(this, Request);\n\n this._xhr = new XMLHttpRequest();\n\n this._xhr.open(method, url, true);\n\n this._method = method;\n this._url = url;\n this._headers = {};\n }\n\n _createClass(Request, [{\n key: \"getMethod\",\n value: function getMethod() {\n return this._method;\n }\n }, {\n key: \"getURL\",\n value: function getURL() {\n return this._url;\n }\n }, {\n key: \"setHeader\",\n value: function setHeader(header, value) {\n this._xhr.setRequestHeader(header, value);\n\n this._headers[header] = value;\n }\n }, {\n key: \"getHeader\",\n value: function getHeader(header) {\n return this._headers[header];\n }\n }, {\n key: \"setProgressHandler\",\n value: function setProgressHandler(progressHandler) {\n // Test support for progress events before attaching an event listener\n if (!('upload' in this._xhr)) {\n return;\n }\n\n this._xhr.upload.onprogress = function (e) {\n if (!e.lengthComputable) {\n return;\n }\n\n progressHandler(e.loaded);\n };\n }\n }, {\n key: \"send\",\n value: function send() {\n var _this = this;\n\n var body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n return new Promise(function (resolve, reject) {\n _this._xhr.onload = function () {\n resolve(new Response(_this._xhr));\n };\n\n _this._xhr.onerror = function (err) {\n reject(err);\n };\n\n _this._xhr.send(body);\n });\n }\n }, {\n key: \"abort\",\n value: function abort() {\n this._xhr.abort();\n\n return Promise.resolve();\n }\n }, {\n key: \"getUnderlyingObject\",\n value: function getUnderlyingObject() {\n return this._xhr;\n }\n }]);\n\n return Request;\n}();\n\nvar Response = /*#__PURE__*/function () {\n function Response(xhr) {\n _classCallCheck(this, Response);\n\n this._xhr = xhr;\n }\n\n _createClass(Response, [{\n key: \"getStatus\",\n value: function getStatus() {\n return this._xhr.status;\n }\n }, {\n key: \"getHeader\",\n value: function getHeader(header) {\n return this._xhr.getResponseHeader(header);\n }\n }, {\n key: \"getBody\",\n value: function getBody() {\n return this._xhr.responseText;\n }\n }, {\n key: \"getUnderlyingObject\",\n value: function getUnderlyingObject() {\n return this._xhr;\n }\n }]);\n\n return Response;\n}();","var isReactNative = function isReactNative() {\n return typeof navigator !== 'undefined' && typeof navigator.product === 'string' && navigator.product.toLowerCase() === 'reactnative';\n};\n\nexport default isReactNative;","var isCordova = function isCordova() {\n return typeof window != 'undefined' && (typeof window.PhoneGap != 'undefined' || typeof window.Cordova != 'undefined' || typeof window.cordova != 'undefined');\n};\n\nexport default isCordova;","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nimport isReactNative from './isReactNative';\nimport uriToBlob from './uriToBlob';\nimport isCordova from './isCordova';\nimport readAsByteArray from './readAsByteArray';\n\nvar FileSource = /*#__PURE__*/function () {\n // Make this.size a method\n function FileSource(file) {\n _classCallCheck(this, FileSource);\n\n this._file = file;\n this.size = file.size;\n }\n\n _createClass(FileSource, [{\n key: \"slice\",\n value: function slice(start, end) {\n // In Apache Cordova applications, a File must be resolved using\n // FileReader instances, see\n // https://cordova.apache.org/docs/en/8.x/reference/cordova-plugin-file/index.html#read-a-file\n if (isCordova()) {\n return readAsByteArray(this._file.slice(start, end));\n }\n\n var value = this._file.slice(start, end);\n\n return Promise.resolve({\n value: value\n });\n }\n }, {\n key: \"close\",\n value: function close() {// Nothing to do here since we don't need to release any resources.\n }\n }]);\n\n return FileSource;\n}();\n\nvar StreamSource = /*#__PURE__*/function () {\n function StreamSource(reader, chunkSize) {\n _classCallCheck(this, StreamSource);\n\n this._chunkSize = chunkSize;\n this._buffer = undefined;\n this._bufferOffset = 0;\n this._reader = reader;\n this._done = false;\n }\n\n _createClass(StreamSource, [{\n key: \"slice\",\n value: function slice(start, end) {\n if (start < this._bufferOffset) {\n return Promise.reject(new Error(\"Requested data is before the reader's current offset\"));\n }\n\n return this._readUntilEnoughDataOrDone(start, end);\n }\n }, {\n key: \"_readUntilEnoughDataOrDone\",\n value: function _readUntilEnoughDataOrDone(start, end) {\n var _this = this;\n\n var hasEnoughData = end <= this._bufferOffset + len(this._buffer);\n\n if (this._done || hasEnoughData) {\n var value = this._getDataFromBuffer(start, end);\n\n var done = value == null ? this._done : false;\n return Promise.resolve({\n value: value,\n done: done\n });\n }\n\n return this._reader.read().then(function (_ref) {\n var value = _ref.value,\n done = _ref.done;\n\n if (done) {\n _this._done = true;\n } else if (_this._buffer === undefined) {\n _this._buffer = value;\n } else {\n _this._buffer = concat(_this._buffer, value);\n }\n\n return _this._readUntilEnoughDataOrDone(start, end);\n });\n }\n }, {\n key: \"_getDataFromBuffer\",\n value: function _getDataFromBuffer(start, end) {\n // Remove data from buffer before `start`.\n // Data might be reread from the buffer if an upload fails, so we can only\n // safely delete data when it comes *before* what is currently being read.\n if (start > this._bufferOffset) {\n this._buffer = this._buffer.slice(start - this._bufferOffset);\n this._bufferOffset = start;\n } // If the buffer is empty after removing old data, all data has been read.\n\n\n var hasAllDataBeenRead = len(this._buffer) === 0;\n\n if (this._done && hasAllDataBeenRead) {\n return null;\n } // We already removed data before `start`, so we just return the first\n // chunk from the buffer.\n\n\n return this._buffer.slice(0, end - start);\n }\n }, {\n key: \"close\",\n value: function close() {\n if (this._reader.cancel) {\n this._reader.cancel();\n }\n }\n }]);\n\n return StreamSource;\n}();\n\nfunction len(blobOrArray) {\n if (blobOrArray === undefined) return 0;\n if (blobOrArray.size !== undefined) return blobOrArray.size;\n return blobOrArray.length;\n}\n/*\n Typed arrays and blobs don't have a concat method.\n This function helps StreamSource accumulate data to reach chunkSize.\n*/\n\n\nfunction concat(a, b) {\n if (a.concat) {\n // Is `a` an Array?\n return a.concat(b);\n }\n\n if (a instanceof Blob) {\n return new Blob([a, b], {\n type: a.type\n });\n }\n\n if (a.set) {\n // Is `a` a typed array?\n var c = new a.constructor(a.length + b.length);\n c.set(a);\n c.set(b, a.length);\n return c;\n }\n\n throw new Error('Unknown data type');\n}\n\nvar FileReader = /*#__PURE__*/function () {\n function FileReader() {\n _classCallCheck(this, FileReader);\n }\n\n _createClass(FileReader, [{\n key: \"openFile\",\n value: function openFile(input, chunkSize) {\n // In React Native, when user selects a file, instead of a File or Blob,\n // you usually get a file object {} with a uri property that contains\n // a local path to the file. We use XMLHttpRequest to fetch\n // the file blob, before uploading with tus.\n if (isReactNative() && input && typeof input.uri !== 'undefined') {\n return uriToBlob(input.uri).then(function (blob) {\n return new FileSource(blob);\n })[\"catch\"](function (err) {\n throw new Error(\"tus: cannot fetch `file.uri` as Blob, make sure the uri is correct and accessible. \".concat(err));\n });\n } // Since we emulate the Blob type in our tests (not all target browsers\n // support it), we cannot use `instanceof` for testing whether the input value\n // can be handled. Instead, we simply check is the slice() function and the\n // size property are available.\n\n\n if (typeof input.slice === 'function' && typeof input.size !== 'undefined') {\n return Promise.resolve(new FileSource(input));\n }\n\n if (typeof input.read === 'function') {\n chunkSize = +chunkSize;\n\n if (!isFinite(chunkSize)) {\n return Promise.reject(new Error('cannot create source for stream without a finite value for the `chunkSize` option'));\n }\n\n return Promise.resolve(new StreamSource(input, chunkSize));\n }\n\n return Promise.reject(new Error('source object may only be an instance of File, Blob, or Reader in this environment'));\n }\n }]);\n\n return FileReader;\n}();\n\nexport { FileReader as default };","/**\n * readAsByteArray converts a File object to a Uint8Array.\n * This function is only used on the Apache Cordova platform.\n * See https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/index.html#read-a-file\n */\nexport default function readAsByteArray(chunk) {\n return new Promise(function (resolve, reject) {\n var reader = new FileReader();\n\n reader.onload = function () {\n var value = new Uint8Array(reader.result);\n resolve({\n value: value\n });\n };\n\n reader.onerror = function (err) {\n reject(err);\n };\n\n reader.readAsArrayBuffer(chunk);\n });\n}","/**\n * uriToBlob resolves a URI to a Blob object. This is used for\n * React Native to retrieve a file (identified by a file://\n * URI) as a blob.\n */\nexport default function uriToBlob(uri) {\n return new Promise(function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n xhr.responseType = 'blob';\n\n xhr.onload = function () {\n var blob = xhr.response;\n resolve(blob);\n };\n\n xhr.onerror = function (err) {\n reject(err);\n };\n\n xhr.open('GET', uri);\n xhr.send();\n });\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/* global window */\nimport BaseUpload from '../upload';\nimport NoopUrlStorage from '../noopUrlStorage';\nimport { enableDebugLog } from '../logger';\nimport { canStoreURLs, WebStorageUrlStorage } from './urlStorage';\nimport HttpStack from './httpStack';\nimport FileReader from './fileReader';\nimport fingerprint from './fingerprint';\n\nvar defaultOptions = _objectSpread({}, BaseUpload.defaultOptions, {\n httpStack: new HttpStack(),\n fileReader: new FileReader(),\n urlStorage: canStoreURLs ? new WebStorageUrlStorage() : new NoopUrlStorage(),\n fingerprint: fingerprint\n});\n\nvar Upload = /*#__PURE__*/function (_BaseUpload) {\n _inherits(Upload, _BaseUpload);\n\n var _super = _createSuper(Upload);\n\n function Upload() {\n var file = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Upload);\n\n options = _objectSpread({}, defaultOptions, {}, options);\n return _super.call(this, file, options);\n }\n\n _createClass(Upload, null, [{\n key: \"terminate\",\n value: function terminate(url, options, cb) {\n options = _objectSpread({}, defaultOptions, {}, options);\n return BaseUpload.terminate(url, options, cb);\n }\n }]);\n\n return Upload;\n}(BaseUpload);\n\nvar _window = window,\n XMLHttpRequest = _window.XMLHttpRequest,\n Blob = _window.Blob;\nvar isSupported = XMLHttpRequest && Blob && typeof Blob.prototype.slice === 'function';\nexport { Upload, canStoreURLs, defaultOptions, isSupported, enableDebugLog, HttpStack };","import isReactNative from './isReactNative'; // TODO: Differenciate between input types\n\n/**\n * Generate a fingerprint for a file which will be used the store the endpoint\n *\n * @param {File} file\n * @param {Object} options\n * @param {Function} callback\n */\n\nexport default function fingerprint(file, options) {\n if (isReactNative()) {\n return Promise.resolve(reactNativeFingerprint(file, options));\n }\n\n return Promise.resolve(['tus-br', file.name, file.type, file.size, file.lastModified, options.endpoint].join('-'));\n}\n\nfunction reactNativeFingerprint(file, options) {\n var exifHash = file.exif ? hashCode(JSON.stringify(file.exif)) : 'noexif';\n return ['tus-rn', file.name || 'noname', file.size || 'nosize', exifHash, options.endpoint].join('/');\n}\n\nfunction hashCode(str) {\n // from https://stackoverflow.com/a/8831937/151666\n var hash = 0;\n\n if (str.length === 0) {\n return hash;\n }\n\n for (var i = 0; i < str.length; i++) {\n var _char = str.charCodeAt(i);\n\n hash = (hash << 5) - hash + _char;\n hash &= hash; // Convert to 32bit integer\n }\n\n return hash;\n}","\"use strict\";\n\nvar _class, _temp;\n\nconst BasePlugin = require('@uppy/core/lib/BasePlugin');\n\nconst tus = require('tus-js-client');\n\nconst {\n Provider,\n RequestClient,\n Socket\n} = require('@uppy/companion-client');\n\nconst emitSocketProgress = require('@uppy/utils/lib/emitSocketProgress');\n\nconst getSocketHost = require('@uppy/utils/lib/getSocketHost');\n\nconst settle = require('@uppy/utils/lib/settle');\n\nconst EventTracker = require('@uppy/utils/lib/EventTracker');\n\nconst NetworkError = require('@uppy/utils/lib/NetworkError');\n\nconst isNetworkError = require('@uppy/utils/lib/isNetworkError');\n\nconst {\n RateLimitedQueue\n} = require('@uppy/utils/lib/RateLimitedQueue');\n\nconst hasProperty = require('@uppy/utils/lib/hasProperty');\n\nconst getFingerprint = require('./getFingerprint');\n/** @typedef {import('..').TusOptions} TusOptions */\n\n/** @typedef {import('tus-js-client').UploadOptions} RawTusOptions */\n\n/** @typedef {import('@uppy/core').Uppy} Uppy */\n\n/** @typedef {import('@uppy/core').UppyFile} UppyFile */\n\n/** @typedef {import('@uppy/core').FailedUppyFile<{}>} FailedUppyFile */\n\n/**\n * Extracted from https://github.com/tus/tus-js-client/blob/master/lib/upload.js#L13\n * excepted we removed 'fingerprint' key to avoid adding more dependencies\n *\n * @type {RawTusOptions}\n */\n\n\nconst tusDefaultOptions = {\n endpoint: '',\n uploadUrl: null,\n metadata: {},\n uploadSize: null,\n onProgress: null,\n onChunkComplete: null,\n onSuccess: null,\n onError: null,\n overridePatchMethod: false,\n headers: {},\n addRequestId: false,\n chunkSize: Infinity,\n retryDelays: [0, 1000, 3000, 5000],\n parallelUploads: 1,\n removeFingerprintOnSuccess: false,\n uploadLengthDeferred: false,\n uploadDataDuringCreation: false\n};\n/**\n * Tus resumable file uploader\n */\n\nmodule.exports = (_temp = _class = class Tus extends BasePlugin {\n /**\n * @param {Uppy} uppy\n * @param {TusOptions} opts\n */\n constructor(uppy, opts) {\n super(uppy, opts);\n this.type = 'uploader';\n this.id = this.opts.id || 'Tus';\n this.title = 'Tus'; // set default options\n\n const defaultOptions = {\n useFastRemoteRetry: true,\n limit: 5,\n retryDelays: [0, 1000, 3000, 5000],\n withCredentials: false\n }; // merge default options with the ones set by user\n\n /** @type {import(\"..\").TusOptions} */\n\n this.opts = { ...defaultOptions,\n ...opts\n };\n\n if ('autoRetry' in opts) {\n throw new Error('The `autoRetry` option was deprecated and has been removed.');\n }\n /**\n * Simultaneous upload limiting is shared across all uploads with this plugin.\n *\n * @type {RateLimitedQueue}\n */\n\n\n this.requests = new RateLimitedQueue(this.opts.limit);\n this.uploaders = Object.create(null);\n this.uploaderEvents = Object.create(null);\n this.uploaderSockets = Object.create(null);\n this.handleResetProgress = this.handleResetProgress.bind(this);\n this.handleUpload = this.handleUpload.bind(this);\n }\n\n handleResetProgress() {\n const files = { ...this.uppy.getState().files\n };\n Object.keys(files).forEach(fileID => {\n // Only clone the file object if it has a Tus `uploadUrl` attached.\n if (files[fileID].tus && files[fileID].tus.uploadUrl) {\n const tusState = { ...files[fileID].tus\n };\n delete tusState.uploadUrl;\n files[fileID] = { ...files[fileID],\n tus: tusState\n };\n }\n });\n this.uppy.setState({\n files\n });\n }\n /**\n * Clean up all references for a file's upload: the tus.Upload instance,\n * any events related to the file, and the Companion WebSocket connection.\n *\n * @param {string} fileID\n */\n\n\n resetUploaderReferences(fileID, opts) {\n if (opts === void 0) {\n opts = {};\n }\n\n if (this.uploaders[fileID]) {\n const uploader = this.uploaders[fileID];\n uploader.abort();\n\n if (opts.abort) {\n uploader.abort(true);\n }\n\n this.uploaders[fileID] = null;\n }\n\n if (this.uploaderEvents[fileID]) {\n this.uploaderEvents[fileID].remove();\n this.uploaderEvents[fileID] = null;\n }\n\n if (this.uploaderSockets[fileID]) {\n this.uploaderSockets[fileID].close();\n this.uploaderSockets[fileID] = null;\n }\n }\n /**\n * Create a new Tus upload.\n *\n * A lot can happen during an upload, so this is quite hard to follow!\n * - First, the upload is started. If the file was already paused by the time the upload starts, nothing should happen.\n * If the `limit` option is used, the upload must be queued onto the `this.requests` queue.\n * When an upload starts, we store the tus.Upload instance, and an EventTracker instance that manages the event listeners\n * for pausing, cancellation, removal, etc.\n * - While the upload is in progress, it may be paused or cancelled.\n * Pausing aborts the underlying tus.Upload, and removes the upload from the `this.requests` queue. All other state is\n * maintained.\n * Cancelling removes the upload from the `this.requests` queue, and completely aborts the upload-- the `tus.Upload`\n * instance is aborted and discarded, the EventTracker instance is destroyed (removing all listeners).\n * Resuming the upload uses the `this.requests` queue as well, to prevent selectively pausing and resuming uploads from\n * bypassing the limit.\n * - After completing an upload, the tus.Upload and EventTracker instances are cleaned up, and the upload is marked as done\n * in the `this.requests` queue.\n * - When an upload completed with an error, the same happens as on successful completion, but the `upload()` promise is\n * rejected.\n *\n * When working on this function, keep in mind:\n * - When an upload is completed or cancelled for any reason, the tus.Upload and EventTracker instances need to be cleaned\n * up using this.resetUploaderReferences().\n * - When an upload is cancelled or paused, for any reason, it needs to be removed from the `this.requests` queue using\n * `queuedRequest.abort()`.\n * - When an upload is completed for any reason, including errors, it needs to be marked as such using\n * `queuedRequest.done()`.\n * - When an upload is started or resumed, it needs to go through the `this.requests` queue. The `queuedRequest` variable\n * must be updated so the other uses of it are valid.\n * - Before replacing the `queuedRequest` variable, the previous `queuedRequest` must be aborted, else it will keep taking\n * up a spot in the queue.\n *\n * @param {UppyFile} file for use with upload\n * @param {number} current file in a queue\n * @param {number} total number of files in a queue\n * @returns {Promise<void>}\n */\n\n\n upload(file) {\n this.resetUploaderReferences(file.id); // Create a new tus upload\n\n return new Promise((resolve, reject) => {\n this.uppy.emit('upload-started', file);\n const opts = { ...this.opts,\n ...(file.tus || {})\n };\n\n if (typeof opts.headers === 'function') {\n opts.headers = opts.headers(file);\n }\n /** @type {RawTusOptions} */\n\n\n const uploadOptions = { ...tusDefaultOptions,\n ...opts\n }; // We override tus fingerprint to uppy’s `file.id`, since the `file.id`\n // now also includes `relativePath` for files added from folders.\n // This means you can add 2 identical files, if one is in folder a,\n // the other in folder b.\n\n uploadOptions.fingerprint = getFingerprint(file);\n\n uploadOptions.onBeforeRequest = req => {\n const xhr = req.getUnderlyingObject();\n xhr.withCredentials = !!opts.withCredentials;\n\n if (typeof opts.onBeforeRequest === 'function') {\n opts.onBeforeRequest(req);\n }\n };\n\n uploadOptions.onError = err => {\n this.uppy.log(err);\n const xhr = err.originalRequest ? err.originalRequest.getUnderlyingObject() : null;\n\n if (isNetworkError(xhr)) {\n err = new NetworkError(err, xhr);\n }\n\n this.resetUploaderReferences(file.id);\n queuedRequest.done();\n this.uppy.emit('upload-error', file, err);\n reject(err);\n };\n\n uploadOptions.onProgress = (bytesUploaded, bytesTotal) => {\n this.onReceiveUploadUrl(file, upload.url);\n this.uppy.emit('upload-progress', file, {\n uploader: this,\n bytesUploaded,\n bytesTotal\n });\n };\n\n uploadOptions.onSuccess = () => {\n const uploadResp = {\n uploadURL: upload.url\n };\n this.resetUploaderReferences(file.id);\n queuedRequest.done();\n this.uppy.emit('upload-success', file, uploadResp);\n\n if (upload.url) {\n this.uppy.log(`Download ${upload.file.name} from ${upload.url}`);\n }\n\n resolve(upload);\n };\n\n const copyProp = (obj, srcProp, destProp) => {\n if (hasProperty(obj, srcProp) && !hasProperty(obj, destProp)) {\n obj[destProp] = obj[srcProp];\n }\n };\n /** @type {Record<string, string>} */\n\n\n const meta = {};\n const metaFields = Array.isArray(opts.metaFields) ? opts.metaFields // Send along all fields by default.\n : Object.keys(file.meta);\n metaFields.forEach(item => {\n meta[item] = file.meta[item];\n }); // tusd uses metadata fields 'filetype' and 'filename'\n\n copyProp(meta, 'type', 'filetype');\n copyProp(meta, 'name', 'filename');\n uploadOptions.metadata = meta;\n const upload = new tus.Upload(file.data, uploadOptions);\n this.uploaders[file.id] = upload;\n this.uploaderEvents[file.id] = new EventTracker(this.uppy);\n upload.findPreviousUploads().then(previousUploads => {\n const previousUpload = previousUploads[0];\n\n if (previousUpload) {\n this.uppy.log(`[Tus] Resuming upload of ${file.id} started at ${previousUpload.creationTime}`);\n upload.resumeFromPreviousUpload(previousUpload);\n }\n });\n let queuedRequest = this.requests.run(() => {\n if (!file.isPaused) {\n upload.start();\n } // Don't do anything here, the caller will take care of cancelling the upload itself\n // using resetUploaderReferences(). This is because resetUploaderReferences() has to be\n // called when this request is still in the queue, and has not been started yet, too. At\n // that point this cancellation function is not going to be called.\n // Also, we need to remove the request from the queue _without_ destroying everything\n // related to this upload to handle pauses.\n\n\n return () => {};\n });\n this.onFileRemove(file.id, targetFileID => {\n queuedRequest.abort();\n this.resetUploaderReferences(file.id, {\n abort: !!upload.url\n });\n resolve(`upload ${targetFileID} was removed`);\n });\n this.onPause(file.id, isPaused => {\n if (isPaused) {\n // Remove this file from the queue so another file can start in its place.\n queuedRequest.abort();\n upload.abort();\n } else {\n // Resuming an upload should be queued, else you could pause and then\n // resume a queued upload to make it skip the queue.\n queuedRequest.abort();\n queuedRequest = this.requests.run(() => {\n upload.start();\n return () => {};\n });\n }\n });\n this.onPauseAll(file.id, () => {\n queuedRequest.abort();\n upload.abort();\n });\n this.onCancelAll(file.id, () => {\n queuedRequest.abort();\n this.resetUploaderReferences(file.id, {\n abort: !!upload.url\n });\n resolve(`upload ${file.id} was canceled`);\n });\n this.onResumeAll(file.id, () => {\n queuedRequest.abort();\n\n if (file.error) {\n upload.abort();\n }\n\n queuedRequest = this.requests.run(() => {\n upload.start();\n return () => {};\n });\n });\n }).catch(err => {\n this.uppy.emit('upload-error', file, err);\n throw err;\n });\n }\n /**\n * @param {UppyFile} file for use with upload\n * @param {number} current file in a queue\n * @param {number} total number of files in a queue\n * @returns {Promise<void>}\n */\n\n\n uploadRemote(file) {\n this.resetUploaderReferences(file.id);\n const opts = { ...this.opts\n };\n\n if (file.tus) {\n // Install file-specific upload overrides.\n Object.assign(opts, file.tus);\n }\n\n this.uppy.emit('upload-started', file);\n this.uppy.log(file.remote.url);\n\n if (file.serverToken) {\n return this.connectToServerSocket(file);\n }\n\n return new Promise((resolve, reject) => {\n const Client = file.remote.providerOptions.provider ? Provider : RequestClient;\n const client = new Client(this.uppy, file.remote.providerOptions); // !! cancellation is NOT supported at this stage yet\n\n client.post(file.remote.url, { ...file.remote.body,\n endpoint: opts.endpoint,\n uploadUrl: opts.uploadUrl,\n protocol: 'tus',\n size: file.data.size,\n headers: opts.headers,\n metadata: file.meta\n }).then(res => {\n this.uppy.setFileState(file.id, {\n serverToken: res.token\n });\n file = this.uppy.getFile(file.id);\n return this.connectToServerSocket(file);\n }).then(() => {\n resolve();\n }).catch(err => {\n this.uppy.emit('upload-error', file, err);\n reject(err);\n });\n });\n }\n /**\n * See the comment on the upload() method.\n *\n * Additionally, when an upload is removed, completed, or cancelled, we need to close the WebSocket connection. This is\n * handled by the resetUploaderReferences() function, so the same guidelines apply as in upload().\n *\n * @param {UppyFile} file\n */\n\n\n connectToServerSocket(file) {\n return new Promise((resolve, reject) => {\n const token = file.serverToken;\n const host = getSocketHost(file.remote.companionUrl);\n const socket = new Socket({\n target: `${host}/api/${token}`,\n autoOpen: false\n });\n this.uploaderSockets[file.id] = socket;\n this.uploaderEvents[file.id] = new EventTracker(this.uppy);\n this.onFileRemove(file.id, () => {\n queuedRequest.abort();\n socket.send('cancel', {});\n this.resetUploaderReferences(file.id);\n resolve(`upload ${file.id} was removed`);\n });\n this.onPause(file.id, isPaused => {\n if (isPaused) {\n // Remove this file from the queue so another file can start in its place.\n queuedRequest.abort();\n socket.send('pause', {});\n } else {\n // Resuming an upload should be queued, else you could pause and then\n // resume a queued upload to make it skip the queue.\n queuedRequest.abort();\n queuedRequest = this.requests.run(() => {\n socket.send('resume', {});\n return () => {};\n });\n }\n });\n this.onPauseAll(file.id, () => {\n queuedRequest.abort();\n socket.send('pause', {});\n });\n this.onCancelAll(file.id, () => {\n queuedRequest.abort();\n socket.send('cancel', {});\n this.resetUploaderReferences(file.id);\n resolve(`upload ${file.id} was canceled`);\n });\n this.onResumeAll(file.id, () => {\n queuedRequest.abort();\n\n if (file.error) {\n socket.send('pause', {});\n }\n\n queuedRequest = this.requests.run(() => {\n socket.send('resume', {});\n return () => {};\n });\n });\n this.onRetry(file.id, () => {\n // Only do the retry if the upload is actually in progress;\n // else we could try to send these messages when the upload is still queued.\n // We may need a better check for this since the socket may also be closed\n // for other reasons, like network failures.\n if (socket.isOpen) {\n socket.send('pause', {});\n socket.send('resume', {});\n }\n });\n this.onRetryAll(file.id, () => {\n // See the comment in the onRetry() call\n if (socket.isOpen) {\n socket.send('pause', {});\n socket.send('resume', {});\n }\n });\n socket.on('progress', progressData => emitSocketProgress(this, progressData, file));\n socket.on('error', errData => {\n const {\n message\n } = errData.error;\n const error = Object.assign(new Error(message), {\n cause: errData.error\n }); // If the remote retry optimisation should not be used,\n // close the socket—this will tell companion to clear state and delete the file.\n\n if (!this.opts.useFastRemoteRetry) {\n this.resetUploaderReferences(file.id); // Remove the serverToken so that a new one will be created for the retry.\n\n this.uppy.setFileState(file.id, {\n serverToken: null\n });\n } else {\n socket.close();\n }\n\n this.uppy.emit('upload-error', file, error);\n queuedRequest.done();\n reject(error);\n });\n socket.on('success', data => {\n const uploadResp = {\n uploadURL: data.url\n };\n this.uppy.emit('upload-success', file, uploadResp);\n this.resetUploaderReferences(file.id);\n queuedRequest.done();\n resolve();\n });\n let queuedRequest = this.requests.run(() => {\n socket.open();\n\n if (file.isPaused) {\n socket.send('pause', {});\n } // Don't do anything here, the caller will take care of cancelling the upload itself\n // using resetUploaderReferences(). This is because resetUploaderReferences() has to be\n // called when this request is still in the queue, and has not been started yet, too. At\n // that point this cancellation function is not going to be called.\n // Also, we need to remove the request from the queue _without_ destroying everything\n // related to this upload to handle pauses.\n\n\n return () => {};\n });\n });\n }\n /**\n * Store the uploadUrl on the file options, so that when Golden Retriever\n * restores state, we will continue uploading to the correct URL.\n *\n * @param {UppyFile} file\n * @param {string} uploadURL\n */\n\n\n onReceiveUploadUrl(file, uploadURL) {\n const currentFile = this.uppy.getFile(file.id);\n if (!currentFile) return; // Only do the update if we didn't have an upload URL yet.\n\n if (!currentFile.tus || currentFile.tus.uploadUrl !== uploadURL) {\n this.uppy.log('[Tus] Storing upload url');\n this.uppy.setFileState(currentFile.id, {\n tus: { ...currentFile.tus,\n uploadUrl: uploadURL\n }\n });\n }\n }\n /**\n * @param {string} fileID\n * @param {function(string): void} cb\n */\n\n\n onFileRemove(fileID, cb) {\n this.uploaderEvents[fileID].on('file-removed', file => {\n if (fileID === file.id) cb(file.id);\n });\n }\n /**\n * @param {string} fileID\n * @param {function(boolean): void} cb\n */\n\n\n onPause(fileID, cb) {\n this.uploaderEvents[fileID].on('upload-pause', (targetFileID, isPaused) => {\n if (fileID === targetFileID) {\n // const isPaused = this.uppy.pauseResume(fileID)\n cb(isPaused);\n }\n });\n }\n /**\n * @param {string} fileID\n * @param {function(): void} cb\n */\n\n\n onRetry(fileID, cb) {\n this.uploaderEvents[fileID].on('upload-retry', targetFileID => {\n if (fileID === targetFileID) {\n cb();\n }\n });\n }\n /**\n * @param {string} fileID\n * @param {function(): void} cb\n */\n\n\n onRetryAll(fileID, cb) {\n this.uploaderEvents[fileID].on('retry-all', () => {\n if (!this.uppy.getFile(fileID)) return;\n cb();\n });\n }\n /**\n * @param {string} fileID\n * @param {function(): void} cb\n */\n\n\n onPauseAll(fileID, cb) {\n this.uploaderEvents[fileID].on('pause-all', () => {\n if (!this.uppy.getFile(fileID)) return;\n cb();\n });\n }\n /**\n * @param {string} fileID\n * @param {function(): void} cb\n */\n\n\n onCancelAll(fileID, cb) {\n this.uploaderEvents[fileID].on('cancel-all', () => {\n if (!this.uppy.getFile(fileID)) return;\n cb();\n });\n }\n /**\n * @param {string} fileID\n * @param {function(): void} cb\n */\n\n\n onResumeAll(fileID, cb) {\n this.uploaderEvents[fileID].on('resume-all', () => {\n if (!this.uppy.getFile(fileID)) return;\n cb();\n });\n }\n /**\n * @param {(UppyFile | FailedUppyFile)[]} files\n */\n\n\n uploadFiles(files) {\n const promises = files.map((file, i) => {\n const current = i + 1;\n const total = files.length;\n\n if ('error' in file && file.error) {\n return Promise.reject(new Error(file.error));\n }\n\n if (file.isRemote) {\n // We emit upload-started here, so that it's also emitted for files\n // that have to wait due to the `limit` option.\n // Don't double-emit upload-started for Golden Retriever-restored files that were already started\n if (!file.progress.uploadStarted || !file.isRestored) {\n this.uppy.emit('upload-started', file);\n }\n\n return this.uploadRemote(file, current, total);\n } // Don't double-emit upload-started for Golden Retriever-restored files that were already started\n\n\n if (!file.progress.uploadStarted || !file.isRestored) {\n this.uppy.emit('upload-started', file);\n }\n\n return this.upload(file, current, total);\n });\n return settle(promises);\n }\n /**\n * @param {string[]} fileIDs\n */\n\n\n handleUpload(fileIDs) {\n if (fileIDs.length === 0) {\n this.uppy.log('[Tus] No files to upload');\n return Promise.resolve();\n }\n\n if (this.opts.limit === 0) {\n this.uppy.log('[Tus] When uploading multiple files at once, consider setting the `limit` option (to `10` for example), to limit the number of concurrent uploads, which helps prevent memory and network issues: https://uppy.io/docs/tus/#limit-0', 'warning');\n }\n\n this.uppy.log('[Tus] Uploading...');\n const filesToUpload = fileIDs.map(fileID => this.uppy.getFile(fileID));\n return this.uploadFiles(filesToUpload).then(() => null);\n }\n\n install() {\n this.uppy.setState({\n capabilities: { ...this.uppy.getState().capabilities,\n resumableUploads: true\n }\n });\n this.uppy.addUploader(this.handleUpload);\n this.uppy.on('reset-progress', this.handleResetProgress);\n }\n\n uninstall() {\n this.uppy.setState({\n capabilities: { ...this.uppy.getState().capabilities,\n resumableUploads: false\n }\n });\n this.uppy.removeUploader(this.handleUpload);\n }\n\n}, _class.VERSION = \"2.1.2\", _temp);","/*\n * base64.js\n *\n * Licensed under the BSD 3-Clause License.\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * References:\n * http://en.wikipedia.org/wiki/Base64\n */\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined'\n ? module.exports = factory(global)\n : typeof define === 'function' && define.amd\n ? define(factory) : factory(global)\n}((\n typeof self !== 'undefined' ? self\n : typeof window !== 'undefined' ? window\n : typeof global !== 'undefined' ? global\n: this\n), function(global) {\n 'use strict';\n // existing version for noConflict()\n global = global || {};\n var _Base64 = global.Base64;\n var version = \"2.6.4\";\n // constants\n var b64chars\n = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n var b64tab = function(bin) {\n var t = {};\n for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;\n return t;\n }(b64chars);\n var fromCharCode = String.fromCharCode;\n // encoder stuff\n var cb_utob = function(c) {\n if (c.length < 2) {\n var cc = c.charCodeAt(0);\n return cc < 0x80 ? c\n : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6))\n + fromCharCode(0x80 | (cc & 0x3f)))\n : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f))\n + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))\n + fromCharCode(0x80 | ( cc & 0x3f)));\n } else {\n var cc = 0x10000\n + (c.charCodeAt(0) - 0xD800) * 0x400\n + (c.charCodeAt(1) - 0xDC00);\n return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07))\n + fromCharCode(0x80 | ((cc >>> 12) & 0x3f))\n + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))\n + fromCharCode(0x80 | ( cc & 0x3f)));\n }\n };\n var re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n var utob = function(u) {\n return u.replace(re_utob, cb_utob);\n };\n var cb_encode = function(ccc) {\n var padlen = [0, 2, 1][ccc.length % 3],\n ord = ccc.charCodeAt(0) << 16\n | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8)\n | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)),\n chars = [\n b64chars.charAt( ord >>> 18),\n b64chars.charAt((ord >>> 12) & 63),\n padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),\n padlen >= 1 ? '=' : b64chars.charAt(ord & 63)\n ];\n return chars.join('');\n };\n var btoa = global.btoa && typeof global.btoa == 'function'\n ? function(b){ return global.btoa(b) } : function(b) {\n if (b.match(/[^\\x00-\\xFF]/)) throw new RangeError(\n 'The string contains invalid characters.'\n );\n return b.replace(/[\\s\\S]{1,3}/g, cb_encode);\n };\n var _encode = function(u) {\n return btoa(utob(String(u)));\n };\n var mkUriSafe = function (b64) {\n return b64.replace(/[+\\/]/g, function(m0) {\n return m0 == '+' ? '-' : '_';\n }).replace(/=/g, '');\n };\n var encode = function(u, urisafe) {\n return urisafe ? mkUriSafe(_encode(u)) : _encode(u);\n };\n var encodeURI = function(u) { return encode(u, true) };\n var fromUint8Array;\n if (global.Uint8Array) fromUint8Array = function(a, urisafe) {\n // return btoa(fromCharCode.apply(null, a));\n var b64 = '';\n for (var i = 0, l = a.length; i < l; i += 3) {\n var a0 = a[i], a1 = a[i+1], a2 = a[i+2];\n var ord = a0 << 16 | a1 << 8 | a2;\n b64 += b64chars.charAt( ord >>> 18)\n + b64chars.charAt((ord >>> 12) & 63)\n + ( typeof a1 != 'undefined'\n ? b64chars.charAt((ord >>> 6) & 63) : '=')\n + ( typeof a2 != 'undefined'\n ? b64chars.charAt( ord & 63) : '=');\n }\n return urisafe ? mkUriSafe(b64) : b64;\n };\n // decoder stuff\n var re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\n var cb_btou = function(cccc) {\n switch(cccc.length) {\n case 4:\n var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n | ((0x3f & cccc.charCodeAt(1)) << 12)\n | ((0x3f & cccc.charCodeAt(2)) << 6)\n | (0x3f & cccc.charCodeAt(3)),\n offset = cp - 0x10000;\n return (fromCharCode((offset >>> 10) + 0xD800)\n + fromCharCode((offset & 0x3FF) + 0xDC00));\n case 3:\n return fromCharCode(\n ((0x0f & cccc.charCodeAt(0)) << 12)\n | ((0x3f & cccc.charCodeAt(1)) << 6)\n | (0x3f & cccc.charCodeAt(2))\n );\n default:\n return fromCharCode(\n ((0x1f & cccc.charCodeAt(0)) << 6)\n | (0x3f & cccc.charCodeAt(1))\n );\n }\n };\n var btou = function(b) {\n return b.replace(re_btou, cb_btou);\n };\n var cb_decode = function(cccc) {\n var len = cccc.length,\n padlen = len % 4,\n n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0)\n | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0)\n | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0)\n | (len > 3 ? b64tab[cccc.charAt(3)] : 0),\n chars = [\n fromCharCode( n >>> 16),\n fromCharCode((n >>> 8) & 0xff),\n fromCharCode( n & 0xff)\n ];\n chars.length -= [0, 0, 2, 1][padlen];\n return chars.join('');\n };\n var _atob = global.atob && typeof global.atob == 'function'\n ? function(a){ return global.atob(a) } : function(a){\n return a.replace(/\\S{1,4}/g, cb_decode);\n };\n var atob = function(a) {\n return _atob(String(a).replace(/[^A-Za-z0-9\\+\\/]/g, ''));\n };\n var _decode = function(a) { return btou(_atob(a)) };\n var _fromURI = function(a) {\n return String(a).replace(/[-_]/g, function(m0) {\n return m0 == '-' ? '+' : '/'\n }).replace(/[^A-Za-z0-9\\+\\/]/g, '');\n };\n var decode = function(a){\n return _decode(_fromURI(a));\n };\n var toUint8Array;\n if (global.Uint8Array) toUint8Array = function(a) {\n return Uint8Array.from(atob(_fromURI(a)), function(c) {\n return c.charCodeAt(0);\n });\n };\n var noConflict = function() {\n var Base64 = global.Base64;\n global.Base64 = _Base64;\n return Base64;\n };\n // export Base64\n global.Base64 = {\n VERSION: version,\n atob: atob,\n btoa: btoa,\n fromBase64: decode,\n toBase64: encode,\n utob: utob,\n encode: encode,\n encodeURI: encodeURI,\n btou: btou,\n decode: decode,\n noConflict: noConflict,\n fromUint8Array: fromUint8Array,\n toUint8Array: toUint8Array\n };\n // if ES5 is available, make Base64.extendString() available\n if (typeof Object.defineProperty === 'function') {\n var noEnum = function(v){\n return {value:v,enumerable:false,writable:true,configurable:true};\n };\n global.Base64.extendString = function () {\n Object.defineProperty(\n String.prototype, 'fromBase64', noEnum(function () {\n return decode(this)\n }));\n Object.defineProperty(\n String.prototype, 'toBase64', noEnum(function (urisafe) {\n return encode(this, urisafe)\n }));\n Object.defineProperty(\n String.prototype, 'toBase64URI', noEnum(function () {\n return encode(this, true)\n }));\n };\n }\n //\n // export Base64 to the namespace\n //\n if (global['Meteor']) { // Meteor.js\n Base64 = global.Base64;\n }\n // module.exports and AMD are mutually exclusive.\n // module.exports has precedence.\n if (typeof module !== 'undefined' && module.exports) {\n module.exports.Base64 = global.Base64;\n }\n else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], function(){ return global.Base64 });\n }\n // that's it!\n return {Base64: global.Base64}\n}));\n","'use strict';\n\nvar required = require('requires-port')\n , qs = require('querystringify')\n , slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//\n , protocolre = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\\\/]+)?([\\S\\s]*)/i\n , windowsDriveLetter = /^[a-zA-Z]:/\n , whitespace = '[\\\\x09\\\\x0A\\\\x0B\\\\x0C\\\\x0D\\\\x20\\\\xA0\\\\u1680\\\\u180E\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200A\\\\u202F\\\\u205F\\\\u3000\\\\u2028\\\\u2029\\\\uFEFF]'\n , left = new RegExp('^'+ whitespace +'+');\n\n/**\n * Trim a given string.\n *\n * @param {String} str String to trim.\n * @public\n */\nfunction trimLeft(str) {\n return (str ? str : '').toString().replace(left, '');\n}\n\n/**\n * These are the parse rules for the URL parser, it informs the parser\n * about:\n *\n * 0. The char it Needs to parse, if it's a string it should be done using\n * indexOf, RegExp using exec and NaN means set as current value.\n * 1. The property we should set when parsing this value.\n * 2. Indication if it's backwards or forward parsing, when set as number it's\n * the value of extra chars that should be split off.\n * 3. Inherit from location if non existing in the parser.\n * 4. `toLowerCase` the resulting value.\n */\nvar rules = [\n ['#', 'hash'], // Extract from the back.\n ['?', 'query'], // Extract from the back.\n function sanitize(address, url) { // Sanitize what is left of the address\n return isSpecial(url.protocol) ? address.replace(/\\\\/g, '/') : address;\n },\n ['/', 'pathname'], // Extract from the back.\n ['@', 'auth', 1], // Extract from the front.\n [NaN, 'host', undefined, 1, 1], // Set left over value.\n [/:(\\d+)$/, 'port', undefined, 1], // RegExp the back.\n [NaN, 'hostname', undefined, 1, 1] // Set left over.\n];\n\n/**\n * These properties should not be copied or inherited from. This is only needed\n * for all non blob URL's as a blob URL does not include a hash, only the\n * origin.\n *\n * @type {Object}\n * @private\n */\nvar ignore = { hash: 1, query: 1 };\n\n/**\n * The location object differs when your code is loaded through a normal page,\n * Worker or through a worker using a blob. And with the blobble begins the\n * trouble as the location object will contain the URL of the blob, not the\n * location of the page where our code is loaded in. The actual origin is\n * encoded in the `pathname` so we can thankfully generate a good \"default\"\n * location from it so we can generate proper relative URL's again.\n *\n * @param {Object|String} loc Optional default location object.\n * @returns {Object} lolcation object.\n * @public\n */\nfunction lolcation(loc) {\n var globalVar;\n\n if (typeof window !== 'undefined') globalVar = window;\n else if (typeof global !== 'undefined') globalVar = global;\n else if (typeof self !== 'undefined') globalVar = self;\n else globalVar = {};\n\n var location = globalVar.location || {};\n loc = loc || location;\n\n var finaldestination = {}\n , type = typeof loc\n , key;\n\n if ('blob:' === loc.protocol) {\n finaldestination = new Url(unescape(loc.pathname), {});\n } else if ('string' === type) {\n finaldestination = new Url(loc, {});\n for (key in ignore) delete finaldestination[key];\n } else if ('object' === type) {\n for (key in loc) {\n if (key in ignore) continue;\n finaldestination[key] = loc[key];\n }\n\n if (finaldestination.slashes === undefined) {\n finaldestination.slashes = slashes.test(loc.href);\n }\n }\n\n return finaldestination;\n}\n\n/**\n * Check whether a protocol scheme is special.\n *\n * @param {String} The protocol scheme of the URL\n * @return {Boolean} `true` if the protocol scheme is special, else `false`\n * @private\n */\nfunction isSpecial(scheme) {\n return (\n scheme === 'file:' ||\n scheme === 'ftp:' ||\n scheme === 'http:' ||\n scheme === 'https:' ||\n scheme === 'ws:' ||\n scheme === 'wss:'\n );\n}\n\n/**\n * @typedef ProtocolExtract\n * @type Object\n * @property {String} protocol Protocol matched in the URL, in lowercase.\n * @property {Boolean} slashes `true` if protocol is followed by \"//\", else `false`.\n * @property {String} rest Rest of the URL that is not part of the protocol.\n */\n\n/**\n * Extract protocol information from a URL with/without double slash (\"//\").\n *\n * @param {String} address URL we want to extract from.\n * @param {Object} location\n * @return {ProtocolExtract} Extracted information.\n * @private\n */\nfunction extractProtocol(address, location) {\n address = trimLeft(address);\n location = location || {};\n\n var match = protocolre.exec(address);\n var protocol = match[1] ? match[1].toLowerCase() : '';\n var forwardSlashes = !!match[2];\n var otherSlashes = !!match[3];\n var slashesCount = 0;\n var rest;\n\n if (forwardSlashes) {\n if (otherSlashes) {\n rest = match[2] + match[3] + match[4];\n slashesCount = match[2].length + match[3].length;\n } else {\n rest = match[2] + match[4];\n slashesCount = match[2].length;\n }\n } else {\n if (otherSlashes) {\n rest = match[3] + match[4];\n slashesCount = match[3].length;\n } else {\n rest = match[4]\n }\n }\n\n if (protocol === 'file:') {\n if (slashesCount >= 2) {\n rest = rest.slice(2);\n }\n } else if (isSpecial(protocol)) {\n rest = match[4];\n } else if (protocol) {\n if (forwardSlashes) {\n rest = rest.slice(2);\n }\n } else if (slashesCount >= 2 && isSpecial(location.protocol)) {\n rest = match[4];\n }\n\n return {\n protocol: protocol,\n slashes: forwardSlashes || isSpecial(protocol),\n slashesCount: slashesCount,\n rest: rest\n };\n}\n\n/**\n * Resolve a relative URL pathname against a base URL pathname.\n *\n * @param {String} relative Pathname of the relative URL.\n * @param {String} base Pathname of the base URL.\n * @return {String} Resolved pathname.\n * @private\n */\nfunction resolve(relative, base) {\n if (relative === '') return base;\n\n var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/'))\n , i = path.length\n , last = path[i - 1]\n , unshift = false\n , up = 0;\n\n while (i--) {\n if (path[i] === '.') {\n path.splice(i, 1);\n } else if (path[i] === '..') {\n path.splice(i, 1);\n up++;\n } else if (up) {\n if (i === 0) unshift = true;\n path.splice(i, 1);\n up--;\n }\n }\n\n if (unshift) path.unshift('');\n if (last === '.' || last === '..') path.push('');\n\n return path.join('/');\n}\n\n/**\n * The actual URL instance. Instead of returning an object we've opted-in to\n * create an actual constructor as it's much more memory efficient and\n * faster and it pleases my OCD.\n *\n * It is worth noting that we should not use `URL` as class name to prevent\n * clashes with the global URL instance that got introduced in browsers.\n *\n * @constructor\n * @param {String} address URL we want to parse.\n * @param {Object|String} [location] Location defaults for relative paths.\n * @param {Boolean|Function} [parser] Parser for the query string.\n * @private\n */\nfunction Url(address, location, parser) {\n address = trimLeft(address);\n\n if (!(this instanceof Url)) {\n return new Url(address, location, parser);\n }\n\n var relative, extracted, parse, instruction, index, key\n , instructions = rules.slice()\n , type = typeof location\n , url = this\n , i = 0;\n\n //\n // The following if statements allows this module two have compatibility with\n // 2 different API:\n //\n // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments\n // where the boolean indicates that the query string should also be parsed.\n //\n // 2. The `URL` interface of the browser which accepts a URL, object as\n // arguments. The supplied object will be used as default values / fall-back\n // for relative paths.\n //\n if ('object' !== type && 'string' !== type) {\n parser = location;\n location = null;\n }\n\n if (parser && 'function' !== typeof parser) parser = qs.parse;\n\n location = lolcation(location);\n\n //\n // Extract protocol information before running the instructions.\n //\n extracted = extractProtocol(address || '', location);\n relative = !extracted.protocol && !extracted.slashes;\n url.slashes = extracted.slashes || relative && location.slashes;\n url.protocol = extracted.protocol || location.protocol || '';\n address = extracted.rest;\n\n //\n // When the authority component is absent the URL starts with a path\n // component.\n //\n if (\n extracted.protocol === 'file:' && (\n extracted.slashesCount !== 2 || windowsDriveLetter.test(address)) ||\n (!extracted.slashes &&\n (extracted.protocol ||\n extracted.slashesCount < 2 ||\n !isSpecial(url.protocol)))\n ) {\n instructions[3] = [/(.*)/, 'pathname'];\n }\n\n for (; i < instructions.length; i++) {\n instruction = instructions[i];\n\n if (typeof instruction === 'function') {\n address = instruction(address, url);\n continue;\n }\n\n parse = instruction[0];\n key = instruction[1];\n\n if (parse !== parse) {\n url[key] = address;\n } else if ('string' === typeof parse) {\n if (~(index = address.indexOf(parse))) {\n if ('number' === typeof instruction[2]) {\n url[key] = address.slice(0, index);\n address = address.slice(index + instruction[2]);\n } else {\n url[key] = address.slice(index);\n address = address.slice(0, index);\n }\n }\n } else if ((index = parse.exec(address))) {\n url[key] = index[1];\n address = address.slice(0, index.index);\n }\n\n url[key] = url[key] || (\n relative && instruction[3] ? location[key] || '' : ''\n );\n\n //\n // Hostname, host and protocol should be lowercased so they can be used to\n // create a proper `origin`.\n //\n if (instruction[4]) url[key] = url[key].toLowerCase();\n }\n\n //\n // Also parse the supplied query string in to an object. If we're supplied\n // with a custom parser as function use that instead of the default build-in\n // parser.\n //\n if (parser) url.query = parser(url.query);\n\n //\n // If the URL is relative, resolve the pathname against the base URL.\n //\n if (\n relative\n && location.slashes\n && url.pathname.charAt(0) !== '/'\n && (url.pathname !== '' || location.pathname !== '')\n ) {\n url.pathname = resolve(url.pathname, location.pathname);\n }\n\n //\n // Default to a / for pathname if none exists. This normalizes the URL\n // to always have a /\n //\n if (url.pathname.charAt(0) !== '/' && isSpecial(url.protocol)) {\n url.pathname = '/' + url.pathname;\n }\n\n //\n // We should not add port numbers if they are already the default port number\n // for a given protocol. As the host also contains the port number we're going\n // override it with the hostname which contains no port number.\n //\n if (!required(url.port, url.protocol)) {\n url.host = url.hostname;\n url.port = '';\n }\n\n //\n // Parse down the `auth` for the username and password.\n //\n url.username = url.password = '';\n if (url.auth) {\n instruction = url.auth.split(':');\n url.username = instruction[0] || '';\n url.password = instruction[1] || '';\n }\n\n url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n ? url.protocol +'//'+ url.host\n : 'null';\n\n //\n // The href is just the compiled result.\n //\n url.href = url.toString();\n}\n\n/**\n * This is convenience method for changing properties in the URL instance to\n * insure that they all propagate correctly.\n *\n * @param {String} part Property we need to adjust.\n * @param {Mixed} value The newly assigned value.\n * @param {Boolean|Function} fn When setting the query, it will be the function\n * used to parse the query.\n * When setting the protocol, double slash will be\n * removed from the final url if it is true.\n * @returns {URL} URL instance for chaining.\n * @public\n */\nfunction set(part, value, fn) {\n var url = this;\n\n switch (part) {\n case 'query':\n if ('string' === typeof value && value.length) {\n value = (fn || qs.parse)(value);\n }\n\n url[part] = value;\n break;\n\n case 'port':\n url[part] = value;\n\n if (!required(value, url.protocol)) {\n url.host = url.hostname;\n url[part] = '';\n } else if (value) {\n url.host = url.hostname +':'+ value;\n }\n\n break;\n\n case 'hostname':\n url[part] = value;\n\n if (url.port) value += ':'+ url.port;\n url.host = value;\n break;\n\n case 'host':\n url[part] = value;\n\n if (/:\\d+$/.test(value)) {\n value = value.split(':');\n url.port = value.pop();\n url.hostname = value.join(':');\n } else {\n url.hostname = value;\n url.port = '';\n }\n\n break;\n\n case 'protocol':\n url.protocol = value.toLowerCase();\n url.slashes = !fn;\n break;\n\n case 'pathname':\n case 'hash':\n if (value) {\n var char = part === 'pathname' ? '/' : '#';\n url[part] = value.charAt(0) !== char ? char + value : value;\n } else {\n url[part] = value;\n }\n break;\n\n default:\n url[part] = value;\n }\n\n for (var i = 0; i < rules.length; i++) {\n var ins = rules[i];\n\n if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase();\n }\n\n url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n ? url.protocol +'//'+ url.host\n : 'null';\n\n url.href = url.toString();\n\n return url;\n}\n\n/**\n * Transform the properties back in to a valid and full URL string.\n *\n * @param {Function} stringify Optional query stringify function.\n * @returns {String} Compiled version of the URL.\n * @public\n */\nfunction toString(stringify) {\n if (!stringify || 'function' !== typeof stringify) stringify = qs.stringify;\n\n var query\n , url = this\n , protocol = url.protocol;\n\n if (protocol && protocol.charAt(protocol.length - 1) !== ':') protocol += ':';\n\n var result = protocol + (url.slashes || isSpecial(url.protocol) ? '//' : '');\n\n if (url.username) {\n result += url.username;\n if (url.password) result += ':'+ url.password;\n result += '@';\n }\n\n result += url.host + url.pathname;\n\n query = 'object' === typeof url.query ? stringify(url.query) : url.query;\n if (query) result += '?' !== query.charAt(0) ? '?'+ query : query;\n\n if (url.hash) result += url.hash;\n\n return result;\n}\n\nUrl.prototype = { set: set, toString: toString };\n\n//\n// Expose the URL parser and some additional properties that might be useful for\n// others or testing.\n//\nUrl.extractProtocol = extractProtocol;\nUrl.location = lolcation;\nUrl.trimLeft = trimLeft;\nUrl.qs = qs;\n\nmodule.exports = Url;\n","'use strict';\n\n/**\n * Check if we're required to add a port number.\n *\n * @see https://url.spec.whatwg.org/#default-port\n * @param {Number|String} port Port number we need to check\n * @param {String} protocol Protocol we need to check against.\n * @returns {Boolean} Is it a default port for the given protocol\n * @api private\n */\nmodule.exports = function required(port, protocol) {\n protocol = protocol.split(':')[0];\n port = +port;\n\n if (!port) return false;\n\n switch (protocol) {\n case 'http':\n case 'ws':\n return port !== 80;\n\n case 'https':\n case 'wss':\n return port !== 443;\n\n case 'ftp':\n return port !== 21;\n\n case 'gopher':\n return port !== 70;\n\n case 'file':\n return false;\n }\n\n return port !== 0;\n};\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , undef;\n\n/**\n * Decode a URI encoded string.\n *\n * @param {String} input The URI encoded string.\n * @returns {String|Null} The decoded string.\n * @api private\n */\nfunction decode(input) {\n try {\n return decodeURIComponent(input.replace(/\\+/g, ' '));\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Attempts to encode a given input.\n *\n * @param {String} input The string that needs to be encoded.\n * @returns {String|Null} The encoded string.\n * @api private\n */\nfunction encode(input) {\n try {\n return encodeURIComponent(input);\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Simple query string parser.\n *\n * @param {String} query The query string that needs to be parsed.\n * @returns {Object}\n * @api public\n */\nfunction querystring(query) {\n var parser = /([^=?#&]+)=?([^&]*)/g\n , result = {}\n , part;\n\n while (part = parser.exec(query)) {\n var key = decode(part[1])\n , value = decode(part[2]);\n\n //\n // Prevent overriding of existing properties. This ensures that build-in\n // methods like `toString` or __proto__ are not overriden by malicious\n // querystrings.\n //\n // In the case if failed decoding, we want to omit the key/value pairs\n // from the result.\n //\n if (key === null || value === null || key in result) continue;\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Transform a query string to an object.\n *\n * @param {Object} obj Object that should be transformed.\n * @param {String} prefix Optional prefix.\n * @returns {String}\n * @api public\n */\nfunction querystringify(obj, prefix) {\n prefix = prefix || '';\n\n var pairs = []\n , value\n , key;\n\n //\n // Optionally prefix with a '?' if needed\n //\n if ('string' !== typeof prefix) prefix = '?';\n\n for (key in obj) {\n if (has.call(obj, key)) {\n value = obj[key];\n\n //\n // Edge cases where we actually want to encode the value to an empty\n // string instead of the stringified value.\n //\n if (!value && (value === null || value === undef || isNaN(value))) {\n value = '';\n }\n\n key = encode(key);\n value = encode(value);\n\n //\n // If we failed to encode the strings, we should bail out as we don't\n // want to add invalid strings to the query.\n //\n if (key === null || value === null) continue;\n pairs.push(key +'='+ value);\n }\n }\n\n return pairs.length ? prefix + pairs.join('&') : '';\n}\n\n//\n// Expose the module.\n//\nexports.stringify = querystringify;\nexports.parse = querystring;\n","\"use strict\";\n\nconst tus = require('tus-js-client');\n\nfunction isCordova() {\n return typeof window !== 'undefined' && (typeof window.PhoneGap !== 'undefined' || typeof window.Cordova !== 'undefined' || typeof window.cordova !== 'undefined');\n}\n\nfunction isReactNative() {\n return typeof navigator !== 'undefined' && typeof navigator.product === 'string' && navigator.product.toLowerCase() === 'reactnative';\n} // We override tus fingerprint to uppy’s `file.id`, since the `file.id`\n// now also includes `relativePath` for files added from folders.\n// This means you can add 2 identical files, if one is in folder a,\n// the other in folder b — `a/file.jpg` and `b/file.jpg`, when added\n// together with a folder, will be treated as 2 separate files.\n//\n// For React Native and Cordova, we let tus-js-client’s default\n// fingerprint handling take charge.\n\n\nmodule.exports = function getFingerprint(uppyFileObj) {\n return (file, options) => {\n if (isCordova() || isReactNative()) {\n return tus.defaultOptions.fingerprint(file, options);\n }\n\n const uppyFingerprint = ['tus', uppyFileObj.id, options.endpoint].join('-');\n return Promise.resolve(uppyFingerprint);\n };\n};"],"sourceRoot":""}
|